diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index dcfad1f..e0f0c98 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -2,49 +2,57 @@
 
 import frappe
 
-__version__ = '14.0.0-dev'
+__version__ = "14.0.0-dev"
+
 
 def get_default_company(user=None):
-	'''Get default company for user'''
+	"""Get default company for user"""
 	from frappe.defaults import get_user_default_as_list
 
 	if not user:
 		user = frappe.session.user
 
-	companies = get_user_default_as_list(user, 'company')
+	companies = get_user_default_as_list(user, "company")
 	if companies:
 		default_company = companies[0]
 	else:
-		default_company = frappe.db.get_single_value('Global Defaults', 'default_company')
+		default_company = frappe.db.get_single_value("Global Defaults", "default_company")
 
 	return default_company
 
 
 def get_default_currency():
-	'''Returns the currency of the default company'''
+	"""Returns the currency of the default company"""
 	company = get_default_company()
 	if company:
-		return frappe.get_cached_value('Company',  company,  'default_currency')
+		return frappe.get_cached_value("Company", company, "default_currency")
+
 
 def get_default_cost_center(company):
-	'''Returns the default cost center of the company'''
+	"""Returns the default cost center of the company"""
 	if not company:
 		return None
 
 	if not frappe.flags.company_cost_center:
 		frappe.flags.company_cost_center = {}
 	if not company in frappe.flags.company_cost_center:
-		frappe.flags.company_cost_center[company] = frappe.get_cached_value('Company',  company,  'cost_center')
+		frappe.flags.company_cost_center[company] = frappe.get_cached_value(
+			"Company", company, "cost_center"
+		)
 	return frappe.flags.company_cost_center[company]
 
+
 def get_company_currency(company):
-	'''Returns the default company currency'''
+	"""Returns the default company currency"""
 	if not frappe.flags.company_currency:
 		frappe.flags.company_currency = {}
 	if not company in frappe.flags.company_currency:
-		frappe.flags.company_currency[company] = frappe.db.get_value('Company',  company,  'default_currency', cache=True)
+		frappe.flags.company_currency[company] = frappe.db.get_value(
+			"Company", company, "default_currency", cache=True
+		)
 	return frappe.flags.company_currency[company]
 
+
 def set_perpetual_inventory(enable=1, company=None):
 	if not company:
 		company = "_Test Company" if frappe.flags.in_test else get_default_company()
@@ -53,9 +61,10 @@
 	company.enable_perpetual_inventory = enable
 	company.save()
 
+
 def encode_company_abbr(name, company=None, abbr=None):
-	'''Returns name encoded with company abbreviation'''
-	company_abbr = abbr or frappe.get_cached_value('Company',  company,  "abbr")
+	"""Returns name encoded with company abbreviation"""
+	company_abbr = abbr or frappe.get_cached_value("Company", company, "abbr")
 	parts = name.rsplit(" - ", 1)
 
 	if parts[-1].lower() != company_abbr.lower():
@@ -63,62 +72,69 @@
 
 	return " - ".join(parts)
 
+
 def is_perpetual_inventory_enabled(company):
 	if not company:
 		company = "_Test Company" if frappe.flags.in_test else get_default_company()
 
-	if not hasattr(frappe.local, 'enable_perpetual_inventory'):
+	if not hasattr(frappe.local, "enable_perpetual_inventory"):
 		frappe.local.enable_perpetual_inventory = {}
 
 	if not company in frappe.local.enable_perpetual_inventory:
-		frappe.local.enable_perpetual_inventory[company] = frappe.get_cached_value('Company',
-			company,  "enable_perpetual_inventory") or 0
+		frappe.local.enable_perpetual_inventory[company] = (
+			frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
+		)
 
 	return frappe.local.enable_perpetual_inventory[company]
 
+
 def get_default_finance_book(company=None):
 	if not company:
 		company = get_default_company()
 
-	if not hasattr(frappe.local, 'default_finance_book'):
+	if not hasattr(frappe.local, "default_finance_book"):
 		frappe.local.default_finance_book = {}
 
 	if not company in frappe.local.default_finance_book:
-		frappe.local.default_finance_book[company] = frappe.get_cached_value('Company',
-			company,  "default_finance_book")
+		frappe.local.default_finance_book[company] = frappe.get_cached_value(
+			"Company", company, "default_finance_book"
+		)
 
 	return frappe.local.default_finance_book[company]
 
+
 def get_party_account_type(party_type):
-	if not hasattr(frappe.local, 'party_account_types'):
+	if not hasattr(frappe.local, "party_account_types"):
 		frappe.local.party_account_types = {}
 
 	if not party_type in frappe.local.party_account_types:
-		frappe.local.party_account_types[party_type] = frappe.db.get_value("Party Type",
-			party_type, "account_type") or ''
+		frappe.local.party_account_types[party_type] = (
+			frappe.db.get_value("Party Type", party_type, "account_type") or ""
+		)
 
 	return frappe.local.party_account_types[party_type]
 
+
 def get_region(company=None):
-	'''Return the default country based on flag, company or global settings
+	"""Return the default country based on flag, company or global settings
 
 	You can also set global company flag in `frappe.flags.company`
-	'''
+	"""
 	if company or frappe.flags.company:
-		return frappe.get_cached_value('Company',
-			company or frappe.flags.company, 'country')
+		return frappe.get_cached_value("Company", company or frappe.flags.company, "country")
 	elif frappe.flags.country:
 		return frappe.flags.country
 	else:
-		return frappe.get_system_settings('country')
+		return frappe.get_system_settings("country")
+
 
 def allow_regional(fn):
-	'''Decorator to make a function regionally overridable
+	"""Decorator to make a function regionally overridable
 
 	Example:
 	@erpnext.allow_regional
 	def myfunction():
-	  pass'''
+	  pass"""
 
 	def caller(*args, **kwargs):
 		overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
diff --git a/erpnext/accounts/custom/address.py b/erpnext/accounts/custom/address.py
index 551048e..775a81f 100644
--- a/erpnext/accounts/custom/address.py
+++ b/erpnext/accounts/custom/address.py
@@ -21,37 +21,39 @@
 		return super(ERPNextAddress, self).link_address()
 
 	def update_compnay_address(self):
-		for link in self.get('links'):
-			if link.link_doctype == 'Company':
+		for link in self.get("links"):
+			if link.link_doctype == "Company":
 				self.is_your_company_address = 1
 
 	def validate_reference(self):
 		if self.is_your_company_address and not [
 			row for row in self.links if row.link_doctype == "Company"
 		]:
-			frappe.throw(_("Address needs to be linked to a Company. Please add a row for Company in the Links table."),
-				title=_("Company Not Linked"))
+			frappe.throw(
+				_("Address needs to be linked to a Company. Please add a row for Company in the Links table."),
+				title=_("Company Not Linked"),
+			)
 
 	def on_update(self):
 		"""
 		After Address is updated, update the related 'Primary Address' on Customer.
 		"""
 		address_display = get_address_display(self.as_dict())
-		filters = { "customer_primary_address": self.name }
+		filters = {"customer_primary_address": self.name}
 		customers = frappe.db.get_all("Customer", filters=filters, as_list=True)
 		for customer_name in customers:
 			frappe.db.set_value("Customer", customer_name[0], "primary_address", address_display)
 
+
 @frappe.whitelist()
-def get_shipping_address(company, address = None):
+def get_shipping_address(company, address=None):
 	filters = [
 		["Dynamic Link", "link_doctype", "=", "Company"],
 		["Dynamic Link", "link_name", "=", company],
-		["Address", "is_your_company_address", "=", 1]
+		["Address", "is_your_company_address", "=", 1],
 	]
 	fields = ["*"]
-	if address and frappe.db.get_value('Dynamic Link',
-		{'parent': address, 'link_name': company}):
+	if address and frappe.db.get_value("Dynamic Link", {"parent": address, "link_name": company}):
 		filters.append(["Address", "name", "=", address])
 	if not address:
 		filters.append(["Address", "is_shipping_address", "=", 1])
diff --git a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py
index 1c1364e..fefec0e 100644
--- a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py
+++ b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py
@@ -12,15 +12,24 @@
 
 @frappe.whitelist()
 @cache_source
-def get(chart_name = None, chart = None, no_cache = None, filters = None, from_date = None,
-	to_date = None, timespan = None, time_interval = None, heatmap_year = None):
+def get(
+	chart_name=None,
+	chart=None,
+	no_cache=None,
+	filters=None,
+	from_date=None,
+	to_date=None,
+	timespan=None,
+	time_interval=None,
+	heatmap_year=None,
+):
 	if chart_name:
-		chart = frappe.get_doc('Dashboard Chart', chart_name)
+		chart = frappe.get_doc("Dashboard Chart", chart_name)
 	else:
 		chart = frappe._dict(frappe.parse_json(chart))
 	timespan = chart.timespan
 
-	if chart.timespan == 'Select Date Range':
+	if chart.timespan == "Select Date Range":
 		from_date = chart.from_date
 		to_date = chart.to_date
 
@@ -31,17 +40,23 @@
 	company = filters.get("company")
 
 	if not account and chart_name:
-		frappe.throw(_("Account is not set for the dashboard chart {0}")
-			.format(get_link_to_form("Dashboard Chart", chart_name)))
+		frappe.throw(
+			_("Account is not set for the dashboard chart {0}").format(
+				get_link_to_form("Dashboard Chart", chart_name)
+			)
+		)
 
 	if not frappe.db.exists("Account", account) and chart_name:
-		frappe.throw(_("Account {0} does not exists in the dashboard chart {1}")
-			.format(account, get_link_to_form("Dashboard Chart", chart_name)))
+		frappe.throw(
+			_("Account {0} does not exists in the dashboard chart {1}").format(
+				account, get_link_to_form("Dashboard Chart", chart_name)
+			)
+		)
 
 	if not to_date:
 		to_date = nowdate()
 	if not from_date:
-		if timegrain in ('Monthly', 'Quarterly'):
+		if timegrain in ("Monthly", "Quarterly"):
 			from_date = get_from_date_from_timespan(to_date, timespan)
 
 	# fetch dates to plot
@@ -54,16 +69,14 @@
 	result = build_result(account, dates, gl_entries)
 
 	return {
-		"labels": [formatdate(r[0].strftime('%Y-%m-%d')) for r in result],
-		"datasets": [{
-			"name": account,
-			"values": [r[1] for r in result]
-		}]
+		"labels": [formatdate(r[0].strftime("%Y-%m-%d")) for r in result],
+		"datasets": [{"name": account, "values": [r[1] for r in result]}],
 	}
 
+
 def build_result(account, dates, gl_entries):
 	result = [[getdate(date), 0.0] for date in dates]
-	root_type = frappe.db.get_value('Account', account, 'root_type')
+	root_type = frappe.db.get_value("Account", account, "root_type")
 
 	# start with the first date
 	date_index = 0
@@ -78,30 +91,34 @@
 		result[date_index][1] += entry.debit - entry.credit
 
 	# if account type is credit, switch balances
-	if root_type not in ('Asset', 'Expense'):
+	if root_type not in ("Asset", "Expense"):
 		for r in result:
 			r[1] = -1 * r[1]
 
 	# for balance sheet accounts, the totals are cumulative
-	if root_type in ('Asset', 'Liability', 'Equity'):
+	if root_type in ("Asset", "Liability", "Equity"):
 		for i, r in enumerate(result):
 			if i > 0:
-				r[1] = r[1] + result[i-1][1]
+				r[1] = r[1] + result[i - 1][1]
 
 	return result
 
+
 def get_gl_entries(account, to_date):
-	child_accounts = get_descendants_of('Account', account, ignore_permissions=True)
+	child_accounts = get_descendants_of("Account", account, ignore_permissions=True)
 	child_accounts.append(account)
 
-	return frappe.db.get_all('GL Entry',
-		fields = ['posting_date', 'debit', 'credit'],
-		filters = [
-			dict(posting_date = ('<', to_date)),
-			dict(account = ('in', child_accounts)),
-			dict(voucher_type = ('!=', 'Period Closing Voucher'))
+	return frappe.db.get_all(
+		"GL Entry",
+		fields=["posting_date", "debit", "credit"],
+		filters=[
+			dict(posting_date=("<", to_date)),
+			dict(account=("in", child_accounts)),
+			dict(voucher_type=("!=", "Period Closing Voucher")),
 		],
-		order_by = 'posting_date asc')
+		order_by="posting_date asc",
+	)
+
 
 def get_dates_from_timegrain(from_date, to_date, timegrain):
 	days = months = years = 0
@@ -116,6 +133,8 @@
 
 	dates = [get_period_ending(from_date, timegrain)]
 	while getdate(dates[-1]) < getdate(to_date):
-		date = get_period_ending(add_to_date(dates[-1], years=years, months=months, days=days), timegrain)
+		date = get_period_ending(
+			add_to_date(dates[-1], years=years, months=months, days=days), timegrain
+		)
 		dates.append(date)
 	return dates
diff --git a/erpnext/accounts/deferred_revenue.py b/erpnext/accounts/deferred_revenue.py
index ab1061b..0611f88 100644
--- a/erpnext/accounts/deferred_revenue.py
+++ b/erpnext/accounts/deferred_revenue.py
@@ -22,20 +22,23 @@
 
 
 def validate_service_stop_date(doc):
-	''' Validates service_stop_date for Purchase Invoice and Sales Invoice '''
+	"""Validates service_stop_date for Purchase Invoice and Sales Invoice"""
 
-	enable_check = "enable_deferred_revenue" \
-		if doc.doctype=="Sales Invoice" else "enable_deferred_expense"
+	enable_check = (
+		"enable_deferred_revenue" if doc.doctype == "Sales Invoice" else "enable_deferred_expense"
+	)
 
 	old_stop_dates = {}
-	old_doc = frappe.db.get_all("{0} Item".format(doc.doctype),
-		{"parent": doc.name}, ["name", "service_stop_date"])
+	old_doc = frappe.db.get_all(
+		"{0} Item".format(doc.doctype), {"parent": doc.name}, ["name", "service_stop_date"]
+	)
 
 	for d in old_doc:
 		old_stop_dates[d.name] = d.service_stop_date or ""
 
 	for item in doc.items:
-		if not item.get(enable_check): continue
+		if not item.get(enable_check):
+			continue
 
 		if item.service_stop_date:
 			if date_diff(item.service_stop_date, item.service_start_date) < 0:
@@ -44,21 +47,31 @@
 			if date_diff(item.service_stop_date, item.service_end_date) > 0:
 				frappe.throw(_("Service Stop Date cannot be after Service End Date"))
 
-		if old_stop_dates and old_stop_dates.get(item.name) and item.service_stop_date!=old_stop_dates.get(item.name):
+		if (
+			old_stop_dates
+			and old_stop_dates.get(item.name)
+			and item.service_stop_date != old_stop_dates.get(item.name)
+		):
 			frappe.throw(_("Cannot change Service Stop Date for item in row {0}").format(item.idx))
 
+
 def build_conditions(process_type, account, company):
-	conditions=''
-	deferred_account = "item.deferred_revenue_account" if process_type=="Income" else "item.deferred_expense_account"
+	conditions = ""
+	deferred_account = (
+		"item.deferred_revenue_account" if process_type == "Income" else "item.deferred_expense_account"
+	)
 
 	if account:
-		conditions += "AND %s='%s'"%(deferred_account, account)
+		conditions += "AND %s='%s'" % (deferred_account, account)
 	elif company:
 		conditions += f"AND p.company = {frappe.db.escape(company)}"
 
 	return conditions
 
-def convert_deferred_expense_to_expense(deferred_process, start_date=None, end_date=None, conditions=''):
+
+def convert_deferred_expense_to_expense(
+	deferred_process, start_date=None, end_date=None, conditions=""
+):
 	# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
 
 	if not start_date:
@@ -67,14 +80,19 @@
 		end_date = add_days(today(), -1)
 
 	# check for the purchase invoice for which GL entries has to be done
-	invoices = frappe.db.sql_list('''
+	invoices = frappe.db.sql_list(
+		"""
 		select distinct item.parent
 		from `tabPurchase Invoice Item` item, `tabPurchase Invoice` p
 		where item.service_start_date<=%s and item.service_end_date>=%s
 		and item.enable_deferred_expense = 1 and item.parent=p.name
 		and item.docstatus = 1 and ifnull(item.amount, 0) > 0
 		{0}
-	'''.format(conditions), (end_date, start_date)) #nosec
+	""".format(
+			conditions
+		),
+		(end_date, start_date),
+	)  # nosec
 
 	# For each invoice, book deferred expense
 	for invoice in invoices:
@@ -84,7 +102,10 @@
 	if frappe.flags.deferred_accounting_error:
 		send_mail(deferred_process)
 
-def convert_deferred_revenue_to_income(deferred_process, start_date=None, end_date=None, conditions=''):
+
+def convert_deferred_revenue_to_income(
+	deferred_process, start_date=None, end_date=None, conditions=""
+):
 	# book the expense/income on the last day, but it will be trigger on the 1st of month at 12:00 AM
 
 	if not start_date:
@@ -93,14 +114,19 @@
 		end_date = add_days(today(), -1)
 
 	# check for the sales invoice for which GL entries has to be done
-	invoices = frappe.db.sql_list('''
+	invoices = frappe.db.sql_list(
+		"""
 		select distinct item.parent
 		from `tabSales Invoice Item` item, `tabSales Invoice` p
 		where item.service_start_date<=%s and item.service_end_date>=%s
 		and item.enable_deferred_revenue = 1 and item.parent=p.name
 		and item.docstatus = 1 and ifnull(item.amount, 0) > 0
 		{0}
-	'''.format(conditions), (end_date, start_date)) #nosec
+	""".format(
+			conditions
+		),
+		(end_date, start_date),
+	)  # nosec
 
 	for invoice in invoices:
 		doc = frappe.get_doc("Sales Invoice", invoice)
@@ -109,31 +135,43 @@
 	if frappe.flags.deferred_accounting_error:
 		send_mail(deferred_process)
 
+
 def get_booking_dates(doc, item, posting_date=None):
 	if not posting_date:
 		posting_date = add_days(today(), -1)
 
 	last_gl_entry = False
 
-	deferred_account = "deferred_revenue_account" if doc.doctype=="Sales Invoice" else "deferred_expense_account"
+	deferred_account = (
+		"deferred_revenue_account" if doc.doctype == "Sales Invoice" else "deferred_expense_account"
+	)
 
-	prev_gl_entry = frappe.db.sql('''
+	prev_gl_entry = frappe.db.sql(
+		"""
 		select name, posting_date from `tabGL Entry` where company=%s and account=%s and
 		voucher_type=%s and voucher_no=%s and voucher_detail_no=%s
 		and is_cancelled = 0
 		order by posting_date desc limit 1
-	''', (doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
+	""",
+		(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
+		as_dict=True,
+	)
 
-	prev_gl_via_je = frappe.db.sql('''
+	prev_gl_via_je = frappe.db.sql(
+		"""
 		SELECT p.name, p.posting_date FROM `tabJournal Entry` p, `tabJournal Entry Account` c
 		WHERE p.name = c.parent and p.company=%s and c.account=%s
 		and c.reference_type=%s and c.reference_name=%s
 		and c.reference_detail_no=%s and c.docstatus < 2 order by posting_date desc limit 1
-	''', (doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
+	""",
+		(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
+		as_dict=True,
+	)
 
 	if prev_gl_via_je:
-		if (not prev_gl_entry) or (prev_gl_entry and
-			prev_gl_entry[0].posting_date < prev_gl_via_je[0].posting_date):
+		if (not prev_gl_entry) or (
+			prev_gl_entry and prev_gl_entry[0].posting_date < prev_gl_via_je[0].posting_date
+		):
 			prev_gl_entry = prev_gl_via_je
 
 	if prev_gl_entry:
@@ -157,66 +195,94 @@
 	else:
 		return None, None, None
 
-def calculate_monthly_amount(doc, item, last_gl_entry, start_date, end_date, total_days, total_booking_days, account_currency):
+
+def calculate_monthly_amount(
+	doc, item, last_gl_entry, start_date, end_date, total_days, total_booking_days, account_currency
+):
 	amount, base_amount = 0, 0
 
 	if not last_gl_entry:
-		total_months = (item.service_end_date.year - item.service_start_date.year) * 12 + \
-			(item.service_end_date.month - item.service_start_date.month) + 1
+		total_months = (
+			(item.service_end_date.year - item.service_start_date.year) * 12
+			+ (item.service_end_date.month - item.service_start_date.month)
+			+ 1
+		)
 
-		prorate_factor = flt(date_diff(item.service_end_date, item.service_start_date)) \
-			/ flt(date_diff(get_last_day(item.service_end_date), get_first_day(item.service_start_date)))
+		prorate_factor = flt(date_diff(item.service_end_date, item.service_start_date)) / flt(
+			date_diff(get_last_day(item.service_end_date), get_first_day(item.service_start_date))
+		)
 
 		actual_months = rounded(total_months * prorate_factor, 1)
 
-		already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(doc, item)
+		already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(
+			doc, item
+		)
 		base_amount = flt(item.base_net_amount / actual_months, item.precision("base_net_amount"))
 
 		if base_amount + already_booked_amount > item.base_net_amount:
 			base_amount = item.base_net_amount - already_booked_amount
 
-		if account_currency==doc.company_currency:
+		if account_currency == doc.company_currency:
 			amount = base_amount
 		else:
-			amount = flt(item.net_amount/actual_months, item.precision("net_amount"))
+			amount = flt(item.net_amount / actual_months, item.precision("net_amount"))
 			if amount + already_booked_amount_in_account_currency > item.net_amount:
 				amount = item.net_amount - already_booked_amount_in_account_currency
 
 		if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
-			partial_month = flt(date_diff(end_date, start_date)) \
-				/ flt(date_diff(get_last_day(end_date), get_first_day(start_date)))
+			partial_month = flt(date_diff(end_date, start_date)) / flt(
+				date_diff(get_last_day(end_date), get_first_day(start_date))
+			)
 
 			base_amount = rounded(partial_month, 1) * base_amount
 			amount = rounded(partial_month, 1) * amount
 	else:
-		already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(doc, item)
-		base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
-		if account_currency==doc.company_currency:
+		already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(
+			doc, item
+		)
+		base_amount = flt(
+			item.base_net_amount - already_booked_amount, item.precision("base_net_amount")
+		)
+		if account_currency == doc.company_currency:
 			amount = base_amount
 		else:
-			amount = flt(item.net_amount - already_booked_amount_in_account_currency, item.precision("net_amount"))
+			amount = flt(
+				item.net_amount - already_booked_amount_in_account_currency, item.precision("net_amount")
+			)
 
 	return amount, base_amount
 
+
 def calculate_amount(doc, item, last_gl_entry, total_days, total_booking_days, account_currency):
 	amount, base_amount = 0, 0
 	if not last_gl_entry:
-		base_amount = flt(item.base_net_amount*total_booking_days/flt(total_days), item.precision("base_net_amount"))
-		if account_currency==doc.company_currency:
+		base_amount = flt(
+			item.base_net_amount * total_booking_days / flt(total_days), item.precision("base_net_amount")
+		)
+		if account_currency == doc.company_currency:
 			amount = base_amount
 		else:
-			amount = flt(item.net_amount*total_booking_days/flt(total_days), item.precision("net_amount"))
+			amount = flt(
+				item.net_amount * total_booking_days / flt(total_days), item.precision("net_amount")
+			)
 	else:
-		already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(doc, item)
+		already_booked_amount, already_booked_amount_in_account_currency = get_already_booked_amount(
+			doc, item
+		)
 
-		base_amount = flt(item.base_net_amount - already_booked_amount, item.precision("base_net_amount"))
-		if account_currency==doc.company_currency:
+		base_amount = flt(
+			item.base_net_amount - already_booked_amount, item.precision("base_net_amount")
+		)
+		if account_currency == doc.company_currency:
 			amount = base_amount
 		else:
-			amount = flt(item.net_amount - already_booked_amount_in_account_currency, item.precision("net_amount"))
+			amount = flt(
+				item.net_amount - already_booked_amount_in_account_currency, item.precision("net_amount")
+			)
 
 	return amount, base_amount
 
+
 def get_already_booked_amount(doc, item):
 	if doc.doctype == "Sales Invoice":
 		total_credit_debit, total_credit_debit_currency = "debit", "debit_in_account_currency"
@@ -225,21 +291,31 @@
 		total_credit_debit, total_credit_debit_currency = "credit", "credit_in_account_currency"
 		deferred_account = "deferred_expense_account"
 
-	gl_entries_details = frappe.db.sql('''
+	gl_entries_details = frappe.db.sql(
+		"""
 		select sum({0}) as total_credit, sum({1}) as total_credit_in_account_currency, voucher_detail_no
 		from `tabGL Entry` where company=%s and account=%s and voucher_type=%s and voucher_no=%s and voucher_detail_no=%s
 		and is_cancelled = 0
 		group by voucher_detail_no
-	'''.format(total_credit_debit, total_credit_debit_currency),
-		(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
+	""".format(
+			total_credit_debit, total_credit_debit_currency
+		),
+		(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
+		as_dict=True,
+	)
 
-	journal_entry_details = frappe.db.sql('''
+	journal_entry_details = frappe.db.sql(
+		"""
 		SELECT sum(c.{0}) as total_credit, sum(c.{1}) as total_credit_in_account_currency, reference_detail_no
 		FROM `tabJournal Entry` p , `tabJournal Entry Account` c WHERE p.name = c.parent and
 		p.company = %s and c.account=%s and c.reference_type=%s and c.reference_name=%s and c.reference_detail_no=%s
 		and p.docstatus < 2 group by reference_detail_no
-	'''.format(total_credit_debit, total_credit_debit_currency),
-		(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name), as_dict=True)
+	""".format(
+			total_credit_debit, total_credit_debit_currency
+		),
+		(doc.company, item.get(deferred_account), doc.doctype, doc.name, item.name),
+		as_dict=True,
+	)
 
 	already_booked_amount = gl_entries_details[0].total_credit if gl_entries_details else 0
 	already_booked_amount += journal_entry_details[0].total_credit if journal_entry_details else 0
@@ -247,20 +323,29 @@
 	if doc.currency == doc.company_currency:
 		already_booked_amount_in_account_currency = already_booked_amount
 	else:
-		already_booked_amount_in_account_currency = gl_entries_details[0].total_credit_in_account_currency if gl_entries_details else 0
-		already_booked_amount_in_account_currency += journal_entry_details[0].total_credit_in_account_currency if journal_entry_details else 0
+		already_booked_amount_in_account_currency = (
+			gl_entries_details[0].total_credit_in_account_currency if gl_entries_details else 0
+		)
+		already_booked_amount_in_account_currency += (
+			journal_entry_details[0].total_credit_in_account_currency if journal_entry_details else 0
+		)
 
 	return already_booked_amount, already_booked_amount_in_account_currency
 
+
 def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
-	enable_check = "enable_deferred_revenue" \
-		if doc.doctype=="Sales Invoice" else "enable_deferred_expense"
+	enable_check = (
+		"enable_deferred_revenue" if doc.doctype == "Sales Invoice" else "enable_deferred_expense"
+	)
 
-	accounts_frozen_upto = frappe.get_cached_value('Accounts Settings', 'None', 'acc_frozen_upto')
+	accounts_frozen_upto = frappe.get_cached_value("Accounts Settings", "None", "acc_frozen_upto")
 
-	def _book_deferred_revenue_or_expense(item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on):
+	def _book_deferred_revenue_or_expense(
+		item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on
+	):
 		start_date, end_date, last_gl_entry = get_booking_dates(doc, item, posting_date=posting_date)
-		if not (start_date and end_date): return
+		if not (start_date and end_date):
+			return
 
 		account_currency = get_account_currency(item.expense_account or item.income_account)
 		if doc.doctype == "Sales Invoice":
@@ -273,12 +358,21 @@
 		total_days = date_diff(item.service_end_date, item.service_start_date) + 1
 		total_booking_days = date_diff(end_date, start_date) + 1
 
-		if book_deferred_entries_based_on == 'Months':
-			amount, base_amount = calculate_monthly_amount(doc, item, last_gl_entry,
-				start_date, end_date, total_days, total_booking_days, account_currency)
+		if book_deferred_entries_based_on == "Months":
+			amount, base_amount = calculate_monthly_amount(
+				doc,
+				item,
+				last_gl_entry,
+				start_date,
+				end_date,
+				total_days,
+				total_booking_days,
+				account_currency,
+			)
 		else:
-			amount, base_amount = calculate_amount(doc, item, last_gl_entry,
-				total_days, total_booking_days, account_currency)
+			amount, base_amount = calculate_amount(
+				doc, item, last_gl_entry, total_days, total_booking_days, account_currency
+			)
 
 		if not amount:
 			return
@@ -288,92 +382,156 @@
 			end_date = get_last_day(add_days(accounts_frozen_upto, 1))
 
 		if via_journal_entry:
-			book_revenue_via_journal_entry(doc, credit_account, debit_account, against, amount,
-				base_amount, end_date, project, account_currency, item.cost_center, item, deferred_process, submit_journal_entry)
+			book_revenue_via_journal_entry(
+				doc,
+				credit_account,
+				debit_account,
+				against,
+				amount,
+				base_amount,
+				end_date,
+				project,
+				account_currency,
+				item.cost_center,
+				item,
+				deferred_process,
+				submit_journal_entry,
+			)
 		else:
-			make_gl_entries(doc, credit_account, debit_account, against,
-				amount, base_amount, end_date, project, account_currency, item.cost_center, item, deferred_process)
+			make_gl_entries(
+				doc,
+				credit_account,
+				debit_account,
+				against,
+				amount,
+				base_amount,
+				end_date,
+				project,
+				account_currency,
+				item.cost_center,
+				item,
+				deferred_process,
+			)
 
 		# Returned in case of any errors because it tries to submit the same record again and again in case of errors
 		if frappe.flags.deferred_accounting_error:
 			return
 
 		if getdate(end_date) < getdate(posting_date) and not last_gl_entry:
-			_book_deferred_revenue_or_expense(item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on)
+			_book_deferred_revenue_or_expense(
+				item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on
+			)
 
-	via_journal_entry = cint(frappe.db.get_singles_value('Accounts Settings', 'book_deferred_entries_via_journal_entry'))
-	submit_journal_entry = cint(frappe.db.get_singles_value('Accounts Settings', 'submit_journal_entries'))
-	book_deferred_entries_based_on = frappe.db.get_singles_value('Accounts Settings', 'book_deferred_entries_based_on')
+	via_journal_entry = cint(
+		frappe.db.get_singles_value("Accounts Settings", "book_deferred_entries_via_journal_entry")
+	)
+	submit_journal_entry = cint(
+		frappe.db.get_singles_value("Accounts Settings", "submit_journal_entries")
+	)
+	book_deferred_entries_based_on = frappe.db.get_singles_value(
+		"Accounts Settings", "book_deferred_entries_based_on"
+	)
 
-	for item in doc.get('items'):
+	for item in doc.get("items"):
 		if item.get(enable_check):
-			_book_deferred_revenue_or_expense(item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on)
+			_book_deferred_revenue_or_expense(
+				item, via_journal_entry, submit_journal_entry, book_deferred_entries_based_on
+			)
+
 
 def process_deferred_accounting(posting_date=None):
-	''' Converts deferred income/expense into income/expense
-		Executed via background jobs on every month end '''
+	"""Converts deferred income/expense into income/expense
+	Executed via background jobs on every month end"""
 
 	if not posting_date:
 		posting_date = today()
 
-	if not cint(frappe.db.get_singles_value('Accounts Settings', 'automatically_process_deferred_accounting_entry')):
+	if not cint(
+		frappe.db.get_singles_value(
+			"Accounts Settings", "automatically_process_deferred_accounting_entry"
+		)
+	):
 		return
 
 	start_date = add_months(today(), -1)
 	end_date = add_days(today(), -1)
 
-	companies = frappe.get_all('Company')
+	companies = frappe.get_all("Company")
 
 	for company in companies:
-		for record_type in ('Income', 'Expense'):
-			doc = frappe.get_doc(dict(
-				doctype='Process Deferred Accounting',
-				company=company.name,
-				posting_date=posting_date,
-				start_date=start_date,
-				end_date=end_date,
-				type=record_type
-			))
+		for record_type in ("Income", "Expense"):
+			doc = frappe.get_doc(
+				dict(
+					doctype="Process Deferred Accounting",
+					company=company.name,
+					posting_date=posting_date,
+					start_date=start_date,
+					end_date=end_date,
+					type=record_type,
+				)
+			)
 
 			doc.insert()
 			doc.submit()
 
-def make_gl_entries(doc, credit_account, debit_account, against,
-	amount, base_amount, posting_date, project, account_currency, cost_center, item, deferred_process=None):
+
+def make_gl_entries(
+	doc,
+	credit_account,
+	debit_account,
+	against,
+	amount,
+	base_amount,
+	posting_date,
+	project,
+	account_currency,
+	cost_center,
+	item,
+	deferred_process=None,
+):
 	# GL Entry for crediting the amount in the deferred expense
 	from erpnext.accounts.general_ledger import make_gl_entries
 
-	if amount == 0: return
+	if amount == 0:
+		return
 
 	gl_entries = []
 	gl_entries.append(
-		doc.get_gl_dict({
-			"account": credit_account,
-			"against": against,
-			"credit": base_amount,
-			"credit_in_account_currency": amount,
-			"cost_center": cost_center,
-			"voucher_detail_no": item.name,
-			'posting_date': posting_date,
-			'project': project,
-			'against_voucher_type': 'Process Deferred Accounting',
-			'against_voucher': deferred_process
-		}, account_currency, item=item)
+		doc.get_gl_dict(
+			{
+				"account": credit_account,
+				"against": against,
+				"credit": base_amount,
+				"credit_in_account_currency": amount,
+				"cost_center": cost_center,
+				"voucher_detail_no": item.name,
+				"posting_date": posting_date,
+				"project": project,
+				"against_voucher_type": "Process Deferred Accounting",
+				"against_voucher": deferred_process,
+			},
+			account_currency,
+			item=item,
+		)
 	)
 	# GL Entry to debit the amount from the expense
 	gl_entries.append(
-		doc.get_gl_dict({
-			"account": debit_account,
-			"against": against,
-			"debit": base_amount,
-			"debit_in_account_currency": amount,
-			"cost_center": cost_center,
-			"voucher_detail_no": item.name,
-			'posting_date': posting_date,
-			'project': project,
-			'against_voucher_type': 'Process Deferred Accounting',
-			'against_voucher': deferred_process
-		}, account_currency, item=item)
+		doc.get_gl_dict(
+			{
+				"account": debit_account,
+				"against": against,
+				"debit": base_amount,
+				"debit_in_account_currency": amount,
+				"cost_center": cost_center,
+				"voucher_detail_no": item.name,
+				"posting_date": posting_date,
+				"project": project,
+				"against_voucher_type": "Process Deferred Accounting",
+				"against_voucher": deferred_process,
+			},
+			account_currency,
+			item=item,
+		)
 	)
 
 	if gl_entries:
@@ -383,68 +541,88 @@
 		except Exception as e:
 			if frappe.flags.in_test:
 				traceback = frappe.get_traceback()
-				frappe.log_error(title=_('Error while processing deferred accounting for Invoice {0}').format(doc.name), message=traceback)
+				frappe.log_error(
+					title=_("Error while processing deferred accounting for Invoice {0}").format(doc.name),
+					message=traceback,
+				)
 				raise e
 			else:
 				frappe.db.rollback()
 				traceback = frappe.get_traceback()
-				frappe.log_error(title=_('Error while processing deferred accounting for Invoice {0}').format(doc.name), message=traceback)
+				frappe.log_error(
+					title=_("Error while processing deferred accounting for Invoice {0}").format(doc.name),
+					message=traceback,
+				)
 				frappe.flags.deferred_accounting_error = True
 
+
 def send_mail(deferred_process):
 	title = _("Error while processing deferred accounting for {0}").format(deferred_process)
-	link = get_link_to_form('Process Deferred Accounting', deferred_process)
+	link = get_link_to_form("Process Deferred Accounting", deferred_process)
 	content = _("Deferred accounting failed for some invoices:") + "\n"
-	content += _("Please check Process Deferred Accounting {0} and submit manually after resolving errors.").format(link)
+	content += _(
+		"Please check Process Deferred Accounting {0} and submit manually after resolving errors."
+	).format(link)
 	sendmail_to_system_managers(title, content)
 
-def book_revenue_via_journal_entry(doc, credit_account, debit_account, against,
-	amount, base_amount, posting_date, project, account_currency, cost_center, item,
-	deferred_process=None, submit='No'):
 
-	if amount == 0: return
+def book_revenue_via_journal_entry(
+	doc,
+	credit_account,
+	debit_account,
+	against,
+	amount,
+	base_amount,
+	posting_date,
+	project,
+	account_currency,
+	cost_center,
+	item,
+	deferred_process=None,
+	submit="No",
+):
 
-	journal_entry = frappe.new_doc('Journal Entry')
+	if amount == 0:
+		return
+
+	journal_entry = frappe.new_doc("Journal Entry")
 	journal_entry.posting_date = posting_date
 	journal_entry.company = doc.company
-	journal_entry.voucher_type = 'Deferred Revenue' if doc.doctype == 'Sales Invoice' \
-		else 'Deferred Expense'
+	journal_entry.voucher_type = (
+		"Deferred Revenue" if doc.doctype == "Sales Invoice" else "Deferred Expense"
+	)
 
 	debit_entry = {
-		'account': credit_account,
-		'credit': base_amount,
-		'credit_in_account_currency': amount,
-		'account_currency': account_currency,
-		'reference_name': doc.name,
-		'reference_type': doc.doctype,
-		'reference_detail_no': item.name,
-		'cost_center': cost_center,
-		'project': project,
+		"account": credit_account,
+		"credit": base_amount,
+		"credit_in_account_currency": amount,
+		"account_currency": account_currency,
+		"reference_name": doc.name,
+		"reference_type": doc.doctype,
+		"reference_detail_no": item.name,
+		"cost_center": cost_center,
+		"project": project,
 	}
 
 	credit_entry = {
-		'account': debit_account,
-		'debit': base_amount,
-		'debit_in_account_currency': amount,
-		'account_currency': account_currency,
-		'reference_name': doc.name,
-		'reference_type': doc.doctype,
-		'reference_detail_no': item.name,
-		'cost_center': cost_center,
-		'project': project,
+		"account": debit_account,
+		"debit": base_amount,
+		"debit_in_account_currency": amount,
+		"account_currency": account_currency,
+		"reference_name": doc.name,
+		"reference_type": doc.doctype,
+		"reference_detail_no": item.name,
+		"cost_center": cost_center,
+		"project": project,
 	}
 
 	for dimension in get_accounting_dimensions():
-		debit_entry.update({
-			dimension: item.get(dimension)
-		})
+		debit_entry.update({dimension: item.get(dimension)})
 
-		credit_entry.update({
-			dimension: item.get(dimension)
-		})
+		credit_entry.update({dimension: item.get(dimension)})
 
-	journal_entry.append('accounts', debit_entry)
-	journal_entry.append('accounts', credit_entry)
+	journal_entry.append("accounts", debit_entry)
+	journal_entry.append("accounts", credit_entry)
 
 	try:
 		journal_entry.save()
@@ -456,20 +634,30 @@
 	except Exception:
 		frappe.db.rollback()
 		traceback = frappe.get_traceback()
-		frappe.log_error(title=_('Error while processing deferred accounting for Invoice {0}').format(doc.name), message=traceback)
+		frappe.log_error(
+			title=_("Error while processing deferred accounting for Invoice {0}").format(doc.name),
+			message=traceback,
+		)
 
 		frappe.flags.deferred_accounting_error = True
 
+
 def get_deferred_booking_accounts(doctype, voucher_detail_no, dr_or_cr):
 
-	if doctype == 'Sales Invoice':
-		credit_account, debit_account = frappe.db.get_value('Sales Invoice Item', {'name': voucher_detail_no},
-			['income_account', 'deferred_revenue_account'])
+	if doctype == "Sales Invoice":
+		credit_account, debit_account = frappe.db.get_value(
+			"Sales Invoice Item",
+			{"name": voucher_detail_no},
+			["income_account", "deferred_revenue_account"],
+		)
 	else:
-		credit_account, debit_account = frappe.db.get_value('Purchase Invoice Item', {'name': voucher_detail_no},
-			['deferred_expense_account', 'expense_account'])
+		credit_account, debit_account = frappe.db.get_value(
+			"Purchase Invoice Item",
+			{"name": voucher_detail_no},
+			["deferred_expense_account", "expense_account"],
+		)
 
-	if dr_or_cr == 'Debit':
+	if dr_or_cr == "Debit":
 		return debit_account
 	else:
 		return credit_account
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index f8a06c7..150f68b 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -10,11 +10,17 @@
 import erpnext
 
 
-class RootNotEditable(frappe.ValidationError): pass
-class BalanceMismatchError(frappe.ValidationError): pass
+class RootNotEditable(frappe.ValidationError):
+	pass
+
+
+class BalanceMismatchError(frappe.ValidationError):
+	pass
+
 
 class Account(NestedSet):
-	nsm_parent_field = 'parent_account'
+	nsm_parent_field = "parent_account"
+
 	def on_update(self):
 		if frappe.local.flags.ignore_update_nsm:
 			return
@@ -22,17 +28,20 @@
 			super(Account, self).on_update()
 
 	def onload(self):
-		frozen_accounts_modifier = frappe.db.get_value("Accounts Settings", "Accounts Settings",
-			"frozen_accounts_modifier")
+		frozen_accounts_modifier = frappe.db.get_value(
+			"Accounts Settings", "Accounts Settings", "frozen_accounts_modifier"
+		)
 		if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
 			self.set_onload("can_freeze_account", True)
 
 	def autoname(self):
 		from erpnext.accounts.utils import get_autoname_with_number
+
 		self.name = get_autoname_with_number(self.account_number, self.account_name, None, self.company)
 
 	def validate(self):
 		from erpnext.accounts.utils import validate_field_number
+
 		if frappe.local.flags.allow_unverified_charts:
 			return
 		self.validate_parent()
@@ -49,22 +58,33 @@
 	def validate_parent(self):
 		"""Fetch Parent Details and validate parent account"""
 		if self.parent_account:
-			par = frappe.db.get_value("Account", self.parent_account,
-				["name", "is_group", "company"], as_dict=1)
+			par = frappe.db.get_value(
+				"Account", self.parent_account, ["name", "is_group", "company"], as_dict=1
+			)
 			if not par:
-				throw(_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account))
+				throw(
+					_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account)
+				)
 			elif par.name == self.name:
 				throw(_("Account {0}: You can not assign itself as parent account").format(self.name))
 			elif not par.is_group:
-				throw(_("Account {0}: Parent account {1} can not be a ledger").format(self.name, self.parent_account))
+				throw(
+					_("Account {0}: Parent account {1} can not be a ledger").format(
+						self.name, self.parent_account
+					)
+				)
 			elif par.company != self.company:
-				throw(_("Account {0}: Parent account {1} does not belong to company: {2}")
-					.format(self.name, self.parent_account, self.company))
+				throw(
+					_("Account {0}: Parent account {1} does not belong to company: {2}").format(
+						self.name, self.parent_account, self.company
+					)
+				)
 
 	def set_root_and_report_type(self):
 		if self.parent_account:
-			par = frappe.db.get_value("Account", self.parent_account,
-				["report_type", "root_type"], as_dict=1)
+			par = frappe.db.get_value(
+				"Account", self.parent_account, ["report_type", "root_type"], as_dict=1
+			)
 
 			if par.report_type:
 				self.report_type = par.report_type
@@ -75,15 +95,20 @@
 			db_value = frappe.db.get_value("Account", self.name, ["report_type", "root_type"], as_dict=1)
 			if db_value:
 				if self.report_type != db_value.report_type:
-					frappe.db.sql("update `tabAccount` set report_type=%s where lft > %s and rgt < %s",
-						(self.report_type, self.lft, self.rgt))
+					frappe.db.sql(
+						"update `tabAccount` set report_type=%s where lft > %s and rgt < %s",
+						(self.report_type, self.lft, self.rgt),
+					)
 				if self.root_type != db_value.root_type:
-					frappe.db.sql("update `tabAccount` set root_type=%s where lft > %s and rgt < %s",
-						(self.root_type, self.lft, self.rgt))
+					frappe.db.sql(
+						"update `tabAccount` set root_type=%s where lft > %s and rgt < %s",
+						(self.root_type, self.lft, self.rgt),
+					)
 
 		if self.root_type and not self.report_type:
-			self.report_type = "Balance Sheet" \
-				if self.root_type in ("Asset", "Liability", "Equity") else "Profit and Loss"
+			self.report_type = (
+				"Balance Sheet" if self.root_type in ("Asset", "Liability", "Equity") else "Profit and Loss"
+			)
 
 	def validate_root_details(self):
 		# does not exists parent
@@ -96,21 +121,26 @@
 
 	def validate_root_company_and_sync_account_to_children(self):
 		# ignore validation while creating new compnay or while syncing to child companies
-		if frappe.local.flags.ignore_root_company_validation or self.flags.ignore_root_company_validation:
+		if (
+			frappe.local.flags.ignore_root_company_validation or self.flags.ignore_root_company_validation
+		):
 			return
 		ancestors = get_root_company(self.company)
 		if ancestors:
 			if frappe.get_value("Company", self.company, "allow_account_creation_against_child_company"):
 				return
-			if not frappe.db.get_value("Account",
-				{'account_name': self.account_name, 'company': ancestors[0]}, 'name'):
+			if not frappe.db.get_value(
+				"Account", {"account_name": self.account_name, "company": ancestors[0]}, "name"
+			):
 				frappe.throw(_("Please add the account to root level Company - {}").format(ancestors[0]))
 		elif self.parent_account:
-			descendants = get_descendants_of('Company', self.company)
-			if not descendants: return
+			descendants = get_descendants_of("Company", self.company)
+			if not descendants:
+				return
 			parent_acc_name_map = {}
-			parent_acc_name, parent_acc_number = frappe.db.get_value('Account', self.parent_account, \
-				["account_name", "account_number"])
+			parent_acc_name, parent_acc_number = frappe.db.get_value(
+				"Account", self.parent_account, ["account_name", "account_number"]
+			)
 			filters = {
 				"company": ["in", descendants],
 				"account_name": parent_acc_name,
@@ -118,10 +148,13 @@
 			if parent_acc_number:
 				filters["account_number"] = parent_acc_number
 
-			for d in frappe.db.get_values('Account', filters=filters, fieldname=["company", "name"], as_dict=True):
+			for d in frappe.db.get_values(
+				"Account", filters=filters, fieldname=["company", "name"], as_dict=True
+			):
 				parent_acc_name_map[d["company"]] = d["name"]
 
-			if not parent_acc_name_map: return
+			if not parent_acc_name_map:
+				return
 
 			self.create_account_for_child_company(parent_acc_name_map, descendants, parent_acc_name)
 
@@ -142,24 +175,34 @@
 	def validate_frozen_accounts_modifier(self):
 		old_value = frappe.db.get_value("Account", self.name, "freeze_account")
 		if old_value and old_value != self.freeze_account:
-			frozen_accounts_modifier = frappe.db.get_value('Accounts Settings', None, 'frozen_accounts_modifier')
-			if not frozen_accounts_modifier or \
-				frozen_accounts_modifier not in frappe.get_roles():
-					throw(_("You are not authorized to set Frozen value"))
+			frozen_accounts_modifier = frappe.db.get_value(
+				"Accounts Settings", None, "frozen_accounts_modifier"
+			)
+			if not frozen_accounts_modifier or frozen_accounts_modifier not in frappe.get_roles():
+				throw(_("You are not authorized to set Frozen value"))
 
 	def validate_balance_must_be_debit_or_credit(self):
 		from erpnext.accounts.utils import get_balance_on
+
 		if not self.get("__islocal") and self.balance_must_be:
 			account_balance = get_balance_on(self.name)
 
 			if account_balance > 0 and self.balance_must_be == "Credit":
-				frappe.throw(_("Account balance already in Debit, you are not allowed to set 'Balance Must Be' as 'Credit'"))
+				frappe.throw(
+					_(
+						"Account balance already in Debit, you are not allowed to set 'Balance Must Be' as 'Credit'"
+					)
+				)
 			elif account_balance < 0 and self.balance_must_be == "Debit":
-				frappe.throw(_("Account balance already in Credit, you are not allowed to set 'Balance Must Be' as 'Debit'"))
+				frappe.throw(
+					_(
+						"Account balance already in Credit, you are not allowed to set 'Balance Must Be' as 'Debit'"
+					)
+				)
 
 	def validate_account_currency(self):
 		if not self.account_currency:
-			self.account_currency = frappe.get_cached_value('Company',  self.company,  "default_currency")
+			self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
 
 		elif self.account_currency != frappe.db.get_value("Account", self.name, "account_currency"):
 			if frappe.db.get_value("GL Entry", {"account": self.name}):
@@ -170,45 +213,52 @@
 			company_bold = frappe.bold(company)
 			parent_acc_name_bold = frappe.bold(parent_acc_name)
 			if not parent_acc_name_map.get(company):
-				frappe.throw(_("While creating account for Child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
-					.format(company_bold, parent_acc_name_bold), title=_("Account Not Found"))
+				frappe.throw(
+					_(
+						"While creating account for Child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA"
+					).format(company_bold, parent_acc_name_bold),
+					title=_("Account Not Found"),
+				)
 
 			# validate if parent of child company account to be added is a group
-			if (frappe.db.get_value("Account", self.parent_account, "is_group")
-				and not frappe.db.get_value("Account", parent_acc_name_map[company], "is_group")):
-				msg = _("While creating account for Child Company {0}, parent account {1} found as a ledger account.").format(company_bold, parent_acc_name_bold)
+			if frappe.db.get_value("Account", self.parent_account, "is_group") and not frappe.db.get_value(
+				"Account", parent_acc_name_map[company], "is_group"
+			):
+				msg = _(
+					"While creating account for Child Company {0}, parent account {1} found as a ledger account."
+				).format(company_bold, parent_acc_name_bold)
 				msg += "<br><br>"
-				msg += _("Please convert the parent account in corresponding child company to a group account.")
+				msg += _(
+					"Please convert the parent account in corresponding child company to a group account."
+				)
 				frappe.throw(msg, title=_("Invalid Parent Account"))
 
-			filters = {
-				"account_name": self.account_name,
-				"company": company
-			}
+			filters = {"account_name": self.account_name, "company": company}
 
 			if self.account_number:
 				filters["account_number"] = self.account_number
 
-			child_account = frappe.db.get_value("Account", filters, 'name')
+			child_account = frappe.db.get_value("Account", filters, "name")
 			if not child_account:
 				doc = frappe.copy_doc(self)
 				doc.flags.ignore_root_company_validation = True
-				doc.update({
-					"company": company,
-					# parent account's currency should be passed down to child account's curreny
-					# if it is None, it picks it up from default company currency, which might be unintended
-					"account_currency": erpnext.get_company_currency(company),
-					"parent_account": parent_acc_name_map[company]
-				})
+				doc.update(
+					{
+						"company": company,
+						# parent account's currency should be passed down to child account's curreny
+						# if it is None, it picks it up from default company currency, which might be unintended
+						"account_currency": erpnext.get_company_currency(company),
+						"parent_account": parent_acc_name_map[company],
+					}
+				)
 
 				doc.save()
-				frappe.msgprint(_("Account {0} is added in the child company {1}")
-					.format(doc.name, company))
+				frappe.msgprint(_("Account {0} is added in the child company {1}").format(doc.name, company))
 			elif child_account:
 				# update the parent company's value in child companies
 				doc = frappe.get_doc("Account", child_account)
 				parent_value_changed = False
-				for field in ['account_type', 'freeze_account', 'balance_must_be']:
+				for field in ["account_type", "freeze_account", "balance_must_be"]:
 					if doc.get(field) != self.get(field):
 						parent_value_changed = True
 						doc.set(field, self.get(field))
@@ -243,8 +293,11 @@
 		return frappe.db.get_value("GL Entry", {"account": self.name})
 
 	def check_if_child_exists(self):
-		return frappe.db.sql("""select name from `tabAccount` where parent_account = %s
-			and docstatus != 2""", self.name)
+		return frappe.db.sql(
+			"""select name from `tabAccount` where parent_account = %s
+			and docstatus != 2""",
+			self.name,
+		)
 
 	def validate_mandatory(self):
 		if not self.root_type:
@@ -260,73 +313,99 @@
 
 		super(Account, self).on_trash(True)
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql("""select name from tabAccount
+	return frappe.db.sql(
+		"""select name from tabAccount
 		where is_group = 1 and docstatus != 2 and company = %s
-		and %s like %s order by name limit %s, %s""" %
-		("%s", searchfield, "%s", "%s", "%s"),
-		(filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
+		and %s like %s order by name limit %s, %s"""
+		% ("%s", searchfield, "%s", "%s", "%s"),
+		(filters["company"], "%%%s%%" % txt, start, page_len),
+		as_list=1,
+	)
+
 
 def get_account_currency(account):
 	"""Helper function to get account currency"""
 	if not account:
 		return
+
 	def generator():
-		account_currency, company = frappe.get_cached_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")
+			account_currency = frappe.get_cached_value("Company", company, "default_currency")
 
 		return account_currency
 
 	return frappe.local_cache("account_currency", account, generator)
 
+
 def on_doctype_update():
 	frappe.db.add_index("Account", ["lft", "rgt"])
 
+
 def get_account_autoname(account_number, account_name, company):
 	# first validate if company exists
-	company = frappe.get_cached_value('Company',  company,  ["abbr", "name"], as_dict=True)
+	company = frappe.get_cached_value("Company", company, ["abbr", "name"], as_dict=True)
 	if not company:
-		frappe.throw(_('Company {0} does not exist').format(company))
+		frappe.throw(_("Company {0} does not exist").format(company))
 
 	parts = [account_name.strip(), company.abbr]
 	if cstr(account_number).strip():
 		parts.insert(0, cstr(account_number).strip())
-	return ' - '.join(parts)
+	return " - ".join(parts)
+
 
 def validate_account_number(name, account_number, company):
 	if account_number:
-		account_with_same_number = frappe.db.get_value("Account",
-			{"account_number": account_number, "company": company, "name": ["!=", name]})
+		account_with_same_number = frappe.db.get_value(
+			"Account", {"account_number": account_number, "company": company, "name": ["!=", name]}
+		)
 		if account_with_same_number:
-			frappe.throw(_("Account Number {0} already used in account {1}")
-				.format(account_number, account_with_same_number))
+			frappe.throw(
+				_("Account Number {0} already used in account {1}").format(
+					account_number, account_with_same_number
+				)
+			)
+
 
 @frappe.whitelist()
 def update_account_number(name, account_name, account_number=None, from_descendant=False):
 	account = frappe.db.get_value("Account", name, "company", as_dict=True)
-	if not account: return
+	if not account:
+		return
 
-	old_acc_name, old_acc_number = frappe.db.get_value('Account', name, \
-				["account_name", "account_number"])
+	old_acc_name, old_acc_number = frappe.db.get_value(
+		"Account", name, ["account_name", "account_number"]
+	)
 
 	# check if account exists in parent company
 	ancestors = get_ancestors_of("Company", account.company)
-	allow_independent_account_creation = frappe.get_value("Company", account.company, "allow_account_creation_against_child_company")
+	allow_independent_account_creation = frappe.get_value(
+		"Company", account.company, "allow_account_creation_against_child_company"
+	)
 
 	if ancestors and not allow_independent_account_creation:
 		for ancestor in ancestors:
-			if frappe.db.get_value("Account", {'account_name': old_acc_name, 'company': ancestor}, 'name'):
+			if frappe.db.get_value("Account", {"account_name": old_acc_name, "company": ancestor}, "name"):
 				# same account in parent company exists
 				allow_child_account_creation = _("Allow Account Creation Against Child Company")
 
-				message = _("Account {0} exists in parent company {1}.").format(frappe.bold(old_acc_name), frappe.bold(ancestor))
+				message = _("Account {0} exists in parent company {1}.").format(
+					frappe.bold(old_acc_name), frappe.bold(ancestor)
+				)
 				message += "<br>"
-				message += _("Renaming it is only allowed via parent company {0}, to avoid mismatch.").format(frappe.bold(ancestor))
+				message += _("Renaming it is only allowed via parent company {0}, to avoid mismatch.").format(
+					frappe.bold(ancestor)
+				)
 				message += "<br><br>"
-				message += _("To overrule this, enable '{0}' in company {1}").format(allow_child_account_creation, frappe.bold(account.company))
+				message += _("To overrule this, enable '{0}' in company {1}").format(
+					allow_child_account_creation, frappe.bold(account.company)
+				)
 
 				frappe.throw(message, title=_("Rename Not Allowed"))
 
@@ -339,42 +418,53 @@
 
 	if not from_descendant:
 		# Update and rename in child company accounts as well
-		descendants = get_descendants_of('Company', account.company)
+		descendants = get_descendants_of("Company", account.company)
 		if descendants:
-			sync_update_account_number_in_child(descendants, old_acc_name, account_name, account_number, old_acc_number)
+			sync_update_account_number_in_child(
+				descendants, old_acc_name, account_name, account_number, old_acc_number
+			)
 
 	new_name = get_account_autoname(account_number, account_name, account.company)
 	if name != new_name:
 		frappe.rename_doc("Account", name, new_name, force=1)
 		return new_name
 
+
 @frappe.whitelist()
 def merge_account(old, new, is_group, root_type, company):
 	# Validate properties before merging
 	if not frappe.db.exists("Account", new):
 		throw(_("Account {0} does not exist").format(new))
 
-	val = list(frappe.db.get_value("Account", new,
-		["is_group", "root_type", "company"]))
+	val = list(frappe.db.get_value("Account", new, ["is_group", "root_type", "company"]))
 
 	if val != [cint(is_group), root_type, company]:
-		throw(_("""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company"""))
+		throw(
+			_(
+				"""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company"""
+			)
+		)
 
 	if is_group and frappe.db.get_value("Account", new, "parent_account") == old:
-		frappe.db.set_value("Account", new, "parent_account",
-			frappe.db.get_value("Account", old, "parent_account"))
+		frappe.db.set_value(
+			"Account", new, "parent_account", frappe.db.get_value("Account", old, "parent_account")
+		)
 
 	frappe.rename_doc("Account", old, new, merge=1, force=1)
 
 	return new
 
+
 @frappe.whitelist()
 def get_root_company(company):
 	# return the topmost company in the hierarchy
-	ancestors = get_ancestors_of('Company', company, "lft asc")
+	ancestors = get_ancestors_of("Company", company, "lft asc")
 	return [ancestors[0]] if ancestors else []
 
-def sync_update_account_number_in_child(descendants, old_acc_name, account_name, account_number=None, old_acc_number=None):
+
+def sync_update_account_number_in_child(
+	descendants, old_acc_name, account_name, account_number=None, old_acc_number=None
+):
 	filters = {
 		"company": ["in", descendants],
 		"account_name": old_acc_name,
@@ -382,5 +472,7 @@
 	if old_acc_number:
 		filters["account_number"] = old_acc_number
 
-	for d in frappe.db.get_values('Account', filters=filters, fieldname=["company", "name"], as_dict=True):
-			update_account_number(d["name"], account_name, account_number, from_descendant=True)
+	for d in frappe.db.get_values(
+		"Account", filters=filters, fieldname=["company", "name"], as_dict=True
+	):
+		update_account_number(d["name"], account_name, account_number, from_descendant=True)
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
index a8de06c..947b485 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
@@ -10,7 +10,9 @@
 from unidecode import unidecode
 
 
-def create_charts(company, chart_template=None, existing_company=None, custom_chart=None, from_coa_importer=None):
+def create_charts(
+	company, chart_template=None, existing_company=None, custom_chart=None, from_coa_importer=None
+):
 	chart = custom_chart or get_chart(chart_template, existing_company)
 	if chart:
 		accounts = []
@@ -20,30 +22,41 @@
 				if root_account:
 					root_type = child.get("root_type")
 
-				if account_name not in ["account_name", "account_number", "account_type",
-					"root_type", "is_group", "tax_rate"]:
+				if account_name not in [
+					"account_name",
+					"account_number",
+					"account_type",
+					"root_type",
+					"is_group",
+					"tax_rate",
+				]:
 
 					account_number = cstr(child.get("account_number")).strip()
-					account_name, account_name_in_db = add_suffix_if_duplicate(account_name,
-						account_number, accounts)
+					account_name, account_name_in_db = add_suffix_if_duplicate(
+						account_name, account_number, accounts
+					)
 
 					is_group = identify_is_group(child)
-					report_type = "Balance Sheet" if root_type in ["Asset", "Liability", "Equity"] \
-						else "Profit and Loss"
+					report_type = (
+						"Balance Sheet" if root_type in ["Asset", "Liability", "Equity"] else "Profit and Loss"
+					)
 
-					account = frappe.get_doc({
-						"doctype": "Account",
-						"account_name": child.get('account_name') if from_coa_importer else account_name,
-						"company": company,
-						"parent_account": parent,
-						"is_group": is_group,
-						"root_type": root_type,
-						"report_type": report_type,
-						"account_number": account_number,
-						"account_type": child.get("account_type"),
-						"account_currency": child.get('account_currency') or frappe.db.get_value('Company',  company,  "default_currency"),
-						"tax_rate": child.get("tax_rate")
-					})
+					account = frappe.get_doc(
+						{
+							"doctype": "Account",
+							"account_name": child.get("account_name") if from_coa_importer else account_name,
+							"company": company,
+							"parent_account": parent,
+							"is_group": is_group,
+							"root_type": root_type,
+							"report_type": report_type,
+							"account_number": account_number,
+							"account_type": child.get("account_type"),
+							"account_currency": child.get("account_currency")
+							or frappe.db.get_value("Company", company, "default_currency"),
+							"tax_rate": child.get("tax_rate"),
+						}
+					)
 
 					if root_account or frappe.local.flags.allow_unverified_charts:
 						account.flags.ignore_mandatory = True
@@ -63,10 +76,10 @@
 		rebuild_tree("Account", "parent_account")
 		frappe.local.flags.ignore_update_nsm = False
 
+
 def add_suffix_if_duplicate(account_name, account_number, accounts):
 	if account_number:
-		account_name_in_db = unidecode(" - ".join([account_number,
-			account_name.strip().lower()]))
+		account_name_in_db = unidecode(" - ".join([account_number, account_name.strip().lower()]))
 	else:
 		account_name_in_db = unidecode(account_name.strip().lower())
 
@@ -76,16 +89,21 @@
 
 	return account_name, account_name_in_db
 
+
 def identify_is_group(child):
 	if child.get("is_group"):
 		is_group = child.get("is_group")
-	elif len(set(child.keys()) - set(["account_name", "account_type", "root_type", "is_group", "tax_rate", "account_number"])):
+	elif len(
+		set(child.keys())
+		- set(["account_name", "account_type", "root_type", "is_group", "tax_rate", "account_number"])
+	):
 		is_group = 1
 	else:
 		is_group = 0
 
 	return is_group
 
+
 def get_chart(chart_template, existing_company=None):
 	chart = {}
 	if existing_company:
@@ -95,11 +113,13 @@
 		from erpnext.accounts.doctype.account.chart_of_accounts.verified import (
 			standard_chart_of_accounts,
 		)
+
 		return standard_chart_of_accounts.get()
 	elif chart_template == "Standard with Numbers":
 		from erpnext.accounts.doctype.account.chart_of_accounts.verified import (
 			standard_chart_of_accounts_with_account_number,
 		)
+
 		return standard_chart_of_accounts_with_account_number.get()
 	else:
 		folders = ("verified",)
@@ -115,6 +135,7 @@
 						if chart and json.loads(chart).get("name") == chart_template:
 							return json.loads(chart).get("tree")
 
+
 @frappe.whitelist()
 def get_charts_for_country(country, with_standard=False):
 	charts = []
@@ -122,9 +143,10 @@
 	def _get_chart_name(content):
 		if content:
 			content = json.loads(content)
-			if (content and content.get("disabled", "No") == "No") \
-				or frappe.local.flags.allow_unverified_charts:
-					charts.append(content["name"])
+			if (
+				content and content.get("disabled", "No") == "No"
+			) or frappe.local.flags.allow_unverified_charts:
+				charts.append(content["name"])
 
 	country_code = frappe.db.get_value("Country", country, "code")
 	if country_code:
@@ -151,11 +173,21 @@
 
 
 def get_account_tree_from_existing_company(existing_company):
-	all_accounts = frappe.get_all('Account',
-		filters={'company': existing_company},
-		fields = ["name", "account_name", "parent_account", "account_type",
-			"is_group", "root_type", "tax_rate", "account_number"],
-		order_by="lft, rgt")
+	all_accounts = frappe.get_all(
+		"Account",
+		filters={"company": existing_company},
+		fields=[
+			"name",
+			"account_name",
+			"parent_account",
+			"account_type",
+			"is_group",
+			"root_type",
+			"tax_rate",
+			"account_number",
+		],
+		order_by="lft, rgt",
+	)
 
 	account_tree = {}
 
@@ -164,6 +196,7 @@
 		build_account_tree(account_tree, None, all_accounts)
 	return account_tree
 
+
 def build_account_tree(tree, parent, all_accounts):
 	# find children
 	parent_account = parent.name if parent else ""
@@ -192,27 +225,29 @@
 		# call recursively to build a subtree for current account
 		build_account_tree(tree[child.account_name], child, all_accounts)
 
+
 @frappe.whitelist()
 def validate_bank_account(coa, bank_account):
 	accounts = []
 	chart = get_chart(coa)
 
 	if chart:
+
 		def _get_account_names(account_master):
 			for account_name, child in account_master.items():
-				if account_name not in ["account_number", "account_type",
-					"root_type", "is_group", "tax_rate"]:
+				if account_name not in ["account_number", "account_type", "root_type", "is_group", "tax_rate"]:
 					accounts.append(account_name)
 
 					_get_account_names(child)
 
 		_get_account_names(chart)
 
-	return (bank_account in accounts)
+	return bank_account in accounts
+
 
 @frappe.whitelist()
 def build_tree_from_json(chart_template, chart_data=None, from_coa_importer=False):
-	''' get chart template from its folder and parse the json to be rendered as tree '''
+	"""get chart template from its folder and parse the json to be rendered as tree"""
 	chart = chart_data or get_chart(chart_template)
 
 	# if no template selected, return as it is
@@ -220,22 +255,33 @@
 		return
 
 	accounts = []
+
 	def _import_accounts(children, parent):
-		''' recursively called to form a parent-child based list of dict from chart template '''
+		"""recursively called to form a parent-child based list of dict from chart template"""
 		for account_name, child in children.items():
 			account = {}
-			if account_name in ["account_name", "account_number", "account_type",\
-				"root_type", "is_group", "tax_rate"]: continue
+			if account_name in [
+				"account_name",
+				"account_number",
+				"account_type",
+				"root_type",
+				"is_group",
+				"tax_rate",
+			]:
+				continue
 
 			if from_coa_importer:
-				account_name = child['account_name']
+				account_name = child["account_name"]
 
-			account['parent_account'] = parent
-			account['expandable'] = True if identify_is_group(child) else False
-			account['value'] = (cstr(child.get('account_number')).strip() + ' - ' + account_name) \
-				if child.get('account_number') else account_name
+			account["parent_account"] = parent
+			account["expandable"] = True if identify_is_group(child) else False
+			account["value"] = (
+				(cstr(child.get("account_number")).strip() + " - " + account_name)
+				if child.get("account_number")
+				else account_name
+			)
 			accounts.append(account)
-			_import_accounts(child, account['value'])
+			_import_accounts(child, account["value"])
 
 	_import_accounts(chart, None)
 	return accounts
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/import_from_openerp.py b/erpnext/accounts/doctype/account/chart_of_accounts/import_from_openerp.py
index 79001d7..3f25ada 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/import_from_openerp.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/import_from_openerp.py
@@ -20,6 +20,7 @@
 all_account_types = []
 all_roots = {}
 
+
 def go():
 	global accounts, charts
 	default_account_types = get_default_account_types()
@@ -34,14 +35,16 @@
 		accounts, charts = {}, {}
 		country_path = os.path.join(path, country_dir)
 		manifest = ast.literal_eval(open(os.path.join(country_path, "__openerp__.py")).read())
-		data_files = manifest.get("data", []) + manifest.get("init_xml", []) + \
-			manifest.get("update_xml", [])
+		data_files = (
+			manifest.get("data", []) + manifest.get("init_xml", []) + manifest.get("update_xml", [])
+		)
 		files_path = [os.path.join(country_path, d) for d in data_files]
 		xml_roots = get_xml_roots(files_path)
 		csv_content = get_csv_contents(files_path)
 		prefix = country_dir if csv_content else None
-		account_types = get_account_types(xml_roots.get("account.account.type", []),
-			csv_content.get("account.account.type", []), prefix)
+		account_types = get_account_types(
+			xml_roots.get("account.account.type", []), csv_content.get("account.account.type", []), prefix
+		)
 		account_types.update(default_account_types)
 
 		if xml_roots:
@@ -54,12 +57,15 @@
 
 	create_all_roots_file()
 
+
 def get_default_account_types():
 	default_types_root = []
-	default_types_root.append(ET.parse(os.path.join(path, "account", "data",
-			"data_account_type.xml")).getroot())
+	default_types_root.append(
+		ET.parse(os.path.join(path, "account", "data", "data_account_type.xml")).getroot()
+	)
 	return get_account_types(default_types_root, None, prefix="account")
 
+
 def get_xml_roots(files_path):
 	xml_roots = frappe._dict()
 	for filepath in files_path:
@@ -68,64 +74,69 @@
 			tree = ET.parse(filepath)
 			root = tree.getroot()
 			for node in root[0].findall("record"):
-				if node.get("model") in ["account.account.template",
-					"account.chart.template", "account.account.type"]:
+				if node.get("model") in [
+					"account.account.template",
+					"account.chart.template",
+					"account.account.type",
+				]:
 					xml_roots.setdefault(node.get("model"), []).append(root)
 					break
 	return xml_roots
 
+
 def get_csv_contents(files_path):
 	csv_content = {}
 	for filepath in files_path:
 		fname = os.path.basename(filepath)
-		for file_type in ["account.account.template", "account.account.type",
-				"account.chart.template"]:
+		for file_type in ["account.account.template", "account.account.type", "account.chart.template"]:
 			if fname.startswith(file_type) and fname.endswith(".csv"):
 				with open(filepath, "r") as csvfile:
 					try:
-						csv_content.setdefault(file_type, [])\
-							.append(read_csv_content(csvfile.read()))
+						csv_content.setdefault(file_type, []).append(read_csv_content(csvfile.read()))
 					except Exception as e:
 						continue
 	return csv_content
 
+
 def get_account_types(root_list, csv_content, prefix=None):
 	types = {}
 	account_type_map = {
-		'cash': 'Cash',
-		'bank': 'Bank',
-		'tr_cash': 'Cash',
-		'tr_bank': 'Bank',
-		'receivable': 'Receivable',
-		'tr_receivable': 'Receivable',
-		'account rec': 'Receivable',
-		'payable': 'Payable',
-		'tr_payable': 'Payable',
-		'equity': 'Equity',
-		'stocks': 'Stock',
-		'stock': 'Stock',
-		'tax': 'Tax',
-		'tr_tax': 'Tax',
-		'tax-out': 'Tax',
-		'tax-in': 'Tax',
-		'charges_personnel': 'Chargeable',
-		'fixed asset': 'Fixed Asset',
-		'cogs': 'Cost of Goods Sold',
-
+		"cash": "Cash",
+		"bank": "Bank",
+		"tr_cash": "Cash",
+		"tr_bank": "Bank",
+		"receivable": "Receivable",
+		"tr_receivable": "Receivable",
+		"account rec": "Receivable",
+		"payable": "Payable",
+		"tr_payable": "Payable",
+		"equity": "Equity",
+		"stocks": "Stock",
+		"stock": "Stock",
+		"tax": "Tax",
+		"tr_tax": "Tax",
+		"tax-out": "Tax",
+		"tax-in": "Tax",
+		"charges_personnel": "Chargeable",
+		"fixed asset": "Fixed Asset",
+		"cogs": "Cost of Goods Sold",
 	}
 	for root in root_list:
 		for node in root[0].findall("record"):
-			if node.get("model")=="account.account.type":
+			if node.get("model") == "account.account.type":
 				data = {}
 				for field in node.findall("field"):
-					if field.get("name")=="code" and field.text.lower() != "none" \
-						and account_type_map.get(field.text):
-							data["account_type"] = account_type_map[field.text]
+					if (
+						field.get("name") == "code"
+						and field.text.lower() != "none"
+						and account_type_map.get(field.text)
+					):
+						data["account_type"] = account_type_map[field.text]
 
 				node_id = prefix + "." + node.get("id") if prefix else node.get("id")
 				types[node_id] = data
 
-	if csv_content and csv_content[0][0]=="id":
+	if csv_content and csv_content[0][0] == "id":
 		for row in csv_content[1:]:
 			row_dict = dict(zip(csv_content[0], row))
 			data = {}
@@ -136,21 +147,22 @@
 				types[node_id] = data
 	return types
 
+
 def make_maps_for_xml(xml_roots, account_types, country_dir):
 	"""make maps for `charts` and `accounts`"""
 	for model, root_list in xml_roots.items():
 		for root in root_list:
 			for node in root[0].findall("record"):
-				if node.get("model")=="account.account.template":
+				if node.get("model") == "account.account.template":
 					data = {}
 					for field in node.findall("field"):
-						if field.get("name")=="name":
+						if field.get("name") == "name":
 							data["name"] = field.text
-						if field.get("name")=="parent_id":
+						if field.get("name") == "parent_id":
 							parent_id = field.get("ref") or field.get("eval")
 							data["parent_id"] = parent_id
 
-						if field.get("name")=="user_type":
+						if field.get("name") == "user_type":
 							value = field.get("ref")
 							if account_types.get(value, {}).get("account_type"):
 								data["account_type"] = account_types[value]["account_type"]
@@ -160,16 +172,17 @@
 					data["children"] = []
 					accounts[node.get("id")] = data
 
-				if node.get("model")=="account.chart.template":
+				if node.get("model") == "account.chart.template":
 					data = {}
 					for field in node.findall("field"):
-						if field.get("name")=="name":
+						if field.get("name") == "name":
 							data["name"] = field.text
-						if field.get("name")=="account_root_id":
+						if field.get("name") == "account_root_id":
 							data["account_root_id"] = field.get("ref")
 						data["id"] = country_dir
 					charts.setdefault(node.get("id"), {}).update(data)
 
+
 def make_maps_for_csv(csv_content, account_types, country_dir):
 	for content in csv_content.get("account.account.template", []):
 		for row in content[1:]:
@@ -177,7 +190,7 @@
 			account = {
 				"name": data.get("name"),
 				"parent_id": data.get("parent_id:id") or data.get("parent_id/id"),
-				"children": []
+				"children": [],
 			}
 			user_type = data.get("user_type/id") or data.get("user_type:id")
 			if account_types.get(user_type, {}).get("account_type"):
@@ -194,12 +207,14 @@
 		for row in content[1:]:
 			if row:
 				data = dict(zip(content[0], row))
-				charts.setdefault(data.get("id"), {}).update({
-					"account_root_id": data.get("account_root_id:id") or \
-						data.get("account_root_id/id"),
-					"name": data.get("name"),
-					"id": country_dir
-				})
+				charts.setdefault(data.get("id"), {}).update(
+					{
+						"account_root_id": data.get("account_root_id:id") or data.get("account_root_id/id"),
+						"name": data.get("name"),
+						"id": country_dir,
+					}
+				)
+
 
 def make_account_trees():
 	"""build tree hierarchy"""
@@ -218,6 +233,7 @@
 		if "children" in accounts[id] and not accounts[id].get("children"):
 			del accounts[id]["children"]
 
+
 def make_charts():
 	"""write chart files in app/setup/doctype/company/charts"""
 	for chart_id in charts:
@@ -236,34 +252,38 @@
 		chart["country_code"] = src["id"][5:]
 		chart["tree"] = accounts[src["account_root_id"]]
 
-
 		for key, val in chart["tree"].items():
 			if key in ["name", "parent_id"]:
 				chart["tree"].pop(key)
 			if type(val) == dict:
 				val["root_type"] = ""
 		if chart:
-			fpath = os.path.join("erpnext", "erpnext", "accounts", "doctype", "account",
-				"chart_of_accounts", filename + ".json")
+			fpath = os.path.join(
+				"erpnext", "erpnext", "accounts", "doctype", "account", "chart_of_accounts", filename + ".json"
+			)
 
 			with open(fpath, "r") as chartfile:
 				old_content = chartfile.read()
-				if not old_content or (json.loads(old_content).get("is_active", "No") == "No" \
-						and json.loads(old_content).get("disabled", "No") == "No"):
+				if not old_content or (
+					json.loads(old_content).get("is_active", "No") == "No"
+					and json.loads(old_content).get("disabled", "No") == "No"
+				):
 					with open(fpath, "w") as chartfile:
 						chartfile.write(json.dumps(chart, indent=4, sort_keys=True))
 
 					all_roots.setdefault(filename, chart["tree"].keys())
 
+
 def create_all_roots_file():
-	with open('all_roots.txt', 'w') as f:
+	with open("all_roots.txt", "w") as f:
 		for filename, roots in sorted(all_roots.items()):
 			f.write(filename)
-			f.write('\n----------------------\n')
+			f.write("\n----------------------\n")
 			for r in sorted(roots):
-				f.write(r.encode('utf-8'))
-				f.write('\n')
-			f.write('\n\n\n')
+				f.write(r.encode("utf-8"))
+				f.write("\n")
+			f.write("\n\n\n")
 
-if __name__=="__main__":
+
+if __name__ == "__main__":
 	go()
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
index 9248ffa..e30ad24 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
@@ -7,182 +7,103 @@
 
 def get():
 	return {
-	    _("Application of Funds (Assets)"): {
-	        _("Current Assets"): {
-	            _("Accounts Receivable"): {
-	                _("Debtors"): {
-	                    "account_type": "Receivable"
-	                }
-	            },
-	            _("Bank Accounts"): {
-	                "account_type": "Bank",
-					"is_group": 1
-	            },
-	            _("Cash In Hand"): {
-	                _("Cash"): {
-	                    "account_type": "Cash"
-	                },
-	                "account_type": "Cash"
-	            },
-	            _("Loans and Advances (Assets)"): {
-                    	_("Employee Advances"): {
-                    	},
-	            },
-	            _("Securities and Deposits"): {
-	                _("Earnest Money"): {}
-	            },
-	            _("Stock Assets"): {
-	                _("Stock In Hand"): {
-	                    "account_type": "Stock"
-	                },
-	                "account_type": "Stock",
-	            },
-	            _("Tax Assets"): {
-					"is_group": 1
-				}
-	        },
-	        _("Fixed Assets"): {
-	            _("Capital Equipments"): {
-	                "account_type": "Fixed Asset"
-	            },
-	            _("Electronic Equipments"): {
-	                "account_type": "Fixed Asset"
-	            },
-	            _("Furnitures and Fixtures"): {
-	                "account_type": "Fixed Asset"
-	            },
-	            _("Office Equipments"): {
-	                "account_type": "Fixed Asset"
-	            },
-	            _("Plants and Machineries"): {
-	                "account_type": "Fixed Asset"
-	            },
-				_("Buildings"): {
-					"account_type": "Fixed Asset"
+		_("Application of Funds (Assets)"): {
+			_("Current Assets"): {
+				_("Accounts Receivable"): {_("Debtors"): {"account_type": "Receivable"}},
+				_("Bank Accounts"): {"account_type": "Bank", "is_group": 1},
+				_("Cash In Hand"): {_("Cash"): {"account_type": "Cash"}, "account_type": "Cash"},
+				_("Loans and Advances (Assets)"): {
+					_("Employee Advances"): {},
 				},
-				_("Softwares"): {
-					"account_type": "Fixed Asset"
+				_("Securities and Deposits"): {_("Earnest Money"): {}},
+				_("Stock Assets"): {
+					_("Stock In Hand"): {"account_type": "Stock"},
+					"account_type": "Stock",
 				},
-	            _("Accumulated Depreciation"): {
-	            	"account_type": "Accumulated Depreciation"
-	            },
-                _("CWIP Account"): {
-                    "account_type": "Capital Work in Progress",
-                }
-	        },
-	        _("Investments"): {
-	        	"is_group": 1
-	        },
-	        _("Temporary Accounts"): {
-	            _("Temporary Opening"): {
-	            	"account_type": "Temporary"
-	            }
-	        },
-			"root_type": "Asset"
-	    },
-	    _("Expenses"): {
-	        _("Direct Expenses"): {
-	            _("Stock Expenses"): {
-	                _("Cost of Goods Sold"): {
-	                    "account_type": "Cost of Goods Sold"
-	                },
-                    _("Expenses Included In Asset Valuation"): {
-                        "account_type": "Expenses Included In Asset Valuation"
-                    },
-	                _("Expenses Included In Valuation"): {
-	                    "account_type": "Expenses Included In Valuation"
-	                },
-	                _("Stock Adjustment"): {
-	                    "account_type": "Stock Adjustment"
-	                }
-	            },
-	        },
-	        _("Indirect Expenses"): {
-	            _("Administrative Expenses"): {},
-	            _("Commission on Sales"): {},
-	            _("Depreciation"): {
-	                "account_type": "Depreciation"
-	            },
-	            _("Entertainment Expenses"): {},
-	            _("Freight and Forwarding Charges"): {
-	                "account_type": "Chargeable"
-	            },
-	            _("Legal Expenses"): {},
-	            _("Marketing Expenses"): {
-	                "account_type": "Chargeable"
-	            },
-	            _("Miscellaneous Expenses"): {
-	                "account_type": "Chargeable"
-	            },
-	            _("Office Maintenance Expenses"): {},
-	            _("Office Rent"): {},
-	            _("Postal Expenses"): {},
-	            _("Print and Stationery"): {},
-	            _("Round Off"): {
-	                "account_type": "Round Off"
-	            },
-	            _("Salary"): {},
-	            _("Sales Expenses"): {},
-	            _("Telephone Expenses"): {},
-	            _("Travel Expenses"): {},
-	            _("Utility Expenses"): {},
+				_("Tax Assets"): {"is_group": 1},
+			},
+			_("Fixed Assets"): {
+				_("Capital Equipments"): {"account_type": "Fixed Asset"},
+				_("Electronic Equipments"): {"account_type": "Fixed Asset"},
+				_("Furnitures and Fixtures"): {"account_type": "Fixed Asset"},
+				_("Office Equipments"): {"account_type": "Fixed Asset"},
+				_("Plants and Machineries"): {"account_type": "Fixed Asset"},
+				_("Buildings"): {"account_type": "Fixed Asset"},
+				_("Softwares"): {"account_type": "Fixed Asset"},
+				_("Accumulated Depreciation"): {"account_type": "Accumulated Depreciation"},
+				_("CWIP Account"): {
+					"account_type": "Capital Work in Progress",
+				},
+			},
+			_("Investments"): {"is_group": 1},
+			_("Temporary Accounts"): {_("Temporary Opening"): {"account_type": "Temporary"}},
+			"root_type": "Asset",
+		},
+		_("Expenses"): {
+			_("Direct Expenses"): {
+				_("Stock Expenses"): {
+					_("Cost of Goods Sold"): {"account_type": "Cost of Goods Sold"},
+					_("Expenses Included In Asset Valuation"): {
+						"account_type": "Expenses Included In Asset Valuation"
+					},
+					_("Expenses Included In Valuation"): {"account_type": "Expenses Included In Valuation"},
+					_("Stock Adjustment"): {"account_type": "Stock Adjustment"},
+				},
+			},
+			_("Indirect Expenses"): {
+				_("Administrative Expenses"): {},
+				_("Commission on Sales"): {},
+				_("Depreciation"): {"account_type": "Depreciation"},
+				_("Entertainment Expenses"): {},
+				_("Freight and Forwarding Charges"): {"account_type": "Chargeable"},
+				_("Legal Expenses"): {},
+				_("Marketing Expenses"): {"account_type": "Chargeable"},
+				_("Miscellaneous Expenses"): {"account_type": "Chargeable"},
+				_("Office Maintenance Expenses"): {},
+				_("Office Rent"): {},
+				_("Postal Expenses"): {},
+				_("Print and Stationery"): {},
+				_("Round Off"): {"account_type": "Round Off"},
+				_("Salary"): {},
+				_("Sales Expenses"): {},
+				_("Telephone Expenses"): {},
+				_("Travel Expenses"): {},
+				_("Utility Expenses"): {},
 				_("Write Off"): {},
 				_("Exchange Gain/Loss"): {},
-				_("Gain/Loss on Asset Disposal"): {}
-	        },
-			"root_type": "Expense"
-	    },
-	    _("Income"): {
-	        _("Direct Income"): {
-	            _("Sales"): {},
-	            _("Service"): {}
-	        },
-	        _("Indirect Income"): {
-				"is_group": 1
-	        },
-	        "root_type": "Income"
-	    },
-	    _("Source of Funds (Liabilities)"): {
-	        _("Current Liabilities"): {
-			    _("Accounts Payable"): {
-			        _("Creditors"): {
-			            "account_type": "Payable"
-			        },
-			        _("Payroll Payable"): {},
-			    },
-			    _("Stock Liabilities"): {
-				    _("Stock Received But Not Billed"): {
-				        "account_type": "Stock Received But Not Billed"
-				    },
-                    _("Asset Received But Not Billed"): {
-                        "account_type": "Asset Received But Not Billed"
-                    }
-			    },
-				_("Duties and Taxes"): {
-					"account_type": "Tax",
-					"is_group": 1
+				_("Gain/Loss on Asset Disposal"): {},
+			},
+			"root_type": "Expense",
+		},
+		_("Income"): {
+			_("Direct Income"): {_("Sales"): {}, _("Service"): {}},
+			_("Indirect Income"): {"is_group": 1},
+			"root_type": "Income",
+		},
+		_("Source of Funds (Liabilities)"): {
+			_("Current Liabilities"): {
+				_("Accounts Payable"): {
+					_("Creditors"): {"account_type": "Payable"},
+					_("Payroll Payable"): {},
 				},
+				_("Stock Liabilities"): {
+					_("Stock Received But Not Billed"): {"account_type": "Stock Received But Not Billed"},
+					_("Asset Received But Not Billed"): {"account_type": "Asset Received But Not Billed"},
+				},
+				_("Duties and Taxes"): {"account_type": "Tax", "is_group": 1},
 				_("Loans (Liabilities)"): {
 					_("Secured Loans"): {},
 					_("Unsecured Loans"): {},
 					_("Bank Overdraft Account"): {},
 				},
-	        },
-			"root_type": "Liability"
-	    },
+			},
+			"root_type": "Liability",
+		},
 		_("Equity"): {
-	        _("Capital Stock"): {
-	            "account_type": "Equity"
-	        },
-	        _("Dividends Paid"): {
-	            "account_type": "Equity"
-	        },
-	        _("Opening Balance Equity"): {
-	            "account_type": "Equity"
-	        },
-	        _("Retained Earnings"): {
-	            "account_type": "Equity"
-	        },
-			"root_type": "Equity"
-		}
+			_("Capital Stock"): {"account_type": "Equity"},
+			_("Dividends Paid"): {"account_type": "Equity"},
+			_("Opening Balance Equity"): {"account_type": "Equity"},
+			_("Retained Earnings"): {"account_type": "Equity"},
+			"root_type": "Equity",
+		},
 	}
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py
index 31ae171..0e46f1e 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py
@@ -6,288 +6,153 @@
 
 
 def get():
-    return {
-        _("Application of Funds (Assets)"): {
-            _("Current Assets"): {
-                _("Accounts Receivable"): {
-                    _("Debtors"): {
-                        "account_type": "Receivable",
-                        "account_number": "1310"
-                    },
-                    "account_number": "1300"
-                },
-                _("Bank Accounts"): {
-                    "account_type": "Bank",
-                    "is_group": 1,
-                    "account_number": "1200"
-                },
-                _("Cash In Hand"): {
-                    _("Cash"): {
-                        "account_type": "Cash",
-                        "account_number": "1110"
-                    },
-                    "account_type": "Cash",
-                    "account_number": "1100"
-                },
-                _("Loans and Advances (Assets)"): {
-                    _("Employee Advances"): {
-                        "account_number": "1610"
-                    },
-                    "account_number": "1600"
-                },
-                _("Securities and Deposits"): {
-                    _("Earnest Money"): {
-                        "account_number": "1651"
-                    },
-                    "account_number": "1650"
-                },
-                _("Stock Assets"): {
-                    _("Stock In Hand"): {
-                        "account_type": "Stock",
-                        "account_number": "1410"
-                    },
-                    "account_type": "Stock",
-                    "account_number": "1400"
-                },
-                _("Tax Assets"): {
-                    "is_group": 1,
-                    "account_number": "1500"
-                },
-                "account_number": "1100-1600"
-            },
-            _("Fixed Assets"): {
-                _("Capital Equipments"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1710"
-                },
-                _("Electronic Equipments"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1720"
-                },
-                _("Furnitures and Fixtures"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1730"
-                },
-                _("Office Equipments"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1740"
-                },
-                _("Plants and Machineries"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1750"
-                },
-                _("Buildings"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1760"
-                },
-                _("Softwares"): {
-                    "account_type": "Fixed Asset",
-                    "account_number": "1770"
-                },
-                _("Accumulated Depreciation"): {
-                    "account_type": "Accumulated Depreciation",
-                    "account_number": "1780"
-                },
-                _("CWIP Account"): {
-                    "account_type": "Capital Work in Progress",
-                    "account_number": "1790"
-                },
-                "account_number": "1700"
-            },
-            _("Investments"): {
-                "is_group": 1,
-                "account_number": "1800"
-            },
-            _("Temporary Accounts"): {
-                _("Temporary Opening"): {
-                    "account_type": "Temporary",
-                    "account_number": "1910"
-                },
-                "account_number": "1900"
-            },
-            "root_type": "Asset",
-            "account_number": "1000"
-        },
-        _("Expenses"): {
-            _("Direct Expenses"): {
-                _("Stock Expenses"): {
-                    _("Cost of Goods Sold"): {
-                        "account_type": "Cost of Goods Sold",
-                        "account_number": "5111"
-                    },
-                    _("Expenses Included In Asset Valuation"): {
-                        "account_type": "Expenses Included In Asset Valuation",
-                        "account_number": "5112"
-                    },
-                    _("Expenses Included In Valuation"): {
-                        "account_type": "Expenses Included In Valuation",
-                        "account_number": "5118"
-                    },
-                    _("Stock Adjustment"): {
-                        "account_type": "Stock Adjustment",
-                        "account_number": "5119"
-                    },
-                    "account_number": "5110"
-                },
-                "account_number": "5100"
-            },
-            _("Indirect Expenses"): {
-                _("Administrative Expenses"): {
-                    "account_number": "5201"
-                },
-                _("Commission on Sales"): {
-                    "account_number": "5202"
-                },
-                _("Depreciation"): {
-                    "account_type": "Depreciation",
-                    "account_number": "5203"
-                },
-                _("Entertainment Expenses"): {
-                    "account_number": "5204"
-                },
-                _("Freight and Forwarding Charges"): {
-                    "account_type": "Chargeable",
-                    "account_number": "5205"
-                },
-                _("Legal Expenses"): {
-                    "account_number": "5206"
-                },
-                _("Marketing Expenses"): {
-                    "account_type": "Chargeable",
-                    "account_number": "5207"
-                },
-                _("Office Maintenance Expenses"): {
-                    "account_number": "5208"
-                },
-                _("Office Rent"): {
-                    "account_number": "5209"
-                },
-                _("Postal Expenses"): {
-                    "account_number": "5210"
-                },
-                _("Print and Stationery"): {
-                    "account_number": "5211"
-                },
-                _("Round Off"): {
-                    "account_type": "Round Off",
-                    "account_number": "5212"
-                },
-                _("Salary"): {
-                    "account_number": "5213"
-                },
-                _("Sales Expenses"): {
-                    "account_number": "5214"
-                },
-                _("Telephone Expenses"): {
-                    "account_number": "5215"
-                },
-                _("Travel Expenses"): {
-                    "account_number": "5216"
-                },
-                _("Utility Expenses"): {
-                    "account_number": "5217"
-                },
-                _("Write Off"): {
-                    "account_number": "5218"
-                },
-                _("Exchange Gain/Loss"): {
-                    "account_number": "5219"
-                },
-                _("Gain/Loss on Asset Disposal"): {
-                    "account_number": "5220"
-                },
-                _("Miscellaneous Expenses"): {
-                    "account_type": "Chargeable",
-                    "account_number": "5221"
-                },
-                "account_number": "5200"
-            },
-            "root_type": "Expense",
-            "account_number": "5000"
-        },
-        _("Income"): {
-            _("Direct Income"): {
-                _("Sales"): {
-                    "account_number": "4110"
-                },
-                _("Service"): {
-                    "account_number": "4120"
-                },
-                "account_number": "4100"
-            },
-            _("Indirect Income"): {
-                "is_group": 1,
-                "account_number": "4200"
-            },
-            "root_type": "Income",
-            "account_number": "4000"
-        },
-        _("Source of Funds (Liabilities)"): {
-            _("Current Liabilities"): {
-                _("Accounts Payable"): {
-                    _("Creditors"): {
-                        "account_type": "Payable",
-                        "account_number": "2110"
-                    },
-                    _("Payroll Payable"): {
-                        "account_number": "2120"
-                    },
-                    "account_number": "2100"
-                },
-                _("Stock Liabilities"): {
-                    _("Stock Received But Not Billed"): {
-                        "account_type": "Stock Received But Not Billed",
-                        "account_number": "2210"
-                    },
-                    _("Asset Received But Not Billed"): {
-                        "account_type": "Asset Received But Not Billed",
-                        "account_number": "2211"
-                    },
-                    "account_number": "2200"
-                },
-                _("Duties and Taxes"): {
-                    _("TDS Payable"): {
-                        "account_number": "2310"
-                    },
-                    "account_type": "Tax",
-                    "is_group": 1,
-                    "account_number": "2300"
-                },
-                _("Loans (Liabilities)"): {
-                    _("Secured Loans"): {
-                        "account_number": "2410"
-                    },
-                    _("Unsecured Loans"): {
-                        "account_number": "2420"
-                    },
-                    _("Bank Overdraft Account"): {
-                        "account_number": "2430"
-                    },
-                    "account_number": "2400"
-                },
-                "account_number": "2100-2400"
-            },
-            "root_type": "Liability",
-            "account_number": "2000"
-        },
-        _("Equity"): {
-            _("Capital Stock"): {
-                "account_type": "Equity",
-                "account_number": "3100"
-            },
-            _("Dividends Paid"): {
-                "account_type": "Equity",
-                "account_number": "3200"
-            },
-            _("Opening Balance Equity"): {
-                "account_type": "Equity",
-                "account_number": "3300"
-            },
-            _("Retained Earnings"): {
-                "account_type": "Equity",
-                "account_number": "3400"
-            },
-            "root_type": "Equity",
-            "account_number": "3000"
-        }
-    }
+	return {
+		_("Application of Funds (Assets)"): {
+			_("Current Assets"): {
+				_("Accounts Receivable"): {
+					_("Debtors"): {"account_type": "Receivable", "account_number": "1310"},
+					"account_number": "1300",
+				},
+				_("Bank Accounts"): {"account_type": "Bank", "is_group": 1, "account_number": "1200"},
+				_("Cash In Hand"): {
+					_("Cash"): {"account_type": "Cash", "account_number": "1110"},
+					"account_type": "Cash",
+					"account_number": "1100",
+				},
+				_("Loans and Advances (Assets)"): {
+					_("Employee Advances"): {"account_number": "1610"},
+					"account_number": "1600",
+				},
+				_("Securities and Deposits"): {
+					_("Earnest Money"): {"account_number": "1651"},
+					"account_number": "1650",
+				},
+				_("Stock Assets"): {
+					_("Stock In Hand"): {"account_type": "Stock", "account_number": "1410"},
+					"account_type": "Stock",
+					"account_number": "1400",
+				},
+				_("Tax Assets"): {"is_group": 1, "account_number": "1500"},
+				"account_number": "1100-1600",
+			},
+			_("Fixed Assets"): {
+				_("Capital Equipments"): {"account_type": "Fixed Asset", "account_number": "1710"},
+				_("Electronic Equipments"): {"account_type": "Fixed Asset", "account_number": "1720"},
+				_("Furnitures and Fixtures"): {"account_type": "Fixed Asset", "account_number": "1730"},
+				_("Office Equipments"): {"account_type": "Fixed Asset", "account_number": "1740"},
+				_("Plants and Machineries"): {"account_type": "Fixed Asset", "account_number": "1750"},
+				_("Buildings"): {"account_type": "Fixed Asset", "account_number": "1760"},
+				_("Softwares"): {"account_type": "Fixed Asset", "account_number": "1770"},
+				_("Accumulated Depreciation"): {
+					"account_type": "Accumulated Depreciation",
+					"account_number": "1780",
+				},
+				_("CWIP Account"): {"account_type": "Capital Work in Progress", "account_number": "1790"},
+				"account_number": "1700",
+			},
+			_("Investments"): {"is_group": 1, "account_number": "1800"},
+			_("Temporary Accounts"): {
+				_("Temporary Opening"): {"account_type": "Temporary", "account_number": "1910"},
+				"account_number": "1900",
+			},
+			"root_type": "Asset",
+			"account_number": "1000",
+		},
+		_("Expenses"): {
+			_("Direct Expenses"): {
+				_("Stock Expenses"): {
+					_("Cost of Goods Sold"): {"account_type": "Cost of Goods Sold", "account_number": "5111"},
+					_("Expenses Included In Asset Valuation"): {
+						"account_type": "Expenses Included In Asset Valuation",
+						"account_number": "5112",
+					},
+					_("Expenses Included In Valuation"): {
+						"account_type": "Expenses Included In Valuation",
+						"account_number": "5118",
+					},
+					_("Stock Adjustment"): {"account_type": "Stock Adjustment", "account_number": "5119"},
+					"account_number": "5110",
+				},
+				"account_number": "5100",
+			},
+			_("Indirect Expenses"): {
+				_("Administrative Expenses"): {"account_number": "5201"},
+				_("Commission on Sales"): {"account_number": "5202"},
+				_("Depreciation"): {"account_type": "Depreciation", "account_number": "5203"},
+				_("Entertainment Expenses"): {"account_number": "5204"},
+				_("Freight and Forwarding Charges"): {"account_type": "Chargeable", "account_number": "5205"},
+				_("Legal Expenses"): {"account_number": "5206"},
+				_("Marketing Expenses"): {"account_type": "Chargeable", "account_number": "5207"},
+				_("Office Maintenance Expenses"): {"account_number": "5208"},
+				_("Office Rent"): {"account_number": "5209"},
+				_("Postal Expenses"): {"account_number": "5210"},
+				_("Print and Stationery"): {"account_number": "5211"},
+				_("Round Off"): {"account_type": "Round Off", "account_number": "5212"},
+				_("Salary"): {"account_number": "5213"},
+				_("Sales Expenses"): {"account_number": "5214"},
+				_("Telephone Expenses"): {"account_number": "5215"},
+				_("Travel Expenses"): {"account_number": "5216"},
+				_("Utility Expenses"): {"account_number": "5217"},
+				_("Write Off"): {"account_number": "5218"},
+				_("Exchange Gain/Loss"): {"account_number": "5219"},
+				_("Gain/Loss on Asset Disposal"): {"account_number": "5220"},
+				_("Miscellaneous Expenses"): {"account_type": "Chargeable", "account_number": "5221"},
+				"account_number": "5200",
+			},
+			"root_type": "Expense",
+			"account_number": "5000",
+		},
+		_("Income"): {
+			_("Direct Income"): {
+				_("Sales"): {"account_number": "4110"},
+				_("Service"): {"account_number": "4120"},
+				"account_number": "4100",
+			},
+			_("Indirect Income"): {"is_group": 1, "account_number": "4200"},
+			"root_type": "Income",
+			"account_number": "4000",
+		},
+		_("Source of Funds (Liabilities)"): {
+			_("Current Liabilities"): {
+				_("Accounts Payable"): {
+					_("Creditors"): {"account_type": "Payable", "account_number": "2110"},
+					_("Payroll Payable"): {"account_number": "2120"},
+					"account_number": "2100",
+				},
+				_("Stock Liabilities"): {
+					_("Stock Received But Not Billed"): {
+						"account_type": "Stock Received But Not Billed",
+						"account_number": "2210",
+					},
+					_("Asset Received But Not Billed"): {
+						"account_type": "Asset Received But Not Billed",
+						"account_number": "2211",
+					},
+					"account_number": "2200",
+				},
+				_("Duties and Taxes"): {
+					_("TDS Payable"): {"account_number": "2310"},
+					"account_type": "Tax",
+					"is_group": 1,
+					"account_number": "2300",
+				},
+				_("Loans (Liabilities)"): {
+					_("Secured Loans"): {"account_number": "2410"},
+					_("Unsecured Loans"): {"account_number": "2420"},
+					_("Bank Overdraft Account"): {"account_number": "2430"},
+					"account_number": "2400",
+				},
+				"account_number": "2100-2400",
+			},
+			"root_type": "Liability",
+			"account_number": "2000",
+		},
+		_("Equity"): {
+			_("Capital Stock"): {"account_type": "Equity", "account_number": "3100"},
+			_("Dividends Paid"): {"account_type": "Equity", "account_number": "3200"},
+			_("Opening Balance Equity"): {"account_type": "Equity", "account_number": "3300"},
+			_("Retained Earnings"): {"account_type": "Equity", "account_number": "3400"},
+			"root_type": "Equity",
+			"account_number": "3000",
+		},
+	}
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index 0715823..efc063d 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -20,8 +20,9 @@
 			acc.company = "_Test Company"
 			acc.insert()
 
-		account_number, account_name = frappe.db.get_value("Account", "1210 - Debtors - _TC",
-			["account_number", "account_name"])
+		account_number, account_name = frappe.db.get_value(
+			"Account", "1210 - Debtors - _TC", ["account_number", "account_name"]
+		)
 		self.assertEqual(account_number, "1210")
 		self.assertEqual(account_name, "Debtors")
 
@@ -30,8 +31,12 @@
 
 		update_account_number("1210 - Debtors - _TC", new_account_name, new_account_number)
 
-		new_acc = frappe.db.get_value("Account", "1211-11-4 - 6 - - Debtors 1 - Test - - _TC",
-			["account_name", "account_number"], as_dict=1)
+		new_acc = frappe.db.get_value(
+			"Account",
+			"1211-11-4 - 6 - - Debtors 1 - Test - - _TC",
+			["account_name", "account_number"],
+			as_dict=1,
+		)
 
 		self.assertEqual(new_acc.account_name, "Debtors 1 - Test -")
 		self.assertEqual(new_acc.account_number, "1211-11-4 - 6 -")
@@ -79,7 +84,9 @@
 
 		self.assertEqual(parent, "Securities and Deposits - _TC")
 
-		merge_account("Securities and Deposits - _TC", "Cash In Hand - _TC", doc.is_group, doc.root_type, doc.company)
+		merge_account(
+			"Securities and Deposits - _TC", "Cash In Hand - _TC", doc.is_group, doc.root_type, doc.company
+		)
 		parent = frappe.db.get_value("Account", "Earnest Money - _TC", "parent_account")
 
 		# Parent account of the child account changes after merging
@@ -91,14 +98,28 @@
 		doc = frappe.get_doc("Account", "Current Assets - _TC")
 
 		# Raise error as is_group property doesn't match
-		self.assertRaises(frappe.ValidationError, merge_account, "Current Assets - _TC",\
-			"Accumulated Depreciation - _TC", doc.is_group, doc.root_type, doc.company)
+		self.assertRaises(
+			frappe.ValidationError,
+			merge_account,
+			"Current Assets - _TC",
+			"Accumulated Depreciation - _TC",
+			doc.is_group,
+			doc.root_type,
+			doc.company,
+		)
 
 		doc = frappe.get_doc("Account", "Capital Stock - _TC")
 
 		# Raise error as root_type property doesn't match
-		self.assertRaises(frappe.ValidationError, merge_account, "Capital Stock - _TC",\
-			"Softwares - _TC", doc.is_group, doc.root_type, doc.company)
+		self.assertRaises(
+			frappe.ValidationError,
+			merge_account,
+			"Capital Stock - _TC",
+			"Softwares - _TC",
+			doc.is_group,
+			doc.root_type,
+			doc.company,
+		)
 
 	def test_account_sync(self):
 		frappe.local.flags.pop("ignore_root_company_validation", None)
@@ -109,8 +130,12 @@
 		acc.company = "_Test Company 3"
 		acc.insert()
 
-		acc_tc_4 = frappe.db.get_value('Account', {'account_name': "Test Sync Account", "company": "_Test Company 4"})
-		acc_tc_5 = frappe.db.get_value('Account', {'account_name': "Test Sync Account", "company": "_Test Company 5"})
+		acc_tc_4 = frappe.db.get_value(
+			"Account", {"account_name": "Test Sync Account", "company": "_Test Company 4"}
+		)
+		acc_tc_5 = frappe.db.get_value(
+			"Account", {"account_name": "Test Sync Account", "company": "_Test Company 5"}
+		)
 		self.assertEqual(acc_tc_4, "Test Sync Account - _TC4")
 		self.assertEqual(acc_tc_5, "Test Sync Account - _TC5")
 
@@ -138,8 +163,26 @@
 		update_account_number(acc.name, "Test Rename Sync Account", "1234")
 
 		# Check if renamed in children
-		self.assertTrue(frappe.db.exists("Account", {'account_name': "Test Rename Sync Account", "company": "_Test Company 4", "account_number": "1234"}))
-		self.assertTrue(frappe.db.exists("Account", {'account_name': "Test Rename Sync Account", "company": "_Test Company 5", "account_number": "1234"}))
+		self.assertTrue(
+			frappe.db.exists(
+				"Account",
+				{
+					"account_name": "Test Rename Sync Account",
+					"company": "_Test Company 4",
+					"account_number": "1234",
+				},
+			)
+		)
+		self.assertTrue(
+			frappe.db.exists(
+				"Account",
+				{
+					"account_name": "Test Rename Sync Account",
+					"company": "_Test Company 5",
+					"account_number": "1234",
+				},
+			)
+		)
 
 		frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC3")
 		frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC4")
@@ -155,22 +198,46 @@
 		acc.company = "_Test Company 3"
 		acc.insert()
 
-		self.assertTrue(frappe.db.exists("Account", {'account_name': "Test Group Account", "company": "_Test Company 4"}))
-		self.assertTrue(frappe.db.exists("Account", {'account_name': "Test Group Account", "company": "_Test Company 5"}))
+		self.assertTrue(
+			frappe.db.exists(
+				"Account", {"account_name": "Test Group Account", "company": "_Test Company 4"}
+			)
+		)
+		self.assertTrue(
+			frappe.db.exists(
+				"Account", {"account_name": "Test Group Account", "company": "_Test Company 5"}
+			)
+		)
 
 		# Try renaming child company account
-		acc_tc_5 = frappe.db.get_value('Account', {'account_name': "Test Group Account", "company": "_Test Company 5"})
-		self.assertRaises(frappe.ValidationError, update_account_number, acc_tc_5, "Test Modified Account")
+		acc_tc_5 = frappe.db.get_value(
+			"Account", {"account_name": "Test Group Account", "company": "_Test Company 5"}
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_account_number, acc_tc_5, "Test Modified Account"
+		)
 
 		# Rename child company account with allow_account_creation_against_child_company enabled
-		frappe.db.set_value("Company", "_Test Company 5", "allow_account_creation_against_child_company", 1)
+		frappe.db.set_value(
+			"Company", "_Test Company 5", "allow_account_creation_against_child_company", 1
+		)
 
 		update_account_number(acc_tc_5, "Test Modified Account")
-		self.assertTrue(frappe.db.exists("Account", {'name': "Test Modified Account - _TC5", "company": "_Test Company 5"}))
+		self.assertTrue(
+			frappe.db.exists(
+				"Account", {"name": "Test Modified Account - _TC5", "company": "_Test Company 5"}
+			)
+		)
 
-		frappe.db.set_value("Company", "_Test Company 5", "allow_account_creation_against_child_company", 0)
+		frappe.db.set_value(
+			"Company", "_Test Company 5", "allow_account_creation_against_child_company", 0
+		)
 
-		to_delete = ["Test Group Account - _TC3", "Test Group Account - _TC4", "Test Modified Account - _TC5"]
+		to_delete = [
+			"Test Group Account - _TC3",
+			"Test Group Account - _TC4",
+			"Test Modified Account - _TC5",
+		]
 		for doc in to_delete:
 			frappe.delete_doc("Account", doc)
 
@@ -184,20 +251,16 @@
 		["_Test Bank USD", "Bank Accounts", 0, "Bank", "USD"],
 		["_Test Bank EUR", "Bank Accounts", 0, "Bank", "EUR"],
 		["_Test Cash", "Cash In Hand", 0, "Cash", None],
-
 		["_Test Account Stock Expenses", "Direct Expenses", 1, None, None],
 		["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
 		["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax", None],
 		["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
 		["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment", None],
 		["_Test Employee Advance", "Current Liabilities", 0, None, None],
-
 		["_Test Account Tax Assets", "Current Assets", 1, None, None],
 		["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax", None],
 		["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax", None],
-
 		["_Test Account Reserves and Surplus", "Current Liabilities", 0, None, None],
-
 		["_Test Account Cost for Goods Sold", "Expenses", 0, None, None],
 		["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax", None],
 		["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
@@ -206,38 +269,45 @@
 		["_Test Account Discount", "Direct Expenses", 0, None, None],
 		["_Test Write Off", "Indirect Expenses", 0, None, None],
 		["_Test Exchange Gain/Loss", "Indirect Expenses", 0, None, None],
-
 		["_Test Account Sales", "Direct Income", 0, None, None],
-
 		# related to Account Inventory Integration
 		["_Test Account Stock In Hand", "Current Assets", 0, None, None],
-
 		# fixed asset depreciation
 		["_Test Fixed Asset", "Current Assets", 0, "Fixed Asset", None],
 		["_Test Accumulated Depreciations", "Current Assets", 0, "Accumulated Depreciation", None],
 		["_Test Depreciations", "Expenses", 0, None, None],
 		["_Test Gain/Loss on Asset Disposal", "Expenses", 0, None, None],
-
 		# Receivable / Payable Account
 		["_Test Receivable", "Current Assets", 0, "Receivable", None],
 		["_Test Payable", "Current Liabilities", 0, "Payable", None],
 		["_Test Receivable USD", "Current Assets", 0, "Receivable", "USD"],
-		["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"]
+		["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"],
 	]
 
-	for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"], ["_Test Company with perpetual inventory", "TCP1"]]:
-		test_objects = make_test_objects("Account", [{
-				"doctype": "Account",
-				"account_name": account_name,
-				"parent_account": parent_account + " - " + abbr,
-				"company": company,
-				"is_group": is_group,
-				"account_type": account_type,
-				"account_currency": currency
-			} for account_name, parent_account, is_group, account_type, currency in accounts])
+	for company, abbr in [
+		["_Test Company", "_TC"],
+		["_Test Company 1", "_TC1"],
+		["_Test Company with perpetual inventory", "TCP1"],
+	]:
+		test_objects = make_test_objects(
+			"Account",
+			[
+				{
+					"doctype": "Account",
+					"account_name": account_name,
+					"parent_account": parent_account + " - " + abbr,
+					"company": company,
+					"is_group": is_group,
+					"account_type": account_type,
+					"account_currency": currency,
+				}
+				for account_name, parent_account, is_group, account_type, currency in accounts
+			],
+		)
 
 	return test_objects
 
+
 def get_inventory_account(company, warehouse=None):
 	account = None
 	if warehouse:
@@ -247,19 +317,24 @@
 
 	return account
 
+
 def create_account(**kwargs):
-	account = frappe.db.get_value("Account", filters={"account_name": kwargs.get("account_name"), "company": kwargs.get("company")})
+	account = frappe.db.get_value(
+		"Account", filters={"account_name": kwargs.get("account_name"), "company": kwargs.get("company")}
+	)
 	if account:
 		return account
 	else:
-		account = frappe.get_doc(dict(
-			doctype = "Account",
-			account_name = kwargs.get('account_name'),
-			account_type = kwargs.get('account_type'),
-			parent_account = kwargs.get('parent_account'),
-			company = kwargs.get('company'),
-			account_currency = kwargs.get('account_currency')
-		))
+		account = frappe.get_doc(
+			dict(
+				doctype="Account",
+				account_name=kwargs.get("account_name"),
+				account_type=kwargs.get("account_type"),
+				parent_account=kwargs.get("parent_account"),
+				company=kwargs.get("company"),
+				account_currency=kwargs.get("account_currency"),
+			)
+		)
 
 		account.save()
 		return account.name
diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
index b6112e0..897151a 100644
--- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
@@ -17,13 +17,21 @@
 		self.set_fieldname_and_label()
 
 	def validate(self):
-		if self.document_type in core_doctypes_list + ('Accounting Dimension', 'Project',
-				'Cost Center', 'Accounting Dimension Detail', 'Company', 'Account') :
+		if self.document_type in core_doctypes_list + (
+			"Accounting Dimension",
+			"Project",
+			"Cost Center",
+			"Accounting Dimension Detail",
+			"Company",
+			"Account",
+		):
 
 			msg = _("Not allowed to create accounting dimension for {0}").format(self.document_type)
 			frappe.throw(msg)
 
-		exists = frappe.db.get_value("Accounting Dimension", {'document_type': self.document_type}, ['name'])
+		exists = frappe.db.get_value(
+			"Accounting Dimension", {"document_type": self.document_type}, ["name"]
+		)
 
 		if exists and self.is_new():
 			frappe.throw(_("Document Type already used as a dimension"))
@@ -42,13 +50,13 @@
 		if frappe.flags.in_test:
 			make_dimension_in_accounting_doctypes(doc=self)
 		else:
-			frappe.enqueue(make_dimension_in_accounting_doctypes, doc=self, queue='long')
+			frappe.enqueue(make_dimension_in_accounting_doctypes, doc=self, queue="long")
 
 	def on_trash(self):
 		if frappe.flags.in_test:
 			delete_accounting_dimension(doc=self)
 		else:
-			frappe.enqueue(delete_accounting_dimension, doc=self, queue='long')
+			frappe.enqueue(delete_accounting_dimension, doc=self, queue="long")
 
 	def set_fieldname_and_label(self):
 		if not self.label:
@@ -60,6 +68,7 @@
 	def on_update(self):
 		frappe.flags.accounting_dimensions = None
 
+
 def make_dimension_in_accounting_doctypes(doc, doclist=None):
 	if not doclist:
 		doclist = get_doctypes_with_dimensions()
@@ -70,9 +79,9 @@
 	for doctype in doclist:
 
 		if (doc_count + 1) % 2 == 0:
-			insert_after_field = 'dimension_col_break'
+			insert_after_field = "dimension_col_break"
 		else:
-			insert_after_field = 'accounting_dimensions_section'
+			insert_after_field = "accounting_dimensions_section"
 
 		df = {
 			"fieldname": doc.fieldname,
@@ -80,13 +89,13 @@
 			"fieldtype": "Link",
 			"options": doc.document_type,
 			"insert_after": insert_after_field,
-			"owner": "Administrator"
+			"owner": "Administrator",
 		}
 
 		meta = frappe.get_meta(doctype, cached=False)
 		fieldnames = [d.fieldname for d in meta.get("fields")]
 
-		if df['fieldname'] not in fieldnames:
+		if df["fieldname"] not in fieldnames:
 			if doctype == "Budget":
 				add_dimension_to_budget_doctype(df.copy(), doc)
 			else:
@@ -94,14 +103,17 @@
 
 		count += 1
 
-		frappe.publish_progress(count*100/len(doclist), title = _("Creating Dimensions..."))
+		frappe.publish_progress(count * 100 / len(doclist), title=_("Creating Dimensions..."))
 		frappe.clear_cache(doctype=doctype)
 
+
 def add_dimension_to_budget_doctype(df, doc):
-	df.update({
-		"insert_after": "cost_center",
-		"depends_on": "eval:doc.budget_against == '{0}'".format(doc.document_type)
-	})
+	df.update(
+		{
+			"insert_after": "cost_center",
+			"depends_on": "eval:doc.budget_against == '{0}'".format(doc.document_type),
+		}
+	)
 
 	create_custom_field("Budget", df)
 
@@ -112,36 +124,44 @@
 		property_setter_doc.value = property_setter_doc.value + "\n" + doc.document_type
 		property_setter_doc.save()
 
-		frappe.clear_cache(doctype='Budget')
+		frappe.clear_cache(doctype="Budget")
 	else:
-		frappe.get_doc({
-			"doctype": "Property Setter",
-			"doctype_or_field": "DocField",
-			"doc_type": "Budget",
-			"field_name": "budget_against",
-			"property": "options",
-			"property_type": "Text",
-			"value": "\nCost Center\nProject\n" + doc.document_type
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Property Setter",
+				"doctype_or_field": "DocField",
+				"doc_type": "Budget",
+				"field_name": "budget_against",
+				"property": "options",
+				"property_type": "Text",
+				"value": "\nCost Center\nProject\n" + doc.document_type,
+			}
+		).insert(ignore_permissions=True)
 
 
 def delete_accounting_dimension(doc):
 	doclist = get_doctypes_with_dimensions()
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		DELETE FROM `tabCustom Field`
 		WHERE fieldname = %s
-		AND dt IN (%s)""" %			#nosec
-		('%s', ', '.join(['%s']* len(doclist))), tuple([doc.fieldname] + doclist))
+		AND dt IN (%s)"""
+		% ("%s", ", ".join(["%s"] * len(doclist))),  # nosec
+		tuple([doc.fieldname] + doclist),
+	)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		DELETE FROM `tabProperty Setter`
 		WHERE field_name = %s
-		AND doc_type IN (%s)""" %		#nosec
-		('%s', ', '.join(['%s']* len(doclist))), tuple([doc.fieldname] + doclist))
+		AND doc_type IN (%s)"""
+		% ("%s", ", ".join(["%s"] * len(doclist))),  # nosec
+		tuple([doc.fieldname] + doclist),
+	)
 
 	budget_against_property = frappe.get_doc("Property Setter", "Budget-budget_against-options")
-	value_list = budget_against_property.value.split('\n')[3:]
+	value_list = budget_against_property.value.split("\n")[3:]
 
 	if doc.document_type in value_list:
 		value_list.remove(doc.document_type)
@@ -152,6 +172,7 @@
 	for doctype in doclist:
 		frappe.clear_cache(doctype=doctype)
 
+
 @frappe.whitelist()
 def disable_dimension(doc):
 	if frappe.flags.in_test:
@@ -159,10 +180,11 @@
 	else:
 		frappe.enqueue(toggle_disabling, doc=doc)
 
+
 def toggle_disabling(doc):
 	doc = json.loads(doc)
 
-	if doc.get('disabled'):
+	if doc.get("disabled"):
 		df = {"read_only": 1}
 	else:
 		df = {"read_only": 0}
@@ -170,7 +192,7 @@
 	doclist = get_doctypes_with_dimensions()
 
 	for doctype in doclist:
-		field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": doc.get('fieldname')})
+		field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": doc.get("fieldname")})
 		if field:
 			custom_field = frappe.get_doc("Custom Field", field)
 			custom_field.update(df)
@@ -178,26 +200,34 @@
 
 		frappe.clear_cache(doctype=doctype)
 
+
 def get_doctypes_with_dimensions():
 	return frappe.get_hooks("accounting_dimension_doctypes")
 
+
 def get_accounting_dimensions(as_list=True):
 	if frappe.flags.accounting_dimensions is None:
-		frappe.flags.accounting_dimensions = frappe.get_all("Accounting Dimension",
-			fields=["label", "fieldname", "disabled", "document_type"])
+		frappe.flags.accounting_dimensions = frappe.get_all(
+			"Accounting Dimension", fields=["label", "fieldname", "disabled", "document_type"]
+		)
 
 	if as_list:
 		return [d.fieldname for d in frappe.flags.accounting_dimensions]
 	else:
 		return frappe.flags.accounting_dimensions
 
+
 def get_checks_for_pl_and_bs_accounts():
-	dimensions = frappe.db.sql("""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
+	dimensions = frappe.db.sql(
+		"""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
 		FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c
-		WHERE p.name = c.parent""", as_dict=1)
+		WHERE p.name = c.parent""",
+		as_dict=1,
+	)
 
 	return dimensions
 
+
 def get_dimension_with_children(doctype, dimension):
 
 	if isinstance(dimension, list):
@@ -205,34 +235,39 @@
 
 	all_dimensions = []
 	lft, rgt = frappe.db.get_value(doctype, dimension, ["lft", "rgt"])
-	children = frappe.get_all(doctype, filters={"lft": [">=", lft], "rgt": ["<=", rgt]}, order_by="lft")
+	children = frappe.get_all(
+		doctype, filters={"lft": [">=", lft], "rgt": ["<=", rgt]}, order_by="lft"
+	)
 	all_dimensions += [c.name for c in children]
 
 	return all_dimensions
 
+
 @frappe.whitelist()
 def get_dimensions(with_cost_center_and_project=False):
-	dimension_filters = frappe.db.sql("""
+	dimension_filters = frappe.db.sql(
+		"""
 		SELECT label, fieldname, document_type
 		FROM `tabAccounting Dimension`
 		WHERE disabled = 0
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
-	default_dimensions = frappe.db.sql("""SELECT p.fieldname, c.company, c.default_dimension
+	default_dimensions = frappe.db.sql(
+		"""SELECT p.fieldname, c.company, c.default_dimension
 		FROM `tabAccounting Dimension Detail` c, `tabAccounting Dimension` p
-		WHERE c.parent = p.name""", as_dict=1)
+		WHERE c.parent = p.name""",
+		as_dict=1,
+	)
 
 	if with_cost_center_and_project:
-		dimension_filters.extend([
-			{
-				'fieldname': 'cost_center',
-				'document_type': 'Cost Center'
-			},
-			{
-				'fieldname': 'project',
-				'document_type': 'Project'
-			}
-		])
+		dimension_filters.extend(
+			[
+				{"fieldname": "cost_center", "document_type": "Cost Center"},
+				{"fieldname": "project", "document_type": "Project"},
+			]
+		)
 
 	default_dimensions_map = {}
 	for dimension in default_dimensions:
diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
index f781a22..25ef2ea 100644
--- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
+++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
@@ -8,7 +8,8 @@
 from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
 from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 
-test_dependencies = ['Cost Center', 'Location', 'Warehouse', 'Department']
+test_dependencies = ["Cost Center", "Location", "Warehouse", "Department"]
+
 
 class TestAccountingDimension(unittest.TestCase):
 	def setUp(self):
@@ -18,24 +19,27 @@
 		si = create_sales_invoice(do_not_save=1)
 
 		si.location = "Block 1"
-		si.append("items", {
-			"item_code": "_Test Item",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 1,
-			"rate": 100,
-			"income_account": "Sales - _TC",
-			"expense_account": "Cost of Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"department": "_Test Department - _TC",
-			"location": "Block 1"
-		})
+		si.append(
+			"items",
+			{
+				"item_code": "_Test Item",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 1,
+				"rate": 100,
+				"income_account": "Sales - _TC",
+				"expense_account": "Cost of Goods Sold - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"department": "_Test Department - _TC",
+				"location": "Block 1",
+			},
+		)
 
 		si.save()
 		si.submit()
 
 		gle = frappe.get_doc("GL Entry", {"voucher_no": si.name, "account": "Sales - _TC"})
 
-		self.assertEqual(gle.get('department'), "_Test Department - _TC")
+		self.assertEqual(gle.get("department"), "_Test Department - _TC")
 
 	def test_dimension_against_journal_entry(self):
 		je = make_journal_entry("Sales - _TC", "Sales Expenses - _TC", 500, save=False)
@@ -50,21 +54,24 @@
 
 		gle = frappe.get_doc("GL Entry", {"voucher_no": je.name, "account": "Sales - _TC"})
 		gle1 = frappe.get_doc("GL Entry", {"voucher_no": je.name, "account": "Sales Expenses - _TC"})
-		self.assertEqual(gle.get('department'), "_Test Department - _TC")
-		self.assertEqual(gle1.get('department'), "_Test Department - _TC")
+		self.assertEqual(gle.get("department"), "_Test Department - _TC")
+		self.assertEqual(gle1.get("department"), "_Test Department - _TC")
 
 	def test_mandatory(self):
 		si = create_sales_invoice(do_not_save=1)
-		si.append("items", {
-			"item_code": "_Test Item",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 1,
-			"rate": 100,
-			"income_account": "Sales - _TC",
-			"expense_account": "Cost of Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"location": ""
-		})
+		si.append(
+			"items",
+			{
+				"item_code": "_Test Item",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 1,
+				"rate": 100,
+				"income_account": "Sales - _TC",
+				"expense_account": "Cost of Goods Sold - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"location": "",
+			},
+		)
 
 		si.save()
 		self.assertRaises(frappe.ValidationError, si.submit)
@@ -72,31 +79,39 @@
 	def tearDown(self):
 		disable_dimension()
 
+
 def create_dimension():
 	frappe.set_user("Administrator")
 
 	if not frappe.db.exists("Accounting Dimension", {"document_type": "Department"}):
-		frappe.get_doc({
-			"doctype": "Accounting Dimension",
-			"document_type": "Department",
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Accounting Dimension",
+				"document_type": "Department",
+			}
+		).insert()
 	else:
 		dimension = frappe.get_doc("Accounting Dimension", "Department")
 		dimension.disabled = 0
 		dimension.save()
 
 	if not frappe.db.exists("Accounting Dimension", {"document_type": "Location"}):
-		dimension1 = frappe.get_doc({
-			"doctype": "Accounting Dimension",
-			"document_type": "Location",
-		})
+		dimension1 = frappe.get_doc(
+			{
+				"doctype": "Accounting Dimension",
+				"document_type": "Location",
+			}
+		)
 
-		dimension1.append("dimension_defaults", {
-			"company": "_Test Company",
-			"reference_document": "Location",
-			"default_dimension": "Block 1",
-			"mandatory_for_bs": 1
-		})
+		dimension1.append(
+			"dimension_defaults",
+			{
+				"company": "_Test Company",
+				"reference_document": "Location",
+				"default_dimension": "Block 1",
+				"mandatory_for_bs": 1,
+			},
+		)
 
 		dimension1.insert()
 		dimension1.save()
@@ -105,6 +120,7 @@
 		dimension1.disabled = 0
 		dimension1.save()
 
+
 def disable_dimension():
 	dimension1 = frappe.get_doc("Accounting Dimension", "Department")
 	dimension1.disabled = 1
diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py
index 7d32bad..80f736f 100644
--- a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py
+++ b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py
@@ -19,17 +19,27 @@
 				WHERE d.name = a.parent
 				and d.name != %s
 				and d.accounting_dimension = %s
-			""", (self.name, self.accounting_dimension), as_dict=1)
+			""",
+			(self.name, self.accounting_dimension),
+			as_dict=1,
+		)
 
 		account_list = [d.account for d in accounts]
 
-		for account in self.get('accounts'):
+		for account in self.get("accounts"):
 			if account.applicable_on_account in account_list:
-				frappe.throw(_("Row {0}: {1} account already applied for Accounting Dimension {2}").format(
-					account.idx, frappe.bold(account.applicable_on_account), frappe.bold(self.accounting_dimension)))
+				frappe.throw(
+					_("Row {0}: {1} account already applied for Accounting Dimension {2}").format(
+						account.idx,
+						frappe.bold(account.applicable_on_account),
+						frappe.bold(self.accounting_dimension),
+					)
+				)
+
 
 def get_dimension_filter_map():
-	filters = frappe.db.sql("""
+	filters = frappe.db.sql(
+		"""
 		SELECT
 			a.applicable_on_account, d.dimension_value, p.accounting_dimension,
 			p.allow_or_restrict, a.is_mandatory
@@ -40,22 +50,30 @@
 			p.name = a.parent
 			AND p.disabled = 0
 			AND p.name = d.parent
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
 	dimension_filter_map = {}
 
 	for f in filters:
 		f.fieldname = scrub(f.accounting_dimension)
 
-		build_map(dimension_filter_map, f.fieldname, f.applicable_on_account, f.dimension_value,
-			f.allow_or_restrict, f.is_mandatory)
+		build_map(
+			dimension_filter_map,
+			f.fieldname,
+			f.applicable_on_account,
+			f.dimension_value,
+			f.allow_or_restrict,
+			f.is_mandatory,
+		)
 
 	return dimension_filter_map
 
+
 def build_map(map_object, dimension, account, filter_value, allow_or_restrict, is_mandatory):
-	map_object.setdefault((dimension, account), {
-		'allowed_dimensions': [],
-		'is_mandatory': is_mandatory,
-		'allow_or_restrict': allow_or_restrict
-	})
-	map_object[(dimension, account)]['allowed_dimensions'].append(filter_value)
+	map_object.setdefault(
+		(dimension, account),
+		{"allowed_dimensions": [], "is_mandatory": is_mandatory, "allow_or_restrict": allow_or_restrict},
+	)
+	map_object[(dimension, account)]["allowed_dimensions"].append(filter_value)
diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
index e2f85ba..f13f2f9 100644
--- a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
+++ b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
@@ -12,7 +12,8 @@
 from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 from erpnext.exceptions import InvalidAccountDimensionError, MandatoryAccountDimensionError
 
-test_dependencies = ['Location', 'Cost Center', 'Department']
+test_dependencies = ["Location", "Cost Center", "Department"]
+
 
 class TestAccountingDimensionFilter(unittest.TestCase):
 	def setUp(self):
@@ -22,9 +23,9 @@
 
 	def test_allowed_dimension_validation(self):
 		si = create_sales_invoice(do_not_save=1)
-		si.items[0].cost_center = 'Main - _TC'
-		si.department = 'Accounts - _TC'
-		si.location = 'Block 1'
+		si.items[0].cost_center = "Main - _TC"
+		si.department = "Accounts - _TC"
+		si.location = "Block 1"
 		si.save()
 
 		self.assertRaises(InvalidAccountDimensionError, si.submit)
@@ -32,12 +33,12 @@
 
 	def test_mandatory_dimension_validation(self):
 		si = create_sales_invoice(do_not_save=1)
-		si.department = ''
-		si.location = 'Block 1'
+		si.department = ""
+		si.location = "Block 1"
 
 		# Test with no department for Sales Account
-		si.items[0].department = ''
-		si.items[0].cost_center = '_Test Cost Center 2 - _TC'
+		si.items[0].department = ""
+		si.items[0].cost_center = "_Test Cost Center 2 - _TC"
 		si.save()
 
 		self.assertRaises(MandatoryAccountDimensionError, si.submit)
@@ -52,53 +53,54 @@
 			if si.docstatus == 1:
 				si.cancel()
 
+
 def create_accounting_dimension_filter():
-	if not frappe.db.get_value('Accounting Dimension Filter',
-		{'accounting_dimension': 'Cost Center'}):
-		frappe.get_doc({
-			'doctype': 'Accounting Dimension Filter',
-			'accounting_dimension': 'Cost Center',
-			'allow_or_restrict': 'Allow',
-			'company': '_Test Company',
-			'accounts': [{
-				'applicable_on_account': 'Sales - _TC',
-			}],
-			'dimensions': [{
-				'accounting_dimension': 'Cost Center',
-				'dimension_value': '_Test Cost Center 2 - _TC'
-			}]
-		}).insert()
+	if not frappe.db.get_value(
+		"Accounting Dimension Filter", {"accounting_dimension": "Cost Center"}
+	):
+		frappe.get_doc(
+			{
+				"doctype": "Accounting Dimension Filter",
+				"accounting_dimension": "Cost Center",
+				"allow_or_restrict": "Allow",
+				"company": "_Test Company",
+				"accounts": [
+					{
+						"applicable_on_account": "Sales - _TC",
+					}
+				],
+				"dimensions": [
+					{"accounting_dimension": "Cost Center", "dimension_value": "_Test Cost Center 2 - _TC"}
+				],
+			}
+		).insert()
 	else:
-		doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Cost Center'})
+		doc = frappe.get_doc("Accounting Dimension Filter", {"accounting_dimension": "Cost Center"})
 		doc.disabled = 0
 		doc.save()
 
-	if not frappe.db.get_value('Accounting Dimension Filter',
-		{'accounting_dimension': 'Department'}):
-		frappe.get_doc({
-			'doctype': 'Accounting Dimension Filter',
-			'accounting_dimension': 'Department',
-			'allow_or_restrict': 'Allow',
-			'company': '_Test Company',
-			'accounts': [{
-				'applicable_on_account': 'Sales - _TC',
-				'is_mandatory': 1
-			}],
-			'dimensions': [{
-				'accounting_dimension': 'Department',
-				'dimension_value': 'Accounts - _TC'
-			}]
-		}).insert()
+	if not frappe.db.get_value("Accounting Dimension Filter", {"accounting_dimension": "Department"}):
+		frappe.get_doc(
+			{
+				"doctype": "Accounting Dimension Filter",
+				"accounting_dimension": "Department",
+				"allow_or_restrict": "Allow",
+				"company": "_Test Company",
+				"accounts": [{"applicable_on_account": "Sales - _TC", "is_mandatory": 1}],
+				"dimensions": [{"accounting_dimension": "Department", "dimension_value": "Accounts - _TC"}],
+			}
+		).insert()
 	else:
-		doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Department'})
+		doc = frappe.get_doc("Accounting Dimension Filter", {"accounting_dimension": "Department"})
 		doc.disabled = 0
 		doc.save()
 
+
 def disable_dimension_filter():
-	doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Cost Center'})
+	doc = frappe.get_doc("Accounting Dimension Filter", {"accounting_dimension": "Cost Center"})
 	doc.disabled = 1
 	doc.save()
 
-	doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Department'})
+	doc = frappe.get_doc("Accounting Dimension Filter", {"accounting_dimension": "Department"})
 	doc.disabled = 1
 	doc.save()
diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py
index e294937..0c15d6a 100644
--- a/erpnext/accounts/doctype/accounting_period/accounting_period.py
+++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py
@@ -7,7 +7,9 @@
 from frappe.model.document import Document
 
 
-class OverlapError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
+
 
 class AccountingPeriod(Document):
 	def validate(self):
@@ -17,11 +19,12 @@
 		self.bootstrap_doctypes_for_closing()
 
 	def autoname(self):
-		company_abbr = frappe.get_cached_value('Company',  self.company,  "abbr")
+		company_abbr = frappe.get_cached_value("Company", self.company, "abbr")
 		self.name = " - ".join([self.period_name, company_abbr])
 
 	def validate_overlap(self):
-		existing_accounting_period = frappe.db.sql("""select name from `tabAccounting Period`
+		existing_accounting_period = frappe.db.sql(
+			"""select name from `tabAccounting Period`
 			where (
 				(%(start_date)s between start_date and end_date)
 				or (%(end_date)s between start_date and end_date)
@@ -32,18 +35,29 @@
 				"start_date": self.start_date,
 				"end_date": self.end_date,
 				"name": self.name,
-				"company": self.company
-			}, as_dict=True)
+				"company": self.company,
+			},
+			as_dict=True,
+		)
 
 		if len(existing_accounting_period) > 0:
-			frappe.throw(_("Accounting Period overlaps with {0}")
-				.format(existing_accounting_period[0].get("name")), OverlapError)
+			frappe.throw(
+				_("Accounting Period overlaps with {0}").format(existing_accounting_period[0].get("name")),
+				OverlapError,
+			)
 
 	@frappe.whitelist()
 	def get_doctypes_for_closing(self):
 		docs_for_closing = []
-		doctypes = ["Sales Invoice", "Purchase Invoice", "Journal Entry", "Payroll Entry", \
-			"Bank Clearance", "Asset", "Stock Entry"]
+		doctypes = [
+			"Sales Invoice",
+			"Purchase Invoice",
+			"Journal Entry",
+			"Payroll Entry",
+			"Bank Clearance",
+			"Asset",
+			"Stock Entry",
+		]
 		closed_doctypes = [{"document_type": doctype, "closed": 1} for doctype in doctypes]
 		for closed_doctype in closed_doctypes:
 			docs_for_closing.append(closed_doctype)
@@ -53,7 +67,7 @@
 	def bootstrap_doctypes_for_closing(self):
 		if len(self.closed_documents) == 0:
 			for doctype_for_closing in self.get_doctypes_for_closing():
-				self.append('closed_documents', {
-					"document_type": doctype_for_closing.document_type,
-					"closed": doctype_for_closing.closed
-				})
+				self.append(
+					"closed_documents",
+					{"document_type": doctype_for_closing.document_type, "closed": doctype_for_closing.closed},
+				)
diff --git a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py
index c06c2e0..85025d1 100644
--- a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py
+++ b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py
@@ -10,29 +10,38 @@
 from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 from erpnext.accounts.general_ledger import ClosedAccountingPeriod
 
-test_dependencies = ['Item']
+test_dependencies = ["Item"]
+
 
 class TestAccountingPeriod(unittest.TestCase):
 	def test_overlap(self):
-		ap1 = create_accounting_period(start_date = "2018-04-01",
-			end_date = "2018-06-30", company = "Wind Power LLC")
+		ap1 = create_accounting_period(
+			start_date="2018-04-01", end_date="2018-06-30", company="Wind Power LLC"
+		)
 		ap1.save()
 
-		ap2 = create_accounting_period(start_date = "2018-06-30",
-			end_date = "2018-07-10", company = "Wind Power LLC", period_name = "Test Accounting Period 1")
+		ap2 = create_accounting_period(
+			start_date="2018-06-30",
+			end_date="2018-07-10",
+			company="Wind Power LLC",
+			period_name="Test Accounting Period 1",
+		)
 		self.assertRaises(OverlapError, ap2.save)
 
 	def test_accounting_period(self):
-		ap1 = create_accounting_period(period_name = "Test Accounting Period 2")
+		ap1 = create_accounting_period(period_name="Test Accounting Period 2")
 		ap1.save()
 
-		doc = create_sales_invoice(do_not_submit=1, cost_center="_Test Company - _TC", warehouse="Stores - _TC")
+		doc = create_sales_invoice(
+			do_not_submit=1, cost_center="_Test Company - _TC", warehouse="Stores - _TC"
+		)
 		self.assertRaises(ClosedAccountingPeriod, doc.submit)
 
 	def tearDown(self):
 		for d in frappe.get_all("Accounting Period"):
 			frappe.delete_doc("Accounting Period", d.name)
 
+
 def create_accounting_period(**args):
 	args = frappe._dict(args)
 
@@ -41,8 +50,6 @@
 	accounting_period.end_date = args.end_date or add_months(nowdate(), 1)
 	accounting_period.company = args.company or "_Test Company"
 	accounting_period.period_name = args.period_name or "_Test_Period_Name_1"
-	accounting_period.append("closed_documents", {
-		"document_type": 'Sales Invoice', "closed": 1
-	})
+	accounting_period.append("closed_documents", {"document_type": "Sales Invoice", "closed": 1})
 
 	return accounting_period
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
index 4839207..8354981 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
@@ -18,11 +18,13 @@
 		frappe.clear_cache()
 
 	def validate(self):
-		frappe.db.set_default("add_taxes_from_item_tax_template",
-			self.get("add_taxes_from_item_tax_template", 0))
+		frappe.db.set_default(
+			"add_taxes_from_item_tax_template", self.get("add_taxes_from_item_tax_template", 0)
+		)
 
-		frappe.db.set_default("enable_common_party_accounting",
-			self.get("enable_common_party_accounting", 0))
+		frappe.db.set_default(
+			"enable_common_party_accounting", self.get("enable_common_party_accounting", 0)
+		)
 
 		self.validate_stale_days()
 		self.enable_payment_schedule_in_print()
@@ -32,34 +34,91 @@
 	def validate_stale_days(self):
 		if not self.allow_stale and cint(self.stale_days) <= 0:
 			frappe.msgprint(
-				_("Stale Days should start from 1."), title='Error', indicator='red',
-				raise_exception=1)
+				_("Stale Days should start from 1."), title="Error", indicator="red", raise_exception=1
+			)
 
 	def enable_payment_schedule_in_print(self):
 		show_in_print = cint(self.show_payment_schedule_in_print)
 		for doctype in ("Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"):
-			make_property_setter(doctype, "due_date", "print_hide", show_in_print, "Check", validate_fields_for_doctype=False)
-			make_property_setter(doctype, "payment_schedule", "print_hide",  0 if show_in_print else 1, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype, "due_date", "print_hide", show_in_print, "Check", validate_fields_for_doctype=False
+			)
+			make_property_setter(
+				doctype,
+				"payment_schedule",
+				"print_hide",
+				0 if show_in_print else 1,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
 
 	def toggle_discount_accounting_fields(self):
 		enable_discount_accounting = cint(self.enable_discount_accounting)
 
 		for doctype in ["Sales Invoice Item", "Purchase Invoice Item"]:
-			make_property_setter(doctype, "discount_account", "hidden", not(enable_discount_accounting), "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype,
+				"discount_account",
+				"hidden",
+				not (enable_discount_accounting),
+				"Check",
+				validate_fields_for_doctype=False,
+			)
 			if enable_discount_accounting:
-				make_property_setter(doctype, "discount_account", "mandatory_depends_on", "eval: doc.discount_amount", "Code", validate_fields_for_doctype=False)
+				make_property_setter(
+					doctype,
+					"discount_account",
+					"mandatory_depends_on",
+					"eval: doc.discount_amount",
+					"Code",
+					validate_fields_for_doctype=False,
+				)
 			else:
-				make_property_setter(doctype, "discount_account", "mandatory_depends_on", "", "Code", validate_fields_for_doctype=False)
+				make_property_setter(
+					doctype,
+					"discount_account",
+					"mandatory_depends_on",
+					"",
+					"Code",
+					validate_fields_for_doctype=False,
+				)
 
 		for doctype in ["Sales Invoice", "Purchase Invoice"]:
-			make_property_setter(doctype, "additional_discount_account", "hidden", not(enable_discount_accounting), "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype,
+				"additional_discount_account",
+				"hidden",
+				not (enable_discount_accounting),
+				"Check",
+				validate_fields_for_doctype=False,
+			)
 			if enable_discount_accounting:
-				make_property_setter(doctype, "additional_discount_account", "mandatory_depends_on", "eval: doc.discount_amount", "Code", validate_fields_for_doctype=False)
+				make_property_setter(
+					doctype,
+					"additional_discount_account",
+					"mandatory_depends_on",
+					"eval: doc.discount_amount",
+					"Code",
+					validate_fields_for_doctype=False,
+				)
 			else:
-				make_property_setter(doctype, "additional_discount_account", "mandatory_depends_on", "", "Code", validate_fields_for_doctype=False)
+				make_property_setter(
+					doctype,
+					"additional_discount_account",
+					"mandatory_depends_on",
+					"",
+					"Code",
+					validate_fields_for_doctype=False,
+				)
 
-		make_property_setter("Item", "default_discount_account", "hidden", not(enable_discount_accounting), "Check", validate_fields_for_doctype=False)
-
+		make_property_setter(
+			"Item",
+			"default_discount_account",
+			"hidden",
+			not (enable_discount_accounting),
+			"Check",
+			validate_fields_for_doctype=False,
+		)
 
 	def validate_pending_reposts(self):
 		if self.acc_frozen_upto:
diff --git a/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py
index bf1e967..a350cc3 100644
--- a/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py
+++ b/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py
@@ -7,12 +7,12 @@
 	def tearDown(self):
 		# Just in case `save` method succeeds, we need to take things back to default so that other tests
 		# don't break
-		cur_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
+		cur_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
 		cur_settings.allow_stale = 1
 		cur_settings.save()
 
 	def test_stale_days(self):
-		cur_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
+		cur_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
 		cur_settings.allow_stale = 0
 		cur_settings.stale_days = 0
 
diff --git a/erpnext/accounts/doctype/bank/bank.py b/erpnext/accounts/doctype/bank/bank.py
index f111433..d44be9a 100644
--- a/erpnext/accounts/doctype/bank/bank.py
+++ b/erpnext/accounts/doctype/bank/bank.py
@@ -15,4 +15,4 @@
 		load_address_and_contact(self)
 
 	def on_trash(self):
-		delete_contact_and_address('Bank', self.name)
+		delete_contact_and_address("Bank", self.name)
diff --git a/erpnext/accounts/doctype/bank/bank_dashboard.py b/erpnext/accounts/doctype/bank/bank_dashboard.py
index 36482aa..7e40a1a 100644
--- a/erpnext/accounts/doctype/bank/bank_dashboard.py
+++ b/erpnext/accounts/doctype/bank/bank_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'bank',
-		'transactions': [
-			{
-				'label': _('Bank Details'),
-				'items': ['Bank Account', 'Bank Guarantee']
-			}
-		]
+		"fieldname": "bank",
+		"transactions": [{"label": _("Bank Details"), "items": ["Bank Account", "Bank Guarantee"]}],
 	}
diff --git a/erpnext/accounts/doctype/bank_account/bank_account.py b/erpnext/accounts/doctype/bank_account/bank_account.py
index f9140c3..addcf62 100644
--- a/erpnext/accounts/doctype/bank_account/bank_account.py
+++ b/erpnext/accounts/doctype/bank_account/bank_account.py
@@ -20,7 +20,7 @@
 		self.name = self.account_name + " - " + self.bank
 
 	def on_trash(self):
-		delete_contact_and_address('BankAccount', self.name)
+		delete_contact_and_address("BankAccount", self.name)
 
 	def validate(self):
 		self.validate_company()
@@ -31,9 +31,9 @@
 			frappe.throw(_("Company is manadatory for company account"))
 
 	def validate_iban(self):
-		'''
+		"""
 		Algorithm: https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN
-		'''
+		"""
 		# IBAN field is optional
 		if not self.iban:
 			return
@@ -43,7 +43,7 @@
 			return str(9 + ord(c) - 64)
 
 		# remove whitespaces, upper case to get the right number from ord()
-		iban = ''.join(self.iban.split(' ')).upper()
+		iban = "".join(self.iban.split(" ")).upper()
 
 		# Move country code and checksum from the start to the end
 		flipped = iban[4:] + iban[:4]
@@ -52,12 +52,12 @@
 		encoded = [encode_char(c) if ord(c) >= 65 and ord(c) <= 90 else c for c in flipped]
 
 		try:
-			to_check = int(''.join(encoded))
+			to_check = int("".join(encoded))
 		except ValueError:
-			frappe.throw(_('IBAN is not valid'))
+			frappe.throw(_("IBAN is not valid"))
 
 		if to_check % 97 != 1:
-			frappe.throw(_('IBAN is not valid'))
+			frappe.throw(_("IBAN is not valid"))
 
 
 @frappe.whitelist()
@@ -69,12 +69,14 @@
 
 	return doc
 
+
 @frappe.whitelist()
 def get_party_bank_account(party_type, party):
-	return frappe.db.get_value(party_type,
-		party, 'default_bank_account')
+	return frappe.db.get_value(party_type, party, "default_bank_account")
+
 
 @frappe.whitelist()
 def get_bank_account_details(bank_account):
-	return frappe.db.get_value("Bank Account",
-		bank_account, ['account', 'bank', 'bank_account_no'], as_dict=1)
+	return frappe.db.get_value(
+		"Bank Account", bank_account, ["account", "bank", "bank_account_no"], as_dict=1
+	)
diff --git a/erpnext/accounts/doctype/bank_account/bank_account_dashboard.py b/erpnext/accounts/doctype/bank_account/bank_account_dashboard.py
index db4d7e5..8bf8d8a 100644
--- a/erpnext/accounts/doctype/bank_account/bank_account_dashboard.py
+++ b/erpnext/accounts/doctype/bank_account/bank_account_dashboard.py
@@ -3,25 +3,18 @@
 
 def get_data():
 	return {
-		'fieldname': 'bank_account',
-		'non_standard_fieldnames': {
-			'Customer': 'default_bank_account',
-			'Supplier': 'default_bank_account',
+		"fieldname": "bank_account",
+		"non_standard_fieldnames": {
+			"Customer": "default_bank_account",
+			"Supplier": "default_bank_account",
 		},
-		'transactions': [
+		"transactions": [
 			{
-				'label': _('Payments'),
-				'items': ['Payment Entry', 'Payment Request', 'Payment Order', 'Payroll Entry']
+				"label": _("Payments"),
+				"items": ["Payment Entry", "Payment Request", "Payment Order", "Payroll Entry"],
 			},
-			{
-				'label': _('Party'),
-				'items': ['Customer', 'Supplier']
-			},
-			{
-				'items': ['Bank Guarantee']
-			},
-			{
-				'items': ['Journal Entry']
-			}
-		]
+			{"label": _("Party"), "items": ["Customer", "Supplier"]},
+			{"items": ["Bank Guarantee"]},
+			{"items": ["Journal Entry"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/bank_account/test_bank_account.py b/erpnext/accounts/doctype/bank_account/test_bank_account.py
index 5f23f88..8949524 100644
--- a/erpnext/accounts/doctype/bank_account/test_bank_account.py
+++ b/erpnext/accounts/doctype/bank_account/test_bank_account.py
@@ -8,28 +8,28 @@
 
 # test_records = frappe.get_test_records('Bank Account')
 
-class TestBankAccount(unittest.TestCase):
 
+class TestBankAccount(unittest.TestCase):
 	def test_validate_iban(self):
 		valid_ibans = [
-			'GB82 WEST 1234 5698 7654 32',
-			'DE91 1000 0000 0123 4567 89',
-			'FR76 3000 6000 0112 3456 7890 189'
+			"GB82 WEST 1234 5698 7654 32",
+			"DE91 1000 0000 0123 4567 89",
+			"FR76 3000 6000 0112 3456 7890 189",
 		]
 
 		invalid_ibans = [
 			# wrong checksum (3rd place)
-			'GB72 WEST 1234 5698 7654 32',
-			'DE81 1000 0000 0123 4567 89',
-			'FR66 3000 6000 0112 3456 7890 189'
+			"GB72 WEST 1234 5698 7654 32",
+			"DE81 1000 0000 0123 4567 89",
+			"FR66 3000 6000 0112 3456 7890 189",
 		]
 
-		bank_account = frappe.get_doc({'doctype':'Bank Account'})
+		bank_account = frappe.get_doc({"doctype": "Bank Account"})
 
 		try:
 			bank_account.validate_iban()
 		except AttributeError:
-			msg = 'BankAccount.validate_iban() failed for empty IBAN'
+			msg = "BankAccount.validate_iban() failed for empty IBAN"
 			self.fail(msg=msg)
 
 		for iban in valid_ibans:
@@ -37,11 +37,11 @@
 			try:
 				bank_account.validate_iban()
 			except ValidationError:
-				msg = 'BankAccount.validate_iban() failed for valid IBAN {}'.format(iban)
+				msg = "BankAccount.validate_iban() failed for valid IBAN {}".format(iban)
 				self.fail(msg=msg)
 
 		for not_iban in invalid_ibans:
 			bank_account.iban = not_iban
-			msg = 'BankAccount.validate_iban() accepted invalid IBAN {}'.format(not_iban)
+			msg = "BankAccount.validate_iban() accepted invalid IBAN {}".format(not_iban)
 			with self.assertRaises(ValidationError, msg=msg):
 				bank_account.validate_iban()
diff --git a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
index a3bbb22..96779d7 100644
--- a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
+++ b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
@@ -7,9 +7,8 @@
 from frappe.model.document import Document
 from frappe.utils import flt, fmt_money, getdate, nowdate
 
-form_grid_templates = {
-	"journal_entries": "templates/form_grid/bank_reconciliation_grid.html"
-}
+form_grid_templates = {"journal_entries": "templates/form_grid/bank_reconciliation_grid.html"}
+
 
 class BankClearance(Document):
 	@frappe.whitelist()
@@ -24,7 +23,8 @@
 		if not self.include_reconciled_entries:
 			condition = "and (clearance_date IS NULL or clearance_date='0000-00-00')"
 
-		journal_entries = frappe.db.sql("""
+		journal_entries = frappe.db.sql(
+			"""
 			select
 				"Journal Entry" as payment_document, t1.name as payment_entry,
 				t1.cheque_no as cheque_number, t1.cheque_date,
@@ -38,12 +38,18 @@
 				and ifnull(t1.is_opening, 'No') = 'No' {condition}
 			group by t2.account, t1.name
 			order by t1.posting_date ASC, t1.name DESC
-		""".format(condition=condition), {"account": self.account, "from": self.from_date, "to": self.to_date}, as_dict=1)
+		""".format(
+				condition=condition
+			),
+			{"account": self.account, "from": self.from_date, "to": self.to_date},
+			as_dict=1,
+		)
 
 		if self.bank_account:
-			condition += 'and bank_account = %(bank_account)s'
+			condition += "and bank_account = %(bank_account)s"
 
-		payment_entries = frappe.db.sql("""
+		payment_entries = frappe.db.sql(
+			"""
 			select
 				"Payment Entry" as payment_document, name as payment_entry,
 				reference_no as cheque_number, reference_date as cheque_date,
@@ -58,12 +64,22 @@
 				{condition}
 			order by
 				posting_date ASC, name DESC
-		""".format(condition=condition), {"account": self.account, "from":self.from_date,
-				"to": self.to_date, "bank_account": self.bank_account}, as_dict=1)
+		""".format(
+				condition=condition
+			),
+			{
+				"account": self.account,
+				"from": self.from_date,
+				"to": self.to_date,
+				"bank_account": self.bank_account,
+			},
+			as_dict=1,
+		)
 
 		pos_sales_invoices, pos_purchase_invoices = [], []
 		if self.include_pos_transactions:
-			pos_sales_invoices = frappe.db.sql("""
+			pos_sales_invoices = frappe.db.sql(
+				"""
 				select
 					"Sales Invoice Payment" as payment_document, sip.name as payment_entry, sip.amount as debit,
 					si.posting_date, si.customer as against_account, sip.clearance_date,
@@ -74,9 +90,13 @@
 					and account.name = sip.account and si.posting_date >= %(from)s and si.posting_date <= %(to)s
 				order by
 					si.posting_date ASC, si.name DESC
-			""", {"account":self.account, "from":self.from_date, "to":self.to_date}, as_dict=1)
+			""",
+				{"account": self.account, "from": self.from_date, "to": self.to_date},
+				as_dict=1,
+			)
 
-			pos_purchase_invoices = frappe.db.sql("""
+			pos_purchase_invoices = frappe.db.sql(
+				"""
 				select
 					"Purchase Invoice" as payment_document, pi.name as payment_entry, pi.paid_amount as credit,
 					pi.posting_date, pi.supplier as against_account, pi.clearance_date,
@@ -87,18 +107,24 @@
 					and pi.posting_date >= %(from)s and pi.posting_date <= %(to)s
 				order by
 					pi.posting_date ASC, pi.name DESC
-			""", {"account": self.account, "from": self.from_date, "to": self.to_date}, as_dict=1)
+			""",
+				{"account": self.account, "from": self.from_date, "to": self.to_date},
+				as_dict=1,
+			)
 
-		entries = sorted(list(payment_entries) + list(journal_entries + list(pos_sales_invoices) + list(pos_purchase_invoices)),
-			key=lambda k: k['posting_date'] or getdate(nowdate()))
+		entries = sorted(
+			list(payment_entries)
+			+ list(journal_entries + list(pos_sales_invoices) + list(pos_purchase_invoices)),
+			key=lambda k: k["posting_date"] or getdate(nowdate()),
+		)
 
-		self.set('payment_entries', [])
+		self.set("payment_entries", [])
 		self.total_amount = 0.0
 
 		for d in entries:
-			row = self.append('payment_entries', {})
+			row = self.append("payment_entries", {})
 
-			amount = flt(d.get('debit', 0)) - flt(d.get('credit', 0))
+			amount = flt(d.get("debit", 0)) - flt(d.get("credit", 0))
 
 			formatted_amount = fmt_money(abs(amount), 2, d.account_currency)
 			d.amount = formatted_amount + " " + (_("Dr") if amount > 0 else _("Cr"))
@@ -112,21 +138,24 @@
 	@frappe.whitelist()
 	def update_clearance_date(self):
 		clearance_date_updated = False
-		for d in self.get('payment_entries'):
+		for d in self.get("payment_entries"):
 			if d.clearance_date:
 				if not d.payment_document:
 					frappe.throw(_("Row #{0}: Payment document is required to complete the transaction"))
 
 				if d.cheque_date and getdate(d.clearance_date) < getdate(d.cheque_date):
-					frappe.throw(_("Row #{0}: Clearance date {1} cannot be before Cheque Date {2}")
-						.format(d.idx, d.clearance_date, d.cheque_date))
+					frappe.throw(
+						_("Row #{0}: Clearance date {1} cannot be before Cheque Date {2}").format(
+							d.idx, d.clearance_date, d.cheque_date
+						)
+					)
 
 			if d.clearance_date or self.include_reconciled_entries:
 				if not d.clearance_date:
 					d.clearance_date = None
 
 				payment_entry = frappe.get_doc(d.payment_document, d.payment_entry)
-				payment_entry.db_set('clearance_date', d.clearance_date)
+				payment_entry.db_set("clearance_date", d.clearance_date)
 
 				clearance_date_updated = True
 
diff --git a/erpnext/accounts/doctype/bank_guarantee/bank_guarantee.py b/erpnext/accounts/doctype/bank_guarantee/bank_guarantee.py
index cfbcf16..9144a29 100644
--- a/erpnext/accounts/doctype/bank_guarantee/bank_guarantee.py
+++ b/erpnext/accounts/doctype/bank_guarantee/bank_guarantee.py
@@ -23,10 +23,16 @@
 		if not self.bank:
 			frappe.throw(_("Enter the name of the bank or lending institution before submittting."))
 
+
 @frappe.whitelist()
 def get_vouchar_detials(column_list, doctype, docname):
 	column_list = json.loads(column_list)
 	for col in column_list:
 		sanitize_searchfield(col)
-	return frappe.db.sql(''' select {columns} from `tab{doctype}` where name=%s'''
-		.format(columns=", ".join(column_list), doctype=doctype), docname, as_dict=1)[0]
+	return frappe.db.sql(
+		""" select {columns} from `tab{doctype}` where name=%s""".format(
+			columns=", ".join(column_list), doctype=doctype
+		),
+		docname,
+		as_dict=1,
+	)[0]
diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
index 317fcc0..4c25d7c 100644
--- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
+++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
@@ -22,48 +22,63 @@
 class BankReconciliationTool(Document):
 	pass
 
+
 @frappe.whitelist()
-def get_bank_transactions(bank_account, from_date = None, to_date = None):
+def get_bank_transactions(bank_account, from_date=None, to_date=None):
 	# returns bank transactions for a bank account
 	filters = []
-	filters.append(['bank_account', '=', bank_account])
-	filters.append(['docstatus', '=', 1])
-	filters.append(['unallocated_amount', '>', 0])
+	filters.append(["bank_account", "=", bank_account])
+	filters.append(["docstatus", "=", 1])
+	filters.append(["unallocated_amount", ">", 0])
 	if to_date:
-		filters.append(['date', '<=', to_date])
+		filters.append(["date", "<=", to_date])
 	if from_date:
-		filters.append(['date', '>=', from_date])
+		filters.append(["date", ">=", from_date])
 	transactions = frappe.get_all(
-		'Bank Transaction',
-		fields = ['date', 'deposit', 'withdrawal', 'currency',
-		'description', 'name', 'bank_account', 'company',
-		'unallocated_amount', 'reference_number', 'party_type', 'party'],
-		filters = filters
+		"Bank Transaction",
+		fields=[
+			"date",
+			"deposit",
+			"withdrawal",
+			"currency",
+			"description",
+			"name",
+			"bank_account",
+			"company",
+			"unallocated_amount",
+			"reference_number",
+			"party_type",
+			"party",
+		],
+		filters=filters,
 	)
 	return transactions
 
+
 @frappe.whitelist()
 def get_account_balance(bank_account, till_date):
 	# returns account balance till the specified date
-	account = frappe.db.get_value('Bank Account', bank_account, 'account')
-	filters = frappe._dict({
-		"account": account,
-		"report_date": till_date,
-		"include_pos_transactions": 1
-	})
+	account = frappe.db.get_value("Bank Account", bank_account, "account")
+	filters = frappe._dict(
+		{"account": account, "report_date": till_date, "include_pos_transactions": 1}
+	)
 	data = get_entries(filters)
 
 	balance_as_per_system = get_balance_on(filters["account"], filters["report_date"])
 
-	total_debit, total_credit = 0,0
+	total_debit, total_credit = 0, 0
 	for d in data:
 		total_debit += flt(d.debit)
 		total_credit += flt(d.credit)
 
 	amounts_not_reflected_in_system = get_amounts_not_reflected_in_system(filters)
 
-	bank_bal = flt(balance_as_per_system) - flt(total_debit) + flt(total_credit) \
+	bank_bal = (
+		flt(balance_as_per_system)
+		- flt(total_debit)
+		+ flt(total_credit)
 		+ amounts_not_reflected_in_system
+	)
 
 	return bank_bal
 
@@ -76,71 +91,94 @@
 	bank_transaction.party_type = party_type
 	bank_transaction.party = party
 	bank_transaction.save()
-	return frappe.db.get_all('Bank Transaction',
-		filters={
-			'name': bank_transaction_name
-		},
-		fields=['date', 'deposit', 'withdrawal', 'currency',
-			'description', 'name', 'bank_account', 'company',
-			'unallocated_amount', 'reference_number',
-			 'party_type', 'party'],
+	return frappe.db.get_all(
+		"Bank Transaction",
+		filters={"name": bank_transaction_name},
+		fields=[
+			"date",
+			"deposit",
+			"withdrawal",
+			"currency",
+			"description",
+			"name",
+			"bank_account",
+			"company",
+			"unallocated_amount",
+			"reference_number",
+			"party_type",
+			"party",
+		],
 	)[0]
 
 
 @frappe.whitelist()
-def create_journal_entry_bts( bank_transaction_name, reference_number=None, reference_date=None, posting_date=None, entry_type=None,
-	second_account=None, mode_of_payment=None, party_type=None, party=None, allow_edit=None):
+def create_journal_entry_bts(
+	bank_transaction_name,
+	reference_number=None,
+	reference_date=None,
+	posting_date=None,
+	entry_type=None,
+	second_account=None,
+	mode_of_payment=None,
+	party_type=None,
+	party=None,
+	allow_edit=None,
+):
 	# Create a new journal entry based on the bank transaction
 	bank_transaction = frappe.db.get_values(
-		"Bank Transaction", bank_transaction_name,
-		fieldname=["name", "deposit", "withdrawal", "bank_account"] ,
-		as_dict=True
+		"Bank Transaction",
+		bank_transaction_name,
+		fieldname=["name", "deposit", "withdrawal", "bank_account"],
+		as_dict=True,
 	)[0]
 	company_account = frappe.get_value("Bank Account", bank_transaction.bank_account, "account")
 	account_type = frappe.db.get_value("Account", second_account, "account_type")
 	if account_type in ["Receivable", "Payable"]:
 		if not (party_type and party):
-			frappe.throw(_("Party Type and Party is required for Receivable / Payable account {0}").format( second_account))
+			frappe.throw(
+				_("Party Type and Party is required for Receivable / Payable account {0}").format(
+					second_account
+				)
+			)
 	accounts = []
 	# Multi Currency?
-	accounts.append({
+	accounts.append(
+		{
 			"account": second_account,
-			"credit_in_account_currency": bank_transaction.deposit
-				if  bank_transaction.deposit > 0
-				else 0,
-			"debit_in_account_currency":bank_transaction.withdrawal
-				if  bank_transaction.withdrawal > 0
-				else 0,
-			"party_type":party_type,
-			"party":party,
-		})
+			"credit_in_account_currency": bank_transaction.deposit if bank_transaction.deposit > 0 else 0,
+			"debit_in_account_currency": bank_transaction.withdrawal
+			if bank_transaction.withdrawal > 0
+			else 0,
+			"party_type": party_type,
+			"party": party,
+		}
+	)
 
-	accounts.append({
+	accounts.append(
+		{
 			"account": company_account,
 			"bank_account": bank_transaction.bank_account,
 			"credit_in_account_currency": bank_transaction.withdrawal
-				if  bank_transaction.withdrawal > 0
-				else 0,
-			"debit_in_account_currency":bank_transaction.deposit
-				if  bank_transaction.deposit > 0
-				else 0,
-		})
+			if bank_transaction.withdrawal > 0
+			else 0,
+			"debit_in_account_currency": bank_transaction.deposit if bank_transaction.deposit > 0 else 0,
+		}
+	)
 
 	company = frappe.get_value("Account", company_account, "company")
 
 	journal_entry_dict = {
-		"voucher_type" : entry_type,
-		"company" : company,
-		"posting_date" : posting_date,
-		"cheque_date" : reference_date,
-		"cheque_no" : reference_number,
-		"mode_of_payment" : mode_of_payment
+		"voucher_type": entry_type,
+		"company": company,
+		"posting_date": posting_date,
+		"cheque_date": reference_date,
+		"cheque_no": reference_number,
+		"mode_of_payment": mode_of_payment,
 	}
-	journal_entry = frappe.new_doc('Journal Entry')
+	journal_entry = frappe.new_doc("Journal Entry")
 	journal_entry.update(journal_entry_dict)
 	journal_entry.set("accounts", accounts)
 
-
 	if allow_edit:
 		return journal_entry
 
@@ -152,21 +190,32 @@
 	else:
 		paid_amount = bank_transaction.withdrawal
 
-	vouchers = json.dumps([{
-		"payment_doctype":"Journal Entry",
-		"payment_name":journal_entry.name,
-		"amount":paid_amount}])
+	vouchers = json.dumps(
+		[{"payment_doctype": "Journal Entry", "payment_name": journal_entry.name, "amount": paid_amount}]
+	)
 
 	return reconcile_vouchers(bank_transaction.name, vouchers)
 
+
 @frappe.whitelist()
-def create_payment_entry_bts( bank_transaction_name, reference_number=None, reference_date=None, party_type=None, party=None, posting_date=None,
-	mode_of_payment=None, project=None, cost_center=None, allow_edit=None):
+def create_payment_entry_bts(
+	bank_transaction_name,
+	reference_number=None,
+	reference_date=None,
+	party_type=None,
+	party=None,
+	posting_date=None,
+	mode_of_payment=None,
+	project=None,
+	cost_center=None,
+	allow_edit=None,
+):
 	# Create a new payment entry based on the bank transaction
 	bank_transaction = frappe.db.get_values(
-		"Bank Transaction", bank_transaction_name,
-		fieldname=["name", "unallocated_amount", "deposit", "bank_account"] ,
-		as_dict=True
+		"Bank Transaction",
+		bank_transaction_name,
+		fieldname=["name", "unallocated_amount", "deposit", "bank_account"],
+		as_dict=True,
 	)[0]
 	paid_amount = bank_transaction.unallocated_amount
 	payment_type = "Receive" if bank_transaction.deposit > 0 else "Pay"
@@ -174,27 +223,26 @@
 	company_account = frappe.get_value("Bank Account", bank_transaction.bank_account, "account")
 	company = frappe.get_value("Account", company_account, "company")
 	payment_entry_dict = {
-		"company" : company,
-		"payment_type" : payment_type,
-		"reference_no" :  reference_number,
-		"reference_date" :  reference_date,
-		"party_type" :  party_type,
-		"party" :  party,
-		"posting_date" :  posting_date,
+		"company": company,
+		"payment_type": payment_type,
+		"reference_no": reference_number,
+		"reference_date": reference_date,
+		"party_type": party_type,
+		"party": party,
+		"posting_date": posting_date,
 		"paid_amount": paid_amount,
-		"received_amount": paid_amount
+		"received_amount": paid_amount,
 	}
 	payment_entry = frappe.new_doc("Payment Entry")
 
-
 	payment_entry.update(payment_entry_dict)
 
 	if mode_of_payment:
-		payment_entry.mode_of_payment =  mode_of_payment
+		payment_entry.mode_of_payment = mode_of_payment
 	if project:
-		payment_entry.project =  project
+		payment_entry.project = project
 	if cost_center:
-		payment_entry.cost_center =  cost_center
+		payment_entry.cost_center = cost_center
 	if payment_type == "Receive":
 		payment_entry.paid_to = company_account
 	else:
@@ -208,84 +256,111 @@
 	payment_entry.insert()
 
 	payment_entry.submit()
-	vouchers = json.dumps([{
-		"payment_doctype":"Payment Entry",
-		"payment_name":payment_entry.name,
-		"amount":paid_amount}])
+	vouchers = json.dumps(
+		[{"payment_doctype": "Payment Entry", "payment_name": payment_entry.name, "amount": paid_amount}]
+	)
 	return reconcile_vouchers(bank_transaction.name, vouchers)
 
+
 @frappe.whitelist()
 def reconcile_vouchers(bank_transaction_name, vouchers):
 	# updated clear date of all the vouchers based on the bank transaction
 	vouchers = json.loads(vouchers)
 	transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
-	company_account = frappe.db.get_value('Bank Account', transaction.bank_account, 'account')
+	company_account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
 
 	if transaction.unallocated_amount == 0:
 		frappe.throw(_("This bank transaction is already fully reconciled"))
 	total_amount = 0
 	for voucher in vouchers:
-		voucher['payment_entry'] = frappe.get_doc(voucher['payment_doctype'], voucher['payment_name'])
-		total_amount += get_paid_amount(frappe._dict({
-			'payment_document': voucher['payment_doctype'],
-			'payment_entry': voucher['payment_name'],
-		}), transaction.currency, company_account)
+		voucher["payment_entry"] = frappe.get_doc(voucher["payment_doctype"], voucher["payment_name"])
+		total_amount += get_paid_amount(
+			frappe._dict(
+				{
+					"payment_document": voucher["payment_doctype"],
+					"payment_entry": voucher["payment_name"],
+				}
+			),
+			transaction.currency,
+			company_account,
+		)
 
 	if total_amount > transaction.unallocated_amount:
-		frappe.throw(_("The sum total of amounts of all selected vouchers should be less than the unallocated amount of the bank transaction"))
+		frappe.throw(
+			_(
+				"The sum total of amounts of all selected vouchers should be less than the unallocated amount of the bank transaction"
+			)
+		)
 	account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
 
 	for voucher in vouchers:
-		gl_entry = frappe.db.get_value("GL Entry", dict(account=account, voucher_type=voucher['payment_doctype'], voucher_no=voucher['payment_name']), ['credit', 'debit'], as_dict=1)
-		gl_amount, transaction_amount = (gl_entry.credit, transaction.deposit) if gl_entry.credit > 0 else (gl_entry.debit, transaction.withdrawal)
+		gl_entry = frappe.db.get_value(
+			"GL Entry",
+			dict(
+				account=account, voucher_type=voucher["payment_doctype"], voucher_no=voucher["payment_name"]
+			),
+			["credit", "debit"],
+			as_dict=1,
+		)
+		gl_amount, transaction_amount = (
+			(gl_entry.credit, transaction.deposit)
+			if gl_entry.credit > 0
+			else (gl_entry.debit, transaction.withdrawal)
+		)
 		allocated_amount = gl_amount if gl_amount >= transaction_amount else transaction_amount
 
-		transaction.append("payment_entries", {
-			"payment_document": voucher['payment_entry'].doctype,
-			"payment_entry": voucher['payment_entry'].name,
-			"allocated_amount": allocated_amount
-		})
+		transaction.append(
+			"payment_entries",
+			{
+				"payment_document": voucher["payment_entry"].doctype,
+				"payment_entry": voucher["payment_entry"].name,
+				"allocated_amount": allocated_amount,
+			},
+		)
 
 	transaction.save()
 	transaction.update_allocations()
 	return frappe.get_doc("Bank Transaction", bank_transaction_name)
 
+
 @frappe.whitelist()
-def get_linked_payments(bank_transaction_name, document_types = None):
+def get_linked_payments(bank_transaction_name, document_types=None):
 	# get all matching payments for a bank transaction
 	transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
 	bank_account = frappe.db.get_values(
-		"Bank Account",
-		transaction.bank_account,
-		["account", "company"],
-		as_dict=True)[0]
+		"Bank Account", transaction.bank_account, ["account", "company"], as_dict=True
+	)[0]
 	(account, company) = (bank_account.account, bank_account.company)
 	matching = check_matching(account, company, transaction, document_types)
 	return matching
 
+
 def check_matching(bank_account, company, transaction, document_types):
 	# combine all types of vouchers
 	subquery = get_queries(bank_account, company, transaction, document_types)
 	filters = {
-			"amount": transaction.unallocated_amount,
-			"payment_type" : "Receive" if transaction.deposit > 0 else "Pay",
-			"reference_no": transaction.reference_number,
-			"party_type": transaction.party_type,
-			"party": transaction.party,
-			"bank_account":  bank_account
-		}
+		"amount": transaction.unallocated_amount,
+		"payment_type": "Receive" if transaction.deposit > 0 else "Pay",
+		"reference_no": transaction.reference_number,
+		"party_type": transaction.party_type,
+		"party": transaction.party,
+		"bank_account": bank_account,
+	}
 
 	matching_vouchers = []
 
-	matching_vouchers.extend(get_loan_vouchers(bank_account, transaction,
-		document_types, filters))
+	matching_vouchers.extend(get_loan_vouchers(bank_account, transaction, document_types, filters))
 
 	for query in subquery:
 		matching_vouchers.extend(
-			frappe.db.sql(query, filters,)
+			frappe.db.sql(
+				query,
+				filters,
+			)
 		)
 
-	return sorted(matching_vouchers, key = lambda x: x[0], reverse=True) if matching_vouchers else []
+	return sorted(matching_vouchers, key=lambda x: x[0], reverse=True) if matching_vouchers else []
+
 
 def get_queries(bank_account, company, transaction, document_types):
 	# get queries to get matching vouchers
@@ -302,7 +377,7 @@
 		queries.extend([je_amount_matching])
 
 	if transaction.deposit > 0 and "sales_invoice" in document_types:
-		si_amount_matching =  get_si_matching_query(amount_condition)
+		si_amount_matching = get_si_matching_query(amount_condition)
 		queries.extend([si_amount_matching])
 
 	if transaction.withdrawal > 0:
@@ -316,6 +391,7 @@
 
 	return queries
 
+
 def get_loan_vouchers(bank_account, transaction, document_types, filters):
 	vouchers = []
 	amount_condition = True if "exact_match" in document_types else False
@@ -328,109 +404,90 @@
 
 	return vouchers
 
+
 def get_ld_matching_query(bank_account, amount_condition, filters):
 	loan_disbursement = frappe.qb.DocType("Loan Disbursement")
 	matching_reference = loan_disbursement.reference_number == filters.get("reference_number")
-	matching_party = loan_disbursement.applicant_type == filters.get("party_type") and \
-			loan_disbursement.applicant == filters.get("party")
+	matching_party = loan_disbursement.applicant_type == filters.get(
+		"party_type"
+	) and loan_disbursement.applicant == filters.get("party")
 
-	rank = (
-			frappe.qb.terms.Case()
-			.when(matching_reference, 1)
-			.else_(0)
+	rank = frappe.qb.terms.Case().when(matching_reference, 1).else_(0)
+
+	rank1 = frappe.qb.terms.Case().when(matching_party, 1).else_(0)
+
+	query = (
+		frappe.qb.from_(loan_disbursement)
+		.select(
+			rank + rank1 + 1,
+			ConstantColumn("Loan Disbursement").as_("doctype"),
+			loan_disbursement.name,
+			loan_disbursement.disbursed_amount,
+			loan_disbursement.reference_number,
+			loan_disbursement.reference_date,
+			loan_disbursement.applicant_type,
+			loan_disbursement.disbursement_date,
 		)
-
-	rank1 = (
-			frappe.qb.terms.Case()
-			.when(matching_party, 1)
-			.else_(0)
-		)
-
-	query = frappe.qb.from_(loan_disbursement).select(
-		rank + rank1 + 1,
-		ConstantColumn("Loan Disbursement").as_("doctype"),
-		loan_disbursement.name,
-		loan_disbursement.disbursed_amount,
-		loan_disbursement.reference_number,
-		loan_disbursement.reference_date,
-		loan_disbursement.applicant_type,
-		loan_disbursement.disbursement_date
-	).where(
-		loan_disbursement.docstatus == 1
-	).where(
-		loan_disbursement.clearance_date.isnull()
-	).where(
-		loan_disbursement.disbursement_account == bank_account
+		.where(loan_disbursement.docstatus == 1)
+		.where(loan_disbursement.clearance_date.isnull())
+		.where(loan_disbursement.disbursement_account == bank_account)
 	)
 
 	if amount_condition:
-		query.where(
-			loan_disbursement.disbursed_amount == filters.get('amount')
-		)
+		query.where(loan_disbursement.disbursed_amount == filters.get("amount"))
 	else:
-		query.where(
-			loan_disbursement.disbursed_amount <= filters.get('amount')
-		)
+		query.where(loan_disbursement.disbursed_amount <= filters.get("amount"))
 
 	vouchers = query.run(as_list=True)
 
 	return vouchers
 
+
 def get_lr_matching_query(bank_account, amount_condition, filters):
 	loan_repayment = frappe.qb.DocType("Loan Repayment")
 	matching_reference = loan_repayment.reference_number == filters.get("reference_number")
-	matching_party = loan_repayment.applicant_type == filters.get("party_type") and \
-			loan_repayment.applicant == filters.get("party")
+	matching_party = loan_repayment.applicant_type == filters.get(
+		"party_type"
+	) and loan_repayment.applicant == filters.get("party")
 
-	rank = (
-			frappe.qb.terms.Case()
-			.when(matching_reference, 1)
-			.else_(0)
+	rank = frappe.qb.terms.Case().when(matching_reference, 1).else_(0)
+
+	rank1 = frappe.qb.terms.Case().when(matching_party, 1).else_(0)
+
+	query = (
+		frappe.qb.from_(loan_repayment)
+		.select(
+			rank + rank1 + 1,
+			ConstantColumn("Loan Repayment").as_("doctype"),
+			loan_repayment.name,
+			loan_repayment.amount_paid,
+			loan_repayment.reference_number,
+			loan_repayment.reference_date,
+			loan_repayment.applicant_type,
+			loan_repayment.posting_date,
 		)
-
-	rank1 = (
-			frappe.qb.terms.Case()
-			.when(matching_party, 1)
-			.else_(0)
-		)
-
-	query = frappe.qb.from_(loan_repayment).select(
-		rank + rank1 + 1,
-		ConstantColumn("Loan Repayment").as_("doctype"),
-		loan_repayment.name,
-		loan_repayment.amount_paid,
-		loan_repayment.reference_number,
-		loan_repayment.reference_date,
-		loan_repayment.applicant_type,
-		loan_repayment.posting_date
-	).where(
-		loan_repayment.docstatus == 1
-	).where(
-		loan_repayment.clearance_date.isnull()
-	).where(
-		loan_repayment.payment_account == bank_account
+		.where(loan_repayment.docstatus == 1)
+		.where(loan_repayment.clearance_date.isnull())
+		.where(loan_repayment.payment_account == bank_account)
 	)
 
 	if amount_condition:
-		query.where(
-			loan_repayment.amount_paid == filters.get('amount')
-		)
+		query.where(loan_repayment.amount_paid == filters.get("amount"))
 	else:
-		query.where(
-			loan_repayment.amount_paid <= filters.get('amount')
-		)
+		query.where(loan_repayment.amount_paid <= filters.get("amount"))
 
 	vouchers = query.run()
 
 	return vouchers
 
+
 def get_pe_matching_query(amount_condition, account_from_to, transaction):
 	# get matching payment entries query
 	if transaction.deposit > 0:
 		currency_field = "paid_to_account_currency as currency"
 	else:
 		currency_field = "paid_from_account_currency as currency"
-	return  f"""
+	return f"""
 	SELECT
 		(CASE WHEN reference_no=%(reference_no)s THEN 1 ELSE 0 END
 		+ CASE WHEN (party_type = %(party_type)s AND party = %(party)s ) THEN 1 ELSE 0  END
@@ -519,6 +576,7 @@
 			AND si.docstatus = 1
 	"""
 
+
 def get_pi_matching_query(amount_condition):
 	# get matching purchase invoice query
 	return f"""
@@ -544,11 +602,16 @@
 			AND cash_bank_account  = %(bank_account)s
 	"""
 
+
 def get_ec_matching_query(bank_account, company, amount_condition):
 	# get matching Expense Claim query
-	mode_of_payments = [x["parent"] for x in frappe.db.get_all("Mode of Payment Account",
-			filters={"default_account": bank_account}, fields=["parent"])]
-	mode_of_payments = '(\'' + '\', \''.join(mode_of_payments) + '\' )'
+	mode_of_payments = [
+		x["parent"]
+		for x in frappe.db.get_all(
+			"Mode of Payment Account", filters={"default_account": bank_account}, fields=["parent"]
+		)
+	]
+	mode_of_payments = "('" + "', '".join(mode_of_payments) + "' )"
 	company_currency = get_company_currency(company)
 	return f"""
 		SELECT
diff --git a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
index 1403303..3540f0b 100644
--- a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
+++ b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
@@ -18,6 +18,7 @@
 
 INVALID_VALUES = ("", None)
 
+
 class BankStatementImport(DataImport):
 	def __init__(self, *args, **kwargs):
 		super(BankStatementImport, self).__init__(*args, **kwargs)
@@ -49,16 +50,14 @@
 			self.import_file, self.google_sheets_url
 		)
 
-		if 'Bank Account' not in json.dumps(preview['columns']):
+		if "Bank Account" not in json.dumps(preview["columns"]):
 			frappe.throw(_("Please add the Bank Account column"))
 
 		from frappe.core.page.background_jobs.background_jobs import get_info
 		from frappe.utils.scheduler import is_scheduler_inactive
 
 		if is_scheduler_inactive() and not frappe.flags.in_test:
-			frappe.throw(
-				_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive")
-			)
+			frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
 
 		enqueued_jobs = [d.get("job_name") for d in get_info()]
 
@@ -81,21 +80,25 @@
 
 		return False
 
+
 @frappe.whitelist()
 def get_preview_from_template(data_import, import_file=None, google_sheets_url=None):
 	return frappe.get_doc("Bank Statement Import", data_import).get_preview_from_template(
 		import_file, google_sheets_url
 	)
 
+
 @frappe.whitelist()
 def form_start_import(data_import):
 	return frappe.get_doc("Bank Statement Import", data_import).start_import()
 
+
 @frappe.whitelist()
 def download_errored_template(data_import_name):
 	data_import = frappe.get_doc("Bank Statement Import", data_import_name)
 	data_import.export_errored_rows()
 
+
 def parse_data_from_template(raw_data):
 	data = []
 
@@ -108,7 +111,10 @@
 
 	return data
 
-def start_import(data_import, bank_account, import_file_path, google_sheets_url, bank, template_options):
+
+def start_import(
+	data_import, bank_account, import_file_path, google_sheets_url, bank, template_options
+):
 	"""This method runs in background job"""
 
 	update_mapping_db(bank, template_options)
@@ -116,7 +122,7 @@
 	data_import = frappe.get_doc("Bank Statement Import", data_import)
 	file = import_file_path if import_file_path else google_sheets_url
 
-	import_file = ImportFile("Bank Transaction", file = file, import_type="Insert New Records")
+	import_file = ImportFile("Bank Transaction", file=file, import_type="Insert New Records")
 
 	data = parse_data_from_template(import_file.raw_data)
 
@@ -136,16 +142,18 @@
 
 	frappe.publish_realtime("data_import_refresh", {"data_import": data_import.name})
 
+
 def update_mapping_db(bank, template_options):
 	bank = frappe.get_doc("Bank", bank)
 	for d in bank.bank_transaction_mapping:
 		d.delete()
 
 	for d in json.loads(template_options)["column_to_field_map"].items():
-		bank.append("bank_transaction_mapping", {"bank_transaction_field":  d[1] ,"file_field": d[0]} )
+		bank.append("bank_transaction_mapping", {"bank_transaction_field": d[1], "file_field": d[0]})
 
 	bank.save()
 
+
 def add_bank_account(data, bank_account):
 	bank_account_loc = None
 	if "Bank Account" not in data[0]:
@@ -161,6 +169,7 @@
 		else:
 			row.append(bank_account)
 
+
 def write_files(import_file, data):
 	full_file_path = import_file.file_doc.get_full_path()
 	parts = import_file.file_doc.get_extension()
@@ -168,11 +177,12 @@
 	extension = extension.lstrip(".")
 
 	if extension == "csv":
-		with open(full_file_path, 'w', newline='') as file:
+		with open(full_file_path, "w", newline="") as file:
 			writer = csv.writer(file)
 			writer.writerows(data)
 	elif extension == "xlsx" or "xls":
-		write_xlsx(data, "trans", file_path = full_file_path)
+		write_xlsx(data, "trans", file_path=full_file_path)
+
 
 def write_xlsx(data, sheet_name, wb=None, column_widths=None, file_path=None):
 	# from xlsx utils with changes
@@ -187,19 +197,19 @@
 			ws.column_dimensions[get_column_letter(i + 1)].width = column_width
 
 	row1 = ws.row_dimensions[1]
-	row1.font = Font(name='Calibri', bold=True)
+	row1.font = Font(name="Calibri", bold=True)
 
 	for row in data:
 		clean_row = []
 		for item in row:
-			if isinstance(item, str) and (sheet_name not in ['Data Import Template', 'Data Export']):
+			if isinstance(item, str) and (sheet_name not in ["Data Import Template", "Data Export"]):
 				value = handle_html(item)
 			else:
 				value = item
 
 			if isinstance(item, str) and next(ILLEGAL_CHARACTERS_RE.finditer(value), None):
 				# Remove illegal characters from the string
-				value = re.sub(ILLEGAL_CHARACTERS_RE, '', value)
+				value = re.sub(ILLEGAL_CHARACTERS_RE, "", value)
 
 			clean_row.append(value)
 
@@ -208,19 +218,20 @@
 	wb.save(file_path)
 	return True
 
+
 @frappe.whitelist()
 def upload_bank_statement(**args):
 	args = frappe._dict(args)
 	bsi = frappe.new_doc("Bank Statement Import")
 
 	if args.company:
-		bsi.update({
-			"company": args.company,
-		})
+		bsi.update(
+			{
+				"company": args.company,
+			}
+		)
 
 	if args.bank_account:
-		bsi.update({
-			"bank_account": args.bank_account
-		})
+		bsi.update({"bank_account": args.bank_account})
 
 	return bsi
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
index a924df7..9a0891f 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
@@ -29,17 +29,26 @@
 
 	def update_allocations(self):
 		if self.payment_entries:
-			allocated_amount = reduce(lambda x, y: flt(x) + flt(y), [x.allocated_amount for x in self.payment_entries])
+			allocated_amount = reduce(
+				lambda x, y: flt(x) + flt(y), [x.allocated_amount for x in self.payment_entries]
+			)
 		else:
 			allocated_amount = 0
 
 		if allocated_amount:
 			frappe.db.set_value(self.doctype, self.name, "allocated_amount", flt(allocated_amount))
-			frappe.db.set_value(self.doctype, self.name, "unallocated_amount", abs(flt(self.withdrawal) - flt(self.deposit)) - flt(allocated_amount))
+			frappe.db.set_value(
+				self.doctype,
+				self.name,
+				"unallocated_amount",
+				abs(flt(self.withdrawal) - flt(self.deposit)) - flt(allocated_amount),
+			)
 
 		else:
 			frappe.db.set_value(self.doctype, self.name, "allocated_amount", 0)
-			frappe.db.set_value(self.doctype, self.name, "unallocated_amount", abs(flt(self.withdrawal) - flt(self.deposit)))
+			frappe.db.set_value(
+				self.doctype, self.name, "unallocated_amount", abs(flt(self.withdrawal) - flt(self.deposit))
+			)
 
 		amount = self.deposit or self.withdrawal
 		if amount == self.allocated_amount:
@@ -49,8 +58,14 @@
 
 	def clear_linked_payment_entries(self, for_cancel=False):
 		for payment_entry in self.payment_entries:
-			if payment_entry.payment_document in ["Payment Entry", "Journal Entry", "Purchase Invoice", "Expense Claim", "Loan Repayment",
-				"Loan Disbursement"]:
+			if payment_entry.payment_document in [
+				"Payment Entry",
+				"Journal Entry",
+				"Purchase Invoice",
+				"Expense Claim",
+				"Loan Repayment",
+				"Loan Disbursement",
+			]:
 				self.clear_simple_entry(payment_entry, for_cancel=for_cancel)
 
 			elif payment_entry.payment_document == "Sales Invoice":
@@ -58,38 +73,41 @@
 
 	def clear_simple_entry(self, payment_entry, for_cancel=False):
 		if payment_entry.payment_document == "Payment Entry":
-			if frappe.db.get_value("Payment Entry", payment_entry.payment_entry, "payment_type") == "Internal Transfer":
+			if (
+				frappe.db.get_value("Payment Entry", payment_entry.payment_entry, "payment_type")
+				== "Internal Transfer"
+			):
 				if len(get_reconciled_bank_transactions(payment_entry)) < 2:
 					return
 
 		clearance_date = self.date if not for_cancel else None
 		frappe.db.set_value(
-			payment_entry.payment_document, payment_entry.payment_entry,
-			"clearance_date", clearance_date)
+			payment_entry.payment_document, payment_entry.payment_entry, "clearance_date", clearance_date
+		)
 
 	def clear_sales_invoice(self, payment_entry, for_cancel=False):
 		clearance_date = self.date if not for_cancel else None
 		frappe.db.set_value(
 			"Sales Invoice Payment",
-			dict(
-				parenttype=payment_entry.payment_document,
-				parent=payment_entry.payment_entry
-			),
-			"clearance_date", clearance_date)
+			dict(parenttype=payment_entry.payment_document, parent=payment_entry.payment_entry),
+			"clearance_date",
+			clearance_date,
+		)
+
 
 def get_reconciled_bank_transactions(payment_entry):
 	reconciled_bank_transactions = frappe.get_all(
-		'Bank Transaction Payments',
-		filters = {
-			'payment_entry': payment_entry.payment_entry
-		},
-		fields = ['parent']
+		"Bank Transaction Payments",
+		filters={"payment_entry": payment_entry.payment_entry},
+		fields=["parent"],
 	)
 
 	return reconciled_bank_transactions
 
+
 def get_total_allocated_amount(payment_entry):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			SUM(btp.allocated_amount) as allocated_amount,
 			bt.name
@@ -102,48 +120,73 @@
 		AND
 			btp.payment_entry = %s
 		AND
-			bt.docstatus = 1""", (payment_entry.payment_document, payment_entry.payment_entry), as_dict=True)
+			bt.docstatus = 1""",
+		(payment_entry.payment_document, payment_entry.payment_entry),
+		as_dict=True,
+	)
+
 
 def get_paid_amount(payment_entry, currency, bank_account):
 	if payment_entry.payment_document in ["Payment Entry", "Sales Invoice", "Purchase Invoice"]:
 
 		paid_amount_field = "paid_amount"
-		if payment_entry.payment_document == 'Payment Entry':
+		if payment_entry.payment_document == "Payment Entry":
 			doc = frappe.get_doc("Payment Entry", payment_entry.payment_entry)
 
-			if doc.payment_type == 'Receive':
-				paid_amount_field = ("received_amount"
-					if doc.paid_to_account_currency == currency else "base_received_amount")
-			elif doc.payment_type == 'Pay':
-				paid_amount_field = ("paid_amount"
-					if doc.paid_to_account_currency == currency else "base_paid_amount")
+			if doc.payment_type == "Receive":
+				paid_amount_field = (
+					"received_amount" if doc.paid_to_account_currency == currency else "base_received_amount"
+				)
+			elif doc.payment_type == "Pay":
+				paid_amount_field = (
+					"paid_amount" if doc.paid_to_account_currency == currency else "base_paid_amount"
+				)
 
-		return frappe.db.get_value(payment_entry.payment_document,
-			payment_entry.payment_entry, paid_amount_field)
+		return frappe.db.get_value(
+			payment_entry.payment_document, payment_entry.payment_entry, paid_amount_field
+		)
 
 	elif payment_entry.payment_document == "Journal Entry":
-		return frappe.db.get_value('Journal Entry Account', {'parent': payment_entry.payment_entry, 'account': bank_account},
-			"sum(credit_in_account_currency)")
+		return frappe.db.get_value(
+			"Journal Entry Account",
+			{"parent": payment_entry.payment_entry, "account": bank_account},
+			"sum(credit_in_account_currency)",
+		)
 
 	elif payment_entry.payment_document == "Expense Claim":
-		return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "total_amount_reimbursed")
+		return frappe.db.get_value(
+			payment_entry.payment_document, payment_entry.payment_entry, "total_amount_reimbursed"
+		)
 
 	elif payment_entry.payment_document == "Loan Disbursement":
-		return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "disbursed_amount")
+		return frappe.db.get_value(
+			payment_entry.payment_document, payment_entry.payment_entry, "disbursed_amount"
+		)
 
 	elif payment_entry.payment_document == "Loan Repayment":
-		return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "amount_paid")
+		return frappe.db.get_value(
+			payment_entry.payment_document, payment_entry.payment_entry, "amount_paid"
+		)
 
 	else:
-		frappe.throw("Please reconcile {0}: {1} manually".format(payment_entry.payment_document, payment_entry.payment_entry))
+		frappe.throw(
+			"Please reconcile {0}: {1} manually".format(
+				payment_entry.payment_document, payment_entry.payment_entry
+			)
+		)
+
 
 @frappe.whitelist()
 def unclear_reference_payment(doctype, docname):
 	if frappe.db.exists(doctype, docname):
 		doc = frappe.get_doc(doctype, docname)
 		if doctype == "Sales Invoice":
-			frappe.db.set_value("Sales Invoice Payment", dict(parenttype=doc.payment_document,
-				parent=doc.payment_entry), "clearance_date", None)
+			frappe.db.set_value(
+				"Sales Invoice Payment",
+				dict(parenttype=doc.payment_document, parent=doc.payment_entry),
+				"clearance_date",
+				None,
+			)
 		else:
 			frappe.db.set_value(doc.payment_document, doc.payment_entry, "clearance_date", None)
 
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py
index cca8a88..9f2731d 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py
@@ -18,12 +18,14 @@
 		fcontent = frappe.local.uploaded_file
 		fname = frappe.local.uploaded_filename
 
-	if frappe.safe_encode(fname).lower().endswith("csv".encode('utf-8')):
+	if frappe.safe_encode(fname).lower().endswith("csv".encode("utf-8")):
 		from frappe.utils.csvutils import read_csv_content
+
 		rows = read_csv_content(fcontent, False)
 
-	elif frappe.safe_encode(fname).lower().endswith("xlsx".encode('utf-8')):
+	elif frappe.safe_encode(fname).lower().endswith("xlsx".encode("utf-8")):
 		from frappe.utils.xlsxutils import read_xlsx_file_from_attached_file
+
 		rows = read_xlsx_file_from_attached_file(fcontent=fcontent)
 
 	columns = rows[0]
@@ -43,12 +45,10 @@
 			continue
 		fields = {}
 		for key, value in header_map.items():
-			fields.update({key: d[int(value)-1]})
+			fields.update({key: d[int(value) - 1]})
 
 		try:
-			bank_transaction = frappe.get_doc({
-				"doctype": "Bank Transaction"
-			})
+			bank_transaction = frappe.get_doc({"doctype": "Bank Transaction"})
 			bank_transaction.update(fields)
 			bank_transaction.date = getdate(parse_date(bank_transaction.date))
 			bank_transaction.bank_account = bank_account
@@ -61,6 +61,7 @@
 
 	return {"success": success, "errors": errors}
 
+
 def get_header_mapping(columns, bank_account):
 	mapping = get_bank_mapping(bank_account)
 
@@ -71,10 +72,11 @@
 
 	return header_map
 
+
 def get_bank_mapping(bank_account):
 	bank_name = frappe.db.get_value("Bank Account", bank_account, "bank")
 	bank = frappe.get_doc("Bank", bank_name)
 
-	mapping = {row.file_field:row.bank_transaction_field for row in bank.bank_transaction_mapping}
+	mapping = {row.file_field: row.bank_transaction_field for row in bank.bank_transaction_mapping}
 
 	return mapping
diff --git a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
index d84b8e0..8cbed4c 100644
--- a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
+++ b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
@@ -17,6 +17,7 @@
 
 test_dependencies = ["Item", "Cost Center"]
 
+
 class TestBankTransaction(unittest.TestCase):
 	@classmethod
 	def setUpClass(cls):
@@ -41,21 +42,34 @@
 
 	# This test checks if ERPNext is able to provide a linked payment for a bank transaction based on the amount of the bank transaction.
 	def test_linked_payments(self):
-		bank_transaction = frappe.get_doc("Bank Transaction", dict(description="Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic"))
-		linked_payments = get_linked_payments(bank_transaction.name, ['payment_entry', 'exact_match'])
+		bank_transaction = frappe.get_doc(
+			"Bank Transaction",
+			dict(description="Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic"),
+		)
+		linked_payments = get_linked_payments(bank_transaction.name, ["payment_entry", "exact_match"])
 		self.assertTrue(linked_payments[0][6] == "Conrad Electronic")
 
 	# This test validates a simple reconciliation leading to the clearance of the bank transaction and the payment
 	def test_reconcile(self):
-		bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000003025 OPSKATTUZWXXX AT776000000098709849 Herr G"))
+		bank_transaction = frappe.get_doc(
+			"Bank Transaction",
+			dict(description="1512567 BG/000003025 OPSKATTUZWXXX AT776000000098709849 Herr G"),
+		)
 		payment = frappe.get_doc("Payment Entry", dict(party="Mr G", paid_amount=1700))
-		vouchers = json.dumps([{
-		"payment_doctype":"Payment Entry",
-		"payment_name":payment.name,
-		"amount":bank_transaction.unallocated_amount}])
+		vouchers = json.dumps(
+			[
+				{
+					"payment_doctype": "Payment Entry",
+					"payment_name": payment.name,
+					"amount": bank_transaction.unallocated_amount,
+				}
+			]
+		)
 		reconcile_vouchers(bank_transaction.name, vouchers)
 
-		unallocated_amount = frappe.db.get_value("Bank Transaction", bank_transaction.name, "unallocated_amount")
+		unallocated_amount = frappe.db.get_value(
+			"Bank Transaction", bank_transaction.name, "unallocated_amount"
+		)
 		self.assertTrue(unallocated_amount == 0)
 
 		clearance_date = frappe.db.get_value("Payment Entry", payment.name, "clearance_date")
@@ -69,122 +83,177 @@
 
 	# Check if ERPNext can correctly filter a linked payments based on the debit/credit amount
 	def test_debit_credit_output(self):
-		bank_transaction = frappe.get_doc("Bank Transaction", dict(description="Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07"))
-		linked_payments = get_linked_payments(bank_transaction.name, ['payment_entry', 'exact_match'])
+		bank_transaction = frappe.get_doc(
+			"Bank Transaction",
+			dict(description="Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07"),
+		)
+		linked_payments = get_linked_payments(bank_transaction.name, ["payment_entry", "exact_match"])
 		self.assertTrue(linked_payments[0][3])
 
 	# Check error if already reconciled
 	def test_already_reconciled(self):
-		bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"))
+		bank_transaction = frappe.get_doc(
+			"Bank Transaction",
+			dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"),
+		)
 		payment = frappe.get_doc("Payment Entry", dict(party="Mr G", paid_amount=1200))
-		vouchers = json.dumps([{
-			"payment_doctype":"Payment Entry",
-			"payment_name":payment.name,
-			"amount":bank_transaction.unallocated_amount}])
+		vouchers = json.dumps(
+			[
+				{
+					"payment_doctype": "Payment Entry",
+					"payment_name": payment.name,
+					"amount": bank_transaction.unallocated_amount,
+				}
+			]
+		)
 		reconcile_vouchers(bank_transaction.name, vouchers)
 
-		bank_transaction = frappe.get_doc("Bank Transaction", dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"))
+		bank_transaction = frappe.get_doc(
+			"Bank Transaction",
+			dict(description="1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G"),
+		)
 		payment = frappe.get_doc("Payment Entry", dict(party="Mr G", paid_amount=1200))
-		vouchers = json.dumps([{
-			"payment_doctype":"Payment Entry",
-			"payment_name":payment.name,
-			"amount":bank_transaction.unallocated_amount}])
-		self.assertRaises(frappe.ValidationError, reconcile_vouchers, bank_transaction_name=bank_transaction.name, vouchers=vouchers)
+		vouchers = json.dumps(
+			[
+				{
+					"payment_doctype": "Payment Entry",
+					"payment_name": payment.name,
+					"amount": bank_transaction.unallocated_amount,
+				}
+			]
+		)
+		self.assertRaises(
+			frappe.ValidationError,
+			reconcile_vouchers,
+			bank_transaction_name=bank_transaction.name,
+			vouchers=vouchers,
+		)
 
 	# Raise an error if debitor transaction vs debitor payment
 	def test_clear_sales_invoice(self):
-		bank_transaction = frappe.get_doc("Bank Transaction", dict(description="I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio"))
+		bank_transaction = frappe.get_doc(
+			"Bank Transaction",
+			dict(description="I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio"),
+		)
 		payment = frappe.get_doc("Sales Invoice", dict(customer="Fayva", status=["=", "Paid"]))
-		vouchers = json.dumps([{
-			"payment_doctype":"Sales Invoice",
-			"payment_name":payment.name,
-			"amount":bank_transaction.unallocated_amount}])
+		vouchers = json.dumps(
+			[
+				{
+					"payment_doctype": "Sales Invoice",
+					"payment_name": payment.name,
+					"amount": bank_transaction.unallocated_amount,
+				}
+			]
+		)
 		reconcile_vouchers(bank_transaction.name, vouchers=vouchers)
 
-		self.assertEqual(frappe.db.get_value("Bank Transaction", bank_transaction.name, "unallocated_amount"), 0)
-		self.assertTrue(frappe.db.get_value("Sales Invoice Payment", dict(parent=payment.name), "clearance_date") is not None)
+		self.assertEqual(
+			frappe.db.get_value("Bank Transaction", bank_transaction.name, "unallocated_amount"), 0
+		)
+		self.assertTrue(
+			frappe.db.get_value("Sales Invoice Payment", dict(parent=payment.name), "clearance_date")
+			is not None
+		)
+
 
 def create_bank_account(bank_name="Citi Bank", account_name="_Test Bank - _TC"):
 	try:
-		frappe.get_doc({
-			"doctype": "Bank",
-			"bank_name":bank_name,
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Bank",
+				"bank_name": bank_name,
+			}
+		).insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 
 	try:
-		frappe.get_doc({
-			"doctype": "Bank Account",
-			"account_name":"Checking Account",
-			"bank": bank_name,
-			"account": account_name
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Bank Account",
+				"account_name": "Checking Account",
+				"bank": bank_name,
+				"account": account_name,
+			}
+		).insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 
+
 def add_transactions():
 	create_bank_account()
 
-	doc = frappe.get_doc({
-		"doctype": "Bank Transaction",
-		"description":"1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G",
-		"date": "2018-10-23",
-		"deposit": 1200,
-		"currency": "INR",
-		"bank_account": "Checking Account - Citi Bank"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Bank Transaction",
+			"description": "1512567 BG/000002918 OPSKATTUZWXXX AT776000000098709837 Herr G",
+			"date": "2018-10-23",
+			"deposit": 1200,
+			"currency": "INR",
+			"bank_account": "Checking Account - Citi Bank",
+		}
+	).insert()
 	doc.submit()
 
-	doc = frappe.get_doc({
-		"doctype": "Bank Transaction",
-		"description":"1512567 BG/000003025 OPSKATTUZWXXX AT776000000098709849 Herr G",
-		"date": "2018-10-23",
-		"deposit": 1700,
-		"currency": "INR",
-		"bank_account": "Checking Account - Citi Bank"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Bank Transaction",
+			"description": "1512567 BG/000003025 OPSKATTUZWXXX AT776000000098709849 Herr G",
+			"date": "2018-10-23",
+			"deposit": 1700,
+			"currency": "INR",
+			"bank_account": "Checking Account - Citi Bank",
+		}
+	).insert()
 	doc.submit()
 
-	doc = frappe.get_doc({
-		"doctype": "Bank Transaction",
-		"description":"Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic",
-		"date": "2018-10-26",
-		"withdrawal": 690,
-		"currency": "INR",
-		"bank_account": "Checking Account - Citi Bank"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Bank Transaction",
+			"description": "Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic",
+			"date": "2018-10-26",
+			"withdrawal": 690,
+			"currency": "INR",
+			"bank_account": "Checking Account - Citi Bank",
+		}
+	).insert()
 	doc.submit()
 
-	doc = frappe.get_doc({
-		"doctype": "Bank Transaction",
-		"description":"Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07",
-		"date": "2018-10-27",
-		"deposit": 3900,
-		"currency": "INR",
-		"bank_account": "Checking Account - Citi Bank"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Bank Transaction",
+			"description": "Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07",
+			"date": "2018-10-27",
+			"deposit": 3900,
+			"currency": "INR",
+			"bank_account": "Checking Account - Citi Bank",
+		}
+	).insert()
 	doc.submit()
 
-	doc = frappe.get_doc({
-		"doctype": "Bank Transaction",
-		"description":"I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio",
-		"date": "2018-10-27",
-		"withdrawal": 109080,
-		"currency": "INR",
-		"bank_account": "Checking Account - Citi Bank"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Bank Transaction",
+			"description": "I2015000011 VD/000002514 ATWWXXX AT4701345000003510057 Bio",
+			"date": "2018-10-27",
+			"withdrawal": 109080,
+			"currency": "INR",
+			"bank_account": "Checking Account - Citi Bank",
+		}
+	).insert()
 	doc.submit()
 
 
 def add_vouchers():
 	try:
-		frappe.get_doc({
-			"doctype": "Supplier",
-			"supplier_group":"All Supplier Groups",
-			"supplier_type": "Company",
-			"supplier_name": "Conrad Electronic"
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Supplier",
+				"supplier_group": "All Supplier Groups",
+				"supplier_type": "Company",
+				"supplier_name": "Conrad Electronic",
+			}
+		).insert(ignore_if_duplicate=True)
 
 	except frappe.DuplicateEntryError:
 		pass
@@ -198,12 +267,14 @@
 	pe.submit()
 
 	try:
-		frappe.get_doc({
-			"doctype": "Supplier",
-			"supplier_group":"All Supplier Groups",
-			"supplier_type": "Company",
-			"supplier_name": "Mr G"
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Supplier",
+				"supplier_group": "All Supplier Groups",
+				"supplier_type": "Company",
+				"supplier_name": "Mr G",
+			}
+		).insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 
@@ -222,26 +293,30 @@
 	pe.submit()
 
 	try:
-		frappe.get_doc({
-			"doctype": "Supplier",
-			"supplier_group":"All Supplier Groups",
-			"supplier_type": "Company",
-			"supplier_name": "Poore Simon's"
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Supplier",
+				"supplier_group": "All Supplier Groups",
+				"supplier_type": "Company",
+				"supplier_name": "Poore Simon's",
+			}
+		).insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 
 	try:
-		frappe.get_doc({
-			"doctype": "Customer",
-			"customer_group":"All Customer Groups",
-			"customer_type": "Company",
-			"customer_name": "Poore Simon's"
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_group": "All Customer Groups",
+				"customer_type": "Company",
+				"customer_name": "Poore Simon's",
+			}
+		).insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 
-	pi = make_purchase_invoice(supplier="Poore Simon's", qty=1, rate=3900, is_paid=1, do_not_save =1)
+	pi = make_purchase_invoice(supplier="Poore Simon's", qty=1, rate=3900, is_paid=1, do_not_save=1)
 	pi.cash_bank_account = "_Test Bank - _TC"
 	pi.insert()
 	pi.submit()
@@ -261,33 +336,31 @@
 	pe.submit()
 
 	try:
-		frappe.get_doc({
-			"doctype": "Customer",
-			"customer_group":"All Customer Groups",
-			"customer_type": "Company",
-			"customer_name": "Fayva"
-		}).insert(ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_group": "All Customer Groups",
+				"customer_type": "Company",
+				"customer_name": "Fayva",
+			}
+		).insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 
-	mode_of_payment = frappe.get_doc({
-		"doctype": "Mode of Payment",
-		"name": "Cash"
-	})
+	mode_of_payment = frappe.get_doc({"doctype": "Mode of Payment", "name": "Cash"})
 
-	if not frappe.db.get_value('Mode of Payment Account', {'company': "_Test Company", 'parent': "Cash"}):
-		mode_of_payment.append("accounts", {
-			"company": "_Test Company",
-			"default_account": "_Test Bank - _TC"
-		})
+	if not frappe.db.get_value(
+		"Mode of Payment Account", {"company": "_Test Company", "parent": "Cash"}
+	):
+		mode_of_payment.append(
+			"accounts", {"company": "_Test Company", "default_account": "_Test Bank - _TC"}
+		)
 		mode_of_payment.save()
 
 	si = create_sales_invoice(customer="Fayva", qty=1, rate=109080, do_not_save=1)
 	si.is_pos = 1
-	si.append("payments", {
-		"mode_of_payment": "Cash",
-		"account": "_Test Bank - _TC",
-		"amount": 109080
-	})
+	si.append(
+		"payments", {"mode_of_payment": "Cash", "account": "_Test Bank - _TC", "amount": 109080}
+	)
 	si.insert()
 	si.submit()
diff --git a/erpnext/accounts/doctype/budget/budget.py b/erpnext/accounts/doctype/budget/budget.py
index 492bb365..5527f9f 100644
--- a/erpnext/accounts/doctype/budget/budget.py
+++ b/erpnext/accounts/doctype/budget/budget.py
@@ -14,13 +14,19 @@
 from erpnext.accounts.utils import get_fiscal_year
 
 
-class BudgetError(frappe.ValidationError): pass
-class DuplicateBudgetError(frappe.ValidationError): pass
+class BudgetError(frappe.ValidationError):
+	pass
+
+
+class DuplicateBudgetError(frappe.ValidationError):
+	pass
+
 
 class Budget(Document):
 	def autoname(self):
-		self.name = make_autoname(self.get(frappe.scrub(self.budget_against))
-			+ "/" + self.fiscal_year + "/.###")
+		self.name = make_autoname(
+			self.get(frappe.scrub(self.budget_against)) + "/" + self.fiscal_year + "/.###"
+		)
 
 	def validate(self):
 		if not self.get(frappe.scrub(self.budget_against)):
@@ -35,34 +41,44 @@
 		budget_against = self.get(budget_against_field)
 
 		accounts = [d.account for d in self.accounts] or []
-		existing_budget = frappe.db.sql("""
+		existing_budget = frappe.db.sql(
+			"""
 			select
 				b.name, ba.account from `tabBudget` b, `tabBudget Account` ba
 			where
 				ba.parent = b.name and b.docstatus < 2 and b.company = %s and %s=%s and
 				b.fiscal_year=%s and b.name != %s and ba.account in (%s) """
-				% ('%s', budget_against_field, '%s', '%s', '%s', ','.join(['%s'] * len(accounts))),
-			(self.company, budget_against, self.fiscal_year, self.name) + tuple(accounts), as_dict=1)
+			% ("%s", budget_against_field, "%s", "%s", "%s", ",".join(["%s"] * len(accounts))),
+			(self.company, budget_against, self.fiscal_year, self.name) + tuple(accounts),
+			as_dict=1,
+		)
 
 		for d in existing_budget:
-			frappe.throw(_("Another Budget record '{0}' already exists against {1} '{2}' and account '{3}' for fiscal year {4}")
-				.format(d.name, self.budget_against, budget_against, d.account, self.fiscal_year), DuplicateBudgetError)
+			frappe.throw(
+				_(
+					"Another Budget record '{0}' already exists against {1} '{2}' and account '{3}' for fiscal year {4}"
+				).format(d.name, self.budget_against, budget_against, d.account, self.fiscal_year),
+				DuplicateBudgetError,
+			)
 
 	def validate_accounts(self):
 		account_list = []
-		for d in self.get('accounts'):
+		for d in self.get("accounts"):
 			if d.account:
-				account_details = frappe.db.get_value("Account", d.account,
-					["is_group", "company", "report_type"], as_dict=1)
+				account_details = frappe.db.get_value(
+					"Account", d.account, ["is_group", "company", "report_type"], as_dict=1
+				)
 
 				if account_details.is_group:
 					frappe.throw(_("Budget cannot be assigned against Group Account {0}").format(d.account))
 				elif account_details.company != self.company:
-					frappe.throw(_("Account {0} does not belongs to company {1}")
-						.format(d.account, self.company))
+					frappe.throw(_("Account {0} does not belongs to company {1}").format(d.account, self.company))
 				elif account_details.report_type != "Profit and Loss":
-					frappe.throw(_("Budget cannot be assigned against {0}, as it's not an Income or Expense account")
-						.format(d.account))
+					frappe.throw(
+						_("Budget cannot be assigned against {0}, as it's not an Income or Expense account").format(
+							d.account
+						)
+					)
 
 				if d.account in account_list:
 					frappe.throw(_("Account {0} has been entered multiple times").format(d.account))
@@ -70,51 +86,66 @@
 					account_list.append(d.account)
 
 	def set_null_value(self):
-		if self.budget_against == 'Cost Center':
+		if self.budget_against == "Cost Center":
 			self.project = None
 		else:
 			self.cost_center = None
 
 	def validate_applicable_for(self):
-		if (self.applicable_on_material_request
-			and not (self.applicable_on_purchase_order and self.applicable_on_booking_actual_expenses)):
-			frappe.throw(_("Please enable Applicable on Purchase Order and Applicable on Booking Actual Expenses"))
+		if self.applicable_on_material_request and not (
+			self.applicable_on_purchase_order and self.applicable_on_booking_actual_expenses
+		):
+			frappe.throw(
+				_("Please enable Applicable on Purchase Order and Applicable on Booking Actual Expenses")
+			)
 
-		elif (self.applicable_on_purchase_order
-			and not (self.applicable_on_booking_actual_expenses)):
+		elif self.applicable_on_purchase_order and not (self.applicable_on_booking_actual_expenses):
 			frappe.throw(_("Please enable Applicable on Booking Actual Expenses"))
 
-		elif not(self.applicable_on_material_request
-			or self.applicable_on_purchase_order or self.applicable_on_booking_actual_expenses):
+		elif not (
+			self.applicable_on_material_request
+			or self.applicable_on_purchase_order
+			or self.applicable_on_booking_actual_expenses
+		):
 			self.applicable_on_booking_actual_expenses = 1
 
+
 def validate_expense_against_budget(args):
 	args = frappe._dict(args)
 
-	if args.get('company') and not args.fiscal_year:
-		args.fiscal_year = get_fiscal_year(args.get('posting_date'), company=args.get('company'))[0]
-		frappe.flags.exception_approver_role = frappe.get_cached_value('Company',
-			args.get('company'),  'exception_budget_approver_role')
+	if args.get("company") and not args.fiscal_year:
+		args.fiscal_year = get_fiscal_year(args.get("posting_date"), company=args.get("company"))[0]
+		frappe.flags.exception_approver_role = frappe.get_cached_value(
+			"Company", args.get("company"), "exception_budget_approver_role"
+		)
 
 	if not args.account:
 		args.account = args.get("expense_account")
 
-	if not (args.get('account') and args.get('cost_center')) and args.item_code:
+	if not (args.get("account") and args.get("cost_center")) and args.item_code:
 		args.cost_center, args.account = get_item_details(args)
 
 	if not args.account:
 		return
 
-	for budget_against in ['project', 'cost_center'] + get_accounting_dimensions():
-		if (args.get(budget_against) and args.account
-				and frappe.db.get_value("Account", {"name": args.account, "root_type": "Expense"})):
+	for budget_against in ["project", "cost_center"] + get_accounting_dimensions():
+		if (
+			args.get(budget_against)
+			and args.account
+			and frappe.db.get_value("Account", {"name": args.account, "root_type": "Expense"})
+		):
 
 			doctype = frappe.unscrub(budget_against)
 
-			if frappe.get_cached_value('DocType', doctype, 'is_tree'):
+			if frappe.get_cached_value("DocType", doctype, "is_tree"):
 				lft, rgt = frappe.db.get_value(doctype, args.get(budget_against), ["lft", "rgt"])
 				condition = """and exists(select name from `tab%s`
-					where lft<=%s and rgt>=%s and name=b.%s)""" % (doctype, lft, rgt, budget_against) #nosec
+					where lft<=%s and rgt>=%s and name=b.%s)""" % (
+					doctype,
+					lft,
+					rgt,
+					budget_against,
+				)  # nosec
 				args.is_tree = True
 			else:
 				condition = "and b.%s=%s" % (budget_against, frappe.db.escape(args.get(budget_against)))
@@ -123,7 +154,8 @@
 			args.budget_against_field = budget_against
 			args.budget_against_doctype = doctype
 
-			budget_records = frappe.db.sql("""
+			budget_records = frappe.db.sql(
+				"""
 				select
 					b.{budget_against_field} as budget_against, ba.budget_amount, b.monthly_distribution,
 					ifnull(b.applicable_on_material_request, 0) as for_material_request,
@@ -138,11 +170,17 @@
 					b.name=ba.parent and b.fiscal_year=%s
 					and ba.account=%s and b.docstatus=1
 					{condition}
-			""".format(condition=condition, budget_against_field=budget_against), (args.fiscal_year, args.account), as_dict=True) #nosec
+			""".format(
+					condition=condition, budget_against_field=budget_against
+				),
+				(args.fiscal_year, args.account),
+				as_dict=True,
+			)  # nosec
 
 			if budget_records:
 				validate_budget_records(args, budget_records)
 
+
 def validate_budget_records(args, budget_records):
 	for budget in budget_records:
 		if flt(budget.budget_amount):
@@ -150,88 +188,118 @@
 			yearly_action, monthly_action = get_actions(args, budget)
 
 			if monthly_action in ["Stop", "Warn"]:
-				budget_amount = get_accumulated_monthly_budget(budget.monthly_distribution,
-					args.posting_date, args.fiscal_year, budget.budget_amount)
+				budget_amount = get_accumulated_monthly_budget(
+					budget.monthly_distribution, args.posting_date, args.fiscal_year, budget.budget_amount
+				)
 
 				args["month_end_date"] = get_last_day(args.posting_date)
 
-				compare_expense_with_budget(args, budget_amount,
-					_("Accumulated Monthly"), monthly_action, budget.budget_against, amount)
+				compare_expense_with_budget(
+					args, budget_amount, _("Accumulated Monthly"), monthly_action, budget.budget_against, amount
+				)
 
-			if yearly_action in ("Stop", "Warn") and monthly_action != "Stop" \
-				and yearly_action != monthly_action:
-				compare_expense_with_budget(args, flt(budget.budget_amount),
-						_("Annual"), yearly_action, budget.budget_against, amount)
+			if (
+				yearly_action in ("Stop", "Warn")
+				and monthly_action != "Stop"
+				and yearly_action != monthly_action
+			):
+				compare_expense_with_budget(
+					args, flt(budget.budget_amount), _("Annual"), yearly_action, budget.budget_against, amount
+				)
+
 
 def compare_expense_with_budget(args, budget_amount, action_for, action, budget_against, amount=0):
 	actual_expense = amount or get_actual_expense(args)
 	if actual_expense > budget_amount:
 		diff = actual_expense - budget_amount
-		currency = frappe.get_cached_value('Company',  args.company,  'default_currency')
+		currency = frappe.get_cached_value("Company", args.company, "default_currency")
 
 		msg = _("{0} Budget for Account {1} against {2} {3} is {4}. It will exceed by {5}").format(
-				_(action_for), frappe.bold(args.account), args.budget_against_field,
-				frappe.bold(budget_against),
-				frappe.bold(fmt_money(budget_amount, currency=currency)),
-				frappe.bold(fmt_money(diff, currency=currency)))
+			_(action_for),
+			frappe.bold(args.account),
+			args.budget_against_field,
+			frappe.bold(budget_against),
+			frappe.bold(fmt_money(budget_amount, currency=currency)),
+			frappe.bold(fmt_money(diff, currency=currency)),
+		)
 
-		if (frappe.flags.exception_approver_role
-			and frappe.flags.exception_approver_role in frappe.get_roles(frappe.session.user)):
+		if (
+			frappe.flags.exception_approver_role
+			and frappe.flags.exception_approver_role in frappe.get_roles(frappe.session.user)
+		):
 			action = "Warn"
 
-		if action=="Stop":
+		if action == "Stop":
 			frappe.throw(msg, BudgetError)
 		else:
-			frappe.msgprint(msg, indicator='orange')
+			frappe.msgprint(msg, indicator="orange")
+
 
 def get_actions(args, budget):
 	yearly_action = budget.action_if_annual_budget_exceeded
 	monthly_action = budget.action_if_accumulated_monthly_budget_exceeded
 
-	if args.get('doctype') == 'Material Request' and budget.for_material_request:
+	if args.get("doctype") == "Material Request" and budget.for_material_request:
 		yearly_action = budget.action_if_annual_budget_exceeded_on_mr
 		monthly_action = budget.action_if_accumulated_monthly_budget_exceeded_on_mr
 
-	elif args.get('doctype') == 'Purchase Order' and budget.for_purchase_order:
+	elif args.get("doctype") == "Purchase Order" and budget.for_purchase_order:
 		yearly_action = budget.action_if_annual_budget_exceeded_on_po
 		monthly_action = budget.action_if_accumulated_monthly_budget_exceeded_on_po
 
 	return yearly_action, monthly_action
 
+
 def get_amount(args, budget):
 	amount = 0
 
-	if args.get('doctype') == 'Material Request' and budget.for_material_request:
-		amount = (get_requested_amount(args, budget)
-			+ get_ordered_amount(args, budget) + get_actual_expense(args))
+	if args.get("doctype") == "Material Request" and budget.for_material_request:
+		amount = (
+			get_requested_amount(args, budget) + get_ordered_amount(args, budget) + get_actual_expense(args)
+		)
 
-	elif args.get('doctype') == 'Purchase Order' and budget.for_purchase_order:
+	elif args.get("doctype") == "Purchase Order" and budget.for_purchase_order:
 		amount = get_ordered_amount(args, budget) + get_actual_expense(args)
 
 	return amount
 
-def get_requested_amount(args, budget):
-	item_code = args.get('item_code')
-	condition = get_other_condition(args, budget, 'Material Request')
 
-	data = frappe.db.sql(""" select ifnull((sum(child.stock_qty - child.ordered_qty) * rate), 0) as amount
+def get_requested_amount(args, budget):
+	item_code = args.get("item_code")
+	condition = get_other_condition(args, budget, "Material Request")
+
+	data = frappe.db.sql(
+		""" select ifnull((sum(child.stock_qty - child.ordered_qty) * rate), 0) as amount
 		from `tabMaterial Request Item` child, `tabMaterial Request` parent where parent.name = child.parent and
 		child.item_code = %s and parent.docstatus = 1 and child.stock_qty > child.ordered_qty and {0} and
-		parent.material_request_type = 'Purchase' and parent.status != 'Stopped'""".format(condition), item_code, as_list=1)
+		parent.material_request_type = 'Purchase' and parent.status != 'Stopped'""".format(
+			condition
+		),
+		item_code,
+		as_list=1,
+	)
 
 	return data[0][0] if data else 0
 
+
 def get_ordered_amount(args, budget):
-	item_code = args.get('item_code')
-	condition = get_other_condition(args, budget, 'Purchase Order')
+	item_code = args.get("item_code")
+	condition = get_other_condition(args, budget, "Purchase Order")
 
-	data = frappe.db.sql(""" select ifnull(sum(child.amount - child.billed_amt), 0) as amount
+	data = frappe.db.sql(
+		""" select ifnull(sum(child.amount - child.billed_amt), 0) as amount
 		from `tabPurchase Order Item` child, `tabPurchase Order` parent where
 		parent.name = child.parent and child.item_code = %s and parent.docstatus = 1 and child.amount > child.billed_amt
-		and parent.status != 'Closed' and {0}""".format(condition), item_code, as_list=1)
+		and parent.status != 'Closed' and {0}""".format(
+			condition
+		),
+		item_code,
+		as_list=1,
+	)
 
 	return data[0][0] if data else 0
 
+
 def get_other_condition(args, budget, for_doc):
 	condition = "expense_account = '%s'" % (args.expense_account)
 	budget_against_field = args.get("budget_against_field")
@@ -239,41 +307,51 @@
 	if budget_against_field and args.get(budget_against_field):
 		condition += " and child.%s = '%s'" % (budget_against_field, args.get(budget_against_field))
 
-	if args.get('fiscal_year'):
-		date_field = 'schedule_date' if for_doc == 'Material Request' else 'transaction_date'
-		start_date, end_date = frappe.db.get_value('Fiscal Year', args.get('fiscal_year'),
-			['year_start_date', 'year_end_date'])
+	if args.get("fiscal_year"):
+		date_field = "schedule_date" if for_doc == "Material Request" else "transaction_date"
+		start_date, end_date = frappe.db.get_value(
+			"Fiscal Year", args.get("fiscal_year"), ["year_start_date", "year_end_date"]
+		)
 
 		condition += """ and parent.%s
-			between '%s' and '%s' """ %(date_field, start_date, end_date)
+			between '%s' and '%s' """ % (
+			date_field,
+			start_date,
+			end_date,
+		)
 
 	return condition
 
+
 def get_actual_expense(args):
 	if not args.budget_against_doctype:
 		args.budget_against_doctype = frappe.unscrub(args.budget_against_field)
 
-	budget_against_field = args.get('budget_against_field')
-	condition1 = " and gle.posting_date <= %(month_end_date)s" \
-		if args.get("month_end_date") else ""
+	budget_against_field = args.get("budget_against_field")
+	condition1 = " and gle.posting_date <= %(month_end_date)s" if args.get("month_end_date") else ""
 
 	if args.is_tree:
-		lft_rgt = frappe.db.get_value(args.budget_against_doctype,
-			args.get(budget_against_field), ["lft", "rgt"], as_dict=1)
+		lft_rgt = frappe.db.get_value(
+			args.budget_against_doctype, args.get(budget_against_field), ["lft", "rgt"], as_dict=1
+		)
 
 		args.update(lft_rgt)
 
 		condition2 = """and exists(select name from `tab{doctype}`
 			where lft>=%(lft)s and rgt<=%(rgt)s
-			and name=gle.{budget_against_field})""".format(doctype=args.budget_against_doctype, #nosec
-			budget_against_field=budget_against_field)
+			and name=gle.{budget_against_field})""".format(
+			doctype=args.budget_against_doctype, budget_against_field=budget_against_field  # nosec
+		)
 	else:
 		condition2 = """and exists(select name from `tab{doctype}`
 		where name=gle.{budget_against} and
-		gle.{budget_against} = %({budget_against})s)""".format(doctype=args.budget_against_doctype,
-		budget_against = budget_against_field)
+		gle.{budget_against} = %({budget_against})s)""".format(
+			doctype=args.budget_against_doctype, budget_against=budget_against_field
+		)
 
-	amount  = flt(frappe.db.sql("""
+	amount = flt(
+		frappe.db.sql(
+			"""
 		select sum(gle.debit) - sum(gle.credit)
 		from `tabGL Entry` gle
 		where gle.account=%(account)s
@@ -282,46 +360,59 @@
 			and gle.company=%(company)s
 			and gle.docstatus=1
 			{condition2}
-	""".format(condition1=condition1, condition2=condition2), (args))[0][0]) #nosec
+	""".format(
+				condition1=condition1, condition2=condition2
+			),
+			(args),
+		)[0][0]
+	)  # nosec
 
 	return amount
 
+
 def get_accumulated_monthly_budget(monthly_distribution, posting_date, fiscal_year, annual_budget):
 	distribution = {}
 	if monthly_distribution:
-		for d in frappe.db.sql("""select mdp.month, mdp.percentage_allocation
+		for d in frappe.db.sql(
+			"""select mdp.month, mdp.percentage_allocation
 			from `tabMonthly Distribution Percentage` mdp, `tabMonthly Distribution` md
-			where mdp.parent=md.name and md.fiscal_year=%s""", fiscal_year, as_dict=1):
-				distribution.setdefault(d.month, d.percentage_allocation)
+			where mdp.parent=md.name and md.fiscal_year=%s""",
+			fiscal_year,
+			as_dict=1,
+		):
+			distribution.setdefault(d.month, d.percentage_allocation)
 
 	dt = frappe.db.get_value("Fiscal Year", fiscal_year, "year_start_date")
 	accumulated_percentage = 0.0
 
-	while(dt <= getdate(posting_date)):
+	while dt <= getdate(posting_date):
 		if monthly_distribution:
 			accumulated_percentage += distribution.get(getdate(dt).strftime("%B"), 0)
 		else:
-			accumulated_percentage += 100.0/12
+			accumulated_percentage += 100.0 / 12
 
 		dt = add_months(dt, 1)
 
 	return annual_budget * accumulated_percentage / 100
 
+
 def get_item_details(args):
 	cost_center, expense_account = None, None
 
-	if not args.get('company'):
+	if not args.get("company"):
 		return cost_center, expense_account
 
 	if args.item_code:
-		item_defaults = frappe.db.get_value('Item Default',
-			{'parent': args.item_code, 'company': args.get('company')},
-			['buying_cost_center', 'expense_account'])
+		item_defaults = frappe.db.get_value(
+			"Item Default",
+			{"parent": args.item_code, "company": args.get("company")},
+			["buying_cost_center", "expense_account"],
+		)
 		if item_defaults:
 			cost_center, expense_account = item_defaults
 
 	if not (cost_center and expense_account):
-		for doctype in ['Item Group', 'Company']:
+		for doctype in ["Item Group", "Company"]:
 			data = get_expense_cost_center(doctype, args)
 
 			if not cost_center and data:
@@ -335,11 +426,15 @@
 
 	return cost_center, expense_account
 
+
 def get_expense_cost_center(doctype, args):
-	if doctype == 'Item Group':
-		return frappe.db.get_value('Item Default',
-			{'parent': args.get(frappe.scrub(doctype)), 'company': args.get('company')},
-			['buying_cost_center', 'expense_account'])
+	if doctype == "Item Group":
+		return frappe.db.get_value(
+			"Item Default",
+			{"parent": args.get(frappe.scrub(doctype)), "company": args.get("company")},
+			["buying_cost_center", "expense_account"],
+		)
 	else:
-		return frappe.db.get_value(doctype, args.get(frappe.scrub(doctype)),\
-			['cost_center', 'default_expense_account'])
+		return frappe.db.get_value(
+			doctype, args.get(frappe.scrub(doctype)), ["cost_center", "default_expense_account"]
+		)
diff --git a/erpnext/accounts/doctype/budget/test_budget.py b/erpnext/accounts/doctype/budget/test_budget.py
index 9a83a0a..c48c7d9 100644
--- a/erpnext/accounts/doctype/budget/test_budget.py
+++ b/erpnext/accounts/doctype/budget/test_budget.py
@@ -11,7 +11,8 @@
 from erpnext.accounts.utils import get_fiscal_year
 from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
 
-test_dependencies = ['Monthly Distribution']
+test_dependencies = ["Monthly Distribution"]
+
 
 class TestBudget(unittest.TestCase):
 	def test_monthly_budget_crossed_ignore(self):
@@ -19,11 +20,18 @@
 
 		budget = make_budget(budget_against="Cost Center")
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 40000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True)
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			40000,
+			"_Test Cost Center - _TC",
+			posting_date=nowdate(),
+			submit=True,
+		)
 
-		self.assertTrue(frappe.db.get_value("GL Entry",
-			{"voucher_type": "Journal Entry", "voucher_no": jv.name}))
+		self.assertTrue(
+			frappe.db.get_value("GL Entry", {"voucher_type": "Journal Entry", "voucher_no": jv.name})
+		)
 
 		budget.cancel()
 		jv.cancel()
@@ -33,10 +41,17 @@
 
 		budget = make_budget(budget_against="Cost Center")
 
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 40000, "_Test Cost Center - _TC", posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			40000,
+			"_Test Cost Center - _TC",
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
@@ -48,49 +63,65 @@
 
 		budget = make_budget(budget_against="Cost Center")
 
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 40000, "_Test Cost Center - _TC", posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			40000,
+			"_Test Cost Center - _TC",
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
-		frappe.db.set_value('Company', budget.company, 'exception_budget_approver_role', 'Accounts User')
+		frappe.db.set_value("Company", budget.company, "exception_budget_approver_role", "Accounts User")
 
 		jv.submit()
-		self.assertEqual(frappe.db.get_value('Journal Entry', jv.name, 'docstatus'), 1)
+		self.assertEqual(frappe.db.get_value("Journal Entry", jv.name, "docstatus"), 1)
 		jv.cancel()
 
-		frappe.db.set_value('Company', budget.company, 'exception_budget_approver_role', '')
+		frappe.db.set_value("Company", budget.company, "exception_budget_approver_role", "")
 
 		budget.load_from_db()
 		budget.cancel()
 
 	def test_monthly_budget_crossed_for_mr(self):
-		budget = make_budget(applicable_on_material_request=1,
-			applicable_on_purchase_order=1, action_if_accumulated_monthly_budget_exceeded_on_mr="Stop",
-			budget_against="Cost Center")
+		budget = make_budget(
+			applicable_on_material_request=1,
+			applicable_on_purchase_order=1,
+			action_if_accumulated_monthly_budget_exceeded_on_mr="Stop",
+			budget_against="Cost Center",
+		)
 
 		fiscal_year = get_fiscal_year(nowdate())[0]
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 		frappe.db.set_value("Budget", budget.name, "fiscal_year", fiscal_year)
 
-		mr = frappe.get_doc({
-			"doctype": "Material Request",
-			"material_request_type": "Purchase",
-			"transaction_date": nowdate(),
-			"company": budget.company,
-			"items": [{
-				'item_code': '_Test Item',
-				'qty': 1,
-				'uom': "_Test UOM",
-				'warehouse': '_Test Warehouse - _TC',
-				'schedule_date': nowdate(),
-				'rate': 100000,
-				'expense_account': '_Test Account Cost for Goods Sold - _TC',
-				'cost_center': '_Test Cost Center - _TC'
-			}]
-		})
+		mr = frappe.get_doc(
+			{
+				"doctype": "Material Request",
+				"material_request_type": "Purchase",
+				"transaction_date": nowdate(),
+				"company": budget.company,
+				"items": [
+					{
+						"item_code": "_Test Item",
+						"qty": 1,
+						"uom": "_Test UOM",
+						"warehouse": "_Test Warehouse - _TC",
+						"schedule_date": nowdate(),
+						"rate": 100000,
+						"expense_account": "_Test Account Cost for Goods Sold - _TC",
+						"cost_center": "_Test Cost Center - _TC",
+					}
+				],
+			}
+		)
 
 		mr.set_missing_values()
 
@@ -100,11 +131,16 @@
 		budget.cancel()
 
 	def test_monthly_budget_crossed_for_po(self):
-		budget = make_budget(applicable_on_purchase_order=1,
-			action_if_accumulated_monthly_budget_exceeded_on_po="Stop", budget_against="Cost Center")
+		budget = make_budget(
+			applicable_on_purchase_order=1,
+			action_if_accumulated_monthly_budget_exceeded_on_po="Stop",
+			budget_against="Cost Center",
+		)
 
 		fiscal_year = get_fiscal_year(nowdate())[0]
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 		frappe.db.set_value("Budget", budget.name, "fiscal_year", fiscal_year)
 
 		po = create_purchase_order(transaction_date=nowdate(), do_not_submit=True)
@@ -122,12 +158,20 @@
 
 		budget = make_budget(budget_against="Project")
 
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
 		project = frappe.get_value("Project", {"project_name": "_Test Project"})
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 40000, "_Test Cost Center - _TC", project=project, posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			40000,
+			"_Test Cost Center - _TC",
+			project=project,
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
@@ -139,8 +183,13 @@
 
 		budget = make_budget(budget_against="Cost Center")
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 250000, "_Test Cost Center - _TC", posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			250000,
+			"_Test Cost Center - _TC",
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
@@ -153,9 +202,14 @@
 
 		project = frappe.get_value("Project", {"project_name": "_Test Project"})
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 250000, "_Test Cost Center - _TC",
-			project=project, posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			250000,
+			"_Test Cost Center - _TC",
+			project=project,
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
@@ -169,14 +223,23 @@
 		if month > 9:
 			month = 9
 
-		for i in range(month+1):
-			jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-				"_Test Bank - _TC", 20000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True)
+		for i in range(month + 1):
+			jv = make_journal_entry(
+				"_Test Account Cost for Goods Sold - _TC",
+				"_Test Bank - _TC",
+				20000,
+				"_Test Cost Center - _TC",
+				posting_date=nowdate(),
+				submit=True,
+			)
 
-			self.assertTrue(frappe.db.get_value("GL Entry",
-				{"voucher_type": "Journal Entry", "voucher_no": jv.name}))
+			self.assertTrue(
+				frappe.db.get_value("GL Entry", {"voucher_type": "Journal Entry", "voucher_no": jv.name})
+			)
 
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
 		self.assertRaises(BudgetError, jv.cancel)
 
@@ -193,14 +256,23 @@
 
 		project = frappe.get_value("Project", {"project_name": "_Test Project"})
 		for i in range(month + 1):
-			jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-				"_Test Bank - _TC", 20000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True,
-				project=project)
+			jv = make_journal_entry(
+				"_Test Account Cost for Goods Sold - _TC",
+				"_Test Bank - _TC",
+				20000,
+				"_Test Cost Center - _TC",
+				posting_date=nowdate(),
+				submit=True,
+				project=project,
+			)
 
-			self.assertTrue(frappe.db.get_value("GL Entry",
-				{"voucher_type": "Journal Entry", "voucher_no": jv.name}))
+			self.assertTrue(
+				frappe.db.get_value("GL Entry", {"voucher_type": "Journal Entry", "voucher_no": jv.name})
+			)
 
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
 		self.assertRaises(BudgetError, jv.cancel)
 
@@ -212,10 +284,17 @@
 		set_total_expense_zero(nowdate(), "cost_center", "_Test Cost Center 2 - _TC")
 
 		budget = make_budget(budget_against="Cost Center", cost_center="_Test Company - _TC")
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 40000, "_Test Cost Center 2 - _TC", posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			40000,
+			"_Test Cost Center 2 - _TC",
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
@@ -226,19 +305,28 @@
 		cost_center = "_Test Cost Center 3 - _TC"
 
 		if not frappe.db.exists("Cost Center", cost_center):
-			frappe.get_doc({
-				'doctype': 'Cost Center',
-				'cost_center_name': '_Test Cost Center 3',
-				'parent_cost_center': "_Test Company - _TC",
-				'company': '_Test Company',
-				'is_group': 0
-			}).insert(ignore_permissions=True)
+			frappe.get_doc(
+				{
+					"doctype": "Cost Center",
+					"cost_center_name": "_Test Cost Center 3",
+					"parent_cost_center": "_Test Company - _TC",
+					"company": "_Test Company",
+					"is_group": 0,
+				}
+			).insert(ignore_permissions=True)
 
 		budget = make_budget(budget_against="Cost Center", cost_center=cost_center)
-		frappe.db.set_value("Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop")
+		frappe.db.set_value(
+			"Budget", budget.name, "action_if_accumulated_monthly_budget_exceeded", "Stop"
+		)
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 40000, cost_center, posting_date=nowdate())
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			40000,
+			cost_center,
+			posting_date=nowdate(),
+		)
 
 		self.assertRaises(BudgetError, jv.submit)
 
@@ -255,14 +343,16 @@
 
 	fiscal_year = get_fiscal_year(nowdate())[0]
 
-	args = frappe._dict({
-		"account": "_Test Account Cost for Goods Sold - _TC",
-		"cost_center": "_Test Cost Center - _TC",
-		"monthly_end_date": posting_date,
-		"company": "_Test Company",
-		"fiscal_year": fiscal_year,
-		"budget_against_field": budget_against_field,
-	})
+	args = frappe._dict(
+		{
+			"account": "_Test Account Cost for Goods Sold - _TC",
+			"cost_center": "_Test Cost Center - _TC",
+			"monthly_end_date": posting_date,
+			"company": "_Test Company",
+			"fiscal_year": fiscal_year,
+			"budget_against_field": budget_against_field,
+		}
+	)
 
 	if not args.get(budget_against_field):
 		args[budget_against_field] = budget_against
@@ -271,26 +361,42 @@
 
 	if existing_expense:
 		if budget_against_field == "cost_center":
-			make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", -existing_expense, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True)
+			make_journal_entry(
+				"_Test Account Cost for Goods Sold - _TC",
+				"_Test Bank - _TC",
+				-existing_expense,
+				"_Test Cost Center - _TC",
+				posting_date=nowdate(),
+				submit=True,
+			)
 		elif budget_against_field == "project":
-			make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", -existing_expense, "_Test Cost Center - _TC", submit=True, project=budget_against, posting_date=nowdate())
+			make_journal_entry(
+				"_Test Account Cost for Goods Sold - _TC",
+				"_Test Bank - _TC",
+				-existing_expense,
+				"_Test Cost Center - _TC",
+				submit=True,
+				project=budget_against,
+				posting_date=nowdate(),
+			)
+
 
 def make_budget(**args):
 	args = frappe._dict(args)
 
-	budget_against=args.budget_against
-	cost_center=args.cost_center
+	budget_against = args.budget_against
+	cost_center = args.cost_center
 
 	fiscal_year = get_fiscal_year(nowdate())[0]
 
 	if budget_against == "Project":
 		project_name = "{0}%".format("_Test Project/" + fiscal_year)
-		budget_list = frappe.get_all("Budget", fields=["name"], filters = {"name": ("like", project_name)})
+		budget_list = frappe.get_all("Budget", fields=["name"], filters={"name": ("like", project_name)})
 	else:
 		cost_center_name = "{0}%".format(cost_center or "_Test Cost Center - _TC/" + fiscal_year)
-		budget_list = frappe.get_all("Budget", fields=["name"], filters = {"name": ("like", cost_center_name)})
+		budget_list = frappe.get_all(
+			"Budget", fields=["name"], filters={"name": ("like", cost_center_name)}
+		)
 	for d in budget_list:
 		frappe.db.sql("delete from `tabBudget` where name = %(name)s", d)
 		frappe.db.sql("delete from `tabBudget Account` where parent = %(name)s", d)
@@ -300,7 +406,7 @@
 	if budget_against == "Project":
 		budget.project = frappe.get_value("Project", {"project_name": "_Test Project"})
 	else:
-		budget.cost_center =cost_center or "_Test Cost Center - _TC"
+		budget.cost_center = cost_center or "_Test Cost Center - _TC"
 
 	monthly_distribution = frappe.get_doc("Monthly Distribution", "_Test Distribution")
 	monthly_distribution.fiscal_year = fiscal_year
@@ -312,20 +418,27 @@
 	budget.action_if_annual_budget_exceeded = "Stop"
 	budget.action_if_accumulated_monthly_budget_exceeded = "Ignore"
 	budget.budget_against = budget_against
-	budget.append("accounts", {
-		"account": "_Test Account Cost for Goods Sold - _TC",
-		"budget_amount": 200000
-	})
+	budget.append(
+		"accounts", {"account": "_Test Account Cost for Goods Sold - _TC", "budget_amount": 200000}
+	)
 
 	if args.applicable_on_material_request:
 		budget.applicable_on_material_request = 1
-		budget.action_if_annual_budget_exceeded_on_mr = args.action_if_annual_budget_exceeded_on_mr or 'Warn'
-		budget.action_if_accumulated_monthly_budget_exceeded_on_mr = args.action_if_accumulated_monthly_budget_exceeded_on_mr or 'Warn'
+		budget.action_if_annual_budget_exceeded_on_mr = (
+			args.action_if_annual_budget_exceeded_on_mr or "Warn"
+		)
+		budget.action_if_accumulated_monthly_budget_exceeded_on_mr = (
+			args.action_if_accumulated_monthly_budget_exceeded_on_mr or "Warn"
+		)
 
 	if args.applicable_on_purchase_order:
 		budget.applicable_on_purchase_order = 1
-		budget.action_if_annual_budget_exceeded_on_po = args.action_if_annual_budget_exceeded_on_po or 'Warn'
-		budget.action_if_accumulated_monthly_budget_exceeded_on_po = args.action_if_accumulated_monthly_budget_exceeded_on_po or 'Warn'
+		budget.action_if_annual_budget_exceeded_on_po = (
+			args.action_if_annual_budget_exceeded_on_po or "Warn"
+		)
+		budget.action_if_accumulated_monthly_budget_exceeded_on_po = (
+			args.action_if_accumulated_monthly_budget_exceeded_on_po or "Warn"
+		)
 
 	budget.insert()
 	budget.submit()
diff --git a/erpnext/accounts/doctype/c_form/c_form.py b/erpnext/accounts/doctype/c_form/c_form.py
index 61331d3..0de75c7 100644
--- a/erpnext/accounts/doctype/c_form/c_form.py
+++ b/erpnext/accounts/doctype/c_form/c_form.py
@@ -11,28 +11,42 @@
 class CForm(Document):
 	def validate(self):
 		"""Validate invoice that c-form is applicable
-			and no other c-form is received for that"""
+		and no other c-form is received for that"""
 
-		for d in self.get('invoices'):
+		for d in self.get("invoices"):
 			if d.invoice_no:
-				inv = frappe.db.sql("""select c_form_applicable, c_form_no from
-					`tabSales Invoice` where name = %s and docstatus = 1""", d.invoice_no)
+				inv = frappe.db.sql(
+					"""select c_form_applicable, c_form_no from
+					`tabSales Invoice` where name = %s and docstatus = 1""",
+					d.invoice_no,
+				)
 
-				if inv and inv[0][0] != 'Yes':
+				if inv and inv[0][0] != "Yes":
 					frappe.throw(_("C-form is not applicable for Invoice: {0}").format(d.invoice_no))
 
 				elif inv and inv[0][1] and inv[0][1] != self.name:
-					frappe.throw(_("""Invoice {0} is tagged in another C-form: {1}.
+					frappe.throw(
+						_(
+							"""Invoice {0} is tagged in another C-form: {1}.
 						If you want to change C-form no for this invoice,
-						please remove invoice no from the previous c-form and then try again"""\
-						.format(d.invoice_no, inv[0][1])))
+						please remove invoice no from the previous c-form and then try again""".format(
+								d.invoice_no, inv[0][1]
+							)
+						)
+					)
 
 				elif not inv:
-					frappe.throw(_("Row {0}: Invoice {1} is invalid, it might be cancelled / does not exist. \
-						Please enter a valid Invoice".format(d.idx, d.invoice_no)))
+					frappe.throw(
+						_(
+							"Row {0}: Invoice {1} is invalid, it might be cancelled / does not exist. \
+						Please enter a valid Invoice".format(
+								d.idx, d.invoice_no
+							)
+						)
+					)
 
 	def on_update(self):
-		"""	Update C-Form No on invoices"""
+		"""Update C-Form No on invoices"""
 		self.set_total_invoiced_amount()
 
 	def on_submit(self):
@@ -43,30 +57,40 @@
 		frappe.db.sql("""update `tabSales Invoice` set c_form_no=null where c_form_no=%s""", self.name)
 
 	def set_cform_in_sales_invoices(self):
-		inv = [d.invoice_no for d in self.get('invoices')]
+		inv = [d.invoice_no for d in self.get("invoices")]
 		if inv:
-			frappe.db.sql("""update `tabSales Invoice` set c_form_no=%s, modified=%s where name in (%s)""" %
-				('%s', '%s', ', '.join(['%s'] * len(inv))), tuple([self.name, self.modified] + inv))
+			frappe.db.sql(
+				"""update `tabSales Invoice` set c_form_no=%s, modified=%s where name in (%s)"""
+				% ("%s", "%s", ", ".join(["%s"] * len(inv))),
+				tuple([self.name, self.modified] + inv),
+			)
 
-			frappe.db.sql("""update `tabSales Invoice` set c_form_no = null, modified = %s
-				where name not in (%s) and ifnull(c_form_no, '') = %s""" %
-				('%s', ', '.join(['%s']*len(inv)), '%s'), tuple([self.modified] + inv + [self.name]))
+			frappe.db.sql(
+				"""update `tabSales Invoice` set c_form_no = null, modified = %s
+				where name not in (%s) and ifnull(c_form_no, '') = %s"""
+				% ("%s", ", ".join(["%s"] * len(inv)), "%s"),
+				tuple([self.modified] + inv + [self.name]),
+			)
 		else:
 			frappe.throw(_("Please enter atleast 1 invoice in the table"))
 
 	def set_total_invoiced_amount(self):
-		total = sum(flt(d.grand_total) for d in self.get('invoices'))
-		frappe.db.set(self, 'total_invoiced_amount', total)
+		total = sum(flt(d.grand_total) for d in self.get("invoices"))
+		frappe.db.set(self, "total_invoiced_amount", total)
 
 	@frappe.whitelist()
 	def get_invoice_details(self, invoice_no):
-		"""	Pull details from invoices for referrence """
+		"""Pull details from invoices for referrence"""
 		if invoice_no:
-			inv = frappe.db.get_value("Sales Invoice", invoice_no,
-				["posting_date", "territory", "base_net_total", "base_grand_total"], as_dict=True)
+			inv = frappe.db.get_value(
+				"Sales Invoice",
+				invoice_no,
+				["posting_date", "territory", "base_net_total", "base_grand_total"],
+				as_dict=True,
+			)
 			return {
-				'invoice_date' : inv.posting_date,
-				'territory'    : inv.territory,
-				'net_total'    : inv.base_net_total,
-				'grand_total'  : inv.base_grand_total
+				"invoice_date": inv.posting_date,
+				"territory": inv.territory,
+				"net_total": inv.base_net_total,
+				"grand_total": inv.base_grand_total,
 			}
diff --git a/erpnext/accounts/doctype/c_form/test_c_form.py b/erpnext/accounts/doctype/c_form/test_c_form.py
index fa34c25..87ad60f 100644
--- a/erpnext/accounts/doctype/c_form/test_c_form.py
+++ b/erpnext/accounts/doctype/c_form/test_c_form.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('C-Form')
 
+
 class TestCForm(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/cash_flow_mapper/default_cash_flow_mapper.py b/erpnext/accounts/doctype/cash_flow_mapper/default_cash_flow_mapper.py
index 6e7b687..79feb2d 100644
--- a/erpnext/accounts/doctype/cash_flow_mapper/default_cash_flow_mapper.py
+++ b/erpnext/accounts/doctype/cash_flow_mapper/default_cash_flow_mapper.py
@@ -1,25 +1,25 @@
 DEFAULT_MAPPERS = [
-    {
-        'doctype': 'Cash Flow Mapper',
-        'section_footer': 'Net cash generated by operating activities',
-        'section_header': 'Cash flows from operating activities',
-        'section_leader': 'Adjustments for',
-        'section_name': 'Operating Activities',
-        'position': 0,
-        'section_subtotal': 'Cash generated from operations',
-    },
-    {
-        'doctype': 'Cash Flow Mapper',
-        'position': 1,
-        'section_footer': 'Net cash used in investing activities',
-        'section_header': 'Cash flows from investing activities',
-        'section_name': 'Investing Activities'
-    },
-    {
-        'doctype': 'Cash Flow Mapper',
-        'position': 2,
-        'section_footer': 'Net cash used in financing activites',
-        'section_header': 'Cash flows from financing activities',
-        'section_name': 'Financing Activities',
-    }
+	{
+		"doctype": "Cash Flow Mapper",
+		"section_footer": "Net cash generated by operating activities",
+		"section_header": "Cash flows from operating activities",
+		"section_leader": "Adjustments for",
+		"section_name": "Operating Activities",
+		"position": 0,
+		"section_subtotal": "Cash generated from operations",
+	},
+	{
+		"doctype": "Cash Flow Mapper",
+		"position": 1,
+		"section_footer": "Net cash used in investing activities",
+		"section_header": "Cash flows from investing activities",
+		"section_name": "Investing Activities",
+	},
+	{
+		"doctype": "Cash Flow Mapper",
+		"position": 2,
+		"section_footer": "Net cash used in financing activites",
+		"section_header": "Cash flows from financing activities",
+		"section_name": "Financing Activities",
+	},
 ]
diff --git a/erpnext/accounts/doctype/cash_flow_mapping/cash_flow_mapping.py b/erpnext/accounts/doctype/cash_flow_mapping/cash_flow_mapping.py
index cd8381a..3bce4d5 100644
--- a/erpnext/accounts/doctype/cash_flow_mapping/cash_flow_mapping.py
+++ b/erpnext/accounts/doctype/cash_flow_mapping/cash_flow_mapping.py
@@ -11,9 +11,11 @@
 		self.validate_checked_options()
 
 	def validate_checked_options(self):
-		checked_fields = [d for d in self.meta.fields if d.fieldtype == 'Check' and self.get(d.fieldname) == 1]
+		checked_fields = [
+			d for d in self.meta.fields if d.fieldtype == "Check" and self.get(d.fieldname) == 1
+		]
 		if len(checked_fields) > 1:
 			frappe.throw(
-				frappe._('You can only select a maximum of one option from the list of check boxes.'),
-				title='Error'
+				frappe._("You can only select a maximum of one option from the list of check boxes."),
+				title="Error",
 			)
diff --git a/erpnext/accounts/doctype/cash_flow_mapping/test_cash_flow_mapping.py b/erpnext/accounts/doctype/cash_flow_mapping/test_cash_flow_mapping.py
index abb2567..19f2425 100644
--- a/erpnext/accounts/doctype/cash_flow_mapping/test_cash_flow_mapping.py
+++ b/erpnext/accounts/doctype/cash_flow_mapping/test_cash_flow_mapping.py
@@ -9,19 +9,16 @@
 class TestCashFlowMapping(unittest.TestCase):
 	def setUp(self):
 		if frappe.db.exists("Cash Flow Mapping", "Test Mapping"):
-			frappe.delete_doc('Cash Flow Mappping', 'Test Mapping')
+			frappe.delete_doc("Cash Flow Mappping", "Test Mapping")
 
 	def tearDown(self):
-		frappe.delete_doc('Cash Flow Mapping', 'Test Mapping')
+		frappe.delete_doc("Cash Flow Mapping", "Test Mapping")
 
 	def test_multiple_selections_not_allowed(self):
-		doc = frappe.new_doc('Cash Flow Mapping')
-		doc.mapping_name = 'Test Mapping'
-		doc.label = 'Test label'
-		doc.append(
-			'accounts',
-			{'account': 'Accounts Receivable - _TC'}
-		)
+		doc = frappe.new_doc("Cash Flow Mapping")
+		doc.mapping_name = "Test Mapping"
+		doc.label = "Test label"
+		doc.append("accounts", {"account": "Accounts Receivable - _TC"})
 		doc.is_working_capital = 1
 		doc.is_finance_cost = 1
 
diff --git a/erpnext/accounts/doctype/cashier_closing/cashier_closing.py b/erpnext/accounts/doctype/cashier_closing/cashier_closing.py
index 9fbd0c9..6013807 100644
--- a/erpnext/accounts/doctype/cashier_closing/cashier_closing.py
+++ b/erpnext/accounts/doctype/cashier_closing/cashier_closing.py
@@ -17,11 +17,14 @@
 		self.make_calculations()
 
 	def get_outstanding(self):
-		values = frappe.db.sql("""
+		values = frappe.db.sql(
+			"""
 			select sum(outstanding_amount)
 			from `tabSales Invoice`
 			where posting_date=%s and posting_time>=%s and posting_time<=%s and owner=%s
-		""", (self.date, self.from_time, self.time, self.user))
+		""",
+			(self.date, self.from_time, self.time, self.user),
+		)
 		self.outstanding_amount = flt(values[0][0] if values else 0)
 
 	def make_calculations(self):
@@ -29,7 +32,9 @@
 		for i in self.payments:
 			total += flt(i.amount)
 
-		self.net_amount = total + self.outstanding_amount + flt(self.expense) - flt(self.custody) + flt(self.returns)
+		self.net_amount = (
+			total + self.outstanding_amount + flt(self.expense) - flt(self.custody) + flt(self.returns)
+		)
 
 	def validate_time(self):
 		if self.from_time >= self.time:
diff --git a/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py b/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py
index aaacce4..01bf1c2 100644
--- a/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py
+++ b/erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py
@@ -25,33 +25,41 @@
 class ChartofAccountsImporter(Document):
 	def validate(self):
 		if self.import_file:
-			get_coa('Chart of Accounts Importer', 'All Accounts', file_name=self.import_file, for_validate=1)
+			get_coa(
+				"Chart of Accounts Importer", "All Accounts", file_name=self.import_file, for_validate=1
+			)
+
 
 def validate_columns(data):
 	if not data:
-		frappe.throw(_('No data found. Seems like you uploaded a blank file'))
+		frappe.throw(_("No data found. Seems like you uploaded a blank file"))
 
 	no_of_columns = max([len(d) for d in data])
 
 	if no_of_columns > 7:
-		frappe.throw(_('More columns found than expected. Please compare the uploaded file with standard template'),
-			title=(_("Wrong Template")))
+		frappe.throw(
+			_("More columns found than expected. Please compare the uploaded file with standard template"),
+			title=(_("Wrong Template")),
+		)
+
 
 @frappe.whitelist()
 def validate_company(company):
-	parent_company, allow_account_creation_against_child_company = frappe.db.get_value('Company',
-		{'name': company}, ['parent_company',
-		'allow_account_creation_against_child_company'])
+	parent_company, allow_account_creation_against_child_company = frappe.db.get_value(
+		"Company", {"name": company}, ["parent_company", "allow_account_creation_against_child_company"]
+	)
 
 	if parent_company and (not allow_account_creation_against_child_company):
 		msg = _("{} is a child company.").format(frappe.bold(company)) + " "
 		msg += _("Please import accounts against parent company or enable {} in company master.").format(
-			frappe.bold('Allow Account Creation Against Child Company'))
-		frappe.throw(msg, title=_('Wrong Company'))
+			frappe.bold("Allow Account Creation Against Child Company")
+		)
+		frappe.throw(msg, title=_("Wrong Company"))
 
-	if frappe.db.get_all('GL Entry', {"company": company}, "name", limit=1):
+	if frappe.db.get_all("GL Entry", {"company": company}, "name", limit=1):
 		return False
 
+
 @frappe.whitelist()
 def import_coa(file_name, company):
 	# delete existing data for accounts
@@ -60,7 +68,7 @@
 	# create accounts
 	file_doc, extension = get_file(file_name)
 
-	if extension  == 'csv':
+	if extension == "csv":
 		data = generate_data_from_csv(file_doc)
 	else:
 		data = generate_data_from_excel(file_doc, extension)
@@ -72,27 +80,33 @@
 	# trigger on_update for company to reset default accounts
 	set_default_accounts(company)
 
+
 def get_file(file_name):
 	file_doc = frappe.get_doc("File", {"file_url": file_name})
 	parts = file_doc.get_extension()
 	extension = parts[1]
 	extension = extension.lstrip(".")
 
-	if extension not in ('csv',  'xlsx', 'xls'):
-		frappe.throw(_("Only CSV and Excel files can be used to for importing data. Please check the file format you are trying to upload"))
+	if extension not in ("csv", "xlsx", "xls"):
+		frappe.throw(
+			_(
+				"Only CSV and Excel files can be used to for importing data. Please check the file format you are trying to upload"
+			)
+		)
 
-	return  file_doc, extension
+	return file_doc, extension
+
 
 def generate_data_from_csv(file_doc, as_dict=False):
-	''' read csv file and return the generated nested tree '''
+	"""read csv file and return the generated nested tree"""
 
 	file_path = file_doc.get_full_path()
 
 	data = []
-	with open(file_path, 'r') as in_file:
+	with open(file_path, "r") as in_file:
 		csv_reader = list(csv.reader(in_file))
 		headers = csv_reader[0]
-		del csv_reader[0] # delete top row and headers row
+		del csv_reader[0]  # delete top row and headers row
 
 		for row in csv_reader:
 			if as_dict:
@@ -106,6 +120,7 @@
 	# convert csv data
 	return data
 
+
 def generate_data_from_excel(file_doc, extension, as_dict=False):
 	content = file_doc.get_content()
 
@@ -123,20 +138,21 @@
 			data.append({frappe.scrub(header): row[index] for index, header in enumerate(headers)})
 		else:
 			if not row[1]:
-					row[1] = row[0]
-					row[3] = row[2]
+				row[1] = row[0]
+				row[3] = row[2]
 			data.append(row)
 
 	return data
 
+
 @frappe.whitelist()
 def get_coa(doctype, parent, is_root=False, file_name=None, for_validate=0):
-	''' called by tree view (to fetch node's children) '''
+	"""called by tree view (to fetch node's children)"""
 
 	file_doc, extension = get_file(file_name)
-	parent = None if parent==_('All Accounts') else parent
+	parent = None if parent == _("All Accounts") else parent
 
-	if extension  == 'csv':
+	if extension == "csv":
 		data = generate_data_from_csv(file_doc)
 	else:
 		data = generate_data_from_excel(file_doc, extension)
@@ -146,32 +162,33 @@
 
 	if not for_validate:
 		forest = build_forest(data)
-		accounts = build_tree_from_json("", chart_data=forest, from_coa_importer=True) # returns a list of dict in a tree render-able form
+		accounts = build_tree_from_json(
+			"", chart_data=forest, from_coa_importer=True
+		)  # returns a list of dict in a tree render-able form
 
 		# filter out to show data for the selected node only
-		accounts = [d for d in accounts if d['parent_account']==parent]
+		accounts = [d for d in accounts if d["parent_account"] == parent]
 
 		return accounts
 	else:
-		return {
-			'show_import_button': 1
-		}
+		return {"show_import_button": 1}
+
 
 def build_forest(data):
-	'''
-		converts list of list into a nested tree
-		if a = [[1,1], [1,2], [3,2], [4,4], [5,4]]
-		tree = {
-			1: {
-				2: {
-					3: {}
-				}
-			},
-			4: {
-				5: {}
-			}
-		}
-	'''
+	"""
+	converts list of list into a nested tree
+	if a = [[1,1], [1,2], [3,2], [4,4], [5,4]]
+	tree = {
+	        1: {
+	                2: {
+	                        3: {}
+	                }
+	        },
+	        4: {
+	                5: {}
+	        }
+	}
+	"""
 
 	# set the value of nested dictionary
 	def set_nested(d, path, value):
@@ -195,8 +212,11 @@
 			elif account_name == child:
 				parent_account_list = return_parent(data, parent_account)
 				if not parent_account_list and parent_account:
-					frappe.throw(_("The parent account {0} does not exists in the uploaded template").format(
-						frappe.bold(parent_account)))
+					frappe.throw(
+						_("The parent account {0} does not exists in the uploaded template").format(
+							frappe.bold(parent_account)
+						)
+					)
 				return [child] + parent_account_list
 
 	charts_map, paths = {}, []
@@ -205,7 +225,15 @@
 	error_messages = []
 
 	for i in data:
-		account_name, parent_account, account_number, parent_account_number, is_group, account_type, root_type = i
+		(
+			account_name,
+			parent_account,
+			account_number,
+			parent_account_number,
+			is_group,
+			account_type,
+			root_type,
+		) = i
 
 		if not account_name:
 			error_messages.append("Row {0}: Please enter Account Name".format(line_no))
@@ -216,13 +244,17 @@
 			account_name = "{} - {}".format(account_number, account_name)
 
 		charts_map[account_name] = {}
-		charts_map[account_name]['account_name'] = name
-		if account_number: charts_map[account_name]["account_number"] = account_number
-		if cint(is_group) == 1: charts_map[account_name]["is_group"] = is_group
-		if account_type: charts_map[account_name]["account_type"] = account_type
-		if root_type: charts_map[account_name]["root_type"] = root_type
+		charts_map[account_name]["account_name"] = name
+		if account_number:
+			charts_map[account_name]["account_number"] = account_number
+		if cint(is_group) == 1:
+			charts_map[account_name]["is_group"] = is_group
+		if account_type:
+			charts_map[account_name]["account_type"] = account_type
+		if root_type:
+			charts_map[account_name]["root_type"] = root_type
 		path = return_parent(data, account_name)[::-1]
-		paths.append(path) # List of path is created
+		paths.append(path)  # List of path is created
 		line_no += 1
 
 	if error_messages:
@@ -231,27 +263,32 @@
 	out = {}
 	for path in paths:
 		for n, account_name in enumerate(path):
-			set_nested(out, path[:n+1], charts_map[account_name]) # setting the value of nested dictionary.
+			set_nested(
+				out, path[: n + 1], charts_map[account_name]
+			)  # setting the value of nested dictionary.
 
 	return out
 
+
 def build_response_as_excel(writer):
 	filename = frappe.generate_hash("", 10)
-	with open(filename, 'wb') as f:
-		f.write(cstr(writer.getvalue()).encode('utf-8'))
+	with open(filename, "wb") as f:
+		f.write(cstr(writer.getvalue()).encode("utf-8"))
 	f = open(filename)
 	reader = csv.reader(f)
 
 	from frappe.utils.xlsxutils import make_xlsx
+
 	xlsx_file = make_xlsx(reader, "Chart of Accounts Importer Template")
 
 	f.close()
 	os.remove(filename)
 
 	# write out response as a xlsx type
-	frappe.response['filename'] = 'coa_importer_template.xlsx'
-	frappe.response['filecontent'] = xlsx_file.getvalue()
-	frappe.response['type'] = 'binary'
+	frappe.response["filename"] = "coa_importer_template.xlsx"
+	frappe.response["filecontent"] = xlsx_file.getvalue()
+	frappe.response["type"] = "binary"
+
 
 @frappe.whitelist()
 def download_template(file_type, template_type):
@@ -259,34 +296,46 @@
 
 	writer = get_template(template_type)
 
-	if file_type == 'CSV':
+	if file_type == "CSV":
 		# download csv file
-		frappe.response['result'] = cstr(writer.getvalue())
-		frappe.response['type'] = 'csv'
-		frappe.response['doctype'] = 'Chart of Accounts Importer'
+		frappe.response["result"] = cstr(writer.getvalue())
+		frappe.response["type"] = "csv"
+		frappe.response["doctype"] = "Chart of Accounts Importer"
 	else:
 		build_response_as_excel(writer)
 
+
 def get_template(template_type):
 
-	fields = ["Account Name", "Parent Account", "Account Number", "Parent Account Number", "Is Group", "Account Type", "Root Type"]
+	fields = [
+		"Account Name",
+		"Parent Account",
+		"Account Number",
+		"Parent Account Number",
+		"Is Group",
+		"Account Type",
+		"Root Type",
+	]
 	writer = UnicodeWriter()
 	writer.writerow(fields)
 
-	if template_type == 'Blank Template':
-		for root_type in  get_root_types():
-			writer.writerow(['', '', '', 1, '', root_type])
+	if template_type == "Blank Template":
+		for root_type in get_root_types():
+			writer.writerow(["", "", "", 1, "", root_type])
 
 		for account in get_mandatory_group_accounts():
-			writer.writerow(['', '', '', 1, account, "Asset"])
+			writer.writerow(["", "", "", 1, account, "Asset"])
 
 		for account_type in get_mandatory_account_types():
-			writer.writerow(['', '', '', 0, account_type.get('account_type'), account_type.get('root_type')])
+			writer.writerow(
+				["", "", "", 0, account_type.get("account_type"), account_type.get("root_type")]
+			)
 	else:
 		writer = get_sample_template(writer)
 
 	return writer
 
+
 def get_sample_template(writer):
 	template = [
 		["Application Of Funds(Assets)", "", "", "", 1, "", "Asset"],
@@ -316,7 +365,7 @@
 
 @frappe.whitelist()
 def validate_accounts(file_doc, extension):
-	if extension  == 'csv':
+	if extension == "csv":
 		accounts = generate_data_from_csv(file_doc, as_dict=True)
 	else:
 		accounts = generate_data_from_excel(file_doc, extension, as_dict=True)
@@ -325,7 +374,9 @@
 	for account in accounts:
 		accounts_dict.setdefault(account["account_name"], account)
 		if "parent_account" not in account:
-			msg = _("Please make sure the file you are using has 'Parent Account' column present in the header.")
+			msg = _(
+				"Please make sure the file you are using has 'Parent Account' column present in the header."
+			)
 			msg += "<br><br>"
 			msg += _("Alternatively, you can download the template and fill your data in.")
 			frappe.throw(msg, title=_("Parent Account Missing"))
@@ -336,77 +387,106 @@
 
 	return [True, len(accounts)]
 
+
 def validate_root(accounts):
-	roots = [accounts[d] for d in accounts if not accounts[d].get('parent_account')]
+	roots = [accounts[d] for d in accounts if not accounts[d].get("parent_account")]
 	error_messages = []
 
 	for account in roots:
 		if not account.get("root_type") and account.get("account_name"):
-			error_messages.append(_("Please enter Root Type for account- {0}").format(account.get("account_name")))
+			error_messages.append(
+				_("Please enter Root Type for account- {0}").format(account.get("account_name"))
+			)
 		elif account.get("root_type") not in get_root_types() and account.get("account_name"):
-			error_messages.append(_("Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity").format(account.get("account_name")))
+			error_messages.append(
+				_("Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity").format(
+					account.get("account_name")
+				)
+			)
 
 	validate_missing_roots(roots)
 
 	if error_messages:
 		frappe.throw("<br>".join(error_messages))
 
+
 def validate_missing_roots(roots):
-	root_types_added = set(d.get('root_type') for d in roots)
+	root_types_added = set(d.get("root_type") for d in roots)
 
 	missing = list(set(get_root_types()) - root_types_added)
 
 	if missing:
-		frappe.throw(_("Please add Root Account for - {0}").format(' , '.join(missing)))
+		frappe.throw(_("Please add Root Account for - {0}").format(" , ".join(missing)))
+
 
 def get_root_types():
-	return ('Asset', 'Liability', 'Expense', 'Income', 'Equity')
+	return ("Asset", "Liability", "Expense", "Income", "Equity")
+
 
 def get_report_type(root_type):
-	if root_type in ('Asset', 'Liability', 'Equity'):
-		return 'Balance Sheet'
+	if root_type in ("Asset", "Liability", "Equity"):
+		return "Balance Sheet"
 	else:
-		return 'Profit and Loss'
+		return "Profit and Loss"
+
 
 def get_mandatory_group_accounts():
-	return ('Bank', 'Cash', 'Stock')
+	return ("Bank", "Cash", "Stock")
+
 
 def get_mandatory_account_types():
 	return [
-		{'account_type': 'Cost of Goods Sold', 'root_type': 'Expense'},
-		{'account_type': 'Depreciation', 'root_type': 'Expense'},
-		{'account_type': 'Fixed Asset', 'root_type': 'Asset'},
-		{'account_type': 'Payable', 'root_type': 'Liability'},
-		{'account_type': 'Receivable', 'root_type': 'Asset'},
-		{'account_type': 'Stock Adjustment', 'root_type': 'Expense'},
-		{'account_type': 'Bank', 'root_type': 'Asset'},
-		{'account_type': 'Cash', 'root_type': 'Asset'},
-		{'account_type': 'Stock', 'root_type': 'Asset'}
+		{"account_type": "Cost of Goods Sold", "root_type": "Expense"},
+		{"account_type": "Depreciation", "root_type": "Expense"},
+		{"account_type": "Fixed Asset", "root_type": "Asset"},
+		{"account_type": "Payable", "root_type": "Liability"},
+		{"account_type": "Receivable", "root_type": "Asset"},
+		{"account_type": "Stock Adjustment", "root_type": "Expense"},
+		{"account_type": "Bank", "root_type": "Asset"},
+		{"account_type": "Cash", "root_type": "Asset"},
+		{"account_type": "Stock", "root_type": "Asset"},
 	]
 
+
 def unset_existing_data(company):
-	linked = frappe.db.sql('''select fieldname from tabDocField
-		where fieldtype="Link" and options="Account" and parent="Company"''', as_dict=True)
+	linked = frappe.db.sql(
+		'''select fieldname from tabDocField
+		where fieldtype="Link" and options="Account" and parent="Company"''',
+		as_dict=True,
+	)
 
 	# remove accounts data from company
-	update_values = {d.fieldname: '' for d in linked}
-	frappe.db.set_value('Company', company, update_values, update_values)
+	update_values = {d.fieldname: "" for d in linked}
+	frappe.db.set_value("Company", company, update_values, update_values)
 
 	# remove accounts data from various doctypes
-	for doctype in ["Account", "Party Account", "Mode of Payment Account", "Tax Withholding Account",
-		"Sales Taxes and Charges Template", "Purchase Taxes and Charges Template"]:
-		frappe.db.sql('''delete from `tab{0}` where `company`="%s"''' # nosec
-			.format(doctype) % (company))
+	for doctype in [
+		"Account",
+		"Party Account",
+		"Mode of Payment Account",
+		"Tax Withholding Account",
+		"Sales Taxes and Charges Template",
+		"Purchase Taxes and Charges Template",
+	]:
+		frappe.db.sql(
+			'''delete from `tab{0}` where `company`="%s"'''.format(doctype) % (company)  # nosec
+		)
+
 
 def set_default_accounts(company):
 	from erpnext.setup.doctype.company.company import install_country_fixtures
-	company = frappe.get_doc('Company', company)
-	company.update({
-		"default_receivable_account": frappe.db.get_value("Account",
-			{"company": company.name, "account_type": "Receivable", "is_group": 0}),
-		"default_payable_account": frappe.db.get_value("Account",
-			{"company": company.name, "account_type": "Payable", "is_group": 0})
-	})
+
+	company = frappe.get_doc("Company", company)
+	company.update(
+		{
+			"default_receivable_account": frappe.db.get_value(
+				"Account", {"company": company.name, "account_type": "Receivable", "is_group": 0}
+			),
+			"default_payable_account": frappe.db.get_value(
+				"Account", {"company": company.name, "account_type": "Payable", "is_group": 0}
+			),
+		}
+	)
 
 	company.save()
 	install_country_fixtures(company.name, company.country)
diff --git a/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py b/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py
index 20cb42c..f8ac664 100644
--- a/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py
+++ b/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py
@@ -10,17 +10,20 @@
 class ChequePrintTemplate(Document):
 	pass
 
+
 @frappe.whitelist()
 def create_or_update_cheque_print_format(template_name):
 	if not frappe.db.exists("Print Format", template_name):
 		cheque_print = frappe.new_doc("Print Format")
-		cheque_print.update({
-			"doc_type": "Payment Entry",
-			"standard": "No",
-			"custom_format": 1,
-			"print_format_type": "Jinja",
-			"name": template_name
-		})
+		cheque_print.update(
+			{
+				"doc_type": "Payment Entry",
+				"standard": "No",
+				"custom_format": 1,
+				"print_format_type": "Jinja",
+				"name": template_name,
+			}
+		)
 	else:
 		cheque_print = frappe.get_doc("Print Format", template_name)
 
@@ -69,10 +72,12 @@
 			{{doc.company}}
 		</span>
 	</div>
-</div>"""%{
-		"starting_position_from_top_edge": doc.starting_position_from_top_edge \
-			if doc.cheque_size == "A4" else 0.0,
-		"cheque_width": doc.cheque_width, "cheque_height": doc.cheque_height,
+</div>""" % {
+		"starting_position_from_top_edge": doc.starting_position_from_top_edge
+		if doc.cheque_size == "A4"
+		else 0.0,
+		"cheque_width": doc.cheque_width,
+		"cheque_height": doc.cheque_height,
 		"acc_pay_dist_from_top_edge": doc.acc_pay_dist_from_top_edge,
 		"acc_pay_dist_from_left_edge": doc.acc_pay_dist_from_left_edge,
 		"message_to_show": doc.message_to_show if doc.message_to_show else _("Account Pay Only"),
@@ -89,7 +94,7 @@
 		"amt_in_figures_from_top_edge": doc.amt_in_figures_from_top_edge,
 		"amt_in_figures_from_left_edge": doc.amt_in_figures_from_left_edge,
 		"signatory_from_top_edge": doc.signatory_from_top_edge,
-		"signatory_from_left_edge": doc.signatory_from_left_edge
+		"signatory_from_left_edge": doc.signatory_from_left_edge,
 	}
 
 	cheque_print.save(ignore_permissions=True)
diff --git a/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py b/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py
index 2b323a9..9b003ce 100644
--- a/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py
+++ b/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Cheque Print Template')
 
+
 class TestChequePrintTemplate(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py
index 07cc076..31055c3 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center.py
@@ -10,11 +10,14 @@
 
 
 class CostCenter(NestedSet):
-	nsm_parent_field = 'parent_cost_center'
+	nsm_parent_field = "parent_cost_center"
 
 	def autoname(self):
 		from erpnext.accounts.utils import get_autoname_with_number
-		self.name = get_autoname_with_number(self.cost_center_number, self.cost_center_name, None, self.company)
+
+		self.name = get_autoname_with_number(
+			self.cost_center_number, self.cost_center_name, None, self.company
+		)
 
 	def validate(self):
 		self.validate_mandatory()
@@ -28,9 +31,12 @@
 
 	def validate_parent_cost_center(self):
 		if self.parent_cost_center:
-			if not frappe.db.get_value('Cost Center', self.parent_cost_center, 'is_group'):
-				frappe.throw(_("{0} is not a group node. Please select a group node as parent cost center").format(
-					frappe.bold(self.parent_cost_center)))
+			if not frappe.db.get_value("Cost Center", self.parent_cost_center, "is_group"):
+				frappe.throw(
+					_("{0} is not a group node. Please select a group node as parent cost center").format(
+						frappe.bold(self.parent_cost_center)
+					)
+				)
 
 	@frappe.whitelist()
 	def convert_group_to_ledger(self):
@@ -48,7 +54,9 @@
 		if self.if_allocation_exists_against_cost_center():
 			frappe.throw(_("Cost Center with Allocation records can not be converted to a group"))
 		if self.check_if_part_of_cost_center_allocation():
-			frappe.throw(_("Cost Center is a part of Cost Center Allocation, hence cannot be converted to a group"))
+			frappe.throw(
+				_("Cost Center is a part of Cost Center Allocation, hence cannot be converted to a group")
+			)
 		if self.check_gle_exists():
 			frappe.throw(_("Cost Center with existing transactions can not be converted to group"))
 		self.is_group = 1
@@ -59,24 +67,26 @@
 		return frappe.db.get_value("GL Entry", {"cost_center": self.name})
 
 	def check_if_child_exists(self):
-		return frappe.db.sql("select name from `tabCost Center` where \
-			parent_cost_center = %s and docstatus != 2", self.name)
+		return frappe.db.sql(
+			"select name from `tabCost Center` where \
+			parent_cost_center = %s and docstatus != 2",
+			self.name,
+		)
 
 	def if_allocation_exists_against_cost_center(self):
-		return frappe.db.get_value("Cost Center Allocation", filters = {
-			"main_cost_center": self.name,
-			"docstatus": 1
-		})
+		return frappe.db.get_value(
+			"Cost Center Allocation", filters={"main_cost_center": self.name, "docstatus": 1}
+		)
 
 	def check_if_part_of_cost_center_allocation(self):
-		return frappe.db.get_value("Cost Center Allocation Percentage", filters = {
-			"cost_center": self.name,
-			"docstatus": 1
-		})
+		return frappe.db.get_value(
+			"Cost Center Allocation Percentage", filters={"cost_center": self.name, "docstatus": 1}
+		)
 
 	def before_rename(self, olddn, newdn, merge=False):
 		# Add company abbr if not provided
 		from erpnext.setup.doctype.company.company import get_name_with_abbr
+
 		new_cost_center = get_name_with_abbr(newdn, self.company)
 
 		# Validate properties before merging
@@ -90,7 +100,9 @@
 		super(CostCenter, self).after_rename(olddn, newdn, merge)
 
 		if not merge:
-			new_cost_center = frappe.db.get_value("Cost Center", newdn, ["cost_center_name", "cost_center_number"], as_dict=1)
+			new_cost_center = frappe.db.get_value(
+				"Cost Center", newdn, ["cost_center_name", "cost_center_number"], as_dict=1
+			)
 
 			# exclude company abbr
 			new_parts = newdn.split(" - ")[:-1]
@@ -99,7 +111,9 @@
 				if len(new_parts) == 1:
 					new_parts = newdn.split(" ")
 				if new_cost_center.cost_center_number != new_parts[0]:
-					validate_field_number("Cost Center", self.name, new_parts[0], self.company, "cost_center_number")
+					validate_field_number(
+						"Cost Center", self.name, new_parts[0], self.company, "cost_center_number"
+					)
 					self.cost_center_number = new_parts[0]
 					self.db_set("cost_center_number", new_parts[0])
 				new_parts = new_parts[1:]
@@ -110,10 +124,12 @@
 				self.cost_center_name = cost_center_name
 				self.db_set("cost_center_name", cost_center_name)
 
+
 def on_doctype_update():
 	frappe.db.add_index("Cost Center", ["lft", "rgt"])
 
+
 def get_name_with_number(new_account, account_number):
 	if account_number and not new_account[0].isdigit():
 		new_account = account_number + " - " + new_account
-	return new_account
\ No newline at end of file
+	return new_account
diff --git a/erpnext/accounts/doctype/cost_center/cost_center_dashboard.py b/erpnext/accounts/doctype/cost_center/cost_center_dashboard.py
index f524803..5059dc3 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center_dashboard.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'cost_center',
-		'reports': [
-			{
-				'label': _('Reports'),
-				'items': ['Budget Variance Report', 'General Ledger']
-			}
-		]
+		"fieldname": "cost_center",
+		"reports": [{"label": _("Reports"), "items": ["Budget Variance Report", "General Ledger"]}],
 	}
diff --git a/erpnext/accounts/doctype/cost_center/test_cost_center.py b/erpnext/accounts/doctype/cost_center/test_cost_center.py
index ff50a21..2ec1609 100644
--- a/erpnext/accounts/doctype/cost_center/test_cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/test_cost_center.py
@@ -5,24 +5,28 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Cost Center')
+test_records = frappe.get_test_records("Cost Center")
+
 
 class TestCostCenter(unittest.TestCase):
 	def test_cost_center_creation_against_child_node(self):
 
-		if not frappe.db.get_value('Cost Center', {'name': '_Test Cost Center 2 - _TC'}):
+		if not frappe.db.get_value("Cost Center", {"name": "_Test Cost Center 2 - _TC"}):
 			frappe.get_doc(test_records[1]).insert()
 
-		cost_center = frappe.get_doc({
-			'doctype': 'Cost Center',
-			'cost_center_name': '_Test Cost Center 3',
-			'parent_cost_center': '_Test Cost Center 2 - _TC',
-			'is_group': 0,
-			'company': '_Test Company'
-		})
+		cost_center = frappe.get_doc(
+			{
+				"doctype": "Cost Center",
+				"cost_center_name": "_Test Cost Center 3",
+				"parent_cost_center": "_Test Cost Center 2 - _TC",
+				"is_group": 0,
+				"company": "_Test Company",
+			}
+		)
 
 		self.assertRaises(frappe.ValidationError, cost_center.save)
 
+
 def create_cost_center(**args):
 	args = frappe._dict(args)
 	if args.cost_center_name:
diff --git a/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py b/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py
index bad3fb4..d25016f 100644
--- a/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py
+++ b/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py
@@ -9,15 +9,24 @@
 
 class MainCostCenterCantBeChild(frappe.ValidationError):
 	pass
+
+
 class InvalidMainCostCenter(frappe.ValidationError):
 	pass
+
+
 class InvalidChildCostCenter(frappe.ValidationError):
 	pass
+
+
 class WrongPercentageAllocation(frappe.ValidationError):
 	pass
+
+
 class InvalidDateError(frappe.ValidationError):
 	pass
 
+
 class CostCenterAllocation(Document):
 	def validate(self):
 		self.validate_total_allocation_percentage()
@@ -30,61 +39,96 @@
 		total_percentage = sum([d.percentage for d in self.get("allocation_percentages", [])])
 
 		if total_percentage != 100:
-			frappe.throw(_("Total percentage against cost centers should be 100"), WrongPercentageAllocation)
+			frappe.throw(
+				_("Total percentage against cost centers should be 100"), WrongPercentageAllocation
+			)
 
 	def validate_from_date_based_on_existing_gle(self):
 		# Check if GLE exists against the main cost center
 		# If exists ensure from date is set after posting date of last GLE
 
-		last_gle_date = frappe.db.get_value("GL Entry",
+		last_gle_date = frappe.db.get_value(
+			"GL Entry",
 			{"cost_center": self.main_cost_center, "is_cancelled": 0},
-			"posting_date", order_by="posting_date desc")
+			"posting_date",
+			order_by="posting_date desc",
+		)
 
 		if last_gle_date:
 			if getdate(self.valid_from) <= getdate(last_gle_date):
-				frappe.throw(_("Valid From must be after {0} as last GL Entry against the cost center {1} posted on this date")
-					.format(last_gle_date, self.main_cost_center), InvalidDateError)
+				frappe.throw(
+					_(
+						"Valid From must be after {0} as last GL Entry against the cost center {1} posted on this date"
+					).format(last_gle_date, self.main_cost_center),
+					InvalidDateError,
+				)
 
 	def validate_backdated_allocation(self):
 		# Check if there are any future existing allocation records against the main cost center
 		# If exists, warn the user about it
 
-		future_allocation = frappe.db.get_value("Cost Center Allocation", filters = {
-			"main_cost_center": self.main_cost_center,
-			"valid_from": (">=", self.valid_from),
-			"name": ("!=", self.name),
-			"docstatus": 1
-		}, fieldname=['valid_from', 'name'], order_by='valid_from', as_dict=1)
+		future_allocation = frappe.db.get_value(
+			"Cost Center Allocation",
+			filters={
+				"main_cost_center": self.main_cost_center,
+				"valid_from": (">=", self.valid_from),
+				"name": ("!=", self.name),
+				"docstatus": 1,
+			},
+			fieldname=["valid_from", "name"],
+			order_by="valid_from",
+			as_dict=1,
+		)
 
 		if future_allocation:
-			frappe.msgprint(_("Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}")
-				.format(frappe.bold(future_allocation.name), frappe.bold(format_date(future_allocation.valid_from)),
-				frappe.bold(format_date(add_days(future_allocation.valid_from, -1)))),
-				title=_("Warning!"), indicator="orange", alert=1
+			frappe.msgprint(
+				_(
+					"Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}"
+				).format(
+					frappe.bold(future_allocation.name),
+					frappe.bold(format_date(future_allocation.valid_from)),
+					frappe.bold(format_date(add_days(future_allocation.valid_from, -1))),
+				),
+				title=_("Warning!"),
+				indicator="orange",
+				alert=1,
 			)
 
 	def validate_main_cost_center(self):
 		# Main cost center itself cannot be entered in child table
 		if self.main_cost_center in [d.cost_center for d in self.allocation_percentages]:
-			frappe.throw(_("Main Cost Center {0} cannot be entered in the child table")
-				.format(self.main_cost_center), MainCostCenterCantBeChild)
+			frappe.throw(
+				_("Main Cost Center {0} cannot be entered in the child table").format(self.main_cost_center),
+				MainCostCenterCantBeChild,
+			)
 
 		# If main cost center is used for allocation under any other cost center,
 		# allocation cannot be done against it
-		parent = frappe.db.get_value("Cost Center Allocation Percentage", filters = {
-			"cost_center": self.main_cost_center,
-			"docstatus": 1
-		}, fieldname='parent')
+		parent = frappe.db.get_value(
+			"Cost Center Allocation Percentage",
+			filters={"cost_center": self.main_cost_center, "docstatus": 1},
+			fieldname="parent",
+		)
 		if parent:
-			frappe.throw(_("{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}")
-				.format(self.main_cost_center, parent), InvalidMainCostCenter)
+			frappe.throw(
+				_(
+					"{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}"
+				).format(self.main_cost_center, parent),
+				InvalidMainCostCenter,
+			)
 
 	def validate_child_cost_centers(self):
 		# Check if child cost center is used as main cost center in any existing allocation
-		main_cost_centers = [d.main_cost_center for d in
-			frappe.get_all("Cost Center Allocation", {'docstatus': 1}, 'main_cost_center')]
+		main_cost_centers = [
+			d.main_cost_center
+			for d in frappe.get_all("Cost Center Allocation", {"docstatus": 1}, "main_cost_center")
+		]
 
 		for d in self.allocation_percentages:
 			if d.cost_center in main_cost_centers:
-				frappe.throw(_("Cost Center {0} cannot be used for allocation as it is used as main cost center in other allocation record.")
-					.format(d.cost_center), InvalidChildCostCenter)
\ No newline at end of file
+				frappe.throw(
+					_(
+						"Cost Center {0} cannot be used for allocation as it is used as main cost center in other allocation record."
+					).format(d.cost_center),
+					InvalidChildCostCenter,
+				)
diff --git a/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py b/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py
index 9cf4c00..65784db 100644
--- a/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py
+++ b/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py
@@ -19,33 +19,35 @@
 
 class TestCostCenterAllocation(unittest.TestCase):
 	def setUp(self):
-		cost_centers = ["Main Cost Center 1", "Main Cost Center 2", "Sub Cost Center 1", "Sub Cost Center 2"]
+		cost_centers = [
+			"Main Cost Center 1",
+			"Main Cost Center 2",
+			"Sub Cost Center 1",
+			"Sub Cost Center 2",
+		]
 		for cc in cost_centers:
 			create_cost_center(cost_center_name=cc, company="_Test Company")
 
 	def test_gle_based_on_cost_center_allocation(self):
-		cca = create_cost_center_allocation("_Test Company", "Main Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 1 - _TC": 60,
-				"Sub Cost Center 2 - _TC": 40
-			}
+		cca = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 1 - _TC",
+			{"Sub Cost Center 1 - _TC": 60, "Sub Cost Center 2 - _TC": 40},
 		)
 
-		jv = make_journal_entry("_Test Cash - _TC", "Sales - _TC", 100,
-			cost_center = "Main Cost Center 1 - _TC", submit=True)
+		jv = make_journal_entry(
+			"_Test Cash - _TC", "Sales - _TC", 100, cost_center="Main Cost Center 1 - _TC", submit=True
+		)
 
-		expected_values = [
-			["Sub Cost Center 1 - _TC", 0.0, 60],
-			["Sub Cost Center 2 - _TC", 0.0, 40]
-		]
+		expected_values = [["Sub Cost Center 1 - _TC", 0.0, 60], ["Sub Cost Center 2 - _TC", 0.0, 40]]
 
 		gle = frappe.qb.DocType("GL Entry")
 		gl_entries = (
 			frappe.qb.from_(gle)
 			.select(gle.cost_center, gle.debit, gle.credit)
-			.where(gle.voucher_type == 'Journal Entry')
+			.where(gle.voucher_type == "Journal Entry")
 			.where(gle.voucher_no == jv.name)
-			.where(gle.account == 'Sales - _TC')
+			.where(gle.account == "Sales - _TC")
 			.orderby(gle.cost_center)
 		).run(as_dict=1)
 
@@ -61,11 +63,11 @@
 
 	def test_main_cost_center_cant_be_child(self):
 		# Main cost center itself cannot be entered in child table
-		cca = create_cost_center_allocation("_Test Company", "Main Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 1 - _TC": 60,
-				"Main Cost Center 1 - _TC": 40
-			}, save=False
+		cca = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 1 - _TC",
+			{"Sub Cost Center 1 - _TC": 60, "Main Cost Center 1 - _TC": 40},
+			save=False,
 		)
 
 		self.assertRaises(MainCostCenterCantBeChild, cca.save)
@@ -73,17 +75,14 @@
 	def test_invalid_main_cost_center(self):
 		# If main cost center is used for allocation under any other cost center,
 		# allocation cannot be done against it
-		cca1 = create_cost_center_allocation("_Test Company", "Main Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 1 - _TC": 60,
-				"Sub Cost Center 2 - _TC": 40
-			}
+		cca1 = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 1 - _TC",
+			{"Sub Cost Center 1 - _TC": 60, "Sub Cost Center 2 - _TC": 40},
 		)
 
-		cca2 = create_cost_center_allocation("_Test Company", "Sub Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 2 - _TC": 100
-			}, save=False
+		cca2 = create_cost_center_allocation(
+			"_Test Company", "Sub Cost Center 1 - _TC", {"Sub Cost Center 2 - _TC": 100}, save=False
 		)
 
 		self.assertRaises(InvalidMainCostCenter, cca2.save)
@@ -92,18 +91,17 @@
 
 	def test_if_child_cost_center_has_any_allocation_record(self):
 		# Check if any child cost center is used as main cost center in any other existing allocation
-		cca1 = create_cost_center_allocation("_Test Company", "Main Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 1 - _TC": 60,
-				"Sub Cost Center 2 - _TC": 40
-			}
+		cca1 = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 1 - _TC",
+			{"Sub Cost Center 1 - _TC": 60, "Sub Cost Center 2 - _TC": 40},
 		)
 
-		cca2 = create_cost_center_allocation("_Test Company", "Main Cost Center 2 - _TC",
-			{
-				"Main Cost Center 1 - _TC": 60,
-				"Sub Cost Center 1 - _TC": 40
-			}, save=False
+		cca2 = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 2 - _TC",
+			{"Main Cost Center 1 - _TC": 60, "Sub Cost Center 1 - _TC": 40},
+			save=False,
 		)
 
 		self.assertRaises(InvalidChildCostCenter, cca2.save)
@@ -111,46 +109,58 @@
 		cca1.cancel()
 
 	def test_total_percentage(self):
-		cca = create_cost_center_allocation("_Test Company", "Main Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 1 - _TC": 40,
-				"Sub Cost Center 2 - _TC": 40
-			}, save=False
+		cca = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 1 - _TC",
+			{"Sub Cost Center 1 - _TC": 40, "Sub Cost Center 2 - _TC": 40},
+			save=False,
 		)
 		self.assertRaises(WrongPercentageAllocation, cca.save)
 
 	def test_valid_from_based_on_existing_gle(self):
 		# GLE posted against Sub Cost Center 1 on today
-		jv = make_journal_entry("_Test Cash - _TC", "Sales - _TC", 100,
-			cost_center = "Main Cost Center 1 - _TC", posting_date=today(), submit=True)
+		jv = make_journal_entry(
+			"_Test Cash - _TC",
+			"Sales - _TC",
+			100,
+			cost_center="Main Cost Center 1 - _TC",
+			posting_date=today(),
+			submit=True,
+		)
 
 		# try to set valid from as yesterday
-		cca = create_cost_center_allocation("_Test Company", "Main Cost Center 1 - _TC",
-			{
-				"Sub Cost Center 1 - _TC": 60,
-				"Sub Cost Center 2 - _TC": 40
-			}, valid_from=add_days(today(), -1), save=False
+		cca = create_cost_center_allocation(
+			"_Test Company",
+			"Main Cost Center 1 - _TC",
+			{"Sub Cost Center 1 - _TC": 60, "Sub Cost Center 2 - _TC": 40},
+			valid_from=add_days(today(), -1),
+			save=False,
 		)
 
 		self.assertRaises(InvalidDateError, cca.save)
 
 		jv.cancel()
 
-def create_cost_center_allocation(company, main_cost_center, allocation_percentages,
-		valid_from=None, valid_upto=None, save=True, submit=True):
+
+def create_cost_center_allocation(
+	company,
+	main_cost_center,
+	allocation_percentages,
+	valid_from=None,
+	valid_upto=None,
+	save=True,
+	submit=True,
+):
 	doc = frappe.new_doc("Cost Center Allocation")
 	doc.main_cost_center = main_cost_center
 	doc.company = company
 	doc.valid_from = valid_from or today()
 	doc.valid_upto = valid_upto
 	for cc, percentage in allocation_percentages.items():
-		doc.append("allocation_percentages", {
-			"cost_center": cc,
-			"percentage": percentage
-		})
+		doc.append("allocation_percentages", {"cost_center": cc, "percentage": percentage})
 	if save:
 		doc.save()
 		if submit:
 			doc.submit()
 
-	return doc
\ No newline at end of file
+	return doc
diff --git a/erpnext/accounts/doctype/coupon_code/coupon_code.py b/erpnext/accounts/doctype/coupon_code/coupon_code.py
index ee32de1..6a0cdf9 100644
--- a/erpnext/accounts/doctype/coupon_code/coupon_code.py
+++ b/erpnext/accounts/doctype/coupon_code/coupon_code.py
@@ -15,7 +15,7 @@
 
 		if not self.coupon_code:
 			if self.coupon_type == "Promotional":
-				self.coupon_code =''.join(i for i in self.coupon_name if not i.isdigit())[0:8].upper()
+				self.coupon_code = "".join(i for i in self.coupon_name if not i.isdigit())[0:8].upper()
 			elif self.coupon_type == "Gift Card":
 				self.coupon_code = frappe.generate_hash()[:10].upper()
 
diff --git a/erpnext/accounts/doctype/coupon_code/test_coupon_code.py b/erpnext/accounts/doctype/coupon_code/test_coupon_code.py
index ca482c8..b897546 100644
--- a/erpnext/accounts/doctype/coupon_code/test_coupon_code.py
+++ b/erpnext/accounts/doctype/coupon_code/test_coupon_code.py
@@ -7,92 +7,110 @@
 
 from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
 
-test_dependencies = ['Item']
+test_dependencies = ["Item"]
+
 
 def test_create_test_data():
 	frappe.set_user("Administrator")
 	# create test item
-	if not frappe.db.exists("Item","_Test Tesla Car"):
-		item = frappe.get_doc({
-		"description": "_Test Tesla Car",
-		"doctype": "Item",
-		"has_batch_no": 0,
-		"has_serial_no": 0,
-		"inspection_required": 0,
-		"is_stock_item": 1,
-		"opening_stock":100,
-		"is_sub_contracted_item": 0,
-		"item_code": "_Test Tesla Car",
-		"item_group": "_Test Item Group",
-		"item_name": "_Test Tesla Car",
-		"apply_warehouse_wise_reorder_level": 0,
-		"warehouse":"Stores - _TC",
-		"gst_hsn_code": "999800",
-		"valuation_rate": 5000,
-		"standard_rate":5000,
-		"item_defaults": [{
-		"company": "_Test Company",
-		"default_warehouse": "Stores - _TC",
-		"default_price_list":"_Test Price List",
-		"expense_account": "Cost of Goods Sold - _TC",
-		"buying_cost_center": "Main - _TC",
-		"selling_cost_center": "Main - _TC",
-		"income_account": "Sales - _TC"
-		}],
-		})
+	if not frappe.db.exists("Item", "_Test Tesla Car"):
+		item = frappe.get_doc(
+			{
+				"description": "_Test Tesla Car",
+				"doctype": "Item",
+				"has_batch_no": 0,
+				"has_serial_no": 0,
+				"inspection_required": 0,
+				"is_stock_item": 1,
+				"opening_stock": 100,
+				"is_sub_contracted_item": 0,
+				"item_code": "_Test Tesla Car",
+				"item_group": "_Test Item Group",
+				"item_name": "_Test Tesla Car",
+				"apply_warehouse_wise_reorder_level": 0,
+				"warehouse": "Stores - _TC",
+				"gst_hsn_code": "999800",
+				"valuation_rate": 5000,
+				"standard_rate": 5000,
+				"item_defaults": [
+					{
+						"company": "_Test Company",
+						"default_warehouse": "Stores - _TC",
+						"default_price_list": "_Test Price List",
+						"expense_account": "Cost of Goods Sold - _TC",
+						"buying_cost_center": "Main - _TC",
+						"selling_cost_center": "Main - _TC",
+						"income_account": "Sales - _TC",
+					}
+				],
+			}
+		)
 		item.insert()
 	# create test item price
-	item_price = frappe.get_list('Item Price', filters={'item_code': '_Test Tesla Car', 'price_list': '_Test Price List'}, fields=['name'])
-	if len(item_price)==0:
-		item_price = frappe.get_doc({
-			"doctype": "Item Price",
-			"item_code": "_Test Tesla Car",
-			"price_list": "_Test Price List",
-			"price_list_rate": 5000
-		})
+	item_price = frappe.get_list(
+		"Item Price",
+		filters={"item_code": "_Test Tesla Car", "price_list": "_Test Price List"},
+		fields=["name"],
+	)
+	if len(item_price) == 0:
+		item_price = frappe.get_doc(
+			{
+				"doctype": "Item Price",
+				"item_code": "_Test Tesla Car",
+				"price_list": "_Test Price List",
+				"price_list_rate": 5000,
+			}
+		)
 		item_price.insert()
 	# create test item pricing rule
 	if not frappe.db.exists("Pricing Rule", {"title": "_Test Pricing Rule for _Test Item"}):
-		item_pricing_rule = frappe.get_doc({
-		"doctype": "Pricing Rule",
-		"title": "_Test Pricing Rule for _Test Item",
-		"apply_on": "Item Code",
-		"items": [{
-			"item_code": "_Test Tesla Car"
-		}],
-		"warehouse":"Stores - _TC",
-		"coupon_code_based":1,
-		"selling": 1,
-		"rate_or_discount": "Discount Percentage",
-		"discount_percentage": 30,
-		"company": "_Test Company",
-		"currency":"INR",
-		"for_price_list":"_Test Price List"
-		})
+		item_pricing_rule = frappe.get_doc(
+			{
+				"doctype": "Pricing Rule",
+				"title": "_Test Pricing Rule for _Test Item",
+				"apply_on": "Item Code",
+				"items": [{"item_code": "_Test Tesla Car"}],
+				"warehouse": "Stores - _TC",
+				"coupon_code_based": 1,
+				"selling": 1,
+				"rate_or_discount": "Discount Percentage",
+				"discount_percentage": 30,
+				"company": "_Test Company",
+				"currency": "INR",
+				"for_price_list": "_Test Price List",
+			}
+		)
 		item_pricing_rule.insert()
 	# create test item sales partner
-	if not frappe.db.exists("Sales Partner","_Test Coupon Partner"):
-		sales_partner = frappe.get_doc({
-		"doctype": "Sales Partner",
-		"partner_name":"_Test Coupon Partner",
-		"commission_rate":2,
-		"referral_code": "COPART"
-		})
+	if not frappe.db.exists("Sales Partner", "_Test Coupon Partner"):
+		sales_partner = frappe.get_doc(
+			{
+				"doctype": "Sales Partner",
+				"partner_name": "_Test Coupon Partner",
+				"commission_rate": 2,
+				"referral_code": "COPART",
+			}
+		)
 		sales_partner.insert()
 	# create test item coupon code
 	if not frappe.db.exists("Coupon Code", "SAVE30"):
-		pricing_rule = frappe.db.get_value("Pricing Rule", {"title": "_Test Pricing Rule for _Test Item"}, ['name'])
-		coupon_code = frappe.get_doc({
-			"doctype": "Coupon Code",
-			"coupon_name":"SAVE30",
-			"coupon_code":"SAVE30",
-			"pricing_rule": pricing_rule,
-			"valid_from": "2014-01-01",
-			"maximum_use":1,
-			"used":0
-		})
+		pricing_rule = frappe.db.get_value(
+			"Pricing Rule", {"title": "_Test Pricing Rule for _Test Item"}, ["name"]
+		)
+		coupon_code = frappe.get_doc(
+			{
+				"doctype": "Coupon Code",
+				"coupon_name": "SAVE30",
+				"coupon_code": "SAVE30",
+				"pricing_rule": pricing_rule,
+				"valid_from": "2014-01-01",
+				"maximum_use": 1,
+				"used": 0,
+			}
+		)
 		coupon_code.insert()
 
+
 class TestCouponCode(unittest.TestCase):
 	def setUp(self):
 		test_create_test_data()
@@ -103,15 +121,21 @@
 	def test_sales_order_with_coupon_code(self):
 		frappe.db.set_value("Coupon Code", "SAVE30", "used", 0)
 
-		so = make_sales_order(company='_Test Company', warehouse='Stores - _TC',
-			customer="_Test Customer", selling_price_list="_Test Price List",
-			item_code="_Test Tesla Car", rate=5000, qty=1,
-			do_not_submit=True)
+		so = make_sales_order(
+			company="_Test Company",
+			warehouse="Stores - _TC",
+			customer="_Test Customer",
+			selling_price_list="_Test Price List",
+			item_code="_Test Tesla Car",
+			rate=5000,
+			qty=1,
+			do_not_submit=True,
+		)
 
 		self.assertEqual(so.items[0].rate, 5000)
 
-		so.coupon_code='SAVE30'
-		so.sales_partner='_Test Coupon Partner'
+		so.coupon_code = "SAVE30"
+		so.sales_partner = "_Test Coupon Partner"
 		so.save()
 
 		# check item price after coupon code is applied
diff --git a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py
index e16ff3a..04a8e8e 100644
--- a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py
+++ b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py
@@ -15,24 +15,24 @@
 		self.validate_result(response, value)
 
 	def set_parameters_and_result(self):
-		if self.service_provider == 'exchangerate.host':
-			self.set('result_key', [])
-			self.set('req_params', [])
+		if self.service_provider == "exchangerate.host":
+			self.set("result_key", [])
+			self.set("req_params", [])
 
 			self.api_endpoint = "https://api.exchangerate.host/convert"
-			self.append('result_key', {'key': 'result'})
-			self.append('req_params', {'key': 'date', 'value': '{transaction_date}'})
-			self.append('req_params', {'key': 'from', 'value': '{from_currency}'})
-			self.append('req_params', {'key': 'to', 'value': '{to_currency}'})
-		elif self.service_provider == 'frankfurter.app':
-			self.set('result_key', [])
-			self.set('req_params', [])
+			self.append("result_key", {"key": "result"})
+			self.append("req_params", {"key": "date", "value": "{transaction_date}"})
+			self.append("req_params", {"key": "from", "value": "{from_currency}"})
+			self.append("req_params", {"key": "to", "value": "{to_currency}"})
+		elif self.service_provider == "frankfurter.app":
+			self.set("result_key", [])
+			self.set("req_params", [])
 
 			self.api_endpoint = "https://frankfurter.app/{transaction_date}"
-			self.append('result_key', {'key': 'rates'})
-			self.append('result_key', {'key': '{to_currency}'})
-			self.append('req_params', {'key': 'base', 'value': '{from_currency}'})
-			self.append('req_params', {'key': 'symbols', 'value': '{to_currency}'})
+			self.append("result_key", {"key": "rates"})
+			self.append("result_key", {"key": "{to_currency}"})
+			self.append("req_params", {"key": "base", "value": "{from_currency}"})
+			self.append("req_params", {"key": "symbols", "value": "{to_currency}"})
 
 	def validate_parameters(self):
 		if frappe.flags.in_test:
@@ -41,15 +41,11 @@
 		params = {}
 		for row in self.req_params:
 			params[row.key] = row.value.format(
-				transaction_date=nowdate(),
-				to_currency='INR',
-				from_currency='USD'
+				transaction_date=nowdate(), to_currency="INR", from_currency="USD"
 			)
 
 		api_url = self.api_endpoint.format(
-			transaction_date=nowdate(),
-			to_currency='INR',
-			from_currency='USD'
+			transaction_date=nowdate(), to_currency="INR", from_currency="USD"
 		)
 
 		try:
@@ -68,11 +64,9 @@
 
 		try:
 			for key in self.result_key:
-				value = value[str(key.key).format(
-					transaction_date=nowdate(),
-					to_currency='INR',
-					from_currency='USD'
-				)]
+				value = value[
+					str(key.key).format(transaction_date=nowdate(), to_currency="INR", from_currency="USD")
+				]
 		except Exception:
 			frappe.throw("Invalid result key. Response: " + response.text)
 		if not isinstance(value, (int, float)):
diff --git a/erpnext/accounts/doctype/dunning/dunning.py b/erpnext/accounts/doctype/dunning/dunning.py
index 5da0077..9874d66 100644
--- a/erpnext/accounts/doctype/dunning/dunning.py
+++ b/erpnext/accounts/doctype/dunning/dunning.py
@@ -19,78 +19,99 @@
 		self.validate_overdue_days()
 		self.validate_amount()
 		if not self.income_account:
-			self.income_account = frappe.db.get_value('Company', self.company, 'default_income_account')
+			self.income_account = frappe.db.get_value("Company", self.company, "default_income_account")
 
 	def validate_overdue_days(self):
 		self.overdue_days = (getdate(self.posting_date) - getdate(self.due_date)).days or 0
 
 	def validate_amount(self):
 		amounts = calculate_interest_and_amount(
-			self.outstanding_amount, self.rate_of_interest, self.dunning_fee, self.overdue_days)
-		if self.interest_amount != amounts.get('interest_amount'):
-			self.interest_amount = flt(amounts.get('interest_amount'), self.precision('interest_amount'))
-		if self.dunning_amount != amounts.get('dunning_amount'):
-			self.dunning_amount = flt(amounts.get('dunning_amount'), self.precision('dunning_amount'))
-		if self.grand_total != amounts.get('grand_total'):
-			self.grand_total = flt(amounts.get('grand_total'), self.precision('grand_total'))
+			self.outstanding_amount, self.rate_of_interest, self.dunning_fee, self.overdue_days
+		)
+		if self.interest_amount != amounts.get("interest_amount"):
+			self.interest_amount = flt(amounts.get("interest_amount"), self.precision("interest_amount"))
+		if self.dunning_amount != amounts.get("dunning_amount"):
+			self.dunning_amount = flt(amounts.get("dunning_amount"), self.precision("dunning_amount"))
+		if self.grand_total != amounts.get("grand_total"):
+			self.grand_total = flt(amounts.get("grand_total"), self.precision("grand_total"))
 
 	def on_submit(self):
 		self.make_gl_entries()
 
 	def on_cancel(self):
 		if self.dunning_amount:
-			self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+			self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 			make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
 
 	def make_gl_entries(self):
 		if not self.dunning_amount:
 			return
 		gl_entries = []
-		invoice_fields = ["project", "cost_center", "debit_to", "party_account_currency", "conversion_rate", "cost_center"]
+		invoice_fields = [
+			"project",
+			"cost_center",
+			"debit_to",
+			"party_account_currency",
+			"conversion_rate",
+			"cost_center",
+		]
 		inv = frappe.db.get_value("Sales Invoice", self.sales_invoice, invoice_fields, as_dict=1)
 
 		accounting_dimensions = get_accounting_dimensions()
 		invoice_fields.extend(accounting_dimensions)
 
 		dunning_in_company_currency = flt(self.dunning_amount * inv.conversion_rate)
-		default_cost_center = frappe.get_cached_value('Company',  self.company,  'cost_center')
+		default_cost_center = frappe.get_cached_value("Company", self.company, "cost_center")
 
 		gl_entries.append(
-			self.get_gl_dict({
-				"account": inv.debit_to,
-				"party_type": "Customer",
-				"party": self.customer,
-				"due_date": self.due_date,
-				"against": self.income_account,
-				"debit": dunning_in_company_currency,
-				"debit_in_account_currency": self.dunning_amount,
-				"against_voucher": self.name,
-				"against_voucher_type": "Dunning",
-				"cost_center": inv.cost_center or default_cost_center,
-				"project": inv.project
-			}, inv.party_account_currency, item=inv)
+			self.get_gl_dict(
+				{
+					"account": inv.debit_to,
+					"party_type": "Customer",
+					"party": self.customer,
+					"due_date": self.due_date,
+					"against": self.income_account,
+					"debit": dunning_in_company_currency,
+					"debit_in_account_currency": self.dunning_amount,
+					"against_voucher": self.name,
+					"against_voucher_type": "Dunning",
+					"cost_center": inv.cost_center or default_cost_center,
+					"project": inv.project,
+				},
+				inv.party_account_currency,
+				item=inv,
+			)
 		)
 		gl_entries.append(
-			self.get_gl_dict({
-				"account": self.income_account,
-				"against": self.customer,
-				"credit": dunning_in_company_currency,
-				"cost_center": inv.cost_center or default_cost_center,
-				"credit_in_account_currency": self.dunning_amount,
-				"project": inv.project
-			}, item=inv)
+			self.get_gl_dict(
+				{
+					"account": self.income_account,
+					"against": self.customer,
+					"credit": dunning_in_company_currency,
+					"cost_center": inv.cost_center or default_cost_center,
+					"credit_in_account_currency": self.dunning_amount,
+					"project": inv.project,
+				},
+				item=inv,
+			)
 		)
-		make_gl_entries(gl_entries, cancel=(self.docstatus == 2), update_outstanding="No", merge_entries=False)
+		make_gl_entries(
+			gl_entries, cancel=(self.docstatus == 2), update_outstanding="No", merge_entries=False
+		)
 
 
 def resolve_dunning(doc, state):
 	for reference in doc.references:
-		if reference.reference_doctype == 'Sales Invoice' and reference.outstanding_amount <= 0:
-			dunnings = frappe.get_list('Dunning', filters={
-				'sales_invoice': reference.reference_name, 'status': ('!=', 'Resolved')}, ignore_permissions=True)
+		if reference.reference_doctype == "Sales Invoice" and reference.outstanding_amount <= 0:
+			dunnings = frappe.get_list(
+				"Dunning",
+				filters={"sales_invoice": reference.reference_name, "status": ("!=", "Resolved")},
+				ignore_permissions=True,
+			)
 
 			for dunning in dunnings:
-				frappe.db.set_value("Dunning", dunning.name, "status", 'Resolved')
+				frappe.db.set_value("Dunning", dunning.name, "status", "Resolved")
+
 
 def calculate_interest_and_amount(outstanding_amount, rate_of_interest, dunning_fee, overdue_days):
 	interest_amount = 0
@@ -101,23 +122,26 @@
 		grand_total += flt(interest_amount)
 	dunning_amount = flt(interest_amount) + flt(dunning_fee)
 	return {
-		'interest_amount': interest_amount,
-		'grand_total': grand_total,
-		'dunning_amount': dunning_amount}
+		"interest_amount": interest_amount,
+		"grand_total": grand_total,
+		"dunning_amount": dunning_amount,
+	}
+
 
 @frappe.whitelist()
 def get_dunning_letter_text(dunning_type, doc, language=None):
 	if isinstance(doc, str):
 		doc = json.loads(doc)
 	if language:
-		filters = {'parent': dunning_type, 'language': language}
+		filters = {"parent": dunning_type, "language": language}
 	else:
-		filters = {'parent': dunning_type, 'is_default_language': 1}
-	letter_text = frappe.db.get_value('Dunning Letter Text', filters,
-		['body_text', 'closing_text', 'language'], as_dict=1)
+		filters = {"parent": dunning_type, "is_default_language": 1}
+	letter_text = frappe.db.get_value(
+		"Dunning Letter Text", filters, ["body_text", "closing_text", "language"], as_dict=1
+	)
 	if letter_text:
 		return {
-			'body_text': frappe.render_template(letter_text.body_text, doc),
-			'closing_text': frappe.render_template(letter_text.closing_text, doc),
-			'language': letter_text.language
+			"body_text": frappe.render_template(letter_text.body_text, doc),
+			"closing_text": frappe.render_template(letter_text.closing_text, doc),
+			"language": letter_text.language,
 		}
diff --git a/erpnext/accounts/doctype/dunning/dunning_dashboard.py b/erpnext/accounts/doctype/dunning/dunning_dashboard.py
index a891bd2..d1d4031 100644
--- a/erpnext/accounts/doctype/dunning/dunning_dashboard.py
+++ b/erpnext/accounts/doctype/dunning/dunning_dashboard.py
@@ -3,15 +3,10 @@
 
 def get_data():
 	return {
-		'fieldname': 'dunning',
-		'non_standard_fieldnames': {
-			'Journal Entry': 'reference_name',
-			'Payment Entry': 'reference_name'
+		"fieldname": "dunning",
+		"non_standard_fieldnames": {
+			"Journal Entry": "reference_name",
+			"Payment Entry": "reference_name",
 		},
-		'transactions': [
-			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Journal Entry']
-			}
-		]
+		"transactions": [{"label": _("Payment"), "items": ["Payment Entry", "Journal Entry"]}],
 	}
diff --git a/erpnext/accounts/doctype/dunning/test_dunning.py b/erpnext/accounts/doctype/dunning/test_dunning.py
index b043c5b..e1fd1e9 100644
--- a/erpnext/accounts/doctype/dunning/test_dunning.py
+++ b/erpnext/accounts/doctype/dunning/test_dunning.py
@@ -30,30 +30,35 @@
 	def test_dunning(self):
 		dunning = create_dunning()
 		amounts = calculate_interest_and_amount(
-			dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days)
-		self.assertEqual(round(amounts.get('interest_amount'), 2), 0.44)
-		self.assertEqual(round(amounts.get('dunning_amount'), 2), 20.44)
-		self.assertEqual(round(amounts.get('grand_total'), 2), 120.44)
+			dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
+		)
+		self.assertEqual(round(amounts.get("interest_amount"), 2), 0.44)
+		self.assertEqual(round(amounts.get("dunning_amount"), 2), 20.44)
+		self.assertEqual(round(amounts.get("grand_total"), 2), 120.44)
 
 	def test_dunning_with_zero_interest_rate(self):
 		dunning = create_dunning_with_zero_interest_rate()
 		amounts = calculate_interest_and_amount(
-			dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days)
-		self.assertEqual(round(amounts.get('interest_amount'), 2), 0)
-		self.assertEqual(round(amounts.get('dunning_amount'), 2), 20)
-		self.assertEqual(round(amounts.get('grand_total'), 2), 120)
+			dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
+		)
+		self.assertEqual(round(amounts.get("interest_amount"), 2), 0)
+		self.assertEqual(round(amounts.get("dunning_amount"), 2), 20)
+		self.assertEqual(round(amounts.get("grand_total"), 2), 120)
 
 	def test_gl_entries(self):
 		dunning = create_dunning()
 		dunning.submit()
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Dunning' and voucher_no=%s
-			order by account asc""", dunning.name, as_dict=1)
+			order by account asc""",
+			dunning.name,
+			as_dict=1,
+		)
 		self.assertTrue(gl_entries)
-		expected_values = dict((d[0], d) for d in [
-			['Debtors - _TC', 20.44, 0.0],
-			['Sales - _TC',  0.0, 20.44]
-		])
+		expected_values = dict(
+			(d[0], d) for d in [["Debtors - _TC", 20.44, 0.0], ["Sales - _TC", 0.0, 20.44]]
+		)
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.account)
 			self.assertEqual(expected_values[gle.account][1], gle.debit)
@@ -71,7 +76,7 @@
 		pe.target_exchange_rate = 1
 		pe.insert()
 		pe.submit()
-		si_doc = frappe.get_doc('Sales Invoice', dunning.sales_invoice)
+		si_doc = frappe.get_doc("Sales Invoice", dunning.sales_invoice)
 		self.assertEqual(si_doc.outstanding_amount, 0)
 
 
@@ -79,8 +84,9 @@
 	posting_date = add_days(today(), -20)
 	due_date = add_days(today(), -15)
 	sales_invoice = create_sales_invoice_against_cost_center(
-		posting_date=posting_date, due_date=due_date, status='Overdue')
-	dunning_type = frappe.get_doc("Dunning Type", 'First Notice')
+		posting_date=posting_date, due_date=due_date, status="Overdue"
+	)
+	dunning_type = frappe.get_doc("Dunning Type", "First Notice")
 	dunning = frappe.new_doc("Dunning")
 	dunning.sales_invoice = sales_invoice.name
 	dunning.customer_name = sales_invoice.customer_name
@@ -90,18 +96,20 @@
 	dunning.company = sales_invoice.company
 	dunning.posting_date = nowdate()
 	dunning.due_date = sales_invoice.due_date
-	dunning.dunning_type = 'First Notice'
+	dunning.dunning_type = "First Notice"
 	dunning.rate_of_interest = dunning_type.rate_of_interest
 	dunning.dunning_fee = dunning_type.dunning_fee
 	dunning.save()
 	return dunning
 
+
 def create_dunning_with_zero_interest_rate():
 	posting_date = add_days(today(), -20)
 	due_date = add_days(today(), -15)
 	sales_invoice = create_sales_invoice_against_cost_center(
-		posting_date=posting_date, due_date=due_date, status='Overdue')
-	dunning_type = frappe.get_doc("Dunning Type", 'First Notice with 0% Rate of Interest')
+		posting_date=posting_date, due_date=due_date, status="Overdue"
+	)
+	dunning_type = frappe.get_doc("Dunning Type", "First Notice with 0% Rate of Interest")
 	dunning = frappe.new_doc("Dunning")
 	dunning.sales_invoice = sales_invoice.name
 	dunning.customer_name = sales_invoice.customer_name
@@ -111,40 +119,44 @@
 	dunning.company = sales_invoice.company
 	dunning.posting_date = nowdate()
 	dunning.due_date = sales_invoice.due_date
-	dunning.dunning_type = 'First Notice with 0% Rate of Interest'
+	dunning.dunning_type = "First Notice with 0% Rate of Interest"
 	dunning.rate_of_interest = dunning_type.rate_of_interest
 	dunning.dunning_fee = dunning_type.dunning_fee
 	dunning.save()
 	return dunning
 
+
 def create_dunning_type():
 	dunning_type = frappe.new_doc("Dunning Type")
-	dunning_type.dunning_type = 'First Notice'
+	dunning_type.dunning_type = "First Notice"
 	dunning_type.start_day = 10
 	dunning_type.end_day = 20
 	dunning_type.dunning_fee = 20
 	dunning_type.rate_of_interest = 8
 	dunning_type.append(
-		"dunning_letter_text", {
-			'language': 'en',
-			'body_text': 'We have still not received payment for our invoice ',
-			'closing_text': 'We kindly request that you pay the outstanding amount immediately, including interest and late fees.'
-		}
+		"dunning_letter_text",
+		{
+			"language": "en",
+			"body_text": "We have still not received payment for our invoice ",
+			"closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees.",
+		},
 	)
 	dunning_type.save()
 
+
 def create_dunning_type_with_zero_interest_rate():
 	dunning_type = frappe.new_doc("Dunning Type")
-	dunning_type.dunning_type = 'First Notice with 0% Rate of Interest'
+	dunning_type.dunning_type = "First Notice with 0% Rate of Interest"
 	dunning_type.start_day = 10
 	dunning_type.end_day = 20
 	dunning_type.dunning_fee = 20
 	dunning_type.rate_of_interest = 0
 	dunning_type.append(
-		"dunning_letter_text", {
-			'language': 'en',
-			'body_text': 'We have still not received payment for our invoice ',
-			'closing_text': 'We kindly request that you pay the outstanding amount immediately, and late fees.'
-		}
+		"dunning_letter_text",
+		{
+			"language": "en",
+			"body_text": "We have still not received payment for our invoice ",
+			"closing_text": "We kindly request that you pay the outstanding amount immediately, and late fees.",
+		},
 	)
 	dunning_type.save()
diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
index 1b13195..2f81c5f 100644
--- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
+++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
@@ -20,8 +20,9 @@
 	def set_total_gain_loss(self):
 		total_gain_loss = 0
 		for d in self.accounts:
-			d.gain_loss = flt(d.new_balance_in_base_currency, d.precision("new_balance_in_base_currency")) \
-				- flt(d.balance_in_base_currency, d.precision("balance_in_base_currency"))
+			d.gain_loss = flt(
+				d.new_balance_in_base_currency, d.precision("new_balance_in_base_currency")
+			) - flt(d.balance_in_base_currency, d.precision("balance_in_base_currency"))
 			total_gain_loss += flt(d.gain_loss, d.precision("gain_loss"))
 		self.total_gain_loss = flt(total_gain_loss, self.precision("total_gain_loss"))
 
@@ -30,15 +31,15 @@
 			frappe.throw(_("Please select Company and Posting Date to getting entries"))
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry')
+		self.ignore_linked_doctypes = "GL Entry"
 
 	@frappe.whitelist()
 	def check_journal_entry_condition(self):
-		total_debit = frappe.db.get_value("Journal Entry Account", {
-			'reference_type': 'Exchange Rate Revaluation',
-			'reference_name': self.name,
-			'docstatus': 1
-		}, "sum(debit) as sum")
+		total_debit = frappe.db.get_value(
+			"Journal Entry Account",
+			{"reference_type": "Exchange Rate Revaluation", "reference_name": self.name, "docstatus": 1},
+			"sum(debit) as sum",
+		)
 
 		total_amt = 0
 		for d in self.accounts:
@@ -54,28 +55,33 @@
 		accounts = []
 		self.validate_mandatory()
 		company_currency = erpnext.get_company_currency(self.company)
-		precision = get_field_precision(frappe.get_meta("Exchange Rate Revaluation Account")
-			.get_field("new_balance_in_base_currency"), company_currency)
+		precision = get_field_precision(
+			frappe.get_meta("Exchange Rate Revaluation Account").get_field("new_balance_in_base_currency"),
+			company_currency,
+		)
 
 		account_details = self.get_accounts_from_gle()
 		for d in account_details:
-			current_exchange_rate = d.balance / d.balance_in_account_currency \
-				if d.balance_in_account_currency else 0
+			current_exchange_rate = (
+				d.balance / d.balance_in_account_currency if d.balance_in_account_currency else 0
+			)
 			new_exchange_rate = get_exchange_rate(d.account_currency, company_currency, self.posting_date)
 			new_balance_in_base_currency = flt(d.balance_in_account_currency * new_exchange_rate)
 			gain_loss = flt(new_balance_in_base_currency, precision) - flt(d.balance, precision)
 			if gain_loss:
-				accounts.append({
-					"account": d.account,
-					"party_type": d.party_type,
-					"party": d.party,
-					"account_currency": d.account_currency,
-					"balance_in_base_currency": d.balance,
-					"balance_in_account_currency": d.balance_in_account_currency,
-					"current_exchange_rate": current_exchange_rate,
-					"new_exchange_rate": new_exchange_rate,
-					"new_balance_in_base_currency": new_balance_in_base_currency
-				})
+				accounts.append(
+					{
+						"account": d.account,
+						"party_type": d.party_type,
+						"party": d.party,
+						"account_currency": d.account_currency,
+						"balance_in_base_currency": d.balance,
+						"balance_in_account_currency": d.balance_in_account_currency,
+						"current_exchange_rate": current_exchange_rate,
+						"new_exchange_rate": new_exchange_rate,
+						"new_balance_in_base_currency": new_balance_in_base_currency,
+					}
+				)
 
 		if not accounts:
 			self.throw_invalid_response_message(account_details)
@@ -84,7 +90,8 @@
 
 	def get_accounts_from_gle(self):
 		company_currency = erpnext.get_company_currency(self.company)
-		accounts = frappe.db.sql_list("""
+		accounts = frappe.db.sql_list(
+			"""
 			select name
 			from tabAccount
 			where is_group = 0
@@ -93,11 +100,14 @@
 				and account_type != 'Stock'
 				and company=%s
 				and account_currency != %s
-			order by name""",(self.company, company_currency))
+			order by name""",
+			(self.company, company_currency),
+		)
 
 		account_details = []
 		if accounts:
-			account_details = frappe.db.sql("""
+			account_details = frappe.db.sql(
+				"""
 				select
 					account, party_type, party, account_currency,
 					sum(debit_in_account_currency) - sum(credit_in_account_currency) as balance_in_account_currency,
@@ -109,7 +119,11 @@
 				group by account, NULLIF(party_type,''), NULLIF(party,'')
 				having sum(debit) != sum(credit)
 				order by account
-			""" % (', '.join(['%s']*len(accounts)), '%s'), tuple(accounts + [self.posting_date]), as_dict=1)
+			"""
+				% (", ".join(["%s"] * len(accounts)), "%s"),
+				tuple(accounts + [self.posting_date]),
+				as_dict=1,
+			)
 
 		return account_details
 
@@ -125,77 +139,107 @@
 		if self.total_gain_loss == 0:
 			return
 
-		unrealized_exchange_gain_loss_account = frappe.get_cached_value('Company',  self.company,
-			"unrealized_exchange_gain_loss_account")
+		unrealized_exchange_gain_loss_account = frappe.get_cached_value(
+			"Company", self.company, "unrealized_exchange_gain_loss_account"
+		)
 		if not unrealized_exchange_gain_loss_account:
-			frappe.throw(_("Please set Unrealized Exchange Gain/Loss Account in Company {0}")
-				.format(self.company))
+			frappe.throw(
+				_("Please set Unrealized Exchange Gain/Loss Account in Company {0}").format(self.company)
+			)
 
-		journal_entry = frappe.new_doc('Journal Entry')
-		journal_entry.voucher_type = 'Exchange Rate Revaluation'
+		journal_entry = frappe.new_doc("Journal Entry")
+		journal_entry.voucher_type = "Exchange Rate Revaluation"
 		journal_entry.company = self.company
 		journal_entry.posting_date = self.posting_date
 		journal_entry.multi_currency = 1
 
 		journal_entry_accounts = []
 		for d in self.accounts:
-			dr_or_cr = "debit_in_account_currency" \
-				if d.get("balance_in_account_currency") > 0 else "credit_in_account_currency"
+			dr_or_cr = (
+				"debit_in_account_currency"
+				if d.get("balance_in_account_currency") > 0
+				else "credit_in_account_currency"
+			)
 
-			reverse_dr_or_cr = "debit_in_account_currency" \
-				if dr_or_cr=="credit_in_account_currency" else "credit_in_account_currency"
+			reverse_dr_or_cr = (
+				"debit_in_account_currency"
+				if dr_or_cr == "credit_in_account_currency"
+				else "credit_in_account_currency"
+			)
 
-			journal_entry_accounts.append({
-				"account": d.get("account"),
-				"party_type": d.get("party_type"),
-				"party": d.get("party"),
-				"account_currency": d.get("account_currency"),
-				"balance": flt(d.get("balance_in_account_currency"), d.precision("balance_in_account_currency")),
-				dr_or_cr: flt(abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")),
-				"exchange_rate": flt(d.get("new_exchange_rate"), d.precision("new_exchange_rate")),
+			journal_entry_accounts.append(
+				{
+					"account": d.get("account"),
+					"party_type": d.get("party_type"),
+					"party": d.get("party"),
+					"account_currency": d.get("account_currency"),
+					"balance": flt(
+						d.get("balance_in_account_currency"), d.precision("balance_in_account_currency")
+					),
+					dr_or_cr: flt(
+						abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
+					),
+					"exchange_rate": flt(d.get("new_exchange_rate"), d.precision("new_exchange_rate")),
+					"reference_type": "Exchange Rate Revaluation",
+					"reference_name": self.name,
+				}
+			)
+			journal_entry_accounts.append(
+				{
+					"account": d.get("account"),
+					"party_type": d.get("party_type"),
+					"party": d.get("party"),
+					"account_currency": d.get("account_currency"),
+					"balance": flt(
+						d.get("balance_in_account_currency"), d.precision("balance_in_account_currency")
+					),
+					reverse_dr_or_cr: flt(
+						abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
+					),
+					"exchange_rate": flt(d.get("current_exchange_rate"), d.precision("current_exchange_rate")),
+					"reference_type": "Exchange Rate Revaluation",
+					"reference_name": self.name,
+				}
+			)
+
+		journal_entry_accounts.append(
+			{
+				"account": unrealized_exchange_gain_loss_account,
+				"balance": get_balance_on(unrealized_exchange_gain_loss_account),
+				"debit_in_account_currency": abs(self.total_gain_loss) if self.total_gain_loss < 0 else 0,
+				"credit_in_account_currency": self.total_gain_loss if self.total_gain_loss > 0 else 0,
+				"exchange_rate": 1,
 				"reference_type": "Exchange Rate Revaluation",
 				"reference_name": self.name,
-				})
-			journal_entry_accounts.append({
-				"account": d.get("account"),
-				"party_type": d.get("party_type"),
-				"party": d.get("party"),
-				"account_currency": d.get("account_currency"),
-				"balance": flt(d.get("balance_in_account_currency"), d.precision("balance_in_account_currency")),
-				reverse_dr_or_cr: flt(abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")),
-				"exchange_rate": flt(d.get("current_exchange_rate"), d.precision("current_exchange_rate")),
-				"reference_type": "Exchange Rate Revaluation",
-				"reference_name": self.name
-				})
-
-		journal_entry_accounts.append({
-			"account": unrealized_exchange_gain_loss_account,
-			"balance": get_balance_on(unrealized_exchange_gain_loss_account),
-			"debit_in_account_currency": abs(self.total_gain_loss) if self.total_gain_loss < 0 else 0,
-			"credit_in_account_currency": self.total_gain_loss if self.total_gain_loss > 0 else 0,
-			"exchange_rate": 1,
-			"reference_type": "Exchange Rate Revaluation",
-			"reference_name": self.name,
-			})
+			}
+		)
 
 		journal_entry.set("accounts", journal_entry_accounts)
 		journal_entry.set_amounts_in_company_currency()
 		journal_entry.set_total_debit_credit()
 		return journal_entry.as_dict()
 
+
 @frappe.whitelist()
 def get_account_details(account, company, posting_date, party_type=None, party=None):
-	account_currency, account_type = frappe.db.get_value("Account", account,
-		["account_currency", "account_type"])
+	account_currency, account_type = frappe.db.get_value(
+		"Account", account, ["account_currency", "account_type"]
+	)
 	if account_type in ["Receivable", "Payable"] and not (party_type and party):
 		frappe.throw(_("Party Type and Party is mandatory for {0} account").format(account_type))
 
 	account_details = {}
 	company_currency = erpnext.get_company_currency(company)
-	balance = get_balance_on(account, date=posting_date, party_type=party_type, party=party, in_account_currency=False)
+	balance = get_balance_on(
+		account, date=posting_date, party_type=party_type, party=party, in_account_currency=False
+	)
 	if balance:
-		balance_in_account_currency = get_balance_on(account, date=posting_date, party_type=party_type, party=party)
-		current_exchange_rate = balance / balance_in_account_currency if balance_in_account_currency else 0
+		balance_in_account_currency = get_balance_on(
+			account, date=posting_date, party_type=party_type, party=party
+		)
+		current_exchange_rate = (
+			balance / balance_in_account_currency if balance_in_account_currency else 0
+		)
 		new_exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date)
 		new_balance_in_base_currency = balance_in_account_currency * new_exchange_rate
 		account_details = {
@@ -204,7 +248,7 @@
 			"balance_in_account_currency": balance_in_account_currency,
 			"current_exchange_rate": current_exchange_rate,
 			"new_exchange_rate": new_exchange_rate,
-			"new_balance_in_base_currency": new_balance_in_base_currency
+			"new_balance_in_base_currency": new_balance_in_base_currency,
 		}
 
 	return account_details
diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation_dashboard.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation_dashboard.py
index fe86250..7eca970 100644
--- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation_dashboard.py
+++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname': 'reference_name',
-		'transactions': [
-			{
-				'items': ['Journal Entry']
-			}
-		]
-	}
+	return {"fieldname": "reference_name", "transactions": [{"items": ["Journal Entry"]}]}
diff --git a/erpnext/accounts/doctype/finance_book/finance_book_dashboard.py b/erpnext/accounts/doctype/finance_book/finance_book_dashboard.py
index 57b039d..24e6c0c 100644
--- a/erpnext/accounts/doctype/finance_book/finance_book_dashboard.py
+++ b/erpnext/accounts/doctype/finance_book/finance_book_dashboard.py
@@ -3,21 +3,11 @@
 
 def get_data():
 	return {
-		'fieldname': 'finance_book',
-		'non_standard_fieldnames': {
-			'Asset': 'default_finance_book',
-			'Company': 'default_finance_book'
-		},
-		'transactions': [
-			{
-				'label': _('Assets'),
-				'items': ['Asset', 'Asset Value Adjustment']
-			},
-			{
-				'items': ['Company']
-			},
-			{
-				'items': ['Journal Entry']
-			}
-		]
+		"fieldname": "finance_book",
+		"non_standard_fieldnames": {"Asset": "default_finance_book", "Company": "default_finance_book"},
+		"transactions": [
+			{"label": _("Assets"), "items": ["Asset", "Asset Value Adjustment"]},
+			{"items": ["Company"]},
+			{"items": ["Journal Entry"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/finance_book/test_finance_book.py b/erpnext/accounts/doctype/finance_book/test_finance_book.py
index 5fb3d0a..7b2575d 100644
--- a/erpnext/accounts/doctype/finance_book/test_finance_book.py
+++ b/erpnext/accounts/doctype/finance_book/test_finance_book.py
@@ -13,30 +13,29 @@
 		finance_book = create_finance_book()
 
 		# create jv entry
-		jv = make_journal_entry("_Test Bank - _TC",
-			"_Test Receivable - _TC", 100, save=False)
+		jv = make_journal_entry("_Test Bank - _TC", "_Test Receivable - _TC", 100, save=False)
 
-		jv.accounts[1].update({
-			"party_type": "Customer",
-			"party": "_Test Customer"
-		})
+		jv.accounts[1].update({"party_type": "Customer", "party": "_Test Customer"})
 
 		jv.finance_book = finance_book.finance_book_name
 		jv.submit()
 
 		# check the Finance Book in the GL Entry
-		gl_entries = frappe.get_all("GL Entry", fields=["name", "finance_book"],
-			filters={"voucher_type": "Journal Entry", "voucher_no": jv.name})
+		gl_entries = frappe.get_all(
+			"GL Entry",
+			fields=["name", "finance_book"],
+			filters={"voucher_type": "Journal Entry", "voucher_no": jv.name},
+		)
 
 		for gl_entry in gl_entries:
 			self.assertEqual(gl_entry.finance_book, finance_book.name)
 
+
 def create_finance_book():
 	if not frappe.db.exists("Finance Book", "_Test Finance Book"):
-		finance_book = frappe.get_doc({
-			"doctype": "Finance Book",
-			"finance_book_name": "_Test Finance Book"
-		}).insert()
+		finance_book = frappe.get_doc(
+			{"doctype": "Finance Book", "finance_book_name": "_Test Finance Book"}
+		).insert()
 	else:
 		finance_book = frappe.get_doc("Finance Book", "_Test Finance Book")
 
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
index dd893f9..069ab5e 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
@@ -9,7 +9,9 @@
 from frappe.utils import add_days, add_years, cstr, getdate
 
 
-class FiscalYearIncorrectDate(frappe.ValidationError): pass
+class FiscalYearIncorrectDate(frappe.ValidationError):
+	pass
+
 
 class FiscalYear(Document):
 	@frappe.whitelist()
@@ -22,19 +24,33 @@
 		# clear cache
 		frappe.clear_cache()
 
-		msgprint(_("{0} is now the default Fiscal Year. Please refresh your browser for the change to take effect.").format(self.name))
+		msgprint(
+			_(
+				"{0} is now the default Fiscal Year. Please refresh your browser for the change to take effect."
+			).format(self.name)
+		)
 
 	def validate(self):
 		self.validate_dates()
 		self.validate_overlap()
 
 		if not self.is_new():
-			year_start_end_dates = frappe.db.sql("""select year_start_date, year_end_date
-				from `tabFiscal Year` where name=%s""", (self.name))
+			year_start_end_dates = frappe.db.sql(
+				"""select year_start_date, year_end_date
+				from `tabFiscal Year` where name=%s""",
+				(self.name),
+			)
 
 			if year_start_end_dates:
-				if getdate(self.year_start_date) != year_start_end_dates[0][0] or getdate(self.year_end_date) != year_start_end_dates[0][1]:
-					frappe.throw(_("Cannot change Fiscal Year Start Date and Fiscal Year End Date once the Fiscal Year is saved."))
+				if (
+					getdate(self.year_start_date) != year_start_end_dates[0][0]
+					or getdate(self.year_end_date) != year_start_end_dates[0][1]
+				):
+					frappe.throw(
+						_(
+							"Cannot change Fiscal Year Start Date and Fiscal Year End Date once the Fiscal Year is saved."
+						)
+					)
 
 	def validate_dates(self):
 		if self.is_short_year:
@@ -43,14 +59,18 @@
 			return
 
 		if getdate(self.year_start_date) > getdate(self.year_end_date):
-			frappe.throw(_("Fiscal Year Start Date should be one year earlier than Fiscal Year End Date"),
-				FiscalYearIncorrectDate)
+			frappe.throw(
+				_("Fiscal Year Start Date should be one year earlier than Fiscal Year End Date"),
+				FiscalYearIncorrectDate,
+			)
 
 		date = getdate(self.year_start_date) + relativedelta(years=1) - relativedelta(days=1)
 
 		if getdate(self.year_end_date) != date:
-			frappe.throw(_("Fiscal Year End Date should be one year after Fiscal Year Start Date"),
-				FiscalYearIncorrectDate)
+			frappe.throw(
+				_("Fiscal Year End Date should be one year after Fiscal Year Start Date"),
+				FiscalYearIncorrectDate,
+			)
 
 	def on_update(self):
 		check_duplicate_fiscal_year(self)
@@ -59,11 +79,16 @@
 	def on_trash(self):
 		global_defaults = frappe.get_doc("Global Defaults")
 		if global_defaults.current_fiscal_year == self.name:
-			frappe.throw(_("You cannot delete Fiscal Year {0}. Fiscal Year {0} is set as default in Global Settings").format(self.name))
+			frappe.throw(
+				_(
+					"You cannot delete Fiscal Year {0}. Fiscal Year {0} is set as default in Global Settings"
+				).format(self.name)
+			)
 		frappe.cache().delete_value("fiscal_years")
 
 	def validate_overlap(self):
-		existing_fiscal_years = frappe.db.sql("""select name from `tabFiscal Year`
+		existing_fiscal_years = frappe.db.sql(
+			"""select name from `tabFiscal Year`
 			where (
 				(%(year_start_date)s between year_start_date and year_end_date)
 				or (%(year_end_date)s between year_start_date and year_end_date)
@@ -73,13 +98,18 @@
 			{
 				"year_start_date": self.year_start_date,
 				"year_end_date": self.year_end_date,
-				"name": self.name or "No Name"
-			}, as_dict=True)
+				"name": self.name or "No Name",
+			},
+			as_dict=True,
+		)
 
 		if existing_fiscal_years:
 			for existing in existing_fiscal_years:
-				company_for_existing = frappe.db.sql_list("""select company from `tabFiscal Year Company`
-					where parent=%s""", existing.name)
+				company_for_existing = frappe.db.sql_list(
+					"""select company from `tabFiscal Year Company`
+					where parent=%s""",
+					existing.name,
+				)
 
 				overlap = False
 				if not self.get("companies") or not company_for_existing:
@@ -90,20 +120,36 @@
 						overlap = True
 
 				if overlap:
-					frappe.throw(_("Year start date or end date is overlapping with {0}. To avoid please set company")
-						.format(existing.name), frappe.NameError)
+					frappe.throw(
+						_("Year start date or end date is overlapping with {0}. To avoid please set company").format(
+							existing.name
+						),
+						frappe.NameError,
+					)
+
 
 @frappe.whitelist()
 def check_duplicate_fiscal_year(doc):
-	year_start_end_dates = frappe.db.sql("""select name, year_start_date, year_end_date from `tabFiscal Year` where name!=%s""", (doc.name))
+	year_start_end_dates = frappe.db.sql(
+		"""select name, year_start_date, year_end_date from `tabFiscal Year` where name!=%s""",
+		(doc.name),
+	)
 	for fiscal_year, ysd, yed in year_start_end_dates:
-		if (getdate(doc.year_start_date) == ysd and getdate(doc.year_end_date) == yed) and (not frappe.flags.in_test):
-					frappe.throw(_("Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}").format(fiscal_year))
+		if (getdate(doc.year_start_date) == ysd and getdate(doc.year_end_date) == yed) and (
+			not frappe.flags.in_test
+		):
+			frappe.throw(
+				_("Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}").format(
+					fiscal_year
+				)
+			)
 
 
 @frappe.whitelist()
 def auto_create_fiscal_year():
-	for d in frappe.db.sql("""select name from `tabFiscal Year` where year_end_date = date_add(current_date, interval 3 day)"""):
+	for d in frappe.db.sql(
+		"""select name from `tabFiscal Year` where year_end_date = date_add(current_date, interval 3 day)"""
+	):
 		try:
 			current_fy = frappe.get_doc("Fiscal Year", d[0])
 
@@ -114,16 +160,14 @@
 
 			start_year = cstr(new_fy.year_start_date.year)
 			end_year = cstr(new_fy.year_end_date.year)
-			new_fy.year = start_year if start_year==end_year else (start_year + "-" + end_year)
+			new_fy.year = start_year if start_year == end_year else (start_year + "-" + end_year)
 			new_fy.auto_created = 1
 
 			new_fy.insert(ignore_permissions=True)
 		except frappe.NameError:
 			pass
 
+
 def get_from_and_to_date(fiscal_year):
-	fields = [
-		"year_start_date as from_date",
-		"year_end_date as to_date"
-	]
+	fields = ["year_start_date as from_date", "year_end_date as to_date"]
 	return frappe.db.get_value("Fiscal Year", fiscal_year, fields, as_dict=1)
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py
index 892a2c6..bc96691 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py
@@ -3,19 +3,13 @@
 
 def get_data():
 	return {
-		'fieldname': 'fiscal_year',
-		'transactions': [
+		"fieldname": "fiscal_year",
+		"transactions": [
+			{"label": _("Budgets"), "items": ["Budget"]},
+			{"label": _("References"), "items": ["Period Closing Voucher"]},
 			{
-				'label': _('Budgets'),
-				'items': ['Budget']
+				"label": _("Target Details"),
+				"items": ["Sales Person", "Sales Partner", "Territory", "Monthly Distribution"],
 			},
-			{
-				'label': _('References'),
-				'items': ['Period Closing Voucher']
-			},
-			{
-				'label': _('Target Details'),
-				'items': ['Sales Person', 'Sales Partner', 'Territory', 'Monthly Distribution']
-			}
-		]
+		],
 	}
diff --git a/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py
index 69e13a4..6e946f7 100644
--- a/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py
+++ b/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py
@@ -11,43 +11,48 @@
 
 test_ignore = ["Company"]
 
-class TestFiscalYear(unittest.TestCase):
 
+class TestFiscalYear(unittest.TestCase):
 	def test_extra_year(self):
 		if frappe.db.exists("Fiscal Year", "_Test Fiscal Year 2000"):
 			frappe.delete_doc("Fiscal Year", "_Test Fiscal Year 2000")
 
-		fy = frappe.get_doc({
-			"doctype": "Fiscal Year",
-			"year": "_Test Fiscal Year 2000",
-			"year_end_date": "2002-12-31",
-			"year_start_date": "2000-04-01"
-		})
+		fy = frappe.get_doc(
+			{
+				"doctype": "Fiscal Year",
+				"year": "_Test Fiscal Year 2000",
+				"year_end_date": "2002-12-31",
+				"year_start_date": "2000-04-01",
+			}
+		)
 
 		self.assertRaises(FiscalYearIncorrectDate, fy.insert)
 
 
 def test_record_generator():
 	test_records = [
-			{
-				"doctype": "Fiscal Year",
-				"year": "_Test Short Fiscal Year 2011",
-				"is_short_year": 1,
-				"year_end_date": "2011-04-01",
-				"year_start_date": "2011-12-31"
-			 }
+		{
+			"doctype": "Fiscal Year",
+			"year": "_Test Short Fiscal Year 2011",
+			"is_short_year": 1,
+			"year_end_date": "2011-04-01",
+			"year_start_date": "2011-12-31",
+		}
 	]
 
 	start = 2012
 	end = now_datetime().year + 5
 	for year in range(start, end):
-		test_records.append({
-			"doctype": "Fiscal Year",
-			"year": f"_Test Fiscal Year {year}",
-			"year_start_date": f"{year}-01-01",
-			"year_end_date": f"{year}-12-31"
-		})
+		test_records.append(
+			{
+				"doctype": "Fiscal Year",
+				"year": f"_Test Fiscal Year {year}",
+				"year_start_date": f"{year}-01-01",
+				"year_end_date": f"{year}-12-31",
+			}
+		)
 
 	return test_records
 
+
 test_records = test_record_generator()
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index 6f7a0b2..aee7f0e 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -25,6 +25,8 @@
 )
 
 exclude_from_linked_with = True
+
+
 class GLEntry(Document):
 	def autoname(self):
 		"""
@@ -57,14 +59,18 @@
 			validate_frozen_account(self.account, adv_adj)
 
 			# Update outstanding amt on against voucher
-			if (self.against_voucher_type in ['Journal Entry', 'Sales Invoice', 'Purchase Invoice', 'Fees']
-				and self.against_voucher and self.flags.update_outstanding == 'Yes'
-				and not frappe.flags.is_reverse_depr_entry):
-					update_outstanding_amt(self.account, self.party_type, self.party, self.against_voucher_type,
-						self.against_voucher)
+			if (
+				self.against_voucher_type in ["Journal Entry", "Sales Invoice", "Purchase Invoice", "Fees"]
+				and self.against_voucher
+				and self.flags.update_outstanding == "Yes"
+				and not frappe.flags.is_reverse_depr_entry
+			):
+				update_outstanding_amt(
+					self.account, self.party_type, self.party, self.against_voucher_type, self.against_voucher
+				)
 
 	def check_mandatory(self):
-		mandatory = ['account','voucher_type','voucher_no','company']
+		mandatory = ["account", "voucher_type", "voucher_no", "company"]
 		for k in mandatory:
 			if not self.get(k):
 				frappe.throw(_("{0} is required").format(_(self.meta.get_label(k))))
@@ -72,29 +78,40 @@
 		if not (self.party_type and self.party):
 			account_type = frappe.get_cached_value("Account", self.account, "account_type")
 			if account_type == "Receivable":
-				frappe.throw(_("{0} {1}: Customer is required against Receivable account {2}")
-					.format(self.voucher_type, self.voucher_no, self.account))
+				frappe.throw(
+					_("{0} {1}: Customer is required against Receivable account {2}").format(
+						self.voucher_type, self.voucher_no, self.account
+					)
+				)
 			elif account_type == "Payable":
-				frappe.throw(_("{0} {1}: Supplier is required against Payable account {2}")
-					.format(self.voucher_type, self.voucher_no, self.account))
+				frappe.throw(
+					_("{0} {1}: Supplier is required against Payable account {2}").format(
+						self.voucher_type, self.voucher_no, self.account
+					)
+				)
 
 		# Zero value transaction is not allowed
 		if not (flt(self.debit, self.precision("debit")) or flt(self.credit, self.precision("credit"))):
-			frappe.throw(_("{0} {1}: Either debit or credit amount is required for {2}")
-				.format(self.voucher_type, self.voucher_no, self.account))
+			frappe.throw(
+				_("{0} {1}: Either debit or credit amount is required for {2}").format(
+					self.voucher_type, self.voucher_no, self.account
+				)
+			)
 
 	def pl_must_have_cost_center(self):
 		"""Validate that profit and loss type account GL entries have a cost center."""
 
-		if self.cost_center or self.voucher_type == 'Period Closing Voucher':
+		if self.cost_center or self.voucher_type == "Period Closing Voucher":
 			return
 
 		if frappe.get_cached_value("Account", self.account, "report_type") == "Profit and Loss":
 			msg = _("{0} {1}: Cost Center is required for 'Profit and Loss' account {2}.").format(
-				self.voucher_type, self.voucher_no, self.account)
+				self.voucher_type, self.voucher_no, self.account
+			)
 			msg += " "
-			msg += _("Please set the cost center field in {0} or setup a default Cost Center for the Company.").format(
-				self.voucher_type)
+			msg += _(
+				"Please set the cost center field in {0} or setup a default Cost Center for the Company."
+			).format(self.voucher_type)
 
 			frappe.throw(msg, title=_("Missing Cost Center"))
 
@@ -102,17 +119,31 @@
 		account_type = frappe.db.get_value("Account", self.account, "report_type")
 
 		for dimension in get_checks_for_pl_and_bs_accounts():
-			if account_type == "Profit and Loss" \
-				and self.company == dimension.company and dimension.mandatory_for_pl and not dimension.disabled:
+			if (
+				account_type == "Profit and Loss"
+				and self.company == dimension.company
+				and dimension.mandatory_for_pl
+				and not dimension.disabled
+			):
 				if not self.get(dimension.fieldname):
-					frappe.throw(_("Accounting Dimension <b>{0}</b> is required for 'Profit and Loss' account {1}.")
-						.format(dimension.label, self.account))
+					frappe.throw(
+						_("Accounting Dimension <b>{0}</b> is required for 'Profit and Loss' account {1}.").format(
+							dimension.label, self.account
+						)
+					)
 
-			if account_type == "Balance Sheet" \
-				and self.company == dimension.company and dimension.mandatory_for_bs and not dimension.disabled:
+			if (
+				account_type == "Balance Sheet"
+				and self.company == dimension.company
+				and dimension.mandatory_for_bs
+				and not dimension.disabled
+			):
 				if not self.get(dimension.fieldname):
-					frappe.throw(_("Accounting Dimension <b>{0}</b> is required for 'Balance Sheet' account {1}.")
-						.format(dimension.label, self.account))
+					frappe.throw(
+						_("Accounting Dimension <b>{0}</b> is required for 'Balance Sheet' account {1}.").format(
+							dimension.label, self.account
+						)
+					)
 
 	def validate_allowed_dimensions(self):
 		dimension_filter_map = get_dimension_filter_map()
@@ -121,56 +152,97 @@
 			account = key[1]
 
 			if self.account == account:
-				if value['is_mandatory'] and not self.get(dimension):
-					frappe.throw(_("{0} is mandatory for account {1}").format(
-						frappe.bold(frappe.unscrub(dimension)), frappe.bold(self.account)), MandatoryAccountDimensionError)
+				if value["is_mandatory"] and not self.get(dimension):
+					frappe.throw(
+						_("{0} is mandatory for account {1}").format(
+							frappe.bold(frappe.unscrub(dimension)), frappe.bold(self.account)
+						),
+						MandatoryAccountDimensionError,
+					)
 
-				if value['allow_or_restrict'] == 'Allow':
-					if self.get(dimension) and self.get(dimension) not in value['allowed_dimensions']:
-						frappe.throw(_("Invalid value {0} for {1} against account {2}").format(
-							frappe.bold(self.get(dimension)), frappe.bold(frappe.unscrub(dimension)), frappe.bold(self.account)), InvalidAccountDimensionError)
+				if value["allow_or_restrict"] == "Allow":
+					if self.get(dimension) and self.get(dimension) not in value["allowed_dimensions"]:
+						frappe.throw(
+							_("Invalid value {0} for {1} against account {2}").format(
+								frappe.bold(self.get(dimension)),
+								frappe.bold(frappe.unscrub(dimension)),
+								frappe.bold(self.account),
+							),
+							InvalidAccountDimensionError,
+						)
 				else:
-					if self.get(dimension) and self.get(dimension) in value['allowed_dimensions']:
-						frappe.throw(_("Invalid value {0} for {1} against account {2}").format(
-							frappe.bold(self.get(dimension)), frappe.bold(frappe.unscrub(dimension)), frappe.bold(self.account)), InvalidAccountDimensionError)
+					if self.get(dimension) and self.get(dimension) in value["allowed_dimensions"]:
+						frappe.throw(
+							_("Invalid value {0} for {1} against account {2}").format(
+								frappe.bold(self.get(dimension)),
+								frappe.bold(frappe.unscrub(dimension)),
+								frappe.bold(self.account),
+							),
+							InvalidAccountDimensionError,
+						)
 
 	def check_pl_account(self):
-		if self.is_opening=='Yes' and \
-				frappe.db.get_value("Account", self.account, "report_type")=="Profit and Loss" and not self.is_cancelled:
-			frappe.throw(_("{0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry")
-				.format(self.voucher_type, self.voucher_no, self.account))
+		if (
+			self.is_opening == "Yes"
+			and frappe.db.get_value("Account", self.account, "report_type") == "Profit and Loss"
+			and not self.is_cancelled
+		):
+			frappe.throw(
+				_("{0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry").format(
+					self.voucher_type, self.voucher_no, self.account
+				)
+			)
 
 	def validate_account_details(self, adv_adj):
 		"""Account must be ledger, active and not freezed"""
 
-		ret = frappe.db.sql("""select is_group, docstatus, company
-			from tabAccount where name=%s""", self.account, as_dict=1)[0]
+		ret = frappe.db.sql(
+			"""select is_group, docstatus, company
+			from tabAccount where name=%s""",
+			self.account,
+			as_dict=1,
+		)[0]
 
-		if ret.is_group==1:
-			frappe.throw(_('''{0} {1}: Account {2} is a Group Account and group accounts cannot be used in transactions''')
-				.format(self.voucher_type, self.voucher_no, self.account))
+		if ret.is_group == 1:
+			frappe.throw(
+				_(
+					"""{0} {1}: Account {2} is a Group Account and group accounts cannot be used in transactions"""
+				).format(self.voucher_type, self.voucher_no, self.account)
+			)
 
-		if ret.docstatus==2:
-			frappe.throw(_("{0} {1}: Account {2} is inactive")
-				.format(self.voucher_type, self.voucher_no, self.account))
+		if ret.docstatus == 2:
+			frappe.throw(
+				_("{0} {1}: Account {2} is inactive").format(self.voucher_type, self.voucher_no, self.account)
+			)
 
 		if ret.company != self.company:
-			frappe.throw(_("{0} {1}: Account {2} does not belong to Company {3}")
-				.format(self.voucher_type, self.voucher_no, self.account, self.company))
+			frappe.throw(
+				_("{0} {1}: Account {2} does not belong to Company {3}").format(
+					self.voucher_type, self.voucher_no, self.account, self.company
+				)
+			)
 
 	def validate_cost_center(self):
-		if not self.cost_center: return
+		if not self.cost_center:
+			return
 
-		is_group, company = frappe.get_cached_value('Cost Center',
-			self.cost_center, ['is_group', 'company'])
+		is_group, company = frappe.get_cached_value(
+			"Cost Center", self.cost_center, ["is_group", "company"]
+		)
 
 		if company != self.company:
-			frappe.throw(_("{0} {1}: Cost Center {2} does not belong to Company {3}")
-				.format(self.voucher_type, self.voucher_no, self.cost_center, self.company))
+			frappe.throw(
+				_("{0} {1}: Cost Center {2} does not belong to Company {3}").format(
+					self.voucher_type, self.voucher_no, self.cost_center, self.company
+				)
+			)
 
-		if (self.voucher_type != 'Period Closing Voucher' and is_group):
-			frappe.throw(_("""{0} {1}: Cost Center {2} is a group cost center and group cost centers cannot be used in transactions""").format(
-				self.voucher_type, self.voucher_no, frappe.bold(self.cost_center)))
+		if self.voucher_type != "Period Closing Voucher" and is_group:
+			frappe.throw(
+				_(
+					"""{0} {1}: Cost Center {2} is a group cost center and group cost centers cannot be used in transactions"""
+				).format(self.voucher_type, self.voucher_no, frappe.bold(self.cost_center))
+			)
 
 	def validate_party(self):
 		validate_party_frozen_disabled(self.party_type, self.party)
@@ -183,9 +255,12 @@
 			self.account_currency = account_currency or company_currency
 
 		if account_currency != self.account_currency:
-			frappe.throw(_("{0} {1}: Accounting Entry for {2} can only be made in currency: {3}")
-				.format(self.voucher_type, self.voucher_no, self.account,
-				(account_currency or company_currency)), InvalidAccountCurrency)
+			frappe.throw(
+				_("{0} {1}: Accounting Entry for {2} can only be made in currency: {3}").format(
+					self.voucher_type, self.voucher_no, self.account, (account_currency or company_currency)
+				),
+				InvalidAccountCurrency,
+			)
 
 		if self.party_type and self.party:
 			validate_party_gle_currency(self.party_type, self.party, self.company, self.account_currency)
@@ -194,51 +269,80 @@
 		if not self.fiscal_year:
 			self.fiscal_year = get_fiscal_year(self.posting_date, company=self.company)[0]
 
+
 def validate_balance_type(account, adv_adj=False):
 	if not adv_adj and account:
 		balance_must_be = frappe.db.get_value("Account", account, "balance_must_be")
 		if balance_must_be:
-			balance = frappe.db.sql("""select sum(debit) - sum(credit)
-				from `tabGL Entry` where account = %s""", account)[0][0]
+			balance = frappe.db.sql(
+				"""select sum(debit) - sum(credit)
+				from `tabGL Entry` where account = %s""",
+				account,
+			)[0][0]
 
-			if (balance_must_be=="Debit" and flt(balance) < 0) or \
-				(balance_must_be=="Credit" and flt(balance) > 0):
-				frappe.throw(_("Balance for Account {0} must always be {1}").format(account, _(balance_must_be)))
+			if (balance_must_be == "Debit" and flt(balance) < 0) or (
+				balance_must_be == "Credit" and flt(balance) > 0
+			):
+				frappe.throw(
+					_("Balance for Account {0} must always be {1}").format(account, _(balance_must_be))
+				)
 
-def update_outstanding_amt(account, party_type, party, against_voucher_type, against_voucher, on_cancel=False):
+
+def update_outstanding_amt(
+	account, party_type, party, against_voucher_type, against_voucher, on_cancel=False
+):
 	if party_type and party:
-		party_condition = " and party_type={0} and party={1}"\
-			.format(frappe.db.escape(party_type), frappe.db.escape(party))
+		party_condition = " and party_type={0} and party={1}".format(
+			frappe.db.escape(party_type), frappe.db.escape(party)
+		)
 	else:
 		party_condition = ""
 
 	if against_voucher_type == "Sales Invoice":
 		party_account = frappe.db.get_value(against_voucher_type, against_voucher, "debit_to")
-		account_condition = "and account in ({0}, {1})".format(frappe.db.escape(account), frappe.db.escape(party_account))
+		account_condition = "and account in ({0}, {1})".format(
+			frappe.db.escape(account), frappe.db.escape(party_account)
+		)
 	else:
 		account_condition = " and account = {0}".format(frappe.db.escape(account))
 
 	# get final outstanding amt
-	bal = flt(frappe.db.sql("""
+	bal = flt(
+		frappe.db.sql(
+			"""
 		select sum(debit_in_account_currency) - sum(credit_in_account_currency)
 		from `tabGL Entry`
 		where against_voucher_type=%s and against_voucher=%s
 		and voucher_type != 'Invoice Discounting'
-		{0} {1}""".format(party_condition, account_condition),
-		(against_voucher_type, against_voucher))[0][0] or 0.0)
+		{0} {1}""".format(
+				party_condition, account_condition
+			),
+			(against_voucher_type, against_voucher),
+		)[0][0]
+		or 0.0
+	)
 
-	if against_voucher_type == 'Purchase Invoice':
+	if against_voucher_type == "Purchase Invoice":
 		bal = -bal
 	elif against_voucher_type == "Journal Entry":
-		against_voucher_amount = flt(frappe.db.sql("""
+		against_voucher_amount = flt(
+			frappe.db.sql(
+				"""
 			select sum(debit_in_account_currency) - sum(credit_in_account_currency)
 			from `tabGL Entry` where voucher_type = 'Journal Entry' and voucher_no = %s
-			and account = %s and (against_voucher is null or against_voucher='') {0}"""
-			.format(party_condition), (against_voucher, account))[0][0])
+			and account = %s and (against_voucher is null or against_voucher='') {0}""".format(
+					party_condition
+				),
+				(against_voucher, account),
+			)[0][0]
+		)
 
 		if not against_voucher_amount:
-			frappe.throw(_("Against Journal Entry {0} is already adjusted against some other voucher")
-				.format(against_voucher))
+			frappe.throw(
+				_("Against Journal Entry {0} is already adjusted against some other voucher").format(
+					against_voucher
+				)
+			)
 
 		bal = against_voucher_amount + bal
 		if against_voucher_amount < 0:
@@ -246,44 +350,51 @@
 
 		# Validation : Outstanding can not be negative for JV
 		if bal < 0 and not on_cancel:
-			frappe.throw(_("Outstanding for {0} cannot be less than zero ({1})").format(against_voucher, fmt_money(bal)))
+			frappe.throw(
+				_("Outstanding for {0} cannot be less than zero ({1})").format(against_voucher, fmt_money(bal))
+			)
 
 	if against_voucher_type in ["Sales Invoice", "Purchase Invoice", "Fees"]:
 		ref_doc = frappe.get_doc(against_voucher_type, against_voucher)
 
 		# Didn't use db_set for optimisation purpose
 		ref_doc.outstanding_amount = bal
-		frappe.db.set_value(against_voucher_type, against_voucher, 'outstanding_amount', bal)
+		frappe.db.set_value(against_voucher_type, against_voucher, "outstanding_amount", bal)
 
 		ref_doc.set_status(update=True)
 
 
 def validate_frozen_account(account, adv_adj=None):
 	frozen_account = frappe.get_cached_value("Account", account, "freeze_account")
-	if frozen_account == 'Yes' and not adv_adj:
-		frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,
-			'frozen_accounts_modifier')
+	if frozen_account == "Yes" and not adv_adj:
+		frozen_accounts_modifier = frappe.db.get_value(
+			"Accounts Settings", None, "frozen_accounts_modifier"
+		)
 
 		if not frozen_accounts_modifier:
 			frappe.throw(_("Account {0} is frozen").format(account))
 		elif frozen_accounts_modifier not in frappe.get_roles():
 			frappe.throw(_("Not authorized to edit frozen Account {0}").format(account))
 
+
 def update_against_account(voucher_type, voucher_no):
-	entries = frappe.db.get_all("GL Entry",
+	entries = frappe.db.get_all(
+		"GL Entry",
 		filters={"voucher_type": voucher_type, "voucher_no": voucher_no},
-		fields=["name", "party", "against", "debit", "credit", "account", "company"])
+		fields=["name", "party", "against", "debit", "credit", "account", "company"],
+	)
 
 	if not entries:
 		return
 	company_currency = erpnext.get_company_currency(entries[0].company)
-	precision = get_field_precision(frappe.get_meta("GL Entry")
-			.get_field("debit"), company_currency)
+	precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"), company_currency)
 
 	accounts_debited, accounts_credited = [], []
 	for d in entries:
-		if flt(d.debit, precision) > 0: accounts_debited.append(d.party or d.account)
-		if flt(d.credit, precision) > 0: accounts_credited.append(d.party or d.account)
+		if flt(d.debit, precision) > 0:
+			accounts_debited.append(d.party or d.account)
+		if flt(d.credit, precision) > 0:
+			accounts_credited.append(d.party or d.account)
 
 	for d in entries:
 		if flt(d.debit, precision) > 0:
@@ -294,14 +405,17 @@
 		if d.against != new_against:
 			frappe.db.set_value("GL Entry", d.name, "against", new_against)
 
+
 def on_doctype_update():
 	frappe.db.add_index("GL Entry", ["against_voucher_type", "against_voucher"])
 	frappe.db.add_index("GL Entry", ["voucher_type", "voucher_no"])
 
+
 def rename_gle_sle_docs():
 	for doctype in ["GL Entry", "Stock Ledger Entry"]:
 		rename_temporarily_named_docs(doctype)
 
+
 def rename_temporarily_named_docs(doctype):
 	"""Rename temporarily named docs using autoname options"""
 	docs_to_rename = frappe.get_all(doctype, {"to_rename": "1"}, order_by="creation", limit=50000)
@@ -312,5 +426,5 @@
 		frappe.db.sql(
 			"UPDATE `tab{}` SET name = %s, to_rename = 0 where name = %s".format(doctype),
 			(newname, oldname),
-			auto_commit=True
+			auto_commit=True,
 		)
diff --git a/erpnext/accounts/doctype/gl_entry/test_gl_entry.py b/erpnext/accounts/doctype/gl_entry/test_gl_entry.py
index 3de2394..b188b09 100644
--- a/erpnext/accounts/doctype/gl_entry/test_gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/test_gl_entry.py
@@ -14,48 +14,68 @@
 class TestGLEntry(unittest.TestCase):
 	def test_round_off_entry(self):
 		frappe.db.set_value("Company", "_Test Company", "round_off_account", "_Test Write Off - _TC")
-		frappe.db.set_value("Company", "_Test Company", "round_off_cost_center", "_Test Cost Center - _TC")
+		frappe.db.set_value(
+			"Company", "_Test Company", "round_off_cost_center", "_Test Cost Center - _TC"
+		)
 
-		jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
-			"_Test Bank - _TC", 100, "_Test Cost Center - _TC", submit=False)
+		jv = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC",
+			"_Test Bank - _TC",
+			100,
+			"_Test Cost Center - _TC",
+			submit=False,
+		)
 
 		jv.get("accounts")[0].debit = 100.01
 		jv.flags.ignore_validate = True
 		jv.submit()
 
-		round_off_entry = frappe.db.sql("""select name from `tabGL Entry`
+		round_off_entry = frappe.db.sql(
+			"""select name from `tabGL Entry`
 			where voucher_type='Journal Entry' and voucher_no = %s
 			and account='_Test Write Off - _TC' and cost_center='_Test Cost Center - _TC'
-			and debit = 0 and credit = '.01'""", jv.name)
+			and debit = 0 and credit = '.01'""",
+			jv.name,
+		)
 
 		self.assertTrue(round_off_entry)
 
 	def test_rename_entries(self):
-		je = make_journal_entry("_Test Account Cost for Goods Sold - _TC", "_Test Bank - _TC", 100, submit=True)
+		je = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC", "_Test Bank - _TC", 100, submit=True
+		)
 		rename_gle_sle_docs()
 		naming_series = parse_naming_series(parts=frappe.get_meta("GL Entry").autoname.split(".")[:-1])
 
-		je = make_journal_entry("_Test Account Cost for Goods Sold - _TC", "_Test Bank - _TC", 100, submit=True)
+		je = make_journal_entry(
+			"_Test Account Cost for Goods Sold - _TC", "_Test Bank - _TC", 100, submit=True
+		)
 
-		gl_entries = frappe.get_all("GL Entry",
+		gl_entries = frappe.get_all(
+			"GL Entry",
 			fields=["name", "to_rename"],
 			filters={"voucher_type": "Journal Entry", "voucher_no": je.name},
-			order_by="creation"
+			order_by="creation",
 		)
 
 		self.assertTrue(all(entry.to_rename == 1 for entry in gl_entries))
-		old_naming_series_current_value = frappe.db.sql("SELECT current from tabSeries where name = %s", naming_series)[0][0]
+		old_naming_series_current_value = frappe.db.sql(
+			"SELECT current from tabSeries where name = %s", naming_series
+		)[0][0]
 
 		rename_gle_sle_docs()
 
-		new_gl_entries = frappe.get_all("GL Entry",
+		new_gl_entries = frappe.get_all(
+			"GL Entry",
 			fields=["name", "to_rename"],
 			filters={"voucher_type": "Journal Entry", "voucher_no": je.name},
-			order_by="creation"
+			order_by="creation",
 		)
 		self.assertTrue(all(entry.to_rename == 0 for entry in new_gl_entries))
 
 		self.assertTrue(all(new.name != old.name for new, old in zip(gl_entries, new_gl_entries)))
 
-		new_naming_series_current_value = frappe.db.sql("SELECT current from tabSeries where name = %s", naming_series)[0][0]
+		new_naming_series_current_value = frappe.db.sql(
+			"SELECT current from tabSeries where name = %s", naming_series
+		)[0][0]
 		self.assertEqual(old_naming_series_current_value + 2, new_naming_series_current_value)
diff --git a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py
index 09c389d..5bd4585 100644
--- a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py
+++ b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py
@@ -33,19 +33,32 @@
 			frappe.throw(_("Loan Start Date and Loan Period are mandatory to save the Invoice Discounting"))
 
 	def validate_invoices(self):
-		discounted_invoices = [record.sales_invoice for record in
-			frappe.get_all("Discounted Invoice",fields=["sales_invoice"], filters={"docstatus":1})]
+		discounted_invoices = [
+			record.sales_invoice
+			for record in frappe.get_all(
+				"Discounted Invoice", fields=["sales_invoice"], filters={"docstatus": 1}
+			)
+		]
 
 		for record in self.invoices:
 			if record.sales_invoice in discounted_invoices:
-				frappe.throw(_("Row({0}): {1} is already discounted in {2}")
-					.format(record.idx, frappe.bold(record.sales_invoice), frappe.bold(record.parent)))
+				frappe.throw(
+					_("Row({0}): {1} is already discounted in {2}").format(
+						record.idx, frappe.bold(record.sales_invoice), frappe.bold(record.parent)
+					)
+				)
 
-			actual_outstanding = frappe.db.get_value("Sales Invoice", record.sales_invoice,"outstanding_amount")
-			if record.outstanding_amount > actual_outstanding :
-				frappe.throw(_
-					("Row({0}): Outstanding Amount cannot be greater than actual Outstanding Amount {1} in {2}").format(
-					record.idx, frappe.bold(actual_outstanding), frappe.bold(record.sales_invoice)))
+			actual_outstanding = frappe.db.get_value(
+				"Sales Invoice", record.sales_invoice, "outstanding_amount"
+			)
+			if record.outstanding_amount > actual_outstanding:
+				frappe.throw(
+					_(
+						"Row({0}): Outstanding Amount cannot be greater than actual Outstanding Amount {1} in {2}"
+					).format(
+						record.idx, frappe.bold(actual_outstanding), frappe.bold(record.sales_invoice)
+					)
+				)
 
 	def calculate_total_amount(self):
 		self.total_amount = sum(flt(d.outstanding_amount) for d in self.invoices)
@@ -73,24 +86,21 @@
 				self.status = "Cancelled"
 
 		if cancel:
-			self.db_set('status', self.status, update_modified = True)
+			self.db_set("status", self.status, update_modified=True)
 
 	def update_sales_invoice(self):
 		for d in self.invoices:
 			if self.docstatus == 1:
 				is_discounted = 1
 			else:
-				discounted_invoice = frappe.db.exists({
-					"doctype": "Discounted Invoice",
-					"sales_invoice": d.sales_invoice,
-					"docstatus": 1
-				})
+				discounted_invoice = frappe.db.exists(
+					{"doctype": "Discounted Invoice", "sales_invoice": d.sales_invoice, "docstatus": 1}
+				)
 				is_discounted = 1 if discounted_invoice else 0
 			frappe.db.set_value("Sales Invoice", d.sales_invoice, "is_discounted", is_discounted)
 
 	def make_gl_entries(self):
-		company_currency = frappe.get_cached_value('Company',  self.company, "default_currency")
-
+		company_currency = frappe.get_cached_value("Company", self.company, "default_currency")
 
 		gl_entries = []
 		invoice_fields = ["debit_to", "party_account_currency", "conversion_rate", "cost_center"]
@@ -102,135 +112,182 @@
 			inv = frappe.db.get_value("Sales Invoice", d.sales_invoice, invoice_fields, as_dict=1)
 
 			if d.outstanding_amount:
-				outstanding_in_company_currency = flt(d.outstanding_amount * inv.conversion_rate,
-					d.precision("outstanding_amount"))
-				ar_credit_account_currency = frappe.get_cached_value("Account", self.accounts_receivable_credit, "currency")
+				outstanding_in_company_currency = flt(
+					d.outstanding_amount * inv.conversion_rate, d.precision("outstanding_amount")
+				)
+				ar_credit_account_currency = frappe.get_cached_value(
+					"Account", self.accounts_receivable_credit, "currency"
+				)
 
-				gl_entries.append(self.get_gl_dict({
-					"account": inv.debit_to,
-					"party_type": "Customer",
-					"party": d.customer,
-					"against": self.accounts_receivable_credit,
-					"credit": outstanding_in_company_currency,
-					"credit_in_account_currency": outstanding_in_company_currency \
-						if inv.party_account_currency==company_currency else d.outstanding_amount,
-					"cost_center": inv.cost_center,
-					"against_voucher": d.sales_invoice,
-					"against_voucher_type": "Sales Invoice"
-				}, inv.party_account_currency, item=inv))
+				gl_entries.append(
+					self.get_gl_dict(
+						{
+							"account": inv.debit_to,
+							"party_type": "Customer",
+							"party": d.customer,
+							"against": self.accounts_receivable_credit,
+							"credit": outstanding_in_company_currency,
+							"credit_in_account_currency": outstanding_in_company_currency
+							if inv.party_account_currency == company_currency
+							else d.outstanding_amount,
+							"cost_center": inv.cost_center,
+							"against_voucher": d.sales_invoice,
+							"against_voucher_type": "Sales Invoice",
+						},
+						inv.party_account_currency,
+						item=inv,
+					)
+				)
 
-				gl_entries.append(self.get_gl_dict({
-					"account": self.accounts_receivable_credit,
-					"party_type": "Customer",
-					"party": d.customer,
-					"against": inv.debit_to,
-					"debit": outstanding_in_company_currency,
-					"debit_in_account_currency": outstanding_in_company_currency \
-						if ar_credit_account_currency==company_currency else d.outstanding_amount,
-					"cost_center": inv.cost_center,
-					"against_voucher": d.sales_invoice,
-					"against_voucher_type": "Sales Invoice"
-				}, ar_credit_account_currency, item=inv))
+				gl_entries.append(
+					self.get_gl_dict(
+						{
+							"account": self.accounts_receivable_credit,
+							"party_type": "Customer",
+							"party": d.customer,
+							"against": inv.debit_to,
+							"debit": outstanding_in_company_currency,
+							"debit_in_account_currency": outstanding_in_company_currency
+							if ar_credit_account_currency == company_currency
+							else d.outstanding_amount,
+							"cost_center": inv.cost_center,
+							"against_voucher": d.sales_invoice,
+							"against_voucher_type": "Sales Invoice",
+						},
+						ar_credit_account_currency,
+						item=inv,
+					)
+				)
 
-		make_gl_entries(gl_entries, cancel=(self.docstatus == 2), update_outstanding='No')
+		make_gl_entries(gl_entries, cancel=(self.docstatus == 2), update_outstanding="No")
 
 	@frappe.whitelist()
 	def create_disbursement_entry(self):
 		je = frappe.new_doc("Journal Entry")
-		je.voucher_type = 'Journal Entry'
+		je.voucher_type = "Journal Entry"
 		je.company = self.company
-		je.remark = 'Loan Disbursement entry against Invoice Discounting: ' + self.name
+		je.remark = "Loan Disbursement entry against Invoice Discounting: " + self.name
 
-		je.append("accounts", {
-			"account": self.bank_account,
-			"debit_in_account_currency": flt(self.total_amount) - flt(self.bank_charges),
-			"cost_center": erpnext.get_default_cost_center(self.company)
-		})
+		je.append(
+			"accounts",
+			{
+				"account": self.bank_account,
+				"debit_in_account_currency": flt(self.total_amount) - flt(self.bank_charges),
+				"cost_center": erpnext.get_default_cost_center(self.company),
+			},
+		)
 
 		if self.bank_charges:
-			je.append("accounts", {
-				"account": self.bank_charges_account,
-				"debit_in_account_currency": flt(self.bank_charges),
-				"cost_center": erpnext.get_default_cost_center(self.company)
-			})
+			je.append(
+				"accounts",
+				{
+					"account": self.bank_charges_account,
+					"debit_in_account_currency": flt(self.bank_charges),
+					"cost_center": erpnext.get_default_cost_center(self.company),
+				},
+			)
 
-		je.append("accounts", {
-			"account": self.short_term_loan,
-			"credit_in_account_currency": flt(self.total_amount),
-			"cost_center": erpnext.get_default_cost_center(self.company),
-			"reference_type": "Invoice Discounting",
-			"reference_name": self.name
-		})
+		je.append(
+			"accounts",
+			{
+				"account": self.short_term_loan,
+				"credit_in_account_currency": flt(self.total_amount),
+				"cost_center": erpnext.get_default_cost_center(self.company),
+				"reference_type": "Invoice Discounting",
+				"reference_name": self.name,
+			},
+		)
 		for d in self.invoices:
-			je.append("accounts", {
-				"account": self.accounts_receivable_discounted,
-				"debit_in_account_currency": flt(d.outstanding_amount),
-				"cost_center": erpnext.get_default_cost_center(self.company),
-				"reference_type": "Invoice Discounting",
-				"reference_name": self.name,
-				"party_type": "Customer",
-				"party": d.customer
-			})
+			je.append(
+				"accounts",
+				{
+					"account": self.accounts_receivable_discounted,
+					"debit_in_account_currency": flt(d.outstanding_amount),
+					"cost_center": erpnext.get_default_cost_center(self.company),
+					"reference_type": "Invoice Discounting",
+					"reference_name": self.name,
+					"party_type": "Customer",
+					"party": d.customer,
+				},
+			)
 
-			je.append("accounts", {
-				"account": self.accounts_receivable_credit,
-				"credit_in_account_currency": flt(d.outstanding_amount),
-				"cost_center": erpnext.get_default_cost_center(self.company),
-				"reference_type": "Invoice Discounting",
-				"reference_name": self.name,
-				"party_type": "Customer",
-				"party": d.customer
-			})
+			je.append(
+				"accounts",
+				{
+					"account": self.accounts_receivable_credit,
+					"credit_in_account_currency": flt(d.outstanding_amount),
+					"cost_center": erpnext.get_default_cost_center(self.company),
+					"reference_type": "Invoice Discounting",
+					"reference_name": self.name,
+					"party_type": "Customer",
+					"party": d.customer,
+				},
+			)
 
 		return je
 
 	@frappe.whitelist()
 	def close_loan(self):
 		je = frappe.new_doc("Journal Entry")
-		je.voucher_type = 'Journal Entry'
+		je.voucher_type = "Journal Entry"
 		je.company = self.company
-		je.remark = 'Loan Settlement entry against Invoice Discounting: ' + self.name
+		je.remark = "Loan Settlement entry against Invoice Discounting: " + self.name
 
-		je.append("accounts", {
-			"account": self.short_term_loan,
-			"debit_in_account_currency": flt(self.total_amount),
-			"cost_center": erpnext.get_default_cost_center(self.company),
-			"reference_type": "Invoice Discounting",
-			"reference_name": self.name,
-		})
+		je.append(
+			"accounts",
+			{
+				"account": self.short_term_loan,
+				"debit_in_account_currency": flt(self.total_amount),
+				"cost_center": erpnext.get_default_cost_center(self.company),
+				"reference_type": "Invoice Discounting",
+				"reference_name": self.name,
+			},
+		)
 
-		je.append("accounts", {
-			"account": self.bank_account,
-			"credit_in_account_currency": flt(self.total_amount),
-			"cost_center": erpnext.get_default_cost_center(self.company)
-		})
+		je.append(
+			"accounts",
+			{
+				"account": self.bank_account,
+				"credit_in_account_currency": flt(self.total_amount),
+				"cost_center": erpnext.get_default_cost_center(self.company),
+			},
+		)
 
 		if getdate(self.loan_end_date) > getdate(nowdate()):
 			for d in self.invoices:
-				outstanding_amount = frappe.db.get_value("Sales Invoice", d.sales_invoice, "outstanding_amount")
+				outstanding_amount = frappe.db.get_value(
+					"Sales Invoice", d.sales_invoice, "outstanding_amount"
+				)
 				if flt(outstanding_amount) > 0:
-					je.append("accounts", {
-						"account": self.accounts_receivable_discounted,
-						"credit_in_account_currency": flt(outstanding_amount),
-						"cost_center": erpnext.get_default_cost_center(self.company),
-						"reference_type": "Invoice Discounting",
-						"reference_name": self.name,
-						"party_type": "Customer",
-						"party": d.customer
-					})
+					je.append(
+						"accounts",
+						{
+							"account": self.accounts_receivable_discounted,
+							"credit_in_account_currency": flt(outstanding_amount),
+							"cost_center": erpnext.get_default_cost_center(self.company),
+							"reference_type": "Invoice Discounting",
+							"reference_name": self.name,
+							"party_type": "Customer",
+							"party": d.customer,
+						},
+					)
 
-					je.append("accounts", {
-						"account": self.accounts_receivable_unpaid,
-						"debit_in_account_currency": flt(outstanding_amount),
-						"cost_center": erpnext.get_default_cost_center(self.company),
-						"reference_type": "Invoice Discounting",
-						"reference_name": self.name,
-						"party_type": "Customer",
-						"party": d.customer
-					})
+					je.append(
+						"accounts",
+						{
+							"account": self.accounts_receivable_unpaid,
+							"debit_in_account_currency": flt(outstanding_amount),
+							"cost_center": erpnext.get_default_cost_center(self.company),
+							"reference_type": "Invoice Discounting",
+							"reference_name": self.name,
+							"party_type": "Customer",
+							"party": d.customer,
+						},
+					)
 
 		return je
 
+
 @frappe.whitelist()
 def get_invoices(filters):
 	filters = frappe._dict(json.loads(filters))
@@ -250,7 +307,8 @@
 	if cond:
 		where_condition += " and " + " and ".join(cond)
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			name as sales_invoice,
 			customer,
@@ -264,17 +322,26 @@
 			%s
 			and not exists(select di.name from `tabDiscounted Invoice` di
 				where di.docstatus=1 and di.sales_invoice=si.name)
-	""" % where_condition, filters, as_dict=1)
+	"""
+		% where_condition,
+		filters,
+		as_dict=1,
+	)
+
 
 def get_party_account_based_on_invoice_discounting(sales_invoice):
 	party_account = None
-	invoice_discounting = frappe.db.sql("""
+	invoice_discounting = frappe.db.sql(
+		"""
 		select par.accounts_receivable_discounted, par.accounts_receivable_unpaid, par.status
 		from `tabInvoice Discounting` par, `tabDiscounted Invoice` ch
 		where par.name=ch.parent
 			and par.docstatus=1
 			and ch.sales_invoice = %s
-	""", (sales_invoice), as_dict=1)
+	""",
+		(sales_invoice),
+		as_dict=1,
+	)
 	if invoice_discounting:
 		if invoice_discounting[0].status == "Disbursed":
 			party_account = invoice_discounting[0].accounts_receivable_discounted
diff --git a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting_dashboard.py b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting_dashboard.py
index b748429..a442231 100644
--- a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting_dashboard.py
+++ b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting_dashboard.py
@@ -3,18 +3,10 @@
 
 def get_data():
 	return {
-		'fieldname': 'reference_name',
-		'internal_links': {
-			'Sales Invoice': ['invoices', 'sales_invoice']
-		},
-		'transactions': [
-			{
-				'label': _('Reference'),
-				'items': ['Sales Invoice']
-			},
-			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Journal Entry']
-			}
-		]
+		"fieldname": "reference_name",
+		"internal_links": {"Sales Invoice": ["invoices", "sales_invoice"]},
+		"transactions": [
+			{"label": _("Reference"), "items": ["Sales Invoice"]},
+			{"label": _("Payment"), "items": ["Payment Entry", "Journal Entry"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py b/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py
index d1d4be3..a85fdfc 100644
--- a/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py
+++ b/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py
@@ -14,52 +14,74 @@
 
 class TestInvoiceDiscounting(unittest.TestCase):
 	def setUp(self):
-		self.ar_credit = create_account(account_name="_Test Accounts Receivable Credit", parent_account = "Accounts Receivable - _TC", company="_Test Company")
-		self.ar_discounted = create_account(account_name="_Test Accounts Receivable Discounted", parent_account = "Accounts Receivable - _TC", company="_Test Company")
-		self.ar_unpaid = create_account(account_name="_Test Accounts Receivable Unpaid", parent_account = "Accounts Receivable - _TC", company="_Test Company")
-		self.short_term_loan = create_account(account_name="_Test Short Term Loan", parent_account = "Source of Funds (Liabilities) - _TC", company="_Test Company")
-		self.bank_account = create_account(account_name="_Test Bank 2", parent_account = "Bank Accounts - _TC", company="_Test Company")
-		self.bank_charges_account = create_account(account_name="_Test Bank Charges Account", parent_account = "Expenses - _TC", company="_Test Company")
+		self.ar_credit = create_account(
+			account_name="_Test Accounts Receivable Credit",
+			parent_account="Accounts Receivable - _TC",
+			company="_Test Company",
+		)
+		self.ar_discounted = create_account(
+			account_name="_Test Accounts Receivable Discounted",
+			parent_account="Accounts Receivable - _TC",
+			company="_Test Company",
+		)
+		self.ar_unpaid = create_account(
+			account_name="_Test Accounts Receivable Unpaid",
+			parent_account="Accounts Receivable - _TC",
+			company="_Test Company",
+		)
+		self.short_term_loan = create_account(
+			account_name="_Test Short Term Loan",
+			parent_account="Source of Funds (Liabilities) - _TC",
+			company="_Test Company",
+		)
+		self.bank_account = create_account(
+			account_name="_Test Bank 2", parent_account="Bank Accounts - _TC", company="_Test Company"
+		)
+		self.bank_charges_account = create_account(
+			account_name="_Test Bank Charges Account",
+			parent_account="Expenses - _TC",
+			company="_Test Company",
+		)
 		frappe.db.set_value("Company", "_Test Company", "default_bank_account", self.bank_account)
 
 	def test_total_amount(self):
 		inv1 = create_sales_invoice(rate=200)
 		inv2 = create_sales_invoice(rate=500)
 
-		inv_disc = create_invoice_discounting([inv1.name, inv2.name],
+		inv_disc = create_invoice_discounting(
+			[inv1.name, inv2.name],
 			do_not_submit=True,
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
 			short_term_loan=self.short_term_loan,
 			bank_charges_account=self.bank_charges_account,
-			bank_account=self.bank_account
-			)
+			bank_account=self.bank_account,
+		)
 		self.assertEqual(inv_disc.total_amount, 700)
 
 	def test_gl_entries_in_base_currency(self):
 		inv = create_sales_invoice(rate=200)
-		inv_disc = create_invoice_discounting([inv.name],
+		inv_disc = create_invoice_discounting(
+			[inv.name],
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
 			short_term_loan=self.short_term_loan,
 			bank_charges_account=self.bank_charges_account,
-			bank_account=self.bank_account
-			)
+			bank_account=self.bank_account,
+		)
 
 		gle = get_gl_entries("Invoice Discounting", inv_disc.name)
 
-		expected_gle = {
-			inv.debit_to: [0.0, 200],
-			self.ar_credit: [200, 0.0]
-		}
+		expected_gle = {inv.debit_to: [0.0, 200], self.ar_credit: [200, 0.0]}
 		for i, gle in enumerate(gle):
 			self.assertEqual([gle.debit, gle.credit], expected_gle.get(gle.account))
 
 	def test_loan_on_submit(self):
 		inv = create_sales_invoice(rate=300)
-		inv_disc = create_invoice_discounting([inv.name],
+		inv_disc = create_invoice_discounting(
+			[inv.name],
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
@@ -67,28 +89,33 @@
 			bank_charges_account=self.bank_charges_account,
 			bank_account=self.bank_account,
 			start=nowdate(),
-			period=60
-			)
+			period=60,
+		)
 		self.assertEqual(inv_disc.status, "Sanctioned")
-		self.assertEqual(inv_disc.loan_end_date, add_days(inv_disc.loan_start_date, inv_disc.loan_period))
-
+		self.assertEqual(
+			inv_disc.loan_end_date, add_days(inv_disc.loan_start_date, inv_disc.loan_period)
+		)
 
 	def test_on_disbursed(self):
 		inv = create_sales_invoice(rate=500)
-		inv_disc = create_invoice_discounting([inv.name],
+		inv_disc = create_invoice_discounting(
+			[inv.name],
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
 			short_term_loan=self.short_term_loan,
 			bank_charges_account=self.bank_charges_account,
 			bank_account=self.bank_account,
-			bank_charges=100
-			)
+			bank_charges=100,
+		)
 
 		je = inv_disc.create_disbursement_entry()
 
 		self.assertEqual(je.accounts[0].account, self.bank_account)
-		self.assertEqual(je.accounts[0].debit_in_account_currency, flt(inv_disc.total_amount) - flt(inv_disc.bank_charges))
+		self.assertEqual(
+			je.accounts[0].debit_in_account_currency,
+			flt(inv_disc.total_amount) - flt(inv_disc.bank_charges),
+		)
 
 		self.assertEqual(je.accounts[1].account, self.bank_charges_account)
 		self.assertEqual(je.accounts[1].debit_in_account_currency, flt(inv_disc.bank_charges))
@@ -102,7 +129,6 @@
 		self.assertEqual(je.accounts[4].account, self.ar_credit)
 		self.assertEqual(je.accounts[4].credit_in_account_currency, flt(inv.outstanding_amount))
 
-
 		je.posting_date = nowdate()
 		je.submit()
 
@@ -114,7 +140,8 @@
 
 	def test_on_close_after_loan_period(self):
 		inv = create_sales_invoice(rate=600)
-		inv_disc = create_invoice_discounting([inv.name],
+		inv_disc = create_invoice_discounting(
+			[inv.name],
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
@@ -122,8 +149,8 @@
 			bank_charges_account=self.bank_charges_account,
 			bank_account=self.bank_account,
 			start=nowdate(),
-			period=60
-			)
+			period=60,
+		)
 
 		je1 = inv_disc.create_disbursement_entry()
 		je1.posting_date = nowdate()
@@ -151,7 +178,8 @@
 
 	def test_on_close_after_loan_period_after_inv_payment(self):
 		inv = create_sales_invoice(rate=600)
-		inv_disc = create_invoice_discounting([inv.name],
+		inv_disc = create_invoice_discounting(
+			[inv.name],
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
@@ -159,8 +187,8 @@
 			bank_charges_account=self.bank_charges_account,
 			bank_account=self.bank_account,
 			start=nowdate(),
-			period=60
-			)
+			period=60,
+		)
 
 		je1 = inv_disc.create_disbursement_entry()
 		je1.posting_date = nowdate()
@@ -183,7 +211,8 @@
 
 	def test_on_close_before_loan_period(self):
 		inv = create_sales_invoice(rate=700)
-		inv_disc = create_invoice_discounting([inv.name],
+		inv_disc = create_invoice_discounting(
+			[inv.name],
 			accounts_receivable_credit=self.ar_credit,
 			accounts_receivable_discounted=self.ar_discounted,
 			accounts_receivable_unpaid=self.ar_unpaid,
@@ -191,7 +220,7 @@
 			bank_charges_account=self.bank_charges_account,
 			bank_account=self.bank_account,
 			start=add_days(nowdate(), -80),
-			period=60
+			period=60,
 		)
 
 		je1 = inv_disc.create_disbursement_entry()
@@ -209,16 +238,17 @@
 		self.assertEqual(je2.accounts[1].credit_in_account_currency, flt(inv_disc.total_amount))
 
 	def test_make_payment_before_loan_period(self):
-		#it has problem
+		# it has problem
 		inv = create_sales_invoice(rate=700)
-		inv_disc = create_invoice_discounting([inv.name],
-				accounts_receivable_credit=self.ar_credit,
-				accounts_receivable_discounted=self.ar_discounted,
-				accounts_receivable_unpaid=self.ar_unpaid,
-				short_term_loan=self.short_term_loan,
-				bank_charges_account=self.bank_charges_account,
-				bank_account=self.bank_account
-				)
+		inv_disc = create_invoice_discounting(
+			[inv.name],
+			accounts_receivable_credit=self.ar_credit,
+			accounts_receivable_discounted=self.ar_discounted,
+			accounts_receivable_unpaid=self.ar_unpaid,
+			short_term_loan=self.short_term_loan,
+			bank_charges_account=self.bank_charges_account,
+			bank_account=self.bank_account,
+		)
 		je = inv_disc.create_disbursement_entry()
 		inv_disc.reload()
 		je.posting_date = nowdate()
@@ -232,26 +262,31 @@
 		je_on_payment.submit()
 
 		self.assertEqual(je_on_payment.accounts[0].account, self.ar_discounted)
-		self.assertEqual(je_on_payment.accounts[0].credit_in_account_currency, flt(inv.outstanding_amount))
+		self.assertEqual(
+			je_on_payment.accounts[0].credit_in_account_currency, flt(inv.outstanding_amount)
+		)
 		self.assertEqual(je_on_payment.accounts[1].account, self.bank_account)
-		self.assertEqual(je_on_payment.accounts[1].debit_in_account_currency, flt(inv.outstanding_amount))
+		self.assertEqual(
+			je_on_payment.accounts[1].debit_in_account_currency, flt(inv.outstanding_amount)
+		)
 
 		inv.reload()
 		self.assertEqual(inv.outstanding_amount, 0)
 
 	def test_make_payment_before_after_period(self):
-		#it has problem
+		# it has problem
 		inv = create_sales_invoice(rate=700)
-		inv_disc = create_invoice_discounting([inv.name],
-				accounts_receivable_credit=self.ar_credit,
-				accounts_receivable_discounted=self.ar_discounted,
-				accounts_receivable_unpaid=self.ar_unpaid,
-				short_term_loan=self.short_term_loan,
-				bank_charges_account=self.bank_charges_account,
-				bank_account=self.bank_account,
-				loan_start_date=add_days(nowdate(), -10),
-				period=5
-				)
+		inv_disc = create_invoice_discounting(
+			[inv.name],
+			accounts_receivable_credit=self.ar_credit,
+			accounts_receivable_discounted=self.ar_discounted,
+			accounts_receivable_unpaid=self.ar_unpaid,
+			short_term_loan=self.short_term_loan,
+			bank_charges_account=self.bank_charges_account,
+			bank_account=self.bank_account,
+			loan_start_date=add_days(nowdate(), -10),
+			period=5,
+		)
 		je = inv_disc.create_disbursement_entry()
 		inv_disc.reload()
 		je.posting_date = nowdate()
@@ -269,9 +304,13 @@
 		je_on_payment.submit()
 
 		self.assertEqual(je_on_payment.accounts[0].account, self.ar_unpaid)
-		self.assertEqual(je_on_payment.accounts[0].credit_in_account_currency, flt(inv.outstanding_amount))
+		self.assertEqual(
+			je_on_payment.accounts[0].credit_in_account_currency, flt(inv.outstanding_amount)
+		)
 		self.assertEqual(je_on_payment.accounts[1].account, self.bank_account)
-		self.assertEqual(je_on_payment.accounts[1].debit_in_account_currency, flt(inv.outstanding_amount))
+		self.assertEqual(
+			je_on_payment.accounts[1].debit_in_account_currency, flt(inv.outstanding_amount)
+		)
 
 		inv.reload()
 		self.assertEqual(inv.outstanding_amount, 0)
@@ -287,17 +326,15 @@
 	inv_disc.accounts_receivable_credit = args.accounts_receivable_credit
 	inv_disc.accounts_receivable_discounted = args.accounts_receivable_discounted
 	inv_disc.accounts_receivable_unpaid = args.accounts_receivable_unpaid
-	inv_disc.short_term_loan=args.short_term_loan
-	inv_disc.bank_charges_account=args.bank_charges_account
-	inv_disc.bank_account=args.bank_account
+	inv_disc.short_term_loan = args.short_term_loan
+	inv_disc.bank_charges_account = args.bank_charges_account
+	inv_disc.bank_account = args.bank_account
 	inv_disc.loan_start_date = args.start or nowdate()
 	inv_disc.loan_period = args.period or 30
 	inv_disc.bank_charges = flt(args.bank_charges)
 
 	for d in invoices:
-		inv_disc.append("invoices", {
-			"sales_invoice": d
-		})
+		inv_disc.append("invoices", {"sales_invoice": d})
 	inv_disc.insert()
 
 	if not args.do_not_submit:
diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/item_tax_template.py
index 0ceb6a0..23f36ec 100644
--- a/erpnext/accounts/doctype/item_tax_template/item_tax_template.py
+++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template.py
@@ -13,20 +13,28 @@
 
 	def autoname(self):
 		if self.company and self.title:
-			abbr = frappe.get_cached_value('Company',  self.company,  'abbr')
-			self.name = '{0} - {1}'.format(self.title, abbr)
+			abbr = frappe.get_cached_value("Company", self.company, "abbr")
+			self.name = "{0} - {1}".format(self.title, abbr)
 
 	def validate_tax_accounts(self):
 		"""Check whether Tax Rate is not entered twice for same Tax Type"""
 		check_list = []
-		for d in self.get('taxes'):
+		for d in self.get("taxes"):
 			if d.tax_type:
 				account_type = frappe.db.get_value("Account", d.tax_type, "account_type")
 
-				if account_type not in ['Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation']:
+				if account_type not in [
+					"Tax",
+					"Chargeable",
+					"Income Account",
+					"Expense Account",
+					"Expenses Included In Valuation",
+				]:
 					frappe.throw(
-						_("Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable").format(
-							d.idx))
+						_(
+							"Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable"
+						).format(d.idx)
+					)
 				else:
 					if d.tax_type in check_list:
 						frappe.throw(_("{0} entered twice in Item Tax").format(d.tax_type))
diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py b/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py
index af01c57..5a2bd72 100644
--- a/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py
+++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py
@@ -3,23 +3,11 @@
 
 def get_data():
 	return {
-		'fieldname': 'item_tax_template',
-		'transactions': [
-			{
-				'label': _('Pre Sales'),
-				'items': ['Quotation', 'Supplier Quotation']
-			},
-			{
-				'label': _('Sales'),
-				'items': ['Sales Invoice', 'Sales Order', 'Delivery Note']
-			},
-			{
-				'label': _('Purchase'),
-				'items': ['Purchase Invoice', 'Purchase Order', 'Purchase Receipt']
-			},
-			{
-				'label': _('Stock'),
-				'items': ['Item Groups', 'Item']
-			}
-		]
+		"fieldname": "item_tax_template",
+		"transactions": [
+			{"label": _("Pre Sales"), "items": ["Quotation", "Supplier Quotation"]},
+			{"label": _("Sales"), "items": ["Sales Invoice", "Sales Order", "Delivery Note"]},
+			{"label": _("Purchase"), "items": ["Purchase Invoice", "Purchase Order", "Purchase Receipt"]},
+			{"label": _("Stock"), "items": ["Item Groups", "Item"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index ac8ab31..920db5b 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -28,7 +28,9 @@
 from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount
 
 
-class StockAccountInvalidTransaction(frappe.ValidationError): pass
+class StockAccountInvalidTransaction(frappe.ValidationError):
+	pass
+
 
 class JournalEntry(AccountsController):
 	def __init__(self, *args, **kwargs):
@@ -38,11 +40,11 @@
 		return self.voucher_type
 
 	def validate(self):
-		if self.voucher_type == 'Opening Entry':
-			self.is_opening = 'Yes'
+		if self.voucher_type == "Opening Entry":
+			self.is_opening = "Yes"
 
 		if not self.is_opening:
-			self.is_opening='No'
+			self.is_opening = "No"
 
 		self.clearance_date = None
 
@@ -86,15 +88,17 @@
 		self.update_inter_company_jv()
 		self.update_invoice_discounting()
 		self.update_status_for_full_and_final_statement()
-		check_if_stock_and_account_balance_synced(self.posting_date,
-			self.company, self.doctype, self.name)
+		check_if_stock_and_account_balance_synced(
+			self.posting_date, self.company, self.doctype, self.name
+		)
 
 	def on_cancel(self):
 		from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries
 		from erpnext.payroll.doctype.salary_slip.salary_slip import unlink_ref_doc_from_salary_slip
+
 		unlink_ref_doc_from_payment_entries(self)
 		unlink_ref_doc_from_salary_slip(self.name)
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 		self.make_gl_entries(1)
 		self.update_advance_paid()
 		self.update_expense_claim()
@@ -127,12 +131,14 @@
 				elif self.docstatus == 2:
 					frappe.db.set_value("Full and Final Statement", entry.reference_name, "status", "Unpaid")
 
-
 	def validate_inter_company_accounts(self):
-		if self.voucher_type == "Inter Company Journal Entry" and self.inter_company_journal_entry_reference:
+		if (
+			self.voucher_type == "Inter Company Journal Entry"
+			and self.inter_company_journal_entry_reference
+		):
 			doc = frappe.get_doc("Journal Entry", self.inter_company_journal_entry_reference)
-			account_currency = frappe.get_cached_value('Company',  self.company,  "default_currency")
-			previous_account_currency = frappe.get_cached_value('Company',  doc.company,  "default_currency")
+			account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
+			previous_account_currency = frappe.get_cached_value("Company", doc.company, "default_currency")
 			if account_currency == previous_account_currency:
 				if self.total_credit != doc.total_debit or self.total_debit != doc.total_credit:
 					frappe.throw(_("Total Credit/ Debit Amount should be same as linked Journal Entry"))
@@ -140,45 +146,63 @@
 	def validate_stock_accounts(self):
 		stock_accounts = get_stock_accounts(self.company, self.doctype, self.name)
 		for account in stock_accounts:
-			account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(account,
-				self.posting_date, self.company)
+			account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(
+				account, self.posting_date, self.company
+			)
 
 			if account_bal == stock_bal:
-				frappe.throw(_("Account: {0} can only be updated via Stock Transactions")
-					.format(account), StockAccountInvalidTransaction)
+				frappe.throw(
+					_("Account: {0} can only be updated via Stock Transactions").format(account),
+					StockAccountInvalidTransaction,
+				)
 
 	def apply_tax_withholding(self):
 		from erpnext.accounts.report.general_ledger.general_ledger import get_account_type_map
 
-		if not self.apply_tds or self.voucher_type not in ('Debit Note', 'Credit Note'):
+		if not self.apply_tds or self.voucher_type not in ("Debit Note", "Credit Note"):
 			return
 
-		parties = [d.party for d in self.get('accounts') if d.party]
+		parties = [d.party for d in self.get("accounts") if d.party]
 		parties = list(set(parties))
 
 		if len(parties) > 1:
 			frappe.throw(_("Cannot apply TDS against multiple parties in one entry"))
 
 		account_type_map = get_account_type_map(self.company)
-		party_type = 'supplier' if self.voucher_type == 'Credit Note' else 'customer'
-		doctype = 'Purchase Invoice' if self.voucher_type == 'Credit Note' else 'Sales Invoice'
-		debit_or_credit = 'debit_in_account_currency' if self.voucher_type == 'Credit Note' else 'credit_in_account_currency'
-		rev_debit_or_credit = 'credit_in_account_currency' if debit_or_credit == 'debit_in_account_currency' else 'debit_in_account_currency'
+		party_type = "supplier" if self.voucher_type == "Credit Note" else "customer"
+		doctype = "Purchase Invoice" if self.voucher_type == "Credit Note" else "Sales Invoice"
+		debit_or_credit = (
+			"debit_in_account_currency"
+			if self.voucher_type == "Credit Note"
+			else "credit_in_account_currency"
+		)
+		rev_debit_or_credit = (
+			"credit_in_account_currency"
+			if debit_or_credit == "debit_in_account_currency"
+			else "debit_in_account_currency"
+		)
 
 		party_account = get_party_account(party_type.title(), parties[0], self.company)
 
-		net_total = sum(d.get(debit_or_credit) for d in self.get('accounts') if account_type_map.get(d.account)
-			not in ('Tax', 'Chargeable'))
+		net_total = sum(
+			d.get(debit_or_credit)
+			for d in self.get("accounts")
+			if account_type_map.get(d.account) not in ("Tax", "Chargeable")
+		)
 
-		party_amount = sum(d.get(rev_debit_or_credit) for d in self.get('accounts') if d.account == party_account)
+		party_amount = sum(
+			d.get(rev_debit_or_credit) for d in self.get("accounts") if d.account == party_account
+		)
 
-		inv = frappe._dict({
-			party_type: parties[0],
-			'doctype': doctype,
-			'company': self.company,
-			'posting_date': self.posting_date,
-			'net_total': net_total
-		})
+		inv = frappe._dict(
+			{
+				party_type: parties[0],
+				"doctype": doctype,
+				"company": self.company,
+				"posting_date": self.posting_date,
+				"net_total": net_total,
+			}
+		)
 
 		tax_withholding_details = get_party_tax_withholding_details(inv, self.tax_withholding_category)
 
@@ -186,45 +210,64 @@
 			return
 
 		accounts = []
-		for d in self.get('accounts'):
-			if d.get('account') == tax_withholding_details.get("account_head"):
-				d.update({
-					'account': tax_withholding_details.get("account_head"),
-					debit_or_credit: tax_withholding_details.get('tax_amount')
-				})
+		for d in self.get("accounts"):
+			if d.get("account") == tax_withholding_details.get("account_head"):
+				d.update(
+					{
+						"account": tax_withholding_details.get("account_head"),
+						debit_or_credit: tax_withholding_details.get("tax_amount"),
+					}
+				)
 
-			accounts.append(d.get('account'))
+			accounts.append(d.get("account"))
 
-			if d.get('account') == party_account:
-				d.update({
-					rev_debit_or_credit: party_amount - tax_withholding_details.get('tax_amount')
-				})
+			if d.get("account") == party_account:
+				d.update({rev_debit_or_credit: party_amount - tax_withholding_details.get("tax_amount")})
 
 		if not accounts or tax_withholding_details.get("account_head") not in accounts:
-			self.append("accounts", {
-				'account': tax_withholding_details.get("account_head"),
-				rev_debit_or_credit: tax_withholding_details.get('tax_amount'),
-				'against_account': parties[0]
-			})
+			self.append(
+				"accounts",
+				{
+					"account": tax_withholding_details.get("account_head"),
+					rev_debit_or_credit: tax_withholding_details.get("tax_amount"),
+					"against_account": parties[0],
+				},
+			)
 
-		to_remove = [d for d in self.get('accounts')
-			if not d.get(rev_debit_or_credit) and d.account == tax_withholding_details.get("account_head")]
+		to_remove = [
+			d
+			for d in self.get("accounts")
+			if not d.get(rev_debit_or_credit) and d.account == tax_withholding_details.get("account_head")
+		]
 
 		for d in to_remove:
 			self.remove(d)
 
 	def update_inter_company_jv(self):
-		if self.voucher_type == "Inter Company Journal Entry" and self.inter_company_journal_entry_reference:
-			frappe.db.set_value("Journal Entry", self.inter_company_journal_entry_reference,\
-				"inter_company_journal_entry_reference", self.name)
+		if (
+			self.voucher_type == "Inter Company Journal Entry"
+			and self.inter_company_journal_entry_reference
+		):
+			frappe.db.set_value(
+				"Journal Entry",
+				self.inter_company_journal_entry_reference,
+				"inter_company_journal_entry_reference",
+				self.name,
+			)
 
 	def update_invoice_discounting(self):
 		def _validate_invoice_discounting_status(inv_disc, id_status, expected_status, row_id):
 			id_link = get_link_to_form("Invoice Discounting", inv_disc)
 			if id_status != expected_status:
-				frappe.throw(_("Row #{0}: Status must be {1} for Invoice Discounting {2}").format(d.idx, expected_status, id_link))
+				frappe.throw(
+					_("Row #{0}: Status must be {1} for Invoice Discounting {2}").format(
+						d.idx, expected_status, id_link
+					)
+				)
 
-		invoice_discounting_list = list(set([d.reference_name for d in self.accounts if d.reference_type=="Invoice Discounting"]))
+		invoice_discounting_list = list(
+			set([d.reference_name for d in self.accounts if d.reference_type == "Invoice Discounting"])
+		)
 		for inv_disc in invoice_discounting_list:
 			inv_disc_doc = frappe.get_doc("Invoice Discounting", inv_disc)
 			status = None
@@ -248,104 +291,147 @@
 			if status:
 				inv_disc_doc.set_status(status=status)
 
-
 	def unlink_advance_entry_reference(self):
 		for d in self.get("accounts"):
 			if d.is_advance == "Yes" and d.reference_type in ("Sales Invoice", "Purchase Invoice"):
 				doc = frappe.get_doc(d.reference_type, d.reference_name)
 				doc.delink_advance_entries(self.name)
-				d.reference_type = ''
-				d.reference_name = ''
+				d.reference_type = ""
+				d.reference_name = ""
 				d.db_update()
 
 	def unlink_asset_reference(self):
 		for d in self.get("accounts"):
-			if d.reference_type=="Asset" and d.reference_name:
+			if d.reference_type == "Asset" and d.reference_name:
 				asset = frappe.get_doc("Asset", d.reference_name)
 				for s in asset.get("schedules"):
 					if s.journal_entry == self.name:
 						s.db_set("journal_entry", None)
 
 						idx = cint(s.finance_book_id) or 1
-						finance_books = asset.get('finance_books')[idx - 1]
+						finance_books = asset.get("finance_books")[idx - 1]
 						finance_books.value_after_depreciation += s.depreciation_amount
 						finance_books.db_update()
 
 						asset.set_status()
 
 	def unlink_inter_company_jv(self):
-		if self.voucher_type == "Inter Company Journal Entry" and self.inter_company_journal_entry_reference:
-			frappe.db.set_value("Journal Entry", self.inter_company_journal_entry_reference,\
-				"inter_company_journal_entry_reference", "")
-			frappe.db.set_value("Journal Entry", self.name,\
-				"inter_company_journal_entry_reference", "")
+		if (
+			self.voucher_type == "Inter Company Journal Entry"
+			and self.inter_company_journal_entry_reference
+		):
+			frappe.db.set_value(
+				"Journal Entry",
+				self.inter_company_journal_entry_reference,
+				"inter_company_journal_entry_reference",
+				"",
+			)
+			frappe.db.set_value("Journal Entry", self.name, "inter_company_journal_entry_reference", "")
 
 	def unlink_asset_adjustment_entry(self):
-		frappe.db.sql(""" update `tabAsset Value Adjustment`
-			set journal_entry = null where journal_entry = %s""", self.name)
+		frappe.db.sql(
+			""" update `tabAsset Value Adjustment`
+			set journal_entry = null where journal_entry = %s""",
+			self.name,
+		)
 
 	def validate_party(self):
 		for d in self.get("accounts"):
 			account_type = frappe.db.get_value("Account", d.account, "account_type")
 			if account_type in ["Receivable", "Payable"]:
 				if not (d.party_type and d.party):
-					frappe.throw(_("Row {0}: Party Type and Party is required for Receivable / Payable account {1}").format(d.idx, d.account))
+					frappe.throw(
+						_("Row {0}: Party Type and Party is required for Receivable / Payable account {1}").format(
+							d.idx, d.account
+						)
+					)
 
 	def check_credit_limit(self):
-		customers = list(set(d.party for d in self.get("accounts")
-			if d.party_type=="Customer" and d.party and flt(d.debit) > 0))
+		customers = list(
+			set(
+				d.party
+				for d in self.get("accounts")
+				if d.party_type == "Customer" and d.party and flt(d.debit) > 0
+			)
+		)
 		if customers:
 			from erpnext.selling.doctype.customer.customer import check_credit_limit
+
 			for customer in customers:
 				check_credit_limit(customer, self.company)
 
 	def validate_cheque_info(self):
-		if self.voucher_type in ['Bank Entry']:
+		if self.voucher_type in ["Bank Entry"]:
 			if not self.cheque_no or not self.cheque_date:
-				msgprint(_("Reference No & Reference Date is required for {0}").format(self.voucher_type),
-					raise_exception=1)
+				msgprint(
+					_("Reference No & Reference Date is required for {0}").format(self.voucher_type),
+					raise_exception=1,
+				)
 
 		if self.cheque_date and not self.cheque_no:
 			msgprint(_("Reference No is mandatory if you entered Reference Date"), raise_exception=1)
 
 	def validate_entries_for_advance(self):
-		for d in self.get('accounts'):
+		for d in self.get("accounts"):
 			if d.reference_type not in ("Sales Invoice", "Purchase Invoice", "Journal Entry"):
-				if (d.party_type == 'Customer' and flt(d.credit) > 0) or \
-						(d.party_type == 'Supplier' and flt(d.debit) > 0):
-					if d.is_advance=="No":
-						msgprint(_("Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.").format(d.idx, d.account), alert=True)
+				if (d.party_type == "Customer" and flt(d.credit) > 0) or (
+					d.party_type == "Supplier" and flt(d.debit) > 0
+				):
+					if d.is_advance == "No":
+						msgprint(
+							_(
+								"Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry."
+							).format(d.idx, d.account),
+							alert=True,
+						)
 					elif d.reference_type in ("Sales Order", "Purchase Order") and d.is_advance != "Yes":
-						frappe.throw(_("Row {0}: Payment against Sales/Purchase Order should always be marked as advance").format(d.idx))
+						frappe.throw(
+							_(
+								"Row {0}: Payment against Sales/Purchase Order should always be marked as advance"
+							).format(d.idx)
+						)
 
 				if d.is_advance == "Yes":
-					if d.party_type == 'Customer' and flt(d.debit) > 0:
+					if d.party_type == "Customer" and flt(d.debit) > 0:
 						frappe.throw(_("Row {0}: Advance against Customer must be credit").format(d.idx))
-					elif d.party_type == 'Supplier' and flt(d.credit) > 0:
+					elif d.party_type == "Supplier" and flt(d.credit) > 0:
 						frappe.throw(_("Row {0}: Advance against Supplier must be debit").format(d.idx))
 
 	def validate_against_jv(self):
-		for d in self.get('accounts'):
-			if d.reference_type=="Journal Entry":
+		for d in self.get("accounts"):
+			if d.reference_type == "Journal Entry":
 				account_root_type = frappe.db.get_value("Account", d.account, "root_type")
 				if account_root_type == "Asset" and flt(d.debit) > 0:
-					frappe.throw(_("Row #{0}: For {1}, you can select reference document only if account gets credited")
-						.format(d.idx, d.account))
+					frappe.throw(
+						_(
+							"Row #{0}: For {1}, you can select reference document only if account gets credited"
+						).format(d.idx, d.account)
+					)
 				elif account_root_type == "Liability" and flt(d.credit) > 0:
-					frappe.throw(_("Row #{0}: For {1}, you can select reference document only if account gets debited")
-						.format(d.idx, d.account))
+					frappe.throw(
+						_(
+							"Row #{0}: For {1}, you can select reference document only if account gets debited"
+						).format(d.idx, d.account)
+					)
 
 				if d.reference_name == self.name:
 					frappe.throw(_("You can not enter current voucher in 'Against Journal Entry' column"))
 
-				against_entries = frappe.db.sql("""select * from `tabJournal Entry Account`
+				against_entries = frappe.db.sql(
+					"""select * from `tabJournal Entry Account`
 					where account = %s and docstatus = 1 and parent = %s
 					and (reference_type is null or reference_type in ("", "Sales Order", "Purchase Order"))
-					""", (d.account, d.reference_name), as_dict=True)
+					""",
+					(d.account, d.reference_name),
+					as_dict=True,
+				)
 
 				if not against_entries:
-					frappe.throw(_("Journal Entry {0} does not have account {1} or already matched against other voucher")
-						.format(d.reference_name, d.account))
+					frappe.throw(
+						_(
+							"Journal Entry {0} does not have account {1} or already matched against other voucher"
+						).format(d.reference_name, d.account)
+					)
 				else:
 					dr_or_cr = "debit" if d.credit > 0 else "credit"
 					valid = False
@@ -353,16 +439,19 @@
 						if flt(jvd[dr_or_cr]) > 0:
 							valid = True
 					if not valid:
-						frappe.throw(_("Against Journal Entry {0} does not have any unmatched {1} entry")
-							.format(d.reference_name, dr_or_cr))
+						frappe.throw(
+							_("Against Journal Entry {0} does not have any unmatched {1} entry").format(
+								d.reference_name, dr_or_cr
+							)
+						)
 
 	def validate_reference_doc(self):
 		"""Validates reference document"""
 		field_dict = {
-			'Sales Invoice': ["Customer", "Debit To"],
-			'Purchase Invoice': ["Supplier", "Credit To"],
-			'Sales Order': ["Customer"],
-			'Purchase Order': ["Supplier"]
+			"Sales Invoice": ["Customer", "Debit To"],
+			"Purchase Invoice": ["Supplier", "Credit To"],
+			"Sales Order": ["Customer"],
+			"Purchase Order": ["Supplier"],
 		}
 
 		self.reference_totals = {}
@@ -375,56 +464,76 @@
 			if not d.reference_name:
 				d.reference_type = None
 			if d.reference_type and d.reference_name and (d.reference_type in list(field_dict)):
-				dr_or_cr = "credit_in_account_currency" \
-					if d.reference_type in ("Sales Order", "Sales Invoice") else "debit_in_account_currency"
+				dr_or_cr = (
+					"credit_in_account_currency"
+					if d.reference_type in ("Sales Order", "Sales Invoice")
+					else "debit_in_account_currency"
+				)
 
 				# check debit or credit type Sales / Purchase Order
-				if d.reference_type=="Sales Order" and flt(d.debit) > 0:
-					frappe.throw(_("Row {0}: Debit entry can not be linked with a {1}").format(d.idx, d.reference_type))
+				if d.reference_type == "Sales Order" and flt(d.debit) > 0:
+					frappe.throw(
+						_("Row {0}: Debit entry can not be linked with a {1}").format(d.idx, d.reference_type)
+					)
 
 				if d.reference_type == "Purchase Order" and flt(d.credit) > 0:
-					frappe.throw(_("Row {0}: Credit entry can not be linked with a {1}").format(d.idx, d.reference_type))
+					frappe.throw(
+						_("Row {0}: Credit entry can not be linked with a {1}").format(d.idx, d.reference_type)
+					)
 
 				# set totals
 				if not d.reference_name in self.reference_totals:
 					self.reference_totals[d.reference_name] = 0.0
 
-				if self.voucher_type not in ('Deferred Revenue', 'Deferred Expense'):
+				if self.voucher_type not in ("Deferred Revenue", "Deferred Expense"):
 					self.reference_totals[d.reference_name] += flt(d.get(dr_or_cr))
 
 				self.reference_types[d.reference_name] = d.reference_type
 				self.reference_accounts[d.reference_name] = d.account
 
-				against_voucher = frappe.db.get_value(d.reference_type, d.reference_name,
-					[scrub(dt) for dt in field_dict.get(d.reference_type)])
+				against_voucher = frappe.db.get_value(
+					d.reference_type, d.reference_name, [scrub(dt) for dt in field_dict.get(d.reference_type)]
+				)
 
 				if not against_voucher:
 					frappe.throw(_("Row {0}: Invalid reference {1}").format(d.idx, d.reference_name))
 
 				# check if party and account match
 				if d.reference_type in ("Sales Invoice", "Purchase Invoice"):
-					if self.voucher_type in ('Deferred Revenue', 'Deferred Expense') and d.reference_detail_no:
-						debit_or_credit = 'Debit' if d.debit else 'Credit'
-						party_account = get_deferred_booking_accounts(d.reference_type, d.reference_detail_no,
-							debit_or_credit)
-						against_voucher = ['', against_voucher[1]]
+					if self.voucher_type in ("Deferred Revenue", "Deferred Expense") and d.reference_detail_no:
+						debit_or_credit = "Debit" if d.debit else "Credit"
+						party_account = get_deferred_booking_accounts(
+							d.reference_type, d.reference_detail_no, debit_or_credit
+						)
+						against_voucher = ["", against_voucher[1]]
 					else:
 						if d.reference_type == "Sales Invoice":
-							party_account = get_party_account_based_on_invoice_discounting(d.reference_name) or against_voucher[1]
+							party_account = (
+								get_party_account_based_on_invoice_discounting(d.reference_name) or against_voucher[1]
+							)
 						else:
 							party_account = against_voucher[1]
 
-					if (against_voucher[0] != cstr(d.party) or party_account != d.account):
-						frappe.throw(_("Row {0}: Party / Account does not match with {1} / {2} in {3} {4}")
-							.format(d.idx, field_dict.get(d.reference_type)[0], field_dict.get(d.reference_type)[1],
-								d.reference_type, d.reference_name))
+					if against_voucher[0] != cstr(d.party) or party_account != d.account:
+						frappe.throw(
+							_("Row {0}: Party / Account does not match with {1} / {2} in {3} {4}").format(
+								d.idx,
+								field_dict.get(d.reference_type)[0],
+								field_dict.get(d.reference_type)[1],
+								d.reference_type,
+								d.reference_name,
+							)
+						)
 
 				# check if party matches for Sales / Purchase Order
 				if d.reference_type in ("Sales Order", "Purchase Order"):
 					# set totals
 					if against_voucher != d.party:
-						frappe.throw(_("Row {0}: {1} {2} does not match with {3}") \
-							.format(d.idx, d.party_type, d.party, d.reference_type))
+						frappe.throw(
+							_("Row {0}: {1} {2} does not match with {3}").format(
+								d.idx, d.party_type, d.party, d.reference_type
+							)
+						)
 
 		self.validate_orders()
 		self.validate_invoices()
@@ -450,62 +559,79 @@
 				account_currency = get_account_currency(account)
 				if account_currency == self.company_currency:
 					voucher_total = order.base_grand_total
-					formatted_voucher_total = fmt_money(voucher_total, order.precision("base_grand_total"),
-						currency=account_currency)
+					formatted_voucher_total = fmt_money(
+						voucher_total, order.precision("base_grand_total"), currency=account_currency
+					)
 				else:
 					voucher_total = order.grand_total
-					formatted_voucher_total = fmt_money(voucher_total, order.precision("grand_total"),
-						currency=account_currency)
+					formatted_voucher_total = fmt_money(
+						voucher_total, order.precision("grand_total"), currency=account_currency
+					)
 
 				if flt(voucher_total) < (flt(order.advance_paid) + total):
-					frappe.throw(_("Advance paid against {0} {1} cannot be greater than Grand Total {2}").format(reference_type, reference_name, formatted_voucher_total))
+					frappe.throw(
+						_("Advance paid against {0} {1} cannot be greater than Grand Total {2}").format(
+							reference_type, reference_name, formatted_voucher_total
+						)
+					)
 
 	def validate_invoices(self):
 		"""Validate totals and docstatus for invoices"""
 		for reference_name, total in self.reference_totals.items():
 			reference_type = self.reference_types[reference_name]
 
-			if (reference_type in ("Sales Invoice", "Purchase Invoice") and
-				self.voucher_type not in ['Debit Note', 'Credit Note']):
-				invoice = frappe.db.get_value(reference_type, reference_name,
-					["docstatus", "outstanding_amount"], as_dict=1)
+			if reference_type in ("Sales Invoice", "Purchase Invoice") and self.voucher_type not in [
+				"Debit Note",
+				"Credit Note",
+			]:
+				invoice = frappe.db.get_value(
+					reference_type, reference_name, ["docstatus", "outstanding_amount"], as_dict=1
+				)
 
 				if invoice.docstatus != 1:
 					frappe.throw(_("{0} {1} is not submitted").format(reference_type, reference_name))
 
 				if total and flt(invoice.outstanding_amount) < total:
-					frappe.throw(_("Payment against {0} {1} cannot be greater than Outstanding Amount {2}")
-						.format(reference_type, reference_name, invoice.outstanding_amount))
+					frappe.throw(
+						_("Payment against {0} {1} cannot be greater than Outstanding Amount {2}").format(
+							reference_type, reference_name, invoice.outstanding_amount
+						)
+					)
 
 	def set_against_account(self):
 		accounts_debited, accounts_credited = [], []
-		if self.voucher_type in ('Deferred Revenue', 'Deferred Expense'):
-			for d in self.get('accounts'):
-				if d.reference_type == 'Sales Invoice':
-					field = 'customer'
+		if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
+			for d in self.get("accounts"):
+				if d.reference_type == "Sales Invoice":
+					field = "customer"
 				else:
-					field = 'supplier'
+					field = "supplier"
 
 				d.against_account = frappe.db.get_value(d.reference_type, d.reference_name, field)
 		else:
 			for d in self.get("accounts"):
-				if flt(d.debit > 0): accounts_debited.append(d.party or d.account)
-				if flt(d.credit) > 0: accounts_credited.append(d.party or d.account)
+				if flt(d.debit > 0):
+					accounts_debited.append(d.party or d.account)
+				if flt(d.credit) > 0:
+					accounts_credited.append(d.party or d.account)
 
 			for d in self.get("accounts"):
-				if flt(d.debit > 0): d.against_account = ", ".join(list(set(accounts_credited)))
-				if flt(d.credit > 0): d.against_account = ", ".join(list(set(accounts_debited)))
+				if flt(d.debit > 0):
+					d.against_account = ", ".join(list(set(accounts_credited)))
+				if flt(d.credit > 0):
+					d.against_account = ", ".join(list(set(accounts_debited)))
 
 	def validate_debit_credit_amount(self):
-		for d in self.get('accounts'):
+		for d in self.get("accounts"):
 			if not flt(d.debit) and not flt(d.credit):
 				frappe.throw(_("Row {0}: Both Debit and Credit values cannot be zero").format(d.idx))
 
 	def validate_total_debit_and_credit(self):
 		self.set_total_debit_credit()
 		if self.difference:
-			frappe.throw(_("Total Debit must be equal to Total Credit. The difference is {0}")
-				.format(self.difference))
+			frappe.throw(
+				_("Total Debit must be equal to Total Credit. The difference is {0}").format(self.difference)
+			)
 
 	def set_total_debit_credit(self):
 		self.total_debit, self.total_credit, self.difference = 0, 0, 0
@@ -516,13 +642,16 @@
 			self.total_debit = flt(self.total_debit) + flt(d.debit, d.precision("debit"))
 			self.total_credit = flt(self.total_credit) + flt(d.credit, d.precision("credit"))
 
-		self.difference = flt(self.total_debit, self.precision("total_debit")) - \
-			flt(self.total_credit, self.precision("total_credit"))
+		self.difference = flt(self.total_debit, self.precision("total_debit")) - flt(
+			self.total_credit, self.precision("total_credit")
+		)
 
 	def validate_multi_currency(self):
 		alternate_currency = []
 		for d in self.get("accounts"):
-			account = frappe.db.get_value("Account", d.account, ["account_currency", "account_type"], as_dict=1)
+			account = frappe.db.get_value(
+				"Account", d.account, ["account_currency", "account_type"], as_dict=1
+			)
 			if account:
 				d.account_currency = account.account_currency
 				d.account_type = account.account_type
@@ -541,8 +670,12 @@
 
 	def set_amounts_in_company_currency(self):
 		for d in self.get("accounts"):
-			d.debit_in_account_currency = flt(d.debit_in_account_currency, d.precision("debit_in_account_currency"))
-			d.credit_in_account_currency = flt(d.credit_in_account_currency, d.precision("credit_in_account_currency"))
+			d.debit_in_account_currency = flt(
+				d.debit_in_account_currency, d.precision("debit_in_account_currency")
+			)
+			d.credit_in_account_currency = flt(
+				d.credit_in_account_currency, d.precision("credit_in_account_currency")
+			)
 
 			d.debit = flt(d.debit_in_account_currency * flt(d.exchange_rate), d.precision("debit"))
 			d.credit = flt(d.credit_in_account_currency * flt(d.exchange_rate), d.precision("credit"))
@@ -551,13 +684,28 @@
 		for d in self.get("accounts"):
 			if d.account_currency == self.company_currency:
 				d.exchange_rate = 1
-			elif not d.exchange_rate or d.exchange_rate == 1 or \
-				(d.reference_type in ("Sales Invoice", "Purchase Invoice")
-				and d.reference_name and self.posting_date):
+			elif (
+				not d.exchange_rate
+				or d.exchange_rate == 1
+				or (
+					d.reference_type in ("Sales Invoice", "Purchase Invoice")
+					and d.reference_name
+					and self.posting_date
+				)
+			):
 
-					# Modified to include the posting date for which to retreive the exchange rate
-					d.exchange_rate = get_exchange_rate(self.posting_date, d.account, d.account_currency,
-						self.company, d.reference_type, d.reference_name, d.debit, d.credit, d.exchange_rate)
+				# Modified to include the posting date for which to retreive the exchange rate
+				d.exchange_rate = get_exchange_rate(
+					self.posting_date,
+					d.account,
+					d.account_currency,
+					self.company,
+					d.reference_type,
+					d.reference_name,
+					d.debit,
+					d.credit,
+					d.exchange_rate,
+				)
 
 			if not d.exchange_rate:
 				frappe.throw(_("Row {0}: Exchange Rate is mandatory").format(d.idx))
@@ -570,55 +718,76 @@
 
 		if self.cheque_no:
 			if self.cheque_date:
-				r.append(_('Reference #{0} dated {1}').format(self.cheque_no, formatdate(self.cheque_date)))
+				r.append(_("Reference #{0} dated {1}").format(self.cheque_no, formatdate(self.cheque_date)))
 			else:
 				msgprint(_("Please enter Reference date"), raise_exception=frappe.MandatoryError)
 
-		for d in self.get('accounts'):
-			if d.reference_type=="Sales Invoice" and d.credit:
-				r.append(_("{0} against Sales Invoice {1}").format(fmt_money(flt(d.credit), currency = self.company_currency), \
-					d.reference_name))
+		for d in self.get("accounts"):
+			if d.reference_type == "Sales Invoice" and d.credit:
+				r.append(
+					_("{0} against Sales Invoice {1}").format(
+						fmt_money(flt(d.credit), currency=self.company_currency), d.reference_name
+					)
+				)
 
-			if d.reference_type=="Sales Order" and d.credit:
-				r.append(_("{0} against Sales Order {1}").format(fmt_money(flt(d.credit), currency = self.company_currency), \
-					d.reference_name))
+			if d.reference_type == "Sales Order" and d.credit:
+				r.append(
+					_("{0} against Sales Order {1}").format(
+						fmt_money(flt(d.credit), currency=self.company_currency), d.reference_name
+					)
+				)
 
 			if d.reference_type == "Purchase Invoice" and d.debit:
-				bill_no = frappe.db.sql("""select bill_no, bill_date
-					from `tabPurchase Invoice` where name=%s""", d.reference_name)
-				if bill_no and bill_no[0][0] and bill_no[0][0].lower().strip() \
-						not in ['na', 'not applicable', 'none']:
-					r.append(_('{0} against Bill {1} dated {2}').format(fmt_money(flt(d.debit), currency=self.company_currency), bill_no[0][0],
-						bill_no[0][1] and formatdate(bill_no[0][1].strftime('%Y-%m-%d'))))
+				bill_no = frappe.db.sql(
+					"""select bill_no, bill_date
+					from `tabPurchase Invoice` where name=%s""",
+					d.reference_name,
+				)
+				if (
+					bill_no
+					and bill_no[0][0]
+					and bill_no[0][0].lower().strip() not in ["na", "not applicable", "none"]
+				):
+					r.append(
+						_("{0} against Bill {1} dated {2}").format(
+							fmt_money(flt(d.debit), currency=self.company_currency),
+							bill_no[0][0],
+							bill_no[0][1] and formatdate(bill_no[0][1].strftime("%Y-%m-%d")),
+						)
+					)
 
 			if d.reference_type == "Purchase Order" and d.debit:
-				r.append(_("{0} against Purchase Order {1}").format(fmt_money(flt(d.credit), currency = self.company_currency), \
-					d.reference_name))
+				r.append(
+					_("{0} against Purchase Order {1}").format(
+						fmt_money(flt(d.credit), currency=self.company_currency), d.reference_name
+					)
+				)
 
 		if r:
-			self.remark = ("\n").join(r) #User Remarks is not mandatory
+			self.remark = ("\n").join(r)  # User Remarks is not mandatory
 
 	def set_print_format_fields(self):
 		bank_amount = party_amount = total_amount = 0.0
-		currency = bank_account_currency = party_account_currency = pay_to_recd_from= None
+		currency = bank_account_currency = party_account_currency = pay_to_recd_from = None
 		party_type = None
-		for d in self.get('accounts'):
-			if d.party_type in ['Customer', 'Supplier'] and d.party:
+		for d in self.get("accounts"):
+			if d.party_type in ["Customer", "Supplier"] and d.party:
 				party_type = d.party_type
 				if not pay_to_recd_from:
 					pay_to_recd_from = d.party
 
 				if pay_to_recd_from and pay_to_recd_from == d.party:
-					party_amount += (d.debit_in_account_currency or d.credit_in_account_currency)
+					party_amount += d.debit_in_account_currency or d.credit_in_account_currency
 					party_account_currency = d.account_currency
 
 			elif frappe.db.get_value("Account", d.account, "account_type") in ["Bank", "Cash"]:
-				bank_amount += (d.debit_in_account_currency or d.credit_in_account_currency)
+				bank_amount += d.debit_in_account_currency or d.credit_in_account_currency
 				bank_account_currency = d.account_currency
 
 		if party_type and pay_to_recd_from:
-			self.pay_to_recd_from = frappe.db.get_value(party_type, pay_to_recd_from,
-				"customer_name" if party_type=="Customer" else "supplier_name")
+			self.pay_to_recd_from = frappe.db.get_value(
+				party_type, pay_to_recd_from, "customer_name" if party_type == "Customer" else "supplier_name"
+			)
 			if bank_amount:
 				total_amount = bank_amount
 				currency = bank_account_currency
@@ -632,6 +801,7 @@
 		self.total_amount = amt
 		self.total_amount_currency = currency
 		from frappe.utils import money_in_words
+
 		self.total_amount_in_words = money_in_words(amt, currency)
 
 	def make_gl_entries(self, cancel=0, adv_adj=0):
@@ -645,38 +815,45 @@
 				remarks = "\n".join(r)
 
 				gl_map.append(
-					self.get_gl_dict({
-						"account": d.account,
-						"party_type": d.party_type,
-						"due_date": self.due_date,
-						"party": d.party,
-						"against": d.against_account,
-						"debit": flt(d.debit, d.precision("debit")),
-						"credit": flt(d.credit, d.precision("credit")),
-						"account_currency": d.account_currency,
-						"debit_in_account_currency": flt(d.debit_in_account_currency, d.precision("debit_in_account_currency")),
-						"credit_in_account_currency": flt(d.credit_in_account_currency, d.precision("credit_in_account_currency")),
-						"against_voucher_type": d.reference_type,
-						"against_voucher": d.reference_name,
-						"remarks": remarks,
-						"voucher_detail_no": d.reference_detail_no,
-						"cost_center": d.cost_center,
-						"project": d.project,
-						"finance_book": self.finance_book
-					}, item=d)
+					self.get_gl_dict(
+						{
+							"account": d.account,
+							"party_type": d.party_type,
+							"due_date": self.due_date,
+							"party": d.party,
+							"against": d.against_account,
+							"debit": flt(d.debit, d.precision("debit")),
+							"credit": flt(d.credit, d.precision("credit")),
+							"account_currency": d.account_currency,
+							"debit_in_account_currency": flt(
+								d.debit_in_account_currency, d.precision("debit_in_account_currency")
+							),
+							"credit_in_account_currency": flt(
+								d.credit_in_account_currency, d.precision("credit_in_account_currency")
+							),
+							"against_voucher_type": d.reference_type,
+							"against_voucher": d.reference_name,
+							"remarks": remarks,
+							"voucher_detail_no": d.reference_detail_no,
+							"cost_center": d.cost_center,
+							"project": d.project,
+							"finance_book": self.finance_book,
+						},
+						item=d,
+					)
 				)
 
-		if self.voucher_type in ('Deferred Revenue', 'Deferred Expense'):
-			update_outstanding = 'No'
+		if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
+			update_outstanding = "No"
 		else:
-			update_outstanding = 'Yes'
+			update_outstanding = "Yes"
 
 		if gl_map:
 			make_gl_entries(gl_map, cancel=cancel, adv_adj=adv_adj, update_outstanding=update_outstanding)
 
 	@frappe.whitelist()
 	def get_balance(self):
-		if not self.get('accounts'):
+		if not self.get("accounts"):
 			msgprint(_("'Entries' cannot be empty"), raise_exception=True)
 		else:
 			self.total_debit, self.total_credit = 0, 0
@@ -685,18 +862,18 @@
 			# If any row without amount, set the diff on that row
 			if diff:
 				blank_row = None
-				for d in self.get('accounts'):
+				for d in self.get("accounts"):
 					if not d.credit_in_account_currency and not d.debit_in_account_currency and diff != 0:
 						blank_row = d
 
 				if not blank_row:
-					blank_row = self.append('accounts', {})
+					blank_row = self.append("accounts", {})
 
 				blank_row.exchange_rate = 1
-				if diff>0:
+				if diff > 0:
 					blank_row.credit_in_account_currency = diff
 					blank_row.credit = diff
-				elif diff<0:
+				elif diff < 0:
 					blank_row.debit_in_account_currency = abs(diff)
 					blank_row.debit = abs(diff)
 
@@ -704,76 +881,100 @@
 
 	@frappe.whitelist()
 	def get_outstanding_invoices(self):
-		self.set('accounts', [])
+		self.set("accounts", [])
 		total = 0
 		for d in self.get_values():
 			total += flt(d.outstanding_amount, self.precision("credit", "accounts"))
-			jd1 = self.append('accounts', {})
+			jd1 = self.append("accounts", {})
 			jd1.account = d.account
 			jd1.party = d.party
 
-			if self.write_off_based_on == 'Accounts Receivable':
+			if self.write_off_based_on == "Accounts Receivable":
 				jd1.party_type = "Customer"
-				jd1.credit_in_account_currency = flt(d.outstanding_amount, self.precision("credit", "accounts"))
+				jd1.credit_in_account_currency = flt(
+					d.outstanding_amount, self.precision("credit", "accounts")
+				)
 				jd1.reference_type = "Sales Invoice"
 				jd1.reference_name = cstr(d.name)
-			elif self.write_off_based_on == 'Accounts Payable':
+			elif self.write_off_based_on == "Accounts Payable":
 				jd1.party_type = "Supplier"
 				jd1.debit_in_account_currency = flt(d.outstanding_amount, self.precision("debit", "accounts"))
 				jd1.reference_type = "Purchase Invoice"
 				jd1.reference_name = cstr(d.name)
 
-		jd2 = self.append('accounts', {})
-		if self.write_off_based_on == 'Accounts Receivable':
+		jd2 = self.append("accounts", {})
+		if self.write_off_based_on == "Accounts Receivable":
 			jd2.debit_in_account_currency = total
-		elif self.write_off_based_on == 'Accounts Payable':
+		elif self.write_off_based_on == "Accounts Payable":
 			jd2.credit_in_account_currency = total
 
 		self.validate_total_debit_and_credit()
 
-
 	def get_values(self):
-		cond = " and outstanding_amount <= {0}".format(self.write_off_amount) \
-			if flt(self.write_off_amount) > 0 else ""
+		cond = (
+			" and outstanding_amount <= {0}".format(self.write_off_amount)
+			if flt(self.write_off_amount) > 0
+			else ""
+		)
 
-		if self.write_off_based_on == 'Accounts Receivable':
-			return frappe.db.sql("""select name, debit_to as account, customer as party, outstanding_amount
+		if self.write_off_based_on == "Accounts Receivable":
+			return frappe.db.sql(
+				"""select name, debit_to as account, customer as party, outstanding_amount
 				from `tabSales Invoice` where docstatus = 1 and company = %s
-				and outstanding_amount > 0 %s""" % ('%s', cond), self.company, as_dict=True)
-		elif self.write_off_based_on == 'Accounts Payable':
-			return frappe.db.sql("""select name, credit_to as account, supplier as party, outstanding_amount
+				and outstanding_amount > 0 %s"""
+				% ("%s", cond),
+				self.company,
+				as_dict=True,
+			)
+		elif self.write_off_based_on == "Accounts Payable":
+			return frappe.db.sql(
+				"""select name, credit_to as account, supplier as party, outstanding_amount
 				from `tabPurchase Invoice` where docstatus = 1 and company = %s
-				and outstanding_amount > 0 %s""" % ('%s', cond), self.company, as_dict=True)
+				and outstanding_amount > 0 %s"""
+				% ("%s", cond),
+				self.company,
+				as_dict=True,
+			)
 
 	def update_expense_claim(self):
 		for d in self.accounts:
-			if d.reference_type=="Expense Claim" and d.reference_name:
+			if d.reference_type == "Expense Claim" and d.reference_name:
 				doc = frappe.get_doc("Expense Claim", d.reference_name)
 				if self.docstatus == 2:
 					update_reimbursed_amount(doc, -1 * d.debit)
 				else:
 					update_reimbursed_amount(doc, d.debit)
 
-
 	def validate_expense_claim(self):
 		for d in self.accounts:
-			if d.reference_type=="Expense Claim":
-				sanctioned_amount, reimbursed_amount = frappe.db.get_value("Expense Claim",
-					d.reference_name, ("total_sanctioned_amount", "total_amount_reimbursed"))
+			if d.reference_type == "Expense Claim":
+				sanctioned_amount, reimbursed_amount = frappe.db.get_value(
+					"Expense Claim", d.reference_name, ("total_sanctioned_amount", "total_amount_reimbursed")
+				)
 				pending_amount = flt(sanctioned_amount) - flt(reimbursed_amount)
 				if d.debit > pending_amount:
-					frappe.throw(_("Row No {0}: Amount cannot be greater than Pending Amount against Expense Claim {1}. Pending Amount is {2}").format(d.idx, d.reference_name, pending_amount))
+					frappe.throw(
+						_(
+							"Row No {0}: Amount cannot be greater than Pending Amount against Expense Claim {1}. Pending Amount is {2}"
+						).format(d.idx, d.reference_name, pending_amount)
+					)
 
 	def validate_credit_debit_note(self):
 		if self.stock_entry:
 			if frappe.db.get_value("Stock Entry", self.stock_entry, "docstatus") != 1:
 				frappe.throw(_("Stock Entry {0} is not submitted").format(self.stock_entry))
 
-			if frappe.db.exists({"doctype": "Journal Entry", "stock_entry": self.stock_entry, "docstatus":1}):
-				frappe.msgprint(_("Warning: Another {0} # {1} exists against stock entry {2}").format(self.voucher_type, self.name, self.stock_entry))
+			if frappe.db.exists(
+				{"doctype": "Journal Entry", "stock_entry": self.stock_entry, "docstatus": 1}
+			):
+				frappe.msgprint(
+					_("Warning: Another {0} # {1} exists against stock entry {2}").format(
+						self.voucher_type, self.name, self.stock_entry
+					)
+				)
 
 	def validate_empty_accounts_table(self):
-		if not self.get('accounts'):
+		if not self.get("accounts"):
 			frappe.throw(_("Accounts table cannot be blank."))
 
 	def set_account_and_party_balance(self):
@@ -784,54 +985,66 @@
 				account_balance[d.account] = get_balance_on(account=d.account, date=self.posting_date)
 
 			if (d.party_type, d.party) not in party_balance:
-				party_balance[(d.party_type, d.party)] = get_balance_on(party_type=d.party_type,
-					party=d.party, date=self.posting_date, company=self.company)
+				party_balance[(d.party_type, d.party)] = get_balance_on(
+					party_type=d.party_type, party=d.party, date=self.posting_date, company=self.company
+				)
 
 			d.account_balance = account_balance[d.account]
 			d.party_balance = party_balance[(d.party_type, d.party)]
 
+
 @frappe.whitelist()
 def get_default_bank_cash_account(company, account_type=None, mode_of_payment=None, account=None):
 	from erpnext.accounts.doctype.sales_invoice.sales_invoice import get_bank_cash_account
+
 	if mode_of_payment:
 		account = get_bank_cash_account(mode_of_payment, company).get("account")
 
 	if not account:
-		'''
-			Set the default account first. If the user hasn't set any default account then, he doesn't
-			want us to set any random account. In this case set the account only if there is single
-			account (of that type), otherwise return empty dict.
-		'''
-		if account_type=="Bank":
-			account = frappe.get_cached_value('Company',  company,  "default_bank_account")
+		"""
+		Set the default account first. If the user hasn't set any default account then, he doesn't
+		want us to set any random account. In this case set the account only if there is single
+		account (of that type), otherwise return empty dict.
+		"""
+		if account_type == "Bank":
+			account = frappe.get_cached_value("Company", company, "default_bank_account")
 			if not account:
-				account_list = frappe.get_all("Account", filters = {"company": company,
-					"account_type": "Bank", "is_group": 0})
+				account_list = frappe.get_all(
+					"Account", filters={"company": company, "account_type": "Bank", "is_group": 0}
+				)
 				if len(account_list) == 1:
 					account = account_list[0].name
 
-		elif account_type=="Cash":
-			account = frappe.get_cached_value('Company',  company,  "default_cash_account")
+		elif account_type == "Cash":
+			account = frappe.get_cached_value("Company", company, "default_cash_account")
 			if not account:
-				account_list = frappe.get_all("Account", filters = {"company": company,
-					"account_type": "Cash", "is_group": 0})
+				account_list = frappe.get_all(
+					"Account", filters={"company": company, "account_type": "Cash", "is_group": 0}
+				)
 				if len(account_list) == 1:
 					account = account_list[0].name
 
 	if account:
-		account_details = frappe.db.get_value("Account", account,
-			["account_currency", "account_type"], as_dict=1)
+		account_details = frappe.db.get_value(
+			"Account", account, ["account_currency", "account_type"], as_dict=1
+		)
 
-		return frappe._dict({
-			"account": account,
-			"balance": get_balance_on(account),
-			"account_currency": account_details.account_currency,
-			"account_type": account_details.account_type
-		})
-	else: return frappe._dict()
+		return frappe._dict(
+			{
+				"account": account,
+				"balance": get_balance_on(account),
+				"account_currency": account_details.account_currency,
+				"account_type": account_details.account_type,
+			}
+		)
+	else:
+		return frappe._dict()
+
 
 @frappe.whitelist()
-def get_payment_entry_against_order(dt, dn, amount=None, debit_in_account_currency=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:
@@ -855,22 +1068,28 @@
 		else:
 			amount = flt(ref_doc.grand_total) - flt(ref_doc.advance_paid)
 
-	return get_payment_entry(ref_doc, {
-		"party_type": party_type,
-		"party_account": party_account,
-		"party_account_currency": party_account_currency,
-		"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,
-		"journal_entry": journal_entry
-	})
+	return get_payment_entry(
+		ref_doc,
+		{
+			"party_type": party_type,
+			"party_account": party_account,
+			"party_account_currency": party_account_currency,
+			"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,
+			"journal_entry": journal_entry,
+		},
+	)
+
 
 @frappe.whitelist()
-def get_payment_entry_against_invoice(dt, dn, amount=None,  debit_in_account_currency=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"
@@ -879,73 +1098,91 @@
 		party_type = "Supplier"
 		party_account = ref_doc.credit_to
 
-	if (dt == "Sales Invoice" and ref_doc.outstanding_amount > 0) \
-		or (dt == "Purchase Invoice" and ref_doc.outstanding_amount < 0):
-			amount_field_party = "credit_in_account_currency"
-			amount_field_bank = "debit_in_account_currency"
+	if (dt == "Sales Invoice" and ref_doc.outstanding_amount > 0) or (
+		dt == "Purchase Invoice" and ref_doc.outstanding_amount < 0
+	):
+		amount_field_party = "credit_in_account_currency"
+		amount_field_bank = "debit_in_account_currency"
 	else:
 		amount_field_party = "debit_in_account_currency"
 		amount_field_bank = "credit_in_account_currency"
 
-	return get_payment_entry(ref_doc, {
-		"party_type": party_type,
-		"party_account": party_account,
-		"party_account_currency": ref_doc.party_account_currency,
-		"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,
-		"journal_entry": journal_entry
-	})
+	return get_payment_entry(
+		ref_doc,
+		{
+			"party_type": party_type,
+			"party_account": party_account,
+			"party_account_currency": ref_doc.party_account_currency,
+			"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,
+			"journal_entry": journal_entry,
+		},
+	)
+
 
 def get_payment_entry(ref_doc, args):
-	cost_center = ref_doc.get("cost_center") or frappe.get_cached_value('Company',  ref_doc.company,  "cost_center")
+	cost_center = ref_doc.get("cost_center") or frappe.get_cached_value(
+		"Company", ref_doc.company, "cost_center"
+	)
 	exchange_rate = 1
 	if args.get("party_account"):
 		# Modified to include the posting date for which the exchange rate is required.
 		# Assumed to be the posting date in the reference document
-		exchange_rate = get_exchange_rate(ref_doc.get("posting_date") or ref_doc.get("transaction_date"),
-			args.get("party_account"), args.get("party_account_currency"),
-			ref_doc.company, ref_doc.doctype, ref_doc.name)
+		exchange_rate = get_exchange_rate(
+			ref_doc.get("posting_date") or ref_doc.get("transaction_date"),
+			args.get("party_account"),
+			args.get("party_account_currency"),
+			ref_doc.company,
+			ref_doc.doctype,
+			ref_doc.name,
+		)
 
 	je = frappe.new_doc("Journal Entry")
-	je.update({
-		"voucher_type": "Bank Entry",
-		"company": ref_doc.company,
-		"remark": args.get("remarks")
-	})
+	je.update(
+		{"voucher_type": "Bank Entry", "company": ref_doc.company, "remark": args.get("remarks")}
+	)
 
-	party_row = je.append("accounts", {
-		"account": args.get("party_account"),
-		"party_type": args.get("party_type"),
-		"party": ref_doc.get(args.get("party_type").lower()),
-		"cost_center": cost_center,
-		"account_type": frappe.db.get_value("Account", args.get("party_account"), "account_type"),
-		"account_currency": args.get("party_account_currency") or \
-							get_account_currency(args.get("party_account")),
-		"balance": get_balance_on(args.get("party_account")),
-		"party_balance": get_balance_on(party=args.get("party"), party_type=args.get("party_type")),
-		"exchange_rate": exchange_rate,
-		args.get("amount_field_party"): args.get("amount"),
-		"is_advance": args.get("is_advance"),
-		"reference_type": ref_doc.doctype,
-		"reference_name": ref_doc.name
-	})
+	party_row = je.append(
+		"accounts",
+		{
+			"account": args.get("party_account"),
+			"party_type": args.get("party_type"),
+			"party": ref_doc.get(args.get("party_type").lower()),
+			"cost_center": cost_center,
+			"account_type": frappe.db.get_value("Account", args.get("party_account"), "account_type"),
+			"account_currency": args.get("party_account_currency")
+			or get_account_currency(args.get("party_account")),
+			"balance": get_balance_on(args.get("party_account")),
+			"party_balance": get_balance_on(party=args.get("party"), party_type=args.get("party_type")),
+			"exchange_rate": exchange_rate,
+			args.get("amount_field_party"): args.get("amount"),
+			"is_advance": args.get("is_advance"),
+			"reference_type": ref_doc.doctype,
+			"reference_name": ref_doc.name,
+		},
+	)
 
 	bank_row = je.append("accounts")
 
 	# Make it bank_details
-	bank_account = get_default_bank_cash_account(ref_doc.company, "Bank", account=args.get("bank_account"))
+	bank_account = get_default_bank_cash_account(
+		ref_doc.company, "Bank", account=args.get("bank_account")
+	)
 	if bank_account:
 		bank_row.update(bank_account)
 		# Modified to include the posting date for which the exchange rate is required.
 		# Assumed to be the posting date of the reference date
-		bank_row.exchange_rate = get_exchange_rate(ref_doc.get("posting_date")
-			or ref_doc.get("transaction_date"), bank_account["account"],
-			bank_account["account_currency"], ref_doc.company)
+		bank_row.exchange_rate = get_exchange_rate(
+			ref_doc.get("posting_date") or ref_doc.get("transaction_date"),
+			bank_account["account"],
+			bank_account["account_currency"],
+			ref_doc.company,
+		)
 
 	bank_row.cost_center = cost_center
 
@@ -957,9 +1194,10 @@
 		bank_row.set(args.get("amount_field_bank"), amount * exchange_rate)
 
 	# Multi currency check again
-	if party_row.account_currency != ref_doc.company_currency \
-		or (bank_row.account_currency and bank_row.account_currency != ref_doc.company_currency):
-			je.multi_currency = 1
+	if party_row.account_currency != ref_doc.company_currency or (
+		bank_row.account_currency and bank_row.account_currency != ref_doc.company_currency
+	):
+		je.multi_currency = 1
 
 	je.set_amounts_in_company_currency()
 	je.set_total_debit_credit()
@@ -970,13 +1208,17 @@
 @frappe.whitelist()
 def get_opening_accounts(company):
 	"""get all balance sheet accounts for opening entry"""
-	accounts = frappe.db.sql_list("""select
+	accounts = frappe.db.sql_list(
+		"""select
 			name from tabAccount
 		where
 			is_group=0 and report_type='Balance Sheet' and company={0} and
 			name not in (select distinct account from tabWarehouse where
 			account is not null and account != '')
-		order by name asc""".format(frappe.db.escape(company)))
+		order by name asc""".format(
+			frappe.db.escape(company)
+		)
+	)
 
 	return [{"account": a, "balance": get_balance_on(a)} for a in accounts]
 
@@ -984,10 +1226,11 @@
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_against_jv(doctype, txt, searchfield, start, page_len, filters):
-	if not frappe.db.has_column('Journal Entry', searchfield):
+	if not frappe.db.has_column("Journal Entry", searchfield):
 		return []
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT jv.name, jv.posting_date, jv.user_remark
 		FROM `tabJournal Entry` jv, `tabJournal Entry Account` jv_detail
 		WHERE jv_detail.parent = jv.name
@@ -1001,14 +1244,17 @@
 			AND jv.`{0}` LIKE %(txt)s
 		ORDER BY jv.name DESC
 		LIMIT %(offset)s, %(limit)s
-		""".format(searchfield), dict(
-				account=filters.get("account"),
-				party=cstr(filters.get("party")),
-				txt="%{0}%".format(txt),
-				offset=start,
-				limit=page_len
-			)
-		)
+		""".format(
+			searchfield
+		),
+		dict(
+			account=filters.get("account"),
+			party=cstr(filters.get("party")),
+			txt="%{0}%".format(txt),
+			offset=start,
+			limit=page_len,
+		),
+	)
 
 
 @frappe.whitelist()
@@ -1024,37 +1270,55 @@
 	if args.get("doctype") == "Journal Entry":
 		condition = " and party=%(party)s" if args.get("party") else ""
 
-		against_jv_amount = frappe.db.sql("""
+		against_jv_amount = frappe.db.sql(
+			"""
 			select sum(debit_in_account_currency) - sum(credit_in_account_currency)
 			from `tabJournal Entry Account` where parent=%(docname)s and account=%(account)s {0}
-			and (reference_type is null or reference_type = '')""".format(condition), args)
+			and (reference_type is null or reference_type = '')""".format(
+				condition
+			),
+			args,
+		)
 
 		against_jv_amount = flt(against_jv_amount[0][0]) if against_jv_amount else 0
-		amount_field = "credit_in_account_currency" if against_jv_amount > 0 else "debit_in_account_currency"
-		return {
-			amount_field: abs(against_jv_amount)
-		}
+		amount_field = (
+			"credit_in_account_currency" if against_jv_amount > 0 else "debit_in_account_currency"
+		)
+		return {amount_field: abs(against_jv_amount)}
 	elif args.get("doctype") in ("Sales Invoice", "Purchase Invoice"):
 		party_type = "Customer" if args.get("doctype") == "Sales Invoice" else "Supplier"
-		invoice = frappe.db.get_value(args["doctype"], args["docname"],
-			["outstanding_amount", "conversion_rate", scrub(party_type)], as_dict=1)
+		invoice = frappe.db.get_value(
+			args["doctype"],
+			args["docname"],
+			["outstanding_amount", "conversion_rate", scrub(party_type)],
+			as_dict=1,
+		)
 
-		exchange_rate = invoice.conversion_rate if (args.get("account_currency") != company_currency) else 1
+		exchange_rate = (
+			invoice.conversion_rate if (args.get("account_currency") != company_currency) else 1
+		)
 
 		if args["doctype"] == "Sales Invoice":
-			amount_field = "credit_in_account_currency" \
-				if flt(invoice.outstanding_amount) > 0 else "debit_in_account_currency"
+			amount_field = (
+				"credit_in_account_currency"
+				if flt(invoice.outstanding_amount) > 0
+				else "debit_in_account_currency"
+			)
 		else:
-			amount_field = "debit_in_account_currency" \
-				if flt(invoice.outstanding_amount) > 0 else "credit_in_account_currency"
+			amount_field = (
+				"debit_in_account_currency"
+				if flt(invoice.outstanding_amount) > 0
+				else "credit_in_account_currency"
+			)
 
 		return {
 			amount_field: abs(flt(invoice.outstanding_amount)),
 			"exchange_rate": exchange_rate,
 			"party_type": party_type,
-			"party": invoice.get(scrub(party_type))
+			"party": invoice.get(scrub(party_type)),
 		}
 
+
 @frappe.whitelist()
 def get_party_account_and_balance(company, party_type, party, cost_center=None):
 	if not frappe.has_permission("Account"):
@@ -1063,24 +1327,30 @@
 	account = get_party_account(party_type, party, company)
 
 	account_balance = get_balance_on(account=account, cost_center=cost_center)
-	party_balance = get_balance_on(party_type=party_type, party=party, company=company, cost_center=cost_center)
+	party_balance = get_balance_on(
+		party_type=party_type, party=party, company=company, cost_center=cost_center
+	)
 
 	return {
 		"account": account,
 		"balance": account_balance,
 		"party_balance": party_balance,
-		"account_currency": frappe.db.get_value("Account", account, "account_currency")
+		"account_currency": frappe.db.get_value("Account", account, "account_currency"),
 	}
 
 
 @frappe.whitelist()
-def get_account_balance_and_party_type(account, date, company, debit=None, credit=None, exchange_rate=None, cost_center=None):
+def get_account_balance_and_party_type(
+	account, date, company, debit=None, credit=None, exchange_rate=None, cost_center=None
+):
 	"""Returns dict of account balance and party type to be set in Journal Entry on selection of account."""
 	if not frappe.has_permission("Account"):
 		frappe.msgprint(_("No Permission"), raise_exception=1)
 
 	company_currency = erpnext.get_company_currency(company)
-	account_details = frappe.db.get_value("Account", account, ["account_type", "account_currency"], as_dict=1)
+	account_details = frappe.db.get_value(
+		"Account", account, ["account_type", "account_currency"], as_dict=1
+	)
 
 	if not account_details:
 		return
@@ -1097,11 +1367,17 @@
 		"party_type": party_type,
 		"account_type": account_details.account_type,
 		"account_currency": account_details.account_currency or company_currency,
-
 		# The date used to retreive the exchange rate here is the date passed in
 		# as an argument to this function. It is assumed to be the date on which the balance is sought
-		"exchange_rate": get_exchange_rate(date, account, account_details.account_currency,
-			company, debit=debit, credit=credit, exchange_rate=exchange_rate)
+		"exchange_rate": get_exchange_rate(
+			date,
+			account,
+			account_details.account_currency,
+			company,
+			debit=debit,
+			credit=credit,
+			exchange_rate=exchange_rate,
+		),
 	}
 
 	# un-set party if not party type
@@ -1112,11 +1388,22 @@
 
 
 @frappe.whitelist()
-def get_exchange_rate(posting_date, account=None, account_currency=None, company=None,
-		reference_type=None, reference_name=None, debit=None, credit=None, exchange_rate=None):
+def get_exchange_rate(
+	posting_date,
+	account=None,
+	account_currency=None,
+	company=None,
+	reference_type=None,
+	reference_name=None,
+	debit=None,
+	credit=None,
+	exchange_rate=None,
+):
 	from erpnext.setup.utils import get_exchange_rate
-	account_details = frappe.db.get_value("Account", account,
-		["account_type", "root_type", "account_currency", "company"], as_dict=1)
+
+	account_details = frappe.db.get_value(
+		"Account", account, ["account_type", "root_type", "account_currency", "company"], as_dict=1
+	)
 
 	if not account_details:
 		frappe.throw(_("Please select correct account"))
@@ -1135,7 +1422,7 @@
 
 		# The date used to retreive the exchange rate here is the date passed
 		# in as an argument to this function.
-		elif (not exchange_rate or flt(exchange_rate)==1) and account_currency and posting_date:
+		elif (not exchange_rate or flt(exchange_rate) == 1) and account_currency and posting_date:
 			exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date)
 	else:
 		exchange_rate = 1
@@ -1154,15 +1441,17 @@
 
 	return exchange_rate
 
+
 @frappe.whitelist()
 def make_inter_company_journal_entry(name, voucher_type, company):
-	journal_entry = frappe.new_doc('Journal Entry')
+	journal_entry = frappe.new_doc("Journal Entry")
 	journal_entry.voucher_type = voucher_type
 	journal_entry.company = company
 	journal_entry.posting_date = nowdate()
 	journal_entry.inter_company_journal_entry_reference = name
 	return journal_entry.as_dict()
 
+
 @frappe.whitelist()
 def make_reverse_journal_entry(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
@@ -1170,24 +1459,25 @@
 	def post_process(source, target):
 		target.reversal_of = source.name
 
-	doclist = get_mapped_doc("Journal Entry", source_name, {
-		"Journal Entry": {
-			"doctype": "Journal Entry",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
+	doclist = get_mapped_doc(
+		"Journal Entry",
+		source_name,
+		{
+			"Journal Entry": {"doctype": "Journal Entry", "validation": {"docstatus": ["=", 1]}},
+			"Journal Entry Account": {
+				"doctype": "Journal Entry Account",
+				"field_map": {
+					"account_currency": "account_currency",
+					"exchange_rate": "exchange_rate",
+					"debit_in_account_currency": "credit_in_account_currency",
+					"debit": "credit",
+					"credit_in_account_currency": "debit_in_account_currency",
+					"credit": "debit",
+				},
+			},
 		},
-		"Journal Entry Account": {
-			"doctype": "Journal Entry Account",
-			"field_map": {
-				"account_currency": "account_currency",
-				"exchange_rate": "exchange_rate",
-				"debit_in_account_currency": "credit_in_account_currency",
-				"debit": "credit",
-				"credit_in_account_currency": "debit_in_account_currency",
-				"credit": "debit",
-			}
-		},
-	}, target_doc, post_process)
+		target_doc,
+		post_process,
+	)
 
 	return doclist
diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py
index 481462b..2cc5378 100644
--- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py
@@ -39,14 +39,25 @@
 		test_voucher.submit()
 
 		if test_voucher.doctype == "Journal Entry":
-			self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account`
+			self.assertTrue(
+				frappe.db.sql(
+					"""select name from `tabJournal Entry Account`
 				where account = %s and docstatus = 1 and parent = %s""",
-				("_Test Receivable - _TC", test_voucher.name)))
+					("_Test Receivable - _TC", test_voucher.name),
+				)
+			)
 
-		self.assertFalse(frappe.db.sql("""select name from `tabJournal Entry Account`
-			where reference_type = %s and reference_name = %s""", (test_voucher.doctype, test_voucher.name)))
+		self.assertFalse(
+			frappe.db.sql(
+				"""select name from `tabJournal Entry Account`
+			where reference_type = %s and reference_name = %s""",
+				(test_voucher.doctype, test_voucher.name),
+			)
+		)
 
-		base_jv.get("accounts")[0].is_advance = "Yes" if (test_voucher.doctype in ["Sales Order", "Purchase Order"]) else "No"
+		base_jv.get("accounts")[0].is_advance = (
+			"Yes" if (test_voucher.doctype in ["Sales Order", "Purchase Order"]) else "No"
+		)
 		base_jv.get("accounts")[0].set("reference_type", test_voucher.doctype)
 		base_jv.get("accounts")[0].set("reference_name", test_voucher.name)
 		base_jv.insert()
@@ -54,18 +65,28 @@
 
 		submitted_voucher = frappe.get_doc(test_voucher.doctype, test_voucher.name)
 
-		self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account`
-			where reference_type = %s and reference_name = %s and {0}=400""".format(dr_or_cr),
-				(submitted_voucher.doctype, submitted_voucher.name)))
+		self.assertTrue(
+			frappe.db.sql(
+				"""select name from `tabJournal Entry Account`
+			where reference_type = %s and reference_name = %s and {0}=400""".format(
+					dr_or_cr
+				),
+				(submitted_voucher.doctype, submitted_voucher.name),
+			)
+		)
 
 		if base_jv.get("accounts")[0].is_advance == "Yes":
 			self.advance_paid_testcase(base_jv, submitted_voucher, dr_or_cr)
 		self.cancel_against_voucher_testcase(submitted_voucher)
 
 	def advance_paid_testcase(self, base_jv, test_voucher, dr_or_cr):
-		#Test advance paid field
-		advance_paid = frappe.db.sql("""select advance_paid from `tab%s`
-					where name=%s""" % (test_voucher.doctype, '%s'), (test_voucher.name))
+		# Test advance paid field
+		advance_paid = frappe.db.sql(
+			"""select advance_paid from `tab%s`
+					where name=%s"""
+			% (test_voucher.doctype, "%s"),
+			(test_voucher.name),
+		)
 		payment_against_order = base_jv.get("accounts")[0].get(dr_or_cr)
 
 		self.assertTrue(flt(advance_paid[0][0]) == flt(payment_against_order))
@@ -74,13 +95,19 @@
 		if test_voucher.doctype == "Journal Entry":
 			# if test_voucher is a Journal Entry, test cancellation of test_voucher
 			test_voucher.cancel()
-			self.assertFalse(frappe.db.sql("""select name from `tabJournal Entry Account`
-				where reference_type='Journal Entry' and reference_name=%s""", test_voucher.name))
+			self.assertFalse(
+				frappe.db.sql(
+					"""select name from `tabJournal Entry Account`
+				where reference_type='Journal Entry' and reference_name=%s""",
+					test_voucher.name,
+				)
+			)
 
 		elif test_voucher.doctype in ["Sales Order", "Purchase Order"]:
 			# if test_voucher is a Sales Order/Purchase Order, test error on cancellation of test_voucher
-			frappe.db.set_value("Accounts Settings", "Accounts Settings",
-				"unlink_advance_payment_on_cancelation_of_order", 0)
+			frappe.db.set_value(
+				"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 0
+			)
 			submitted_voucher = frappe.get_doc(test_voucher.doctype, test_voucher.name)
 			self.assertRaises(frappe.LinkExistsError, submitted_voucher.cancel)
 
@@ -89,7 +116,10 @@
 		stock_account = get_inventory_account(company)
 
 		from erpnext.accounts.utils import get_stock_and_account_balance
-		account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(stock_account, nowdate(), company)
+
+		account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(
+			stock_account, nowdate(), company
+		)
 		diff = flt(account_bal) - flt(stock_bal)
 
 		if not diff:
@@ -98,19 +128,25 @@
 		jv = frappe.new_doc("Journal Entry")
 		jv.company = company
 		jv.posting_date = nowdate()
-		jv.append("accounts", {
-			"account": stock_account,
-			"cost_center": "Main - TCP1",
-			"debit_in_account_currency": 0 if diff > 0 else abs(diff),
-			"credit_in_account_currency": diff if diff > 0 else 0
-		})
+		jv.append(
+			"accounts",
+			{
+				"account": stock_account,
+				"cost_center": "Main - TCP1",
+				"debit_in_account_currency": 0 if diff > 0 else abs(diff),
+				"credit_in_account_currency": diff if diff > 0 else 0,
+			},
+		)
 
-		jv.append("accounts", {
-			"account": "Stock Adjustment - TCP1",
-			"cost_center": "Main - TCP1",
-			"debit_in_account_currency": diff if diff > 0 else 0,
-			"credit_in_account_currency": 0 if diff > 0 else abs(diff)
-		})
+		jv.append(
+			"accounts",
+			{
+				"account": "Stock Adjustment - TCP1",
+				"cost_center": "Main - TCP1",
+				"debit_in_account_currency": diff if diff > 0 else 0,
+				"credit_in_account_currency": 0 if diff > 0 else abs(diff),
+			},
+		)
 		jv.insert()
 
 		if account_bal == stock_bal:
@@ -121,16 +157,21 @@
 			jv.cancel()
 
 	def test_multi_currency(self):
-		jv = make_journal_entry("_Test Bank USD - _TC",
-			"_Test Bank - _TC", 100, exchange_rate=50, save=False)
+		jv = make_journal_entry(
+			"_Test Bank USD - _TC", "_Test Bank - _TC", 100, exchange_rate=50, save=False
+		)
 
 		jv.get("accounts")[1].credit_in_account_currency = 5000
 		jv.submit()
 
-		gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s
-			order by account asc""", jv.name, as_dict=1)
+			order by account asc""",
+			jv.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -140,33 +181,42 @@
 				"debit": 5000,
 				"debit_in_account_currency": 100,
 				"credit": 0,
-				"credit_in_account_currency": 0
+				"credit_in_account_currency": 0,
 			},
 			"_Test Bank - _TC": {
 				"account_currency": "INR",
 				"debit": 0,
 				"debit_in_account_currency": 0,
 				"credit": 5000,
-				"credit_in_account_currency": 5000
-			}
+				"credit_in_account_currency": 5000,
+			},
 		}
 
-		for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+		for field in (
+			"account_currency",
+			"debit",
+			"debit_in_account_currency",
+			"credit",
+			"credit_in_account_currency",
+		):
 			for i, gle in enumerate(gl_entries):
 				self.assertEqual(expected_values[gle.account][field], gle[field])
 
 		# cancel
 		jv.cancel()
 
-		gle = frappe.db.sql("""select name from `tabGL Entry`
-			where voucher_type='Sales Invoice' and voucher_no=%s""", jv.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no=%s""",
+			jv.name,
+		)
 
 		self.assertFalse(gle)
 
 	def test_reverse_journal_entry(self):
 		from erpnext.accounts.doctype.journal_entry.journal_entry import make_reverse_journal_entry
-		jv = make_journal_entry("_Test Bank USD - _TC",
-			"Sales - _TC", 100, exchange_rate=50, save=False)
+
+		jv = make_journal_entry("_Test Bank USD - _TC", "Sales - _TC", 100, exchange_rate=50, save=False)
 
 		jv.get("accounts")[1].credit_in_account_currency = 5000
 		jv.get("accounts")[1].exchange_rate = 1
@@ -176,15 +226,17 @@
 		rjv.posting_date = nowdate()
 		rjv.submit()
 
-
-		gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s
-			order by account asc""", rjv.name, as_dict=1)
+			order by account asc""",
+			rjv.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
-
 		expected_values = {
 			"_Test Bank USD - _TC": {
 				"account_currency": "USD",
@@ -199,44 +251,38 @@
 				"debit_in_account_currency": 5000,
 				"credit": 0,
 				"credit_in_account_currency": 0,
-			}
+			},
 		}
 
-		for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+		for field in (
+			"account_currency",
+			"debit",
+			"debit_in_account_currency",
+			"credit",
+			"credit_in_account_currency",
+		):
 			for i, gle in enumerate(gl_entries):
 				self.assertEqual(expected_values[gle.account][field], gle[field])
 
 	def test_disallow_change_in_account_currency_for_a_party(self):
 		# create jv in USD
-		jv = make_journal_entry("_Test Bank USD - _TC",
-			"_Test Receivable USD - _TC", 100, save=False)
+		jv = make_journal_entry("_Test Bank USD - _TC", "_Test Receivable USD - _TC", 100, save=False)
 
-		jv.accounts[1].update({
-			"party_type": "Customer",
-			"party": "_Test Customer USD"
-		})
+		jv.accounts[1].update({"party_type": "Customer", "party": "_Test Customer USD"})
 
 		jv.submit()
 
 		# create jv in USD, but account currency in INR
-		jv = make_journal_entry("_Test Bank - _TC",
-			"_Test Receivable - _TC", 100, save=False)
+		jv = make_journal_entry("_Test Bank - _TC", "_Test Receivable - _TC", 100, save=False)
 
-		jv.accounts[1].update({
-			"party_type": "Customer",
-			"party": "_Test Customer USD"
-		})
+		jv.accounts[1].update({"party_type": "Customer", "party": "_Test Customer USD"})
 
 		self.assertRaises(InvalidAccountCurrency, jv.submit)
 
 		# back in USD
-		jv = make_journal_entry("_Test Bank USD - _TC",
-			"_Test Receivable USD - _TC", 100, save=False)
+		jv = make_journal_entry("_Test Bank USD - _TC", "_Test Receivable USD - _TC", 100, save=False)
 
-		jv.accounts[1].update({
-			"party_type": "Customer",
-			"party": "_Test Customer USD"
-		})
+		jv.accounts[1].update({"party_type": "Customer", "party": "_Test Customer USD"})
 
 		jv.submit()
 
@@ -245,13 +291,27 @@
 		frappe.db.set_value("Account", "Buildings - _TC", "inter_company_account", 1)
 		frappe.db.set_value("Account", "Sales Expenses - _TC1", "inter_company_account", 1)
 		frappe.db.set_value("Account", "Buildings - _TC1", "inter_company_account", 1)
-		jv = make_journal_entry("Sales Expenses - _TC", "Buildings - _TC", 100, posting_date=nowdate(), cost_center = "Main - _TC", save=False)
+		jv = make_journal_entry(
+			"Sales Expenses - _TC",
+			"Buildings - _TC",
+			100,
+			posting_date=nowdate(),
+			cost_center="Main - _TC",
+			save=False,
+		)
 		jv.voucher_type = "Inter Company Journal Entry"
 		jv.multi_currency = 0
 		jv.insert()
 		jv.submit()
 
-		jv1 = make_journal_entry("Sales Expenses - _TC1", "Buildings - _TC1", 100, posting_date=nowdate(), cost_center = "Main - _TC1", save=False)
+		jv1 = make_journal_entry(
+			"Sales Expenses - _TC1",
+			"Buildings - _TC1",
+			100,
+			posting_date=nowdate(),
+			cost_center="Main - _TC1",
+			save=False,
+		)
 		jv1.inter_company_journal_entry_reference = jv.name
 		jv1.company = "_Test Company 1"
 		jv1.voucher_type = "Inter Company Journal Entry"
@@ -273,9 +333,12 @@
 
 	def test_jv_with_cost_centre(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
-		jv = make_journal_entry("_Test Cash - _TC", "_Test Bank - _TC", 100, cost_center = cost_center, save=False)
+		jv = make_journal_entry(
+			"_Test Cash - _TC", "_Test Bank - _TC", 100, cost_center=cost_center, save=False
+		)
 		jv.voucher_type = "Bank Entry"
 		jv.multi_currency = 0
 		jv.cheque_no = "112233"
@@ -284,17 +347,17 @@
 		jv.submit()
 
 		expected_values = {
-			"_Test Cash - _TC": {
-				"cost_center": cost_center
-			},
-			"_Test Bank - _TC": {
-				"cost_center": cost_center
-			}
+			"_Test Cash - _TC": {"cost_center": cost_center},
+			"_Test Bank - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, debit, credit
 			from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s
-			order by account asc""", jv.name, as_dict=1)
+			order by account asc""",
+			jv.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -305,11 +368,13 @@
 		from erpnext.projects.doctype.project.test_project import make_project
 
 		if not frappe.db.exists("Project", {"project_name": "Journal Entry Project"}):
-			project = make_project({
-				'project_name': 'Journal Entry Project',
-				'project_template_name': 'Test Project Template',
-				'start_date': '2020-01-01'
-			})
+			project = make_project(
+				{
+					"project_name": "Journal Entry Project",
+					"project_template_name": "Test Project Template",
+					"start_date": "2020-01-01",
+				}
+			)
 			project_name = project.name
 		else:
 			project_name = frappe.get_value("Project", {"project_name": "_Test Project"})
@@ -325,17 +390,17 @@
 		jv.submit()
 
 		expected_values = {
-			"_Test Cash - _TC": {
-				"project": project_name
-			},
-			"_Test Bank - _TC": {
-				"project": project_name
-			}
+			"_Test Cash - _TC": {"project": project_name},
+			"_Test Bank - _TC": {"project": project_name},
 		}
 
-		gl_entries = frappe.db.sql("""select account, project, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, project, debit, credit
 			from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s
-			order by account asc""", jv.name, as_dict=1)
+			order by account asc""",
+			jv.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -345,9 +410,12 @@
 	def test_jv_account_and_party_balance_with_cost_centre(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
 		from erpnext.accounts.utils import get_balance_on
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
-		jv = make_journal_entry("_Test Cash - _TC", "_Test Bank - _TC", 100, cost_center = cost_center, save=False)
+		jv = make_journal_entry(
+			"_Test Cash - _TC", "_Test Bank - _TC", 100, cost_center=cost_center, save=False
+		)
 		account_balance = get_balance_on(account="_Test Bank - _TC", cost_center=cost_center)
 		jv.voucher_type = "Bank Entry"
 		jv.multi_currency = 0
@@ -360,7 +428,18 @@
 		account_balance = get_balance_on(account="_Test Bank - _TC", cost_center=cost_center)
 		self.assertEqual(expected_account_balance, account_balance)
 
-def make_journal_entry(account1, account2, amount, cost_center=None, posting_date=None, exchange_rate=1, save=True, submit=False, project=None):
+
+def make_journal_entry(
+	account1,
+	account2,
+	amount,
+	cost_center=None,
+	posting_date=None,
+	exchange_rate=1,
+	save=True,
+	submit=False,
+	project=None,
+):
 	if not cost_center:
 		cost_center = "_Test Cost Center - _TC"
 
@@ -369,23 +448,27 @@
 	jv.company = "_Test Company"
 	jv.user_remark = "test"
 	jv.multi_currency = 1
-	jv.set("accounts", [
-		{
-			"account": account1,
-			"cost_center": cost_center,
-			"project": project,
-			"debit_in_account_currency": amount if amount > 0 else 0,
-			"credit_in_account_currency": abs(amount) if amount < 0 else 0,
-			"exchange_rate": exchange_rate
-		}, {
-			"account": account2,
-			"cost_center": cost_center,
-			"project": project,
-			"credit_in_account_currency": amount if amount > 0 else 0,
-			"debit_in_account_currency": abs(amount) if amount < 0 else 0,
-			"exchange_rate": exchange_rate
-		}
-	])
+	jv.set(
+		"accounts",
+		[
+			{
+				"account": account1,
+				"cost_center": cost_center,
+				"project": project,
+				"debit_in_account_currency": amount if amount > 0 else 0,
+				"credit_in_account_currency": abs(amount) if amount < 0 else 0,
+				"exchange_rate": exchange_rate,
+			},
+			{
+				"account": account2,
+				"cost_center": cost_center,
+				"project": project,
+				"credit_in_account_currency": amount if amount > 0 else 0,
+				"debit_in_account_currency": abs(amount) if amount < 0 else 0,
+				"exchange_rate": exchange_rate,
+			},
+		],
+	)
 	if save or submit:
 		jv.insert()
 
@@ -394,4 +477,5 @@
 
 	return jv
 
-test_records = frappe.get_test_records('Journal Entry')
+
+test_records = frappe.get_test_records("Journal Entry")
diff --git a/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py
index 2da72c2..b8ef354 100644
--- a/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py
+++ b/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py
@@ -9,6 +9,7 @@
 class JournalEntryTemplate(Document):
 	pass
 
+
 @frappe.whitelist()
 def get_naming_series():
 	return frappe.get_meta("Journal Entry").get_field("naming_series").options
diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
index 830ad37..c1e2975 100644
--- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
+++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
@@ -15,9 +15,7 @@
 		from frappe.utils.scheduler import is_scheduler_inactive
 
 		if is_scheduler_inactive() and not frappe.flags.in_test:
-			frappe.throw(
-				_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive")
-			)
+			frappe.throw(_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive"))
 
 		enqueued_jobs = [d.get("job_name") for d in get_info()]
 
@@ -35,10 +33,12 @@
 
 		return False
 
+
 @frappe.whitelist()
 def form_start_merge(docname):
 	return frappe.get_doc("Ledger Merge", docname).start_merge()
 
+
 def start_merge(docname):
 	ledger_merge = frappe.get_doc("Ledger Merge", docname)
 	successful_merges = 0
@@ -51,26 +51,24 @@
 					ledger_merge.account,
 					ledger_merge.is_group,
 					ledger_merge.root_type,
-					ledger_merge.company
+					ledger_merge.company,
 				)
-				row.db_set('merged', 1)
+				row.db_set("merged", 1)
 				frappe.db.commit()
 				successful_merges += 1
-				frappe.publish_realtime("ledger_merge_progress", {
-						"ledger_merge": ledger_merge.name,
-						"current": successful_merges,
-						"total": total
-					}
+				frappe.publish_realtime(
+					"ledger_merge_progress",
+					{"ledger_merge": ledger_merge.name, "current": successful_merges, "total": total},
 				)
 			except Exception:
 				frappe.db.rollback()
 				frappe.log_error(title=ledger_merge.name)
 			finally:
 				if successful_merges == total:
-					ledger_merge.db_set('status', 'Success')
+					ledger_merge.db_set("status", "Success")
 				elif successful_merges > 0:
-					ledger_merge.db_set('status', 'Partial Success')
+					ledger_merge.db_set("status", "Partial Success")
 				else:
-					ledger_merge.db_set('status', 'Error')
+					ledger_merge.db_set("status", "Error")
 
 	frappe.publish_realtime("ledger_merge_refresh", {"ledger_merge": ledger_merge.name})
diff --git a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py
index f731536..992ce9e 100644
--- a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py
+++ b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py
@@ -31,18 +31,17 @@
 			acc.company = "_Test Company"
 			acc.insert()
 
-		doc = frappe.get_doc({
-			"doctype": "Ledger Merge",
-			"company": "_Test Company",
-			"root_type": frappe.db.get_value("Account", "Indirect Test Expenses - _TC", "root_type"),
-			"account": "Indirect Expenses - _TC",
-			"merge_accounts": [
-				{
-					"account": "Indirect Test Expenses - _TC",
-					"account_name": "Indirect Expenses"
-				}
-			]
-		}).insert(ignore_permissions=True)
+		doc = frappe.get_doc(
+			{
+				"doctype": "Ledger Merge",
+				"company": "_Test Company",
+				"root_type": frappe.db.get_value("Account", "Indirect Test Expenses - _TC", "root_type"),
+				"account": "Indirect Expenses - _TC",
+				"merge_accounts": [
+					{"account": "Indirect Test Expenses - _TC", "account_name": "Indirect Expenses"}
+				],
+			}
+		).insert(ignore_permissions=True)
 
 		parent = frappe.db.get_value("Account", "Administrative Test Expenses - _TC", "parent_account")
 		self.assertEqual(parent, "Indirect Test Expenses - _TC")
@@ -76,22 +75,18 @@
 			acc.company = "_Test Company"
 			acc.insert()
 
-		doc = frappe.get_doc({
-			"doctype": "Ledger Merge",
-			"company": "_Test Company",
-			"root_type": frappe.db.get_value("Account", "Indirect Income - _TC", "root_type"),
-			"account": "Indirect Income - _TC",
-			"merge_accounts": [
-				{
-					"account": "Indirect Test Income - _TC",
-					"account_name": "Indirect Test Income"
-				},
-				{
-					"account": "Administrative Test Income - _TC",
-					"account_name": "Administrative Test Income"
-				}
-			]
-		}).insert(ignore_permissions=True)
+		doc = frappe.get_doc(
+			{
+				"doctype": "Ledger Merge",
+				"company": "_Test Company",
+				"root_type": frappe.db.get_value("Account", "Indirect Income - _TC", "root_type"),
+				"account": "Indirect Income - _TC",
+				"merge_accounts": [
+					{"account": "Indirect Test Income - _TC", "account_name": "Indirect Test Income"},
+					{"account": "Administrative Test Income - _TC", "account_name": "Administrative Test Income"},
+				],
+			}
+		).insert(ignore_permissions=True)
 
 		parent = frappe.db.get_value("Account", "Administrative Test Income - _TC", "parent_account")
 		self.assertEqual(parent, "Indirect Test Income - _TC")
@@ -112,7 +107,7 @@
 			"Indirect Test Expenses - _TC",
 			"Administrative Test Expenses - _TC",
 			"Indirect Test Income - _TC",
-			"Administrative Test Income - _TC"
+			"Administrative Test Income - _TC",
 		]
 		for account in test_accounts:
 			frappe.delete_doc_if_exists("Account", account)
diff --git a/erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.py b/erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.py
index f460b9f..dcb43fb 100644
--- a/erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.py
+++ b/erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.py
@@ -8,6 +8,7 @@
 
 exclude_from_linked_with = True
 
+
 class LoyaltyPointEntry(Document):
 	pass
 
@@ -16,18 +17,28 @@
 	if not expiry_date:
 		expiry_date = today()
 
-	return frappe.db.sql('''
+	return frappe.db.sql(
+		"""
 		select name, loyalty_points, expiry_date, loyalty_program_tier, invoice_type, invoice
 		from `tabLoyalty Point Entry`
 		where customer=%s and loyalty_program=%s
 			and expiry_date>=%s and loyalty_points>0 and company=%s
 		order by expiry_date
-	''', (customer, loyalty_program, expiry_date, company), as_dict=1)
+	""",
+		(customer, loyalty_program, expiry_date, company),
+		as_dict=1,
+	)
+
 
 def get_redemption_details(customer, loyalty_program, company):
-	return frappe._dict(frappe.db.sql('''
+	return frappe._dict(
+		frappe.db.sql(
+			"""
 		select redeem_against, sum(loyalty_points)
 		from `tabLoyalty Point Entry`
 		where customer=%s and loyalty_program=%s and loyalty_points<0 and company=%s
 		group by redeem_against
-	''', (customer, loyalty_program, company)))
+	""",
+			(customer, loyalty_program, company),
+		)
+	)
diff --git a/erpnext/accounts/doctype/loyalty_program/loyalty_program.py b/erpnext/accounts/doctype/loyalty_program/loyalty_program.py
index 70da03b..48a25ad 100644
--- a/erpnext/accounts/doctype/loyalty_program/loyalty_program.py
+++ b/erpnext/accounts/doctype/loyalty_program/loyalty_program.py
@@ -12,39 +12,61 @@
 	pass
 
 
-def get_loyalty_details(customer, loyalty_program, expiry_date=None, company=None, include_expired_entry=False):
+def get_loyalty_details(
+	customer, loyalty_program, expiry_date=None, company=None, include_expired_entry=False
+):
 	if not expiry_date:
 		expiry_date = today()
 
-	condition = ''
+	condition = ""
 	if company:
 		condition = " and company=%s " % frappe.db.escape(company)
 	if not include_expired_entry:
 		condition += " and expiry_date>='%s' " % expiry_date
 
-	loyalty_point_details = frappe.db.sql('''select sum(loyalty_points) as loyalty_points,
+	loyalty_point_details = frappe.db.sql(
+		"""select sum(loyalty_points) as loyalty_points,
 		sum(purchase_amount) as total_spent from `tabLoyalty Point Entry`
 		where customer=%s and loyalty_program=%s and posting_date <= %s
 		{condition}
-		group by customer'''.format(condition=condition),
-		(customer, loyalty_program, expiry_date), as_dict=1)
+		group by customer""".format(
+			condition=condition
+		),
+		(customer, loyalty_program, expiry_date),
+		as_dict=1,
+	)
 
 	if loyalty_point_details:
 		return loyalty_point_details[0]
 	else:
 		return {"loyalty_points": 0, "total_spent": 0}
 
-@frappe.whitelist()
-def get_loyalty_program_details_with_points(customer, loyalty_program=None, expiry_date=None, company=None, \
-		silent=False, include_expired_entry=False, current_transaction_amount=0):
-	lp_details = get_loyalty_program_details(customer, loyalty_program, company=company, silent=silent)
-	loyalty_program = frappe.get_doc("Loyalty Program", loyalty_program)
-	lp_details.update(get_loyalty_details(customer, loyalty_program.name, expiry_date, company, include_expired_entry))
 
-	tier_spent_level = sorted([d.as_dict() for d in loyalty_program.collection_rules],
-		key=lambda rule:rule.min_spent, reverse=True)
+@frappe.whitelist()
+def get_loyalty_program_details_with_points(
+	customer,
+	loyalty_program=None,
+	expiry_date=None,
+	company=None,
+	silent=False,
+	include_expired_entry=False,
+	current_transaction_amount=0,
+):
+	lp_details = get_loyalty_program_details(
+		customer, loyalty_program, company=company, silent=silent
+	)
+	loyalty_program = frappe.get_doc("Loyalty Program", loyalty_program)
+	lp_details.update(
+		get_loyalty_details(customer, loyalty_program.name, expiry_date, company, include_expired_entry)
+	)
+
+	tier_spent_level = sorted(
+		[d.as_dict() for d in loyalty_program.collection_rules],
+		key=lambda rule: rule.min_spent,
+		reverse=True,
+	)
 	for i, d in enumerate(tier_spent_level):
-		if i==0 or (lp_details.total_spent+current_transaction_amount) <= d.min_spent:
+		if i == 0 or (lp_details.total_spent + current_transaction_amount) <= d.min_spent:
 			lp_details.tier_name = d.tier_name
 			lp_details.collection_factor = d.collection_factor
 		else:
@@ -52,8 +74,16 @@
 
 	return lp_details
 
+
 @frappe.whitelist()
-def get_loyalty_program_details(customer, loyalty_program=None, expiry_date=None, company=None, silent=False, include_expired_entry=False):
+def get_loyalty_program_details(
+	customer,
+	loyalty_program=None,
+	expiry_date=None,
+	company=None,
+	silent=False,
+	include_expired_entry=False,
+):
 	lp_details = frappe._dict()
 
 	if not loyalty_program:
@@ -72,6 +102,7 @@
 	lp_details.update(loyalty_program.as_dict())
 	return lp_details
 
+
 @frappe.whitelist()
 def get_redeemption_factor(loyalty_program=None, customer=None):
 	customer_loyalty_program = None
@@ -98,13 +129,16 @@
 	else:
 		loyalty_program = frappe.db.get_value("Customer", ref_doc.customer, ["loyalty_program"])
 
-	if loyalty_program and frappe.db.get_value("Loyalty Program", loyalty_program, ["company"]) !=\
-		ref_doc.company:
+	if (
+		loyalty_program
+		and frappe.db.get_value("Loyalty Program", loyalty_program, ["company"]) != ref_doc.company
+	):
 		frappe.throw(_("The Loyalty Program isn't valid for the selected company"))
 
 	if loyalty_program and points_to_redeem:
-		loyalty_program_details = get_loyalty_program_details_with_points(ref_doc.customer, loyalty_program,
-			posting_date, ref_doc.company)
+		loyalty_program_details = get_loyalty_program_details_with_points(
+			ref_doc.customer, loyalty_program, posting_date, ref_doc.company
+		)
 
 		if points_to_redeem > loyalty_program_details.loyalty_points:
 			frappe.throw(_("You don't have enought Loyalty Points to redeem"))
diff --git a/erpnext/accounts/doctype/loyalty_program/loyalty_program_dashboard.py b/erpnext/accounts/doctype/loyalty_program/loyalty_program_dashboard.py
index 25328e5..3a4f908 100644
--- a/erpnext/accounts/doctype/loyalty_program/loyalty_program_dashboard.py
+++ b/erpnext/accounts/doctype/loyalty_program/loyalty_program_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
 	return {
-		'fieldname': 'loyalty_program',
-		'transactions': [
-			{
-				'items': ['Sales Invoice', 'Customer']
-			}
-		]
+		"fieldname": "loyalty_program",
+		"transactions": [{"items": ["Sales Invoice", "Customer"]}],
 	}
diff --git a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
index 82c1432..3641ac4 100644
--- a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
+++ b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
@@ -19,19 +19,28 @@
 		create_records()
 
 	def test_loyalty_points_earned_single_tier(self):
-		frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty")
+		frappe.db.set_value(
+			"Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty"
+		)
 		# create a new sales invoice
 		si_original = create_sales_invoice_record()
 		si_original.insert()
 		si_original.submit()
 
-		customer = frappe.get_doc('Customer', {"customer_name": "Test Loyalty Customer"})
+		customer = frappe.get_doc("Customer", {"customer_name": "Test Loyalty Customer"})
 		earned_points = get_points_earned(si_original)
 
-		lpe = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_original.name, 'customer': si_original.customer})
+		lpe = frappe.get_doc(
+			"Loyalty Point Entry",
+			{
+				"invoice_type": "Sales Invoice",
+				"invoice": si_original.name,
+				"customer": si_original.customer,
+			},
+		)
 
-		self.assertEqual(si_original.get('loyalty_program'), customer.loyalty_program)
-		self.assertEqual(lpe.get('loyalty_program_tier'), customer.loyalty_program_tier)
+		self.assertEqual(si_original.get("loyalty_program"), customer.loyalty_program)
+		self.assertEqual(lpe.get("loyalty_program_tier"), customer.loyalty_program_tier)
 		self.assertEqual(lpe.loyalty_points, earned_points)
 
 		# add redemption point
@@ -43,21 +52,31 @@
 
 		earned_after_redemption = get_points_earned(si_redeem)
 
-		lpe_redeem = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_redeem.name, 'redeem_against': lpe.name})
-		lpe_earn = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_redeem.name, 'name': ['!=', lpe_redeem.name]})
+		lpe_redeem = frappe.get_doc(
+			"Loyalty Point Entry",
+			{"invoice_type": "Sales Invoice", "invoice": si_redeem.name, "redeem_against": lpe.name},
+		)
+		lpe_earn = frappe.get_doc(
+			"Loyalty Point Entry",
+			{"invoice_type": "Sales Invoice", "invoice": si_redeem.name, "name": ["!=", lpe_redeem.name]},
+		)
 
 		self.assertEqual(lpe_earn.loyalty_points, earned_after_redemption)
-		self.assertEqual(lpe_redeem.loyalty_points, (-1*earned_points))
+		self.assertEqual(lpe_redeem.loyalty_points, (-1 * earned_points))
 
 		# cancel and delete
 		for d in [si_redeem, si_original]:
 			d.cancel()
 
 	def test_loyalty_points_earned_multiple_tier(self):
-		frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Multiple Loyalty")
+		frappe.db.set_value(
+			"Customer", "Test Loyalty Customer", "loyalty_program", "Test Multiple Loyalty"
+		)
 		# assign multiple tier program to the customer
-		customer = frappe.get_doc('Customer', {"customer_name": "Test Loyalty Customer"})
-		customer.loyalty_program = frappe.get_doc('Loyalty Program', {'loyalty_program_name': 'Test Multiple Loyalty'}).name
+		customer = frappe.get_doc("Customer", {"customer_name": "Test Loyalty Customer"})
+		customer.loyalty_program = frappe.get_doc(
+			"Loyalty Program", {"loyalty_program_name": "Test Multiple Loyalty"}
+		).name
 		customer.save()
 
 		# create a new sales invoice
@@ -67,10 +86,17 @@
 
 		earned_points = get_points_earned(si_original)
 
-		lpe = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_original.name, 'customer': si_original.customer})
+		lpe = frappe.get_doc(
+			"Loyalty Point Entry",
+			{
+				"invoice_type": "Sales Invoice",
+				"invoice": si_original.name,
+				"customer": si_original.customer,
+			},
+		)
 
-		self.assertEqual(si_original.get('loyalty_program'), customer.loyalty_program)
-		self.assertEqual(lpe.get('loyalty_program_tier'), customer.loyalty_program_tier)
+		self.assertEqual(si_original.get("loyalty_program"), customer.loyalty_program)
+		self.assertEqual(lpe.get("loyalty_program_tier"), customer.loyalty_program_tier)
 		self.assertEqual(lpe.loyalty_points, earned_points)
 
 		# add redemption point
@@ -80,14 +106,20 @@
 		si_redeem.insert()
 		si_redeem.submit()
 
-		customer = frappe.get_doc('Customer', {"customer_name": "Test Loyalty Customer"})
+		customer = frappe.get_doc("Customer", {"customer_name": "Test Loyalty Customer"})
 		earned_after_redemption = get_points_earned(si_redeem)
 
-		lpe_redeem = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_redeem.name, 'redeem_against': lpe.name})
-		lpe_earn = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_redeem.name, 'name': ['!=', lpe_redeem.name]})
+		lpe_redeem = frappe.get_doc(
+			"Loyalty Point Entry",
+			{"invoice_type": "Sales Invoice", "invoice": si_redeem.name, "redeem_against": lpe.name},
+		)
+		lpe_earn = frappe.get_doc(
+			"Loyalty Point Entry",
+			{"invoice_type": "Sales Invoice", "invoice": si_redeem.name, "name": ["!=", lpe_redeem.name]},
+		)
 
 		self.assertEqual(lpe_earn.loyalty_points, earned_after_redemption)
-		self.assertEqual(lpe_redeem.loyalty_points, (-1*earned_points))
+		self.assertEqual(lpe_redeem.loyalty_points, (-1 * earned_points))
 		self.assertEqual(lpe_earn.loyalty_program_tier, customer.loyalty_program_tier)
 
 		# cancel and delete
@@ -95,23 +127,30 @@
 			d.cancel()
 
 	def test_cancel_sales_invoice(self):
-		''' cancelling the sales invoice should cancel the earned points'''
-		frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty")
+		"""cancelling the sales invoice should cancel the earned points"""
+		frappe.db.set_value(
+			"Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty"
+		)
 		# create a new sales invoice
 		si = create_sales_invoice_record()
 		si.insert()
 		si.submit()
 
-		lpe = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si.name, 'customer': si.customer})
+		lpe = frappe.get_doc(
+			"Loyalty Point Entry",
+			{"invoice_type": "Sales Invoice", "invoice": si.name, "customer": si.customer},
+		)
 		self.assertEqual(True, not (lpe is None))
 
 		# cancelling sales invoice
 		si.cancel()
-		lpe = frappe.db.exists('Loyalty Point Entry', lpe.name)
+		lpe = frappe.db.exists("Loyalty Point Entry", lpe.name)
 		self.assertEqual(True, (lpe is None))
 
 	def test_sales_invoice_return(self):
-		frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty")
+		frappe.db.set_value(
+			"Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty"
+		)
 		# create a new sales invoice
 		si_original = create_sales_invoice_record(2)
 		si_original.conversion_rate = flt(1)
@@ -119,7 +158,14 @@
 		si_original.submit()
 
 		earned_points = get_points_earned(si_original)
-		lpe_original = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_original.name, 'customer': si_original.customer})
+		lpe_original = frappe.get_doc(
+			"Loyalty Point Entry",
+			{
+				"invoice_type": "Sales Invoice",
+				"invoice": si_original.name,
+				"customer": si_original.customer,
+			},
+		)
 		self.assertEqual(lpe_original.loyalty_points, earned_points)
 
 		# create sales invoice return
@@ -131,10 +177,17 @@
 		si_return.submit()
 
 		# fetch original invoice again as its status would have been updated
-		si_original = frappe.get_doc('Sales Invoice', lpe_original.invoice)
+		si_original = frappe.get_doc("Sales Invoice", lpe_original.invoice)
 
 		earned_points = get_points_earned(si_original)
-		lpe_after_return = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'Sales Invoice', 'invoice': si_original.name, 'customer': si_original.customer})
+		lpe_after_return = frappe.get_doc(
+			"Loyalty Point Entry",
+			{
+				"invoice_type": "Sales Invoice",
+				"invoice": si_original.name,
+				"customer": si_original.customer,
+			},
+		)
 		self.assertEqual(lpe_after_return.loyalty_points, earned_points)
 		self.assertEqual(True, (lpe_original.loyalty_points > lpe_after_return.loyalty_points))
 
@@ -143,144 +196,164 @@
 			try:
 				d.cancel()
 			except frappe.TimestampMismatchError:
-				frappe.get_doc('Sales Invoice', d.name).cancel()
+				frappe.get_doc("Sales Invoice", d.name).cancel()
 
 	def test_loyalty_points_for_dashboard(self):
-		doc = frappe.get_doc('Customer', 'Test Loyalty Customer')
+		doc = frappe.get_doc("Customer", "Test Loyalty Customer")
 		company_wise_info = get_dashboard_info("Customer", doc.name, doc.loyalty_program)
 
 		for d in company_wise_info:
 			self.assertTrue(d.get("loyalty_points"))
 
+
 def get_points_earned(self):
 	def get_returned_amount():
-		returned_amount = frappe.db.sql("""
+		returned_amount = frappe.db.sql(
+			"""
 			select sum(grand_total)
 			from `tabSales Invoice`
 			where docstatus=1 and is_return=1 and ifnull(return_against, '')=%s
-		""", self.name)
+		""",
+			self.name,
+		)
 		return abs(flt(returned_amount[0][0])) if returned_amount else 0
 
-	lp_details = get_loyalty_program_details_with_points(self.customer, company=self.company,
-		loyalty_program=self.loyalty_program, expiry_date=self.posting_date, include_expired_entry=True)
-	if lp_details and getdate(lp_details.from_date) <= getdate(self.posting_date) and \
-		(not lp_details.to_date or getdate(lp_details.to_date) >= getdate(self.posting_date)):
+	lp_details = get_loyalty_program_details_with_points(
+		self.customer,
+		company=self.company,
+		loyalty_program=self.loyalty_program,
+		expiry_date=self.posting_date,
+		include_expired_entry=True,
+	)
+	if (
+		lp_details
+		and getdate(lp_details.from_date) <= getdate(self.posting_date)
+		and (not lp_details.to_date or getdate(lp_details.to_date) >= getdate(self.posting_date))
+	):
 		returned_amount = get_returned_amount()
 		eligible_amount = flt(self.grand_total) - cint(self.loyalty_amount) - returned_amount
-		points_earned = cint(eligible_amount/lp_details.collection_factor)
+		points_earned = cint(eligible_amount / lp_details.collection_factor)
 
 	return points_earned or 0
 
+
 def create_sales_invoice_record(qty=1):
 	# return sales invoice doc object
-	return frappe.get_doc({
-		"doctype": "Sales Invoice",
-		"customer": frappe.get_doc('Customer', {"customer_name": "Test Loyalty Customer"}).name,
-		"company": '_Test Company',
-		"due_date": today(),
-		"posting_date": today(),
-		"currency": "INR",
-		"taxes_and_charges": "",
-		"debit_to": "Debtors - _TC",
-		"taxes": [],
-		"items": [{
-			'doctype': 'Sales Invoice Item',
-			'item_code': frappe.get_doc('Item', {'item_name': 'Loyal Item'}).name,
-			'qty': qty,
-			"rate": 10000,
-			'income_account': 'Sales - _TC',
-			'cost_center': 'Main - _TC',
-			'expense_account': 'Cost of Goods Sold - _TC'
-		}]
-	})
+	return frappe.get_doc(
+		{
+			"doctype": "Sales Invoice",
+			"customer": frappe.get_doc("Customer", {"customer_name": "Test Loyalty Customer"}).name,
+			"company": "_Test Company",
+			"due_date": today(),
+			"posting_date": today(),
+			"currency": "INR",
+			"taxes_and_charges": "",
+			"debit_to": "Debtors - _TC",
+			"taxes": [],
+			"items": [
+				{
+					"doctype": "Sales Invoice Item",
+					"item_code": frappe.get_doc("Item", {"item_name": "Loyal Item"}).name,
+					"qty": qty,
+					"rate": 10000,
+					"income_account": "Sales - _TC",
+					"cost_center": "Main - _TC",
+					"expense_account": "Cost of Goods Sold - _TC",
+				}
+			],
+		}
+	)
+
 
 def create_records():
 	# create a new loyalty Account
 	if not frappe.db.exists("Account", "Loyalty - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"account_name": "Loyalty",
-			"parent_account": "Direct Expenses - _TC",
-			"company": "_Test Company",
-			"is_group": 0,
-			"account_type": "Expense Account",
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"account_name": "Loyalty",
+				"parent_account": "Direct Expenses - _TC",
+				"company": "_Test Company",
+				"is_group": 0,
+				"account_type": "Expense Account",
+			}
+		).insert()
 
 	# create a new loyalty program Single tier
-	if not frappe.db.exists("Loyalty Program","Test Single Loyalty"):
-		frappe.get_doc({
-			"doctype": "Loyalty Program",
-			"loyalty_program_name": "Test Single Loyalty",
-			"auto_opt_in": 1,
-			"from_date": today(),
-			"loyalty_program_type": "Single Tier Program",
-			"conversion_factor": 1,
-			"expiry_duration": 10,
-			"company": "_Test Company",
-			"cost_center": "Main - _TC",
-			"expense_account": "Loyalty - _TC",
-			"collection_rules": [{
-				'tier_name': 'Silver',
-				'collection_factor': 1000,
-				'min_spent': 1000
-			}]
-		}).insert()
+	if not frappe.db.exists("Loyalty Program", "Test Single Loyalty"):
+		frappe.get_doc(
+			{
+				"doctype": "Loyalty Program",
+				"loyalty_program_name": "Test Single Loyalty",
+				"auto_opt_in": 1,
+				"from_date": today(),
+				"loyalty_program_type": "Single Tier Program",
+				"conversion_factor": 1,
+				"expiry_duration": 10,
+				"company": "_Test Company",
+				"cost_center": "Main - _TC",
+				"expense_account": "Loyalty - _TC",
+				"collection_rules": [{"tier_name": "Silver", "collection_factor": 1000, "min_spent": 1000}],
+			}
+		).insert()
 
 	# create a new customer
-	if not frappe.db.exists("Customer","Test Loyalty Customer"):
-		frappe.get_doc({
-			"customer_group": "_Test Customer Group",
-			"customer_name": "Test Loyalty Customer",
-			"customer_type": "Individual",
-			"doctype": "Customer",
-			"territory": "_Test Territory"
-		}).insert()
+	if not frappe.db.exists("Customer", "Test Loyalty Customer"):
+		frappe.get_doc(
+			{
+				"customer_group": "_Test Customer Group",
+				"customer_name": "Test Loyalty Customer",
+				"customer_type": "Individual",
+				"doctype": "Customer",
+				"territory": "_Test Territory",
+			}
+		).insert()
 
 	# create a new loyalty program Multiple tier
-	if not frappe.db.exists("Loyalty Program","Test Multiple Loyalty"):
-		frappe.get_doc({
-			"doctype": "Loyalty Program",
-			"loyalty_program_name": "Test Multiple Loyalty",
-			"auto_opt_in": 1,
-			"from_date": today(),
-			"loyalty_program_type": "Multiple Tier Program",
-			"conversion_factor": 1,
-			"expiry_duration": 10,
-			"company": "_Test Company",
-			"cost_center": "Main - _TC",
-			"expense_account": "Loyalty - _TC",
-			"collection_rules": [
-				{
-					'tier_name': 'Silver',
-					'collection_factor': 1000,
-					'min_spent': 10000
-				},
-				{
-					'tier_name': 'Gold',
-					'collection_factor': 1000,
-					'min_spent': 19000
-				}
-			]
-		}).insert()
+	if not frappe.db.exists("Loyalty Program", "Test Multiple Loyalty"):
+		frappe.get_doc(
+			{
+				"doctype": "Loyalty Program",
+				"loyalty_program_name": "Test Multiple Loyalty",
+				"auto_opt_in": 1,
+				"from_date": today(),
+				"loyalty_program_type": "Multiple Tier Program",
+				"conversion_factor": 1,
+				"expiry_duration": 10,
+				"company": "_Test Company",
+				"cost_center": "Main - _TC",
+				"expense_account": "Loyalty - _TC",
+				"collection_rules": [
+					{"tier_name": "Silver", "collection_factor": 1000, "min_spent": 10000},
+					{"tier_name": "Gold", "collection_factor": 1000, "min_spent": 19000},
+				],
+			}
+		).insert()
 
 	# create an item
 	if not frappe.db.exists("Item", "Loyal Item"):
-		frappe.get_doc({
-			"doctype": "Item",
-			"item_code": "Loyal Item",
-			"item_name": "Loyal Item",
-			"item_group": "All Item Groups",
-			"company": "_Test Company",
-			"is_stock_item": 1,
-			"opening_stock": 100,
-			"valuation_rate": 10000,
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": "Loyal Item",
+				"item_name": "Loyal Item",
+				"item_group": "All Item Groups",
+				"company": "_Test Company",
+				"is_stock_item": 1,
+				"opening_stock": 100,
+				"valuation_rate": 10000,
+			}
+		).insert()
 
 	# create item price
-	if not frappe.db.exists("Item Price", {"price_list": "Standard Selling", "item_code": "Loyal Item"}):
-		frappe.get_doc({
-			"doctype": "Item Price",
-			"price_list": "Standard Selling",
-			"item_code": "Loyal Item",
-			"price_list_rate": 10000
-		}).insert()
+	if not frappe.db.exists(
+		"Item Price", {"price_list": "Standard Selling", "item_code": "Loyal Item"}
+	):
+		frappe.get_doc(
+			{
+				"doctype": "Item Price",
+				"price_list": "Standard Selling",
+				"item_code": "Loyal Item",
+				"price_list_rate": 10000,
+			}
+		).insert()
diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py
index f21d1b9..d037302 100644
--- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py
+++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py
@@ -19,23 +19,35 @@
 		for entry in self.accounts:
 			accounts_list.append(entry.company)
 
-		if len(accounts_list)!= len(set(accounts_list)):
+		if len(accounts_list) != len(set(accounts_list)):
 			frappe.throw(_("Same Company is entered more than once"))
 
 	def validate_accounts(self):
 		for entry in self.accounts:
 			"""Error when Company of Ledger account doesn't match with Company Selected"""
 			if frappe.db.get_value("Account", entry.default_account, "company") != entry.company:
-				frappe.throw(_("Account {0} does not match with Company {1} in Mode of Account: {2}")
-					.format(entry.default_account, entry.company, self.name))
+				frappe.throw(
+					_("Account {0} does not match with Company {1} in Mode of Account: {2}").format(
+						entry.default_account, entry.company, self.name
+					)
+				)
 
 	def validate_pos_mode_of_payment(self):
 		if not self.enabled:
-			pos_profiles = frappe.db.sql("""SELECT sip.parent FROM `tabSales Invoice Payment` sip
-				WHERE sip.parenttype = 'POS Profile' and sip.mode_of_payment = %s""", (self.name))
+			pos_profiles = frappe.db.sql(
+				"""SELECT sip.parent FROM `tabSales Invoice Payment` sip
+				WHERE sip.parenttype = 'POS Profile' and sip.mode_of_payment = %s""",
+				(self.name),
+			)
 			pos_profiles = list(map(lambda x: x[0], pos_profiles))
 
 			if pos_profiles:
-				message = "POS Profile " + frappe.bold(", ".join(pos_profiles)) + " contains \
-					Mode of Payment " + frappe.bold(str(self.name)) + ". Please remove them to disable this mode."
+				message = (
+					"POS Profile "
+					+ frappe.bold(", ".join(pos_profiles))
+					+ " contains \
+					Mode of Payment "
+					+ frappe.bold(str(self.name))
+					+ ". Please remove them to disable this mode."
+				)
 				frappe.throw(_(message), title="Not Allowed")
diff --git a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py
index 2ff02a7..9733fb8 100644
--- a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py
+++ b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Mode of Payment')
 
+
 class TestModeofPayment(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py b/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py
index a8c5f68..1d19708 100644
--- a/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py
+++ b/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py
@@ -11,13 +11,25 @@
 class MonthlyDistribution(Document):
 	@frappe.whitelist()
 	def get_months(self):
-		month_list = ['January','February','March','April','May','June','July','August','September',
-		'October','November','December']
-		idx =1
+		month_list = [
+			"January",
+			"February",
+			"March",
+			"April",
+			"May",
+			"June",
+			"July",
+			"August",
+			"September",
+			"October",
+			"November",
+			"December",
+		]
+		idx = 1
 		for m in month_list:
-			mnth = self.append('percentages')
+			mnth = self.append("percentages")
 			mnth.month = m
-			mnth.percentage_allocation = 100.0/12
+			mnth.percentage_allocation = 100.0 / 12
 			mnth.idx = idx
 			idx += 1
 
@@ -25,18 +37,15 @@
 		total = sum(flt(d.percentage_allocation) for d in self.get("percentages"))
 
 		if flt(total, 2) != 100.0:
-			frappe.throw(_("Percentage Allocation should be equal to 100%") + \
-				" ({0}%)".format(str(flt(total, 2))))
+			frappe.throw(
+				_("Percentage Allocation should be equal to 100%") + " ({0}%)".format(str(flt(total, 2)))
+			)
+
 
 def get_periodwise_distribution_data(distribution_id, period_list, periodicity):
-	doc = frappe.get_doc('Monthly Distribution', distribution_id)
+	doc = frappe.get_doc("Monthly Distribution", distribution_id)
 
-	months_to_add = {
-		"Yearly": 12,
-		"Half-Yearly": 6,
-		"Quarterly": 3,
-		"Monthly": 1
-	}[periodicity]
+	months_to_add = {"Yearly": 12, "Half-Yearly": 6, "Quarterly": 3, "Monthly": 1}[periodicity]
 
 	period_dict = {}
 
@@ -45,6 +54,7 @@
 
 	return period_dict
 
+
 def get_percentage(doc, start_date, period):
 	percentage = 0
 	months = [start_date.strftime("%B").title()]
diff --git a/erpnext/accounts/doctype/monthly_distribution/monthly_distribution_dashboard.py b/erpnext/accounts/doctype/monthly_distribution/monthly_distribution_dashboard.py
index 96008c4..ba2cb67 100644
--- a/erpnext/accounts/doctype/monthly_distribution/monthly_distribution_dashboard.py
+++ b/erpnext/accounts/doctype/monthly_distribution/monthly_distribution_dashboard.py
@@ -3,19 +3,14 @@
 
 def get_data():
 	return {
-		'fieldname': 'monthly_distribution',
-		'non_standard_fieldnames': {
-			'Sales Person': 'distribution_id',
-			'Territory': 'distribution_id',
-			'Sales Partner': 'distribution_id',
+		"fieldname": "monthly_distribution",
+		"non_standard_fieldnames": {
+			"Sales Person": "distribution_id",
+			"Territory": "distribution_id",
+			"Sales Partner": "distribution_id",
 		},
-		'transactions': [
-			{
-				'label': _('Target Details'),
-				'items': ['Sales Person', 'Territory', 'Sales Partner']
-			},
-			{
-				'items': ['Budget']
-			}
-		]
+		"transactions": [
+			{"label": _("Target Details"), "items": ["Sales Person", "Territory", "Sales Partner"]},
+			{"items": ["Budget"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py b/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py
index 4a878b2..848b1f9 100644
--- a/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py
+++ b/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py
@@ -6,7 +6,8 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Monthly Distribution')
+test_records = frappe.get_test_records("Monthly Distribution")
+
 
 class TestMonthlyDistribution(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
index 6e7b80e..9d4d76b 100644
--- a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
+++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
@@ -20,9 +20,9 @@
 	def onload(self):
 		"""Load the Opening Invoice summary"""
 		summary, max_count = self.get_opening_invoice_summary()
-		self.set_onload('opening_invoices_summary', summary)
-		self.set_onload('max_count', max_count)
-		self.set_onload('temporary_opening_account', get_temporary_opening_account(self.company))
+		self.set_onload("opening_invoices_summary", summary)
+		self.set_onload("max_count", max_count)
+		self.set_onload("temporary_opening_account", get_temporary_opening_account(self.company))
 
 	def get_opening_invoice_summary(self):
 		def prepare_invoice_summary(doctype, invoices):
@@ -32,10 +32,7 @@
 			for invoice in invoices:
 				company = invoice.pop("company")
 				_summary = invoices_summary.get(company, {})
-				_summary.update({
-					"currency": company_wise_currency.get(company),
-					doctype: invoice
-				})
+				_summary.update({"currency": company_wise_currency.get(company), doctype: invoice})
 				invoices_summary.update({company: _summary})
 
 				if invoice.paid_amount:
@@ -44,17 +41,21 @@
 					outstanding_amount.append(invoice.outstanding_amount)
 
 			if paid_amount or outstanding_amount:
-				max_count.update({
-					doctype: {
-						"max_paid": max(paid_amount) if paid_amount else 0.0,
-						"max_due": max(outstanding_amount) if outstanding_amount else 0.0
+				max_count.update(
+					{
+						doctype: {
+							"max_paid": max(paid_amount) if paid_amount else 0.0,
+							"max_due": max(outstanding_amount) if outstanding_amount else 0.0,
+						}
 					}
-				})
+				)
 
 		invoices_summary = {}
 		max_count = {}
 		fields = [
-			"company", "count(name) as total_invoices", "sum(outstanding_amount) as outstanding_amount"
+			"company",
+			"count(name) as total_invoices",
+			"sum(outstanding_amount) as outstanding_amount",
 		]
 		companies = frappe.get_all("Company", fields=["name as company", "default_currency as currency"])
 		if not companies:
@@ -62,8 +63,9 @@
 
 		company_wise_currency = {row.company: row.currency for row in companies}
 		for doctype in ["Sales Invoice", "Purchase Invoice"]:
-			invoices = frappe.get_all(doctype, filters=dict(is_opening="Yes", docstatus=1),
-				fields=fields, group_by="company")
+			invoices = frappe.get_all(
+				doctype, filters=dict(is_opening="Yes", docstatus=1), fields=fields, group_by="company"
+			)
 			prepare_invoice_summary(doctype, invoices)
 
 		return invoices_summary, max_count
@@ -74,7 +76,9 @@
 
 	def set_missing_values(self, row):
 		row.qty = row.qty or 1.0
-		row.temporary_opening_account = row.temporary_opening_account or get_temporary_opening_account(self.company)
+		row.temporary_opening_account = row.temporary_opening_account or get_temporary_opening_account(
+			self.company
+		)
 		row.party_type = "Customer" if self.invoice_type == "Sales" else "Supplier"
 		row.item_name = row.item_name or _("Opening Invoice Item")
 		row.posting_date = row.posting_date or nowdate()
@@ -85,7 +89,11 @@
 			if self.create_missing_party:
 				self.add_party(row.party_type, row.party)
 			else:
-				frappe.throw(_("Row #{}: {} {} does not exist.").format(row.idx, frappe.bold(row.party_type), frappe.bold(row.party)))
+				frappe.throw(
+					_("Row #{}: {} {} does not exist.").format(
+						row.idx, frappe.bold(row.party_type), frappe.bold(row.party)
+					)
+				)
 
 		mandatory_error_msg = _("Row #{0}: {1} is required to create the Opening {2} Invoices")
 		for d in ("Party", "Outstanding Amount", "Temporary Opening Account"):
@@ -100,12 +108,19 @@
 			self.set_missing_values(row)
 			self.validate_mandatory_invoice_fields(row)
 			invoice = self.get_invoice_dict(row)
-			company_details = frappe.get_cached_value('Company', self.company, ["default_currency", "default_letter_head"], as_dict=1) or {}
+			company_details = (
+				frappe.get_cached_value(
+					"Company", self.company, ["default_currency", "default_letter_head"], as_dict=1
+				)
+				or {}
+			)
 			if company_details:
-				invoice.update({
-					"currency": company_details.get("default_currency"),
-					"letter_head": company_details.get("default_letter_head")
-				})
+				invoice.update(
+					{
+						"currency": company_details.get("default_currency"),
+						"letter_head": company_details.get("default_letter_head"),
+					}
+				)
 			invoices.append(invoice)
 
 		return invoices
@@ -127,55 +142,61 @@
 
 	def get_invoice_dict(self, row=None):
 		def get_item_dict():
-			cost_center = row.get('cost_center') or frappe.get_cached_value('Company', self.company,  "cost_center")
+			cost_center = row.get("cost_center") or frappe.get_cached_value(
+				"Company", self.company, "cost_center"
+			)
 			if not cost_center:
-				frappe.throw(_("Please set the Default Cost Center in {0} company.").format(frappe.bold(self.company)))
+				frappe.throw(
+					_("Please set the Default Cost Center in {0} company.").format(frappe.bold(self.company))
+				)
 
-			income_expense_account_field = "income_account" if row.party_type == "Customer" else "expense_account"
+			income_expense_account_field = (
+				"income_account" if row.party_type == "Customer" else "expense_account"
+			)
 			default_uom = frappe.db.get_single_value("Stock Settings", "stock_uom") or _("Nos")
 			rate = flt(row.outstanding_amount) / flt(row.qty)
 
-			item_dict = frappe._dict({
-				"uom": default_uom,
-				"rate": rate or 0.0,
-				"qty": row.qty,
-				"conversion_factor": 1.0,
-				"item_name": row.item_name or "Opening Invoice Item",
-				"description": row.item_name or "Opening Invoice Item",
-				income_expense_account_field: row.temporary_opening_account,
-				"cost_center": cost_center
-			})
+			item_dict = frappe._dict(
+				{
+					"uom": default_uom,
+					"rate": rate or 0.0,
+					"qty": row.qty,
+					"conversion_factor": 1.0,
+					"item_name": row.item_name or "Opening Invoice Item",
+					"description": row.item_name or "Opening Invoice Item",
+					income_expense_account_field: row.temporary_opening_account,
+					"cost_center": cost_center,
+				}
+			)
 
 			for dimension in get_accounting_dimensions():
-				item_dict.update({
-					dimension: row.get(dimension)
-				})
+				item_dict.update({dimension: row.get(dimension)})
 
 			return item_dict
 
 		item = get_item_dict()
 
-		invoice = frappe._dict({
-			"items": [item],
-			"is_opening": "Yes",
-			"set_posting_time": 1,
-			"company": self.company,
-			"cost_center": self.cost_center,
-			"due_date": row.due_date,
-			"posting_date": row.posting_date,
-			frappe.scrub(row.party_type): row.party,
-			"is_pos": 0,
-			"doctype": "Sales Invoice" if self.invoice_type == "Sales" else "Purchase Invoice",
-			"update_stock": 0,   # important: https://github.com/frappe/erpnext/pull/23559
-			"invoice_number": row.invoice_number,
-			"disable_rounded_total": 1
-		})
+		invoice = frappe._dict(
+			{
+				"items": [item],
+				"is_opening": "Yes",
+				"set_posting_time": 1,
+				"company": self.company,
+				"cost_center": self.cost_center,
+				"due_date": row.due_date,
+				"posting_date": row.posting_date,
+				frappe.scrub(row.party_type): row.party,
+				"is_pos": 0,
+				"doctype": "Sales Invoice" if self.invoice_type == "Sales" else "Purchase Invoice",
+				"update_stock": 0,  # important: https://github.com/frappe/erpnext/pull/23559
+				"invoice_number": row.invoice_number,
+				"disable_rounded_total": 1,
+			}
+		)
 
 		accounting_dimension = get_accounting_dimensions()
 		for dimension in accounting_dimension:
-			invoice.update({
-				dimension: self.get(dimension) or item.get(dimension)
-			})
+			invoice.update({dimension: self.get(dimension) or item.get(dimension)})
 
 		return invoice
 
@@ -201,9 +222,10 @@
 					event="opening_invoice_creation",
 					job_name=self.name,
 					invoices=invoices,
-					now=frappe.conf.developer_mode or frappe.flags.in_test
+					now=frappe.conf.developer_mode or frappe.flags.in_test,
 				)
 
+
 def start_import(invoices):
 	errors = 0
 	names = []
@@ -222,14 +244,22 @@
 		except Exception:
 			errors += 1
 			frappe.db.rollback()
-			message = "\n".join(["Data:", dumps(d, default=str, indent=4), "--" * 50, "\nException:", traceback.format_exc()])
+			message = "\n".join(
+				["Data:", dumps(d, default=str, indent=4), "--" * 50, "\nException:", traceback.format_exc()]
+			)
 			frappe.log_error(title="Error while creating Opening Invoice", message=message)
 			frappe.db.commit()
 	if errors:
-		frappe.msgprint(_("You had {} errors while creating opening invoices. Check {} for more details")
-			.format(errors, "<a href='/app/List/Error Log' class='variant-click'>Error Log</a>"), indicator="red", title=_("Error Occured"))
+		frappe.msgprint(
+			_("You had {} errors while creating opening invoices. Check {} for more details").format(
+				errors, "<a href='/app/List/Error Log' class='variant-click'>Error Log</a>"
+			),
+			indicator="red",
+			title=_("Error Occured"),
+		)
 	return names
 
+
 def publish(index, total, doctype):
 	if total < 50:
 		return
@@ -237,21 +267,20 @@
 		"opening_invoice_creation_progress",
 		dict(
 			title=_("Opening Invoice Creation In Progress"),
-			message=_('Creating {} out of {} {}').format(index + 1, total, doctype),
+			message=_("Creating {} out of {} {}").format(index + 1, total, doctype),
 			user=frappe.session.user,
-			count=index+1,
-			total=total
-		))
+			count=index + 1,
+			total=total,
+		),
+	)
+
 
 @frappe.whitelist()
 def get_temporary_opening_account(company=None):
 	if not company:
 		return
 
-	accounts = frappe.get_all("Account", filters={
-		'company': company,
-		'account_type': 'Temporary'
-	})
+	accounts = frappe.get_all("Account", filters={"company": company, "account_type": "Temporary"})
 	if not accounts:
 		frappe.throw(_("Please add a Temporary Opening account in Chart of Accounts"))
 
diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py b/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py
index 77d54a6..1e22c64 100644
--- a/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py
+++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py
@@ -14,6 +14,7 @@
 
 test_dependencies = ["Customer", "Supplier", "Accounting Dimension"]
 
+
 class TestOpeningInvoiceCreationTool(FrappeTestCase):
 	@classmethod
 	def setUpClass(self):
@@ -22,10 +23,24 @@
 		create_dimension()
 		return super().setUpClass()
 
-	def make_invoices(self, invoice_type="Sales", company=None, party_1=None, party_2=None, invoice_number=None, department=None):
+	def make_invoices(
+		self,
+		invoice_type="Sales",
+		company=None,
+		party_1=None,
+		party_2=None,
+		invoice_number=None,
+		department=None,
+	):
 		doc = frappe.get_single("Opening Invoice Creation Tool")
-		args = get_opening_invoice_creation_dict(invoice_type=invoice_type, company=company,
-			party_1=party_1, party_2=party_2, invoice_number=invoice_number, department=department)
+		args = get_opening_invoice_creation_dict(
+			invoice_type=invoice_type,
+			company=company,
+			party_1=party_1,
+			party_2=party_2,
+			invoice_number=invoice_number,
+			department=department,
+		)
 		doc.update(args)
 		return doc.make_invoices()
 
@@ -68,15 +83,30 @@
 		company = "_Test Opening Invoice Company"
 		party_1, party_2 = make_customer("Customer A"), make_customer("Customer B")
 
-		old_default_receivable_account = frappe.db.get_value("Company", company, "default_receivable_account")
+		old_default_receivable_account = frappe.db.get_value(
+			"Company", company, "default_receivable_account"
+		)
 		frappe.db.set_value("Company", company, "default_receivable_account", "")
 
 		if not frappe.db.exists("Cost Center", "_Test Opening Invoice Company - _TOIC"):
-			cc = frappe.get_doc({"doctype": "Cost Center", "cost_center_name": "_Test Opening Invoice Company",
-				"is_group": 1, "company": "_Test Opening Invoice Company"})
+			cc = frappe.get_doc(
+				{
+					"doctype": "Cost Center",
+					"cost_center_name": "_Test Opening Invoice Company",
+					"is_group": 1,
+					"company": "_Test Opening Invoice Company",
+				}
+			)
 			cc.insert(ignore_mandatory=True)
-			cc2 = frappe.get_doc({"doctype": "Cost Center", "cost_center_name": "Main", "is_group": 0,
-				"company": "_Test Opening Invoice Company", "parent_cost_center": cc.name})
+			cc2 = frappe.get_doc(
+				{
+					"doctype": "Cost Center",
+					"cost_center_name": "Main",
+					"is_group": 0,
+					"company": "_Test Opening Invoice Company",
+					"parent_cost_center": cc.name,
+				}
+			)
 			cc2.insert()
 
 		frappe.db.set_value("Company", company, "cost_center", "Main - _TOIC")
@@ -84,28 +114,37 @@
 		self.make_invoices(company="_Test Opening Invoice Company", party_1=party_1, party_2=party_2)
 
 		# Check if missing debit account error raised
-		error_log = frappe.db.exists("Error Log", {"error": ["like", "%erpnext.controllers.accounts_controller.AccountMissingError%"]})
+		error_log = frappe.db.exists(
+			"Error Log",
+			{"error": ["like", "%erpnext.controllers.accounts_controller.AccountMissingError%"]},
+		)
 		self.assertTrue(error_log)
 
 		# teardown
-		frappe.db.set_value("Company", company, "default_receivable_account", old_default_receivable_account)
+		frappe.db.set_value(
+			"Company", company, "default_receivable_account", old_default_receivable_account
+		)
 
 	def test_renaming_of_invoice_using_invoice_number_field(self):
 		company = "_Test Opening Invoice Company"
 		party_1, party_2 = make_customer("Customer A"), make_customer("Customer B")
-		self.make_invoices(company=company, party_1=party_1, party_2=party_2, invoice_number="TEST-NEW-INV-11")
+		self.make_invoices(
+			company=company, party_1=party_1, party_2=party_2, invoice_number="TEST-NEW-INV-11"
+		)
 
-		sales_inv1 = frappe.get_all('Sales Invoice', filters={'customer':'Customer A'})[0].get("name")
-		sales_inv2 = frappe.get_all('Sales Invoice', filters={'customer':'Customer B'})[0].get("name")
+		sales_inv1 = frappe.get_all("Sales Invoice", filters={"customer": "Customer A"})[0].get("name")
+		sales_inv2 = frappe.get_all("Sales Invoice", filters={"customer": "Customer B"})[0].get("name")
 		self.assertEqual(sales_inv1, "TEST-NEW-INV-11")
 
-		#teardown
+		# teardown
 		for inv in [sales_inv1, sales_inv2]:
-			doc = frappe.get_doc('Sales Invoice', inv)
+			doc = frappe.get_doc("Sales Invoice", inv)
 			doc.cancel()
 
 	def test_opening_invoice_with_accounting_dimension(self):
-		invoices = self.make_invoices(invoice_type="Sales", company="_Test Opening Invoice Company", department='Sales - _TOIC')
+		invoices = self.make_invoices(
+			invoice_type="Sales", company="_Test Opening Invoice Company", department="Sales - _TOIC"
+		)
 
 		expected_value = {
 			"keys": ["customer", "outstanding_amount", "status", "department"],
@@ -117,40 +156,44 @@
 	def tearDown(self):
 		disable_dimension()
 
+
 def get_opening_invoice_creation_dict(**args):
 	party = "Customer" if args.get("invoice_type", "Sales") == "Sales" else "Supplier"
 	company = args.get("company", "_Test Company")
 
-	invoice_dict = frappe._dict({
-		"company": company,
-		"invoice_type": args.get("invoice_type", "Sales"),
-		"invoices": [
-			{
-				"qty": 1.0,
-				"outstanding_amount": 300,
-				"party": args.get("party_1") or "_Test {0}".format(party),
-				"item_name": "Opening Item",
-				"due_date": "2016-09-10",
-				"posting_date": "2016-09-05",
-				"temporary_opening_account": get_temporary_opening_account(company),
-				"invoice_number": args.get("invoice_number")
-			},
-			{
-				"qty": 2.0,
-				"outstanding_amount": 250,
-				"party": args.get("party_2") or "_Test {0} 1".format(party),
-				"item_name": "Opening Item",
-				"due_date": "2016-09-10",
-				"posting_date": "2016-09-05",
-				"temporary_opening_account": get_temporary_opening_account(company),
-				"invoice_number": None
-			}
-		]
-	})
+	invoice_dict = frappe._dict(
+		{
+			"company": company,
+			"invoice_type": args.get("invoice_type", "Sales"),
+			"invoices": [
+				{
+					"qty": 1.0,
+					"outstanding_amount": 300,
+					"party": args.get("party_1") or "_Test {0}".format(party),
+					"item_name": "Opening Item",
+					"due_date": "2016-09-10",
+					"posting_date": "2016-09-05",
+					"temporary_opening_account": get_temporary_opening_account(company),
+					"invoice_number": args.get("invoice_number"),
+				},
+				{
+					"qty": 2.0,
+					"outstanding_amount": 250,
+					"party": args.get("party_2") or "_Test {0} 1".format(party),
+					"item_name": "Opening Item",
+					"due_date": "2016-09-10",
+					"posting_date": "2016-09-05",
+					"temporary_opening_account": get_temporary_opening_account(company),
+					"invoice_number": None,
+				},
+			],
+		}
+	)
 
 	invoice_dict.update(args)
 	return invoice_dict
 
+
 def make_company():
 	if frappe.db.exists("Company", "_Test Opening Invoice Company"):
 		return frappe.get_doc("Company", "_Test Opening Invoice Company")
@@ -163,15 +206,18 @@
 	company.insert()
 	return company
 
+
 def make_customer(customer=None):
 	customer_name = customer or "Opening Customer"
-	customer = frappe.get_doc({
-		"doctype": "Customer",
-		"customer_name": customer_name,
-		"customer_group": "All Customer Groups",
-		"customer_type": "Company",
-		"territory": "All Territories"
-	})
+	customer = frappe.get_doc(
+		{
+			"doctype": "Customer",
+			"customer_name": customer_name,
+			"customer_group": "All Customer Groups",
+			"customer_type": "Company",
+			"territory": "All Territories",
+		}
+	)
 	if not frappe.db.exists("Customer", customer_name):
 		customer.insert(ignore_permissions=True)
 		return customer.name
diff --git a/erpnext/accounts/doctype/party_link/party_link.py b/erpnext/accounts/doctype/party_link/party_link.py
index 031a9fa..312cfd2 100644
--- a/erpnext/accounts/doctype/party_link/party_link.py
+++ b/erpnext/accounts/doctype/party_link/party_link.py
@@ -8,45 +8,55 @@
 
 class PartyLink(Document):
 	def validate(self):
-		if self.primary_role not in ['Customer', 'Supplier']:
-			frappe.throw(_("Allowed primary roles are 'Customer' and 'Supplier'. Please select one of these roles only."),
-				title=_("Invalid Primary Role"))
+		if self.primary_role not in ["Customer", "Supplier"]:
+			frappe.throw(
+				_(
+					"Allowed primary roles are 'Customer' and 'Supplier'. Please select one of these roles only."
+				),
+				title=_("Invalid Primary Role"),
+			)
 
-		existing_party_link = frappe.get_all('Party Link', {
-			'primary_party': self.primary_party,
-			'secondary_party': self.secondary_party
-		}, pluck="primary_role")
+		existing_party_link = frappe.get_all(
+			"Party Link",
+			{"primary_party": self.primary_party, "secondary_party": self.secondary_party},
+			pluck="primary_role",
+		)
 		if existing_party_link:
-			frappe.throw(_('{} {} is already linked with {} {}')
-				.format(
-					self.primary_role, bold(self.primary_party),
-					self.secondary_role, bold(self.secondary_party)
-				))
+			frappe.throw(
+				_("{} {} is already linked with {} {}").format(
+					self.primary_role, bold(self.primary_party), self.secondary_role, bold(self.secondary_party)
+				)
+			)
 
-		existing_party_link = frappe.get_all('Party Link', {
-			'primary_party': self.secondary_party
-		}, pluck="primary_role")
+		existing_party_link = frappe.get_all(
+			"Party Link", {"primary_party": self.secondary_party}, pluck="primary_role"
+		)
 		if existing_party_link:
-			frappe.throw(_('{} {} is already linked with another {}')
-				.format(self.secondary_role, self.secondary_party, existing_party_link[0]))
+			frappe.throw(
+				_("{} {} is already linked with another {}").format(
+					self.secondary_role, self.secondary_party, existing_party_link[0]
+				)
+			)
 
-		existing_party_link = frappe.get_all('Party Link', {
-			'secondary_party': self.primary_party
-		}, pluck="primary_role")
+		existing_party_link = frappe.get_all(
+			"Party Link", {"secondary_party": self.primary_party}, pluck="primary_role"
+		)
 		if existing_party_link:
-			frappe.throw(_('{} {} is already linked with another {}')
-				.format(self.primary_role, self.primary_party, existing_party_link[0]))
+			frappe.throw(
+				_("{} {} is already linked with another {}").format(
+					self.primary_role, self.primary_party, existing_party_link[0]
+				)
+			)
 
 
 @frappe.whitelist()
 def create_party_link(primary_role, primary_party, secondary_party):
-	party_link = frappe.new_doc('Party Link')
+	party_link = frappe.new_doc("Party Link")
 	party_link.primary_role = primary_role
 	party_link.primary_party = primary_party
-	party_link.secondary_role = 'Customer' if primary_role == 'Supplier' else 'Supplier'
+	party_link.secondary_role = "Customer" if primary_role == "Supplier" else "Supplier"
 	party_link.secondary_party = secondary_party
 
 	party_link.save(ignore_permissions=True)
 
 	return party_link
-
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index f9f3350..e6a554c 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -95,7 +95,7 @@
 		self.set_status()
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 		self.make_gl_entries(cancel=1)
 		self.update_expense_claim()
 		self.update_outstanding_amounts()
@@ -107,6 +107,7 @@
 
 	def set_payment_req_status(self):
 		from erpnext.accounts.doctype.payment_request.payment_request import update_payment_req_status
+
 		update_payment_req_status(self, None)
 
 	def update_outstanding_amounts(self):
@@ -116,8 +117,11 @@
 		reference_names = []
 		for d in self.get("references"):
 			if (d.reference_doctype, d.reference_name, d.payment_term) in reference_names:
-				frappe.throw(_("Row #{0}: Duplicate entry in References {1} {2}")
-					.format(d.idx, d.reference_doctype, d.reference_name))
+				frappe.throw(
+					_("Row #{0}: Duplicate entry in References {1} {2}").format(
+						d.idx, d.reference_doctype, d.reference_name
+					)
+				)
 			reference_names.append((d.reference_doctype, d.reference_name, d.payment_term))
 
 	def set_bank_account_data(self):
@@ -133,20 +137,27 @@
 				self.set(field, bank_data.account)
 
 	def validate_payment_type_with_outstanding(self):
-		total_outstanding = sum(d.allocated_amount for d in self.get('references'))
-		if total_outstanding < 0 and self.party_type == 'Customer' and self.payment_type == 'Receive':
-			frappe.throw(_("Cannot receive from customer against negative outstanding"), title=_("Incorrect Payment Type"))
+		total_outstanding = sum(d.allocated_amount for d in self.get("references"))
+		if total_outstanding < 0 and self.party_type == "Customer" and self.payment_type == "Receive":
+			frappe.throw(
+				_("Cannot receive from customer against negative outstanding"),
+				title=_("Incorrect Payment Type"),
+			)
 
 	def validate_allocated_amount(self):
 		for d in self.get("references"):
-			if (flt(d.allocated_amount))> 0:
+			if (flt(d.allocated_amount)) > 0:
 				if flt(d.allocated_amount) > flt(d.outstanding_amount):
-					frappe.throw(_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx))
+					frappe.throw(
+						_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx)
+					)
 
 			# Check for negative outstanding invoices as well
 			if flt(d.allocated_amount) < 0:
 				if flt(d.allocated_amount) < flt(d.outstanding_amount):
-					frappe.throw(_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx))
+					frappe.throw(
+						_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx)
+					)
 
 	def delink_advance_entry_references(self):
 		for reference in self.references:
@@ -156,9 +167,14 @@
 
 	def set_missing_values(self):
 		if self.payment_type == "Internal Transfer":
-			for field in ("party", "party_balance", "total_allocated_amount",
-				"base_total_allocated_amount", "unallocated_amount"):
-					self.set(field, None)
+			for field in (
+				"party",
+				"party_balance",
+				"total_allocated_amount",
+				"base_total_allocated_amount",
+				"unallocated_amount",
+			):
+				self.set(field, None)
 			self.references = []
 		else:
 			if not self.party_type:
@@ -167,13 +183,16 @@
 			if not self.party:
 				frappe.throw(_("Party is mandatory"))
 
-			_party_name = "title" if self.party_type in ("Student", "Shareholder") else self.party_type.lower() + "_name"
+			_party_name = (
+				"title" if self.party_type in ("Student", "Shareholder") else self.party_type.lower() + "_name"
+			)
 			self.party_name = frappe.db.get_value(self.party_type, self.party, _party_name)
 
 		if self.party:
 			if not self.party_balance:
-				self.party_balance = get_balance_on(party_type=self.party_type,
-					party=self.party, date=self.posting_date, company=self.company)
+				self.party_balance = get_balance_on(
+					party_type=self.party_type, party=self.party, date=self.posting_date, company=self.company
+				)
 
 			if not self.party_account:
 				party_account = get_party_account(self.party_type, self.party, self.company)
@@ -190,16 +209,20 @@
 			self.paid_to_account_currency = acc.account_currency
 			self.paid_to_account_balance = acc.account_balance
 
-		self.party_account_currency = self.paid_from_account_currency \
-			if self.payment_type=="Receive" else self.paid_to_account_currency
+		self.party_account_currency = (
+			self.paid_from_account_currency
+			if self.payment_type == "Receive"
+			else self.paid_to_account_currency
+		)
 
 		self.set_missing_ref_details()
 
 	def set_missing_ref_details(self, force=False):
 		for d in self.get("references"):
 			if d.allocated_amount:
-				ref_details = get_reference_details(d.reference_doctype,
-					d.reference_name, self.party_account_currency)
+				ref_details = get_reference_details(
+					d.reference_doctype, d.reference_name, self.party_account_currency
+				)
 
 				for field, value in ref_details.items():
 					if d.exchange_gain_loss:
@@ -209,7 +232,7 @@
 						# refer -> `update_reference_in_payment_entry()` in utils.py
 						continue
 
-					if field == 'exchange_rate' or not d.get(field) or force:
+					if field == "exchange_rate" or not d.get(field) or force:
 						d.db_set(field, value)
 
 	def validate_payment_type(self):
@@ -222,8 +245,9 @@
 				frappe.throw(_("Invalid {0}: {1}").format(self.party_type, self.party))
 
 			if self.party_account and self.party_type in ("Customer", "Supplier"):
-				self.validate_account_type(self.party_account,
-					[erpnext.get_party_account_type(self.party_type)])
+				self.validate_account_type(
+					self.party_account, [erpnext.get_party_account_type(self.party_type)]
+				)
 
 	def validate_bank_accounts(self):
 		if self.payment_type in ("Pay", "Internal Transfer"):
@@ -251,8 +275,9 @@
 						self.source_exchange_rate = ref_doc.get("exchange_rate")
 
 			if not self.source_exchange_rate:
-					self.source_exchange_rate = get_exchange_rate(self.paid_from_account_currency,
-						self.company_currency, self.posting_date)
+				self.source_exchange_rate = get_exchange_rate(
+					self.paid_from_account_currency, self.company_currency, self.posting_date
+				)
 
 	def set_target_exchange_rate(self, ref_doc=None):
 		if self.paid_from_account_currency == self.paid_to_account_currency:
@@ -263,8 +288,9 @@
 					self.target_exchange_rate = ref_doc.get("exchange_rate")
 
 			if not self.target_exchange_rate:
-				self.target_exchange_rate = get_exchange_rate(self.paid_to_account_currency,
-					self.company_currency, self.posting_date)
+				self.target_exchange_rate = get_exchange_rate(
+					self.paid_to_account_currency, self.company_currency, self.posting_date
+				)
 
 	def validate_mandatory(self):
 		for field in ("paid_amount", "received_amount", "source_exchange_rate", "target_exchange_rate"):
@@ -273,7 +299,7 @@
 
 	def validate_reference_documents(self):
 		if self.party_type == "Student":
-			valid_reference_doctypes = ("Fees")
+			valid_reference_doctypes = "Fees"
 		elif self.party_type == "Customer":
 			valid_reference_doctypes = ("Sales Order", "Sales Invoice", "Journal Entry", "Dunning")
 		elif self.party_type == "Supplier":
@@ -281,14 +307,15 @@
 		elif self.party_type == "Employee":
 			valid_reference_doctypes = ("Expense Claim", "Journal Entry", "Employee Advance", "Gratuity")
 		elif self.party_type == "Shareholder":
-			valid_reference_doctypes = ("Journal Entry")
+			valid_reference_doctypes = "Journal Entry"
 
 		for d in self.get("references"):
 			if not d.allocated_amount:
 				continue
 			if d.reference_doctype not in valid_reference_doctypes:
-				frappe.throw(_("Reference Doctype must be one of {0}")
-					.format(comma_or(valid_reference_doctypes)))
+				frappe.throw(
+					_("Reference Doctype must be one of {0}").format(comma_or(valid_reference_doctypes))
+				)
 
 			elif d.reference_name:
 				if not frappe.db.exists(d.reference_doctype, d.reference_name):
@@ -298,28 +325,35 @@
 
 					if d.reference_doctype != "Journal Entry":
 						if self.party != ref_doc.get(scrub(self.party_type)):
-							frappe.throw(_("{0} {1} is not associated with {2} {3}")
-								.format(d.reference_doctype, d.reference_name, self.party_type, self.party))
+							frappe.throw(
+								_("{0} {1} is not associated with {2} {3}").format(
+									d.reference_doctype, d.reference_name, self.party_type, self.party
+								)
+							)
 					else:
 						self.validate_journal_entry()
 
 					if d.reference_doctype in ("Sales Invoice", "Purchase Invoice", "Expense Claim", "Fees"):
 						if self.party_type == "Customer":
-							ref_party_account = get_party_account_based_on_invoice_discounting(d.reference_name) or ref_doc.debit_to
+							ref_party_account = (
+								get_party_account_based_on_invoice_discounting(d.reference_name) or ref_doc.debit_to
+							)
 						elif self.party_type == "Student":
 							ref_party_account = ref_doc.receivable_account
-						elif self.party_type=="Supplier":
+						elif self.party_type == "Supplier":
 							ref_party_account = ref_doc.credit_to
-						elif self.party_type=="Employee":
+						elif self.party_type == "Employee":
 							ref_party_account = ref_doc.payable_account
 
 						if ref_party_account != self.party_account:
-								frappe.throw(_("{0} {1} is associated with {2}, but Party Account is {3}")
-									.format(d.reference_doctype, d.reference_name, ref_party_account, self.party_account))
+							frappe.throw(
+								_("{0} {1} is associated with {2}, but Party Account is {3}").format(
+									d.reference_doctype, d.reference_name, ref_party_account, self.party_account
+								)
+							)
 
 					if ref_doc.docstatus != 1:
-						frappe.throw(_("{0} {1} must be submitted")
-							.format(d.reference_doctype, d.reference_name))
+						frappe.throw(_("{0} {1} must be submitted").format(d.reference_doctype, d.reference_name))
 
 	def validate_paid_invoices(self):
 		no_oustanding_refs = {}
@@ -329,28 +363,45 @@
 				continue
 
 			if d.reference_doctype in ("Sales Invoice", "Purchase Invoice", "Fees"):
-				outstanding_amount, is_return = frappe.get_cached_value(d.reference_doctype, d.reference_name, ["outstanding_amount", "is_return"])
+				outstanding_amount, is_return = frappe.get_cached_value(
+					d.reference_doctype, d.reference_name, ["outstanding_amount", "is_return"]
+				)
 				if outstanding_amount <= 0 and not is_return:
 					no_oustanding_refs.setdefault(d.reference_doctype, []).append(d)
 
 		for k, v in no_oustanding_refs.items():
 			frappe.msgprint(
-				_("{} - {} now have {} as they had no outstanding amount left before submitting the Payment Entry.")
-					.format(_(k), frappe.bold(", ".join(d.reference_name for d in v)), frappe.bold(_("negative outstanding amount")))
-				+ "<br><br>" + _("If this is undesirable please cancel the corresponding Payment Entry."),
-				title=_("Warning"), indicator="orange")
+				_(
+					"{} - {} now have {} as they had no outstanding amount left before submitting the Payment Entry."
+				).format(
+					_(k),
+					frappe.bold(", ".join(d.reference_name for d in v)),
+					frappe.bold(_("negative outstanding amount")),
+				)
+				+ "<br><br>"
+				+ _("If this is undesirable please cancel the corresponding Payment Entry."),
+				title=_("Warning"),
+				indicator="orange",
+			)
 
 	def validate_journal_entry(self):
 		for d in self.get("references"):
 			if d.allocated_amount and d.reference_doctype == "Journal Entry":
-				je_accounts = frappe.db.sql("""select debit, credit from `tabJournal Entry Account`
+				je_accounts = frappe.db.sql(
+					"""select debit, credit from `tabJournal Entry Account`
 					where account = %s and party=%s and docstatus = 1 and parent = %s
 					and (reference_type is null or reference_type in ("", "Sales Order", "Purchase Order"))
-					""", (self.party_account, self.party, d.reference_name), as_dict=True)
+					""",
+					(self.party_account, self.party, d.reference_name),
+					as_dict=True,
+				)
 
 				if not je_accounts:
-					frappe.throw(_("Row #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher")
-						.format(d.idx, d.reference_name, self.party_account))
+					frappe.throw(
+						_(
+							"Row #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher"
+						).format(d.idx, d.reference_name, self.party_account)
+					)
 				else:
 					dr_or_cr = "debit" if self.payment_type == "Receive" else "credit"
 					valid = False
@@ -358,14 +409,17 @@
 						if flt(jvd[dr_or_cr]) > 0:
 							valid = True
 					if not valid:
-						frappe.throw(_("Against Journal Entry {0} does not have any unmatched {1} entry")
-							.format(d.reference_name, dr_or_cr))
+						frappe.throw(
+							_("Against Journal Entry {0} does not have any unmatched {1} entry").format(
+								d.reference_name, dr_or_cr
+							)
+						)
 
 	def update_payment_schedule(self, cancel=0):
 		invoice_payment_amount_map = {}
 		invoice_paid_amount_map = {}
 
-		for ref in self.get('references'):
+		for ref in self.get("references"):
 			if ref.payment_term and ref.reference_name:
 				key = (ref.payment_term, ref.reference_name)
 				invoice_payment_amount_map.setdefault(key, 0.0)
@@ -373,58 +427,68 @@
 
 				if not invoice_paid_amount_map.get(key):
 					payment_schedule = frappe.get_all(
-						'Payment Schedule',
-						filters={'parent': ref.reference_name},
-						fields=['paid_amount', 'payment_amount', 'payment_term', 'discount', 'outstanding']
+						"Payment Schedule",
+						filters={"parent": ref.reference_name},
+						fields=["paid_amount", "payment_amount", "payment_term", "discount", "outstanding"],
 					)
 					for term in payment_schedule:
 						invoice_key = (term.payment_term, ref.reference_name)
 						invoice_paid_amount_map.setdefault(invoice_key, {})
-						invoice_paid_amount_map[invoice_key]['outstanding'] = term.outstanding
-						invoice_paid_amount_map[invoice_key]['discounted_amt'] = ref.total_amount * (term.discount / 100)
+						invoice_paid_amount_map[invoice_key]["outstanding"] = term.outstanding
+						invoice_paid_amount_map[invoice_key]["discounted_amt"] = ref.total_amount * (
+							term.discount / 100
+						)
 
 		for idx, (key, allocated_amount) in enumerate(invoice_payment_amount_map.items(), 1):
 			if not invoice_paid_amount_map.get(key):
-				frappe.throw(_('Payment term {0} not used in {1}').format(key[0], key[1]))
+				frappe.throw(_("Payment term {0} not used in {1}").format(key[0], key[1]))
 
-			outstanding = flt(invoice_paid_amount_map.get(key, {}).get('outstanding'))
-			discounted_amt = flt(invoice_paid_amount_map.get(key, {}).get('discounted_amt'))
+			outstanding = flt(invoice_paid_amount_map.get(key, {}).get("outstanding"))
+			discounted_amt = flt(invoice_paid_amount_map.get(key, {}).get("discounted_amt"))
 
 			if cancel:
-				frappe.db.sql("""
+				frappe.db.sql(
+					"""
 					UPDATE `tabPayment Schedule`
 					SET
 						paid_amount = `paid_amount` - %s,
 						discounted_amount = `discounted_amount` - %s,
 						outstanding = `outstanding` + %s
 					WHERE parent = %s and payment_term = %s""",
-					(allocated_amount - discounted_amt, discounted_amt, allocated_amount, key[1], key[0]))
+					(allocated_amount - discounted_amt, discounted_amt, allocated_amount, key[1], key[0]),
+				)
 			else:
 				if allocated_amount > outstanding:
-					frappe.throw(_('Row #{0}: Cannot allocate more than {1} against payment term {2}').format(idx, outstanding, key[0]))
+					frappe.throw(
+						_("Row #{0}: Cannot allocate more than {1} against payment term {2}").format(
+							idx, outstanding, key[0]
+						)
+					)
 
 				if allocated_amount and outstanding:
-					frappe.db.sql("""
+					frappe.db.sql(
+						"""
 						UPDATE `tabPayment Schedule`
 						SET
 							paid_amount = `paid_amount` + %s,
 							discounted_amount = `discounted_amount` + %s,
 							outstanding = `outstanding` - %s
 						WHERE parent = %s and payment_term = %s""",
-					(allocated_amount - discounted_amt, discounted_amt, allocated_amount, key[1], key[0]))
+						(allocated_amount - discounted_amt, discounted_amt, allocated_amount, key[1], key[0]),
+					)
 
 	def set_status(self):
 		if self.docstatus == 2:
-			self.status = 'Cancelled'
+			self.status = "Cancelled"
 		elif self.docstatus == 1:
-			self.status = 'Submitted'
+			self.status = "Submitted"
 		else:
-			self.status = 'Draft'
+			self.status = "Draft"
 
-		self.db_set('status', self.status, update_modified = True)
+		self.db_set("status", self.status, update_modified=True)
 
 	def set_tax_withholding(self):
-		if not self.party_type == 'Supplier':
+		if not self.party_type == "Supplier":
 			return
 
 		if not self.apply_tax_withholding_amount:
@@ -433,22 +497,24 @@
 		net_total = self.paid_amount
 
 		# Adding args as purchase invoice to get TDS amount
-		args = frappe._dict({
-			'company': self.company,
-			'doctype': 'Payment Entry',
-			'supplier': self.party,
-			'posting_date': self.posting_date,
-			'net_total': net_total
-		})
+		args = frappe._dict(
+			{
+				"company": self.company,
+				"doctype": "Payment Entry",
+				"supplier": self.party,
+				"posting_date": self.posting_date,
+				"net_total": net_total,
+			}
+		)
 
 		tax_withholding_details = get_party_tax_withholding_details(args, self.tax_withholding_category)
 
 		if not tax_withholding_details:
 			return
 
-		tax_withholding_details.update({
-			'cost_center': self.cost_center or erpnext.get_default_cost_center(self.company)
-		})
+		tax_withholding_details.update(
+			{"cost_center": self.cost_center or erpnext.get_default_cost_center(self.company)}
+		)
 
 		accounts = []
 		for d in self.taxes:
@@ -456,7 +522,7 @@
 
 				# Preserve user updated included in paid amount
 				if d.included_in_paid_amount:
-					tax_withholding_details.update({'included_in_paid_amount': d.included_in_paid_amount})
+					tax_withholding_details.update({"included_in_paid_amount": d.included_in_paid_amount})
 
 				d.update(tax_withholding_details)
 			accounts.append(d.account_head)
@@ -464,8 +530,11 @@
 		if not accounts or tax_withholding_details.get("account_head") not in accounts:
 			self.append("taxes", tax_withholding_details)
 
-		to_remove = [d for d in self.taxes
-			if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")]
+		to_remove = [
+			d
+			for d in self.taxes
+			if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")
+		]
 
 		for d in to_remove:
 			self.remove(d)
@@ -492,40 +561,53 @@
 
 	def set_received_amount(self):
 		self.base_received_amount = self.base_paid_amount
-		if self.paid_from_account_currency == self.paid_to_account_currency \
-			and not self.payment_type == 'Internal Transfer':
+		if (
+			self.paid_from_account_currency == self.paid_to_account_currency
+			and not self.payment_type == "Internal Transfer"
+		):
 			self.received_amount = self.paid_amount
 
 	def set_amounts_after_tax(self):
 		applicable_tax = 0
 		base_applicable_tax = 0
-		for tax in self.get('taxes'):
+		for tax in self.get("taxes"):
 			if not tax.included_in_paid_amount:
-				amount = -1 * tax.tax_amount if tax.add_deduct_tax == 'Deduct' else tax.tax_amount
-				base_amount = -1 * tax.base_tax_amount if tax.add_deduct_tax == 'Deduct' else tax.base_tax_amount
+				amount = -1 * tax.tax_amount if tax.add_deduct_tax == "Deduct" else tax.tax_amount
+				base_amount = (
+					-1 * tax.base_tax_amount if tax.add_deduct_tax == "Deduct" else tax.base_tax_amount
+				)
 
 				applicable_tax += amount
 				base_applicable_tax += base_amount
 
-		self.paid_amount_after_tax = flt(flt(self.paid_amount) + flt(applicable_tax),
-			self.precision("paid_amount_after_tax"))
-		self.base_paid_amount_after_tax = flt(flt(self.paid_amount_after_tax) * flt(self.source_exchange_rate),
-			self.precision("base_paid_amount_after_tax"))
+		self.paid_amount_after_tax = flt(
+			flt(self.paid_amount) + flt(applicable_tax), self.precision("paid_amount_after_tax")
+		)
+		self.base_paid_amount_after_tax = flt(
+			flt(self.paid_amount_after_tax) * flt(self.source_exchange_rate),
+			self.precision("base_paid_amount_after_tax"),
+		)
 
-		self.received_amount_after_tax = flt(flt(self.received_amount) + flt(applicable_tax),
-			self.precision("paid_amount_after_tax"))
-		self.base_received_amount_after_tax = flt(flt(self.received_amount_after_tax) * flt(self.target_exchange_rate),
-			self.precision("base_paid_amount_after_tax"))
+		self.received_amount_after_tax = flt(
+			flt(self.received_amount) + flt(applicable_tax), self.precision("paid_amount_after_tax")
+		)
+		self.base_received_amount_after_tax = flt(
+			flt(self.received_amount_after_tax) * flt(self.target_exchange_rate),
+			self.precision("base_paid_amount_after_tax"),
+		)
 
 	def set_amounts_in_company_currency(self):
 		self.base_paid_amount, self.base_received_amount, self.difference_amount = 0, 0, 0
 		if self.paid_amount:
-			self.base_paid_amount = flt(flt(self.paid_amount) * flt(self.source_exchange_rate),
-				self.precision("base_paid_amount"))
+			self.base_paid_amount = flt(
+				flt(self.paid_amount) * flt(self.source_exchange_rate), self.precision("base_paid_amount")
+			)
 
 		if self.received_amount:
-			self.base_received_amount = flt(flt(self.received_amount) * flt(self.target_exchange_rate),
-				self.precision("base_received_amount"))
+			self.base_received_amount = flt(
+				flt(self.received_amount) * flt(self.target_exchange_rate),
+				self.precision("base_received_amount"),
+			)
 
 	def set_total_allocated_amount(self):
 		if self.payment_type == "Internal Transfer":
@@ -535,8 +617,9 @@
 		for d in self.get("references"):
 			if d.allocated_amount:
 				total_allocated_amount += flt(d.allocated_amount)
-				base_total_allocated_amount += flt(flt(d.allocated_amount) * flt(d.exchange_rate),
-					self.precision("base_paid_amount"))
+				base_total_allocated_amount += flt(
+					flt(d.allocated_amount) * flt(d.exchange_rate), self.precision("base_paid_amount")
+				)
 
 		self.total_allocated_amount = abs(total_allocated_amount)
 		self.base_total_allocated_amount = abs(base_total_allocated_amount)
@@ -546,22 +629,33 @@
 		if self.party:
 			total_deductions = sum(flt(d.amount) for d in self.get("deductions"))
 			included_taxes = self.get_included_taxes()
-			if self.payment_type == "Receive" \
-				and self.base_total_allocated_amount < self.base_received_amount + total_deductions \
-				and self.total_allocated_amount < self.paid_amount + (total_deductions / self.source_exchange_rate):
-				self.unallocated_amount = (self.base_received_amount + total_deductions -
-					self.base_total_allocated_amount) / self.source_exchange_rate
+			if (
+				self.payment_type == "Receive"
+				and self.base_total_allocated_amount < self.base_received_amount + total_deductions
+				and self.total_allocated_amount
+				< self.paid_amount + (total_deductions / self.source_exchange_rate)
+			):
+				self.unallocated_amount = (
+					self.base_received_amount + total_deductions - self.base_total_allocated_amount
+				) / self.source_exchange_rate
 				self.unallocated_amount -= included_taxes
-			elif self.payment_type == "Pay" \
-				and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \
-				and self.total_allocated_amount < self.received_amount + (total_deductions / self.target_exchange_rate):
-				self.unallocated_amount = (self.base_paid_amount - (total_deductions +
-					self.base_total_allocated_amount)) / self.target_exchange_rate
+			elif (
+				self.payment_type == "Pay"
+				and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions)
+				and self.total_allocated_amount
+				< self.received_amount + (total_deductions / self.target_exchange_rate)
+			):
+				self.unallocated_amount = (
+					self.base_paid_amount - (total_deductions + self.base_total_allocated_amount)
+				) / self.target_exchange_rate
 				self.unallocated_amount -= included_taxes
 
 	def set_difference_amount(self):
-		base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate)
-			if self.payment_type == "Receive" else flt(self.target_exchange_rate))
+		base_unallocated_amount = flt(self.unallocated_amount) * (
+			flt(self.source_exchange_rate)
+			if self.payment_type == "Receive"
+			else flt(self.target_exchange_rate)
+		)
 
 		base_party_amount = flt(self.base_total_allocated_amount) + flt(base_unallocated_amount)
 
@@ -575,14 +669,15 @@
 		total_deductions = sum(flt(d.amount) for d in self.get("deductions"))
 		included_taxes = self.get_included_taxes()
 
-		self.difference_amount = flt(self.difference_amount - total_deductions - included_taxes,
-			self.precision("difference_amount"))
+		self.difference_amount = flt(
+			self.difference_amount - total_deductions - included_taxes, self.precision("difference_amount")
+		)
 
 	def get_included_taxes(self):
 		included_taxes = 0
-		for tax in self.get('taxes'):
+		for tax in self.get("taxes"):
 			if tax.included_in_paid_amount:
-				if tax.add_deduct_tax == 'Add':
+				if tax.add_deduct_tax == "Add":
 					included_taxes += tax.base_tax_amount
 				else:
 					included_taxes -= tax.base_tax_amount
@@ -593,27 +688,41 @@
 	# Clear the reference document which doesn't have allocated amount on validate so that form can be loaded fast
 	def clear_unallocated_reference_document_rows(self):
 		self.set("references", self.get("references", {"allocated_amount": ["not in", [0, None, ""]]}))
-		frappe.db.sql("""delete from `tabPayment Entry Reference`
-			where parent = %s and allocated_amount = 0""", self.name)
+		frappe.db.sql(
+			"""delete from `tabPayment Entry Reference`
+			where parent = %s and allocated_amount = 0""",
+			self.name,
+		)
 
 	def validate_payment_against_negative_invoice(self):
-		if ((self.payment_type=="Pay" and self.party_type=="Customer")
-				or (self.payment_type=="Receive" and self.party_type=="Supplier")):
+		if (self.payment_type == "Pay" and self.party_type == "Customer") or (
+			self.payment_type == "Receive" and self.party_type == "Supplier"
+		):
 
-			total_negative_outstanding = sum(abs(flt(d.outstanding_amount))
-				for d in self.get("references") if flt(d.outstanding_amount) < 0)
+			total_negative_outstanding = sum(
+				abs(flt(d.outstanding_amount)) for d in self.get("references") if flt(d.outstanding_amount) < 0
+			)
 
-			paid_amount = self.paid_amount if self.payment_type=="Receive" else self.received_amount
+			paid_amount = self.paid_amount if self.payment_type == "Receive" else self.received_amount
 			additional_charges = sum([flt(d.amount) for d in self.deductions])
 
 			if not total_negative_outstanding:
-				frappe.throw(_("Cannot {0} {1} {2} without any negative outstanding invoice")
-					.format(_(self.payment_type), (_("to") if self.party_type=="Customer" else _("from")),
-						self.party_type), InvalidPaymentEntry)
+				frappe.throw(
+					_("Cannot {0} {1} {2} without any negative outstanding invoice").format(
+						_(self.payment_type),
+						(_("to") if self.party_type == "Customer" else _("from")),
+						self.party_type,
+					),
+					InvalidPaymentEntry,
+				)
 
 			elif paid_amount - additional_charges > total_negative_outstanding:
-				frappe.throw(_("Paid Amount cannot be greater than total negative outstanding amount {0}")
-					.format(total_negative_outstanding), InvalidPaymentEntry)
+				frappe.throw(
+					_("Paid Amount cannot be greater than total negative outstanding amount {0}").format(
+						total_negative_outstanding
+					),
+					InvalidPaymentEntry,
+				)
 
 	def set_title(self):
 		if frappe.flags.in_import and self.title:
@@ -634,33 +743,45 @@
 				frappe.throw(_("Reference No and Reference Date is mandatory for Bank transaction"))
 
 	def set_remarks(self):
-		if self.custom_remarks: return
+		if self.custom_remarks:
+			return
 
-		if self.payment_type=="Internal Transfer":
-			remarks = [_("Amount {0} {1} transferred from {2} to {3}")
-				.format(self.paid_from_account_currency, self.paid_amount, self.paid_from, self.paid_to)]
+		if self.payment_type == "Internal Transfer":
+			remarks = [
+				_("Amount {0} {1} transferred from {2} to {3}").format(
+					self.paid_from_account_currency, self.paid_amount, self.paid_from, self.paid_to
+				)
+			]
 		else:
 
-			remarks = [_("Amount {0} {1} {2} {3}").format(
-				self.party_account_currency,
-				self.paid_amount if self.payment_type=="Receive" else self.received_amount,
-				_("received from") if self.payment_type=="Receive" else _("to"), self.party
-			)]
+			remarks = [
+				_("Amount {0} {1} {2} {3}").format(
+					self.party_account_currency,
+					self.paid_amount if self.payment_type == "Receive" else self.received_amount,
+					_("received from") if self.payment_type == "Receive" else _("to"),
+					self.party,
+				)
+			]
 
 		if self.reference_no:
-			remarks.append(_("Transaction reference no {0} dated {1}")
-				.format(self.reference_no, self.reference_date))
+			remarks.append(
+				_("Transaction reference no {0} dated {1}").format(self.reference_no, self.reference_date)
+			)
 
 		if self.payment_type in ["Receive", "Pay"]:
 			for d in self.get("references"):
 				if d.allocated_amount:
-					remarks.append(_("Amount {0} {1} against {2} {3}").format(self.party_account_currency,
-						d.allocated_amount, d.reference_doctype, d.reference_name))
+					remarks.append(
+						_("Amount {0} {1} against {2} {3}").format(
+							self.party_account_currency, d.allocated_amount, d.reference_doctype, d.reference_name
+						)
+					)
 
 		for d in self.get("deductions"):
 			if d.amount:
-				remarks.append(_("Amount {0} {1} deducted against {2}")
-					.format(self.company_currency, d.amount, d.account))
+				remarks.append(
+					_("Amount {0} {1} deducted against {2}").format(self.company_currency, d.amount, d.account)
+				)
 
 		self.set("remarks", "\n".join(remarks))
 
@@ -679,92 +800,110 @@
 
 	def add_party_gl_entries(self, gl_entries):
 		if self.party_account:
-			if self.payment_type=="Receive":
+			if self.payment_type == "Receive":
 				against_account = self.paid_to
 			else:
 				against_account = self.paid_from
 
-			party_gl_dict = self.get_gl_dict({
-				"account": self.party_account,
-				"party_type": self.party_type,
-				"party": self.party,
-				"against": against_account,
-				"account_currency": self.party_account_currency,
-				"cost_center": self.cost_center
-			}, item=self)
+			party_gl_dict = self.get_gl_dict(
+				{
+					"account": self.party_account,
+					"party_type": self.party_type,
+					"party": self.party,
+					"against": against_account,
+					"account_currency": self.party_account_currency,
+					"cost_center": self.cost_center,
+				},
+				item=self,
+			)
 
-			dr_or_cr = "credit" if erpnext.get_party_account_type(self.party_type) == 'Receivable' else "debit"
+			dr_or_cr = (
+				"credit" if erpnext.get_party_account_type(self.party_type) == "Receivable" else "debit"
+			)
 
 			for d in self.get("references"):
 				cost_center = self.cost_center
 				if d.reference_doctype == "Sales Invoice" and not cost_center:
 					cost_center = frappe.db.get_value(d.reference_doctype, d.reference_name, "cost_center")
 				gle = party_gl_dict.copy()
-				gle.update({
-					"against_voucher_type": d.reference_doctype,
-					"against_voucher": d.reference_name,
-					"cost_center": cost_center
-				})
+				gle.update(
+					{
+						"against_voucher_type": d.reference_doctype,
+						"against_voucher": d.reference_name,
+						"cost_center": cost_center,
+					}
+				)
 
-				allocated_amount_in_company_currency = flt(flt(d.allocated_amount) * flt(d.exchange_rate),
-					self.precision("paid_amount"))
+				allocated_amount_in_company_currency = flt(
+					flt(d.allocated_amount) * flt(d.exchange_rate), self.precision("paid_amount")
+				)
 
-				gle.update({
-					dr_or_cr + "_in_account_currency": d.allocated_amount,
-					dr_or_cr: allocated_amount_in_company_currency
-				})
+				gle.update(
+					{
+						dr_or_cr + "_in_account_currency": d.allocated_amount,
+						dr_or_cr: allocated_amount_in_company_currency,
+					}
+				)
 
 				gl_entries.append(gle)
 
 			if self.unallocated_amount:
 				exchange_rate = self.get_exchange_rate()
-				base_unallocated_amount = (self.unallocated_amount * exchange_rate)
+				base_unallocated_amount = self.unallocated_amount * exchange_rate
 
 				gle = party_gl_dict.copy()
 
-				gle.update({
-					dr_or_cr + "_in_account_currency": self.unallocated_amount,
-					dr_or_cr: base_unallocated_amount
-				})
+				gle.update(
+					{
+						dr_or_cr + "_in_account_currency": self.unallocated_amount,
+						dr_or_cr: base_unallocated_amount,
+					}
+				)
 
 				gl_entries.append(gle)
 
 	def add_bank_gl_entries(self, gl_entries):
 		if self.payment_type in ("Pay", "Internal Transfer"):
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.paid_from,
-					"account_currency": self.paid_from_account_currency,
-					"against": self.party if self.payment_type=="Pay" else self.paid_to,
-					"credit_in_account_currency": self.paid_amount,
-					"credit": self.base_paid_amount,
-					"cost_center": self.cost_center,
-					"post_net_value": True
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.paid_from,
+						"account_currency": self.paid_from_account_currency,
+						"against": self.party if self.payment_type == "Pay" else self.paid_to,
+						"credit_in_account_currency": self.paid_amount,
+						"credit": self.base_paid_amount,
+						"cost_center": self.cost_center,
+						"post_net_value": True,
+					},
+					item=self,
+				)
 			)
 		if self.payment_type in ("Receive", "Internal Transfer"):
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.paid_to,
-					"account_currency": self.paid_to_account_currency,
-					"against": self.party if self.payment_type=="Receive" else self.paid_from,
-					"debit_in_account_currency": self.received_amount,
-					"debit": self.base_received_amount,
-					"cost_center": self.cost_center
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.paid_to,
+						"account_currency": self.paid_to_account_currency,
+						"against": self.party if self.payment_type == "Receive" else self.paid_from,
+						"debit_in_account_currency": self.received_amount,
+						"debit": self.base_received_amount,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
 			)
 
 	def add_tax_gl_entries(self, gl_entries):
-		for d in self.get('taxes'):
+		for d in self.get("taxes"):
 			account_currency = get_account_currency(d.account_head)
 			if account_currency != self.company_currency:
 				frappe.throw(_("Currency for {0} must be {1}").format(d.account_head, self.company_currency))
 
-			if self.payment_type in ('Pay', 'Internal Transfer'):
+			if self.payment_type in ("Pay", "Internal Transfer"):
 				dr_or_cr = "debit" if d.add_deduct_tax == "Add" else "credit"
 				rev_dr_or_cr = "credit" if dr_or_cr == "debit" else "debit"
 				against = self.party or self.paid_from
-			elif self.payment_type == 'Receive':
+			elif self.payment_type == "Receive":
 				dr_or_cr = "credit" if d.add_deduct_tax == "Add" else "debit"
 				rev_dr_or_cr = "credit" if dr_or_cr == "debit" else "debit"
 				against = self.party or self.paid_to
@@ -774,29 +913,39 @@
 			base_tax_amount = d.base_tax_amount
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": d.account_head,
-					"against": against,
-					dr_or_cr: tax_amount,
-					dr_or_cr + "_in_account_currency": base_tax_amount
-					if account_currency==self.company_currency
-					else d.tax_amount,
-					"cost_center": d.cost_center,
-					"post_net_value": True,
-				}, account_currency, item=d))
+				self.get_gl_dict(
+					{
+						"account": d.account_head,
+						"against": against,
+						dr_or_cr: tax_amount,
+						dr_or_cr + "_in_account_currency": base_tax_amount
+						if account_currency == self.company_currency
+						else d.tax_amount,
+						"cost_center": d.cost_center,
+						"post_net_value": True,
+					},
+					account_currency,
+					item=d,
+				)
+			)
 
 			if not d.included_in_paid_amount:
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": payment_account,
-						"against": against,
-						rev_dr_or_cr: tax_amount,
-						rev_dr_or_cr + "_in_account_currency": base_tax_amount
-						if account_currency==self.company_currency
-						else d.tax_amount,
-						"cost_center": self.cost_center,
-						"post_net_value": True,
-					}, account_currency, item=d))
+					self.get_gl_dict(
+						{
+							"account": payment_account,
+							"against": against,
+							rev_dr_or_cr: tax_amount,
+							rev_dr_or_cr + "_in_account_currency": base_tax_amount
+							if account_currency == self.company_currency
+							else d.tax_amount,
+							"cost_center": self.cost_center,
+							"post_net_value": True,
+						},
+						account_currency,
+						item=d,
+					)
+				)
 
 	def add_deductions_gl_entries(self, gl_entries):
 		for d in self.get("deductions"):
@@ -806,33 +955,40 @@
 					frappe.throw(_("Currency for {0} must be {1}").format(d.account, self.company_currency))
 
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": d.account,
-						"account_currency": account_currency,
-						"against": self.party or self.paid_from,
-						"debit_in_account_currency": d.amount,
-						"debit": d.amount,
-						"cost_center": d.cost_center
-					}, item=d)
+					self.get_gl_dict(
+						{
+							"account": d.account,
+							"account_currency": account_currency,
+							"against": self.party or self.paid_from,
+							"debit_in_account_currency": d.amount,
+							"debit": d.amount,
+							"cost_center": d.cost_center,
+						},
+						item=d,
+					)
 				)
 
 	def get_party_account_for_taxes(self):
-		if self.payment_type == 'Receive':
+		if self.payment_type == "Receive":
 			return self.paid_to
-		elif self.payment_type in ('Pay', 'Internal Transfer'):
+		elif self.payment_type in ("Pay", "Internal Transfer"):
 			return self.paid_from
 
 	def update_advance_paid(self):
 		if self.payment_type in ("Receive", "Pay") and self.party:
 			for d in self.get("references"):
-				if d.allocated_amount \
-					and d.reference_doctype in ("Sales Order", "Purchase Order", "Employee Advance", "Gratuity"):
-						frappe.get_doc(d.reference_doctype, d.reference_name).set_total_advance_paid()
+				if d.allocated_amount and d.reference_doctype in (
+					"Sales Order",
+					"Purchase Order",
+					"Employee Advance",
+					"Gratuity",
+				):
+					frappe.get_doc(d.reference_doctype, d.reference_name).set_total_advance_paid()
 
 	def update_expense_claim(self):
 		if self.payment_type in ("Pay") and self.party:
 			for d in self.get("references"):
-				if d.reference_doctype=="Expense Claim" and d.reference_name:
+				if d.reference_doctype == "Expense Claim" and d.reference_name:
 					doc = frappe.get_doc("Expense Claim", d.reference_name)
 					if self.docstatus == 2:
 						update_reimbursed_amount(doc, -1 * d.allocated_amount)
@@ -845,31 +1001,29 @@
 
 	def calculate_deductions(self, tax_details):
 		return {
-			"account": tax_details['tax']['account_head'],
-			"cost_center": frappe.get_cached_value('Company',  self.company,  "cost_center"),
-			"amount": self.total_allocated_amount * (tax_details['tax']['rate'] / 100)
+			"account": tax_details["tax"]["account_head"],
+			"cost_center": frappe.get_cached_value("Company", self.company, "cost_center"),
+			"amount": self.total_allocated_amount * (tax_details["tax"]["rate"] / 100),
 		}
 
 	def set_gain_or_loss(self, account_details=None):
 		if not self.difference_amount:
 			self.set_difference_amount()
 
-		row = {
-			'amount': self.difference_amount
-		}
+		row = {"amount": self.difference_amount}
 
 		if account_details:
 			row.update(account_details)
 
-		if not row.get('amount'):
+		if not row.get("amount"):
 			# if no difference amount
 			return
 
-		self.append('deductions', row)
+		self.append("deductions", row)
 		self.set_unallocated_amount()
 
 	def get_exchange_rate(self):
-		return self.source_exchange_rate if self.payment_type=="Receive" else self.target_exchange_rate
+		return self.source_exchange_rate if self.payment_type == "Receive" else self.target_exchange_rate
 
 	def initialize_taxes(self):
 		for tax in self.get("taxes"):
@@ -893,25 +1047,31 @@
 		cumulated_tax_fraction = 0
 		for i, tax in enumerate(self.get("taxes")):
 			tax.tax_fraction_for_current_item = self.get_current_tax_fraction(tax)
-			if i==0:
+			if i == 0:
 				tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item
 			else:
-				tax.grand_total_fraction_for_current_item = \
-					self.get("taxes")[i-1].grand_total_fraction_for_current_item \
+				tax.grand_total_fraction_for_current_item = (
+					self.get("taxes")[i - 1].grand_total_fraction_for_current_item
 					+ tax.tax_fraction_for_current_item
+				)
 
 			cumulated_tax_fraction += tax.tax_fraction_for_current_item
 
-		self.paid_amount_after_tax = flt(self.paid_amount/(1+cumulated_tax_fraction))
+		self.paid_amount_after_tax = flt(self.paid_amount / (1 + cumulated_tax_fraction))
 
 	def calculate_taxes(self):
 		self.total_taxes_and_charges = 0.0
 		self.base_total_taxes_and_charges = 0.0
 
-		actual_tax_dict = dict([[tax.idx, flt(tax.tax_amount, tax.precision("tax_amount"))]
-			for tax in self.get("taxes") if tax.charge_type == "Actual"])
+		actual_tax_dict = dict(
+			[
+				[tax.idx, flt(tax.tax_amount, tax.precision("tax_amount"))]
+				for tax in self.get("taxes")
+				if tax.charge_type == "Actual"
+			]
+		)
 
-		for i, tax in enumerate(self.get('taxes')):
+		for i, tax in enumerate(self.get("taxes")):
 			current_tax_amount = self.get_current_tax_amount(tax)
 
 			if tax.charge_type == "Actual":
@@ -930,19 +1090,21 @@
 			if i == 0:
 				tax.total = flt(self.paid_amount_after_tax + current_tax_amount, self.precision("total", tax))
 			else:
-				tax.total = flt(self.get('taxes')[i-1].total + current_tax_amount, self.precision("total", tax))
+				tax.total = flt(
+					self.get("taxes")[i - 1].total + current_tax_amount, self.precision("total", tax)
+				)
 
 			tax.base_total = tax.total * self.source_exchange_rate
 
-			if self.payment_type == 'Pay':
+			if self.payment_type == "Pay":
 				self.base_total_taxes_and_charges += flt(current_tax_amount / self.source_exchange_rate)
 				self.total_taxes_and_charges += flt(current_tax_amount / self.target_exchange_rate)
 			else:
 				self.base_total_taxes_and_charges += flt(current_tax_amount / self.target_exchange_rate)
 				self.total_taxes_and_charges += flt(current_tax_amount / self.source_exchange_rate)
 
-		if self.get('taxes'):
-			self.paid_amount_after_tax = self.get('taxes')[-1].base_total
+		if self.get("taxes"):
+			self.paid_amount_after_tax = self.get("taxes")[-1].base_total
 
 	def get_current_tax_amount(self, tax):
 		tax_rate = tax.rate
@@ -950,7 +1112,11 @@
 		# To set row_id by default as previous row.
 		if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"]:
 			if tax.idx == 1:
-				frappe.throw(_("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"))
+				frappe.throw(
+					_(
+						"Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"
+					)
+				)
 
 			if not tax.row_id:
 				tax.row_id = tax.idx - 1
@@ -960,12 +1126,10 @@
 		elif tax.charge_type == "On Paid Amount":
 			current_tax_amount = (tax_rate / 100.0) * self.paid_amount_after_tax
 		elif tax.charge_type == "On Previous Row Amount":
-			current_tax_amount = (tax_rate / 100.0) * \
-				self.get('taxes')[cint(tax.row_id) - 1].tax_amount
+			current_tax_amount = (tax_rate / 100.0) * self.get("taxes")[cint(tax.row_id) - 1].tax_amount
 
 		elif tax.charge_type == "On Previous Row Total":
-			current_tax_amount = (tax_rate / 100.0) * \
-				self.get('taxes')[cint(tax.row_id) - 1].total
+			current_tax_amount = (tax_rate / 100.0) * self.get("taxes")[cint(tax.row_id) - 1].total
 
 		return current_tax_amount
 
@@ -978,83 +1142,106 @@
 			if tax.charge_type == "On Paid Amount":
 				current_tax_fraction = tax_rate / 100.0
 			elif tax.charge_type == "On Previous Row Amount":
-				current_tax_fraction = (tax_rate / 100.0) * \
-					self.get("taxes")[cint(tax.row_id) - 1].tax_fraction_for_current_item
+				current_tax_fraction = (tax_rate / 100.0) * self.get("taxes")[
+					cint(tax.row_id) - 1
+				].tax_fraction_for_current_item
 			elif tax.charge_type == "On Previous Row Total":
-				current_tax_fraction = (tax_rate / 100.0) * \
-					self.get("taxes")[cint(tax.row_id) - 1].grand_total_fraction_for_current_item
+				current_tax_fraction = (tax_rate / 100.0) * self.get("taxes")[
+					cint(tax.row_id) - 1
+				].grand_total_fraction_for_current_item
 
 		if getattr(tax, "add_deduct_tax", None) and tax.add_deduct_tax == "Deduct":
 			current_tax_fraction *= -1.0
 
 		return current_tax_fraction
 
+
 def validate_inclusive_tax(tax, doc):
 	def _on_previous_row_error(row_range):
-		throw(_("To include tax in row {0} in Item rate, taxes in rows {1} must also be included").format(tax.idx, row_range))
+		throw(
+			_("To include tax in row {0} in Item rate, taxes in rows {1} must also be included").format(
+				tax.idx, row_range
+			)
+		)
 
 	if cint(getattr(tax, "included_in_paid_amount", None)):
 		if tax.charge_type == "Actual":
 			# inclusive tax cannot be of type Actual
-			throw(_("Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount").format(tax.idx))
-		elif tax.charge_type == "On Previous Row Amount" and \
-				not cint(doc.get("taxes")[cint(tax.row_id) - 1].included_in_paid_amount):
+			throw(
+				_("Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount").format(
+					tax.idx
+				)
+			)
+		elif tax.charge_type == "On Previous Row Amount" and not cint(
+			doc.get("taxes")[cint(tax.row_id) - 1].included_in_paid_amount
+		):
 			# referred row should also be inclusive
 			_on_previous_row_error(tax.row_id)
-		elif tax.charge_type == "On Previous Row Total" and \
-				not all([cint(t.included_in_paid_amount for t in doc.get("taxes")[:cint(tax.row_id) - 1])]):
+		elif tax.charge_type == "On Previous Row Total" and not all(
+			[cint(t.included_in_paid_amount for t in doc.get("taxes")[: cint(tax.row_id) - 1])]
+		):
 			# all rows about the referred tax should be inclusive
 			_on_previous_row_error("1 - %d" % (cint(tax.row_id),))
 		elif tax.get("category") == "Valuation":
 			frappe.throw(_("Valuation type charges can not be marked as Inclusive"))
 
+
 @frappe.whitelist()
 def get_outstanding_reference_documents(args):
 
 	if isinstance(args, str):
 		args = json.loads(args)
 
-	if args.get('party_type') == 'Member':
+	if args.get("party_type") == "Member":
 		return
 
 	# confirm that Supplier is not blocked
-	if args.get('party_type') == 'Supplier':
-		supplier_status = get_supplier_block_status(args['party'])
-		if supplier_status['on_hold']:
-			if supplier_status['hold_type'] == 'All':
+	if args.get("party_type") == "Supplier":
+		supplier_status = get_supplier_block_status(args["party"])
+		if supplier_status["on_hold"]:
+			if supplier_status["hold_type"] == "All":
 				return []
-			elif supplier_status['hold_type'] == 'Payments':
-				if not supplier_status['release_date'] or getdate(nowdate()) <= supplier_status['release_date']:
+			elif supplier_status["hold_type"] == "Payments":
+				if (
+					not supplier_status["release_date"] or getdate(nowdate()) <= supplier_status["release_date"]
+				):
 					return []
 
 	party_account_currency = get_account_currency(args.get("party_account"))
-	company_currency = frappe.get_cached_value('Company',  args.get("company"),  "default_currency")
+	company_currency = frappe.get_cached_value("Company", args.get("company"), "default_currency")
 
 	# Get positive outstanding sales /purchase invoices/ Fees
 	condition = ""
 	if args.get("voucher_type") and args.get("voucher_no"):
-		condition = " and voucher_type={0} and voucher_no={1}"\
-			.format(frappe.db.escape(args["voucher_type"]), frappe.db.escape(args["voucher_no"]))
+		condition = " and voucher_type={0} and voucher_no={1}".format(
+			frappe.db.escape(args["voucher_type"]), frappe.db.escape(args["voucher_no"])
+		)
 
 	# Add cost center condition
 	if args.get("cost_center"):
 		condition += " and cost_center='%s'" % args.get("cost_center")
 
 	date_fields_dict = {
-		'posting_date': ['from_posting_date', 'to_posting_date'],
-		'due_date': ['from_due_date', 'to_due_date']
+		"posting_date": ["from_posting_date", "to_posting_date"],
+		"due_date": ["from_due_date", "to_due_date"],
 	}
 
 	for fieldname, date_fields in date_fields_dict.items():
 		if args.get(date_fields[0]) and args.get(date_fields[1]):
-			condition += " and {0} between '{1}' and '{2}'".format(fieldname,
-				args.get(date_fields[0]), args.get(date_fields[1]))
+			condition += " and {0} between '{1}' and '{2}'".format(
+				fieldname, args.get(date_fields[0]), args.get(date_fields[1])
+			)
 
 	if args.get("company"):
 		condition += " and company = {0}".format(frappe.db.escape(args.get("company")))
 
-	outstanding_invoices = get_outstanding_invoices(args.get("party_type"), args.get("party"),
-		args.get("party_account"), filters=args, condition=condition)
+	outstanding_invoices = get_outstanding_invoices(
+		args.get("party_type"),
+		args.get("party"),
+		args.get("party_account"),
+		filters=args,
+		condition=condition,
+	)
 
 	outstanding_invoices = split_invoices_based_on_payment_terms(outstanding_invoices)
 
@@ -1065,28 +1252,44 @@
 				d["exchange_rate"] = frappe.db.get_value(d.voucher_type, d.voucher_no, "conversion_rate")
 			elif d.voucher_type == "Journal Entry":
 				d["exchange_rate"] = get_exchange_rate(
-					party_account_currency,	company_currency, d.posting_date
+					party_account_currency, company_currency, d.posting_date
 				)
 		if d.voucher_type in ("Purchase Invoice"):
 			d["bill_no"] = frappe.db.get_value(d.voucher_type, d.voucher_no, "bill_no")
 
 	# Get all SO / PO which are not fully billed or against which full advance not paid
 	orders_to_be_billed = []
-	if (args.get("party_type") != "Student"):
-		orders_to_be_billed =  get_orders_to_be_billed(args.get("posting_date"),args.get("party_type"),
-			args.get("party"), args.get("company"), party_account_currency, company_currency, filters=args)
+	if args.get("party_type") != "Student":
+		orders_to_be_billed = get_orders_to_be_billed(
+			args.get("posting_date"),
+			args.get("party_type"),
+			args.get("party"),
+			args.get("company"),
+			party_account_currency,
+			company_currency,
+			filters=args,
+		)
 
 	# Get negative outstanding sales /purchase invoices
 	negative_outstanding_invoices = []
 	if args.get("party_type") not in ["Student", "Employee"] and not args.get("voucher_no"):
-		negative_outstanding_invoices = get_negative_outstanding_invoices(args.get("party_type"), args.get("party"),
-			args.get("party_account"), party_account_currency, company_currency, condition=condition)
+		negative_outstanding_invoices = get_negative_outstanding_invoices(
+			args.get("party_type"),
+			args.get("party"),
+			args.get("party_account"),
+			party_account_currency,
+			company_currency,
+			condition=condition,
+		)
 
 	data = negative_outstanding_invoices + outstanding_invoices + orders_to_be_billed
 
 	if not data:
-		frappe.msgprint(_("No outstanding invoices found for the {0} {1} which qualify the filters you have specified.")
-			.format(_(args.get("party_type")).lower(), frappe.bold(args.get("party"))))
+		frappe.msgprint(
+			_(
+				"No outstanding invoices found for the {0} {1} which qualify the filters you have specified."
+			).format(_(args.get("party_type")).lower(), frappe.bold(args.get("party")))
+		)
 
 	return data
 
@@ -1094,53 +1297,75 @@
 def split_invoices_based_on_payment_terms(outstanding_invoices):
 	invoice_ref_based_on_payment_terms = {}
 	for idx, d in enumerate(outstanding_invoices):
-		if d.voucher_type in ['Sales Invoice', 'Purchase Invoice']:
-			payment_term_template = frappe.db.get_value(d.voucher_type, d.voucher_no, 'payment_terms_template')
+		if d.voucher_type in ["Sales Invoice", "Purchase Invoice"]:
+			payment_term_template = frappe.db.get_value(
+				d.voucher_type, d.voucher_no, "payment_terms_template"
+			)
 			if payment_term_template:
 				allocate_payment_based_on_payment_terms = frappe.db.get_value(
-					'Payment Terms Template', payment_term_template, 'allocate_payment_based_on_payment_terms')
+					"Payment Terms Template", payment_term_template, "allocate_payment_based_on_payment_terms"
+				)
 				if allocate_payment_based_on_payment_terms:
-					payment_schedule = frappe.get_all('Payment Schedule', filters={'parent': d.voucher_no}, fields=["*"])
+					payment_schedule = frappe.get_all(
+						"Payment Schedule", filters={"parent": d.voucher_no}, fields=["*"]
+					)
 
 					for payment_term in payment_schedule:
 						if payment_term.outstanding > 0.1:
 							invoice_ref_based_on_payment_terms.setdefault(idx, [])
-							invoice_ref_based_on_payment_terms[idx].append(frappe._dict({
-								'due_date': d.due_date,
-								'currency': d.currency,
-								'voucher_no': d.voucher_no,
-								'voucher_type': d.voucher_type,
-								'posting_date': d.posting_date,
-								'invoice_amount': flt(d.invoice_amount),
-								'outstanding_amount': flt(d.outstanding_amount),
-								'payment_amount': payment_term.payment_amount,
-								'payment_term': payment_term.payment_term
-							}))
+							invoice_ref_based_on_payment_terms[idx].append(
+								frappe._dict(
+									{
+										"due_date": d.due_date,
+										"currency": d.currency,
+										"voucher_no": d.voucher_no,
+										"voucher_type": d.voucher_type,
+										"posting_date": d.posting_date,
+										"invoice_amount": flt(d.invoice_amount),
+										"outstanding_amount": flt(d.outstanding_amount),
+										"payment_amount": payment_term.payment_amount,
+										"payment_term": payment_term.payment_term,
+									}
+								)
+							)
 
 	outstanding_invoices_after_split = []
 	if invoice_ref_based_on_payment_terms:
 		for idx, ref in invoice_ref_based_on_payment_terms.items():
-			voucher_no = ref[0]['voucher_no']
-			voucher_type = ref[0]['voucher_type']
+			voucher_no = ref[0]["voucher_no"]
+			voucher_type = ref[0]["voucher_type"]
 
-			frappe.msgprint(_("Spliting {} {} into {} row(s) as per Payment Terms").format(
-				voucher_type, voucher_no, len(ref)), alert=True)
+			frappe.msgprint(
+				_("Spliting {} {} into {} row(s) as per Payment Terms").format(
+					voucher_type, voucher_no, len(ref)
+				),
+				alert=True,
+			)
 
 			outstanding_invoices_after_split += invoice_ref_based_on_payment_terms[idx]
 
-			existing_row = list(filter(lambda x: x.get('voucher_no') == voucher_no, outstanding_invoices))
+			existing_row = list(filter(lambda x: x.get("voucher_no") == voucher_no, outstanding_invoices))
 			index = outstanding_invoices.index(existing_row[0])
 			outstanding_invoices.pop(index)
 
 	outstanding_invoices_after_split += outstanding_invoices
 	return outstanding_invoices_after_split
 
-def get_orders_to_be_billed(posting_date, party_type, party,
-	company, party_account_currency, company_currency, cost_center=None, filters=None):
+
+def get_orders_to_be_billed(
+	posting_date,
+	party_type,
+	party,
+	company,
+	party_account_currency,
+	company_currency,
+	cost_center=None,
+	filters=None,
+):
 	if party_type == "Customer":
-		voucher_type = 'Sales Order'
+		voucher_type = "Sales Order"
 	elif party_type == "Supplier":
-		voucher_type = 'Purchase Order'
+		voucher_type = "Purchase Order"
 	elif party_type == "Employee":
 		voucher_type = None
 
@@ -1148,7 +1373,7 @@
 	if voucher_type:
 		doc = frappe.get_doc({"doctype": voucher_type})
 		condition = ""
-		if doc and hasattr(doc, 'cost_center'):
+		if doc and hasattr(doc, "cost_center"):
 			condition = " and cost_center='%s'" % cost_center
 
 	orders = []
@@ -1160,7 +1385,8 @@
 			grand_total_field = "grand_total"
 			rounded_total_field = "rounded_total"
 
-		orders = frappe.db.sql("""
+		orders = frappe.db.sql(
+			"""
 			select
 				name as voucher_no,
 				if({rounded_total_field}, {rounded_total_field}, {grand_total_field}) as invoice_amount,
@@ -1178,18 +1404,25 @@
 				{condition}
 			order by
 				transaction_date, name
-		""".format(**{
-			"rounded_total_field": rounded_total_field,
-			"grand_total_field": grand_total_field,
-			"voucher_type": voucher_type,
-			"party_type": scrub(party_type),
-			"condition": condition
-		}), (party, company), as_dict=True)
+		""".format(
+				**{
+					"rounded_total_field": rounded_total_field,
+					"grand_total_field": grand_total_field,
+					"voucher_type": voucher_type,
+					"party_type": scrub(party_type),
+					"condition": condition,
+				}
+			),
+			(party, company),
+			as_dict=True,
+		)
 
 	order_list = []
 	for d in orders:
-		if not (flt(d.outstanding_amount) >= flt(filters.get("outstanding_amt_greater_than"))
-			and flt(d.outstanding_amount) <= flt(filters.get("outstanding_amt_less_than"))):
+		if not (
+			flt(d.outstanding_amount) >= flt(filters.get("outstanding_amt_greater_than"))
+			and flt(d.outstanding_amount) <= flt(filters.get("outstanding_amt_less_than"))
+		):
 			continue
 
 		d["voucher_type"] = voucher_type
@@ -1199,8 +1432,16 @@
 
 	return order_list
 
-def get_negative_outstanding_invoices(party_type, party, party_account,
-	party_account_currency, company_currency, cost_center=None, condition=None):
+
+def get_negative_outstanding_invoices(
+	party_type,
+	party,
+	party_account,
+	party_account_currency,
+	company_currency,
+	cost_center=None,
+	condition=None,
+):
 	voucher_type = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice"
 	supplier_condition = ""
 	if voucher_type == "Purchase Invoice":
@@ -1212,7 +1453,8 @@
 		grand_total_field = "grand_total"
 		rounded_total_field = "rounded_total"
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			"{voucher_type}" as voucher_type, name as voucher_no,
 			if({rounded_total_field}, {rounded_total_field}, {grand_total_field}) as invoice_amount,
@@ -1227,21 +1469,26 @@
 			{condition}
 		order by
 			posting_date, name
-		""".format(**{
-			"supplier_condition": supplier_condition,
-			"condition": condition,
-			"rounded_total_field": rounded_total_field,
-			"grand_total_field": grand_total_field,
-			"voucher_type": voucher_type,
-			"party_type": scrub(party_type),
-			"party_account": "debit_to" if party_type == "Customer" else "credit_to",
-			"cost_center": cost_center
-		}), (party, party_account), as_dict=True)
+		""".format(
+			**{
+				"supplier_condition": supplier_condition,
+				"condition": condition,
+				"rounded_total_field": rounded_total_field,
+				"grand_total_field": grand_total_field,
+				"voucher_type": voucher_type,
+				"party_type": scrub(party_type),
+				"party_account": "debit_to" if party_type == "Customer" else "credit_to",
+				"cost_center": cost_center,
+			}
+		),
+		(party, party_account),
+		as_dict=True,
+	)
 
 
 @frappe.whitelist()
 def get_party_details(company, party_type, party, date, cost_center=None):
-	bank_account = ''
+	bank_account = ""
 	if not frappe.db.exists(party_type, party):
 		frappe.throw(_("Invalid {0}: {1}").format(party_type, party))
 
@@ -1249,7 +1496,9 @@
 
 	account_currency = get_account_currency(party_account)
 	account_balance = get_balance_on(party_account, date, cost_center=cost_center)
-	_party_name = "title" if party_type in ("Student", "Shareholder") else party_type.lower() + "_name"
+	_party_name = (
+		"title" if party_type in ("Student", "Shareholder") else party_type.lower() + "_name"
+	)
 	party_name = frappe.db.get_value(party_type, party, _party_name)
 	party_balance = get_balance_on(party_type=party_type, party=party, cost_center=cost_center)
 	if party_type in ["Customer", "Supplier"]:
@@ -1261,61 +1510,68 @@
 		"party_account_currency": account_currency,
 		"party_balance": party_balance,
 		"account_balance": account_balance,
-		"bank_account": bank_account
+		"bank_account": bank_account,
 	}
 
 
 @frappe.whitelist()
 def get_account_details(account, date, cost_center=None):
-	frappe.has_permission('Payment Entry', throw=True)
+	frappe.has_permission("Payment Entry", throw=True)
 
 	# to check if the passed account is accessible under reference doctype Payment Entry
-	account_list = frappe.get_list('Account', {
-		'name': account
-	}, reference_doctype='Payment Entry', limit=1)
+	account_list = frappe.get_list(
+		"Account", {"name": account}, reference_doctype="Payment Entry", limit=1
+	)
 
 	# There might be some user permissions which will allow account under certain doctypes
 	# except for Payment Entry, only in such case we should throw permission error
 	if not account_list:
-		frappe.throw(_('Account: {0} is not permitted under Payment Entry').format(account))
+		frappe.throw(_("Account: {0} is not permitted under Payment Entry").format(account))
 
-	account_balance = get_balance_on(account, date, cost_center=cost_center,
-		ignore_account_permission=True)
+	account_balance = get_balance_on(
+		account, date, cost_center=cost_center, ignore_account_permission=True
+	)
 
-	return frappe._dict({
-		"account_currency": get_account_currency(account),
-		"account_balance": account_balance,
-		"account_type": frappe.db.get_value("Account", account, "account_type")
-	})
+	return frappe._dict(
+		{
+			"account_currency": get_account_currency(account),
+			"account_balance": account_balance,
+			"account_type": frappe.db.get_value("Account", account, "account_type"),
+		}
+	)
 
 
 @frappe.whitelist()
 def get_company_defaults(company):
 	fields = ["write_off_account", "exchange_gain_loss_account", "cost_center"]
-	ret = frappe.get_cached_value('Company',  company,  fields, as_dict=1)
+	ret = frappe.get_cached_value("Company", company, fields, as_dict=1)
 
 	for fieldname in fields:
 		if not ret[fieldname]:
-			frappe.throw(_("Please set default {0} in Company {1}")
-				.format(frappe.get_meta("Company").get_label(fieldname), company))
+			frappe.throw(
+				_("Please set default {0} in Company {1}").format(
+					frappe.get_meta("Company").get_label(fieldname), company
+				)
+			)
 
 	return ret
 
 
 def get_outstanding_on_journal_entry(name):
 	res = frappe.db.sql(
-			'SELECT '
-			'CASE WHEN party_type IN ("Customer", "Student") '
-			'THEN ifnull(sum(debit_in_account_currency - credit_in_account_currency), 0) '
-			'ELSE ifnull(sum(credit_in_account_currency - debit_in_account_currency), 0) '
-			'END as outstanding_amount '
-			'FROM `tabGL Entry` WHERE (voucher_no=%s OR against_voucher=%s) '
-			'AND party_type IS NOT NULL '
-			'AND party_type != ""',
-			(name, name), as_dict=1
-		)
+		"SELECT "
+		'CASE WHEN party_type IN ("Customer", "Student") '
+		"THEN ifnull(sum(debit_in_account_currency - credit_in_account_currency), 0) "
+		"ELSE ifnull(sum(credit_in_account_currency - debit_in_account_currency), 0) "
+		"END as outstanding_amount "
+		"FROM `tabGL Entry` WHERE (voucher_no=%s OR against_voucher=%s) "
+		"AND party_type IS NOT NULL "
+		'AND party_type != ""',
+		(name, name),
+		as_dict=1,
+	)
 
-	outstanding_amount = res[0].get('outstanding_amount', 0) if res else 0
+	outstanding_amount = res[0].get("outstanding_amount", 0) if res else 0
 
 	return outstanding_amount
 
@@ -1324,7 +1580,9 @@
 def get_reference_details(reference_doctype, reference_name, party_account_currency):
 	total_amount = outstanding_amount = exchange_rate = bill_no = None
 	ref_doc = frappe.get_doc(reference_doctype, reference_name)
-	company_currency = ref_doc.get("company_currency") or erpnext.get_company_currency(ref_doc.company)
+	company_currency = ref_doc.get("company_currency") or erpnext.get_company_currency(
+		ref_doc.company
+	)
 
 	if reference_doctype == "Fees":
 		total_amount = ref_doc.get("grand_total")
@@ -1337,20 +1595,22 @@
 	elif reference_doctype == "Journal Entry" and ref_doc.docstatus == 1:
 		total_amount = ref_doc.get("total_amount")
 		if ref_doc.multi_currency:
-			exchange_rate = get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date)
+			exchange_rate = get_exchange_rate(
+				party_account_currency, company_currency, ref_doc.posting_date
+			)
 		else:
 			exchange_rate = 1
 			outstanding_amount = get_outstanding_on_journal_entry(reference_name)
 	elif reference_doctype != "Journal Entry":
 		if ref_doc.doctype == "Expense Claim":
-				total_amount = flt(ref_doc.total_sanctioned_amount) + flt(ref_doc.total_taxes_and_charges)
+			total_amount = flt(ref_doc.total_sanctioned_amount) + flt(ref_doc.total_taxes_and_charges)
 		elif ref_doc.doctype == "Employee Advance":
 			total_amount = ref_doc.advance_amount
 			exchange_rate = ref_doc.get("exchange_rate")
 			if party_account_currency != ref_doc.currency:
 				total_amount = flt(total_amount) * flt(exchange_rate)
 		elif ref_doc.doctype == "Gratuity":
-				total_amount = ref_doc.amount
+			total_amount = ref_doc.amount
 		if not total_amount:
 			if party_account_currency == company_currency:
 				total_amount = ref_doc.base_grand_total
@@ -1360,16 +1620,21 @@
 		if not exchange_rate:
 			# Get the exchange rate from the original ref doc
 			# or get it based on the posting date of the ref doc.
-			exchange_rate = ref_doc.get("conversion_rate") or \
-				get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date)
+			exchange_rate = ref_doc.get("conversion_rate") or get_exchange_rate(
+				party_account_currency, company_currency, ref_doc.posting_date
+			)
 		if reference_doctype in ("Sales Invoice", "Purchase Invoice"):
 			outstanding_amount = ref_doc.get("outstanding_amount")
 			bill_no = ref_doc.get("bill_no")
 		elif reference_doctype == "Expense Claim":
-			outstanding_amount = flt(ref_doc.get("total_sanctioned_amount")) + flt(ref_doc.get("total_taxes_and_charges"))\
-				- flt(ref_doc.get("total_amount_reimbursed")) - flt(ref_doc.get("total_advance_amount"))
+			outstanding_amount = (
+				flt(ref_doc.get("total_sanctioned_amount"))
+				+ flt(ref_doc.get("total_taxes_and_charges"))
+				- flt(ref_doc.get("total_amount_reimbursed"))
+				- flt(ref_doc.get("total_advance_amount"))
+			)
 		elif reference_doctype == "Employee Advance":
-			outstanding_amount = (flt(ref_doc.advance_amount) - flt(ref_doc.paid_amount))
+			outstanding_amount = flt(ref_doc.advance_amount) - flt(ref_doc.paid_amount)
 			if party_account_currency != ref_doc.currency:
 				outstanding_amount = flt(outstanding_amount) * flt(exchange_rate)
 				if party_account_currency == company_currency:
@@ -1380,18 +1645,22 @@
 			outstanding_amount = flt(total_amount) - flt(ref_doc.advance_paid)
 	else:
 		# Get the exchange rate based on the posting date of the ref doc.
-		exchange_rate = get_exchange_rate(party_account_currency,
-			company_currency, ref_doc.posting_date)
+		exchange_rate = get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date)
 
-	return frappe._dict({
-		"due_date": ref_doc.get("due_date"),
-		"total_amount": flt(total_amount),
-		"outstanding_amount": flt(outstanding_amount),
-		"exchange_rate": flt(exchange_rate),
-		"bill_no": bill_no
-	})
+	return frappe._dict(
+		{
+			"due_date": ref_doc.get("due_date"),
+			"total_amount": flt(total_amount),
+			"outstanding_amount": flt(outstanding_amount),
+			"exchange_rate": flt(exchange_rate),
+			"bill_no": bill_no,
+		}
+	)
 
-def get_amounts_based_on_reference_doctype(reference_doctype, ref_doc, party_account_currency, company_currency, reference_name):
+
+def get_amounts_based_on_reference_doctype(
+	reference_doctype, ref_doc, party_account_currency, company_currency, reference_name
+):
 	total_amount = outstanding_amount = exchange_rate = None
 	if reference_doctype == "Fees":
 		total_amount = ref_doc.get("grand_total")
@@ -1404,35 +1673,46 @@
 	elif reference_doctype == "Journal Entry" and ref_doc.docstatus == 1:
 		total_amount = ref_doc.get("total_amount")
 		if ref_doc.multi_currency:
-			exchange_rate = get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date)
+			exchange_rate = get_exchange_rate(
+				party_account_currency, company_currency, ref_doc.posting_date
+			)
 		else:
 			exchange_rate = 1
 			outstanding_amount = get_outstanding_on_journal_entry(reference_name)
 
 	return total_amount, outstanding_amount, exchange_rate
 
-def get_amounts_based_on_ref_doc(reference_doctype, ref_doc, party_account_currency, company_currency):
+
+def get_amounts_based_on_ref_doc(
+	reference_doctype, ref_doc, party_account_currency, company_currency
+):
 	total_amount = outstanding_amount = exchange_rate = None
 	if ref_doc.doctype == "Expense Claim":
-			total_amount = flt(ref_doc.total_sanctioned_amount) + flt(ref_doc.total_taxes_and_charges)
+		total_amount = flt(ref_doc.total_sanctioned_amount) + flt(ref_doc.total_taxes_and_charges)
 	elif ref_doc.doctype == "Employee Advance":
-		total_amount, exchange_rate = get_total_amount_exchange_rate_for_employee_advance(party_account_currency, ref_doc)
+		total_amount, exchange_rate = get_total_amount_exchange_rate_for_employee_advance(
+			party_account_currency, ref_doc
+		)
 
 	if not total_amount:
 		total_amount, exchange_rate = get_total_amount_exchange_rate_base_on_currency(
-			party_account_currency, company_currency, ref_doc)
+			party_account_currency, company_currency, ref_doc
+		)
 
 	if not exchange_rate:
 		# Get the exchange rate from the original ref doc
 		# or get it based on the posting date of the ref doc
-		exchange_rate = ref_doc.get("conversion_rate") or \
-			get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date)
+		exchange_rate = ref_doc.get("conversion_rate") or get_exchange_rate(
+			party_account_currency, company_currency, ref_doc.posting_date
+		)
 
 	outstanding_amount, exchange_rate, bill_no = get_bill_no_and_update_amounts(
-		reference_doctype, ref_doc, total_amount, exchange_rate, party_account_currency, company_currency)
+		reference_doctype, ref_doc, total_amount, exchange_rate, party_account_currency, company_currency
+	)
 
 	return total_amount, outstanding_amount, exchange_rate, bill_no
 
+
 def get_total_amount_exchange_rate_for_employee_advance(party_account_currency, ref_doc):
 	total_amount = ref_doc.advance_amount
 	exchange_rate = ref_doc.get("exchange_rate")
@@ -1441,7 +1721,10 @@
 
 	return total_amount, exchange_rate
 
-def get_total_amount_exchange_rate_base_on_currency(party_account_currency, company_currency, ref_doc):
+
+def get_total_amount_exchange_rate_base_on_currency(
+	party_account_currency, company_currency, ref_doc
+):
 	exchange_rate = None
 	if party_account_currency == company_currency:
 		total_amount = ref_doc.base_grand_total
@@ -1451,16 +1734,23 @@
 
 	return total_amount, exchange_rate
 
-def get_bill_no_and_update_amounts(reference_doctype, ref_doc, total_amount, exchange_rate, party_account_currency, company_currency):
+
+def get_bill_no_and_update_amounts(
+	reference_doctype, ref_doc, total_amount, exchange_rate, party_account_currency, company_currency
+):
 	outstanding_amount = bill_no = None
 	if reference_doctype in ("Sales Invoice", "Purchase Invoice"):
 		outstanding_amount = ref_doc.get("outstanding_amount")
 		bill_no = ref_doc.get("bill_no")
 	elif reference_doctype == "Expense Claim":
-		outstanding_amount = flt(ref_doc.get("total_sanctioned_amount")) + flt(ref_doc.get("total_taxes_and_charges"))\
-			- flt(ref_doc.get("total_amount_reimbursed")) - flt(ref_doc.get("total_advance_amount"))
+		outstanding_amount = (
+			flt(ref_doc.get("total_sanctioned_amount"))
+			+ flt(ref_doc.get("total_taxes_and_charges"))
+			- flt(ref_doc.get("total_amount_reimbursed"))
+			- flt(ref_doc.get("total_advance_amount"))
+		)
 	elif reference_doctype == "Employee Advance":
-		outstanding_amount = (flt(ref_doc.advance_amount) - flt(ref_doc.paid_amount))
+		outstanding_amount = flt(ref_doc.advance_amount) - flt(ref_doc.paid_amount)
 		if party_account_currency != ref_doc.currency:
 			outstanding_amount = flt(outstanding_amount) * flt(exchange_rate)
 			if party_account_currency == company_currency:
@@ -1482,15 +1772,20 @@
 	party_account = set_party_account(dt, dn, doc, party_type)
 	party_account_currency = set_party_account_currency(dt, party_account, doc)
 	payment_type = set_payment_type(dt, doc)
-	grand_total, outstanding_amount = set_grand_total_and_outstanding_amount(party_amount, dt, party_account_currency, doc)
+	grand_total, outstanding_amount = set_grand_total_and_outstanding_amount(
+		party_amount, dt, party_account_currency, doc
+	)
 
 	# bank or cash
 	bank = get_bank_cash_account(doc, bank_account)
 
 	paid_amount, received_amount = set_paid_amount_and_received_amount(
-		dt, party_account_currency, bank, outstanding_amount, payment_type, bank_amount, doc)
+		dt, party_account_currency, bank, outstanding_amount, payment_type, bank_amount, doc
+	)
 
-	paid_amount, received_amount, discount_amount = apply_early_payment_discount(paid_amount, received_amount, doc)
+	paid_amount, received_amount, discount_amount = apply_early_payment_discount(
+		paid_amount, received_amount, doc
+	)
 
 	pe = frappe.new_doc("Payment Entry")
 	pe.payment_type = payment_type
@@ -1504,18 +1799,22 @@
 	pe.contact_email = doc.get("contact_email")
 	pe.ensure_supplier_is_not_blocked()
 
-	pe.paid_from = party_account if payment_type=="Receive" else bank.account
-	pe.paid_to = party_account if payment_type=="Pay" else bank.account
-	pe.paid_from_account_currency = party_account_currency \
-		if payment_type=="Receive" else bank.account_currency
-	pe.paid_to_account_currency = party_account_currency if payment_type=="Pay" else bank.account_currency
+	pe.paid_from = party_account if payment_type == "Receive" else bank.account
+	pe.paid_to = party_account if payment_type == "Pay" else bank.account
+	pe.paid_from_account_currency = (
+		party_account_currency if payment_type == "Receive" else bank.account_currency
+	)
+	pe.paid_to_account_currency = (
+		party_account_currency if payment_type == "Pay" else bank.account_currency
+	)
 	pe.paid_amount = paid_amount
 	pe.received_amount = received_amount
 	pe.letter_head = doc.get("letter_head")
 
-	if dt in ['Purchase Order', 'Sales Order', 'Sales Invoice', 'Purchase Invoice']:
-		pe.project = (doc.get('project') or
-			reduce(lambda prev,cur: prev or cur, [x.get('project') for x in doc.get('items')], None)) # get first non-empty project from items
+	if dt in ["Purchase Order", "Sales Order", "Sales Invoice", "Purchase Invoice"]:
+		pe.project = doc.get("project") or reduce(
+			lambda prev, cur: prev or cur, [x.get("project") for x in doc.get("items")], None
+		)  # get first non-empty project from items
 
 	if pe.party_type in ["Customer", "Supplier"]:
 		bank_account = get_party_bank_account(pe.party_type, pe.party)
@@ -1524,44 +1823,57 @@
 
 	# only Purchase Invoice can be blocked individually
 	if doc.doctype == "Purchase Invoice" and doc.invoice_is_blocked():
-		frappe.msgprint(_('{0} is on hold till {1}').format(doc.name, doc.release_date))
+		frappe.msgprint(_("{0} is on hold till {1}").format(doc.name, doc.release_date))
 	else:
-		if (doc.doctype in ('Sales Invoice', 'Purchase Invoice')
-			and frappe.get_value('Payment Terms Template',
-			{'name': doc.payment_terms_template}, 'allocate_payment_based_on_payment_terms')):
+		if doc.doctype in ("Sales Invoice", "Purchase Invoice") and frappe.get_value(
+			"Payment Terms Template",
+			{"name": doc.payment_terms_template},
+			"allocate_payment_based_on_payment_terms",
+		):
 
-			for reference in get_reference_as_per_payment_terms(doc.payment_schedule, dt, dn, doc, grand_total, outstanding_amount):
-				pe.append('references', reference)
+			for reference in get_reference_as_per_payment_terms(
+				doc.payment_schedule, dt, dn, doc, grand_total, outstanding_amount
+			):
+				pe.append("references", reference)
 		else:
 			if dt == "Dunning":
-				pe.append("references", {
-					'reference_doctype': 'Sales Invoice',
-					'reference_name': doc.get('sales_invoice'),
-					"bill_no": doc.get("bill_no"),
-					"due_date": doc.get("due_date"),
-					'total_amount': doc.get('outstanding_amount'),
-					'outstanding_amount': doc.get('outstanding_amount'),
-					'allocated_amount': doc.get('outstanding_amount')
-				})
-				pe.append("references", {
-					'reference_doctype': dt,
-					'reference_name': dn,
-					"bill_no": doc.get("bill_no"),
-					"due_date": doc.get("due_date"),
-					'total_amount': doc.get('dunning_amount'),
-					'outstanding_amount': doc.get('dunning_amount'),
-					'allocated_amount': doc.get('dunning_amount')
-				})
+				pe.append(
+					"references",
+					{
+						"reference_doctype": "Sales Invoice",
+						"reference_name": doc.get("sales_invoice"),
+						"bill_no": doc.get("bill_no"),
+						"due_date": doc.get("due_date"),
+						"total_amount": doc.get("outstanding_amount"),
+						"outstanding_amount": doc.get("outstanding_amount"),
+						"allocated_amount": doc.get("outstanding_amount"),
+					},
+				)
+				pe.append(
+					"references",
+					{
+						"reference_doctype": dt,
+						"reference_name": dn,
+						"bill_no": doc.get("bill_no"),
+						"due_date": doc.get("due_date"),
+						"total_amount": doc.get("dunning_amount"),
+						"outstanding_amount": doc.get("dunning_amount"),
+						"allocated_amount": doc.get("dunning_amount"),
+					},
+				)
 			else:
-				pe.append("references", {
-					'reference_doctype': dt,
-					'reference_name': dn,
-					"bill_no": doc.get("bill_no"),
-					"due_date": doc.get("due_date"),
-					'total_amount': grand_total,
-					'outstanding_amount': outstanding_amount,
-					'allocated_amount': outstanding_amount
-				})
+				pe.append(
+					"references",
+					{
+						"reference_doctype": dt,
+						"reference_name": dn,
+						"bill_no": doc.get("bill_no"),
+						"due_date": doc.get("due_date"),
+						"total_amount": grand_total,
+						"outstanding_amount": outstanding_amount,
+						"allocated_amount": outstanding_amount,
+					},
+				)
 
 	pe.setup_party_account_field()
 	pe.set_missing_values()
@@ -1572,25 +1884,32 @@
 		pe.set_exchange_rate(ref_doc=reference_doc)
 		pe.set_amounts()
 		if discount_amount:
-			pe.set_gain_or_loss(account_details={
-				'account': frappe.get_cached_value('Company', pe.company, "default_discount_account"),
-				'cost_center': pe.cost_center or frappe.get_cached_value('Company', pe.company, "cost_center"),
-				'amount': discount_amount * (-1 if payment_type == "Pay" else 1)
-			})
+			pe.set_gain_or_loss(
+				account_details={
+					"account": frappe.get_cached_value("Company", pe.company, "default_discount_account"),
+					"cost_center": pe.cost_center
+					or frappe.get_cached_value("Company", pe.company, "cost_center"),
+					"amount": discount_amount * (-1 if payment_type == "Pay" else 1),
+				}
+			)
 			pe.set_difference_amount()
 
 	return pe
 
+
 def get_bank_cash_account(doc, bank_account):
-	bank = get_default_bank_cash_account(doc.company, "Bank", mode_of_payment=doc.get("mode_of_payment"),
-		account=bank_account)
+	bank = get_default_bank_cash_account(
+		doc.company, "Bank", mode_of_payment=doc.get("mode_of_payment"), account=bank_account
+	)
 
 	if not bank:
-		bank = get_default_bank_cash_account(doc.company, "Cash", mode_of_payment=doc.get("mode_of_payment"),
-			account=bank_account)
+		bank = get_default_bank_cash_account(
+			doc.company, "Cash", mode_of_payment=doc.get("mode_of_payment"), account=bank_account
+		)
 
 	return bank
 
+
 def set_party_type(dt):
 	if dt in ("Sales Invoice", "Sales Order", "Dunning"):
 		party_type = "Customer"
@@ -1602,6 +1921,7 @@
 		party_type = "Student"
 	return party_type
 
+
 def set_party_account(dt, dn, doc, party_type):
 	if dt == "Sales Invoice":
 		party_account = get_party_account_based_on_invoice_discounting(dn) or doc.debit_to
@@ -1619,6 +1939,7 @@
 		party_account = get_party_account(party_type, doc.get(party_type.lower()), doc.company)
 	return party_account
 
+
 def set_party_account_currency(dt, party_account, doc):
 	if dt not in ("Sales Invoice", "Purchase Invoice"):
 		party_account_currency = get_account_currency(party_account)
@@ -1626,14 +1947,18 @@
 		party_account_currency = doc.get("party_account_currency") or get_account_currency(party_account)
 	return party_account_currency
 
+
 def set_payment_type(dt, doc):
-	if (dt == "Sales Order" or (dt in ("Sales Invoice", "Fees", "Dunning") and doc.outstanding_amount > 0)) \
-		or (dt=="Purchase Invoice" and doc.outstanding_amount < 0):
-			payment_type = "Receive"
+	if (
+		dt == "Sales Order"
+		or (dt in ("Sales Invoice", "Fees", "Dunning") and doc.outstanding_amount > 0)
+	) or (dt == "Purchase Invoice" and doc.outstanding_amount < 0):
+		payment_type = "Receive"
 	else:
 		payment_type = "Pay"
 	return payment_type
 
+
 def set_grand_total_and_outstanding_amount(party_amount, dt, party_account_currency, doc):
 	grand_total = outstanding_amount = 0
 	if party_amount:
@@ -1646,8 +1971,7 @@
 		outstanding_amount = doc.outstanding_amount
 	elif dt in ("Expense Claim"):
 		grand_total = doc.total_sanctioned_amount + doc.total_taxes_and_charges
-		outstanding_amount = doc.grand_total \
-			- doc.total_amount_reimbursed
+		outstanding_amount = doc.grand_total - doc.total_amount_reimbursed
 	elif dt == "Employee Advance":
 		grand_total = flt(doc.advance_amount)
 		outstanding_amount = flt(doc.advance_amount) - flt(doc.paid_amount)
@@ -1671,7 +1995,10 @@
 		outstanding_amount = grand_total - flt(doc.advance_paid)
 	return grand_total, outstanding_amount
 
-def set_paid_amount_and_received_amount(dt, party_account_currency, bank, outstanding_amount, payment_type, bank_amount, doc):
+
+def set_paid_amount_and_received_amount(
+	dt, party_account_currency, bank, outstanding_amount, payment_type, bank_amount, doc
+):
 	paid_amount = received_amount = 0
 	if party_account_currency == bank.account_currency:
 		paid_amount = received_amount = abs(outstanding_amount)
@@ -1680,37 +2007,38 @@
 		if bank_amount:
 			received_amount = bank_amount
 		else:
-			received_amount = paid_amount * doc.get('conversion_rate', 1)
+			received_amount = paid_amount * doc.get("conversion_rate", 1)
 			if dt == "Employee Advance":
-				received_amount = paid_amount * doc.get('exchange_rate', 1)
+				received_amount = paid_amount * doc.get("exchange_rate", 1)
 	else:
 		received_amount = abs(outstanding_amount)
 		if bank_amount:
 			paid_amount = bank_amount
 		else:
 			# if party account currency and bank currency is different then populate paid amount as well
-			paid_amount = received_amount * doc.get('conversion_rate', 1)
+			paid_amount = received_amount * doc.get("conversion_rate", 1)
 			if dt == "Employee Advance":
-				paid_amount = received_amount * doc.get('exchange_rate', 1)
+				paid_amount = received_amount * doc.get("exchange_rate", 1)
 
 	return paid_amount, received_amount
 
+
 def apply_early_payment_discount(paid_amount, received_amount, doc):
 	total_discount = 0
-	eligible_for_payments = ['Sales Order', 'Sales Invoice', 'Purchase Order', 'Purchase Invoice']
-	has_payment_schedule = hasattr(doc, 'payment_schedule') and doc.payment_schedule
+	eligible_for_payments = ["Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"]
+	has_payment_schedule = hasattr(doc, "payment_schedule") and doc.payment_schedule
 
 	if doc.doctype in eligible_for_payments and has_payment_schedule:
 		for term in doc.payment_schedule:
 			if not term.discounted_amount and term.discount and getdate(nowdate()) <= term.discount_date:
-				if term.discount_type == 'Percentage':
-					discount_amount = flt(doc.get('grand_total')) * (term.discount / 100)
+				if term.discount_type == "Percentage":
+					discount_amount = flt(doc.get("grand_total")) * (term.discount / 100)
 				else:
 					discount_amount = term.discount
 
-				discount_amount_in_foreign_currency = discount_amount * doc.get('conversion_rate', 1)
+				discount_amount_in_foreign_currency = discount_amount * doc.get("conversion_rate", 1)
 
-				if doc.doctype == 'Sales Invoice':
+				if doc.doctype == "Sales Invoice":
 					paid_amount -= discount_amount
 					received_amount -= discount_amount_in_foreign_currency
 				else:
@@ -1720,38 +2048,46 @@
 				total_discount += discount_amount
 
 		if total_discount:
-			money = frappe.utils.fmt_money(total_discount, currency=doc.get('currency'))
+			money = frappe.utils.fmt_money(total_discount, currency=doc.get("currency"))
 			frappe.msgprint(_("Discount of {} applied as per Payment Term").format(money), alert=1)
 
 	return paid_amount, received_amount, total_discount
 
-def get_reference_as_per_payment_terms(payment_schedule, dt, dn, doc, grand_total, outstanding_amount):
+
+def get_reference_as_per_payment_terms(
+	payment_schedule, dt, dn, doc, grand_total, outstanding_amount
+):
 	references = []
 	for payment_term in payment_schedule:
-		payment_term_outstanding = flt(payment_term.payment_amount - payment_term.paid_amount,
-				payment_term.precision('payment_amount'))
+		payment_term_outstanding = flt(
+			payment_term.payment_amount - payment_term.paid_amount, payment_term.precision("payment_amount")
+		)
 
 		if payment_term_outstanding:
-			references.append({
-				'reference_doctype': dt,
-				'reference_name': dn,
-				'bill_no': doc.get('bill_no'),
-				'due_date': doc.get('due_date'),
-				'total_amount': grand_total,
-				'outstanding_amount': outstanding_amount,
-				'payment_term': payment_term.payment_term,
-				'allocated_amount': payment_term_outstanding
-			})
+			references.append(
+				{
+					"reference_doctype": dt,
+					"reference_name": dn,
+					"bill_no": doc.get("bill_no"),
+					"due_date": doc.get("due_date"),
+					"total_amount": grand_total,
+					"outstanding_amount": outstanding_amount,
+					"payment_term": payment_term.payment_term,
+					"allocated_amount": payment_term_outstanding,
+				}
+			)
 
 	return references
 
+
 def get_paid_amount(dt, dn, party_type, party, account, due_date):
-	if party_type=="Customer":
+	if party_type == "Customer":
 		dr_or_cr = "credit_in_account_currency - debit_in_account_currency"
 	else:
 		dr_or_cr = "debit_in_account_currency - credit_in_account_currency"
 
-	paid_amount = frappe.db.sql("""
+	paid_amount = frappe.db.sql(
+		"""
 		select ifnull(sum({dr_or_cr}), 0) as paid_amount
 		from `tabGL Entry`
 		where against_voucher_type = %s
@@ -1761,41 +2097,58 @@
 			and account = %s
 			and due_date = %s
 			and {dr_or_cr} > 0
-	""".format(dr_or_cr=dr_or_cr), (dt, dn, party_type, party, account, due_date))
+	""".format(
+			dr_or_cr=dr_or_cr
+		),
+		(dt, dn, party_type, party, account, due_date),
+	)
 
 	return paid_amount[0][0] if paid_amount else 0
 
+
 @frappe.whitelist()
-def get_party_and_account_balance(company, date, paid_from=None, paid_to=None, ptype=None, pty=None, cost_center=None):
-	return frappe._dict({
-		"party_balance": get_balance_on(party_type=ptype, party=pty, cost_center=cost_center),
-		"paid_from_account_balance": get_balance_on(paid_from, date, cost_center=cost_center),
-		"paid_to_account_balance": get_balance_on(paid_to, date=date, cost_center=cost_center)
-	})
+def get_party_and_account_balance(
+	company, date, paid_from=None, paid_to=None, ptype=None, pty=None, cost_center=None
+):
+	return frappe._dict(
+		{
+			"party_balance": get_balance_on(party_type=ptype, party=pty, cost_center=cost_center),
+			"paid_from_account_balance": get_balance_on(paid_from, date, cost_center=cost_center),
+			"paid_to_account_balance": get_balance_on(paid_to, date=date, cost_center=cost_center),
+		}
+	)
+
 
 @frappe.whitelist()
 def make_payment_order(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
+
 	def set_missing_values(source, target):
 		target.payment_order_type = "Payment Entry"
-		target.append('references', dict(
-			reference_doctype="Payment Entry",
-			reference_name=source.name,
-			bank_account=source.party_bank_account,
-			amount=source.paid_amount,
-			account=source.paid_to,
-			supplier=source.party,
-			mode_of_payment=source.mode_of_payment,
-		))
+		target.append(
+			"references",
+			dict(
+				reference_doctype="Payment Entry",
+				reference_name=source.name,
+				bank_account=source.party_bank_account,
+				amount=source.paid_amount,
+				account=source.paid_to,
+				supplier=source.party,
+				mode_of_payment=source.mode_of_payment,
+			),
+		)
 
-	doclist = get_mapped_doc("Payment Entry", source_name, {
-		"Payment Entry": {
-			"doctype": "Payment Order",
-			"validation": {
-				"docstatus": ["=", 1]
-			},
-		}
-
-	}, target_doc, set_missing_values)
+	doclist = get_mapped_doc(
+		"Payment Entry",
+		source_name,
+		{
+			"Payment Entry": {
+				"doctype": "Payment Order",
+				"validation": {"docstatus": ["=", 1]},
+			}
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
index 349b8bb..5b70b51 100644
--- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
@@ -32,10 +32,9 @@
 		pe.insert()
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["Debtors - _TC", 0, 1000, so.name],
-			["_Test Cash - _TC", 1000.0, 0, None]
-		])
+		expected_gle = dict(
+			(d[0], d) for d in [["Debtors - _TC", 0, 1000, so.name], ["_Test Cash - _TC", 1000.0, 0, None]]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
@@ -48,9 +47,9 @@
 		self.assertEqual(so_advance_paid, 0)
 
 	def test_payment_entry_for_blocked_supplier_invoice(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Invoices'
+		supplier.hold_type = "Invoices"
 		supplier.save()
 
 		self.assertRaises(frappe.ValidationError, make_purchase_invoice)
@@ -59,32 +58,40 @@
 		supplier.save()
 
 	def test_payment_entry_for_blocked_supplier_payments(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Payments'
+		supplier.hold_type = "Payments"
 		supplier.save()
 
 		pi = make_purchase_invoice()
 
 		self.assertRaises(
-			frappe.ValidationError, get_payment_entry, dt='Purchase Invoice', dn=pi.name,
-			bank_account="_Test Bank - _TC")
+			frappe.ValidationError,
+			get_payment_entry,
+			dt="Purchase Invoice",
+			dn=pi.name,
+			bank_account="_Test Bank - _TC",
+		)
 
 		supplier.on_hold = 0
 		supplier.save()
 
 	def test_payment_entry_for_blocked_supplier_payments_today_date(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Payments'
+		supplier.hold_type = "Payments"
 		supplier.release_date = nowdate()
 		supplier.save()
 
 		pi = make_purchase_invoice()
 
 		self.assertRaises(
-			frappe.ValidationError, get_payment_entry, dt='Purchase Invoice', dn=pi.name,
-			bank_account="_Test Bank - _TC")
+			frappe.ValidationError,
+			get_payment_entry,
+			dt="Purchase Invoice",
+			dn=pi.name,
+			bank_account="_Test Bank - _TC",
+		)
 
 		supplier.on_hold = 0
 		supplier.save()
@@ -93,15 +100,15 @@
 		# this test is meant to fail only if something fails in the try block
 		with self.assertRaises(Exception):
 			try:
-				supplier = frappe.get_doc('Supplier', '_Test Supplier')
+				supplier = frappe.get_doc("Supplier", "_Test Supplier")
 				supplier.on_hold = 1
-				supplier.hold_type = 'Payments'
-				supplier.release_date = '2018-03-01'
+				supplier.hold_type = "Payments"
+				supplier.release_date = "2018-03-01"
 				supplier.save()
 
 				pi = make_purchase_invoice()
 
-				get_payment_entry('Purchase Invoice', pi.name, bank_account="_Test Bank - _TC")
+				get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank - _TC")
 
 				supplier.on_hold = 0
 				supplier.save()
@@ -111,8 +118,12 @@
 				raise Exception
 
 	def test_payment_entry_against_si_usd_to_usd(self):
-		si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
@@ -120,10 +131,13 @@
 		pe.insert()
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["_Test Receivable USD - _TC", 0, 5000, si.name],
-			["_Test Bank USD - _TC", 5000.0, 0, None]
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["_Test Receivable USD - _TC", 0, 5000, si.name],
+				["_Test Bank USD - _TC", 5000.0, 0, None],
+			]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
@@ -136,8 +150,12 @@
 		self.assertEqual(outstanding_amount, 100)
 
 	def test_payment_entry_against_pi(self):
-		pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC",
-			currency="USD", conversion_rate=50)
+		pi = make_purchase_invoice(
+			supplier="_Test Supplier USD",
+			debit_to="_Test Payable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 		pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
@@ -145,20 +163,26 @@
 		pe.insert()
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["_Test Payable USD - _TC", 12500, 0, pi.name],
-			["_Test Bank USD - _TC", 0, 12500, None]
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["_Test Payable USD - _TC", 12500, 0, pi.name],
+				["_Test Bank USD - _TC", 0, 12500, None],
+			]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", pi.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, 0)
 
-
 	def test_payment_against_sales_invoice_to_check_status(self):
-		si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
@@ -167,28 +191,35 @@
 		pe.insert()
 		pe.submit()
 
-		outstanding_amount, status = frappe.db.get_value("Sales Invoice", si.name, ["outstanding_amount", "status"])
+		outstanding_amount, status = frappe.db.get_value(
+			"Sales Invoice", si.name, ["outstanding_amount", "status"]
+		)
 		self.assertEqual(flt(outstanding_amount), 0)
-		self.assertEqual(status, 'Paid')
+		self.assertEqual(status, "Paid")
 
 		pe.cancel()
 
-		outstanding_amount, status = frappe.db.get_value("Sales Invoice", si.name, ["outstanding_amount", "status"])
+		outstanding_amount, status = frappe.db.get_value(
+			"Sales Invoice", si.name, ["outstanding_amount", "status"]
+		)
 		self.assertEqual(flt(outstanding_amount), 100)
-		self.assertEqual(status, 'Unpaid')
+		self.assertEqual(status, "Unpaid")
 
 	def test_payment_entry_against_payment_terms(self):
 		si = create_sales_invoice(do_not_save=1, qty=1, rate=200)
 		create_payment_terms_template()
-		si.payment_terms_template = 'Test Receivable Template'
+		si.payment_terms_template = "Test Receivable Template"
 
-		si.append('taxes', {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 18
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 18,
+			},
+		)
 		si.save()
 
 		si.submit()
@@ -197,25 +228,28 @@
 		pe.submit()
 		si.load_from_db()
 
-		self.assertEqual(pe.references[0].payment_term, 'Basic Amount Receivable')
-		self.assertEqual(pe.references[1].payment_term, 'Tax Receivable')
+		self.assertEqual(pe.references[0].payment_term, "Basic Amount Receivable")
+		self.assertEqual(pe.references[1].payment_term, "Tax Receivable")
 		self.assertEqual(si.payment_schedule[0].paid_amount, 200.0)
 		self.assertEqual(si.payment_schedule[1].paid_amount, 36.0)
 
 	def test_payment_entry_against_payment_terms_with_discount(self):
 		si = create_sales_invoice(do_not_save=1, qty=1, rate=200)
 		create_payment_terms_template_with_discount()
-		si.payment_terms_template = 'Test Discount Template'
+		si.payment_terms_template = "Test Discount Template"
 
-		frappe.db.set_value('Company', si.company, 'default_discount_account', 'Write Off - _TC')
+		frappe.db.set_value("Company", si.company, "default_discount_account", "Write Off - _TC")
 
-		si.append('taxes', {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 18
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 18,
+			},
+		)
 		si.save()
 
 		si.submit()
@@ -224,16 +258,19 @@
 		pe.submit()
 		si.load_from_db()
 
-		self.assertEqual(pe.references[0].payment_term, '30 Credit Days with 10% Discount')
+		self.assertEqual(pe.references[0].payment_term, "30 Credit Days with 10% Discount")
 		self.assertEqual(si.payment_schedule[0].payment_amount, 236.0)
 		self.assertEqual(si.payment_schedule[0].paid_amount, 212.40)
 		self.assertEqual(si.payment_schedule[0].outstanding, 0)
 		self.assertEqual(si.payment_schedule[0].discounted_amount, 23.6)
 
-
 	def test_payment_against_purchase_invoice_to_check_status(self):
-		pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC",
-			currency="USD", conversion_rate=50)
+		pi = make_purchase_invoice(
+			supplier="_Test Supplier USD",
+			debit_to="_Test Payable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 
 		pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
@@ -242,21 +279,27 @@
 		pe.insert()
 		pe.submit()
 
-		outstanding_amount, status = frappe.db.get_value("Purchase Invoice", pi.name, ["outstanding_amount", "status"])
+		outstanding_amount, status = frappe.db.get_value(
+			"Purchase Invoice", pi.name, ["outstanding_amount", "status"]
+		)
 		self.assertEqual(flt(outstanding_amount), 0)
-		self.assertEqual(status, 'Paid')
+		self.assertEqual(status, "Paid")
 
 		pe.cancel()
 
-		outstanding_amount, status = frappe.db.get_value("Purchase Invoice", pi.name, ["outstanding_amount", "status"])
+		outstanding_amount, status = frappe.db.get_value(
+			"Purchase Invoice", pi.name, ["outstanding_amount", "status"]
+		)
 		self.assertEqual(flt(outstanding_amount), 250)
-		self.assertEqual(status, 'Unpaid')
+		self.assertEqual(status, "Unpaid")
 
 	def test_payment_entry_against_ec(self):
 
-		payable = frappe.get_cached_value('Company',  "_Test Company",  'default_payable_account')
+		payable = frappe.get_cached_value("Company", "_Test Company", "default_payable_account")
 		ec = make_expense_claim(payable, 300, 300, "_Test Company", "Travel Expenses - _TC")
-		pe = get_payment_entry("Expense Claim", ec.name, bank_account="_Test Bank USD - _TC", bank_amount=300)
+		pe = get_payment_entry(
+			"Expense Claim", ec.name, bank_account="_Test Bank USD - _TC", bank_amount=300
+		)
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
 		pe.source_exchange_rate = 1
@@ -264,68 +307,87 @@
 		pe.insert()
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			[payable, 300, 0, ec.name],
-			["_Test Bank USD - _TC", 0, 300, None]
-		])
+		expected_gle = dict(
+			(d[0], d) for d in [[payable, 300, 0, ec.name], ["_Test Bank USD - _TC", 0, 300, None]]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
-		outstanding_amount = flt(frappe.db.get_value("Expense Claim", ec.name, "total_sanctioned_amount")) - \
-			flt(frappe.db.get_value("Expense Claim", ec.name, "total_amount_reimbursed"))
+		outstanding_amount = flt(
+			frappe.db.get_value("Expense Claim", ec.name, "total_sanctioned_amount")
+		) - flt(frappe.db.get_value("Expense Claim", ec.name, "total_amount_reimbursed"))
 		self.assertEqual(outstanding_amount, 0)
 
 	def test_payment_entry_against_si_usd_to_inr(self):
-		si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
-		pe = get_payment_entry("Sales Invoice", si.name, party_amount=20,
-			bank_account="_Test Bank - _TC", bank_amount=900)
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
+		pe = get_payment_entry(
+			"Sales Invoice", si.name, party_amount=20, bank_account="_Test Bank - _TC", bank_amount=900
+		)
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
 
 		self.assertEqual(pe.difference_amount, 100)
 
-		pe.append("deductions", {
-			"account": "_Test Exchange Gain/Loss - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"amount": 100
-		})
+		pe.append(
+			"deductions",
+			{
+				"account": "_Test Exchange Gain/Loss - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"amount": 100,
+			},
+		)
 		pe.insert()
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["_Test Receivable USD - _TC", 0, 1000, si.name],
-			["_Test Bank - _TC", 900, 0, None],
-			["_Test Exchange Gain/Loss - _TC", 100.0, 0, None],
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["_Test Receivable USD - _TC", 0, 1000, si.name],
+				["_Test Bank - _TC", 900, 0, None],
+				["_Test Exchange Gain/Loss - _TC", 100.0, 0, None],
+			]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, 80)
 
-	def test_payment_entry_against_si_usd_to_usd_with_deduction_in_base_currency (self):
-		si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50, do_not_save=1)
+	def test_payment_entry_against_si_usd_to_usd_with_deduction_in_base_currency(self):
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+			do_not_save=1,
+		)
 
 		si.plc_conversion_rate = 50
 		si.save()
 		si.submit()
 
-		pe = get_payment_entry("Sales Invoice", si.name, party_amount=20,
-			bank_account="_Test Bank USD - _TC", bank_amount=900)
+		pe = get_payment_entry(
+			"Sales Invoice", si.name, party_amount=20, bank_account="_Test Bank USD - _TC", bank_amount=900
+		)
 
 		pe.source_exchange_rate = 45.263
 		pe.target_exchange_rate = 45.263
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
 
-
-		pe.append("deductions", {
-			"account": "_Test Exchange Gain/Loss - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"amount": 94.80
-		})
+		pe.append(
+			"deductions",
+			{
+				"account": "_Test Exchange Gain/Loss - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"amount": 94.80,
+			},
+		)
 
 		pe.save()
 
@@ -359,8 +421,7 @@
 		pe.set_amounts()
 
 		self.assertEqual(
-			pe.source_exchange_rate, 65.1,
-			"{0} is not equal to {1}".format(pe.source_exchange_rate, 65.1)
+			pe.source_exchange_rate, 65.1, "{0} is not equal to {1}".format(pe.source_exchange_rate, 65.1)
 		)
 
 	def test_internal_transfer_usd_to_inr(self):
@@ -382,20 +443,26 @@
 
 		self.assertEqual(pe.difference_amount, 500)
 
-		pe.append("deductions", {
-			"account": "_Test Exchange Gain/Loss - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"amount": 500
-		})
+		pe.append(
+			"deductions",
+			{
+				"account": "_Test Exchange Gain/Loss - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"amount": 500,
+			},
+		)
 
 		pe.insert()
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["_Test Bank USD - _TC", 0, 5000, None],
-			["_Test Bank - _TC", 4500, 0, None],
-			["_Test Exchange Gain/Loss - _TC", 500.0, 0, None],
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["_Test Bank USD - _TC", 0, 5000, None],
+				["_Test Bank - _TC", 4500, 0, None],
+				["_Test Exchange Gain/Loss - _TC", 500.0, 0, None],
+			]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
@@ -435,10 +502,9 @@
 		pe3.insert()
 		pe3.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["Debtors - _TC", 100, 0, si1.name],
-			["_Test Cash - _TC", 0, 100, None]
-		])
+		expected_gle = dict(
+			(d[0], d) for d in [["Debtors - _TC", 100, 0, si1.name], ["_Test Cash - _TC", 0, 100, None]]
+		)
 
 		self.validate_gl_entries(pe3.name, expected_gle)
 
@@ -462,12 +528,16 @@
 			self.assertEqual(expected_gle[gle.account][3], gle.against_voucher)
 
 	def get_gle(self, voucher_no):
-		return frappe.db.sql("""select account, debit, credit, against_voucher
+		return frappe.db.sql(
+			"""select account, debit, credit, against_voucher
 			from `tabGL Entry` where voucher_type='Payment Entry' and voucher_no=%s
-			order by account asc""", voucher_no, as_dict=1)
+			order by account asc""",
+			voucher_no,
+			as_dict=1,
+		)
 
 	def test_payment_entry_write_off_difference(self):
-		si =  create_sales_invoice()
+		si = create_sales_invoice()
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Cash - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
@@ -477,11 +547,10 @@
 		self.assertEqual(pe.unallocated_amount, 10)
 
 		pe.received_amount = pe.paid_amount = 95
-		pe.append("deductions", {
-			"account": "_Test Write Off - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"amount": 5
-		})
+		pe.append(
+			"deductions",
+			{"account": "_Test Write Off - _TC", "cost_center": "_Test Cost Center - _TC", "amount": 5},
+		)
 		pe.save()
 
 		self.assertEqual(pe.unallocated_amount, 0)
@@ -489,27 +558,37 @@
 
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["Debtors - _TC", 0, 100, si.name],
-			["_Test Cash - _TC", 95, 0, None],
-			["_Test Write Off - _TC", 5, 0, None]
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["Debtors - _TC", 0, 100, si.name],
+				["_Test Cash - _TC", 95, 0, None],
+				["_Test Write Off - _TC", 5, 0, None],
+			]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
 	def test_payment_entry_exchange_gain_loss(self):
-		si =  create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
 		pe.source_exchange_rate = 55
 
-		pe.append("deductions", {
-			"account": "_Test Exchange Gain/Loss - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"amount": -500
-		})
+		pe.append(
+			"deductions",
+			{
+				"account": "_Test Exchange Gain/Loss - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"amount": -500,
+			},
+		)
 		pe.save()
 
 		self.assertEqual(pe.unallocated_amount, 0)
@@ -517,11 +596,14 @@
 
 		pe.submit()
 
-		expected_gle = dict((d[0], d) for d in [
-			["_Test Receivable USD - _TC", 0, 5000, si.name],
-			["_Test Bank USD - _TC", 5500, 0, None],
-			["_Test Exchange Gain/Loss - _TC", 0, 500, None],
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["_Test Receivable USD - _TC", 0, 5000, si.name],
+				["_Test Bank USD - _TC", 5500, 0, None],
+				["_Test Exchange Gain/Loss - _TC", 0, 500, None],
+			]
+		)
 
 		self.validate_gl_entries(pe.name, expected_gle)
 
@@ -530,10 +612,11 @@
 
 	def test_payment_entry_against_sales_invoice_with_cost_centre(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
 
-		si =  create_sales_invoice_against_cost_center(cost_center=cost_center, debit_to="Debtors - _TC")
+		si = create_sales_invoice_against_cost_center(cost_center=cost_center, debit_to="Debtors - _TC")
 
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank - _TC")
 		self.assertEqual(pe.cost_center, si.cost_center)
@@ -546,18 +629,18 @@
 		pe.submit()
 
 		expected_values = {
-			"_Test Bank - _TC": {
-				"cost_center": cost_center
-			},
-			"Debtors - _TC": {
-				"cost_center": cost_center
-			}
+			"_Test Bank - _TC": {"cost_center": cost_center},
+			"Debtors - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Payment Entry' and voucher_no=%s
-			order by account asc""", pe.name, as_dict=1)
+			order by account asc""",
+			pe.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -566,10 +649,13 @@
 
 	def test_payment_entry_against_purchase_invoice_with_cost_center(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
 
-		pi =  make_purchase_invoice_against_cost_center(cost_center=cost_center, credit_to="Creditors - _TC")
+		pi = make_purchase_invoice_against_cost_center(
+			cost_center=cost_center, credit_to="Creditors - _TC"
+		)
 
 		pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank - _TC")
 		self.assertEqual(pe.cost_center, pi.cost_center)
@@ -582,18 +668,18 @@
 		pe.submit()
 
 		expected_values = {
-			"_Test Bank - _TC": {
-				"cost_center": cost_center
-			},
-			"Creditors - _TC": {
-				"cost_center": cost_center
-			}
+			"_Test Bank - _TC": {"cost_center": cost_center},
+			"Creditors - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Payment Entry' and voucher_no=%s
-			order by account asc""", pe.name, as_dict=1)
+			order by account asc""",
+			pe.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -603,13 +689,16 @@
 	def test_payment_entry_account_and_party_balance_with_cost_center(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
 		from erpnext.accounts.utils import get_balance_on
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
 
-		si =  create_sales_invoice_against_cost_center(cost_center=cost_center, debit_to="Debtors - _TC")
+		si = create_sales_invoice_against_cost_center(cost_center=cost_center, debit_to="Debtors - _TC")
 
 		account_balance = get_balance_on(account="_Test Bank - _TC", cost_center=si.cost_center)
-		party_balance = get_balance_on(party_type="Customer", party=si.customer, cost_center=si.cost_center)
+		party_balance = get_balance_on(
+			party_type="Customer", party=si.customer, cost_center=si.cost_center
+		)
 		party_account_balance = get_balance_on(si.debit_to, cost_center=si.cost_center)
 
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank - _TC")
@@ -634,94 +723,109 @@
 		self.assertEqual(flt(expected_party_account_balance), party_account_balance)
 
 	def test_multi_currency_payment_entry_with_taxes(self):
-		payment_entry = create_payment_entry(party='_Test Supplier USD', paid_to = '_Test Payable USD - _TC',
-			save=True)
-		payment_entry.append('taxes', {
-			'account_head': '_Test Account Service Tax - _TC',
-			'charge_type': 'Actual',
-			'tax_amount': 10,
-			'add_deduct_tax': 'Add',
-			'description': 'Test'
-		})
+		payment_entry = create_payment_entry(
+			party="_Test Supplier USD", paid_to="_Test Payable USD - _TC", save=True
+		)
+		payment_entry.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Service Tax - _TC",
+				"charge_type": "Actual",
+				"tax_amount": 10,
+				"add_deduct_tax": "Add",
+				"description": "Test",
+			},
+		)
 
 		payment_entry.save()
 		self.assertEqual(payment_entry.base_total_taxes_and_charges, 10)
-		self.assertEqual(flt(payment_entry.total_taxes_and_charges, 2), flt(10 / payment_entry.target_exchange_rate, 2))
+		self.assertEqual(
+			flt(payment_entry.total_taxes_and_charges, 2), flt(10 / payment_entry.target_exchange_rate, 2)
+		)
+
 
 def create_payment_entry(**args):
-	payment_entry = frappe.new_doc('Payment Entry')
-	payment_entry.company = args.get('company') or '_Test Company'
-	payment_entry.payment_type = args.get('payment_type') or 'Pay'
-	payment_entry.party_type = args.get('party_type') or 'Supplier'
-	payment_entry.party = args.get('party') or '_Test Supplier'
-	payment_entry.paid_from = args.get('paid_from') or '_Test Bank - _TC'
-	payment_entry.paid_to = args.get('paid_to') or 'Creditors - _TC'
-	payment_entry.paid_amount = args.get('paid_amount') or 1000
+	payment_entry = frappe.new_doc("Payment Entry")
+	payment_entry.company = args.get("company") or "_Test Company"
+	payment_entry.payment_type = args.get("payment_type") or "Pay"
+	payment_entry.party_type = args.get("party_type") or "Supplier"
+	payment_entry.party = args.get("party") or "_Test Supplier"
+	payment_entry.paid_from = args.get("paid_from") or "_Test Bank - _TC"
+	payment_entry.paid_to = args.get("paid_to") or "Creditors - _TC"
+	payment_entry.paid_amount = args.get("paid_amount") or 1000
 
 	payment_entry.setup_party_account_field()
 	payment_entry.set_missing_values()
 	payment_entry.set_exchange_rate()
 	payment_entry.received_amount = payment_entry.paid_amount / payment_entry.target_exchange_rate
-	payment_entry.reference_no = 'Test001'
+	payment_entry.reference_no = "Test001"
 	payment_entry.reference_date = nowdate()
 
-	if args.get('save'):
+	if args.get("save"):
 		payment_entry.save()
-		if args.get('submit'):
+		if args.get("submit"):
 			payment_entry.submit()
 
 	return payment_entry
 
+
 def create_payment_terms_template():
 
-	create_payment_term('Basic Amount Receivable')
-	create_payment_term('Tax Receivable')
+	create_payment_term("Basic Amount Receivable")
+	create_payment_term("Tax Receivable")
 
-	if not frappe.db.exists('Payment Terms Template', 'Test Receivable Template'):
-		payment_term_template = frappe.get_doc({
-			'doctype': 'Payment Terms Template',
-			'template_name': 'Test Receivable Template',
-			'allocate_payment_based_on_payment_terms': 1,
-			'terms': [{
-				'doctype': 'Payment Terms Template Detail',
-				'payment_term': 'Basic Amount Receivable',
-				'invoice_portion': 84.746,
-				'credit_days_based_on': 'Day(s) after invoice date',
-				'credit_days': 1
-			},
+	if not frappe.db.exists("Payment Terms Template", "Test Receivable Template"):
+		payment_term_template = frappe.get_doc(
 			{
-				'doctype': 'Payment Terms Template Detail',
-				'payment_term': 'Tax Receivable',
-				'invoice_portion': 15.254,
-				'credit_days_based_on': 'Day(s) after invoice date',
-				'credit_days': 2
-			}]
-		}).insert()
+				"doctype": "Payment Terms Template",
+				"template_name": "Test Receivable Template",
+				"allocate_payment_based_on_payment_terms": 1,
+				"terms": [
+					{
+						"doctype": "Payment Terms Template Detail",
+						"payment_term": "Basic Amount Receivable",
+						"invoice_portion": 84.746,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": 1,
+					},
+					{
+						"doctype": "Payment Terms Template Detail",
+						"payment_term": "Tax Receivable",
+						"invoice_portion": 15.254,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": 2,
+					},
+				],
+			}
+		).insert()
+
 
 def create_payment_terms_template_with_discount():
 
-	create_payment_term('30 Credit Days with 10% Discount')
+	create_payment_term("30 Credit Days with 10% Discount")
 
-	if not frappe.db.exists('Payment Terms Template', 'Test Discount Template'):
-		payment_term_template = frappe.get_doc({
-			'doctype': 'Payment Terms Template',
-			'template_name': 'Test Discount Template',
-			'allocate_payment_based_on_payment_terms': 1,
-			'terms': [{
-				'doctype': 'Payment Terms Template Detail',
-				'payment_term': '30 Credit Days with 10% Discount',
-				'invoice_portion': 100,
-				'credit_days_based_on': 'Day(s) after invoice date',
-				'credit_days': 2,
-				'discount': 10,
-				'discount_validity_based_on': 'Day(s) after invoice date',
-				'discount_validity': 1
-			}]
-		}).insert()
+	if not frappe.db.exists("Payment Terms Template", "Test Discount Template"):
+		payment_term_template = frappe.get_doc(
+			{
+				"doctype": "Payment Terms Template",
+				"template_name": "Test Discount Template",
+				"allocate_payment_based_on_payment_terms": 1,
+				"terms": [
+					{
+						"doctype": "Payment Terms Template Detail",
+						"payment_term": "30 Credit Days with 10% Discount",
+						"invoice_portion": 100,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": 2,
+						"discount": 10,
+						"discount_validity_based_on": "Day(s) after invoice date",
+						"discount_validity": 1,
+					}
+				],
+			}
+		).insert()
+
 
 def create_payment_term(name):
-	if not frappe.db.exists('Payment Term', name):
-		frappe.get_doc({
-			'doctype': 'Payment Term',
-			'payment_term_name': name
-		}).insert()
+	if not frappe.db.exists("Payment Term", name):
+		frappe.get_doc({"doctype": "Payment Term", "payment_term_name": name}).insert()
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 25dc4e6..ab47b61 100644
--- a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.py
+++ b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.py
@@ -18,10 +18,13 @@
 
 	def update_default_payment_gateway(self):
 		if self.is_default:
-			frappe.db.sql("""update `tabPayment Gateway Account` set is_default = 0
-				where is_default = 1 """)
+			frappe.db.sql(
+				"""update `tabPayment Gateway Account` set is_default = 0
+				where is_default = 1 """
+			)
 
 	def set_as_default_if_not_set(self):
-		if not frappe.db.get_value("Payment Gateway Account",
-			{"is_default": 1, "name": ("!=", self.name)}, "name"):
+		if not frappe.db.get_value(
+			"Payment Gateway Account", {"is_default": 1, "name": ("!=", self.name)}, "name"
+		):
 			self.is_default = 1
diff --git a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account_dashboard.py b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account_dashboard.py
index 3996892..d0aaee8 100644
--- a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account_dashboard.py
+++ b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account_dashboard.py
@@ -1,15 +1,6 @@
 def get_data():
 	return {
-		'fieldname': 'payment_gateway_account',
-		'non_standard_fieldnames': {
-			'Subscription Plan': 'payment_gateway'
-		},
-		'transactions': [
-			{
-				'items': ['Payment Request']
-			},
-			{
-				'items': ['Subscription Plan']
-			}
-		]
+		"fieldname": "payment_gateway_account",
+		"non_standard_fieldnames": {"Subscription Plan": "payment_gateway"},
+		"transactions": [{"items": ["Payment Request"]}, {"items": ["Subscription Plan"]}],
 	}
diff --git a/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py b/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py
index 1895c12..7a8cdf7 100644
--- a/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py
+++ b/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Payment Gateway Account')
 
+
 class TestPaymentGatewayAccount(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/payment_order/payment_order.py b/erpnext/accounts/doctype/payment_order/payment_order.py
index 50a58b8..3c45d20 100644
--- a/erpnext/accounts/doctype/payment_order/payment_order.py
+++ b/erpnext/accounts/doctype/payment_order/payment_order.py
@@ -18,9 +18,9 @@
 		self.update_payment_status(cancel=True)
 
 	def update_payment_status(self, cancel=False):
-		status = 'Payment Ordered'
+		status = "Payment Ordered"
 		if cancel:
-			status = 'Initiated'
+			status = "Initiated"
 
 		if self.payment_order_type == "Payment Request":
 			ref_field = "status"
@@ -32,67 +32,67 @@
 		for d in self.references:
 			frappe.db.set_value(self.payment_order_type, d.get(ref_doc_field), ref_field, status)
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_mop_query(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql(""" select mode_of_payment from `tabPayment Order Reference`
+	return frappe.db.sql(
+		""" select mode_of_payment from `tabPayment Order Reference`
 		where parent = %(parent)s and mode_of_payment like %(txt)s
-		limit %(start)s, %(page_len)s""", {
-			'parent': filters.get("parent"),
-			'start': start,
-			'page_len': page_len,
-			'txt': "%%%s%%" % txt
-		})
+		limit %(start)s, %(page_len)s""",
+		{"parent": filters.get("parent"), "start": start, "page_len": page_len, "txt": "%%%s%%" % txt},
+	)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_supplier_query(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql(""" select supplier from `tabPayment Order Reference`
+	return frappe.db.sql(
+		""" select supplier from `tabPayment Order Reference`
 		where parent = %(parent)s and supplier like %(txt)s and
 		(payment_reference is null or payment_reference='')
-		limit %(start)s, %(page_len)s""", {
-			'parent': filters.get("parent"),
-			'start': start,
-			'page_len': page_len,
-			'txt': "%%%s%%" % txt
-		})
+		limit %(start)s, %(page_len)s""",
+		{"parent": filters.get("parent"), "start": start, "page_len": page_len, "txt": "%%%s%%" % txt},
+	)
+
 
 @frappe.whitelist()
 def make_payment_records(name, supplier, mode_of_payment=None):
-	doc = frappe.get_doc('Payment Order', name)
+	doc = frappe.get_doc("Payment Order", name)
 	make_journal_entry(doc, supplier, mode_of_payment)
 
+
 def make_journal_entry(doc, supplier, mode_of_payment=None):
-	je = frappe.new_doc('Journal Entry')
+	je = frappe.new_doc("Journal Entry")
 	je.payment_order = doc.name
 	je.posting_date = nowdate()
-	mode_of_payment_type = frappe._dict(frappe.get_all('Mode of Payment',
-		fields = ["name", "type"], as_list=1))
+	mode_of_payment_type = frappe._dict(
+		frappe.get_all("Mode of Payment", fields=["name", "type"], as_list=1)
+	)
 
-	je.voucher_type = 'Bank Entry'
-	if mode_of_payment and mode_of_payment_type.get(mode_of_payment) == 'Cash':
+	je.voucher_type = "Bank Entry"
+	if mode_of_payment and mode_of_payment_type.get(mode_of_payment) == "Cash":
 		je.voucher_type = "Cash Entry"
 
 	paid_amt = 0
-	party_account = get_party_account('Supplier', supplier, doc.company)
+	party_account = get_party_account("Supplier", supplier, doc.company)
 	for d in doc.references:
-		if (d.supplier == supplier
-			and (not mode_of_payment or mode_of_payment == d.mode_of_payment)):
-			je.append('accounts', {
-				'account': party_account,
-				'debit_in_account_currency': d.amount,
-				'party_type': 'Supplier',
-				'party': supplier,
-				'reference_type': d.reference_doctype,
-				'reference_name': d.reference_name
-			})
+		if d.supplier == supplier and (not mode_of_payment or mode_of_payment == d.mode_of_payment):
+			je.append(
+				"accounts",
+				{
+					"account": party_account,
+					"debit_in_account_currency": d.amount,
+					"party_type": "Supplier",
+					"party": supplier,
+					"reference_type": d.reference_doctype,
+					"reference_name": d.reference_name,
+				},
+			)
 
 			paid_amt += d.amount
 
-	je.append('accounts', {
-		'account': doc.account,
-		'credit_in_account_currency': paid_amt
-	})
+	je.append("accounts", {"account": doc.account, "credit_in_account_currency": paid_amt})
 
 	je.flags.ignore_mandatory = True
 	je.save()
diff --git a/erpnext/accounts/doctype/payment_order/payment_order_dashboard.py b/erpnext/accounts/doctype/payment_order/payment_order_dashboard.py
index 37bbaec..f82886e 100644
--- a/erpnext/accounts/doctype/payment_order/payment_order_dashboard.py
+++ b/erpnext/accounts/doctype/payment_order/payment_order_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
 	return {
-		'fieldname': 'payment_order',
-		'transactions': [
-			{
-				'items': ['Payment Entry', 'Journal Entry']
-			}
-		]
+		"fieldname": "payment_order",
+		"transactions": [{"items": ["Payment Entry", "Journal Entry"]}],
 	}
diff --git a/erpnext/accounts/doctype/payment_order/test_payment_order.py b/erpnext/accounts/doctype/payment_order/test_payment_order.py
index 3f4d89b..0dcb179 100644
--- a/erpnext/accounts/doctype/payment_order/test_payment_order.py
+++ b/erpnext/accounts/doctype/payment_order/test_payment_order.py
@@ -26,7 +26,9 @@
 
 	def test_payment_order_creation_against_payment_entry(self):
 		purchase_invoice = make_purchase_invoice()
-		payment_entry = get_payment_entry("Purchase Invoice", purchase_invoice.name, bank_account="_Test Bank - _TC")
+		payment_entry = get_payment_entry(
+			"Purchase Invoice", purchase_invoice.name, bank_account="_Test Bank - _TC"
+		)
 		payment_entry.reference_no = "_Test_Payment_Order"
 		payment_entry.reference_date = getdate()
 		payment_entry.party_bank_account = "Checking Account - Citi Bank"
@@ -40,13 +42,16 @@
 		self.assertEqual(reference_doc.supplier, "_Test Supplier")
 		self.assertEqual(reference_doc.amount, 250)
 
+
 def create_payment_order_against_payment_entry(ref_doc, order_type):
-	payment_order = frappe.get_doc(dict(
-		doctype="Payment Order",
-		company="_Test Company",
-		payment_order_type=order_type,
-		company_bank_account="Checking Account - Citi Bank"
-	))
+	payment_order = frappe.get_doc(
+		dict(
+			doctype="Payment Order",
+			company="_Test Company",
+			payment_order_type=order_type,
+			company_bank_account="Checking Account - Citi Bank",
+		)
+	)
 	doc = make_payment_order(ref_doc.name, payment_order)
 	doc.save()
 	doc.submit()
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
index 548571d..907b769 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
@@ -32,30 +32,43 @@
 		non_reconciled_payments = payment_entries + journal_entries + dr_or_cr_notes
 
 		if self.payment_limit:
-			non_reconciled_payments = non_reconciled_payments[:self.payment_limit]
+			non_reconciled_payments = non_reconciled_payments[: self.payment_limit]
 
-		non_reconciled_payments = sorted(non_reconciled_payments, key=lambda k: k['posting_date'] or getdate(nowdate()))
+		non_reconciled_payments = sorted(
+			non_reconciled_payments, key=lambda k: k["posting_date"] or getdate(nowdate())
+		)
 
 		self.add_payment_entries(non_reconciled_payments)
 
 	def get_payment_entries(self):
-		order_doctype = "Sales Order" if self.party_type=="Customer" else "Purchase Order"
+		order_doctype = "Sales Order" if self.party_type == "Customer" else "Purchase Order"
 		condition = self.get_conditions(get_payments=True)
-		payment_entries = get_advance_payment_entries(self.party_type, self.party,
-			self.receivable_payable_account, order_doctype, against_all_orders=True, limit=self.payment_limit,
-			condition=condition)
+		payment_entries = get_advance_payment_entries(
+			self.party_type,
+			self.party,
+			self.receivable_payable_account,
+			order_doctype,
+			against_all_orders=True,
+			limit=self.payment_limit,
+			condition=condition,
+		)
 
 		return payment_entries
 
 	def get_jv_entries(self):
 		condition = self.get_conditions()
-		dr_or_cr = ("credit_in_account_currency" if erpnext.get_party_account_type(self.party_type) == 'Receivable'
-			else "debit_in_account_currency")
+		dr_or_cr = (
+			"credit_in_account_currency"
+			if erpnext.get_party_account_type(self.party_type) == "Receivable"
+			else "debit_in_account_currency"
+		)
 
-		bank_account_condition = "t2.against_account like %(bank_cash_account)s" \
-				if self.bank_cash_account else "1=1"
+		bank_account_condition = (
+			"t2.against_account like %(bank_cash_account)s" if self.bank_cash_account else "1=1"
+		)
 
-		journal_entries = frappe.db.sql("""
+		journal_entries = frappe.db.sql(
+			"""
 			select
 				"Journal Entry" as reference_type, t1.name as reference_name,
 				t1.posting_date, t1.remark as remarks, t2.name as reference_row,
@@ -76,31 +89,42 @@
 					ELSE {bank_account_condition}
 				END)
 			order by t1.posting_date
-			""".format(**{
-				"dr_or_cr": dr_or_cr,
-				"bank_account_condition": bank_account_condition,
-				"condition": condition
-			}), {
+			""".format(
+				**{
+					"dr_or_cr": dr_or_cr,
+					"bank_account_condition": bank_account_condition,
+					"condition": condition,
+				}
+			),
+			{
 				"party_type": self.party_type,
 				"party": self.party,
 				"account": self.receivable_payable_account,
-				"bank_cash_account": "%%%s%%" % self.bank_cash_account
-			}, as_dict=1)
+				"bank_cash_account": "%%%s%%" % self.bank_cash_account,
+			},
+			as_dict=1,
+		)
 
 		return list(journal_entries)
 
 	def get_dr_or_cr_notes(self):
 		condition = self.get_conditions(get_return_invoices=True)
-		dr_or_cr = ("credit_in_account_currency"
-			if erpnext.get_party_account_type(self.party_type) == 'Receivable' else "debit_in_account_currency")
+		dr_or_cr = (
+			"credit_in_account_currency"
+			if erpnext.get_party_account_type(self.party_type) == "Receivable"
+			else "debit_in_account_currency"
+		)
 
-		reconciled_dr_or_cr =  ("debit_in_account_currency"
-			if dr_or_cr == "credit_in_account_currency" else "credit_in_account_currency")
+		reconciled_dr_or_cr = (
+			"debit_in_account_currency"
+			if dr_or_cr == "credit_in_account_currency"
+			else "credit_in_account_currency"
+		)
 
-		voucher_type = ('Sales Invoice'
-			if self.party_type == 'Customer' else "Purchase Invoice")
+		voucher_type = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
 
-		return frappe.db.sql(""" SELECT doc.name as reference_name, %(voucher_type)s as reference_type,
+		return frappe.db.sql(
+			""" SELECT doc.name as reference_name, %(voucher_type)s as reference_type,
 				(sum(gl.{dr_or_cr}) - sum(gl.{reconciled_dr_or_cr})) as amount, doc.posting_date,
 				account_currency as currency
 			FROM `tab{doc}` doc, `tabGL Entry` gl
@@ -117,106 +141,115 @@
 				amount > 0
 			ORDER BY doc.posting_date
 		""".format(
-			doc=voucher_type,
-			dr_or_cr=dr_or_cr,
-			reconciled_dr_or_cr=reconciled_dr_or_cr,
-			party_type_field=frappe.scrub(self.party_type),
-			condition=condition or ""),
+				doc=voucher_type,
+				dr_or_cr=dr_or_cr,
+				reconciled_dr_or_cr=reconciled_dr_or_cr,
+				party_type_field=frappe.scrub(self.party_type),
+				condition=condition or "",
+			),
 			{
-				'party': self.party,
-				'party_type': self.party_type,
-				'voucher_type': voucher_type,
-				'account': self.receivable_payable_account
-			}, as_dict=1)
+				"party": self.party,
+				"party_type": self.party_type,
+				"voucher_type": voucher_type,
+				"account": self.receivable_payable_account,
+			},
+			as_dict=1,
+		)
 
 	def add_payment_entries(self, non_reconciled_payments):
-		self.set('payments', [])
+		self.set("payments", [])
 
 		for payment in non_reconciled_payments:
-			row = self.append('payments', {})
+			row = self.append("payments", {})
 			row.update(payment)
 
 	def get_invoice_entries(self):
-		#Fetch JVs, Sales and Purchase Invoices for 'invoices' to reconcile against
+		# Fetch JVs, Sales and Purchase Invoices for 'invoices' to reconcile against
 
 		condition = self.get_conditions(get_invoices=True)
 
-		non_reconciled_invoices = get_outstanding_invoices(self.party_type, self.party,
-			self.receivable_payable_account, condition=condition)
+		non_reconciled_invoices = get_outstanding_invoices(
+			self.party_type, self.party, self.receivable_payable_account, condition=condition
+		)
 
 		if self.invoice_limit:
-			non_reconciled_invoices = non_reconciled_invoices[:self.invoice_limit]
+			non_reconciled_invoices = non_reconciled_invoices[: self.invoice_limit]
 
 		self.add_invoice_entries(non_reconciled_invoices)
 
 	def add_invoice_entries(self, non_reconciled_invoices):
-		#Populate 'invoices' with JVs and Invoices to reconcile against
-		self.set('invoices', [])
+		# Populate 'invoices' with JVs and Invoices to reconcile against
+		self.set("invoices", [])
 
 		for entry in non_reconciled_invoices:
-			inv = self.append('invoices', {})
-			inv.invoice_type = entry.get('voucher_type')
-			inv.invoice_number = entry.get('voucher_no')
-			inv.invoice_date = entry.get('posting_date')
-			inv.amount = flt(entry.get('invoice_amount'))
-			inv.currency = entry.get('currency')
-			inv.outstanding_amount = flt(entry.get('outstanding_amount'))
+			inv = self.append("invoices", {})
+			inv.invoice_type = entry.get("voucher_type")
+			inv.invoice_number = entry.get("voucher_no")
+			inv.invoice_date = entry.get("posting_date")
+			inv.amount = flt(entry.get("invoice_amount"))
+			inv.currency = entry.get("currency")
+			inv.outstanding_amount = flt(entry.get("outstanding_amount"))
 
 	@frappe.whitelist()
 	def allocate_entries(self, args):
 		self.validate_entries()
 		entries = []
-		for pay in args.get('payments'):
-			pay.update({'unreconciled_amount': pay.get('amount')})
-			for inv in args.get('invoices'):
-				if pay.get('amount') >= inv.get('outstanding_amount'):
-					res = self.get_allocated_entry(pay, inv, inv['outstanding_amount'])
-					pay['amount'] = flt(pay.get('amount')) - flt(inv.get('outstanding_amount'))
-					inv['outstanding_amount'] = 0
+		for pay in args.get("payments"):
+			pay.update({"unreconciled_amount": pay.get("amount")})
+			for inv in args.get("invoices"):
+				if pay.get("amount") >= inv.get("outstanding_amount"):
+					res = self.get_allocated_entry(pay, inv, inv["outstanding_amount"])
+					pay["amount"] = flt(pay.get("amount")) - flt(inv.get("outstanding_amount"))
+					inv["outstanding_amount"] = 0
 				else:
-					res = self.get_allocated_entry(pay, inv, pay['amount'])
-					inv['outstanding_amount'] = flt(inv.get('outstanding_amount')) - flt(pay.get('amount'))
-					pay['amount'] = 0
-				if pay.get('amount') == 0:
+					res = self.get_allocated_entry(pay, inv, pay["amount"])
+					inv["outstanding_amount"] = flt(inv.get("outstanding_amount")) - flt(pay.get("amount"))
+					pay["amount"] = 0
+				if pay.get("amount") == 0:
 					entries.append(res)
 					break
-				elif inv.get('outstanding_amount') == 0:
+				elif inv.get("outstanding_amount") == 0:
 					entries.append(res)
 					continue
 			else:
 				break
 
-		self.set('allocation', [])
+		self.set("allocation", [])
 		for entry in entries:
-			if entry['allocated_amount'] != 0:
-				row = self.append('allocation', {})
+			if entry["allocated_amount"] != 0:
+				row = self.append("allocation", {})
 				row.update(entry)
 
 	def get_allocated_entry(self, pay, inv, allocated_amount):
-		return frappe._dict({
-			'reference_type': pay.get('reference_type'),
-			'reference_name': pay.get('reference_name'),
-			'reference_row': pay.get('reference_row'),
-			'invoice_type': inv.get('invoice_type'),
-			'invoice_number': inv.get('invoice_number'),
-			'unreconciled_amount': pay.get('unreconciled_amount'),
-			'amount': pay.get('amount'),
-			'allocated_amount': allocated_amount,
-			'difference_amount': pay.get('difference_amount')
-		})
+		return frappe._dict(
+			{
+				"reference_type": pay.get("reference_type"),
+				"reference_name": pay.get("reference_name"),
+				"reference_row": pay.get("reference_row"),
+				"invoice_type": inv.get("invoice_type"),
+				"invoice_number": inv.get("invoice_number"),
+				"unreconciled_amount": pay.get("unreconciled_amount"),
+				"amount": pay.get("amount"),
+				"allocated_amount": allocated_amount,
+				"difference_amount": pay.get("difference_amount"),
+			}
+		)
 
 	@frappe.whitelist()
 	def reconcile(self):
 		self.validate_allocation()
-		dr_or_cr = ("credit_in_account_currency"
-			if erpnext.get_party_account_type(self.party_type) == 'Receivable' else "debit_in_account_currency")
+		dr_or_cr = (
+			"credit_in_account_currency"
+			if erpnext.get_party_account_type(self.party_type) == "Receivable"
+			else "debit_in_account_currency"
+		)
 
 		entry_list = []
 		dr_or_cr_notes = []
-		for row in self.get('allocation'):
+		for row in self.get("allocation"):
 			reconciled_entry = []
 			if row.invoice_number and row.allocated_amount:
-				if row.reference_type in ['Sales Invoice', 'Purchase Invoice']:
+				if row.reference_type in ["Sales Invoice", "Purchase Invoice"]:
 					reconciled_entry = dr_or_cr_notes
 				else:
 					reconciled_entry = entry_list
@@ -233,23 +266,25 @@
 		self.get_unreconciled_entries()
 
 	def get_payment_details(self, row, dr_or_cr):
-		return frappe._dict({
-			'voucher_type': row.get('reference_type'),
-			'voucher_no' : row.get('reference_name'),
-			'voucher_detail_no' : row.get('reference_row'),
-			'against_voucher_type' : row.get('invoice_type'),
-			'against_voucher'  : row.get('invoice_number'),
-			'account' : self.receivable_payable_account,
-			'party_type': self.party_type,
-			'party': self.party,
-			'is_advance' : row.get('is_advance'),
-			'dr_or_cr' : dr_or_cr,
-			'unreconciled_amount': flt(row.get('unreconciled_amount')),
-			'unadjusted_amount' : flt(row.get('amount')),
-			'allocated_amount' : flt(row.get('allocated_amount')),
-			'difference_amount': flt(row.get('difference_amount')),
-			'difference_account': row.get('difference_account')
-		})
+		return frappe._dict(
+			{
+				"voucher_type": row.get("reference_type"),
+				"voucher_no": row.get("reference_name"),
+				"voucher_detail_no": row.get("reference_row"),
+				"against_voucher_type": row.get("invoice_type"),
+				"against_voucher": row.get("invoice_number"),
+				"account": self.receivable_payable_account,
+				"party_type": self.party_type,
+				"party": self.party,
+				"is_advance": row.get("is_advance"),
+				"dr_or_cr": dr_or_cr,
+				"unreconciled_amount": flt(row.get("unreconciled_amount")),
+				"unadjusted_amount": flt(row.get("amount")),
+				"allocated_amount": flt(row.get("allocated_amount")),
+				"difference_amount": flt(row.get("difference_amount")),
+				"difference_account": row.get("difference_account"),
+			}
+		)
 
 	def check_mandatory_to_fetch(self):
 		for fieldname in ["company", "party_type", "party", "receivable_payable_account"]:
@@ -267,7 +302,9 @@
 		unreconciled_invoices = frappe._dict()
 
 		for inv in self.get("invoices"):
-			unreconciled_invoices.setdefault(inv.invoice_type, {}).setdefault(inv.invoice_number, inv.outstanding_amount)
+			unreconciled_invoices.setdefault(inv.invoice_type, {}).setdefault(
+				inv.invoice_number, inv.outstanding_amount
+			)
 
 		invoices_to_reconcile = []
 		for row in self.get("allocation"):
@@ -275,13 +312,19 @@
 				invoices_to_reconcile.append(row.invoice_number)
 
 				if flt(row.amount) - flt(row.allocated_amount) < 0:
-					frappe.throw(_("Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}")
-						.format(row.idx, row.allocated_amount, row.amount))
+					frappe.throw(
+						_(
+							"Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}"
+						).format(row.idx, row.allocated_amount, row.amount)
+					)
 
 				invoice_outstanding = unreconciled_invoices.get(row.invoice_type, {}).get(row.invoice_number)
 				if flt(row.allocated_amount) - invoice_outstanding > 0.009:
-					frappe.throw(_("Row {0}: Allocated amount {1} must be less than or equal to invoice outstanding amount {2}")
-						.format(row.idx, row.allocated_amount, invoice_outstanding))
+					frappe.throw(
+						_(
+							"Row {0}: Allocated amount {1} must be less than or equal to invoice outstanding amount {2}"
+						).format(row.idx, row.allocated_amount, invoice_outstanding)
+					)
 
 		if not invoices_to_reconcile:
 			frappe.throw(_("No records found in Allocation table"))
@@ -290,10 +333,21 @@
 		condition = " and company = '{0}' ".format(self.company)
 
 		if get_invoices:
-			condition += " and posting_date >= {0}".format(frappe.db.escape(self.from_invoice_date)) if self.from_invoice_date else ""
-			condition += " and posting_date <= {0}".format(frappe.db.escape(self.to_invoice_date)) if self.to_invoice_date else ""
-			dr_or_cr = ("debit_in_account_currency" if erpnext.get_party_account_type(self.party_type) == 'Receivable'
-				else "credit_in_account_currency")
+			condition += (
+				" and posting_date >= {0}".format(frappe.db.escape(self.from_invoice_date))
+				if self.from_invoice_date
+				else ""
+			)
+			condition += (
+				" and posting_date <= {0}".format(frappe.db.escape(self.to_invoice_date))
+				if self.to_invoice_date
+				else ""
+			)
+			dr_or_cr = (
+				"debit_in_account_currency"
+				if erpnext.get_party_account_type(self.party_type) == "Receivable"
+				else "credit_in_account_currency"
+			)
 
 			if self.minimum_invoice_amount:
 				condition += " and `{0}` >= {1}".format(dr_or_cr, flt(self.minimum_invoice_amount))
@@ -302,10 +356,21 @@
 
 		elif get_return_invoices:
 			condition = " and doc.company = '{0}' ".format(self.company)
-			condition += " and doc.posting_date >= {0}".format(frappe.db.escape(self.from_payment_date)) if self.from_payment_date else ""
-			condition += " and doc.posting_date <= {0}".format(frappe.db.escape(self.to_payment_date)) if self.to_payment_date else ""
-			dr_or_cr = ("gl.debit_in_account_currency" if erpnext.get_party_account_type(self.party_type) == 'Receivable'
-				else "gl.credit_in_account_currency")
+			condition += (
+				" and doc.posting_date >= {0}".format(frappe.db.escape(self.from_payment_date))
+				if self.from_payment_date
+				else ""
+			)
+			condition += (
+				" and doc.posting_date <= {0}".format(frappe.db.escape(self.to_payment_date))
+				if self.to_payment_date
+				else ""
+			)
+			dr_or_cr = (
+				"gl.debit_in_account_currency"
+				if erpnext.get_party_account_type(self.party_type) == "Receivable"
+				else "gl.credit_in_account_currency"
+			)
 
 			if self.minimum_invoice_amount:
 				condition += " and `{0}` >= {1}".format(dr_or_cr, flt(self.minimum_payment_amount))
@@ -313,55 +378,77 @@
 				condition += " and `{0}` <= {1}".format(dr_or_cr, flt(self.maximum_payment_amount))
 
 		else:
-			condition += " and posting_date >= {0}".format(frappe.db.escape(self.from_payment_date)) if self.from_payment_date else ""
-			condition += " and posting_date <= {0}".format(frappe.db.escape(self.to_payment_date)) if self.to_payment_date else ""
+			condition += (
+				" and posting_date >= {0}".format(frappe.db.escape(self.from_payment_date))
+				if self.from_payment_date
+				else ""
+			)
+			condition += (
+				" and posting_date <= {0}".format(frappe.db.escape(self.to_payment_date))
+				if self.to_payment_date
+				else ""
+			)
 
 			if self.minimum_payment_amount:
-				condition += " and unallocated_amount >= {0}".format(flt(self.minimum_payment_amount)) if get_payments \
+				condition += (
+					" and unallocated_amount >= {0}".format(flt(self.minimum_payment_amount))
+					if get_payments
 					else " and total_debit >= {0}".format(flt(self.minimum_payment_amount))
+				)
 			if self.maximum_payment_amount:
-				condition += " and unallocated_amount <= {0}".format(flt(self.maximum_payment_amount)) if get_payments \
+				condition += (
+					" and unallocated_amount <= {0}".format(flt(self.maximum_payment_amount))
+					if get_payments
 					else " and total_debit <= {0}".format(flt(self.maximum_payment_amount))
+				)
 
 		return condition
 
+
 def reconcile_dr_cr_note(dr_cr_notes, company):
 	for inv in dr_cr_notes:
-		voucher_type = ('Credit Note'
-			if inv.voucher_type == 'Sales Invoice' else 'Debit Note')
+		voucher_type = "Credit Note" if inv.voucher_type == "Sales Invoice" else "Debit Note"
 
-		reconcile_dr_or_cr = ('debit_in_account_currency'
-			if inv.dr_or_cr == 'credit_in_account_currency' else 'credit_in_account_currency')
+		reconcile_dr_or_cr = (
+			"debit_in_account_currency"
+			if inv.dr_or_cr == "credit_in_account_currency"
+			else "credit_in_account_currency"
+		)
 
 		company_currency = erpnext.get_company_currency(company)
 
-		jv = frappe.get_doc({
-			"doctype": "Journal Entry",
-			"voucher_type": voucher_type,
-			"posting_date": today(),
-			"company": company,
-			"multi_currency": 1 if inv.currency != company_currency else 0,
-			"accounts": [
-				{
-					'account': inv.account,
-					'party': inv.party,
-					'party_type': inv.party_type,
-					inv.dr_or_cr: abs(inv.allocated_amount),
-					'reference_type': inv.against_voucher_type,
-					'reference_name': inv.against_voucher,
-					'cost_center': erpnext.get_default_cost_center(company)
-				},
-				{
-					'account': inv.account,
-					'party': inv.party,
-					'party_type': inv.party_type,
-					reconcile_dr_or_cr: (abs(inv.allocated_amount)
-						if abs(inv.unadjusted_amount) > abs(inv.allocated_amount) else abs(inv.unadjusted_amount)),
-					'reference_type': inv.voucher_type,
-					'reference_name': inv.voucher_no,
-					'cost_center': erpnext.get_default_cost_center(company)
-				}
-			]
-		})
+		jv = frappe.get_doc(
+			{
+				"doctype": "Journal Entry",
+				"voucher_type": voucher_type,
+				"posting_date": today(),
+				"company": company,
+				"multi_currency": 1 if inv.currency != company_currency else 0,
+				"accounts": [
+					{
+						"account": inv.account,
+						"party": inv.party,
+						"party_type": inv.party_type,
+						inv.dr_or_cr: abs(inv.allocated_amount),
+						"reference_type": inv.against_voucher_type,
+						"reference_name": inv.against_voucher,
+						"cost_center": erpnext.get_default_cost_center(company),
+					},
+					{
+						"account": inv.account,
+						"party": inv.party,
+						"party_type": inv.party_type,
+						reconcile_dr_or_cr: (
+							abs(inv.allocated_amount)
+							if abs(inv.unadjusted_amount) > abs(inv.allocated_amount)
+							else abs(inv.unadjusted_amount)
+						),
+						"reference_type": inv.voucher_type,
+						"reference_name": inv.voucher_no,
+						"cost_center": erpnext.get_default_cost_center(company),
+					},
+				],
+			}
+		)
 		jv.flags.ignore_mandatory = True
 		jv.submit()
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py
index d72d8f7..5264987 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/payment_request.py
@@ -24,7 +24,7 @@
 class PaymentRequest(Document):
 	def validate(self):
 		if self.get("__islocal"):
-			self.status = 'Draft'
+			self.status = "Draft"
 		self.validate_reference_document()
 		self.validate_payment_request_amount()
 		self.validate_currency()
@@ -35,51 +35,67 @@
 			frappe.throw(_("To create a Payment Request reference document is required"))
 
 	def validate_payment_request_amount(self):
-		existing_payment_request_amount = \
-			get_existing_payment_request_amount(self.reference_doctype, self.reference_name)
+		existing_payment_request_amount = get_existing_payment_request_amount(
+			self.reference_doctype, self.reference_name
+		)
 
 		if existing_payment_request_amount:
 			ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
-			if (hasattr(ref_doc, "order_type") \
-					and getattr(ref_doc, "order_type") != "Shopping Cart"):
+			if hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") != "Shopping Cart":
 				ref_amount = get_amount(ref_doc, self.payment_account)
 
-				if existing_payment_request_amount + flt(self.grand_total)> ref_amount:
-					frappe.throw(_("Total Payment Request amount cannot be greater than {0} amount")
-						.format(self.reference_doctype))
+				if existing_payment_request_amount + flt(self.grand_total) > ref_amount:
+					frappe.throw(
+						_("Total Payment Request amount cannot be greater than {0} amount").format(
+							self.reference_doctype
+						)
+					)
 
 	def validate_currency(self):
 		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
-		if self.payment_account and ref_doc.currency != frappe.db.get_value("Account", self.payment_account, "account_currency"):
+		if self.payment_account and ref_doc.currency != frappe.db.get_value(
+			"Account", self.payment_account, "account_currency"
+		):
 			frappe.throw(_("Transaction currency must be same as Payment Gateway currency"))
 
 	def validate_subscription_details(self):
 		if self.is_a_subscription:
 			amount = 0
 			for subscription_plan in self.subscription_plans:
-				payment_gateway = frappe.db.get_value("Subscription Plan", subscription_plan.plan, "payment_gateway")
+				payment_gateway = frappe.db.get_value(
+					"Subscription Plan", subscription_plan.plan, "payment_gateway"
+				)
 				if payment_gateway != self.payment_gateway_account:
-					frappe.throw(_('The payment gateway account in plan {0} is different from the payment gateway account in this payment request').format(subscription_plan.name))
+					frappe.throw(
+						_(
+							"The payment gateway account in plan {0} is different from the payment gateway account in this payment request"
+						).format(subscription_plan.name)
+					)
 
 				rate = get_plan_rate(subscription_plan.plan, quantity=subscription_plan.qty)
 
 				amount += rate
 
 			if amount != self.grand_total:
-				frappe.msgprint(_("The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document.").format(self.grand_total, amount))
+				frappe.msgprint(
+					_(
+						"The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document."
+					).format(self.grand_total, amount)
+				)
 
 	def on_submit(self):
-		if self.payment_request_type == 'Outward':
-			self.db_set('status', 'Initiated')
+		if self.payment_request_type == "Outward":
+			self.db_set("status", "Initiated")
 			return
-		elif self.payment_request_type == 'Inward':
-			self.db_set('status', 'Requested')
+		elif self.payment_request_type == "Inward":
+			self.db_set("status", "Requested")
 
 		send_mail = self.payment_gateway_validation() if self.payment_gateway else None
 		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
 
-		if (hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") == "Shopping Cart") \
-			or self.flags.mute_email:
+		if (
+			hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") == "Shopping Cart"
+		) or self.flags.mute_email:
 			send_mail = False
 
 		if send_mail and self.payment_channel != "Phone":
@@ -101,23 +117,27 @@
 			request_amount=request_amount,
 			sender=self.email_to,
 			currency=self.currency,
-			payment_gateway=self.payment_gateway
+			payment_gateway=self.payment_gateway,
 		)
 
 		controller.validate_transaction_currency(self.currency)
 		controller.request_for_payment(**payment_record)
 
 	def get_request_amount(self):
-		data_of_completed_requests = frappe.get_all("Integration Request", filters={
-			'reference_doctype': self.doctype,
-			'reference_docname': self.name,
-			'status': 'Completed'
-		}, pluck="data")
+		data_of_completed_requests = frappe.get_all(
+			"Integration Request",
+			filters={
+				"reference_doctype": self.doctype,
+				"reference_docname": self.name,
+				"status": "Completed",
+			},
+			pluck="data",
+		)
 
 		if not data_of_completed_requests:
 			return self.grand_total
 
-		request_amounts = sum(json.loads(d).get('request_amount') for d in data_of_completed_requests)
+		request_amounts = sum(json.loads(d).get("request_amount") for d in data_of_completed_requests)
 		return request_amounts
 
 	def on_cancel(self):
@@ -126,8 +146,9 @@
 
 	def make_invoice(self):
 		ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
-		if (hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") == "Shopping Cart"):
+		if hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") == "Shopping Cart":
 			from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice
+
 			si = make_sales_invoice(self.reference_name, ignore_permissions=True)
 			si.allocate_advances_automatically = True
 			si = si.insert(ignore_permissions=True)
@@ -136,7 +157,7 @@
 	def payment_gateway_validation(self):
 		try:
 			controller = get_payment_gateway_controller(self.payment_gateway)
-			if hasattr(controller, 'on_payment_request_submission'):
+			if hasattr(controller, "on_payment_request_submission"):
 				return controller.on_payment_request_submission(self)
 			else:
 				return True
@@ -148,36 +169,45 @@
 			self.payment_url = self.get_payment_url()
 
 		if self.payment_url:
-			self.db_set('payment_url', self.payment_url)
+			self.db_set("payment_url", self.payment_url)
 
-		if self.payment_url or not self.payment_gateway_account \
-			or (self.payment_gateway_account and self.payment_channel == "Phone"):
-			self.db_set('status', 'Initiated')
+		if (
+			self.payment_url
+			or not self.payment_gateway_account
+			or (self.payment_gateway_account and self.payment_channel == "Phone")
+		):
+			self.db_set("status", "Initiated")
 
 	def get_payment_url(self):
 		if self.reference_doctype != "Fees":
-			data = frappe.db.get_value(self.reference_doctype, self.reference_name, ["company", "customer_name"], as_dict=1)
+			data = frappe.db.get_value(
+				self.reference_doctype, self.reference_name, ["company", "customer_name"], as_dict=1
+			)
 		else:
-			data = frappe.db.get_value(self.reference_doctype, self.reference_name, ["student_name"], as_dict=1)
+			data = frappe.db.get_value(
+				self.reference_doctype, self.reference_name, ["student_name"], as_dict=1
+			)
 			data.update({"company": frappe.defaults.get_defaults().company})
 
 		controller = get_payment_gateway_controller(self.payment_gateway)
 		controller.validate_transaction_currency(self.currency)
 
-		if hasattr(controller, 'validate_minimum_transaction_amount'):
+		if hasattr(controller, "validate_minimum_transaction_amount"):
 			controller.validate_minimum_transaction_amount(self.currency, self.grand_total)
 
-		return controller.get_payment_url(**{
-			"amount": flt(self.grand_total, self.precision("grand_total")),
-			"title": data.company.encode("utf-8"),
-			"description": self.subject.encode("utf-8"),
-			"reference_doctype": "Payment Request",
-			"reference_docname": self.name,
-			"payer_email": self.email_to or frappe.session.user,
-			"payer_name": frappe.safe_encode(data.customer_name),
-			"order_id": self.name,
-			"currency": self.currency
-		})
+		return controller.get_payment_url(
+			**{
+				"amount": flt(self.grand_total, self.precision("grand_total")),
+				"title": data.company.encode("utf-8"),
+				"description": self.subject.encode("utf-8"),
+				"reference_doctype": "Payment Request",
+				"reference_docname": self.name,
+				"payer_email": self.email_to or frappe.session.user,
+				"payer_name": frappe.safe_encode(data.customer_name),
+				"order_id": self.name,
+				"currency": self.currency,
+			}
+		)
 
 	def set_as_paid(self):
 		if self.payment_channel == "Phone":
@@ -202,32 +232,47 @@
 		else:
 			party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company)
 
-		party_account_currency = ref_doc.get("party_account_currency") or get_account_currency(party_account)
+		party_account_currency = ref_doc.get("party_account_currency") or get_account_currency(
+			party_account
+		)
 
 		bank_amount = self.grand_total
-		if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency:
+		if (
+			party_account_currency == ref_doc.company_currency and party_account_currency != self.currency
+		):
 			party_amount = ref_doc.base_grand_total
 		else:
 			party_amount = self.grand_total
 
-		payment_entry = get_payment_entry(self.reference_doctype, self.reference_name, party_amount=party_amount,
-			bank_account=self.payment_account, bank_amount=bank_amount)
+		payment_entry = get_payment_entry(
+			self.reference_doctype,
+			self.reference_name,
+			party_amount=party_amount,
+			bank_account=self.payment_account,
+			bank_amount=bank_amount,
+		)
 
-		payment_entry.update({
-			"reference_no": self.name,
-			"reference_date": nowdate(),
-			"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format(self.reference_doctype,
-				self.reference_name, self.name)
-		})
+		payment_entry.update(
+			{
+				"reference_no": self.name,
+				"reference_date": nowdate(),
+				"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format(
+					self.reference_doctype, self.reference_name, self.name
+				),
+			}
+		)
 
 		if payment_entry.difference_amount:
 			company_details = get_company_defaults(ref_doc.company)
 
-			payment_entry.append("deductions", {
-				"account": company_details.exchange_gain_loss_account,
-				"cost_center": company_details.cost_center,
-				"amount": payment_entry.difference_amount
-			})
+			payment_entry.append(
+				"deductions",
+				{
+					"account": company_details.exchange_gain_loss_account,
+					"cost_center": company_details.cost_center,
+					"amount": payment_entry.difference_amount,
+				},
+			)
 
 		if submit:
 			payment_entry.insert(ignore_permissions=True)
@@ -243,16 +288,23 @@
 			"subject": self.subject,
 			"message": self.get_message(),
 			"now": True,
-			"attachments": [frappe.attach_print(self.reference_doctype, self.reference_name,
-				file_name=self.reference_name, print_format=self.print_format)]}
-		enqueue(method=frappe.sendmail, queue='short', timeout=300, is_async=True, **email_args)
+			"attachments": [
+				frappe.attach_print(
+					self.reference_doctype,
+					self.reference_name,
+					file_name=self.reference_name,
+					print_format=self.print_format,
+				)
+			],
+		}
+		enqueue(method=frappe.sendmail, queue="short", timeout=300, is_async=True, **email_args)
 
 	def get_message(self):
 		"""return message with payment gateway link"""
 
 		context = {
 			"doc": frappe.get_doc(self.reference_doctype, self.reference_name),
-			"payment_url": self.payment_url
+			"payment_url": self.payment_url,
 		}
 
 		if self.message:
@@ -266,22 +318,26 @@
 
 	def check_if_payment_entry_exists(self):
 		if self.status == "Paid":
-			if frappe.get_all("Payment Entry Reference",
+			if frappe.get_all(
+				"Payment Entry Reference",
 				filters={"reference_name": self.reference_name, "docstatus": ["<", 2]},
 				fields=["parent"],
-				limit=1):
-				frappe.throw(_("Payment Entry already exists"), title=_('Error'))
+				limit=1,
+			):
+				frappe.throw(_("Payment Entry already exists"), title=_("Error"))
 
 	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 = 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)
 
 	def get_payment_success_url(self):
@@ -298,16 +354,17 @@
 			self.set_as_paid()
 
 			# if shopping cart enabled and in session
-			if (shopping_cart_settings.enabled and hasattr(frappe.local, "session")
-				and frappe.local.session.user != "Guest") and self.payment_channel != "Phone":
+			if (
+				shopping_cart_settings.enabled
+				and hasattr(frappe.local, "session")
+				and frappe.local.session.user != "Guest"
+			) and self.payment_channel != "Phone":
 
 				success_url = shopping_cart_settings.payment_success_url
 				if success_url:
-					redirect_to = ({
-						"Orders": "/orders",
-						"Invoices": "/invoices",
-						"My Account": "/me"
-					}).get(success_url, "/me")
+					redirect_to = ({"Orders": "/orders", "Invoices": "/invoices", "My Account": "/me"}).get(
+						success_url, "/me"
+					)
 				else:
 					redirect_to = get_url("/orders/{0}".format(self.reference_name))
 
@@ -317,6 +374,7 @@
 		if payment_provider == "stripe":
 			return create_stripe_subscription(gateway_controller, data)
 
+
 @frappe.whitelist(allow_guest=True)
 def make_payment_request(**args):
 	"""Make payment request"""
@@ -329,49 +387,62 @@
 	grand_total = get_amount(ref_doc, gateway_account.get("payment_account"))
 	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)
+		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
 
-	bank_account = (get_party_bank_account(args.get('party_type'), args.get('party'))
-		if args.get('party_type') else '')
+	bank_account = (
+		get_party_bank_account(args.get("party_type"), args.get("party"))
+		if args.get("party_type")
+		else ""
+	)
 
 	existing_payment_request = None
 	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)})
+		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)
+		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:
 		if args.order_type != "Shopping Cart":
-			existing_payment_request_amount = \
-				get_existing_payment_request_amount(args.dt, args.dn)
+			existing_payment_request_amount = get_existing_payment_request_amount(args.dt, args.dn)
 
 			if existing_payment_request_amount:
 				grand_total -= existing_payment_request_amount
 
 		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_channel": gateway_account.get("payment_channel"),
-			"payment_request_type": args.get("payment_request_type"),
-			"currency": ref_doc.currency,
-			"grand_total": grand_total,
-			"mode_of_payment": args.mode_of_payment,
-			"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
-		})
+		pr.update(
+			{
+				"payment_gateway_account": gateway_account.get("name"),
+				"payment_gateway": gateway_account.get("payment_gateway"),
+				"payment_account": gateway_account.get("payment_account"),
+				"payment_channel": gateway_account.get("payment_channel"),
+				"payment_request_type": args.get("payment_request_type"),
+				"currency": ref_doc.currency,
+				"grand_total": grand_total,
+				"mode_of_payment": args.mode_of_payment,
+				"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,
+			}
+		)
 
 		if args.order_type == "Shopping Cart" or args.mute_email:
 			pr.flags.mute_email = True
@@ -390,6 +461,7 @@
 
 	return pr.as_dict()
 
+
 def get_amount(ref_doc, payment_account=None):
 	"""get amount based on doctype"""
 	dt = ref_doc.doctype
@@ -411,18 +483,20 @@
 	elif dt == "Fees":
 		grand_total = ref_doc.outstanding_amount
 
-	if grand_total > 0 :
+	if grand_total > 0:
 		return grand_total
 
 	else:
 		frappe.throw(_("Payment Entry is already created"))
 
+
 def get_existing_payment_request_amount(ref_dt, ref_dn):
 	"""
 	Get the existing payment request which are unpaid or partially paid for payment channel other than Phone
 	and get the summation of existing paid payment request for Phone payment channel.
 	"""
-	existing_payment_request_amount = frappe.db.sql("""
+	existing_payment_request_amount = frappe.db.sql(
+		"""
 		select sum(grand_total)
 		from `tabPayment Request`
 		where
@@ -432,10 +506,13 @@
 			and (status != 'Paid'
 			or (payment_channel = 'Phone'
 				and status = 'Paid'))
-	""", (ref_dt, ref_dn))
+	""",
+		(ref_dt, ref_dn),
+	)
 	return flt(existing_payment_request_amount[0][0]) if existing_payment_request_amount else 0
 
-def get_gateway_details(args): # nosemgrep
+
+def get_gateway_details(args):  # nosemgrep
 	"""return gateway and payment account of default payment gateway"""
 	if args.get("payment_gateway_account"):
 		return get_payment_gateway_account(args.get("payment_gateway_account"))
@@ -448,58 +525,74 @@
 
 	return gateway_account
 
+
 def get_payment_gateway_account(args):
-	return frappe.db.get_value("Payment Gateway Account", args,
+	return frappe.db.get_value(
+		"Payment Gateway Account",
+		args,
 		["name", "payment_gateway", "payment_account", "message"],
-			as_dict=1)
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def get_print_format_list(ref_doctype):
 	print_format_list = ["Standard"]
 
-	print_format_list.extend([p.name for p in frappe.get_all("Print Format",
-		filters={"doc_type": ref_doctype})])
+	print_format_list.extend(
+		[p.name for p in frappe.get_all("Print Format", filters={"doc_type": ref_doctype})]
+	)
 
-	return {
-		"print_format": print_format_list
-	}
+	return {"print_format": print_format_list}
+
 
 @frappe.whitelist(allow_guest=True)
 def resend_payment_email(docname):
 	return frappe.get_doc("Payment Request", docname).send_email()
 
+
 @frappe.whitelist()
 def make_payment_entry(docname):
 	doc = frappe.get_doc("Payment Request", docname)
 	return doc.create_payment_entry(submit=False).as_dict()
 
+
 def update_payment_req_status(doc, method):
 	from erpnext.accounts.doctype.payment_entry.payment_entry import get_reference_details
 
 	for ref in doc.references:
-		payment_request_name = frappe.db.get_value("Payment Request",
-			{"reference_doctype": ref.reference_doctype, "reference_name": ref.reference_name,
-			"docstatus": 1})
+		payment_request_name = frappe.db.get_value(
+			"Payment Request",
+			{
+				"reference_doctype": ref.reference_doctype,
+				"reference_name": ref.reference_name,
+				"docstatus": 1,
+			},
+		)
 
 		if payment_request_name:
-			ref_details = get_reference_details(ref.reference_doctype, ref.reference_name, doc.party_account_currency)
-			pay_req_doc = frappe.get_doc('Payment Request', payment_request_name)
+			ref_details = get_reference_details(
+				ref.reference_doctype, ref.reference_name, doc.party_account_currency
+			)
+			pay_req_doc = frappe.get_doc("Payment Request", payment_request_name)
 			status = pay_req_doc.status
 
 			if status != "Paid" and not ref_details.outstanding_amount:
-				status = 'Paid'
+				status = "Paid"
 			elif status != "Partially Paid" and ref_details.outstanding_amount != ref_details.total_amount:
-				status = 'Partially Paid'
+				status = "Partially Paid"
 			elif ref_details.outstanding_amount == ref_details.total_amount:
-				if pay_req_doc.payment_request_type == 'Outward':
-					status = 'Initiated'
-				elif pay_req_doc.payment_request_type == 'Inward':
-					status = 'Requested'
+				if pay_req_doc.payment_request_type == "Outward":
+					status = "Initiated"
+				elif pay_req_doc.payment_request_type == "Inward":
+					status = "Requested"
 
-			pay_req_doc.db_set('status', status)
+			pay_req_doc.db_set("status", status)
+
 
 def get_dummy_message(doc):
-	return frappe.render_template("""{% if doc.contact_person -%}
+	return frappe.render_template(
+		"""{% if doc.contact_person -%}
 <p>Dear {{ doc.contact_person }},</p>
 {%- else %}<p>Hello,</p>{% endif %}
 
@@ -511,12 +604,19 @@
 <p>{{ _("If you have any questions, please get back to us.") }}</p>
 
 <p>{{ _("Thank you for your business!") }}</p>
-""", dict(doc=doc, payment_url = '{{ payment_url }}'))
+""",
+		dict(doc=doc, payment_url="{{ payment_url }}"),
+	)
+
 
 @frappe.whitelist()
 def get_subscription_details(reference_doctype, reference_name):
 	if reference_doctype == "Sales Invoice":
-		subscriptions = frappe.db.sql("""SELECT parent as sub_name FROM `tabSubscription Invoice` WHERE invoice=%s""",reference_name, as_dict=1)
+		subscriptions = frappe.db.sql(
+			"""SELECT parent as sub_name FROM `tabSubscription Invoice` WHERE invoice=%s""",
+			reference_name,
+			as_dict=1,
+		)
 		subscription_plans = []
 		for subscription in subscriptions:
 			plans = frappe.get_doc("Subscription", subscription.sub_name).plans
@@ -524,38 +624,50 @@
 				subscription_plans.append(plan)
 		return subscription_plans
 
+
 @frappe.whitelist()
 def make_payment_order(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
+
 	def set_missing_values(source, target):
 		target.payment_order_type = "Payment Request"
-		target.append('references', {
-			'reference_doctype': source.reference_doctype,
-			'reference_name': source.reference_name,
-			'amount': source.grand_total,
-			'supplier': source.party,
-			'payment_request': source_name,
-			'mode_of_payment': source.mode_of_payment,
-			'bank_account': source.bank_account,
-			'account': source.account
-		})
+		target.append(
+			"references",
+			{
+				"reference_doctype": source.reference_doctype,
+				"reference_name": source.reference_name,
+				"amount": source.grand_total,
+				"supplier": source.party,
+				"payment_request": source_name,
+				"mode_of_payment": source.mode_of_payment,
+				"bank_account": source.bank_account,
+				"account": source.account,
+			},
+		)
 
-	doclist = get_mapped_doc("Payment Request", source_name,	{
-		"Payment Request": {
-			"doctype": "Payment Order",
-		}
-	}, target_doc, set_missing_values)
+	doclist = get_mapped_doc(
+		"Payment Request",
+		source_name,
+		{
+			"Payment Request": {
+				"doctype": "Payment Order",
+			}
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 def validate_payment(doc, method=None):
 	if doc.reference_doctype != "Payment Request" or (
-		frappe.db.get_value(doc.reference_doctype, doc.reference_docname, 'status')
-		!= "Paid"
+		frappe.db.get_value(doc.reference_doctype, doc.reference_docname, "status") != "Paid"
 	):
 		return
 
 	frappe.throw(
-		_("The Payment Request {0} is already paid, cannot process payment twice")
-		.format(doc.reference_docname)
+		_("The Payment Request {0} is already paid, cannot process payment twice").format(
+			doc.reference_docname
+		)
 	)
diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py
index f679ccf..477c726 100644
--- a/erpnext/accounts/doctype/payment_request/test_payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py
@@ -12,10 +12,7 @@
 
 test_dependencies = ["Currency Exchange", "Journal Entry", "Contact", "Address"]
 
-payment_gateway = {
-	"doctype": "Payment Gateway",
-	"gateway": "_Test Gateway"
-}
+payment_gateway = {"doctype": "Payment Gateway", "gateway": "_Test Gateway"}
 
 payment_method = [
 	{
@@ -23,30 +20,38 @@
 		"is_default": 1,
 		"payment_gateway": "_Test Gateway",
 		"payment_account": "_Test Bank - _TC",
-		"currency": "INR"
+		"currency": "INR",
 	},
 	{
 		"doctype": "Payment Gateway Account",
 		"payment_gateway": "_Test Gateway",
 		"payment_account": "_Test Bank USD - _TC",
-		"currency": "USD"
-	}
+		"currency": "USD",
+	},
 ]
 
+
 class TestPaymentRequest(unittest.TestCase):
 	def setUp(self):
 		if not frappe.db.get_value("Payment Gateway", payment_gateway["gateway"], "name"):
 			frappe.get_doc(payment_gateway).insert(ignore_permissions=True)
 
 		for method in payment_method:
-			if not frappe.db.get_value("Payment Gateway Account", {"payment_gateway": method["payment_gateway"],
-				"currency": method["currency"]}, "name"):
+			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",
-			payment_gateway_account="_Test Gateway - INR")
+		pr = make_payment_request(
+			dt="Sales Order",
+			dn=so_inr.name,
+			recipient_id="saurabh@erpnext.com",
+			payment_gateway_account="_Test Gateway - INR",
+		)
 
 		self.assertEqual(pr.reference_doctype, "Sales Order")
 		self.assertEqual(pr.reference_name, so_inr.name)
@@ -55,45 +60,75 @@
 		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",
-			payment_gateway_account="_Test Gateway - USD")
+		pr = make_payment_request(
+			dt="Sales Invoice",
+			dn=si_usd.name,
+			recipient_id="saurabh@erpnext.com",
+			payment_gateway_account="_Test Gateway - USD",
+		)
 
 		self.assertEqual(pr.reference_doctype, "Sales Invoice")
 		self.assertEqual(pr.reference_name, si_usd.name)
 		self.assertEqual(pr.currency, "USD")
 
 	def test_payment_entry(self):
-		frappe.db.set_value("Company", "_Test Company",
-			"exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC")
+		frappe.db.set_value(
+			"Company", "_Test Company", "exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC"
+		)
 		frappe.db.set_value("Company", "_Test Company", "write_off_account", "_Test Write Off - _TC")
 		frappe.db.set_value("Company", "_Test Company", "cost_center", "_Test Cost Center - _TC")
 
 		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, payment_gateway_account="_Test Gateway - INR", submit_doc=1, return_doc=1)
+		pr = make_payment_request(
+			dt="Sales Order",
+			dn=so_inr.name,
+			recipient_id="saurabh@erpnext.com",
+			mute_email=1,
+			payment_gateway_account="_Test Gateway - INR",
+			submit_doc=1,
+			return_doc=1,
+		)
 		pe = pr.set_as_paid()
 
 		so_inr = frappe.get_doc("Sales Order", so_inr.name)
 
 		self.assertEqual(so_inr.advance_paid, 1000)
 
-		si_usd = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		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, payment_gateway_account="_Test Gateway - USD", submit_doc=1, return_doc=1)
+		pr = make_payment_request(
+			dt="Sales Invoice",
+			dn=si_usd.name,
+			recipient_id="saurabh@erpnext.com",
+			mute_email=1,
+			payment_gateway_account="_Test Gateway - USD",
+			submit_doc=1,
+			return_doc=1,
+		)
 
 		pe = pr.set_as_paid()
 
-		expected_gle = dict((d[0], d) for d in [
-			["_Test Receivable USD - _TC", 0, 5000, si_usd.name],
-			[pr.payment_account, 6290.0, 0, None],
-			["_Test Exchange Gain/Loss - _TC", 0, 1290, None]
-		])
+		expected_gle = dict(
+			(d[0], d)
+			for d in [
+				["_Test Receivable USD - _TC", 0, 5000, si_usd.name],
+				[pr.payment_account, 6290.0, 0, None],
+				["_Test Exchange Gain/Loss - _TC", 0, 1290, None],
+			]
+		)
 
-		gl_entries = frappe.db.sql("""select account, debit, credit, against_voucher
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit, against_voucher
 			from `tabGL Entry` where voucher_type='Payment Entry' and voucher_no=%s
-			order by account asc""", pe.name, as_dict=1)
+			order by account asc""",
+			pe.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -104,35 +139,48 @@
 			self.assertEqual(expected_gle[gle.account][3], gle.against_voucher)
 
 	def test_status(self):
-		si_usd = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		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, payment_gateway_account="_Test Gateway - USD", submit_doc=1, return_doc=1)
+		pr = make_payment_request(
+			dt="Sales Invoice",
+			dn=si_usd.name,
+			recipient_id="saurabh@erpnext.com",
+			mute_email=1,
+			payment_gateway_account="_Test Gateway - USD",
+			submit_doc=1,
+			return_doc=1,
+		)
 
 		pe = pr.create_payment_entry()
 		pr.load_from_db()
 
-		self.assertEqual(pr.status, 'Paid')
+		self.assertEqual(pr.status, "Paid")
 
 		pe.cancel()
 		pr.load_from_db()
 
-		self.assertEqual(pr.status, 'Requested')
+		self.assertEqual(pr.status, "Requested")
 
 	def test_multiple_payment_entries_against_sales_order(self):
 		# Make Sales Order, grand_total = 1000
 		so = make_sales_order()
 
 		# Payment Request amount = 200
-		pr1 = make_payment_request(dt="Sales Order", dn=so.name,
-			recipient_id="nabin@erpnext.com", return_doc=1)
+		pr1 = make_payment_request(
+			dt="Sales Order", dn=so.name, recipient_id="nabin@erpnext.com", return_doc=1
+		)
 		pr1.grand_total = 200
 		pr1.submit()
 
 		# Make a 2nd Payment Request
-		pr2 = make_payment_request(dt="Sales Order", dn=so.name,
-			recipient_id="nabin@erpnext.com", return_doc=1)
+		pr2 = make_payment_request(
+			dt="Sales Order", dn=so.name, recipient_id="nabin@erpnext.com", return_doc=1
+		)
 
 		self.assertEqual(pr2.grand_total, 800)
 
diff --git a/erpnext/accounts/doctype/payment_term/payment_term_dashboard.py b/erpnext/accounts/doctype/payment_term/payment_term_dashboard.py
index ac80b79..8df97bf 100644
--- a/erpnext/accounts/doctype/payment_term/payment_term_dashboard.py
+++ b/erpnext/accounts/doctype/payment_term/payment_term_dashboard.py
@@ -3,18 +3,10 @@
 
 def get_data():
 	return {
-		'fieldname': 'payment_term',
-		'transactions': [
-			{
-				'label': _('Sales'),
-				'items': ['Sales Invoice', 'Sales Order', 'Quotation']
-			},
-			{
-				'label': _('Purchase'),
-				'items': ['Purchase Invoice', 'Purchase Order']
-			},
-			{
-				'items': ['Payment Terms Template']
-			}
-		]
+		"fieldname": "payment_term",
+		"transactions": [
+			{"label": _("Sales"), "items": ["Sales Invoice", "Sales Order", "Quotation"]},
+			{"label": _("Purchase"), "items": ["Purchase Invoice", "Purchase Order"]},
+			{"items": ["Payment Terms Template"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py
index 3a6999c..ea3b76c 100644
--- a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py
+++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py
@@ -16,10 +16,12 @@
 	def validate_invoice_portion(self):
 		total_portion = 0
 		for term in self.terms:
-			total_portion += flt(term.get('invoice_portion', 0))
+			total_portion += flt(term.get("invoice_portion", 0))
 
 		if flt(total_portion, 2) != 100.00:
-			frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red')
+			frappe.msgprint(
+				_("Combined invoice portion must equal 100%"), raise_exception=1, indicator="red"
+			)
 
 	def check_duplicate_terms(self):
 		terms = []
@@ -27,8 +29,9 @@
 			term_info = (term.payment_term, term.credit_days, term.credit_months, term.due_date_based_on)
 			if term_info in terms:
 				frappe.msgprint(
-					_('The Payment Term at row {0} is possibly a duplicate.').format(term.idx),
-					raise_exception=1, indicator='red'
+					_("The Payment Term at row {0} is possibly a duplicate.").format(term.idx),
+					raise_exception=1,
+					indicator="red",
 				)
 			else:
 				terms.append(term_info)
diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template_dashboard.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template_dashboard.py
index 2cf7a6c..34ac773 100644
--- a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template_dashboard.py
+++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template_dashboard.py
@@ -3,29 +3,17 @@
 
 def get_data():
 	return {
-		'fieldname': 'payment_terms_template',
-		'non_standard_fieldnames': {
-			'Customer Group': 'payment_terms',
-			'Supplier Group': 'payment_terms',
-			'Supplier': 'payment_terms',
-			'Customer': 'payment_terms'
+		"fieldname": "payment_terms_template",
+		"non_standard_fieldnames": {
+			"Customer Group": "payment_terms",
+			"Supplier Group": "payment_terms",
+			"Supplier": "payment_terms",
+			"Customer": "payment_terms",
 		},
-		'transactions': [
-			{
-				'label': _('Sales'),
-				'items': ['Sales Invoice', 'Sales Order', 'Quotation']
-			},
-			{
-				'label': _('Purchase'),
-				'items': ['Purchase Invoice', 'Purchase Order']
-			},
-			{
-				'label': _('Party'),
-				'items': ['Customer', 'Supplier']
-			},
-			{
-				'label': _('Group'),
-				'items': ['Customer Group', 'Supplier Group']
-			}
-		]
+		"transactions": [
+			{"label": _("Sales"), "items": ["Sales Invoice", "Sales Order", "Quotation"]},
+			{"label": _("Purchase"), "items": ["Purchase Invoice", "Purchase Order"]},
+			{"label": _("Party"), "items": ["Customer", "Supplier"]},
+			{"label": _("Group"), "items": ["Customer Group", "Supplier Group"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py
index 8529ef5..9717f20 100644
--- a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py
+++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py
@@ -8,64 +8,76 @@
 
 class TestPaymentTermsTemplate(unittest.TestCase):
 	def tearDown(self):
-		frappe.delete_doc('Payment Terms Template', '_Test Payment Terms Template For Test', force=1)
+		frappe.delete_doc("Payment Terms Template", "_Test Payment Terms Template For Test", force=1)
 
 	def test_create_template(self):
-		template = frappe.get_doc({
-			'doctype': 'Payment Terms Template',
-			'template_name': '_Test Payment Terms Template For Test',
-			'terms': [{
-				'doctype': 'Payment Terms Template Detail',
-				'invoice_portion': 50.00,
-				'credit_days_based_on': 'Day(s) after invoice date',
-				'credit_days': 30
-			}]
-		})
+		template = frappe.get_doc(
+			{
+				"doctype": "Payment Terms Template",
+				"template_name": "_Test Payment Terms Template For Test",
+				"terms": [
+					{
+						"doctype": "Payment Terms Template Detail",
+						"invoice_portion": 50.00,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": 30,
+					}
+				],
+			}
+		)
 
 		self.assertRaises(frappe.ValidationError, template.insert)
 
-		template.append('terms', {
-			'doctype': 'Payment Terms Template Detail',
-			'invoice_portion': 50.00,
-			'credit_days_based_on': 'Day(s) after invoice date',
-			'credit_days': 0
-		})
+		template.append(
+			"terms",
+			{
+				"doctype": "Payment Terms Template Detail",
+				"invoice_portion": 50.00,
+				"credit_days_based_on": "Day(s) after invoice date",
+				"credit_days": 0,
+			},
+		)
 
 		template.insert()
 
 	def test_credit_days(self):
-		template = frappe.get_doc({
-			'doctype': 'Payment Terms Template',
-			'template_name': '_Test Payment Terms Template For Test',
-			'terms': [{
-				'doctype': 'Payment Terms Template Detail',
-				'invoice_portion': 100.00,
-				'credit_days_based_on': 'Day(s) after invoice date',
-				'credit_days': -30
-			}]
-		})
+		template = frappe.get_doc(
+			{
+				"doctype": "Payment Terms Template",
+				"template_name": "_Test Payment Terms Template For Test",
+				"terms": [
+					{
+						"doctype": "Payment Terms Template Detail",
+						"invoice_portion": 100.00,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": -30,
+					}
+				],
+			}
+		)
 
 		self.assertRaises(frappe.ValidationError, template.insert)
 
 	def test_duplicate_terms(self):
-		template = frappe.get_doc({
-			'doctype': 'Payment Terms Template',
-			'template_name': '_Test Payment Terms Template For Test',
-			'terms': [
-				{
-					'doctype': 'Payment Terms Template Detail',
-					'invoice_portion': 50.00,
-					'credit_days_based_on': 'Day(s) after invoice date',
-					'credit_days': 30
-				},
-				{
-					'doctype': 'Payment Terms Template Detail',
-					'invoice_portion': 50.00,
-					'credit_days_based_on': 'Day(s) after invoice date',
-					'credit_days': 30
-				}
-
-			]
-		})
+		template = frappe.get_doc(
+			{
+				"doctype": "Payment Terms Template",
+				"template_name": "_Test Payment Terms Template For Test",
+				"terms": [
+					{
+						"doctype": "Payment Terms Template Detail",
+						"invoice_portion": 50.00,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": 30,
+					},
+					{
+						"doctype": "Payment Terms Template Detail",
+						"invoice_portion": 50.00,
+						"credit_days_based_on": "Day(s) after invoice date",
+						"credit_days": 30,
+					},
+				],
+			}
+		)
 
 		self.assertRaises(frappe.ValidationError, template.insert)
diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py
index d0e555e..53b1c64 100644
--- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py
+++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py
@@ -23,40 +23,52 @@
 		self.make_gl_entries()
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 		from erpnext.accounts.general_ledger import make_reverse_gl_entries
+
 		make_reverse_gl_entries(voucher_type="Period Closing Voucher", voucher_no=self.name)
 
 	def validate_account_head(self):
 		closing_account_type = frappe.db.get_value("Account", self.closing_account_head, "root_type")
 
 		if closing_account_type not in ["Liability", "Equity"]:
-			frappe.throw(_("Closing Account {0} must be of type Liability / Equity")
-				.format(self.closing_account_head))
+			frappe.throw(
+				_("Closing Account {0} must be of type Liability / Equity").format(self.closing_account_head)
+			)
 
 		account_currency = get_account_currency(self.closing_account_head)
-		company_currency = frappe.get_cached_value('Company',  self.company,  "default_currency")
+		company_currency = frappe.get_cached_value("Company", self.company, "default_currency")
 		if account_currency != company_currency:
 			frappe.throw(_("Currency of the Closing Account must be {0}").format(company_currency))
 
 	def validate_posting_date(self):
 		from erpnext.accounts.utils import get_fiscal_year, validate_fiscal_year
 
-		validate_fiscal_year(self.posting_date, self.fiscal_year, self.company, label=_("Posting Date"), doc=self)
+		validate_fiscal_year(
+			self.posting_date, self.fiscal_year, self.company, label=_("Posting Date"), doc=self
+		)
 
-		self.year_start_date = get_fiscal_year(self.posting_date, self.fiscal_year, company=self.company)[1]
+		self.year_start_date = get_fiscal_year(
+			self.posting_date, self.fiscal_year, company=self.company
+		)[1]
 
-		pce = frappe.db.sql("""select name from `tabPeriod Closing Voucher`
+		pce = frappe.db.sql(
+			"""select name from `tabPeriod Closing Voucher`
 			where posting_date > %s and fiscal_year = %s and docstatus = 1""",
-			(self.posting_date, self.fiscal_year))
+			(self.posting_date, self.fiscal_year),
+		)
 		if pce and pce[0][0]:
-			frappe.throw(_("Another Period Closing Entry {0} has been made after {1}")
-				.format(pce[0][0], self.posting_date))
+			frappe.throw(
+				_("Another Period Closing Entry {0} has been made after {1}").format(
+					pce[0][0], self.posting_date
+				)
+			)
 
 	def make_gl_entries(self):
 		gl_entries = self.get_gl_entries()
 		if gl_entries:
 			from erpnext.accounts.general_ledger import make_gl_entries
+
 			make_gl_entries(gl_entries)
 
 	def get_gl_entries(self):
@@ -65,16 +77,29 @@
 
 		for acc in pl_accounts:
 			if flt(acc.bal_in_company_currency):
-				gl_entries.append(self.get_gl_dict({
-					"account": acc.account,
-					"cost_center": acc.cost_center,
-					"finance_book": acc.finance_book,
-					"account_currency": acc.account_currency,
-					"debit_in_account_currency": abs(flt(acc.bal_in_account_currency)) if flt(acc.bal_in_account_currency) < 0 else 0,
-					"debit": abs(flt(acc.bal_in_company_currency)) if flt(acc.bal_in_company_currency) < 0 else 0,
-					"credit_in_account_currency": abs(flt(acc.bal_in_account_currency)) if flt(acc.bal_in_account_currency) > 0 else 0,
-					"credit": abs(flt(acc.bal_in_company_currency)) if flt(acc.bal_in_company_currency) > 0 else 0
-				}, item=acc))
+				gl_entries.append(
+					self.get_gl_dict(
+						{
+							"account": acc.account,
+							"cost_center": acc.cost_center,
+							"finance_book": acc.finance_book,
+							"account_currency": acc.account_currency,
+							"debit_in_account_currency": abs(flt(acc.bal_in_account_currency))
+							if flt(acc.bal_in_account_currency) < 0
+							else 0,
+							"debit": abs(flt(acc.bal_in_company_currency))
+							if flt(acc.bal_in_company_currency) < 0
+							else 0,
+							"credit_in_account_currency": abs(flt(acc.bal_in_account_currency))
+							if flt(acc.bal_in_account_currency) > 0
+							else 0,
+							"credit": abs(flt(acc.bal_in_company_currency))
+							if flt(acc.bal_in_company_currency) > 0
+							else 0,
+						},
+						item=acc,
+					)
+				)
 
 		if gl_entries:
 			gle_for_net_pl_bal = self.get_pnl_gl_entry(pl_accounts)
@@ -89,16 +114,27 @@
 		for acc in pl_accounts:
 			if flt(acc.bal_in_company_currency):
 				cost_center = acc.cost_center if self.cost_center_wise_pnl else company_cost_center
-				gl_entry = self.get_gl_dict({
-					"account": self.closing_account_head,
-					"cost_center": cost_center,
-					"finance_book": acc.finance_book,
-					"account_currency": acc.account_currency,
-					"debit_in_account_currency": abs(flt(acc.bal_in_account_currency)) if flt(acc.bal_in_account_currency) > 0 else 0,
-					"debit": abs(flt(acc.bal_in_company_currency)) if flt(acc.bal_in_company_currency) > 0 else 0,
-					"credit_in_account_currency": abs(flt(acc.bal_in_account_currency)) if flt(acc.bal_in_account_currency) < 0 else 0,
-					"credit": abs(flt(acc.bal_in_company_currency)) if flt(acc.bal_in_company_currency) < 0 else 0
-				}, item=acc)
+				gl_entry = self.get_gl_dict(
+					{
+						"account": self.closing_account_head,
+						"cost_center": cost_center,
+						"finance_book": acc.finance_book,
+						"account_currency": acc.account_currency,
+						"debit_in_account_currency": abs(flt(acc.bal_in_account_currency))
+						if flt(acc.bal_in_account_currency) > 0
+						else 0,
+						"debit": abs(flt(acc.bal_in_company_currency))
+						if flt(acc.bal_in_company_currency) > 0
+						else 0,
+						"credit_in_account_currency": abs(flt(acc.bal_in_account_currency))
+						if flt(acc.bal_in_account_currency) < 0
+						else 0,
+						"credit": abs(flt(acc.bal_in_company_currency))
+						if flt(acc.bal_in_company_currency) < 0
+						else 0,
+					},
+					item=acc,
+				)
 
 				self.update_default_dimensions(gl_entry)
 
@@ -112,20 +148,19 @@
 
 		_, default_dimensions = get_dimensions()
 		for dimension in self.accounting_dimensions:
-			gl_entry.update({
-				dimension: default_dimensions.get(self.company, {}).get(dimension)
-			})
+			gl_entry.update({dimension: default_dimensions.get(self.company, {}).get(dimension)})
 
 	def get_pl_balances(self):
 		"""Get balance for dimension-wise pl accounts"""
 
-		dimension_fields = ['t1.cost_center', 't1.finance_book']
+		dimension_fields = ["t1.cost_center", "t1.finance_book"]
 
 		self.accounting_dimensions = get_accounting_dimensions()
 		for dimension in self.accounting_dimensions:
-			dimension_fields.append('t1.{0}'.format(dimension))
+			dimension_fields.append("t1.{0}".format(dimension))
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select
 				t1.account, t2.account_currency, {dimension_fields},
 				sum(t1.debit_in_account_currency) - sum(t1.credit_in_account_currency) as bal_in_account_currency,
@@ -135,4 +170,9 @@
 			and t2.docstatus < 2 and t2.company = %s
 			and t1.posting_date between %s and %s
 			group by t1.account, {dimension_fields}
-		""".format(dimension_fields = ', '.join(dimension_fields)), (self.company, self.get("year_start_date"), self.posting_date), as_dict=1)
+		""".format(
+				dimension_fields=", ".join(dimension_fields)
+			),
+			(self.company, self.get("year_start_date"), self.posting_date),
+			as_dict=1,
+		)
diff --git a/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
index 030b4ca..8e0e62d 100644
--- a/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
+++ b/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import unittest
 
 import frappe
@@ -19,7 +18,7 @@
 		frappe.db.sql("delete from `tabGL Entry` where company='Test PCV Company'")
 
 		company = create_company()
-		cost_center = create_cost_center('Test Cost Center 1')
+		cost_center = create_cost_center("Test Cost Center 1")
 
 		jv1 = make_journal_entry(
 			amount=400,
@@ -27,7 +26,7 @@
 			account2="Sales - TPC",
 			cost_center=cost_center,
 			posting_date=now(),
-			save=False
+			save=False,
 		)
 		jv1.company = company
 		jv1.save()
@@ -39,7 +38,7 @@
 			account2="Cash - TPC",
 			cost_center=cost_center,
 			posting_date=now(),
-			save=False
+			save=False,
 		)
 		jv2.company = company
 		jv2.save()
@@ -49,14 +48,17 @@
 		surplus_account = pcv.closing_account_head
 
 		expected_gle = (
-			('Cost of Goods Sold - TPC', 0.0, 600.0),
+			("Cost of Goods Sold - TPC", 0.0, 600.0),
 			(surplus_account, 600.0, 400.0),
-			('Sales - TPC', 400.0, 0.0)
+			("Sales - TPC", 400.0, 0.0),
 		)
 
-		pcv_gle = frappe.db.sql("""
+		pcv_gle = frappe.db.sql(
+			"""
 			select account, debit, credit from `tabGL Entry` where voucher_no=%s order by account
-		""", (pcv.name))
+		""",
+			(pcv.name),
+		)
 
 		self.assertEqual(pcv_gle, expected_gle)
 
@@ -75,7 +77,7 @@
 			income_account="Sales - TPC",
 			expense_account="Cost of Goods Sold - TPC",
 			rate=400,
-			debit_to="Debtors - TPC"
+			debit_to="Debtors - TPC",
 		)
 		create_sales_invoice(
 			company=company,
@@ -83,7 +85,7 @@
 			income_account="Sales - TPC",
 			expense_account="Cost of Goods Sold - TPC",
 			rate=200,
-			debit_to="Debtors - TPC"
+			debit_to="Debtors - TPC",
 		)
 
 		pcv = self.make_period_closing_voucher(submit=False)
@@ -95,15 +97,18 @@
 		expected_gle = (
 			(surplus_account, 0.0, 400.0, cost_center1),
 			(surplus_account, 0.0, 200.0, cost_center2),
-			('Sales - TPC', 400.0, 0.0, cost_center1),
-			('Sales - TPC', 200.0, 0.0, cost_center2),
+			("Sales - TPC", 400.0, 0.0, cost_center1),
+			("Sales - TPC", 200.0, 0.0, cost_center2),
 		)
 
-		pcv_gle = frappe.db.sql("""
+		pcv_gle = frappe.db.sql(
+			"""
 			select account, debit, credit, cost_center
 			from `tabGL Entry` where voucher_no=%s
 			order by account, cost_center
-		""", (pcv.name))
+		""",
+			(pcv.name),
+		)
 
 		self.assertEqual(pcv_gle, expected_gle)
 
@@ -120,14 +125,14 @@
 			expense_account="Cost of Goods Sold - TPC",
 			cost_center=cost_center,
 			rate=400,
-			debit_to="Debtors - TPC"
+			debit_to="Debtors - TPC",
 		)
 		jv = make_journal_entry(
 			account1="Cash - TPC",
 			account2="Sales - TPC",
 			amount=400,
 			cost_center=cost_center,
-			posting_date=now()
+			posting_date=now(),
 		)
 		jv.company = company
 		jv.finance_book = create_finance_book().name
@@ -140,69 +145,84 @@
 		expected_gle = (
 			(surplus_account, 0.0, 400.0, None),
 			(surplus_account, 0.0, 400.0, jv.finance_book),
-			('Sales - TPC', 400.0, 0.0, None),
-			('Sales - TPC', 400.0, 0.0, jv.finance_book)
+			("Sales - TPC", 400.0, 0.0, None),
+			("Sales - TPC", 400.0, 0.0, jv.finance_book),
 		)
 
-		pcv_gle = frappe.db.sql("""
+		pcv_gle = frappe.db.sql(
+			"""
 			select account, debit, credit, finance_book
 			from `tabGL Entry` where voucher_no=%s
 			order by account, finance_book
-		""", (pcv.name))
+		""",
+			(pcv.name),
+		)
 
 		self.assertEqual(pcv_gle, expected_gle)
 
 	def make_period_closing_voucher(self, submit=True):
 		surplus_account = create_account()
 		cost_center = create_cost_center("Test Cost Center 1")
-		pcv = frappe.get_doc({
-			"doctype": "Period Closing Voucher",
-			"transaction_date": today(),
-			"posting_date": today(),
-			"company": "Test PCV Company",
-			"fiscal_year": get_fiscal_year(today(), company="Test PCV Company")[0],
-			"cost_center": cost_center,
-			"closing_account_head": surplus_account,
-			"remarks": "test"
-		})
+		pcv = frappe.get_doc(
+			{
+				"doctype": "Period Closing Voucher",
+				"transaction_date": today(),
+				"posting_date": today(),
+				"company": "Test PCV Company",
+				"fiscal_year": get_fiscal_year(today(), company="Test PCV Company")[0],
+				"cost_center": cost_center,
+				"closing_account_head": surplus_account,
+				"remarks": "test",
+			}
+		)
 		pcv.insert()
 		if submit:
 			pcv.submit()
 
 		return pcv
 
+
 def create_company():
-	company = frappe.get_doc({
-		'doctype': 'Company',
-		'company_name': "Test PCV Company",
-		'country': 'United States',
-		'default_currency': 'USD'
-	})
-	company.insert(ignore_if_duplicate = True)
+	company = frappe.get_doc(
+		{
+			"doctype": "Company",
+			"company_name": "Test PCV Company",
+			"country": "United States",
+			"default_currency": "USD",
+		}
+	)
+	company.insert(ignore_if_duplicate=True)
 	return company.name
 
+
 def create_account():
-	account = frappe.get_doc({
-		"account_name": "Reserve and Surplus",
-		"is_group": 0,
-		"company": "Test PCV Company",
-		"root_type": "Liability",
-		"report_type": "Balance Sheet",
-		"account_currency": "USD",
-		"parent_account": "Current Liabilities - TPC",
-		"doctype": "Account"
-	}).insert(ignore_if_duplicate = True)
+	account = frappe.get_doc(
+		{
+			"account_name": "Reserve and Surplus",
+			"is_group": 0,
+			"company": "Test PCV Company",
+			"root_type": "Liability",
+			"report_type": "Balance Sheet",
+			"account_currency": "USD",
+			"parent_account": "Current Liabilities - TPC",
+			"doctype": "Account",
+		}
+	).insert(ignore_if_duplicate=True)
 	return account.name
 
+
 def create_cost_center(cc_name):
-	costcenter = frappe.get_doc({
-		"company": "Test PCV Company",
-		"cost_center_name": cc_name,
-		"doctype": "Cost Center",
-		"parent_cost_center": "Test PCV Company - TPC"
-	})
-	costcenter.insert(ignore_if_duplicate = True)
+	costcenter = frappe.get_doc(
+		{
+			"company": "Test PCV Company",
+			"cost_center_name": cc_name,
+			"doctype": "Cost Center",
+			"parent_cost_center": "Test PCV Company - TPC",
+		}
+	)
+	costcenter.insert(ignore_if_duplicate=True)
 	return costcenter.name
 
+
 test_dependencies = ["Customer", "Cost Center"]
 test_records = frappe.get_test_records("Period Closing Voucher")
diff --git a/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py b/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py
index 07059cb..49aab0d 100644
--- a/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py
+++ b/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py
@@ -23,21 +23,33 @@
 	def validate_pos_invoices(self):
 		invalid_rows = []
 		for d in self.pos_transactions:
-			invalid_row = {'idx': d.idx}
-			pos_invoice = frappe.db.get_values("POS Invoice", d.pos_invoice,
-				["consolidated_invoice", "pos_profile", "docstatus", "owner"], as_dict=1)[0]
+			invalid_row = {"idx": d.idx}
+			pos_invoice = frappe.db.get_values(
+				"POS Invoice",
+				d.pos_invoice,
+				["consolidated_invoice", "pos_profile", "docstatus", "owner"],
+				as_dict=1,
+			)[0]
 			if pos_invoice.consolidated_invoice:
-				invalid_row.setdefault('msg', []).append(_('POS Invoice is {}').format(frappe.bold("already consolidated")))
+				invalid_row.setdefault("msg", []).append(
+					_("POS Invoice is {}").format(frappe.bold("already consolidated"))
+				)
 				invalid_rows.append(invalid_row)
 				continue
 			if pos_invoice.pos_profile != self.pos_profile:
-				invalid_row.setdefault('msg', []).append(_("POS Profile doesn't matches {}").format(frappe.bold(self.pos_profile)))
+				invalid_row.setdefault("msg", []).append(
+					_("POS Profile doesn't matches {}").format(frappe.bold(self.pos_profile))
+				)
 			if pos_invoice.docstatus != 1:
-				invalid_row.setdefault('msg', []).append(_('POS Invoice is not {}').format(frappe.bold("submitted")))
+				invalid_row.setdefault("msg", []).append(
+					_("POS Invoice is not {}").format(frappe.bold("submitted"))
+				)
 			if pos_invoice.owner != self.user:
-				invalid_row.setdefault('msg', []).append(_("POS Invoice isn't created by user {}").format(frappe.bold(self.owner)))
+				invalid_row.setdefault("msg", []).append(
+					_("POS Invoice isn't created by user {}").format(frappe.bold(self.owner))
+				)
 
-			if invalid_row.get('msg'):
+			if invalid_row.get("msg"):
 				invalid_rows.append(invalid_row)
 
 		if not invalid_rows:
@@ -45,16 +57,18 @@
 
 		error_list = []
 		for row in invalid_rows:
-			for msg in row.get('msg'):
-				error_list.append(_("Row #{}: {}").format(row.get('idx'), msg))
+			for msg in row.get("msg"):
+				error_list.append(_("Row #{}: {}").format(row.get("idx"), msg))
 
 		frappe.throw(error_list, title=_("Invalid POS Invoices"), as_list=True)
 
 	@frappe.whitelist()
 	def get_payment_reconciliation_details(self):
-		currency = frappe.get_cached_value('Company', self.company,  "default_currency")
-		return frappe.render_template("erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html",
-			{"data": self, "currency": currency})
+		currency = frappe.get_cached_value("Company", self.company, "default_currency")
+		return frappe.render_template(
+			"erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html",
+			{"data": self, "currency": currency},
+		)
 
 	def on_submit(self):
 		consolidate_pos_invoices(closing_entry=self)
@@ -72,29 +86,38 @@
 		opening_entry.set_status()
 		opening_entry.save()
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_cashiers(doctype, txt, searchfield, start, page_len, filters):
-	cashiers_list = frappe.get_all("POS Profile User", filters=filters, fields=['user'], as_list=1)
+	cashiers_list = frappe.get_all("POS Profile User", filters=filters, fields=["user"], as_list=1)
 	return [c for c in cashiers_list]
 
+
 @frappe.whitelist()
 def get_pos_invoices(start, end, pos_profile, user):
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 	select
 		name, timestamp(posting_date, posting_time) as "timestamp"
 	from
 		`tabPOS Invoice`
 	where
 		owner = %s and docstatus = 1 and pos_profile = %s and ifnull(consolidated_invoice,'') = ''
-	""", (user, pos_profile), as_dict=1)
+	""",
+		(user, pos_profile),
+		as_dict=1,
+	)
 
-	data = list(filter(lambda d: get_datetime(start) <= get_datetime(d.timestamp) <= get_datetime(end), data))
+	data = list(
+		filter(lambda d: get_datetime(start) <= get_datetime(d.timestamp) <= get_datetime(end), data)
+	)
 	# need to get taxes and payments so can't avoid get_doc
 	data = [frappe.get_doc("POS Invoice", d.name).as_dict() for d in data]
 
 	return data
 
+
 def make_closing_entry_from_opening(opening_entry):
 	closing_entry = frappe.new_doc("POS Closing Entry")
 	closing_entry.pos_opening_entry = opening_entry.name
@@ -107,26 +130,38 @@
 	closing_entry.net_total = 0
 	closing_entry.total_quantity = 0
 
-	invoices = get_pos_invoices(closing_entry.period_start_date, closing_entry.period_end_date,
-		closing_entry.pos_profile, closing_entry.user)
+	invoices = get_pos_invoices(
+		closing_entry.period_start_date,
+		closing_entry.period_end_date,
+		closing_entry.pos_profile,
+		closing_entry.user,
+	)
 
 	pos_transactions = []
 	taxes = []
 	payments = []
 	for detail in opening_entry.balance_details:
-		payments.append(frappe._dict({
-			'mode_of_payment': detail.mode_of_payment,
-			'opening_amount': detail.opening_amount,
-			'expected_amount': detail.opening_amount
-		}))
+		payments.append(
+			frappe._dict(
+				{
+					"mode_of_payment": detail.mode_of_payment,
+					"opening_amount": detail.opening_amount,
+					"expected_amount": detail.opening_amount,
+				}
+			)
+		)
 
 	for d in invoices:
-		pos_transactions.append(frappe._dict({
-			'pos_invoice': d.name,
-			'posting_date': d.posting_date,
-			'grand_total': d.grand_total,
-			'customer': d.customer
-		}))
+		pos_transactions.append(
+			frappe._dict(
+				{
+					"pos_invoice": d.name,
+					"posting_date": d.posting_date,
+					"grand_total": d.grand_total,
+					"customer": d.customer,
+				}
+			)
+		)
 		closing_entry.grand_total += flt(d.grand_total)
 		closing_entry.net_total += flt(d.net_total)
 		closing_entry.total_quantity += flt(d.total_qty)
@@ -134,24 +169,22 @@
 		for t in d.taxes:
 			existing_tax = [tx for tx in taxes if tx.account_head == t.account_head and tx.rate == t.rate]
 			if existing_tax:
-				existing_tax[0].amount += flt(t.tax_amount);
+				existing_tax[0].amount += flt(t.tax_amount)
 			else:
-				taxes.append(frappe._dict({
-					'account_head': t.account_head,
-					'rate': t.rate,
-					'amount': t.tax_amount
-				}))
+				taxes.append(
+					frappe._dict({"account_head": t.account_head, "rate": t.rate, "amount": t.tax_amount})
+				)
 
 		for p in d.payments:
 			existing_pay = [pay for pay in payments if pay.mode_of_payment == p.mode_of_payment]
 			if existing_pay:
-				existing_pay[0].expected_amount += flt(p.amount);
+				existing_pay[0].expected_amount += flt(p.amount)
 			else:
-				payments.append(frappe._dict({
-					'mode_of_payment': p.mode_of_payment,
-					'opening_amount': 0,
-					'expected_amount': p.amount
-				}))
+				payments.append(
+					frappe._dict(
+						{"mode_of_payment": p.mode_of_payment, "opening_amount": 0, "expected_amount": p.amount}
+					)
+				)
 
 	closing_entry.set("pos_transactions", pos_transactions)
 	closing_entry.set("payment_reconciliation", payments)
diff --git a/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py b/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py
index 626bee0..8eb28df 100644
--- a/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py
+++ b/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py
@@ -28,24 +28,20 @@
 		opening_entry = create_opening_entry(pos_profile, test_user.name)
 
 		pos_inv1 = create_pos_invoice(rate=3500, do_not_submit=1)
-		pos_inv1.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3500
-		})
+		pos_inv1.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3500})
 		pos_inv1.submit()
 
 		pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
-		pos_inv2.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200
-		})
+		pos_inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200})
 		pos_inv2.submit()
 
 		pcv_doc = make_closing_entry_from_opening(opening_entry)
 		payment = pcv_doc.payment_reconciliation[0]
 
-		self.assertEqual(payment.mode_of_payment, 'Cash')
+		self.assertEqual(payment.mode_of_payment, "Cash")
 
 		for d in pcv_doc.payment_reconciliation:
-			if d.mode_of_payment == 'Cash':
+			if d.mode_of_payment == "Cash":
 				d.closing_amount = 6700
 
 		pcv_doc.submit()
@@ -58,24 +54,20 @@
 		opening_entry = create_opening_entry(pos_profile, test_user.name)
 
 		pos_inv1 = create_pos_invoice(rate=3500, do_not_submit=1)
-		pos_inv1.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3500
-		})
+		pos_inv1.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3500})
 		pos_inv1.submit()
 
 		pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
-		pos_inv2.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200
-		})
+		pos_inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200})
 		pos_inv2.submit()
 
 		pcv_doc = make_closing_entry_from_opening(opening_entry)
 		payment = pcv_doc.payment_reconciliation[0]
 
-		self.assertEqual(payment.mode_of_payment, 'Cash')
+		self.assertEqual(payment.mode_of_payment, "Cash")
 
 		for d in pcv_doc.payment_reconciliation:
-			if d.mode_of_payment == 'Cash':
+			if d.mode_of_payment == "Cash":
 				d.closing_amount = 6700
 
 		pcv_doc.submit()
@@ -90,29 +82,25 @@
 		pcv_doc.cancel()
 
 		cancelled_invoice = frappe.db.get_value(
-			'POS Invoice Merge Log', {'pos_closing_entry': pcv_doc.name},
-			'consolidated_invoice'
+			"POS Invoice Merge Log", {"pos_closing_entry": pcv_doc.name}, "consolidated_invoice"
 		)
-		docstatus = frappe.db.get_value("Sales Invoice", cancelled_invoice, 'docstatus')
+		docstatus = frappe.db.get_value("Sales Invoice", cancelled_invoice, "docstatus")
 		self.assertEqual(docstatus, 2)
 
 		pos_inv1.load_from_db()
-		self.assertEqual(pos_inv1.status, 'Paid')
+		self.assertEqual(pos_inv1.status, "Paid")
 
 
 def init_user_and_profile(**args):
-	user = 'test@example.com'
-	test_user = frappe.get_doc('User', user)
+	user = "test@example.com"
+	test_user = frappe.get_doc("User", user)
 
 	roles = ("Accounts Manager", "Accounts User", "Sales Manager")
 	test_user.add_roles(*roles)
 	frappe.set_user(user)
 
 	pos_profile = make_pos_profile(**args)
-	pos_profile.append('applicable_for_users', {
-		'default': 1,
-		'user': user
-	})
+	pos_profile.append("applicable_for_users", {"default": 1, "user": user})
 
 	pos_profile.save()
 
diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
index 275eeb3..94246e1 100644
--- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
+++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
@@ -29,7 +29,9 @@
 
 	def validate(self):
 		if not cint(self.is_pos):
-			frappe.throw(_("POS Invoice should have {} field checked.").format(frappe.bold("Include Payment")))
+			frappe.throw(
+				_("POS Invoice should have {} field checked.").format(frappe.bold("Include Payment"))
+			)
 
 		# run on validate method of selling controller
 		super(SalesInvoice, self).validate()
@@ -53,6 +55,7 @@
 		self.validate_loyalty_transaction()
 		if self.coupon_code:
 			from erpnext.accounts.doctype.pricing_rule.utils import validate_coupon_code
+
 			validate_coupon_code(self.coupon_code)
 
 	def on_submit(self):
@@ -70,22 +73,26 @@
 
 		if self.coupon_code:
 			from erpnext.accounts.doctype.pricing_rule.utils import update_coupon_code_count
-			update_coupon_code_count(self.coupon_code,'used')
+
+			update_coupon_code_count(self.coupon_code, "used")
 
 	def before_cancel(self):
-		if self.consolidated_invoice and frappe.db.get_value('Sales Invoice', self.consolidated_invoice, 'docstatus') == 1:
+		if (
+			self.consolidated_invoice
+			and frappe.db.get_value("Sales Invoice", self.consolidated_invoice, "docstatus") == 1
+		):
 			pos_closing_entry = frappe.get_all(
 				"POS Invoice Reference",
 				ignore_permissions=True,
-				filters={ 'pos_invoice': self.name },
+				filters={"pos_invoice": self.name},
 				pluck="parent",
-				limit=1
+				limit=1,
 			)
 			frappe.throw(
-				_('You need to cancel POS Closing Entry {} to be able to cancel this document.').format(
+				_("You need to cancel POS Closing Entry {} to be able to cancel this document.").format(
 					get_link_to_form("POS Closing Entry", pos_closing_entry[0])
 				),
-				title=_('Not Allowed')
+				title=_("Not Allowed"),
 			)
 
 	def on_cancel(self):
@@ -100,16 +107,22 @@
 
 		if self.coupon_code:
 			from erpnext.accounts.doctype.pricing_rule.utils import update_coupon_code_count
-			update_coupon_code_count(self.coupon_code,'cancelled')
+
+			update_coupon_code_count(self.coupon_code, "cancelled")
 
 	def check_phone_payments(self):
 		for pay in self.payments:
 			if pay.type == "Phone" and pay.amount >= 0:
-				paid_amt = frappe.db.get_value("Payment Request",
+				paid_amt = frappe.db.get_value(
+					"Payment Request",
 					filters=dict(
-						reference_doctype="POS Invoice", reference_name=self.name,
-						mode_of_payment=pay.mode_of_payment, status="Paid"),
-					fieldname="grand_total")
+						reference_doctype="POS Invoice",
+						reference_name=self.name,
+						mode_of_payment=pay.mode_of_payment,
+						status="Paid",
+					),
+					fieldname="grand_total",
+				)
 
 				if paid_amt and pay.amount != paid_amt:
 					return frappe.throw(_("Payment related to {0} is not completed").format(pay.mode_of_payment))
@@ -123,47 +136,73 @@
 		reserved_serial_nos = get_pos_reserved_serial_nos(filters)
 		invalid_serial_nos = [s for s in serial_nos if s in reserved_serial_nos]
 
-		bold_invalid_serial_nos = frappe.bold(', '.join(invalid_serial_nos))
+		bold_invalid_serial_nos = frappe.bold(", ".join(invalid_serial_nos))
 		if len(invalid_serial_nos) == 1:
-			frappe.throw(_("Row #{}: Serial No. {} has already been transacted into another POS Invoice. Please select valid serial no.")
-						.format(item.idx, bold_invalid_serial_nos), title=_("Item Unavailable"))
+			frappe.throw(
+				_(
+					"Row #{}: Serial No. {} has already been transacted into another POS Invoice. Please select valid serial no."
+				).format(item.idx, bold_invalid_serial_nos),
+				title=_("Item Unavailable"),
+			)
 		elif invalid_serial_nos:
-			frappe.throw(_("Row #{}: Serial Nos. {} have already been transacted into another POS Invoice. Please select valid serial no.")
-						.format(item.idx, bold_invalid_serial_nos), title=_("Item Unavailable"))
+			frappe.throw(
+				_(
+					"Row #{}: Serial Nos. {} have already been transacted into another POS Invoice. Please select valid serial no."
+				).format(item.idx, bold_invalid_serial_nos),
+				title=_("Item Unavailable"),
+			)
 
 	def validate_pos_reserved_batch_qty(self, item):
-		filters = {"item_code": item.item_code, "warehouse": item.warehouse, "batch_no":item.batch_no}
+		filters = {"item_code": item.item_code, "warehouse": item.warehouse, "batch_no": item.batch_no}
 
 		available_batch_qty = get_batch_qty(item.batch_no, item.warehouse, item.item_code)
 		reserved_batch_qty = get_pos_reserved_batch_qty(filters)
 
 		bold_item_name = frappe.bold(item.item_name)
-		bold_extra_batch_qty_needed = frappe.bold(abs(available_batch_qty - reserved_batch_qty - item.qty))
+		bold_extra_batch_qty_needed = frappe.bold(
+			abs(available_batch_qty - reserved_batch_qty - item.qty)
+		)
 		bold_invalid_batch_no = frappe.bold(item.batch_no)
 
 		if (available_batch_qty - reserved_batch_qty) == 0:
-			frappe.throw(_("Row #{}: Batch No. {} of item {} has no stock available. Please select valid batch no.")
-						.format(item.idx, bold_invalid_batch_no, bold_item_name), title=_("Item Unavailable"))
+			frappe.throw(
+				_(
+					"Row #{}: Batch No. {} of item {} has no stock available. Please select valid batch no."
+				).format(item.idx, bold_invalid_batch_no, bold_item_name),
+				title=_("Item Unavailable"),
+			)
 		elif (available_batch_qty - reserved_batch_qty - item.qty) < 0:
-			frappe.throw(_("Row #{}: Batch No. {} of item {} has less than required stock available, {} more required")
-						.format(item.idx, bold_invalid_batch_no, bold_item_name, bold_extra_batch_qty_needed), title=_("Item Unavailable"))
+			frappe.throw(
+				_(
+					"Row #{}: Batch No. {} of item {} has less than required stock available, {} more required"
+				).format(
+					item.idx, bold_invalid_batch_no, bold_item_name, bold_extra_batch_qty_needed
+				),
+				title=_("Item Unavailable"),
+			)
 
 	def validate_delivered_serial_nos(self, item):
 		delivered_serial_nos = get_delivered_serial_nos(item.serial_no)
 
 		if delivered_serial_nos:
-			bold_delivered_serial_nos = frappe.bold(', '.join(delivered_serial_nos))
-			frappe.throw(_("Row #{}: Serial No. {} has already been transacted into another Sales Invoice. Please select valid serial no.")
-						.format(item.idx, bold_delivered_serial_nos), title=_("Item Unavailable"))
+			bold_delivered_serial_nos = frappe.bold(", ".join(delivered_serial_nos))
+			frappe.throw(
+				_(
+					"Row #{}: Serial No. {} has already been transacted into another Sales Invoice. Please select valid serial no."
+				).format(item.idx, bold_delivered_serial_nos),
+				title=_("Item Unavailable"),
+			)
 
 	def validate_invalid_serial_nos(self, item):
 		serial_nos = get_serial_nos(item.serial_no)
 		error_msg = []
 		invalid_serials, msg = "", ""
 		for serial_no in serial_nos:
-			if not frappe.db.exists('Serial No', serial_no):
+			if not frappe.db.exists("Serial No", serial_no):
 				invalid_serials = invalid_serials + (", " if invalid_serials else "") + serial_no
-		msg = (_("Row #{}: Following Serial numbers for item {} are <b>Invalid</b>: {}").format(item.idx, frappe.bold(item.get("item_code")), frappe.bold(invalid_serials)))
+		msg = _("Row #{}: Following Serial numbers for item {} are <b>Invalid</b>: {}").format(
+			item.idx, frappe.bold(item.get("item_code")), frappe.bold(invalid_serials)
+		)
 		if invalid_serials:
 			error_msg.append(msg)
 
@@ -174,13 +213,15 @@
 		if self.is_return:
 			return
 
-		if self.docstatus.is_draft() and not frappe.db.get_value('POS Profile', self.pos_profile, 'validate_stock_on_save'):
+		if self.docstatus.is_draft() and not frappe.db.get_value(
+			"POS Profile", self.pos_profile, "validate_stock_on_save"
+		):
 			return
 
 		from erpnext.stock.stock_ledger import is_negative_stock_allowed
 
-		for d in self.get('items'):
-			is_service_item = not (frappe.db.get_value('Item', d.get('item_code'), 'is_stock_item'))
+		for d in self.get("items"):
+			is_service_item = not (frappe.db.get_value("Item", d.get("item_code"), "is_stock_item"))
 			if is_service_item:
 				return
 			if d.serial_no:
@@ -195,13 +236,25 @@
 
 				available_stock, is_stock_item = get_stock_availability(d.item_code, d.warehouse)
 
-				item_code, warehouse, qty = frappe.bold(d.item_code), frappe.bold(d.warehouse), frappe.bold(d.qty)
+				item_code, warehouse, qty = (
+					frappe.bold(d.item_code),
+					frappe.bold(d.warehouse),
+					frappe.bold(d.qty),
+				)
 				if flt(available_stock) <= 0:
-					frappe.throw(_('Row #{}: Item Code: {} is not available under warehouse {}.')
-								.format(d.idx, item_code, warehouse), title=_("Item Unavailable"))
+					frappe.throw(
+						_("Row #{}: Item Code: {} is not available under warehouse {}.").format(
+							d.idx, item_code, warehouse
+						),
+						title=_("Item Unavailable"),
+					)
 				elif flt(available_stock) < flt(d.qty):
-					frappe.throw(_('Row #{}: Stock quantity not enough for Item Code: {} under warehouse {}. Available quantity {}.')
-								.format(d.idx, item_code, warehouse, available_stock), title=_("Item Unavailable"))
+					frappe.throw(
+						_(
+							"Row #{}: Stock quantity not enough for Item Code: {} under warehouse {}. Available quantity {}."
+						).format(d.idx, item_code, warehouse, available_stock),
+						title=_("Item Unavailable"),
+					)
 
 	def validate_serialised_or_batched_item(self):
 		error_msg = []
@@ -215,16 +268,21 @@
 			item_code = frappe.bold(d.item_code)
 			serial_nos = get_serial_nos(d.serial_no)
 			if serialized and batched and (no_batch_selected or no_serial_selected):
-				msg = (_('Row #{}: Please select a serial no and batch against item: {} or remove it to complete transaction.')
-							.format(d.idx, item_code))
+				msg = _(
+					"Row #{}: Please select a serial no and batch against item: {} or remove it to complete transaction."
+				).format(d.idx, item_code)
 			elif serialized and no_serial_selected:
-				msg = (_('Row #{}: No serial number selected against item: {}. Please select one or remove it to complete transaction.')
-							.format(d.idx, item_code))
+				msg = _(
+					"Row #{}: No serial number selected against item: {}. Please select one or remove it to complete transaction."
+				).format(d.idx, item_code)
 			elif batched and no_batch_selected:
-				msg = (_('Row #{}: No batch selected against item: {}. Please select a batch or remove it to complete transaction.')
-							.format(d.idx, item_code))
+				msg = _(
+					"Row #{}: No batch selected against item: {}. Please select a batch or remove it to complete transaction."
+				).format(d.idx, item_code)
 			elif serialized and not no_serial_selected and len(serial_nos) != d.qty:
-				msg = (_("Row #{}: You must select {} serial numbers for item {}.").format(d.idx, frappe.bold(cint(d.qty)), item_code))
+				msg = _("Row #{}: You must select {} serial numbers for item {}.").format(
+					d.idx, frappe.bold(cint(d.qty)), item_code
+				)
 
 			if msg:
 				error_msg.append(msg)
@@ -233,18 +291,22 @@
 			frappe.throw(error_msg, title=_("Invalid Item"), as_list=True)
 
 	def validate_return_items_qty(self):
-		if not self.get("is_return"): return
+		if not self.get("is_return"):
+			return
 
 		for d in self.get("items"):
 			if d.get("qty") > 0:
 				frappe.throw(
-					_("Row #{}: You cannot add postive quantities in a return invoice. Please remove item {} to complete the return.")
-					.format(d.idx, frappe.bold(d.item_code)), title=_("Invalid Item")
+					_(
+						"Row #{}: You cannot add postive quantities in a return invoice. Please remove item {} to complete the return."
+					).format(d.idx, frappe.bold(d.item_code)),
+					title=_("Invalid Item"),
 				)
 			if d.get("serial_no"):
 				serial_nos = get_serial_nos(d.serial_no)
 				for sr in serial_nos:
-					serial_no_exists = frappe.db.sql("""
+					serial_no_exists = frappe.db.sql(
+						"""
 						SELECT name
 						FROM `tabPOS Invoice Item`
 						WHERE
@@ -254,14 +316,17 @@
 								or serial_no like %s
 								or serial_no like %s
 							)
-					""", (self.return_against, sr, sr+'\n%', '%\n'+sr, '%\n'+sr+'\n%'))
+					""",
+						(self.return_against, sr, sr + "\n%", "%\n" + sr, "%\n" + sr + "\n%"),
+					)
 
 					if not serial_no_exists:
 						bold_return_against = frappe.bold(self.return_against)
 						bold_serial_no = frappe.bold(sr)
 						frappe.throw(
-							_("Row #{}: Serial No {} cannot be returned since it was not transacted in original invoice {}")
-							.format(d.idx, bold_serial_no, bold_return_against)
+							_(
+								"Row #{}: Serial No {} cannot be returned since it was not transacted in original invoice {}"
+							).format(d.idx, bold_serial_no, bold_return_against)
 						)
 
 	def validate_mode_of_payment(self):
@@ -269,16 +334,25 @@
 			frappe.throw(_("At least one mode of payment is required for POS invoice."))
 
 	def validate_change_account(self):
-		if self.change_amount and self.account_for_change_amount and \
-			frappe.db.get_value("Account", self.account_for_change_amount, "company") != self.company:
-			frappe.throw(_("The selected change account {} doesn't belongs to Company {}.").format(self.account_for_change_amount, self.company))
+		if (
+			self.change_amount
+			and self.account_for_change_amount
+			and frappe.db.get_value("Account", self.account_for_change_amount, "company") != self.company
+		):
+			frappe.throw(
+				_("The selected change account {} doesn't belongs to Company {}.").format(
+					self.account_for_change_amount, self.company
+				)
+			)
 
 	def validate_change_amount(self):
 		grand_total = flt(self.rounded_total) or flt(self.grand_total)
 		base_grand_total = flt(self.base_rounded_total) or flt(self.base_grand_total)
 		if not flt(self.change_amount) and grand_total < flt(self.paid_amount):
 			self.change_amount = flt(self.paid_amount - grand_total + flt(self.write_off_amount))
-			self.base_change_amount = flt(self.base_paid_amount) - base_grand_total + flt(self.base_write_off_amount)
+			self.base_change_amount = (
+				flt(self.base_paid_amount) - base_grand_total + flt(self.base_write_off_amount)
+			)
 
 		if flt(self.change_amount) and not self.account_for_change_amount:
 			frappe.msgprint(_("Please enter Account for Change Amount"), raise_exception=1)
@@ -298,8 +372,12 @@
 				frappe.throw(_("Total payments amount can't be greater than {}").format(-invoice_total))
 
 	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 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:
@@ -310,8 +388,8 @@
 
 	def set_status(self, update=False, status=None, update_modified=True):
 		if self.is_new():
-			if self.get('amended_from'):
-				self.status = 'Draft'
+			if self.get("amended_from"):
+				self.status = "Draft"
 			return
 
 		if not status:
@@ -320,19 +398,35 @@
 			elif self.docstatus == 1:
 				if self.consolidated_invoice:
 					self.status = "Consolidated"
-				elif flt(self.outstanding_amount) > 0 and getdate(self.due_date) < getdate(nowdate()) and self.is_discounted and self.get_discounting_status()=='Disbursed':
+				elif (
+					flt(self.outstanding_amount) > 0
+					and getdate(self.due_date) < getdate(nowdate())
+					and self.is_discounted
+					and self.get_discounting_status() == "Disbursed"
+				):
 					self.status = "Overdue and Discounted"
 				elif flt(self.outstanding_amount) > 0 and getdate(self.due_date) < getdate(nowdate()):
 					self.status = "Overdue"
-				elif flt(self.outstanding_amount) > 0 and getdate(self.due_date) >= getdate(nowdate()) and self.is_discounted and self.get_discounting_status()=='Disbursed':
+				elif (
+					flt(self.outstanding_amount) > 0
+					and getdate(self.due_date) >= getdate(nowdate())
+					and self.is_discounted
+					and self.get_discounting_status() == "Disbursed"
+				):
 					self.status = "Unpaid and Discounted"
 				elif flt(self.outstanding_amount) > 0 and getdate(self.due_date) >= getdate(nowdate()):
 					self.status = "Unpaid"
-				elif flt(self.outstanding_amount) <= 0 and self.is_return == 0 and frappe.db.get_value('POS Invoice', {'is_return': 1, 'return_against': self.name, 'docstatus': 1}):
+				elif (
+					flt(self.outstanding_amount) <= 0
+					and self.is_return == 0
+					and frappe.db.get_value(
+						"POS Invoice", {"is_return": 1, "return_against": self.name, "docstatus": 1}
+					)
+				):
 					self.status = "Credit Note Issued"
 				elif self.is_return == 1:
 					self.status = "Return"
-				elif flt(self.outstanding_amount)<=0:
+				elif flt(self.outstanding_amount) <= 0:
 					self.status = "Paid"
 				else:
 					self.status = "Submitted"
@@ -340,22 +434,23 @@
 				self.status = "Draft"
 
 		if update:
-			self.db_set('status', self.status, update_modified = update_modified)
+			self.db_set("status", self.status, update_modified=update_modified)
 
 	def set_pos_fields(self, for_validate=False):
 		"""Set retail related fields from POS Profiles"""
 		from erpnext.stock.get_item_details import get_pos_profile, get_pos_profile_item_details
+
 		if not self.pos_profile:
 			pos_profile = get_pos_profile(self.company) or {}
 			if not pos_profile:
 				frappe.throw(_("No POS Profile found. Please create a New POS Profile first"))
-			self.pos_profile = pos_profile.get('name')
+			self.pos_profile = pos_profile.get("name")
 
 		profile = {}
 		if self.pos_profile:
-			profile = frappe.get_doc('POS Profile', self.pos_profile)
+			profile = frappe.get_doc("POS Profile", self.pos_profile)
 
-		if not self.get('payments') and not for_validate:
+		if not self.get("payments") and not for_validate:
 			update_multi_mode_option(self, profile)
 
 		if self.is_return and not for_validate:
@@ -365,35 +460,55 @@
 			if not for_validate and not self.customer:
 				self.customer = profile.customer
 
-			self.account_for_change_amount = profile.get('account_for_change_amount') or self.account_for_change_amount
-			self.set_warehouse = profile.get('warehouse') or self.set_warehouse
+			self.account_for_change_amount = (
+				profile.get("account_for_change_amount") or self.account_for_change_amount
+			)
+			self.set_warehouse = profile.get("warehouse") or self.set_warehouse
 
-			for fieldname in ('currency', 'letter_head', 'tc_name',
-				'company', 'select_print_heading', 'write_off_account', 'taxes_and_charges',
-				'write_off_cost_center', 'apply_discount_on', 'cost_center', 'tax_category',
-				'ignore_pricing_rule', 'company_address', 'update_stock'):
-					if not for_validate:
-						self.set(fieldname, profile.get(fieldname))
+			for fieldname in (
+				"currency",
+				"letter_head",
+				"tc_name",
+				"company",
+				"select_print_heading",
+				"write_off_account",
+				"taxes_and_charges",
+				"write_off_cost_center",
+				"apply_discount_on",
+				"cost_center",
+				"tax_category",
+				"ignore_pricing_rule",
+				"company_address",
+				"update_stock",
+			):
+				if not for_validate:
+					self.set(fieldname, profile.get(fieldname))
 
 			if self.customer:
 				customer_price_list, customer_group, customer_currency = frappe.db.get_value(
-					"Customer", self.customer, ['default_price_list', 'customer_group', 'default_currency']
+					"Customer", self.customer, ["default_price_list", "customer_group", "default_currency"]
 				)
-				customer_group_price_list = frappe.db.get_value("Customer Group", customer_group, 'default_price_list')
-				selling_price_list = customer_price_list or customer_group_price_list or profile.get('selling_price_list')
-				if customer_currency != profile.get('currency'):
-					self.set('currency', customer_currency)
+				customer_group_price_list = frappe.db.get_value(
+					"Customer Group", customer_group, "default_price_list"
+				)
+				selling_price_list = (
+					customer_price_list or customer_group_price_list or profile.get("selling_price_list")
+				)
+				if customer_currency != profile.get("currency"):
+					self.set("currency", customer_currency)
 
 			else:
-				selling_price_list = profile.get('selling_price_list')
+				selling_price_list = profile.get("selling_price_list")
 
 			if selling_price_list:
-				self.set('selling_price_list', selling_price_list)
+				self.set("selling_price_list", selling_price_list)
 
 			# set pos values in items
 			for item in self.get("items"):
-				if item.get('item_code'):
-					profile_details = get_pos_profile_item_details(profile.get("company"), frappe._dict(item.as_dict()), profile)
+				if item.get("item_code"):
+					profile_details = get_pos_profile_item_details(
+						profile.get("company"), frappe._dict(item.as_dict()), profile
+					)
 					for fname, val in profile_details.items():
 						if (not for_validate) or (for_validate and not item.get(fname)):
 							item.set(fname, val)
@@ -407,7 +522,9 @@
 				self.set_taxes()
 
 		if not self.account_for_change_amount:
-			self.account_for_change_amount = frappe.get_cached_value('Company',  self.company,  'default_cash_account')
+			self.account_for_change_amount = frappe.get_cached_value(
+				"Company", self.company, "default_cash_account"
+			)
 
 		return profile
 
@@ -417,27 +534,29 @@
 
 		if not self.debit_to:
 			self.debit_to = get_party_account("Customer", self.customer, self.company)
-			self.party_account_currency = frappe.db.get_value("Account", self.debit_to, "account_currency", cache=True)
+			self.party_account_currency = frappe.db.get_value(
+				"Account", self.debit_to, "account_currency", cache=True
+			)
 		if not self.due_date and self.customer:
 			self.due_date = get_due_date(self.posting_date, "Customer", self.customer, self.company)
 
 		super(SalesInvoice, self).set_missing_values(for_validate)
 
 		print_format = profile.get("print_format") if profile else None
-		if not print_format and not cint(frappe.db.get_value('Print Format', 'POS Invoice', 'disabled')):
-			print_format = 'POS Invoice'
+		if not print_format and not cint(frappe.db.get_value("Print Format", "POS Invoice", "disabled")):
+			print_format = "POS Invoice"
 
 		if profile:
 			return {
 				"print_format": print_format,
 				"campaign": profile.get("campaign"),
-				"allow_print_before_pay": profile.get("allow_print_before_pay")
+				"allow_print_before_pay": profile.get("allow_print_before_pay"),
 			}
 
 	@frappe.whitelist()
 	def reset_mode_of_payments(self):
 		if self.pos_profile:
-			pos_profile = frappe.get_cached_doc('POS Profile', self.pos_profile)
+			pos_profile = frappe.get_cached_doc("POS Profile", self.pos_profile)
 			update_multi_mode_option(self, pos_profile)
 			self.paid_amount = 0
 
@@ -466,9 +585,13 @@
 				return pay_req
 
 	def get_new_payment_request(self, mop):
-		payment_gateway_account = frappe.db.get_value("Payment Gateway Account", {
-			"payment_account": mop.account,
-		}, ["name"])
+		payment_gateway_account = frappe.db.get_value(
+			"Payment Gateway Account",
+			{
+				"payment_account": mop.account,
+			},
+			["name"],
+		)
 
 		args = {
 			"dt": "POS Invoice",
@@ -479,35 +602,40 @@
 			"payment_request_type": "Inward",
 			"party_type": "Customer",
 			"party": self.customer,
-			"return_doc": True
+			"return_doc": True,
 		}
 		return make_payment_request(**args)
 
 	def get_existing_payment_request(self, pay):
-		payment_gateway_account = frappe.db.get_value("Payment Gateway Account", {
-			"payment_account": pay.account,
-		}, ["name"])
+		payment_gateway_account = frappe.db.get_value(
+			"Payment Gateway Account",
+			{
+				"payment_account": pay.account,
+			},
+			["name"],
+		)
 
 		filters = {
-			'reference_doctype': 'POS Invoice',
-			'reference_name': self.name,
-			'payment_gateway_account': payment_gateway_account,
-			'email_to': self.contact_mobile
+			"reference_doctype": "POS Invoice",
+			"reference_name": self.name,
+			"payment_gateway_account": payment_gateway_account,
+			"email_to": self.contact_mobile,
 		}
-		pr = frappe.db.get_value('Payment Request', filters=filters)
+		pr = frappe.db.get_value("Payment Request", filters=filters)
 		if pr:
-			return frappe.get_doc('Payment Request', pr)
+			return frappe.get_doc("Payment Request", pr)
+
 
 @frappe.whitelist()
 def get_stock_availability(item_code, warehouse):
-	if frappe.db.get_value('Item', item_code, 'is_stock_item'):
+	if frappe.db.get_value("Item", item_code, "is_stock_item"):
 		is_stock_item = True
 		bin_qty = get_bin_qty(item_code, warehouse)
 		pos_sales_qty = get_pos_reserved_qty(item_code, warehouse)
 		return bin_qty - pos_sales_qty, is_stock_item
 	else:
 		is_stock_item = False
-		if frappe.db.exists('Product Bundle', item_code):
+		if frappe.db.exists("Product Bundle", item_code):
 			return get_bundle_availability(item_code, warehouse), is_stock_item
 		else:
 			# Is a service item
@@ -515,7 +643,7 @@
 
 
 def get_bundle_availability(bundle_item_code, warehouse):
-	product_bundle = frappe.get_doc('Product Bundle', bundle_item_code)
+	product_bundle = frappe.get_doc("Product Bundle", bundle_item_code)
 
 	bundle_bin_qty = 1000000
 	for item in product_bundle.items:
@@ -530,68 +658,87 @@
 	pos_sales_qty = get_pos_reserved_qty(bundle_item_code, warehouse)
 	return bundle_bin_qty - pos_sales_qty
 
+
 def get_bin_qty(item_code, warehouse):
-	bin_qty = frappe.db.sql("""select actual_qty from `tabBin`
+	bin_qty = frappe.db.sql(
+		"""select actual_qty from `tabBin`
 		where item_code = %s and warehouse = %s
-		limit 1""", (item_code, warehouse), as_dict=1)
+		limit 1""",
+		(item_code, warehouse),
+		as_dict=1,
+	)
 
 	return bin_qty[0].actual_qty or 0 if bin_qty else 0
 
+
 def get_pos_reserved_qty(item_code, warehouse):
-	reserved_qty = frappe.db.sql("""select sum(p_item.qty) as qty
+	reserved_qty = frappe.db.sql(
+		"""select sum(p_item.qty) as qty
 		from `tabPOS Invoice` p, `tabPOS Invoice Item` p_item
 		where p.name = p_item.parent
 		and ifnull(p.consolidated_invoice, '') = ''
 		and p_item.docstatus = 1
 		and p_item.item_code = %s
 		and p_item.warehouse = %s
-		""", (item_code, warehouse), as_dict=1)
+		""",
+		(item_code, warehouse),
+		as_dict=1,
+	)
 
 	return reserved_qty[0].qty or 0 if reserved_qty else 0
 
+
 @frappe.whitelist()
 def make_sales_return(source_name, target_doc=None):
 	from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 	return make_return_doc("POS Invoice", source_name, target_doc)
 
+
 @frappe.whitelist()
 def make_merge_log(invoices):
 	import json
 
-
 	if isinstance(invoices, str):
 		invoices = json.loads(invoices)
 
 	if len(invoices) == 0:
-		frappe.throw(_('Atleast one invoice has to be selected.'))
+		frappe.throw(_("Atleast one invoice has to be selected."))
 
 	merge_log = frappe.new_doc("POS Invoice Merge Log")
 	merge_log.posting_date = getdate(nowdate())
 	for inv in invoices:
-		inv_data = frappe.db.get_values("POS Invoice", inv.get('name'),
-			["customer", "posting_date", "grand_total"], as_dict=1)[0]
+		inv_data = frappe.db.get_values(
+			"POS Invoice", inv.get("name"), ["customer", "posting_date", "grand_total"], as_dict=1
+		)[0]
 		merge_log.customer = inv_data.customer
-		merge_log.append("pos_invoices", {
-			'pos_invoice': inv.get('name'),
-			'customer': inv_data.customer,
-			'posting_date': inv_data.posting_date,
-			'grand_total': inv_data.grand_total
-		})
+		merge_log.append(
+			"pos_invoices",
+			{
+				"pos_invoice": inv.get("name"),
+				"customer": inv_data.customer,
+				"posting_date": inv_data.posting_date,
+				"grand_total": inv_data.grand_total,
+			},
+		)
 
-	if merge_log.get('pos_invoices'):
+	if merge_log.get("pos_invoices"):
 		return merge_log.as_dict()
 
+
 def add_return_modes(doc, pos_profile):
 	def append_payment(payment_mode):
-		payment = doc.append('payments', {})
+		payment = doc.append("payments", {})
 		payment.default = payment_mode.default
 		payment.mode_of_payment = payment_mode.parent
 		payment.account = payment_mode.default_account
 		payment.type = payment_mode.type
 
-	for pos_payment_method in pos_profile.get('payments'):
+	for pos_payment_method in pos_profile.get("payments"):
 		pos_payment_method = pos_payment_method.as_dict()
 		mode_of_payment = pos_payment_method.mode_of_payment
-		if pos_payment_method.allow_in_returns and not [d for d in doc.get('payments') if d.mode_of_payment == mode_of_payment]:
+		if pos_payment_method.allow_in_returns and not [
+			d for d in doc.get("payments") if d.mode_of_payment == mode_of_payment
+		]:
 			payment_mode = get_mode_of_payment_info(mode_of_payment, doc.company)
 			append_payment(payment_mode[0])
diff --git a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py
index e06f7aa..70f128e 100644
--- a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py
+++ b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py
@@ -35,29 +35,34 @@
 		w2 = frappe.get_doc(w.doctype, w.name)
 
 		import time
+
 		time.sleep(1)
 		w.save()
 
 		import time
+
 		time.sleep(1)
 		self.assertRaises(frappe.TimestampMismatchError, w2.save)
 
 	def test_change_naming_series(self):
 		inv = create_pos_invoice(do_not_submit=1)
-		inv.naming_series = 'TEST-'
+		inv.naming_series = "TEST-"
 
 		self.assertRaises(frappe.CannotChangeConstantError, inv.save)
 
 	def test_discount_and_inclusive_tax(self):
 		inv = create_pos_invoice(qty=100, rate=50, do_not_save=1)
-		inv.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 14,
-			'included_in_print_rate': 1
-		})
+		inv.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 14,
+				"included_in_print_rate": 1,
+			},
+		)
 		inv.insert()
 
 		self.assertEqual(inv.net_total, 4385.96)
@@ -66,7 +71,7 @@
 		inv.reload()
 
 		inv.discount_amount = 100
-		inv.apply_discount_on = 'Net Total'
+		inv.apply_discount_on = "Net Total"
 		inv.payment_schedule = []
 
 		inv.save()
@@ -77,7 +82,7 @@
 		inv.reload()
 
 		inv.discount_amount = 100
-		inv.apply_discount_on = 'Grand Total'
+		inv.apply_discount_on = "Grand Total"
 		inv.payment_schedule = []
 
 		inv.save()
@@ -93,14 +98,17 @@
 			item_row_copy.qty = qty
 			inv.append("items", item_row_copy)
 
-		inv.append("taxes", {
-			"account_head": "_Test Account VAT - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "VAT",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 19
-		})
+		inv.append(
+			"taxes",
+			{
+				"account_head": "_Test Account VAT - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "VAT",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 19,
+			},
+		)
 		inv.insert()
 
 		self.assertEqual(inv.net_total, 4600)
@@ -115,10 +123,10 @@
 		item_row = inv.get("items")[0]
 
 		add_items = [
-			(54, '_Test Account Excise Duty @ 12 - _TC'),
-			(288, '_Test Account Excise Duty @ 15 - _TC'),
-			(144, '_Test Account Excise Duty @ 20 - _TC'),
-			(430, '_Test Item Tax Template 1 - _TC')
+			(54, "_Test Account Excise Duty @ 12 - _TC"),
+			(288, "_Test Account Excise Duty @ 15 - _TC"),
+			(144, "_Test Account Excise Duty @ 20 - _TC"),
+			(430, "_Test Item Tax Template 1 - _TC"),
 		]
 		for qty, item_tax_template in add_items:
 			item_row_copy = copy.deepcopy(item_row)
@@ -126,30 +134,39 @@
 			item_row_copy.item_tax_template = item_tax_template
 			inv.append("items", item_row_copy)
 
-		inv.append("taxes", {
-			"account_head": "_Test Account Excise Duty - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Excise Duty",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 11
-		})
-		inv.append("taxes", {
-			"account_head": "_Test Account Education Cess - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Education Cess",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 0
-		})
-		inv.append("taxes", {
-			"account_head": "_Test Account S&H Education Cess - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "S&H Education Cess",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 3
-		})
+		inv.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Excise Duty - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Excise Duty",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 11,
+			},
+		)
+		inv.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Education Cess - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Education Cess",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 0,
+			},
+		)
+		inv.append(
+			"taxes",
+			{
+				"account_head": "_Test Account S&H Education Cess - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "S&H Education Cess",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 3,
+			},
+		)
 		inv.insert()
 
 		self.assertEqual(inv.net_total, 4600)
@@ -179,14 +196,17 @@
 		inv.apply_discount_on = "Net Total"
 		inv.discount_amount = 75.0
 
-		inv.append("taxes", {
-			"account_head": "_Test Account VAT - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "VAT",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 24
-		})
+		inv.append(
+			"taxes",
+			{
+				"account_head": "_Test Account VAT - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "VAT",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 24,
+			},
+		)
 		inv.insert()
 
 		self.assertEqual(inv.total, 975)
@@ -198,11 +218,15 @@
 		self.assertEqual(inv.grand_total, 1116.0)
 
 	def test_pos_returns_with_repayment(self):
-		pos = create_pos_invoice(qty = 10, do_not_save=True)
+		pos = create_pos_invoice(qty=10, do_not_save=True)
 
-		pos.set('payments', [])
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 500})
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 500, 'default': 1})
+		pos.set("payments", [])
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 500}
+		)
+		pos.append(
+			"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 500, "default": 1}
+		)
 		pos.insert()
 		pos.submit()
 
@@ -211,25 +235,39 @@
 		pos_return.insert()
 		pos_return.submit()
 
-		self.assertEqual(pos_return.get('payments')[0].amount, -500)
-		self.assertEqual(pos_return.get('payments')[1].amount, -500)
+		self.assertEqual(pos_return.get("payments")[0].amount, -500)
+		self.assertEqual(pos_return.get("payments")[1].amount, -500)
 
 	def test_pos_return_for_serialized_item(self):
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		se = make_serialized_item(company='_Test Company',
-			target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC')
+		se = make_serialized_item(
+			company="_Test Company",
+			target_warehouse="Stores - _TC",
+			cost_center="Main - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+		)
 
 		serial_nos = get_serial_nos(se.get("items")[0].serial_no)
 
-		pos = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, rate=1000, do_not_save=1)
+		pos = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			rate=1000,
+			do_not_save=1,
+		)
 
 		pos.get("items")[0].serial_no = serial_nos[0]
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 1000, 'default': 1})
+		pos.append(
+			"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 1000, "default": 1}
+		)
 
 		pos.insert()
 		pos.submit()
@@ -238,24 +276,39 @@
 
 		pos_return.insert()
 		pos_return.submit()
-		self.assertEqual(pos_return.get('items')[0].serial_no, serial_nos[0])
+		self.assertEqual(pos_return.get("items")[0].serial_no, serial_nos[0])
 
 	def test_partial_pos_returns(self):
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		se = make_serialized_item(company='_Test Company',
-			target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC')
+		se = make_serialized_item(
+			company="_Test Company",
+			target_warehouse="Stores - _TC",
+			cost_center="Main - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+		)
 
 		serial_nos = get_serial_nos(se.get("items")[0].serial_no)
 
-		pos = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, qty=2, rate=1000, do_not_save=1)
+		pos = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			qty=2,
+			rate=1000,
+			do_not_save=1,
+		)
 
 		pos.get("items")[0].serial_no = serial_nos[0] + "\n" + serial_nos[1]
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 1000, 'default': 1})
+		pos.append(
+			"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 1000, "default": 1}
+		)
 
 		pos.insert()
 		pos.submit()
@@ -263,24 +316,34 @@
 		pos_return1 = make_sales_return(pos.name)
 
 		# partial return 1
-		pos_return1.get('items')[0].qty = -1
-		pos_return1.get('items')[0].serial_no = serial_nos[0]
+		pos_return1.get("items")[0].qty = -1
+		pos_return1.get("items")[0].serial_no = serial_nos[0]
 		pos_return1.insert()
 		pos_return1.submit()
 
 		# partial return 2
 		pos_return2 = make_sales_return(pos.name)
-		self.assertEqual(pos_return2.get('items')[0].qty, -1)
-		self.assertEqual(pos_return2.get('items')[0].serial_no, serial_nos[1])
+		self.assertEqual(pos_return2.get("items")[0].qty, -1)
+		self.assertEqual(pos_return2.get("items")[0].serial_no, serial_nos[1])
 
 	def test_pos_change_amount(self):
-		pos = create_pos_invoice(company= "_Test Company", debit_to="Debtors - _TC",
-			income_account = "Sales - _TC", expense_account = "Cost of Goods Sold - _TC", rate=105,
-			cost_center = "Main - _TC", do_not_save=True)
+		pos = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			rate=105,
+			cost_center="Main - _TC",
+			do_not_save=True,
+		)
 
-		pos.set('payments', [])
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 50})
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 60, 'default': 1})
+		pos.set("payments", [])
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 50}
+		)
+		pos.append(
+			"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60, "default": 1}
+		)
 
 		pos.insert()
 		pos.submit()
@@ -298,29 +361,53 @@
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		se = make_serialized_item(company='_Test Company',
-			target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC')
+		se = make_serialized_item(
+			company="_Test Company",
+			target_warehouse="Stores - _TC",
+			cost_center="Main - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+		)
 
 		serial_nos = get_serial_nos(se.get("items")[0].serial_no)
 
-		pos = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, rate=1000, do_not_save=1)
+		pos = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			rate=1000,
+			do_not_save=1,
+		)
 
 		pos.get("items")[0].serial_no = serial_nos[0]
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000})
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 1000}
+		)
 
 		pos.insert()
 		pos.submit()
 
-		pos2 = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, rate=1000, do_not_save=1)
+		pos2 = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			rate=1000,
+			do_not_save=1,
+		)
 
 		pos2.get("items")[0].serial_no = serial_nos[0]
-		pos2.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000})
+		pos2.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 1000}
+		)
 
 		pos2.insert()
 		self.assertRaises(frappe.ValidationError, pos2.submit)
@@ -329,28 +416,50 @@
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		se = make_serialized_item(company='_Test Company',
-			target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC')
+		se = make_serialized_item(
+			company="_Test Company",
+			target_warehouse="Stores - _TC",
+			cost_center="Main - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+		)
 
 		serial_nos = get_serial_nos(se.get("items")[0].serial_no)
 
-		si = create_sales_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, rate=1000, do_not_save=1)
+		si = create_sales_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			rate=1000,
+			do_not_save=1,
+		)
 
 		si.get("items")[0].serial_no = serial_nos[0]
 		si.update_stock = 1
 		si.insert()
 		si.submit()
 
-		pos2 = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, rate=1000, do_not_save=1)
+		pos2 = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			rate=1000,
+			do_not_save=1,
+		)
 
 		pos2.get("items")[0].serial_no = serial_nos[0]
-		pos2.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 1000})
+		pos2.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 1000}
+		)
 
 		pos2.insert()
 		self.assertRaises(frappe.ValidationError, pos2.submit)
@@ -358,17 +467,30 @@
 	def test_invalid_serial_no_validation(self):
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		se = make_serialized_item(company='_Test Company',
-			target_warehouse="Stores - _TC", cost_center='Main - _TC', expense_account='Cost of Goods Sold - _TC')
-		serial_nos = se.get("items")[0].serial_no + 'wrong'
+		se = make_serialized_item(
+			company="_Test Company",
+			target_warehouse="Stores - _TC",
+			cost_center="Main - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+		)
+		serial_nos = se.get("items")[0].serial_no + "wrong"
 
-		pos = create_pos_invoice(company='_Test Company', debit_to='Debtors - _TC',
-			account_for_change_amount='Cash - _TC', warehouse='Stores - _TC', income_account='Sales - _TC',
-			expense_account='Cost of Goods Sold - _TC', cost_center='Main - _TC',
-			item=se.get("items")[0].item_code, rate=1000, qty=2, do_not_save=1)
+		pos = create_pos_invoice(
+			company="_Test Company",
+			debit_to="Debtors - _TC",
+			account_for_change_amount="Cash - _TC",
+			warehouse="Stores - _TC",
+			income_account="Sales - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+			item=se.get("items")[0].item_code,
+			rate=1000,
+			qty=2,
+			do_not_save=1,
+		)
 
-		pos.get('items')[0].has_serial_no = 1
-		pos.get('items')[0].serial_no = serial_nos
+		pos.get("items")[0].has_serial_no = 1
+		pos.get("items")[0].serial_no = serial_nos
 		pos.insert()
 
 		self.assertRaises(frappe.ValidationError, pos.submit)
@@ -380,20 +502,31 @@
 		from erpnext.accounts.doctype.loyalty_program.test_loyalty_program import create_records
 
 		create_records()
-		frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty")
-		before_lp_details = get_loyalty_program_details_with_points("Test Loyalty Customer", company="_Test Company", loyalty_program="Test Single Loyalty")
+		frappe.db.set_value(
+			"Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty"
+		)
+		before_lp_details = get_loyalty_program_details_with_points(
+			"Test Loyalty Customer", company="_Test Company", loyalty_program="Test Single Loyalty"
+		)
 
 		inv = create_pos_invoice(customer="Test Loyalty Customer", rate=10000)
 
-		lpe = frappe.get_doc('Loyalty Point Entry', {'invoice_type': 'POS Invoice', 'invoice': inv.name, 'customer': inv.customer})
-		after_lp_details = get_loyalty_program_details_with_points(inv.customer, company=inv.company, loyalty_program=inv.loyalty_program)
+		lpe = frappe.get_doc(
+			"Loyalty Point Entry",
+			{"invoice_type": "POS Invoice", "invoice": inv.name, "customer": inv.customer},
+		)
+		after_lp_details = get_loyalty_program_details_with_points(
+			inv.customer, company=inv.company, loyalty_program=inv.loyalty_program
+		)
 
-		self.assertEqual(inv.get('loyalty_program'), "Test Single Loyalty")
+		self.assertEqual(inv.get("loyalty_program"), "Test Single Loyalty")
 		self.assertEqual(lpe.loyalty_points, 10)
 		self.assertEqual(after_lp_details.loyalty_points, before_lp_details.loyalty_points + 10)
 
 		inv.cancel()
-		after_cancel_lp_details = get_loyalty_program_details_with_points(inv.customer, company=inv.company, loyalty_program=inv.loyalty_program)
+		after_cancel_lp_details = get_loyalty_program_details_with_points(
+			inv.customer, company=inv.company, loyalty_program=inv.loyalty_program
+		)
 		self.assertEqual(after_cancel_lp_details.loyalty_points, before_lp_details.loyalty_points)
 
 	def test_loyalty_points_redeemption(self):
@@ -404,17 +537,24 @@
 		# add 10 loyalty points
 		create_pos_invoice(customer="Test Loyalty Customer", rate=10000)
 
-		before_lp_details = get_loyalty_program_details_with_points("Test Loyalty Customer", company="_Test Company", loyalty_program="Test Single Loyalty")
+		before_lp_details = get_loyalty_program_details_with_points(
+			"Test Loyalty Customer", company="_Test Company", loyalty_program="Test Single Loyalty"
+		)
 
 		inv = create_pos_invoice(customer="Test Loyalty Customer", rate=10000, do_not_save=1)
 		inv.redeem_loyalty_points = 1
 		inv.loyalty_points = before_lp_details.loyalty_points
 		inv.loyalty_amount = inv.loyalty_points * before_lp_details.conversion_factor
-		inv.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 10000 - inv.loyalty_amount})
+		inv.append(
+			"payments",
+			{"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 10000 - inv.loyalty_amount},
+		)
 		inv.paid_amount = 10000
 		inv.submit()
 
-		after_redeem_lp_details = get_loyalty_program_details_with_points(inv.customer, company=inv.company, loyalty_program=inv.loyalty_program)
+		after_redeem_lp_details = get_loyalty_program_details_with_points(
+			inv.customer, company=inv.company, loyalty_program=inv.loyalty_program
+		)
 		self.assertEqual(after_redeem_lp_details.loyalty_points, 9)
 
 	def test_merging_into_sales_invoice_with_discount(self):
@@ -428,21 +568,19 @@
 		frappe.db.sql("delete from `tabPOS Invoice`")
 		test_user, pos_profile = init_user_and_profile()
 		pos_inv = create_pos_invoice(rate=300, additional_discount_percentage=10, do_not_submit=1)
-		pos_inv.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 270
-		})
+		pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 270})
 		pos_inv.submit()
 
 		pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
-		pos_inv2.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200
-		})
+		pos_inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200})
 		pos_inv2.submit()
 
 		consolidate_pos_invoices()
 
 		pos_inv.load_from_db()
-		rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total")
+		rounded_total = frappe.db.get_value(
+			"Sales Invoice", pos_inv.consolidated_invoice, "rounded_total"
+		)
 		self.assertEqual(rounded_total, 3470)
 
 	def test_merging_into_sales_invoice_with_discount_and_inclusive_tax(self):
@@ -456,38 +594,42 @@
 		frappe.db.sql("delete from `tabPOS Invoice`")
 		test_user, pos_profile = init_user_and_profile()
 		pos_inv = create_pos_invoice(rate=300, do_not_submit=1)
-		pos_inv.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300
-		})
-		pos_inv.append('taxes', {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 14,
-			'included_in_print_rate': 1
-		})
+		pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300})
+		pos_inv.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 14,
+				"included_in_print_rate": 1,
+			},
+		)
 		pos_inv.submit()
 
 		pos_inv2 = create_pos_invoice(rate=300, qty=2, do_not_submit=1)
 		pos_inv2.additional_discount_percentage = 10
-		pos_inv2.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 540
-		})
-		pos_inv2.append('taxes', {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 14,
-			'included_in_print_rate': 1
-		})
+		pos_inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 540})
+		pos_inv2.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 14,
+				"included_in_print_rate": 1,
+			},
+		)
 		pos_inv2.submit()
 
 		consolidate_pos_invoices()
 
 		pos_inv.load_from_db()
-		rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total")
+		rounded_total = frappe.db.get_value(
+			"Sales Invoice", pos_inv.consolidated_invoice, "rounded_total"
+		)
 		self.assertEqual(rounded_total, 840)
 
 	def test_merging_with_validate_selling_price(self):
@@ -507,64 +649,75 @@
 		frappe.db.sql("delete from `tabPOS Invoice`")
 		test_user, pos_profile = init_user_and_profile()
 		pos_inv = create_pos_invoice(item=item, rate=300, do_not_submit=1)
-		pos_inv.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300
-		})
-		pos_inv.append('taxes', {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 14,
-			'included_in_print_rate': 1
-		})
+		pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300})
+		pos_inv.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 14,
+				"included_in_print_rate": 1,
+			},
+		)
 		self.assertRaises(frappe.ValidationError, pos_inv.submit)
 
 		pos_inv2 = create_pos_invoice(item=item, rate=400, do_not_submit=1)
-		pos_inv2.append('payments', {
-			'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 400
-		})
-		pos_inv2.append('taxes', {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 14,
-			'included_in_print_rate': 1
-		})
+		pos_inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 400})
+		pos_inv2.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 14,
+				"included_in_print_rate": 1,
+			},
+		)
 		pos_inv2.submit()
 
 		consolidate_pos_invoices()
 
 		pos_inv2.load_from_db()
-		rounded_total = frappe.db.get_value("Sales Invoice", pos_inv2.consolidated_invoice, "rounded_total")
+		rounded_total = frappe.db.get_value(
+			"Sales Invoice", pos_inv2.consolidated_invoice, "rounded_total"
+		)
 		self.assertEqual(rounded_total, 400)
 
 	def test_pos_batch_item_qty_validation(self):
 		from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import (
 			create_batch_item_with_batch,
 		)
-		create_batch_item_with_batch('_BATCH ITEM', 'TestBatch 01')
-		item = frappe.get_doc('Item', '_BATCH ITEM')
-		batch = frappe.get_doc('Batch', 'TestBatch 01')
+
+		create_batch_item_with_batch("_BATCH ITEM", "TestBatch 01")
+		item = frappe.get_doc("Item", "_BATCH ITEM")
+		batch = frappe.get_doc("Batch", "TestBatch 01")
 		batch.submit()
-		item.batch_no = 'TestBatch 01'
+		item.batch_no = "TestBatch 01"
 		item.save()
 
-		se = make_stock_entry(target="_Test Warehouse - _TC", item_code="_BATCH ITEM", qty=2, basic_rate=100, batch_no='TestBatch 01')
+		se = make_stock_entry(
+			target="_Test Warehouse - _TC",
+			item_code="_BATCH ITEM",
+			qty=2,
+			basic_rate=100,
+			batch_no="TestBatch 01",
+		)
 
 		pos_inv1 = create_pos_invoice(item=item.name, rate=300, qty=1, do_not_submit=1)
-		pos_inv1.items[0].batch_no = 'TestBatch 01'
+		pos_inv1.items[0].batch_no = "TestBatch 01"
 		pos_inv1.save()
 		pos_inv1.submit()
 
 		pos_inv2 = create_pos_invoice(item=item.name, rate=300, qty=2, do_not_submit=1)
-		pos_inv2.items[0].batch_no = 'TestBatch 01'
+		pos_inv2.items[0].batch_no = "TestBatch 01"
 		pos_inv2.save()
 
 		self.assertRaises(frappe.ValidationError, pos_inv2.submit)
 
-		#teardown
+		# teardown
 		pos_inv1.reload()
 		pos_inv1.cancel()
 		pos_inv1.delete()
@@ -578,12 +731,14 @@
 	def test_ignore_pricing_rule(self):
 		from erpnext.accounts.doctype.pricing_rule.test_pricing_rule import make_pricing_rule
 
-		item_price = frappe.get_doc({
-			'doctype': 'Item Price',
-			'item_code': '_Test Item',
-			'price_list': '_Test Price List',
-			'price_list_rate': '450',
-		})
+		item_price = frappe.get_doc(
+			{
+				"doctype": "Item Price",
+				"item_code": "_Test Item",
+				"price_list": "_Test Price List",
+				"price_list_rate": "450",
+			}
+		)
 		item_price.insert()
 		pr = make_pricing_rule(selling=1, priority=5, discount_percentage=10)
 		pr.save()
@@ -619,14 +774,12 @@
 		from erpnext.stock.doctype.serial_no.test_serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		frappe.db.savepoint('before_test_delivered_serial_no_case')
+		frappe.db.savepoint("before_test_delivered_serial_no_case")
 		try:
 			se = make_serialized_item()
 			serial_no = get_serial_nos(se.get("items")[0].serial_no)[0]
 
-			dn = create_delivery_note(
-					item_code="_Test Serialized Item With Series", serial_no=serial_no
-			)
+			dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no)
 
 			delivery_document_no = frappe.db.get_value("Serial No", serial_no, "delivery_document_no")
 			self.assertEquals(delivery_document_no, dn.name)
@@ -634,17 +787,17 @@
 			init_user_and_profile()
 
 			pos_inv = create_pos_invoice(
-					item_code="_Test Serialized Item With Series",
-					serial_no=serial_no,
-					qty=1,
-					rate=100,
-					do_not_submit=True
+				item_code="_Test Serialized Item With Series",
+				serial_no=serial_no,
+				qty=1,
+				rate=100,
+				do_not_submit=True,
 			)
 
 			self.assertRaises(frappe.ValidationError, pos_inv.submit)
 
 		finally:
-			frappe.db.rollback(save_point='before_test_delivered_serial_no_case')
+			frappe.db.rollback(save_point="before_test_delivered_serial_no_case")
 			frappe.set_user("Administrator")
 
 	def test_returned_serial_no_case(self):
@@ -655,7 +808,7 @@
 		from erpnext.stock.doctype.serial_no.test_serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 
-		frappe.db.savepoint('before_test_returned_serial_no_case')
+		frappe.db.savepoint("before_test_returned_serial_no_case")
 		try:
 			se = make_serialized_item()
 			serial_no = get_serial_nos(se.get("items")[0].serial_no)[0]
@@ -663,10 +816,10 @@
 			init_user_and_profile()
 
 			pos_inv = create_pos_invoice(
-					item_code="_Test Serialized Item With Series",
-					serial_no=serial_no,
-					qty=1,
-					rate=100,
+				item_code="_Test Serialized Item With Series",
+				serial_no=serial_no,
+				qty=1,
+				rate=100,
 			)
 
 			pos_return = make_sales_return(pos_inv.name)
@@ -674,16 +827,16 @@
 			pos_return.insert()
 			pos_return.submit()
 
-			pos_reserved_serial_nos = get_pos_reserved_serial_nos({
-				'item_code': '_Test Serialized Item With Series',
-				'warehouse': '_Test Warehouse - _TC'
-			})
+			pos_reserved_serial_nos = get_pos_reserved_serial_nos(
+				{"item_code": "_Test Serialized Item With Series", "warehouse": "_Test Warehouse - _TC"}
+			)
 			self.assertTrue(serial_no not in pos_reserved_serial_nos)
 
 		finally:
-			frappe.db.rollback(save_point='before_test_returned_serial_no_case')
+			frappe.db.rollback(save_point="before_test_returned_serial_no_case")
 			frappe.set_user("Administrator")
 
+
 def create_pos_invoice(**args):
 	args = frappe._dict(args)
 	pos_profile = None
@@ -706,23 +859,26 @@
 	pos_inv.debit_to = args.debit_to or "Debtors - _TC"
 	pos_inv.is_return = args.is_return
 	pos_inv.return_against = args.return_against
-	pos_inv.currency=args.currency or "INR"
+	pos_inv.currency = args.currency or "INR"
 	pos_inv.conversion_rate = args.conversion_rate or 1
 	pos_inv.account_for_change_amount = args.account_for_change_amount or "Cash - _TC"
 
 	pos_inv.set_missing_values()
 
-	pos_inv.append("items", {
-		"item_code": args.item or args.item_code or "_Test Item",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty or 1,
-		"rate": args.rate if args.get("rate") is not None else 100,
-		"income_account": args.income_account or "Sales - _TC",
-		"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"serial_no": args.serial_no,
-		"batch_no": args.batch_no
-	})
+	pos_inv.append(
+		"items",
+		{
+			"item_code": args.item or args.item_code or "_Test Item",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty or 1,
+			"rate": args.rate if args.get("rate") is not None else 100,
+			"income_account": args.income_account or "Sales - _TC",
+			"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"serial_no": args.serial_no,
+			"batch_no": args.batch_no,
+		},
+	)
 
 	if not args.do_not_save:
 		pos_inv.insert()
@@ -735,7 +891,9 @@
 
 	return pos_inv
 
+
 def make_batch_item(item_name):
 	from erpnext.stock.doctype.item.test_item import make_item
+
 	if not frappe.db.exists(item_name):
-		return make_item(item_name, dict(has_batch_no = 1, create_new_batch = 1, is_stock_item=1))
\ No newline at end of file
+		return make_item(item_name, dict(has_batch_no=1, create_new_batch=1, is_stock_item=1))
diff --git a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
index b3d9c15..d3a81fe 100644
--- a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
+++ b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
@@ -20,32 +20,44 @@
 		self.validate_pos_invoice_status()
 
 	def validate_customer(self):
-		if self.merge_invoices_based_on == 'Customer Group':
+		if self.merge_invoices_based_on == "Customer Group":
 			return
 
 		for d in self.pos_invoices:
 			if d.customer != self.customer:
-				frappe.throw(_("Row #{}: POS Invoice {} is not against customer {}").format(d.idx, d.pos_invoice, self.customer))
+				frappe.throw(
+					_("Row #{}: POS Invoice {} is not against customer {}").format(
+						d.idx, d.pos_invoice, self.customer
+					)
+				)
 
 	def validate_pos_invoice_status(self):
 		for d in self.pos_invoices:
 			status, docstatus, is_return, return_against = frappe.db.get_value(
-				'POS Invoice', d.pos_invoice, ['status', 'docstatus', 'is_return', 'return_against'])
+				"POS Invoice", d.pos_invoice, ["status", "docstatus", "is_return", "return_against"]
+			)
 
 			bold_pos_invoice = frappe.bold(d.pos_invoice)
 			bold_status = frappe.bold(status)
 			if docstatus != 1:
 				frappe.throw(_("Row #{}: POS Invoice {} is not submitted yet").format(d.idx, bold_pos_invoice))
 			if status == "Consolidated":
-				frappe.throw(_("Row #{}: POS Invoice {} has been {}").format(d.idx, bold_pos_invoice, bold_status))
-			if is_return and return_against and return_against not in [d.pos_invoice for d in self.pos_invoices]:
+				frappe.throw(
+					_("Row #{}: POS Invoice {} has been {}").format(d.idx, bold_pos_invoice, bold_status)
+				)
+			if (
+				is_return
+				and return_against
+				and return_against not in [d.pos_invoice for d in self.pos_invoices]
+			):
 				bold_return_against = frappe.bold(return_against)
-				return_against_status = frappe.db.get_value('POS Invoice', return_against, "status")
+				return_against_status = frappe.db.get_value("POS Invoice", return_against, "status")
 				if return_against_status != "Consolidated":
 					# if return entry is not getting merged in the current pos closing and if it is not consolidated
 					bold_unconsolidated = frappe.bold("not Consolidated")
-					msg = (_("Row #{}: Original Invoice {} of return invoice {} is {}.")
-								.format(d.idx, bold_return_against, bold_pos_invoice, bold_unconsolidated))
+					msg = _("Row #{}: Original Invoice {} of return invoice {} is {}.").format(
+						d.idx, bold_return_against, bold_pos_invoice, bold_unconsolidated
+					)
 					msg += " "
 					msg += _("Original invoice should be consolidated before or along with the return invoice.")
 					msg += "<br><br>"
@@ -53,10 +65,12 @@
 					frappe.throw(msg)
 
 	def on_submit(self):
-		pos_invoice_docs = [frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in self.pos_invoices]
+		pos_invoice_docs = [
+			frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in self.pos_invoices
+		]
 
-		returns = [d for d in pos_invoice_docs if d.get('is_return') == 1]
-		sales = [d for d in pos_invoice_docs if d.get('is_return') == 0]
+		returns = [d for d in pos_invoice_docs if d.get("is_return") == 1]
+		sales = [d for d in pos_invoice_docs if d.get("is_return") == 0]
 
 		sales_invoice, credit_note = "", ""
 		if returns:
@@ -65,12 +79,14 @@
 		if sales:
 			sales_invoice = self.process_merging_into_sales_invoice(sales)
 
-		self.save() # save consolidated_sales_invoice & consolidated_credit_note ref in merge log
+		self.save()  # save consolidated_sales_invoice & consolidated_credit_note ref in merge log
 
 		self.update_pos_invoices(pos_invoice_docs, sales_invoice, credit_note)
 
 	def on_cancel(self):
-		pos_invoice_docs = [frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in self.pos_invoices]
+		pos_invoice_docs = [
+			frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in self.pos_invoices
+		]
 
 		self.update_pos_invoices(pos_invoice_docs)
 		self.cancel_linked_invoices()
@@ -118,9 +134,8 @@
 
 		loyalty_amount_sum, loyalty_points_sum, idx = 0, 0, 1
 
-
 		for doc in data:
-			map_doc(doc, invoice, table_map={ "doctype": invoice.doctype })
+			map_doc(doc, invoice, table_map={"doctype": invoice.doctype})
 
 			if doc.redeem_loyalty_points:
 				invoice.loyalty_redemption_account = doc.loyalty_redemption_account
@@ -128,11 +143,17 @@
 				loyalty_points_sum += doc.loyalty_points
 				loyalty_amount_sum += doc.loyalty_amount
 
-			for item in doc.get('items'):
+			for item in doc.get("items"):
 				found = False
 				for i in items:
-					if (i.item_code == item.item_code and not i.serial_no and not i.batch_no and
-						i.uom == item.uom and i.net_rate == item.net_rate and i.warehouse == item.warehouse):
+					if (
+						i.item_code == item.item_code
+						and not i.serial_no
+						and not i.batch_no
+						and i.uom == item.uom
+						and i.net_rate == item.net_rate
+						and i.warehouse == item.warehouse
+					):
 						found = True
 						i.qty = i.qty + item.qty
 						i.amount = i.amount + item.net_amount
@@ -148,7 +169,7 @@
 					si_item = map_child_doc(item, invoice, {"doctype": "Sales Invoice Item"})
 					items.append(si_item)
 
-			for tax in doc.get('taxes'):
+			for tax in doc.get("taxes"):
 				found = False
 				for t in taxes:
 					if t.account_head == tax.account_head and t.cost_center == tax.cost_center:
@@ -157,7 +178,7 @@
 						update_item_wise_tax_detail(t, tax)
 						found = True
 				if not found:
-					tax.charge_type = 'Actual'
+					tax.charge_type = "Actual"
 					tax.idx = idx
 					idx += 1
 					tax.included_in_print_rate = 0
@@ -166,7 +187,7 @@
 					tax.item_wise_tax_detail = tax.item_wise_tax_detail
 					taxes.append(tax)
 
-			for payment in doc.get('payments'):
+			for payment in doc.get("payments"):
 				found = False
 				for pay in payments:
 					if pay.account == payment.account and pay.mode_of_payment == payment.mode_of_payment:
@@ -181,52 +202,59 @@
 			base_rounding_adjustment += doc.base_rounding_adjustment
 			base_rounded_total += doc.base_rounded_total
 
-
 		if loyalty_points_sum:
 			invoice.redeem_loyalty_points = 1
 			invoice.loyalty_points = loyalty_points_sum
 			invoice.loyalty_amount = loyalty_amount_sum
 
-		invoice.set('items', items)
-		invoice.set('payments', payments)
-		invoice.set('taxes', taxes)
-		invoice.set('rounding_adjustment',rounding_adjustment)
-		invoice.set('base_rounding_adjustment',base_rounding_adjustment)
-		invoice.set('rounded_total',rounded_total)
-		invoice.set('base_rounded_total',base_rounded_total)
+		invoice.set("items", items)
+		invoice.set("payments", payments)
+		invoice.set("taxes", taxes)
+		invoice.set("rounding_adjustment", rounding_adjustment)
+		invoice.set("base_rounding_adjustment", base_rounding_adjustment)
+		invoice.set("rounded_total", rounded_total)
+		invoice.set("base_rounded_total", base_rounded_total)
 		invoice.additional_discount_percentage = 0
 		invoice.discount_amount = 0.0
 		invoice.taxes_and_charges = None
 		invoice.ignore_pricing_rule = 1
 		invoice.customer = self.customer
 
-		if self.merge_invoices_based_on == 'Customer Group':
+		if self.merge_invoices_based_on == "Customer Group":
 			invoice.flags.ignore_pos_profile = True
-			invoice.pos_profile = ''
+			invoice.pos_profile = ""
 
 		return invoice
 
 	def get_new_sales_invoice(self):
-		sales_invoice = frappe.new_doc('Sales Invoice')
+		sales_invoice = frappe.new_doc("Sales Invoice")
 		sales_invoice.customer = self.customer
 		sales_invoice.is_pos = 1
 
 		return sales_invoice
 
-	def update_pos_invoices(self, invoice_docs, sales_invoice='', credit_note=''):
+	def update_pos_invoices(self, invoice_docs, sales_invoice="", credit_note=""):
 		for doc in invoice_docs:
 			doc.load_from_db()
-			doc.update({ 'consolidated_invoice': None if self.docstatus==2 else (credit_note if doc.is_return else sales_invoice) })
+			doc.update(
+				{
+					"consolidated_invoice": None
+					if self.docstatus == 2
+					else (credit_note if doc.is_return else sales_invoice)
+				}
+			)
 			doc.set_status(update=True)
 			doc.save()
 
 	def cancel_linked_invoices(self):
 		for si_name in [self.consolidated_invoice, self.consolidated_credit_note]:
-			if not si_name: continue
-			si = frappe.get_doc('Sales Invoice', si_name)
+			if not si_name:
+				continue
+			si = frappe.get_doc("Sales Invoice", si_name)
 			si.flags.ignore_validate = True
 			si.cancel()
 
+
 def update_item_wise_tax_detail(consolidate_tax_row, tax_row):
 	consolidated_tax_detail = json.loads(consolidate_tax_row.item_wise_tax_detail)
 	tax_row_detail = json.loads(tax_row.item_wise_tax_detail)
@@ -237,70 +265,85 @@
 	for item_code, tax_data in tax_row_detail.items():
 		if consolidated_tax_detail.get(item_code):
 			consolidated_tax_data = consolidated_tax_detail.get(item_code)
-			consolidated_tax_detail.update({
-				item_code: [consolidated_tax_data[0], consolidated_tax_data[1] + tax_data[1]]
-			})
+			consolidated_tax_detail.update(
+				{item_code: [consolidated_tax_data[0], consolidated_tax_data[1] + tax_data[1]]}
+			)
 		else:
-			consolidated_tax_detail.update({
-				item_code: [tax_data[0], tax_data[1]]
-			})
+			consolidated_tax_detail.update({item_code: [tax_data[0], tax_data[1]]})
 
-	consolidate_tax_row.item_wise_tax_detail = json.dumps(consolidated_tax_detail, separators=(',', ':'))
+	consolidate_tax_row.item_wise_tax_detail = json.dumps(
+		consolidated_tax_detail, separators=(",", ":")
+	)
+
 
 def get_all_unconsolidated_invoices():
 	filters = {
-		'consolidated_invoice': [ 'in', [ '', None ]],
-		'status': ['not in', ['Consolidated']],
-		'docstatus': 1
+		"consolidated_invoice": ["in", ["", None]],
+		"status": ["not in", ["Consolidated"]],
+		"docstatus": 1,
 	}
-	pos_invoices = frappe.db.get_all('POS Invoice', filters=filters,
-		fields=["name as pos_invoice", 'posting_date', 'grand_total', 'customer', 'is_return', 'return_against'])
+	pos_invoices = frappe.db.get_all(
+		"POS Invoice",
+		filters=filters,
+		fields=[
+			"name as pos_invoice",
+			"posting_date",
+			"grand_total",
+			"customer",
+			"is_return",
+			"return_against",
+		],
+	)
 
 	return pos_invoices
 
+
 def get_invoice_customer_map(pos_invoices):
 	# pos_invoice_customer_map = { 'Customer 1': [{}, {}, {}], 'Customer 2' : [{}] }
 	pos_invoice_customer_map = {}
 	for invoice in pos_invoices:
-		customer = invoice.get('customer')
+		customer = invoice.get("customer")
 		pos_invoice_customer_map.setdefault(customer, [])
 		pos_invoice_customer_map[customer].append(invoice)
 
 	return pos_invoice_customer_map
 
+
 def consolidate_pos_invoices(pos_invoices=None, closing_entry=None):
-	invoices = pos_invoices or (closing_entry and closing_entry.get('pos_transactions'))
+	invoices = pos_invoices or (closing_entry and closing_entry.get("pos_transactions"))
 	if frappe.flags.in_test and not invoices:
 		invoices = get_all_unconsolidated_invoices()
 
 	invoice_by_customer = get_invoice_customer_map(invoices)
 
 	if len(invoices) >= 10 and closing_entry:
-		closing_entry.set_status(update=True, status='Queued')
-		enqueue_job(create_merge_logs, invoice_by_customer=invoice_by_customer, closing_entry=closing_entry)
+		closing_entry.set_status(update=True, status="Queued")
+		enqueue_job(
+			create_merge_logs, invoice_by_customer=invoice_by_customer, closing_entry=closing_entry
+		)
 	else:
 		create_merge_logs(invoice_by_customer, closing_entry)
 
+
 def unconsolidate_pos_invoices(closing_entry):
 	merge_logs = frappe.get_all(
-		'POS Invoice Merge Log',
-		filters={ 'pos_closing_entry': closing_entry.name },
-		pluck='name'
+		"POS Invoice Merge Log", filters={"pos_closing_entry": closing_entry.name}, pluck="name"
 	)
 
 	if len(merge_logs) >= 10:
-		closing_entry.set_status(update=True, status='Queued')
+		closing_entry.set_status(update=True, status="Queued")
 		enqueue_job(cancel_merge_logs, merge_logs=merge_logs, closing_entry=closing_entry)
 	else:
 		cancel_merge_logs(merge_logs, closing_entry)
 
+
 def split_invoices(invoices):
-	'''
+	"""
 	Splits invoices into multiple groups
 	Use-case:
 	If a serial no is sold and later it is returned
 	then split the invoices such that the selling entry is merged first and then the return entry
-	'''
+	"""
 	# Input
 	# invoices = [
 	# 	{'pos_invoice': 'Invoice with SR#1 & SR#2', 'is_return': 0},
@@ -315,17 +358,26 @@
 
 	_invoices = []
 	special_invoices = []
-	pos_return_docs = [frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in invoices if d.is_return and d.return_against]
+	pos_return_docs = [
+		frappe.get_cached_doc("POS Invoice", d.pos_invoice)
+		for d in invoices
+		if d.is_return and d.return_against
+	]
 	for pos_invoice in pos_return_docs:
 		for item in pos_invoice.items:
 			if not item.serial_no:
 				continue
 
-			return_against_is_added = any(d for d in _invoices if d.pos_invoice == pos_invoice.return_against)
+			return_against_is_added = any(
+				d for d in _invoices if d.pos_invoice == pos_invoice.return_against
+			)
 			if return_against_is_added:
 				break
 
-			return_against_is_consolidated = frappe.db.get_value('POS Invoice', pos_invoice.return_against, 'status', cache=True) == 'Consolidated'
+			return_against_is_consolidated = (
+				frappe.db.get_value("POS Invoice", pos_invoice.return_against, "status", cache=True)
+				== "Consolidated"
+			)
 			if return_against_is_consolidated:
 				break
 
@@ -338,22 +390,25 @@
 
 	return _invoices
 
+
 def create_merge_logs(invoice_by_customer, closing_entry=None):
 	try:
 		for customer, invoices in invoice_by_customer.items():
 			for _invoices in split_invoices(invoices):
-				merge_log = frappe.new_doc('POS Invoice Merge Log')
-				merge_log.posting_date = getdate(closing_entry.get('posting_date')) if closing_entry else nowdate()
+				merge_log = frappe.new_doc("POS Invoice Merge Log")
+				merge_log.posting_date = (
+					getdate(closing_entry.get("posting_date")) if closing_entry else nowdate()
+				)
 				merge_log.customer = customer
-				merge_log.pos_closing_entry = closing_entry.get('name') if closing_entry else None
+				merge_log.pos_closing_entry = closing_entry.get("name") if closing_entry else None
 
-				merge_log.set('pos_invoices', _invoices)
+				merge_log.set("pos_invoices", _invoices)
 				merge_log.save(ignore_permissions=True)
 				merge_log.submit()
 
 		if closing_entry:
-			closing_entry.set_status(update=True, status='Submitted')
-			closing_entry.db_set('error_message', '')
+			closing_entry.set_status(update=True, status="Submitted")
+			closing_entry.db_set("error_message", "")
 			closing_entry.update_opening_entry()
 
 	except Exception as e:
@@ -362,24 +417,25 @@
 		error_message = safe_load_json(message_log)
 
 		if closing_entry:
-			closing_entry.set_status(update=True, status='Failed')
-			closing_entry.db_set('error_message', error_message)
+			closing_entry.set_status(update=True, status="Failed")
+			closing_entry.db_set("error_message", error_message)
 		raise
 
 	finally:
 		frappe.db.commit()
-		frappe.publish_realtime('closing_process_complete', {'user': frappe.session.user})
+		frappe.publish_realtime("closing_process_complete", {"user": frappe.session.user})
+
 
 def cancel_merge_logs(merge_logs, closing_entry=None):
 	try:
 		for log in merge_logs:
-			merge_log = frappe.get_doc('POS Invoice Merge Log', log)
+			merge_log = frappe.get_doc("POS Invoice Merge Log", log)
 			merge_log.flags.ignore_permissions = True
 			merge_log.cancel()
 
 		if closing_entry:
-			closing_entry.set_status(update=True, status='Cancelled')
-			closing_entry.db_set('error_message', '')
+			closing_entry.set_status(update=True, status="Cancelled")
+			closing_entry.db_set("error_message", "")
 			closing_entry.update_opening_entry(for_cancel=True)
 
 	except Exception as e:
@@ -388,18 +444,19 @@
 		error_message = safe_load_json(message_log)
 
 		if closing_entry:
-			closing_entry.set_status(update=True, status='Submitted')
-			closing_entry.db_set('error_message', error_message)
+			closing_entry.set_status(update=True, status="Submitted")
+			closing_entry.db_set("error_message", error_message)
 		raise
 
 	finally:
 		frappe.db.commit()
-		frappe.publish_realtime('closing_process_complete', {'user': frappe.session.user})
+		frappe.publish_realtime("closing_process_complete", {"user": frappe.session.user})
+
 
 def enqueue_job(job, **kwargs):
 	check_scheduler_status()
 
-	closing_entry = kwargs.get('closing_entry') or {}
+	closing_entry = kwargs.get("closing_entry") or {}
 
 	job_name = closing_entry.get("name")
 	if not job_already_enqueued(job_name):
@@ -414,24 +471,27 @@
 		)
 
 		if job == create_merge_logs:
-			msg = _('POS Invoices will be consolidated in a background process')
+			msg = _("POS Invoices will be consolidated in a background process")
 		else:
-			msg = _('POS Invoices will be unconsolidated in a background process')
+			msg = _("POS Invoices will be unconsolidated in a background process")
 
 		frappe.msgprint(msg, alert=1)
 
+
 def check_scheduler_status():
 	if is_scheduler_inactive() and not frappe.flags.in_test:
 		frappe.throw(_("Scheduler is inactive. Cannot enqueue job."), title=_("Scheduler Inactive"))
 
+
 def job_already_enqueued(job_name):
 	enqueued_jobs = [d.get("job_name") for d in get_info()]
 	if job_name in enqueued_jobs:
 		return True
 
+
 def safe_load_json(message):
 	try:
-		json_message = json.loads(message).get('message')
+		json_message = json.loads(message).get("message")
 	except Exception:
 		json_message = message
 
diff --git a/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py b/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py
index fe57ce2..9e696f1 100644
--- a/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py
+++ b/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py
@@ -24,21 +24,19 @@
 			test_user, pos_profile = init_user_and_profile()
 
 			pos_inv = create_pos_invoice(rate=300, do_not_submit=1)
-			pos_inv.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300
-			})
+			pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300})
 			pos_inv.submit()
 
 			pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
-			pos_inv2.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200
-			})
+			pos_inv2.append(
+				"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200}
+			)
 			pos_inv2.submit()
 
 			pos_inv3 = create_pos_invoice(customer="_Test Customer 2", rate=2300, do_not_submit=1)
-			pos_inv3.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 2300
-			})
+			pos_inv3.append(
+				"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 2300}
+			)
 			pos_inv3.submit()
 
 			consolidate_pos_invoices()
@@ -63,31 +61,29 @@
 			test_user, pos_profile = init_user_and_profile()
 
 			pos_inv = create_pos_invoice(rate=300, do_not_submit=1)
-			pos_inv.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300
-			})
+			pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300})
 			pos_inv.submit()
 
 			pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1)
-			pos_inv2.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 3200
-			})
+			pos_inv2.append(
+				"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 3200}
+			)
 			pos_inv2.submit()
 
 			pos_inv3 = create_pos_invoice(customer="_Test Customer 2", rate=2300, do_not_submit=1)
-			pos_inv3.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 2300
-			})
+			pos_inv3.append(
+				"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 2300}
+			)
 			pos_inv3.submit()
 
 			pos_inv_cn = make_sales_return(pos_inv.name)
 			pos_inv_cn.set("payments", [])
-			pos_inv_cn.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': -100
-			})
-			pos_inv_cn.append('payments', {
-				'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': -200
-			})
+			pos_inv_cn.append(
+				"payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": -100}
+			)
+			pos_inv_cn.append(
+				"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": -200}
+			)
 			pos_inv_cn.paid_amount = -300
 			pos_inv_cn.submit()
 
@@ -103,9 +99,9 @@
 			self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv_cn.consolidated_invoice))
 			consolidated_credit_note = frappe.get_doc("Sales Invoice", pos_inv_cn.consolidated_invoice)
 			self.assertEqual(consolidated_credit_note.is_return, 1)
-			self.assertEqual(consolidated_credit_note.payments[0].mode_of_payment, 'Cash')
+			self.assertEqual(consolidated_credit_note.payments[0].mode_of_payment, "Cash")
 			self.assertEqual(consolidated_credit_note.payments[0].amount, -100)
-			self.assertEqual(consolidated_credit_note.payments[1].mode_of_payment, 'Bank Draft')
+			self.assertEqual(consolidated_credit_note.payments[1].mode_of_payment, "Bank Draft")
 			self.assertEqual(consolidated_credit_note.payments[1].amount, -200)
 
 		finally:
@@ -119,41 +115,47 @@
 		try:
 			inv = create_pos_invoice(qty=1, rate=100, do_not_save=True)
 
-			inv.append("taxes", {
-				"account_head": "_Test Account VAT - _TC",
-				"charge_type": "On Net Total",
-				"cost_center": "_Test Cost Center - _TC",
-				"description": "VAT",
-				"doctype": "Sales Taxes and Charges",
-				"rate": 9
-			})
+			inv.append(
+				"taxes",
+				{
+					"account_head": "_Test Account VAT - _TC",
+					"charge_type": "On Net Total",
+					"cost_center": "_Test Cost Center - _TC",
+					"description": "VAT",
+					"doctype": "Sales Taxes and Charges",
+					"rate": 9,
+				},
+			)
 			inv.insert()
 			inv.submit()
 
 			inv2 = create_pos_invoice(qty=1, rate=100, do_not_save=True)
-			inv2.get('items')[0].item_code = '_Test Item 2'
-			inv2.append("taxes", {
-				"account_head": "_Test Account VAT - _TC",
-				"charge_type": "On Net Total",
-				"cost_center": "_Test Cost Center - _TC",
-				"description": "VAT",
-				"doctype": "Sales Taxes and Charges",
-				"rate": 5
-			})
+			inv2.get("items")[0].item_code = "_Test Item 2"
+			inv2.append(
+				"taxes",
+				{
+					"account_head": "_Test Account VAT - _TC",
+					"charge_type": "On Net Total",
+					"cost_center": "_Test Cost Center - _TC",
+					"description": "VAT",
+					"doctype": "Sales Taxes and Charges",
+					"rate": 5,
+				},
+			)
 			inv2.insert()
 			inv2.submit()
 
 			consolidate_pos_invoices()
 			inv.load_from_db()
 
-			consolidated_invoice = frappe.get_doc('Sales Invoice', inv.consolidated_invoice)
-			item_wise_tax_detail = json.loads(consolidated_invoice.get('taxes')[0].item_wise_tax_detail)
+			consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice)
+			item_wise_tax_detail = json.loads(consolidated_invoice.get("taxes")[0].item_wise_tax_detail)
 
-			tax_rate, amount = item_wise_tax_detail.get('_Test Item')
+			tax_rate, amount = item_wise_tax_detail.get("_Test Item")
 			self.assertEqual(tax_rate, 9)
 			self.assertEqual(amount, 9)
 
-			tax_rate2, amount2 = item_wise_tax_detail.get('_Test Item 2')
+			tax_rate2, amount2 = item_wise_tax_detail.get("_Test Item 2")
 			self.assertEqual(tax_rate2, 5)
 			self.assertEqual(amount2, 5)
 		finally:
@@ -161,11 +163,10 @@
 			frappe.db.sql("delete from `tabPOS Profile`")
 			frappe.db.sql("delete from `tabPOS Invoice`")
 
-
 	def test_consolidation_round_off_error_1(self):
-		'''
+		"""
 		Test round off error in consolidated invoice creation if POS Invoice has inclusive tax
-		'''
+		"""
 
 		frappe.db.sql("delete from `tabPOS Invoice`")
 
@@ -180,43 +181,45 @@
 			init_user_and_profile()
 
 			inv = create_pos_invoice(qty=3, rate=10000, do_not_save=True)
-			inv.append("taxes", {
-				"account_head": "_Test Account VAT - _TC",
-				"charge_type": "On Net Total",
-				"cost_center": "_Test Cost Center - _TC",
-				"description": "VAT",
-				"doctype": "Sales Taxes and Charges",
-				"rate": 7.5,
-				"included_in_print_rate": 1
-			})
-			inv.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 30000
-			})
+			inv.append(
+				"taxes",
+				{
+					"account_head": "_Test Account VAT - _TC",
+					"charge_type": "On Net Total",
+					"cost_center": "_Test Cost Center - _TC",
+					"description": "VAT",
+					"doctype": "Sales Taxes and Charges",
+					"rate": 7.5,
+					"included_in_print_rate": 1,
+				},
+			)
+			inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 30000})
 			inv.insert()
 			inv.submit()
 
 			inv2 = create_pos_invoice(qty=3, rate=10000, do_not_save=True)
-			inv2.append("taxes", {
-				"account_head": "_Test Account VAT - _TC",
-				"charge_type": "On Net Total",
-				"cost_center": "_Test Cost Center - _TC",
-				"description": "VAT",
-				"doctype": "Sales Taxes and Charges",
-				"rate": 7.5,
-				"included_in_print_rate": 1
-			})
-			inv2.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 30000
-			})
+			inv2.append(
+				"taxes",
+				{
+					"account_head": "_Test Account VAT - _TC",
+					"charge_type": "On Net Total",
+					"cost_center": "_Test Cost Center - _TC",
+					"description": "VAT",
+					"doctype": "Sales Taxes and Charges",
+					"rate": 7.5,
+					"included_in_print_rate": 1,
+				},
+			)
+			inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 30000})
 			inv2.insert()
 			inv2.submit()
 
 			consolidate_pos_invoices()
 
 			inv.load_from_db()
-			consolidated_invoice = frappe.get_doc('Sales Invoice', inv.consolidated_invoice)
+			consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice)
 			self.assertEqual(consolidated_invoice.outstanding_amount, 0)
-			self.assertEqual(consolidated_invoice.status, 'Paid')
+			self.assertEqual(consolidated_invoice.status, "Paid")
 
 		finally:
 			frappe.set_user("Administrator")
@@ -224,9 +227,9 @@
 			frappe.db.sql("delete from `tabPOS Invoice`")
 
 	def test_consolidation_round_off_error_2(self):
-		'''
+		"""
 		Test the same case as above but with an Unpaid POS Invoice
-		'''
+		"""
 		frappe.db.sql("delete from `tabPOS Invoice`")
 
 		try:
@@ -240,57 +243,59 @@
 			init_user_and_profile()
 
 			inv = create_pos_invoice(qty=6, rate=10000, do_not_save=True)
-			inv.append("taxes", {
-				"account_head": "_Test Account VAT - _TC",
-				"charge_type": "On Net Total",
-				"cost_center": "_Test Cost Center - _TC",
-				"description": "VAT",
-				"doctype": "Sales Taxes and Charges",
-				"rate": 7.5,
-				"included_in_print_rate": 1
-			})
-			inv.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 60000
-			})
+			inv.append(
+				"taxes",
+				{
+					"account_head": "_Test Account VAT - _TC",
+					"charge_type": "On Net Total",
+					"cost_center": "_Test Cost Center - _TC",
+					"description": "VAT",
+					"doctype": "Sales Taxes and Charges",
+					"rate": 7.5,
+					"included_in_print_rate": 1,
+				},
+			)
+			inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60000})
 			inv.insert()
 			inv.submit()
 
 			inv2 = create_pos_invoice(qty=6, rate=10000, do_not_save=True)
-			inv2.append("taxes", {
-				"account_head": "_Test Account VAT - _TC",
-				"charge_type": "On Net Total",
-				"cost_center": "_Test Cost Center - _TC",
-				"description": "VAT",
-				"doctype": "Sales Taxes and Charges",
-				"rate": 7.5,
-				"included_in_print_rate": 1
-			})
-			inv2.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 60000
-			})
+			inv2.append(
+				"taxes",
+				{
+					"account_head": "_Test Account VAT - _TC",
+					"charge_type": "On Net Total",
+					"cost_center": "_Test Cost Center - _TC",
+					"description": "VAT",
+					"doctype": "Sales Taxes and Charges",
+					"rate": 7.5,
+					"included_in_print_rate": 1,
+				},
+			)
+			inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60000})
 			inv2.insert()
 			inv2.submit()
 
 			inv3 = create_pos_invoice(qty=3, rate=600, do_not_save=True)
-			inv3.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 1000
-			})
+			inv3.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 1000})
 			inv3.insert()
 			inv3.submit()
 
 			consolidate_pos_invoices()
 
 			inv.load_from_db()
-			consolidated_invoice = frappe.get_doc('Sales Invoice', inv.consolidated_invoice)
+			consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice)
 			self.assertEqual(consolidated_invoice.outstanding_amount, 800)
-			self.assertNotEqual(consolidated_invoice.status, 'Paid')
+			self.assertNotEqual(consolidated_invoice.status, "Paid")
 
 		finally:
 			frappe.set_user("Administrator")
 			frappe.db.sql("delete from `tabPOS Profile`")
 			frappe.db.sql("delete from `tabPOS Invoice`")
 
-	@change_settings("System Settings", {"number_format": "#,###.###", "currency_precision": 3, "float_precision": 3})
+	@change_settings(
+		"System Settings", {"number_format": "#,###.###", "currency_precision": 3, "float_precision": 3}
+	)
 	def test_consolidation_round_off_error_3(self):
 		frappe.db.sql("delete from `tabPOS Invoice`")
 
@@ -308,28 +313,32 @@
 				inv = create_pos_invoice(is_return=1, do_not_save=1)
 				inv.items = []
 				for rate in item_rates:
-					inv.append("items", {
-						"item_code": "_Test Item",
-						"warehouse": "_Test Warehouse - _TC",
-						"qty": -1,
-						"rate": rate,
-						"income_account": "Sales - _TC",
-						"expense_account": "Cost of Goods Sold - _TC",
+					inv.append(
+						"items",
+						{
+							"item_code": "_Test Item",
+							"warehouse": "_Test Warehouse - _TC",
+							"qty": -1,
+							"rate": rate,
+							"income_account": "Sales - _TC",
+							"expense_account": "Cost of Goods Sold - _TC",
+							"cost_center": "_Test Cost Center - _TC",
+						},
+					)
+				inv.append(
+					"taxes",
+					{
+						"account_head": "_Test Account VAT - _TC",
+						"charge_type": "On Net Total",
 						"cost_center": "_Test Cost Center - _TC",
-					})
-				inv.append("taxes", {
-					"account_head": "_Test Account VAT - _TC",
-					"charge_type": "On Net Total",
-					"cost_center": "_Test Cost Center - _TC",
-					"description": "VAT",
-					"doctype": "Sales Taxes and Charges",
-					"rate": 15,
-					"included_in_print_rate": 1
-				})
+						"description": "VAT",
+						"doctype": "Sales Taxes and Charges",
+						"rate": 15,
+						"included_in_print_rate": 1,
+					},
+				)
 				inv.payments = []
-				inv.append('payments', {
-					'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': -157
-				})
+				inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": -157})
 				inv.paid_amount = -157
 				inv.save()
 				inv.submit()
@@ -337,8 +346,8 @@
 			consolidate_pos_invoices()
 
 			inv.load_from_db()
-			consolidated_invoice = frappe.get_doc('Sales Invoice', inv.consolidated_invoice)
-			self.assertEqual(consolidated_invoice.status, 'Return')
+			consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice)
+			self.assertEqual(consolidated_invoice.status, "Return")
 			self.assertEqual(consolidated_invoice.rounding_adjustment, -0.001)
 
 		finally:
@@ -347,9 +356,9 @@
 			frappe.db.sql("delete from `tabPOS Invoice`")
 
 	def test_consolidation_rounding_adjustment(self):
-		'''
+		"""
 		Test if the rounding adjustment is calculated correctly
-		'''
+		"""
 		frappe.db.sql("delete from `tabPOS Invoice`")
 
 		try:
@@ -363,23 +372,19 @@
 			init_user_and_profile()
 
 			inv = create_pos_invoice(qty=1, rate=69.5, do_not_save=True)
-			inv.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 70
-			})
+			inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 70})
 			inv.insert()
 			inv.submit()
 
 			inv2 = create_pos_invoice(qty=1, rate=59.5, do_not_save=True)
-			inv2.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 60
-			})
+			inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 60})
 			inv2.insert()
 			inv2.submit()
 
 			consolidate_pos_invoices()
 
 			inv.load_from_db()
-			consolidated_invoice = frappe.get_doc('Sales Invoice', inv.consolidated_invoice)
+			consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice)
 			self.assertEqual(consolidated_invoice.rounding_adjustment, 1)
 
 		finally:
@@ -388,7 +393,7 @@
 			frappe.db.sql("delete from `tabPOS Invoice`")
 
 	def test_serial_no_case_1(self):
-		'''
+		"""
 		Create a POS Invoice with serial no
 		Create a Return Invoice with serial no
 		Create a POS Invoice with serial no again
@@ -396,7 +401,7 @@
 
 		The first POS Invoice should be consolidated with a separate single Merge Log
 		The second and third POS Invoice should be consolidated with a single Merge Log
-		'''
+		"""
 
 		from erpnext.stock.doctype.serial_no.test_serial_no import get_serial_nos
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
@@ -410,15 +415,13 @@
 			init_user_and_profile()
 
 			pos_inv = create_pos_invoice(
-					item_code="_Test Serialized Item With Series",
-					serial_no=serial_no,
-					qty=1,
-					rate=100,
-					do_not_submit=1
+				item_code="_Test Serialized Item With Series",
+				serial_no=serial_no,
+				qty=1,
+				rate=100,
+				do_not_submit=1,
 			)
-			pos_inv.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 100
-			})
+			pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 100})
 			pos_inv.submit()
 
 			pos_inv_cn = make_sales_return(pos_inv.name)
@@ -426,15 +429,13 @@
 			pos_inv_cn.submit()
 
 			pos_inv2 = create_pos_invoice(
-					item_code="_Test Serialized Item With Series",
-					serial_no=serial_no,
-					qty=1,
-					rate=100,
-					do_not_submit=1
+				item_code="_Test Serialized Item With Series",
+				serial_no=serial_no,
+				qty=1,
+				rate=100,
+				do_not_submit=1,
 			)
-			pos_inv2.append('payments', {
-				'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 100
-			})
+			pos_inv2.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 100})
 			pos_inv2.submit()
 
 			consolidate_pos_invoices()
@@ -447,4 +448,4 @@
 		finally:
 			frappe.set_user("Administrator")
 			frappe.db.sql("delete from `tabPOS Profile`")
-			frappe.db.sql("delete from `tabPOS Invoice`")
\ No newline at end of file
+			frappe.db.sql("delete from `tabPOS Invoice`")
diff --git a/erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py b/erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py
index 0b2e045..3cd1426 100644
--- a/erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py
+++ b/erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py
@@ -17,7 +17,9 @@
 
 	def validate_pos_profile_and_cashier(self):
 		if self.company != frappe.db.get_value("POS Profile", self.pos_profile, "company"):
-			frappe.throw(_("POS Profile {} does not belongs to company {}").format(self.pos_profile, self.company))
+			frappe.throw(
+				_("POS Profile {} does not belongs to company {}").format(self.pos_profile, self.company)
+			)
 
 		if not cint(frappe.db.get_value("User", self.user, "enabled")):
 			frappe.throw(_("User {} is disabled. Please select valid user/cashier").format(self.user))
@@ -26,8 +28,11 @@
 		invalid_modes = []
 		for d in self.balance_details:
 			if d.mode_of_payment:
-				account = frappe.db.get_value("Mode of Payment Account",
-					{"parent": d.mode_of_payment, "company": self.company}, "default_account")
+				account = frappe.db.get_value(
+					"Mode of Payment Account",
+					{"parent": d.mode_of_payment, "company": self.company},
+					"default_account",
+				)
 				if not account:
 					invalid_modes.append(get_link_to_form("Mode of Payment", d.mode_of_payment))
 
diff --git a/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py b/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py
index 105d53d..64c658a 100644
--- a/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py
+++ b/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py
@@ -9,6 +9,7 @@
 class TestPOSOpeningEntry(unittest.TestCase):
 	pass
 
+
 def create_opening_entry(pos_profile, user):
 	entry = frappe.new_doc("POS Opening Entry")
 	entry.pos_profile = pos_profile.name
@@ -16,11 +17,9 @@
 	entry.company = pos_profile.company
 	entry.period_start_date = frappe.utils.get_datetime()
 
-	balance_details = [];
+	balance_details = []
 	for d in pos_profile.payments:
-		balance_details.append(frappe._dict({
-			'mode_of_payment': d.mode_of_payment
-		}))
+		balance_details.append(frappe._dict({"mode_of_payment": d.mode_of_payment}))
 
 	entry.set("balance_details", balance_details)
 	entry.submit()
diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.py b/erpnext/accounts/doctype/pos_profile/pos_profile.py
index 1d49c3d..65fd4af 100644
--- a/erpnext/accounts/doctype/pos_profile/pos_profile.py
+++ b/erpnext/accounts/doctype/pos_profile/pos_profile.py
@@ -17,29 +17,42 @@
 
 	def validate_default_profile(self):
 		for row in self.applicable_for_users:
-			res = frappe.db.sql("""select pf.name
+			res = frappe.db.sql(
+				"""select pf.name
 				from
 					`tabPOS Profile User` pfu, `tabPOS Profile` pf
 				where
 					pf.name = pfu.parent and pfu.user = %s and pf.name != %s and pf.company = %s
-					and pfu.default=1 and pf.disabled = 0""", (row.user, self.name, self.company))
+					and pfu.default=1 and pf.disabled = 0""",
+				(row.user, self.name, self.company),
+			)
 
 			if row.default and res:
-				msgprint(_("Already set default in pos profile {0} for user {1}, kindly disabled default")
-					.format(res[0][0], row.user), raise_exception=1)
+				msgprint(
+					_("Already set default in pos profile {0} for user {1}, kindly disabled default").format(
+						res[0][0], row.user
+					),
+					raise_exception=1,
+				)
 			elif not row.default and not res:
-				msgprint(_("User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User.")
-					.format(row.user, row.idx))
+				msgprint(
+					_(
+						"User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User."
+					).format(row.user, row.idx)
+				)
 
 	def validate_all_link_fields(self):
-		accounts = {"Account": [self.income_account,
-			self.expense_account], "Cost Center": [self.cost_center],
-			"Warehouse": [self.warehouse]}
+		accounts = {
+			"Account": [self.income_account, self.expense_account],
+			"Cost Center": [self.cost_center],
+			"Warehouse": [self.warehouse],
+		}
 
 		for link_dt, dn_list in accounts.items():
 			for link_dn in dn_list:
-				if link_dn and not frappe.db.exists({"doctype": link_dt,
-						"company": self.company, "name": link_dn}):
+				if link_dn and not frappe.db.exists(
+					{"doctype": link_dt, "company": self.company, "name": link_dn}
+				):
 					frappe.throw(_("{0} does not belong to Company {1}").format(link_dn, self.company))
 
 	def validate_duplicate_groups(self):
@@ -47,10 +60,15 @@
 		customer_groups = [d.customer_group for d in self.customer_groups]
 
 		if len(item_groups) != len(set(item_groups)):
-			frappe.throw(_("Duplicate item group found in the item group table"), title = "Duplicate Item Group")
+			frappe.throw(
+				_("Duplicate item group found in the item group table"), title="Duplicate Item Group"
+			)
 
 		if len(customer_groups) != len(set(customer_groups)):
-			frappe.throw(_("Duplicate customer group found in the cutomer group table"), title = "Duplicate Customer Group")
+			frappe.throw(
+				_("Duplicate customer group found in the cutomer group table"),
+				title="Duplicate Customer Group",
+			)
 
 	def validate_payment_methods(self):
 		if not self.payments:
@@ -68,7 +86,7 @@
 			account = frappe.db.get_value(
 				"Mode of Payment Account",
 				{"parent": d.mode_of_payment, "company": self.company},
-				"default_account"
+				"default_account",
 			)
 
 			if not account:
@@ -91,12 +109,16 @@
 		frappe.defaults.clear_default("is_pos")
 
 		if not include_current_pos:
-			condition = " where pfu.name != '%s' and pfu.default = 1 " % self.name.replace("'", "\'")
+			condition = " where pfu.name != '%s' and pfu.default = 1 " % self.name.replace("'", "'")
 		else:
 			condition = " where pfu.default = 1 "
 
-		pos_view_users = frappe.db.sql_list("""select pfu.user
-			from `tabPOS Profile User` as pfu {0}""".format(condition))
+		pos_view_users = frappe.db.sql_list(
+			"""select pfu.user
+			from `tabPOS Profile User` as pfu {0}""".format(
+				condition
+			)
+		)
 
 		for user in pos_view_users:
 			if user:
@@ -104,48 +126,62 @@
 			else:
 				frappe.defaults.set_global_default("is_pos", 1)
 
+
 def get_item_groups(pos_profile):
 	item_groups = []
-	pos_profile = frappe.get_cached_doc('POS Profile', pos_profile)
+	pos_profile = frappe.get_cached_doc("POS Profile", pos_profile)
 
-	if pos_profile.get('item_groups'):
+	if pos_profile.get("item_groups"):
 		# Get items based on the item groups defined in the POS profile
-		for data in pos_profile.get('item_groups'):
-			item_groups.extend(["%s" % frappe.db.escape(d.name) for d in get_child_nodes('Item Group', data.item_group)])
+		for data in pos_profile.get("item_groups"):
+			item_groups.extend(
+				["%s" % frappe.db.escape(d.name) for d in get_child_nodes("Item Group", data.item_group)]
+			)
 
 	return list(set(item_groups))
 
+
 def get_child_nodes(group_type, root):
 	lft, rgt = frappe.db.get_value(group_type, root, ["lft", "rgt"])
-	return frappe.db.sql(""" Select name, lft, rgt from `tab{tab}` where
-			lft >= {lft} and rgt <= {rgt} order by lft""".format(tab=group_type, lft=lft, rgt=rgt), as_dict=1)
+	return frappe.db.sql(
+		""" Select name, lft, rgt from `tab{tab}` where
+			lft >= {lft} and rgt <= {rgt} order by lft""".format(
+			tab=group_type, lft=lft, rgt=rgt
+		),
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def pos_profile_query(doctype, txt, searchfield, start, page_len, filters):
-	user = frappe.session['user']
-	company = filters.get('company') or frappe.defaults.get_user_default('company')
+	user = frappe.session["user"]
+	company = filters.get("company") or frappe.defaults.get_user_default("company")
 
 	args = {
-		'user': user,
-		'start': start,
-		'company': company,
-		'page_len': page_len,
-		'txt': '%%%s%%' % txt
+		"user": user,
+		"start": start,
+		"company": company,
+		"page_len": page_len,
+		"txt": "%%%s%%" % txt,
 	}
 
-	pos_profile = frappe.db.sql("""select pf.name
+	pos_profile = frappe.db.sql(
+		"""select pf.name
 		from
 			`tabPOS Profile` pf, `tabPOS Profile User` pfu
 		where
 			pfu.parent = pf.name and pfu.user = %(user)s and pf.company = %(company)s
 			and (pf.name like %(txt)s)
-			and pf.disabled = 0 limit %(start)s, %(page_len)s""", args)
+			and pf.disabled = 0 limit %(start)s, %(page_len)s""",
+		args,
+	)
 
 	if not pos_profile:
-		del args['user']
+		del args["user"]
 
-		pos_profile = frappe.db.sql("""select pf.name
+		pos_profile = frappe.db.sql(
+			"""select pf.name
 			from
 				`tabPOS Profile` pf left join `tabPOS Profile User` pfu
 			on
@@ -154,26 +190,37 @@
 				ifnull(pfu.user, '') = ''
 				and pf.company = %(company)s
 				and pf.name like %(txt)s
-				and pf.disabled = 0""", args)
+				and pf.disabled = 0""",
+			args,
+		)
 
 	return pos_profile
 
+
 @frappe.whitelist()
 def set_default_profile(pos_profile, company):
 	modified = now()
 	user = frappe.session.user
 
 	if pos_profile and company:
-		frappe.db.sql(""" update `tabPOS Profile User` pfu, `tabPOS Profile` pf
+		frappe.db.sql(
+			""" update `tabPOS Profile User` pfu, `tabPOS Profile` pf
 			set
 				pfu.default = 0, pf.modified = %s, pf.modified_by = %s
 			where
 				pfu.user = %s and pf.name = pfu.parent and pf.company = %s
-				and pfu.default = 1""", (modified, user, user, company), auto_commit=1)
+				and pfu.default = 1""",
+			(modified, user, user, company),
+			auto_commit=1,
+		)
 
-		frappe.db.sql(""" update `tabPOS Profile User` pfu, `tabPOS Profile` pf
+		frappe.db.sql(
+			""" update `tabPOS Profile User` pfu, `tabPOS Profile` pf
 			set
 				pfu.default = 1, pf.modified = %s, pf.modified_by = %s
 			where
 				pfu.user = %s and pf.name = pfu.parent and pf.company = %s and pf.name = %s
-			""", (modified, user, user, company, pos_profile), auto_commit=1)
+			""",
+			(modified, user, user, company, pos_profile),
+			auto_commit=1,
+		)
diff --git a/erpnext/accounts/doctype/pos_profile/test_pos_profile.py b/erpnext/accounts/doctype/pos_profile/test_pos_profile.py
index c8cf0d2..788aa62 100644
--- a/erpnext/accounts/doctype/pos_profile/test_pos_profile.py
+++ b/erpnext/accounts/doctype/pos_profile/test_pos_profile.py
@@ -8,7 +8,8 @@
 from erpnext.accounts.doctype.pos_profile.pos_profile import get_child_nodes
 from erpnext.stock.get_item_details import get_pos_profile
 
-test_dependencies = ['Item']
+test_dependencies = ["Item"]
+
 
 class TestPOSProfile(unittest.TestCase):
 	def test_pos_profile(self):
@@ -17,46 +18,64 @@
 		pos_profile = get_pos_profile("_Test Company") or {}
 		if pos_profile:
 			doc = frappe.get_doc("POS Profile", pos_profile.get("name"))
-			doc.append('item_groups', {'item_group': '_Test Item Group'})
-			doc.append('customer_groups', {'customer_group': '_Test Customer Group'})
+			doc.append("item_groups", {"item_group": "_Test Item Group"})
+			doc.append("customer_groups", {"customer_group": "_Test Customer Group"})
 			doc.save()
 			items = get_items_list(doc, doc.company)
 			customers = get_customers_list(doc)
 
-			products_count = frappe.db.sql(""" select count(name) from tabItem where item_group = '_Test Item Group'""", as_list=1)
-			customers_count = frappe.db.sql(""" select count(name) from tabCustomer where customer_group = '_Test Customer Group'""")
+			products_count = frappe.db.sql(
+				""" select count(name) from tabItem where item_group = '_Test Item Group'""", as_list=1
+			)
+			customers_count = frappe.db.sql(
+				""" select count(name) from tabCustomer where customer_group = '_Test Customer Group'"""
+			)
 
 			self.assertEqual(len(items), products_count[0][0])
 			self.assertEqual(len(customers), customers_count[0][0])
 
 		frappe.db.sql("delete from `tabPOS Profile`")
 
+
 def get_customers_list(pos_profile=None):
 	if pos_profile is None:
 		pos_profile = {}
 	cond = "1=1"
 	customer_groups = []
-	if pos_profile.get('customer_groups'):
+	if pos_profile.get("customer_groups"):
 		# Get customers based on the customer groups defined in the POS profile
-		for d in pos_profile.get('customer_groups'):
-			customer_groups.extend([d.get('name') for d in get_child_nodes('Customer Group', d.get('customer_group'))])
-		cond = "customer_group in (%s)" % (', '.join(['%s'] * len(customer_groups)))
+		for d in pos_profile.get("customer_groups"):
+			customer_groups.extend(
+				[d.get("name") for d in get_child_nodes("Customer Group", d.get("customer_group"))]
+			)
+		cond = "customer_group in (%s)" % (", ".join(["%s"] * len(customer_groups)))
 
-	return frappe.db.sql(""" select name, customer_name, customer_group,
+	return (
+		frappe.db.sql(
+			""" select name, customer_name, customer_group,
 		territory, customer_pos_id from tabCustomer where disabled = 0
-		and {cond}""".format(cond=cond), tuple(customer_groups), as_dict=1) or {}
+		and {cond}""".format(
+				cond=cond
+			),
+			tuple(customer_groups),
+			as_dict=1,
+		)
+		or {}
+	)
+
 
 def get_items_list(pos_profile, company):
 	cond = ""
 	args_list = []
-	if pos_profile.get('item_groups'):
+	if pos_profile.get("item_groups"):
 		# Get items based on the item groups defined in the POS profile
-		for d in pos_profile.get('item_groups'):
-			args_list.extend([d.name for d in get_child_nodes('Item Group', d.item_group)])
+		for d in pos_profile.get("item_groups"):
+			args_list.extend([d.name for d in get_child_nodes("Item Group", d.item_group)])
 		if args_list:
-			cond = "and i.item_group in (%s)" % (', '.join(['%s'] * len(args_list)))
+			cond = "and i.item_group in (%s)" % (", ".join(["%s"] * len(args_list)))
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			i.name, i.item_code, i.item_name, i.description, i.item_group, i.has_batch_no,
 			i.has_serial_no, i.is_stock_item, i.brand, i.stock_uom, i.image,
@@ -69,7 +88,13 @@
 		where
 			i.disabled = 0 and i.has_variants = 0 and i.is_sales_item = 1 and i.is_fixed_asset = 0
 			{cond}
-		""".format(cond=cond), tuple([company] + args_list), as_dict=1)
+		""".format(
+			cond=cond
+		),
+		tuple([company] + args_list),
+		as_dict=1,
+	)
+
 
 def make_pos_profile(**args):
 	frappe.db.sql("delete from `tabPOS Payment Method`")
@@ -77,38 +102,34 @@
 
 	args = frappe._dict(args)
 
-	pos_profile = frappe.get_doc({
-		"company": args.company or "_Test Company",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"currency": args.currency or "INR",
-		"doctype": "POS Profile",
-		"expense_account": args.expense_account or "_Test Account Cost for Goods Sold - _TC",
-		"income_account":  args.income_account or "Sales - _TC",
-		"name":  args.name or "_Test POS Profile",
-		"naming_series": "_T-POS Profile-",
-		"selling_price_list":  args.selling_price_list or "_Test Price List",
-		"territory": args.territory or  "_Test Territory",
-		"customer_group": frappe.db.get_value('Customer Group', {'is_group': 0}, 'name'),
-		"warehouse":  args.warehouse or "_Test Warehouse - _TC",
-		"write_off_account":  args.write_off_account or "_Test Write Off - _TC",
-		"write_off_cost_center":  args.write_off_cost_center or "_Test Write Off Cost Center - _TC"
-	})
+	pos_profile = frappe.get_doc(
+		{
+			"company": args.company or "_Test Company",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"currency": args.currency or "INR",
+			"doctype": "POS Profile",
+			"expense_account": args.expense_account or "_Test Account Cost for Goods Sold - _TC",
+			"income_account": args.income_account or "Sales - _TC",
+			"name": args.name or "_Test POS Profile",
+			"naming_series": "_T-POS Profile-",
+			"selling_price_list": args.selling_price_list or "_Test Price List",
+			"territory": args.territory or "_Test Territory",
+			"customer_group": frappe.db.get_value("Customer Group", {"is_group": 0}, "name"),
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"write_off_account": args.write_off_account or "_Test Write Off - _TC",
+			"write_off_cost_center": args.write_off_cost_center or "_Test Write Off Cost Center - _TC",
+		}
+	)
 
 	mode_of_payment = frappe.get_doc("Mode of Payment", "Cash")
 	company = args.company or "_Test Company"
 	default_account = args.income_account or "Sales - _TC"
 
 	if not frappe.db.get_value("Mode of Payment Account", {"company": company, "parent": "Cash"}):
-		mode_of_payment.append("accounts", {
-			"company": company,
-			"default_account": default_account
-		})
+		mode_of_payment.append("accounts", {"company": company, "default_account": default_account})
 		mode_of_payment.save()
 
-	pos_profile.append("payments", {
-		'mode_of_payment': 'Cash',
-		'default': 1
-	})
+	pos_profile.append("payments", {"mode_of_payment": "Cash", "default": 1})
 
 	if not frappe.db.exists("POS Profile", args.name or "_Test POS Profile"):
 		pos_profile.insert()
diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
index 933fda8..08cec6a 100644
--- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
@@ -12,11 +12,11 @@
 from frappe.model.document import Document
 from frappe.utils import cint, flt, getdate
 
-apply_on_dict = {"Item Code": "items",
-	"Item Group": "item_groups", "Brand": "brands"}
+apply_on_dict = {"Item Code": "items", "Item Group": "item_groups", "Brand": "brands"}
 
 other_fields = ["other_item_code", "other_item_group", "other_brand"]
 
+
 class PricingRule(Document):
 	def validate(self):
 		self.validate_mandatory()
@@ -31,7 +31,8 @@
 		self.validate_dates()
 		self.validate_condition()
 
-		if not self.margin_type: self.margin_rate_or_amount = 0.0
+		if not self.margin_type:
+			self.margin_rate_or_amount = 0.0
 
 	def validate_duplicate_apply_on(self):
 		field = apply_on_dict.get(self.apply_on)
@@ -49,36 +50,51 @@
 			throw(_("{0} is required").format(self.meta.get_label(tocheck)), frappe.MandatoryError)
 
 		if self.apply_rule_on_other:
-			o_field = 'other_' + frappe.scrub(self.apply_rule_on_other)
+			o_field = "other_" + frappe.scrub(self.apply_rule_on_other)
 			if not self.get(o_field) and o_field in other_fields:
-				frappe.throw(_("For the 'Apply Rule On Other' condition the field {0} is mandatory")
-					.format(frappe.bold(self.apply_rule_on_other)))
+				frappe.throw(
+					_("For the 'Apply Rule On Other' condition the field {0} is mandatory").format(
+						frappe.bold(self.apply_rule_on_other)
+					)
+				)
 
-
-		if self.price_or_product_discount == 'Price' and not self.rate_or_discount:
+		if self.price_or_product_discount == "Price" and not self.rate_or_discount:
 			throw(_("Rate or Discount is required for the price discount."), frappe.MandatoryError)
 
 		if self.apply_discount_on_rate:
 			if not self.priority:
-				throw(_("As the field {0} is enabled, the field {1} is mandatory.")
-					.format(frappe.bold("Apply Discount on Discounted Rate"), frappe.bold("Priority")))
+				throw(
+					_("As the field {0} is enabled, the field {1} is mandatory.").format(
+						frappe.bold("Apply Discount on Discounted Rate"), frappe.bold("Priority")
+					)
+				)
 
 			if self.priority and cint(self.priority) == 1:
-				throw(_("As the field {0} is enabled, the value of the field {1} should be more than 1.")
-					.format(frappe.bold("Apply Discount on Discounted Rate"), frappe.bold("Priority")))
+				throw(
+					_("As the field {0} is enabled, the value of the field {1} should be more than 1.").format(
+						frappe.bold("Apply Discount on Discounted Rate"), frappe.bold("Priority")
+					)
+				)
 
 	def validate_applicable_for_selling_or_buying(self):
 		if not self.selling and not self.buying:
 			throw(_("Atleast one of the Selling or Buying must be selected"))
 
-		if not self.selling and self.applicable_for in ["Customer", "Customer Group",
-				"Territory", "Sales Partner", "Campaign"]:
-			throw(_("Selling must be checked, if Applicable For is selected as {0}")
-				.format(self.applicable_for))
+		if not self.selling and self.applicable_for in [
+			"Customer",
+			"Customer Group",
+			"Territory",
+			"Sales Partner",
+			"Campaign",
+		]:
+			throw(
+				_("Selling must be checked, if Applicable For is selected as {0}").format(self.applicable_for)
+			)
 
 		if not self.buying and self.applicable_for in ["Supplier", "Supplier Group"]:
-			throw(_("Buying must be checked, if Applicable For is selected as {0}")
-				.format(self.applicable_for))
+			throw(
+				_("Buying must be checked, if Applicable For is selected as {0}").format(self.applicable_for)
+			)
 
 	def validate_min_max_qty(self):
 		if self.min_qty and self.max_qty and flt(self.min_qty) > flt(self.max_qty):
@@ -95,11 +111,12 @@
 			# reset all values except for the logic field
 			options = (self.meta.get_options(logic_field) or "").split("\n")
 			for f in options:
-				if not f: continue
+				if not f:
+					continue
 
 				scrubbed_f = frappe.scrub(f)
 
-				if logic_field == 'apply_on':
+				if logic_field == "apply_on":
 					apply_on_f = apply_on_dict.get(f, f)
 				else:
 					apply_on_f = scrubbed_f
@@ -112,8 +129,11 @@
 
 		apply_rule_on_other = frappe.scrub(self.apply_rule_on_other or "")
 
-		cleanup_other_fields = (other_fields if not apply_rule_on_other
-			else [o_field for o_field in other_fields if o_field != 'other_' + apply_rule_on_other])
+		cleanup_other_fields = (
+			other_fields
+			if not apply_rule_on_other
+			else [o_field for o_field in other_fields if o_field != "other_" + apply_rule_on_other]
+		)
 
 		for other_field in cleanup_other_fields:
 			self.set(other_field, None)
@@ -123,7 +143,7 @@
 			if flt(self.get(frappe.scrub(field))) < 0:
 				throw(_("{0} can not be negative").format(field))
 
-		if self.price_or_product_discount == 'Product' and not self.free_item:
+		if self.price_or_product_discount == "Product" and not self.free_item:
 			if self.mixed_conditions:
 				frappe.throw(_("Free item code is not selected"))
 			else:
@@ -150,31 +170,37 @@
 			frappe.throw(_("Valid from date must be less than valid upto date"))
 
 	def validate_condition(self):
-		if self.condition and ("=" in self.condition) and re.match(r'[\w\.:_]+\s*={1}\s*[\w\.@\'"]+', self.condition):
+		if (
+			self.condition
+			and ("=" in self.condition)
+			and re.match(r'[\w\.:_]+\s*={1}\s*[\w\.@\'"]+', self.condition)
+		):
 			frappe.throw(_("Invalid condition expression"))
 
-#--------------------------------------------------------------------------------
+
+# --------------------------------------------------------------------------------
+
 
 @frappe.whitelist()
 def apply_pricing_rule(args, doc=None):
 	"""
-		args = {
-			"items": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
-			"customer": "something",
-			"customer_group": "something",
-			"territory": "something",
-			"supplier": "something",
-			"supplier_group": "something",
-			"currency": "something",
-			"conversion_rate": "something",
-			"price_list": "something",
-			"plc_conversion_rate": "something",
-			"company": "something",
-			"transaction_date": "something",
-			"campaign": "something",
-			"sales_partner": "something",
-			"ignore_pricing_rule": "something"
-		}
+	args = {
+	        "items": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
+	        "customer": "something",
+	        "customer_group": "something",
+	        "territory": "something",
+	        "supplier": "something",
+	        "supplier_group": "something",
+	        "currency": "something",
+	        "conversion_rate": "something",
+	        "price_list": "something",
+	        "plc_conversion_rate": "something",
+	        "company": "something",
+	        "transaction_date": "something",
+	        "campaign": "something",
+	        "sales_partner": "something",
+	        "ignore_pricing_rule": "something"
+	}
 	"""
 
 	if isinstance(args, str):
@@ -188,16 +214,23 @@
 	# list of dictionaries
 	out = []
 
-	if args.get("doctype") == "Material Request": return out
+	if args.get("doctype") == "Material Request":
+		return out
 
 	item_list = args.get("items")
 	args.pop("items")
 
-	set_serial_nos_based_on_fifo = frappe.db.get_single_value("Stock Settings",
-		"automatically_set_serial_nos_based_on_fifo")
+	set_serial_nos_based_on_fifo = frappe.db.get_single_value(
+		"Stock Settings", "automatically_set_serial_nos_based_on_fifo"
+	)
 
-	item_code_list = tuple(item.get('item_code') for item in item_list)
-	query_items = frappe.get_all('Item', fields=['item_code','has_serial_no'], filters=[['item_code','in',item_code_list]],as_list=1)
+	item_code_list = tuple(item.get("item_code") for item in item_list)
+	query_items = frappe.get_all(
+		"Item",
+		fields=["item_code", "has_serial_no"],
+		filters=[["item_code", "in", item_code_list]],
+		as_list=1,
+	)
 	serialized_items = dict()
 	for item_code, val in query_items:
 		serialized_items.setdefault(item_code, val)
@@ -205,26 +238,31 @@
 	for item in item_list:
 		args_copy = copy.deepcopy(args)
 		args_copy.update(item)
-		data = get_pricing_rule_for_item(args_copy, item.get('price_list_rate'), doc=doc)
+		data = get_pricing_rule_for_item(args_copy, item.get("price_list_rate"), doc=doc)
 		out.append(data)
 
-		if serialized_items.get(item.get('item_code')) and not item.get("serial_no") and set_serial_nos_based_on_fifo and not args.get('is_return'):
+		if (
+			serialized_items.get(item.get("item_code"))
+			and not item.get("serial_no")
+			and set_serial_nos_based_on_fifo
+			and not args.get("is_return")
+		):
 			out[0].update(get_serial_no_for_item(args_copy))
 
 	return out
 
+
 def get_serial_no_for_item(args):
 	from erpnext.stock.get_item_details import get_serial_no
 
-	item_details = frappe._dict({
-		"doctype": args.doctype,
-		"name": args.name,
-		"serial_no": args.serial_no
-	})
+	item_details = frappe._dict(
+		{"doctype": args.doctype, "name": args.name, "serial_no": args.serial_no}
+	)
 	if args.get("parenttype") in ("Sales Invoice", "Delivery Note") and flt(args.stock_qty) > 0:
 		item_details.serial_no = get_serial_no(args)
 	return item_details
 
+
 def get_pricing_rule_for_item(args, price_list_rate=0, doc=None, for_validate=False):
 	from erpnext.accounts.doctype.pricing_rule.utils import (
 		get_applied_pricing_rules,
@@ -239,18 +277,20 @@
 	if doc:
 		doc = frappe.get_doc(doc)
 
-	if (args.get('is_free_item') or
-		args.get("parenttype") == "Material Request"): return {}
+	if args.get("is_free_item") or args.get("parenttype") == "Material Request":
+		return {}
 
-	item_details = frappe._dict({
-		"doctype": args.doctype,
-		"has_margin": False,
-		"name": args.name,
-		"free_item_data": [],
-		"parent": args.parent,
-		"parenttype": args.parenttype,
-		"child_docname": args.get('child_docname'),
-	})
+	item_details = frappe._dict(
+		{
+			"doctype": args.doctype,
+			"has_margin": False,
+			"name": args.name,
+			"free_item_data": [],
+			"parent": args.parent,
+			"parenttype": args.parenttype,
+			"child_docname": args.get("child_docname"),
+		}
+	)
 
 	if args.ignore_pricing_rule or not args.item_code:
 		if frappe.db.exists(args.doctype, args.name) and args.get("pricing_rules"):
@@ -264,20 +304,25 @@
 
 	update_args_for_pricing_rule(args)
 
-	pricing_rules = (get_applied_pricing_rules(args.get('pricing_rules'))
-		if for_validate and args.get("pricing_rules") else get_pricing_rules(args, doc))
+	pricing_rules = (
+		get_applied_pricing_rules(args.get("pricing_rules"))
+		if for_validate and args.get("pricing_rules")
+		else get_pricing_rules(args, doc)
+	)
 
 	if pricing_rules:
 		rules = []
 
 		for pricing_rule in pricing_rules:
-			if not pricing_rule: continue
+			if not pricing_rule:
+				continue
 
 			if isinstance(pricing_rule, str):
 				pricing_rule = frappe.get_cached_doc("Pricing Rule", pricing_rule)
 				pricing_rule.apply_rule_on_other_items = get_pricing_rule_items(pricing_rule)
 
-			if pricing_rule.get('suggestion'): continue
+			if pricing_rule.get("suggestion"):
+				continue
 
 			item_details.validate_applied_rule = pricing_rule.get("validate_applied_rule", 0)
 			item_details.price_or_product_discount = pricing_rule.get("price_or_product_discount")
@@ -285,14 +330,19 @@
 			rules.append(get_pricing_rule_details(args, pricing_rule))
 
 			if pricing_rule.mixed_conditions or pricing_rule.apply_rule_on_other:
-				item_details.update({
-					'apply_rule_on_other_items': json.dumps(pricing_rule.apply_rule_on_other_items),
-					'price_or_product_discount': pricing_rule.price_or_product_discount,
-					'apply_rule_on': (frappe.scrub(pricing_rule.apply_rule_on_other)
-						if pricing_rule.apply_rule_on_other else frappe.scrub(pricing_rule.get('apply_on')))
-				})
+				item_details.update(
+					{
+						"apply_rule_on_other_items": json.dumps(pricing_rule.apply_rule_on_other_items),
+						"price_or_product_discount": pricing_rule.price_or_product_discount,
+						"apply_rule_on": (
+							frappe.scrub(pricing_rule.apply_rule_on_other)
+							if pricing_rule.apply_rule_on_other
+							else frappe.scrub(pricing_rule.get("apply_on"))
+						),
+					}
+				)
 
-			if pricing_rule.coupon_code_based==1 and args.coupon_code==None:
+			if pricing_rule.coupon_code_based == 1 and args.coupon_code == None:
 				return item_details
 
 			if not pricing_rule.validate_applied_rule:
@@ -309,7 +359,8 @@
 
 		item_details.pricing_rules = frappe.as_json([d.pricing_rule for d in rules])
 
-		if not doc: return item_details
+		if not doc:
+			return item_details
 
 	elif args.get("pricing_rules"):
 		item_details = remove_pricing_rule_for_item(
@@ -321,19 +372,22 @@
 
 	return item_details
 
+
 def update_args_for_pricing_rule(args):
 	if not (args.item_group and args.brand):
 		try:
-			args.item_group, args.brand = frappe.get_cached_value("Item", args.item_code, ["item_group", "brand"])
+			args.item_group, args.brand = frappe.get_cached_value(
+				"Item", args.item_code, ["item_group", "brand"]
+			)
 		except frappe.DoesNotExistError:
 			return
 		if not args.item_group:
 			frappe.throw(_("Item Group not mentioned in item master for item {0}").format(args.item_code))
 
-	if args.transaction_type=="selling":
+	if args.transaction_type == "selling":
 		if args.customer and not (args.customer_group and args.territory):
 
-			if args.quotation_to and args.quotation_to != 'Customer':
+			if args.quotation_to and args.quotation_to != "Customer":
 				customer = frappe._dict()
 			else:
 				customer = frappe.get_cached_value("Customer", args.customer, ["customer_group", "territory"])
@@ -347,20 +401,25 @@
 		args.supplier_group = frappe.get_cached_value("Supplier", args.supplier, "supplier_group")
 		args.customer = args.customer_group = args.territory = None
 
+
 def get_pricing_rule_details(args, pricing_rule):
-	return frappe._dict({
-		'pricing_rule': pricing_rule.name,
-		'rate_or_discount': pricing_rule.rate_or_discount,
-		'margin_type': pricing_rule.margin_type,
-		'item_code': args.get("item_code"),
-		'child_docname': args.get('child_docname')
-	})
+	return frappe._dict(
+		{
+			"pricing_rule": pricing_rule.name,
+			"rate_or_discount": pricing_rule.rate_or_discount,
+			"margin_type": pricing_rule.margin_type,
+			"item_code": args.get("item_code"),
+			"child_docname": args.get("child_docname"),
+		}
+	)
+
 
 def apply_price_discount_rule(pricing_rule, item_details, args):
 	item_details.pricing_rule_for = pricing_rule.rate_or_discount
 
-	if ((pricing_rule.margin_type in ['Amount', 'Percentage'] and pricing_rule.currency == args.currency)
-			or (pricing_rule.margin_type == 'Percentage')):
+	if (
+		pricing_rule.margin_type in ["Amount", "Percentage"] and pricing_rule.currency == args.currency
+	) or (pricing_rule.margin_type == "Percentage"):
 		item_details.margin_type = pricing_rule.margin_type
 		item_details.has_margin = True
 
@@ -369,7 +428,7 @@
 		else:
 			item_details.margin_rate_or_amount = pricing_rule.margin_rate_or_amount
 
-	if pricing_rule.rate_or_discount == 'Rate':
+	if pricing_rule.rate_or_discount == "Rate":
 		pricing_rule_rate = 0.0
 		if pricing_rule.currency == args.currency:
 			pricing_rule_rate = pricing_rule.rate
@@ -377,63 +436,71 @@
 		if pricing_rule_rate:
 			# Override already set price list rate (from item price)
 			# if pricing_rule_rate > 0
-			item_details.update({
-				"price_list_rate": pricing_rule_rate * args.get("conversion_factor", 1),
-			})
-		item_details.update({
-			"discount_percentage": 0.0
-		})
+			item_details.update(
+				{
+					"price_list_rate": pricing_rule_rate * args.get("conversion_factor", 1),
+				}
+			)
+		item_details.update({"discount_percentage": 0.0})
 
-	for apply_on in ['Discount Amount', 'Discount Percentage']:
-		if pricing_rule.rate_or_discount != apply_on: continue
+	for apply_on in ["Discount Amount", "Discount Percentage"]:
+		if pricing_rule.rate_or_discount != apply_on:
+			continue
 
 		field = frappe.scrub(apply_on)
 		if pricing_rule.apply_discount_on_rate and item_details.get("discount_percentage"):
 			# Apply discount on discounted rate
-			item_details[field] += ((100 - item_details[field]) * (pricing_rule.get(field, 0) / 100))
+			item_details[field] += (100 - item_details[field]) * (pricing_rule.get(field, 0) / 100)
 		else:
 			if field not in item_details:
 				item_details.setdefault(field, 0)
 
-			item_details[field] += (pricing_rule.get(field, 0)
-				if pricing_rule else args.get(field, 0))
+			item_details[field] += pricing_rule.get(field, 0) if pricing_rule else args.get(field, 0)
+
 
 def remove_pricing_rule_for_item(pricing_rules, item_details, item_code=None, rate=None):
 	from erpnext.accounts.doctype.pricing_rule.utils import (
 		get_applied_pricing_rules,
 		get_pricing_rule_items,
 	)
-	for d in get_applied_pricing_rules(pricing_rules):
-		if not d or not frappe.db.exists("Pricing Rule", d): continue
-		pricing_rule = frappe.get_cached_doc('Pricing Rule', d)
 
-		if pricing_rule.price_or_product_discount == 'Price':
-			if pricing_rule.rate_or_discount == 'Discount Percentage':
+	for d in get_applied_pricing_rules(pricing_rules):
+		if not d or not frappe.db.exists("Pricing Rule", d):
+			continue
+		pricing_rule = frappe.get_cached_doc("Pricing Rule", d)
+
+		if pricing_rule.price_or_product_discount == "Price":
+			if pricing_rule.rate_or_discount == "Discount Percentage":
 				item_details.discount_percentage = 0.0
 				item_details.discount_amount = 0.0
 				item_details.rate = rate or 0.0
 
-			if pricing_rule.rate_or_discount == 'Discount Amount':
+			if pricing_rule.rate_or_discount == "Discount Amount":
 				item_details.discount_amount = 0.0
 
-			if pricing_rule.margin_type in ['Percentage', 'Amount']:
+			if pricing_rule.margin_type in ["Percentage", "Amount"]:
 				item_details.margin_rate_or_amount = 0.0
 				item_details.margin_type = None
-		elif pricing_rule.get('free_item'):
-			item_details.remove_free_item = (item_code if pricing_rule.get('same_item')
-				else pricing_rule.get('free_item'))
+		elif pricing_rule.get("free_item"):
+			item_details.remove_free_item = (
+				item_code if pricing_rule.get("same_item") else pricing_rule.get("free_item")
+			)
 
 		if pricing_rule.get("mixed_conditions") or pricing_rule.get("apply_rule_on_other"):
 			items = get_pricing_rule_items(pricing_rule)
-			item_details.apply_on = (frappe.scrub(pricing_rule.apply_rule_on_other)
-				if pricing_rule.apply_rule_on_other else frappe.scrub(pricing_rule.get('apply_on')))
-			item_details.applied_on_items = ','.join(items)
+			item_details.apply_on = (
+				frappe.scrub(pricing_rule.apply_rule_on_other)
+				if pricing_rule.apply_rule_on_other
+				else frappe.scrub(pricing_rule.get("apply_on"))
+			)
+			item_details.applied_on_items = ",".join(items)
 
-	item_details.pricing_rules = ''
+	item_details.pricing_rules = ""
 	item_details.pricing_rule_removed = True
 
 	return item_details
 
+
 @frappe.whitelist()
 def remove_pricing_rules(item_list):
 	if isinstance(item_list, str):
@@ -451,19 +518,26 @@
 
 	return out
 
+
 def set_transaction_type(args):
 	if args.transaction_type:
 		return
 	if args.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"):
 		args.transaction_type = "selling"
-	elif args.doctype in ("Material Request", "Supplier Quotation", "Purchase Order",
-		"Purchase Receipt", "Purchase Invoice"):
-			args.transaction_type = "buying"
+	elif args.doctype in (
+		"Material Request",
+		"Supplier Quotation",
+		"Purchase Order",
+		"Purchase Receipt",
+		"Purchase Invoice",
+	):
+		args.transaction_type = "buying"
 	elif args.customer:
 		args.transaction_type = "selling"
 	else:
 		args.transaction_type = "buying"
 
+
 @frappe.whitelist()
 def make_pricing_rule(doctype, docname):
 	doc = frappe.new_doc("Pricing Rule")
@@ -474,15 +548,18 @@
 
 	return doc
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_item_uoms(doctype, txt, searchfield, start, page_len, filters):
-	items = [filters.get('value')]
-	if filters.get('apply_on') != 'Item Code':
-		field = frappe.scrub(filters.get('apply_on'))
-		items = [d.name for d in frappe.db.get_all("Item", filters={field: filters.get('value')})]
+	items = [filters.get("value")]
+	if filters.get("apply_on") != "Item Code":
+		field = frappe.scrub(filters.get("apply_on"))
+		items = [d.name for d in frappe.db.get_all("Item", filters={field: filters.get("value")})]
 
-	return frappe.get_all('UOM Conversion Detail', filters={
-			'parent': ('in', items),
-			'uom': ("like", "{0}%".format(txt))
-		}, fields = ["distinct uom"], as_list=1)
+	return frappe.get_all(
+		"UOM Conversion Detail",
+		filters={"parent": ("in", items), "uom": ("like", "{0}%".format(txt))},
+		fields=["distinct uom"],
+		as_list=1,
+	)
diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
index 8338a5b0..4cf19b4 100644
--- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import unittest
 
 import frappe
@@ -30,31 +29,31 @@
 			"doctype": "Pricing Rule",
 			"title": "_Test Pricing Rule",
 			"apply_on": "Item Code",
-			"items": [{
-				"item_code": "_Test Item"
-			}],
+			"items": [{"item_code": "_Test Item"}],
 			"currency": "USD",
 			"selling": 1,
 			"rate_or_discount": "Discount Percentage",
 			"rate": 0,
 			"discount_percentage": 10,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
-		args = frappe._dict({
-			"item_code": "_Test Item",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Sales Order",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"name": None
-		})
+		args = frappe._dict(
+			{
+				"item_code": "_Test Item",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Sales Order",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"name": None,
+			}
+		)
 		details = get_item_details(args)
 		self.assertEqual(details.get("discount_percentage"), 10)
 
@@ -73,9 +72,7 @@
 		prule = frappe.get_doc(test_record.copy())
 		prule.apply_on = "Item Group"
 		prule.items = []
-		prule.append('item_groups', {
-			'item_group': "All Item Groups"
-		})
+		prule.append("item_groups", {"item_group": "All Item Groups"})
 		prule.title = "_Test Pricing Rule for Item Group"
 		prule.discount_percentage = 15
 		prule.insert()
@@ -98,6 +95,7 @@
 
 		frappe.db.sql("update `tabPricing Rule` set priority=NULL where campaign='_Test Campaign'")
 		from erpnext.accounts.doctype.pricing_rule.utils import MultiplePricingRuleConflict
+
 		self.assertRaises(MultiplePricingRuleConflict, get_item_details, args)
 
 		args.item_code = "_Test Item 2"
@@ -113,41 +111,47 @@
 			"doctype": "Pricing Rule",
 			"title": "_Test Pricing Rule",
 			"apply_on": "Item Code",
-			"items": [{
-				"item_code": "_Test FG Item 2",
-			}],
+			"items": [
+				{
+					"item_code": "_Test FG Item 2",
+				}
+			],
 			"selling": 1,
 			"currency": "USD",
 			"rate_or_discount": "Discount Percentage",
 			"rate": 0,
 			"margin_type": "Percentage",
 			"margin_rate_or_amount": 10,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
-		item_price = frappe.get_doc({
-			"doctype": "Item Price",
-			"price_list": "_Test Price List 2",
-			"item_code": "_Test FG Item 2",
-			"price_list_rate": 100
-		})
+		item_price = frappe.get_doc(
+			{
+				"doctype": "Item Price",
+				"price_list": "_Test Price List 2",
+				"item_code": "_Test FG Item 2",
+				"price_list_rate": 100,
+			}
+		)
 
 		item_price.insert(ignore_permissions=True)
 
-		args = frappe._dict({
-			"item_code": "_Test FG Item 2",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Sales Order",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"name": None
-		})
+		args = frappe._dict(
+			{
+				"item_code": "_Test FG Item 2",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Sales Order",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"name": None,
+			}
+		)
 		details = get_item_details(args)
 		self.assertEqual(details.get("margin_type"), "Percentage")
 		self.assertEqual(details.get("margin_rate_or_amount"), 10)
@@ -176,25 +180,27 @@
 			"discount_percentage": 10,
 			"applicable_for": "Customer Group",
 			"customer_group": "All Customer Groups",
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
-		args = frappe._dict({
-			"item_code": "Mixed Cond Item 1",
-			"item_group": "Products",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Sales Order",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"customer_group": "_Test Customer Group",
-			"name": None
-		})
+		args = frappe._dict(
+			{
+				"item_code": "Mixed Cond Item 1",
+				"item_group": "Products",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Sales Order",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"customer_group": "_Test Customer Group",
+				"name": None,
+			}
+		)
 		details = get_item_details(args)
 		self.assertEqual(details.get("discount_percentage"), 10)
 
@@ -204,72 +210,79 @@
 		from erpnext.stock.get_item_details import get_item_details
 
 		if not frappe.db.exists("Item", "Test Variant PRT"):
-			frappe.get_doc({
-				"doctype": "Item",
-				"item_code": "Test Variant PRT",
-				"item_name": "Test Variant PRT",
-				"description": "Test Variant PRT",
-				"item_group": "_Test Item Group",
-				"is_stock_item": 1,
-				"variant_of": "_Test Variant Item",
-				"default_warehouse": "_Test Warehouse - _TC",
-				"stock_uom": "_Test UOM",
-				"attributes": [
+			frappe.get_doc(
+				{
+					"doctype": "Item",
+					"item_code": "Test Variant PRT",
+					"item_name": "Test Variant PRT",
+					"description": "Test Variant PRT",
+					"item_group": "_Test Item Group",
+					"is_stock_item": 1,
+					"variant_of": "_Test Variant Item",
+					"default_warehouse": "_Test Warehouse - _TC",
+					"stock_uom": "_Test UOM",
+					"attributes": [{"attribute": "Test Size", "attribute_value": "Medium"}],
+				}
+			).insert()
+
+		frappe.get_doc(
+			{
+				"doctype": "Pricing Rule",
+				"title": "_Test Pricing Rule 1",
+				"apply_on": "Item Code",
+				"currency": "USD",
+				"items": [
 					{
-					  "attribute": "Test Size",
-					  "attribute_value": "Medium"
+						"item_code": "_Test Variant Item",
 					}
 				],
-			}).insert()
+				"selling": 1,
+				"rate_or_discount": "Discount Percentage",
+				"rate": 0,
+				"discount_percentage": 7.5,
+				"company": "_Test Company",
+			}
+		).insert()
 
-		frappe.get_doc({
-			"doctype": "Pricing Rule",
-			"title": "_Test Pricing Rule 1",
-			"apply_on": "Item Code",
-			"currency": "USD",
-			"items": [{
-				"item_code": "_Test Variant Item",
-			}],
-			"selling": 1,
-			"rate_or_discount": "Discount Percentage",
-			"rate": 0,
-			"discount_percentage": 7.5,
-			"company": "_Test Company"
-		}).insert()
-
-		args = frappe._dict({
-			"item_code": "Test Variant PRT",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Sales Order",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"name": None
-		})
+		args = frappe._dict(
+			{
+				"item_code": "Test Variant PRT",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Sales Order",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"name": None,
+			}
+		)
 
 		details = get_item_details(args)
 		self.assertEqual(details.get("discount_percentage"), 7.5)
 
 		# add a new pricing rule for that item code, it should take priority
-		frappe.get_doc({
-			"doctype": "Pricing Rule",
-			"title": "_Test Pricing Rule 2",
-			"apply_on": "Item Code",
-			"items": [{
-				"item_code": "Test Variant PRT",
-			}],
-			"currency": "USD",
-			"selling": 1,
-			"rate_or_discount": "Discount Percentage",
-			"rate": 0,
-			"discount_percentage": 17.5,
-			"priority": 1,
-			"company": "_Test Company"
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Pricing Rule",
+				"title": "_Test Pricing Rule 2",
+				"apply_on": "Item Code",
+				"items": [
+					{
+						"item_code": "Test Variant PRT",
+					}
+				],
+				"currency": "USD",
+				"selling": 1,
+				"rate_or_discount": "Discount Percentage",
+				"rate": 0,
+				"discount_percentage": 17.5,
+				"priority": 1,
+				"company": "_Test Company",
+			}
+		).insert()
 
 		details = get_item_details(args)
 		self.assertEqual(details.get("discount_percentage"), 17.5)
@@ -280,33 +293,31 @@
 			"title": "_Test Pricing Rule",
 			"apply_on": "Item Code",
 			"currency": "USD",
-			"items": [{
-				"item_code": "_Test Item",
-			}],
+			"items": [
+				{
+					"item_code": "_Test Item",
+				}
+			],
 			"selling": 1,
 			"rate_or_discount": "Discount Percentage",
 			"rate": 0,
 			"min_qty": 5,
 			"max_qty": 7,
 			"discount_percentage": 17.5,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
-		if not frappe.db.get_value('UOM Conversion Detail',
-			{'parent': '_Test Item', 'uom': 'box'}):
-			item = frappe.get_doc('Item', '_Test Item')
-			item.append('uoms', {
-				'uom': 'Box',
-				'conversion_factor': 5
-			})
+		if not frappe.db.get_value("UOM Conversion Detail", {"parent": "_Test Item", "uom": "box"}):
+			item = frappe.get_doc("Item", "_Test Item")
+			item.append("uoms", {"uom": "Box", "conversion_factor": 5})
 			item.save(ignore_permissions=True)
 
 		# With pricing rule
 		so = make_sales_order(item_code="_Test Item", qty=1, uom="Box", do_not_submit=True)
 		so.items[0].price_list_rate = 100
 		so.submit()
-		so = frappe.get_doc('Sales Order', so.name)
+		so = frappe.get_doc("Sales Order", so.name)
 		self.assertEqual(so.items[0].discount_percentage, 17.5)
 		self.assertEqual(so.items[0].rate, 82.5)
 
@@ -314,13 +325,15 @@
 		so = make_sales_order(item_code="_Test Item", qty=2, uom="Box", do_not_submit=True)
 		so.items[0].price_list_rate = 100
 		so.submit()
-		so = frappe.get_doc('Sales Order', so.name)
+		so = frappe.get_doc("Sales Order", so.name)
 		self.assertEqual(so.items[0].discount_percentage, 0)
 		self.assertEqual(so.items[0].rate, 100)
 
 	def test_pricing_rule_with_margin_and_discount(self):
-		frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule')
-		make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10, discount_percentage=10)
+		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
+		make_pricing_rule(
+			selling=1, margin_type="Percentage", margin_rate_or_amount=10, discount_percentage=10
+		)
 		si = create_sales_invoice(do_not_save=True)
 		si.items[0].price_list_rate = 1000
 		si.payment_schedule = []
@@ -334,9 +347,14 @@
 		self.assertEqual(item.rate, 990)
 
 	def test_pricing_rule_with_margin_and_discount_amount(self):
-		frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule')
-		make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10,
-			rate_or_discount="Discount Amount", discount_amount=110)
+		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
+		make_pricing_rule(
+			selling=1,
+			margin_type="Percentage",
+			margin_rate_or_amount=10,
+			rate_or_discount="Discount Amount",
+			discount_amount=110,
+		)
 		si = create_sales_invoice(do_not_save=True)
 		si.items[0].price_list_rate = 1000
 		si.payment_schedule = []
@@ -349,15 +367,17 @@
 		self.assertEqual(item.rate, 990)
 
 	def test_pricing_rule_for_product_discount_on_same_item(self):
-		frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule')
+		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
 		test_record = {
 			"doctype": "Pricing Rule",
 			"title": "_Test Pricing Rule",
 			"apply_on": "Item Code",
 			"currency": "USD",
-			"items": [{
-				"item_code": "_Test Item",
-			}],
+			"items": [
+				{
+					"item_code": "_Test Item",
+				}
+			],
 			"selling": 1,
 			"rate_or_discount": "Discount Percentage",
 			"rate": 0,
@@ -367,7 +387,7 @@
 			"price_or_product_discount": "Product",
 			"same_item": 1,
 			"free_qty": 1,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
@@ -377,17 +397,18 @@
 		self.assertEqual(so.items[1].is_free_item, 1)
 		self.assertEqual(so.items[1].item_code, "_Test Item")
 
-
 	def test_pricing_rule_for_product_discount_on_different_item(self):
-		frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule')
+		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
 		test_record = {
 			"doctype": "Pricing Rule",
 			"title": "_Test Pricing Rule",
 			"apply_on": "Item Code",
 			"currency": "USD",
-			"items": [{
-				"item_code": "_Test Item",
-			}],
+			"items": [
+				{
+					"item_code": "_Test Item",
+				}
+			],
 			"selling": 1,
 			"rate_or_discount": "Discount Percentage",
 			"rate": 0,
@@ -398,7 +419,7 @@
 			"same_item": 0,
 			"free_item": "_Test Item 2",
 			"free_qty": 1,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
@@ -409,15 +430,17 @@
 		self.assertEqual(so.items[1].item_code, "_Test Item 2")
 
 	def test_cumulative_pricing_rule(self):
-		frappe.delete_doc_if_exists('Pricing Rule', '_Test Cumulative Pricing Rule')
+		frappe.delete_doc_if_exists("Pricing Rule", "_Test Cumulative Pricing Rule")
 		test_record = {
 			"doctype": "Pricing Rule",
 			"title": "_Test Cumulative Pricing Rule",
 			"apply_on": "Item Code",
 			"currency": "USD",
-			"items": [{
-				"item_code": "_Test Item",
-			}],
+			"items": [
+				{
+					"item_code": "_Test Item",
+				}
+			],
 			"is_cumulative": 1,
 			"selling": 1,
 			"applicable_for": "Customer",
@@ -430,24 +453,26 @@
 			"price_or_product_discount": "Price",
 			"company": "_Test Company",
 			"valid_from": frappe.utils.nowdate(),
-			"valid_upto": frappe.utils.nowdate()
+			"valid_upto": frappe.utils.nowdate(),
 		}
 		frappe.get_doc(test_record.copy()).insert()
 
-		args = frappe._dict({
-			"item_code": "_Test Item",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Sales Invoice",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"name": None,
-			"transaction_date": frappe.utils.nowdate()
-		})
+		args = frappe._dict(
+			{
+				"item_code": "_Test Item",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Sales Invoice",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"name": None,
+				"transaction_date": frappe.utils.nowdate(),
+			}
+		)
 		details = get_item_details(args)
 
 		self.assertTrue(details)
@@ -455,8 +480,12 @@
 	def test_pricing_rule_for_condition(self):
 		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
 
-		make_pricing_rule(selling=1, margin_type="Percentage", \
-			condition="customer=='_Test Customer 1' and is_return==0", discount_percentage=10)
+		make_pricing_rule(
+			selling=1,
+			margin_type="Percentage",
+			condition="customer=='_Test Customer 1' and is_return==0",
+			discount_percentage=10,
+		)
 
 		# Incorrect Customer and Correct is_return value
 		si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 2", is_return=0)
@@ -480,10 +509,20 @@
 		self.assertEqual(item.rate, 900)
 
 	def test_multiple_pricing_rules(self):
-		make_pricing_rule(discount_percentage=20, selling=1, priority=1, apply_multiple_pricing_rules=1,
-			title="_Test Pricing Rule 1")
-		make_pricing_rule(discount_percentage=10, selling=1, title="_Test Pricing Rule 2", priority=2,
-			apply_multiple_pricing_rules=1)
+		make_pricing_rule(
+			discount_percentage=20,
+			selling=1,
+			priority=1,
+			apply_multiple_pricing_rules=1,
+			title="_Test Pricing Rule 1",
+		)
+		make_pricing_rule(
+			discount_percentage=10,
+			selling=1,
+			title="_Test Pricing Rule 2",
+			priority=2,
+			apply_multiple_pricing_rules=1,
+		)
 		si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 1", qty=1)
 		self.assertEqual(si.items[0].discount_percentage, 30)
 		si.delete()
@@ -494,10 +533,21 @@
 	def test_multiple_pricing_rules_with_apply_discount_on_discounted_rate(self):
 		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
 
-		make_pricing_rule(discount_percentage=20, selling=1, priority=1, apply_multiple_pricing_rules=1,
-			title="_Test Pricing Rule 1")
-		make_pricing_rule(discount_percentage=10, selling=1, priority=2,
-			apply_discount_on_rate=1, title="_Test Pricing Rule 2", apply_multiple_pricing_rules=1)
+		make_pricing_rule(
+			discount_percentage=20,
+			selling=1,
+			priority=1,
+			apply_multiple_pricing_rules=1,
+			title="_Test Pricing Rule 1",
+		)
+		make_pricing_rule(
+			discount_percentage=10,
+			selling=1,
+			priority=2,
+			apply_discount_on_rate=1,
+			title="_Test Pricing Rule 2",
+			apply_multiple_pricing_rules=1,
+		)
 
 		si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 1", qty=1)
 		self.assertEqual(si.items[0].discount_percentage, 28)
@@ -514,16 +564,18 @@
 			"doctype": "Pricing Rule",
 			"title": "_Test Water Flask Rule",
 			"apply_on": "Item Code",
-			"items": [{
-				"item_code": "Water Flask",
-			}],
+			"items": [
+				{
+					"item_code": "Water Flask",
+				}
+			],
 			"selling": 1,
 			"currency": "INR",
 			"rate_or_discount": "Rate",
 			"rate": 0,
 			"margin_type": "Percentage",
 			"margin_rate_or_amount": 2,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		rule = frappe.get_doc(pricing_rule_record)
 		rule.insert()
@@ -550,9 +602,11 @@
 			"doctype": "Pricing Rule",
 			"title": "_Test Sanitizer Rule",
 			"apply_on": "Item Code",
-			"items": [{
-				"item_code": "Test Sanitizer Item",
-			}],
+			"items": [
+				{
+					"item_code": "Test Sanitizer Item",
+				}
+			],
 			"selling": 1,
 			"currency": "INR",
 			"rate_or_discount": "Rate",
@@ -560,63 +614,73 @@
 			"priority": 2,
 			"margin_type": "Percentage",
 			"margin_rate_or_amount": 0.0,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 
 		rule = frappe.get_doc(pricing_rule_record)
-		rule.rate_or_discount = 'Rate'
+		rule.rate_or_discount = "Rate"
 		rule.rate = 100.0
 		rule.insert()
 
 		rule1 = frappe.get_doc(pricing_rule_record)
-		rule1.currency = 'USD'
-		rule1.rate_or_discount = 'Rate'
+		rule1.currency = "USD"
+		rule1.rate_or_discount = "Rate"
 		rule1.rate = 2.0
 		rule1.priority = 1
 		rule1.insert()
 
-		args = frappe._dict({
-			"item_code": "Test Sanitizer Item",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "USD",
-			"doctype": "Sales Invoice",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"name": None,
-			"transaction_date": frappe.utils.nowdate()
-		})
+		args = frappe._dict(
+			{
+				"item_code": "Test Sanitizer Item",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "USD",
+				"doctype": "Sales Invoice",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"name": None,
+				"transaction_date": frappe.utils.nowdate(),
+			}
+		)
 
 		details = get_item_details(args)
 		self.assertEqual(details.price_list_rate, 2.0)
 
-
-		args = frappe._dict({
-			"item_code": "Test Sanitizer Item",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "INR",
-			"doctype": "Sales Invoice",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"name": None,
-			"transaction_date": frappe.utils.nowdate()
-		})
+		args = frappe._dict(
+			{
+				"item_code": "Test Sanitizer Item",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "INR",
+				"doctype": "Sales Invoice",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"name": None,
+				"transaction_date": frappe.utils.nowdate(),
+			}
+		)
 
 		details = get_item_details(args)
 		self.assertEqual(details.price_list_rate, 100.0)
 
 	def test_pricing_rule_for_transaction(self):
 		make_item("Water Flask 1")
-		frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule')
-		make_pricing_rule(selling=1, min_qty=5, price_or_product_discount="Product",
-			apply_on="Transaction", free_item="Water Flask 1", free_qty=1, free_item_rate=10)
+		frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
+		make_pricing_rule(
+			selling=1,
+			min_qty=5,
+			price_or_product_discount="Product",
+			apply_on="Transaction",
+			free_item="Water Flask 1",
+			free_qty=1,
+			free_item_rate=10,
+		)
 
 		si = create_sales_invoice(qty=5, do_not_submit=True)
 		self.assertEqual(len(si.items), 2)
@@ -637,14 +701,16 @@
 			"title": "_Test Water Flask Rule",
 			"apply_on": "Item Code",
 			"price_or_product_discount": "Price",
-			"items": [{
-				"item_code": "Water Flask",
-			}],
+			"items": [
+				{
+					"item_code": "Water Flask",
+				}
+			],
 			"selling": 1,
 			"currency": "INR",
 			"rate_or_discount": "Discount Percentage",
 			"discount_percentage": 20,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 		rule = frappe.get_doc(pricing_rule_record)
 		rule.insert()
@@ -669,10 +735,22 @@
 		item.delete()
 
 	def test_multiple_pricing_rules_with_min_qty(self):
-		make_pricing_rule(discount_percentage=20, selling=1, priority=1, min_qty=4,
-			apply_multiple_pricing_rules=1, title="_Test Pricing Rule with Min Qty - 1")
-		make_pricing_rule(discount_percentage=10, selling=1, priority=2, min_qty=4,
-			apply_multiple_pricing_rules=1, title="_Test Pricing Rule with Min Qty - 2")
+		make_pricing_rule(
+			discount_percentage=20,
+			selling=1,
+			priority=1,
+			min_qty=4,
+			apply_multiple_pricing_rules=1,
+			title="_Test Pricing Rule with Min Qty - 1",
+		)
+		make_pricing_rule(
+			discount_percentage=10,
+			selling=1,
+			priority=2,
+			min_qty=4,
+			apply_multiple_pricing_rules=1,
+			title="_Test Pricing Rule with Min Qty - 2",
+		)
 
 		si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 1", qty=1, currency="USD")
 		item = si.items[0]
@@ -691,73 +769,86 @@
 
 test_dependencies = ["Campaign"]
 
+
 def make_pricing_rule(**args):
 	args = frappe._dict(args)
 
-	doc = frappe.get_doc({
-		"doctype": "Pricing Rule",
-		"title": args.title or "_Test Pricing Rule",
-		"company": args.company or "_Test Company",
-		"apply_on": args.apply_on or "Item Code",
-		"applicable_for": args.applicable_for,
-		"selling": args.selling or 0,
-		"currency": "USD",
-		"apply_discount_on_rate": args.apply_discount_on_rate or 0,
-		"buying": args.buying or 0,
-		"min_qty": args.min_qty or 0.0,
-		"max_qty": args.max_qty or 0.0,
-		"rate_or_discount": args.rate_or_discount or "Discount Percentage",
-		"discount_percentage": args.discount_percentage or 0.0,
-		"rate": args.rate or 0.0,
-		"margin_rate_or_amount": args.margin_rate_or_amount or 0.0,
-		"condition": args.condition or '',
-		"priority": args.priority or 1,
-		"discount_amount": args.discount_amount or 0.0,
-		"apply_multiple_pricing_rules": args.apply_multiple_pricing_rules or 0
-	})
+	doc = frappe.get_doc(
+		{
+			"doctype": "Pricing Rule",
+			"title": args.title or "_Test Pricing Rule",
+			"company": args.company or "_Test Company",
+			"apply_on": args.apply_on or "Item Code",
+			"applicable_for": args.applicable_for,
+			"selling": args.selling or 0,
+			"currency": "USD",
+			"apply_discount_on_rate": args.apply_discount_on_rate or 0,
+			"buying": args.buying or 0,
+			"min_qty": args.min_qty or 0.0,
+			"max_qty": args.max_qty or 0.0,
+			"rate_or_discount": args.rate_or_discount or "Discount Percentage",
+			"discount_percentage": args.discount_percentage or 0.0,
+			"rate": args.rate or 0.0,
+			"margin_rate_or_amount": args.margin_rate_or_amount or 0.0,
+			"condition": args.condition or "",
+			"priority": args.priority or 1,
+			"discount_amount": args.discount_amount or 0.0,
+			"apply_multiple_pricing_rules": args.apply_multiple_pricing_rules or 0,
+		}
+	)
 
-	for field in ["free_item", "free_qty", "free_item_rate", "priority",
-		"margin_type", "price_or_product_discount"]:
+	for field in [
+		"free_item",
+		"free_qty",
+		"free_item_rate",
+		"priority",
+		"margin_type",
+		"price_or_product_discount",
+	]:
 		if args.get(field):
 			doc.set(field, args.get(field))
 
-	apply_on = doc.apply_on.replace(' ', '_').lower()
-	child_table = {'Item Code': 'items', 'Item Group': 'item_groups', 'Brand': 'brands'}
+	apply_on = doc.apply_on.replace(" ", "_").lower()
+	child_table = {"Item Code": "items", "Item Group": "item_groups", "Brand": "brands"}
 
 	if doc.apply_on != "Transaction":
-		doc.append(child_table.get(doc.apply_on), {
-			apply_on: args.get(apply_on) or "_Test Item"
-		})
+		doc.append(child_table.get(doc.apply_on), {apply_on: args.get(apply_on) or "_Test Item"})
 
 	doc.insert(ignore_permissions=True)
 	if args.get(apply_on) and apply_on != "item_code":
 		doc.db_set(apply_on, args.get(apply_on))
 
-	applicable_for = doc.applicable_for.replace(' ', '_').lower()
+	applicable_for = doc.applicable_for.replace(" ", "_").lower()
 	if args.get(applicable_for):
 		doc.db_set(applicable_for, args.get(applicable_for))
 
 	return doc
 
+
 def setup_pricing_rule_data():
-	if not frappe.db.exists('Campaign', '_Test Campaign'):
-		frappe.get_doc({
-			'doctype': 'Campaign',
-			'campaign_name': '_Test Campaign',
-			'name': '_Test Campaign'
-		}).insert()
+	if not frappe.db.exists("Campaign", "_Test Campaign"):
+		frappe.get_doc(
+			{"doctype": "Campaign", "campaign_name": "_Test Campaign", "name": "_Test Campaign"}
+		).insert()
+
 
 def delete_existing_pricing_rules():
-	for doctype in ["Pricing Rule", "Pricing Rule Item Code",
-		"Pricing Rule Item Group", "Pricing Rule Brand"]:
+	for doctype in [
+		"Pricing Rule",
+		"Pricing Rule Item Code",
+		"Pricing Rule Item Group",
+		"Pricing Rule Brand",
+	]:
 
 		frappe.db.sql("delete from `tab{0}`".format(doctype))
 
 
 def make_item_price(item, price_list_name, item_price):
-	frappe.get_doc({
-		'doctype': 'Item Price',
-		'price_list': price_list_name,
-		'item_code': item,
-		'price_list_rate': item_price
-	}).insert(ignore_permissions=True, ignore_mandatory=True)
+	frappe.get_doc(
+		{
+			"doctype": "Item Price",
+			"price_list": price_list_name,
+			"item_code": item,
+			"price_list_rate": item_price,
+		}
+	).insert(ignore_permissions=True, ignore_mandatory=True)
diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py
index 7792590..70926cf 100644
--- a/erpnext/accounts/doctype/pricing_rule/utils.py
+++ b/erpnext/accounts/doctype/pricing_rule/utils.py
@@ -16,22 +16,21 @@
 from erpnext.stock.get_item_details import get_conversion_factor
 
 
-class MultiplePricingRuleConflict(frappe.ValidationError): pass
+class MultiplePricingRuleConflict(frappe.ValidationError):
+	pass
 
-apply_on_table = {
-	'Item Code': 'items',
-	'Item Group': 'item_groups',
-	'Brand': 'brands'
-}
+
+apply_on_table = {"Item Code": "items", "Item Group": "item_groups", "Brand": "brands"}
+
 
 def get_pricing_rules(args, doc=None):
 	pricing_rules = []
-	values =  {}
+	values = {}
 
-	if not frappe.db.exists('Pricing Rule', {'disable': 0, args.transaction_type: 1}):
+	if not frappe.db.exists("Pricing Rule", {"disable": 0, args.transaction_type: 1}):
 		return
 
-	for apply_on in ['Item Code', 'Item Group', 'Brand']:
+	for apply_on in ["Item Code", "Item Group", "Brand"]:
 		pricing_rules.extend(_get_pricing_rules(apply_on, args, values))
 		if pricing_rules and not apply_multiple_pricing_rules(pricing_rules):
 			break
@@ -40,7 +39,8 @@
 
 	pricing_rules = filter_pricing_rule_based_on_condition(pricing_rules, doc)
 
-	if not pricing_rules: return []
+	if not pricing_rules:
+		return []
 
 	if apply_multiple_pricing_rules(pricing_rules):
 		pricing_rules = sorted_by_priority(pricing_rules, args, doc)
@@ -56,6 +56,7 @@
 
 	return rules
 
+
 def sorted_by_priority(pricing_rules, args, doc=None):
 	# If more than one pricing rules, then sort by priority
 	pricing_rules_list = []
@@ -64,10 +65,10 @@
 	for pricing_rule in pricing_rules:
 		pricing_rule = filter_pricing_rules(args, pricing_rule, doc)
 		if pricing_rule:
-			if not pricing_rule.get('priority'):
-				pricing_rule['priority'] = 1
+			if not pricing_rule.get("priority"):
+				pricing_rule["priority"] = 1
 
-			if pricing_rule.get('apply_multiple_pricing_rules'):
+			if pricing_rule.get("apply_multiple_pricing_rules"):
 				pricing_rule_dict.setdefault(cint(pricing_rule.get("priority")), []).append(pricing_rule)
 
 	for key in sorted(pricing_rule_dict):
@@ -75,6 +76,7 @@
 
 	return pricing_rules_list
 
+
 def filter_pricing_rule_based_on_condition(pricing_rules, doc=None):
 	filtered_pricing_rules = []
 	if doc:
@@ -92,40 +94,48 @@
 
 	return filtered_pricing_rules
 
+
 def _get_pricing_rules(apply_on, args, values):
 	apply_on_field = frappe.scrub(apply_on)
 
-	if not args.get(apply_on_field): return []
+	if not args.get(apply_on_field):
+		return []
 
-	child_doc = '`tabPricing Rule {0}`'.format(apply_on)
+	child_doc = "`tabPricing Rule {0}`".format(apply_on)
 
 	conditions = item_variant_condition = item_conditions = ""
 	values[apply_on_field] = args.get(apply_on_field)
-	if apply_on_field in ['item_code', 'brand']:
-		item_conditions = "{child_doc}.{apply_on_field}= %({apply_on_field})s".format(child_doc=child_doc,
-			apply_on_field = apply_on_field)
+	if apply_on_field in ["item_code", "brand"]:
+		item_conditions = "{child_doc}.{apply_on_field}= %({apply_on_field})s".format(
+			child_doc=child_doc, apply_on_field=apply_on_field
+		)
 
-		if apply_on_field == 'item_code':
+		if apply_on_field == "item_code":
 			if "variant_of" not in args:
 				args.variant_of = frappe.get_cached_value("Item", args.item_code, "variant_of")
 
 			if args.variant_of:
-				item_variant_condition = ' or {child_doc}.item_code=%(variant_of)s '.format(child_doc=child_doc)
-				values['variant_of'] = args.variant_of
-	elif apply_on_field == 'item_group':
+				item_variant_condition = " or {child_doc}.item_code=%(variant_of)s ".format(
+					child_doc=child_doc
+				)
+				values["variant_of"] = args.variant_of
+	elif apply_on_field == "item_group":
 		item_conditions = _get_tree_conditions(args, "Item Group", child_doc, False)
 
 	conditions += get_other_conditions(conditions, values, args)
-	warehouse_conditions = _get_tree_conditions(args, "Warehouse", '`tabPricing Rule`')
+	warehouse_conditions = _get_tree_conditions(args, "Warehouse", "`tabPricing Rule`")
 	if warehouse_conditions:
 		warehouse_conditions = " and {0}".format(warehouse_conditions)
 
-	if not args.price_list: args.price_list = None
+	if not args.price_list:
+		args.price_list = None
 
 	conditions += " and ifnull(`tabPricing Rule`.for_price_list, '') in (%(price_list)s, '')"
 	values["price_list"] = args.get("price_list")
 
-	pricing_rules = frappe.db.sql("""select `tabPricing Rule`.*,
+	pricing_rules = (
+		frappe.db.sql(
+			"""select `tabPricing Rule`.*,
 			{child_doc}.{apply_on_field}, {child_doc}.uom
 		from `tabPricing Rule`, {child_doc}
 		where ({item_conditions} or (`tabPricing Rule`.apply_rule_on_other is not null
@@ -135,25 +145,35 @@
 			`tabPricing Rule`.{transaction_type} = 1 {warehouse_cond} {conditions}
 		order by `tabPricing Rule`.priority desc,
 			`tabPricing Rule`.name desc""".format(
-			child_doc = child_doc,
-			apply_on_field = apply_on_field,
-			item_conditions = item_conditions,
-			item_variant_condition = item_variant_condition,
-			transaction_type = args.transaction_type,
-			warehouse_cond = warehouse_conditions,
-			apply_on_other_field = "other_{0}".format(apply_on_field),
-			conditions = conditions), values, as_dict=1) or []
+				child_doc=child_doc,
+				apply_on_field=apply_on_field,
+				item_conditions=item_conditions,
+				item_variant_condition=item_variant_condition,
+				transaction_type=args.transaction_type,
+				warehouse_cond=warehouse_conditions,
+				apply_on_other_field="other_{0}".format(apply_on_field),
+				conditions=conditions,
+			),
+			values,
+			as_dict=1,
+		)
+		or []
+	)
 
 	return pricing_rules
 
-def apply_multiple_pricing_rules(pricing_rules):
-	apply_multiple_rule = [d.apply_multiple_pricing_rules
-		for d in pricing_rules if d.apply_multiple_pricing_rules]
 
-	if not apply_multiple_rule: return False
+def apply_multiple_pricing_rules(pricing_rules):
+	apply_multiple_rule = [
+		d.apply_multiple_pricing_rules for d in pricing_rules if d.apply_multiple_pricing_rules
+	]
+
+	if not apply_multiple_rule:
+		return False
 
 	return True
 
+
 def _get_tree_conditions(args, parenttype, table, allow_blank=True):
 	field = frappe.scrub(parenttype)
 	condition = ""
@@ -169,28 +189,37 @@
 		except TypeError:
 			frappe.throw(_("Invalid {0}").format(args.get(field)))
 
-		parent_groups = frappe.db.sql_list("""select name from `tab%s`
-			where lft<=%s and rgt>=%s""" % (parenttype, '%s', '%s'), (lft, rgt))
+		parent_groups = frappe.db.sql_list(
+			"""select name from `tab%s`
+			where lft<=%s and rgt>=%s"""
+			% (parenttype, "%s", "%s"),
+			(lft, rgt),
+		)
 
 		if parenttype in ["Customer Group", "Item Group", "Territory"]:
 			parent_field = "parent_{0}".format(frappe.scrub(parenttype))
-			root_name = frappe.db.get_list(parenttype,
-				{"is_group": 1, parent_field: ("is", "not set")}, "name", as_list=1, ignore_permissions=True)
+			root_name = frappe.db.get_list(
+				parenttype,
+				{"is_group": 1, parent_field: ("is", "not set")},
+				"name",
+				as_list=1,
+				ignore_permissions=True,
+			)
 
 			if root_name and root_name[0][0]:
 				parent_groups.append(root_name[0][0])
 
 		if parent_groups:
-			if allow_blank: parent_groups.append('')
+			if allow_blank:
+				parent_groups.append("")
 			condition = "ifnull({table}.{field}, '') in ({parent_groups})".format(
-				table=table,
-				field=field,
-				parent_groups=", ".join(frappe.db.escape(d) for d in parent_groups)
+				table=table, field=field, parent_groups=", ".join(frappe.db.escape(d) for d in parent_groups)
 			)
 
 			frappe.flags.tree_conditions[key] = condition
 	return condition
 
+
 def get_other_conditions(conditions, values, args):
 	for field in ["company", "customer", "supplier", "campaign", "sales_partner"]:
 		if args.get(field):
@@ -200,17 +229,18 @@
 			conditions += " and ifnull(`tabPricing Rule`.{0}, '') = ''".format(field)
 
 	for parenttype in ["Customer Group", "Territory", "Supplier Group"]:
-		group_condition = _get_tree_conditions(args, parenttype, '`tabPricing Rule`')
+		group_condition = _get_tree_conditions(args, parenttype, "`tabPricing Rule`")
 		if group_condition:
 			conditions += " and " + group_condition
 
 	if args.get("transaction_date"):
 		conditions += """ and %(transaction_date)s between ifnull(`tabPricing Rule`.valid_from, '2000-01-01')
 			and ifnull(`tabPricing Rule`.valid_upto, '2500-12-31')"""
-		values['transaction_date'] = args.get('transaction_date')
+		values["transaction_date"] = args.get("transaction_date")
 
 	return conditions
 
+
 def filter_pricing_rules(args, pricing_rules, doc=None):
 	if not isinstance(pricing_rules, list):
 		pricing_rules = [pricing_rules]
@@ -219,15 +249,16 @@
 
 	# filter for qty
 	if pricing_rules:
-		stock_qty = flt(args.get('stock_qty'))
-		amount = flt(args.get('price_list_rate')) * flt(args.get('qty'))
+		stock_qty = flt(args.get("stock_qty"))
+		amount = flt(args.get("price_list_rate")) * flt(args.get("qty"))
 
 		if pricing_rules[0].apply_rule_on_other:
 			field = frappe.scrub(pricing_rules[0].apply_rule_on_other)
 
-			if (field and pricing_rules[0].get('other_' + field) != args.get(field)): return
+			if field and pricing_rules[0].get("other_" + field) != args.get(field):
+				return
 
-		pr_doc = frappe.get_cached_doc('Pricing Rule', pricing_rules[0].name)
+		pr_doc = frappe.get_cached_doc("Pricing Rule", pricing_rules[0].name)
 
 		if pricing_rules[0].mixed_conditions and doc:
 			stock_qty, amount, items = get_qty_and_rate_for_mixed_conditions(doc, pr_doc, args)
@@ -235,7 +266,7 @@
 				pricing_rule_args.apply_rule_on_other_items = items
 
 		elif pricing_rules[0].is_cumulative:
-			items = [args.get(frappe.scrub(pr_doc.get('apply_on')))]
+			items = [args.get(frappe.scrub(pr_doc.get("apply_on")))]
 			data = get_qty_amount_data_for_cumulative(pr_doc, args, items)
 
 			if data:
@@ -249,13 +280,15 @@
 
 		if not pricing_rules:
 			for d in original_pricing_rule:
-				if not d.threshold_percentage: continue
+				if not d.threshold_percentage:
+					continue
 
-				msg = validate_quantity_and_amount_for_suggestion(d, stock_qty,
-					amount, args.get('item_code'), args.get('transaction_type'))
+				msg = validate_quantity_and_amount_for_suggestion(
+					d, stock_qty, amount, args.get("item_code"), args.get("transaction_type")
+				)
 
 				if msg:
-					return {'suggestion': msg, 'item_code': args.get('item_code')}
+					return {"suggestion": msg, "item_code": args.get("item_code")}
 
 		# add variant_of property in pricing rule
 		for p in pricing_rules:
@@ -265,7 +298,7 @@
 				p.variant_of = None
 
 	if len(pricing_rules) > 1:
-		filtered_rules = list(filter(lambda x: x.currency==args.get('currency'), pricing_rules))
+		filtered_rules = list(filter(lambda x: x.currency == args.get("currency"), pricing_rules))
 		if filtered_rules:
 			pricing_rules = filtered_rules
 
@@ -273,7 +306,7 @@
 	if pricing_rules:
 		max_priority = max(cint(p.priority) for p in pricing_rules)
 		if max_priority:
-			pricing_rules = list(filter(lambda x: cint(x.priority)==max_priority, pricing_rules))
+			pricing_rules = list(filter(lambda x: cint(x.priority) == max_priority, pricing_rules))
 
 	if pricing_rules and not isinstance(pricing_rules, list):
 		pricing_rules = list(pricing_rules)
@@ -281,42 +314,61 @@
 	if len(pricing_rules) > 1:
 		rate_or_discount = list(set(d.rate_or_discount for d in pricing_rules))
 		if len(rate_or_discount) == 1 and rate_or_discount[0] == "Discount Percentage":
-			pricing_rules = list(filter(lambda x: x.for_price_list==args.price_list, pricing_rules)) \
-				or pricing_rules
+			pricing_rules = (
+				list(filter(lambda x: x.for_price_list == args.price_list, pricing_rules)) or pricing_rules
+			)
 
 	if len(pricing_rules) > 1 and not args.for_shopping_cart:
-		frappe.throw(_("Multiple Price Rules exists with same criteria, please resolve conflict by assigning priority. Price Rules: {0}")
-			.format("\n".join(d.name for d in pricing_rules)), MultiplePricingRuleConflict)
+		frappe.throw(
+			_(
+				"Multiple Price Rules exists with same criteria, please resolve conflict by assigning priority. Price Rules: {0}"
+			).format("\n".join(d.name for d in pricing_rules)),
+			MultiplePricingRuleConflict,
+		)
 	elif pricing_rules:
 		return pricing_rules[0]
 
-def validate_quantity_and_amount_for_suggestion(args, qty, amount, item_code, transaction_type):
-	fieldname, msg = '', ''
-	type_of_transaction = 'purchase' if transaction_type == 'buying' else 'sale'
 
-	for field, value in {'min_qty': qty, 'min_amt': amount}.items():
-		if (args.get(field) and value < args.get(field)
-			and (args.get(field) - cint(args.get(field) * args.threshold_percentage * 0.01)) <= value):
+def validate_quantity_and_amount_for_suggestion(args, qty, amount, item_code, transaction_type):
+	fieldname, msg = "", ""
+	type_of_transaction = "purchase" if transaction_type == "buying" else "sale"
+
+	for field, value in {"min_qty": qty, "min_amt": amount}.items():
+		if (
+			args.get(field)
+			and value < args.get(field)
+			and (args.get(field) - cint(args.get(field) * args.threshold_percentage * 0.01)) <= value
+		):
 			fieldname = field
 
-	for field, value in {'max_qty': qty, 'max_amt': amount}.items():
-		if (args.get(field) and value > args.get(field)
-			and (args.get(field) + cint(args.get(field) * args.threshold_percentage * 0.01)) >= value):
+	for field, value in {"max_qty": qty, "max_amt": amount}.items():
+		if (
+			args.get(field)
+			and value > args.get(field)
+			and (args.get(field) + cint(args.get(field) * args.threshold_percentage * 0.01)) >= value
+		):
 			fieldname = field
 
 	if fieldname:
-		msg = (_("If you {0} {1} quantities of the item {2}, the scheme {3} will be applied on the item.")
-			.format(type_of_transaction, args.get(fieldname), bold(item_code), bold(args.rule_description)))
+		msg = _(
+			"If you {0} {1} quantities of the item {2}, the scheme {3} will be applied on the item."
+		).format(
+			type_of_transaction, args.get(fieldname), bold(item_code), bold(args.rule_description)
+		)
 
-		if fieldname in ['min_amt', 'max_amt']:
-			msg = (_("If you {0} {1} worth item {2}, the scheme {3} will be applied on the item.")
-				.format(type_of_transaction, fmt_money(args.get(fieldname), currency=args.get("currency")),
-					bold(item_code), bold(args.rule_description)))
+		if fieldname in ["min_amt", "max_amt"]:
+			msg = _("If you {0} {1} worth item {2}, the scheme {3} will be applied on the item.").format(
+				type_of_transaction,
+				fmt_money(args.get(fieldname), currency=args.get("currency")),
+				bold(item_code),
+				bold(args.rule_description),
+			)
 
 		frappe.msgprint(msg)
 
 	return msg
 
+
 def filter_pricing_rules_for_qty_amount(qty, rate, pricing_rules, args=None):
 	rules = []
 
@@ -327,16 +379,19 @@
 		if rule.get("uom"):
 			conversion_factor = get_conversion_factor(rule.item_code, rule.uom).get("conversion_factor", 1)
 
-		if (flt(qty) >= (flt(rule.min_qty) * conversion_factor)
-			and (flt(qty)<= (rule.max_qty * conversion_factor) if rule.max_qty else True)):
+		if flt(qty) >= (flt(rule.min_qty) * conversion_factor) and (
+			flt(qty) <= (rule.max_qty * conversion_factor) if rule.max_qty else True
+		):
 			status = True
 
 		# if user has created item price against the transaction UOM
 		if args and rule.get("uom") == args.get("uom"):
 			conversion_factor = 1.0
 
-		if status and (flt(rate) >= (flt(rule.min_amt) * conversion_factor)
-			and (flt(rate)<= (rule.max_amt * conversion_factor) if rule.max_amt else True)):
+		if status and (
+			flt(rate) >= (flt(rule.min_amt) * conversion_factor)
+			and (flt(rate) <= (rule.max_amt * conversion_factor) if rule.max_amt else True)
+		):
 			status = True
 		else:
 			status = False
@@ -346,6 +401,7 @@
 
 	return rules
 
+
 def if_all_rules_same(pricing_rules, fields):
 	all_rules_same = True
 	val = [pricing_rules[0].get(k) for k in fields]
@@ -356,30 +412,34 @@
 
 	return all_rules_same
 
+
 def apply_internal_priority(pricing_rules, field_set, args):
 	filtered_rules = []
 	for field in field_set:
 		if args.get(field):
 			# filter function always returns a filter object even if empty
 			# list conversion is necessary to check for an empty result
-			filtered_rules = list(filter(lambda x: x.get(field)==args.get(field), pricing_rules))
-			if filtered_rules: break
+			filtered_rules = list(filter(lambda x: x.get(field) == args.get(field), pricing_rules))
+			if filtered_rules:
+				break
 
 	return filtered_rules or pricing_rules
 
+
 def get_qty_and_rate_for_mixed_conditions(doc, pr_doc, args):
 	sum_qty, sum_amt = [0, 0]
 	items = get_pricing_rule_items(pr_doc) or []
-	apply_on = frappe.scrub(pr_doc.get('apply_on'))
+	apply_on = frappe.scrub(pr_doc.get("apply_on"))
 
 	if items and doc.get("items"):
-		for row in doc.get('items'):
-			if (row.get(apply_on) or args.get(apply_on)) not in items: continue
+		for row in doc.get("items"):
+			if (row.get(apply_on) or args.get(apply_on)) not in items:
+				continue
 
 			if pr_doc.mixed_conditions:
-				amt = args.get('qty') * args.get("price_list_rate")
+				amt = args.get("qty") * args.get("price_list_rate")
 				if args.get("item_code") != row.get("item_code"):
-					amt = flt(row.get('qty')) * flt(row.get("price_list_rate") or args.get("rate"))
+					amt = flt(row.get("qty")) * flt(row.get("price_list_rate") or args.get("rate"))
 
 				sum_qty += flt(row.get("stock_qty")) or flt(args.get("stock_qty")) or flt(args.get("qty"))
 				sum_amt += amt
@@ -393,28 +453,33 @@
 
 	return sum_qty, sum_amt, items
 
+
 def get_qty_and_rate_for_other_item(doc, pr_doc, pricing_rules):
 	items = get_pricing_rule_items(pr_doc)
 
 	for row in doc.items:
 		if row.get(frappe.scrub(pr_doc.apply_rule_on_other)) in items:
-			pricing_rules = filter_pricing_rules_for_qty_amount(row.get("stock_qty"),
-				row.get("amount"), pricing_rules, row)
+			pricing_rules = filter_pricing_rules_for_qty_amount(
+				row.get("stock_qty"), row.get("amount"), pricing_rules, row
+			)
 
 			if pricing_rules and pricing_rules[0]:
 				pricing_rules[0].apply_rule_on_other_items = items
 				return pricing_rules
 
+
 def get_qty_amount_data_for_cumulative(pr_doc, doc, items=None):
 	if items is None:
 		items = []
 	sum_qty, sum_amt = [0, 0]
-	doctype = doc.get('parenttype') or doc.doctype
+	doctype = doc.get("parenttype") or doc.doctype
 
-	date_field = 'transaction_date' if frappe.get_meta(doctype).has_field('transaction_date') else 'posting_date'
+	date_field = (
+		"transaction_date" if frappe.get_meta(doctype).has_field("transaction_date") else "posting_date"
+	)
 
-	child_doctype = '{0} Item'.format(doctype)
-	apply_on = frappe.scrub(pr_doc.get('apply_on'))
+	child_doctype = "{0} Item".format(doctype)
+	apply_on = frappe.scrub(pr_doc.get("apply_on"))
 
 	values = [pr_doc.valid_from, pr_doc.valid_upto]
 	condition = ""
@@ -423,72 +488,86 @@
 		warehouses = get_child_warehouses(pr_doc.warehouse)
 
 		condition += """ and `tab{child_doc}`.warehouse in ({warehouses})
-			""".format(child_doc=child_doctype, warehouses = ','.join(['%s'] * len(warehouses)))
+			""".format(
+			child_doc=child_doctype, warehouses=",".join(["%s"] * len(warehouses))
+		)
 
 		values.extend(warehouses)
 
 	if items:
-		condition = " and `tab{child_doc}`.{apply_on} in ({items})".format(child_doc = child_doctype,
-			apply_on = apply_on, items = ','.join(['%s'] * len(items)))
+		condition = " and `tab{child_doc}`.{apply_on} in ({items})".format(
+			child_doc=child_doctype, apply_on=apply_on, items=",".join(["%s"] * len(items))
+		)
 
 		values.extend(items)
 
-	data_set = frappe.db.sql(""" SELECT `tab{child_doc}`.stock_qty,
+	data_set = frappe.db.sql(
+		""" SELECT `tab{child_doc}`.stock_qty,
 			`tab{child_doc}`.amount
 		FROM `tab{child_doc}`, `tab{parent_doc}`
 		WHERE
 			`tab{child_doc}`.parent = `tab{parent_doc}`.name and `tab{parent_doc}`.{date_field}
 			between %s and %s and `tab{parent_doc}`.docstatus = 1
 			{condition} group by `tab{child_doc}`.name
-	""".format(parent_doc = doctype,
-		child_doc = child_doctype,
-		condition = condition,
-		date_field = date_field
-	), tuple(values), as_dict=1)
+	""".format(
+			parent_doc=doctype, child_doc=child_doctype, condition=condition, date_field=date_field
+		),
+		tuple(values),
+		as_dict=1,
+	)
 
 	for data in data_set:
-		sum_qty += data.get('stock_qty')
-		sum_amt += data.get('amount')
+		sum_qty += data.get("stock_qty")
+		sum_amt += data.get("amount")
 
 	return [sum_qty, sum_amt]
 
+
 def apply_pricing_rule_on_transaction(doc):
 	conditions = "apply_on = 'Transaction'"
 
 	values = {}
 	conditions = get_other_conditions(conditions, values, doc)
 
-	pricing_rules = frappe.db.sql(""" Select `tabPricing Rule`.* from `tabPricing Rule`
+	pricing_rules = frappe.db.sql(
+		""" Select `tabPricing Rule`.* from `tabPricing Rule`
 		where  {conditions} and `tabPricing Rule`.disable = 0
-	""".format(conditions = conditions), values, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		values,
+		as_dict=1,
+	)
 
 	if pricing_rules:
-		pricing_rules = filter_pricing_rules_for_qty_amount(doc.total_qty,
-			doc.total, pricing_rules)
+		pricing_rules = filter_pricing_rules_for_qty_amount(doc.total_qty, doc.total, pricing_rules)
 
 		if not pricing_rules:
 			remove_free_item(doc)
 
 		for d in pricing_rules:
-			if d.price_or_product_discount == 'Price':
+			if d.price_or_product_discount == "Price":
 				if d.apply_discount_on:
-					doc.set('apply_discount_on', d.apply_discount_on)
+					doc.set("apply_discount_on", d.apply_discount_on)
 
-				for field in ['additional_discount_percentage', 'discount_amount']:
-					pr_field = ('discount_percentage'
-						if field == 'additional_discount_percentage' else field)
+				for field in ["additional_discount_percentage", "discount_amount"]:
+					pr_field = "discount_percentage" if field == "additional_discount_percentage" else field
 
-					if not d.get(pr_field): continue
+					if not d.get(pr_field):
+						continue
 
-					if d.validate_applied_rule and doc.get(field) is not None and doc.get(field) < d.get(pr_field):
-						frappe.msgprint(_("User has not applied rule on the invoice {0}")
-							.format(doc.name))
+					if (
+						d.validate_applied_rule and doc.get(field) is not None and doc.get(field) < d.get(pr_field)
+					):
+						frappe.msgprint(_("User has not applied rule on the invoice {0}").format(doc.name))
 					else:
 						if not d.coupon_code_based:
 							doc.set(field, d.get(pr_field))
-						elif doc.get('coupon_code'):
+						elif doc.get("coupon_code"):
 							# coupon code based pricing rule
-							coupon_code_pricing_rule = frappe.db.get_value('Coupon Code', doc.get('coupon_code'), 'pricing_rule')
+							coupon_code_pricing_rule = frappe.db.get_value(
+								"Coupon Code", doc.get("coupon_code"), "pricing_rule"
+							)
 							if coupon_code_pricing_rule == d.name:
 								# if selected coupon code is linked with pricing rule
 								doc.set(field, d.get(pr_field))
@@ -500,83 +579,93 @@
 							doc.set(field, 0)
 
 				doc.calculate_taxes_and_totals()
-			elif d.price_or_product_discount == 'Product':
-				item_details = frappe._dict({'parenttype': doc.doctype, 'free_item_data': []})
+			elif d.price_or_product_discount == "Product":
+				item_details = frappe._dict({"parenttype": doc.doctype, "free_item_data": []})
 				get_product_discount_rule(d, item_details, doc=doc)
 				apply_pricing_rule_for_free_items(doc, item_details.free_item_data)
 				doc.set_missing_values()
 				doc.calculate_taxes_and_totals()
 
+
 def remove_free_item(doc):
 	for d in doc.items:
 		if d.is_free_item:
 			doc.remove(d)
 
+
 def get_applied_pricing_rules(pricing_rules):
 	if pricing_rules:
-		if pricing_rules.startswith('['):
+		if pricing_rules.startswith("["):
 			return json.loads(pricing_rules)
 		else:
-			return pricing_rules.split(',')
+			return pricing_rules.split(",")
 
 	return []
 
+
 def get_product_discount_rule(pricing_rule, item_details, args=None, doc=None):
 	free_item = pricing_rule.free_item
-	if pricing_rule.same_item and pricing_rule.get("apply_on") != 'Transaction':
+	if pricing_rule.same_item and pricing_rule.get("apply_on") != "Transaction":
 		free_item = item_details.item_code or args.item_code
 
 	if not free_item:
-		frappe.throw(_("Free item not set in the pricing rule {0}")
-			.format(get_link_to_form("Pricing Rule", pricing_rule.name)))
+		frappe.throw(
+			_("Free item not set in the pricing rule {0}").format(
+				get_link_to_form("Pricing Rule", pricing_rule.name)
+			)
+		)
 
 	qty = pricing_rule.free_qty or 1
 	if pricing_rule.is_recursive:
-		transaction_qty = args.get('qty') if args else doc.total_qty
+		transaction_qty = args.get("qty") if args else doc.total_qty
 		if transaction_qty:
 			qty = flt(transaction_qty) * qty
 
 	free_item_data_args = {
-		'item_code': free_item,
-		'qty': qty,
-		'pricing_rules': pricing_rule.name,
-		'rate': pricing_rule.free_item_rate or 0,
-		'price_list_rate': pricing_rule.free_item_rate or 0,
-		'is_free_item': 1
+		"item_code": free_item,
+		"qty": qty,
+		"pricing_rules": pricing_rule.name,
+		"rate": pricing_rule.free_item_rate or 0,
+		"price_list_rate": pricing_rule.free_item_rate or 0,
+		"is_free_item": 1,
 	}
 
-	item_data = frappe.get_cached_value('Item', free_item, ['item_name',
-		'description', 'stock_uom'], as_dict=1)
+	item_data = frappe.get_cached_value(
+		"Item", free_item, ["item_name", "description", "stock_uom"], as_dict=1
+	)
 
 	free_item_data_args.update(item_data)
-	free_item_data_args['uom'] = pricing_rule.free_item_uom or item_data.stock_uom
-	free_item_data_args['conversion_factor'] = get_conversion_factor(free_item,
-		free_item_data_args['uom']).get("conversion_factor", 1)
+	free_item_data_args["uom"] = pricing_rule.free_item_uom or item_data.stock_uom
+	free_item_data_args["conversion_factor"] = get_conversion_factor(
+		free_item, free_item_data_args["uom"]
+	).get("conversion_factor", 1)
 
-	if item_details.get("parenttype") == 'Purchase Order':
-		free_item_data_args['schedule_date'] = doc.schedule_date if doc else today()
+	if item_details.get("parenttype") == "Purchase Order":
+		free_item_data_args["schedule_date"] = doc.schedule_date if doc else today()
 
-	if item_details.get("parenttype") == 'Sales Order':
-		free_item_data_args['delivery_date'] = doc.delivery_date if doc else today()
+	if item_details.get("parenttype") == "Sales Order":
+		free_item_data_args["delivery_date"] = doc.delivery_date if doc else today()
 
 	item_details.free_item_data.append(free_item_data_args)
 
+
 def apply_pricing_rule_for_free_items(doc, pricing_rule_args, set_missing_values=False):
 	if pricing_rule_args:
 		items = tuple((d.item_code, d.pricing_rules) for d in doc.items if d.is_free_item)
 
 		for args in pricing_rule_args:
-			if not items or (args.get('item_code'), args.get('pricing_rules')) not in items:
-				doc.append('items', args)
+			if not items or (args.get("item_code"), args.get("pricing_rules")) not in items:
+				doc.append("items", args)
+
 
 def get_pricing_rule_items(pr_doc):
 	apply_on_data = []
-	apply_on = frappe.scrub(pr_doc.get('apply_on'))
+	apply_on = frappe.scrub(pr_doc.get("apply_on"))
 
-	pricing_rule_apply_on = apply_on_table.get(pr_doc.get('apply_on'))
+	pricing_rule_apply_on = apply_on_table.get(pr_doc.get("apply_on"))
 
 	for d in pr_doc.get(pricing_rule_apply_on):
-		if apply_on == 'item_group':
+		if apply_on == "item_group":
 			apply_on_data.extend(get_child_item_groups(d.get(apply_on)))
 		else:
 			apply_on_data.append(d.get(apply_on))
@@ -587,6 +676,7 @@
 
 	return list(set(apply_on_data))
 
+
 def validate_coupon_code(coupon_name):
 	coupon = frappe.get_doc("Coupon Code", coupon_name)
 
@@ -599,16 +689,21 @@
 	elif coupon.used >= coupon.maximum_use:
 		frappe.throw(_("Sorry, this coupon code is no longer valid"))
 
-def update_coupon_code_count(coupon_name,transaction_type):
-	coupon=frappe.get_doc("Coupon Code",coupon_name)
+
+def update_coupon_code_count(coupon_name, transaction_type):
+	coupon = frappe.get_doc("Coupon Code", coupon_name)
 	if coupon:
-		if transaction_type=='used':
-			if coupon.used<coupon.maximum_use:
-				coupon.used=coupon.used+1
+		if transaction_type == "used":
+			if coupon.used < coupon.maximum_use:
+				coupon.used = coupon.used + 1
 				coupon.save(ignore_permissions=True)
 			else:
-				frappe.throw(_("{0} Coupon used are {1}. Allowed quantity is exhausted").format(coupon.coupon_code,coupon.used))
-		elif transaction_type=='cancelled':
-			if coupon.used>0:
-				coupon.used=coupon.used-1
+				frappe.throw(
+					_("{0} Coupon used are {1}. Allowed quantity is exhausted").format(
+						coupon.coupon_code, coupon.used
+					)
+				)
+		elif transaction_type == "cancelled":
+			if coupon.used > 0:
+				coupon.used = coupon.used - 1
 				coupon.save(ignore_permissions=True)
diff --git a/erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.py b/erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.py
index d544f97..08a7f41 100644
--- a/erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.py
+++ b/erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.py
@@ -21,17 +21,17 @@
 
 	def on_submit(self):
 		conditions = build_conditions(self.type, self.account, self.company)
-		if self.type == 'Income':
+		if self.type == "Income":
 			convert_deferred_revenue_to_income(self.name, self.start_date, self.end_date, conditions)
 		else:
 			convert_deferred_expense_to_expense(self.name, self.start_date, self.end_date, conditions)
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ['GL Entry']
-		gl_entries = frappe.get_all('GL Entry', fields = ['*'],
-			filters={
-				'against_voucher_type': self.doctype,
-				'against_voucher': self.name
-			})
+		self.ignore_linked_doctypes = ["GL Entry"]
+		gl_entries = frappe.get_all(
+			"GL Entry",
+			fields=["*"],
+			filters={"against_voucher_type": self.doctype, "against_voucher": self.name},
+		)
 
 		make_reverse_gl_entries(gl_entries=gl_entries)
diff --git a/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py b/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py
index 757d0fa..164ba6a 100644
--- a/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py
+++ b/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py
@@ -15,9 +15,12 @@
 
 class TestProcessDeferredAccounting(unittest.TestCase):
 	def test_creation_of_ledger_entry_on_submit(self):
-		''' test creation of gl entries on submission of document '''
-		deferred_account = create_account(account_name="Deferred Revenue",
-			parent_account="Current Liabilities - _TC", company="_Test Company")
+		"""test creation of gl entries on submission of document"""
+		deferred_account = create_account(
+			account_name="Deferred Revenue",
+			parent_account="Current Liabilities - _TC",
+			company="_Test Company",
+		)
 
 		item = create_item("_Test Item for Deferred Accounting")
 		item.enable_deferred_revenue = 1
@@ -25,7 +28,9 @@
 		item.no_of_months = 12
 		item.save()
 
-		si = create_sales_invoice(item=item.name, update_stock=0, posting_date="2019-01-10", do_not_submit=True)
+		si = create_sales_invoice(
+			item=item.name, update_stock=0, posting_date="2019-01-10", do_not_submit=True
+		)
 		si.items[0].enable_deferred_revenue = 1
 		si.items[0].service_start_date = "2019-01-10"
 		si.items[0].service_end_date = "2019-03-15"
@@ -33,20 +38,22 @@
 		si.save()
 		si.submit()
 
-		process_deferred_accounting = doc = frappe.get_doc(dict(
-			doctype='Process Deferred Accounting',
-			posting_date="2019-01-01",
-			start_date="2019-01-01",
-			end_date="2019-01-31",
-			type="Income"
-		))
+		process_deferred_accounting = doc = frappe.get_doc(
+			dict(
+				doctype="Process Deferred Accounting",
+				posting_date="2019-01-01",
+				start_date="2019-01-01",
+				end_date="2019-01-31",
+				type="Income",
+			)
+		)
 
 		process_deferred_accounting.insert()
 		process_deferred_accounting.submit()
 
 		expected_gle = [
 			[deferred_account, 33.85, 0.0, "2019-01-31"],
-			["Sales - _TC", 0.0, 33.85, "2019-01-31"]
+			["Sales - _TC", 0.0, 33.85, "2019-01-31"],
 		]
 
 		check_gl_entries(self, si.name, expected_gle, "2019-01-10")
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
index 1b34d6d..fea55a3 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
@@ -23,15 +23,15 @@
 class ProcessStatementOfAccounts(Document):
 	def validate(self):
 		if not self.subject:
-			self.subject = 'Statement Of Accounts for {{ customer.name }}'
+			self.subject = "Statement Of Accounts for {{ customer.name }}"
 		if not self.body:
-			self.body = 'Hello {{ customer.name }},<br>PFA your Statement Of Accounts from {{ doc.from_date }} to {{ doc.to_date }}.'
+			self.body = "Hello {{ customer.name }},<br>PFA your Statement Of Accounts from {{ doc.from_date }} to {{ doc.to_date }}."
 
 		validate_template(self.subject)
 		validate_template(self.body)
 
 		if not self.customers:
-			frappe.throw(_('Customers not selected.'))
+			frappe.throw(_("Customers not selected."))
 
 		if self.enable_auto_email:
 			self.to_date = self.start_date
@@ -40,113 +40,148 @@
 
 def get_report_pdf(doc, consolidated=True):
 	statement_dict = {}
-	ageing = ''
+	ageing = ""
 	base_template_path = "frappe/www/printview.html"
-	template_path = "erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html"
+	template_path = (
+		"erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html"
+	)
 
 	for entry in doc.customers:
 		if doc.include_ageing:
-			ageing_filters = frappe._dict({
-				'company': doc.company,
-				'report_date': doc.to_date,
-				'ageing_based_on': doc.ageing_based_on,
-				'range1': 30,
-				'range2': 60,
-				'range3': 90,
-				'range4': 120,
-				'customer': entry.customer
-			})
+			ageing_filters = frappe._dict(
+				{
+					"company": doc.company,
+					"report_date": doc.to_date,
+					"ageing_based_on": doc.ageing_based_on,
+					"range1": 30,
+					"range2": 60,
+					"range3": 90,
+					"range4": 120,
+					"customer": entry.customer,
+				}
+			)
 			col1, ageing = get_ageing(ageing_filters)
 
 			if ageing:
-				ageing[0]['ageing_based_on'] = doc.ageing_based_on
+				ageing[0]["ageing_based_on"] = doc.ageing_based_on
 
-		tax_id = frappe.get_doc('Customer', entry.customer).tax_id
-		presentation_currency = get_party_account_currency('Customer', entry.customer, doc.company) \
-				or doc.currency or get_company_currency(doc.company)
+		tax_id = frappe.get_doc("Customer", entry.customer).tax_id
+		presentation_currency = (
+			get_party_account_currency("Customer", entry.customer, doc.company)
+			or doc.currency
+			or get_company_currency(doc.company)
+		)
 		if doc.letter_head:
 			from frappe.www.printview import get_letter_head
+
 			letter_head = get_letter_head(doc, 0)
 
-		filters= frappe._dict({
-			'from_date': doc.from_date,
-			'to_date': doc.to_date,
-			'company': doc.company,
-			'finance_book': doc.finance_book if doc.finance_book else None,
-			'account': [doc.account] if doc.account else None,
-			'party_type': 'Customer',
-			'party': [entry.customer],
-			'presentation_currency': presentation_currency,
-			'group_by': doc.group_by,
-			'currency': doc.currency,
-			'cost_center': [cc.cost_center_name for cc in doc.cost_center],
-			'project': [p.project_name for p in doc.project],
-			'show_opening_entries': 0,
-			'include_default_book_entries': 0,
-			'tax_id': tax_id if tax_id else None
-		})
+		filters = frappe._dict(
+			{
+				"from_date": doc.from_date,
+				"to_date": doc.to_date,
+				"company": doc.company,
+				"finance_book": doc.finance_book if doc.finance_book else None,
+				"account": [doc.account] if doc.account else None,
+				"party_type": "Customer",
+				"party": [entry.customer],
+				"presentation_currency": presentation_currency,
+				"group_by": doc.group_by,
+				"currency": doc.currency,
+				"cost_center": [cc.cost_center_name for cc in doc.cost_center],
+				"project": [p.project_name for p in doc.project],
+				"show_opening_entries": 0,
+				"include_default_book_entries": 0,
+				"tax_id": tax_id if tax_id else None,
+			}
+		)
 		col, res = get_soa(filters)
 
 		for x in [0, -2, -1]:
-			res[x]['account'] = res[x]['account'].replace("'","")
+			res[x]["account"] = res[x]["account"].replace("'", "")
 
 		if len(res) == 3:
 			continue
 
-		html = frappe.render_template(template_path, \
-			{"filters": filters, "data": res, "ageing": ageing[0] if (doc.include_ageing and ageing) else None,
+		html = frappe.render_template(
+			template_path,
+			{
+				"filters": filters,
+				"data": res,
+				"ageing": ageing[0] if (doc.include_ageing and ageing) else None,
 				"letter_head": letter_head if doc.letter_head else None,
-				"terms_and_conditions": frappe.db.get_value('Terms and Conditions', doc.terms_and_conditions, 'terms')
-					if doc.terms_and_conditions else None})
+				"terms_and_conditions": frappe.db.get_value(
+					"Terms and Conditions", doc.terms_and_conditions, "terms"
+				)
+				if doc.terms_and_conditions
+				else None,
+			},
+		)
 
-		html = frappe.render_template(base_template_path, {"body": html, \
-			"css": get_print_style(), "title": "Statement For " + entry.customer})
+		html = frappe.render_template(
+			base_template_path,
+			{"body": html, "css": get_print_style(), "title": "Statement For " + entry.customer},
+		)
 		statement_dict[entry.customer] = html
 
 	if not bool(statement_dict):
 		return False
 	elif consolidated:
-		result = ''.join(list(statement_dict.values()))
-		return get_pdf(result, {'orientation': doc.orientation})
+		result = "".join(list(statement_dict.values()))
+		return get_pdf(result, {"orientation": doc.orientation})
 	else:
 		for customer, statement_html in statement_dict.items():
-			statement_dict[customer]=get_pdf(statement_html, {'orientation': doc.orientation})
+			statement_dict[customer] = get_pdf(statement_html, {"orientation": doc.orientation})
 		return statement_dict
 
+
 def get_customers_based_on_territory_or_customer_group(customer_collection, collection_name):
 	fields_dict = {
-		'Customer Group': 'customer_group',
-		'Territory': 'territory',
+		"Customer Group": "customer_group",
+		"Territory": "territory",
 	}
 	collection = frappe.get_doc(customer_collection, collection_name)
-	selected = [customer.name for customer in frappe.get_list(customer_collection, filters=[
-			['lft', '>=', collection.lft],
-			['rgt', '<=', collection.rgt]
-		],
-		fields=['name'],
-		order_by='lft asc, rgt desc'
-	)]
-	return frappe.get_list('Customer', fields=['name', 'email_id'], \
-		filters=[[fields_dict[customer_collection], 'IN', selected]])
+	selected = [
+		customer.name
+		for customer in frappe.get_list(
+			customer_collection,
+			filters=[["lft", ">=", collection.lft], ["rgt", "<=", collection.rgt]],
+			fields=["name"],
+			order_by="lft asc, rgt desc",
+		)
+	]
+	return frappe.get_list(
+		"Customer",
+		fields=["name", "email_id"],
+		filters=[[fields_dict[customer_collection], "IN", selected]],
+	)
+
 
 def get_customers_based_on_sales_person(sales_person):
-	lft, rgt = frappe.db.get_value("Sales Person",
-		sales_person, ["lft", "rgt"])
-	records = frappe.db.sql("""
+	lft, rgt = frappe.db.get_value("Sales Person", sales_person, ["lft", "rgt"])
+	records = frappe.db.sql(
+		"""
 		select distinct parent, parenttype
 		from `tabSales Team` steam
 		where parenttype = 'Customer'
 			and exists(select name from `tabSales Person` where lft >= %s and rgt <= %s and name = steam.sales_person)
-	""", (lft, rgt), as_dict=1)
+	""",
+		(lft, rgt),
+		as_dict=1,
+	)
 	sales_person_records = frappe._dict()
 	for d in records:
 		sales_person_records.setdefault(d.parenttype, set()).add(d.parent)
-	if sales_person_records.get('Customer'):
-		return frappe.get_list('Customer', fields=['name', 'email_id'], \
-			filters=[['name', 'in', list(sales_person_records['Customer'])]])
+	if sales_person_records.get("Customer"):
+		return frappe.get_list(
+			"Customer",
+			fields=["name", "email_id"],
+			filters=[["name", "in", list(sales_person_records["Customer"])]],
+		)
 	else:
 		return []
 
+
 def get_recipients_and_cc(customer, doc):
 	recipients = []
 	for clist in doc.customers:
@@ -155,65 +190,72 @@
 			if doc.primary_mandatory and clist.primary_email:
 				recipients.append(clist.primary_email)
 	cc = []
-	if doc.cc_to != '':
+	if doc.cc_to != "":
 		try:
-			cc=[frappe.get_value('User', doc.cc_to, 'email')]
+			cc = [frappe.get_value("User", doc.cc_to, "email")]
 		except Exception:
 			pass
 
 	return recipients, cc
 
+
 def get_context(customer, doc):
 	template_doc = copy.deepcopy(doc)
 	del template_doc.customers
 	template_doc.from_date = format_date(template_doc.from_date)
 	template_doc.to_date = format_date(template_doc.to_date)
 	return {
-		'doc': template_doc,
-		'customer': frappe.get_doc('Customer', customer),
-		'frappe': frappe.utils
+		"doc": template_doc,
+		"customer": frappe.get_doc("Customer", customer),
+		"frappe": frappe.utils,
 	}
 
+
 @frappe.whitelist()
 def fetch_customers(customer_collection, collection_name, primary_mandatory):
 	customer_list = []
 	customers = []
 
-	if customer_collection == 'Sales Person':
+	if customer_collection == "Sales Person":
 		customers = get_customers_based_on_sales_person(collection_name)
 		if not bool(customers):
-			frappe.throw(_('No Customers found with selected options.'))
+			frappe.throw(_("No Customers found with selected options."))
 	else:
-		if customer_collection == 'Sales Partner':
-			customers = frappe.get_list('Customer', fields=['name', 'email_id'], \
-				filters=[['default_sales_partner', '=', collection_name]])
+		if customer_collection == "Sales Partner":
+			customers = frappe.get_list(
+				"Customer",
+				fields=["name", "email_id"],
+				filters=[["default_sales_partner", "=", collection_name]],
+			)
 		else:
-			customers = get_customers_based_on_territory_or_customer_group(customer_collection, collection_name)
+			customers = get_customers_based_on_territory_or_customer_group(
+				customer_collection, collection_name
+			)
 
 	for customer in customers:
-		primary_email = customer.get('email_id') or ''
+		primary_email = customer.get("email_id") or ""
 		billing_email = get_customer_emails(customer.name, 1, billing_and_primary=False)
 
 		if int(primary_mandatory):
-			if (primary_email == ''):
+			if primary_email == "":
 				continue
-		elif (billing_email == '') and (primary_email == ''):
+		elif (billing_email == "") and (primary_email == ""):
 			continue
 
-		customer_list.append({
-			'name': customer.name,
-			'primary_email': primary_email,
-			'billing_email': billing_email
-		})
+		customer_list.append(
+			{"name": customer.name, "primary_email": primary_email, "billing_email": billing_email}
+		)
 	return customer_list
 
+
 @frappe.whitelist()
 def get_customer_emails(customer_name, primary_mandatory, billing_and_primary=True):
-	""" Returns first email from Contact Email table as a Billing email
-		when Is Billing Contact checked
-		and Primary email- email with Is Primary checked """
+	"""Returns first email from Contact Email table as a Billing email
+	when Is Billing Contact checked
+	and Primary email- email with Is Primary checked"""
 
-	billing_email = frappe.db.sql("""
+	billing_email = frappe.db.sql(
+		"""
 		SELECT
 			email.email_id
 		FROM
@@ -231,42 +273,43 @@
 			and link.link_name=%s
 			and contact.is_billing_contact=1
 		ORDER BY
-			contact.creation desc""", customer_name)
+			contact.creation desc""",
+		customer_name,
+	)
 
 	if len(billing_email) == 0 or (billing_email[0][0] is None):
 		if billing_and_primary:
 			frappe.throw(_("No billing email found for customer: {0}").format(customer_name))
 		else:
-			return ''
+			return ""
 
 	if billing_and_primary:
-		primary_email =  frappe.get_value('Customer', customer_name, 'email_id')
+		primary_email = frappe.get_value("Customer", customer_name, "email_id")
 		if primary_email is None and int(primary_mandatory):
 			frappe.throw(_("No primary email found for customer: {0}").format(customer_name))
-		return [primary_email or '', billing_email[0][0]]
+		return [primary_email or "", billing_email[0][0]]
 	else:
-		return billing_email[0][0] or ''
+		return billing_email[0][0] or ""
+
 
 @frappe.whitelist()
 def download_statements(document_name):
-	doc = frappe.get_doc('Process Statement Of Accounts', document_name)
+	doc = frappe.get_doc("Process Statement Of Accounts", document_name)
 	report = get_report_pdf(doc)
 	if report:
-		frappe.local.response.filename = doc.name + '.pdf'
+		frappe.local.response.filename = doc.name + ".pdf"
 		frappe.local.response.filecontent = report
 		frappe.local.response.type = "download"
 
+
 @frappe.whitelist()
 def send_emails(document_name, from_scheduler=False):
-	doc = frappe.get_doc('Process Statement Of Accounts', document_name)
+	doc = frappe.get_doc("Process Statement Of Accounts", document_name)
 	report = get_report_pdf(doc, consolidated=False)
 
 	if report:
 		for customer, report_pdf in report.items():
-			attachments = [{
-				'fname': customer + '.pdf',
-				'fcontent': report_pdf
-			}]
+			attachments = [{"fname": customer + ".pdf", "fcontent": report_pdf}]
 
 			recipients, cc = get_recipients_and_cc(customer, doc)
 			context = get_context(customer, doc)
@@ -274,7 +317,7 @@
 			message = frappe.render_template(doc.body, context)
 
 			frappe.enqueue(
-				queue='short',
+				queue="short",
 				method=frappe.sendmail,
 				recipients=recipients,
 				sender=frappe.session.user,
@@ -282,28 +325,34 @@
 				subject=subject,
 				message=message,
 				now=True,
-				reference_doctype='Process Statement Of Accounts',
+				reference_doctype="Process Statement Of Accounts",
 				reference_name=document_name,
-				attachments=attachments
+				attachments=attachments,
 			)
 
 		if doc.enable_auto_email and from_scheduler:
 			new_to_date = getdate(today())
-			if doc.frequency == 'Weekly':
+			if doc.frequency == "Weekly":
 				new_to_date = add_days(new_to_date, 7)
 			else:
-				new_to_date = add_months(new_to_date, 1 if doc.frequency == 'Monthly' else 3)
+				new_to_date = add_months(new_to_date, 1 if doc.frequency == "Monthly" else 3)
 			new_from_date = add_months(new_to_date, -1 * doc.filter_duration)
-			doc.add_comment('Comment', 'Emails sent on: ' + frappe.utils.format_datetime(frappe.utils.now()))
-			doc.db_set('to_date', new_to_date, commit=True)
-			doc.db_set('from_date', new_from_date, commit=True)
+			doc.add_comment(
+				"Comment", "Emails sent on: " + frappe.utils.format_datetime(frappe.utils.now())
+			)
+			doc.db_set("to_date", new_to_date, commit=True)
+			doc.db_set("from_date", new_from_date, commit=True)
 		return True
 	else:
 		return False
 
+
 @frappe.whitelist()
 def send_auto_email():
-	selected = frappe.get_list('Process Statement Of Accounts', filters={'to_date': format_date(today()), 'enable_auto_email': 1})
+	selected = frappe.get_list(
+		"Process Statement Of Accounts",
+		filters={"to_date": format_date(today()), "enable_auto_email": 1},
+	)
 	for entry in selected:
 		send_emails(entry.name, from_scheduler=True)
 	return True
diff --git a/erpnext/accounts/doctype/promotional_scheme/promotional_scheme.py b/erpnext/accounts/doctype/promotional_scheme/promotional_scheme.py
index 5fbe93e..fac9be7 100644
--- a/erpnext/accounts/doctype/promotional_scheme/promotional_scheme.py
+++ b/erpnext/accounts/doctype/promotional_scheme/promotional_scheme.py
@@ -6,29 +6,73 @@
 from frappe import _
 from frappe.model.document import Document
 
-pricing_rule_fields = ['apply_on', 'mixed_conditions', 'is_cumulative', 'other_item_code', 'other_item_group',
-	'apply_rule_on_other', 'other_brand', 'selling', 'buying', 'applicable_for', 'valid_from',
-	'valid_upto', 'customer', 'customer_group', 'territory', 'sales_partner', 'campaign', 'supplier',
-	'supplier_group', 'company', 'currency', 'apply_multiple_pricing_rules']
+pricing_rule_fields = [
+	"apply_on",
+	"mixed_conditions",
+	"is_cumulative",
+	"other_item_code",
+	"other_item_group",
+	"apply_rule_on_other",
+	"other_brand",
+	"selling",
+	"buying",
+	"applicable_for",
+	"valid_from",
+	"valid_upto",
+	"customer",
+	"customer_group",
+	"territory",
+	"sales_partner",
+	"campaign",
+	"supplier",
+	"supplier_group",
+	"company",
+	"currency",
+	"apply_multiple_pricing_rules",
+]
 
-other_fields = ['min_qty', 'max_qty', 'min_amt',
-	'max_amt', 'priority','warehouse', 'threshold_percentage', 'rule_description']
+other_fields = [
+	"min_qty",
+	"max_qty",
+	"min_amt",
+	"max_amt",
+	"priority",
+	"warehouse",
+	"threshold_percentage",
+	"rule_description",
+]
 
-price_discount_fields = ['rate_or_discount', 'apply_discount_on', 'apply_discount_on_rate',
-	'rate', 'discount_amount', 'discount_percentage', 'validate_applied_rule', 'apply_multiple_pricing_rules']
+price_discount_fields = [
+	"rate_or_discount",
+	"apply_discount_on",
+	"apply_discount_on_rate",
+	"rate",
+	"discount_amount",
+	"discount_percentage",
+	"validate_applied_rule",
+	"apply_multiple_pricing_rules",
+]
 
-product_discount_fields = ['free_item', 'free_qty', 'free_item_uom',
-	'free_item_rate', 'same_item', 'is_recursive', 'apply_multiple_pricing_rules']
+product_discount_fields = [
+	"free_item",
+	"free_qty",
+	"free_item_uom",
+	"free_item_rate",
+	"same_item",
+	"is_recursive",
+	"apply_multiple_pricing_rules",
+]
+
 
 class TransactionExists(frappe.ValidationError):
 	pass
 
+
 class PromotionalScheme(Document):
 	def validate(self):
 		if not self.selling and not self.buying:
 			frappe.throw(_("Either 'Selling' or 'Buying' must be selected"), title=_("Mandatory"))
-		if not (self.price_discount_slabs
-			or self.product_discount_slabs):
+		if not (self.price_discount_slabs or self.product_discount_slabs):
 			frappe.throw(_("Price or product discount slabs are required"))
 
 		self.validate_applicable_for()
@@ -39,7 +83,7 @@
 			applicable_for = frappe.scrub(self.applicable_for)
 
 			if not self.get(applicable_for):
-				msg = (f'The field {frappe.bold(self.applicable_for)} is required')
+				msg = f"The field {frappe.bold(self.applicable_for)} is required"
 				frappe.throw(_(msg))
 
 	def validate_pricing_rules(self):
@@ -53,28 +97,28 @@
 		if self._doc_before_save.applicable_for == self.applicable_for:
 			return
 
-		docnames = frappe.get_all('Pricing Rule',
-			filters= {'promotional_scheme': self.name})
+		docnames = frappe.get_all("Pricing Rule", filters={"promotional_scheme": self.name})
 
 		for docname in docnames:
-			if frappe.db.exists('Pricing Rule Detail',
-				{'pricing_rule': docname.name, 'docstatus': ('<', 2)}):
+			if frappe.db.exists(
+				"Pricing Rule Detail", {"pricing_rule": docname.name, "docstatus": ("<", 2)}
+			):
 				raise_for_transaction_exists(self.name)
 
 		if docnames and not transaction_exists:
 			for docname in docnames:
-				frappe.delete_doc('Pricing Rule', docname.name)
+				frappe.delete_doc("Pricing Rule", docname.name)
 
 	def on_update(self):
-		pricing_rules = frappe.get_all(
-			'Pricing Rule',
-			fields = ["promotional_scheme_id", "name", "creation"],
-			filters = {
-				'promotional_scheme': self.name,
-				'applicable_for': self.applicable_for
-			},
-			order_by = 'creation asc',
-		) or {}
+		pricing_rules = (
+			frappe.get_all(
+				"Pricing Rule",
+				fields=["promotional_scheme_id", "name", "creation"],
+				filters={"promotional_scheme": self.name, "applicable_for": self.applicable_for},
+				order_by="creation asc",
+			)
+			or {}
+		)
 		self.update_pricing_rules(pricing_rules)
 
 	def update_pricing_rules(self, pricing_rules):
@@ -83,7 +127,7 @@
 		names = []
 		for rule in pricing_rules:
 			names.append(rule.name)
-			rules[rule.get('promotional_scheme_id')] = names
+			rules[rule.get("promotional_scheme_id")] = names
 
 		docs = get_pricing_rules(self, rules)
 
@@ -100,34 +144,38 @@
 			frappe.msgprint(_("New {0} pricing rules are created").format(count))
 
 	def on_trash(self):
-		for rule in frappe.get_all('Pricing Rule',
-			{'promotional_scheme': self.name}):
-			frappe.delete_doc('Pricing Rule', rule.name)
+		for rule in frappe.get_all("Pricing Rule", {"promotional_scheme": self.name}):
+			frappe.delete_doc("Pricing Rule", rule.name)
+
 
 def raise_for_transaction_exists(name):
-	msg = (f"""You can't change the {frappe.bold(_('Applicable For'))}
-		because transactions are present against the Promotional Scheme {frappe.bold(name)}. """)
-	msg += 'Kindly disable this Promotional Scheme and create new for new Applicable For.'
+	msg = f"""You can't change the {frappe.bold(_('Applicable For'))}
+		because transactions are present against the Promotional Scheme {frappe.bold(name)}. """
+	msg += "Kindly disable this Promotional Scheme and create new for new Applicable For."
 
 	frappe.throw(_(msg), TransactionExists)
 
+
 def get_pricing_rules(doc, rules=None):
 	if rules is None:
 		rules = {}
 	new_doc = []
-	for child_doc, fields in {'price_discount_slabs': price_discount_fields,
-		'product_discount_slabs': product_discount_fields}.items():
+	for child_doc, fields in {
+		"price_discount_slabs": price_discount_fields,
+		"product_discount_slabs": product_discount_fields,
+	}.items():
 		if doc.get(child_doc):
 			new_doc.extend(_get_pricing_rules(doc, child_doc, fields, rules))
 
 	return new_doc
 
+
 def _get_pricing_rules(doc, child_doc, discount_fields, rules=None):
 	if rules is None:
 		rules = {}
 	new_doc = []
 	args = get_args_for_pricing_rule(doc)
-	applicable_for = frappe.scrub(doc.get('applicable_for'))
+	applicable_for = frappe.scrub(doc.get("applicable_for"))
 
 	for idx, d in enumerate(doc.get(child_doc)):
 		if d.name in rules:
@@ -138,15 +186,23 @@
 			else:
 				for applicable_for_value in args.get(applicable_for):
 					docname = get_pricing_rule_docname(d, applicable_for, applicable_for_value)
-					pr = prepare_pricing_rule(args, doc, child_doc, discount_fields,
-						d, docname, applicable_for, applicable_for_value)
+					pr = prepare_pricing_rule(
+						args, doc, child_doc, discount_fields, d, docname, applicable_for, applicable_for_value
+					)
 					new_doc.append(pr)
 
 		elif args.get(applicable_for):
 			applicable_for_values = args.get(applicable_for) or []
 			for applicable_for_value in applicable_for_values:
-				pr = prepare_pricing_rule(args, doc, child_doc, discount_fields,
-					d, applicable_for=applicable_for, value= applicable_for_value)
+				pr = prepare_pricing_rule(
+					args,
+					doc,
+					child_doc,
+					discount_fields,
+					d,
+					applicable_for=applicable_for,
+					value=applicable_for_value,
+				)
 
 				new_doc.append(pr)
 		else:
@@ -155,20 +211,24 @@
 
 	return new_doc
 
-def get_pricing_rule_docname(row: dict, applicable_for: str = None, applicable_for_value: str = None) -> str:
-	fields = ['promotional_scheme_id', 'name']
-	filters = {
-		'promotional_scheme_id': row.name
-	}
+
+def get_pricing_rule_docname(
+	row: dict, applicable_for: str = None, applicable_for_value: str = None
+) -> str:
+	fields = ["promotional_scheme_id", "name"]
+	filters = {"promotional_scheme_id": row.name}
 
 	if applicable_for:
 		fields.append(applicable_for)
 		filters[applicable_for] = applicable_for_value
 
-	docname = frappe.get_all('Pricing Rule', fields = fields, filters = filters)
-	return docname[0].name if docname else ''
+	docname = frappe.get_all("Pricing Rule", fields=fields, filters=filters)
+	return docname[0].name if docname else ""
 
-def prepare_pricing_rule(args, doc, child_doc, discount_fields, d, docname=None, applicable_for=None, value=None):
+
+def prepare_pricing_rule(
+	args, doc, child_doc, discount_fields, d, docname=None, applicable_for=None, value=None
+):
 	if docname:
 		pr = frappe.get_doc("Pricing Rule", docname)
 	else:
@@ -182,33 +242,31 @@
 
 	return set_args(temp_args, pr, doc, child_doc, discount_fields, d)
 
+
 def set_args(args, pr, doc, child_doc, discount_fields, child_doc_fields):
 	pr.update(args)
-	for field in (other_fields + discount_fields):
+	for field in other_fields + discount_fields:
 		pr.set(field, child_doc_fields.get(field))
 
 	pr.promotional_scheme_id = child_doc_fields.name
 	pr.promotional_scheme = doc.name
 	pr.disable = child_doc_fields.disable if child_doc_fields.disable else doc.disable
-	pr.price_or_product_discount = ('Price'
-		if child_doc == 'price_discount_slabs' else 'Product')
+	pr.price_or_product_discount = "Price" if child_doc == "price_discount_slabs" else "Product"
 
-	for field in ['items', 'item_groups', 'brands']:
+	for field in ["items", "item_groups", "brands"]:
 		if doc.get(field):
 			pr.set(field, [])
 
-		apply_on = frappe.scrub(doc.get('apply_on'))
+		apply_on = frappe.scrub(doc.get("apply_on"))
 		for d in doc.get(field):
-			pr.append(field, {
-				apply_on: d.get(apply_on),
-				'uom': d.uom
-			})
+			pr.append(field, {apply_on: d.get(apply_on), "uom": d.uom})
 
 	return pr
 
+
 def get_args_for_pricing_rule(doc):
-	args = { 'promotional_scheme': doc.name }
-	applicable_for = frappe.scrub(doc.get('applicable_for'))
+	args = {"promotional_scheme": doc.name}
+	applicable_for = frappe.scrub(doc.get("applicable_for"))
 
 	for d in pricing_rule_fields:
 		if d == applicable_for:
diff --git a/erpnext/accounts/doctype/promotional_scheme/promotional_scheme_dashboard.py b/erpnext/accounts/doctype/promotional_scheme/promotional_scheme_dashboard.py
index 6d07924..70e8740 100644
--- a/erpnext/accounts/doctype/promotional_scheme/promotional_scheme_dashboard.py
+++ b/erpnext/accounts/doctype/promotional_scheme/promotional_scheme_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'promotional_scheme',
-		'transactions': [
-			{
-				'label': _('Reference'),
-				'items': ['Pricing Rule']
-			}
-		]
+		"fieldname": "promotional_scheme",
+		"transactions": [{"label": _("Reference"), "items": ["Pricing Rule"]}],
 	}
diff --git a/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py b/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py
index 49192a4..b3b9d7b 100644
--- a/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py
+++ b/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py
@@ -11,96 +11,111 @@
 
 class TestPromotionalScheme(unittest.TestCase):
 	def setUp(self):
-		if frappe.db.exists('Promotional Scheme', '_Test Scheme'):
-			frappe.delete_doc('Promotional Scheme', '_Test Scheme')
+		if frappe.db.exists("Promotional Scheme", "_Test Scheme"):
+			frappe.delete_doc("Promotional Scheme", "_Test Scheme")
 
 	def test_promotional_scheme(self):
-		ps = make_promotional_scheme(applicable_for='Customer', customer='_Test Customer')
-		price_rules = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name", "creation"],
-			filters = {'promotional_scheme': ps.name})
-		self.assertTrue(len(price_rules),1)
-		price_doc_details = frappe.db.get_value('Pricing Rule', price_rules[0].name, ['customer', 'min_qty', 'discount_percentage'], as_dict = 1)
-		self.assertTrue(price_doc_details.customer, '_Test Customer')
+		ps = make_promotional_scheme(applicable_for="Customer", customer="_Test Customer")
+		price_rules = frappe.get_all(
+			"Pricing Rule",
+			fields=["promotional_scheme_id", "name", "creation"],
+			filters={"promotional_scheme": ps.name},
+		)
+		self.assertTrue(len(price_rules), 1)
+		price_doc_details = frappe.db.get_value(
+			"Pricing Rule", price_rules[0].name, ["customer", "min_qty", "discount_percentage"], as_dict=1
+		)
+		self.assertTrue(price_doc_details.customer, "_Test Customer")
 		self.assertTrue(price_doc_details.min_qty, 4)
 		self.assertTrue(price_doc_details.discount_percentage, 20)
 
 		ps.price_discount_slabs[0].min_qty = 6
-		ps.append('customer', {
-			'customer': "_Test Customer 2"})
+		ps.append("customer", {"customer": "_Test Customer 2"})
 		ps.save()
-		price_rules = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name"],
-			filters = {'promotional_scheme': ps.name})
+		price_rules = frappe.get_all(
+			"Pricing Rule",
+			fields=["promotional_scheme_id", "name"],
+			filters={"promotional_scheme": ps.name},
+		)
 		self.assertTrue(len(price_rules), 2)
 
-		price_doc_details = frappe.db.get_value('Pricing Rule', price_rules[1].name, ['customer', 'min_qty', 'discount_percentage'], as_dict = 1)
-		self.assertTrue(price_doc_details.customer, '_Test Customer 2')
+		price_doc_details = frappe.db.get_value(
+			"Pricing Rule", price_rules[1].name, ["customer", "min_qty", "discount_percentage"], as_dict=1
+		)
+		self.assertTrue(price_doc_details.customer, "_Test Customer 2")
 		self.assertTrue(price_doc_details.min_qty, 6)
 		self.assertTrue(price_doc_details.discount_percentage, 20)
 
-		price_doc_details = frappe.db.get_value('Pricing Rule', price_rules[0].name, ['customer', 'min_qty', 'discount_percentage'], as_dict = 1)
-		self.assertTrue(price_doc_details.customer, '_Test Customer')
+		price_doc_details = frappe.db.get_value(
+			"Pricing Rule", price_rules[0].name, ["customer", "min_qty", "discount_percentage"], as_dict=1
+		)
+		self.assertTrue(price_doc_details.customer, "_Test Customer")
 		self.assertTrue(price_doc_details.min_qty, 6)
 
-		frappe.delete_doc('Promotional Scheme', ps.name)
-		price_rules = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name"],
-			filters = {'promotional_scheme': ps.name})
+		frappe.delete_doc("Promotional Scheme", ps.name)
+		price_rules = frappe.get_all(
+			"Pricing Rule",
+			fields=["promotional_scheme_id", "name"],
+			filters={"promotional_scheme": ps.name},
+		)
 		self.assertEqual(price_rules, [])
 
 	def test_promotional_scheme_without_applicable_for(self):
 		ps = make_promotional_scheme()
-		price_rules = frappe.get_all('Pricing Rule', filters = {'promotional_scheme': ps.name})
+		price_rules = frappe.get_all("Pricing Rule", filters={"promotional_scheme": ps.name})
 
 		self.assertTrue(len(price_rules), 1)
-		frappe.delete_doc('Promotional Scheme', ps.name)
+		frappe.delete_doc("Promotional Scheme", ps.name)
 
-		price_rules = frappe.get_all('Pricing Rule', filters = {'promotional_scheme': ps.name})
+		price_rules = frappe.get_all("Pricing Rule", filters={"promotional_scheme": ps.name})
 		self.assertEqual(price_rules, [])
 
 	def test_change_applicable_for_in_promotional_scheme(self):
 		ps = make_promotional_scheme()
-		price_rules = frappe.get_all('Pricing Rule', filters = {'promotional_scheme': ps.name})
+		price_rules = frappe.get_all("Pricing Rule", filters={"promotional_scheme": ps.name})
 		self.assertTrue(len(price_rules), 1)
 
-		so = make_sales_order(qty=5, currency='USD', do_not_save=True)
+		so = make_sales_order(qty=5, currency="USD", do_not_save=True)
 		so.set_missing_values()
 		so.save()
 		self.assertEqual(price_rules[0].name, so.pricing_rules[0].pricing_rule)
 
-		ps.applicable_for = 'Customer'
-		ps.append('customer', {
-			'customer': '_Test Customer'
-		})
+		ps.applicable_for = "Customer"
+		ps.append("customer", {"customer": "_Test Customer"})
 
 		self.assertRaises(TransactionExists, ps.save)
 
-		frappe.delete_doc('Sales Order', so.name)
-		frappe.delete_doc('Promotional Scheme', ps.name)
-		price_rules = frappe.get_all('Pricing Rule', filters = {'promotional_scheme': ps.name})
+		frappe.delete_doc("Sales Order", so.name)
+		frappe.delete_doc("Promotional Scheme", ps.name)
+		price_rules = frappe.get_all("Pricing Rule", filters={"promotional_scheme": ps.name})
 		self.assertEqual(price_rules, [])
 
+
 def make_promotional_scheme(**args):
 	args = frappe._dict(args)
 
-	ps = frappe.new_doc('Promotional Scheme')
-	ps.name = '_Test Scheme'
-	ps.append('items',{
-		'item_code': '_Test Item'
-	})
+	ps = frappe.new_doc("Promotional Scheme")
+	ps.name = "_Test Scheme"
+	ps.append("items", {"item_code": "_Test Item"})
 
 	ps.selling = 1
-	ps.append('price_discount_slabs',{
-		'min_qty': 4,
-		'validate_applied_rule': 0,
-		'discount_percentage': 20,
-		'rule_description': 'Test'
-	})
+	ps.append(
+		"price_discount_slabs",
+		{
+			"min_qty": 4,
+			"validate_applied_rule": 0,
+			"discount_percentage": 20,
+			"rule_description": "Test",
+		},
+	)
 
-	ps.company = '_Test Company'
+	ps.company = "_Test Company"
 	if args.applicable_for:
 		ps.applicable_for = args.applicable_for
-		ps.append(frappe.scrub(args.applicable_for), {
-			frappe.scrub(args.applicable_for): args.get(frappe.scrub(args.applicable_for))
-		})
+		ps.append(
+			frappe.scrub(args.applicable_for),
+			{frappe.scrub(args.applicable_for): args.get(frappe.scrub(args.applicable_for))},
+		)
 
 	ps.save()
 
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 7654aa4..57bc0a7 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -41,27 +41,30 @@
 )
 
 
-class WarehouseMissingError(frappe.ValidationError): pass
+class WarehouseMissingError(frappe.ValidationError):
+	pass
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class PurchaseInvoice(BuyingController):
 	def __init__(self, *args, **kwargs):
 		super(PurchaseInvoice, self).__init__(*args, **kwargs)
-		self.status_updater = [{
-			'source_dt': 'Purchase Invoice Item',
-			'target_dt': 'Purchase Order Item',
-			'join_field': 'po_detail',
-			'target_field': 'billed_amt',
-			'target_parent_dt': 'Purchase Order',
-			'target_parent_field': 'per_billed',
-			'target_ref_field': 'amount',
-			'source_field': 'amount',
-			'percent_join_field': 'purchase_order',
-			'overflow_type': 'billing'
-		}]
+		self.status_updater = [
+			{
+				"source_dt": "Purchase Invoice Item",
+				"target_dt": "Purchase Order Item",
+				"join_field": "po_detail",
+				"target_field": "billed_amt",
+				"target_parent_dt": "Purchase Order",
+				"target_parent_field": "per_billed",
+				"target_ref_field": "amount",
+				"source_field": "amount",
+				"percent_join_field": "purchase_order",
+				"overflow_type": "billing",
+			}
+		]
 
 	def onload(self):
 		super(PurchaseInvoice, self).onload()
@@ -70,15 +73,14 @@
 
 	def before_save(self):
 		if not self.on_hold:
-			self.release_date = ''
-
+			self.release_date = ""
 
 	def invoice_is_blocked(self):
 		return self.on_hold and (not self.release_date or self.release_date > getdate(nowdate()))
 
 	def validate(self):
 		if not self.is_opening:
-			self.is_opening = 'No'
+			self.is_opening = "No"
 
 		self.validate_posting_time()
 
@@ -90,14 +92,14 @@
 			self.validate_supplier_invoice()
 
 		# validate cash purchase
-		if (self.is_paid == 1):
+		if self.is_paid == 1:
 			self.validate_cash()
 
 		# validate service stop date to lie in between start and end date
 		validate_service_stop_date(self)
 
-		if self._action=="submit" and self.update_stock:
-			self.make_batches('warehouse')
+		if self._action == "submit" and self.update_stock:
+			self.make_batches("warehouse")
 
 		self.validate_release_date()
 		self.check_conversion_rate()
@@ -115,39 +117,46 @@
 		self.create_remarks()
 		self.set_status()
 		self.validate_purchase_receipt_if_update_stock()
-		validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_invoice_reference)
+		validate_inter_company_party(
+			self.doctype, self.supplier, self.company, self.inter_company_invoice_reference
+		)
 		self.reset_default_field_value("set_warehouse", "items", "warehouse")
 		self.reset_default_field_value("rejected_warehouse", "items", "rejected_warehouse")
 		self.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
 
 	def validate_release_date(self):
 		if self.release_date and getdate(nowdate()) >= getdate(self.release_date):
-			frappe.throw(_('Release date must be in the future'))
+			frappe.throw(_("Release date must be in the future"))
 
 	def validate_cash(self):
 		if not self.cash_bank_account and flt(self.paid_amount):
 			frappe.throw(_("Cash or Bank Account is mandatory for making payment entry"))
 
-		if (flt(self.paid_amount) + flt(self.write_off_amount)
-			- flt(self.get("rounded_total") or self.grand_total)
-			> 1/(10**(self.precision("base_grand_total") + 1))):
+		if flt(self.paid_amount) + flt(self.write_off_amount) - flt(
+			self.get("rounded_total") or self.grand_total
+		) > 1 / (10 ** (self.precision("base_grand_total") + 1)):
 
 			frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total"""))
 
 	def create_remarks(self):
 		if not self.remarks:
 			if self.bill_no and self.bill_date:
-				self.remarks = _("Against Supplier Invoice {0} dated {1}").format(self.bill_no,
-					formatdate(self.bill_date))
+				self.remarks = _("Against Supplier Invoice {0} dated {1}").format(
+					self.bill_no, formatdate(self.bill_date)
+				)
 			else:
 				self.remarks = _("No Remarks")
 
 	def set_missing_values(self, for_validate=False):
 		if not self.credit_to:
 			self.credit_to = get_party_account("Supplier", self.supplier, self.company)
-			self.party_account_currency = frappe.db.get_value("Account", self.credit_to, "account_currency", cache=True)
+			self.party_account_currency = frappe.db.get_value(
+				"Account", self.credit_to, "account_currency", cache=True
+			)
 		if not self.due_date:
-			self.due_date = get_due_date(self.posting_date, "Supplier", self.supplier, self.company,  self.bill_date)
+			self.due_date = get_due_date(
+				self.posting_date, "Supplier", self.supplier, self.company, self.bill_date
+			)
 
 		tds_category = frappe.db.get_value("Supplier", self.supplier, "tax_withholding_category")
 		if tds_category and not for_validate:
@@ -159,8 +168,12 @@
 	def check_conversion_rate(self):
 		default_currency = erpnext.get_company_currency(self.company)
 		if not default_currency:
-			throw(_('Please enter default currency in Company Master'))
-		if (self.currency == default_currency and flt(self.conversion_rate) != 1.00) or not self.conversion_rate or (self.currency != default_currency and flt(self.conversion_rate) == 1.00):
+			throw(_("Please enter default currency in Company Master"))
+		if (
+			(self.currency == default_currency and flt(self.conversion_rate) != 1.00)
+			or not self.conversion_rate
+			or (self.currency != default_currency and flt(self.conversion_rate) == 1.00)
+		):
 			throw(_("Conversion rate cannot be 0 or 1"))
 
 	def validate_credit_to_acc(self):
@@ -169,19 +182,24 @@
 			if not self.credit_to:
 				self.raise_missing_debit_credit_account_error("Supplier", self.supplier)
 
-		account = frappe.db.get_value("Account", self.credit_to,
-			["account_type", "report_type", "account_currency"], as_dict=True)
+		account = frappe.db.get_value(
+			"Account", self.credit_to, ["account_type", "report_type", "account_currency"], as_dict=True
+		)
 
 		if account.report_type != "Balance Sheet":
 			frappe.throw(
-				_("Please ensure {} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account.")
-				.format(frappe.bold("Credit To")), title=_("Invalid Account")
+				_(
+					"Please ensure {} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account."
+				).format(frappe.bold("Credit To")),
+				title=_("Invalid Account"),
 			)
 
 		if self.supplier and account.account_type != "Payable":
 			frappe.throw(
-				_("Please ensure {} account {} is a Payable account. Change the account type to Payable or select a different account.")
-				.format(frappe.bold("Credit To"), frappe.bold(self.credit_to)), title=_("Invalid Account")
+				_(
+					"Please ensure {} account {} is a Payable account. Change the account type to Payable or select a different account."
+				).format(frappe.bold("Credit To"), frappe.bold(self.credit_to)),
+				title=_("Invalid Account"),
 			)
 
 		self.party_account_currency = account.account_currency
@@ -189,51 +207,61 @@
 	def check_on_hold_or_closed_status(self):
 		check_list = []
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.purchase_order and not d.purchase_order in check_list and not d.purchase_receipt:
 				check_list.append(d.purchase_order)
-				check_on_hold_or_closed_status('Purchase Order', d.purchase_order)
+				check_on_hold_or_closed_status("Purchase Order", d.purchase_order)
 
 	def validate_with_previous_doc(self):
-		super(PurchaseInvoice, self).validate_with_previous_doc({
-			"Purchase Order": {
-				"ref_dn_field": "purchase_order",
-				"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
-			},
-			"Purchase Order Item": {
-				"ref_dn_field": "po_detail",
-				"compare_fields": [["project", "="], ["item_code", "="], ["uom", "="]],
-				"is_child_table": True,
-				"allow_duplicate_prev_row_id": True
-			},
-			"Purchase Receipt": {
-				"ref_dn_field": "purchase_receipt",
-				"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
-			},
-			"Purchase Receipt Item": {
-				"ref_dn_field": "pr_detail",
-				"compare_fields": [["project", "="], ["item_code", "="], ["uom", "="]],
-				"is_child_table": True
+		super(PurchaseInvoice, self).validate_with_previous_doc(
+			{
+				"Purchase Order": {
+					"ref_dn_field": "purchase_order",
+					"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
+				},
+				"Purchase Order Item": {
+					"ref_dn_field": "po_detail",
+					"compare_fields": [["project", "="], ["item_code", "="], ["uom", "="]],
+					"is_child_table": True,
+					"allow_duplicate_prev_row_id": True,
+				},
+				"Purchase Receipt": {
+					"ref_dn_field": "purchase_receipt",
+					"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
+				},
+				"Purchase Receipt Item": {
+					"ref_dn_field": "pr_detail",
+					"compare_fields": [["project", "="], ["item_code", "="], ["uom", "="]],
+					"is_child_table": True,
+				},
 			}
-		})
+		)
 
-		if cint(frappe.db.get_single_value('Buying Settings', 'maintain_same_rate')) and not self.is_return:
-			self.validate_rate_with_reference_doc([
-				["Purchase Order", "purchase_order", "po_detail"],
-				["Purchase Receipt", "purchase_receipt", "pr_detail"]
-			])
+		if (
+			cint(frappe.db.get_single_value("Buying Settings", "maintain_same_rate")) and not self.is_return
+		):
+			self.validate_rate_with_reference_doc(
+				[
+					["Purchase Order", "purchase_order", "po_detail"],
+					["Purchase Receipt", "purchase_receipt", "pr_detail"],
+				]
+			)
 
 	def validate_warehouse(self, for_validate=True):
 		if self.update_stock and for_validate:
-			for d in self.get('items'):
+			for d in self.get("items"):
 				if not d.warehouse:
-					frappe.throw(_("Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}").
-						format(d.idx, d.item_code, self.company), exc=WarehouseMissingError)
+					frappe.throw(
+						_(
+							"Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}"
+						).format(d.idx, d.item_code, self.company),
+						exc=WarehouseMissingError,
+					)
 
 		super(PurchaseInvoice, self).validate_warehouse()
 
 	def validate_item_code(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if not d.item_code:
 				frappe.msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True)
 
@@ -261,51 +289,82 @@
 			if item.item_code:
 				asset_category = frappe.get_cached_value("Item", item.item_code, "asset_category")
 
-			if auto_accounting_for_stock and item.item_code in stock_items \
-				and self.is_opening == 'No' and not item.is_fixed_asset \
-				and (not item.po_detail or
-					not frappe.db.get_value("Purchase Order Item", item.po_detail, "delivered_by_supplier")):
+			if (
+				auto_accounting_for_stock
+				and item.item_code in stock_items
+				and self.is_opening == "No"
+				and not item.is_fixed_asset
+				and (
+					not item.po_detail
+					or not frappe.db.get_value("Purchase Order Item", item.po_detail, "delivered_by_supplier")
+				)
+			):
 
 				if self.update_stock and item.warehouse and (not item.from_warehouse):
-					if for_validate and item.expense_account and item.expense_account != warehouse_account[item.warehouse]["account"]:
-						msg = _("Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account").format(
-							item.idx, frappe.bold(warehouse_account[item.warehouse]["account"]), frappe.bold(item.expense_account), frappe.bold(item.warehouse))
+					if (
+						for_validate
+						and item.expense_account
+						and item.expense_account != warehouse_account[item.warehouse]["account"]
+					):
+						msg = _(
+							"Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account"
+						).format(
+							item.idx,
+							frappe.bold(warehouse_account[item.warehouse]["account"]),
+							frappe.bold(item.expense_account),
+							frappe.bold(item.warehouse),
+						)
 						frappe.msgprint(msg, title=_("Expense Head Changed"))
 					item.expense_account = warehouse_account[item.warehouse]["account"]
 				else:
 					# check if 'Stock Received But Not Billed' account is credited in Purchase receipt or not
 					if item.purchase_receipt:
-						negative_expense_booked_in_pr = frappe.db.sql("""select name from `tabGL Entry`
+						negative_expense_booked_in_pr = frappe.db.sql(
+							"""select name from `tabGL Entry`
 							where voucher_type='Purchase Receipt' and voucher_no=%s and account = %s""",
-							(item.purchase_receipt, stock_not_billed_account))
+							(item.purchase_receipt, stock_not_billed_account),
+						)
 
 						if negative_expense_booked_in_pr:
-							if for_validate and item.expense_account and item.expense_account != stock_not_billed_account:
-								msg = _("Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2}").format(
-									item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.purchase_receipt))
+							if (
+								for_validate and item.expense_account and item.expense_account != stock_not_billed_account
+							):
+								msg = _(
+									"Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2}"
+								).format(
+									item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.purchase_receipt)
+								)
 								frappe.msgprint(msg, title=_("Expense Head Changed"))
 
 							item.expense_account = stock_not_billed_account
 					else:
 						# If no purchase receipt present then book expense in 'Stock Received But Not Billed'
 						# This is done in cases when Purchase Invoice is created before Purchase Receipt
-						if for_validate and item.expense_account and item.expense_account != stock_not_billed_account:
-							msg = _("Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}.").format(
-								item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.item_code))
+						if (
+							for_validate and item.expense_account and item.expense_account != stock_not_billed_account
+						):
+							msg = _(
+								"Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}."
+							).format(
+								item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.item_code)
+							)
 							msg += "<br>"
-							msg += _("This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice")
+							msg += _(
+								"This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice"
+							)
 							frappe.msgprint(msg, title=_("Expense Head Changed"))
 
 						item.expense_account = stock_not_billed_account
 
 			elif item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category):
-				asset_category_account = get_asset_category_account('fixed_asset_account', item=item.item_code,
-					company = self.company)
+				asset_category_account = get_asset_category_account(
+					"fixed_asset_account", item=item.item_code, company=self.company
+				)
 				if not asset_category_account:
-					form_link = get_link_to_form('Asset Category', asset_category)
+					form_link = get_link_to_form("Asset Category", asset_category)
 					throw(
 						_("Please set Fixed Asset Account in {} against {}.").format(form_link, self.company),
-						title=_("Missing Account")
+						title=_("Missing Account"),
 					)
 				item.expense_account = asset_category_account
 			elif item.is_fixed_asset and item.pr_detail:
@@ -314,8 +373,8 @@
 				throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
 
 	def validate_expense_account(self):
-		for item in self.get('items'):
-			validate_account_head(item.idx, item.expense_account, self.company, 'Expense')
+		for item in self.get("items"):
+			validate_account_head(item.idx, item.expense_account, self.company, "Expense")
 
 	def set_against_expense_account(self):
 		against_accounts = []
@@ -326,32 +385,44 @@
 		self.against_expense_account = ",".join(against_accounts)
 
 	def po_required(self):
-		if frappe.db.get_value("Buying Settings", None, "po_required") == 'Yes':
+		if frappe.db.get_value("Buying Settings", None, "po_required") == "Yes":
 
-			if frappe.get_value('Supplier', self.supplier, 'allow_purchase_invoice_creation_without_purchase_order'):
+			if frappe.get_value(
+				"Supplier", self.supplier, "allow_purchase_invoice_creation_without_purchase_order"
+			):
 				return
 
-			for d in self.get('items'):
+			for d in self.get("items"):
 				if not d.purchase_order:
 					msg = _("Purchase Order Required for item {}").format(frappe.bold(d.item_code))
 					msg += "<br><br>"
 					msg += _("To submit the invoice without purchase order please set {0} as {1} in {2}").format(
-						frappe.bold(_('Purchase Order Required')), frappe.bold('No'), get_link_to_form('Buying Settings', 'Buying Settings', 'Buying Settings'))
+						frappe.bold(_("Purchase Order Required")),
+						frappe.bold("No"),
+						get_link_to_form("Buying Settings", "Buying Settings", "Buying Settings"),
+					)
 					throw(msg, title=_("Mandatory Purchase Order"))
 
 	def pr_required(self):
 		stock_items = self.get_stock_items()
-		if frappe.db.get_value("Buying Settings", None, "pr_required") == 'Yes':
+		if frappe.db.get_value("Buying Settings", None, "pr_required") == "Yes":
 
-			if frappe.get_value('Supplier', self.supplier, 'allow_purchase_invoice_creation_without_purchase_receipt'):
+			if frappe.get_value(
+				"Supplier", self.supplier, "allow_purchase_invoice_creation_without_purchase_receipt"
+			):
 				return
 
-			for d in self.get('items'):
+			for d in self.get("items"):
 				if not d.purchase_receipt and d.item_code in stock_items:
 					msg = _("Purchase Receipt Required for item {}").format(frappe.bold(d.item_code))
 					msg += "<br><br>"
-					msg += _("To submit the invoice without purchase receipt please set {0} as {1} in {2}").format(
-						frappe.bold(_('Purchase Receipt Required')), frappe.bold('No'), get_link_to_form('Buying Settings', 'Buying Settings', 'Buying Settings'))
+					msg += _(
+						"To submit the invoice without purchase receipt please set {0} as {1} in {2}"
+					).format(
+						frappe.bold(_("Purchase Receipt Required")),
+						frappe.bold("No"),
+						get_link_to_form("Buying Settings", "Buying Settings", "Buying Settings"),
+					)
 					throw(msg, title=_("Mandatory Purchase Receipt"))
 
 	def validate_write_off_account(self):
@@ -359,56 +430,65 @@
 			throw(_("Please enter Write Off Account"))
 
 	def check_prev_docstatus(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.purchase_order:
-				submitted = frappe.db.sql("select name from `tabPurchase Order` where docstatus = 1 and name = %s", d.purchase_order)
+				submitted = frappe.db.sql(
+					"select name from `tabPurchase Order` where docstatus = 1 and name = %s", d.purchase_order
+				)
 				if not submitted:
 					frappe.throw(_("Purchase Order {0} is not submitted").format(d.purchase_order))
 			if d.purchase_receipt:
-				submitted = frappe.db.sql("select name from `tabPurchase Receipt` where docstatus = 1 and name = %s", d.purchase_receipt)
+				submitted = frappe.db.sql(
+					"select name from `tabPurchase Receipt` where docstatus = 1 and name = %s", d.purchase_receipt
+				)
 				if not submitted:
 					frappe.throw(_("Purchase Receipt {0} is not submitted").format(d.purchase_receipt))
 
 	def update_status_updater_args(self):
 		if cint(self.update_stock):
-			self.status_updater.append({
-				'source_dt': 'Purchase Invoice Item',
-				'target_dt': 'Purchase Order Item',
-				'join_field': 'po_detail',
-				'target_field': 'received_qty',
-				'target_parent_dt': 'Purchase Order',
-				'target_parent_field': 'per_received',
-				'target_ref_field': 'qty',
-				'source_field': 'received_qty',
-				'second_source_dt': 'Purchase Receipt Item',
-				'second_source_field': 'received_qty',
-				'second_join_field': 'purchase_order_item',
-				'percent_join_field':'purchase_order',
-				'overflow_type': 'receipt',
-				'extra_cond': """ and exists(select name from `tabPurchase Invoice`
-					where name=`tabPurchase Invoice Item`.parent and update_stock = 1)"""
-			})
+			self.status_updater.append(
+				{
+					"source_dt": "Purchase Invoice Item",
+					"target_dt": "Purchase Order Item",
+					"join_field": "po_detail",
+					"target_field": "received_qty",
+					"target_parent_dt": "Purchase Order",
+					"target_parent_field": "per_received",
+					"target_ref_field": "qty",
+					"source_field": "received_qty",
+					"second_source_dt": "Purchase Receipt Item",
+					"second_source_field": "received_qty",
+					"second_join_field": "purchase_order_item",
+					"percent_join_field": "purchase_order",
+					"overflow_type": "receipt",
+					"extra_cond": """ and exists(select name from `tabPurchase Invoice`
+					where name=`tabPurchase Invoice Item`.parent and update_stock = 1)""",
+				}
+			)
 			if cint(self.is_return):
-				self.status_updater.append({
-					'source_dt': 'Purchase Invoice Item',
-					'target_dt': 'Purchase Order Item',
-					'join_field': 'po_detail',
-					'target_field': 'returned_qty',
-					'source_field': '-1 * qty',
-					'second_source_dt': 'Purchase Receipt Item',
-					'second_source_field': '-1 * qty',
-					'second_join_field': 'purchase_order_item',
-					'overflow_type': 'receipt',
-					'extra_cond': """ and exists (select name from `tabPurchase Invoice`
-						where name=`tabPurchase Invoice Item`.parent and update_stock=1 and is_return=1)"""
-				})
+				self.status_updater.append(
+					{
+						"source_dt": "Purchase Invoice Item",
+						"target_dt": "Purchase Order Item",
+						"join_field": "po_detail",
+						"target_field": "returned_qty",
+						"source_field": "-1 * qty",
+						"second_source_dt": "Purchase Receipt Item",
+						"second_source_field": "-1 * qty",
+						"second_join_field": "purchase_order_item",
+						"overflow_type": "receipt",
+						"extra_cond": """ and exists (select name from `tabPurchase Invoice`
+						where name=`tabPurchase Invoice Item`.parent and update_stock=1 and is_return=1)""",
+					}
+				)
 
 	def validate_purchase_receipt_if_update_stock(self):
 		if self.update_stock:
 			for item in self.get("items"):
 				if item.purchase_receipt:
-					frappe.throw(_("Stock cannot be updated against Purchase Receipt {0}")
-						.format(item.purchase_receipt))
+					frappe.throw(
+						_("Stock cannot be updated against Purchase Receipt {0}").format(item.purchase_receipt)
+					)
 
 	def on_submit(self):
 		super(PurchaseInvoice, self).on_submit()
@@ -417,8 +497,9 @@
 		self.update_status_updater_args()
 		self.update_prevdoc_status()
 
-		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
-			self.company, self.base_grand_total)
+		frappe.get_doc("Authorization Control").validate_approving_authority(
+			self.doctype, self.company, self.base_grand_total
+		)
 
 		if not self.is_return:
 			self.update_against_document_in_jv()
@@ -433,6 +514,7 @@
 			self.update_stock_ledger()
 			self.set_consumed_qty_in_po()
 			from erpnext.stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
+
 			update_serial_nos_after_submit(self, "items")
 
 		# this sequence because outstanding may get -negative
@@ -455,13 +537,23 @@
 			update_outstanding = "No" if (cint(self.is_paid) or self.write_off_account) else "Yes"
 
 			if self.docstatus == 1:
-				make_gl_entries(gl_entries, update_outstanding=update_outstanding, merge_entries=False, from_repost=from_repost)
+				make_gl_entries(
+					gl_entries,
+					update_outstanding=update_outstanding,
+					merge_entries=False,
+					from_repost=from_repost,
+				)
 			elif self.docstatus == 2:
 				make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
 
 			if update_outstanding == "No":
-				update_outstanding_amt(self.credit_to, "Supplier", self.supplier,
-					self.doctype, self.return_against if cint(self.is_return) and self.return_against else self.name)
+				update_outstanding_amt(
+					self.credit_to,
+					"Supplier",
+					self.supplier,
+					self.doctype,
+					self.return_against if cint(self.is_return) and self.return_against else self.name,
+				)
 
 		elif self.docstatus == 2 and cint(self.update_stock) and self.auto_accounting_for_stock:
 			make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
@@ -510,28 +602,41 @@
 	def make_supplier_gl_entry(self, gl_entries):
 		# Checked both rounding_adjustment and rounded_total
 		# because rounded_total had value even before introcution of posting GLE based on rounded total
-		grand_total = self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
-		base_grand_total = flt(self.base_rounded_total if (self.base_rounding_adjustment and self.base_rounded_total)
-			else self.base_grand_total, self.precision("base_grand_total"))
+		grand_total = (
+			self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
+		)
+		base_grand_total = flt(
+			self.base_rounded_total
+			if (self.base_rounding_adjustment and self.base_rounded_total)
+			else self.base_grand_total,
+			self.precision("base_grand_total"),
+		)
 
 		if grand_total and not self.is_internal_transfer():
-				# Did not use base_grand_total to book rounding loss gle
-				gl_entries.append(
-					self.get_gl_dict({
+			# Did not use base_grand_total to book rounding loss gle
+			gl_entries.append(
+				self.get_gl_dict(
+					{
 						"account": self.credit_to,
 						"party_type": "Supplier",
 						"party": self.supplier,
 						"due_date": self.due_date,
 						"against": self.against_expense_account,
 						"credit": base_grand_total,
-						"credit_in_account_currency": base_grand_total \
-							if self.party_account_currency==self.company_currency else grand_total,
-						"against_voucher": self.return_against if cint(self.is_return) and self.return_against else self.name,
+						"credit_in_account_currency": base_grand_total
+						if self.party_account_currency == self.company_currency
+						else grand_total,
+						"against_voucher": self.return_against
+						if cint(self.is_return) and self.return_against
+						else self.name,
 						"against_voucher_type": self.doctype,
 						"project": self.project,
-						"cost_center": self.cost_center
-					}, self.party_account_currency, item=self)
+						"cost_center": self.cost_center,
+					},
+					self.party_account_currency,
+					item=self,
 				)
+			)
 
 	def make_item_gl_entries(self, gl_entries):
 		# item gl entries
@@ -543,22 +648,33 @@
 
 		voucher_wise_stock_value = {}
 		if self.update_stock:
-			stock_ledger_entries = frappe.get_all("Stock Ledger Entry",
-				fields = ["voucher_detail_no", "stock_value_difference", "warehouse"],
-				filters={"voucher_no": self.name, "voucher_type": self.doctype, "is_cancelled": 0}
+			stock_ledger_entries = frappe.get_all(
+				"Stock Ledger Entry",
+				fields=["voucher_detail_no", "stock_value_difference", "warehouse"],
+				filters={"voucher_no": self.name, "voucher_type": self.doctype, "is_cancelled": 0},
 			)
 			for d in stock_ledger_entries:
-				voucher_wise_stock_value.setdefault((d.voucher_detail_no, d.warehouse), d.stock_value_difference)
+				voucher_wise_stock_value.setdefault(
+					(d.voucher_detail_no, d.warehouse), d.stock_value_difference
+				)
 
-		valuation_tax_accounts = [d.account_head for d in self.get("taxes")
-			if d.category in ('Valuation', 'Total and Valuation')
-			and flt(d.base_tax_amount_after_discount_amount)]
+		valuation_tax_accounts = [
+			d.account_head
+			for d in self.get("taxes")
+			if d.category in ("Valuation", "Total and Valuation")
+			and flt(d.base_tax_amount_after_discount_amount)
+		]
 
 		exchange_rate_map, net_rate_map = get_purchase_document_details(self)
 
-		enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
-		provisional_accounting_for_non_stock_items = cint(frappe.db.get_value('Company', self.company, \
-			'enable_provisional_accounting_for_non_stock_items'))
+		enable_discount_accounting = cint(
+			frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+		)
+		provisional_accounting_for_non_stock_items = cint(
+			frappe.db.get_value(
+				"Company", self.company, "enable_provisional_accounting_for_non_stock_items"
+			)
+		)
 
 		purchase_receipt_doc_map = {}
 
@@ -570,86 +686,122 @@
 
 				if self.update_stock and self.auto_accounting_for_stock and item.item_code in stock_items:
 					# warehouse account
-					warehouse_debit_amount = self.make_stock_adjustment_entry(gl_entries,
-						item, voucher_wise_stock_value, account_currency)
+					warehouse_debit_amount = self.make_stock_adjustment_entry(
+						gl_entries, item, voucher_wise_stock_value, account_currency
+					)
 
 					if item.from_warehouse:
-						gl_entries.append(self.get_gl_dict({
-							"account":  warehouse_account[item.warehouse]['account'],
-							"against": warehouse_account[item.from_warehouse]["account"],
-							"cost_center": item.cost_center,
-							"project": item.project or self.project,
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"debit": warehouse_debit_amount,
-						}, warehouse_account[item.warehouse]["account_currency"], item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": warehouse_account[item.warehouse]["account"],
+									"against": warehouse_account[item.from_warehouse]["account"],
+									"cost_center": item.cost_center,
+									"project": item.project or self.project,
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"debit": warehouse_debit_amount,
+								},
+								warehouse_account[item.warehouse]["account_currency"],
+								item=item,
+							)
+						)
 
 						# Intentionally passed negative debit amount to avoid incorrect GL Entry validation
-						gl_entries.append(self.get_gl_dict({
-							"account":  warehouse_account[item.from_warehouse]['account'],
-							"against": warehouse_account[item.warehouse]["account"],
-							"cost_center": item.cost_center,
-							"project": item.project or self.project,
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"debit": -1 * flt(item.base_net_amount, item.precision("base_net_amount")),
-						}, warehouse_account[item.from_warehouse]["account_currency"], item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": warehouse_account[item.from_warehouse]["account"],
+									"against": warehouse_account[item.warehouse]["account"],
+									"cost_center": item.cost_center,
+									"project": item.project or self.project,
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"debit": -1 * flt(item.base_net_amount, item.precision("base_net_amount")),
+								},
+								warehouse_account[item.from_warehouse]["account_currency"],
+								item=item,
+							)
+						)
 
 						# Do not book expense for transfer within same company transfer
 						if not self.is_internal_transfer():
 							gl_entries.append(
-								self.get_gl_dict({
-									"account": item.expense_account,
-									"against": self.supplier,
-									"debit": flt(item.base_net_amount, item.precision("base_net_amount")),
-									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-									"cost_center": item.cost_center,
-									"project": item.project
-								}, account_currency, item=item)
+								self.get_gl_dict(
+									{
+										"account": item.expense_account,
+										"against": self.supplier,
+										"debit": flt(item.base_net_amount, item.precision("base_net_amount")),
+										"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+										"cost_center": item.cost_center,
+										"project": item.project,
+									},
+									account_currency,
+									item=item,
+								)
 							)
 
 					else:
 						if not self.is_internal_transfer():
 							gl_entries.append(
-								self.get_gl_dict({
-									"account": item.expense_account,
-									"against": self.supplier,
-									"debit": warehouse_debit_amount,
-									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-									"cost_center": item.cost_center,
-									"project": item.project or self.project
-								}, account_currency, item=item)
+								self.get_gl_dict(
+									{
+										"account": item.expense_account,
+										"against": self.supplier,
+										"debit": warehouse_debit_amount,
+										"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+										"cost_center": item.cost_center,
+										"project": item.project or self.project,
+									},
+									account_currency,
+									item=item,
+								)
 							)
 
 					# Amount added through landed-cost-voucher
 					if landed_cost_entries:
 						for account, amount in landed_cost_entries[(item.item_code, item.name)].items():
-							gl_entries.append(self.get_gl_dict({
-								"account": account,
-								"against": item.expense_account,
-								"cost_center": item.cost_center,
-								"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-								"credit": flt(amount["base_amount"]),
-								"credit_in_account_currency": flt(amount["amount"]),
-								"project": item.project or self.project
-							}, item=item))
+							gl_entries.append(
+								self.get_gl_dict(
+									{
+										"account": account,
+										"against": item.expense_account,
+										"cost_center": item.cost_center,
+										"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+										"credit": flt(amount["base_amount"]),
+										"credit_in_account_currency": flt(amount["amount"]),
+										"project": item.project or self.project,
+									},
+									item=item,
+								)
+							)
 
 					# sub-contracting warehouse
 					if flt(item.rm_supp_cost):
 						supplier_warehouse_account = warehouse_account[self.supplier_warehouse]["account"]
 						if not supplier_warehouse_account:
-							frappe.throw(_("Please set account in Warehouse {0}")
-								.format(self.supplier_warehouse))
-						gl_entries.append(self.get_gl_dict({
-							"account": supplier_warehouse_account,
-							"against": item.expense_account,
-							"cost_center": item.cost_center,
-							"project": item.project or self.project,
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"credit": flt(item.rm_supp_cost)
-						}, warehouse_account[self.supplier_warehouse]["account_currency"], item=item))
+							frappe.throw(_("Please set account in Warehouse {0}").format(self.supplier_warehouse))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": supplier_warehouse_account,
+									"against": item.expense_account,
+									"cost_center": item.cost_center,
+									"project": item.project or self.project,
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"credit": flt(item.rm_supp_cost),
+								},
+								warehouse_account[self.supplier_warehouse]["account_currency"],
+								item=item,
+							)
+						)
 
-				elif not item.is_fixed_asset or (item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category)):
-					expense_account = (item.expense_account
-						if (not item.enable_deferred_expense or self.is_return) else item.deferred_expense_account)
+				elif not item.is_fixed_asset or (
+					item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category)
+				):
+					expense_account = (
+						item.expense_account
+						if (not item.enable_deferred_expense or self.is_return)
+						else item.deferred_expense_account
+					)
 
 					if not item.is_fixed_asset:
 						dummy, amount = self.get_amount_and_base_amount(item, enable_discount_accounting)
@@ -666,103 +818,154 @@
 								purchase_receipt_doc_map[item.purchase_receipt] = purchase_receipt_doc
 
 							# Post reverse entry for Stock-Received-But-Not-Billed if it is booked in Purchase Receipt
-							expense_booked_in_pr = frappe.db.get_value('GL Entry', {'is_cancelled': 0,
-								'voucher_type': 'Purchase Receipt', 'voucher_no': item.purchase_receipt, 'voucher_detail_no': item.pr_detail,
-								'account':provisional_account}, ['name'])
+							expense_booked_in_pr = frappe.db.get_value(
+								"GL Entry",
+								{
+									"is_cancelled": 0,
+									"voucher_type": "Purchase Receipt",
+									"voucher_no": item.purchase_receipt,
+									"voucher_detail_no": item.pr_detail,
+									"account": provisional_account,
+								},
+								["name"],
+							)
 
 							if expense_booked_in_pr:
 								# Intentionally passing purchase invoice item to handle partial billing
-								purchase_receipt_doc.add_provisional_gl_entry(item, gl_entries, self.posting_date, reverse=1)
+								purchase_receipt_doc.add_provisional_gl_entry(
+									item, gl_entries, self.posting_date, reverse=1
+								)
 
 					if not self.is_internal_transfer():
-						gl_entries.append(self.get_gl_dict({
-								"account": expense_account,
-								"against": self.supplier,
-								"debit": amount,
-								"cost_center": item.cost_center,
-								"project": item.project or self.project
-							}, account_currency, item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": expense_account,
+									"against": self.supplier,
+									"debit": amount,
+									"cost_center": item.cost_center,
+									"project": item.project or self.project,
+								},
+								account_currency,
+								item=item,
+							)
+						)
 
 						# check if the exchange rate has changed
-						if item.get('purchase_receipt'):
-							if exchange_rate_map[item.purchase_receipt] and \
-								self.conversion_rate != exchange_rate_map[item.purchase_receipt] and \
-								item.net_rate == net_rate_map[item.pr_detail]:
+						if item.get("purchase_receipt"):
+							if (
+								exchange_rate_map[item.purchase_receipt]
+								and self.conversion_rate != exchange_rate_map[item.purchase_receipt]
+								and item.net_rate == net_rate_map[item.pr_detail]
+							):
 
-								discrepancy_caused_by_exchange_rate_difference = (item.qty * item.net_rate) * \
-									(exchange_rate_map[item.purchase_receipt] - self.conversion_rate)
+								discrepancy_caused_by_exchange_rate_difference = (item.qty * item.net_rate) * (
+									exchange_rate_map[item.purchase_receipt] - self.conversion_rate
+								)
 
 								gl_entries.append(
-									self.get_gl_dict({
-										"account": expense_account,
-										"against": self.supplier,
-										"debit": discrepancy_caused_by_exchange_rate_difference,
-										"cost_center": item.cost_center,
-										"project": item.project or self.project
-									}, account_currency, item=item)
+									self.get_gl_dict(
+										{
+											"account": expense_account,
+											"against": self.supplier,
+											"debit": discrepancy_caused_by_exchange_rate_difference,
+											"cost_center": item.cost_center,
+											"project": item.project or self.project,
+										},
+										account_currency,
+										item=item,
+									)
 								)
 								gl_entries.append(
-									self.get_gl_dict({
-										"account": self.get_company_default("exchange_gain_loss_account"),
-										"against": self.supplier,
-										"credit": discrepancy_caused_by_exchange_rate_difference,
-										"cost_center": item.cost_center,
-										"project": item.project or self.project
-									}, account_currency, item=item)
+									self.get_gl_dict(
+										{
+											"account": self.get_company_default("exchange_gain_loss_account"),
+											"against": self.supplier,
+											"credit": discrepancy_caused_by_exchange_rate_difference,
+											"cost_center": item.cost_center,
+											"project": item.project or self.project,
+										},
+										account_currency,
+										item=item,
+									)
 								)
 
 					# If asset is bought through this document and not linked to PR
 					if self.update_stock and item.landed_cost_voucher_amount:
-						expenses_included_in_asset_valuation = self.get_company_default("expenses_included_in_asset_valuation")
+						expenses_included_in_asset_valuation = self.get_company_default(
+							"expenses_included_in_asset_valuation"
+						)
 						# Amount added through landed-cost-voucher
-						gl_entries.append(self.get_gl_dict({
-							"account": expenses_included_in_asset_valuation,
-							"against": expense_account,
-							"cost_center": item.cost_center,
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"credit": flt(item.landed_cost_voucher_amount),
-							"project": item.project or self.project
-						}, item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": expenses_included_in_asset_valuation,
+									"against": expense_account,
+									"cost_center": item.cost_center,
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"credit": flt(item.landed_cost_voucher_amount),
+									"project": item.project or self.project,
+								},
+								item=item,
+							)
+						)
 
-						gl_entries.append(self.get_gl_dict({
-							"account": expense_account,
-							"against": expenses_included_in_asset_valuation,
-							"cost_center": item.cost_center,
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"debit": flt(item.landed_cost_voucher_amount),
-							"project": item.project or self.project
-						}, item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": expense_account,
+									"against": expenses_included_in_asset_valuation,
+									"cost_center": item.cost_center,
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"debit": flt(item.landed_cost_voucher_amount),
+									"project": item.project or self.project,
+								},
+								item=item,
+							)
+						)
 
 						# update gross amount of asset bought through this document
-						assets = frappe.db.get_all('Asset',
-							filters={ 'purchase_invoice': self.name, 'item_code': item.item_code }
+						assets = frappe.db.get_all(
+							"Asset", filters={"purchase_invoice": self.name, "item_code": item.item_code}
 						)
 						for asset in assets:
 							frappe.db.set_value("Asset", asset.name, "gross_purchase_amount", flt(item.valuation_rate))
-							frappe.db.set_value("Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate))
+							frappe.db.set_value(
+								"Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate)
+							)
 
-			if self.auto_accounting_for_stock and self.is_opening == "No" and \
-				item.item_code in stock_items and item.item_tax_amount:
-					# Post reverse entry for Stock-Received-But-Not-Billed if it is booked in Purchase Receipt
-					if item.purchase_receipt and valuation_tax_accounts:
-						negative_expense_booked_in_pr = frappe.db.sql("""select name from `tabGL Entry`
+			if (
+				self.auto_accounting_for_stock
+				and self.is_opening == "No"
+				and item.item_code in stock_items
+				and item.item_tax_amount
+			):
+				# Post reverse entry for Stock-Received-But-Not-Billed if it is booked in Purchase Receipt
+				if item.purchase_receipt and valuation_tax_accounts:
+					negative_expense_booked_in_pr = frappe.db.sql(
+						"""select name from `tabGL Entry`
 							where voucher_type='Purchase Receipt' and voucher_no=%s and account in %s""",
-							(item.purchase_receipt, valuation_tax_accounts))
+						(item.purchase_receipt, valuation_tax_accounts),
+					)
 
-						if not negative_expense_booked_in_pr:
-							gl_entries.append(
-								self.get_gl_dict({
+					if not negative_expense_booked_in_pr:
+						gl_entries.append(
+							self.get_gl_dict(
+								{
 									"account": self.stock_received_but_not_billed,
 									"against": self.supplier,
 									"debit": flt(item.item_tax_amount, item.precision("item_tax_amount")),
 									"remarks": self.remarks or _("Accounting Entry for Stock"),
 									"cost_center": self.cost_center,
-									"project": item.project or self.project
-								}, item=item)
+									"project": item.project or self.project,
+								},
+								item=item,
 							)
+						)
 
-							self.negative_expense_to_be_booked += flt(item.item_tax_amount, \
-								item.precision("item_tax_amount"))
+						self.negative_expense_to_be_booked += flt(
+							item.item_tax_amount, item.precision("item_tax_amount")
+						)
 
 	def get_asset_gl_entry(self, gl_entries):
 		arbnb_account = self.get_company_default("asset_received_but_not_billed")
@@ -770,125 +973,179 @@
 
 		for item in self.get("items"):
 			if item.is_fixed_asset:
-				asset_amount = flt(item.net_amount) + flt(item.item_tax_amount/self.conversion_rate)
+				asset_amount = flt(item.net_amount) + flt(item.item_tax_amount / self.conversion_rate)
 				base_asset_amount = flt(item.base_net_amount + item.item_tax_amount)
 
-				item_exp_acc_type = frappe.db.get_value('Account', item.expense_account, 'account_type')
-				if (not item.expense_account or item_exp_acc_type not in ['Asset Received But Not Billed', 'Fixed Asset']):
+				item_exp_acc_type = frappe.db.get_value("Account", item.expense_account, "account_type")
+				if not item.expense_account or item_exp_acc_type not in [
+					"Asset Received But Not Billed",
+					"Fixed Asset",
+				]:
 					item.expense_account = arbnb_account
 
 				if not self.update_stock:
 					arbnb_currency = get_account_currency(item.expense_account)
-					gl_entries.append(self.get_gl_dict({
-						"account": item.expense_account,
-						"against": self.supplier,
-						"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
-						"debit": base_asset_amount,
-						"debit_in_account_currency": (base_asset_amount
-							if arbnb_currency == self.company_currency else asset_amount),
-						"cost_center": item.cost_center,
-						"project": item.project or self.project
-					}, item=item))
+					gl_entries.append(
+						self.get_gl_dict(
+							{
+								"account": item.expense_account,
+								"against": self.supplier,
+								"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+								"debit": base_asset_amount,
+								"debit_in_account_currency": (
+									base_asset_amount if arbnb_currency == self.company_currency else asset_amount
+								),
+								"cost_center": item.cost_center,
+								"project": item.project or self.project,
+							},
+							item=item,
+						)
+					)
 
 					if item.item_tax_amount:
 						asset_eiiav_currency = get_account_currency(eiiav_account)
-						gl_entries.append(self.get_gl_dict({
-							"account": eiiav_account,
-							"against": self.supplier,
-							"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
-							"cost_center": item.cost_center,
-							"project": item.project or self.project,
-							"credit": item.item_tax_amount,
-							"credit_in_account_currency": (item.item_tax_amount
-								if asset_eiiav_currency == self.company_currency else
-									item.item_tax_amount / self.conversion_rate)
-						}, item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": eiiav_account,
+									"against": self.supplier,
+									"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+									"cost_center": item.cost_center,
+									"project": item.project or self.project,
+									"credit": item.item_tax_amount,
+									"credit_in_account_currency": (
+										item.item_tax_amount
+										if asset_eiiav_currency == self.company_currency
+										else item.item_tax_amount / self.conversion_rate
+									),
+								},
+								item=item,
+							)
+						)
 				else:
-					cwip_account = get_asset_account("capital_work_in_progress_account",
-						asset_category=item.asset_category,company=self.company)
+					cwip_account = get_asset_account(
+						"capital_work_in_progress_account", asset_category=item.asset_category, company=self.company
+					)
 
 					cwip_account_currency = get_account_currency(cwip_account)
-					gl_entries.append(self.get_gl_dict({
-						"account": cwip_account,
-						"against": self.supplier,
-						"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
-						"debit": base_asset_amount,
-						"debit_in_account_currency": (base_asset_amount
-							if cwip_account_currency == self.company_currency else asset_amount),
-						"cost_center": self.cost_center,
-						"project": item.project or self.project
-					}, item=item))
+					gl_entries.append(
+						self.get_gl_dict(
+							{
+								"account": cwip_account,
+								"against": self.supplier,
+								"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+								"debit": base_asset_amount,
+								"debit_in_account_currency": (
+									base_asset_amount if cwip_account_currency == self.company_currency else asset_amount
+								),
+								"cost_center": self.cost_center,
+								"project": item.project or self.project,
+							},
+							item=item,
+						)
+					)
 
 					if item.item_tax_amount and not cint(erpnext.is_perpetual_inventory_enabled(self.company)):
 						asset_eiiav_currency = get_account_currency(eiiav_account)
-						gl_entries.append(self.get_gl_dict({
-							"account": eiiav_account,
-							"against": self.supplier,
-							"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
-							"cost_center": item.cost_center,
-							"credit": item.item_tax_amount,
-							"project": item.project or self.project,
-							"credit_in_account_currency": (item.item_tax_amount
-								if asset_eiiav_currency == self.company_currency else
-									item.item_tax_amount / self.conversion_rate)
-						}, item=item))
+						gl_entries.append(
+							self.get_gl_dict(
+								{
+									"account": eiiav_account,
+									"against": self.supplier,
+									"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+									"cost_center": item.cost_center,
+									"credit": item.item_tax_amount,
+									"project": item.project or self.project,
+									"credit_in_account_currency": (
+										item.item_tax_amount
+										if asset_eiiav_currency == self.company_currency
+										else item.item_tax_amount / self.conversion_rate
+									),
+								},
+								item=item,
+							)
+						)
 
 					# When update stock is checked
 					# Assets are bought through this document then it will be linked to this document
 					if self.update_stock:
 						if flt(item.landed_cost_voucher_amount):
-							gl_entries.append(self.get_gl_dict({
-								"account": eiiav_account,
-								"against": cwip_account,
-								"cost_center": item.cost_center,
-								"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-								"credit": flt(item.landed_cost_voucher_amount),
-								"project": item.project or self.project
-							}, item=item))
+							gl_entries.append(
+								self.get_gl_dict(
+									{
+										"account": eiiav_account,
+										"against": cwip_account,
+										"cost_center": item.cost_center,
+										"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+										"credit": flt(item.landed_cost_voucher_amount),
+										"project": item.project or self.project,
+									},
+									item=item,
+								)
+							)
 
-							gl_entries.append(self.get_gl_dict({
-								"account": cwip_account,
-								"against": eiiav_account,
-								"cost_center": item.cost_center,
-								"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-								"debit": flt(item.landed_cost_voucher_amount),
-								"project": item.project or self.project
-							}, item=item))
+							gl_entries.append(
+								self.get_gl_dict(
+									{
+										"account": cwip_account,
+										"against": eiiav_account,
+										"cost_center": item.cost_center,
+										"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+										"debit": flt(item.landed_cost_voucher_amount),
+										"project": item.project or self.project,
+									},
+									item=item,
+								)
+							)
 
 						# update gross amount of assets bought through this document
-						assets = frappe.db.get_all('Asset',
-							filters={ 'purchase_invoice': self.name, 'item_code': item.item_code }
+						assets = frappe.db.get_all(
+							"Asset", filters={"purchase_invoice": self.name, "item_code": item.item_code}
 						)
 						for asset in assets:
 							frappe.db.set_value("Asset", asset.name, "gross_purchase_amount", flt(item.valuation_rate))
-							frappe.db.set_value("Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate))
+							frappe.db.set_value(
+								"Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate)
+							)
 
 		return gl_entries
 
-	def make_stock_adjustment_entry(self, gl_entries, item, voucher_wise_stock_value, account_currency):
+	def make_stock_adjustment_entry(
+		self, gl_entries, item, voucher_wise_stock_value, account_currency
+	):
 		net_amt_precision = item.precision("base_net_amount")
 		val_rate_db_precision = 6 if cint(item.precision("valuation_rate")) <= 6 else 9
 
-		warehouse_debit_amount = flt(flt(item.valuation_rate, val_rate_db_precision)
-			* flt(item.qty)	* flt(item.conversion_factor), net_amt_precision)
+		warehouse_debit_amount = flt(
+			flt(item.valuation_rate, val_rate_db_precision) * flt(item.qty) * flt(item.conversion_factor),
+			net_amt_precision,
+		)
 
 		# Stock ledger value is not matching with the warehouse amount
-		if (self.update_stock and voucher_wise_stock_value.get(item.name) and
-			warehouse_debit_amount != flt(voucher_wise_stock_value.get((item.name, item.warehouse)), net_amt_precision)):
+		if (
+			self.update_stock
+			and voucher_wise_stock_value.get(item.name)
+			and warehouse_debit_amount
+			!= flt(voucher_wise_stock_value.get((item.name, item.warehouse)), net_amt_precision)
+		):
 
 			cost_of_goods_sold_account = self.get_company_default("default_expense_account")
 			stock_amount = flt(voucher_wise_stock_value.get((item.name, item.warehouse)), net_amt_precision)
 			stock_adjustment_amt = warehouse_debit_amount - stock_amount
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": cost_of_goods_sold_account,
-					"against": item.expense_account,
-					"debit": stock_adjustment_amt,
-					"remarks": self.get("remarks") or _("Stock Adjustment"),
-					"cost_center": item.cost_center,
-					"project": item.project or self.project
-				}, account_currency, item=item)
+				self.get_gl_dict(
+					{
+						"account": cost_of_goods_sold_account,
+						"against": item.expense_account,
+						"debit": stock_adjustment_amt,
+						"remarks": self.get("remarks") or _("Stock Adjustment"),
+						"cost_center": item.cost_center,
+						"project": item.project or self.project,
+					},
+					account_currency,
+					item=item,
+				)
 			)
 
 			warehouse_debit_amount = stock_amount
@@ -898,7 +1155,9 @@
 	def make_tax_gl_entries(self, gl_entries):
 		# tax table gl entries
 		valuation_tax = {}
-		enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
+		enable_discount_accounting = cint(
+			frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+		)
 
 		for tax in self.get("taxes"):
 			amount, base_amount = self.get_tax_amounts(tax, enable_discount_accounting)
@@ -908,24 +1167,35 @@
 				dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit"
 
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": tax.account_head,
-						"against": self.supplier,
-						dr_or_cr: base_amount,
-						dr_or_cr + "_in_account_currency": base_amount
-							if account_currency==self.company_currency
+					self.get_gl_dict(
+						{
+							"account": tax.account_head,
+							"against": self.supplier,
+							dr_or_cr: base_amount,
+							dr_or_cr + "_in_account_currency": base_amount
+							if account_currency == self.company_currency
 							else amount,
-						"cost_center": tax.cost_center
-					}, account_currency, item=tax)
+							"cost_center": tax.cost_center,
+						},
+						account_currency,
+						item=tax,
+					)
 				)
 			# accumulate valuation tax
-			if self.is_opening == "No" and tax.category in ("Valuation", "Valuation and Total") and flt(base_amount) \
-				and not self.is_internal_transfer():
+			if (
+				self.is_opening == "No"
+				and tax.category in ("Valuation", "Valuation and Total")
+				and flt(base_amount)
+				and not self.is_internal_transfer()
+			):
 				if self.auto_accounting_for_stock and not tax.cost_center:
-					frappe.throw(_("Cost Center is required in row {0} in Taxes table for type {1}").format(tax.idx, _(tax.category)))
+					frappe.throw(
+						_("Cost Center is required in row {0} in Taxes table for type {1}").format(
+							tax.idx, _(tax.category)
+						)
+					)
 				valuation_tax.setdefault(tax.name, 0)
-				valuation_tax[tax.name] += \
-					(tax.add_deduct_tax == "Add" and 1 or -1) * flt(base_amount)
+				valuation_tax[tax.name] += (tax.add_deduct_tax == "Add" and 1 or -1) * flt(base_amount)
 
 		if self.is_opening == "No" and self.negative_expense_to_be_booked and valuation_tax:
 			# credit valuation tax amount in "Expenses Included In Valuation"
@@ -939,17 +1209,22 @@
 					if i == len(valuation_tax):
 						applicable_amount = amount_including_divisional_loss
 					else:
-						applicable_amount = self.negative_expense_to_be_booked * (valuation_tax[tax.name] / total_valuation_amount)
+						applicable_amount = self.negative_expense_to_be_booked * (
+							valuation_tax[tax.name] / total_valuation_amount
+						)
 						amount_including_divisional_loss -= applicable_amount
 
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": tax.account_head,
-							"cost_center": tax.cost_center,
-							"against": self.supplier,
-							"credit": applicable_amount,
-							"remarks": self.remarks or _("Accounting Entry for Stock"),
-						}, item=tax)
+						self.get_gl_dict(
+							{
+								"account": tax.account_head,
+								"cost_center": tax.cost_center,
+								"against": self.supplier,
+								"credit": applicable_amount,
+								"remarks": self.remarks or _("Accounting Entry for Stock"),
+							},
+							item=tax,
+						)
 					)
 
 					i += 1
@@ -958,18 +1233,24 @@
 			for tax in self.get("taxes"):
 				if valuation_tax.get(tax.name):
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": tax.account_head,
-							"cost_center": tax.cost_center,
-							"against": self.supplier,
-							"credit": valuation_tax[tax.name],
-							"remarks": self.remarks or _("Accounting Entry for Stock")
-						}, item=tax))
+						self.get_gl_dict(
+							{
+								"account": tax.account_head,
+								"cost_center": tax.cost_center,
+								"against": self.supplier,
+								"credit": valuation_tax[tax.name],
+								"remarks": self.remarks or _("Accounting Entry for Stock"),
+							},
+							item=tax,
+						)
+					)
 
 	@property
 	def enable_discount_accounting(self):
 		if not hasattr(self, "_enable_discount_accounting"):
-			self._enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
+			self._enable_discount_accounting = cint(
+				frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+			)
 
 		return self._enable_discount_accounting
 
@@ -977,13 +1258,18 @@
 		if self.is_internal_transfer() and flt(self.base_total_taxes_and_charges):
 			account_currency = get_account_currency(self.unrealized_profit_loss_account)
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.unrealized_profit_loss_account,
-					"against": self.supplier,
-					"credit": flt(self.total_taxes_and_charges),
-					"credit_in_account_currency": flt(self.base_total_taxes_and_charges),
-					"cost_center": self.cost_center
-				}, account_currency, item=self))
+				self.get_gl_dict(
+					{
+						"account": self.unrealized_profit_loss_account,
+						"against": self.supplier,
+						"credit": flt(self.total_taxes_and_charges),
+						"credit_in_account_currency": flt(self.base_total_taxes_and_charges),
+						"cost_center": self.cost_center,
+					},
+					account_currency,
+					item=self,
+				)
+			)
 
 	def make_payment_gl_entries(self, gl_entries):
 		# Make Cash GL Entries
@@ -991,30 +1277,42 @@
 			bank_account_currency = get_account_currency(self.cash_bank_account)
 			# CASH, make payment entries
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.credit_to,
-					"party_type": "Supplier",
-					"party": self.supplier,
-					"against": self.cash_bank_account,
-					"debit": self.base_paid_amount,
-					"debit_in_account_currency": self.base_paid_amount \
-						if self.party_account_currency==self.company_currency else self.paid_amount,
-					"against_voucher": self.return_against if cint(self.is_return) and self.return_against else self.name,
-					"against_voucher_type": self.doctype,
-					"cost_center": self.cost_center,
-					"project": self.project
-				}, self.party_account_currency, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.credit_to,
+						"party_type": "Supplier",
+						"party": self.supplier,
+						"against": self.cash_bank_account,
+						"debit": self.base_paid_amount,
+						"debit_in_account_currency": self.base_paid_amount
+						if self.party_account_currency == self.company_currency
+						else self.paid_amount,
+						"against_voucher": self.return_against
+						if cint(self.is_return) and self.return_against
+						else self.name,
+						"against_voucher_type": self.doctype,
+						"cost_center": self.cost_center,
+						"project": self.project,
+					},
+					self.party_account_currency,
+					item=self,
+				)
 			)
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.cash_bank_account,
-					"against": self.supplier,
-					"credit": self.base_paid_amount,
-					"credit_in_account_currency": self.base_paid_amount \
-						if bank_account_currency==self.company_currency else self.paid_amount,
-					"cost_center": self.cost_center
-				}, bank_account_currency, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.cash_bank_account,
+						"against": self.supplier,
+						"credit": self.base_paid_amount,
+						"credit_in_account_currency": self.base_paid_amount
+						if bank_account_currency == self.company_currency
+						else self.paid_amount,
+						"cost_center": self.cost_center,
+					},
+					bank_account_currency,
+					item=self,
+				)
 			)
 
 	def make_write_off_gl_entry(self, gl_entries):
@@ -1024,48 +1322,64 @@
 			write_off_account_currency = get_account_currency(self.write_off_account)
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.credit_to,
-					"party_type": "Supplier",
-					"party": self.supplier,
-					"against": self.write_off_account,
-					"debit": self.base_write_off_amount,
-					"debit_in_account_currency": self.base_write_off_amount \
-						if self.party_account_currency==self.company_currency else self.write_off_amount,
-					"against_voucher": self.return_against if cint(self.is_return) and self.return_against else self.name,
-					"against_voucher_type": self.doctype,
-					"cost_center": self.cost_center,
-					"project": self.project
-				}, self.party_account_currency, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.credit_to,
+						"party_type": "Supplier",
+						"party": self.supplier,
+						"against": self.write_off_account,
+						"debit": self.base_write_off_amount,
+						"debit_in_account_currency": self.base_write_off_amount
+						if self.party_account_currency == self.company_currency
+						else self.write_off_amount,
+						"against_voucher": self.return_against
+						if cint(self.is_return) and self.return_against
+						else self.name,
+						"against_voucher_type": self.doctype,
+						"cost_center": self.cost_center,
+						"project": self.project,
+					},
+					self.party_account_currency,
+					item=self,
+				)
 			)
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.write_off_account,
-					"against": self.supplier,
-					"credit": flt(self.base_write_off_amount),
-					"credit_in_account_currency": self.base_write_off_amount \
-						if write_off_account_currency==self.company_currency else self.write_off_amount,
-					"cost_center": self.cost_center or self.write_off_cost_center
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.write_off_account,
+						"against": self.supplier,
+						"credit": flt(self.base_write_off_amount),
+						"credit_in_account_currency": self.base_write_off_amount
+						if write_off_account_currency == self.company_currency
+						else self.write_off_amount,
+						"cost_center": self.cost_center or self.write_off_cost_center,
+					},
+					item=self,
+				)
 			)
 
 	def make_gle_for_rounding_adjustment(self, gl_entries):
 		# if rounding adjustment in small and conversion rate is also small then
 		# base_rounding_adjustment may become zero due to small precision
 		# eg: rounding_adjustment = 0.01 and exchange rate = 0.05 and precision of base_rounding_adjustment is 2
-		#	then base_rounding_adjustment becomes zero and error is thrown in GL Entry
-		if not self.is_internal_transfer() and self.rounding_adjustment and self.base_rounding_adjustment:
-			round_off_account, round_off_cost_center = \
-				get_round_off_account_and_cost_center(self.company)
+		# 	then base_rounding_adjustment becomes zero and error is thrown in GL Entry
+		if (
+			not self.is_internal_transfer() and self.rounding_adjustment and self.base_rounding_adjustment
+		):
+			round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(self.company)
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": round_off_account,
-					"against": self.supplier,
-					"debit_in_account_currency": self.rounding_adjustment,
-					"debit": self.base_rounding_adjustment,
-					"cost_center": self.cost_center or round_off_cost_center,
-				}, item=self))
+				self.get_gl_dict(
+					{
+						"account": round_off_account,
+						"against": self.supplier,
+						"debit_in_account_currency": self.rounding_adjustment,
+						"debit": self.base_rounding_adjustment,
+						"cost_center": self.cost_center or round_off_cost_center,
+					},
+					item=self,
+				)
+			)
 
 	def on_cancel(self):
 		check_if_return_invoice_linked_with_payment_entry(self)
@@ -1096,10 +1410,10 @@
 			self.repost_future_sle_and_gle()
 
 		self.update_project()
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 
 		unlink_inter_company_doc(self.doctype, self.name, self.inter_company_invoice_reference)
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry', 'Repost Item Valuation')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
 		self.update_advance_tax_references(cancel=1)
 
 	def update_project(self):
@@ -1120,19 +1434,22 @@
 			if cint(frappe.db.get_single_value("Accounts Settings", "check_supplier_invoice_uniqueness")):
 				fiscal_year = get_fiscal_year(self.posting_date, company=self.company, as_dict=True)
 
-				pi = frappe.db.sql('''select name from `tabPurchase Invoice`
+				pi = frappe.db.sql(
+					"""select name from `tabPurchase Invoice`
 					where
 						bill_no = %(bill_no)s
 						and supplier = %(supplier)s
 						and name != %(name)s
 						and docstatus < 2
-						and posting_date between %(year_start_date)s and %(year_end_date)s''', {
-							"bill_no": self.bill_no,
-							"supplier": self.supplier,
-							"name": self.name,
-							"year_start_date": fiscal_year.year_start_date,
-							"year_end_date": fiscal_year.year_end_date
-						})
+						and posting_date between %(year_start_date)s and %(year_end_date)s""",
+					{
+						"bill_no": self.bill_no,
+						"supplier": self.supplier,
+						"name": self.name,
+						"year_start_date": fiscal_year.year_start_date,
+						"year_end_date": fiscal_year.year_end_date,
+					},
+				)
 
 				if pi:
 					pi = pi[0][0]
@@ -1142,16 +1459,26 @@
 		updated_pr = []
 		for d in self.get("items"):
 			if d.pr_detail:
-				billed_amt = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item`
-					where pr_detail=%s and docstatus=1""", d.pr_detail)
+				billed_amt = frappe.db.sql(
+					"""select sum(amount) from `tabPurchase Invoice Item`
+					where pr_detail=%s and docstatus=1""",
+					d.pr_detail,
+				)
 				billed_amt = billed_amt and billed_amt[0][0] or 0
-				frappe.db.set_value("Purchase Receipt Item", d.pr_detail, "billed_amt", billed_amt, update_modified=update_modified)
+				frappe.db.set_value(
+					"Purchase Receipt Item",
+					d.pr_detail,
+					"billed_amt",
+					billed_amt,
+					update_modified=update_modified,
+				)
 				updated_pr.append(d.purchase_receipt)
 			elif d.po_detail:
 				updated_pr += update_billed_amount_based_on_po(d.po_detail, update_modified)
 
 		for pr in set(updated_pr):
 			from erpnext.stock.doctype.purchase_receipt.purchase_receipt import update_billing_percentage
+
 			pr_doc = frappe.get_doc("Purchase Receipt", pr)
 			update_billing_percentage(pr_doc, update_modified=update_modified)
 
@@ -1159,25 +1486,29 @@
 		self.due_date = None
 
 	def block_invoice(self, hold_comment=None, release_date=None):
-		self.db_set('on_hold', 1)
-		self.db_set('hold_comment', cstr(hold_comment))
-		self.db_set('release_date', release_date)
+		self.db_set("on_hold", 1)
+		self.db_set("hold_comment", cstr(hold_comment))
+		self.db_set("release_date", release_date)
 
 	def unblock_invoice(self):
-		self.db_set('on_hold', 0)
-		self.db_set('release_date', None)
+		self.db_set("on_hold", 0)
+		self.db_set("release_date", None)
 
 	def set_tax_withholding(self):
 		if not self.apply_tds:
 			return
 
-		if self.apply_tds and not self.get('tax_withholding_category'):
-			self.tax_withholding_category = frappe.db.get_value('Supplier', self.supplier, 'tax_withholding_category')
+		if self.apply_tds and not self.get("tax_withholding_category"):
+			self.tax_withholding_category = frappe.db.get_value(
+				"Supplier", self.supplier, "tax_withholding_category"
+			)
 
 		if not self.tax_withholding_category:
 			return
 
-		tax_withholding_details, advance_taxes = get_party_tax_withholding_details(self, self.tax_withholding_category)
+		tax_withholding_details, advance_taxes = get_party_tax_withholding_details(
+			self, self.tax_withholding_category
+		)
 
 		# Adjust TDS paid on advances
 		self.allocate_advance_tds(tax_withholding_details, advance_taxes)
@@ -1195,8 +1526,11 @@
 		if not accounts or tax_withholding_details.get("account_head") not in accounts:
 			self.append("taxes", tax_withholding_details)
 
-		to_remove = [d for d in self.taxes
-			if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")]
+		to_remove = [
+			d
+			for d in self.taxes
+			if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")
+		]
 
 		for d in to_remove:
 			self.remove(d)
@@ -1205,27 +1539,33 @@
 		self.calculate_taxes_and_totals()
 
 	def allocate_advance_tds(self, tax_withholding_details, advance_taxes):
-		self.set('advance_tax', [])
+		self.set("advance_tax", [])
 		for tax in advance_taxes:
 			allocated_amount = 0
 			pending_amount = flt(tax.tax_amount - tax.allocated_amount)
-			if flt(tax_withholding_details.get('tax_amount')) >= pending_amount:
-				tax_withholding_details['tax_amount'] -= pending_amount
+			if flt(tax_withholding_details.get("tax_amount")) >= pending_amount:
+				tax_withholding_details["tax_amount"] -= pending_amount
 				allocated_amount = pending_amount
-			elif flt(tax_withholding_details.get('tax_amount')) and flt(tax_withholding_details.get('tax_amount')) < pending_amount:
-				allocated_amount = tax_withholding_details['tax_amount']
-				tax_withholding_details['tax_amount'] = 0
+			elif (
+				flt(tax_withholding_details.get("tax_amount"))
+				and flt(tax_withholding_details.get("tax_amount")) < pending_amount
+			):
+				allocated_amount = tax_withholding_details["tax_amount"]
+				tax_withholding_details["tax_amount"] = 0
 
-			self.append('advance_tax', {
-				'reference_type': 'Payment Entry',
-				'reference_name': tax.parent,
-				'reference_detail': tax.name,
-				'account_head': tax.account_head,
-				'allocated_amount': allocated_amount
-			})
+			self.append(
+				"advance_tax",
+				{
+					"reference_type": "Payment Entry",
+					"reference_name": tax.parent,
+					"reference_detail": tax.name,
+					"account_head": tax.account_head,
+					"allocated_amount": allocated_amount,
+				},
+			)
 
 	def update_advance_tax_references(self, cancel=0):
-		for tax in self.get('advance_tax'):
+		for tax in self.get("advance_tax"):
 			at = frappe.qb.DocType("Advance Taxes and Charges").as_("at")
 
 			if cancel:
@@ -1239,8 +1579,8 @@
 
 	def set_status(self, update=False, status=None, update_modified=True):
 		if self.is_new():
-			if self.get('amended_from'):
-				self.status = 'Draft'
+			if self.get("amended_from"):
+				self.status = "Draft"
 			return
 
 		outstanding_amount = flt(self.outstanding_amount, self.precision("outstanding_amount"))
@@ -1251,19 +1591,25 @@
 				status = "Cancelled"
 			elif self.docstatus == 1:
 				if self.is_internal_transfer():
-					self.status = 'Internal Transfer'
+					self.status = "Internal Transfer"
 				elif is_overdue(self, total):
 					self.status = "Overdue"
 				elif 0 < outstanding_amount < total:
 					self.status = "Partly Paid"
 				elif outstanding_amount > 0 and getdate(self.due_date) >= getdate():
 					self.status = "Unpaid"
-				#Check if outstanding amount is 0 due to debit note issued against invoice
-				elif outstanding_amount <= 0 and self.is_return == 0 and frappe.db.get_value('Purchase Invoice', {'is_return': 1, 'return_against': self.name, 'docstatus': 1}):
+				# Check if outstanding amount is 0 due to debit note issued against invoice
+				elif (
+					outstanding_amount <= 0
+					and self.is_return == 0
+					and frappe.db.get_value(
+						"Purchase Invoice", {"is_return": 1, "return_against": self.name, "docstatus": 1}
+					)
+				):
 					self.status = "Debit Note Issued"
 				elif self.is_return == 1:
 					self.status = "Return"
-				elif outstanding_amount<=0:
+				elif outstanding_amount <= 0:
 					self.status = "Paid"
 				else:
 					self.status = "Submitted"
@@ -1271,106 +1617,126 @@
 				self.status = "Draft"
 
 		if update:
-			self.db_set('status', self.status, update_modified = update_modified)
+			self.db_set("status", self.status, update_modified=update_modified)
+
 
 # to get details of purchase invoice/receipt from which this doc was created for exchange rate difference handling
 def get_purchase_document_details(doc):
-	if doc.doctype == 'Purchase Invoice':
-		doc_reference = 'purchase_receipt'
-		items_reference = 'pr_detail'
-		parent_doctype = 'Purchase Receipt'
-		child_doctype = 'Purchase Receipt Item'
+	if doc.doctype == "Purchase Invoice":
+		doc_reference = "purchase_receipt"
+		items_reference = "pr_detail"
+		parent_doctype = "Purchase Receipt"
+		child_doctype = "Purchase Receipt Item"
 	else:
-		doc_reference = 'purchase_invoice'
-		items_reference = 'purchase_invoice_item'
-		parent_doctype = 'Purchase Invoice'
-		child_doctype = 'Purchase Invoice Item'
+		doc_reference = "purchase_invoice"
+		items_reference = "purchase_invoice_item"
+		parent_doctype = "Purchase Invoice"
+		child_doctype = "Purchase Invoice Item"
 
 	purchase_receipts_or_invoices = []
 	items = []
 
-	for item in doc.get('items'):
+	for item in doc.get("items"):
 		if item.get(doc_reference):
 			purchase_receipts_or_invoices.append(item.get(doc_reference))
 		if item.get(items_reference):
 			items.append(item.get(items_reference))
 
-	exchange_rate_map = frappe._dict(frappe.get_all(parent_doctype, filters={'name': ('in',
-		purchase_receipts_or_invoices)}, fields=['name', 'conversion_rate'], as_list=1))
+	exchange_rate_map = frappe._dict(
+		frappe.get_all(
+			parent_doctype,
+			filters={"name": ("in", purchase_receipts_or_invoices)},
+			fields=["name", "conversion_rate"],
+			as_list=1,
+		)
+	)
 
-	net_rate_map = frappe._dict(frappe.get_all(child_doctype, filters={'name': ('in',
-		items)}, fields=['name', 'net_rate'], as_list=1))
+	net_rate_map = frappe._dict(
+		frappe.get_all(
+			child_doctype, filters={"name": ("in", items)}, fields=["name", "net_rate"], as_list=1
+		)
+	)
 
 	return exchange_rate_map, net_rate_map
 
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Purchase Invoices'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Purchase Invoices"),
+		}
+	)
 	return list_context
 
+
 @erpnext.allow_regional
 def make_regional_gl_entries(gl_entries, doc):
 	return gl_entries
 
+
 @frappe.whitelist()
 def make_debit_note(source_name, target_doc=None):
 	from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 	return make_return_doc("Purchase Invoice", source_name, target_doc)
 
+
 @frappe.whitelist()
 def make_stock_entry(source_name, target_doc=None):
-	doc = get_mapped_doc("Purchase Invoice", source_name, {
-		"Purchase Invoice": {
-			"doctype": "Stock Entry",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Purchase Invoice Item": {
-			"doctype": "Stock Entry Detail",
-			"field_map": {
-				"stock_qty": "transfer_qty",
-				"batch_no": "batch_no"
+	doc = get_mapped_doc(
+		"Purchase Invoice",
+		source_name,
+		{
+			"Purchase Invoice": {"doctype": "Stock Entry", "validation": {"docstatus": ["=", 1]}},
+			"Purchase Invoice Item": {
+				"doctype": "Stock Entry Detail",
+				"field_map": {"stock_qty": "transfer_qty", "batch_no": "batch_no"},
 			},
-		}
-	}, target_doc)
+		},
+		target_doc,
+	)
 
 	return doc
 
+
 @frappe.whitelist()
 def change_release_date(name, release_date=None):
-	if frappe.db.exists('Purchase Invoice', name):
-		pi = frappe.get_doc('Purchase Invoice', name)
-		pi.db_set('release_date', release_date)
+	if frappe.db.exists("Purchase Invoice", name):
+		pi = frappe.get_doc("Purchase Invoice", name)
+		pi.db_set("release_date", release_date)
 
 
 @frappe.whitelist()
 def unblock_invoice(name):
-	if frappe.db.exists('Purchase Invoice', name):
-		pi = frappe.get_doc('Purchase Invoice', name)
+	if frappe.db.exists("Purchase Invoice", name):
+		pi = frappe.get_doc("Purchase Invoice", name)
 		pi.unblock_invoice()
 
 
 @frappe.whitelist()
 def block_invoice(name, release_date, hold_comment=None):
-	if frappe.db.exists('Purchase Invoice', name):
-		pi = frappe.get_doc('Purchase Invoice', name)
+	if frappe.db.exists("Purchase Invoice", name):
+		pi = frappe.get_doc("Purchase Invoice", name)
 		pi.block_invoice(hold_comment, release_date)
 
+
 @frappe.whitelist()
 def make_inter_company_sales_invoice(source_name, target_doc=None):
 	from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
+
 	return make_inter_company_transaction("Purchase Invoice", source_name, target_doc)
 
+
 def on_doctype_update():
 	frappe.db.add_index("Purchase Invoice", ["supplier", "is_return", "return_against"])
 
+
 @frappe.whitelist()
 def make_purchase_receipt(source_name, target_doc=None):
 	def update_item(obj, target, source_parent):
@@ -1378,33 +1744,37 @@
 		target.received_qty = flt(obj.qty) - flt(obj.received_qty)
 		target.stock_qty = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor)
 		target.amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate)
-		target.base_amount = (flt(obj.qty) - flt(obj.received_qty)) * \
-			flt(obj.rate) * flt(source_parent.conversion_rate)
+		target.base_amount = (
+			(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate) * flt(source_parent.conversion_rate)
+		)
 
-	doc = get_mapped_doc("Purchase Invoice", source_name, {
-		"Purchase Invoice": {
-			"doctype": "Purchase Receipt",
-			"validation": {
-				"docstatus": ["=", 1],
-			}
-		},
-		"Purchase Invoice Item": {
-			"doctype": "Purchase Receipt Item",
-			"field_map": {
-				"name": "purchase_invoice_item",
-				"parent": "purchase_invoice",
-				"bom": "bom",
-				"purchase_order": "purchase_order",
-				"po_detail": "purchase_order_item",
-				"material_request": "material_request",
-				"material_request_item": "material_request_item"
+	doc = get_mapped_doc(
+		"Purchase Invoice",
+		source_name,
+		{
+			"Purchase Invoice": {
+				"doctype": "Purchase Receipt",
+				"validation": {
+					"docstatus": ["=", 1],
+				},
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty)
+			"Purchase Invoice Item": {
+				"doctype": "Purchase Receipt Item",
+				"field_map": {
+					"name": "purchase_invoice_item",
+					"parent": "purchase_invoice",
+					"bom": "bom",
+					"purchase_order": "purchase_order",
+					"po_detail": "purchase_order_item",
+					"material_request": "material_request",
+					"material_request_item": "material_request_item",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty),
+			},
+			"Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges"},
 		},
-		"Purchase Taxes and Charges": {
-			"doctype": "Purchase Taxes and Charges"
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doc
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py
index 76c9fcd..10dd0ef 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py
@@ -3,35 +3,26 @@
 
 def get_data():
 	return {
-		'fieldname': 'purchase_invoice',
-		'non_standard_fieldnames': {
-			'Journal Entry': 'reference_name',
-			'Payment Entry': 'reference_name',
-			'Payment Request': 'reference_name',
-			'Landed Cost Voucher': 'receipt_document',
-			'Purchase Invoice': 'return_against',
-			'Auto Repeat': 'reference_document'
+		"fieldname": "purchase_invoice",
+		"non_standard_fieldnames": {
+			"Journal Entry": "reference_name",
+			"Payment Entry": "reference_name",
+			"Payment Request": "reference_name",
+			"Landed Cost Voucher": "receipt_document",
+			"Purchase Invoice": "return_against",
+			"Auto Repeat": "reference_document",
 		},
-		'internal_links': {
-			'Purchase Order': ['items', 'purchase_order'],
-			'Purchase Receipt': ['items', 'purchase_receipt'],
+		"internal_links": {
+			"Purchase Order": ["items", "purchase_order"],
+			"Purchase Receipt": ["items", "purchase_receipt"],
 		},
-		'transactions': [
+		"transactions": [
+			{"label": _("Payment"), "items": ["Payment Entry", "Payment Request", "Journal Entry"]},
 			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Payment Request', 'Journal Entry']
+				"label": _("Reference"),
+				"items": ["Purchase Order", "Purchase Receipt", "Asset", "Landed Cost Voucher"],
 			},
-			{
-				'label': _('Reference'),
-				'items': ['Purchase Order', 'Purchase Receipt', 'Asset', 'Landed Cost Voucher']
-			},
-			{
-				'label': _('Returns'),
-				'items': ['Purchase Invoice']
-			},
-			{
-				'label': _('Subscription'),
-				'items': ['Auto Repeat']
-			},
-		]
+			{"label": _("Returns"), "items": ["Purchase Invoice"]},
+			{"label": _("Subscription"), "items": ["Auto Repeat"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index d51a008..843f66d 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import unittest
 
 import frappe
@@ -31,6 +30,7 @@
 test_dependencies = ["Item", "Cost Center", "Payment Term", "Payment Terms Template"]
 test_ignore = ["Serial No"]
 
+
 class TestPurchaseInvoice(unittest.TestCase):
 	@classmethod
 	def setUpClass(self):
@@ -43,16 +43,18 @@
 
 	def test_purchase_invoice_received_qty(self):
 		"""
-			1. Test if received qty is validated against accepted + rejected
-			2. Test if received qty is auto set on save
+		1. Test if received qty is validated against accepted + rejected
+		2. Test if received qty is auto set on save
 		"""
 		pi = make_purchase_invoice(
 			qty=1,
 			rejected_qty=1,
 			received_qty=3,
 			item_code="_Test Item Home Desktop 200",
-			rejected_warehouse = "_Test Rejected Warehouse - _TC",
-			update_stock=True, do_not_save=True)
+			rejected_warehouse="_Test Rejected Warehouse - _TC",
+			update_stock=True,
+			do_not_save=True,
+		)
 		self.assertRaises(QtyMismatchError, pi.save)
 
 		pi.items[0].received_qty = 0
@@ -79,18 +81,26 @@
 			"_Test Account CST - _TC": [29.88, 0],
 			"_Test Account VAT - _TC": [156.25, 0],
 			"_Test Account Discount - _TC": [0, 168.03],
-			"Round Off - _TC": [0, 0.3]
+			"Round Off - _TC": [0, 0.3],
 		}
-		gl_entries = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-			where voucher_type = 'Purchase Invoice' and voucher_no = %s""", pi.name, as_dict=1)
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
+			where voucher_type = 'Purchase Invoice' and voucher_no = %s""",
+			pi.name,
+			as_dict=1,
+		)
 		for d in gl_entries:
 			self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account))
 
 	def test_gl_entries_with_perpetual_inventory(self):
-		pi = make_purchase_invoice(company="_Test Company with perpetual inventory",
-			warehouse= "Stores - TCP1", cost_center = "Main - TCP1",
-			expense_account ="_Test Account Cost for Goods Sold - TCP1",
-			get_taxes_and_charges=True, qty=10)
+		pi = make_purchase_invoice(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+			get_taxes_and_charges=True,
+			qty=10,
+		)
 
 		self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pi.company)), 1)
 
@@ -104,6 +114,7 @@
 
 	def test_payment_entry_unlink_against_purchase_invoice(self):
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
+
 		unlink_payment_on_cancel_of_invoice(0)
 
 		pi_doc = make_purchase_invoice()
@@ -119,7 +130,7 @@
 		pe.save(ignore_permissions=True)
 		pe.submit()
 
-		pi_doc = frappe.get_doc('Purchase Invoice', pi_doc.name)
+		pi_doc = frappe.get_doc("Purchase Invoice", pi_doc.name)
 		pi_doc.load_from_db()
 		self.assertTrue(pi_doc.status, "Paid")
 
@@ -127,7 +138,7 @@
 		unlink_payment_on_cancel_of_invoice()
 
 	def test_purchase_invoice_for_blocked_supplier(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
 		supplier.save()
 
@@ -137,9 +148,9 @@
 		supplier.save()
 
 	def test_purchase_invoice_for_blocked_supplier_invoice(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Invoices'
+		supplier.hold_type = "Invoices"
 		supplier.save()
 
 		self.assertRaises(frappe.ValidationError, make_purchase_invoice)
@@ -148,31 +159,40 @@
 		supplier.save()
 
 	def test_purchase_invoice_for_blocked_supplier_payment(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Payments'
+		supplier.hold_type = "Payments"
 		supplier.save()
 
 		pi = make_purchase_invoice()
 
 		self.assertRaises(
-			frappe.ValidationError, get_payment_entry, dt='Purchase Invoice', dn=pi.name, bank_account="_Test Bank - _TC")
+			frappe.ValidationError,
+			get_payment_entry,
+			dt="Purchase Invoice",
+			dn=pi.name,
+			bank_account="_Test Bank - _TC",
+		)
 
 		supplier.on_hold = 0
 		supplier.save()
 
 	def test_purchase_invoice_for_blocked_supplier_payment_today_date(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Payments'
+		supplier.hold_type = "Payments"
 		supplier.release_date = nowdate()
 		supplier.save()
 
 		pi = make_purchase_invoice()
 
 		self.assertRaises(
-			frappe.ValidationError, get_payment_entry, dt='Purchase Invoice', dn=pi.name,
-			bank_account="_Test Bank - _TC")
+			frappe.ValidationError,
+			get_payment_entry,
+			dt="Purchase Invoice",
+			dn=pi.name,
+			bank_account="_Test Bank - _TC",
+		)
 
 		supplier.on_hold = 0
 		supplier.save()
@@ -181,15 +201,15 @@
 		# this test is meant to fail only if something fails in the try block
 		with self.assertRaises(Exception):
 			try:
-				supplier = frappe.get_doc('Supplier', '_Test Supplier')
+				supplier = frappe.get_doc("Supplier", "_Test Supplier")
 				supplier.on_hold = 1
-				supplier.hold_type = 'Payments'
-				supplier.release_date = '2018-03-01'
+				supplier.hold_type = "Payments"
+				supplier.release_date = "2018-03-01"
 				supplier.save()
 
 				pi = make_purchase_invoice()
 
-				get_payment_entry('Purchase Invoice', dn=pi.name, bank_account="_Test Bank - _TC")
+				get_payment_entry("Purchase Invoice", dn=pi.name, bank_account="_Test Bank - _TC")
 
 				supplier.on_hold = 0
 				supplier.save()
@@ -203,7 +223,7 @@
 		pi.release_date = nowdate()
 
 		self.assertRaises(frappe.ValidationError, pi.save)
-		pi.release_date = ''
+		pi.release_date = ""
 		pi.save()
 
 	def test_purchase_invoice_temporary_blocked(self):
@@ -212,7 +232,7 @@
 		pi.save()
 		pi.submit()
 
-		pe = get_payment_entry('Purchase Invoice', dn=pi.name, bank_account="_Test Bank - _TC")
+		pe = get_payment_entry("Purchase Invoice", dn=pi.name, bank_account="_Test Bank - _TC")
 
 		self.assertRaises(frappe.ValidationError, pe.save)
 
@@ -228,9 +248,24 @@
 
 	def test_gl_entries_with_perpetual_inventory_against_pr(self):
 
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", get_taxes_and_charges=True,)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			supplier_warehouse="Work In Progress - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			get_taxes_and_charges=True,
+		)
 
-		pi = make_purchase_invoice(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1", get_taxes_and_charges=True, qty=10,do_not_save= "True")
+		pi = make_purchase_invoice(
+			company="_Test Company with perpetual inventory",
+			supplier_warehouse="Work In Progress - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+			get_taxes_and_charges=True,
+			qty=10,
+			do_not_save="True",
+		)
 
 		for d in pi.items:
 			d.purchase_receipt = pr.name
@@ -243,18 +278,25 @@
 		self.check_gle_for_pi(pi.name)
 
 	def check_gle_for_pi(self, pi):
-		gl_entries = frappe.db.sql("""select account, sum(debit) as debit, sum(credit) as credit
+		gl_entries = frappe.db.sql(
+			"""select account, sum(debit) as debit, sum(credit) as credit
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			group by account""", pi, as_dict=1)
+			group by account""",
+			pi,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
-		expected_values = dict((d[0], d) for d in [
-			["Creditors - TCP1", 0, 720],
-			["Stock Received But Not Billed - TCP1", 500.0, 0],
-			["_Test Account Shipping Charges - TCP1", 100.0, 0.0],
-			["_Test Account VAT - TCP1", 120.0, 0]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				["Creditors - TCP1", 0, 720],
+				["Stock Received But Not Billed - TCP1", 500.0, 0],
+				["_Test Account Shipping Charges - TCP1", 100.0, 0.0],
+				["_Test Account VAT - TCP1", 120.0, 0],
+			]
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account][0], gle.account)
@@ -266,8 +308,12 @@
 			make_purchase_invoice as create_purchase_invoice,
 		)
 
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse='Stores - TCP1',
-			currency = "USD", conversion_rate = 70)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			currency="USD",
+			conversion_rate=70,
+		)
 
 		pi = create_purchase_invoice(pr.name)
 		pi.conversion_rate = 80
@@ -276,25 +322,34 @@
 		pi.submit()
 
 		# Get exchnage gain and loss account
-		exchange_gain_loss_account = frappe.db.get_value('Company', pi.company, 'exchange_gain_loss_account')
+		exchange_gain_loss_account = frappe.db.get_value(
+			"Company", pi.company, "exchange_gain_loss_account"
+		)
 
 		# fetching the latest GL Entry with exchange gain and loss account account
-		amount = frappe.db.get_value('GL Entry', {'account': exchange_gain_loss_account, 'voucher_no': pi.name}, 'debit')
-		discrepancy_caused_by_exchange_rate_diff = abs(pi.items[0].base_net_amount - pr.items[0].base_net_amount)
+		amount = frappe.db.get_value(
+			"GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "debit"
+		)
+		discrepancy_caused_by_exchange_rate_diff = abs(
+			pi.items[0].base_net_amount - pr.items[0].base_net_amount
+		)
 
 		self.assertEqual(discrepancy_caused_by_exchange_rate_diff, amount)
 
 	def test_purchase_invoice_with_discount_accounting_enabled(self):
 		enable_discount_accounting()
 
-		discount_account = create_account(account_name="Discount Account",
-			parent_account="Indirect Expenses - _TC", company="_Test Company")
+		discount_account = create_account(
+			account_name="Discount Account",
+			parent_account="Indirect Expenses - _TC",
+			company="_Test Company",
+		)
 		pi = make_purchase_invoice(discount_account=discount_account, rate=45)
 
 		expected_gle = [
 			["_Test Account Cost for Goods Sold - _TC", 250.0, 0.0, nowdate()],
 			["Creditors - _TC", 0.0, 225.0, nowdate()],
-			["Discount Account - _TC", 0.0, 25.0, nowdate()]
+			["Discount Account - _TC", 0.0, 25.0, nowdate()],
 		]
 
 		check_gl_entries(self, pi.name, expected_gle, nowdate())
@@ -302,28 +357,34 @@
 
 	def test_additional_discount_for_purchase_invoice_with_discount_accounting_enabled(self):
 		enable_discount_accounting()
-		additional_discount_account = create_account(account_name="Discount Account",
-			parent_account="Indirect Expenses - _TC", company="_Test Company")
+		additional_discount_account = create_account(
+			account_name="Discount Account",
+			parent_account="Indirect Expenses - _TC",
+			company="_Test Company",
+		)
 
 		pi = make_purchase_invoice(do_not_save=1, parent_cost_center="Main - _TC")
 		pi.apply_discount_on = "Grand Total"
 		pi.additional_discount_account = additional_discount_account
 		pi.additional_discount_percentage = 10
 		pi.disable_rounded_total = 1
-		pi.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account VAT - _TC",
-			"cost_center": "Main - _TC",
-			"description": "Test",
-			"rate": 10
-		})
+		pi.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account VAT - _TC",
+				"cost_center": "Main - _TC",
+				"description": "Test",
+				"rate": 10,
+			},
+		)
 		pi.submit()
 
 		expected_gle = [
 			["_Test Account Cost for Goods Sold - _TC", 250.0, 0.0, nowdate()],
 			["_Test Account VAT - _TC", 25.0, 0.0, nowdate()],
 			["Creditors - _TC", 0.0, 247.5, nowdate()],
-			["Discount Account - _TC", 0.0, 27.5, nowdate()]
+			["Discount Account - _TC", 0.0, 27.5, nowdate()],
 		]
 
 		check_gl_entries(self, pi.name, expected_gle, nowdate())
@@ -331,7 +392,7 @@
 	def test_purchase_invoice_change_naming_series(self):
 		pi = frappe.copy_doc(test_records[1])
 		pi.insert()
-		pi.naming_series = 'TEST-'
+		pi.naming_series = "TEST-"
 
 		self.assertRaises(frappe.CannotChangeConstantError, pi.save)
 
@@ -340,25 +401,33 @@
 		pi.load_from_db()
 
 		self.assertTrue(pi.status, "Draft")
-		pi.naming_series = 'TEST-'
+		pi.naming_series = "TEST-"
 
 		self.assertRaises(frappe.CannotChangeConstantError, pi.save)
 
 	def test_gl_entries_for_non_stock_items_with_perpetual_inventory(self):
-		pi = make_purchase_invoice(item_code = "_Test Non Stock Item",
-			company = "_Test Company with perpetual inventory", warehouse= "Stores - TCP1",
-			cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
+		pi = make_purchase_invoice(
+			item_code="_Test Non Stock Item",
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+		)
 
 		self.assertTrue(pi.status, "Unpaid")
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			order by account asc""", pi.name, as_dict=1)
+			order by account asc""",
+			pi.name,
+			as_dict=1,
+		)
 		self.assertTrue(gl_entries)
 
 		expected_values = [
 			["_Test Account Cost for Goods Sold - TCP1", 250.0, 0],
-			["Creditors - TCP1", 0, 250]
+			["Creditors - TCP1", 0, 250],
 		]
 
 		for i, gle in enumerate(gl_entries):
@@ -373,7 +442,7 @@
 
 		expected_values = [
 			["_Test Item Home Desktop 100", 90, 59],
-			["_Test Item Home Desktop 200", 135, 177]
+			["_Test Item Home Desktop 200", 135, 177],
 		]
 		for i, item in enumerate(pi.get("items")):
 			self.assertEqual(item.item_code, expected_values[i][0])
@@ -405,10 +474,7 @@
 		wrapper.insert()
 		wrapper.load_from_db()
 
-		expected_values = [
-			["_Test FG Item", 90, 59],
-			["_Test Item Home Desktop 200", 135, 177]
-		]
+		expected_values = [["_Test FG Item", 90, 59], ["_Test Item Home Desktop 200", 135, 177]]
 		for i, item in enumerate(wrapper.get("items")):
 			self.assertEqual(item.item_code, expected_values[i][0])
 			self.assertEqual(item.item_tax_amount, expected_values[i][1])
@@ -445,14 +511,17 @@
 		pi = frappe.copy_doc(test_records[0])
 		pi.disable_rounded_total = 1
 		pi.allocate_advances_automatically = 0
-		pi.append("advances", {
-			"reference_type": "Journal Entry",
-			"reference_name": jv.name,
-			"reference_row": jv.get("accounts")[0].name,
-			"advance_amount": 400,
-			"allocated_amount": 300,
-			"remarks": jv.remark
-		})
+		pi.append(
+			"advances",
+			{
+				"reference_type": "Journal Entry",
+				"reference_name": jv.name,
+				"reference_row": jv.get("accounts")[0].name,
+				"advance_amount": 400,
+				"allocated_amount": 300,
+				"remarks": jv.remark,
+			},
+		)
 		pi.insert()
 
 		self.assertEqual(pi.outstanding_amount, 1212.30)
@@ -465,14 +534,24 @@
 		pi.submit()
 		pi.load_from_db()
 
-		self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account`
+		self.assertTrue(
+			frappe.db.sql(
+				"""select name from `tabJournal Entry Account`
 			where reference_type='Purchase Invoice'
-			and reference_name=%s and debit_in_account_currency=300""", pi.name))
+			and reference_name=%s and debit_in_account_currency=300""",
+				pi.name,
+			)
+		)
 
 		pi.cancel()
 
-		self.assertFalse(frappe.db.sql("""select name from `tabJournal Entry Account`
-			where reference_type='Purchase Invoice' and reference_name=%s""", pi.name))
+		self.assertFalse(
+			frappe.db.sql(
+				"""select name from `tabJournal Entry Account`
+			where reference_type='Purchase Invoice' and reference_name=%s""",
+				pi.name,
+			)
+		)
 
 	def test_invoice_with_advance_and_multi_payment_terms(self):
 		from erpnext.accounts.doctype.journal_entry.test_journal_entry import (
@@ -486,20 +565,26 @@
 		pi = frappe.copy_doc(test_records[0])
 		pi.disable_rounded_total = 1
 		pi.allocate_advances_automatically = 0
-		pi.append("advances", {
-			"reference_type": "Journal Entry",
-			"reference_name": jv.name,
-			"reference_row": jv.get("accounts")[0].name,
-			"advance_amount": 400,
-			"allocated_amount": 300,
-			"remarks": jv.remark
-		})
+		pi.append(
+			"advances",
+			{
+				"reference_type": "Journal Entry",
+				"reference_name": jv.name,
+				"reference_row": jv.get("accounts")[0].name,
+				"advance_amount": 400,
+				"allocated_amount": 300,
+				"remarks": jv.remark,
+			},
+		)
 		pi.insert()
 
-		pi.update({
-			"payment_schedule": get_payment_terms("_Test Payment Term Template",
-				pi.posting_date, pi.grand_total, pi.base_grand_total)
-		})
+		pi.update(
+			{
+				"payment_schedule": get_payment_terms(
+					"_Test Payment Term Template", pi.posting_date, pi.grand_total, pi.base_grand_total
+				)
+			}
+		)
 
 		pi.save()
 		pi.submit()
@@ -513,7 +598,9 @@
 		self.assertTrue(
 			frappe.db.sql(
 				"select name from `tabJournal Entry Account` where reference_type='Purchase Invoice' and "
-				"reference_name=%s and debit_in_account_currency=300", pi.name)
+				"reference_name=%s and debit_in_account_currency=300",
+				pi.name,
+			)
 		)
 
 		self.assertEqual(pi.outstanding_amount, 1212.30)
@@ -523,49 +610,76 @@
 		self.assertFalse(
 			frappe.db.sql(
 				"select name from `tabJournal Entry Account` where reference_type='Purchase Invoice' and "
-				"reference_name=%s", pi.name)
+				"reference_name=%s",
+				pi.name,
+			)
 		)
 
 	def test_total_purchase_cost_for_project(self):
 		if not frappe.db.exists("Project", {"project_name": "_Test Project for Purchase"}):
-			project = make_project({'project_name':'_Test Project for Purchase'})
+			project = make_project({"project_name": "_Test Project for Purchase"})
 		else:
 			project = frappe.get_doc("Project", {"project_name": "_Test Project for Purchase"})
 
-		existing_purchase_cost = frappe.db.sql("""select sum(base_net_amount)
+		existing_purchase_cost = frappe.db.sql(
+			"""select sum(base_net_amount)
 			from `tabPurchase Invoice Item`
 			where project = '{0}'
-			and docstatus=1""".format(project.name))
+			and docstatus=1""".format(
+				project.name
+			)
+		)
 		existing_purchase_cost = existing_purchase_cost and existing_purchase_cost[0][0] or 0
 
 		pi = make_purchase_invoice(currency="USD", conversion_rate=60, project=project.name)
-		self.assertEqual(frappe.db.get_value("Project", project.name, "total_purchase_cost"),
-			existing_purchase_cost + 15000)
+		self.assertEqual(
+			frappe.db.get_value("Project", project.name, "total_purchase_cost"),
+			existing_purchase_cost + 15000,
+		)
 
 		pi1 = make_purchase_invoice(qty=10, project=project.name)
-		self.assertEqual(frappe.db.get_value("Project", project.name, "total_purchase_cost"),
-			existing_purchase_cost + 15500)
+		self.assertEqual(
+			frappe.db.get_value("Project", project.name, "total_purchase_cost"),
+			existing_purchase_cost + 15500,
+		)
 
 		pi1.cancel()
-		self.assertEqual(frappe.db.get_value("Project", project.name, "total_purchase_cost"),
-			existing_purchase_cost + 15000)
+		self.assertEqual(
+			frappe.db.get_value("Project", project.name, "total_purchase_cost"),
+			existing_purchase_cost + 15000,
+		)
 
 		pi.cancel()
-		self.assertEqual(frappe.db.get_value("Project", project.name, "total_purchase_cost"), existing_purchase_cost)
+		self.assertEqual(
+			frappe.db.get_value("Project", project.name, "total_purchase_cost"), existing_purchase_cost
+		)
 
 	def test_return_purchase_invoice_with_perpetual_inventory(self):
-		pi = make_purchase_invoice(company = "_Test Company with perpetual inventory", warehouse= "Stores - TCP1",
-			cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
+		pi = make_purchase_invoice(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+		)
 
-		return_pi = make_purchase_invoice(is_return=1, return_against=pi.name, qty=-2,
-			company = "_Test Company with perpetual inventory", warehouse= "Stores - TCP1",
-			cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
-
+		return_pi = make_purchase_invoice(
+			is_return=1,
+			return_against=pi.name,
+			qty=-2,
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+		)
 
 		# check gl entries for return
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type=%s and voucher_no=%s
-			order by account desc""", ("Purchase Invoice", return_pi.name), as_dict=1)
+			order by account desc""",
+			("Purchase Invoice", return_pi.name),
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -579,13 +693,21 @@
 			self.assertEqual(expected_values[gle.account][1], gle.credit)
 
 	def test_multi_currency_gle(self):
-		pi = make_purchase_invoice(supplier="_Test Supplier USD", credit_to="_Test Payable USD - _TC",
-			currency="USD", conversion_rate=50)
+		pi = make_purchase_invoice(
+			supplier="_Test Supplier USD",
+			credit_to="_Test Payable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 
-		gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			order by account asc""", pi.name, as_dict=1)
+			order by account asc""",
+			pi.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -595,53 +717,74 @@
 				"debit": 0,
 				"debit_in_account_currency": 0,
 				"credit": 12500,
-				"credit_in_account_currency": 250
+				"credit_in_account_currency": 250,
 			},
 			"_Test Account Cost for Goods Sold - _TC": {
 				"account_currency": "INR",
 				"debit": 12500,
 				"debit_in_account_currency": 12500,
 				"credit": 0,
-				"credit_in_account_currency": 0
-			}
+				"credit_in_account_currency": 0,
+			},
 		}
 
-		for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+		for field in (
+			"account_currency",
+			"debit",
+			"debit_in_account_currency",
+			"credit",
+			"credit_in_account_currency",
+		):
 			for i, gle in enumerate(gl_entries):
 				self.assertEqual(expected_values[gle.account][field], gle[field])
 
-
 		# Check for valid currency
-		pi1 = make_purchase_invoice(supplier="_Test Supplier USD", credit_to="_Test Payable USD - _TC",
-			do_not_save=True)
+		pi1 = make_purchase_invoice(
+			supplier="_Test Supplier USD", credit_to="_Test Payable USD - _TC", do_not_save=True
+		)
 
 		self.assertRaises(InvalidCurrency, pi1.save)
 
 		# cancel
 		pi.cancel()
 
-		gle = frappe.db.sql("""select name from `tabGL Entry`
-			where voucher_type='Sales Invoice' and voucher_no=%s""", pi.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no=%s""",
+			pi.name,
+		)
 
 		self.assertFalse(gle)
 
 	def test_purchase_invoice_update_stock_gl_entry_with_perpetual_inventory(self):
 
-		pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
-			posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
+		pi = make_purchase_invoice(
+			update_stock=1,
+			posting_date=frappe.utils.nowdate(),
+			posting_time=frappe.utils.nowtime(),
+			cash_bank_account="Cash - TCP1",
+			company="_Test Company with perpetual inventory",
+			supplier_warehouse="Work In Progress - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+		)
 
-		gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			order by account asc""", pi.name, as_dict=1)
+			order by account asc""",
+			pi.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 		stock_in_hand_account = get_inventory_account(pi.company, pi.get("items")[0].warehouse)
 
-		expected_gl_entries = dict((d[0], d) for d in [
-			[pi.credit_to, 0.0, 250.0],
-			[stock_in_hand_account, 250.0, 0.0]
-		])
+		expected_gl_entries = dict(
+			(d[0], d) for d in [[pi.credit_to, 0.0, 250.0], [stock_in_hand_account, 250.0, 0.0]]
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gl_entries[gle.account][0], gle.account)
@@ -650,22 +793,39 @@
 
 	def test_purchase_invoice_for_is_paid_and_update_stock_gl_entry_with_perpetual_inventory(self):
 
-		pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
-			posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", is_paid=1, company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1")
+		pi = make_purchase_invoice(
+			update_stock=1,
+			posting_date=frappe.utils.nowdate(),
+			posting_time=frappe.utils.nowtime(),
+			cash_bank_account="Cash - TCP1",
+			is_paid=1,
+			company="_Test Company with perpetual inventory",
+			supplier_warehouse="Work In Progress - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+		)
 
-		gl_entries = frappe.db.sql("""select account, account_currency, sum(debit) as debit,
+		gl_entries = frappe.db.sql(
+			"""select account, account_currency, sum(debit) as debit,
 				sum(credit) as credit, debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			group by account, voucher_no order by account asc;""", pi.name, as_dict=1)
+			group by account, voucher_no order by account asc;""",
+			pi.name,
+			as_dict=1,
+		)
 
 		stock_in_hand_account = get_inventory_account(pi.company, pi.get("items")[0].warehouse)
 		self.assertTrue(gl_entries)
 
-		expected_gl_entries = dict((d[0], d) for d in [
-			[pi.credit_to, 250.0, 250.0],
-			[stock_in_hand_account, 250.0, 0.0],
-			["Cash - TCP1", 0.0, 250.0]
-		])
+		expected_gl_entries = dict(
+			(d[0], d)
+			for d in [
+				[pi.credit_to, 250.0, 250.0],
+				[stock_in_hand_account, 250.0, 0.0],
+				["Cash - TCP1", 0.0, 250.0],
+			]
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gl_entries[gle.account][0], gle.account)
@@ -673,31 +833,36 @@
 			self.assertEqual(expected_gl_entries[gle.account][2], gle.credit)
 
 	def test_auto_batch(self):
-		item_code = frappe.db.get_value('Item',
-			{'has_batch_no': 1, 'create_new_batch':1}, 'name')
+		item_code = frappe.db.get_value("Item", {"has_batch_no": 1, "create_new_batch": 1}, "name")
 
 		if not item_code:
-			doc = frappe.get_doc({
-				'doctype': 'Item',
-				'is_stock_item': 1,
-				'item_code': 'test batch item',
-				'item_group': 'Products',
-				'has_batch_no': 1,
-				'create_new_batch': 1
-			}).insert(ignore_permissions=True)
+			doc = frappe.get_doc(
+				{
+					"doctype": "Item",
+					"is_stock_item": 1,
+					"item_code": "test batch item",
+					"item_group": "Products",
+					"has_batch_no": 1,
+					"create_new_batch": 1,
+				}
+			).insert(ignore_permissions=True)
 			item_code = doc.name
 
-		pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
-			posting_time=frappe.utils.nowtime(), item_code=item_code)
+		pi = make_purchase_invoice(
+			update_stock=1,
+			posting_date=frappe.utils.nowdate(),
+			posting_time=frappe.utils.nowtime(),
+			item_code=item_code,
+		)
 
-		self.assertTrue(frappe.db.get_value('Batch',
-			{'item': item_code, 'reference_name': pi.name}))
+		self.assertTrue(frappe.db.get_value("Batch", {"item": item_code, "reference_name": pi.name}))
 
 	def test_update_stock_and_purchase_return(self):
 		actual_qty_0 = get_qty_after_transaction()
 
-		pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
-			posting_time=frappe.utils.nowtime())
+		pi = make_purchase_invoice(
+			update_stock=1, posting_date=frappe.utils.nowdate(), posting_time=frappe.utils.nowtime()
+		)
 
 		actual_qty_1 = get_qty_after_transaction()
 		self.assertEqual(actual_qty_0 + 5, actual_qty_1)
@@ -724,13 +889,20 @@
 		from erpnext.buying.doctype.purchase_order.test_purchase_order import update_backflush_based_on
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
 
-		update_backflush_based_on('BOM')
-		make_stock_entry(item_code="_Test Item", target="_Test Warehouse 1 - _TC", qty=100, basic_rate=100)
-		make_stock_entry(item_code="_Test Item Home Desktop 100", target="_Test Warehouse 1 - _TC",
-			qty=100, basic_rate=100)
+		update_backflush_based_on("BOM")
+		make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse 1 - _TC", qty=100, basic_rate=100
+		)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse 1 - _TC",
+			qty=100,
+			basic_rate=100,
+		)
 
-		pi = make_purchase_invoice(item_code="_Test FG Item", qty=10, rate=500,
-			update_stock=1, is_subcontracted="Yes")
+		pi = make_purchase_invoice(
+			item_code="_Test FG Item", qty=10, rate=500, update_stock=1, is_subcontracted="Yes"
+		)
 
 		self.assertEqual(len(pi.get("supplied_items")), 2)
 
@@ -738,15 +910,26 @@
 		self.assertEqual(flt(pi.get("items")[0].rm_supp_cost, 2), flt(rm_supp_cost, 2))
 
 	def test_rejected_serial_no(self):
-		pi = make_purchase_invoice(item_code="_Test Serialized Item With Series", received_qty=2, qty=1,
-			rejected_qty=1, rate=500, update_stock=1, rejected_warehouse = "_Test Rejected Warehouse - _TC",
-			allow_zero_valuation_rate=1)
+		pi = make_purchase_invoice(
+			item_code="_Test Serialized Item With Series",
+			received_qty=2,
+			qty=1,
+			rejected_qty=1,
+			rate=500,
+			update_stock=1,
+			rejected_warehouse="_Test Rejected Warehouse - _TC",
+			allow_zero_valuation_rate=1,
+		)
 
-		self.assertEqual(frappe.db.get_value("Serial No", pi.get("items")[0].serial_no, "warehouse"),
-			pi.get("items")[0].warehouse)
+		self.assertEqual(
+			frappe.db.get_value("Serial No", pi.get("items")[0].serial_no, "warehouse"),
+			pi.get("items")[0].warehouse,
+		)
 
-		self.assertEqual(frappe.db.get_value("Serial No", pi.get("items")[0].rejected_serial_no,
-			"warehouse"), pi.get("items")[0].rejected_warehouse)
+		self.assertEqual(
+			frappe.db.get_value("Serial No", pi.get("items")[0].rejected_serial_no, "warehouse"),
+			pi.get("items")[0].rejected_warehouse,
+		)
 
 	def test_outstanding_amount_after_advance_jv_cancelation(self):
 		from erpnext.accounts.doctype.journal_entry.test_journal_entry import (
@@ -754,85 +937,95 @@
 		)
 
 		jv = frappe.copy_doc(jv_test_records[1])
-		jv.accounts[0].is_advance = 'Yes'
+		jv.accounts[0].is_advance = "Yes"
 		jv.insert()
 		jv.submit()
 
 		pi = frappe.copy_doc(test_records[0])
-		pi.append("advances", {
-			"reference_type": "Journal Entry",
-			"reference_name": jv.name,
-			"reference_row": jv.get("accounts")[0].name,
-			"advance_amount": 400,
-			"allocated_amount": 300,
-			"remarks": jv.remark
-		})
+		pi.append(
+			"advances",
+			{
+				"reference_type": "Journal Entry",
+				"reference_name": jv.name,
+				"reference_row": jv.get("accounts")[0].name,
+				"advance_amount": 400,
+				"allocated_amount": 300,
+				"remarks": jv.remark,
+			},
+		)
 		pi.insert()
 		pi.submit()
 		pi.load_from_db()
 
-		#check outstanding after advance allocation
+		# check outstanding after advance allocation
 		self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total - pi.total_advance))
 
-		#added to avoid Document has been modified exception
+		# added to avoid Document has been modified exception
 		jv = frappe.get_doc("Journal Entry", jv.name)
 		jv.cancel()
 
 		pi.load_from_db()
-		#check outstanding after advance cancellation
+		# check outstanding after advance cancellation
 		self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total + pi.total_advance))
 
 	def test_outstanding_amount_after_advance_payment_entry_cancelation(self):
-		pe = frappe.get_doc({
-			"doctype": "Payment Entry",
-			"payment_type": "Pay",
-			"party_type": "Supplier",
-			"party": "_Test Supplier",
-			"company": "_Test Company",
-			"paid_from_account_currency": "INR",
-			"paid_to_account_currency": "INR",
-			"source_exchange_rate": 1,
-			"target_exchange_rate": 1,
-			"reference_no": "1",
-			"reference_date": nowdate(),
-			"received_amount": 300,
-			"paid_amount": 300,
-			"paid_from": "_Test Cash - _TC",
-			"paid_to": "_Test Payable - _TC"
-		})
+		pe = frappe.get_doc(
+			{
+				"doctype": "Payment Entry",
+				"payment_type": "Pay",
+				"party_type": "Supplier",
+				"party": "_Test Supplier",
+				"company": "_Test Company",
+				"paid_from_account_currency": "INR",
+				"paid_to_account_currency": "INR",
+				"source_exchange_rate": 1,
+				"target_exchange_rate": 1,
+				"reference_no": "1",
+				"reference_date": nowdate(),
+				"received_amount": 300,
+				"paid_amount": 300,
+				"paid_from": "_Test Cash - _TC",
+				"paid_to": "_Test Payable - _TC",
+			}
+		)
 		pe.insert()
 		pe.submit()
 
 		pi = frappe.copy_doc(test_records[0])
 		pi.is_pos = 0
-		pi.append("advances", {
-			"doctype": "Purchase Invoice Advance",
-			"reference_type": "Payment Entry",
-			"reference_name": pe.name,
-			"advance_amount": 300,
-			"allocated_amount": 300,
-			"remarks": pe.remarks
-		})
+		pi.append(
+			"advances",
+			{
+				"doctype": "Purchase Invoice Advance",
+				"reference_type": "Payment Entry",
+				"reference_name": pe.name,
+				"advance_amount": 300,
+				"allocated_amount": 300,
+				"remarks": pe.remarks,
+			},
+		)
 		pi.insert()
 		pi.submit()
 
 		pi.load_from_db()
 
-		#check outstanding after advance allocation
+		# check outstanding after advance allocation
 		self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total - pi.total_advance))
 
-		#added to avoid Document has been modified exception
+		# added to avoid Document has been modified exception
 		pe = frappe.get_doc("Payment Entry", pe.name)
 		pe.cancel()
 
 		pi.load_from_db()
-		#check outstanding after advance cancellation
+		# check outstanding after advance cancellation
 		self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total + pi.total_advance))
 
 	def test_purchase_invoice_with_shipping_rule(self):
 		from erpnext.accounts.doctype.shipping_rule.test_shipping_rule import create_shipping_rule
 
-		shipping_rule = create_shipping_rule(shipping_rule_type = "Buying", shipping_rule_name = "Shipping Rule - Purchase Invoice Test")
+		shipping_rule = create_shipping_rule(
+			shipping_rule_type="Buying", shipping_rule_name="Shipping Rule - Purchase Invoice Test"
+		)
 
 		pi = frappe.copy_doc(test_records[0])
 
@@ -848,16 +1041,20 @@
 	def test_make_pi_without_terms(self):
 		pi = make_purchase_invoice(do_not_save=1)
 
-		self.assertFalse(pi.get('payment_schedule'))
+		self.assertFalse(pi.get("payment_schedule"))
 
 		pi.insert()
 
-		self.assertTrue(pi.get('payment_schedule'))
+		self.assertTrue(pi.get("payment_schedule"))
 
 	def test_duplicate_due_date_in_terms(self):
 		pi = make_purchase_invoice(do_not_save=1)
-		pi.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50))
-		pi.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50))
+		pi.append(
+			"payment_schedule", dict(due_date="2017-01-01", invoice_portion=50.00, payment_amount=50)
+		)
+		pi.append(
+			"payment_schedule", dict(due_date="2017-01-01", invoice_portion=50.00, payment_amount=50)
+		)
 
 		self.assertRaises(frappe.ValidationError, pi.insert)
 
@@ -865,12 +1062,13 @@
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
 		from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import get_outstanding_amount
 
-		pi = make_purchase_invoice(item_code = "_Test Item", qty = (5 * -1), rate=500, is_return = 1)
+		pi = make_purchase_invoice(item_code="_Test Item", qty=(5 * -1), rate=500, is_return=1)
 		pi.load_from_db()
 		self.assertTrue(pi.status, "Return")
 
-		outstanding_amount = get_outstanding_amount(pi.doctype,
-			pi.name, "Creditors - _TC", pi.supplier, "Supplier")
+		outstanding_amount = get_outstanding_amount(
+			pi.doctype, pi.name, "Creditors - _TC", pi.supplier, "Supplier"
+		)
 
 		self.assertEqual(pi.outstanding_amount, outstanding_amount)
 
@@ -885,30 +1083,33 @@
 		pe.insert()
 		pe.submit()
 
-		pi_doc = frappe.get_doc('Purchase Invoice', pi.name)
+		pi_doc = frappe.get_doc("Purchase Invoice", pi.name)
 		self.assertEqual(pi_doc.outstanding_amount, 0)
 
 	def test_purchase_invoice_with_cost_center(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
 
-		pi =  make_purchase_invoice_against_cost_center(cost_center=cost_center, credit_to="Creditors - _TC")
+		pi = make_purchase_invoice_against_cost_center(
+			cost_center=cost_center, credit_to="Creditors - _TC"
+		)
 		self.assertEqual(pi.cost_center, cost_center)
 
 		expected_values = {
-			"Creditors - _TC": {
-				"cost_center": cost_center
-			},
-			"_Test Account Cost for Goods Sold - _TC": {
-				"cost_center": cost_center
-			}
+			"Creditors - _TC": {"cost_center": cost_center},
+			"_Test Account Cost for Goods Sold - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			order by account asc""", pi.name, as_dict=1)
+			order by account asc""",
+			pi.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -917,21 +1118,21 @@
 
 	def test_purchase_invoice_without_cost_center(self):
 		cost_center = "_Test Cost Center - _TC"
-		pi =  make_purchase_invoice(credit_to="Creditors - _TC")
+		pi = make_purchase_invoice(credit_to="Creditors - _TC")
 
 		expected_values = {
-			"Creditors - _TC": {
-				"cost_center": None
-			},
-			"_Test Account Cost for Goods Sold - _TC": {
-				"cost_center": cost_center
-			}
+			"Creditors - _TC": {"cost_center": None},
+			"_Test Account Cost for Goods Sold - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			order by account asc""", pi.name, as_dict=1)
+			order by account asc""",
+			pi.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -939,36 +1140,40 @@
 			self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
 
 	def test_purchase_invoice_with_project_link(self):
-		project = make_project({
-			'project_name': 'Purchase Invoice Project',
-			'project_template_name': 'Test Project Template',
-			'start_date': '2020-01-01'
-		})
-		item_project = make_project({
-			'project_name': 'Purchase Invoice Item Project',
-			'project_template_name': 'Test Project Template',
-			'start_date': '2019-06-01'
-		})
+		project = make_project(
+			{
+				"project_name": "Purchase Invoice Project",
+				"project_template_name": "Test Project Template",
+				"start_date": "2020-01-01",
+			}
+		)
+		item_project = make_project(
+			{
+				"project_name": "Purchase Invoice Item Project",
+				"project_template_name": "Test Project Template",
+				"start_date": "2019-06-01",
+			}
+		)
 
-		pi = make_purchase_invoice(credit_to="Creditors - _TC" ,do_not_save=1)
+		pi = make_purchase_invoice(credit_to="Creditors - _TC", do_not_save=1)
 		pi.items[0].project = item_project.name
 		pi.project = project.name
 
 		pi.submit()
 
 		expected_values = {
-			"Creditors - _TC": {
-				"project": project.name
-			},
-			"_Test Account Cost for Goods Sold - _TC": {
-				"project": item_project.name
-			}
+			"Creditors - _TC": {"project": project.name},
+			"_Test Account Cost for Goods Sold - _TC": {"project": item_project.name},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, project, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, project, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
-			order by account asc""", pi.name, as_dict=1)
+			order by account asc""",
+			pi.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -976,10 +1181,11 @@
 			self.assertEqual(expected_values[gle.account]["project"], gle.project)
 
 	def test_deferred_expense_via_journal_entry(self):
-		deferred_account = create_account(account_name="Deferred Expense",
-			parent_account="Current Assets - _TC", company="_Test Company")
+		deferred_account = create_account(
+			account_name="Deferred Expense", parent_account="Current Assets - _TC", company="_Test Company"
+		)
 
-		acc_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
+		acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
 		acc_settings.book_deferred_entries_via_journal_entry = 1
 		acc_settings.submit_journal_entries = 1
 		acc_settings.save()
@@ -991,7 +1197,7 @@
 
 		pi = make_purchase_invoice(item=item.name, qty=1, rate=100, do_not_save=True)
 		pi.set_posting_time = 1
-		pi.posting_date = '2019-01-10'
+		pi.posting_date = "2019-01-10"
 		pi.items[0].enable_deferred_expense = 1
 		pi.items[0].service_start_date = "2019-01-10"
 		pi.items[0].service_end_date = "2019-03-15"
@@ -999,14 +1205,16 @@
 		pi.save()
 		pi.submit()
 
-		pda1 = frappe.get_doc(dict(
-			doctype='Process Deferred Accounting',
-			posting_date=nowdate(),
-			start_date="2019-01-01",
-			end_date="2019-03-31",
-			type="Expense",
-			company="_Test Company"
-		))
+		pda1 = frappe.get_doc(
+			dict(
+				doctype="Process Deferred Accounting",
+				posting_date=nowdate(),
+				start_date="2019-01-01",
+				end_date="2019-03-31",
+				type="Expense",
+				company="_Test Company",
+			)
+		)
 
 		pda1.insert()
 		pda1.submit()
@@ -1017,13 +1225,17 @@
 			["_Test Account Cost for Goods Sold - _TC", 0.0, 43.08, "2019-02-28"],
 			[deferred_account, 43.08, 0.0, "2019-02-28"],
 			["_Test Account Cost for Goods Sold - _TC", 0.0, 23.07, "2019-03-15"],
-			[deferred_account, 23.07, 0.0, "2019-03-15"]
+			[deferred_account, 23.07, 0.0, "2019-03-15"],
 		]
 
-		gl_entries = gl_entries = frappe.db.sql("""select account, debit, credit, posting_date
+		gl_entries = gl_entries = frappe.db.sql(
+			"""select account, debit, credit, posting_date
 			from `tabGL Entry`
 			where voucher_type='Journal Entry' and voucher_detail_no=%s and posting_date <= %s
-			order by posting_date asc, account asc""", (pi.items[0].name, pi.posting_date), as_dict=1)
+			order by posting_date asc, account asc""",
+			(pi.items[0].name, pi.posting_date),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
@@ -1031,108 +1243,139 @@
 			self.assertEqual(expected_gle[i][2], gle.debit)
 			self.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
 
-		acc_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
+		acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
 		acc_settings.book_deferred_entries_via_journal_entry = 0
 		acc_settings.submit_journal_entriessubmit_journal_entries = 0
 		acc_settings.save()
 
 	def test_gain_loss_with_advance_entry(self):
 		unlink_enabled = frappe.db.get_value(
-			"Accounts Settings", "Accounts Settings",
-			"unlink_payment_on_cancel_of_invoice")
+			"Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice"
+		)
 
 		frappe.db.set_value(
-			"Accounts Settings", "Accounts Settings",
-			"unlink_payment_on_cancel_of_invoice", 1)
+			"Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice", 1
+		)
 
 		original_account = frappe.db.get_value("Company", "_Test Company", "exchange_gain_loss_account")
-		frappe.db.set_value("Company", "_Test Company", "exchange_gain_loss_account", "Exchange Gain/Loss - _TC")
+		frappe.db.set_value(
+			"Company", "_Test Company", "exchange_gain_loss_account", "Exchange Gain/Loss - _TC"
+		)
 
-		pay = frappe.get_doc({
-			'doctype': 'Payment Entry',
-			'company': '_Test Company',
-			'payment_type': 'Pay',
-			'party_type': 'Supplier',
-			'party': '_Test Supplier USD',
-			'paid_to': '_Test Payable USD - _TC',
-			'paid_from': 'Cash - _TC',
-			'paid_amount': 70000,
-			'target_exchange_rate': 70,
-			'received_amount': 1000,
-		})
+		pay = frappe.get_doc(
+			{
+				"doctype": "Payment Entry",
+				"company": "_Test Company",
+				"payment_type": "Pay",
+				"party_type": "Supplier",
+				"party": "_Test Supplier USD",
+				"paid_to": "_Test Payable USD - _TC",
+				"paid_from": "Cash - _TC",
+				"paid_amount": 70000,
+				"target_exchange_rate": 70,
+				"received_amount": 1000,
+			}
+		)
 		pay.insert()
 		pay.submit()
 
-		pi = make_purchase_invoice(supplier='_Test Supplier USD', currency="USD",
-			conversion_rate=75, rate=500, do_not_save=1, qty=1)
+		pi = make_purchase_invoice(
+			supplier="_Test Supplier USD",
+			currency="USD",
+			conversion_rate=75,
+			rate=500,
+			do_not_save=1,
+			qty=1,
+		)
 		pi.cost_center = "_Test Cost Center - _TC"
 		pi.advances = []
-		pi.append("advances", {
-			"reference_type": "Payment Entry",
-			"reference_name": pay.name,
-			"advance_amount": 1000,
-			"remarks": pay.remarks,
-			"allocated_amount": 500,
-			"ref_exchange_rate": 70
-		})
+		pi.append(
+			"advances",
+			{
+				"reference_type": "Payment Entry",
+				"reference_name": pay.name,
+				"advance_amount": 1000,
+				"remarks": pay.remarks,
+				"allocated_amount": 500,
+				"ref_exchange_rate": 70,
+			},
+		)
 		pi.save()
 		pi.submit()
 
 		expected_gle = [
 			["_Test Account Cost for Goods Sold - _TC", 37500.0],
 			["_Test Payable USD - _TC", -35000.0],
-			["Exchange Gain/Loss - _TC", -2500.0]
+			["Exchange Gain/Loss - _TC", -2500.0],
 		]
 
-		gl_entries = frappe.db.sql("""
+		gl_entries = frappe.db.sql(
+			"""
 			select account, sum(debit - credit) as balance from `tabGL Entry`
 			where voucher_no=%s
 			group by account
-			order by account asc""", (pi.name), as_dict=1)
+			order by account asc""",
+			(pi.name),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
 			self.assertEqual(expected_gle[i][1], gle.balance)
 
-		pi_2 = make_purchase_invoice(supplier='_Test Supplier USD', currency="USD",
-			conversion_rate=73, rate=500, do_not_save=1, qty=1)
+		pi_2 = make_purchase_invoice(
+			supplier="_Test Supplier USD",
+			currency="USD",
+			conversion_rate=73,
+			rate=500,
+			do_not_save=1,
+			qty=1,
+		)
 		pi_2.cost_center = "_Test Cost Center - _TC"
 		pi_2.advances = []
-		pi_2.append("advances", {
-			"reference_type": "Payment Entry",
-			"reference_name": pay.name,
-			"advance_amount": 500,
-			"remarks": pay.remarks,
-			"allocated_amount": 500,
-			"ref_exchange_rate": 70
-		})
+		pi_2.append(
+			"advances",
+			{
+				"reference_type": "Payment Entry",
+				"reference_name": pay.name,
+				"advance_amount": 500,
+				"remarks": pay.remarks,
+				"allocated_amount": 500,
+				"ref_exchange_rate": 70,
+			},
+		)
 		pi_2.save()
 		pi_2.submit()
 
 		expected_gle = [
 			["_Test Account Cost for Goods Sold - _TC", 36500.0],
 			["_Test Payable USD - _TC", -35000.0],
-			["Exchange Gain/Loss - _TC", -1500.0]
+			["Exchange Gain/Loss - _TC", -1500.0],
 		]
 
-		gl_entries = frappe.db.sql("""
+		gl_entries = frappe.db.sql(
+			"""
 			select account, sum(debit - credit) as balance from `tabGL Entry`
 			where voucher_no=%s
-			group by account order by account asc""", (pi_2.name), as_dict=1)
+			group by account order by account asc""",
+			(pi_2.name),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
 			self.assertEqual(expected_gle[i][1], gle.balance)
 
-		expected_gle = [
-			["_Test Payable USD - _TC", 70000.0],
-			["Cash - _TC", -70000.0]
-		]
+		expected_gle = [["_Test Payable USD - _TC", 70000.0], ["Cash - _TC", -70000.0]]
 
-		gl_entries = frappe.db.sql("""
+		gl_entries = frappe.db.sql(
+			"""
 			select account, sum(debit - credit) as balance from `tabGL Entry`
 			where voucher_no=%s and is_cancelled=0
-			group by account order by account asc""", (pay.name), as_dict=1)
+			group by account order by account asc""",
+			(pay.name),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
@@ -1147,44 +1390,57 @@
 		pay.reload()
 		pay.cancel()
 
-		frappe.db.set_value("Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice", unlink_enabled)
+		frappe.db.set_value(
+			"Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice", unlink_enabled
+		)
 		frappe.db.set_value("Company", "_Test Company", "exchange_gain_loss_account", original_account)
 
 	def test_purchase_invoice_advance_taxes(self):
 		from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
 
 		# create a new supplier to test
-		supplier = create_supplier(supplier_name = '_Test TDS Advance Supplier',
-			tax_withholding_category = 'TDS - 194 - Dividends - Individual')
+		supplier = create_supplier(
+			supplier_name="_Test TDS Advance Supplier",
+			tax_withholding_category="TDS - 194 - Dividends - Individual",
+		)
 
 		# Update tax withholding category with current fiscal year and rate details
-		update_tax_witholding_category('_Test Company', 'TDS Payable - _TC')
+		update_tax_witholding_category("_Test Company", "TDS Payable - _TC")
 
 		# Create Purchase Order with TDS applied
-		po = create_purchase_order(do_not_save=1, supplier=supplier.name, rate=3000, item='_Test Non Stock Item',
-			posting_date='2021-09-15')
+		po = create_purchase_order(
+			do_not_save=1,
+			supplier=supplier.name,
+			rate=3000,
+			item="_Test Non Stock Item",
+			posting_date="2021-09-15",
+		)
 		po.save()
 		po.submit()
 
 		# Create Payment Entry Against the order
-		payment_entry = get_payment_entry(dt='Purchase Order', dn=po.name)
-		payment_entry.paid_from = 'Cash - _TC'
+		payment_entry = get_payment_entry(dt="Purchase Order", dn=po.name)
+		payment_entry.paid_from = "Cash - _TC"
 		payment_entry.apply_tax_withholding_amount = 1
-		payment_entry.tax_withholding_category = 'TDS - 194 - Dividends - Individual'
+		payment_entry.tax_withholding_category = "TDS - 194 - Dividends - Individual"
 		payment_entry.save()
 		payment_entry.submit()
 
 		# Check GLE for Payment Entry
 		expected_gle = [
-			['Cash - _TC', 0, 27000],
-			['Creditors - _TC', 30000, 0],
-			['TDS Payable - _TC', 0, 3000],
+			["Cash - _TC", 0, 27000],
+			["Creditors - _TC", 30000, 0],
+			["TDS Payable - _TC", 0, 3000],
 		]
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry`
 			where voucher_type='Payment Entry' and voucher_no=%s
-			order by account asc""", (payment_entry.name), as_dict=1)
+			order by account asc""",
+			(payment_entry.name),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
@@ -1194,23 +1450,24 @@
 		# Create Purchase Invoice against Purchase Order
 		purchase_invoice = get_mapped_purchase_invoice(po.name)
 		purchase_invoice.allocate_advances_automatically = 1
-		purchase_invoice.items[0].item_code = '_Test Non Stock Item'
-		purchase_invoice.items[0].expense_account = '_Test Account Cost for Goods Sold - _TC'
+		purchase_invoice.items[0].item_code = "_Test Non Stock Item"
+		purchase_invoice.items[0].expense_account = "_Test Account Cost for Goods Sold - _TC"
 		purchase_invoice.save()
 		purchase_invoice.submit()
 
 		# Check GLE for Purchase Invoice
 		# Zero net effect on final TDS Payable on invoice
-		expected_gle = [
-			['_Test Account Cost for Goods Sold - _TC', 30000],
-			['Creditors - _TC', -30000]
-		]
+		expected_gle = [["_Test Account Cost for Goods Sold - _TC", 30000], ["Creditors - _TC", -30000]]
 
-		gl_entries = frappe.db.sql("""select account, sum(debit - credit) as amount
+		gl_entries = frappe.db.sql(
+			"""select account, sum(debit - credit) as amount
 			from `tabGL Entry`
 			where voucher_type='Purchase Invoice' and voucher_no=%s
 			group by account
-			order by account asc""", (purchase_invoice.name), as_dict=1)
+			order by account asc""",
+			(purchase_invoice.name),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
@@ -1226,27 +1483,32 @@
 
 	def test_provisional_accounting_entry(self):
 		item = create_item("_Test Non Stock Item", is_stock_item=0)
-		provisional_account = create_account(account_name="Provision Account",
-			parent_account="Current Liabilities - _TC", company="_Test Company")
+		provisional_account = create_account(
+			account_name="Provision Account",
+			parent_account="Current Liabilities - _TC",
+			company="_Test Company",
+		)
 
-		company = frappe.get_doc('Company', '_Test Company')
+		company = frappe.get_doc("Company", "_Test Company")
 		company.enable_provisional_accounting_for_non_stock_items = 1
 		company.default_provisional_account = provisional_account
 		company.save()
 
-		pr = make_purchase_receipt(item_code="_Test Non Stock Item", posting_date=add_days(nowdate(), -2))
+		pr = make_purchase_receipt(
+			item_code="_Test Non Stock Item", posting_date=add_days(nowdate(), -2)
+		)
 
 		pi = create_purchase_invoice_from_receipt(pr.name)
 		pi.set_posting_time = 1
 		pi.posting_date = add_days(pr.posting_date, -1)
-		pi.items[0].expense_account = 'Cost of Goods Sold - _TC'
+		pi.items[0].expense_account = "Cost of Goods Sold - _TC"
 		pi.save()
 		pi.submit()
 
 		# Check GLE for Purchase Invoice
 		expected_gle = [
-			['Cost of Goods Sold - _TC', 250, 0, add_days(pr.posting_date, -1)],
-			['Creditors - _TC', 0, 250, add_days(pr.posting_date, -1)]
+			["Cost of Goods Sold - _TC", 250, 0, add_days(pr.posting_date, -1)],
+			["Creditors - _TC", 0, 250, add_days(pr.posting_date, -1)],
 		]
 
 		check_gl_entries(self, pi.name, expected_gle, pi.posting_date)
@@ -1255,7 +1517,7 @@
 			["Provision Account - _TC", 250, 0, pr.posting_date],
 			["_Test Account Cost for Goods Sold - _TC", 0, 250, pr.posting_date],
 			["Provision Account - _TC", 0, 250, pi.posting_date],
-			["_Test Account Cost for Goods Sold - _TC", 250, 0, pi.posting_date]
+			["_Test Account Cost for Goods Sold - _TC", 250, 0, pi.posting_date],
 		]
 
 		check_gl_entries(self, pr.name, expected_gle_for_purchase_receipt, pr.posting_date)
@@ -1263,11 +1525,16 @@
 		company.enable_provisional_accounting_for_non_stock_items = 0
 		company.save()
 
+
 def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
-	gl_entries = frappe.db.sql("""select account, debit, credit, posting_date
+	gl_entries = frappe.db.sql(
+		"""select account, debit, credit, posting_date
 		from `tabGL Entry`
 		where voucher_type='Purchase Invoice' and voucher_no=%s and posting_date >= %s
-		order by posting_date asc, account asc""", (voucher_no, posting_date), as_dict=1)
+		order by posting_date asc, account asc""",
+		(voucher_no, posting_date),
+		as_dict=1,
+	)
 
 	for i, gle in enumerate(gl_entries):
 		doc.assertEqual(expected_gle[i][0], gle.account)
@@ -1275,45 +1542,55 @@
 		doc.assertEqual(expected_gle[i][2], gle.credit)
 		doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
 
+
 def update_tax_witholding_category(company, account):
 	from erpnext.accounts.utils import get_fiscal_year
 
 	fiscal_year = get_fiscal_year(date=nowdate())
 
-	if not frappe.db.get_value('Tax Withholding Rate',
-		{'parent': 'TDS - 194 - Dividends - Individual', 'from_date': ('>=', fiscal_year[1]),
-			'to_date': ('<=', fiscal_year[2])}):
-		tds_category = frappe.get_doc('Tax Withholding Category', 'TDS - 194 - Dividends - Individual')
-		tds_category.set('rates', [])
+	if not frappe.db.get_value(
+		"Tax Withholding Rate",
+		{
+			"parent": "TDS - 194 - Dividends - Individual",
+			"from_date": (">=", fiscal_year[1]),
+			"to_date": ("<=", fiscal_year[2]),
+		},
+	):
+		tds_category = frappe.get_doc("Tax Withholding Category", "TDS - 194 - Dividends - Individual")
+		tds_category.set("rates", [])
 
-		tds_category.append('rates', {
-			'from_date': fiscal_year[1],
-			'to_date': fiscal_year[2],
-			'tax_withholding_rate': 10,
-			'single_threshold': 2500,
-			'cumulative_threshold': 0
-		})
+		tds_category.append(
+			"rates",
+			{
+				"from_date": fiscal_year[1],
+				"to_date": fiscal_year[2],
+				"tax_withholding_rate": 10,
+				"single_threshold": 2500,
+				"cumulative_threshold": 0,
+			},
+		)
 		tds_category.save()
 
-	if not frappe.db.get_value('Tax Withholding Account',
-		{'parent': 'TDS - 194 - Dividends - Individual', 'account': account}):
-		tds_category = frappe.get_doc('Tax Withholding Category', 'TDS - 194 - Dividends - Individual')
-		tds_category.append('accounts', {
-			'company': company,
-			'account': account
-		})
+	if not frappe.db.get_value(
+		"Tax Withholding Account", {"parent": "TDS - 194 - Dividends - Individual", "account": account}
+	):
+		tds_category = frappe.get_doc("Tax Withholding Category", "TDS - 194 - Dividends - Individual")
+		tds_category.append("accounts", {"company": company, "account": account})
 		tds_category.save()
 
+
 def unlink_payment_on_cancel_of_invoice(enable=1):
 	accounts_settings = frappe.get_doc("Accounts Settings")
 	accounts_settings.unlink_payment_on_cancellation_of_invoice = enable
 	accounts_settings.save()
 
+
 def enable_discount_accounting(enable=1):
 	accounts_settings = frappe.get_doc("Accounts Settings")
 	accounts_settings.enable_discount_accounting = enable
 	accounts_settings.save()
 
+
 def make_purchase_invoice(**args):
 	pi = frappe.new_doc("Purchase Invoice")
 	args = frappe._dict(args)
@@ -1326,7 +1603,7 @@
 		pi.is_paid = 1
 
 	if args.cash_bank_account:
-		pi.cash_bank_account=args.cash_bank_account
+		pi.cash_bank_account = args.cash_bank_account
 
 	pi.company = args.company or "_Test Company"
 	pi.supplier = args.supplier or "_Test Supplier"
@@ -1338,27 +1615,30 @@
 	pi.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC"
 	pi.cost_center = args.parent_cost_center
 
-	pi.append("items", {
-		"item_code": args.item or args.item_code or "_Test Item",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty or 5,
-		"received_qty": args.received_qty or 0,
-		"rejected_qty": args.rejected_qty or 0,
-		"rate": args.rate or 50,
-		"price_list_rate": args.price_list_rate or 50,
-		"expense_account": args.expense_account or '_Test Account Cost for Goods Sold - _TC',
-		"discount_account": args.discount_account or None,
-		"discount_amount": args.discount_amount or 0,
-		"conversion_factor": 1.0,
-		"serial_no": args.serial_no,
-		"stock_uom": args.uom or "_Test UOM",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"project": args.project,
-		"rejected_warehouse": args.rejected_warehouse or "",
-		"rejected_serial_no": args.rejected_serial_no or "",
-		"asset_location": args.location or "",
-		"allow_zero_valuation_rate": args.get("allow_zero_valuation_rate") or 0
-	})
+	pi.append(
+		"items",
+		{
+			"item_code": args.item or args.item_code or "_Test Item",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty or 5,
+			"received_qty": args.received_qty or 0,
+			"rejected_qty": args.rejected_qty or 0,
+			"rate": args.rate or 50,
+			"price_list_rate": args.price_list_rate or 50,
+			"expense_account": args.expense_account or "_Test Account Cost for Goods Sold - _TC",
+			"discount_account": args.discount_account or None,
+			"discount_amount": args.discount_amount or 0,
+			"conversion_factor": 1.0,
+			"serial_no": args.serial_no,
+			"stock_uom": args.uom or "_Test UOM",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"project": args.project,
+			"rejected_warehouse": args.rejected_warehouse or "",
+			"rejected_serial_no": args.rejected_serial_no or "",
+			"asset_location": args.location or "",
+			"allow_zero_valuation_rate": args.get("allow_zero_valuation_rate") or 0,
+		},
+	)
 
 	if args.get_taxes_and_charges:
 		taxes = get_taxes()
@@ -1371,6 +1651,7 @@
 			pi.submit()
 	return pi
 
+
 def make_purchase_invoice_against_cost_center(**args):
 	pi = frappe.new_doc("Purchase Invoice")
 	args = frappe._dict(args)
@@ -1383,7 +1664,7 @@
 		pi.is_paid = 1
 
 	if args.cash_bank_account:
-		pi.cash_bank_account=args.cash_bank_account
+		pi.cash_bank_account = args.cash_bank_account
 
 	pi.company = args.company or "_Test Company"
 	pi.cost_center = args.cost_center or "_Test Cost Center - _TC"
@@ -1397,25 +1678,29 @@
 	if args.supplier_warehouse:
 		pi.supplier_warehouse = "_Test Warehouse 1 - _TC"
 
-	pi.append("items", {
-		"item_code": args.item or args.item_code or "_Test Item",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty or 5,
-		"received_qty": args.received_qty or 0,
-		"rejected_qty": args.rejected_qty or 0,
-		"rate": args.rate or 50,
-		"conversion_factor": 1.0,
-		"serial_no": args.serial_no,
-		"stock_uom": "_Test UOM",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"project": args.project,
-		"rejected_warehouse": args.rejected_warehouse or "",
-		"rejected_serial_no": args.rejected_serial_no or ""
-	})
+	pi.append(
+		"items",
+		{
+			"item_code": args.item or args.item_code or "_Test Item",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty or 5,
+			"received_qty": args.received_qty or 0,
+			"rejected_qty": args.rejected_qty or 0,
+			"rate": args.rate or 50,
+			"conversion_factor": 1.0,
+			"serial_no": args.serial_no,
+			"stock_uom": "_Test UOM",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"project": args.project,
+			"rejected_warehouse": args.rejected_warehouse or "",
+			"rejected_serial_no": args.rejected_serial_no or "",
+		},
+	)
 	if not args.do_not_save:
 		pi.insert()
 		if not args.do_not_submit:
 			pi.submit()
 	return pi
 
-test_records = frappe.get_test_records('Purchase Invoice')
+
+test_records = frappe.get_test_records("Purchase Invoice")
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.py b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.py
index f5eb404..70d29bf 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.py
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.py
@@ -16,5 +16,5 @@
 
 	def autoname(self):
 		if self.company and self.title:
-			abbr = frappe.get_cached_value('Company',  self.company,  'abbr')
-			self.name = '{0} - {1}'.format(self.title, abbr)
+			abbr = frappe.get_cached_value("Company", self.company, "abbr")
+			self.name = "{0} - {1}".format(self.title, abbr)
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template_dashboard.py b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template_dashboard.py
index 3176556..1f0ea21 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template_dashboard.py
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template_dashboard.py
@@ -3,18 +3,15 @@
 
 def get_data():
 	return {
-		'fieldname': 'taxes_and_charges',
-		'non_standard_fieldnames': {
-			'Tax Rule': 'purchase_tax_template',
+		"fieldname": "taxes_and_charges",
+		"non_standard_fieldnames": {
+			"Tax Rule": "purchase_tax_template",
 		},
-		'transactions': [
+		"transactions": [
 			{
-				'label': _('Transactions'),
-				'items': ['Purchase Invoice', 'Purchase Order', 'Purchase Receipt']
+				"label": _("Transactions"),
+				"items": ["Purchase Invoice", "Purchase Order", "Purchase Receipt"],
 			},
-			{
-				'label': _('References'),
-				'items': ['Supplier Quotation', 'Tax Rule']
-			}
-		]
+			{"label": _("References"), "items": ["Supplier Quotation", "Tax Rule"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py
index b5b4a67..1d02f05 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Purchase Taxes and Charges Template')
 
+
 class TestPurchaseTaxesandChargesTemplate(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 9433489..7d98c22 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -49,27 +49,28 @@
 	update_serial_nos_after_submit,
 )
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class SalesInvoice(SellingController):
 	def __init__(self, *args, **kwargs):
 		super(SalesInvoice, self).__init__(*args, **kwargs)
-		self.status_updater = [{
-			'source_dt': 'Sales Invoice Item',
-			'target_field': 'billed_amt',
-			'target_ref_field': 'amount',
-			'target_dt': 'Sales Order Item',
-			'join_field': 'so_detail',
-			'target_parent_dt': 'Sales Order',
-			'target_parent_field': 'per_billed',
-			'source_field': 'amount',
-			'percent_join_field': 'sales_order',
-			'status_field': 'billing_status',
-			'keyword': 'Billed',
-			'overflow_type': 'billing'
-		}]
+		self.status_updater = [
+			{
+				"source_dt": "Sales Invoice Item",
+				"target_field": "billed_amt",
+				"target_ref_field": "amount",
+				"target_dt": "Sales Order Item",
+				"join_field": "so_detail",
+				"target_parent_dt": "Sales Order",
+				"target_parent_field": "per_billed",
+				"source_field": "amount",
+				"percent_join_field": "sales_order",
+				"status_field": "billing_status",
+				"keyword": "Billed",
+				"overflow_type": "billing",
+			}
+		]
 
 	def set_indicator(self):
 		"""Set indicator for portal"""
@@ -114,7 +115,9 @@
 		self.validate_item_cost_centers()
 		self.validate_income_account()
 
-		validate_inter_company_party(self.doctype, self.customer, self.company, self.inter_company_invoice_reference)
+		validate_inter_company_party(
+			self.doctype, self.customer, self.company, self.inter_company_invoice_reference
+		)
 
 		if cint(self.is_pos):
 			self.validate_pos()
@@ -130,15 +133,21 @@
 		validate_service_stop_date(self)
 
 		if not self.is_opening:
-			self.is_opening = 'No'
+			self.is_opening = "No"
 
-		if self._action != 'submit' and self.update_stock and not self.is_return:
-			set_batch_nos(self, 'warehouse', True)
+		if self._action != "submit" and self.update_stock and not self.is_return:
+			set_batch_nos(self, "warehouse", True)
 
 		if self.redeem_loyalty_points:
-			lp = frappe.get_doc('Loyalty Program', self.loyalty_program)
-			self.loyalty_redemption_account = lp.expense_account if not self.loyalty_redemption_account else self.loyalty_redemption_account
-			self.loyalty_redemption_cost_center = lp.cost_center if not self.loyalty_redemption_cost_center else self.loyalty_redemption_cost_center
+			lp = frappe.get_doc("Loyalty Program", self.loyalty_program)
+			self.loyalty_redemption_account = (
+				lp.expense_account if not self.loyalty_redemption_account else self.loyalty_redemption_account
+			)
+			self.loyalty_redemption_cost_center = (
+				lp.cost_center
+				if not self.loyalty_redemption_cost_center
+				else self.loyalty_redemption_cost_center
+			)
 
 		self.set_against_income_account()
 		self.validate_c_form()
@@ -155,11 +164,16 @@
 		if self.is_pos and not self.is_return:
 			self.verify_payment_amount_is_positive()
 
-		#validate amount in mode of payments for returned invoices for pos must be negative
+		# validate amount in mode of payments for returned invoices for pos must be negative
 		if self.is_pos and self.is_return:
 			self.verify_payment_amount_is_negative()
 
-		if self.redeem_loyalty_points and self.loyalty_program and self.loyalty_points and not self.is_consolidated:
+		if (
+			self.redeem_loyalty_points
+			and self.loyalty_program
+			and self.loyalty_points
+			and not self.is_consolidated
+		):
 			validate_loyalty_points(self, self.loyalty_points)
 
 		self.reset_default_field_value("set_warehouse", "items", "warehouse")
@@ -172,18 +186,28 @@
 					if self.update_stock:
 						frappe.throw(_("'Update Stock' cannot be checked for fixed asset sale"))
 
-					elif asset.status in ("Scrapped", "Cancelled") or (asset.status == "Sold" and not self.is_return):
-						frappe.throw(_("Row #{0}: Asset {1} cannot be submitted, it is already {2}").format(d.idx, d.asset, asset.status))
+					elif asset.status in ("Scrapped", "Cancelled") or (
+						asset.status == "Sold" and not self.is_return
+					):
+						frappe.throw(
+							_("Row #{0}: Asset {1} cannot be submitted, it is already {2}").format(
+								d.idx, d.asset, asset.status
+							)
+						)
 
 	def validate_item_cost_centers(self):
 		for item in self.items:
 			cost_center_company = frappe.get_cached_value("Cost Center", item.cost_center, "company")
 			if cost_center_company != self.company:
-				frappe.throw(_("Row #{0}: Cost Center {1} does not belong to company {2}").format(frappe.bold(item.idx), frappe.bold(item.cost_center), frappe.bold(self.company)))
+				frappe.throw(
+					_("Row #{0}: Cost Center {1} does not belong to company {2}").format(
+						frappe.bold(item.idx), frappe.bold(item.cost_center), frappe.bold(self.company)
+					)
+				)
 
 	def validate_income_account(self):
-		for item in self.get('items'):
-			validate_account_head(item.idx, item.income_account, self.company, 'Income')
+		for item in self.get("items"):
+			validate_account_head(item.idx, item.income_account, self.company, "Income")
 
 	def set_tax_withholding(self):
 		tax_withholding_details = get_party_tax_withholding_details(self)
@@ -202,8 +226,11 @@
 		if not accounts or tax_withholding_account not in accounts:
 			self.append("taxes", tax_withholding_details)
 
-		to_remove = [d for d in self.taxes
-			if not d.tax_amount and d.charge_type == "Actual" and d.account_head == tax_withholding_account]
+		to_remove = [
+			d
+			for d in self.taxes
+			if not d.tax_amount and d.charge_type == "Actual" and d.account_head == tax_withholding_account
+		]
 
 		for d in to_remove:
 			self.remove(d)
@@ -218,8 +245,9 @@
 		self.validate_pos_paid_amount()
 
 		if not self.auto_repeat:
-			frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
-				self.company, self.base_grand_total, self)
+			frappe.get_doc("Authorization Control").validate_approving_authority(
+				self.doctype, self.company, self.base_grand_total, self
+			)
 
 		self.check_prev_docstatus()
 
@@ -239,7 +267,6 @@
 		if self.is_return and self.update_stock:
 			update_serial_nos_after_submit(self, "items")
 
-
 		# this sequence because outstanding may get -ve
 		self.make_gl_entries()
 
@@ -258,7 +285,9 @@
 
 		self.update_time_sheet(self.name)
 
-		if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction":
+		if (
+			frappe.db.get_single_value("Selling Settings", "sales_update_frequency") == "Each Transaction"
+		):
 			update_company_current_month_sales(self.company)
 			self.update_project()
 		update_linked_doc(self.doctype, self.name, self.inter_company_invoice_reference)
@@ -266,7 +295,9 @@
 		# create the loyalty point ledger entry if the customer is enrolled in any loyalty program
 		if not self.is_return and not self.is_consolidated and self.loyalty_program:
 			self.make_loyalty_point_entry()
-		elif self.is_return and self.return_against and not self.is_consolidated and self.loyalty_program:
+		elif (
+			self.is_return and self.return_against and not self.is_consolidated and self.loyalty_program
+		):
 			against_si_doc = frappe.get_doc("Sales Invoice", self.return_against)
 			against_si_doc.delete_loyalty_point_entry()
 			against_si_doc.make_loyalty_point_entry()
@@ -295,16 +326,16 @@
 	def check_if_consolidated_invoice(self):
 		# since POS Invoice extends Sales Invoice, we explicitly check if doctype is Sales Invoice
 		if self.doctype == "Sales Invoice" and self.is_consolidated:
-			invoice_or_credit_note = "consolidated_credit_note" if self.is_return else "consolidated_invoice"
+			invoice_or_credit_note = (
+				"consolidated_credit_note" if self.is_return else "consolidated_invoice"
+			)
 			pos_closing_entry = frappe.get_all(
-				"POS Invoice Merge Log",
-				filters={ invoice_or_credit_note: self.name },
-				pluck="pos_closing_entry"
+				"POS Invoice Merge Log", filters={invoice_or_credit_note: self.name}, pluck="pos_closing_entry"
 			)
 			if pos_closing_entry and pos_closing_entry[0]:
 				msg = _("To cancel a {} you need to cancel the POS Closing Entry {}.").format(
 					frappe.bold("Consolidated Sales Invoice"),
-					get_link_to_form("POS Closing Entry", pos_closing_entry[0])
+					get_link_to_form("POS Closing Entry", pos_closing_entry[0]),
 				)
 				frappe.throw(msg, title=_("Not Allowed"))
 
@@ -346,14 +377,18 @@
 		if self.update_stock == 1:
 			self.repost_future_sle_and_gle()
 
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 
-		if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction":
+		if (
+			frappe.db.get_single_value("Selling Settings", "sales_update_frequency") == "Each Transaction"
+		):
 			update_company_current_month_sales(self.company)
 			self.update_project()
 		if not self.is_return and not self.is_consolidated and self.loyalty_program:
 			self.delete_loyalty_point_entry()
-		elif self.is_return and self.return_against and not self.is_consolidated and self.loyalty_program:
+		elif (
+			self.is_return and self.return_against and not self.is_consolidated and self.loyalty_program
+		):
 			against_si_doc = frappe.get_doc("Sales Invoice", self.return_against)
 			against_si_doc.delete_loyalty_point_entry()
 			against_si_doc.make_loyalty_point_entry()
@@ -361,50 +396,56 @@
 		unlink_inter_company_doc(self.doctype, self.name, self.inter_company_invoice_reference)
 
 		self.unlink_sales_invoice_from_timesheets()
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry', 'Repost Item Valuation')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
 
 	def update_status_updater_args(self):
 		if cint(self.update_stock):
-			self.status_updater.append({
-				'source_dt':'Sales Invoice Item',
-				'target_dt':'Sales Order Item',
-				'target_parent_dt':'Sales Order',
-				'target_parent_field':'per_delivered',
-				'target_field':'delivered_qty',
-				'target_ref_field':'qty',
-				'source_field':'qty',
-				'join_field':'so_detail',
-				'percent_join_field':'sales_order',
-				'status_field':'delivery_status',
-				'keyword':'Delivered',
-				'second_source_dt': 'Delivery Note Item',
-				'second_source_field': 'qty',
-				'second_join_field': 'so_detail',
-				'overflow_type': 'delivery',
-				'extra_cond': """ and exists(select name from `tabSales Invoice`
-					where name=`tabSales Invoice Item`.parent and update_stock = 1)"""
-			})
+			self.status_updater.append(
+				{
+					"source_dt": "Sales Invoice Item",
+					"target_dt": "Sales Order Item",
+					"target_parent_dt": "Sales Order",
+					"target_parent_field": "per_delivered",
+					"target_field": "delivered_qty",
+					"target_ref_field": "qty",
+					"source_field": "qty",
+					"join_field": "so_detail",
+					"percent_join_field": "sales_order",
+					"status_field": "delivery_status",
+					"keyword": "Delivered",
+					"second_source_dt": "Delivery Note Item",
+					"second_source_field": "qty",
+					"second_join_field": "so_detail",
+					"overflow_type": "delivery",
+					"extra_cond": """ and exists(select name from `tabSales Invoice`
+					where name=`tabSales Invoice Item`.parent and update_stock = 1)""",
+				}
+			)
 			if cint(self.is_return):
-				self.status_updater.append({
-					'source_dt': 'Sales Invoice Item',
-					'target_dt': 'Sales Order Item',
-					'join_field': 'so_detail',
-					'target_field': 'returned_qty',
-					'target_parent_dt': 'Sales Order',
-					'source_field': '-1 * qty',
-					'second_source_dt': 'Delivery Note Item',
-					'second_source_field': '-1 * qty',
-					'second_join_field': 'so_detail',
-					'extra_cond': """ and exists (select name from `tabSales Invoice` where name=`tabSales Invoice Item`.parent and update_stock=1 and is_return=1)"""
-				})
+				self.status_updater.append(
+					{
+						"source_dt": "Sales Invoice Item",
+						"target_dt": "Sales Order Item",
+						"join_field": "so_detail",
+						"target_field": "returned_qty",
+						"target_parent_dt": "Sales Order",
+						"source_field": "-1 * qty",
+						"second_source_dt": "Delivery Note Item",
+						"second_source_field": "-1 * qty",
+						"second_join_field": "so_detail",
+						"extra_cond": """ and exists (select name from `tabSales Invoice` where name=`tabSales Invoice Item`.parent and update_stock=1 and is_return=1)""",
+					}
+				)
 
 	def check_credit_limit(self):
 		from erpnext.selling.doctype.customer.customer import check_credit_limit
 
 		validate_against_credit_limit = False
-		bypass_credit_limit_check_at_sales_order = frappe.db.get_value("Customer Credit Limit",
-			filters={'parent': self.customer, 'parenttype': 'Customer', 'company': self.company},
-			fieldname=["bypass_credit_limit_check"])
+		bypass_credit_limit_check_at_sales_order = frappe.db.get_value(
+			"Customer Credit Limit",
+			filters={"parent": self.customer, "parenttype": "Customer", "company": self.company},
+			fieldname=["bypass_credit_limit_check"],
+		)
 
 		if bypass_credit_limit_check_at_sales_order:
 			validate_against_credit_limit = True
@@ -418,7 +459,7 @@
 
 	def unlink_sales_invoice_from_timesheets(self):
 		for row in self.timesheets:
-			timesheet = frappe.get_doc('Timesheet', row.time_sheet)
+			timesheet = frappe.get_doc("Timesheet", row.time_sheet)
 			for time_log in timesheet.time_logs:
 				if time_log.sales_invoice == self.name:
 					time_log.sales_invoice = None
@@ -434,15 +475,17 @@
 
 		if not self.debit_to:
 			self.debit_to = get_party_account("Customer", self.customer, self.company)
-			self.party_account_currency = frappe.db.get_value("Account", self.debit_to, "account_currency", cache=True)
+			self.party_account_currency = frappe.db.get_value(
+				"Account", self.debit_to, "account_currency", cache=True
+			)
 		if not self.due_date and self.customer:
 			self.due_date = get_due_date(self.posting_date, "Customer", self.customer, self.company)
 
 		super(SalesInvoice, self).set_missing_values(for_validate)
 
 		print_format = pos.get("print_format") if pos else None
-		if not print_format and not cint(frappe.db.get_value('Print Format', 'POS Invoice', 'disabled')):
-			print_format = 'POS Invoice'
+		if not print_format and not cint(frappe.db.get_value("Print Format", "POS Invoice", "disabled")):
+			print_format = "POS Invoice"
 
 		if pos:
 			return {
@@ -450,7 +493,7 @@
 				"allow_edit_rate": pos.get("allow_user_to_edit_rate"),
 				"allow_edit_discount": pos.get("allow_user_to_edit_discount"),
 				"campaign": pos.get("campaign"),
-				"allow_print_before_pay": pos.get("allow_print_before_pay")
+				"allow_print_before_pay": pos.get("allow_print_before_pay"),
 			}
 
 	def update_time_sheet(self, sales_invoice):
@@ -466,9 +509,11 @@
 
 	def update_time_sheet_detail(self, timesheet, args, sales_invoice):
 		for data in timesheet.time_logs:
-			if (self.project and args.timesheet_detail == data.name) or \
-				(not self.project and not data.sales_invoice) or \
-				(not sales_invoice and data.sales_invoice == self.name):
+			if (
+				(self.project and args.timesheet_detail == data.name)
+				or (not self.project and not data.sales_invoice)
+				or (not sales_invoice and data.sales_invoice == self.name)
+			):
 				data.sales_invoice = sales_invoice
 
 	def on_update(self):
@@ -478,7 +523,7 @@
 		paid_amount = 0.0
 		base_paid_amount = 0.0
 		for data in self.payments:
-			data.base_amount = flt(data.amount*self.conversion_rate, self.precision("base_paid_amount"))
+			data.base_amount = flt(data.amount * self.conversion_rate, self.precision("base_paid_amount"))
 			paid_amount += data.amount
 			base_paid_amount += data.base_amount
 
@@ -489,7 +534,7 @@
 		for data in self.timesheets:
 			if data.time_sheet:
 				status = frappe.db.get_value("Timesheet", data.time_sheet, "status")
-				if status not in ['Submitted', 'Payslip']:
+				if status not in ["Submitted", "Payslip"]:
 					frappe.throw(_("Timesheet {0} is already completed or cancelled").format(data.time_sheet))
 
 	def set_pos_fields(self, for_validate=False):
@@ -498,20 +543,23 @@
 			return
 
 		if not self.account_for_change_amount:
-			self.account_for_change_amount = frappe.get_cached_value('Company',  self.company,  'default_cash_account')
+			self.account_for_change_amount = frappe.get_cached_value(
+				"Company", self.company, "default_cash_account"
+			)
 
 		from erpnext.stock.get_item_details import get_pos_profile, get_pos_profile_item_details
+
 		if not self.pos_profile and not self.flags.ignore_pos_profile:
 			pos_profile = get_pos_profile(self.company) or {}
 			if not pos_profile:
 				return
-			self.pos_profile = pos_profile.get('name')
+			self.pos_profile = pos_profile.get("name")
 
 		pos = {}
 		if self.pos_profile:
-			pos = frappe.get_doc('POS Profile', self.pos_profile)
+			pos = frappe.get_doc("POS Profile", self.pos_profile)
 
-		if not self.get('payments') and not for_validate:
+		if not self.get("payments") and not for_validate:
 			update_multi_mode_option(self, pos)
 
 		if pos:
@@ -524,35 +572,52 @@
 			if not for_validate:
 				self.ignore_pricing_rule = pos.ignore_pricing_rule
 
-			if pos.get('account_for_change_amount'):
-				self.account_for_change_amount = pos.get('account_for_change_amount')
+			if pos.get("account_for_change_amount"):
+				self.account_for_change_amount = pos.get("account_for_change_amount")
 
-			for fieldname in ('currency', 'letter_head', 'tc_name',
-				'company', 'select_print_heading', 'write_off_account', 'taxes_and_charges',
-				'write_off_cost_center', 'apply_discount_on', 'cost_center'):
-					if (not for_validate) or (for_validate and not self.get(fieldname)):
-						self.set(fieldname, pos.get(fieldname))
+			for fieldname in (
+				"currency",
+				"letter_head",
+				"tc_name",
+				"company",
+				"select_print_heading",
+				"write_off_account",
+				"taxes_and_charges",
+				"write_off_cost_center",
+				"apply_discount_on",
+				"cost_center",
+			):
+				if (not for_validate) or (for_validate and not self.get(fieldname)):
+					self.set(fieldname, pos.get(fieldname))
 
 			if pos.get("company_address"):
 				self.company_address = pos.get("company_address")
 
 			if self.customer:
-				customer_price_list, customer_group = frappe.get_value("Customer", self.customer, ['default_price_list', 'customer_group'])
-				customer_group_price_list = frappe.get_value("Customer Group", customer_group, 'default_price_list')
-				selling_price_list = customer_price_list or customer_group_price_list or pos.get('selling_price_list')
+				customer_price_list, customer_group = frappe.get_value(
+					"Customer", self.customer, ["default_price_list", "customer_group"]
+				)
+				customer_group_price_list = frappe.get_value(
+					"Customer Group", customer_group, "default_price_list"
+				)
+				selling_price_list = (
+					customer_price_list or customer_group_price_list or pos.get("selling_price_list")
+				)
 			else:
-				selling_price_list = pos.get('selling_price_list')
+				selling_price_list = pos.get("selling_price_list")
 
 			if selling_price_list:
-				self.set('selling_price_list', selling_price_list)
+				self.set("selling_price_list", selling_price_list)
 
 			if not for_validate:
 				self.update_stock = cint(pos.get("update_stock"))
 
 			# set pos values in items
 			for item in self.get("items"):
-				if item.get('item_code'):
-					profile_details = get_pos_profile_item_details(pos, frappe._dict(item.as_dict()), pos, update_data=True)
+				if item.get("item_code"):
+					profile_details = get_pos_profile_item_details(
+						pos, frappe._dict(item.as_dict()), pos, update_data=True
+					)
 					for fname, val in profile_details.items():
 						if (not for_validate) or (for_validate and not item.get(fname)):
 							item.set(fname, val)
@@ -576,22 +641,29 @@
 			if not self.debit_to:
 				self.raise_missing_debit_credit_account_error("Customer", self.customer)
 
-		account = frappe.get_cached_value("Account", self.debit_to,
-			["account_type", "report_type", "account_currency"], as_dict=True)
+		account = frappe.get_cached_value(
+			"Account", self.debit_to, ["account_type", "report_type", "account_currency"], as_dict=True
+		)
 
 		if not account:
 			frappe.throw(_("Debit To is required"), title=_("Account Missing"))
 
 		if account.report_type != "Balance Sheet":
-			msg = _("Please ensure {} account is a Balance Sheet account.").format(frappe.bold("Debit To")) + " "
-			msg += _("You can change the parent account to a Balance Sheet account or select a different account.")
+			msg = (
+				_("Please ensure {} account is a Balance Sheet account.").format(frappe.bold("Debit To")) + " "
+			)
+			msg += _(
+				"You can change the parent account to a Balance Sheet account or select a different account."
+			)
 			frappe.throw(msg, title=_("Invalid Account"))
 
 		if self.customer and account.account_type != "Receivable":
-			msg = _("Please ensure {} account {} is a Receivable account.").format(
-				frappe.bold("Debit To"),
-				frappe.bold(self.debit_to)
-			) + " "
+			msg = (
+				_("Please ensure {} account {} is a Receivable account.").format(
+					frappe.bold("Debit To"), frappe.bold(self.debit_to)
+				)
+				+ " "
+			)
 			msg += _("Change the account type to Receivable or select a different account.")
 			frappe.throw(msg, title=_("Invalid Account"))
 
@@ -600,52 +672,60 @@
 	def clear_unallocated_mode_of_payments(self):
 		self.set("payments", self.get("payments", {"amount": ["not in", [0, None, ""]]}))
 
-		frappe.db.sql("""delete from `tabSales Invoice Payment` where parent = %s
-			and amount = 0""", self.name)
+		frappe.db.sql(
+			"""delete from `tabSales Invoice Payment` where parent = %s
+			and amount = 0""",
+			self.name,
+		)
 
 	def validate_with_previous_doc(self):
-		super(SalesInvoice, self).validate_with_previous_doc({
-			"Sales Order": {
-				"ref_dn_field": "sales_order",
-				"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]]
-			},
-			"Sales Order Item": {
-				"ref_dn_field": "so_detail",
-				"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
-				"is_child_table": True,
-				"allow_duplicate_prev_row_id": True
-			},
-			"Delivery Note": {
-				"ref_dn_field": "delivery_note",
-				"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]]
-			},
-			"Delivery Note Item": {
-				"ref_dn_field": "dn_detail",
-				"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
-				"is_child_table": True,
-				"allow_duplicate_prev_row_id": True
-			},
-		})
+		super(SalesInvoice, self).validate_with_previous_doc(
+			{
+				"Sales Order": {
+					"ref_dn_field": "sales_order",
+					"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]],
+				},
+				"Sales Order Item": {
+					"ref_dn_field": "so_detail",
+					"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
+					"is_child_table": True,
+					"allow_duplicate_prev_row_id": True,
+				},
+				"Delivery Note": {
+					"ref_dn_field": "delivery_note",
+					"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]],
+				},
+				"Delivery Note Item": {
+					"ref_dn_field": "dn_detail",
+					"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
+					"is_child_table": True,
+					"allow_duplicate_prev_row_id": True,
+				},
+			}
+		)
 
-		if cint(frappe.db.get_single_value('Selling Settings', 'maintain_same_sales_rate')) and not self.is_return:
-			self.validate_rate_with_reference_doc([
-				["Sales Order", "sales_order", "so_detail"],
-				["Delivery Note", "delivery_note", "dn_detail"]
-			])
+		if (
+			cint(frappe.db.get_single_value("Selling Settings", "maintain_same_sales_rate"))
+			and not self.is_return
+		):
+			self.validate_rate_with_reference_doc(
+				[["Sales Order", "sales_order", "so_detail"], ["Delivery Note", "delivery_note", "dn_detail"]]
+			)
 
 	def set_against_income_account(self):
 		"""Set against account for debit to account"""
 		against_acc = []
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.income_account and d.income_account not in against_acc:
 				against_acc.append(d.income_account)
-		self.against_income_account = ','.join(against_acc)
+		self.against_income_account = ",".join(against_acc)
 
 	def add_remarks(self):
 		if not self.remarks:
 			if self.po_no and self.po_date:
-				self.remarks = _("Against Customer Order {0} dated {1}").format(self.po_no,
-					formatdate(self.po_date))
+				self.remarks = _("Against Customer Order {0} dated {1}").format(
+					self.po_no, formatdate(self.po_date)
+				)
 			else:
 				self.remarks = _("No Remarks")
 
@@ -661,36 +741,41 @@
 		if self.is_return:
 			return
 
-		prev_doc_field_map = {'Sales Order': ['so_required', 'is_pos'],'Delivery Note': ['dn_required', 'update_stock']}
+		prev_doc_field_map = {
+			"Sales Order": ["so_required", "is_pos"],
+			"Delivery Note": ["dn_required", "update_stock"],
+		}
 		for key, value in prev_doc_field_map.items():
-			if frappe.db.get_single_value('Selling Settings', value[0]) == 'Yes':
+			if frappe.db.get_single_value("Selling Settings", value[0]) == "Yes":
 
-				if frappe.get_value('Customer', self.customer, value[0]):
+				if frappe.get_value("Customer", self.customer, value[0]):
 					continue
 
-				for d in self.get('items'):
-					if (d.item_code and not d.get(key.lower().replace(' ', '_')) and not self.get(value[1])):
+				for d in self.get("items"):
+					if d.item_code and not d.get(key.lower().replace(" ", "_")) and not self.get(value[1]):
 						msgprint(_("{0} is mandatory for Item {1}").format(key, d.item_code), raise_exception=1)
 
-
 	def validate_proj_cust(self):
 		"""check for does customer belong to same project as entered.."""
 		if self.project and self.customer:
-			res = frappe.db.sql("""select name from `tabProject`
+			res = frappe.db.sql(
+				"""select name from `tabProject`
 				where name = %s and (customer = %s or customer is null or customer = '')""",
-				(self.project, self.customer))
+				(self.project, self.customer),
+			)
 			if not res:
-				throw(_("Customer {0} does not belong to project {1}").format(self.customer,self.project))
+				throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project))
 
 	def validate_pos(self):
 		if self.is_return:
 			invoice_total = self.rounded_total or self.grand_total
-			if flt(self.paid_amount) + flt(self.write_off_amount) - flt(invoice_total) > \
-				1.0/(10.0**(self.precision("grand_total") + 1.0)):
-					frappe.throw(_("Paid amount + Write Off Amount can not be greater than Grand Total"))
+			if flt(self.paid_amount) + flt(self.write_off_amount) - flt(invoice_total) > 1.0 / (
+				10.0 ** (self.precision("grand_total") + 1.0)
+			):
+				frappe.throw(_("Paid amount + Write Off Amount can not be greater than Grand Total"))
 
 	def validate_item_code(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if not d.item_code and self.is_opening == "No":
 				msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True)
 
@@ -698,17 +783,24 @@
 		super(SalesInvoice, self).validate_warehouse()
 
 		for d in self.get_item_list():
-			if not d.warehouse and d.item_code and frappe.get_cached_value("Item", d.item_code, "is_stock_item"):
+			if (
+				not d.warehouse
+				and d.item_code
+				and frappe.get_cached_value("Item", d.item_code, "is_stock_item")
+			):
 				frappe.throw(_("Warehouse required for stock Item {0}").format(d.item_code))
 
 	def validate_delivery_note(self):
 		for d in self.get("items"):
 			if d.delivery_note:
-				msgprint(_("Stock cannot be updated against Delivery Note {0}").format(d.delivery_note), raise_exception=1)
+				msgprint(
+					_("Stock cannot be updated against Delivery Note {0}").format(d.delivery_note),
+					raise_exception=1,
+				)
 
 	def validate_write_off_account(self):
 		if flt(self.write_off_amount) and not self.write_off_account:
-			self.write_off_account = frappe.get_cached_value('Company',  self.company,  'write_off_account')
+			self.write_off_account = frappe.get_cached_value("Company", self.company, "write_off_account")
 
 		if flt(self.write_off_amount) and not self.write_off_account:
 			msgprint(_("Please enter Write Off Account"), raise_exception=1)
@@ -718,18 +810,23 @@
 			msgprint(_("Please enter Account for Change Amount"), raise_exception=1)
 
 	def validate_c_form(self):
-		""" Blank C-form no if C-form applicable marked as 'No'"""
-		if self.amended_from and self.c_form_applicable == 'No' and self.c_form_no:
-			frappe.db.sql("""delete from `tabC-Form Invoice Detail` where invoice_no = %s
-					and parent = %s""", (self.amended_from,	self.c_form_no))
+		"""Blank C-form no if C-form applicable marked as 'No'"""
+		if self.amended_from and self.c_form_applicable == "No" and self.c_form_no:
+			frappe.db.sql(
+				"""delete from `tabC-Form Invoice Detail` where invoice_no = %s
+					and parent = %s""",
+				(self.amended_from, self.c_form_no),
+			)
 
-			frappe.db.set(self, 'c_form_no', '')
+			frappe.db.set(self, "c_form_no", "")
 
 	def validate_c_form_on_cancel(self):
-		""" Display message if C-Form no exists on cancellation of Sales Invoice"""
-		if self.c_form_applicable == 'Yes' and self.c_form_no:
-			msgprint(_("Please remove this Invoice {0} from C-Form {1}")
-				.format(self.name, self.c_form_no), raise_exception = 1)
+		"""Display message if C-Form no exists on cancellation of Sales Invoice"""
+		if self.c_form_applicable == "Yes" and self.c_form_no:
+			msgprint(
+				_("Please remove this Invoice {0} from C-Form {1}").format(self.name, self.c_form_no),
+				raise_exception=1,
+			)
 
 	def validate_dropship_item(self):
 		for item in self.items:
@@ -738,27 +835,36 @@
 					frappe.throw(_("Could not update stock, invoice contains drop shipping item."))
 
 	def update_current_stock(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.item_code and d.warehouse:
-				bin = frappe.db.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
-				d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
+				bin = frappe.db.sql(
+					"select actual_qty from `tabBin` where item_code = %s and warehouse = %s",
+					(d.item_code, d.warehouse),
+					as_dict=1,
+				)
+				d.actual_qty = bin and flt(bin[0]["actual_qty"]) or 0
 
-		for d in self.get('packed_items'):
-			bin = frappe.db.sql("select actual_qty, projected_qty from `tabBin` where item_code =	%s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
-			d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
-			d.projected_qty = bin and flt(bin[0]['projected_qty']) or 0
+		for d in self.get("packed_items"):
+			bin = frappe.db.sql(
+				"select actual_qty, projected_qty from `tabBin` where item_code =	%s and warehouse = %s",
+				(d.item_code, d.warehouse),
+				as_dict=1,
+			)
+			d.actual_qty = bin and flt(bin[0]["actual_qty"]) or 0
+			d.projected_qty = bin and flt(bin[0]["projected_qty"]) or 0
 
 	def update_packing_list(self):
 		if cint(self.update_stock) == 1:
 			from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
+
 			make_packing_list(self)
 		else:
-			self.set('packed_items', [])
+			self.set("packed_items", [])
 
 	def set_billing_hours_and_amount(self):
 		if not self.project:
 			for timesheet in self.timesheets:
-				ts_doc = frappe.get_doc('Timesheet', timesheet.time_sheet)
+				ts_doc = frappe.get_doc("Timesheet", timesheet.time_sheet)
 				if not timesheet.billing_hours and ts_doc.total_billable_hours:
 					timesheet.billing_hours = ts_doc.total_billable_hours
 
@@ -773,17 +879,20 @@
 
 	@frappe.whitelist()
 	def add_timesheet_data(self):
-		self.set('timesheets', [])
+		self.set("timesheets", [])
 		if self.project:
 			for data in get_projectwise_timesheet_data(self.project):
-				self.append('timesheets', {
-						'time_sheet': data.time_sheet,
-						'billing_hours': data.billing_hours,
-						'billing_amount': data.billing_amount,
-						'timesheet_detail': data.name,
-						'activity_type': data.activity_type,
-						'description': data.description
-					})
+				self.append(
+					"timesheets",
+					{
+						"time_sheet": data.time_sheet,
+						"billing_hours": data.billing_hours,
+						"billing_amount": data.billing_amount,
+						"timesheet_detail": data.name,
+						"activity_type": data.activity_type,
+						"description": data.description,
+					},
+				)
 
 			self.calculate_billing_amount_for_timesheet()
 
@@ -795,13 +904,19 @@
 		self.total_billing_hours = timesheet_sum("billing_hours")
 
 	def get_warehouse(self):
-		user_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile`
-			where ifnull(user,'') = %s and company = %s""", (frappe.session['user'], self.company))
+		user_pos_profile = frappe.db.sql(
+			"""select name, warehouse from `tabPOS Profile`
+			where ifnull(user,'') = %s and company = %s""",
+			(frappe.session["user"], self.company),
+		)
 		warehouse = user_pos_profile[0][1] if user_pos_profile else None
 
 		if not warehouse:
-			global_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile`
-				where (user is null or user = '') and company = %s""", self.company)
+			global_pos_profile = frappe.db.sql(
+				"""select name, warehouse from `tabPOS Profile`
+				where (user is null or user = '') and company = %s""",
+				self.company,
+			)
 
 			if global_pos_profile:
 				warehouse = global_pos_profile[0][1]
@@ -815,14 +930,16 @@
 		for d in self.get("items"):
 			if d.is_fixed_asset:
 				if not disposal_account:
-					disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(self.company)
+					disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(
+						self.company
+					)
 
 				d.income_account = disposal_account
 				if not d.cost_center:
 					d.cost_center = depreciation_cost_center
 
 	def check_prev_docstatus(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.sales_order and frappe.db.get_value("Sales Order", d.sales_order, "docstatus") != 1:
 				frappe.throw(_("Sales Order {0} is not submitted").format(d.sales_order))
 
@@ -838,22 +955,35 @@
 
 		if gl_entries:
 			# if POS and amount is written off, updating outstanding amt after posting all gl entries
-			update_outstanding = "No" if (cint(self.is_pos) or self.write_off_account or
-				cint(self.redeem_loyalty_points)) else "Yes"
+			update_outstanding = (
+				"No"
+				if (cint(self.is_pos) or self.write_off_account or cint(self.redeem_loyalty_points))
+				else "Yes"
+			)
 
 			if self.docstatus == 1:
-				make_gl_entries(gl_entries, update_outstanding=update_outstanding, merge_entries=False, from_repost=from_repost)
+				make_gl_entries(
+					gl_entries,
+					update_outstanding=update_outstanding,
+					merge_entries=False,
+					from_repost=from_repost,
+				)
 			elif self.docstatus == 2:
 				make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
 
 			if update_outstanding == "No":
 				from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
-				update_outstanding_amt(self.debit_to, "Customer", self.customer,
-					self.doctype, self.return_against if cint(self.is_return) and self.return_against else self.name)
 
-		elif self.docstatus == 2 and cint(self.update_stock) \
-			and cint(auto_accounting_for_stock):
-				make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
+				update_outstanding_amt(
+					self.debit_to,
+					"Customer",
+					self.customer,
+					self.doctype,
+					self.return_against if cint(self.is_return) and self.return_against else self.name,
+				)
+
+		elif self.docstatus == 2 and cint(self.update_stock) and cint(auto_accounting_for_stock):
+			make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
 
 	def get_gl_entries(self, warehouse_account=None):
 		from erpnext.accounts.general_ledger import merge_similar_entries
@@ -883,31 +1013,46 @@
 	def make_customer_gl_entry(self, gl_entries):
 		# Checked both rounding_adjustment and rounded_total
 		# because rounded_total had value even before introcution of posting GLE based on rounded total
-		grand_total = self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
-		base_grand_total = flt(self.base_rounded_total if (self.base_rounding_adjustment and self.base_rounded_total)
-			else self.base_grand_total, self.precision("base_grand_total"))
+		grand_total = (
+			self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
+		)
+		base_grand_total = flt(
+			self.base_rounded_total
+			if (self.base_rounding_adjustment and self.base_rounded_total)
+			else self.base_grand_total,
+			self.precision("base_grand_total"),
+		)
 
 		if grand_total and not self.is_internal_transfer():
 			# Didnot use base_grand_total to book rounding loss gle
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.debit_to,
-					"party_type": "Customer",
-					"party": self.customer,
-					"due_date": self.due_date,
-					"against": self.against_income_account,
-					"debit": base_grand_total,
-					"debit_in_account_currency": base_grand_total \
-						if self.party_account_currency==self.company_currency else grand_total,
-					"against_voucher": self.return_against if cint(self.is_return) and self.return_against else self.name,
-					"against_voucher_type": self.doctype,
-					"cost_center": self.cost_center,
-					"project": self.project
-				}, self.party_account_currency, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.debit_to,
+						"party_type": "Customer",
+						"party": self.customer,
+						"due_date": self.due_date,
+						"against": self.against_income_account,
+						"debit": base_grand_total,
+						"debit_in_account_currency": base_grand_total
+						if self.party_account_currency == self.company_currency
+						else grand_total,
+						"against_voucher": self.return_against
+						if cint(self.is_return) and self.return_against
+						else self.name,
+						"against_voucher_type": self.doctype,
+						"cost_center": self.cost_center,
+						"project": self.project,
+					},
+					self.party_account_currency,
+					item=self,
+				)
 			)
 
 	def make_tax_gl_entries(self, gl_entries):
-		enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
+		enable_discount_accounting = cint(
+			frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+		)
 
 		for tax in self.get("taxes"):
 			amount, base_amount = self.get_tax_amounts(tax, enable_discount_accounting)
@@ -915,33 +1060,45 @@
 			if flt(tax.base_tax_amount_after_discount_amount):
 				account_currency = get_account_currency(tax.account_head)
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": tax.account_head,
-						"against": self.customer,
-						"credit": flt(base_amount,
-							tax.precision("tax_amount_after_discount_amount")),
-						"credit_in_account_currency": (flt(base_amount,
-							tax.precision("base_tax_amount_after_discount_amount")) if account_currency==self.company_currency else
-							flt(amount, tax.precision("tax_amount_after_discount_amount"))),
-						"cost_center": tax.cost_center
-					}, account_currency, item=tax)
+					self.get_gl_dict(
+						{
+							"account": tax.account_head,
+							"against": self.customer,
+							"credit": flt(base_amount, tax.precision("tax_amount_after_discount_amount")),
+							"credit_in_account_currency": (
+								flt(base_amount, tax.precision("base_tax_amount_after_discount_amount"))
+								if account_currency == self.company_currency
+								else flt(amount, tax.precision("tax_amount_after_discount_amount"))
+							),
+							"cost_center": tax.cost_center,
+						},
+						account_currency,
+						item=tax,
+					)
 				)
 
 	def make_internal_transfer_gl_entries(self, gl_entries):
 		if self.is_internal_transfer() and flt(self.base_total_taxes_and_charges):
 			account_currency = get_account_currency(self.unrealized_profit_loss_account)
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.unrealized_profit_loss_account,
-					"against": self.customer,
-					"debit": flt(self.total_taxes_and_charges),
-					"debit_in_account_currency": flt(self.base_total_taxes_and_charges),
-					"cost_center": self.cost_center
-				}, account_currency, item=self))
+				self.get_gl_dict(
+					{
+						"account": self.unrealized_profit_loss_account,
+						"against": self.customer,
+						"debit": flt(self.total_taxes_and_charges),
+						"debit_in_account_currency": flt(self.base_total_taxes_and_charges),
+						"cost_center": self.cost_center,
+					},
+					account_currency,
+					item=self,
+				)
+			)
 
 	def make_item_gl_entries(self, gl_entries):
 		# income account gl entries
-		enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
+		enable_discount_accounting = cint(
+			frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+		)
 
 		for item in self.get("items"):
 			if flt(item.base_net_amount, item.precision("base_net_amount")):
@@ -949,8 +1106,9 @@
 					asset = self.get_asset(item)
 
 					if self.is_return:
-						fixed_asset_gl_entries = get_gl_entries_on_asset_regain(asset,
-							item.base_net_amount, item.finance_book)
+						fixed_asset_gl_entries = get_gl_entries_on_asset_regain(
+							asset, item.base_net_amount, item.finance_book
+						)
 						asset.db_set("disposal_date", None)
 
 						if asset.calculate_depreciation:
@@ -958,8 +1116,9 @@
 							self.reset_depreciation_schedule(asset)
 
 					else:
-						fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset,
-							item.base_net_amount, item.finance_book)
+						fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(
+							asset, item.base_net_amount, item.finance_book
+						)
 						asset.db_set("disposal_date", self.posting_date)
 
 						if asset.calculate_depreciation:
@@ -974,47 +1133,57 @@
 				else:
 					# Do not book income for transfer within same company
 					if not self.is_internal_transfer():
-						income_account = (item.income_account
-							if (not item.enable_deferred_revenue or self.is_return) else item.deferred_revenue_account)
+						income_account = (
+							item.income_account
+							if (not item.enable_deferred_revenue or self.is_return)
+							else item.deferred_revenue_account
+						)
 
 						amount, base_amount = self.get_amount_and_base_amount(item, enable_discount_accounting)
 
 						account_currency = get_account_currency(income_account)
 						gl_entries.append(
-							self.get_gl_dict({
-								"account": income_account,
-								"against": self.customer,
-								"credit": flt(base_amount, item.precision("base_net_amount")),
-								"credit_in_account_currency": (flt(base_amount, item.precision("base_net_amount"))
-									if account_currency==self.company_currency
-									else flt(amount, item.precision("net_amount"))),
-								"cost_center": item.cost_center,
-								"project": item.project or self.project
-							}, account_currency, item=item)
+							self.get_gl_dict(
+								{
+									"account": income_account,
+									"against": self.customer,
+									"credit": flt(base_amount, item.precision("base_net_amount")),
+									"credit_in_account_currency": (
+										flt(base_amount, item.precision("base_net_amount"))
+										if account_currency == self.company_currency
+										else flt(amount, item.precision("net_amount"))
+									),
+									"cost_center": item.cost_center,
+									"project": item.project or self.project,
+								},
+								account_currency,
+								item=item,
+							)
 						)
 
 		# expense account gl entries
-		if cint(self.update_stock) and \
-			erpnext.is_perpetual_inventory_enabled(self.company):
+		if cint(self.update_stock) and erpnext.is_perpetual_inventory_enabled(self.company):
 			gl_entries += super(SalesInvoice, self).get_gl_entries()
 
 	def get_asset(self, item):
-		if item.get('asset'):
+		if item.get("asset"):
 			asset = frappe.get_doc("Asset", item.asset)
 		else:
-			frappe.throw(_(
-				"Row #{0}: You must select an Asset for Item {1}.").format(item.idx, item.item_name),
-				title=_("Missing Asset")
+			frappe.throw(
+				_("Row #{0}: You must select an Asset for Item {1}.").format(item.idx, item.item_name),
+				title=_("Missing Asset"),
 			)
 
 		self.check_finance_books(item, asset)
 		return asset
 
 	def check_finance_books(self, item, asset):
-		if (len(asset.finance_books) > 1 and not item.finance_book
-			and asset.finance_books[0].finance_book):
-			frappe.throw(_("Select finance book for the item {0} at row {1}")
-				.format(item.item_code, item.idx))
+		if (
+			len(asset.finance_books) > 1 and not item.finance_book and asset.finance_books[0].finance_book
+		):
+			frappe.throw(
+				_("Select finance book for the item {0} at row {1}").format(item.item_code, item.idx)
+			)
 
 	def depreciate_asset(self, asset):
 		asset.flags.ignore_validate_update_after_submit = True
@@ -1034,14 +1203,12 @@
 
 	def modify_depreciation_schedule_for_asset_repairs(self, asset):
 		asset_repairs = frappe.get_all(
-			'Asset Repair',
-			filters = {'asset': asset.name},
-			fields = ['name', 'increase_in_asset_life']
+			"Asset Repair", filters={"asset": asset.name}, fields=["name", "increase_in_asset_life"]
 		)
 
 		for repair in asset_repairs:
 			if repair.increase_in_asset_life:
-				asset_repair = frappe.get_doc('Asset Repair', repair.name)
+				asset_repair = frappe.get_doc("Asset Repair", repair.name)
 				asset_repair.modify_depreciation_schedule()
 				asset.prepare_depreciation_data()
 
@@ -1051,8 +1218,8 @@
 		posting_date_of_original_invoice = self.get_posting_date_of_sales_invoice()
 
 		row = -1
-		finance_book = asset.get('schedules')[0].get('finance_book')
-		for schedule in asset.get('schedules'):
+		finance_book = asset.get("schedules")[0].get("finance_book")
+		for schedule in asset.get("schedules"):
 			if schedule.finance_book != finance_book:
 				row = 0
 				finance_book = schedule.finance_book
@@ -1060,8 +1227,9 @@
 				row += 1
 
 			if schedule.schedule_date == posting_date_of_original_invoice:
-				if not self.sale_was_made_on_original_schedule_date(asset, schedule, row, posting_date_of_original_invoice) \
-					or self.sale_happens_in_the_future(posting_date_of_original_invoice):
+				if not self.sale_was_made_on_original_schedule_date(
+					asset, schedule, row, posting_date_of_original_invoice
+				) or self.sale_happens_in_the_future(posting_date_of_original_invoice):
 
 					reverse_journal_entry = make_reverse_journal_entry(schedule.journal_entry)
 					reverse_journal_entry.posting_date = nowdate()
@@ -1076,14 +1244,17 @@
 					asset.save()
 
 	def get_posting_date_of_sales_invoice(self):
-		return frappe.db.get_value('Sales Invoice', self.return_against, 'posting_date')
+		return frappe.db.get_value("Sales Invoice", self.return_against, "posting_date")
 
 	# if the invoice had been posted on the date the depreciation was initially supposed to happen, the depreciation shouldn't be undone
-	def sale_was_made_on_original_schedule_date(self, asset, schedule, row, posting_date_of_original_invoice):
-		for finance_book in asset.get('finance_books'):
+	def sale_was_made_on_original_schedule_date(
+		self, asset, schedule, row, posting_date_of_original_invoice
+	):
+		for finance_book in asset.get("finance_books"):
 			if schedule.finance_book == finance_book.finance_book:
-				orginal_schedule_date = add_months(finance_book.depreciation_start_date,
-					row * cint(finance_book.frequency_of_depreciation))
+				orginal_schedule_date = add_months(
+					finance_book.depreciation_start_date, row * cint(finance_book.frequency_of_depreciation)
+				)
 
 				if orginal_schedule_date == posting_date_of_original_invoice:
 					return True
@@ -1104,7 +1275,9 @@
 	@property
 	def enable_discount_accounting(self):
 		if not hasattr(self, "_enable_discount_accounting"):
-			self._enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
+			self._enable_discount_accounting = cint(
+				frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+			)
 
 		return self._enable_discount_accounting
 
@@ -1112,36 +1285,46 @@
 		if self.is_return:
 			asset.set_status()
 		else:
-			asset.set_status("Sold" if self.docstatus==1 else None)
+			asset.set_status("Sold" if self.docstatus == 1 else None)
 
 	def make_loyalty_point_redemption_gle(self, gl_entries):
 		if cint(self.redeem_loyalty_points):
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.debit_to,
-					"party_type": "Customer",
-					"party": self.customer,
-					"against": "Expense account - " + cstr(self.loyalty_redemption_account) + " for the Loyalty Program",
-					"credit": self.loyalty_amount,
-					"against_voucher": self.return_against if cint(self.is_return) else self.name,
-					"against_voucher_type": self.doctype,
-					"cost_center": self.cost_center
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.debit_to,
+						"party_type": "Customer",
+						"party": self.customer,
+						"against": "Expense account - "
+						+ cstr(self.loyalty_redemption_account)
+						+ " for the Loyalty Program",
+						"credit": self.loyalty_amount,
+						"against_voucher": self.return_against if cint(self.is_return) else self.name,
+						"against_voucher_type": self.doctype,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
 			)
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.loyalty_redemption_account,
-					"cost_center": self.cost_center or self.loyalty_redemption_cost_center,
-					"against": self.customer,
-					"debit": self.loyalty_amount,
-					"remark": "Loyalty Points redeemed by the customer"
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.loyalty_redemption_account,
+						"cost_center": self.cost_center or self.loyalty_redemption_cost_center,
+						"against": self.customer,
+						"debit": self.loyalty_amount,
+						"remark": "Loyalty Points redeemed by the customer",
+					},
+					item=self,
+				)
 			)
 
 	def make_pos_gl_entries(self, gl_entries):
 		if cint(self.is_pos):
 
-			skip_change_gl_entries = not cint(frappe.db.get_single_value('Accounts Settings', 'post_change_gl_entries'))
+			skip_change_gl_entries = not cint(
+				frappe.db.get_single_value("Accounts Settings", "post_change_gl_entries")
+			)
 
 			for payment_mode in self.payments:
 				if skip_change_gl_entries and payment_mode.account == self.account_for_change_amount:
@@ -1150,32 +1333,42 @@
 				if payment_mode.amount:
 					# POS, make payment entries
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": self.debit_to,
-							"party_type": "Customer",
-							"party": self.customer,
-							"against": payment_mode.account,
-							"credit": payment_mode.base_amount,
-							"credit_in_account_currency": payment_mode.base_amount \
-								if self.party_account_currency==self.company_currency \
+						self.get_gl_dict(
+							{
+								"account": self.debit_to,
+								"party_type": "Customer",
+								"party": self.customer,
+								"against": payment_mode.account,
+								"credit": payment_mode.base_amount,
+								"credit_in_account_currency": payment_mode.base_amount
+								if self.party_account_currency == self.company_currency
 								else payment_mode.amount,
-							"against_voucher": self.return_against if cint(self.is_return) and self.return_against else self.name,
-							"against_voucher_type": self.doctype,
-							"cost_center": self.cost_center
-						}, self.party_account_currency, item=self)
+								"against_voucher": self.return_against
+								if cint(self.is_return) and self.return_against
+								else self.name,
+								"against_voucher_type": self.doctype,
+								"cost_center": self.cost_center,
+							},
+							self.party_account_currency,
+							item=self,
+						)
 					)
 
 					payment_mode_account_currency = get_account_currency(payment_mode.account)
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": payment_mode.account,
-							"against": self.customer,
-							"debit": payment_mode.base_amount,
-							"debit_in_account_currency": payment_mode.base_amount \
-								if payment_mode_account_currency==self.company_currency \
+						self.get_gl_dict(
+							{
+								"account": payment_mode.account,
+								"against": self.customer,
+								"debit": payment_mode.base_amount,
+								"debit_in_account_currency": payment_mode.base_amount
+								if payment_mode_account_currency == self.company_currency
 								else payment_mode.amount,
-							"cost_center": self.cost_center
-						}, payment_mode_account_currency, item=self)
+								"cost_center": self.cost_center,
+							},
+							payment_mode_account_currency,
+							item=self,
+						)
 					)
 
 			if not skip_change_gl_entries:
@@ -1185,28 +1378,38 @@
 		if self.change_amount:
 			if self.account_for_change_amount:
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": self.debit_to,
-						"party_type": "Customer",
-						"party": self.customer,
-						"against": self.account_for_change_amount,
-						"debit": flt(self.base_change_amount),
-						"debit_in_account_currency": flt(self.base_change_amount) \
-							if self.party_account_currency==self.company_currency else flt(self.change_amount),
-						"against_voucher": self.return_against if cint(self.is_return) and self.return_against else self.name,
-						"against_voucher_type": self.doctype,
-						"cost_center": self.cost_center,
-						"project": self.project
-					}, self.party_account_currency, item=self)
+					self.get_gl_dict(
+						{
+							"account": self.debit_to,
+							"party_type": "Customer",
+							"party": self.customer,
+							"against": self.account_for_change_amount,
+							"debit": flt(self.base_change_amount),
+							"debit_in_account_currency": flt(self.base_change_amount)
+							if self.party_account_currency == self.company_currency
+							else flt(self.change_amount),
+							"against_voucher": self.return_against
+							if cint(self.is_return) and self.return_against
+							else self.name,
+							"against_voucher_type": self.doctype,
+							"cost_center": self.cost_center,
+							"project": self.project,
+						},
+						self.party_account_currency,
+						item=self,
+					)
 				)
 
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": self.account_for_change_amount,
-						"against": self.customer,
-						"credit": self.base_change_amount,
-						"cost_center": self.cost_center
-					}, item=self)
+					self.get_gl_dict(
+						{
+							"account": self.account_for_change_amount,
+							"against": self.customer,
+							"credit": self.base_change_amount,
+							"cost_center": self.cost_center,
+						},
+						item=self,
+					)
 				)
 			else:
 				frappe.throw(_("Select change amount account"), title="Mandatory Field")
@@ -1215,61 +1418,84 @@
 		# write off entries, applicable if only pos
 		if self.write_off_account and flt(self.write_off_amount, self.precision("write_off_amount")):
 			write_off_account_currency = get_account_currency(self.write_off_account)
-			default_cost_center = frappe.get_cached_value('Company',  self.company,  'cost_center')
+			default_cost_center = frappe.get_cached_value("Company", self.company, "cost_center")
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.debit_to,
-					"party_type": "Customer",
-					"party": self.customer,
-					"against": self.write_off_account,
-					"credit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
-					"credit_in_account_currency": (flt(self.base_write_off_amount,
-						self.precision("base_write_off_amount")) if self.party_account_currency==self.company_currency
-						else flt(self.write_off_amount, self.precision("write_off_amount"))),
-					"against_voucher": self.return_against if cint(self.is_return) else self.name,
-					"against_voucher_type": self.doctype,
-					"cost_center": self.cost_center,
-					"project": self.project
-				}, self.party_account_currency, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.debit_to,
+						"party_type": "Customer",
+						"party": self.customer,
+						"against": self.write_off_account,
+						"credit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
+						"credit_in_account_currency": (
+							flt(self.base_write_off_amount, self.precision("base_write_off_amount"))
+							if self.party_account_currency == self.company_currency
+							else flt(self.write_off_amount, self.precision("write_off_amount"))
+						),
+						"against_voucher": self.return_against if cint(self.is_return) else self.name,
+						"against_voucher_type": self.doctype,
+						"cost_center": self.cost_center,
+						"project": self.project,
+					},
+					self.party_account_currency,
+					item=self,
+				)
 			)
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.write_off_account,
-					"against": self.customer,
-					"debit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
-					"debit_in_account_currency": (flt(self.base_write_off_amount,
-						self.precision("base_write_off_amount")) if write_off_account_currency==self.company_currency
-						else flt(self.write_off_amount, self.precision("write_off_amount"))),
-					"cost_center": self.cost_center or self.write_off_cost_center or default_cost_center
-				}, write_off_account_currency, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.write_off_account,
+						"against": self.customer,
+						"debit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
+						"debit_in_account_currency": (
+							flt(self.base_write_off_amount, self.precision("base_write_off_amount"))
+							if write_off_account_currency == self.company_currency
+							else flt(self.write_off_amount, self.precision("write_off_amount"))
+						),
+						"cost_center": self.cost_center or self.write_off_cost_center or default_cost_center,
+					},
+					write_off_account_currency,
+					item=self,
+				)
 			)
 
 	def make_gle_for_rounding_adjustment(self, gl_entries):
-		if flt(self.rounding_adjustment, self.precision("rounding_adjustment")) and self.base_rounding_adjustment \
-			and not self.is_internal_transfer():
-			round_off_account, round_off_cost_center = \
-				get_round_off_account_and_cost_center(self.company)
+		if (
+			flt(self.rounding_adjustment, self.precision("rounding_adjustment"))
+			and self.base_rounding_adjustment
+			and not self.is_internal_transfer()
+		):
+			round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(self.company)
 
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": round_off_account,
-					"against": self.customer,
-					"credit_in_account_currency": flt(self.rounding_adjustment,
-						self.precision("rounding_adjustment")),
-					"credit": flt(self.base_rounding_adjustment,
-						self.precision("base_rounding_adjustment")),
-					"cost_center": self.cost_center or round_off_cost_center,
-				}, item=self))
+				self.get_gl_dict(
+					{
+						"account": round_off_account,
+						"against": self.customer,
+						"credit_in_account_currency": flt(
+							self.rounding_adjustment, self.precision("rounding_adjustment")
+						),
+						"credit": flt(self.base_rounding_adjustment, self.precision("base_rounding_adjustment")),
+						"cost_center": self.cost_center or round_off_cost_center,
+					},
+					item=self,
+				)
+			)
 
 	def update_billing_status_in_dn(self, update_modified=True):
 		updated_delivery_notes = []
 		for d in self.get("items"):
 			if d.dn_detail:
-				billed_amt = frappe.db.sql("""select sum(amount) from `tabSales Invoice Item`
-					where dn_detail=%s and docstatus=1""", d.dn_detail)
+				billed_amt = frappe.db.sql(
+					"""select sum(amount) from `tabSales Invoice Item`
+					where dn_detail=%s and docstatus=1""",
+					d.dn_detail,
+				)
 				billed_amt = billed_amt and billed_amt[0][0] or 0
-				frappe.db.set_value("Delivery Note Item", d.dn_detail, "billed_amt", billed_amt, update_modified=update_modified)
+				frappe.db.set_value(
+					"Delivery Note Item", d.dn_detail, "billed_amt", billed_amt, update_modified=update_modified
+				)
 				updated_delivery_notes.append(d.delivery_note)
 			elif d.so_detail:
 				updated_delivery_notes += update_billed_amount_based_on_so(d.so_detail, update_modified)
@@ -1284,7 +1510,7 @@
 		self.due_date = None
 
 	def update_serial_no(self, in_cancel=False):
-		""" update Sales Invoice refrence in Serial No """
+		"""update Sales Invoice refrence in Serial No"""
 		invoice = None if (in_cancel or self.is_return) else self.name
 		if in_cancel and self.is_return:
 			invoice = self.return_against
@@ -1294,26 +1520,25 @@
 				continue
 
 			for serial_no in get_serial_nos(item.serial_no):
-				if serial_no and frappe.db.get_value('Serial No', serial_no, 'item_code') == item.item_code:
-					frappe.db.set_value('Serial No', serial_no, 'sales_invoice', invoice)
+				if serial_no and frappe.db.get_value("Serial No", serial_no, "item_code") == item.item_code:
+					frappe.db.set_value("Serial No", serial_no, "sales_invoice", invoice)
 
 	def validate_serial_numbers(self):
 		"""
-			validate serial number agains Delivery Note and Sales Invoice
+		validate serial number agains Delivery Note and Sales Invoice
 		"""
 		self.set_serial_no_against_delivery_note()
 		self.validate_serial_against_delivery_note()
 
 	def set_serial_no_against_delivery_note(self):
 		for item in self.items:
-			if item.serial_no and item.delivery_note and \
-				item.qty != len(get_serial_nos(item.serial_no)):
+			if item.serial_no and item.delivery_note and item.qty != len(get_serial_nos(item.serial_no)):
 				item.serial_no = get_delivery_note_serial_no(item.item_code, item.qty, item.delivery_note)
 
 	def validate_serial_against_delivery_note(self):
 		"""
-			validate if the serial numbers in Sales Invoice Items are same as in
-			Delivery Note Item
+		validate if the serial numbers in Sales Invoice Items are same as in
+		Delivery Note Item
 		"""
 
 		for item in self.items:
@@ -1332,14 +1557,18 @@
 				serial_no_msg = ", ".join(frappe.bold(d) for d in serial_no_diff)
 
 				msg = _("Row #{0}: The following Serial Nos are not present in Delivery Note {1}:").format(
-					item.idx, dn_link)
+					item.idx, dn_link
+				)
 				msg += " " + serial_no_msg
 
 				frappe.throw(msg=msg, title=_("Serial Nos Mismatch"))
 
 			if item.serial_no and cint(item.qty) != len(si_serial_nos):
-				frappe.throw(_("Row #{0}: {1} Serial numbers required for Item {2}. You have provided {3}.").format(
-					item.idx, item.qty, item.item_code, len(si_serial_nos)))
+				frappe.throw(
+					_("Row #{0}: {1} Serial numbers required for Item {2}. You have provided {3}.").format(
+						item.idx, item.qty, item.item_code, len(si_serial_nos)
+					)
+				)
 
 	def update_project(self):
 		if self.project:
@@ -1347,7 +1576,6 @@
 			project.update_billed_amount()
 			project.db_update()
 
-
 	def verify_payment_amount_is_positive(self):
 		for entry in self.payments:
 			if entry.amount < 0:
@@ -1363,66 +1591,86 @@
 		returned_amount = self.get_returned_amount()
 		current_amount = flt(self.grand_total) - cint(self.loyalty_amount)
 		eligible_amount = current_amount - returned_amount
-		lp_details = get_loyalty_program_details_with_points(self.customer, company=self.company,
-			current_transaction_amount=current_amount, loyalty_program=self.loyalty_program,
-			expiry_date=self.posting_date, include_expired_entry=True)
-		if lp_details and getdate(lp_details.from_date) <= getdate(self.posting_date) and \
-			(not lp_details.to_date or getdate(lp_details.to_date) >= getdate(self.posting_date)):
+		lp_details = get_loyalty_program_details_with_points(
+			self.customer,
+			company=self.company,
+			current_transaction_amount=current_amount,
+			loyalty_program=self.loyalty_program,
+			expiry_date=self.posting_date,
+			include_expired_entry=True,
+		)
+		if (
+			lp_details
+			and getdate(lp_details.from_date) <= getdate(self.posting_date)
+			and (not lp_details.to_date or getdate(lp_details.to_date) >= getdate(self.posting_date))
+		):
 
 			collection_factor = lp_details.collection_factor if lp_details.collection_factor else 1.0
-			points_earned = cint(eligible_amount/collection_factor)
+			points_earned = cint(eligible_amount / collection_factor)
 
-			doc = frappe.get_doc({
-				"doctype": "Loyalty Point Entry",
-				"company": self.company,
-				"loyalty_program": lp_details.loyalty_program,
-				"loyalty_program_tier": lp_details.tier_name,
-				"customer": self.customer,
-				"invoice_type": self.doctype,
-				"invoice": self.name,
-				"loyalty_points": points_earned,
-				"purchase_amount": eligible_amount,
-				"expiry_date": add_days(self.posting_date, lp_details.expiry_duration),
-				"posting_date": self.posting_date
-			})
+			doc = frappe.get_doc(
+				{
+					"doctype": "Loyalty Point Entry",
+					"company": self.company,
+					"loyalty_program": lp_details.loyalty_program,
+					"loyalty_program_tier": lp_details.tier_name,
+					"customer": self.customer,
+					"invoice_type": self.doctype,
+					"invoice": self.name,
+					"loyalty_points": points_earned,
+					"purchase_amount": eligible_amount,
+					"expiry_date": add_days(self.posting_date, lp_details.expiry_duration),
+					"posting_date": self.posting_date,
+				}
+			)
 			doc.flags.ignore_permissions = 1
 			doc.save()
 			self.set_loyalty_program_tier()
 
 	# valdite the redemption and then delete the loyalty points earned on cancel of the invoice
 	def delete_loyalty_point_entry(self):
-		lp_entry = frappe.db.sql("select name from `tabLoyalty Point Entry` where invoice=%s",
-			(self.name), as_dict=1)
+		lp_entry = frappe.db.sql(
+			"select name from `tabLoyalty Point Entry` where invoice=%s", (self.name), as_dict=1
+		)
 
-		if not lp_entry: return
-		against_lp_entry = frappe.db.sql('''select name, invoice from `tabLoyalty Point Entry`
-			where redeem_against=%s''', (lp_entry[0].name), as_dict=1)
+		if not lp_entry:
+			return
+		against_lp_entry = frappe.db.sql(
+			"""select name, invoice from `tabLoyalty Point Entry`
+			where redeem_against=%s""",
+			(lp_entry[0].name),
+			as_dict=1,
+		)
 		if against_lp_entry:
 			invoice_list = ", ".join([d.invoice for d in against_lp_entry])
 			frappe.throw(
-				_('''{} can't be cancelled since the Loyalty Points earned has been redeemed. First cancel the {} No {}''')
-				.format(self.doctype, self.doctype, invoice_list)
+				_(
+					"""{} can't be cancelled since the Loyalty Points earned has been redeemed. First cancel the {} No {}"""
+				).format(self.doctype, self.doctype, invoice_list)
 			)
 		else:
-			frappe.db.sql('''delete from `tabLoyalty Point Entry` where invoice=%s''', (self.name))
+			frappe.db.sql("""delete from `tabLoyalty Point Entry` where invoice=%s""", (self.name))
 			# Set loyalty program
 			self.set_loyalty_program_tier()
 
 	def set_loyalty_program_tier(self):
-		lp_details = get_loyalty_program_details_with_points(self.customer, company=self.company,
-				loyalty_program=self.loyalty_program, include_expired_entry=True)
+		lp_details = get_loyalty_program_details_with_points(
+			self.customer,
+			company=self.company,
+			loyalty_program=self.loyalty_program,
+			include_expired_entry=True,
+		)
 		frappe.db.set_value("Customer", self.customer, "loyalty_program_tier", lp_details.tier_name)
 
 	def get_returned_amount(self):
 		from frappe.query_builder.functions import Coalesce, Sum
+
 		doc = frappe.qb.DocType(self.doctype)
 		returned_amount = (
 			frappe.qb.from_(doc)
 			.select(Sum(doc.grand_total))
 			.where(
-				(doc.docstatus == 1)
-				& (doc.is_return == 1)
-				& (Coalesce(doc.return_against, '') == self.name)
+				(doc.docstatus == 1) & (doc.is_return == 1) & (Coalesce(doc.return_against, "") == self.name)
 			)
 		).run()
 
@@ -1434,7 +1682,10 @@
 			get_loyalty_point_entries,
 			get_redemption_details,
 		)
-		loyalty_point_entries = get_loyalty_point_entries(self.customer, self.loyalty_program, self.company, self.posting_date)
+
+		loyalty_point_entries = get_loyalty_point_entries(
+			self.customer, self.loyalty_program, self.company, self.posting_date
+		)
 		redemption_details = get_redemption_details(self.customer, self.loyalty_program, self.company)
 
 		points_to_redeem = self.loyalty_points
@@ -1448,30 +1699,32 @@
 				redeemed_points = points_to_redeem
 			else:
 				redeemed_points = available_points
-			doc = frappe.get_doc({
-				"doctype": "Loyalty Point Entry",
-				"company": self.company,
-				"loyalty_program": self.loyalty_program,
-				"loyalty_program_tier": lp_entry.loyalty_program_tier,
-				"customer": self.customer,
-				"invoice_type": self.doctype,
-				"invoice": self.name,
-				"redeem_against": lp_entry.name,
-				"loyalty_points": -1*redeemed_points,
-				"purchase_amount": self.grand_total,
-				"expiry_date": lp_entry.expiry_date,
-				"posting_date": self.posting_date
-			})
+			doc = frappe.get_doc(
+				{
+					"doctype": "Loyalty Point Entry",
+					"company": self.company,
+					"loyalty_program": self.loyalty_program,
+					"loyalty_program_tier": lp_entry.loyalty_program_tier,
+					"customer": self.customer,
+					"invoice_type": self.doctype,
+					"invoice": self.name,
+					"redeem_against": lp_entry.name,
+					"loyalty_points": -1 * redeemed_points,
+					"purchase_amount": self.grand_total,
+					"expiry_date": lp_entry.expiry_date,
+					"posting_date": self.posting_date,
+				}
+			)
 			doc.flags.ignore_permissions = 1
 			doc.save()
 			points_to_redeem -= redeemed_points
-			if points_to_redeem < 1: # since points_to_redeem is integer
+			if points_to_redeem < 1:  # since points_to_redeem is integer
 				break
 
 	def set_status(self, update=False, status=None, update_modified=True):
 		if self.is_new():
-			if self.get('amended_from'):
-				self.status = 'Draft'
+			if self.get("amended_from"):
+				self.status = "Draft"
 			return
 
 		outstanding_amount = flt(self.outstanding_amount, self.precision("outstanding_amount"))
@@ -1482,7 +1735,7 @@
 				status = "Cancelled"
 			elif self.docstatus == 1:
 				if self.is_internal_transfer():
-					self.status = 'Internal Transfer'
+					self.status = "Internal Transfer"
 				elif is_overdue(self, total):
 					self.status = "Overdue"
 				elif 0 < outstanding_amount < total:
@@ -1490,11 +1743,17 @@
 				elif outstanding_amount > 0 and getdate(self.due_date) >= getdate():
 					self.status = "Unpaid"
 				# Check if outstanding amount is 0 due to credit note issued against invoice
-				elif outstanding_amount <= 0 and self.is_return == 0 and frappe.db.get_value('Sales Invoice', {'is_return': 1, 'return_against': self.name, 'docstatus': 1}):
+				elif (
+					outstanding_amount <= 0
+					and self.is_return == 0
+					and frappe.db.get_value(
+						"Sales Invoice", {"is_return": 1, "return_against": self.name, "docstatus": 1}
+					)
+				):
 					self.status = "Credit Note Issued"
 				elif self.is_return == 1:
 					self.status = "Return"
-				elif outstanding_amount<=0:
+				elif outstanding_amount <= 0:
 					self.status = "Paid"
 				else:
 					self.status = "Submitted"
@@ -1510,34 +1769,29 @@
 				self.status = "Draft"
 
 		if update:
-			self.db_set('status', self.status, update_modified = update_modified)
+			self.db_set("status", self.status, update_modified=update_modified)
 
 
 def get_total_in_party_account_currency(doc):
-	total_fieldname = (
-		"grand_total"
-		if doc.disable_rounded_total
-		else "rounded_total"
-	)
+	total_fieldname = "grand_total" if doc.disable_rounded_total else "rounded_total"
 	if doc.party_account_currency != doc.currency:
 		total_fieldname = "base_" + total_fieldname
 
 	return flt(doc.get(total_fieldname), doc.precision(total_fieldname))
 
+
 def is_overdue(doc, total):
 	outstanding_amount = flt(doc.outstanding_amount, doc.precision("outstanding_amount"))
 	if outstanding_amount <= 0:
 		return
 
 	today = getdate()
-	if doc.get('is_pos') or not doc.get('payment_schedule'):
+	if doc.get("is_pos") or not doc.get("payment_schedule"):
 		return getdate(doc.due_date) < today
 
 	# calculate payable amount till date
 	payment_amount_field = (
-		"base_payment_amount"
-		if doc.party_account_currency != doc.currency
-		else "payment_amount"
+		"base_payment_amount" if doc.party_account_currency != doc.currency else "payment_amount"
 	)
 
 	payable_amount = sum(
@@ -1552,7 +1806,8 @@
 def get_discounting_status(sales_invoice):
 	status = None
 
-	invoice_discounting_list = frappe.db.sql("""
+	invoice_discounting_list = frappe.db.sql(
+		"""
 		select status
 		from `tabInvoice Discounting` id, `tabDiscounted Invoice` d
 		where
@@ -1560,7 +1815,9 @@
 			and d.sales_invoice=%s
 			and id.docstatus=1
 			and status in ('Disbursed', 'Settled')
-	""", sales_invoice)
+	""",
+		sales_invoice,
+	)
 
 	for d in invoice_discounting_list:
 		status = d[0]
@@ -1569,6 +1826,7 @@
 
 	return status
 
+
 def validate_inter_company_party(doctype, party, company, inter_company_reference):
 	if not party:
 		return
@@ -1597,10 +1855,19 @@
 			frappe.throw(_("Invalid Company for Inter Company Transaction."))
 
 	elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
-		companies = frappe.get_all("Allowed To Transact With", fields=["company"], filters={"parenttype": partytype, "parent": party})
+		companies = frappe.get_all(
+			"Allowed To Transact With",
+			fields=["company"],
+			filters={"parenttype": partytype, "parent": party},
+		)
 		companies = [d.company for d in companies]
 		if not company in companies:
-			frappe.throw(_("{0} not allowed to transact with {1}. Please change the Company.").format(partytype, company))
+			frappe.throw(
+				_("{0} not allowed to transact with {1}. Please change the Company.").format(
+					partytype, company
+				)
+			)
+
 
 def update_linked_doc(doctype, name, inter_company_reference):
 
@@ -1610,8 +1877,8 @@
 		ref_field = "inter_company_order_reference"
 
 	if inter_company_reference:
-		frappe.db.set_value(doctype, inter_company_reference,\
-			ref_field, name)
+		frappe.db.set_value(doctype, inter_company_reference, ref_field, name)
+
 
 def unlink_inter_company_doc(doctype, name, inter_company_reference):
 
@@ -1626,44 +1893,54 @@
 		frappe.db.set_value(doctype, name, ref_field, "")
 		frappe.db.set_value(ref_doc, inter_company_reference, ref_field, "")
 
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Invoices'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Invoices"),
+		}
+	)
 	return list_context
 
+
 @frappe.whitelist()
 def get_bank_cash_account(mode_of_payment, company):
-	account = frappe.db.get_value("Mode of Payment Account",
-		{"parent": mode_of_payment, "company": company}, "default_account")
+	account = frappe.db.get_value(
+		"Mode of Payment Account", {"parent": mode_of_payment, "company": company}, "default_account"
+	)
 	if not account:
-		frappe.throw(_("Please set default Cash or Bank account in Mode of Payment {0}")
-			.format(get_link_to_form("Mode of Payment", mode_of_payment)), title=_("Missing Account"))
-	return {
-		"account": account
-	}
+		frappe.throw(
+			_("Please set default Cash or Bank account in Mode of Payment {0}").format(
+				get_link_to_form("Mode of Payment", mode_of_payment)
+			),
+			title=_("Missing Account"),
+		)
+	return {"account": account}
+
 
 @frappe.whitelist()
 def make_maintenance_schedule(source_name, target_doc=None):
-	doclist = get_mapped_doc("Sales Invoice", source_name, 	{
-		"Sales Invoice": {
-			"doctype": "Maintenance Schedule",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
+	doclist = get_mapped_doc(
+		"Sales Invoice",
+		source_name,
+		{
+			"Sales Invoice": {"doctype": "Maintenance Schedule", "validation": {"docstatus": ["=", 1]}},
+			"Sales Invoice Item": {
+				"doctype": "Maintenance Schedule Item",
+			},
 		},
-		"Sales Invoice Item": {
-			"doctype": "Maintenance Schedule Item",
-		},
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_delivery_note(source_name, target_doc=None):
 	def set_missing_values(source, target):
@@ -1678,83 +1955,104 @@
 		target_doc.base_amount = target_doc.qty * flt(source_doc.base_rate)
 		target_doc.amount = target_doc.qty * flt(source_doc.rate)
 
-	doclist = get_mapped_doc("Sales Invoice", source_name, 	{
-		"Sales Invoice": {
-			"doctype": "Delivery Note",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Sales Invoice Item": {
-			"doctype": "Delivery Note Item",
-			"field_map": {
-				"name": "si_detail",
-				"parent": "against_sales_invoice",
-				"serial_no": "serial_no",
-				"sales_order": "against_sales_order",
-				"so_detail": "so_detail",
-				"cost_center": "cost_center"
+	doclist = get_mapped_doc(
+		"Sales Invoice",
+		source_name,
+		{
+			"Sales Invoice": {"doctype": "Delivery Note", "validation": {"docstatus": ["=", 1]}},
+			"Sales Invoice Item": {
+				"doctype": "Delivery Note Item",
+				"field_map": {
+					"name": "si_detail",
+					"parent": "against_sales_invoice",
+					"serial_no": "serial_no",
+					"sales_order": "against_sales_order",
+					"so_detail": "so_detail",
+					"cost_center": "cost_center",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: doc.delivered_by_supplier != 1,
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: doc.delivered_by_supplier!=1
-		},
-		"Sales Taxes and Charges": {
-			"doctype": "Sales Taxes and Charges",
-			"add_if_empty": True
-		},
-		"Sales Team": {
-			"doctype": "Sales Team",
-			"field_map": {
-				"incentives": "incentives"
+			"Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "add_if_empty": True},
+			"Sales Team": {
+				"doctype": "Sales Team",
+				"field_map": {"incentives": "incentives"},
+				"add_if_empty": True,
 			},
-			"add_if_empty": True
-		}
-	}, target_doc, set_missing_values)
+		},
+		target_doc,
+		set_missing_values,
+	)
 
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 	return doclist
 
+
 @frappe.whitelist()
 def make_sales_return(source_name, target_doc=None):
 	from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 	return make_return_doc("Sales Invoice", source_name, target_doc)
 
+
 def set_account_for_mode_of_payment(self):
 	for data in self.payments:
 		if not data.account:
 			data.account = get_bank_cash_account(data.mode_of_payment, self.company).get("account")
 
+
 def get_inter_company_details(doc, doctype):
 	if doctype in ["Sales Invoice", "Sales Order", "Delivery Note"]:
-		parties = frappe.db.get_all("Supplier", fields=["name"], filters={"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company})
+		parties = frappe.db.get_all(
+			"Supplier",
+			fields=["name"],
+			filters={"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company},
+		)
 		company = frappe.get_cached_value("Customer", doc.customer, "represents_company")
 
 		if not parties:
-			frappe.throw(_('No Supplier found for Inter Company Transactions which represents company {0}').format(frappe.bold(doc.company)))
+			frappe.throw(
+				_("No Supplier found for Inter Company Transactions which represents company {0}").format(
+					frappe.bold(doc.company)
+				)
+			)
 
 		party = get_internal_party(parties, "Supplier", doc)
 	else:
-		parties = frappe.db.get_all("Customer", fields=["name"], filters={"disabled": 0, "is_internal_customer": 1, "represents_company": doc.company})
+		parties = frappe.db.get_all(
+			"Customer",
+			fields=["name"],
+			filters={"disabled": 0, "is_internal_customer": 1, "represents_company": doc.company},
+		)
 		company = frappe.get_cached_value("Supplier", doc.supplier, "represents_company")
 
 		if not parties:
-			frappe.throw(_('No Customer found for Inter Company Transactions which represents company {0}').format(frappe.bold(doc.company)))
+			frappe.throw(
+				_("No Customer found for Inter Company Transactions which represents company {0}").format(
+					frappe.bold(doc.company)
+				)
+			)
 
 		party = get_internal_party(parties, "Customer", doc)
 
-	return {
-		"party": party,
-		"company": company
-	}
+	return {"party": party, "company": company}
+
 
 def get_internal_party(parties, link_doctype, doc):
 	if len(parties) == 1:
-			party = parties[0].name
+		party = parties[0].name
 	else:
 		# If more than one Internal Supplier/Customer, get supplier/customer on basis of address
-		if doc.get('company_address') or doc.get('shipping_address'):
-			party = frappe.db.get_value("Dynamic Link", {"parent": doc.get('company_address') or doc.get('shipping_address'),
-			"parenttype": "Address", "link_doctype": link_doctype}, "link_name")
+		if doc.get("company_address") or doc.get("shipping_address"):
+			party = frappe.db.get_value(
+				"Dynamic Link",
+				{
+					"parent": doc.get("company_address") or doc.get("shipping_address"),
+					"parenttype": "Address",
+					"link_doctype": link_doctype,
+				},
+				"link_name",
+			)
 
 			if not party:
 				party = parties[0].name
@@ -1763,11 +2061,18 @@
 
 	return party
 
+
 def validate_inter_company_transaction(doc, doctype):
 
 	details = get_inter_company_details(doc, doctype)
-	price_list = doc.selling_price_list if doctype in ["Sales Invoice", "Sales Order", "Delivery Note"] else doc.buying_price_list
-	valid_price_list = frappe.db.get_value("Price List", {"name": price_list, "buying": 1, "selling": 1})
+	price_list = (
+		doc.selling_price_list
+		if doctype in ["Sales Invoice", "Sales Order", "Delivery Note"]
+		else doc.buying_price_list
+	)
+	valid_price_list = frappe.db.get_value(
+		"Price List", {"name": price_list, "buying": 1, "selling": 1}
+	)
 	if not valid_price_list and not doc.is_internal_transfer():
 		frappe.throw(_("Selected Price List should have buying and selling fields checked."))
 
@@ -1777,28 +2082,32 @@
 		frappe.throw(_("No {0} found for Inter Company Transactions.").format(partytype))
 
 	company = details.get("company")
-	default_currency = frappe.get_cached_value('Company', company, "default_currency")
+	default_currency = frappe.get_cached_value("Company", company, "default_currency")
 	if default_currency != doc.currency:
-		frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions."))
+		frappe.throw(
+			_("Company currencies of both the companies should match for Inter Company Transactions.")
+		)
 
 	return
 
+
 @frappe.whitelist()
 def make_inter_company_purchase_invoice(source_name, target_doc=None):
 	return make_inter_company_transaction("Sales Invoice", source_name, target_doc)
 
+
 def make_inter_company_transaction(doctype, source_name, target_doc=None):
 	if doctype in ["Sales Invoice", "Sales Order"]:
 		source_doc = frappe.get_doc(doctype, source_name)
 		target_doctype = "Purchase Invoice" if doctype == "Sales Invoice" else "Purchase Order"
 		target_detail_field = "sales_invoice_item" if doctype == "Sales Invoice" else "sales_order_item"
-		source_document_warehouse_field = 'target_warehouse'
-		target_document_warehouse_field = 'from_warehouse'
+		source_document_warehouse_field = "target_warehouse"
+		target_document_warehouse_field = "from_warehouse"
 	else:
 		source_doc = frappe.get_doc(doctype, source_name)
 		target_doctype = "Sales Invoice" if doctype == "Purchase Invoice" else "Sales Order"
-		source_document_warehouse_field = 'from_warehouse'
-		target_document_warehouse_field = 'target_warehouse'
+		source_document_warehouse_field = "from_warehouse"
+		target_document_warehouse_field = "target_warehouse"
 
 	validate_inter_company_transaction(source_doc, doctype)
 	details = get_inter_company_details(source_doc, doctype)
@@ -1810,7 +2119,7 @@
 	def update_details(source_doc, target_doc, source_parent):
 		target_doc.inter_company_invoice_reference = source_doc.name
 		if target_doc.doctype in ["Purchase Invoice", "Purchase Order"]:
-			currency = frappe.db.get_value('Supplier', details.get('party'), 'default_currency')
+			currency = frappe.db.get_value("Supplier", details.get("party"), "default_currency")
 			target_doc.company = details.get("company")
 			target_doc.supplier = details.get("party")
 			target_doc.is_internal_supplier = 1
@@ -1818,130 +2127,176 @@
 			target_doc.buying_price_list = source_doc.selling_price_list
 
 			# Invert Addresses
-			update_address(target_doc, 'supplier_address', 'address_display', source_doc.company_address)
-			update_address(target_doc, 'shipping_address', 'shipping_address_display', source_doc.customer_address)
+			update_address(target_doc, "supplier_address", "address_display", source_doc.company_address)
+			update_address(
+				target_doc, "shipping_address", "shipping_address_display", source_doc.customer_address
+			)
 
 			if currency:
 				target_doc.currency = currency
 
-			update_taxes(target_doc, party=target_doc.supplier, party_type='Supplier', company=target_doc.company,
-				doctype=target_doc.doctype, party_address=target_doc.supplier_address,
-				company_address=target_doc.shipping_address)
+			update_taxes(
+				target_doc,
+				party=target_doc.supplier,
+				party_type="Supplier",
+				company=target_doc.company,
+				doctype=target_doc.doctype,
+				party_address=target_doc.supplier_address,
+				company_address=target_doc.shipping_address,
+			)
 
 		else:
-			currency = frappe.db.get_value('Customer', details.get('party'), 'default_currency')
+			currency = frappe.db.get_value("Customer", details.get("party"), "default_currency")
 			target_doc.company = details.get("company")
 			target_doc.customer = details.get("party")
 			target_doc.selling_price_list = source_doc.buying_price_list
 
-			update_address(target_doc, 'company_address', 'company_address_display', source_doc.supplier_address)
-			update_address(target_doc, 'shipping_address_name', 'shipping_address', source_doc.shipping_address)
-			update_address(target_doc, 'customer_address', 'address_display', source_doc.shipping_address)
+			update_address(
+				target_doc, "company_address", "company_address_display", source_doc.supplier_address
+			)
+			update_address(
+				target_doc, "shipping_address_name", "shipping_address", source_doc.shipping_address
+			)
+			update_address(target_doc, "customer_address", "address_display", source_doc.shipping_address)
 
 			if currency:
 				target_doc.currency = currency
 
-			update_taxes(target_doc, party=target_doc.customer, party_type='Customer', company=target_doc.company,
-				doctype=target_doc.doctype, party_address=target_doc.customer_address,
-				company_address=target_doc.company_address, shipping_address_name=target_doc.shipping_address_name)
+			update_taxes(
+				target_doc,
+				party=target_doc.customer,
+				party_type="Customer",
+				company=target_doc.company,
+				doctype=target_doc.doctype,
+				party_address=target_doc.customer_address,
+				company_address=target_doc.company_address,
+				shipping_address_name=target_doc.shipping_address_name,
+			)
 
 	item_field_map = {
 		"doctype": target_doctype + " Item",
-		"field_no_map": [
-			"income_account",
-			"expense_account",
-			"cost_center",
-			"warehouse"
-		],
+		"field_no_map": ["income_account", "expense_account", "cost_center", "warehouse"],
 		"field_map": {
-			'rate': 'rate',
-		}
+			"rate": "rate",
+		},
 	}
 
 	if doctype in ["Sales Invoice", "Sales Order"]:
-		item_field_map["field_map"].update({
-			"name": target_detail_field,
-		})
+		item_field_map["field_map"].update(
+			{
+				"name": target_detail_field,
+			}
+		)
 
-	if source_doc.get('update_stock'):
-		item_field_map["field_map"].update({
-			source_document_warehouse_field: target_document_warehouse_field,
-			'batch_no': 'batch_no',
-			'serial_no': 'serial_no'
-		})
+	if source_doc.get("update_stock"):
+		item_field_map["field_map"].update(
+			{
+				source_document_warehouse_field: target_document_warehouse_field,
+				"batch_no": "batch_no",
+				"serial_no": "serial_no",
+			}
+		)
 
-	doclist = get_mapped_doc(doctype, source_name,	{
-		doctype: {
-			"doctype": target_doctype,
-			"postprocess": update_details,
-			"set_target_warehouse": "set_from_warehouse",
-			"field_no_map": [
-				"taxes_and_charges",
-				"set_warehouse",
-				"shipping_address"
-			]
+	doclist = get_mapped_doc(
+		doctype,
+		source_name,
+		{
+			doctype: {
+				"doctype": target_doctype,
+				"postprocess": update_details,
+				"set_target_warehouse": "set_from_warehouse",
+				"field_no_map": ["taxes_and_charges", "set_warehouse", "shipping_address"],
+			},
+			doctype + " Item": item_field_map,
 		},
-		doctype +" Item": item_field_map
-
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 def set_purchase_references(doc):
 	# add internal PO or PR links if any
 	if doc.is_internal_transfer():
-		if doc.doctype == 'Purchase Receipt':
+		if doc.doctype == "Purchase Receipt":
 			so_item_map = get_delivery_note_details(doc.inter_company_invoice_reference)
 
 			if so_item_map:
-				pd_item_map, parent_child_map, warehouse_map = \
-					get_pd_details('Purchase Order Item', so_item_map, 'sales_order_item')
+				pd_item_map, parent_child_map, warehouse_map = get_pd_details(
+					"Purchase Order Item", so_item_map, "sales_order_item"
+				)
 
 				update_pr_items(doc, so_item_map, pd_item_map, parent_child_map, warehouse_map)
 
-		elif doc.doctype == 'Purchase Invoice':
+		elif doc.doctype == "Purchase Invoice":
 			dn_item_map, so_item_map = get_sales_invoice_details(doc.inter_company_invoice_reference)
 			# First check for Purchase receipt
 			if list(dn_item_map.values()):
-				pd_item_map, parent_child_map, warehouse_map = \
-					get_pd_details('Purchase Receipt Item', dn_item_map, 'delivery_note_item')
+				pd_item_map, parent_child_map, warehouse_map = get_pd_details(
+					"Purchase Receipt Item", dn_item_map, "delivery_note_item"
+				)
 
-				update_pi_items(doc, 'pr_detail', 'purchase_receipt',
-					dn_item_map, pd_item_map, parent_child_map, warehouse_map)
+				update_pi_items(
+					doc,
+					"pr_detail",
+					"purchase_receipt",
+					dn_item_map,
+					pd_item_map,
+					parent_child_map,
+					warehouse_map,
+				)
 
 			if list(so_item_map.values()):
-				pd_item_map, parent_child_map, warehouse_map = \
-					get_pd_details('Purchase Order Item', so_item_map, 'sales_order_item')
+				pd_item_map, parent_child_map, warehouse_map = get_pd_details(
+					"Purchase Order Item", so_item_map, "sales_order_item"
+				)
 
-				update_pi_items(doc, 'po_detail', 'purchase_order',
-					so_item_map, pd_item_map, parent_child_map, warehouse_map)
+				update_pi_items(
+					doc, "po_detail", "purchase_order", so_item_map, pd_item_map, parent_child_map, warehouse_map
+				)
 
-def update_pi_items(doc, detail_field, parent_field, sales_item_map,
-	purchase_item_map, parent_child_map, warehouse_map):
-	for item in doc.get('items'):
+
+def update_pi_items(
+	doc,
+	detail_field,
+	parent_field,
+	sales_item_map,
+	purchase_item_map,
+	parent_child_map,
+	warehouse_map,
+):
+	for item in doc.get("items"):
 		item.set(detail_field, purchase_item_map.get(sales_item_map.get(item.sales_invoice_item)))
 		item.set(parent_field, parent_child_map.get(sales_item_map.get(item.sales_invoice_item)))
 		if doc.update_stock:
 			item.warehouse = warehouse_map.get(sales_item_map.get(item.sales_invoice_item))
 
+
 def update_pr_items(doc, sales_item_map, purchase_item_map, parent_child_map, warehouse_map):
-	for item in doc.get('items'):
+	for item in doc.get("items"):
 		item.purchase_order_item = purchase_item_map.get(sales_item_map.get(item.delivery_note_item))
 		item.warehouse = warehouse_map.get(sales_item_map.get(item.delivery_note_item))
 		item.purchase_order = parent_child_map.get(sales_item_map.get(item.delivery_note_item))
 
+
 def get_delivery_note_details(internal_reference):
-	si_item_details = frappe.get_all('Delivery Note Item', fields=['name', 'so_detail'],
-		filters={'parent': internal_reference})
+	si_item_details = frappe.get_all(
+		"Delivery Note Item", fields=["name", "so_detail"], filters={"parent": internal_reference}
+	)
 
 	return {d.name: d.so_detail for d in si_item_details if d.so_detail}
 
+
 def get_sales_invoice_details(internal_reference):
 	dn_item_map = {}
 	so_item_map = {}
 
-	si_item_details = frappe.get_all('Sales Invoice Item', fields=['name', 'so_detail',
-		'dn_detail'], filters={'parent': internal_reference})
+	si_item_details = frappe.get_all(
+		"Sales Invoice Item",
+		fields=["name", "so_detail", "dn_detail"],
+		filters={"parent": internal_reference},
+	)
 
 	for d in si_item_details:
 		if d.dn_detail:
@@ -1951,13 +2306,17 @@
 
 	return dn_item_map, so_item_map
 
+
 def get_pd_details(doctype, sd_detail_map, sd_detail_field):
 	pd_item_map = {}
 	accepted_warehouse_map = {}
 	parent_child_map = {}
 
-	pd_item_details = frappe.get_all(doctype,
-		fields=[sd_detail_field, 'name', 'warehouse', 'parent'], filters={sd_detail_field: ('in', list(sd_detail_map.values()))})
+	pd_item_details = frappe.get_all(
+		doctype,
+		fields=[sd_detail_field, "name", "warehouse", "parent"],
+		filters={sd_detail_field: ("in", list(sd_detail_map.values()))},
+	)
 
 	for d in pd_item_details:
 		pd_item_map.setdefault(d.get(sd_detail_field), d.name)
@@ -1966,16 +2325,33 @@
 
 	return pd_item_map, parent_child_map, accepted_warehouse_map
 
-def update_taxes(doc, party=None, party_type=None, company=None, doctype=None, party_address=None,
-	company_address=None, shipping_address_name=None, master_doctype=None):
+
+def update_taxes(
+	doc,
+	party=None,
+	party_type=None,
+	company=None,
+	doctype=None,
+	party_address=None,
+	company_address=None,
+	shipping_address_name=None,
+	master_doctype=None,
+):
 	# Update Party Details
-	party_details = get_party_details(party=party, party_type=party_type, company=company,
-		doctype=doctype, party_address=party_address, company_address=company_address,
-		shipping_address=shipping_address_name)
+	party_details = get_party_details(
+		party=party,
+		party_type=party_type,
+		company=company,
+		doctype=doctype,
+		party_address=party_address,
+		company_address=company_address,
+		shipping_address=shipping_address_name,
+	)
 
 	# Update taxes and charges if any
-	doc.taxes_and_charges = party_details.get('taxes_and_charges')
-	doc.set('taxes', party_details.get('taxes'))
+	doc.taxes_and_charges = party_details.get("taxes_and_charges")
+	doc.set("taxes", party_details.get("taxes"))
+
 
 def update_address(doc, address_field, address_display_field, address_name):
 	doc.set(address_field, address_name)
@@ -1986,53 +2362,61 @@
 
 	doc.set(address_display_field, get_address_display(doc.get(address_field)))
 
+
 @frappe.whitelist()
 def get_loyalty_programs(customer):
-	''' sets applicable loyalty program to the customer or returns a list of applicable programs '''
+	"""sets applicable loyalty program to the customer or returns a list of applicable programs"""
 	from erpnext.selling.doctype.customer.customer import get_loyalty_programs
 
-	customer = frappe.get_doc('Customer', customer)
-	if customer.loyalty_program: return [customer.loyalty_program]
+	customer = frappe.get_doc("Customer", customer)
+	if customer.loyalty_program:
+		return [customer.loyalty_program]
 
 	lp_details = get_loyalty_programs(customer)
 
 	if len(lp_details) == 1:
-		frappe.db.set(customer, 'loyalty_program', lp_details[0])
+		frappe.db.set(customer, "loyalty_program", lp_details[0])
 		return lp_details
 	else:
 		return lp_details
 
+
 def on_doctype_update():
 	frappe.db.add_index("Sales Invoice", ["customer", "is_return", "return_against"])
 
+
 @frappe.whitelist()
 def create_invoice_discounting(source_name, target_doc=None):
 	invoice = frappe.get_doc("Sales Invoice", source_name)
 	invoice_discounting = frappe.new_doc("Invoice Discounting")
 	invoice_discounting.company = invoice.company
-	invoice_discounting.append("invoices", {
-		"sales_invoice": source_name,
-		"customer": invoice.customer,
-		"posting_date": invoice.posting_date,
-		"outstanding_amount": invoice.outstanding_amount
-	})
+	invoice_discounting.append(
+		"invoices",
+		{
+			"sales_invoice": source_name,
+			"customer": invoice.customer,
+			"posting_date": invoice.posting_date,
+			"outstanding_amount": invoice.outstanding_amount,
+		},
+	)
 
 	return invoice_discounting
 
+
 def update_multi_mode_option(doc, pos_profile):
 	def append_payment(payment_mode):
-		payment = doc.append('payments', {})
+		payment = doc.append("payments", {})
 		payment.default = payment_mode.default
 		payment.mode_of_payment = payment_mode.mop
 		payment.account = payment_mode.default_account
 		payment.type = payment_mode.type
 
-	doc.set('payments', [])
+	doc.set("payments", [])
 	invalid_modes = []
-	mode_of_payments = [d.mode_of_payment for d in pos_profile.get('payments')]
+	mode_of_payments = [d.mode_of_payment for d in pos_profile.get("payments")]
 	mode_of_payments_info = get_mode_of_payments_info(mode_of_payments, doc.company)
 
-	for row in pos_profile.get('payments'):
+	for row in pos_profile.get("payments"):
 		payment_mode = mode_of_payments_info.get(row.mode_of_payment)
 		if not payment_mode:
 			invalid_modes.append(get_link_to_form("Mode of Payment", row.mode_of_payment))
@@ -2048,12 +2432,17 @@
 			msg = _("Please set default Cash or Bank account in Mode of Payments {}")
 		frappe.throw(msg.format(", ".join(invalid_modes)), title=_("Missing Account"))
 
+
 def get_all_mode_of_payments(doc):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select mpa.default_account, mpa.parent, mp.type as type
 		from `tabMode of Payment Account` mpa,`tabMode of Payment` mp
 		where mpa.parent = mp.name and mpa.company = %(company)s and mp.enabled = 1""",
-	{'company': doc.company}, as_dict=1)
+		{"company": doc.company},
+		as_dict=1,
+	)
+
 
 def get_mode_of_payments_info(mode_of_payments, company):
 	data = frappe.db.sql(
@@ -2069,16 +2458,24 @@
 			mp.name in %s
 		group by
 			mp.name
-		""", (company, mode_of_payments), as_dict=1)
+		""",
+		(company, mode_of_payments),
+		as_dict=1,
+	)
 
-	return {row.get('mop'): row for row in data}
+	return {row.get("mop"): row for row in data}
+
 
 def get_mode_of_payment_info(mode_of_payment, company):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select mpa.default_account, mpa.parent, mp.type as type
 		from `tabMode of Payment Account` mpa,`tabMode of Payment` mp
 		where mpa.parent = mp.name and mpa.company = %s and mp.enabled = 1 and mp.name = %s""",
-	(company, mode_of_payment), as_dict=1)
+		(company, mode_of_payment),
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def create_dunning(source_name, target_doc=None):
@@ -2088,41 +2485,58 @@
 		calculate_interest_and_amount,
 		get_dunning_letter_text,
 	)
+
 	def set_missing_values(source, target):
 		target.sales_invoice = source_name
 		target.outstanding_amount = source.outstanding_amount
 		overdue_days = (getdate(target.posting_date) - getdate(source.due_date)).days
 		target.overdue_days = overdue_days
-		if frappe.db.exists('Dunning Type', {'start_day': [
-	                                '<', overdue_days], 'end_day': ['>=', overdue_days]}):
-			dunning_type = frappe.get_doc('Dunning Type', {'start_day': [
-	                                '<', overdue_days], 'end_day': ['>=', overdue_days]})
+		if frappe.db.exists(
+			"Dunning Type", {"start_day": ["<", overdue_days], "end_day": [">=", overdue_days]}
+		):
+			dunning_type = frappe.get_doc(
+				"Dunning Type", {"start_day": ["<", overdue_days], "end_day": [">=", overdue_days]}
+			)
 			target.dunning_type = dunning_type.name
 			target.rate_of_interest = dunning_type.rate_of_interest
 			target.dunning_fee = dunning_type.dunning_fee
-			letter_text = get_dunning_letter_text(dunning_type = dunning_type.name, doc = target.as_dict())
+			letter_text = get_dunning_letter_text(dunning_type=dunning_type.name, doc=target.as_dict())
 			if letter_text:
-				target.body_text = letter_text.get('body_text')
-				target.closing_text = letter_text.get('closing_text')
-				target.language = letter_text.get('language')
-			amounts = calculate_interest_and_amount(target.posting_date, target.outstanding_amount,
-				target.rate_of_interest, target.dunning_fee, target.overdue_days)
-			target.interest_amount = amounts.get('interest_amount')
-			target.dunning_amount = amounts.get('dunning_amount')
-			target.grand_total = amounts.get('grand_total')
+				target.body_text = letter_text.get("body_text")
+				target.closing_text = letter_text.get("closing_text")
+				target.language = letter_text.get("language")
+			amounts = calculate_interest_and_amount(
+				target.posting_date,
+				target.outstanding_amount,
+				target.rate_of_interest,
+				target.dunning_fee,
+				target.overdue_days,
+			)
+			target.interest_amount = amounts.get("interest_amount")
+			target.dunning_amount = amounts.get("dunning_amount")
+			target.grand_total = amounts.get("grand_total")
 
-	doclist = get_mapped_doc("Sales Invoice", source_name,	{
-		"Sales Invoice": {
-			"doctype": "Dunning",
-		}
-	}, target_doc, set_missing_values)
+	doclist = get_mapped_doc(
+		"Sales Invoice",
+		source_name,
+		{
+			"Sales Invoice": {
+				"doctype": "Dunning",
+			}
+		},
+		target_doc,
+		set_missing_values,
+	)
 	return doclist
 
+
 def check_if_return_invoice_linked_with_payment_entry(self):
 	# If a Return invoice is linked with payment entry along with other invoices,
 	# the cancellation of the Return causes allocated amount to be greater than paid
 
-	if not frappe.db.get_single_value('Accounts Settings', 'unlink_payment_on_cancellation_of_invoice'):
+	if not frappe.db.get_single_value(
+		"Accounts Settings", "unlink_payment_on_cancellation_of_invoice"
+	):
 		return
 
 	payment_entries = []
@@ -2131,7 +2545,8 @@
 	else:
 		invoice = self.name
 
-	payment_entries = frappe.db.sql_list("""
+	payment_entries = frappe.db.sql_list(
+		"""
 		SELECT
 			t1.name
 		FROM
@@ -2141,7 +2556,9 @@
 			and t1.docstatus = 1
 			and t2.reference_name = %s
 			and t2.allocated_amount < 0
-		""", invoice)
+		""",
+		invoice,
+	)
 
 	links_to_pe = []
 	if payment_entries:
@@ -2150,7 +2567,9 @@
 			if len(payment_entry.references) > 1:
 				links_to_pe.append(payment_entry.name)
 		if links_to_pe:
-			payment_entries_link = [get_link_to_form('Payment Entry', name, label=name) for name in links_to_pe]
+			payment_entries_link = [
+				get_link_to_form("Payment Entry", name, label=name) for name in links_to_pe
+			]
 			message = _("Please cancel and amend the Payment Entry")
 			message += " " + ", ".join(payment_entries_link) + " "
 			message += _("to unallocate the amount of this Return Invoice before cancelling it.")
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py
index 5cdc8da..b83d6a5 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py
@@ -3,34 +3,29 @@
 
 def get_data():
 	return {
-		'fieldname': 'sales_invoice',
-		'non_standard_fieldnames': {
-			'Delivery Note': 'against_sales_invoice',
-			'Journal Entry': 'reference_name',
-			'Payment Entry': 'reference_name',
-			'Payment Request': 'reference_name',
-			'Sales Invoice': 'return_against',
-			'Auto Repeat': 'reference_document',
+		"fieldname": "sales_invoice",
+		"non_standard_fieldnames": {
+			"Delivery Note": "against_sales_invoice",
+			"Journal Entry": "reference_name",
+			"Payment Entry": "reference_name",
+			"Payment Request": "reference_name",
+			"Sales Invoice": "return_against",
+			"Auto Repeat": "reference_document",
 		},
-		'internal_links': {
-			'Sales Order': ['items', 'sales_order']
-		},
-		'transactions': [
+		"internal_links": {"Sales Order": ["items", "sales_order"]},
+		"transactions": [
 			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Payment Request', 'Journal Entry', 'Invoice Discounting', 'Dunning']
+				"label": _("Payment"),
+				"items": [
+					"Payment Entry",
+					"Payment Request",
+					"Journal Entry",
+					"Invoice Discounting",
+					"Dunning",
+				],
 			},
-			{
-				'label': _('Reference'),
-				'items': ['Timesheet', 'Delivery Note', 'Sales Order']
-			},
-			{
-				'label': _('Returns'),
-				'items': ['Sales Invoice']
-			},
-			{
-				'label': _('Subscription'),
-				'items': ['Auto Repeat']
-			},
-		]
+			{"label": _("Reference"), "items": ["Timesheet", "Delivery Note", "Sales Order"]},
+			{"label": _("Returns"), "items": ["Sales Invoice"]},
+			{"label": _("Subscription"), "items": ["Auto Repeat"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 62c3508..808b766 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -59,23 +59,25 @@
 		w2 = frappe.get_doc(w.doctype, w.name)
 
 		import time
+
 		time.sleep(1)
 		w.save()
 
 		import time
+
 		time.sleep(1)
 		self.assertRaises(frappe.TimestampMismatchError, w2.save)
 
 	def test_sales_invoice_change_naming_series(self):
 		si = frappe.copy_doc(test_records[2])
 		si.insert()
-		si.naming_series = 'TEST-'
+		si.naming_series = "TEST-"
 
 		self.assertRaises(frappe.CannotChangeConstantError, si.save)
 
 		si = frappe.copy_doc(test_records[1])
 		si.insert()
-		si.naming_series = 'TEST-'
+		si.naming_series = "TEST-"
 
 		self.assertRaises(frappe.CannotChangeConstantError, si.save)
 
@@ -91,15 +93,21 @@
 		si.insert()
 
 		expected_values = {
-			"keys": ["price_list_rate", "discount_percentage", "rate", "amount",
-				"base_price_list_rate", "base_rate", "base_amount"],
+			"keys": [
+				"price_list_rate",
+				"discount_percentage",
+				"rate",
+				"amount",
+				"base_price_list_rate",
+				"base_rate",
+				"base_amount",
+			],
 			"_Test Item Home Desktop 100": [50, 0, 50, 500, 50, 50, 500],
 			"_Test Item Home Desktop 200": [150, 0, 150, 750, 150, 150, 750],
 		}
 
 		# check if children are saved
-		self.assertEqual(len(si.get("items")),
-			len(expected_values)-1)
+		self.assertEqual(len(si.get("items")), len(expected_values) - 1)
 
 		# check if item values are calculated
 		for d in si.get("items"):
@@ -120,7 +128,7 @@
 			"_Test Account S&H Education Cess - _TC": [1.4, 1619.2],
 			"_Test Account CST - _TC": [32.38, 1651.58],
 			"_Test Account VAT - _TC": [156.25, 1807.83],
-			"_Test Account Discount - _TC": [-180.78, 1627.05]
+			"_Test Account Discount - _TC": [-180.78, 1627.05],
 		}
 
 		for d in si.get("taxes"):
@@ -150,7 +158,7 @@
 		pe.submit()
 
 		unlink_payment_on_cancel_of_invoice(0)
-		si = frappe.get_doc('Sales Invoice', si.name)
+		si = frappe.get_doc("Sales Invoice", si.name)
 		self.assertRaises(frappe.LinkExistsError, si.cancel)
 		unlink_payment_on_cancel_of_invoice()
 
@@ -161,25 +169,30 @@
 		si2 = create_sales_invoice(rate=300)
 		si3 = create_sales_invoice(qty=-1, rate=300, is_return=1)
 
-
 		pe = get_payment_entry("Sales Invoice", si1.name, bank_account="_Test Bank - _TC")
-		pe.append('references', {
-			'reference_doctype': 'Sales Invoice',
-			'reference_name': si2.name,
-			'total_amount': si2.grand_total,
-			'outstanding_amount': si2.outstanding_amount,
-			'allocated_amount': si2.outstanding_amount
-		})
+		pe.append(
+			"references",
+			{
+				"reference_doctype": "Sales Invoice",
+				"reference_name": si2.name,
+				"total_amount": si2.grand_total,
+				"outstanding_amount": si2.outstanding_amount,
+				"allocated_amount": si2.outstanding_amount,
+			},
+		)
 
-		pe.append('references', {
-			'reference_doctype': 'Sales Invoice',
-			'reference_name': si3.name,
-			'total_amount': si3.grand_total,
-			'outstanding_amount': si3.outstanding_amount,
-			'allocated_amount': si3.outstanding_amount
-		})
+		pe.append(
+			"references",
+			{
+				"reference_doctype": "Sales Invoice",
+				"reference_name": si3.name,
+				"total_amount": si3.grand_total,
+				"outstanding_amount": si3.outstanding_amount,
+				"allocated_amount": si3.outstanding_amount,
+			},
+		)
 
-		pe.reference_no = 'Test001'
+		pe.reference_no = "Test001"
 		pe.reference_date = nowdate()
 		pe.save()
 		pe.submit()
@@ -190,7 +203,6 @@
 		si1.load_from_db()
 		self.assertRaises(PaymentEntryUnlinkError, si1.cancel)
 
-
 	def test_sales_invoice_calculation_export_currency(self):
 		si = frappe.copy_doc(test_records[2])
 		si.currency = "USD"
@@ -205,14 +217,21 @@
 		si.insert()
 
 		expected_values = {
-			"keys": ["price_list_rate", "discount_percentage", "rate", "amount",
-				"base_price_list_rate", "base_rate", "base_amount"],
+			"keys": [
+				"price_list_rate",
+				"discount_percentage",
+				"rate",
+				"amount",
+				"base_price_list_rate",
+				"base_rate",
+				"base_amount",
+			],
 			"_Test Item Home Desktop 100": [1, 0, 1, 10, 50, 50, 500],
 			"_Test Item Home Desktop 200": [3, 0, 3, 15, 150, 150, 750],
 		}
 
 		# check if children are saved
-		self.assertEqual(len(si.get("items")), len(expected_values)-1)
+		self.assertEqual(len(si.get("items")), len(expected_values) - 1)
 
 		# check if item values are calculated
 		for d in si.get("items"):
@@ -235,7 +254,7 @@
 			"_Test Account S&H Education Cess - _TC": [1.5, 1619.5, 0.03, 32.39],
 			"_Test Account CST - _TC": [32.5, 1652, 0.65, 33.04],
 			"_Test Account VAT - _TC": [156.5, 1808.5, 3.13, 36.17],
-			"_Test Account Discount - _TC": [-181.0, 1627.5, -3.62, 32.55]
+			"_Test Account Discount - _TC": [-181.0, 1627.5, -3.62, 32.55],
 		}
 
 		for d in si.get("taxes"):
@@ -247,22 +266,28 @@
 
 	def test_sales_invoice_with_discount_and_inclusive_tax(self):
 		si = create_sales_invoice(qty=100, rate=50, do_not_save=True)
-		si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 14,
-			'included_in_print_rate': 1
-		})
-		si.append("taxes", {
-			"charge_type": "On Item Quantity",
-			"account_head": "_Test Account Education Cess - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "CESS",
-			"rate": 5,
-			'included_in_print_rate': 1
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 14,
+				"included_in_print_rate": 1,
+			},
+		)
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Item Quantity",
+				"account_head": "_Test Account Education Cess - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "CESS",
+				"rate": 5,
+				"included_in_print_rate": 1,
+			},
+		)
 		si.insert()
 
 		# with inclusive tax
@@ -274,7 +299,7 @@
 
 		# additional discount
 		si.discount_amount = 100
-		si.apply_discount_on = 'Net Total'
+		si.apply_discount_on = "Net Total"
 		si.payment_schedule = []
 
 		si.save()
@@ -287,7 +312,7 @@
 
 		# additional discount on grand total
 		si.discount_amount = 100
-		si.apply_discount_on = 'Grand Total'
+		si.apply_discount_on = "Grand Total"
 		si.payment_schedule = []
 
 		si.save()
@@ -299,14 +324,17 @@
 	def test_sales_invoice_discount_amount(self):
 		si = frappe.copy_doc(test_records[3])
 		si.discount_amount = 104.94
-		si.append("taxes", {
-			"charge_type": "On Previous Row Amount",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 10,
-			"row_id": 8,
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Previous Row Amount",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 10,
+				"row_id": 8,
+			},
+		)
 		si.insert()
 
 		expected_values = [
@@ -322,7 +350,7 @@
 				"net_rate": 46.54,
 				"net_amount": 465.37,
 				"base_net_rate": 46.54,
-				"base_net_amount": 465.37
+				"base_net_amount": 465.37,
 			},
 			{
 				"item_code": "_Test Item Home Desktop 200",
@@ -336,12 +364,12 @@
 				"net_rate": 139.62,
 				"net_amount": 698.08,
 				"base_net_rate": 139.62,
-				"base_net_amount": 698.08
-			}
+				"base_net_amount": 698.08,
+			},
 		]
 
 		# check if children are saved
-		self.assertEqual(len(si.get("items")),	len(expected_values))
+		self.assertEqual(len(si.get("items")), len(expected_values))
 
 		# check if item values are calculated
 		for i, d in enumerate(si.get("items")):
@@ -363,7 +391,7 @@
 			"_Test Account Customs Duty - _TC": [125, 116.35, 1585.40],
 			"_Test Account Shipping Charges - _TC": [100, 100, 1685.40],
 			"_Test Account Discount - _TC": [-180.33, -168.54, 1516.86],
-			"_Test Account Service Tax - _TC": [-18.03, -16.85, 1500.01]
+			"_Test Account Service Tax - _TC": [-18.03, -16.85, 1500.01],
 		}
 
 		for d in si.get("taxes"):
@@ -378,38 +406,48 @@
 		frappe.db.set_value("Company", "_Test Company", "round_off_account", "Round Off - _TC")
 		si = frappe.copy_doc(test_records[3])
 		si.discount_amount = 104.94
-		si.append("taxes", {
-			"doctype": "Sales Taxes and Charges",
-			"charge_type": "On Previous Row Amount",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 10,
-			"row_id": 8
-		})
+		si.append(
+			"taxes",
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Amount",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 10,
+				"row_id": 8,
+			},
+		)
 		si.insert()
 		si.submit()
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
-		expected_values = dict((d[0], d) for d in [
-			[si.debit_to, 1500, 0.0],
-			[test_records[3]["items"][0]["income_account"], 0.0, 1163.45],
-			[test_records[3]["taxes"][0]["account_head"], 0.0, 130.31],
-			[test_records[3]["taxes"][1]["account_head"], 0.0, 2.61],
-			[test_records[3]["taxes"][2]["account_head"], 0.0, 1.30],
-			[test_records[3]["taxes"][3]["account_head"], 0.0, 25.95],
-			[test_records[3]["taxes"][4]["account_head"], 0.0, 145.43],
-			[test_records[3]["taxes"][5]["account_head"], 0.0, 116.35],
-			[test_records[3]["taxes"][6]["account_head"], 0.0, 100],
-			[test_records[3]["taxes"][7]["account_head"], 168.54, 0.0],
-			["_Test Account Service Tax - _TC", 16.85, 0.0],
-			["Round Off - _TC", 0.01, 0.0]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				[si.debit_to, 1500, 0.0],
+				[test_records[3]["items"][0]["income_account"], 0.0, 1163.45],
+				[test_records[3]["taxes"][0]["account_head"], 0.0, 130.31],
+				[test_records[3]["taxes"][1]["account_head"], 0.0, 2.61],
+				[test_records[3]["taxes"][2]["account_head"], 0.0, 1.30],
+				[test_records[3]["taxes"][3]["account_head"], 0.0, 25.95],
+				[test_records[3]["taxes"][4]["account_head"], 0.0, 145.43],
+				[test_records[3]["taxes"][5]["account_head"], 0.0, 116.35],
+				[test_records[3]["taxes"][6]["account_head"], 0.0, 100],
+				[test_records[3]["taxes"][7]["account_head"], 168.54, 0.0],
+				["_Test Account Service Tax - _TC", 16.85, 0.0],
+				["Round Off - _TC", 0.01, 0.0],
+			]
+		)
 
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.account)
@@ -419,8 +457,11 @@
 		# cancel
 		si.cancel()
 
-		gle = frappe.db.sql("""select * from `tabGL Entry`
-			where voucher_type='Sales Invoice' and voucher_no=%s""", si.name)
+		gle = frappe.db.sql(
+			"""select * from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no=%s""",
+			si.name,
+		)
 
 		self.assertTrue(gle)
 
@@ -432,14 +473,17 @@
 			item_row_copy.qty = qty
 			si.append("items", item_row_copy)
 
-		si.append("taxes", {
-			"account_head": "_Test Account VAT - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "VAT",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 19
-		})
+		si.append(
+			"taxes",
+			{
+				"account_head": "_Test Account VAT - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "VAT",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 19,
+			},
+		)
 		si.insert()
 
 		self.assertEqual(si.net_total, 4600)
@@ -454,10 +498,10 @@
 		item_row = si.get("items")[0]
 
 		add_items = [
-			(54, '_Test Account Excise Duty @ 12 - _TC'),
-			(288, '_Test Account Excise Duty @ 15 - _TC'),
-			(144, '_Test Account Excise Duty @ 20 - _TC'),
-			(430, '_Test Item Tax Template 1 - _TC')
+			(54, "_Test Account Excise Duty @ 12 - _TC"),
+			(288, "_Test Account Excise Duty @ 15 - _TC"),
+			(144, "_Test Account Excise Duty @ 20 - _TC"),
+			(430, "_Test Item Tax Template 1 - _TC"),
 		]
 		for qty, item_tax_template in add_items:
 			item_row_copy = copy.deepcopy(item_row)
@@ -465,30 +509,39 @@
 			item_row_copy.item_tax_template = item_tax_template
 			si.append("items", item_row_copy)
 
-		si.append("taxes", {
-			"account_head": "_Test Account Excise Duty - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Excise Duty",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 11
-		})
-		si.append("taxes", {
-			"account_head": "_Test Account Education Cess - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Education Cess",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 0
-		})
-		si.append("taxes", {
-			"account_head": "_Test Account S&H Education Cess - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "S&H Education Cess",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 3
-		})
+		si.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Excise Duty - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Excise Duty",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 11,
+			},
+		)
+		si.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Education Cess - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Education Cess",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 0,
+			},
+		)
+		si.append(
+			"taxes",
+			{
+				"account_head": "_Test Account S&H Education Cess - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "S&H Education Cess",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 3,
+			},
+		)
 		si.insert()
 
 		self.assertEqual(si.net_total, 4600)
@@ -518,14 +571,17 @@
 		si.apply_discount_on = "Net Total"
 		si.discount_amount = 75.0
 
-		si.append("taxes", {
-			"account_head": "_Test Account VAT - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "VAT",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 24
-		})
+		si.append(
+			"taxes",
+			{
+				"account_head": "_Test Account VAT - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "VAT",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 24,
+			},
+		)
 		si.insert()
 
 		self.assertEqual(si.total, 975)
@@ -539,7 +595,7 @@
 	def test_inclusive_rate_validations(self):
 		si = frappe.copy_doc(test_records[2])
 		for i, tax in enumerate(si.get("taxes")):
-			tax.idx = i+1
+			tax.idx = i + 1
 
 		si.get("items")[0].price_list_rate = 62.5
 		si.get("items")[0].price_list_rate = 191
@@ -559,14 +615,43 @@
 		si.insert()
 
 		expected_values = {
-			"keys": ["price_list_rate", "discount_percentage", "rate", "amount",
-				"base_price_list_rate", "base_rate", "base_amount", "net_rate", "net_amount"],
-			"_Test Item Home Desktop 100": [62.5, 0, 62.5, 625.0, 62.5, 62.5, 625.0, 50, 499.97600115194473],
-			"_Test Item Home Desktop 200": [190.66, 0, 190.66, 953.3, 190.66, 190.66, 953.3, 150, 749.9968530500239],
+			"keys": [
+				"price_list_rate",
+				"discount_percentage",
+				"rate",
+				"amount",
+				"base_price_list_rate",
+				"base_rate",
+				"base_amount",
+				"net_rate",
+				"net_amount",
+			],
+			"_Test Item Home Desktop 100": [
+				62.5,
+				0,
+				62.5,
+				625.0,
+				62.5,
+				62.5,
+				625.0,
+				50,
+				499.97600115194473,
+			],
+			"_Test Item Home Desktop 200": [
+				190.66,
+				0,
+				190.66,
+				953.3,
+				190.66,
+				190.66,
+				953.3,
+				150,
+				749.9968530500239,
+			],
 		}
 
 		# check if children are saved
-		self.assertEqual(len(si.get("items")), len(expected_values)-1)
+		self.assertEqual(len(si.get("items")), len(expected_values) - 1)
 
 		# check if item values are calculated
 		for d in si.get("items"):
@@ -587,7 +672,7 @@
 			"_Test Account VAT - _TC": [156.25, 1578.30],
 			"_Test Account Customs Duty - _TC": [125, 1703.30],
 			"_Test Account Shipping Charges - _TC": [100, 1803.30],
-			"_Test Account Discount - _TC": [-180.33, 1622.97]
+			"_Test Account Discount - _TC": [-180.33, 1622.97],
 		}
 
 		for d in si.get("taxes"):
@@ -625,7 +710,7 @@
 				"net_rate": 40,
 				"net_amount": 399.9808009215558,
 				"base_net_rate": 2000,
-				"base_net_amount": 19999
+				"base_net_amount": 19999,
 			},
 			{
 				"item_code": "_Test Item Home Desktop 200",
@@ -639,8 +724,8 @@
 				"net_rate": 118.01,
 				"net_amount": 590.0531205155963,
 				"base_net_rate": 5900.5,
-				"base_net_amount": 29502.5
-			}
+				"base_net_amount": 29502.5,
+			},
 		]
 
 		# check if children are saved
@@ -665,8 +750,8 @@
 			"_Test Account CST - _TC": [1104, 56312.0, 22.08, 1126.24],
 			"_Test Account VAT - _TC": [6187.5, 62499.5, 123.75, 1249.99],
 			"_Test Account Customs Duty - _TC": [4950.0, 67449.5, 99.0, 1348.99],
-			"_Test Account Shipping Charges - _TC": [ 100, 67549.5, 2, 1350.99],
-			"_Test Account Discount - _TC": [ -6755, 60794.5, -135.10, 1215.89]
+			"_Test Account Shipping Charges - _TC": [100, 67549.5, 2, 1350.99],
+			"_Test Account Discount - _TC": [-6755, 60794.5, -135.10, 1215.89],
 		}
 
 		for d in si.get("taxes"):
@@ -678,7 +763,6 @@
 		self.assertEqual(si.rounding_adjustment, 0.01)
 		self.assertEqual(si.base_rounding_adjustment, 0.50)
 
-
 	def test_outstanding(self):
 		w = self.make()
 		self.assertEqual(w.outstanding_amount, w.base_rounded_total)
@@ -698,11 +782,11 @@
 
 		self.assertEqual(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 162.0)
 
-		link_data = get_dynamic_link_map().get('Sales Invoice', [])
+		link_data = get_dynamic_link_map().get("Sales Invoice", [])
 		link_doctypes = [d.parent for d in link_data]
 
 		# test case for dynamic link order
-		self.assertTrue(link_doctypes.index('GL Entry') > link_doctypes.index('Journal Entry Account'))
+		self.assertTrue(link_doctypes.index("GL Entry") > link_doctypes.index("Journal Entry Account"))
 
 		jv.cancel()
 		self.assertEqual(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 562.0)
@@ -712,18 +796,25 @@
 		si.insert()
 		si.submit()
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
-		expected_values = dict((d[0], d) for d in [
-			[si.debit_to, 630.0, 0.0],
-			[test_records[1]["items"][0]["income_account"], 0.0, 500.0],
-			[test_records[1]["taxes"][0]["account_head"], 0.0, 80.0],
-			[test_records[1]["taxes"][1]["account_head"], 0.0, 50.0],
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				[si.debit_to, 630.0, 0.0],
+				[test_records[1]["items"][0]["income_account"], 0.0, 500.0],
+				[test_records[1]["taxes"][0]["account_head"], 0.0, 80.0],
+				[test_records[1]["taxes"][1]["account_head"], 0.0, 50.0],
+			]
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account][0], gle.account)
@@ -733,25 +824,49 @@
 		# cancel
 		si.cancel()
 
-		gle = frappe.db.sql("""select * from `tabGL Entry`
-			where voucher_type='Sales Invoice' and voucher_no=%s""", si.name)
+		gle = frappe.db.sql(
+			"""select * from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no=%s""",
+			si.name,
+		)
 
 		self.assertTrue(gle)
 
 	def test_pos_gl_entry_with_perpetual_inventory(self):
-		make_pos_profile(company="_Test Company with perpetual inventory", income_account = "Sales - TCP1",
-			expense_account = "Cost of Goods Sold - TCP1", warehouse="Stores - TCP1", cost_center = "Main - TCP1", write_off_account="_Test Write Off - TCP1")
+		make_pos_profile(
+			company="_Test Company with perpetual inventory",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			write_off_account="_Test Write Off - TCP1",
+		)
 
-		pr = make_purchase_receipt(company= "_Test Company with perpetual inventory", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1")
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			item_code="_Test FG Item",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-		pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1",
-			income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True)
+		pos = create_sales_invoice(
+			company="_Test Company with perpetual inventory",
+			debit_to="Debtors - TCP1",
+			item_code="_Test FG Item",
+			warehouse="Stores - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			do_not_save=True,
+		)
 
 		pos.is_pos = 1
 		pos.update_stock = 1
 
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50})
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 50})
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - TCP1", "amount": 50}
+		)
+		pos.append("payments", {"mode_of_payment": "Cash", "account": "Cash - TCP1", "amount": 50})
 
 		taxes = get_taxes_and_charges()
 		pos.taxes = []
@@ -771,20 +886,19 @@
 		pos_profile = make_pos_profile()
 
 		pos_profile.payments = []
-		pos_profile.append('payments', {
-			'default': 1,
-			'mode_of_payment': 'Cash'
-		})
+		pos_profile.append("payments", {"default": 1, "mode_of_payment": "Cash"})
 
 		pos_profile.save()
 
-		pos = create_sales_invoice(qty = 10, do_not_save=True)
+		pos = create_sales_invoice(qty=10, do_not_save=True)
 
 		pos.is_pos = 1
 		pos.pos_profile = pos_profile.name
 
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 500})
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 500})
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - _TC", "amount": 500}
+		)
+		pos.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 500})
 		pos.insert()
 		pos.submit()
 
@@ -793,25 +907,43 @@
 		pos_return.insert()
 		pos_return.submit()
 
-		self.assertEqual(pos_return.get('payments')[0].amount, -1000)
+		self.assertEqual(pos_return.get("payments")[0].amount, -1000)
 
 	def test_pos_change_amount(self):
-		make_pos_profile(company="_Test Company with perpetual inventory", income_account = "Sales - TCP1",
-			expense_account = "Cost of Goods Sold - TCP1", warehouse="Stores - TCP1", cost_center = "Main - TCP1", write_off_account="_Test Write Off - TCP1")
+		make_pos_profile(
+			company="_Test Company with perpetual inventory",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			write_off_account="_Test Write Off - TCP1",
+		)
 
-		make_purchase_receipt(company= "_Test Company with perpetual inventory",
-			item_code= "_Test FG Item",warehouse= "Stores - TCP1", cost_center= "Main - TCP1")
+		make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			item_code="_Test FG Item",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-		pos = create_sales_invoice(company= "_Test Company with perpetual inventory",
-			debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1",
-			income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1",
-			cost_center = "Main - TCP1", do_not_save=True)
+		pos = create_sales_invoice(
+			company="_Test Company with perpetual inventory",
+			debit_to="Debtors - TCP1",
+			item_code="_Test FG Item",
+			warehouse="Stores - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			do_not_save=True,
+		)
 
 		pos.is_pos = 1
 		pos.update_stock = 1
 
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50})
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 60})
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - TCP1", "amount": 50}
+		)
+		pos.append("payments", {"mode_of_payment": "Cash", "account": "Cash - TCP1", "amount": 60})
 
 		pos.change_amount = 5.0
 		pos.insert()
@@ -821,18 +953,34 @@
 		self.assertEqual(pos.write_off_amount, -5)
 
 	def test_pos_with_no_gl_entry_for_change_amount(self):
-		frappe.db.set_value('Accounts Settings', None, 'post_change_gl_entries', 0)
+		frappe.db.set_value("Accounts Settings", None, "post_change_gl_entries", 0)
 
-		make_pos_profile(company="_Test Company with perpetual inventory", income_account = "Sales - TCP1",
-			expense_account = "Cost of Goods Sold - TCP1", warehouse="Stores - TCP1", cost_center = "Main - TCP1", write_off_account="_Test Write Off - TCP1")
+		make_pos_profile(
+			company="_Test Company with perpetual inventory",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			write_off_account="_Test Write Off - TCP1",
+		)
 
-		make_purchase_receipt(company= "_Test Company with perpetual inventory",
-			item_code= "_Test FG Item",warehouse= "Stores - TCP1", cost_center= "Main - TCP1")
+		make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			item_code="_Test FG Item",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-		pos = create_sales_invoice(company= "_Test Company with perpetual inventory",
-			debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1",
-			income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1",
-			cost_center = "Main - TCP1", do_not_save=True)
+		pos = create_sales_invoice(
+			company="_Test Company with perpetual inventory",
+			debit_to="Debtors - TCP1",
+			item_code="_Test FG Item",
+			warehouse="Stores - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			do_not_save=True,
+		)
 
 		pos.is_pos = 1
 		pos.update_stock = 1
@@ -842,8 +990,10 @@
 		for tax in taxes:
 			pos.append("taxes", tax)
 
-		pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50})
-		pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 60})
+		pos.append(
+			"payments", {"mode_of_payment": "Bank Draft", "account": "_Test Bank - TCP1", "amount": 50}
+		)
+		pos.append("payments", {"mode_of_payment": "Cash", "account": "Cash - TCP1", "amount": 60})
 
 		pos.insert()
 		pos.submit()
@@ -853,40 +1003,50 @@
 
 		self.validate_pos_gl_entry(pos, pos, 60, validate_without_change_gle=True)
 
-		frappe.db.set_value('Accounts Settings', None, 'post_change_gl_entries', 1)
+		frappe.db.set_value("Accounts Settings", None, "post_change_gl_entries", 1)
 
 	def validate_pos_gl_entry(self, si, pos, cash_amount, validate_without_change_gle=False):
 		if validate_without_change_gle:
 			cash_amount -= pos.change_amount
 
 		# check stock ledger entries
-		sle = frappe.db.sql("""select * from `tabStock Ledger Entry`
+		sle = frappe.db.sql(
+			"""select * from `tabStock Ledger Entry`
 			where voucher_type = 'Sales Invoice' and voucher_no = %s""",
-			si.name, as_dict=1)[0]
+			si.name,
+			as_dict=1,
+		)[0]
 		self.assertTrue(sle)
-		self.assertEqual([sle.item_code, sle.warehouse, sle.actual_qty],
-			['_Test FG Item', 'Stores - TCP1', -1.0])
+		self.assertEqual(
+			[sle.item_code, sle.warehouse, sle.actual_qty], ["_Test FG Item", "Stores - TCP1", -1.0]
+		)
 
 		# check gl entries
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc, debit asc, credit asc""", si.name, as_dict=1)
+			order by account asc, debit asc, credit asc""",
+			si.name,
+			as_dict=1,
+		)
 		self.assertTrue(gl_entries)
 
-		stock_in_hand = get_inventory_account('_Test Company with perpetual inventory')
-		expected_gl_entries = sorted([
-			[si.debit_to, 100.0, 0.0],
-			[pos.items[0].income_account, 0.0, 89.09],
-			['Round Off - TCP1', 0.0, 0.01],
-			[pos.taxes[0].account_head, 0.0, 10.69],
-			[pos.taxes[1].account_head, 0.0, 0.21],
-			[stock_in_hand, 0.0, abs(sle.stock_value_difference)],
-			[pos.items[0].expense_account, abs(sle.stock_value_difference), 0.0],
-			[si.debit_to, 0.0, 50.0],
-			[si.debit_to, 0.0, cash_amount],
-			["_Test Bank - TCP1", 50, 0.0],
-			["Cash - TCP1", cash_amount, 0.0]
-		])
+		stock_in_hand = get_inventory_account("_Test Company with perpetual inventory")
+		expected_gl_entries = sorted(
+			[
+				[si.debit_to, 100.0, 0.0],
+				[pos.items[0].income_account, 0.0, 89.09],
+				["Round Off - TCP1", 0.0, 0.01],
+				[pos.taxes[0].account_head, 0.0, 10.69],
+				[pos.taxes[1].account_head, 0.0, 0.21],
+				[stock_in_hand, 0.0, abs(sle.stock_value_difference)],
+				[pos.items[0].expense_account, abs(sle.stock_value_difference), 0.0],
+				[si.debit_to, 0.0, 50.0],
+				[si.debit_to, 0.0, cash_amount],
+				["_Test Bank - TCP1", 50, 0.0],
+				["Cash - TCP1", cash_amount, 0.0],
+			]
+		)
 
 		for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)):
 			self.assertEqual(expected_gl_entries[i][0], gle.account)
@@ -894,8 +1054,11 @@
 			self.assertEqual(expected_gl_entries[i][2], gle.credit)
 
 		si.cancel()
-		gle = frappe.db.sql("""select * from `tabGL Entry`
-			where voucher_type='Sales Invoice' and voucher_no=%s""", si.name)
+		gle = frappe.db.sql(
+			"""select * from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no=%s""",
+			si.name,
+		)
 
 		self.assertTrue(gle)
 
@@ -915,21 +1078,29 @@
 		self.assertRaises(frappe.ValidationError, si.submit)
 
 	def test_sales_invoice_gl_entry_with_perpetual_inventory_no_item_code(self):
-		si = create_sales_invoice(company="_Test Company with perpetual inventory", debit_to = "Debtors - TCP1",
-			income_account="Sales - TCP1", cost_center = "Main - TCP1", do_not_save=True)
+		si = create_sales_invoice(
+			company="_Test Company with perpetual inventory",
+			debit_to="Debtors - TCP1",
+			income_account="Sales - TCP1",
+			cost_center="Main - TCP1",
+			do_not_save=True,
+		)
 		si.get("items")[0].item_code = None
 		si.insert()
 		si.submit()
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 		self.assertTrue(gl_entries)
 
-		expected_values = dict((d[0], d) for d in [
-			["Debtors - TCP1", 100.0, 0.0],
-			["Sales - TCP1", 0.0, 100.0]
-		])
+		expected_values = dict(
+			(d[0], d) for d in [["Debtors - TCP1", 100.0, 0.0], ["Sales - TCP1", 0.0, 100.0]]
+		)
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account][0], gle.account)
 			self.assertEqual(expected_values[gle.account][1], gle.debit)
@@ -938,25 +1109,32 @@
 	def test_sales_invoice_gl_entry_with_perpetual_inventory_non_stock_item(self):
 		si = create_sales_invoice(item="_Test Non Stock Item")
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 		self.assertTrue(gl_entries)
 
-		expected_values = dict((d[0], d) for d in [
-			[si.debit_to, 100.0, 0.0],
-			[test_records[1]["items"][0]["income_account"], 0.0, 100.0]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				[si.debit_to, 100.0, 0.0],
+				[test_records[1]["items"][0]["income_account"], 0.0, 100.0],
+			]
+		)
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account][0], gle.account)
 			self.assertEqual(expected_values[gle.account][1], gle.debit)
 			self.assertEqual(expected_values[gle.account][2], gle.credit)
 
-
 	def _insert_purchase_receipt(self):
 		from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import (
 			test_records as pr_test_records,
 		)
+
 		pr = frappe.copy_doc(pr_test_records[0])
 		pr.naming_series = "_T-Purchase Receipt-"
 		pr.insert()
@@ -966,6 +1144,7 @@
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import (
 			test_records as dn_test_records,
 		)
+
 		dn = frappe.copy_doc(dn_test_records[0])
 		dn.naming_series = "_T-Delivery Note-"
 		dn.insert()
@@ -983,24 +1162,37 @@
 
 		si = frappe.copy_doc(test_records[0])
 		si.allocate_advances_automatically = 0
-		si.append("advances", {
-			"doctype": "Sales Invoice Advance",
-			"reference_type": "Journal Entry",
-			"reference_name": jv.name,
-			"reference_row": jv.get("accounts")[0].name,
-			"advance_amount": 400,
-			"allocated_amount": 300,
-			"remarks": jv.remark
-		})
+		si.append(
+			"advances",
+			{
+				"doctype": "Sales Invoice Advance",
+				"reference_type": "Journal Entry",
+				"reference_name": jv.name,
+				"reference_row": jv.get("accounts")[0].name,
+				"advance_amount": 400,
+				"allocated_amount": 300,
+				"remarks": jv.remark,
+			},
+		)
 		si.insert()
 		si.submit()
 		si.load_from_db()
 
-		self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account`
-			where reference_name=%s""", si.name))
+		self.assertTrue(
+			frappe.db.sql(
+				"""select name from `tabJournal Entry Account`
+			where reference_name=%s""",
+				si.name,
+			)
+		)
 
-		self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account`
-			where reference_name=%s and credit_in_account_currency=300""", si.name))
+		self.assertTrue(
+			frappe.db.sql(
+				"""select name from `tabJournal Entry Account`
+			where reference_name=%s and credit_in_account_currency=300""",
+				si.name,
+			)
+		)
 
 		self.assertEqual(si.outstanding_amount, 262.0)
 
@@ -1022,29 +1214,34 @@
 		si.submit()
 
 		self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "warehouse"))
-		self.assertEqual(frappe.db.get_value("Serial No", serial_nos[0],
-			"delivery_document_no"), si.name)
+		self.assertEqual(
+			frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"), si.name
+		)
 
 		return si
 
 	def test_serialized_cancel(self):
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
 		si = self.test_serialized()
 		si.cancel()
 
 		serial_nos = get_serial_nos(si.get("items")[0].serial_no)
 
-		self.assertEqual(frappe.db.get_value("Serial No", serial_nos[0], "warehouse"), "_Test Warehouse - _TC")
-		self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0],
-			"delivery_document_no"))
+		self.assertEqual(
+			frappe.db.get_value("Serial No", serial_nos[0], "warehouse"), "_Test Warehouse - _TC"
+		)
+		self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "delivery_document_no"))
 		self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "sales_invoice"))
 
 	def test_serialize_status(self):
-		serial_no = frappe.get_doc({
-			"doctype": "Serial No",
-			"item_code": "_Test Serialized Item With Series",
-			"serial_no": make_autoname("SR", "Serial No")
-		})
+		serial_no = frappe.get_doc(
+			{
+				"doctype": "Serial No",
+				"item_code": "_Test Serialized Item With Series",
+				"serial_no": make_autoname("SR", "Serial No"),
+			}
+		)
 		serial_no.save()
 
 		si = frappe.copy_doc(test_records[0])
@@ -1058,8 +1255,8 @@
 
 	def test_serial_numbers_against_delivery_note(self):
 		"""
-			check if the sales invoice item serial numbers and the delivery note items
-			serial numbers are same
+		check if the sales invoice item serial numbers and the delivery note items
+		serial numbers are same
 		"""
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
@@ -1079,40 +1276,84 @@
 	def test_return_sales_invoice(self):
 		make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100)
 
-		actual_qty_0 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1")
+		actual_qty_0 = get_qty_after_transaction(item_code="_Test Item", warehouse="Stores - TCP1")
 
-		si = create_sales_invoice(qty = 5, rate=500, update_stock=1, company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1")
+		si = create_sales_invoice(
+			qty=5,
+			rate=500,
+			update_stock=1,
+			company="_Test Company with perpetual inventory",
+			debit_to="Debtors - TCP1",
+			item_code="_Test Item",
+			warehouse="Stores - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-
-		actual_qty_1 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1")
+		actual_qty_1 = get_qty_after_transaction(item_code="_Test Item", warehouse="Stores - TCP1")
 
 		self.assertEqual(actual_qty_0 - 5, actual_qty_1)
 
 		# outgoing_rate
-		outgoing_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Sales Invoice",
-			"voucher_no": si.name}, "stock_value_difference") / 5
+		outgoing_rate = (
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Sales Invoice", "voucher_no": si.name},
+				"stock_value_difference",
+			)
+			/ 5
+		)
 
 		# return entry
-		si1 = create_sales_invoice(is_return=1, return_against=si.name, qty=-2, rate=500, update_stock=1, company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1")
+		si1 = create_sales_invoice(
+			is_return=1,
+			return_against=si.name,
+			qty=-2,
+			rate=500,
+			update_stock=1,
+			company="_Test Company with perpetual inventory",
+			debit_to="Debtors - TCP1",
+			item_code="_Test Item",
+			warehouse="Stores - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-		actual_qty_2 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1")
+		actual_qty_2 = get_qty_after_transaction(item_code="_Test Item", warehouse="Stores - TCP1")
 		self.assertEqual(actual_qty_1 + 2, actual_qty_2)
 
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Sales Invoice", "voucher_no": si1.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
-		stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory', si1.items[0].warehouse)
+		stock_in_hand_account = get_inventory_account(
+			"_Test Company with perpetual inventory", si1.items[0].warehouse
+		)
 
 		# Check gl entry
-		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice",
-			"voucher_no": si1.name, "account": stock_in_hand_account}, "debit")
+		gle_warehouse_amount = frappe.db.get_value(
+			"GL Entry",
+			{"voucher_type": "Sales Invoice", "voucher_no": si1.name, "account": stock_in_hand_account},
+			"debit",
+		)
 
 		self.assertEqual(gle_warehouse_amount, stock_value_difference)
 
-		party_credited = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice",
-			"voucher_no": si1.name, "account": "Debtors - TCP1", "party": "_Test Customer"}, "credit")
+		party_credited = frappe.db.get_value(
+			"GL Entry",
+			{
+				"voucher_type": "Sales Invoice",
+				"voucher_no": si1.name,
+				"account": "Debtors - TCP1",
+				"party": "_Test Customer",
+			},
+			"credit",
+		)
 
 		self.assertEqual(party_credited, 1000)
 
@@ -1125,40 +1366,54 @@
 		asset = create_asset(item_code="Macbook Pro")
 
 		si = create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000)
-		return_si = create_sales_invoice(is_return=1, return_against=si.name, item_code="Macbook Pro", asset=asset.name, qty=-1, rate=90000)
+		return_si = create_sales_invoice(
+			is_return=1,
+			return_against=si.name,
+			item_code="Macbook Pro",
+			asset=asset.name,
+			qty=-1,
+			rate=90000,
+		)
 
 		disposal_account = frappe.get_cached_value("Company", "_Test Company", "disposal_account")
 
 		# Asset value is 100,000 but it was sold for 90,000, so there should be a loss of 10,000
 		loss_for_si = frappe.get_all(
 			"GL Entry",
-			filters = {
-				"voucher_no": si.name,
-				"account": disposal_account
-			},
-			fields = ["credit", "debit"]
+			filters={"voucher_no": si.name, "account": disposal_account},
+			fields=["credit", "debit"],
 		)[0]
 
 		loss_for_return_si = frappe.get_all(
 			"GL Entry",
-			filters = {
-				"voucher_no": return_si.name,
-				"account": disposal_account
-			},
-			fields = ["credit", "debit"]
+			filters={"voucher_no": return_si.name, "account": disposal_account},
+			fields=["credit", "debit"],
 		)[0]
 
-		self.assertEqual(loss_for_si['credit'], loss_for_return_si['debit'])
-		self.assertEqual(loss_for_si['debit'], loss_for_return_si['credit'])
+		self.assertEqual(loss_for_si["credit"], loss_for_return_si["debit"])
+		self.assertEqual(loss_for_si["debit"], loss_for_return_si["credit"])
 
 	def test_incoming_rate_for_stand_alone_credit_note(self):
-		return_si = create_sales_invoice(is_return=1, update_stock=1, qty=-1, rate=90000, incoming_rate=10,
-			company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', debit_to='Debtors - TCP1',
-			income_account='Sales - TCP1', expense_account='Cost of Goods Sold - TCP1', cost_center='Main - TCP1')
+		return_si = create_sales_invoice(
+			is_return=1,
+			update_stock=1,
+			qty=-1,
+			rate=90000,
+			incoming_rate=10,
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			debit_to="Debtors - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-		incoming_rate = frappe.db.get_value('Stock Ledger Entry', {'voucher_no': return_si.name}, 'incoming_rate')
-		debit_amount = frappe.db.get_value('GL Entry',
-			{'voucher_no': return_si.name, 'account': 'Stock In Hand - TCP1'}, 'debit')
+		incoming_rate = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": return_si.name}, "incoming_rate"
+		)
+		debit_amount = frappe.db.get_value(
+			"GL Entry", {"voucher_no": return_si.name, "account": "Stock In Hand - TCP1"}, "debit"
+		)
 
 		self.assertEqual(debit_amount, 10.0)
 		self.assertEqual(incoming_rate, 10.0)
@@ -1170,16 +1425,25 @@
 		si.insert()
 
 		expected_values = {
-			"keys": ["price_list_rate", "discount_percentage", "rate", "amount",
-				"base_price_list_rate", "base_rate", "base_amount",
-				"net_rate", "base_net_rate", "net_amount", "base_net_amount"],
+			"keys": [
+				"price_list_rate",
+				"discount_percentage",
+				"rate",
+				"amount",
+				"base_price_list_rate",
+				"base_rate",
+				"base_amount",
+				"net_rate",
+				"base_net_rate",
+				"net_amount",
+				"base_net_amount",
+			],
 			"_Test Item Home Desktop 100": [50, 0, 50, 500, 50, 50, 500, 25, 25, 250, 250],
 			"_Test Item Home Desktop 200": [150, 0, 150, 750, 150, 150, 750, 75, 75, 375, 375],
 		}
 
 		# check if children are saved
-		self.assertEqual(len(si.get("items")),
-			len(expected_values)-1)
+		self.assertEqual(len(si.get("items")), len(expected_values) - 1)
 
 		# check if item values are calculated
 		for d in si.get("items"):
@@ -1194,16 +1458,19 @@
 
 		# check tax calculation
 		expected_values = {
-			"keys": ["tax_amount", "tax_amount_after_discount_amount",
-				"base_tax_amount_after_discount_amount"],
+			"keys": [
+				"tax_amount",
+				"tax_amount_after_discount_amount",
+				"base_tax_amount_after_discount_amount",
+			],
 			"_Test Account Shipping Charges - _TC": [100, 100, 100],
 			"_Test Account Customs Duty - _TC": [62.5, 62.5, 62.5],
 			"_Test Account Excise Duty - _TC": [70, 70, 70],
 			"_Test Account Education Cess - _TC": [1.4, 1.4, 1.4],
-			"_Test Account S&H Education Cess - _TC": [.7, 0.7, 0.7],
+			"_Test Account S&H Education Cess - _TC": [0.7, 0.7, 0.7],
 			"_Test Account CST - _TC": [17.19, 17.19, 17.19],
 			"_Test Account VAT - _TC": [78.13, 78.13, 78.13],
-			"_Test Account Discount - _TC": [-95.49, -95.49, -95.49]
+			"_Test Account Discount - _TC": [-95.49, -95.49, -95.49],
 		}
 
 		for d in si.get("taxes"):
@@ -1211,19 +1478,26 @@
 				if expected_values.get(d.account_head):
 					self.assertEqual(d.get(k), expected_values[d.account_head][i])
 
-
 		self.assertEqual(si.total_taxes_and_charges, 234.43)
 		self.assertEqual(si.base_grand_total, 859.43)
 		self.assertEqual(si.grand_total, 859.43)
 
 	def test_multi_currency_gle(self):
-		si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 
-		gl_entries = frappe.db.sql("""select account, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -1233,26 +1507,35 @@
 				"debit": 5000,
 				"debit_in_account_currency": 100,
 				"credit": 0,
-				"credit_in_account_currency": 0
+				"credit_in_account_currency": 0,
 			},
 			"Sales - _TC": {
 				"account_currency": "INR",
 				"debit": 0,
 				"debit_in_account_currency": 0,
 				"credit": 5000,
-				"credit_in_account_currency": 5000
-			}
+				"credit_in_account_currency": 5000,
+			},
 		}
 
-		for field in ("account_currency", "debit", "debit_in_account_currency", "credit", "credit_in_account_currency"):
+		for field in (
+			"account_currency",
+			"debit",
+			"debit_in_account_currency",
+			"credit",
+			"credit_in_account_currency",
+		):
 			for i, gle in enumerate(gl_entries):
 				self.assertEqual(expected_values[gle.account][field], gle[field])
 
 		# cancel
 		si.cancel()
 
-		gle = frappe.db.sql("""select name from `tabGL Entry`
-			where voucher_type='Sales Invoice' and voucher_no=%s""", si.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no=%s""",
+			si.name,
+		)
 
 		self.assertTrue(gle)
 
@@ -1260,32 +1543,52 @@
 		# Customer currency = USD
 
 		# Transaction currency cannot be INR
-		si1 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			do_not_save=True)
+		si1 = create_sales_invoice(
+			customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC", do_not_save=True
+		)
 
 		self.assertRaises(InvalidCurrency, si1.save)
 
 		# Transaction currency cannot be EUR
-		si2 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="EUR", conversion_rate=80, do_not_save=True)
+		si2 = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="EUR",
+			conversion_rate=80,
+			do_not_save=True,
+		)
 
 		self.assertRaises(InvalidCurrency, si2.save)
 
 		# Transaction currency only allowed in USD
-		si3 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
-			currency="USD", conversion_rate=50)
+		si3 = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable USD - _TC",
+			currency="USD",
+			conversion_rate=50,
+		)
 
 		# Party Account currency must be in USD, as there is existing GLE with USD
-		si4 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable - _TC",
-			currency="USD", conversion_rate=50, do_not_submit=True)
+		si4 = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable - _TC",
+			currency="USD",
+			conversion_rate=50,
+			do_not_submit=True,
+		)
 
 		self.assertRaises(InvalidAccountCurrency, si4.submit)
 
 		# Party Account currency must be in USD, force customer currency as there is no GLE
 
 		si3.cancel()
-		si5 = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable - _TC",
-			currency="USD", conversion_rate=50, do_not_submit=True)
+		si5 = create_sales_invoice(
+			customer="_Test Customer USD",
+			debit_to="_Test Receivable - _TC",
+			currency="USD",
+			conversion_rate=50,
+			do_not_submit=True,
+		)
 
 		self.assertRaises(InvalidAccountCurrency, si5.submit)
 
@@ -1293,12 +1596,12 @@
 		si = create_sales_invoice(item_code="_Test Item", qty=1, do_not_submit=True)
 		price_list_rate = flt(100) * flt(si.plc_conversion_rate)
 		si.items[0].price_list_rate = price_list_rate
-		si.items[0].margin_type = 'Percentage'
+		si.items[0].margin_type = "Percentage"
 		si.items[0].margin_rate_or_amount = 25
 		si.items[0].discount_amount = 0.0
 		si.items[0].discount_percentage = 0.0
 		si.save()
-		self.assertEqual(si.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate))
+		self.assertEqual(si.get("items")[0].rate, flt((price_list_rate * 25) / 100 + price_list_rate))
 
 	def test_outstanding_amount_after_advance_jv_cancelation(self):
 		from erpnext.accounts.doctype.journal_entry.test_journal_entry import (
@@ -1306,89 +1609,107 @@
 		)
 
 		jv = frappe.copy_doc(jv_test_records[0])
-		jv.accounts[0].is_advance = 'Yes'
+		jv.accounts[0].is_advance = "Yes"
 		jv.insert()
 		jv.submit()
 
 		si = frappe.copy_doc(test_records[0])
-		si.append("advances", {
-			"doctype": "Sales Invoice Advance",
-			"reference_type": "Journal Entry",
-			"reference_name": jv.name,
-			"reference_row": jv.get("accounts")[0].name,
-			"advance_amount": 400,
-			"allocated_amount": 300,
-			"remarks": jv.remark
-		})
+		si.append(
+			"advances",
+			{
+				"doctype": "Sales Invoice Advance",
+				"reference_type": "Journal Entry",
+				"reference_name": jv.name,
+				"reference_row": jv.get("accounts")[0].name,
+				"advance_amount": 400,
+				"allocated_amount": 300,
+				"remarks": jv.remark,
+			},
+		)
 		si.insert()
 		si.submit()
 		si.load_from_db()
 
-		#check outstanding after advance allocation
-		self.assertEqual(flt(si.outstanding_amount),
-			flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount")))
+		# check outstanding after advance allocation
+		self.assertEqual(
+			flt(si.outstanding_amount),
+			flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount")),
+		)
 
-		#added to avoid Document has been modified exception
+		# added to avoid Document has been modified exception
 		jv = frappe.get_doc("Journal Entry", jv.name)
 		jv.cancel()
 
 		si.load_from_db()
-		#check outstanding after advance cancellation
-		self.assertEqual(flt(si.outstanding_amount),
-			flt(si.rounded_total + si.total_advance, si.precision("outstanding_amount")))
+		# check outstanding after advance cancellation
+		self.assertEqual(
+			flt(si.outstanding_amount),
+			flt(si.rounded_total + si.total_advance, si.precision("outstanding_amount")),
+		)
 
 	def test_outstanding_amount_after_advance_payment_entry_cancelation(self):
-		pe = frappe.get_doc({
-			"doctype": "Payment Entry",
-			"payment_type": "Receive",
-			"party_type": "Customer",
-			"party": "_Test Customer",
-			"company": "_Test Company",
-			"paid_from_account_currency": "INR",
-			"paid_to_account_currency": "INR",
-			"source_exchange_rate": 1,
-			"target_exchange_rate": 1,
-			"reference_no": "1",
-			"reference_date": nowdate(),
-			"received_amount": 300,
-			"paid_amount": 300,
-			"paid_from": "_Test Receivable - _TC",
-			"paid_to": "_Test Cash - _TC"
-		})
+		pe = frappe.get_doc(
+			{
+				"doctype": "Payment Entry",
+				"payment_type": "Receive",
+				"party_type": "Customer",
+				"party": "_Test Customer",
+				"company": "_Test Company",
+				"paid_from_account_currency": "INR",
+				"paid_to_account_currency": "INR",
+				"source_exchange_rate": 1,
+				"target_exchange_rate": 1,
+				"reference_no": "1",
+				"reference_date": nowdate(),
+				"received_amount": 300,
+				"paid_amount": 300,
+				"paid_from": "_Test Receivable - _TC",
+				"paid_to": "_Test Cash - _TC",
+			}
+		)
 		pe.insert()
 		pe.submit()
 
 		si = frappe.copy_doc(test_records[0])
 		si.is_pos = 0
-		si.append("advances", {
-			"doctype": "Sales Invoice Advance",
-			"reference_type": "Payment Entry",
-			"reference_name": pe.name,
-			"advance_amount": 300,
-			"allocated_amount": 300,
-			"remarks": pe.remarks
-		})
+		si.append(
+			"advances",
+			{
+				"doctype": "Sales Invoice Advance",
+				"reference_type": "Payment Entry",
+				"reference_name": pe.name,
+				"advance_amount": 300,
+				"allocated_amount": 300,
+				"remarks": pe.remarks,
+			},
+		)
 		si.insert()
 		si.submit()
 
 		si.load_from_db()
 
-		#check outstanding after advance allocation
-		self.assertEqual(flt(si.outstanding_amount),
-			flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount")))
+		# check outstanding after advance allocation
+		self.assertEqual(
+			flt(si.outstanding_amount),
+			flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount")),
+		)
 
-		#added to avoid Document has been modified exception
+		# added to avoid Document has been modified exception
 		pe = frappe.get_doc("Payment Entry", pe.name)
 		pe.cancel()
 
 		si.load_from_db()
-		#check outstanding after advance cancellation
-		self.assertEqual(flt(si.outstanding_amount),
-			flt(si.rounded_total + si.total_advance, si.precision("outstanding_amount")))
+		# check outstanding after advance cancellation
+		self.assertEqual(
+			flt(si.outstanding_amount),
+			flt(si.rounded_total + si.total_advance, si.precision("outstanding_amount")),
+		)
 
 	def test_multiple_uom_in_selling(self):
-		frappe.db.sql("""delete from `tabItem Price`
-			where price_list='_Test Price List' and item_code='_Test Item'""")
+		frappe.db.sql(
+			"""delete from `tabItem Price`
+			where price_list='_Test Price List' and item_code='_Test Item'"""
+		)
 		item_price = frappe.new_doc("Item Price")
 		item_price.price_list = "_Test Price List"
 		item_price.item_code = "_Test Item"
@@ -1402,9 +1723,18 @@
 		si.save()
 
 		expected_values = {
-			"keys": ["price_list_rate", "stock_uom", "uom", "conversion_factor", "rate", "amount",
-				"base_price_list_rate", "base_rate", "base_amount"],
-			"_Test Item": [1000, "_Test UOM", "_Test UOM 1", 10.0, 1000, 1000, 1000, 1000, 1000]
+			"keys": [
+				"price_list_rate",
+				"stock_uom",
+				"uom",
+				"conversion_factor",
+				"rate",
+				"amount",
+				"base_price_list_rate",
+				"base_rate",
+				"base_amount",
+			],
+			"_Test Item": [1000, "_Test UOM", "_Test UOM 1", 10.0, 1000, 1000, 1000, 1000, 1000],
 		}
 
 		# check if the conversion_factor and price_list_rate is calculated according to uom
@@ -1419,23 +1749,10 @@
 		itemised_tax, itemised_taxable_amount = get_itemised_tax_breakup_data(si)
 
 		expected_itemised_tax = {
-			"_Test Item": {
-				"Service Tax": {
-					"tax_rate": 10.0,
-					"tax_amount": 1000.0
-				}
-			},
-			"_Test Item 2": {
-				"Service Tax": {
-					"tax_rate": 10.0,
-					"tax_amount": 500.0
-				}
-			}
+			"_Test Item": {"Service Tax": {"tax_rate": 10.0, "tax_amount": 1000.0}},
+			"_Test Item 2": {"Service Tax": {"tax_rate": 10.0, "tax_amount": 500.0}},
 		}
-		expected_itemised_taxable_amount = {
-			"_Test Item": 10000.0,
-			"_Test Item 2": 5000.0
-		}
+		expected_itemised_taxable_amount = {"_Test Item": 10000.0, "_Test Item 2": 5000.0}
 
 		self.assertEqual(itemised_tax, expected_itemised_tax)
 		self.assertEqual(itemised_taxable_amount, expected_itemised_taxable_amount)
@@ -1450,23 +1767,10 @@
 		itemised_tax, itemised_taxable_amount = get_itemised_tax_breakup_data(si)
 
 		expected_itemised_tax = {
-			"_Test Item": {
-				"Service Tax": {
-					"tax_rate": 10.0,
-					"tax_amount": 1000.0
-				}
-			},
-			"_Test Item 2": {
-				"Service Tax": {
-					"tax_rate": 10.0,
-					"tax_amount": 500.0
-				}
-			}
+			"_Test Item": {"Service Tax": {"tax_rate": 10.0, "tax_amount": 1000.0}},
+			"_Test Item 2": {"Service Tax": {"tax_rate": 10.0, "tax_amount": 500.0}},
 		}
-		expected_itemised_taxable_amount = {
-			"_Test Item": 10000.0,
-			"_Test Item 2": 5000.0
-		}
+		expected_itemised_taxable_amount = {"_Test Item": 10000.0, "_Test Item 2": 5000.0}
 
 		self.assertEqual(itemised_tax, expected_itemised_tax)
 		self.assertEqual(itemised_taxable_amount, expected_itemised_taxable_amount)
@@ -1475,59 +1779,73 @@
 
 	def create_si_to_test_tax_breakup(self):
 		si = create_sales_invoice(qty=100, rate=50, do_not_save=True)
-		si.append("items", {
-			"item_code": "_Test Item",
-			"gst_hsn_code": "999800",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 100,
-			"rate": 50,
-			"income_account": "Sales - _TC",
-			"expense_account": "Cost of Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC"
-		})
-		si.append("items", {
-			"item_code": "_Test Item 2",
-			"gst_hsn_code": "999800",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 100,
-			"rate": 50,
-			"income_account": "Sales - _TC",
-			"expense_account": "Cost of Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC"
-		})
+		si.append(
+			"items",
+			{
+				"item_code": "_Test Item",
+				"gst_hsn_code": "999800",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 100,
+				"rate": 50,
+				"income_account": "Sales - _TC",
+				"expense_account": "Cost of Goods Sold - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+			},
+		)
+		si.append(
+			"items",
+			{
+				"item_code": "_Test Item 2",
+				"gst_hsn_code": "999800",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 100,
+				"rate": 50,
+				"income_account": "Sales - _TC",
+				"expense_account": "Cost of Goods Sold - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+			},
+		)
 
-		si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account Service Tax - _TC",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Service Tax",
-			"rate": 10
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Service Tax - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Service Tax",
+				"rate": 10,
+			},
+		)
 		si.insert()
 		return si
 
 	def test_company_monthly_sales(self):
-		existing_current_month_sales = frappe.get_cached_value('Company',  "_Test Company",  "total_monthly_sales")
+		existing_current_month_sales = frappe.get_cached_value(
+			"Company", "_Test Company", "total_monthly_sales"
+		)
 
 		si = create_sales_invoice()
-		current_month_sales = frappe.get_cached_value('Company',  "_Test Company",  "total_monthly_sales")
+		current_month_sales = frappe.get_cached_value("Company", "_Test Company", "total_monthly_sales")
 		self.assertEqual(current_month_sales, existing_current_month_sales + si.base_grand_total)
 
 		si.cancel()
-		current_month_sales = frappe.get_cached_value('Company',  "_Test Company",  "total_monthly_sales")
+		current_month_sales = frappe.get_cached_value("Company", "_Test Company", "total_monthly_sales")
 		self.assertEqual(current_month_sales, existing_current_month_sales)
 
 	def test_rounding_adjustment(self):
 		si = create_sales_invoice(rate=24900, do_not_save=True)
 		for tax in ["Tax 1", "Tax2"]:
-			si.append("taxes", {
-				"charge_type": "On Net Total",
-				"account_head": "_Test Account Service Tax - _TC",
-				"description": tax,
-				"rate": 14,
-				"cost_center": "_Test Cost Center - _TC",
-				"included_in_print_rate": 1
-			})
+			si.append(
+				"taxes",
+				{
+					"charge_type": "On Net Total",
+					"account_head": "_Test Account Service Tax - _TC",
+					"description": tax,
+					"rate": 14,
+					"cost_center": "_Test Cost Center - _TC",
+					"included_in_print_rate": 1,
+				},
+			)
 		si.save()
 		si.submit()
 		self.assertEqual(si.net_total, 19453.13)
@@ -1535,16 +1853,23 @@
 		self.assertEqual(si.total_taxes_and_charges, 5446.88)
 		self.assertEqual(si.rounding_adjustment, -0.01)
 
-		expected_values = dict((d[0], d) for d in [
-			[si.debit_to, 24900, 0.0],
-			["_Test Account Service Tax - _TC", 0.0, 5446.88],
-			["Sales - _TC", 0.0, 19453.13],
-			["Round Off - _TC", 0.01, 0.0]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				[si.debit_to, 24900, 0.0],
+				["_Test Account Service Tax - _TC", 0.0, 5446.88],
+				["Sales - _TC", 0.0, 19453.13],
+				["Round Off - _TC", 0.01, 0.0],
+			]
+		)
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.account)
@@ -1554,24 +1879,30 @@
 	def test_rounding_adjustment_2(self):
 		si = create_sales_invoice(rate=400, do_not_save=True)
 		for rate in [400, 600, 100]:
-			si.append("items", {
-				"item_code": "_Test Item",
-				"gst_hsn_code": "999800",
-				"warehouse": "_Test Warehouse - _TC",
-				"qty": 1,
-				"rate": rate,
-				"income_account": "Sales - _TC",
-				"cost_center": "_Test Cost Center - _TC"
-			})
+			si.append(
+				"items",
+				{
+					"item_code": "_Test Item",
+					"gst_hsn_code": "999800",
+					"warehouse": "_Test Warehouse - _TC",
+					"qty": 1,
+					"rate": rate,
+					"income_account": "Sales - _TC",
+					"cost_center": "_Test Cost Center - _TC",
+				},
+			)
 		for tax_account in ["_Test Account VAT - _TC", "_Test Account Service Tax - _TC"]:
-			si.append("taxes", {
-				"charge_type": "On Net Total",
-				"account_head": tax_account,
-				"description": tax_account,
-				"rate": 9,
-				"cost_center": "_Test Cost Center - _TC",
-				"included_in_print_rate": 1
-			})
+			si.append(
+				"taxes",
+				{
+					"charge_type": "On Net Total",
+					"account_head": tax_account,
+					"description": tax_account,
+					"rate": 9,
+					"cost_center": "_Test Cost Center - _TC",
+					"included_in_print_rate": 1,
+				},
+			)
 		si.save()
 		si.submit()
 		self.assertEqual(si.net_total, 1271.19)
@@ -1579,16 +1910,23 @@
 		self.assertEqual(si.total_taxes_and_charges, 228.82)
 		self.assertEqual(si.rounding_adjustment, -0.01)
 
-		expected_values = dict((d[0], d) for d in [
-			[si.debit_to, 1500, 0.0],
-			["_Test Account Service Tax - _TC", 0.0, 114.41],
-			["_Test Account VAT - _TC", 0.0, 114.41],
-			["Sales - _TC", 0.0, 1271.18]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				[si.debit_to, 1500, 0.0],
+				["_Test Account Service Tax - _TC", 0.0, 114.41],
+				["_Test Account VAT - _TC", 0.0, 114.41],
+				["Sales - _TC", 0.0, 1271.18],
+			]
+		)
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.account)
@@ -1599,24 +1937,30 @@
 		si = create_sales_invoice(do_not_save=True)
 		si.items = []
 		for d in [(1122, 2), (1122.01, 1), (1122.01, 1)]:
-			si.append("items", {
-				"item_code": "_Test Item",
-				"gst_hsn_code": "999800",
-				"warehouse": "_Test Warehouse - _TC",
-				"qty": d[1],
-				"rate": d[0],
-				"income_account": "Sales - _TC",
-				"cost_center": "_Test Cost Center - _TC"
-			})
+			si.append(
+				"items",
+				{
+					"item_code": "_Test Item",
+					"gst_hsn_code": "999800",
+					"warehouse": "_Test Warehouse - _TC",
+					"qty": d[1],
+					"rate": d[0],
+					"income_account": "Sales - _TC",
+					"cost_center": "_Test Cost Center - _TC",
+				},
+			)
 		for tax_account in ["_Test Account VAT - _TC", "_Test Account Service Tax - _TC"]:
-			si.append("taxes", {
-				"charge_type": "On Net Total",
-				"account_head": tax_account,
-				"description": tax_account,
-				"rate": 6,
-				"cost_center": "_Test Cost Center - _TC",
-				"included_in_print_rate": 1
-			})
+			si.append(
+				"taxes",
+				{
+					"charge_type": "On Net Total",
+					"account_head": tax_account,
+					"description": tax_account,
+					"rate": 6,
+					"cost_center": "_Test Cost Center - _TC",
+					"included_in_print_rate": 1,
+				},
+			)
 		si.save()
 		si.submit()
 		self.assertEqual(si.net_total, 4007.16)
@@ -1624,31 +1968,40 @@
 		self.assertEqual(si.total_taxes_and_charges, 480.86)
 		self.assertEqual(si.rounding_adjustment, -0.02)
 
-		expected_values = dict((d[0], d) for d in [
-			[si.debit_to, 4488.0, 0.0],
-			["_Test Account Service Tax - _TC", 0.0, 240.43],
-			["_Test Account VAT - _TC", 0.0, 240.43],
-			["Sales - _TC", 0.0, 4007.15],
-			["Round Off - _TC", 0.01, 0]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				[si.debit_to, 4488.0, 0.0],
+				["_Test Account Service Tax - _TC", 0.0, 240.43],
+				["_Test Account VAT - _TC", 0.0, 240.43],
+				["Sales - _TC", 0.0, 4007.15],
+				["Round Off - _TC", 0.01, 0],
+			]
+		)
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		debit_credit_diff = 0
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.account)
 			self.assertEqual(expected_values[gle.account][1], gle.debit)
 			self.assertEqual(expected_values[gle.account][2], gle.credit)
-			debit_credit_diff += (gle.debit - gle.credit)
+			debit_credit_diff += gle.debit - gle.credit
 
 		self.assertEqual(debit_credit_diff, 0)
 
 	def test_sales_invoice_with_shipping_rule(self):
 		from erpnext.accounts.doctype.shipping_rule.test_shipping_rule import create_shipping_rule
 
-		shipping_rule = create_shipping_rule(shipping_rule_type = "Selling", shipping_rule_name = "Shipping Rule - Sales Invoice Test")
+		shipping_rule = create_shipping_rule(
+			shipping_rule_type="Selling", shipping_rule_name="Shipping Rule - Sales Invoice Test"
+		)
 
 		si = frappe.copy_doc(test_records[2])
 
@@ -1661,29 +2014,32 @@
 		self.assertEqual(si.total_taxes_and_charges, 468.85)
 		self.assertEqual(si.grand_total, 1718.85)
 
-
-
 	def test_create_invoice_without_terms(self):
 		si = create_sales_invoice(do_not_save=1)
-		self.assertFalse(si.get('payment_schedule'))
+		self.assertFalse(si.get("payment_schedule"))
 
 		si.insert()
-		self.assertTrue(si.get('payment_schedule'))
+		self.assertTrue(si.get("payment_schedule"))
 
 	def test_duplicate_due_date_in_terms(self):
 		si = create_sales_invoice(do_not_save=1)
-		si.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50))
-		si.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50))
+		si.append(
+			"payment_schedule", dict(due_date="2017-01-01", invoice_portion=50.00, payment_amount=50)
+		)
+		si.append(
+			"payment_schedule", dict(due_date="2017-01-01", invoice_portion=50.00, payment_amount=50)
+		)
 
 		self.assertRaises(frappe.ValidationError, si.insert)
 
 	def test_credit_note(self):
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
 
-		si = create_sales_invoice(item_code = "_Test Item", qty = (5 * -1), rate=500, is_return = 1)
+		si = create_sales_invoice(item_code="_Test Item", qty=(5 * -1), rate=500, is_return=1)
 
-		outstanding_amount = get_outstanding_amount(si.doctype,
-			si.name, "Debtors - _TC", si.customer, "Customer")
+		outstanding_amount = get_outstanding_amount(
+			si.doctype, si.name, "Debtors - _TC", si.customer, "Customer"
+		)
 
 		self.assertEqual(si.outstanding_amount, outstanding_amount)
 
@@ -1698,30 +2054,31 @@
 		pe.insert()
 		pe.submit()
 
-		si_doc = frappe.get_doc('Sales Invoice', si.name)
+		si_doc = frappe.get_doc("Sales Invoice", si.name)
 		self.assertEqual(si_doc.outstanding_amount, 0)
 
 	def test_sales_invoice_with_cost_center(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
+
 		cost_center = "_Test Cost Center for BS Account - _TC"
 		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company")
 
-		si =  create_sales_invoice_against_cost_center(cost_center=cost_center, debit_to="Debtors - _TC")
+		si = create_sales_invoice_against_cost_center(cost_center=cost_center, debit_to="Debtors - _TC")
 		self.assertEqual(si.cost_center, cost_center)
 
 		expected_values = {
-			"Debtors - _TC": {
-				"cost_center": cost_center
-			},
-			"Sales - _TC": {
-				"cost_center": cost_center
-			}
+			"Debtors - _TC": {"cost_center": cost_center},
+			"Sales - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -1731,16 +2088,20 @@
 	def test_sales_invoice_with_project_link(self):
 		from erpnext.projects.doctype.project.test_project import make_project
 
-		project = make_project({
-			'project_name': 'Sales Invoice Project',
-			'project_template_name': 'Test Project Template',
-			'start_date': '2020-01-01'
-		})
-		item_project = make_project({
-			'project_name': 'Sales Invoice Item Project',
-			'project_template_name': 'Test Project Template',
-			'start_date': '2019-06-01'
-		})
+		project = make_project(
+			{
+				"project_name": "Sales Invoice Project",
+				"project_template_name": "Test Project Template",
+				"start_date": "2020-01-01",
+			}
+		)
+		item_project = make_project(
+			{
+				"project_name": "Sales Invoice Item Project",
+				"project_template_name": "Test Project Template",
+				"start_date": "2019-06-01",
+			}
+		)
 
 		sales_invoice = create_sales_invoice(do_not_save=1)
 		sales_invoice.items[0].project = item_project.name
@@ -1749,18 +2110,18 @@
 		sales_invoice.submit()
 
 		expected_values = {
-			"Debtors - _TC": {
-				"project": project.name
-			},
-			"Sales - _TC": {
-				"project": item_project.name
-			}
+			"Debtors - _TC": {"project": project.name},
+			"Sales - _TC": {"project": item_project.name},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, project, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, project, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", sales_invoice.name, as_dict=1)
+			order by account asc""",
+			sales_invoice.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -1769,21 +2130,21 @@
 
 	def test_sales_invoice_without_cost_center(self):
 		cost_center = "_Test Cost Center - _TC"
-		si =  create_sales_invoice(debit_to="Debtors - _TC")
+		si = create_sales_invoice(debit_to="Debtors - _TC")
 
 		expected_values = {
-			"Debtors - _TC": {
-				"cost_center": None
-			},
-			"Sales - _TC": {
-				"cost_center": cost_center
-			}
+			"Debtors - _TC": {"cost_center": None},
+			"Sales - _TC": {"cost_center": cost_center},
 		}
 
-		gl_entries = frappe.db.sql("""select account, cost_center, account_currency, debit, credit,
+		gl_entries = frappe.db.sql(
+			"""select account, cost_center, account_currency, debit, credit,
 			debit_in_account_currency, credit_in_account_currency
 			from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
-			order by account asc""", si.name, as_dict=1)
+			order by account asc""",
+			si.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
@@ -1791,8 +2152,11 @@
 			self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
 
 	def test_deferred_revenue(self):
-		deferred_account = create_account(account_name="Deferred Revenue",
-			parent_account="Current Liabilities - _TC", company="_Test Company")
+		deferred_account = create_account(
+			account_name="Deferred Revenue",
+			parent_account="Current Liabilities - _TC",
+			company="_Test Company",
+		)
 
 		item = create_item("_Test Item for Deferred Accounting")
 		item.enable_deferred_revenue = 1
@@ -1808,14 +2172,16 @@
 		si.save()
 		si.submit()
 
-		pda1 = frappe.get_doc(dict(
-			doctype='Process Deferred Accounting',
-			posting_date=nowdate(),
-			start_date="2019-01-01",
-			end_date="2019-03-31",
-			type="Income",
-			company="_Test Company"
-		))
+		pda1 = frappe.get_doc(
+			dict(
+				doctype="Process Deferred Accounting",
+				posting_date=nowdate(),
+				start_date="2019-01-01",
+				end_date="2019-03-31",
+				type="Income",
+				company="_Test Company",
+			)
+		)
 
 		pda1.insert()
 		pda1.submit()
@@ -1826,17 +2192,20 @@
 			[deferred_account, 43.08, 0.0, "2019-02-28"],
 			["Sales - _TC", 0.0, 43.08, "2019-02-28"],
 			[deferred_account, 23.07, 0.0, "2019-03-15"],
-			["Sales - _TC", 0.0, 23.07, "2019-03-15"]
+			["Sales - _TC", 0.0, 23.07, "2019-03-15"],
 		]
 
 		check_gl_entries(self, si.name, expected_gle, "2019-01-30")
 
 	def test_fixed_deferred_revenue(self):
-		deferred_account = create_account(account_name="Deferred Revenue",
-			parent_account="Current Liabilities - _TC", company="_Test Company")
+		deferred_account = create_account(
+			account_name="Deferred Revenue",
+			parent_account="Current Liabilities - _TC",
+			company="_Test Company",
+		)
 
-		acc_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
-		acc_settings.book_deferred_entries_based_on = 'Months'
+		acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
+		acc_settings.book_deferred_entries_based_on = "Months"
 		acc_settings.save()
 
 		item = create_item("_Test Item for Deferred Accounting")
@@ -1845,7 +2214,9 @@
 		item.no_of_months = 12
 		item.save()
 
-		si = create_sales_invoice(item=item.name, posting_date="2019-01-16", rate=50000, do_not_submit=True)
+		si = create_sales_invoice(
+			item=item.name, posting_date="2019-01-16", rate=50000, do_not_submit=True
+		)
 		si.items[0].enable_deferred_revenue = 1
 		si.items[0].service_start_date = "2019-01-16"
 		si.items[0].service_end_date = "2019-03-31"
@@ -1853,14 +2224,16 @@
 		si.save()
 		si.submit()
 
-		pda1 = frappe.get_doc(dict(
-			doctype='Process Deferred Accounting',
-			posting_date='2019-03-31',
-			start_date="2019-01-01",
-			end_date="2019-03-31",
-			type="Income",
-			company="_Test Company"
-		))
+		pda1 = frappe.get_doc(
+			dict(
+				doctype="Process Deferred Accounting",
+				posting_date="2019-03-31",
+				start_date="2019-01-01",
+				end_date="2019-03-31",
+				type="Income",
+				company="_Test Company",
+			)
+		)
 
 		pda1.insert()
 		pda1.submit()
@@ -1871,13 +2244,13 @@
 			[deferred_account, 20000.0, 0.0, "2019-02-28"],
 			["Sales - _TC", 0.0, 20000.0, "2019-02-28"],
 			[deferred_account, 20000.0, 0.0, "2019-03-31"],
-			["Sales - _TC", 0.0, 20000.0, "2019-03-31"]
+			["Sales - _TC", 0.0, 20000.0, "2019-03-31"],
 		]
 
 		check_gl_entries(self, si.name, expected_gle, "2019-01-30")
 
-		acc_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
-		acc_settings.book_deferred_entries_based_on = 'Days'
+		acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
+		acc_settings.book_deferred_entries_based_on = "Days"
 		acc_settings.save()
 
 	def test_inter_company_transaction(self):
@@ -1886,45 +2259,47 @@
 		create_internal_customer(
 			customer_name="_Test Internal Customer",
 			represents_company="_Test Company 1",
-			allowed_to_interact_with="Wind Power LLC"
+			allowed_to_interact_with="Wind Power LLC",
 		)
 
 		if not frappe.db.exists("Supplier", "_Test Internal Supplier"):
-			supplier = frappe.get_doc({
-				"supplier_group": "_Test Supplier Group",
-				"supplier_name": "_Test Internal Supplier",
-				"doctype": "Supplier",
-				"is_internal_supplier": 1,
-				"represents_company": "Wind Power LLC"
-			})
+			supplier = frappe.get_doc(
+				{
+					"supplier_group": "_Test Supplier Group",
+					"supplier_name": "_Test Internal Supplier",
+					"doctype": "Supplier",
+					"is_internal_supplier": 1,
+					"represents_company": "Wind Power LLC",
+				}
+			)
 
-			supplier.append("companies", {
-				"company": "_Test Company 1"
-			})
+			supplier.append("companies", {"company": "_Test Company 1"})
 
 			supplier.insert()
 
 		si = create_sales_invoice(
-			company = "Wind Power LLC",
-			customer = "_Test Internal Customer",
-			debit_to = "Debtors - WP",
-			warehouse = "Stores - WP",
-			income_account = "Sales - WP",
-			expense_account = "Cost of Goods Sold - WP",
-			cost_center = "Main - WP",
-			currency = "USD",
-			do_not_save = 1
+			company="Wind Power LLC",
+			customer="_Test Internal Customer",
+			debit_to="Debtors - WP",
+			warehouse="Stores - WP",
+			income_account="Sales - WP",
+			expense_account="Cost of Goods Sold - WP",
+			cost_center="Main - WP",
+			currency="USD",
+			do_not_save=1,
 		)
 
 		si.selling_price_list = "_Test Price List Rest of the World"
 		si.submit()
 
 		target_doc = make_inter_company_transaction("Sales Invoice", si.name)
-		target_doc.items[0].update({
-			"expense_account": "Cost of Goods Sold - _TC1",
-			"cost_center": "Main - _TC1",
-			"warehouse": "Stores - _TC1"
-		})
+		target_doc.items[0].update(
+			{
+				"expense_account": "Cost of Goods Sold - _TC1",
+				"cost_center": "Main - _TC1",
+				"warehouse": "Stores - _TC1",
+			}
+		)
 		target_doc.submit()
 
 		self.assertEqual(target_doc.company, "_Test Company 1")
@@ -1936,57 +2311,66 @@
 		old_negative_stock = frappe.db.get_single_value("Stock Settings", "allow_negative_stock")
 		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
 
-		old_perpetual_inventory = erpnext.is_perpetual_inventory_enabled('_Test Company 1')
-		frappe.local.enable_perpetual_inventory['_Test Company 1'] = 1
+		old_perpetual_inventory = erpnext.is_perpetual_inventory_enabled("_Test Company 1")
+		frappe.local.enable_perpetual_inventory["_Test Company 1"] = 1
 
-		frappe.db.set_value("Company", '_Test Company 1', "stock_received_but_not_billed", "Stock Received But Not Billed - _TC1")
-		frappe.db.set_value("Company", '_Test Company 1', "expenses_included_in_valuation", "Expenses Included In Valuation - _TC1")
-
+		frappe.db.set_value(
+			"Company",
+			"_Test Company 1",
+			"stock_received_but_not_billed",
+			"Stock Received But Not Billed - _TC1",
+		)
+		frappe.db.set_value(
+			"Company",
+			"_Test Company 1",
+			"expenses_included_in_valuation",
+			"Expenses Included In Valuation - _TC1",
+		)
 
 		if not frappe.db.exists("Customer", "_Test Internal Customer"):
-			customer = frappe.get_doc({
-				"customer_group": "_Test Customer Group",
-				"customer_name": "_Test Internal Customer",
-				"customer_type": "Individual",
-				"doctype": "Customer",
-				"territory": "_Test Territory",
-				"is_internal_customer": 1,
-				"represents_company": "_Test Company 1"
-			})
+			customer = frappe.get_doc(
+				{
+					"customer_group": "_Test Customer Group",
+					"customer_name": "_Test Internal Customer",
+					"customer_type": "Individual",
+					"doctype": "Customer",
+					"territory": "_Test Territory",
+					"is_internal_customer": 1,
+					"represents_company": "_Test Company 1",
+				}
+			)
 
-			customer.append("companies", {
-				"company": "Wind Power LLC"
-			})
+			customer.append("companies", {"company": "Wind Power LLC"})
 
 			customer.insert()
 
 		if not frappe.db.exists("Supplier", "_Test Internal Supplier"):
-			supplier = frappe.get_doc({
-				"supplier_group": "_Test Supplier Group",
-				"supplier_name": "_Test Internal Supplier",
-				"doctype": "Supplier",
-				"is_internal_supplier": 1,
-				"represents_company": "Wind Power LLC"
-			})
+			supplier = frappe.get_doc(
+				{
+					"supplier_group": "_Test Supplier Group",
+					"supplier_name": "_Test Internal Supplier",
+					"doctype": "Supplier",
+					"is_internal_supplier": 1,
+					"represents_company": "Wind Power LLC",
+				}
+			)
 
-			supplier.append("companies", {
-				"company": "_Test Company 1"
-			})
+			supplier.append("companies", {"company": "_Test Company 1"})
 
 			supplier.insert()
 
 		# begin test
 		si = create_sales_invoice(
-			company = "Wind Power LLC",
-			customer = "_Test Internal Customer",
-			debit_to = "Debtors - WP",
-			warehouse = "Stores - WP",
-			income_account = "Sales - WP",
-			expense_account = "Cost of Goods Sold - WP",
-			cost_center = "Main - WP",
-			currency = "USD",
-			update_stock = 1,
-			do_not_save = 1
+			company="Wind Power LLC",
+			customer="_Test Internal Customer",
+			debit_to="Debtors - WP",
+			warehouse="Stores - WP",
+			income_account="Sales - WP",
+			expense_account="Cost of Goods Sold - WP",
+			cost_center="Main - WP",
+			currency="USD",
+			update_stock=1,
+			do_not_save=1,
 		)
 		si.selling_price_list = "_Test Price List Rest of the World"
 		si.submit()
@@ -2007,19 +2391,19 @@
 		target_doc.save()
 
 		# after warehouse is set, linked account or default inventory account is set
-		self.assertEqual(target_doc.items[0].expense_account, 'Stock In Hand - _TC1')
+		self.assertEqual(target_doc.items[0].expense_account, "Stock In Hand - _TC1")
 
 		# tear down
-		frappe.local.enable_perpetual_inventory['_Test Company 1'] = old_perpetual_inventory
+		frappe.local.enable_perpetual_inventory["_Test Company 1"] = old_perpetual_inventory
 		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", old_negative_stock)
 
 	def test_sle_for_target_warehouse(self):
 		se = make_stock_entry(
 			item_code="138-CMS Shoe",
 			target="Finished Goods - _TC",
-			company = "_Test Company",
+			company="_Test Company",
 			qty=1,
-			basic_rate=500
+			basic_rate=500,
 		)
 
 		si = frappe.copy_doc(test_records[0])
@@ -2031,8 +2415,9 @@
 		si.insert()
 		si.submit()
 
-		sles = frappe.get_all("Stock Ledger Entry", filters={"voucher_no": si.name},
-			fields=["name", "actual_qty"])
+		sles = frappe.get_all(
+			"Stock Ledger Entry", filters={"voucher_no": si.name}, fields=["name", "actual_qty"]
+		)
 
 		# check if both SLEs are created
 		self.assertEqual(len(sles), 2)
@@ -2046,82 +2431,92 @@
 		## Create internal transfer account
 		from erpnext.selling.doctype.customer.test_customer import create_internal_customer
 
-		account = create_account(account_name="Unrealized Profit",
-			parent_account="Current Liabilities - TCP1", company="_Test Company with perpetual inventory")
+		account = create_account(
+			account_name="Unrealized Profit",
+			parent_account="Current Liabilities - TCP1",
+			company="_Test Company with perpetual inventory",
+		)
 
-		frappe.db.set_value('Company', '_Test Company with perpetual inventory',
-			'unrealized_profit_loss_account', account)
+		frappe.db.set_value(
+			"Company", "_Test Company with perpetual inventory", "unrealized_profit_loss_account", account
+		)
 
-		customer = create_internal_customer("_Test Internal Customer 2", "_Test Company with perpetual inventory",
-			"_Test Company with perpetual inventory")
+		customer = create_internal_customer(
+			"_Test Internal Customer 2",
+			"_Test Company with perpetual inventory",
+			"_Test Company with perpetual inventory",
+		)
 
-		create_internal_supplier("_Test Internal Supplier 2", "_Test Company with perpetual inventory",
-			"_Test Company with perpetual inventory")
+		create_internal_supplier(
+			"_Test Internal Supplier 2",
+			"_Test Company with perpetual inventory",
+			"_Test Company with perpetual inventory",
+		)
 
 		si = create_sales_invoice(
-			company = "_Test Company with perpetual inventory",
-			customer = customer,
-			debit_to = "Debtors - TCP1",
-			warehouse = "Stores - TCP1",
-			income_account = "Sales - TCP1",
-			expense_account = "Cost of Goods Sold - TCP1",
-			cost_center = "Main - TCP1",
-			currency = "INR",
-			do_not_save = 1
+			company="_Test Company with perpetual inventory",
+			customer=customer,
+			debit_to="Debtors - TCP1",
+			warehouse="Stores - TCP1",
+			income_account="Sales - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			currency="INR",
+			do_not_save=1,
 		)
 
 		si.selling_price_list = "_Test Price List Rest of the World"
 		si.update_stock = 1
-		si.items[0].target_warehouse = 'Work In Progress - TCP1'
+		si.items[0].target_warehouse = "Work In Progress - TCP1"
 
 		# Add stock to stores for succesful stock transfer
 		make_stock_entry(
-			target="Stores - TCP1",
-			company = "_Test Company with perpetual inventory",
-			qty=1,
-			basic_rate=100
+			target="Stores - TCP1", company="_Test Company with perpetual inventory", qty=1, basic_rate=100
 		)
 
 		add_taxes(si)
 		si.save()
 
 		rate = 0.0
-		for d in si.get('items'):
-			rate = get_incoming_rate({
-				"item_code": d.item_code,
-				"warehouse": d.warehouse,
-				"posting_date": si.posting_date,
-				"posting_time": si.posting_time,
-				"qty": -1 * flt(d.get('stock_qty')),
-				"serial_no": d.serial_no,
-				"company": si.company,
-				"voucher_type": 'Sales Invoice',
-				"voucher_no": si.name,
-				"allow_zero_valuation": d.get("allow_zero_valuation")
-			}, raise_error_if_no_rate=False)
+		for d in si.get("items"):
+			rate = get_incoming_rate(
+				{
+					"item_code": d.item_code,
+					"warehouse": d.warehouse,
+					"posting_date": si.posting_date,
+					"posting_time": si.posting_time,
+					"qty": -1 * flt(d.get("stock_qty")),
+					"serial_no": d.serial_no,
+					"company": si.company,
+					"voucher_type": "Sales Invoice",
+					"voucher_no": si.name,
+					"allow_zero_valuation": d.get("allow_zero_valuation"),
+				},
+				raise_error_if_no_rate=False,
+			)
 
 			rate = flt(rate, 2)
 
 		si.submit()
 
 		target_doc = make_inter_company_transaction("Sales Invoice", si.name)
-		target_doc.company = '_Test Company with perpetual inventory'
-		target_doc.items[0].warehouse = 'Finished Goods - TCP1'
+		target_doc.company = "_Test Company with perpetual inventory"
+		target_doc.items[0].warehouse = "Finished Goods - TCP1"
 		add_taxes(target_doc)
 		target_doc.save()
 		target_doc.submit()
 
-		tax_amount = flt(rate * (12/100), 2)
+		tax_amount = flt(rate * (12 / 100), 2)
 		si_gl_entries = [
 			["_Test Account Excise Duty - TCP1", 0.0, tax_amount, nowdate()],
-			["Unrealized Profit - TCP1", tax_amount, 0.0, nowdate()]
+			["Unrealized Profit - TCP1", tax_amount, 0.0, nowdate()],
 		]
 
 		check_gl_entries(self, si.name, si_gl_entries, add_days(nowdate(), -1))
 
 		pi_gl_entries = [
-			["_Test Account Excise Duty - TCP1", tax_amount , 0.0, nowdate()],
-			["Unrealized Profit - TCP1", 0.0, tax_amount, nowdate()]
+			["_Test Account Excise Duty - TCP1", tax_amount, 0.0, nowdate()],
+			["Unrealized Profit - TCP1", 0.0, tax_amount, nowdate()],
 		]
 
 		# Sale and Purchase both should be at valuation rate
@@ -2137,43 +2532,46 @@
 
 		data = get_ewb_data("Sales Invoice", [si.name])
 
-		self.assertEqual(data['version'], '1.0.0421')
-		self.assertEqual(data['billLists'][0]['fromGstin'], '27AAECE4835E1ZR')
-		self.assertEqual(data['billLists'][0]['fromTrdName'], '_Test Company')
-		self.assertEqual(data['billLists'][0]['toTrdName'], '_Test Customer')
-		self.assertEqual(data['billLists'][0]['vehicleType'], 'R')
-		self.assertEqual(data['billLists'][0]['totalValue'], 60000)
-		self.assertEqual(data['billLists'][0]['cgstValue'], 5400)
-		self.assertEqual(data['billLists'][0]['sgstValue'], 5400)
-		self.assertEqual(data['billLists'][0]['vehicleNo'], 'KA12KA1234')
-		self.assertEqual(data['billLists'][0]['itemList'][0]['taxableAmount'], 60000)
-		self.assertEqual(data['billLists'][0]['actualFromStateCode'],7)
-		self.assertEqual(data['billLists'][0]['fromStateCode'],27)
+		self.assertEqual(data["version"], "1.0.0421")
+		self.assertEqual(data["billLists"][0]["fromGstin"], "27AAECE4835E1ZR")
+		self.assertEqual(data["billLists"][0]["fromTrdName"], "_Test Company")
+		self.assertEqual(data["billLists"][0]["toTrdName"], "_Test Customer")
+		self.assertEqual(data["billLists"][0]["vehicleType"], "R")
+		self.assertEqual(data["billLists"][0]["totalValue"], 60000)
+		self.assertEqual(data["billLists"][0]["cgstValue"], 5400)
+		self.assertEqual(data["billLists"][0]["sgstValue"], 5400)
+		self.assertEqual(data["billLists"][0]["vehicleNo"], "KA12KA1234")
+		self.assertEqual(data["billLists"][0]["itemList"][0]["taxableAmount"], 60000)
+		self.assertEqual(data["billLists"][0]["actualFromStateCode"], 7)
+		self.assertEqual(data["billLists"][0]["fromStateCode"], 27)
 
 	def test_einvoice_submission_without_irn(self):
 		# init
-		einvoice_settings = frappe.get_doc('E Invoice Settings')
+		einvoice_settings = frappe.get_doc("E Invoice Settings")
 		einvoice_settings.enable = 1
 		einvoice_settings.applicable_from = nowdate()
-		einvoice_settings.append('credentials', {
-			'company': '_Test Company',
-			'gstin': '27AAECE4835E1ZR',
-			'username': 'test',
-			'password': 'test'
-		})
+		einvoice_settings.append(
+			"credentials",
+			{
+				"company": "_Test Company",
+				"gstin": "27AAECE4835E1ZR",
+				"username": "test",
+				"password": "test",
+			},
+		)
 		einvoice_settings.save()
 
 		country = frappe.flags.country
-		frappe.flags.country = 'India'
+		frappe.flags.country = "India"
 
 		si = make_sales_invoice_for_ewaybill()
 		self.assertRaises(frappe.ValidationError, si.submit)
 
-		si.irn = 'test_irn'
+		si.irn = "test_irn"
 		si.submit()
 
 		# reset
-		einvoice_settings = frappe.get_doc('E Invoice Settings')
+		einvoice_settings = frappe.get_doc("E Invoice Settings")
 		einvoice_settings.enable = 0
 		frappe.flags.country = country
 
@@ -2185,15 +2583,15 @@
 		si.save()
 
 		einvoice = make_einvoice(si)
-		self.assertTrue(einvoice['EwbDtls'])
+		self.assertTrue(einvoice["EwbDtls"])
 		validate_totals(einvoice)
 
-		si.apply_discount_on = 'Net Total'
+		si.apply_discount_on = "Net Total"
 		si.save()
 		einvoice = make_einvoice(si)
 		validate_totals(einvoice)
 
-		[d.set('included_in_print_rate', 1) for d in si.taxes]
+		[d.set("included_in_print_rate", 1) for d in si.taxes]
 		si.save()
 		einvoice = make_einvoice(si)
 		validate_totals(einvoice)
@@ -2201,29 +2599,39 @@
 	def test_item_tax_net_range(self):
 		item = create_item("T Shirt")
 
-		item.set('taxes', [])
-		item.append("taxes", {
-			"item_tax_template": "_Test Account Excise Duty @ 10 - _TC",
-			"minimum_net_rate": 0,
-			"maximum_net_rate": 500
-		})
+		item.set("taxes", [])
+		item.append(
+			"taxes",
+			{
+				"item_tax_template": "_Test Account Excise Duty @ 10 - _TC",
+				"minimum_net_rate": 0,
+				"maximum_net_rate": 500,
+			},
+		)
 
-		item.append("taxes", {
-			"item_tax_template": "_Test Account Excise Duty @ 12 - _TC",
-			"minimum_net_rate": 501,
-			"maximum_net_rate": 1000
-		})
+		item.append(
+			"taxes",
+			{
+				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC",
+				"minimum_net_rate": 501,
+				"maximum_net_rate": 1000,
+			},
+		)
 
 		item.save()
 
-		sales_invoice = create_sales_invoice(item = "T Shirt", rate=700, do_not_submit=True)
-		self.assertEqual(sales_invoice.items[0].item_tax_template, "_Test Account Excise Duty @ 12 - _TC")
+		sales_invoice = create_sales_invoice(item="T Shirt", rate=700, do_not_submit=True)
+		self.assertEqual(
+			sales_invoice.items[0].item_tax_template, "_Test Account Excise Duty @ 12 - _TC"
+		)
 
 		# Apply discount
-		sales_invoice.apply_discount_on = 'Net Total'
+		sales_invoice.apply_discount_on = "Net Total"
 		sales_invoice.discount_amount = 300
 		sales_invoice.save()
-		self.assertEqual(sales_invoice.items[0].item_tax_template, "_Test Account Excise Duty @ 10 - _TC")
+		self.assertEqual(
+			sales_invoice.items[0].item_tax_template, "_Test Account Excise Duty @ 10 - _TC"
+		)
 
 	def test_sales_invoice_with_discount_accounting_enabled(self):
 		from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
@@ -2232,14 +2640,17 @@
 
 		enable_discount_accounting()
 
-		discount_account = create_account(account_name="Discount Account",
-			parent_account="Indirect Expenses - _TC", company="_Test Company")
+		discount_account = create_account(
+			account_name="Discount Account",
+			parent_account="Indirect Expenses - _TC",
+			company="_Test Company",
+		)
 		si = create_sales_invoice(discount_account=discount_account, discount_percentage=10, rate=90)
 
 		expected_gle = [
 			["Debtors - _TC", 90.0, 0.0, nowdate()],
 			["Discount Account - _TC", 10.0, 0.0, nowdate()],
-			["Sales - _TC", 0.0, 100.0, nowdate()]
+			["Sales - _TC", 0.0, 100.0, nowdate()],
 		]
 
 		check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1))
@@ -2251,27 +2662,33 @@
 		)
 
 		enable_discount_accounting()
-		additional_discount_account = create_account(account_name="Discount Account",
-			parent_account="Indirect Expenses - _TC", company="_Test Company")
+		additional_discount_account = create_account(
+			account_name="Discount Account",
+			parent_account="Indirect Expenses - _TC",
+			company="_Test Company",
+		)
 
-		si = create_sales_invoice(parent_cost_center='Main - _TC', do_not_save=1)
+		si = create_sales_invoice(parent_cost_center="Main - _TC", do_not_save=1)
 		si.apply_discount_on = "Grand Total"
 		si.additional_discount_account = additional_discount_account
 		si.additional_discount_percentage = 20
-		si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "_Test Account VAT - _TC",
-			"cost_center": "Main - _TC",
-			"description": "Test",
-			"rate": 10
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account VAT - _TC",
+				"cost_center": "Main - _TC",
+				"description": "Test",
+				"rate": 10,
+			},
+		)
 		si.submit()
 
 		expected_gle = [
 			["_Test Account VAT - _TC", 0.0, 10.0, nowdate()],
 			["Debtors - _TC", 88, 0.0, nowdate()],
 			["Discount Account - _TC", 22.0, 0.0, nowdate()],
-			["Sales - _TC", 0.0, 100.0, nowdate()]
+			["Sales - _TC", 0.0, 100.0, nowdate()],
 		]
 
 		check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1))
@@ -2279,20 +2696,22 @@
 
 	def test_asset_depreciation_on_sale_with_pro_rata(self):
 		"""
-			Tests if an Asset set to depreciate yearly on June 30, that gets sold on Sept 30, creates an additional depreciation entry on its date of sale.
+		Tests if an Asset set to depreciate yearly on June 30, that gets sold on Sept 30, creates an additional depreciation entry on its date of sale.
 		"""
 
 		create_asset_data()
 		asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, submit=1)
 		post_depreciation_entries(getdate("2021-09-30"))
 
-		create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000, posting_date=getdate("2021-09-30"))
+		create_sales_invoice(
+			item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000, posting_date=getdate("2021-09-30")
+		)
 		asset.load_from_db()
 
 		expected_values = [
 			["2020-06-30", 1366.12, 1366.12],
 			["2021-06-30", 20000.0, 21366.12],
-			["2021-09-30", 5041.1, 26407.22]
+			["2021-09-30", 5041.1, 26407.22],
 		]
 
 		for i, schedule in enumerate(asset.schedules):
@@ -2303,23 +2722,28 @@
 
 	def test_asset_depreciation_on_sale_without_pro_rata(self):
 		"""
-			Tests if an Asset set to depreciate yearly on Dec 31, that gets sold on Dec 31 after two years, created an additional depreciation entry on its date of sale.
+		Tests if an Asset set to depreciate yearly on Dec 31, that gets sold on Dec 31 after two years, created an additional depreciation entry on its date of sale.
 		"""
 
 		create_asset_data()
-		asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1,
-			available_for_use_date=getdate("2019-12-31"), total_number_of_depreciations=3,
-			expected_value_after_useful_life=10000, depreciation_start_date=getdate("2020-12-31"), submit=1)
+		asset = create_asset(
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date=getdate("2019-12-31"),
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date=getdate("2020-12-31"),
+			submit=1,
+		)
 
 		post_depreciation_entries(getdate("2021-09-30"))
 
-		create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000, posting_date=getdate("2021-12-31"))
+		create_sales_invoice(
+			item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000, posting_date=getdate("2021-12-31")
+		)
 		asset.load_from_db()
 
-		expected_values = [
-			["2020-12-31", 30000, 30000],
-			["2021-12-31", 30000, 60000]
-		]
+		expected_values = [["2020-12-31", 30000, 30000], ["2021-12-31", 30000, 60000]]
 
 		for i, schedule in enumerate(asset.schedules):
 			self.assertEqual(getdate(expected_values[i][0]), schedule.schedule_date)
@@ -2334,7 +2758,9 @@
 		asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, submit=1)
 		post_depreciation_entries(getdate("2021-09-30"))
 
-		si = create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000, posting_date=getdate("2021-09-30"))
+		si = create_sales_invoice(
+			item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000, posting_date=getdate("2021-09-30")
+		)
 		return_si = make_return_doc("Sales Invoice", si.name)
 		return_si.submit()
 		asset.load_from_db()
@@ -2344,8 +2770,8 @@
 			["2021-06-30", 20000.0, 21366.12, True],
 			["2022-06-30", 20000.0, 41366.12, False],
 			["2023-06-30", 20000.0, 61366.12, False],
-			["2024-06-30",  20000.0, 81366.12,  False],
-			["2025-06-06",  18633.88,  100000.0, False]
+			["2024-06-30", 20000.0, 81366.12, False],
+			["2025-06-06", 18633.88, 100000.0, False],
 		]
 
 		for i, schedule in enumerate(asset.schedules):
@@ -2370,30 +2796,34 @@
 		party_link = create_party_link("Supplier", supplier, customer)
 
 		# enable common party accounting
-		frappe.db.set_value('Accounts Settings', None, 'enable_common_party_accounting', 1)
+		frappe.db.set_value("Accounts Settings", None, "enable_common_party_accounting", 1)
 
 		# create a sales invoice
 		si = create_sales_invoice(customer=customer, parent_cost_center="_Test Cost Center - _TC")
 
 		# check outstanding of sales invoice
 		si.reload()
-		self.assertEqual(si.status, 'Paid')
+		self.assertEqual(si.status, "Paid")
 		self.assertEqual(flt(si.outstanding_amount), 0.0)
 
 		# check creation of journal entry
-		jv = frappe.get_all('Journal Entry Account', {
-			'account': si.debit_to,
-			'party_type': 'Customer',
-			'party': si.customer,
-			'reference_type': si.doctype,
-			'reference_name': si.name
-		}, pluck='credit_in_account_currency')
+		jv = frappe.get_all(
+			"Journal Entry Account",
+			{
+				"account": si.debit_to,
+				"party_type": "Customer",
+				"party": si.customer,
+				"reference_type": si.doctype,
+				"reference_name": si.name,
+			},
+			pluck="credit_in_account_currency",
+		)
 
 		self.assertTrue(jv)
 		self.assertEqual(jv[0], si.grand_total)
 
 		party_link.delete()
-		frappe.db.set_value('Accounts Settings', None, 'enable_common_party_accounting', 0)
+		frappe.db.set_value("Accounts Settings", None, "enable_common_party_accounting", 0)
 
 	def test_payment_statuses(self):
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
@@ -2403,16 +2833,14 @@
 		# Test Overdue
 		si = create_sales_invoice(do_not_submit=True)
 		si.payment_schedule = []
-		si.append("payment_schedule", {
-			"due_date": add_days(today, -5),
-			"invoice_portion": 50,
-			"payment_amount": si.grand_total / 2
-		})
-		si.append("payment_schedule", {
-			"due_date": add_days(today, 5),
-			"invoice_portion": 50,
-			"payment_amount": si.grand_total / 2
-		})
+		si.append(
+			"payment_schedule",
+			{"due_date": add_days(today, -5), "invoice_portion": 50, "payment_amount": si.grand_total / 2},
+		)
+		si.append(
+			"payment_schedule",
+			{"due_date": add_days(today, 5), "invoice_portion": 50, "payment_amount": si.grand_total / 2},
+		)
 		si.submit()
 		self.assertEqual(si.status, "Overdue")
 
@@ -2451,21 +2879,23 @@
 
 		# Sales Invoice with Payment Schedule
 		si_with_payment_schedule = create_sales_invoice(do_not_submit=True)
-		si_with_payment_schedule.extend("payment_schedule", [
-			{
-				"due_date": add_days(today, -5),
-				"invoice_portion": 50,
-				"payment_amount": si_with_payment_schedule.grand_total / 2
-			},
-			{
-				"due_date": add_days(today, 5),
-				"invoice_portion": 50,
-				"payment_amount": si_with_payment_schedule.grand_total / 2
-			}
-		])
+		si_with_payment_schedule.extend(
+			"payment_schedule",
+			[
+				{
+					"due_date": add_days(today, -5),
+					"invoice_portion": 50,
+					"payment_amount": si_with_payment_schedule.grand_total / 2,
+				},
+				{
+					"due_date": add_days(today, 5),
+					"invoice_portion": 50,
+					"payment_amount": si_with_payment_schedule.grand_total / 2,
+				},
+			],
+		)
 		si_with_payment_schedule.submit()
 
-
 		for invoice in (si, si_with_payment_schedule):
 			invoice.db_set("status", "Unpaid")
 			update_invoice_status()
@@ -2477,24 +2907,27 @@
 			invoice.reload()
 			self.assertEqual(invoice.status, "Overdue and Discounted")
 
-
 	def test_sales_commission(self):
 		si = frappe.copy_doc(test_records[2])
 
-		frappe.db.set_value('Item', si.get('items')[0].item_code, 'grant_commission', 1)
-		frappe.db.set_value('Item', si.get('items')[1].item_code, 'grant_commission', 0)
+		frappe.db.set_value("Item", si.get("items")[0].item_code, "grant_commission", 1)
+		frappe.db.set_value("Item", si.get("items")[1].item_code, "grant_commission", 0)
 
-		item = copy.deepcopy(si.get('items')[0])
-		item.update({
-			"qty": 1,
-			"rate": 500,
-		})
+		item = copy.deepcopy(si.get("items")[0])
+		item.update(
+			{
+				"qty": 1,
+				"rate": 500,
+			}
+		)
 
-		item = copy.deepcopy(si.get('items')[1])
-		item.update({
-			"qty": 1,
-			"rate": 500,
-		})
+		item = copy.deepcopy(si.get("items")[1])
+		item.update(
+			{
+				"qty": 1,
+				"rate": 500,
+			}
+		)
 
 		# Test valid values
 		for commission_rate, total_commission in ((0, 0), (10, 50), (100, 500)):
@@ -2510,7 +2943,7 @@
 			self.assertRaises(frappe.ValidationError, si.save)
 
 	def test_sales_invoice_submission_post_account_freezing_date(self):
-		frappe.db.set_value('Accounts Settings', None, 'acc_frozen_upto', add_days(getdate(), 1))
+		frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", add_days(getdate(), 1))
 		si = create_sales_invoice(do_not_save=True)
 		si.posting_date = add_days(getdate(), 1)
 		si.save()
@@ -2519,17 +2952,19 @@
 		si.posting_date = getdate()
 		si.submit()
 
-		frappe.db.set_value('Accounts Settings', None, 'acc_frozen_upto', None)
+		frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", None)
 
 	def test_over_billing_case_against_delivery_note(self):
-		'''
-			Test a case where duplicating the item with qty = 1 in the invoice
-			allows overbilling even if it is disabled
-		'''
+		"""
+		Test a case where duplicating the item with qty = 1 in the invoice
+		allows overbilling even if it is disabled
+		"""
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 
-		over_billing_allowance = frappe.db.get_single_value('Accounts Settings', 'over_billing_allowance')
-		frappe.db.set_value('Accounts Settings', None, 'over_billing_allowance', 0)
+		over_billing_allowance = frappe.db.get_single_value(
+			"Accounts Settings", "over_billing_allowance"
+		)
+		frappe.db.set_value("Accounts Settings", None, "over_billing_allowance", 0)
 
 		dn = create_delivery_note()
 		dn.submit()
@@ -2537,7 +2972,7 @@
 		si = make_sales_invoice(dn.name)
 		# make a copy of first item and add it to invoice
 		item_copy = frappe.copy_doc(si.items[0])
-		si.append('items', item_copy)
+		si.append("items", item_copy)
 		si.save()
 
 		with self.assertRaises(frappe.ValidationError) as err:
@@ -2545,13 +2980,16 @@
 
 		self.assertTrue("cannot overbill" in str(err.exception).lower())
 
-		frappe.db.set_value('Accounts Settings', None, 'over_billing_allowance', over_billing_allowance)
+		frappe.db.set_value("Accounts Settings", None, "over_billing_allowance", over_billing_allowance)
 
 	def test_multi_currency_deferred_revenue_via_journal_entry(self):
-		deferred_account = create_account(account_name="Deferred Revenue",
-			parent_account="Current Liabilities - _TC", company="_Test Company")
+		deferred_account = create_account(
+			account_name="Deferred Revenue",
+			parent_account="Current Liabilities - _TC",
+			company="_Test Company",
+		)
 
-		acc_settings = frappe.get_single('Accounts Settings')
+		acc_settings = frappe.get_single("Accounts Settings")
 		acc_settings.book_deferred_entries_via_journal_entry = 1
 		acc_settings.submit_journal_entries = 1
 		acc_settings.save()
@@ -2561,12 +2999,19 @@
 		item.deferred_revenue_account = deferred_account
 		item.save()
 
-		si = create_sales_invoice(customer='_Test Customer USD', currency='USD',
-			item=item.name, qty=1, rate=100, conversion_rate=60, do_not_save=True)
+		si = create_sales_invoice(
+			customer="_Test Customer USD",
+			currency="USD",
+			item=item.name,
+			qty=1,
+			rate=100,
+			conversion_rate=60,
+			do_not_save=True,
+		)
 
 		si.set_posting_time = 1
-		si.posting_date = '2019-01-01'
-		si.debit_to = '_Test Receivable USD - _TC'
+		si.posting_date = "2019-01-01"
+		si.debit_to = "_Test Receivable USD - _TC"
 		si.items[0].enable_deferred_revenue = 1
 		si.items[0].service_start_date = "2019-01-01"
 		si.items[0].service_end_date = "2019-03-30"
@@ -2574,16 +3019,18 @@
 		si.save()
 		si.submit()
 
-		frappe.db.set_value('Accounts Settings', None, 'acc_frozen_upto', getdate('2019-01-31'))
+		frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", getdate("2019-01-31"))
 
-		pda1 = frappe.get_doc(dict(
-			doctype='Process Deferred Accounting',
-			posting_date=nowdate(),
-			start_date="2019-01-01",
-			end_date="2019-03-31",
-			type="Income",
-			company="_Test Company"
-		))
+		pda1 = frappe.get_doc(
+			dict(
+				doctype="Process Deferred Accounting",
+				posting_date=nowdate(),
+				start_date="2019-01-01",
+				end_date="2019-03-31",
+				type="Income",
+				company="_Test Company",
+			)
+		)
 
 		pda1.insert()
 		pda1.submit()
@@ -2594,13 +3041,17 @@
 			["Sales - _TC", 0.0, 1887.64, "2019-02-28"],
 			[deferred_account, 1887.64, 0.0, "2019-02-28"],
 			["Sales - _TC", 0.0, 2022.47, "2019-03-15"],
-			[deferred_account, 2022.47, 0.0, "2019-03-15"]
+			[deferred_account, 2022.47, 0.0, "2019-03-15"],
 		]
 
-		gl_entries = gl_entries = frappe.db.sql("""select account, debit, credit, posting_date
+		gl_entries = gl_entries = frappe.db.sql(
+			"""select account, debit, credit, posting_date
 			from `tabGL Entry`
 			where voucher_type='Journal Entry' and voucher_detail_no=%s and posting_date <= %s
-			order by posting_date asc, account asc""", (si.items[0].name, si.posting_date), as_dict=1)
+			order by posting_date asc, account asc""",
+			(si.items[0].name, si.posting_date),
+			as_dict=1,
+		)
 
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_gle[i][0], gle.account)
@@ -2608,152 +3059,164 @@
 			self.assertEqual(expected_gle[i][2], gle.debit)
 			self.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
 
-		acc_settings = frappe.get_single('Accounts Settings')
+		acc_settings = frappe.get_single("Accounts Settings")
 		acc_settings.book_deferred_entries_via_journal_entry = 0
 		acc_settings.submit_journal_entriessubmit_journal_entries = 0
 		acc_settings.save()
 
-		frappe.db.set_value('Accounts Settings', None, 'acc_frozen_upto', None)
+		frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", None)
 
 	def test_standalone_serial_no_return(self):
-		si = create_sales_invoice(item_code="_Test Serialized Item With Series", update_stock=True, is_return=True, qty=-1)
+		si = create_sales_invoice(
+			item_code="_Test Serialized Item With Series", update_stock=True, is_return=True, qty=-1
+		)
 		si.reload()
 		self.assertTrue(si.items[0].serial_no)
 
 
 def get_sales_invoice_for_e_invoice():
 	si = make_sales_invoice_for_ewaybill()
-	si.naming_series = 'INV-2020-.#####'
+	si.naming_series = "INV-2020-.#####"
 	si.items = []
-	si.append("items", {
-		"item_code": "_Test Item",
-		"uom": "Nos",
-		"warehouse": "_Test Warehouse - _TC",
-		"qty": 2000,
-		"rate": 12,
-		"income_account": "Sales - _TC",
-		"expense_account": "Cost of Goods Sold - _TC",
-		"cost_center": "_Test Cost Center - _TC",
-	})
+	si.append(
+		"items",
+		{
+			"item_code": "_Test Item",
+			"uom": "Nos",
+			"warehouse": "_Test Warehouse - _TC",
+			"qty": 2000,
+			"rate": 12,
+			"income_account": "Sales - _TC",
+			"expense_account": "Cost of Goods Sold - _TC",
+			"cost_center": "_Test Cost Center - _TC",
+		},
+	)
 
-	si.append("items", {
-		"item_code": "_Test Item 2",
-		"uom": "Nos",
-		"warehouse": "_Test Warehouse - _TC",
-		"qty": 420,
-		"rate": 15,
-		"income_account": "Sales - _TC",
-		"expense_account": "Cost of Goods Sold - _TC",
-		"cost_center": "_Test Cost Center - _TC",
-	})
+	si.append(
+		"items",
+		{
+			"item_code": "_Test Item 2",
+			"uom": "Nos",
+			"warehouse": "_Test Warehouse - _TC",
+			"qty": 420,
+			"rate": 15,
+			"income_account": "Sales - _TC",
+			"expense_account": "Cost of Goods Sold - _TC",
+			"cost_center": "_Test Cost Center - _TC",
+		},
+	)
 
 	return si
 
+
 def make_test_address_for_ewaybill():
-	if not frappe.db.exists('Address', '_Test Address for Eway bill-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_line2": "_Test Address Line 2",
-			"address_title": "_Test Address for Eway bill",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+910000000000",
-			"gstin": "27AAECE4835E1ZR",
-			"gst_state": "Maharashtra",
-			"gst_state_number": "27",
-			"pincode": "401108"
-		}).insert()
+	if not frappe.db.exists("Address", "_Test Address for Eway bill-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_line2": "_Test Address Line 2",
+				"address_title": "_Test Address for Eway bill",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+910000000000",
+				"gstin": "27AAECE4835E1ZR",
+				"gst_state": "Maharashtra",
+				"gst_state_number": "27",
+				"pincode": "401108",
+			}
+		).insert()
 
-		address.append("links", {
-			"link_doctype": "Company",
-			"link_name": "_Test Company"
-		})
+		address.append("links", {"link_doctype": "Company", "link_name": "_Test Company"})
 
 		address.save()
 
-	if not frappe.db.exists('Address', '_Test Customer-Address for Eway bill-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_line2": "_Test Address Line 2",
-			"address_title": "_Test Customer-Address for Eway bill",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+910000000000",
-			"gstin": "27AACCM7806M1Z3",
-			"gst_state": "Maharashtra",
-			"gst_state_number": "27",
-			"pincode": "410038"
-		}).insert()
+	if not frappe.db.exists("Address", "_Test Customer-Address for Eway bill-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_line2": "_Test Address Line 2",
+				"address_title": "_Test Customer-Address for Eway bill",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+910000000000",
+				"gstin": "27AACCM7806M1Z3",
+				"gst_state": "Maharashtra",
+				"gst_state_number": "27",
+				"pincode": "410038",
+			}
+		).insert()
 
-		address.append("links", {
-			"link_doctype": "Customer",
-			"link_name": "_Test Customer"
-		})
+		address.append("links", {"link_doctype": "Customer", "link_name": "_Test Customer"})
 
 		address.save()
 
-	if not frappe.db.exists('Address', '_Test Customer-Address for Eway bill-Shipping'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_line2": "_Test Address Line 2",
-			"address_title": "_Test Customer-Address for Eway bill",
-			"address_type": "Shipping",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+910000000000",
-			"gst_state": "Maharashtra",
-			"gst_state_number": "27",
-			"pincode": "410098"
-		}).insert()
+	if not frappe.db.exists("Address", "_Test Customer-Address for Eway bill-Shipping"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_line2": "_Test Address Line 2",
+				"address_title": "_Test Customer-Address for Eway bill",
+				"address_type": "Shipping",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+910000000000",
+				"gst_state": "Maharashtra",
+				"gst_state_number": "27",
+				"pincode": "410098",
+			}
+		).insert()
 
-		address.append("links", {
-			"link_doctype": "Customer",
-			"link_name": "_Test Customer"
-		})
+		address.append("links", {"link_doctype": "Customer", "link_name": "_Test Customer"})
 
 		address.save()
 
-	if not frappe.db.exists('Address', '_Test Dispatch-Address for Eway bill-Shipping'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Dispatch Address Line 1",
-			"address_line2": "_Test Dispatch Address Line 2",
-			"address_title": "_Test Dispatch-Address for Eway bill",
-			"address_type": "Shipping",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 0,
-			"phone": "+910000000000",
-			"gstin": "07AAACC1206D1ZI",
-			"gst_state": "Delhi",
-			"gst_state_number": "07",
-			"pincode": "1100101"
-		}).insert()
+	if not frappe.db.exists("Address", "_Test Dispatch-Address for Eway bill-Shipping"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Dispatch Address Line 1",
+				"address_line2": "_Test Dispatch Address Line 2",
+				"address_title": "_Test Dispatch-Address for Eway bill",
+				"address_type": "Shipping",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 0,
+				"phone": "+910000000000",
+				"gstin": "07AAACC1206D1ZI",
+				"gst_state": "Delhi",
+				"gst_state_number": "07",
+				"pincode": "1100101",
+			}
+		).insert()
 
 		address.save()
 
+
 def make_test_transporter_for_ewaybill():
-	if not frappe.db.exists('Supplier', '_Test Transporter'):
-		frappe.get_doc({
-			"doctype": "Supplier",
-			"supplier_name": "_Test Transporter",
-			"country": "India",
-			"supplier_group": "_Test Supplier Group",
-			"supplier_type": "Company",
-			"is_transporter": 1
-		}).insert()
+	if not frappe.db.exists("Supplier", "_Test Transporter"):
+		frappe.get_doc(
+			{
+				"doctype": "Supplier",
+				"supplier_name": "_Test Transporter",
+				"country": "India",
+				"supplier_group": "_Test Supplier Group",
+				"supplier_type": "Company",
+				"is_transporter": 1,
+			}
+		).insert()
+
 
 def make_sales_invoice_for_ewaybill():
 	make_test_address_for_ewaybill()
@@ -2764,20 +3227,23 @@
 	gst_account = frappe.get_all(
 		"GST Account",
 		fields=["cgst_account", "sgst_account", "igst_account"],
-		filters = {"company": "_Test Company"}
+		filters={"company": "_Test Company"},
 	)
 
 	if not gst_account:
-		gst_settings.append("gst_accounts", {
-			"company": "_Test Company",
-			"cgst_account": "Output Tax CGST - _TC",
-			"sgst_account": "Output Tax SGST - _TC",
-			"igst_account": "Output Tax IGST - _TC",
-		})
+		gst_settings.append(
+			"gst_accounts",
+			{
+				"company": "_Test Company",
+				"cgst_account": "Output Tax CGST - _TC",
+				"sgst_account": "Output Tax SGST - _TC",
+				"igst_account": "Output Tax IGST - _TC",
+			},
+		)
 
 	gst_settings.save()
 
-	si = create_sales_invoice(do_not_save=1, rate='60000')
+	si = create_sales_invoice(do_not_save=1, rate="60000")
 
 	si.distance = 2000
 	si.company_address = "_Test Address for Eway bill-Billing"
@@ -2786,32 +3252,43 @@
 	si.dispatch_address_name = "_Test Dispatch-Address for Eway bill-Shipping"
 	si.vehicle_no = "KA12KA1234"
 	si.gst_category = "Registered Regular"
-	si.mode_of_transport = 'Road'
-	si.transporter = '_Test Transporter'
+	si.mode_of_transport = "Road"
+	si.transporter = "_Test Transporter"
 
-	si.append("taxes", {
-		"charge_type": "On Net Total",
-		"account_head": "Output Tax CGST - _TC",
-		"cost_center": "Main - _TC",
-		"description": "CGST @ 9.0",
-		"rate": 9
-	})
+	si.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Output Tax CGST - _TC",
+			"cost_center": "Main - _TC",
+			"description": "CGST @ 9.0",
+			"rate": 9,
+		},
+	)
 
-	si.append("taxes", {
-		"charge_type": "On Net Total",
-		"account_head": "Output Tax SGST - _TC",
-		"cost_center": "Main - _TC",
-		"description": "SGST @ 9.0",
-		"rate": 9
-	})
+	si.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Output Tax SGST - _TC",
+			"cost_center": "Main - _TC",
+			"description": "SGST @ 9.0",
+			"rate": 9,
+		},
+	)
 
 	return si
 
+
 def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
-	gl_entries = frappe.db.sql("""select account, debit, credit, posting_date
+	gl_entries = frappe.db.sql(
+		"""select account, debit, credit, posting_date
 		from `tabGL Entry`
 		where voucher_type='Sales Invoice' and voucher_no=%s and posting_date > %s
-		order by posting_date asc, account asc""", (voucher_no, posting_date), as_dict=1)
+		order by posting_date asc, account asc""",
+		(voucher_no, posting_date),
+		as_dict=1,
+	)
 
 	for i, gle in enumerate(gl_entries):
 		doc.assertEqual(expected_gle[i][0], gle.account)
@@ -2819,6 +3296,7 @@
 		doc.assertEqual(expected_gle[i][2], gle.credit)
 		doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
 
+
 def create_sales_invoice(**args):
 	si = frappe.new_doc("Sales Invoice")
 	args = frappe._dict(args)
@@ -2833,32 +3311,35 @@
 	si.is_pos = args.is_pos
 	si.is_return = args.is_return
 	si.return_against = args.return_against
-	si.currency=args.currency or "INR"
+	si.currency = args.currency or "INR"
 	si.conversion_rate = args.conversion_rate or 1
 	si.naming_series = args.naming_series or "T-SINV-"
 	si.cost_center = args.parent_cost_center
 
-	si.append("items", {
-		"item_code": args.item or args.item_code or "_Test Item",
-		"item_name": args.item_name or "_Test Item",
-		"description": args.description or "_Test Item",
-		"gst_hsn_code": "999800",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty or 1,
-		"uom": args.uom or "Nos",
-		"stock_uom": args.uom or "Nos",
-		"rate": args.rate if args.get("rate") is not None else 100,
-		"price_list_rate": args.price_list_rate if args.get("price_list_rate") is not None else 100,
-		"income_account": args.income_account or "Sales - _TC",
-		"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
-		"discount_account": args.discount_account or None,
-		"discount_amount": args.discount_amount or 0,
-		"asset": args.asset or None,
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"serial_no": args.serial_no,
-		"conversion_factor": 1,
-		"incoming_rate": args.incoming_rate or 0
-	})
+	si.append(
+		"items",
+		{
+			"item_code": args.item or args.item_code or "_Test Item",
+			"item_name": args.item_name or "_Test Item",
+			"description": args.description or "_Test Item",
+			"gst_hsn_code": "999800",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty or 1,
+			"uom": args.uom or "Nos",
+			"stock_uom": args.uom or "Nos",
+			"rate": args.rate if args.get("rate") is not None else 100,
+			"price_list_rate": args.price_list_rate if args.get("price_list_rate") is not None else 100,
+			"income_account": args.income_account or "Sales - _TC",
+			"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
+			"discount_account": args.discount_account or None,
+			"discount_amount": args.discount_amount or 0,
+			"asset": args.asset or None,
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"serial_no": args.serial_no,
+			"conversion_factor": 1,
+			"incoming_rate": args.incoming_rate or 0,
+		},
+	)
 
 	if not args.do_not_save:
 		si.insert()
@@ -2871,6 +3352,7 @@
 
 	return si
 
+
 def create_sales_invoice_against_cost_center(**args):
 	si = frappe.new_doc("Sales Invoice")
 	args = frappe._dict(args)
@@ -2886,20 +3368,23 @@
 	si.is_pos = args.is_pos
 	si.is_return = args.is_return
 	si.return_against = args.return_against
-	si.currency=args.currency or "INR"
+	si.currency = args.currency or "INR"
 	si.conversion_rate = args.conversion_rate or 1
 
-	si.append("items", {
-		"item_code": args.item or args.item_code or "_Test Item",
-		"gst_hsn_code": "999800",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty or 1,
-		"rate": args.rate or 100,
-		"income_account": "Sales - _TC",
-		"expense_account": "Cost of Goods Sold - _TC",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"serial_no": args.serial_no
-	})
+	si.append(
+		"items",
+		{
+			"item_code": args.item or args.item_code or "_Test Item",
+			"gst_hsn_code": "999800",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty or 1,
+			"rate": args.rate or 100,
+			"income_account": "Sales - _TC",
+			"expense_account": "Cost of Goods Sold - _TC",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"serial_no": args.serial_no,
+		},
+	)
 
 	if not args.do_not_save:
 		si.insert()
@@ -2914,59 +3399,69 @@
 
 
 test_dependencies = ["Journal Entry", "Contact", "Address"]
-test_records = frappe.get_test_records('Sales Invoice')
+test_records = frappe.get_test_records("Sales Invoice")
+
 
 def get_outstanding_amount(against_voucher_type, against_voucher, account, party, party_type):
-	bal = flt(frappe.db.sql("""
+	bal = flt(
+		frappe.db.sql(
+			"""
 		select sum(debit_in_account_currency) - sum(credit_in_account_currency)
 		from `tabGL Entry`
 		where against_voucher_type=%s and against_voucher=%s
 		and account = %s and party = %s and party_type = %s""",
-		(against_voucher_type, against_voucher, account, party, party_type))[0][0] or 0.0)
+			(against_voucher_type, against_voucher, account, party, party_type),
+		)[0][0]
+		or 0.0
+	)
 
-	if against_voucher_type == 'Purchase Invoice':
+	if against_voucher_type == "Purchase Invoice":
 		bal = bal * -1
 
 	return bal
 
+
 def get_taxes_and_charges():
-	return [{
-	"account_head": "_Test Account Excise Duty - TCP1",
-	"charge_type": "On Net Total",
-	"cost_center": "Main - TCP1",
-	"description": "Excise Duty",
-	"doctype": "Sales Taxes and Charges",
-	"idx": 1,
-	"included_in_print_rate": 1,
-	"parentfield": "taxes",
-	"rate": 12
-	},
-	{
-	"account_head": "_Test Account Education Cess - TCP1",
-	"charge_type": "On Previous Row Amount",
-	"cost_center": "Main - TCP1",
-	"description": "Education Cess",
-	"doctype": "Sales Taxes and Charges",
-	"idx": 2,
-	"included_in_print_rate": 1,
-	"parentfield": "taxes",
-	"rate": 2,
-	"row_id": 1
-	}]
+	return [
+		{
+			"account_head": "_Test Account Excise Duty - TCP1",
+			"charge_type": "On Net Total",
+			"cost_center": "Main - TCP1",
+			"description": "Excise Duty",
+			"doctype": "Sales Taxes and Charges",
+			"idx": 1,
+			"included_in_print_rate": 1,
+			"parentfield": "taxes",
+			"rate": 12,
+		},
+		{
+			"account_head": "_Test Account Education Cess - TCP1",
+			"charge_type": "On Previous Row Amount",
+			"cost_center": "Main - TCP1",
+			"description": "Education Cess",
+			"doctype": "Sales Taxes and Charges",
+			"idx": 2,
+			"included_in_print_rate": 1,
+			"parentfield": "taxes",
+			"rate": 2,
+			"row_id": 1,
+		},
+	]
+
 
 def create_internal_supplier(supplier_name, represents_company, allowed_to_interact_with):
 	if not frappe.db.exists("Supplier", supplier_name):
-		supplier = frappe.get_doc({
-			"supplier_group": "_Test Supplier Group",
-			"supplier_name": supplier_name,
-			"doctype": "Supplier",
-			"is_internal_supplier": 1,
-			"represents_company": represents_company
-		})
+		supplier = frappe.get_doc(
+			{
+				"supplier_group": "_Test Supplier Group",
+				"supplier_name": supplier_name,
+				"doctype": "Supplier",
+				"is_internal_supplier": 1,
+				"represents_company": represents_company,
+			}
+		)
 
-		supplier.append("companies", {
-			"company": allowed_to_interact_with
-		})
+		supplier.append("companies", {"company": allowed_to_interact_with})
 
 		supplier.insert()
 		supplier_name = supplier.name
@@ -2975,11 +3470,15 @@
 
 	return supplier_name
 
+
 def add_taxes(doc):
-	doc.append('taxes', {
-		'account_head': '_Test Account Excise Duty - TCP1',
-		"charge_type": "On Net Total",
-		"cost_center": "Main - TCP1",
-		"description": "Excise Duty",
-		"rate": 12
-	})
+	doc.append(
+		"taxes",
+		{
+			"account_head": "_Test Account Excise Duty - TCP1",
+			"charge_type": "On Net Total",
+			"cost_center": "Main - TCP1",
+			"description": "Excise Duty",
+			"rate": 12,
+		},
+	)
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py
index 8043a1b..d9009ba 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py
@@ -21,13 +21,14 @@
 
 	def autoname(self):
 		if self.company and self.title:
-			abbr = frappe.get_cached_value('Company',  self.company,  'abbr')
-			self.name = '{0} - {1}'.format(self.title, abbr)
+			abbr = frappe.get_cached_value("Company", self.company, "abbr")
+			self.name = "{0} - {1}".format(self.title, abbr)
 
 	def set_missing_values(self):
 		for data in self.taxes:
-			if data.charge_type == 'On Net Total' and flt(data.rate) == 0.0:
-				data.rate = frappe.db.get_value('Account', data.account_head, 'tax_rate')
+			if data.charge_type == "On Net Total" and flt(data.rate) == 0.0:
+				data.rate = frappe.db.get_value("Account", data.account_head, "tax_rate")
+
 
 def valdiate_taxes_and_charges_template(doc):
 	# default should not be disabled
@@ -35,9 +36,13 @@
 	# 	doc.is_default = 1
 
 	if doc.is_default == 1:
-		frappe.db.sql("""update `tab{0}` set is_default = 0
-			where is_default = 1 and name != %s and company = %s""".format(doc.doctype),
-			(doc.name, doc.company))
+		frappe.db.sql(
+			"""update `tab{0}` set is_default = 0
+			where is_default = 1 and name != %s and company = %s""".format(
+				doc.doctype
+			),
+			(doc.name, doc.company),
+		)
 
 	validate_disabled(doc)
 
@@ -50,13 +55,27 @@
 		validate_cost_center(tax, doc)
 		validate_inclusive_tax(tax, doc)
 
+
 def validate_disabled(doc):
 	if doc.is_default and doc.disabled:
 		frappe.throw(_("Disabled template must not be default template"))
 
+
 def validate_for_tax_category(doc):
 	if not doc.tax_category:
 		return
 
-	if frappe.db.exists(doc.doctype, {"company": doc.company, "tax_category": doc.tax_category, "disabled": 0, "name": ["!=", doc.name]}):
-		frappe.throw(_("A template with tax category {0} already exists. Only one template is allowed with each tax category").format(frappe.bold(doc.tax_category)))
+	if frappe.db.exists(
+		doc.doctype,
+		{
+			"company": doc.company,
+			"tax_category": doc.tax_category,
+			"disabled": 0,
+			"name": ["!=", doc.name],
+		},
+	):
+		frappe.throw(
+			_(
+				"A template with tax category {0} already exists. Only one template is allowed with each tax category"
+			).format(frappe.bold(doc.tax_category))
+		)
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py
index bc1fd8e..6432aca 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py
@@ -3,20 +3,14 @@
 
 def get_data():
 	return {
-		'fieldname': 'taxes_and_charges',
-		'non_standard_fieldnames': {
-			'Tax Rule': 'sales_tax_template',
-			'Subscription': 'sales_tax_template',
-			'Restaurant': 'default_tax_template'
+		"fieldname": "taxes_and_charges",
+		"non_standard_fieldnames": {
+			"Tax Rule": "sales_tax_template",
+			"Subscription": "sales_tax_template",
+			"Restaurant": "default_tax_template",
 		},
-		'transactions': [
-			{
-				'label': _('Transactions'),
-				'items': ['Sales Invoice', 'Sales Order', 'Delivery Note']
-			},
-			{
-				'label': _('References'),
-				'items': ['POS Profile', 'Subscription', 'Restaurant', 'Tax Rule']
-			}
-		]
+		"transactions": [
+			{"label": _("Transactions"), "items": ["Sales Invoice", "Sales Order", "Delivery Note"]},
+			{"label": _("References"), "items": ["POS Profile", "Subscription", "Restaurant", "Tax Rule"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py
index 7b13c6c..972b773 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py
@@ -5,7 +5,8 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Sales Taxes and Charges Template')
+test_records = frappe.get_test_records("Sales Taxes and Charges Template")
+
 
 class TestSalesTaxesandChargesTemplate(unittest.TestCase):
 	pass
diff --git a/erpnext/accounts/doctype/share_transfer/share_transfer.py b/erpnext/accounts/doctype/share_transfer/share_transfer.py
index b543ad8..4f49843 100644
--- a/erpnext/accounts/doctype/share_transfer/share_transfer.py
+++ b/erpnext/accounts/doctype/share_transfer/share_transfer.py
@@ -10,95 +10,115 @@
 from frappe.utils import nowdate
 
 
-class ShareDontExists(ValidationError): pass
+class ShareDontExists(ValidationError):
+	pass
+
 
 class ShareTransfer(Document):
 	def on_submit(self):
-		if self.transfer_type == 'Issue':
+		if self.transfer_type == "Issue":
 			shareholder = self.get_company_shareholder()
-			shareholder.append('share_balance', {
-				'share_type': self.share_type,
-				'from_no': self.from_no,
-				'to_no': self.to_no,
-				'rate': self.rate,
-				'amount': self.amount,
-				'no_of_shares': self.no_of_shares,
-				'is_company': 1,
-				'current_state': 'Issued'
-			})
+			shareholder.append(
+				"share_balance",
+				{
+					"share_type": self.share_type,
+					"from_no": self.from_no,
+					"to_no": self.to_no,
+					"rate": self.rate,
+					"amount": self.amount,
+					"no_of_shares": self.no_of_shares,
+					"is_company": 1,
+					"current_state": "Issued",
+				},
+			)
 			shareholder.save()
 
 			doc = self.get_shareholder_doc(self.to_shareholder)
-			doc.append('share_balance', {
-				'share_type': self.share_type,
-				'from_no': self.from_no,
-				'to_no': self.to_no,
-				'rate': self.rate,
-				'amount': self.amount,
-				'no_of_shares': self.no_of_shares
-			})
+			doc.append(
+				"share_balance",
+				{
+					"share_type": self.share_type,
+					"from_no": self.from_no,
+					"to_no": self.to_no,
+					"rate": self.rate,
+					"amount": self.amount,
+					"no_of_shares": self.no_of_shares,
+				},
+			)
 			doc.save()
 
-		elif self.transfer_type == 'Purchase':
+		elif self.transfer_type == "Purchase":
 			self.remove_shares(self.from_shareholder)
 			self.remove_shares(self.get_company_shareholder().name)
 
-		elif self.transfer_type == 'Transfer':
+		elif self.transfer_type == "Transfer":
 			self.remove_shares(self.from_shareholder)
 			doc = self.get_shareholder_doc(self.to_shareholder)
-			doc.append('share_balance', {
-				'share_type': self.share_type,
-				'from_no': self.from_no,
-				'to_no': self.to_no,
-				'rate': self.rate,
-				'amount': self.amount,
-				'no_of_shares': self.no_of_shares
-			})
+			doc.append(
+				"share_balance",
+				{
+					"share_type": self.share_type,
+					"from_no": self.from_no,
+					"to_no": self.to_no,
+					"rate": self.rate,
+					"amount": self.amount,
+					"no_of_shares": self.no_of_shares,
+				},
+			)
 			doc.save()
 
 	def on_cancel(self):
-		if self.transfer_type == 'Issue':
+		if self.transfer_type == "Issue":
 			compnay_shareholder = self.get_company_shareholder()
 			self.remove_shares(compnay_shareholder.name)
 			self.remove_shares(self.to_shareholder)
 
-		elif self.transfer_type == 'Purchase':
+		elif self.transfer_type == "Purchase":
 			compnay_shareholder = self.get_company_shareholder()
 			from_shareholder = self.get_shareholder_doc(self.from_shareholder)
 
-			from_shareholder.append('share_balance', {
-				'share_type': self.share_type,
-				'from_no': self.from_no,
-				'to_no': self.to_no,
-				'rate': self.rate,
-				'amount': self.amount,
-				'no_of_shares': self.no_of_shares
-			})
+			from_shareholder.append(
+				"share_balance",
+				{
+					"share_type": self.share_type,
+					"from_no": self.from_no,
+					"to_no": self.to_no,
+					"rate": self.rate,
+					"amount": self.amount,
+					"no_of_shares": self.no_of_shares,
+				},
+			)
 
 			from_shareholder.save()
 
-			compnay_shareholder.append('share_balance', {
-				'share_type': self.share_type,
-				'from_no': self.from_no,
-				'to_no': self.to_no,
-				'rate': self.rate,
-				'amount': self.amount,
-				'no_of_shares': self.no_of_shares
-			})
+			compnay_shareholder.append(
+				"share_balance",
+				{
+					"share_type": self.share_type,
+					"from_no": self.from_no,
+					"to_no": self.to_no,
+					"rate": self.rate,
+					"amount": self.amount,
+					"no_of_shares": self.no_of_shares,
+				},
+			)
 
 			compnay_shareholder.save()
 
-		elif self.transfer_type == 'Transfer':
+		elif self.transfer_type == "Transfer":
 			self.remove_shares(self.to_shareholder)
 			from_shareholder = self.get_shareholder_doc(self.from_shareholder)
-			from_shareholder.append('share_balance', {
-				'share_type': self.share_type,
-				'from_no': self.from_no,
-				'to_no': self.to_no,
-				'rate': self.rate,
-				'amount': self.amount,
-				'no_of_shares': self.no_of_shares
-			})
+			from_shareholder.append(
+				"share_balance",
+				{
+					"share_type": self.share_type,
+					"from_no": self.from_no,
+					"to_no": self.to_no,
+					"rate": self.rate,
+					"amount": self.amount,
+					"no_of_shares": self.no_of_shares,
+				},
+			)
 			from_shareholder.save()
 
 	def validate(self):
@@ -106,90 +126,96 @@
 		self.basic_validations()
 		self.folio_no_validation()
 
-		if self.transfer_type == 'Issue':
+		if self.transfer_type == "Issue":
 			# validate share doesn't exist in company
 			ret_val = self.share_exists(self.get_company_shareholder().name)
-			if ret_val in ('Complete', 'Partial'):
-				frappe.throw(_('The shares already exist'), frappe.DuplicateEntryError)
+			if ret_val in ("Complete", "Partial"):
+				frappe.throw(_("The shares already exist"), frappe.DuplicateEntryError)
 		else:
 			# validate share exists with from_shareholder
 			ret_val = self.share_exists(self.from_shareholder)
-			if ret_val in ('Outside', 'Partial'):
-				frappe.throw(_("The shares don't exist with the {0}")
-					.format(self.from_shareholder), ShareDontExists)
+			if ret_val in ("Outside", "Partial"):
+				frappe.throw(
+					_("The shares don't exist with the {0}").format(self.from_shareholder), ShareDontExists
+				)
 
 	def basic_validations(self):
-		if self.transfer_type == 'Purchase':
-			self.to_shareholder = ''
+		if self.transfer_type == "Purchase":
+			self.to_shareholder = ""
 			if not self.from_shareholder:
-				frappe.throw(_('The field From Shareholder cannot be blank'))
+				frappe.throw(_("The field From Shareholder cannot be blank"))
 			if not self.from_folio_no:
 				self.to_folio_no = self.autoname_folio(self.to_shareholder)
 			if not self.asset_account:
-				frappe.throw(_('The field Asset Account cannot be blank'))
-		elif (self.transfer_type == 'Issue'):
-			self.from_shareholder = ''
+				frappe.throw(_("The field Asset Account cannot be blank"))
+		elif self.transfer_type == "Issue":
+			self.from_shareholder = ""
 			if not self.to_shareholder:
-				frappe.throw(_('The field To Shareholder cannot be blank'))
+				frappe.throw(_("The field To Shareholder cannot be blank"))
 			if not self.to_folio_no:
 				self.to_folio_no = self.autoname_folio(self.to_shareholder)
 			if not self.asset_account:
-				frappe.throw(_('The field Asset Account cannot be blank'))
+				frappe.throw(_("The field Asset Account cannot be blank"))
 		else:
 			if not self.from_shareholder or not self.to_shareholder:
-				frappe.throw(_('The fields From Shareholder and To Shareholder cannot be blank'))
+				frappe.throw(_("The fields From Shareholder and To Shareholder cannot be blank"))
 			if not self.to_folio_no:
 				self.to_folio_no = self.autoname_folio(self.to_shareholder)
 		if not self.equity_or_liability_account:
-				frappe.throw(_('The field Equity/Liability Account cannot be blank'))
+			frappe.throw(_("The field Equity/Liability Account cannot be blank"))
 		if self.from_shareholder == self.to_shareholder:
-			frappe.throw(_('The seller and the buyer cannot be the same'))
+			frappe.throw(_("The seller and the buyer cannot be the same"))
 		if self.no_of_shares != self.to_no - self.from_no + 1:
-			frappe.throw(_('The number of shares and the share numbers are inconsistent'))
+			frappe.throw(_("The number of shares and the share numbers are inconsistent"))
 		if not self.amount:
 			self.amount = self.rate * self.no_of_shares
 		if self.amount != self.rate * self.no_of_shares:
-			frappe.throw(_('There are inconsistencies between the rate, no of shares and the amount calculated'))
+			frappe.throw(
+				_("There are inconsistencies between the rate, no of shares and the amount calculated")
+			)
 
 	def share_exists(self, shareholder):
 		doc = self.get_shareholder_doc(shareholder)
 		for entry in doc.share_balance:
-			if entry.share_type != self.share_type or \
-				entry.from_no > self.to_no or \
-				entry.to_no < self.from_no:
-				continue # since query lies outside bounds
-			elif entry.from_no <= self.from_no and entry.to_no >= self.to_no: #both inside
-				return 'Complete' # absolute truth!
+			if (
+				entry.share_type != self.share_type or entry.from_no > self.to_no or entry.to_no < self.from_no
+			):
+				continue  # since query lies outside bounds
+			elif entry.from_no <= self.from_no and entry.to_no >= self.to_no:  # both inside
+				return "Complete"  # absolute truth!
 			elif entry.from_no <= self.from_no <= self.to_no:
-				return 'Partial'
+				return "Partial"
 			elif entry.from_no <= self.to_no <= entry.to_no:
-				return 'Partial'
+				return "Partial"
 
-		return 'Outside'
+		return "Outside"
 
 	def folio_no_validation(self):
-		shareholder_fields = ['from_shareholder', 'to_shareholder']
+		shareholder_fields = ["from_shareholder", "to_shareholder"]
 		for shareholder_field in shareholder_fields:
 			shareholder_name = self.get(shareholder_field)
 			if not shareholder_name:
 				continue
 			doc = self.get_shareholder_doc(shareholder_name)
 			if doc.company != self.company:
-				frappe.throw(_('The shareholder does not belong to this company'))
+				frappe.throw(_("The shareholder does not belong to this company"))
 			if not doc.folio_no:
-				doc.folio_no = self.from_folio_no \
-					if (shareholder_field == 'from_shareholder') else self.to_folio_no
+				doc.folio_no = (
+					self.from_folio_no if (shareholder_field == "from_shareholder") else self.to_folio_no
+				)
 				doc.save()
 			else:
-				if doc.folio_no and doc.folio_no != (self.from_folio_no if (shareholder_field == 'from_shareholder') else self.to_folio_no):
-					frappe.throw(_('The folio numbers are not matching'))
+				if doc.folio_no and doc.folio_no != (
+					self.from_folio_no if (shareholder_field == "from_shareholder") else self.to_folio_no
+				):
+					frappe.throw(_("The folio numbers are not matching"))
 
 	def autoname_folio(self, shareholder, is_company=False):
 		if is_company:
 			doc = self.get_company_shareholder()
 		else:
 			doc = self.get_shareholder_doc(shareholder)
-		doc.folio_no = make_autoname('FN.#####')
+		doc.folio_no = make_autoname("FN.#####")
 		doc.save()
 		return doc.folio_no
 
@@ -197,106 +223,120 @@
 		# query = {'from_no': share_starting_no, 'to_no': share_ending_no}
 		# Shares exist for sure
 		# Iterate over all entries and modify entry if in entry
-		doc = frappe.get_doc('Shareholder', shareholder)
+		doc = frappe.get_doc("Shareholder", shareholder)
 		current_entries = doc.share_balance
 		new_entries = []
 
 		for entry in current_entries:
 			# use spaceage logic here
-			if entry.share_type != self.share_type or \
-				entry.from_no > self.to_no or \
-				entry.to_no < self.from_no:
+			if (
+				entry.share_type != self.share_type or entry.from_no > self.to_no or entry.to_no < self.from_no
+			):
 				new_entries.append(entry)
-				continue # since query lies outside bounds
+				continue  # since query lies outside bounds
 			elif entry.from_no <= self.from_no and entry.to_no >= self.to_no:
-				#split
+				# split
 				if entry.from_no == self.from_no:
 					if entry.to_no == self.to_no:
-						pass #nothing to append
+						pass  # nothing to append
 					else:
-						new_entries.append(self.return_share_balance_entry(self.to_no+1, entry.to_no, entry.rate))
+						new_entries.append(self.return_share_balance_entry(self.to_no + 1, entry.to_no, entry.rate))
 				else:
 					if entry.to_no == self.to_no:
-						new_entries.append(self.return_share_balance_entry(entry.from_no, self.from_no-1, entry.rate))
+						new_entries.append(
+							self.return_share_balance_entry(entry.from_no, self.from_no - 1, entry.rate)
+						)
 					else:
-						new_entries.append(self.return_share_balance_entry(entry.from_no, self.from_no-1, entry.rate))
-						new_entries.append(self.return_share_balance_entry(self.to_no+1, entry.to_no, entry.rate))
+						new_entries.append(
+							self.return_share_balance_entry(entry.from_no, self.from_no - 1, entry.rate)
+						)
+						new_entries.append(self.return_share_balance_entry(self.to_no + 1, entry.to_no, entry.rate))
 			elif entry.from_no >= self.from_no and entry.to_no <= self.to_no:
 				# split and check
-				pass #nothing to append
+				pass  # nothing to append
 			elif self.from_no <= entry.from_no <= self.to_no and entry.to_no >= self.to_no:
-				new_entries.append(self.return_share_balance_entry(self.to_no+1, entry.to_no, entry.rate))
+				new_entries.append(self.return_share_balance_entry(self.to_no + 1, entry.to_no, entry.rate))
 			elif self.from_no <= entry.to_no <= self.to_no and entry.from_no <= self.from_no:
-				new_entries.append(self.return_share_balance_entry(entry.from_no, self.from_no-1, entry.rate))
+				new_entries.append(
+					self.return_share_balance_entry(entry.from_no, self.from_no - 1, entry.rate)
+				)
 			else:
 				new_entries.append(entry)
 
 		doc.share_balance = []
 		for entry in new_entries:
-			doc.append('share_balance', entry)
+			doc.append("share_balance", entry)
 		doc.save()
 
 	def return_share_balance_entry(self, from_no, to_no, rate):
 		# return an entry as a dict
 		return {
-			'share_type'   : self.share_type,
-			'from_no'	   : from_no,
-			'to_no'		   : to_no,
-			'rate'		   : rate,
-			'amount'	   : self.rate * (to_no - from_no + 1),
-			'no_of_shares' : to_no - from_no + 1
+			"share_type": self.share_type,
+			"from_no": from_no,
+			"to_no": to_no,
+			"rate": rate,
+			"amount": self.rate * (to_no - from_no + 1),
+			"no_of_shares": to_no - from_no + 1,
 		}
 
 	def get_shareholder_doc(self, shareholder):
 		# Get Shareholder doc based on the Shareholder name
 		if shareholder:
-			query_filters = {'name': shareholder}
+			query_filters = {"name": shareholder}
 
-		name = frappe.db.get_value('Shareholder', {'name': shareholder}, 'name')
+		name = frappe.db.get_value("Shareholder", {"name": shareholder}, "name")
 
-		return frappe.get_doc('Shareholder', name)
+		return frappe.get_doc("Shareholder", name)
 
 	def get_company_shareholder(self):
 		# Get company doc or create one if not present
-		company_shareholder = frappe.db.get_value('Shareholder',
-			{
-				'company': self.company,
-				'is_company': 1
-			}, 'name')
+		company_shareholder = frappe.db.get_value(
+			"Shareholder", {"company": self.company, "is_company": 1}, "name"
+		)
 
 		if company_shareholder:
-			return frappe.get_doc('Shareholder', company_shareholder)
+			return frappe.get_doc("Shareholder", company_shareholder)
 		else:
-			shareholder = frappe.get_doc({
-					'doctype': 'Shareholder',
-					'title': self.company,
-					'company': self.company,
-					'is_company': 1
-				})
+			shareholder = frappe.get_doc(
+				{"doctype": "Shareholder", "title": self.company, "company": self.company, "is_company": 1}
+			)
 			shareholder.insert()
 
 			return shareholder
 
+
 @frappe.whitelist()
-def make_jv_entry( company, account, amount, payment_account,\
-	credit_applicant_type, credit_applicant, debit_applicant_type, debit_applicant):
-	journal_entry = frappe.new_doc('Journal Entry')
-	journal_entry.voucher_type = 'Journal Entry'
+def make_jv_entry(
+	company,
+	account,
+	amount,
+	payment_account,
+	credit_applicant_type,
+	credit_applicant,
+	debit_applicant_type,
+	debit_applicant,
+):
+	journal_entry = frappe.new_doc("Journal Entry")
+	journal_entry.voucher_type = "Journal Entry"
 	journal_entry.company = company
 	journal_entry.posting_date = nowdate()
 	account_amt_list = []
 
-	account_amt_list.append({
-		"account": account,
-		"debit_in_account_currency": amount,
-		"party_type": debit_applicant_type,
-		"party": debit_applicant,
-		})
-	account_amt_list.append({
-		"account": payment_account,
-		"credit_in_account_currency": amount,
-		"party_type": credit_applicant_type,
-		"party": credit_applicant,
-		})
+	account_amt_list.append(
+		{
+			"account": account,
+			"debit_in_account_currency": amount,
+			"party_type": debit_applicant_type,
+			"party": debit_applicant,
+		}
+	)
+	account_amt_list.append(
+		{
+			"account": payment_account,
+			"credit_in_account_currency": amount,
+			"party_type": credit_applicant_type,
+			"party": credit_applicant,
+		}
+	)
 	journal_entry.set("accounts", account_amt_list)
 	return journal_entry.as_dict()
diff --git a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py
index bc3a521..9731074 100644
--- a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py
+++ b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py
@@ -9,6 +9,7 @@
 
 test_dependencies = ["Share Type", "Shareholder"]
 
+
 class TestShareTransfer(unittest.TestCase):
 	def setUp(self):
 		frappe.db.sql("delete from `tabShare Transfer`")
@@ -26,7 +27,7 @@
 				"rate": 10,
 				"company": "_Test Company",
 				"asset_account": "Cash - _TC",
-				"equity_or_liability_account": "Creditors - _TC"
+				"equity_or_liability_account": "Creditors - _TC",
 			},
 			{
 				"doctype": "Share Transfer",
@@ -40,7 +41,7 @@
 				"no_of_shares": 100,
 				"rate": 15,
 				"company": "_Test Company",
-				"equity_or_liability_account": "Creditors - _TC"
+				"equity_or_liability_account": "Creditors - _TC",
 			},
 			{
 				"doctype": "Share Transfer",
@@ -54,7 +55,7 @@
 				"no_of_shares": 300,
 				"rate": 20,
 				"company": "_Test Company",
-				"equity_or_liability_account": "Creditors - _TC"
+				"equity_or_liability_account": "Creditors - _TC",
 			},
 			{
 				"doctype": "Share Transfer",
@@ -68,7 +69,7 @@
 				"no_of_shares": 200,
 				"rate": 15,
 				"company": "_Test Company",
-				"equity_or_liability_account": "Creditors - _TC"
+				"equity_or_liability_account": "Creditors - _TC",
 			},
 			{
 				"doctype": "Share Transfer",
@@ -82,42 +83,46 @@
 				"rate": 25,
 				"company": "_Test Company",
 				"asset_account": "Cash - _TC",
-				"equity_or_liability_account": "Creditors - _TC"
-			}
+				"equity_or_liability_account": "Creditors - _TC",
+			},
 		]
 		for d in share_transfers:
 			st = frappe.get_doc(d)
 			st.submit()
 
 	def test_invalid_share_transfer(self):
-		doc = frappe.get_doc({
-			"doctype": "Share Transfer",
-			"transfer_type": "Transfer",
-			"date": "2018-01-05",
-			"from_shareholder": "SH-00003",
-			"to_shareholder": "SH-00002",
-			"share_type": "Equity",
-			"from_no": 1,
-			"to_no": 100,
-			"no_of_shares": 100,
-			"rate": 15,
-			"company": "_Test Company",
-			"equity_or_liability_account": "Creditors - _TC"
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Share Transfer",
+				"transfer_type": "Transfer",
+				"date": "2018-01-05",
+				"from_shareholder": "SH-00003",
+				"to_shareholder": "SH-00002",
+				"share_type": "Equity",
+				"from_no": 1,
+				"to_no": 100,
+				"no_of_shares": 100,
+				"rate": 15,
+				"company": "_Test Company",
+				"equity_or_liability_account": "Creditors - _TC",
+			}
+		)
 		self.assertRaises(ShareDontExists, doc.insert)
 
-		doc = frappe.get_doc({
-			"doctype": "Share Transfer",
-			"transfer_type": "Purchase",
-			"date": "2018-01-02",
-			"from_shareholder": "SH-00001",
-			"share_type": "Equity",
-			"from_no": 1,
-			"to_no": 200,
-			"no_of_shares": 200,
-			"rate": 15,
-			"company": "_Test Company",
-			"asset_account": "Cash - _TC",
-			"equity_or_liability_account": "Creditors - _TC"
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Share Transfer",
+				"transfer_type": "Purchase",
+				"date": "2018-01-02",
+				"from_shareholder": "SH-00001",
+				"share_type": "Equity",
+				"from_no": 1,
+				"to_no": 200,
+				"no_of_shares": 200,
+				"rate": 15,
+				"company": "_Test Company",
+				"asset_account": "Cash - _TC",
+				"equity_or_liability_account": "Creditors - _TC",
+			}
+		)
 		self.assertRaises(ShareDontExists, doc.insert)
diff --git a/erpnext/accounts/doctype/share_type/share_type_dashboard.py b/erpnext/accounts/doctype/share_type/share_type_dashboard.py
index d5551d1..19604b3 100644
--- a/erpnext/accounts/doctype/share_type/share_type_dashboard.py
+++ b/erpnext/accounts/doctype/share_type/share_type_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'share_type',
-		'transactions': [
-			{
-				'label': _('References'),
-				'items': ['Share Transfer', 'Shareholder']
-			}
-		]
+		"fieldname": "share_type",
+		"transactions": [{"label": _("References"), "items": ["Share Transfer", "Shareholder"]}],
 	}
diff --git a/erpnext/accounts/doctype/shareholder/shareholder.py b/erpnext/accounts/doctype/shareholder/shareholder.py
index 8a0fa85..b0e2493 100644
--- a/erpnext/accounts/doctype/shareholder/shareholder.py
+++ b/erpnext/accounts/doctype/shareholder/shareholder.py
@@ -15,7 +15,7 @@
 		load_address_and_contact(self)
 
 	def on_trash(self):
-		delete_contact_and_address('Shareholder', self.name)
+		delete_contact_and_address("Shareholder", self.name)
 
 	def before_save(self):
 		for entry in self.share_balance:
diff --git a/erpnext/accounts/doctype/shareholder/shareholder_dashboard.py b/erpnext/accounts/doctype/shareholder/shareholder_dashboard.py
index c01ac23..fa9d431 100644
--- a/erpnext/accounts/doctype/shareholder/shareholder_dashboard.py
+++ b/erpnext/accounts/doctype/shareholder/shareholder_dashboard.py
@@ -1,12 +1,6 @@
 def get_data():
 	return {
-		'fieldname': 'shareholder',
-		'non_standard_fieldnames': {
-			'Share Transfer': 'to_shareholder'
-		},
-		'transactions': [
-			{
-				'items': ['Share Transfer']
-			}
-		]
+		"fieldname": "shareholder",
+		"non_standard_fieldnames": {"Share Transfer": "to_shareholder"},
+		"transactions": [{"items": ["Share Transfer"]}],
 	}
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
index 7e51299..1d79503 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
@@ -12,9 +12,17 @@
 import erpnext
 
 
-class OverlappingConditionError(frappe.ValidationError): pass
-class FromGreaterThanToError(frappe.ValidationError): pass
-class ManyBlankToValuesError(frappe.ValidationError): pass
+class OverlappingConditionError(frappe.ValidationError):
+	pass
+
+
+class FromGreaterThanToError(frappe.ValidationError):
+	pass
+
+
+class ManyBlankToValuesError(frappe.ValidationError):
+	pass
+
 
 class ShippingRule(Document):
 	def validate(self):
@@ -35,15 +43,19 @@
 			if not d.to_value:
 				zero_to_values.append(d)
 			elif d.from_value >= d.to_value:
-				throw(_("From value must be less than to value in row {0}").format(d.idx), FromGreaterThanToError)
+				throw(
+					_("From value must be less than to value in row {0}").format(d.idx), FromGreaterThanToError
+				)
 
 		# check if more than two or more rows has To Value = 0
 		if len(zero_to_values) >= 2:
-			throw(_('There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'),
-				ManyBlankToValuesError)
+			throw(
+				_('There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'),
+				ManyBlankToValuesError,
+			)
 
 	def apply(self, doc):
-		'''Apply shipping rule on given doc. Called from accounts controller'''
+		"""Apply shipping rule on given doc. Called from accounts controller"""
 
 		shipping_amount = 0.0
 		by_value = False
@@ -52,15 +64,15 @@
 			# validate country only if there is address
 			self.validate_countries(doc)
 
-		if self.calculate_based_on == 'Net Total':
+		if self.calculate_based_on == "Net Total":
 			value = doc.base_net_total
 			by_value = True
 
-		elif self.calculate_based_on == 'Net Weight':
+		elif self.calculate_based_on == "Net Weight":
 			value = doc.total_net_weight
 			by_value = True
 
-		elif self.calculate_based_on == 'Fixed':
+		elif self.calculate_based_on == "Fixed":
 			shipping_amount = self.shipping_amount
 
 		# shipping amount by value, apply conditions
@@ -75,7 +87,9 @@
 
 	def get_shipping_amount_from_rules(self, value):
 		for condition in self.get("conditions"):
-			if not condition.to_value or (flt(condition.from_value) <= flt(value) <= flt(condition.to_value)):
+			if not condition.to_value or (
+				flt(condition.from_value) <= flt(value) <= flt(condition.to_value)
+			):
 				return condition.shipping_amount
 
 		return 0.0
@@ -83,27 +97,31 @@
 	def validate_countries(self, doc):
 		# validate applicable countries
 		if self.countries:
-			shipping_country = doc.get_shipping_address().get('country')
+			shipping_country = doc.get_shipping_address().get("country")
 			if not shipping_country:
-				frappe.throw(_('Shipping Address does not have country, which is required for this Shipping Rule'))
+				frappe.throw(
+					_("Shipping Address does not have country, which is required for this Shipping Rule")
+				)
 			if shipping_country not in [d.country for d in self.countries]:
-				frappe.throw(_('Shipping rule not applicable for country {0} in Shipping Address').format(shipping_country))
+				frappe.throw(
+					_("Shipping rule not applicable for country {0} in Shipping Address").format(shipping_country)
+				)
 
 	def add_shipping_rule_to_tax_table(self, doc, shipping_amount):
 		shipping_charge = {
 			"charge_type": "Actual",
 			"account_head": self.account,
-			"cost_center": self.cost_center
+			"cost_center": self.cost_center,
 		}
 		if self.shipping_rule_type == "Selling":
 			# check if not applied on purchase
-			if not doc.meta.get_field('taxes').options == 'Sales Taxes and Charges':
-				frappe.throw(_('Shipping rule only applicable for Selling'))
+			if not doc.meta.get_field("taxes").options == "Sales Taxes and Charges":
+				frappe.throw(_("Shipping rule only applicable for Selling"))
 			shipping_charge["doctype"] = "Sales Taxes and Charges"
 		else:
 			# check if not applied on sales
-			if not doc.meta.get_field('taxes').options == 'Purchase Taxes and Charges':
-				frappe.throw(_('Shipping rule only applicable for Buying'))
+			if not doc.meta.get_field("taxes").options == "Purchase Taxes and Charges":
+				frappe.throw(_("Shipping rule only applicable for Buying"))
 
 			shipping_charge["doctype"] = "Purchase Taxes and Charges"
 			shipping_charge["category"] = "Valuation and Total"
@@ -127,19 +145,19 @@
 	def validate_overlapping_shipping_rule_conditions(self):
 		def overlap_exists_between(num_range1, num_range2):
 			"""
-				num_range1 and num_range2 are two ranges
-				ranges are represented as a tuple e.g. range 100 to 300 is represented as (100, 300)
-				if condition num_range1 = 100 to 300
-				then condition num_range2 can only be like 50 to 99 or 301 to 400
-				hence, non-overlapping condition = (x1 <= x2 < y1 <= y2) or (y1 <= y2 < x1 <= x2)
+			num_range1 and num_range2 are two ranges
+			ranges are represented as a tuple e.g. range 100 to 300 is represented as (100, 300)
+			if condition num_range1 = 100 to 300
+			then condition num_range2 can only be like 50 to 99 or 301 to 400
+			hence, non-overlapping condition = (x1 <= x2 < y1 <= y2) or (y1 <= y2 < x1 <= x2)
 			"""
 			(x1, x2), (y1, y2) = num_range1, num_range2
 			separate = (x1 <= x2 <= y1 <= y2) or (y1 <= y2 <= x1 <= x2)
-			return (not separate)
+			return not separate
 
 		overlaps = []
 		for i in range(0, len(self.conditions)):
-			for j in range(i+1, len(self.conditions)):
+			for j in range(i + 1, len(self.conditions)):
 				d1, d2 = self.conditions[i], self.conditions[j]
 				if d1.as_dict() != d2.as_dict():
 					# in our case, to_value can be zero, hence pass the from_value if so
@@ -153,7 +171,12 @@
 			msgprint(_("Overlapping conditions found between:"))
 			messages = []
 			for d1, d2 in overlaps:
-				messages.append("%s-%s = %s " % (d1.from_value, d1.to_value, fmt_money(d1.shipping_amount, currency=company_currency)) +
-					_("and") + " %s-%s = %s" % (d2.from_value, d2.to_value, fmt_money(d2.shipping_amount, currency=company_currency)))
+				messages.append(
+					"%s-%s = %s "
+					% (d1.from_value, d1.to_value, fmt_money(d1.shipping_amount, currency=company_currency))
+					+ _("and")
+					+ " %s-%s = %s"
+					% (d2.from_value, d2.to_value, fmt_money(d2.shipping_amount, currency=company_currency))
+				)
 
 			msgprint("\n".join(messages), raise_exception=OverlappingConditionError)
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule_dashboard.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule_dashboard.py
index fc70621..60ce120 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule_dashboard.py
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule_dashboard.py
@@ -3,22 +3,11 @@
 
 def get_data():
 	return {
-		'fieldname': 'shipping_rule',
-		'non_standard_fieldnames': {
-			'Payment Entry': 'party_name'
-		},
-		'transactions': [
-			{
-				'label': _('Pre Sales'),
-				'items': ['Quotation', 'Supplier Quotation']
-			},
-			{
-				'label': _('Sales'),
-				'items': ['Sales Order', 'Delivery Note', 'Sales Invoice']
-			},
-			{
-				'label': _('Purchase'),
-				'items': ['Purchase Invoice', 'Purchase Order', 'Purchase Receipt']
-			}
-		]
+		"fieldname": "shipping_rule",
+		"non_standard_fieldnames": {"Payment Entry": "party_name"},
+		"transactions": [
+			{"label": _("Pre Sales"), "items": ["Quotation", "Supplier Quotation"]},
+			{"label": _("Sales"), "items": ["Sales Order", "Delivery Note", "Sales Invoice"]},
+			{"label": _("Purchase"), "items": ["Purchase Invoice", "Purchase Order", "Purchase Receipt"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py
index c06dae0..a24e834 100644
--- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py
+++ b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py
@@ -11,18 +11,19 @@
 	OverlappingConditionError,
 )
 
-test_records = frappe.get_test_records('Shipping Rule')
+test_records = frappe.get_test_records("Shipping Rule")
+
 
 class TestShippingRule(unittest.TestCase):
 	def test_from_greater_than_to(self):
 		shipping_rule = frappe.copy_doc(test_records[0])
-		shipping_rule.name = test_records[0].get('name')
+		shipping_rule.name = test_records[0].get("name")
 		shipping_rule.get("conditions")[0].from_value = 101
 		self.assertRaises(FromGreaterThanToError, shipping_rule.insert)
 
 	def test_many_zero_to_values(self):
 		shipping_rule = frappe.copy_doc(test_records[0])
-		shipping_rule.name = test_records[0].get('name')
+		shipping_rule.name = test_records[0].get("name")
 		shipping_rule.get("conditions")[0].to_value = 0
 		self.assertRaises(ManyBlankToValuesError, shipping_rule.insert)
 
@@ -35,48 +36,58 @@
 			((50, 150), (50, 150)),
 		]:
 			shipping_rule = frappe.copy_doc(test_records[0])
-			shipping_rule.name = test_records[0].get('name')
+			shipping_rule.name = test_records[0].get("name")
 			shipping_rule.get("conditions")[0].from_value = range_a[0]
 			shipping_rule.get("conditions")[0].to_value = range_a[1]
 			shipping_rule.get("conditions")[1].from_value = range_b[0]
 			shipping_rule.get("conditions")[1].to_value = range_b[1]
 			self.assertRaises(OverlappingConditionError, shipping_rule.insert)
 
+
 def create_shipping_rule(shipping_rule_type, shipping_rule_name):
 
 	if frappe.db.exists("Shipping Rule", shipping_rule_name):
 		return frappe.get_doc("Shipping Rule", shipping_rule_name)
 
 	sr = frappe.new_doc("Shipping Rule")
-	sr.account =  "_Test Account Shipping Charges - _TC"
-	sr.calculate_based_on =  "Net Total"
+	sr.account = "_Test Account Shipping Charges - _TC"
+	sr.calculate_based_on = "Net Total"
 	sr.company = "_Test Company"
 	sr.cost_center = "_Test Cost Center - _TC"
 	sr.label = shipping_rule_name
 	sr.name = shipping_rule_name
 	sr.shipping_rule_type = shipping_rule_type
 
-	sr.append("conditions", {
+	sr.append(
+		"conditions",
+		{
 			"doctype": "Shipping Rule Condition",
 			"from_value": 0,
 			"parentfield": "conditions",
 			"shipping_amount": 50.0,
-			"to_value": 100
-		})
-	sr.append("conditions", {
+			"to_value": 100,
+		},
+	)
+	sr.append(
+		"conditions",
+		{
 			"doctype": "Shipping Rule Condition",
 			"from_value": 101,
 			"parentfield": "conditions",
 			"shipping_amount": 100.0,
-			"to_value": 200
-		})
-	sr.append("conditions", {
+			"to_value": 200,
+		},
+	)
+	sr.append(
+		"conditions",
+		{
 			"doctype": "Shipping Rule Condition",
 			"from_value": 201,
 			"parentfield": "conditions",
 			"shipping_amount": 200.0,
-			"to_value": 2000
-		})
+			"to_value": 2000,
+		},
+	)
 	sr.insert(ignore_permissions=True)
 	sr.submit()
 	return sr
diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py
index 467d4a1..f6dd86a 100644
--- a/erpnext/accounts/doctype/subscription/subscription.py
+++ b/erpnext/accounts/doctype/subscription/subscription.py
@@ -60,7 +60,11 @@
 		"""
 		_current_invoice_start = None
 
-		if self.is_new_subscription() and self.trial_period_end and getdate(self.trial_period_end) > getdate(self.start_date):
+		if (
+			self.is_new_subscription()
+			and self.trial_period_end
+			and getdate(self.trial_period_end) > getdate(self.start_date)
+		):
 			_current_invoice_start = add_days(self.trial_period_end, 1)
 		elif self.trial_period_start and self.is_trialling():
 			_current_invoice_start = self.trial_period_start
@@ -102,7 +106,7 @@
 
 			if self.follow_calendar_months:
 				billing_info = self.get_billing_cycle_and_interval()
-				billing_interval_count = billing_info[0]['billing_interval_count']
+				billing_interval_count = billing_info[0]["billing_interval_count"]
 				calendar_months = get_calendar_months(billing_interval_count)
 				calendar_month = 0
 				current_invoice_end_month = getdate(_current_invoice_end).month
@@ -112,12 +116,13 @@
 					if month <= current_invoice_end_month:
 						calendar_month = month
 
-				if cint(calendar_month - billing_interval_count) <= 0 and \
-					getdate(date).month != 1:
+				if cint(calendar_month - billing_interval_count) <= 0 and getdate(date).month != 1:
 					calendar_month = 12
 					current_invoice_end_year -= 1
 
-				_current_invoice_end = get_last_day(cstr(current_invoice_end_year) + '-' + cstr(calendar_month) + '-01')
+				_current_invoice_end = get_last_day(
+					cstr(current_invoice_end_year) + "-" + cstr(calendar_month) + "-01"
+				)
 
 			if self.end_date and getdate(_current_invoice_end) > getdate(self.end_date):
 				_current_invoice_end = self.end_date
@@ -131,7 +136,7 @@
 		same billing interval
 		"""
 		if billing_cycle_data and len(billing_cycle_data) != 1:
-			frappe.throw(_('You can only have Plans with the same billing cycle in a Subscription'))
+			frappe.throw(_("You can only have Plans with the same billing cycle in a Subscription"))
 
 	def get_billing_cycle_and_interval(self):
 		"""
@@ -141,10 +146,11 @@
 		"""
 		plan_names = [plan.plan for plan in self.plans]
 		billing_info = frappe.db.sql(
-			'select distinct `billing_interval`, `billing_interval_count` '
-			'from `tabSubscription Plan` '
-			'where name in %s',
-			(plan_names,), as_dict=1
+			"select distinct `billing_interval`, `billing_interval_count` "
+			"from `tabSubscription Plan` "
+			"where name in %s",
+			(plan_names,),
+			as_dict=1,
 		)
 
 		return billing_info
@@ -161,19 +167,19 @@
 
 		if billing_info:
 			data = dict()
-			interval = billing_info[0]['billing_interval']
-			interval_count = billing_info[0]['billing_interval_count']
-			if interval not in ['Day', 'Week']:
-				data['days'] = -1
-			if interval == 'Day':
-				data['days'] = interval_count - 1
-			elif interval == 'Month':
-				data['months'] = interval_count
-			elif interval == 'Year':
-				data['years'] = interval_count
+			interval = billing_info[0]["billing_interval"]
+			interval_count = billing_info[0]["billing_interval_count"]
+			if interval not in ["Day", "Week"]:
+				data["days"] = -1
+			if interval == "Day":
+				data["days"] = interval_count - 1
+			elif interval == "Month":
+				data["months"] = interval_count
+			elif interval == "Year":
+				data["years"] = interval_count
 			# todo: test week
-			elif interval == 'Week':
-				data['days'] = interval_count * 7 - 1
+			elif interval == "Week":
+				data["days"] = interval_count * 7 - 1
 
 			return data
 
@@ -184,27 +190,27 @@
 		Used when the `Subscription` needs to decide what to do after the current generated
 		invoice is past it's due date and grace period.
 		"""
-		subscription_settings = frappe.get_single('Subscription Settings')
-		if self.status == 'Past Due Date' and self.is_past_grace_period():
-			self.status = 'Cancelled' if cint(subscription_settings.cancel_after_grace) else 'Unpaid'
+		subscription_settings = frappe.get_single("Subscription Settings")
+		if self.status == "Past Due Date" and self.is_past_grace_period():
+			self.status = "Cancelled" if cint(subscription_settings.cancel_after_grace) else "Unpaid"
 
 	def set_subscription_status(self):
 		"""
 		Sets the status of the `Subscription`
 		"""
 		if self.is_trialling():
-			self.status = 'Trialling'
-		elif self.status == 'Active' and self.end_date and getdate() > getdate(self.end_date):
-			self.status = 'Completed'
+			self.status = "Trialling"
+		elif self.status == "Active" and self.end_date and getdate() > getdate(self.end_date):
+			self.status = "Completed"
 		elif self.is_past_grace_period():
-			subscription_settings = frappe.get_single('Subscription Settings')
-			self.status = 'Cancelled' if cint(subscription_settings.cancel_after_grace) else 'Unpaid'
+			subscription_settings = frappe.get_single("Subscription Settings")
+			self.status = "Cancelled" if cint(subscription_settings.cancel_after_grace) else "Unpaid"
 		elif self.current_invoice_is_past_due() and not self.is_past_grace_period():
-			self.status = 'Past Due Date'
+			self.status = "Past Due Date"
 		elif not self.has_outstanding_invoice():
-			self.status = 'Active'
+			self.status = "Active"
 		elif self.is_new_subscription():
-			self.status = 'Active'
+			self.status = "Active"
 		self.save()
 
 	def is_trialling(self):
@@ -231,7 +237,7 @@
 		"""
 		current_invoice = self.get_current_invoice()
 		if self.current_invoice_is_past_due(current_invoice):
-			subscription_settings = frappe.get_single('Subscription Settings')
+			subscription_settings = frappe.get_single("Subscription Settings")
 			grace_period = cint(subscription_settings.grace_period)
 
 			return getdate() > add_days(current_invoice.due_date, grace_period)
@@ -252,15 +258,15 @@
 		"""
 		Returns the most recent generated invoice.
 		"""
-		doctype = 'Sales Invoice' if self.party_type == 'Customer' else 'Purchase Invoice'
+		doctype = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
 
 		if len(self.invoices):
 			current = self.invoices[-1]
-			if frappe.db.exists(doctype, current.get('invoice')):
-				doc = frappe.get_doc(doctype, current.get('invoice'))
+			if frappe.db.exists(doctype, current.get("invoice")):
+				doc = frappe.get_doc(doctype, current.get("invoice"))
 				return doc
 			else:
-				frappe.throw(_('Invoice {0} no longer exists').format(current.get('invoice')))
+				frappe.throw(_("Invoice {0} no longer exists").format(current.get("invoice")))
 
 	def is_new_subscription(self):
 		"""
@@ -273,7 +279,7 @@
 		self.validate_plans_billing_cycle(self.get_billing_cycle_and_interval())
 		self.validate_end_date()
 		self.validate_to_follow_calendar_months()
-		self.cost_center = erpnext.get_default_cost_center(self.get('company'))
+		self.cost_center = erpnext.get_default_cost_center(self.get("company"))
 
 	def validate_trial_period(self):
 		"""
@@ -281,30 +287,34 @@
 		"""
 		if self.trial_period_start and self.trial_period_end:
 			if getdate(self.trial_period_end) < getdate(self.trial_period_start):
-				frappe.throw(_('Trial Period End Date Cannot be before Trial Period Start Date'))
+				frappe.throw(_("Trial Period End Date Cannot be before Trial Period Start Date"))
 
 		if self.trial_period_start and not self.trial_period_end:
-			frappe.throw(_('Both Trial Period Start Date and Trial Period End Date must be set'))
+			frappe.throw(_("Both Trial Period Start Date and Trial Period End Date must be set"))
 
 		if self.trial_period_start and getdate(self.trial_period_start) > getdate(self.start_date):
-			frappe.throw(_('Trial Period Start date cannot be after Subscription Start Date'))
+			frappe.throw(_("Trial Period Start date cannot be after Subscription Start Date"))
 
 	def validate_end_date(self):
 		billing_cycle_info = self.get_billing_cycle_data()
 		end_date = add_to_date(self.start_date, **billing_cycle_info)
 
 		if self.end_date and getdate(self.end_date) <= getdate(end_date):
-			frappe.throw(_('Subscription End Date must be after {0} as per the subscription plan').format(end_date))
+			frappe.throw(
+				_("Subscription End Date must be after {0} as per the subscription plan").format(end_date)
+			)
 
 	def validate_to_follow_calendar_months(self):
 		if self.follow_calendar_months:
 			billing_info = self.get_billing_cycle_and_interval()
 
 			if not self.end_date:
-				frappe.throw(_('Subscription End Date is mandatory to follow calendar months'))
+				frappe.throw(_("Subscription End Date is mandatory to follow calendar months"))
 
-			if billing_info[0]['billing_interval'] != 'Month':
-				frappe.throw(_('Billing Interval in Subscription Plan must be Month to follow calendar months'))
+			if billing_info[0]["billing_interval"] != "Month":
+				frappe.throw(
+					_("Billing Interval in Subscription Plan must be Month to follow calendar months")
+				)
 
 	def after_insert(self):
 		# todo: deal with users who collect prepayments. Maybe a new Subscription Invoice doctype?
@@ -316,13 +326,10 @@
 		saves the `Subscription`.
 		"""
 
-		doctype = 'Sales Invoice' if self.party_type == 'Customer' else 'Purchase Invoice'
+		doctype = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
 
 		invoice = self.create_invoice(prorate)
-		self.append('invoices', {
-			'document_type': doctype,
-			'invoice': invoice.name
-		})
+		self.append("invoices", {"document_type": doctype, "invoice": invoice.name})
 
 		self.save()
 
@@ -332,28 +339,33 @@
 		"""
 		Creates a `Invoice`, submits it and returns it
 		"""
-		doctype = 'Sales Invoice' if self.party_type == 'Customer' else 'Purchase Invoice'
+		doctype = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
 
 		invoice = frappe.new_doc(doctype)
 
 		# For backward compatibility
 		# Earlier subscription didn't had any company field
-		company = self.get('company') or get_default_company()
+		company = self.get("company") or get_default_company()
 		if not company:
-			frappe.throw(_("Company is mandatory was generating invoice. Please set default company in Global Defaults"))
+			frappe.throw(
+				_("Company is mandatory was generating invoice. Please set default company in Global Defaults")
+			)
 
 		invoice.company = company
 		invoice.set_posting_time = 1
-		invoice.posting_date = self.current_invoice_start if self.generate_invoice_at_period_start \
+		invoice.posting_date = (
+			self.current_invoice_start
+			if self.generate_invoice_at_period_start
 			else self.current_invoice_end
+		)
 
 		invoice.cost_center = self.cost_center
 
-		if doctype == 'Sales Invoice':
+		if doctype == "Sales Invoice":
 			invoice.customer = self.party
 		else:
 			invoice.supplier = self.party
-			if frappe.db.get_value('Supplier', self.party, 'tax_withholding_category'):
+			if frappe.db.get_value("Supplier", self.party, "tax_withholding_category"):
 				invoice.apply_tds = 1
 
 		### Add party currency to invoice
@@ -364,23 +376,21 @@
 
 		for dimension in accounting_dimensions:
 			if self.get(dimension):
-				invoice.update({
-					dimension: self.get(dimension)
-				})
+				invoice.update({dimension: self.get(dimension)})
 
 		# Subscription is better suited for service items. I won't update `update_stock`
 		# for that reason
 		items_list = self.get_items_from_plans(self.plans, prorate)
 		for item in items_list:
-			item['cost_center'] = self.cost_center
-			invoice.append('items', item)
+			item["cost_center"] = self.cost_center
+			invoice.append("items", item)
 
 		# Taxes
-		tax_template = ''
+		tax_template = ""
 
-		if doctype == 'Sales Invoice' and self.sales_tax_template:
+		if doctype == "Sales Invoice" and self.sales_tax_template:
 			tax_template = self.sales_tax_template
-		if doctype == 'Purchase Invoice' and self.purchase_tax_template:
+		if doctype == "Purchase Invoice" and self.purchase_tax_template:
 			tax_template = self.purchase_tax_template
 
 		if tax_template:
@@ -390,11 +400,11 @@
 		# Due date
 		if self.days_until_due:
 			invoice.append(
-				'payment_schedule',
+				"payment_schedule",
 				{
-					'due_date': add_days(invoice.posting_date, cint(self.days_until_due)),
-					'invoice_portion': 100
-				}
+					"due_date": add_days(invoice.posting_date, cint(self.days_until_due)),
+					"invoice_portion": 100,
+				},
 			)
 
 		# Discounts
@@ -409,7 +419,7 @@
 
 			if self.additional_discount_percentage or self.additional_discount_amount:
 				discount_on = self.apply_additional_discount
-				invoice.apply_discount_on = discount_on if discount_on else 'Grand Total'
+				invoice.apply_discount_on = discount_on if discount_on else "Grand Total"
 
 		# Subscription period
 		invoice.from_date = self.current_invoice_start
@@ -430,44 +440,62 @@
 		Returns the `Item`s linked to `Subscription Plan`
 		"""
 		if prorate:
-			prorate_factor = get_prorata_factor(self.current_invoice_end, self.current_invoice_start,
-				self.generate_invoice_at_period_start)
+			prorate_factor = get_prorata_factor(
+				self.current_invoice_end, self.current_invoice_start, self.generate_invoice_at_period_start
+			)
 
 		items = []
 		party = self.party
 		for plan in plans:
-			plan_doc = frappe.get_doc('Subscription Plan', plan.plan)
+			plan_doc = frappe.get_doc("Subscription Plan", plan.plan)
 
 			item_code = plan_doc.item
 
-			if self.party == 'Customer':
-				deferred_field = 'enable_deferred_revenue'
+			if self.party == "Customer":
+				deferred_field = "enable_deferred_revenue"
 			else:
-				deferred_field = 'enable_deferred_expense'
+				deferred_field = "enable_deferred_expense"
 
-			deferred = frappe.db.get_value('Item', item_code, deferred_field)
+			deferred = frappe.db.get_value("Item", item_code, deferred_field)
 
 			if not prorate:
-				item = {'item_code': item_code, 'qty': plan.qty, 'rate': get_plan_rate(plan.plan, plan.qty, party,
-					self.current_invoice_start, self.current_invoice_end), 'cost_center': plan_doc.cost_center}
+				item = {
+					"item_code": item_code,
+					"qty": plan.qty,
+					"rate": get_plan_rate(
+						plan.plan, plan.qty, party, self.current_invoice_start, self.current_invoice_end
+					),
+					"cost_center": plan_doc.cost_center,
+				}
 			else:
-				item = {'item_code': item_code, 'qty': plan.qty, 'rate': get_plan_rate(plan.plan, plan.qty, party,
-					self.current_invoice_start, self.current_invoice_end, prorate_factor), 'cost_center': plan_doc.cost_center}
+				item = {
+					"item_code": item_code,
+					"qty": plan.qty,
+					"rate": get_plan_rate(
+						plan.plan,
+						plan.qty,
+						party,
+						self.current_invoice_start,
+						self.current_invoice_end,
+						prorate_factor,
+					),
+					"cost_center": plan_doc.cost_center,
+				}
 
 			if deferred:
-				item.update({
-					deferred_field: deferred,
-					'service_start_date': self.current_invoice_start,
-					'service_end_date': self.current_invoice_end
-				})
+				item.update(
+					{
+						deferred_field: deferred,
+						"service_start_date": self.current_invoice_start,
+						"service_end_date": self.current_invoice_end,
+					}
+				)
 
 			accounting_dimensions = get_accounting_dimensions()
 
 			for dimension in accounting_dimensions:
 				if plan_doc.get(dimension):
-					item.update({
-						dimension: plan_doc.get(dimension)
-					})
+					item.update({dimension: plan_doc.get(dimension)})
 
 			items.append(item)
 
@@ -480,9 +508,9 @@
 		1. `process_for_active`
 		2. `process_for_past_due`
 		"""
-		if self.status == 'Active':
+		if self.status == "Active":
 			self.process_for_active()
-		elif self.status in ['Past Due Date', 'Unpaid']:
+		elif self.status in ["Past Due Date", "Unpaid"]:
 			self.process_for_past_due_date()
 
 		self.set_subscription_status()
@@ -490,8 +518,10 @@
 		self.save()
 
 	def is_postpaid_to_invoice(self):
-		return getdate() > getdate(self.current_invoice_end) or \
-			(getdate() >= getdate(self.current_invoice_end) and getdate(self.current_invoice_end) == getdate(self.current_invoice_start))
+		return getdate() > getdate(self.current_invoice_end) or (
+			getdate() >= getdate(self.current_invoice_end)
+			and getdate(self.current_invoice_end) == getdate(self.current_invoice_start)
+		)
 
 	def is_prepaid_to_invoice(self):
 		if not self.generate_invoice_at_period_start:
@@ -507,9 +537,13 @@
 		invoice = self.get_current_invoice()
 
 		if not (_current_start_date and _current_end_date):
-			_current_start_date, _current_end_date = self.update_subscription_period(date=add_days(self.current_invoice_end, 1), return_date=True)
+			_current_start_date, _current_end_date = self.update_subscription_period(
+				date=add_days(self.current_invoice_end, 1), return_date=True
+			)
 
-		if invoice and getdate(_current_start_date) <= getdate(invoice.posting_date) <= getdate(_current_end_date):
+		if invoice and getdate(_current_start_date) <= getdate(invoice.posting_date) <= getdate(
+			_current_end_date
+		):
 			return True
 
 		return False
@@ -524,10 +558,11 @@
 		3. Change the `Subscription` status to 'Cancelled'
 		"""
 
-		if not self.is_current_invoice_generated(self.current_invoice_start, self.current_invoice_end) \
-			and (self.is_postpaid_to_invoice() or self.is_prepaid_to_invoice()):
+		if not self.is_current_invoice_generated(
+			self.current_invoice_start, self.current_invoice_end
+		) and (self.is_postpaid_to_invoice() or self.is_prepaid_to_invoice()):
 
-			prorate = frappe.db.get_single_value('Subscription Settings', 'prorate')
+			prorate = frappe.db.get_single_value("Subscription Settings", "prorate")
 			self.generate_invoice(prorate)
 
 		if getdate() > getdate(self.current_invoice_end) and self.is_prepaid_to_invoice():
@@ -543,7 +578,7 @@
 		if self.end_date and getdate() < getdate(self.end_date):
 			return
 
-		self.status = 'Cancelled'
+		self.status = "Cancelled"
 		if not self.cancelation_date:
 			self.cancelation_date = nowdate()
 
@@ -558,10 +593,10 @@
 		"""
 		current_invoice = self.get_current_invoice()
 		if not current_invoice:
-			frappe.throw(_('Current invoice {0} is missing').format(current_invoice.invoice))
+			frappe.throw(_("Current invoice {0} is missing").format(current_invoice.invoice))
 		else:
 			if not self.has_outstanding_invoice():
-				self.status = 'Active'
+				self.status = "Active"
 			else:
 				self.set_status_grace_period()
 
@@ -569,31 +604,33 @@
 				self.update_subscription_period(add_days(self.current_invoice_end, 1))
 
 			# Generate invoices periodically even if current invoice are unpaid
-			if self.generate_new_invoices_past_due_date and not \
-				self.is_current_invoice_generated(self.current_invoice_start, self.current_invoice_end) \
-				and (self.is_postpaid_to_invoice() or self.is_prepaid_to_invoice()):
+			if (
+				self.generate_new_invoices_past_due_date
+				and not self.is_current_invoice_generated(self.current_invoice_start, self.current_invoice_end)
+				and (self.is_postpaid_to_invoice() or self.is_prepaid_to_invoice())
+			):
 
-				prorate = frappe.db.get_single_value('Subscription Settings', 'prorate')
+				prorate = frappe.db.get_single_value("Subscription Settings", "prorate")
 				self.generate_invoice(prorate)
 
-
 	@staticmethod
 	def is_paid(invoice):
 		"""
 		Return `True` if the given invoice is paid
 		"""
-		return invoice.status == 'Paid'
+		return invoice.status == "Paid"
 
 	def has_outstanding_invoice(self):
 		"""
 		Returns `True` if the most recent invoice for the `Subscription` is not paid
 		"""
-		doctype = 'Sales Invoice' if self.party_type == 'Customer' else 'Purchase Invoice'
+		doctype = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
 		current_invoice = self.get_current_invoice()
 		invoice_list = [d.invoice for d in self.invoices]
 
-		outstanding_invoices = frappe.get_all(doctype, fields=['name'],
-			filters={'status': ('!=', 'Paid'), 'name': ('in', invoice_list)})
+		outstanding_invoices = frappe.get_all(
+			doctype, fields=["name"], filters={"status": ("!=", "Paid"), "name": ("in", invoice_list)}
+		)
 
 		if outstanding_invoices:
 			return True
@@ -605,10 +642,12 @@
 		This sets the subscription as cancelled. It will stop invoices from being generated
 		but it will not affect already created invoices.
 		"""
-		if self.status != 'Cancelled':
-			to_generate_invoice = True if self.status == 'Active' and not self.generate_invoice_at_period_start else False
-			to_prorate = frappe.db.get_single_value('Subscription Settings', 'prorate')
-			self.status = 'Cancelled'
+		if self.status != "Cancelled":
+			to_generate_invoice = (
+				True if self.status == "Active" and not self.generate_invoice_at_period_start else False
+			)
+			to_prorate = frappe.db.get_single_value("Subscription Settings", "prorate")
+			self.status = "Cancelled"
 			self.cancelation_date = nowdate()
 			if to_generate_invoice:
 				self.generate_invoice(prorate=to_prorate)
@@ -620,19 +659,20 @@
 		subscription and the `Subscription` will lose all the history of generated invoices
 		it has.
 		"""
-		if self.status == 'Cancelled':
-			self.status = 'Active'
-			self.db_set('start_date', nowdate())
+		if self.status == "Cancelled":
+			self.status = "Active"
+			self.db_set("start_date", nowdate())
 			self.update_subscription_period(nowdate())
 			self.invoices = []
 			self.save()
 		else:
-			frappe.throw(_('You cannot restart a Subscription that is not cancelled.'))
+			frappe.throw(_("You cannot restart a Subscription that is not cancelled."))
 
 	def get_precision(self):
 		invoice = self.get_current_invoice()
 		if invoice:
-			return invoice.precision('grand_total')
+			return invoice.precision("grand_total")
+
 
 def get_calendar_months(billing_interval):
 	calendar_months = []
@@ -643,6 +683,7 @@
 
 	return calendar_months
 
+
 def get_prorata_factor(period_end, period_start, is_prepaid):
 	if is_prepaid:
 		prorate_factor = 1
@@ -667,7 +708,7 @@
 	"""
 	Returns all `Subscription` documents
 	"""
-	return frappe.db.get_all('Subscription', {'status': ('!=','Cancelled')})
+	return frappe.db.get_all("Subscription", {"status": ("!=", "Cancelled")})
 
 
 def process(data):
@@ -676,7 +717,7 @@
 	"""
 	if data:
 		try:
-			subscription = frappe.get_doc('Subscription', data['name'])
+			subscription = frappe.get_doc("Subscription", data["name"])
 			subscription.process()
 			frappe.db.commit()
 		except frappe.ValidationError:
@@ -692,7 +733,7 @@
 	Cancels a `Subscription`. This will stop the `Subscription` from further invoicing the
 	`Subscriber` but all already outstanding invoices will not be affected.
 	"""
-	subscription = frappe.get_doc('Subscription', name)
+	subscription = frappe.get_doc("Subscription", name)
 	subscription.cancel_subscription()
 
 
@@ -702,7 +743,7 @@
 	Restarts a cancelled `Subscription`. The `Subscription` will 'forget' the history of
 	all invoices it has generated
 	"""
-	subscription = frappe.get_doc('Subscription', name)
+	subscription = frappe.get_doc("Subscription", name)
 	subscription.restart_subscription()
 
 
@@ -711,5 +752,5 @@
 	"""
 	Use this to get the latest state of the given `Subscription`
 	"""
-	subscription = frappe.get_doc('Subscription', name)
+	subscription = frappe.get_doc("Subscription", name)
 	subscription.process()
diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py
index 6f67bc5..eb17daa 100644
--- a/erpnext/accounts/doctype/subscription/test_subscription.py
+++ b/erpnext/accounts/doctype/subscription/test_subscription.py
@@ -18,104 +18,111 @@
 
 test_dependencies = ("UOM", "Item Group", "Item")
 
+
 def create_plan():
-	if not frappe.db.exists('Subscription Plan', '_Test Plan Name'):
-		plan = frappe.new_doc('Subscription Plan')
-		plan.plan_name = '_Test Plan Name'
-		plan.item = '_Test Non Stock Item'
+	if not frappe.db.exists("Subscription Plan", "_Test Plan Name"):
+		plan = frappe.new_doc("Subscription Plan")
+		plan.plan_name = "_Test Plan Name"
+		plan.item = "_Test Non Stock Item"
 		plan.price_determination = "Fixed Rate"
 		plan.cost = 900
-		plan.billing_interval = 'Month'
+		plan.billing_interval = "Month"
 		plan.billing_interval_count = 1
 		plan.insert()
 
-	if not frappe.db.exists('Subscription Plan', '_Test Plan Name 2'):
-		plan = frappe.new_doc('Subscription Plan')
-		plan.plan_name = '_Test Plan Name 2'
-		plan.item = '_Test Non Stock Item'
+	if not frappe.db.exists("Subscription Plan", "_Test Plan Name 2"):
+		plan = frappe.new_doc("Subscription Plan")
+		plan.plan_name = "_Test Plan Name 2"
+		plan.item = "_Test Non Stock Item"
 		plan.price_determination = "Fixed Rate"
 		plan.cost = 1999
-		plan.billing_interval = 'Month'
+		plan.billing_interval = "Month"
 		plan.billing_interval_count = 1
 		plan.insert()
 
-	if not frappe.db.exists('Subscription Plan', '_Test Plan Name 3'):
-		plan = frappe.new_doc('Subscription Plan')
-		plan.plan_name = '_Test Plan Name 3'
-		plan.item = '_Test Non Stock Item'
+	if not frappe.db.exists("Subscription Plan", "_Test Plan Name 3"):
+		plan = frappe.new_doc("Subscription Plan")
+		plan.plan_name = "_Test Plan Name 3"
+		plan.item = "_Test Non Stock Item"
 		plan.price_determination = "Fixed Rate"
 		plan.cost = 1999
-		plan.billing_interval = 'Day'
+		plan.billing_interval = "Day"
 		plan.billing_interval_count = 14
 		plan.insert()
 
 	# Defined a quarterly Subscription Plan
-	if not frappe.db.exists('Subscription Plan', '_Test Plan Name 4'):
-		plan = frappe.new_doc('Subscription Plan')
-		plan.plan_name = '_Test Plan Name 4'
-		plan.item = '_Test Non Stock Item'
+	if not frappe.db.exists("Subscription Plan", "_Test Plan Name 4"):
+		plan = frappe.new_doc("Subscription Plan")
+		plan.plan_name = "_Test Plan Name 4"
+		plan.item = "_Test Non Stock Item"
 		plan.price_determination = "Monthly Rate"
 		plan.cost = 20000
-		plan.billing_interval = 'Month'
+		plan.billing_interval = "Month"
 		plan.billing_interval_count = 3
 		plan.insert()
 
-	if not frappe.db.exists('Subscription Plan', '_Test Plan Multicurrency'):
-		plan = frappe.new_doc('Subscription Plan')
-		plan.plan_name = '_Test Plan Multicurrency'
-		plan.item = '_Test Non Stock Item'
+	if not frappe.db.exists("Subscription Plan", "_Test Plan Multicurrency"):
+		plan = frappe.new_doc("Subscription Plan")
+		plan.plan_name = "_Test Plan Multicurrency"
+		plan.item = "_Test Non Stock Item"
 		plan.price_determination = "Fixed Rate"
 		plan.cost = 50
-		plan.currency = 'USD'
-		plan.billing_interval = 'Month'
+		plan.currency = "USD"
+		plan.billing_interval = "Month"
 		plan.billing_interval_count = 1
 		plan.insert()
 
+
 def create_parties():
-	if not frappe.db.exists('Supplier', '_Test Supplier'):
-		supplier = frappe.new_doc('Supplier')
-		supplier.supplier_name = '_Test Supplier'
-		supplier.supplier_group = 'All Supplier Groups'
+	if not frappe.db.exists("Supplier", "_Test Supplier"):
+		supplier = frappe.new_doc("Supplier")
+		supplier.supplier_name = "_Test Supplier"
+		supplier.supplier_group = "All Supplier Groups"
 		supplier.insert()
 
-	if not frappe.db.exists('Customer', '_Test Subscription Customer'):
-		customer = frappe.new_doc('Customer')
-		customer.customer_name = '_Test Subscription Customer'
-		customer.billing_currency = 'USD'
-		customer.append('accounts', {
-			'company': '_Test Company',
-			'account': '_Test Receivable USD - _TC'
-		})
+	if not frappe.db.exists("Customer", "_Test Subscription Customer"):
+		customer = frappe.new_doc("Customer")
+		customer.customer_name = "_Test Subscription Customer"
+		customer.billing_currency = "USD"
+		customer.append(
+			"accounts", {"company": "_Test Company", "account": "_Test Receivable USD - _TC"}
+		)
 		customer.insert()
 
+
 class TestSubscription(unittest.TestCase):
 	def setUp(self):
 		create_plan()
 		create_parties()
 
 	def test_create_subscription_with_trial_with_correct_period(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
 		subscription.trial_period_start = nowdate()
 		subscription.trial_period_end = add_months(nowdate(), 1)
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 
 		self.assertEqual(subscription.trial_period_start, nowdate())
 		self.assertEqual(subscription.trial_period_end, add_months(nowdate(), 1))
-		self.assertEqual(add_days(subscription.trial_period_end, 1), get_date_str(subscription.current_invoice_start))
-		self.assertEqual(add_to_date(subscription.current_invoice_start, months=1, days=-1), get_date_str(subscription.current_invoice_end))
+		self.assertEqual(
+			add_days(subscription.trial_period_end, 1), get_date_str(subscription.current_invoice_start)
+		)
+		self.assertEqual(
+			add_to_date(subscription.current_invoice_start, months=1, days=-1),
+			get_date_str(subscription.current_invoice_end),
+		)
 		self.assertEqual(subscription.invoices, [])
-		self.assertEqual(subscription.status, 'Trialling')
+		self.assertEqual(subscription.status, "Trialling")
 
 		subscription.delete()
 
 	def test_create_subscription_without_trial_with_correct_period(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 
 		self.assertEqual(subscription.trial_period_start, None)
@@ -124,190 +131,190 @@
 		self.assertEqual(subscription.current_invoice_end, add_to_date(nowdate(), months=1, days=-1))
 		# No invoice is created
 		self.assertEqual(len(subscription.invoices), 0)
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 
 		subscription.delete()
 
 	def test_create_subscription_trial_with_wrong_dates(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
 		subscription.trial_period_end = nowdate()
 		subscription.trial_period_start = add_days(nowdate(), 30)
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 
 		self.assertRaises(frappe.ValidationError, subscription.save)
 		subscription.delete()
 
 	def test_create_subscription_multi_with_different_billing_fails(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
 		subscription.trial_period_end = nowdate()
 		subscription.trial_period_start = add_days(nowdate(), 30)
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.append('plans', {'plan': '_Test Plan Name 3', 'qty': 1})
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.append("plans", {"plan": "_Test Plan Name 3", "qty": 1})
 
 		self.assertRaises(frappe.ValidationError, subscription.save)
 		subscription.delete()
 
 	def test_invoice_is_generated_at_end_of_billing_period(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.start_date = '2018-01-01'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.start_date = "2018-01-01"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.insert()
 
-		self.assertEqual(subscription.status, 'Active')
-		self.assertEqual(subscription.current_invoice_start, '2018-01-01')
-		self.assertEqual(subscription.current_invoice_end, '2018-01-31')
+		self.assertEqual(subscription.status, "Active")
+		self.assertEqual(subscription.current_invoice_start, "2018-01-01")
+		self.assertEqual(subscription.current_invoice_end, "2018-01-31")
 		subscription.process()
 
 		self.assertEqual(len(subscription.invoices), 1)
-		self.assertEqual(subscription.current_invoice_start, '2018-01-01')
+		self.assertEqual(subscription.current_invoice_start, "2018-01-01")
 		subscription.process()
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 		subscription.delete()
 
 	def test_status_goes_back_to_active_after_invoice_is_paid(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.start_date = '2018-01-01'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.start_date = "2018-01-01"
 		subscription.insert()
-		subscription.process()	# generate first invoice
+		subscription.process()  # generate first invoice
 		self.assertEqual(len(subscription.invoices), 1)
 
 		# Status is unpaid as Days until Due is zero and grace period is Zero
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		subscription.get_current_invoice()
 		current_invoice = subscription.get_current_invoice()
 
 		self.assertIsNotNone(current_invoice)
 
-		current_invoice.db_set('outstanding_amount', 0)
-		current_invoice.db_set('status', 'Paid')
+		current_invoice.db_set("outstanding_amount", 0)
+		current_invoice.db_set("status", "Paid")
 		subscription.process()
 
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(subscription.current_invoice_start, add_months(subscription.start_date, 1))
 		self.assertEqual(len(subscription.invoices), 1)
 
 		subscription.delete()
 
 	def test_subscription_cancel_after_grace_period(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		default_grace_period_action = settings.cancel_after_grace
 		settings.cancel_after_grace = 1
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.start_date = '2018-01-01'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.start_date = "2018-01-01"
 		subscription.insert()
 
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 
-		subscription.process()		# generate first invoice
+		subscription.process()  # generate first invoice
 		# This should change status to Cancelled since grace period is 0
 		# And is backdated subscription so subscription will be cancelled after processing
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 
 		settings.cancel_after_grace = default_grace_period_action
 		settings.save()
 		subscription.delete()
 
 	def test_subscription_unpaid_after_grace_period(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		default_grace_period_action = settings.cancel_after_grace
 		settings.cancel_after_grace = 0
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.start_date = '2018-01-01'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.start_date = "2018-01-01"
 		subscription.insert()
-		subscription.process()		# generate first invoice
+		subscription.process()  # generate first invoice
 
 		# Status is unpaid as Days until Due is zero and grace period is Zero
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		settings.cancel_after_grace = default_grace_period_action
 		settings.save()
 		subscription.delete()
 
 	def test_subscription_invoice_days_until_due(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.days_until_due = 10
 		subscription.start_date = add_months(nowdate(), -1)
 		subscription.insert()
-		subscription.process()		# generate first invoice
+		subscription.process()  # generate first invoice
 		self.assertEqual(len(subscription.invoices), 1)
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 
 		subscription.delete()
 
 	def test_subscription_is_past_due_doesnt_change_within_grace_period(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		grace_period = settings.grace_period
 		settings.grace_period = 1000
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.start_date = add_days(nowdate(), -1000)
 		subscription.insert()
-		subscription.process()		# generate first invoice
+		subscription.process()  # generate first invoice
 
-		self.assertEqual(subscription.status, 'Past Due Date')
+		self.assertEqual(subscription.status, "Past Due Date")
 
 		subscription.process()
 		# Grace period is 1000 days so status should remain as Past Due Date
-		self.assertEqual(subscription.status, 'Past Due Date')
+		self.assertEqual(subscription.status, "Past Due Date")
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Past Due Date')
+		self.assertEqual(subscription.status, "Past Due Date")
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Past Due Date')
+		self.assertEqual(subscription.status, "Past Due Date")
 
 		settings.grace_period = grace_period
 		settings.save()
 		subscription.delete()
 
 	def test_subscription_remains_active_during_invoice_period(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
-		subscription.process()		# no changes expected
+		subscription.process()  # no changes expected
 
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(subscription.current_invoice_start, nowdate())
 		self.assertEqual(subscription.current_invoice_end, add_to_date(nowdate(), months=1, days=-1))
 		self.assertEqual(len(subscription.invoices), 0)
 
-		subscription.process()		# no changes expected still
-		self.assertEqual(subscription.status, 'Active')
+		subscription.process()  # no changes expected still
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(subscription.current_invoice_start, nowdate())
 		self.assertEqual(subscription.current_invoice_end, add_to_date(nowdate(), months=1, days=-1))
 		self.assertEqual(len(subscription.invoices), 0)
 
-		subscription.process()		# no changes expected yet still
-		self.assertEqual(subscription.status, 'Active')
+		subscription.process()  # no changes expected yet still
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(subscription.current_invoice_start, nowdate())
 		self.assertEqual(subscription.current_invoice_end, add_to_date(nowdate(), months=1, days=-1))
 		self.assertEqual(len(subscription.invoices), 0)
@@ -315,30 +322,30 @@
 		subscription.delete()
 
 	def test_subscription_cancelation(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.cancel_subscription()
 
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 
 		subscription.delete()
 
 	def test_subscription_cancellation_invoices(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		to_prorate = settings.prorate
 		settings.prorate = 1
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 
 		subscription.cancel_subscription()
 		# Invoice must have been generated
@@ -346,33 +353,39 @@
 
 		invoice = subscription.get_current_invoice()
 		diff = flt(date_diff(nowdate(), subscription.current_invoice_start) + 1)
-		plan_days = flt(date_diff(subscription.current_invoice_end, subscription.current_invoice_start) + 1)
-		prorate_factor = flt(diff/plan_days)
+		plan_days = flt(
+			date_diff(subscription.current_invoice_end, subscription.current_invoice_start) + 1
+		)
+		prorate_factor = flt(diff / plan_days)
 
 		self.assertEqual(
 			flt(
-				get_prorata_factor(subscription.current_invoice_end, subscription.current_invoice_start,
-					subscription.generate_invoice_at_period_start),
-				2),
-			flt(prorate_factor, 2)
+				get_prorata_factor(
+					subscription.current_invoice_end,
+					subscription.current_invoice_start,
+					subscription.generate_invoice_at_period_start,
+				),
+				2,
+			),
+			flt(prorate_factor, 2),
 		)
 		self.assertEqual(flt(invoice.grand_total, 2), flt(prorate_factor * 900, 2))
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 
 		subscription.delete()
 		settings.prorate = to_prorate
 		settings.save()
 
 	def test_subscription_cancellation_invoices_with_prorata_false(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		to_prorate = settings.prorate
 		settings.prorate = 0
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.cancel_subscription()
 		invoice = subscription.get_current_invoice()
@@ -385,21 +398,23 @@
 		subscription.delete()
 
 	def test_subscription_cancellation_invoices_with_prorata_true(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		to_prorate = settings.prorate
 		settings.prorate = 1
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.cancel_subscription()
 
 		invoice = subscription.get_current_invoice()
 		diff = flt(date_diff(nowdate(), subscription.current_invoice_start) + 1)
-		plan_days = flt(date_diff(subscription.current_invoice_end, subscription.current_invoice_start) + 1)
+		plan_days = flt(
+			date_diff(subscription.current_invoice_end, subscription.current_invoice_start) + 1
+		)
 		prorate_factor = flt(diff / plan_days)
 
 		self.assertEqual(flt(invoice.grand_total, 2), flt(prorate_factor * 900, 2))
@@ -410,30 +425,30 @@
 		subscription.delete()
 
 	def test_subcription_cancellation_and_process(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		default_grace_period_action = settings.cancel_after_grace
 		settings.cancel_after_grace = 1
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.start_date = '2018-01-01'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.start_date = "2018-01-01"
 		subscription.insert()
-		subscription.process()	# generate first invoice
+		subscription.process()  # generate first invoice
 		invoices = len(subscription.invoices)
 
 		subscription.cancel_subscription()
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 		self.assertEqual(len(subscription.invoices), invoices)
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 		self.assertEqual(len(subscription.invoices), invoices)
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 		self.assertEqual(len(subscription.invoices), invoices)
 
 		settings.cancel_after_grace = default_grace_period_action
@@ -441,36 +456,36 @@
 		subscription.delete()
 
 	def test_subscription_restart_and_process(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		default_grace_period_action = settings.cancel_after_grace
 		settings.grace_period = 0
 		settings.cancel_after_grace = 0
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.start_date = '2018-01-01'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.start_date = "2018-01-01"
 		subscription.insert()
-		subscription.process()		# generate first invoice
+		subscription.process()  # generate first invoice
 
 		# Status is unpaid as Days until Due is zero and grace period is Zero
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		subscription.cancel_subscription()
-		self.assertEqual(subscription.status, 'Cancelled')
+		self.assertEqual(subscription.status, "Cancelled")
 
 		subscription.restart_subscription()
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(len(subscription.invoices), 0)
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(len(subscription.invoices), 0)
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 		self.assertEqual(len(subscription.invoices), 0)
 
 		settings.cancel_after_grace = default_grace_period_action
@@ -478,42 +493,42 @@
 		subscription.delete()
 
 	def test_subscription_unpaid_back_to_active(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		default_grace_period_action = settings.cancel_after_grace
 		settings.cancel_after_grace = 0
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
-		subscription.start_date = '2018-01-01'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
+		subscription.start_date = "2018-01-01"
 		subscription.insert()
 
-		subscription.process()		# generate first invoice
+		subscription.process()  # generate first invoice
 		# This should change status to Unpaid since grace period is 0
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		invoice = subscription.get_current_invoice()
-		invoice.db_set('outstanding_amount', 0)
-		invoice.db_set('status', 'Paid')
+		invoice.db_set("outstanding_amount", 0)
+		invoice.db_set("status", "Paid")
 
 		subscription.process()
-		self.assertEqual(subscription.status, 'Active')
+		self.assertEqual(subscription.status, "Active")
 
 		# A new invoice is generated
 		subscription.process()
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		settings.cancel_after_grace = default_grace_period_action
 		settings.save()
 		subscription.delete()
 
 	def test_restart_active_subscription(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 
 		self.assertRaises(frappe.ValidationError, subscription.restart_subscription)
@@ -521,44 +536,44 @@
 		subscription.delete()
 
 	def test_subscription_invoice_discount_percentage(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
 		subscription.additional_discount_percentage = 10
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.cancel_subscription()
 
 		invoice = subscription.get_current_invoice()
 
 		self.assertEqual(invoice.additional_discount_percentage, 10)
-		self.assertEqual(invoice.apply_discount_on, 'Grand Total')
+		self.assertEqual(invoice.apply_discount_on, "Grand Total")
 
 		subscription.delete()
 
 	def test_subscription_invoice_discount_amount(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
 		subscription.additional_discount_amount = 11
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.cancel_subscription()
 
 		invoice = subscription.get_current_invoice()
 
 		self.assertEqual(invoice.discount_amount, 11)
-		self.assertEqual(invoice.apply_discount_on, 'Grand Total')
+		self.assertEqual(invoice.apply_discount_on, "Grand Total")
 
 		subscription.delete()
 
 	def test_prepaid_subscriptions(self):
 		# Create a non pre-billed subscription, processing should not create
 		# invoices.
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.process()
 
@@ -573,16 +588,16 @@
 		self.assertEqual(len(subscription.invoices), 1)
 
 	def test_prepaid_subscriptions_with_prorate_true(self):
-		settings = frappe.get_single('Subscription Settings')
+		settings = frappe.get_single("Subscription Settings")
 		to_prorate = settings.prorate
 		settings.prorate = 1
 		settings.save()
 
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Customer"
 		subscription.generate_invoice_at_period_start = True
-		subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
+		subscription.append("plans", {"plan": "_Test Plan Name", "qty": 1})
 		subscription.save()
 		subscription.process()
 		subscription.cancel_subscription()
@@ -602,38 +617,38 @@
 		subscription.delete()
 
 	def test_subscription_with_follow_calendar_months(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Supplier'
-		subscription.party = '_Test Supplier'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Supplier"
+		subscription.party = "_Test Supplier"
 		subscription.generate_invoice_at_period_start = 1
 		subscription.follow_calendar_months = 1
 
 		# select subscription start date as '2018-01-15'
-		subscription.start_date = '2018-01-15'
-		subscription.end_date = '2018-07-15'
-		subscription.append('plans', {'plan': '_Test Plan Name 4', 'qty': 1})
+		subscription.start_date = "2018-01-15"
+		subscription.end_date = "2018-07-15"
+		subscription.append("plans", {"plan": "_Test Plan Name 4", "qty": 1})
 		subscription.save()
 
 		# even though subscription starts at '2018-01-15' and Billing interval is Month and count 3
 		# First invoice will end at '2018-03-31' instead of '2018-04-14'
-		self.assertEqual(get_date_str(subscription.current_invoice_end), '2018-03-31')
+		self.assertEqual(get_date_str(subscription.current_invoice_end), "2018-03-31")
 
 	def test_subscription_generate_invoice_past_due(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Supplier'
-		subscription.party = '_Test Supplier'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Supplier"
+		subscription.party = "_Test Supplier"
 		subscription.generate_invoice_at_period_start = 1
 		subscription.generate_new_invoices_past_due_date = 1
 		# select subscription start date as '2018-01-15'
-		subscription.start_date = '2018-01-01'
-		subscription.append('plans', {'plan': '_Test Plan Name 4', 'qty': 1})
+		subscription.start_date = "2018-01-01"
+		subscription.append("plans", {"plan": "_Test Plan Name 4", "qty": 1})
 		subscription.save()
 
 		# Process subscription and create first invoice
 		# Subscription status will be unpaid since due date has already passed
 		subscription.process()
 		self.assertEqual(len(subscription.invoices), 1)
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		# Now the Subscription is unpaid
 		# Even then new invoice should be created as we have enabled `generate_new_invoices_past_due_date` in
@@ -643,39 +658,39 @@
 		self.assertEqual(len(subscription.invoices), 2)
 
 	def test_subscription_without_generate_invoice_past_due(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Supplier'
-		subscription.party = '_Test Supplier'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Supplier"
+		subscription.party = "_Test Supplier"
 		subscription.generate_invoice_at_period_start = 1
 		# select subscription start date as '2018-01-15'
-		subscription.start_date = '2018-01-01'
-		subscription.append('plans', {'plan': '_Test Plan Name 4', 'qty': 1})
+		subscription.start_date = "2018-01-01"
+		subscription.append("plans", {"plan": "_Test Plan Name 4", "qty": 1})
 		subscription.save()
 
 		# Process subscription and create first invoice
 		# Subscription status will be unpaid since due date has already passed
 		subscription.process()
 		self.assertEqual(len(subscription.invoices), 1)
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		subscription.process()
 		self.assertEqual(len(subscription.invoices), 1)
 
 	def test_multicurrency_subscription(self):
-		subscription = frappe.new_doc('Subscription')
-		subscription.party_type = 'Customer'
-		subscription.party = '_Test Subscription Customer'
+		subscription = frappe.new_doc("Subscription")
+		subscription.party_type = "Customer"
+		subscription.party = "_Test Subscription Customer"
 		subscription.generate_invoice_at_period_start = 1
-		subscription.company = '_Test Company'
+		subscription.company = "_Test Company"
 		# select subscription start date as '2018-01-15'
-		subscription.start_date = '2018-01-01'
-		subscription.append('plans', {'plan': '_Test Plan Multicurrency', 'qty': 1})
+		subscription.start_date = "2018-01-01"
+		subscription.append("plans", {"plan": "_Test Plan Multicurrency", "qty": 1})
 		subscription.save()
 
 		subscription.process()
 		self.assertEqual(len(subscription.invoices), 1)
-		self.assertEqual(subscription.status, 'Unpaid')
+		self.assertEqual(subscription.status, "Unpaid")
 
 		# Check the currency of the created invoice
-		currency = frappe.db.get_value('Sales Invoice', subscription.invoices[0].invoice, 'currency')
-		self.assertEqual(currency, 'USD')
\ No newline at end of file
+		currency = frappe.db.get_value("Sales Invoice", subscription.invoices[0].invoice, "currency")
+		self.assertEqual(currency, "USD")
diff --git a/erpnext/accounts/doctype/subscription_plan/subscription_plan.py b/erpnext/accounts/doctype/subscription_plan/subscription_plan.py
index 1285343..a95e0a9 100644
--- a/erpnext/accounts/doctype/subscription_plan/subscription_plan.py
+++ b/erpnext/accounts/doctype/subscription_plan/subscription_plan.py
@@ -16,10 +16,13 @@
 
 	def validate_interval_count(self):
 		if self.billing_interval_count < 1:
-			frappe.throw(_('Billing Interval Count cannot be less than 1'))
+			frappe.throw(_("Billing Interval Count cannot be less than 1"))
+
 
 @frappe.whitelist()
-def get_plan_rate(plan, quantity=1, customer=None, start_date=None, end_date=None, prorate_factor=1):
+def get_plan_rate(
+	plan, quantity=1, customer=None, start_date=None, end_date=None, prorate_factor=1
+):
 	plan = frappe.get_doc("Subscription Plan", plan)
 	if plan.price_determination == "Fixed Rate":
 		return plan.cost * prorate_factor
@@ -30,13 +33,19 @@
 		else:
 			customer_group = None
 
-		price = get_price(item_code=plan.item, price_list=plan.price_list, customer_group=customer_group, company=None, qty=quantity)
+		price = get_price(
+			item_code=plan.item,
+			price_list=plan.price_list,
+			customer_group=customer_group,
+			company=None,
+			qty=quantity,
+		)
 		if not price:
 			return 0
 		else:
 			return price.price_list_rate * prorate_factor
 
-	elif plan.price_determination == 'Monthly Rate':
+	elif plan.price_determination == "Monthly Rate":
 		start_date = getdate(start_date)
 		end_date = getdate(end_date)
 
@@ -44,15 +53,21 @@
 		cost = plan.cost * no_of_months
 
 		# Adjust cost if start or end date is not month start or end
-		prorate = frappe.db.get_single_value('Subscription Settings', 'prorate')
+		prorate = frappe.db.get_single_value("Subscription Settings", "prorate")
 
 		if prorate:
-			prorate_factor = flt(date_diff(start_date, get_first_day(start_date)) / date_diff(
-				get_last_day(start_date), get_first_day(start_date)), 1)
+			prorate_factor = flt(
+				date_diff(start_date, get_first_day(start_date))
+				/ date_diff(get_last_day(start_date), get_first_day(start_date)),
+				1,
+			)
 
-			prorate_factor += flt(date_diff(get_last_day(end_date), end_date) / date_diff(
-				get_last_day(end_date), get_first_day(end_date)), 1)
+			prorate_factor += flt(
+				date_diff(get_last_day(end_date), end_date)
+				/ date_diff(get_last_day(end_date), get_first_day(end_date)),
+				1,
+			)
 
-			cost -= (plan.cost * prorate_factor)
+			cost -= plan.cost * prorate_factor
 
 		return cost
diff --git a/erpnext/accounts/doctype/subscription_plan/subscription_plan_dashboard.py b/erpnext/accounts/doctype/subscription_plan/subscription_plan_dashboard.py
index d076e39..7df76cd 100644
--- a/erpnext/accounts/doctype/subscription_plan/subscription_plan_dashboard.py
+++ b/erpnext/accounts/doctype/subscription_plan/subscription_plan_dashboard.py
@@ -3,15 +3,7 @@
 
 def get_data():
 	return {
-		'fieldname': 'subscription_plan',
-		'non_standard_fieldnames': {
-			'Payment Request': 'plan',
-			'Subscription': 'plan'
-		},
-		'transactions': [
-			{
-				'label': _('References'),
-				'items': ['Payment Request', 'Subscription']
-			}
-		]
+		"fieldname": "subscription_plan",
+		"non_standard_fieldnames": {"Payment Request": "plan", "Subscription": "plan"},
+		"transactions": [{"label": _("References"), "items": ["Payment Request", "Subscription"]}],
 	}
diff --git a/erpnext/accounts/doctype/tax_category/tax_category_dashboard.py b/erpnext/accounts/doctype/tax_category/tax_category_dashboard.py
index 4bdb70a..17a275e 100644
--- a/erpnext/accounts/doctype/tax_category/tax_category_dashboard.py
+++ b/erpnext/accounts/doctype/tax_category/tax_category_dashboard.py
@@ -3,27 +3,12 @@
 
 def get_data():
 	return {
-		'fieldname': 'tax_category',
-		'transactions': [
-			{
-				'label': _('Pre Sales'),
-				'items': ['Quotation', 'Supplier Quotation']
-			},
-			{
-				'label': _('Sales'),
-				'items': ['Sales Invoice', 'Delivery Note', 'Sales Order']
-			},
-			{
-				'label': _('Purchase'),
-				'items': ['Purchase Invoice', 'Purchase Receipt']
-			},
-			{
-				'label': _('Party'),
-				'items': ['Customer', 'Supplier']
-			},
-			{
-				'label': _('Taxes'),
-				'items': ['Item', 'Tax Rule']
-			}
-		]
+		"fieldname": "tax_category",
+		"transactions": [
+			{"label": _("Pre Sales"), "items": ["Quotation", "Supplier Quotation"]},
+			{"label": _("Sales"), "items": ["Sales Invoice", "Delivery Note", "Sales Order"]},
+			{"label": _("Purchase"), "items": ["Purchase Invoice", "Purchase Receipt"]},
+			{"label": _("Party"), "items": ["Customer", "Supplier"]},
+			{"label": _("Taxes"), "items": ["Item", "Tax Rule"]},
+		],
 	}
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py
index 2d94bc3..27b78e9 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py
@@ -14,9 +14,17 @@
 from erpnext.setup.doctype.customer_group.customer_group import get_parent_customer_groups
 
 
-class IncorrectCustomerGroup(frappe.ValidationError): pass
-class IncorrectSupplierType(frappe.ValidationError): pass
-class ConflictingTaxRule(frappe.ValidationError): pass
+class IncorrectCustomerGroup(frappe.ValidationError):
+	pass
+
+
+class IncorrectSupplierType(frappe.ValidationError):
+	pass
+
+
+class ConflictingTaxRule(frappe.ValidationError):
+	pass
+
 
 class TaxRule(Document):
 	def __setup__(self):
@@ -29,7 +37,7 @@
 		self.validate_use_for_shopping_cart()
 
 	def validate_tax_template(self):
-		if self.tax_type== "Sales":
+		if self.tax_type == "Sales":
 			self.purchase_tax_template = self.supplier = self.supplier_group = None
 			if self.customer:
 				self.customer_group = None
@@ -49,28 +57,28 @@
 
 	def validate_filters(self):
 		filters = {
-			"tax_type":			self.tax_type,
-			"customer": 		self.customer,
-			"customer_group": 	self.customer_group,
-			"supplier":			self.supplier,
-			"supplier_group":	self.supplier_group,
-			"item":				self.item,
-			"item_group":		self.item_group,
-			"billing_city":		self.billing_city,
-			"billing_county":	self.billing_county,
-			"billing_state": 	self.billing_state,
-			"billing_zipcode":	self.billing_zipcode,
-			"billing_country":	self.billing_country,
-			"shipping_city":	self.shipping_city,
-			"shipping_county":	self.shipping_county,
-			"shipping_state":	self.shipping_state,
-			"shipping_zipcode":	self.shipping_zipcode,
-			"shipping_country":	self.shipping_country,
-			"tax_category":		self.tax_category,
-			"company":			self.company
+			"tax_type": self.tax_type,
+			"customer": self.customer,
+			"customer_group": self.customer_group,
+			"supplier": self.supplier,
+			"supplier_group": self.supplier_group,
+			"item": self.item,
+			"item_group": self.item_group,
+			"billing_city": self.billing_city,
+			"billing_county": self.billing_county,
+			"billing_state": self.billing_state,
+			"billing_zipcode": self.billing_zipcode,
+			"billing_country": self.billing_country,
+			"shipping_city": self.shipping_city,
+			"shipping_county": self.shipping_county,
+			"shipping_state": self.shipping_state,
+			"shipping_zipcode": self.shipping_zipcode,
+			"shipping_country": self.shipping_country,
+			"tax_category": self.tax_category,
+			"company": self.company,
 		}
 
-		conds=""
+		conds = ""
 		for d in filters:
 			if conds:
 				conds += " and "
@@ -80,85 +88,112 @@
 			conds += """ and ((from_date > '{from_date}' and from_date < '{to_date}') or
 					(to_date > '{from_date}' and to_date < '{to_date}') or
 					('{from_date}' > from_date and '{from_date}' < to_date) or
-					('{from_date}' = from_date and '{to_date}' = to_date))""".format(from_date=self.from_date, to_date=self.to_date)
+					('{from_date}' = from_date and '{to_date}' = to_date))""".format(
+				from_date=self.from_date, to_date=self.to_date
+			)
 
 		elif self.from_date and not self.to_date:
-			conds += """ and to_date > '{from_date}'""".format(from_date = self.from_date)
+			conds += """ and to_date > '{from_date}'""".format(from_date=self.from_date)
 
 		elif self.to_date and not self.from_date:
-			conds += """ and from_date < '{to_date}'""".format(to_date = self.to_date)
+			conds += """ and from_date < '{to_date}'""".format(to_date=self.to_date)
 
-		tax_rule = frappe.db.sql("select name, priority \
-			from `tabTax Rule` where {0} and name != '{1}'".format(conds, self.name), as_dict=1)
+		tax_rule = frappe.db.sql(
+			"select name, priority \
+			from `tabTax Rule` where {0} and name != '{1}'".format(
+				conds, self.name
+			),
+			as_dict=1,
+		)
 
 		if tax_rule:
 			if tax_rule[0].priority == self.priority:
 				frappe.throw(_("Tax Rule Conflicts with {0}").format(tax_rule[0].name), ConflictingTaxRule)
 
 	def validate_use_for_shopping_cart(self):
-		'''If shopping cart is enabled and no tax rule exists for shopping cart, enable this one'''
-		if (not self.use_for_shopping_cart
-			and cint(frappe.db.get_single_value('E Commerce Settings', 'enabled'))
-			and not frappe.db.get_value('Tax Rule', {'use_for_shopping_cart': 1, 'name': ['!=', self.name]})):
+		"""If shopping cart is enabled and no tax rule exists for shopping cart, enable this one"""
+		if (
+			not self.use_for_shopping_cart
+			and cint(frappe.db.get_single_value("E Commerce Settings", "enabled"))
+			and not frappe.db.get_value("Tax Rule", {"use_for_shopping_cart": 1, "name": ["!=", self.name]})
+		):
 
 			self.use_for_shopping_cart = 1
-			frappe.msgprint(_("Enabling 'Use for Shopping Cart', as Shopping Cart is enabled and there should be at least one Tax Rule for Shopping Cart"))
+			frappe.msgprint(
+				_(
+					"Enabling 'Use for Shopping Cart', as Shopping Cart is enabled and there should be at least one Tax Rule for Shopping Cart"
+				)
+			)
+
 
 @frappe.whitelist()
 def get_party_details(party, party_type, args=None):
 	out = {}
 	billing_address, shipping_address = None, None
 	if args:
-		if args.get('billing_address'):
-			billing_address = frappe.get_doc('Address', args.get('billing_address'))
-		if args.get('shipping_address'):
-			shipping_address = frappe.get_doc('Address', args.get('shipping_address'))
+		if args.get("billing_address"):
+			billing_address = frappe.get_doc("Address", args.get("billing_address"))
+		if args.get("shipping_address"):
+			shipping_address = frappe.get_doc("Address", args.get("shipping_address"))
 	else:
 		billing_address_name = get_default_address(party_type, party)
-		shipping_address_name = get_default_address(party_type, party, 'is_shipping_address')
+		shipping_address_name = get_default_address(party_type, party, "is_shipping_address")
 		if billing_address_name:
-			billing_address = frappe.get_doc('Address', billing_address_name)
+			billing_address = frappe.get_doc("Address", billing_address_name)
 		if shipping_address_name:
-			shipping_address = frappe.get_doc('Address', shipping_address_name)
+			shipping_address = frappe.get_doc("Address", shipping_address_name)
 
 	if billing_address:
-		out["billing_city"]= billing_address.city
-		out["billing_county"]= billing_address.county
-		out["billing_state"]= billing_address.state
-		out["billing_zipcode"]= billing_address.pincode
-		out["billing_country"]= billing_address.country
+		out["billing_city"] = billing_address.city
+		out["billing_county"] = billing_address.county
+		out["billing_state"] = billing_address.state
+		out["billing_zipcode"] = billing_address.pincode
+		out["billing_country"] = billing_address.country
 
 	if shipping_address:
-		out["shipping_city"]= shipping_address.city
-		out["shipping_county"]= shipping_address.county
-		out["shipping_state"]= shipping_address.state
-		out["shipping_zipcode"]= shipping_address.pincode
-		out["shipping_country"]= shipping_address.country
+		out["shipping_city"] = shipping_address.city
+		out["shipping_county"] = shipping_address.county
+		out["shipping_state"] = shipping_address.state
+		out["shipping_zipcode"] = shipping_address.pincode
+		out["shipping_country"] = shipping_address.country
 
 	return out
 
+
 def get_tax_template(posting_date, args):
 	"""Get matching tax rule"""
 	args = frappe._dict(args)
-	conditions = ["""(from_date is null or from_date <= '{0}')
-		and (to_date is null or to_date >= '{0}')""".format(posting_date)]
+	conditions = [
+		"""(from_date is null or from_date <= '{0}')
+		and (to_date is null or to_date >= '{0}')""".format(
+			posting_date
+		)
+	]
 
-	conditions.append("ifnull(tax_category, '') = {0}".format(frappe.db.escape(cstr(args.get("tax_category")))))
-	if 'tax_category' in args.keys():
-		del args['tax_category']
+	conditions.append(
+		"ifnull(tax_category, '') = {0}".format(frappe.db.escape(cstr(args.get("tax_category"))))
+	)
+	if "tax_category" in args.keys():
+		del args["tax_category"]
 
 	for key, value in args.items():
-		if key=="use_for_shopping_cart":
+		if key == "use_for_shopping_cart":
 			conditions.append("use_for_shopping_cart = {0}".format(1 if value else 0))
-		elif key == 'customer_group':
-			if not value: value = get_root_of("Customer Group")
+		elif key == "customer_group":
+			if not value:
+				value = get_root_of("Customer Group")
 			customer_group_condition = get_customer_group_condition(value)
 			conditions.append("ifnull({0}, '') in ('', {1})".format(key, customer_group_condition))
 		else:
 			conditions.append("ifnull({0}, '') in ('', {1})".format(key, frappe.db.escape(cstr(value))))
 
-	tax_rule = frappe.db.sql("""select * from `tabTax Rule`
-		where {0}""".format(" and ".join(conditions)), as_dict = True)
+	tax_rule = frappe.db.sql(
+		"""select * from `tabTax Rule`
+		where {0}""".format(
+			" and ".join(conditions)
+		),
+		as_dict=True,
+	)
 
 	if not tax_rule:
 		return None
@@ -166,28 +201,34 @@
 	for rule in tax_rule:
 		rule.no_of_keys_matched = 0
 		for key in args:
-			if rule.get(key): rule.no_of_keys_matched += 1
+			if rule.get(key):
+				rule.no_of_keys_matched += 1
 
 	def cmp(a, b):
 		# refernce: https://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
 		return int(a > b) - int(a < b)
 
-	rule = sorted(tax_rule,
-		key = functools.cmp_to_key(lambda b, a:
-		cmp(a.no_of_keys_matched, b.no_of_keys_matched) or
-		cmp(a.priority, b.priority)))[0]
+	rule = sorted(
+		tax_rule,
+		key=functools.cmp_to_key(
+			lambda b, a: cmp(a.no_of_keys_matched, b.no_of_keys_matched) or cmp(a.priority, b.priority)
+		),
+	)[0]
 
 	tax_template = rule.sales_tax_template or rule.purchase_tax_template
 	doctype = "{0} Taxes and Charges Template".format(rule.tax_type)
 
-	if frappe.db.get_value(doctype, tax_template, 'disabled')==1:
+	if frappe.db.get_value(doctype, tax_template, "disabled") == 1:
 		return None
 
 	return tax_template
 
+
 def get_customer_group_condition(customer_group):
 	condition = ""
-	customer_groups = ["%s"%(frappe.db.escape(d.name)) for d in get_parent_customer_groups(customer_group)]
+	customer_groups = [
+		"%s" % (frappe.db.escape(d.name)) for d in get_parent_customer_groups(customer_group)
+	]
 	if customer_groups:
-		condition = ",".join(['%s'] * len(customer_groups))%(tuple(customer_groups))
+		condition = ",".join(["%s"] * len(customer_groups)) % (tuple(customer_groups))
 	return condition
diff --git a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py
index d5ac9b2..848e054 100644
--- a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py
@@ -9,8 +9,7 @@
 from erpnext.crm.doctype.opportunity.opportunity import make_quotation
 from erpnext.crm.doctype.opportunity.test_opportunity import make_opportunity
 
-test_records = frappe.get_test_records('Tax Rule')
-
+test_records = frappe.get_test_records("Tax Rule")
 
 
 class TestTaxRule(unittest.TestCase):
@@ -26,40 +25,70 @@
 		frappe.db.sql("delete from `tabTax Rule`")
 
 	def test_conflict(self):
-		tax_rule1 = make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1)
+		tax_rule1 = make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+		)
 		tax_rule1.save()
 
-		tax_rule2 = make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1)
+		tax_rule2 = make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+		)
 
 		self.assertRaises(ConflictingTaxRule, tax_rule2.save)
 
 	def test_conflict_with_non_overlapping_dates(self):
-		tax_rule1 = make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1, from_date = "2015-01-01")
+		tax_rule1 = make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+			from_date="2015-01-01",
+		)
 		tax_rule1.save()
 
-		tax_rule2 = make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1, to_date = "2013-01-01")
+		tax_rule2 = make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+			to_date="2013-01-01",
+		)
 
 		tax_rule2.save()
 		self.assertTrue(tax_rule2.name)
 
 	def test_for_parent_customer_group(self):
-		tax_rule1 = make_tax_rule(customer_group= "All Customer Groups",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1, from_date = "2015-01-01")
+		tax_rule1 = make_tax_rule(
+			customer_group="All Customer Groups",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+			from_date="2015-01-01",
+		)
 		tax_rule1.save()
-		self.assertEqual(get_tax_template("2015-01-01", {"customer_group" : "Commercial", "use_for_shopping_cart":1}),
-			"_Test Sales Taxes and Charges Template - _TC")
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer_group": "Commercial", "use_for_shopping_cart": 1}),
+			"_Test Sales Taxes and Charges Template - _TC",
+		)
 
 	def test_conflict_with_overlapping_dates(self):
-		tax_rule1 = make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1, from_date = "2015-01-01", to_date = "2015-01-05")
+		tax_rule1 = make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+			from_date="2015-01-01",
+			to_date="2015-01-05",
+		)
 		tax_rule1.save()
 
-		tax_rule2 = make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority = 1, from_date = "2015-01-03", to_date = "2015-01-09")
+		tax_rule2 = make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+			from_date="2015-01-03",
+			to_date="2015-01-09",
+		)
 
 		self.assertRaises(ConflictingTaxRule, tax_rule2.save)
 
@@ -67,93 +96,186 @@
 		tax_rule = make_tax_rule()
 		self.assertEqual(tax_rule.purchase_tax_template, None)
 
-
 	def test_select_tax_rule_based_on_customer(self):
-		make_tax_rule(customer= "_Test Customer",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
-		make_tax_rule(customer= "_Test Customer 1",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 1 - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer 1",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			save=1,
+		)
 
-		make_tax_rule(customer= "_Test Customer 2",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 2 - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer 2",
+			sales_tax_template="_Test Sales Taxes and Charges Template 2 - _TC",
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer 2"}),
-			"_Test Sales Taxes and Charges Template 2 - _TC")
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer": "_Test Customer 2"}),
+			"_Test Sales Taxes and Charges Template 2 - _TC",
+		)
 
 	def test_select_tax_rule_based_on_tax_category(self):
-		make_tax_rule(customer="_Test Customer", tax_category="_Test Tax Category 1",
-			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			tax_category="_Test Tax Category 1",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			save=1,
+		)
 
-		make_tax_rule(customer="_Test Customer", tax_category="_Test Tax Category 2",
-			sales_tax_template="_Test Sales Taxes and Charges Template 2 - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			tax_category="_Test Tax Category 2",
+			sales_tax_template="_Test Sales Taxes and Charges Template 2 - _TC",
+			save=1,
+		)
 
 		self.assertFalse(get_tax_template("2015-01-01", {"customer": "_Test Customer"}))
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer": "_Test Customer", "tax_category": "_Test Tax Category 1"}),
-			"_Test Sales Taxes and Charges Template 1 - _TC")
-		self.assertEqual(get_tax_template("2015-01-01", {"customer": "_Test Customer", "tax_category": "_Test Tax Category 2"}),
-			"_Test Sales Taxes and Charges Template 2 - _TC")
+		self.assertEqual(
+			get_tax_template(
+				"2015-01-01", {"customer": "_Test Customer", "tax_category": "_Test Tax Category 1"}
+			),
+			"_Test Sales Taxes and Charges Template 1 - _TC",
+		)
+		self.assertEqual(
+			get_tax_template(
+				"2015-01-01", {"customer": "_Test Customer", "tax_category": "_Test Tax Category 2"}
+			),
+			"_Test Sales Taxes and Charges Template 2 - _TC",
+		)
 
-		make_tax_rule(customer="_Test Customer", tax_category="",
-			sales_tax_template="_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			tax_category="",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer": "_Test Customer"}),
-			"_Test Sales Taxes and Charges Template - _TC")
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer": "_Test Customer"}),
+			"_Test Sales Taxes and Charges Template - _TC",
+		)
 
 	def test_select_tax_rule_based_on_better_match(self):
-		make_tax_rule(customer= "_Test Customer", billing_city = "Test City", billing_state = "Test State",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="Test City",
+			billing_state="Test State",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
-		make_tax_rule(customer= "_Test Customer",  billing_city = "Test City1", billing_state = "Test State",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 1 - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="Test City1",
+			billing_state="Test State",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City", "billing_state": "Test State"}),
-			"_Test Sales Taxes and Charges Template - _TC")
+		self.assertEqual(
+			get_tax_template(
+				"2015-01-01",
+				{"customer": "_Test Customer", "billing_city": "Test City", "billing_state": "Test State"},
+			),
+			"_Test Sales Taxes and Charges Template - _TC",
+		)
 
 	def test_select_tax_rule_based_on_state_match(self):
-		make_tax_rule(customer= "_Test Customer", shipping_state = "Test State",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			shipping_state="Test State",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
-		make_tax_rule(customer= "_Test Customer", shipping_state = "Test State12",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 1 - _TC", priority=2, save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			shipping_state="Test State12",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			priority=2,
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer", "shipping_state": "Test State"}),
-			"_Test Sales Taxes and Charges Template - _TC")
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer": "_Test Customer", "shipping_state": "Test State"}),
+			"_Test Sales Taxes and Charges Template - _TC",
+		)
 
 	def test_select_tax_rule_based_on_better_priority(self):
-		make_tax_rule(customer= "_Test Customer", billing_city = "Test City",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", priority=1, save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="Test City",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			priority=1,
+			save=1,
+		)
 
-		make_tax_rule(customer= "_Test Customer", billing_city = "Test City",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 1 - _TC", priority=2, save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="Test City",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			priority=2,
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City"}),
-			"_Test Sales Taxes and Charges Template 1 - _TC")
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer": "_Test Customer", "billing_city": "Test City"}),
+			"_Test Sales Taxes and Charges Template 1 - _TC",
+		)
 
 	def test_select_tax_rule_based_cross_matching_keys(self):
-		make_tax_rule(customer= "_Test Customer", billing_city = "Test City",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="Test City",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
-		make_tax_rule(customer= "_Test Customer 1", billing_city = "Test City 1",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 1 - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer 1",
+			billing_city="Test City 1",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City 1"}),
-			None)
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer": "_Test Customer", "billing_city": "Test City 1"}),
+			None,
+		)
 
 	def test_select_tax_rule_based_cross_partially_keys(self):
-		make_tax_rule(customer= "_Test Customer", billing_city = "Test City",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="Test City",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
-		make_tax_rule(billing_city = "Test City 1",
-			sales_tax_template = "_Test Sales Taxes and Charges Template 1 - _TC", save=1)
+		make_tax_rule(
+			billing_city="Test City 1",
+			sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC",
+			save=1,
+		)
 
-		self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City 1"}),
-			"_Test Sales Taxes and Charges Template 1 - _TC")
+		self.assertEqual(
+			get_tax_template("2015-01-01", {"customer": "_Test Customer", "billing_city": "Test City 1"}),
+			"_Test Sales Taxes and Charges Template 1 - _TC",
+		)
 
 	def test_taxes_fetch_via_tax_rule(self):
-		make_tax_rule(customer= "_Test Customer", billing_city = "_Test City",
-			sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
+		make_tax_rule(
+			customer="_Test Customer",
+			billing_city="_Test City",
+			sales_tax_template="_Test Sales Taxes and Charges Template - _TC",
+			save=1,
+		)
 
 		# create opportunity for customer
 		opportunity = make_opportunity(with_items=1)
@@ -168,7 +290,6 @@
 		self.assertTrue(len(quotation.taxes) > 0)
 
 
-
 def make_tax_rule(**args):
 	args = frappe._dict(args)
 
diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py
index 5bb9b93..35c2f84 100644
--- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py
+++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py
@@ -16,7 +16,7 @@
 
 	def validate_dates(self):
 		last_date = None
-		for d in self.get('rates'):
+		for d in self.get("rates"):
 			if getdate(d.from_date) >= getdate(d.to_date):
 				frappe.throw(_("Row #{0}: From Date cannot be before To Date").format(d.idx))
 
@@ -26,25 +26,30 @@
 
 	def validate_accounts(self):
 		existing_accounts = []
-		for d in self.get('accounts'):
-			if d.get('account') in existing_accounts:
-				frappe.throw(_("Account {0} added multiple times").format(frappe.bold(d.get('account'))))
+		for d in self.get("accounts"):
+			if d.get("account") in existing_accounts:
+				frappe.throw(_("Account {0} added multiple times").format(frappe.bold(d.get("account"))))
 
-			existing_accounts.append(d.get('account'))
+			existing_accounts.append(d.get("account"))
 
 	def validate_thresholds(self):
-		for d in self.get('rates'):
+		for d in self.get("rates"):
 			if d.cumulative_threshold and d.cumulative_threshold < d.single_threshold:
-				frappe.throw(_("Row #{0}: Cumulative threshold cannot be less than Single Transaction threshold").format(d.idx))
+				frappe.throw(
+					_("Row #{0}: Cumulative threshold cannot be less than Single Transaction threshold").format(
+						d.idx
+					)
+				)
+
 
 def get_party_details(inv):
-	party_type, party = '', ''
+	party_type, party = "", ""
 
-	if inv.doctype == 'Sales Invoice':
-		party_type = 'Customer'
+	if inv.doctype == "Sales Invoice":
+		party_type = "Customer"
 		party = inv.customer
 	else:
-		party_type = 'Supplier'
+		party_type = "Supplier"
 		party = inv.supplier
 
 	if not party:
@@ -52,65 +57,71 @@
 
 	return party_type, party
 
+
 def get_party_tax_withholding_details(inv, tax_withholding_category=None):
-	pan_no = ''
+	pan_no = ""
 	parties = []
 	party_type, party = get_party_details(inv)
 	has_pan_field = frappe.get_meta(party_type).has_field("pan")
 
 	if not tax_withholding_category:
 		if has_pan_field:
-			fields = ['tax_withholding_category', 'pan']
+			fields = ["tax_withholding_category", "pan"]
 		else:
-			fields = ['tax_withholding_category']
+			fields = ["tax_withholding_category"]
 
 		tax_withholding_details = frappe.db.get_value(party_type, party, fields, as_dict=1)
 
-		tax_withholding_category = tax_withholding_details.get('tax_withholding_category')
-		pan_no = tax_withholding_details.get('pan')
+		tax_withholding_category = tax_withholding_details.get("tax_withholding_category")
+		pan_no = tax_withholding_details.get("pan")
 
 	if not tax_withholding_category:
 		return
 
 	# if tax_withholding_category passed as an argument but not pan_no
 	if not pan_no and has_pan_field:
-		pan_no = frappe.db.get_value(party_type, party, 'pan')
+		pan_no = frappe.db.get_value(party_type, party, "pan")
 
 	# Get others suppliers with the same PAN No
 	if pan_no:
-		parties = frappe.get_all(party_type, filters={ 'pan': pan_no }, pluck='name')
+		parties = frappe.get_all(party_type, filters={"pan": pan_no}, pluck="name")
 
 	if not parties:
 		parties.append(party)
 
-	posting_date = inv.get('posting_date') or inv.get('transaction_date')
+	posting_date = inv.get("posting_date") or inv.get("transaction_date")
 	tax_details = get_tax_withholding_details(tax_withholding_category, posting_date, inv.company)
 
 	if not tax_details:
-		frappe.throw(_('Please set associated account in Tax Withholding Category {0} against Company {1}')
-			.format(tax_withholding_category, inv.company))
+		frappe.throw(
+			_("Please set associated account in Tax Withholding Category {0} against Company {1}").format(
+				tax_withholding_category, inv.company
+			)
+		)
 
-	if party_type == 'Customer' and not tax_details.cumulative_threshold:
+	if party_type == "Customer" and not tax_details.cumulative_threshold:
 		# TCS is only chargeable on sum of invoiced value
-		frappe.throw(_('Tax Withholding Category {} against Company {} for Customer {} should have Cumulative Threshold value.')
-			.format(tax_withholding_category, inv.company, party))
+		frappe.throw(
+			_(
+				"Tax Withholding Category {} against Company {} for Customer {} should have Cumulative Threshold value."
+			).format(tax_withholding_category, inv.company, party)
+		)
 
 	tax_amount, tax_deducted, tax_deducted_on_advances = get_tax_amount(
-		party_type, parties,
-		inv, tax_details,
-		posting_date, pan_no
+		party_type, parties, inv, tax_details, posting_date, pan_no
 	)
 
-	if party_type == 'Supplier':
+	if party_type == "Supplier":
 		tax_row = get_tax_row_for_tds(tax_details, tax_amount)
 	else:
 		tax_row = get_tax_row_for_tcs(inv, tax_details, tax_amount, tax_deducted)
 
-	if inv.doctype == 'Purchase Invoice':
+	if inv.doctype == "Purchase Invoice":
 		return tax_row, tax_deducted_on_advances
 	else:
 		return tax_row
 
+
 def get_tax_withholding_details(tax_withholding_category, posting_date, company):
 	tax_withholding = frappe.get_doc("Tax Withholding Category", tax_withholding_category)
 
@@ -118,19 +129,24 @@
 
 	for account_detail in tax_withholding.accounts:
 		if company == account_detail.company:
-			return frappe._dict({
-				"tax_withholding_category": tax_withholding_category,
-				"account_head": account_detail.account,
-				"rate": tax_rate_detail.tax_withholding_rate,
-				"from_date": tax_rate_detail.from_date,
-				"to_date": tax_rate_detail.to_date,
-				"threshold": tax_rate_detail.single_threshold,
-				"cumulative_threshold": tax_rate_detail.cumulative_threshold,
-				"description": tax_withholding.category_name if tax_withholding.category_name else tax_withholding_category,
-				"consider_party_ledger_amount": tax_withholding.consider_party_ledger_amount,
-				"tax_on_excess_amount": tax_withholding.tax_on_excess_amount,
-				"round_off_tax_amount": tax_withholding.round_off_tax_amount
-			})
+			return frappe._dict(
+				{
+					"tax_withholding_category": tax_withholding_category,
+					"account_head": account_detail.account,
+					"rate": tax_rate_detail.tax_withholding_rate,
+					"from_date": tax_rate_detail.from_date,
+					"to_date": tax_rate_detail.to_date,
+					"threshold": tax_rate_detail.single_threshold,
+					"cumulative_threshold": tax_rate_detail.cumulative_threshold,
+					"description": tax_withholding.category_name
+					if tax_withholding.category_name
+					else tax_withholding_category,
+					"consider_party_ledger_amount": tax_withholding.consider_party_ledger_amount,
+					"tax_on_excess_amount": tax_withholding.tax_on_excess_amount,
+					"round_off_tax_amount": tax_withholding.round_off_tax_amount,
+				}
+			)
+
 
 def get_tax_withholding_rates(tax_withholding, posting_date):
 	# returns the row that matches with the fiscal year from posting date
@@ -140,13 +156,14 @@
 
 	frappe.throw(_("No Tax Withholding data found for the current posting date."))
 
+
 def get_tax_row_for_tcs(inv, tax_details, tax_amount, tax_deducted):
 	row = {
 		"category": "Total",
 		"charge_type": "Actual",
 		"tax_amount": tax_amount,
 		"description": tax_details.description,
-		"account_head": tax_details.account_head
+		"account_head": tax_details.account_head,
 	}
 
 	if tax_deducted:
@@ -156,20 +173,20 @@
 		taxes_excluding_tcs = [d for d in inv.taxes if d.account_head != tax_details.account_head]
 		if taxes_excluding_tcs:
 			# chargeable amount is the total amount after other charges are applied
-			row.update({
-				"charge_type": "On Previous Row Total",
-				"row_id": len(taxes_excluding_tcs),
-				"rate": tax_details.rate
-			})
+			row.update(
+				{
+					"charge_type": "On Previous Row Total",
+					"row_id": len(taxes_excluding_tcs),
+					"rate": tax_details.rate,
+				}
+			)
 		else:
 			# if only TCS is to be charged, then net total is chargeable amount
-			row.update({
-				"charge_type": "On Net Total",
-				"rate": tax_details.rate
-			})
+			row.update({"charge_type": "On Net Total", "rate": tax_details.rate})
 
 	return row
 
+
 def get_tax_row_for_tds(tax_details, tax_amount):
 	return {
 		"category": "Total",
@@ -177,29 +194,39 @@
 		"tax_amount": tax_amount,
 		"add_deduct_tax": "Deduct",
 		"description": tax_details.description,
-		"account_head": tax_details.account_head
+		"account_head": tax_details.account_head,
 	}
 
+
 def get_lower_deduction_certificate(tax_details, pan_no):
-	ldc_name = frappe.db.get_value('Lower Deduction Certificate',
+	ldc_name = frappe.db.get_value(
+		"Lower Deduction Certificate",
 		{
-			'pan_no': pan_no,
-			'tax_withholding_category': tax_details.tax_withholding_category,
-			'valid_from': ('>=', tax_details.from_date),
-			'valid_upto': ('<=', tax_details.to_date)
-		}, 'name')
+			"pan_no": pan_no,
+			"tax_withholding_category": tax_details.tax_withholding_category,
+			"valid_from": (">=", tax_details.from_date),
+			"valid_upto": ("<=", tax_details.to_date),
+		},
+		"name",
+	)
 
 	if ldc_name:
-		return frappe.get_doc('Lower Deduction Certificate', ldc_name)
+		return frappe.get_doc("Lower Deduction Certificate", ldc_name)
+
 
 def get_tax_amount(party_type, parties, inv, tax_details, posting_date, pan_no=None):
 	vouchers = get_invoice_vouchers(parties, tax_details, inv.company, party_type=party_type)
-	advance_vouchers = get_advance_vouchers(parties, company=inv.company, from_date=tax_details.from_date,
-		to_date=tax_details.to_date, party_type=party_type)
+	advance_vouchers = get_advance_vouchers(
+		parties,
+		company=inv.company,
+		from_date=tax_details.from_date,
+		to_date=tax_details.to_date,
+		party_type=party_type,
+	)
 	taxable_vouchers = vouchers + advance_vouchers
 	tax_deducted_on_advances = 0
 
-	if inv.doctype == 'Purchase Invoice':
+	if inv.doctype == "Purchase Invoice":
 		tax_deducted_on_advances = get_taxes_deducted_on_advances_allocated(inv, tax_details)
 
 	tax_deducted = 0
@@ -207,18 +234,20 @@
 		tax_deducted = get_deducted_tax(taxable_vouchers, tax_details)
 
 	tax_amount = 0
-	if party_type == 'Supplier':
+	if party_type == "Supplier":
 		ldc = get_lower_deduction_certificate(tax_details, pan_no)
 		if tax_deducted:
 			net_total = inv.net_total
 			if ldc:
-				tax_amount = get_tds_amount_from_ldc(ldc, parties, pan_no, tax_details, posting_date, net_total)
+				tax_amount = get_tds_amount_from_ldc(
+					ldc, parties, pan_no, tax_details, posting_date, net_total
+				)
 			else:
 				tax_amount = net_total * tax_details.rate / 100 if net_total > 0 else 0
 		else:
 			tax_amount = get_tds_amount(ldc, parties, inv, tax_details, tax_deducted, vouchers)
 
-	elif party_type == 'Customer':
+	elif party_type == "Customer":
 		if tax_deducted:
 			# if already TCS is charged, then amount will be calculated based on 'Previous Row Total'
 			tax_amount = 0
@@ -232,27 +261,28 @@
 
 	return tax_amount, tax_deducted, tax_deducted_on_advances
 
-def get_invoice_vouchers(parties, tax_details, company, party_type='Supplier'):
-	dr_or_cr = 'credit' if party_type == 'Supplier' else 'debit'
-	doctype = 'Purchase Invoice' if party_type == 'Supplier' else 'Sales Invoice'
+
+def get_invoice_vouchers(parties, tax_details, company, party_type="Supplier"):
+	dr_or_cr = "credit" if party_type == "Supplier" else "debit"
+	doctype = "Purchase Invoice" if party_type == "Supplier" else "Sales Invoice"
 
 	filters = {
-		'company': company,
-		frappe.scrub(party_type): ['in', parties],
-		'posting_date': ['between', (tax_details.from_date, tax_details.to_date)],
-		'is_opening': 'No',
-		'docstatus': 1
+		"company": company,
+		frappe.scrub(party_type): ["in", parties],
+		"posting_date": ["between", (tax_details.from_date, tax_details.to_date)],
+		"is_opening": "No",
+		"docstatus": 1,
 	}
 
-	if not tax_details.get('consider_party_ledger_amount') and doctype != "Sales Invoice":
-		filters.update({
-			'apply_tds': 1,
-			'tax_withholding_category': tax_details.get('tax_withholding_category')
-		})
+	if not tax_details.get("consider_party_ledger_amount") and doctype != "Sales Invoice":
+		filters.update(
+			{"apply_tds": 1, "tax_withholding_category": tax_details.get("tax_withholding_category")}
+		)
 
 	invoices = frappe.get_all(doctype, filters=filters, pluck="name") or [""]
 
-	journal_entries = frappe.db.sql("""
+	journal_entries = frappe.db.sql(
+		"""
 		SELECT j.name
 			FROM `tabJournal Entry` j, `tabJournal Entry Account` ja
 		WHERE
@@ -261,52 +291,60 @@
 			AND j.posting_date between %s and %s
 			AND ja.{dr_or_cr} > 0
 			AND ja.party in %s
-	""".format(dr_or_cr=dr_or_cr), (tax_details.from_date, tax_details.to_date, tuple(parties)), as_list=1)
+	""".format(
+			dr_or_cr=dr_or_cr
+		),
+		(tax_details.from_date, tax_details.to_date, tuple(parties)),
+		as_list=1,
+	)
 
 	if journal_entries:
 		journal_entries = journal_entries[0]
 
 	return invoices + journal_entries
 
-def get_advance_vouchers(parties, company=None, from_date=None, to_date=None, party_type='Supplier'):
+
+def get_advance_vouchers(
+	parties, company=None, from_date=None, to_date=None, party_type="Supplier"
+):
 	# for advance vouchers, debit and credit is reversed
-	dr_or_cr = 'debit' if party_type == 'Supplier' else 'credit'
+	dr_or_cr = "debit" if party_type == "Supplier" else "credit"
 
 	filters = {
-		dr_or_cr: ['>', 0],
-		'is_opening': 'No',
-		'is_cancelled': 0,
-		'party_type': party_type,
-		'party': ['in', parties],
-		'against_voucher': ['is', 'not set']
+		dr_or_cr: [">", 0],
+		"is_opening": "No",
+		"is_cancelled": 0,
+		"party_type": party_type,
+		"party": ["in", parties],
+		"against_voucher": ["is", "not set"],
 	}
 
 	if company:
-		filters['company'] = company
+		filters["company"] = company
 	if from_date and to_date:
-		filters['posting_date'] = ['between', (from_date, to_date)]
+		filters["posting_date"] = ["between", (from_date, to_date)]
 
-	return frappe.get_all('GL Entry', filters=filters, distinct=1, pluck='voucher_no') or [""]
+	return frappe.get_all("GL Entry", filters=filters, distinct=1, pluck="voucher_no") or [""]
+
 
 def get_taxes_deducted_on_advances_allocated(inv, tax_details):
-	advances = [d.reference_name for d in inv.get('advances')]
+	advances = [d.reference_name for d in inv.get("advances")]
 	tax_info = []
 
 	if advances:
 		pe = frappe.qb.DocType("Payment Entry").as_("pe")
 		at = frappe.qb.DocType("Advance Taxes and Charges").as_("at")
 
-		tax_info = frappe.qb.from_(at).inner_join(pe).on(
-			pe.name == at.parent
-		).select(
-			at.parent, at.name, at.tax_amount, at.allocated_amount
-		).where(
-			pe.tax_withholding_category == tax_details.get('tax_withholding_category')
-		).where(
-			at.parent.isin(advances)
-		).where(
-			at.account_head == tax_details.account_head
-		).run(as_dict=True)
+		tax_info = (
+			frappe.qb.from_(at)
+			.inner_join(pe)
+			.on(pe.name == at.parent)
+			.select(at.parent, at.name, at.tax_amount, at.allocated_amount)
+			.where(pe.tax_withholding_category == tax_details.get("tax_withholding_category"))
+			.where(at.parent.isin(advances))
+			.where(at.account_head == tax_details.account_head)
+			.run(as_dict=True)
+		)
 
 	return tax_info
 
@@ -314,59 +352,74 @@
 def get_deducted_tax(taxable_vouchers, tax_details):
 	# check if TDS / TCS account is already charged on taxable vouchers
 	filters = {
-		'is_cancelled': 0,
-		'credit': ['>', 0],
-		'posting_date': ['between', (tax_details.from_date, tax_details.to_date)],
-		'account': tax_details.account_head,
-		'voucher_no': ['in', taxable_vouchers],
+		"is_cancelled": 0,
+		"credit": [">", 0],
+		"posting_date": ["between", (tax_details.from_date, tax_details.to_date)],
+		"account": tax_details.account_head,
+		"voucher_no": ["in", taxable_vouchers],
 	}
 	field = "credit"
 
-	entries = frappe.db.get_all('GL Entry', filters, pluck=field)
+	entries = frappe.db.get_all("GL Entry", filters, pluck=field)
 	return sum(entries)
 
+
 def get_tds_amount(ldc, parties, inv, tax_details, tax_deducted, vouchers):
 	tds_amount = 0
-	invoice_filters = {
-		'name': ('in', vouchers),
-		'docstatus': 1,
-		'apply_tds': 1
-	}
+	invoice_filters = {"name": ("in", vouchers), "docstatus": 1, "apply_tds": 1}
 
-	field = 'sum(net_total)'
+	field = "sum(net_total)"
 
 	if cint(tax_details.consider_party_ledger_amount):
-		invoice_filters.pop('apply_tds', None)
-		field = 'sum(grand_total)'
+		invoice_filters.pop("apply_tds", None)
+		field = "sum(grand_total)"
 
-	supp_credit_amt = frappe.db.get_value('Purchase Invoice', invoice_filters, field) or 0.0
+	supp_credit_amt = frappe.db.get_value("Purchase Invoice", invoice_filters, field) or 0.0
 
-	supp_jv_credit_amt = frappe.db.get_value('Journal Entry Account', {
-		'parent': ('in', vouchers), 'docstatus': 1,
-		'party': ('in', parties), 'reference_type': ('!=', 'Purchase Invoice')
-	}, 'sum(credit_in_account_currency)') or 0.0
+	supp_jv_credit_amt = (
+		frappe.db.get_value(
+			"Journal Entry Account",
+			{
+				"parent": ("in", vouchers),
+				"docstatus": 1,
+				"party": ("in", parties),
+				"reference_type": ("!=", "Purchase Invoice"),
+			},
+			"sum(credit_in_account_currency)",
+		)
+		or 0.0
+	)
 
 	supp_credit_amt += supp_jv_credit_amt
 	supp_credit_amt += inv.net_total
 
-	debit_note_amount = get_debit_note_amount(parties, tax_details.from_date, tax_details.to_date, inv.company)
+	debit_note_amount = get_debit_note_amount(
+		parties, tax_details.from_date, tax_details.to_date, inv.company
+	)
 	supp_credit_amt -= debit_note_amount
 
-	threshold = tax_details.get('threshold', 0)
-	cumulative_threshold = tax_details.get('cumulative_threshold', 0)
+	threshold = tax_details.get("threshold", 0)
+	cumulative_threshold = tax_details.get("cumulative_threshold", 0)
 
-	if ((threshold and inv.net_total >= threshold) or (cumulative_threshold and supp_credit_amt >= cumulative_threshold)):
-		if (cumulative_threshold and supp_credit_amt >= cumulative_threshold) and cint(tax_details.tax_on_excess_amount):
+	if (threshold and inv.net_total >= threshold) or (
+		cumulative_threshold and supp_credit_amt >= cumulative_threshold
+	):
+		if (cumulative_threshold and supp_credit_amt >= cumulative_threshold) and cint(
+			tax_details.tax_on_excess_amount
+		):
 			# Get net total again as TDS is calculated on net total
 			# Grand is used to just check for threshold breach
-			net_total = frappe.db.get_value('Purchase Invoice', invoice_filters, 'sum(net_total)') or 0.0
+			net_total = frappe.db.get_value("Purchase Invoice", invoice_filters, "sum(net_total)") or 0.0
 			net_total += inv.net_total
 			supp_credit_amt = net_total - cumulative_threshold
 
 		if ldc and is_valid_certificate(
-			ldc.valid_from, ldc.valid_upto,
-			inv.get('posting_date') or inv.get('transaction_date'), tax_deducted,
-			inv.net_total, ldc.certificate_limit
+			ldc.valid_from,
+			ldc.valid_upto,
+			inv.get("posting_date") or inv.get("transaction_date"),
+			tax_deducted,
+			inv.net_total,
+			ldc.certificate_limit,
 		):
 			tds_amount = get_ltds_amount(supp_credit_amt, 0, ldc.certificate_limit, ldc.rate, tax_details)
 		else:
@@ -374,98 +427,127 @@
 
 	return tds_amount
 
+
 def get_tcs_amount(parties, inv, tax_details, vouchers, adv_vouchers):
 	tcs_amount = 0
 
 	# sum of debit entries made from sales invoices
-	invoiced_amt = frappe.db.get_value('GL Entry', {
-		'is_cancelled': 0,
-		'party': ['in', parties],
-		'company': inv.company,
-		'voucher_no': ['in', vouchers],
-	}, 'sum(debit)') or 0.0
+	invoiced_amt = (
+		frappe.db.get_value(
+			"GL Entry",
+			{
+				"is_cancelled": 0,
+				"party": ["in", parties],
+				"company": inv.company,
+				"voucher_no": ["in", vouchers],
+			},
+			"sum(debit)",
+		)
+		or 0.0
+	)
 
 	# sum of credit entries made from PE / JV with unset 'against voucher'
-	advance_amt = frappe.db.get_value('GL Entry', {
-		'is_cancelled': 0,
-		'party': ['in', parties],
-		'company': inv.company,
-		'voucher_no': ['in', adv_vouchers],
-	}, 'sum(credit)') or 0.0
+	advance_amt = (
+		frappe.db.get_value(
+			"GL Entry",
+			{
+				"is_cancelled": 0,
+				"party": ["in", parties],
+				"company": inv.company,
+				"voucher_no": ["in", adv_vouchers],
+			},
+			"sum(credit)",
+		)
+		or 0.0
+	)
 
 	# sum of credit entries made from sales invoice
-	credit_note_amt = sum(frappe.db.get_all('GL Entry', {
-		'is_cancelled': 0,
-		'credit': ['>', 0],
-		'party': ['in', parties],
-		'posting_date': ['between', (tax_details.from_date, tax_details.to_date)],
-		'company': inv.company,
-		'voucher_type': 'Sales Invoice',
-	}, pluck='credit'))
+	credit_note_amt = sum(
+		frappe.db.get_all(
+			"GL Entry",
+			{
+				"is_cancelled": 0,
+				"credit": [">", 0],
+				"party": ["in", parties],
+				"posting_date": ["between", (tax_details.from_date, tax_details.to_date)],
+				"company": inv.company,
+				"voucher_type": "Sales Invoice",
+			},
+			pluck="credit",
+		)
+	)
 
-	cumulative_threshold = tax_details.get('cumulative_threshold', 0)
+	cumulative_threshold = tax_details.get("cumulative_threshold", 0)
 
 	current_invoice_total = get_invoice_total_without_tcs(inv, tax_details)
 	total_invoiced_amt = current_invoice_total + invoiced_amt + advance_amt - credit_note_amt
 
-	if (cumulative_threshold and total_invoiced_amt >= cumulative_threshold):
+	if cumulative_threshold and total_invoiced_amt >= cumulative_threshold:
 		chargeable_amt = total_invoiced_amt - cumulative_threshold
 		tcs_amount = chargeable_amt * tax_details.rate / 100 if chargeable_amt > 0 else 0
 
 	return tcs_amount
 
+
 def get_invoice_total_without_tcs(inv, tax_details):
 	tcs_tax_row = [d for d in inv.taxes if d.account_head == tax_details.account_head]
 	tcs_tax_row_amount = tcs_tax_row[0].base_tax_amount if tcs_tax_row else 0
 
 	return inv.grand_total - tcs_tax_row_amount
 
+
 def get_tds_amount_from_ldc(ldc, parties, pan_no, tax_details, posting_date, net_total):
 	tds_amount = 0
-	limit_consumed = frappe.db.get_value('Purchase Invoice', {
-		'supplier': ('in', parties),
-		'apply_tds': 1,
-		'docstatus': 1
-	}, 'sum(net_total)')
+	limit_consumed = frappe.db.get_value(
+		"Purchase Invoice",
+		{"supplier": ("in", parties), "apply_tds": 1, "docstatus": 1},
+		"sum(net_total)",
+	)
 
 	if is_valid_certificate(
-		ldc.valid_from, ldc.valid_upto,
-		posting_date, limit_consumed,
-		net_total, ldc.certificate_limit
+		ldc.valid_from, ldc.valid_upto, posting_date, limit_consumed, net_total, ldc.certificate_limit
 	):
-		tds_amount = get_ltds_amount(net_total, limit_consumed, ldc.certificate_limit, ldc.rate, tax_details)
+		tds_amount = get_ltds_amount(
+			net_total, limit_consumed, ldc.certificate_limit, ldc.rate, tax_details
+		)
 
 	return tds_amount
 
+
 def get_debit_note_amount(suppliers, from_date, to_date, company=None):
 
 	filters = {
-		'supplier': ['in', suppliers],
-		'is_return': 1,
-		'docstatus': 1,
-		'posting_date': ['between', (from_date, to_date)]
+		"supplier": ["in", suppliers],
+		"is_return": 1,
+		"docstatus": 1,
+		"posting_date": ["between", (from_date, to_date)],
 	}
-	fields = ['abs(sum(net_total)) as net_total']
+	fields = ["abs(sum(net_total)) as net_total"]
 
 	if company:
-		filters['company'] = company
+		filters["company"] = company
 
-	return frappe.get_all('Purchase Invoice', filters, fields)[0].get('net_total') or 0.0
+	return frappe.get_all("Purchase Invoice", filters, fields)[0].get("net_total") or 0.0
+
 
 def get_ltds_amount(current_amount, deducted_amount, certificate_limit, rate, tax_details):
 	if current_amount < (certificate_limit - deducted_amount):
-		return current_amount * rate/100
+		return current_amount * rate / 100
 	else:
-		ltds_amount = (certificate_limit - deducted_amount)
+		ltds_amount = certificate_limit - deducted_amount
 		tds_amount = current_amount - ltds_amount
 
-		return ltds_amount * rate/100 + tds_amount * tax_details.rate/100
+		return ltds_amount * rate / 100 + tds_amount * tax_details.rate / 100
 
-def is_valid_certificate(valid_from, valid_upto, posting_date, deducted_amount, current_amount, certificate_limit):
+
+def is_valid_certificate(
+	valid_from, valid_upto, posting_date, deducted_amount, current_amount, certificate_limit
+):
 	valid = False
 
-	if ((getdate(valid_from) <= getdate(posting_date) <= getdate(valid_upto)) and
-			certificate_limit > deducted_amount):
+	if (
+		getdate(valid_from) <= getdate(posting_date) <= getdate(valid_upto)
+	) and certificate_limit > deducted_amount:
 		valid = True
 
 	return valid
diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category_dashboard.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category_dashboard.py
index 256d4ac..8a510ea 100644
--- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category_dashboard.py
+++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname': 'tax_withholding_category',
-		'transactions': [
-			{
-				'items': ['Supplier']
-			}
-		]
-	}
+	return {"fieldname": "tax_withholding_category", "transactions": [{"items": ["Supplier"]}]}
diff --git a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
index a3fcf7d..3059f8d 100644
--- a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
+++ b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
@@ -10,6 +10,7 @@
 
 test_dependencies = ["Supplier Group", "Customer Group"]
 
+
 class TestTaxWithholdingCategory(unittest.TestCase):
 	@classmethod
 	def setUpClass(self):
@@ -21,18 +22,20 @@
 		cancel_invoices()
 
 	def test_cumulative_threshold_tds(self):
-		frappe.db.set_value("Supplier", "Test TDS Supplier", "tax_withholding_category", "Cumulative Threshold TDS")
+		frappe.db.set_value(
+			"Supplier", "Test TDS Supplier", "tax_withholding_category", "Cumulative Threshold TDS"
+		)
 		invoices = []
 
 		# create invoices for lower than single threshold tax rate
 		for _ in range(2):
-			pi = create_purchase_invoice(supplier = "Test TDS Supplier")
+			pi = create_purchase_invoice(supplier="Test TDS Supplier")
 			pi.submit()
 			invoices.append(pi)
 
 		# create another invoice whose total when added to previously created invoice,
 		# surpasses cumulative threshhold
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier")
+		pi = create_purchase_invoice(supplier="Test TDS Supplier")
 		pi.submit()
 
 		# assert equal tax deduction on total invoice amount uptil now
@@ -41,21 +44,23 @@
 		invoices.append(pi)
 
 		# TDS is already deducted, so from onward system will deduct the TDS on every invoice
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier", rate=5000)
+		pi = create_purchase_invoice(supplier="Test TDS Supplier", rate=5000)
 		pi.submit()
 
 		# assert equal tax deduction on total invoice amount uptil now
 		self.assertEqual(pi.taxes_and_charges_deducted, 500)
 		invoices.append(pi)
 
-		#delete invoices to avoid clashing
+		# delete invoices to avoid clashing
 		for d in invoices:
 			d.cancel()
 
 	def test_single_threshold_tds(self):
 		invoices = []
-		frappe.db.set_value("Supplier", "Test TDS Supplier1", "tax_withholding_category", "Single Threshold TDS")
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier1", rate = 20000)
+		frappe.db.set_value(
+			"Supplier", "Test TDS Supplier1", "tax_withholding_category", "Single Threshold TDS"
+		)
+		pi = create_purchase_invoice(supplier="Test TDS Supplier1", rate=20000)
 		pi.submit()
 		invoices.append(pi)
 
@@ -63,7 +68,7 @@
 		self.assertEqual(pi.grand_total, 18000)
 
 		# check gl entry for the purchase invoice
-		gl_entries = frappe.db.get_all('GL Entry', filters={'voucher_no': pi.name}, fields=["*"])
+		gl_entries = frappe.db.get_all("GL Entry", filters={"voucher_no": pi.name}, fields=["*"])
 		self.assertEqual(len(gl_entries), 3)
 		for d in gl_entries:
 			if d.account == pi.credit_to:
@@ -75,7 +80,7 @@
 			else:
 				raise ValueError("Account head does not match.")
 
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier1")
+		pi = create_purchase_invoice(supplier="Test TDS Supplier1")
 		pi.submit()
 		invoices.append(pi)
 
@@ -88,17 +93,19 @@
 
 	def test_tax_withholding_category_checks(self):
 		invoices = []
-		frappe.db.set_value("Supplier", "Test TDS Supplier3", "tax_withholding_category", "New TDS Category")
+		frappe.db.set_value(
+			"Supplier", "Test TDS Supplier3", "tax_withholding_category", "New TDS Category"
+		)
 
 		# First Invoice with no tds check
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier3", rate = 20000, do_not_save=True)
+		pi = create_purchase_invoice(supplier="Test TDS Supplier3", rate=20000, do_not_save=True)
 		pi.apply_tds = 0
 		pi.save()
 		pi.submit()
 		invoices.append(pi)
 
 		# Second Invoice will apply TDS checked
-		pi1 = create_purchase_invoice(supplier = "Test TDS Supplier3", rate = 20000)
+		pi1 = create_purchase_invoice(supplier="Test TDS Supplier3", rate=20000)
 		pi1.submit()
 		invoices.append(pi1)
 
@@ -110,82 +117,89 @@
 		for d in invoices:
 			d.cancel()
 
-
 	def test_cumulative_threshold_tcs(self):
-		frappe.db.set_value("Customer", "Test TCS Customer", "tax_withholding_category", "Cumulative Threshold TCS")
+		frappe.db.set_value(
+			"Customer", "Test TCS Customer", "tax_withholding_category", "Cumulative Threshold TCS"
+		)
 		invoices = []
 
 		# create invoices for lower than single threshold tax rate
 		for _ in range(2):
-			si = create_sales_invoice(customer = "Test TCS Customer")
+			si = create_sales_invoice(customer="Test TCS Customer")
 			si.submit()
 			invoices.append(si)
 
 		# create another invoice whose total when added to previously created invoice,
 		# surpasses cumulative threshhold
-		si = create_sales_invoice(customer = "Test TCS Customer", rate=12000)
+		si = create_sales_invoice(customer="Test TCS Customer", rate=12000)
 		si.submit()
 
 		# assert tax collection on total invoice amount created until now
-		tcs_charged = sum([d.base_tax_amount for d in si.taxes if d.account_head == 'TCS - _TC'])
+		tcs_charged = sum([d.base_tax_amount for d in si.taxes if d.account_head == "TCS - _TC"])
 		self.assertEqual(tcs_charged, 200)
 		self.assertEqual(si.grand_total, 12200)
 		invoices.append(si)
 
 		# TCS is already collected once, so going forward system will collect TCS on every invoice
-		si = create_sales_invoice(customer = "Test TCS Customer", rate=5000)
+		si = create_sales_invoice(customer="Test TCS Customer", rate=5000)
 		si.submit()
 
-		tcs_charged = sum(d.base_tax_amount for d in si.taxes if d.account_head == 'TCS - _TC')
+		tcs_charged = sum(d.base_tax_amount for d in si.taxes if d.account_head == "TCS - _TC")
 		self.assertEqual(tcs_charged, 500)
 		invoices.append(si)
 
-		#delete invoices to avoid clashing
+		# delete invoices to avoid clashing
 		for d in invoices:
 			d.cancel()
 
 	def test_tds_calculation_on_net_total(self):
-		frappe.db.set_value("Supplier", "Test TDS Supplier4", "tax_withholding_category", "Cumulative Threshold TDS")
+		frappe.db.set_value(
+			"Supplier", "Test TDS Supplier4", "tax_withholding_category", "Cumulative Threshold TDS"
+		)
 		invoices = []
 
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier4", rate = 20000, do_not_save=True)
-		pi.append('taxes', {
-			"category": "Total",
-			"charge_type": "Actual",
-			"account_head": '_Test Account VAT - _TC',
-			"cost_center": 'Main - _TC',
-			"tax_amount": 1000,
-			"description": "Test",
-			"add_deduct_tax": "Add"
-
-		})
+		pi = create_purchase_invoice(supplier="Test TDS Supplier4", rate=20000, do_not_save=True)
+		pi.append(
+			"taxes",
+			{
+				"category": "Total",
+				"charge_type": "Actual",
+				"account_head": "_Test Account VAT - _TC",
+				"cost_center": "Main - _TC",
+				"tax_amount": 1000,
+				"description": "Test",
+				"add_deduct_tax": "Add",
+			},
+		)
 		pi.save()
 		pi.submit()
 		invoices.append(pi)
 
 		# Second Invoice will apply TDS checked
-		pi1 = create_purchase_invoice(supplier = "Test TDS Supplier4", rate = 20000)
+		pi1 = create_purchase_invoice(supplier="Test TDS Supplier4", rate=20000)
 		pi1.submit()
 		invoices.append(pi1)
 
 		self.assertEqual(pi1.taxes[0].tax_amount, 4000)
 
-		#delete invoices to avoid clashing
+		# delete invoices to avoid clashing
 		for d in invoices:
 			d.cancel()
 
 	def test_multi_category_single_supplier(self):
-		frappe.db.set_value("Supplier", "Test TDS Supplier5", "tax_withholding_category", "Test Service Category")
+		frappe.db.set_value(
+			"Supplier", "Test TDS Supplier5", "tax_withholding_category", "Test Service Category"
+		)
 		invoices = []
 
-		pi = create_purchase_invoice(supplier = "Test TDS Supplier5", rate = 500, do_not_save=True)
+		pi = create_purchase_invoice(supplier="Test TDS Supplier5", rate=500, do_not_save=True)
 		pi.tax_withholding_category = "Test Service Category"
 		pi.save()
 		pi.submit()
 		invoices.append(pi)
 
 		# Second Invoice will apply TDS checked
-		pi1 = create_purchase_invoice(supplier = "Test TDS Supplier5", rate = 2500, do_not_save=True)
+		pi1 = create_purchase_invoice(supplier="Test TDS Supplier5", rate=2500, do_not_save=True)
 		pi1.tax_withholding_category = "Test Goods Category"
 		pi1.save()
 		pi1.submit()
@@ -193,258 +207,294 @@
 
 		self.assertEqual(pi1.taxes[0].tax_amount, 250)
 
-		#delete invoices to avoid clashing
+		# delete invoices to avoid clashing
 		for d in invoices:
 			d.cancel()
 
-def cancel_invoices():
-	purchase_invoices = frappe.get_all("Purchase Invoice", {
-		'supplier': ['in', ['Test TDS Supplier', 'Test TDS Supplier1', 'Test TDS Supplier2']],
-		'docstatus': 1
-	}, pluck="name")
 
-	sales_invoices = frappe.get_all("Sales Invoice", {
-		'customer': 'Test TCS Customer',
-		'docstatus': 1
-	}, pluck="name")
+def cancel_invoices():
+	purchase_invoices = frappe.get_all(
+		"Purchase Invoice",
+		{
+			"supplier": ["in", ["Test TDS Supplier", "Test TDS Supplier1", "Test TDS Supplier2"]],
+			"docstatus": 1,
+		},
+		pluck="name",
+	)
+
+	sales_invoices = frappe.get_all(
+		"Sales Invoice", {"customer": "Test TCS Customer", "docstatus": 1}, pluck="name"
+	)
 
 	for d in purchase_invoices:
-		frappe.get_doc('Purchase Invoice', d).cancel()
+		frappe.get_doc("Purchase Invoice", d).cancel()
 
 	for d in sales_invoices:
-		frappe.get_doc('Sales Invoice', d).cancel()
+		frappe.get_doc("Sales Invoice", d).cancel()
+
 
 def create_purchase_invoice(**args):
 	# return sales invoice doc object
-	item = frappe.db.get_value('Item', {'item_name': 'TDS Item'}, "name")
+	item = frappe.db.get_value("Item", {"item_name": "TDS Item"}, "name")
 
 	args = frappe._dict(args)
-	pi = frappe.get_doc({
-		"doctype": "Purchase Invoice",
-		"posting_date": today(),
-		"apply_tds": 0 if args.do_not_apply_tds else 1,
-		"supplier": args.supplier,
-		"company": '_Test Company',
-		"taxes_and_charges": "",
-		"currency": "INR",
-		"credit_to": "Creditors - _TC",
-		"taxes": [],
-		"items": [{
-			'doctype': 'Purchase Invoice Item',
-			'item_code': item,
-			'qty': args.qty or 1,
-			'rate': args.rate or 10000,
-			'cost_center': 'Main - _TC',
-			'expense_account': 'Stock Received But Not Billed - _TC'
-		}]
-	})
+	pi = frappe.get_doc(
+		{
+			"doctype": "Purchase Invoice",
+			"posting_date": today(),
+			"apply_tds": 0 if args.do_not_apply_tds else 1,
+			"supplier": args.supplier,
+			"company": "_Test Company",
+			"taxes_and_charges": "",
+			"currency": "INR",
+			"credit_to": "Creditors - _TC",
+			"taxes": [],
+			"items": [
+				{
+					"doctype": "Purchase Invoice Item",
+					"item_code": item,
+					"qty": args.qty or 1,
+					"rate": args.rate or 10000,
+					"cost_center": "Main - _TC",
+					"expense_account": "Stock Received But Not Billed - _TC",
+				}
+			],
+		}
+	)
 
 	pi.save()
 	return pi
 
+
 def create_sales_invoice(**args):
 	# return sales invoice doc object
-	item = frappe.db.get_value('Item', {'item_name': 'TCS Item'}, "name")
+	item = frappe.db.get_value("Item", {"item_name": "TCS Item"}, "name")
 
 	args = frappe._dict(args)
-	si = frappe.get_doc({
-		"doctype": "Sales Invoice",
-		"posting_date": today(),
-		"customer": args.customer,
-		"company": '_Test Company',
-		"taxes_and_charges": "",
-		"currency": "INR",
-		"debit_to": "Debtors - _TC",
-		"taxes": [],
-		"items": [{
-			'doctype': 'Sales Invoice Item',
-			'item_code': item,
-			'qty': args.qty or 1,
-			'rate': args.rate or 10000,
-			'cost_center': 'Main - _TC',
-			'expense_account': 'Cost of Goods Sold - _TC',
-			'warehouse': args.warehouse or '_Test Warehouse - _TC'
-		}]
-	})
+	si = frappe.get_doc(
+		{
+			"doctype": "Sales Invoice",
+			"posting_date": today(),
+			"customer": args.customer,
+			"company": "_Test Company",
+			"taxes_and_charges": "",
+			"currency": "INR",
+			"debit_to": "Debtors - _TC",
+			"taxes": [],
+			"items": [
+				{
+					"doctype": "Sales Invoice Item",
+					"item_code": item,
+					"qty": args.qty or 1,
+					"rate": args.rate or 10000,
+					"cost_center": "Main - _TC",
+					"expense_account": "Cost of Goods Sold - _TC",
+					"warehouse": args.warehouse or "_Test Warehouse - _TC",
+				}
+			],
+		}
+	)
 
 	si.save()
 	return si
 
+
 def create_records():
 	# create a new suppliers
-	for name in ['Test TDS Supplier', 'Test TDS Supplier1', 'Test TDS Supplier2', 'Test TDS Supplier3',
-		'Test TDS Supplier4', 'Test TDS Supplier5']:
-		if frappe.db.exists('Supplier', name):
+	for name in [
+		"Test TDS Supplier",
+		"Test TDS Supplier1",
+		"Test TDS Supplier2",
+		"Test TDS Supplier3",
+		"Test TDS Supplier4",
+		"Test TDS Supplier5",
+	]:
+		if frappe.db.exists("Supplier", name):
 			continue
 
-		frappe.get_doc({
-			"supplier_group": "_Test Supplier Group",
-			"supplier_name": name,
-			"doctype": "Supplier",
-		}).insert()
+		frappe.get_doc(
+			{
+				"supplier_group": "_Test Supplier Group",
+				"supplier_name": name,
+				"doctype": "Supplier",
+			}
+		).insert()
 
-	for name in ['Test TCS Customer']:
-		if frappe.db.exists('Customer', name):
+	for name in ["Test TCS Customer"]:
+		if frappe.db.exists("Customer", name):
 			continue
 
-		frappe.get_doc({
-			"customer_group": "_Test Customer Group",
-			"customer_name": name,
-			"doctype": "Customer"
-		}).insert()
+		frappe.get_doc(
+			{"customer_group": "_Test Customer Group", "customer_name": name, "doctype": "Customer"}
+		).insert()
 
 	# create item
-	if not frappe.db.exists('Item', "TDS Item"):
-		frappe.get_doc({
-			"doctype": "Item",
-			"item_code": "TDS Item",
-			"item_name": "TDS Item",
-			"item_group": "All Item Groups",
-			"is_stock_item": 0,
-		}).insert()
+	if not frappe.db.exists("Item", "TDS Item"):
+		frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": "TDS Item",
+				"item_name": "TDS Item",
+				"item_group": "All Item Groups",
+				"is_stock_item": 0,
+			}
+		).insert()
 
-	if not frappe.db.exists('Item', "TCS Item"):
-		frappe.get_doc({
-			"doctype": "Item",
-			"item_code": "TCS Item",
-			"item_name": "TCS Item",
-			"item_group": "All Item Groups",
-			"is_stock_item": 1
-		}).insert()
+	if not frappe.db.exists("Item", "TCS Item"):
+		frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": "TCS Item",
+				"item_name": "TCS Item",
+				"item_group": "All Item Groups",
+				"is_stock_item": 1,
+			}
+		).insert()
 
 	# create tds account
 	if not frappe.db.exists("Account", "TDS - _TC"):
-		frappe.get_doc({
-			'doctype': 'Account',
-			'company': '_Test Company',
-			'account_name': 'TDS',
-			'parent_account': 'Tax Assets - _TC',
-			'report_type': 'Balance Sheet',
-			'root_type': 'Asset'
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": "TDS",
+				"parent_account": "Tax Assets - _TC",
+				"report_type": "Balance Sheet",
+				"root_type": "Asset",
+			}
+		).insert()
 
 	# create tcs account
 	if not frappe.db.exists("Account", "TCS - _TC"):
-		frappe.get_doc({
-			'doctype': 'Account',
-			'company': '_Test Company',
-			'account_name': 'TCS',
-			'parent_account': 'Duties and Taxes - _TC',
-			'report_type': 'Balance Sheet',
-			'root_type': 'Liability'
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": "TCS",
+				"parent_account": "Duties and Taxes - _TC",
+				"report_type": "Balance Sheet",
+				"root_type": "Liability",
+			}
+		).insert()
+
 
 def create_tax_with_holding_category():
 	fiscal_year = get_fiscal_year(today(), company="_Test Company")
 	# Cumulative threshold
 	if not frappe.db.exists("Tax Withholding Category", "Cumulative Threshold TDS"):
-		frappe.get_doc({
-			"doctype": "Tax Withholding Category",
-			"name": "Cumulative Threshold TDS",
-			"category_name": "10% TDS",
-			"rates": [{
-				'from_date': fiscal_year[1],
-				'to_date': fiscal_year[2],
-				'tax_withholding_rate': 10,
-				'single_threshold': 0,
-				'cumulative_threshold': 30000.00
-			}],
-			"accounts": [{
-				'company': '_Test Company',
-				'account': 'TDS - _TC'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Tax Withholding Category",
+				"name": "Cumulative Threshold TDS",
+				"category_name": "10% TDS",
+				"rates": [
+					{
+						"from_date": fiscal_year[1],
+						"to_date": fiscal_year[2],
+						"tax_withholding_rate": 10,
+						"single_threshold": 0,
+						"cumulative_threshold": 30000.00,
+					}
+				],
+				"accounts": [{"company": "_Test Company", "account": "TDS - _TC"}],
+			}
+		).insert()
 
 	if not frappe.db.exists("Tax Withholding Category", "Cumulative Threshold TCS"):
-		frappe.get_doc({
-			"doctype": "Tax Withholding Category",
-			"name": "Cumulative Threshold TCS",
-			"category_name": "10% TCS",
-			"rates": [{
-				'from_date': fiscal_year[1],
-				'to_date': fiscal_year[2],
-				'tax_withholding_rate': 10,
-				'single_threshold': 0,
-				'cumulative_threshold': 30000.00
-			}],
-			"accounts": [{
-				'company': '_Test Company',
-				'account': 'TCS - _TC'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Tax Withholding Category",
+				"name": "Cumulative Threshold TCS",
+				"category_name": "10% TCS",
+				"rates": [
+					{
+						"from_date": fiscal_year[1],
+						"to_date": fiscal_year[2],
+						"tax_withholding_rate": 10,
+						"single_threshold": 0,
+						"cumulative_threshold": 30000.00,
+					}
+				],
+				"accounts": [{"company": "_Test Company", "account": "TCS - _TC"}],
+			}
+		).insert()
 
 	# Single thresold
 	if not frappe.db.exists("Tax Withholding Category", "Single Threshold TDS"):
-		frappe.get_doc({
-			"doctype": "Tax Withholding Category",
-			"name": "Single Threshold TDS",
-			"category_name": "10% TDS",
-			"rates": [{
-				'from_date': fiscal_year[1],
-				'to_date': fiscal_year[2],
-				'tax_withholding_rate': 10,
-				'single_threshold': 20000.00,
-				'cumulative_threshold': 0
-			}],
-			"accounts": [{
-				'company': '_Test Company',
-				'account': 'TDS - _TC'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Tax Withholding Category",
+				"name": "Single Threshold TDS",
+				"category_name": "10% TDS",
+				"rates": [
+					{
+						"from_date": fiscal_year[1],
+						"to_date": fiscal_year[2],
+						"tax_withholding_rate": 10,
+						"single_threshold": 20000.00,
+						"cumulative_threshold": 0,
+					}
+				],
+				"accounts": [{"company": "_Test Company", "account": "TDS - _TC"}],
+			}
+		).insert()
 
 	if not frappe.db.exists("Tax Withholding Category", "New TDS Category"):
-		frappe.get_doc({
-			"doctype": "Tax Withholding Category",
-			"name": "New TDS Category",
-			"category_name": "New TDS Category",
-			"round_off_tax_amount": 1,
-			"consider_party_ledger_amount": 1,
-			"tax_on_excess_amount": 1,
-			"rates": [{
-				'from_date': fiscal_year[1],
-				'to_date': fiscal_year[2],
-				'tax_withholding_rate': 10,
-				'single_threshold': 0,
-				'cumulative_threshold': 30000
-			}],
-			"accounts": [{
-				'company': '_Test Company',
-				'account': 'TDS - _TC'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Tax Withholding Category",
+				"name": "New TDS Category",
+				"category_name": "New TDS Category",
+				"round_off_tax_amount": 1,
+				"consider_party_ledger_amount": 1,
+				"tax_on_excess_amount": 1,
+				"rates": [
+					{
+						"from_date": fiscal_year[1],
+						"to_date": fiscal_year[2],
+						"tax_withholding_rate": 10,
+						"single_threshold": 0,
+						"cumulative_threshold": 30000,
+					}
+				],
+				"accounts": [{"company": "_Test Company", "account": "TDS - _TC"}],
+			}
+		).insert()
 
 	if not frappe.db.exists("Tax Withholding Category", "Test Service Category"):
-		frappe.get_doc({
-			"doctype": "Tax Withholding Category",
-			"name": "Test Service Category",
-			"category_name": "Test Service Category",
-			"rates": [{
-				'from_date': fiscal_year[1],
-				'to_date': fiscal_year[2],
-				'tax_withholding_rate': 10,
-				'single_threshold': 2000,
-				'cumulative_threshold': 2000
-			}],
-			"accounts": [{
-				'company': '_Test Company',
-				'account': 'TDS - _TC'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Tax Withholding Category",
+				"name": "Test Service Category",
+				"category_name": "Test Service Category",
+				"rates": [
+					{
+						"from_date": fiscal_year[1],
+						"to_date": fiscal_year[2],
+						"tax_withholding_rate": 10,
+						"single_threshold": 2000,
+						"cumulative_threshold": 2000,
+					}
+				],
+				"accounts": [{"company": "_Test Company", "account": "TDS - _TC"}],
+			}
+		).insert()
 
 	if not frappe.db.exists("Tax Withholding Category", "Test Goods Category"):
-		frappe.get_doc({
-			"doctype": "Tax Withholding Category",
-			"name": "Test Goods Category",
-			"category_name": "Test Goods Category",
-			"rates": [{
-				'from_date': fiscal_year[1],
-				'to_date': fiscal_year[2],
-				'tax_withholding_rate': 10,
-				'single_threshold': 2000,
-				'cumulative_threshold': 2000
-			}],
-			"accounts": [{
-				'company': '_Test Company',
-				'account': 'TDS - _TC'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Tax Withholding Category",
+				"name": "Test Goods Category",
+				"category_name": "Test Goods Category",
+				"rates": [
+					{
+						"from_date": fiscal_year[1],
+						"to_date": fiscal_year[2],
+						"tax_withholding_rate": 10,
+						"single_threshold": 2000,
+						"cumulative_threshold": 2000,
+					}
+				],
+				"accounts": [{"company": "_Test Company", "account": "TDS - _TC"}],
+			}
+		).insert()
diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py
index 0cd5e86..50f37be 100644
--- a/erpnext/accounts/general_ledger.py
+++ b/erpnext/accounts/general_ledger.py
@@ -16,9 +16,18 @@
 from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget
 
 
-class ClosedAccountingPeriod(frappe.ValidationError): pass
+class ClosedAccountingPeriod(frappe.ValidationError):
+	pass
 
-def make_gl_entries(gl_map, cancel=False, adv_adj=False, merge_entries=True, update_outstanding='Yes', from_repost=False):
+
+def make_gl_entries(
+	gl_map,
+	cancel=False,
+	adv_adj=False,
+	merge_entries=True,
+	update_outstanding="Yes",
+	from_repost=False,
+):
 	if gl_map:
 		if not cancel:
 			validate_accounting_period(gl_map)
@@ -27,12 +36,18 @@
 				save_entries(gl_map, adv_adj, update_outstanding, from_repost)
 			# Post GL Map proccess there may no be any GL Entries
 			elif gl_map:
-				frappe.throw(_("Incorrect number of General Ledger Entries found. You might have selected a wrong Account in the transaction."))
+				frappe.throw(
+					_(
+						"Incorrect number of General Ledger Entries found. You might have selected a wrong Account in the transaction."
+					)
+				)
 		else:
 			make_reverse_gl_entries(gl_map, adv_adj=adv_adj, update_outstanding=update_outstanding)
 
+
 def validate_accounting_period(gl_map):
-	accounting_periods = frappe.db.sql(""" SELECT
+	accounting_periods = frappe.db.sql(
+		""" SELECT
 			ap.name as name
 		FROM
 			`tabAccounting Period` ap, `tabClosed Document` cd
@@ -42,15 +57,23 @@
 			AND cd.closed = 1
 			AND cd.document_type = %(voucher_type)s
 			AND %(date)s between ap.start_date and ap.end_date
-			""", {
-				'date': gl_map[0].posting_date,
-				'company': gl_map[0].company,
-				'voucher_type': gl_map[0].voucher_type
-			}, as_dict=1)
+			""",
+		{
+			"date": gl_map[0].posting_date,
+			"company": gl_map[0].company,
+			"voucher_type": gl_map[0].voucher_type,
+		},
+		as_dict=1,
+	)
 
 	if accounting_periods:
-		frappe.throw(_("You cannot create or cancel any accounting entries with in the closed Accounting Period {0}")
-			.format(frappe.bold(accounting_periods[0].name)), ClosedAccountingPeriod)
+		frappe.throw(
+			_(
+				"You cannot create or cancel any accounting entries with in the closed Accounting Period {0}"
+			).format(frappe.bold(accounting_periods[0].name)),
+			ClosedAccountingPeriod,
+		)
+
 
 def process_gl_map(gl_map, merge_entries=True, precision=None):
 	if not gl_map:
@@ -65,8 +88,11 @@
 
 	return gl_map
 
+
 def distribute_gl_based_on_cost_center_allocation(gl_map, precision=None):
-	cost_center_allocation = get_cost_center_allocation_data(gl_map[0]["company"], gl_map[0]["posting_date"])
+	cost_center_allocation = get_cost_center_allocation_data(
+		gl_map[0]["company"], gl_map[0]["posting_date"]
+	)
 	if not cost_center_allocation:
 		return gl_map
 
@@ -85,12 +111,15 @@
 
 	return new_gl_map
 
+
 def get_cost_center_allocation_data(company, posting_date):
 	par = frappe.qb.DocType("Cost Center Allocation")
 	child = frappe.qb.DocType("Cost Center Allocation Percentage")
 
 	records = (
-		frappe.qb.from_(par).inner_join(child).on(par.name == child.parent)
+		frappe.qb.from_(par)
+		.inner_join(child)
+		.on(par.name == child.parent)
 		.select(par.main_cost_center, child.cost_center, child.percentage)
 		.where(par.docstatus == 1)
 		.where(par.company == company)
@@ -100,11 +129,13 @@
 
 	cc_allocation = frappe._dict()
 	for d in records:
-		cc_allocation.setdefault(d.main_cost_center, frappe._dict())\
-			.setdefault(d.cost_center, d.percentage)
+		cc_allocation.setdefault(d.main_cost_center, frappe._dict()).setdefault(
+			d.cost_center, d.percentage
+		)
 
 	return cc_allocation
 
+
 def merge_similar_entries(gl_map, precision=None):
 	merged_gl_map = []
 	accounting_dimensions = get_accounting_dimensions()
@@ -113,12 +144,14 @@
 		# to that entry
 		same_head = check_if_in_list(entry, merged_gl_map, accounting_dimensions)
 		if same_head:
-			same_head.debit	= flt(same_head.debit) + flt(entry.debit)
-			same_head.debit_in_account_currency	= \
-				flt(same_head.debit_in_account_currency) + flt(entry.debit_in_account_currency)
+			same_head.debit = flt(same_head.debit) + flt(entry.debit)
+			same_head.debit_in_account_currency = flt(same_head.debit_in_account_currency) + flt(
+				entry.debit_in_account_currency
+			)
 			same_head.credit = flt(same_head.credit) + flt(entry.credit)
-			same_head.credit_in_account_currency = \
-				flt(same_head.credit_in_account_currency) + flt(entry.credit_in_account_currency)
+			same_head.credit_in_account_currency = flt(same_head.credit_in_account_currency) + flt(
+				entry.credit_in_account_currency
+			)
 		else:
 			merged_gl_map.append(entry)
 
@@ -129,14 +162,25 @@
 		precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"), company_currency)
 
 	# filter zero debit and credit entries
-	merged_gl_map = filter(lambda x: flt(x.debit, precision)!=0 or flt(x.credit, precision)!=0, merged_gl_map)
+	merged_gl_map = filter(
+		lambda x: flt(x.debit, precision) != 0 or flt(x.credit, precision) != 0, merged_gl_map
+	)
 	merged_gl_map = list(merged_gl_map)
 
 	return merged_gl_map
 
+
 def check_if_in_list(gle, gl_map, dimensions=None):
-	account_head_fieldnames = ['voucher_detail_no', 'party', 'against_voucher',
-			'cost_center', 'against_voucher_type', 'party_type', 'project', 'finance_book']
+	account_head_fieldnames = [
+		"voucher_detail_no",
+		"party",
+		"against_voucher",
+		"cost_center",
+		"against_voucher_type",
+		"party_type",
+		"project",
+		"finance_book",
+	]
 
 	if dimensions:
 		account_head_fieldnames = account_head_fieldnames + dimensions
@@ -155,6 +199,7 @@
 		if same_head:
 			return e
 
+
 def toggle_debit_credit_if_negative(gl_map):
 	for entry in gl_map:
 		# toggle debit, credit if negative entry
@@ -163,8 +208,9 @@
 			entry.debit = 0.0
 
 		if flt(entry.debit_in_account_currency) < 0:
-			entry.credit_in_account_currency = \
-				flt(entry.credit_in_account_currency) - flt(entry.debit_in_account_currency)
+			entry.credit_in_account_currency = flt(entry.credit_in_account_currency) - flt(
+				entry.debit_in_account_currency
+			)
 			entry.debit_in_account_currency = 0.0
 
 		if flt(entry.credit) < 0:
@@ -172,32 +218,37 @@
 			entry.credit = 0.0
 
 		if flt(entry.credit_in_account_currency) < 0:
-			entry.debit_in_account_currency = \
-				flt(entry.debit_in_account_currency) - flt(entry.credit_in_account_currency)
+			entry.debit_in_account_currency = flt(entry.debit_in_account_currency) - flt(
+				entry.credit_in_account_currency
+			)
 			entry.credit_in_account_currency = 0.0
 
 		update_net_values(entry)
 
 	return gl_map
 
+
 def update_net_values(entry):
 	# In some scenarios net value needs to be shown in the ledger
 	# This method updates net values as debit or credit
 	if entry.post_net_value and entry.debit and entry.credit:
 		if entry.debit > entry.credit:
 			entry.debit = entry.debit - entry.credit
-			entry.debit_in_account_currency = entry.debit_in_account_currency \
-				- entry.credit_in_account_currency
+			entry.debit_in_account_currency = (
+				entry.debit_in_account_currency - entry.credit_in_account_currency
+			)
 			entry.credit = 0
 			entry.credit_in_account_currency = 0
 		else:
 			entry.credit = entry.credit - entry.debit
-			entry.credit_in_account_currency = entry.credit_in_account_currency \
-				- entry.debit_in_account_currency
+			entry.credit_in_account_currency = (
+				entry.credit_in_account_currency - entry.debit_in_account_currency
+			)
 
 			entry.debit = 0
 			entry.debit_in_account_currency = 0
 
+
 def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False):
 	if not from_repost:
 		validate_cwip_accounts(gl_map)
@@ -210,36 +261,52 @@
 	for entry in gl_map:
 		make_entry(entry, adv_adj, update_outstanding, from_repost)
 
+
 def make_entry(args, adv_adj, update_outstanding, from_repost=False):
 	gle = frappe.new_doc("GL Entry")
 	gle.update(args)
 	gle.flags.ignore_permissions = 1
 	gle.flags.from_repost = from_repost
 	gle.flags.adv_adj = adv_adj
-	gle.flags.update_outstanding = update_outstanding or 'Yes'
+	gle.flags.update_outstanding = update_outstanding or "Yes"
 	gle.submit()
 
 	if not from_repost:
 		validate_expense_against_budget(args)
 
+
 def validate_cwip_accounts(gl_map):
 	"""Validate that CWIP account are not used in Journal Entry"""
 	if gl_map and gl_map[0].voucher_type != "Journal Entry":
 		return
 
-	cwip_enabled = any(cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category", "enable_cwip_accounting"))
+	cwip_enabled = any(
+		cint(ac.enable_cwip_accounting)
+		for ac in frappe.db.get_all("Asset Category", "enable_cwip_accounting")
+	)
 	if cwip_enabled:
-		cwip_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount
-			where account_type = 'Capital Work in Progress' and is_group=0""")]
+		cwip_accounts = [
+			d[0]
+			for d in frappe.db.sql(
+				"""select name from tabAccount
+			where account_type = 'Capital Work in Progress' and is_group=0"""
+			)
+		]
 
 		for entry in gl_map:
 			if entry.account in cwip_accounts:
 				frappe.throw(
-					_("Account: <b>{0}</b> is capital Work in progress and can not be updated by Journal Entry").format(entry.account))
+					_(
+						"Account: <b>{0}</b> is capital Work in progress and can not be updated by Journal Entry"
+					).format(entry.account)
+				)
+
 
 def round_off_debit_credit(gl_map):
-	precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"),
-		currency=frappe.get_cached_value('Company',  gl_map[0].company,  "default_currency"))
+	precision = get_field_precision(
+		frappe.get_meta("GL Entry").get_field("debit"),
+		currency=frappe.get_cached_value("Company", gl_map[0].company, "default_currency"),
+	)
 
 	debit_credit_diff = 0.0
 	for entry in gl_map:
@@ -252,17 +319,23 @@
 	if gl_map[0]["voucher_type"] in ("Journal Entry", "Payment Entry"):
 		allowance = 5.0 / (10**precision)
 	else:
-		allowance = .5
+		allowance = 0.5
 
 	if abs(debit_credit_diff) > allowance:
-		frappe.throw(_("Debit and Credit not equal for {0} #{1}. Difference is {2}.")
-			.format(gl_map[0].voucher_type, gl_map[0].voucher_no, debit_credit_diff))
+		frappe.throw(
+			_("Debit and Credit not equal for {0} #{1}. Difference is {2}.").format(
+				gl_map[0].voucher_type, gl_map[0].voucher_no, debit_credit_diff
+			)
+		)
 
 	elif abs(debit_credit_diff) >= (1.0 / (10**precision)):
 		make_round_off_gle(gl_map, debit_credit_diff, precision)
 
+
 def make_round_off_gle(gl_map, debit_credit_diff, precision):
-	round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(gl_map[0].company)
+	round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
+		gl_map[0].company
+	)
 	round_off_account_exists = False
 	round_off_gle = frappe._dict()
 	for d in gl_map:
@@ -279,30 +352,33 @@
 		return
 
 	if not round_off_gle:
-		for k in ["voucher_type", "voucher_no", "company",
-			"posting_date", "remarks"]:
-				round_off_gle[k] = gl_map[0][k]
+		for k in ["voucher_type", "voucher_no", "company", "posting_date", "remarks"]:
+			round_off_gle[k] = gl_map[0][k]
 
-	round_off_gle.update({
-		"account": round_off_account,
-		"debit_in_account_currency": abs(debit_credit_diff) if debit_credit_diff < 0 else 0,
-		"credit_in_account_currency": debit_credit_diff if debit_credit_diff > 0 else 0,
-		"debit": abs(debit_credit_diff) if debit_credit_diff < 0 else 0,
-		"credit": debit_credit_diff if debit_credit_diff > 0 else 0,
-		"cost_center": round_off_cost_center,
-		"party_type": None,
-		"party": None,
-		"is_opening": "No",
-		"against_voucher_type": None,
-		"against_voucher": None
-	})
+	round_off_gle.update(
+		{
+			"account": round_off_account,
+			"debit_in_account_currency": abs(debit_credit_diff) if debit_credit_diff < 0 else 0,
+			"credit_in_account_currency": debit_credit_diff if debit_credit_diff > 0 else 0,
+			"debit": abs(debit_credit_diff) if debit_credit_diff < 0 else 0,
+			"credit": debit_credit_diff if debit_credit_diff > 0 else 0,
+			"cost_center": round_off_cost_center,
+			"party_type": None,
+			"party": None,
+			"is_opening": "No",
+			"against_voucher_type": None,
+			"against_voucher": None,
+		}
+	)
 
 	if not round_off_account_exists:
 		gl_map.append(round_off_gle)
 
+
 def get_round_off_account_and_cost_center(company):
-	round_off_account, round_off_cost_center = frappe.get_cached_value('Company',  company,
-		["round_off_account", "round_off_cost_center"]) or [None, None]
+	round_off_account, round_off_cost_center = frappe.get_cached_value(
+		"Company", company, ["round_off_account", "round_off_cost_center"]
+	) or [None, None]
 	if not round_off_account:
 		frappe.throw(_("Please mention Round Off Account in Company"))
 
@@ -311,74 +387,83 @@
 
 	return round_off_account, round_off_cost_center
 
-def make_reverse_gl_entries(gl_entries=None, voucher_type=None, voucher_no=None,
-	adv_adj=False, update_outstanding="Yes"):
+
+def make_reverse_gl_entries(
+	gl_entries=None, voucher_type=None, voucher_no=None, adv_adj=False, update_outstanding="Yes"
+):
 	"""
-		Get original gl entries of the voucher
-		and make reverse gl entries by swapping debit and credit
+	Get original gl entries of the voucher
+	and make reverse gl entries by swapping debit and credit
 	"""
 
 	if not gl_entries:
 		gl_entry = frappe.qb.DocType("GL Entry")
-		gl_entries = (frappe.qb.from_(
-			gl_entry
-		).select(
-			'*'
-		).where(
-			gl_entry.voucher_type == voucher_type
-		).where(
-			gl_entry.voucher_no == voucher_no
-		).where(
-			gl_entry.is_cancelled == 0
-		).for_update()).run(as_dict=1)
+		gl_entries = (
+			frappe.qb.from_(gl_entry)
+			.select("*")
+			.where(gl_entry.voucher_type == voucher_type)
+			.where(gl_entry.voucher_no == voucher_no)
+			.where(gl_entry.is_cancelled == 0)
+			.for_update()
+		).run(as_dict=1)
 
 	if gl_entries:
 		validate_accounting_period(gl_entries)
 		check_freezing_date(gl_entries[0]["posting_date"], adv_adj)
-		set_as_cancel(gl_entries[0]['voucher_type'], gl_entries[0]['voucher_no'])
+		set_as_cancel(gl_entries[0]["voucher_type"], gl_entries[0]["voucher_no"])
 
 		for entry in gl_entries:
 			new_gle = copy.deepcopy(entry)
-			new_gle['name'] = None
-			debit = new_gle.get('debit', 0)
-			credit = new_gle.get('credit', 0)
+			new_gle["name"] = None
+			debit = new_gle.get("debit", 0)
+			credit = new_gle.get("credit", 0)
 
-			debit_in_account_currency = new_gle.get('debit_in_account_currency', 0)
-			credit_in_account_currency = new_gle.get('credit_in_account_currency', 0)
+			debit_in_account_currency = new_gle.get("debit_in_account_currency", 0)
+			credit_in_account_currency = new_gle.get("credit_in_account_currency", 0)
 
-			new_gle['debit'] = credit
-			new_gle['credit'] = debit
-			new_gle['debit_in_account_currency'] = credit_in_account_currency
-			new_gle['credit_in_account_currency'] = debit_in_account_currency
+			new_gle["debit"] = credit
+			new_gle["credit"] = debit
+			new_gle["debit_in_account_currency"] = credit_in_account_currency
+			new_gle["credit_in_account_currency"] = debit_in_account_currency
 
-			new_gle['remarks'] = "On cancellation of " + new_gle['voucher_no']
-			new_gle['is_cancelled'] = 1
+			new_gle["remarks"] = "On cancellation of " + new_gle["voucher_no"]
+			new_gle["is_cancelled"] = 1
 
-			if new_gle['debit'] or new_gle['credit']:
+			if new_gle["debit"] or new_gle["credit"]:
 				make_entry(new_gle, adv_adj, "Yes")
 
 
 def check_freezing_date(posting_date, adv_adj=False):
 	"""
-		Nobody can do GL Entries where posting date is before freezing date
-		except authorized person
+	Nobody can do GL Entries where posting date is before freezing date
+	except authorized person
 
-		Administrator has all the roles so this check will be bypassed if any role is allowed to post
-		Hence stop admin to bypass if accounts are freezed
+	Administrator has all the roles so this check will be bypassed if any role is allowed to post
+	Hence stop admin to bypass if accounts are freezed
 	"""
 	if not adv_adj:
-		acc_frozen_upto = frappe.db.get_value('Accounts Settings', None, 'acc_frozen_upto')
+		acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto")
 		if acc_frozen_upto:
-			frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier')
-			if getdate(posting_date) <= getdate(acc_frozen_upto) \
-					and (frozen_accounts_modifier not in frappe.get_roles() or frappe.session.user == 'Administrator'):
-				frappe.throw(_("You are not authorized to add or update entries before {0}").format(formatdate(acc_frozen_upto)))
+			frozen_accounts_modifier = frappe.db.get_value(
+				"Accounts Settings", None, "frozen_accounts_modifier"
+			)
+			if getdate(posting_date) <= getdate(acc_frozen_upto) and (
+				frozen_accounts_modifier not in frappe.get_roles() or frappe.session.user == "Administrator"
+			):
+				frappe.throw(
+					_("You are not authorized to add or update entries before {0}").format(
+						formatdate(acc_frozen_upto)
+					)
+				)
+
 
 def set_as_cancel(voucher_type, voucher_no):
 	"""
-		Set is_cancelled=1 in all original gl entries for the voucher
+	Set is_cancelled=1 in all original gl entries for the voucher
 	"""
-	frappe.db.sql("""UPDATE `tabGL Entry` SET is_cancelled = 1,
+	frappe.db.sql(
+		"""UPDATE `tabGL Entry` SET is_cancelled = 1,
 		modified=%s, modified_by=%s
 		where voucher_type=%s and voucher_no=%s and is_cancelled = 0""",
-		(now(), frappe.session.user, voucher_type, voucher_no))
+		(now(), frappe.session.user, voucher_type, voucher_no),
+	)
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 791cd1d..b0b3049 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -33,122 +33,227 @@
 from erpnext.exceptions import InvalidAccountCurrency, PartyDisabled, PartyFrozen
 
 
-class DuplicatePartyAccountError(frappe.ValidationError): pass
+class DuplicatePartyAccountError(frappe.ValidationError):
+	pass
+
 
 @frappe.whitelist()
-def get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None,
-	bill_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False, fetch_payment_terms_template=True,
-	party_address=None, company_address=None, shipping_address=None, pos_profile=None):
+def get_party_details(
+	party=None,
+	account=None,
+	party_type="Customer",
+	company=None,
+	posting_date=None,
+	bill_date=None,
+	price_list=None,
+	currency=None,
+	doctype=None,
+	ignore_permissions=False,
+	fetch_payment_terms_template=True,
+	party_address=None,
+	company_address=None,
+	shipping_address=None,
+	pos_profile=None,
+):
 
 	if not party:
 		return {}
 	if not frappe.db.exists(party_type, party):
 		frappe.throw(_("{0}: {1} does not exists").format(party_type, party))
-	return _get_party_details(party, account, party_type,
-		company, posting_date, bill_date, price_list, currency, doctype, ignore_permissions,
-		fetch_payment_terms_template, party_address, company_address, shipping_address, pos_profile)
+	return _get_party_details(
+		party,
+		account,
+		party_type,
+		company,
+		posting_date,
+		bill_date,
+		price_list,
+		currency,
+		doctype,
+		ignore_permissions,
+		fetch_payment_terms_template,
+		party_address,
+		company_address,
+		shipping_address,
+		pos_profile,
+	)
 
-def _get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None,
-	bill_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False,
-	fetch_payment_terms_template=True, party_address=None, company_address=None, shipping_address=None, pos_profile=None):
-	party_details = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, bill_date, doctype))
+
+def _get_party_details(
+	party=None,
+	account=None,
+	party_type="Customer",
+	company=None,
+	posting_date=None,
+	bill_date=None,
+	price_list=None,
+	currency=None,
+	doctype=None,
+	ignore_permissions=False,
+	fetch_payment_terms_template=True,
+	party_address=None,
+	company_address=None,
+	shipping_address=None,
+	pos_profile=None,
+):
+	party_details = frappe._dict(
+		set_account_and_due_date(party, account, party_type, company, posting_date, bill_date, doctype)
+	)
 	party = party_details[party_type.lower()]
 
-	if not ignore_permissions and not (frappe.has_permission(party_type, "read", party) or frappe.has_permission(party_type, "select", party)):
+	if not ignore_permissions and not (
+		frappe.has_permission(party_type, "read", party)
+		or frappe.has_permission(party_type, "select", party)
+	):
 		frappe.throw(_("Not permitted for {0}").format(party), frappe.PermissionError)
 
 	party = frappe.get_doc(party_type, party)
 	currency = party.get("default_currency") or currency or get_company_currency(company)
 
-	party_address, shipping_address = set_address_details(party_details, party, party_type, doctype, company, party_address, company_address, shipping_address)
+	party_address, shipping_address = set_address_details(
+		party_details,
+		party,
+		party_type,
+		doctype,
+		company,
+		party_address,
+		company_address,
+		shipping_address,
+	)
 	set_contact_details(party_details, party, party_type)
 	set_other_values(party_details, party, party_type)
 	set_price_list(party_details, party, party_type, price_list, pos_profile)
 
-	party_details["tax_category"] = get_address_tax_category(party.get("tax_category"),
-		party_address, shipping_address if party_type != "Supplier" else party_address)
+	party_details["tax_category"] = get_address_tax_category(
+		party.get("tax_category"),
+		party_address,
+		shipping_address if party_type != "Supplier" else party_address,
+	)
 
-	tax_template = set_taxes(party.name, party_type, posting_date, company,
-		customer_group=party_details.customer_group, supplier_group=party_details.supplier_group, tax_category=party_details.tax_category,
-		billing_address=party_address, shipping_address=shipping_address)
+	tax_template = set_taxes(
+		party.name,
+		party_type,
+		posting_date,
+		company,
+		customer_group=party_details.customer_group,
+		supplier_group=party_details.supplier_group,
+		tax_category=party_details.tax_category,
+		billing_address=party_address,
+		shipping_address=shipping_address,
+	)
 
 	if tax_template:
-		party_details['taxes_and_charges'] = tax_template
+		party_details["taxes_and_charges"] = tax_template
 
 	if cint(fetch_payment_terms_template):
-		party_details["payment_terms_template"] = get_payment_terms_template(party.name, party_type, company)
+		party_details["payment_terms_template"] = get_payment_terms_template(
+			party.name, party_type, company
+		)
 
 	if not party_details.get("currency"):
 		party_details["currency"] = currency
 
 	# sales team
-	if party_type=="Customer":
-		party_details["sales_team"] = [{
-			"sales_person": d.sales_person,
-			"allocated_percentage": d.allocated_percentage or None,
-			"commission_rate": d.commission_rate
-		} for d in party.get("sales_team")]
+	if party_type == "Customer":
+		party_details["sales_team"] = [
+			{
+				"sales_person": d.sales_person,
+				"allocated_percentage": d.allocated_percentage or None,
+				"commission_rate": d.commission_rate,
+			}
+			for d in party.get("sales_team")
+		]
 
 	# supplier tax withholding category
 	if party_type == "Supplier" and party:
-		party_details["supplier_tds"] = frappe.get_value(party_type, party.name, "tax_withholding_category")
+		party_details["supplier_tds"] = frappe.get_value(
+			party_type, party.name, "tax_withholding_category"
+		)
 
 	return party_details
 
-def set_address_details(party_details, party, party_type, doctype=None, company=None, party_address=None, company_address=None, shipping_address=None):
-	billing_address_field = "customer_address" if party_type == "Lead" \
-		else party_type.lower() + "_address"
-	party_details[billing_address_field] = party_address or get_default_address(party_type, party.name)
+
+def set_address_details(
+	party_details,
+	party,
+	party_type,
+	doctype=None,
+	company=None,
+	party_address=None,
+	company_address=None,
+	shipping_address=None,
+):
+	billing_address_field = (
+		"customer_address" if party_type == "Lead" else party_type.lower() + "_address"
+	)
+	party_details[billing_address_field] = party_address or get_default_address(
+		party_type, party.name
+	)
 	if doctype:
-		party_details.update(get_fetch_values(doctype, billing_address_field, party_details[billing_address_field]))
+		party_details.update(
+			get_fetch_values(doctype, billing_address_field, party_details[billing_address_field])
+		)
 	# address display
 	party_details.address_display = get_address_display(party_details[billing_address_field])
 	# shipping address
 	if party_type in ["Customer", "Lead"]:
-		party_details.shipping_address_name = shipping_address or get_party_shipping_address(party_type, party.name)
+		party_details.shipping_address_name = shipping_address or get_party_shipping_address(
+			party_type, party.name
+		)
 		party_details.shipping_address = get_address_display(party_details["shipping_address_name"])
 		if doctype:
-			party_details.update(get_fetch_values(doctype, 'shipping_address_name', party_details.shipping_address_name))
+			party_details.update(
+				get_fetch_values(doctype, "shipping_address_name", party_details.shipping_address_name)
+			)
 
 	if company_address:
-		party_details.update({'company_address': company_address})
+		party_details.update({"company_address": company_address})
 	else:
 		party_details.update(get_company_address(company))
 
-	if doctype and doctype in ['Delivery Note', 'Sales Invoice', 'Sales Order']:
+	if doctype and doctype in ["Delivery Note", "Sales Invoice", "Sales Order"]:
 		if party_details.company_address:
-			party_details.update(get_fetch_values(doctype, 'company_address', party_details.company_address))
+			party_details.update(
+				get_fetch_values(doctype, "company_address", party_details.company_address)
+			)
 		get_regional_address_details(party_details, doctype, company)
 
 	elif doctype and doctype in ["Purchase Invoice", "Purchase Order", "Purchase Receipt"]:
 		if party_details.company_address:
 			party_details["shipping_address"] = shipping_address or party_details["company_address"]
 			party_details.shipping_address_display = get_address_display(party_details["shipping_address"])
-			party_details.update(get_fetch_values(doctype, 'shipping_address', party_details.shipping_address))
+			party_details.update(
+				get_fetch_values(doctype, "shipping_address", party_details.shipping_address)
+			)
 		get_regional_address_details(party_details, doctype, company)
 
 	return party_details.get(billing_address_field), party_details.shipping_address_name
 
+
 @erpnext.allow_regional
 def get_regional_address_details(party_details, doctype, company):
 	pass
 
+
 def set_contact_details(party_details, party, party_type):
 	party_details.contact_person = get_default_contact(party_type, party.name)
 
 	if not party_details.contact_person:
-		party_details.update({
-			"contact_person": None,
-			"contact_display": None,
-			"contact_email": None,
-			"contact_mobile": None,
-			"contact_phone": None,
-			"contact_designation": None,
-			"contact_department": None
-		})
+		party_details.update(
+			{
+				"contact_person": None,
+				"contact_display": None,
+				"contact_email": None,
+				"contact_mobile": None,
+				"contact_phone": None,
+				"contact_designation": None,
+				"contact_department": None,
+			}
+		)
 	else:
 		party_details.update(get_contact_details(party_details.contact_person))
 
+
 def set_other_values(party_details, party, party_type):
 	# copy
 	if party_type == "Customer":
@@ -159,11 +264,13 @@
 		party_details[f] = party.get(f)
 
 	# fields prepended with default in Customer doctype
-	for f in ['currency'] \
-		+ (['sales_partner', 'commission_rate'] if party_type=="Customer" else []):
+	for f in ["currency"] + (
+		["sales_partner", "commission_rate"] if party_type == "Customer" else []
+	):
 		if party.get("default_" + f):
 			party_details[f] = party.get("default_" + f)
 
+
 def get_default_price_list(party):
 	"""Return default price list for party (Document object)"""
 	if party.get("default_price_list"):
@@ -175,92 +282,103 @@
 
 def set_price_list(party_details, party, party_type, given_price_list, pos=None):
 	# price list
-	price_list = get_permitted_documents('Price List')
+	price_list = get_permitted_documents("Price List")
 
 	# if there is only one permitted document based on user permissions, set it
 	if price_list and len(price_list) == 1:
 		price_list = price_list[0]
-	elif pos and party_type == 'Customer':
-		customer_price_list = frappe.get_value('Customer', party.name, 'default_price_list')
+	elif pos and party_type == "Customer":
+		customer_price_list = frappe.get_value("Customer", party.name, "default_price_list")
 
 		if customer_price_list:
 			price_list = customer_price_list
 		else:
-			pos_price_list = frappe.get_value('POS Profile', pos, 'selling_price_list')
+			pos_price_list = frappe.get_value("POS Profile", pos, "selling_price_list")
 			price_list = pos_price_list or given_price_list
 	else:
 		price_list = get_default_price_list(party) or given_price_list
 
 	if price_list:
-		party_details.price_list_currency = frappe.db.get_value("Price List", price_list, "currency", cache=True)
+		party_details.price_list_currency = frappe.db.get_value(
+			"Price List", price_list, "currency", cache=True
+		)
 
-	party_details["selling_price_list" if party.doctype=="Customer" else "buying_price_list"] = price_list
+	party_details[
+		"selling_price_list" if party.doctype == "Customer" else "buying_price_list"
+	] = price_list
 
 
-def set_account_and_due_date(party, account, party_type, company, posting_date, bill_date, doctype):
+def set_account_and_due_date(
+	party, account, party_type, company, posting_date, bill_date, doctype
+):
 	if doctype not in ["POS Invoice", "Sales Invoice", "Purchase Invoice"]:
 		# not an invoice
-		return {
-			party_type.lower(): party
-		}
+		return {party_type.lower(): party}
 
 	if party:
 		account = get_party_account(party_type, party, company)
 
-	account_fieldname = "debit_to" if party_type=="Customer" else "credit_to"
+	account_fieldname = "debit_to" if party_type == "Customer" else "credit_to"
 	out = {
 		party_type.lower(): party,
-		account_fieldname : account,
-		"due_date": get_due_date(posting_date, party_type, party, company, bill_date)
+		account_fieldname: account,
+		"due_date": get_due_date(posting_date, party_type, party, company, bill_date),
 	}
 
 	return out
 
+
 @frappe.whitelist()
 def get_party_account(party_type, party=None, company=None):
 	"""Returns the account for the given `party`.
-		Will first search in party (Customer / Supplier) record, if not found,
-		will search in group (Customer Group / Supplier Group),
-		finally will return default."""
+	Will first search in party (Customer / Supplier) record, if not found,
+	will search in group (Customer Group / Supplier Group),
+	finally will return default."""
 	if not company:
 		frappe.throw(_("Please select a Company"))
 
-	if not party and party_type in ['Customer', 'Supplier']:
-		default_account_name = "default_receivable_account" \
-			if party_type=="Customer" else "default_payable_account"
+	if not party and party_type in ["Customer", "Supplier"]:
+		default_account_name = (
+			"default_receivable_account" if party_type == "Customer" else "default_payable_account"
+		)
 
-		return frappe.get_cached_value('Company',  company,  default_account_name)
+		return frappe.get_cached_value("Company", company, default_account_name)
 
-	account = frappe.db.get_value("Party Account",
-		{"parenttype": party_type, "parent": party, "company": company}, "account")
+	account = frappe.db.get_value(
+		"Party Account", {"parenttype": party_type, "parent": party, "company": company}, "account"
+	)
 
-	if not account and party_type in ['Customer', 'Supplier']:
-		party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Group"
+	if not account and party_type in ["Customer", "Supplier"]:
+		party_group_doctype = "Customer Group" if party_type == "Customer" else "Supplier Group"
 		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")
+		account = frappe.db.get_value(
+			"Party Account",
+			{"parenttype": party_group_doctype, "parent": group, "company": company},
+			"account",
+		)
 
-	if not account and party_type in ['Customer', 'Supplier']:
-		default_account_name = "default_receivable_account" \
-			if party_type=="Customer" else "default_payable_account"
-		account = frappe.get_cached_value('Company',  company,  default_account_name)
+	if not account and party_type in ["Customer", "Supplier"]:
+		default_account_name = (
+			"default_receivable_account" if party_type == "Customer" else "default_payable_account"
+		)
+		account = frappe.get_cached_value("Company", company, default_account_name)
 
 	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", cache=True)
 		if (account and account_currency != existing_gle_currency) or not account:
-				account = get_party_gle_account(party_type, party, company)
+			account = get_party_gle_account(party_type, party, company)
 
 	return account
 
+
 @frappe.whitelist()
 def get_party_bank_account(party_type, party):
-	return frappe.db.get_value('Bank Account', {
-		'party_type': party_type,
-		'party': party,
-		'is_default': 1
-	})
+	return frappe.db.get_value(
+		"Bank Account", {"party_type": party_type, "party": party, "is_default": 1}
+	)
+
 
 def get_party_account_currency(party_type, party, company):
 	def generator():
@@ -269,27 +387,38 @@
 
 	return frappe.local_cache("party_account_currency", (party_type, party, company), generator)
 
+
 def get_party_gle_currency(party_type, party, company):
 	def generator():
-		existing_gle_currency = frappe.db.sql("""select account_currency from `tabGL Entry`
+		existing_gle_currency = frappe.db.sql(
+			"""select account_currency from `tabGL Entry`
 			where docstatus=1 and company=%(company)s and party_type=%(party_type)s and party=%(party)s
-			limit 1""", { "company": company, "party_type": party_type, "party": party })
+			limit 1""",
+			{"company": company, "party_type": party_type, "party": party},
+		)
 
 		return existing_gle_currency[0][0] if existing_gle_currency else None
 
-	return frappe.local_cache("party_gle_currency", (party_type, party, company), generator,
-		regenerate_if_none=True)
+	return frappe.local_cache(
+		"party_gle_currency", (party_type, party, company), generator, regenerate_if_none=True
+	)
+
 
 def get_party_gle_account(party_type, party, company):
 	def generator():
-		existing_gle_account = frappe.db.sql("""select account from `tabGL Entry`
+		existing_gle_account = frappe.db.sql(
+			"""select account from `tabGL Entry`
 			where docstatus=1 and company=%(company)s and party_type=%(party_type)s and party=%(party)s
-			limit 1""", { "company": company, "party_type": party_type, "party": party })
+			limit 1""",
+			{"company": company, "party_type": party_type, "party": party},
+		)
 
 		return existing_gle_account[0][0] if existing_gle_account else None
 
-	return frappe.local_cache("party_gle_account", (party_type, party, company), generator,
-		regenerate_if_none=True)
+	return frappe.local_cache(
+		"party_gle_account", (party_type, party, company), generator, regenerate_if_none=True
+	)
+
 
 def validate_party_gle_currency(party_type, party, company, party_account_currency=None):
 	"""Validate party account currency with existing GL Entry's currency"""
@@ -299,32 +428,55 @@
 	existing_gle_currency = get_party_gle_currency(party_type, party, company)
 
 	if existing_gle_currency and party_account_currency != existing_gle_currency:
-		frappe.throw(_("{0} {1} has accounting entries in currency {2} for company {3}. Please select a receivable or payable account with currency {2}.")
-			.format(frappe.bold(party_type), frappe.bold(party), frappe.bold(existing_gle_currency), frappe.bold(company)), InvalidAccountCurrency)
+		frappe.throw(
+			_(
+				"{0} {1} has accounting entries in currency {2} for company {3}. Please select a receivable or payable account with currency {2}."
+			).format(
+				frappe.bold(party_type),
+				frappe.bold(party),
+				frappe.bold(existing_gle_currency),
+				frappe.bold(company),
+			),
+			InvalidAccountCurrency,
+		)
+
 
 def validate_party_accounts(doc):
 	from erpnext.controllers.accounts_controller import validate_account_head
+
 	companies = []
 
 	for account in doc.get("accounts"):
 		if account.company in companies:
-			frappe.throw(_("There can only be 1 Account per Company in {0} {1}")
-				.format(doc.doctype, doc.name), DuplicatePartyAccountError)
+			frappe.throw(
+				_("There can only be 1 Account per Company in {0} {1}").format(doc.doctype, doc.name),
+				DuplicatePartyAccountError,
+			)
 		else:
 			companies.append(account.company)
 
-		party_account_currency = frappe.db.get_value("Account", account.account, "account_currency", cache=True)
+		party_account_currency = frappe.db.get_value(
+			"Account", account.account, "account_currency", cache=True
+		)
 		if frappe.db.get_default("Company"):
-			company_default_currency = frappe.get_cached_value('Company',
-				frappe.db.get_default("Company"),  "default_currency")
+			company_default_currency = frappe.get_cached_value(
+				"Company", frappe.db.get_default("Company"), "default_currency"
+			)
 		else:
-			company_default_currency = frappe.db.get_value('Company', account.company, "default_currency")
+			company_default_currency = frappe.db.get_value("Company", account.company, "default_currency")
 
 		validate_party_gle_currency(doc.doctype, doc.name, account.company, party_account_currency)
 
 		if doc.get("default_currency") and party_account_currency and company_default_currency:
-			if doc.default_currency != party_account_currency and doc.default_currency != company_default_currency:
-				frappe.throw(_("Billing currency must be equal to either default company's currency or party account currency"))
+			if (
+				doc.default_currency != party_account_currency
+				and doc.default_currency != company_default_currency
+			):
+				frappe.throw(
+					_(
+						"Billing currency must be equal to either default company's currency or party account currency"
+					)
+				)
 
 		# validate if account is mapped for same company
 		validate_account_head(account.idx, account.account, account.company)
@@ -339,18 +491,23 @@
 		template_name = get_payment_terms_template(party, party_type, company)
 
 		if template_name:
-			due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d")
+			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.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")
+					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
 	if getdate(due_date) < getdate(posting_date):
 		due_date = posting_date
 	return due_date
 
+
 def get_due_date_from_template(template_name, posting_date, bill_date):
 	"""
 	Inspects all `Payment Term`s from the a `Payment Terms Template` and returns the due
@@ -360,40 +517,55 @@
 	"""
 	due_date = getdate(bill_date or posting_date)
 
-	template = frappe.get_doc('Payment Terms Template', template_name)
+	template = frappe.get_doc("Payment Terms Template", template_name)
 
 	for term in template.terms:
-		if term.due_date_based_on == 'Day(s) after invoice date':
+		if term.due_date_based_on == "Day(s) after invoice date":
 			due_date = max(due_date, add_days(due_date, term.credit_days))
-		elif term.due_date_based_on == 'Day(s) after the end of the invoice month':
+		elif term.due_date_based_on == "Day(s) after the end of the invoice month":
 			due_date = max(due_date, add_days(get_last_day(due_date), term.credit_days))
 		else:
 			due_date = max(due_date, add_months(get_last_day(due_date), term.credit_months))
 	return due_date
 
-def validate_due_date(posting_date, due_date, party_type, party, company=None, bill_date=None, template_name=None):
+
+def validate_due_date(
+	posting_date, due_date, party_type, party, company=None, bill_date=None, template_name=None
+):
 	if getdate(due_date) < getdate(posting_date):
 		frappe.throw(_("Due Date cannot be before Posting / Supplier Invoice Date"))
 	else:
-		if not template_name: return
+		if not template_name:
+			return
 
-		default_due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d")
+		default_due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime(
+			"%Y-%m-%d"
+		)
 
 		if not default_due_date:
 			return
 
 		if default_due_date != posting_date and getdate(due_date) > getdate(default_due_date):
-			is_credit_controller = frappe.db.get_single_value("Accounts Settings", "credit_controller") in frappe.get_roles()
+			is_credit_controller = (
+				frappe.db.get_single_value("Accounts Settings", "credit_controller") in frappe.get_roles()
+			)
 			if is_credit_controller:
-				msgprint(_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)")
-					.format(date_diff(due_date, default_due_date)))
+				msgprint(
+					_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)").format(
+						date_diff(due_date, default_due_date)
+					)
+				)
 			else:
-				frappe.throw(_("Due / Reference Date cannot be after {0}")
-					.format(formatdate(default_due_date)))
+				frappe.throw(
+					_("Due / Reference Date cannot be after {0}").format(formatdate(default_due_date))
+				)
+
 
 @frappe.whitelist()
 def get_address_tax_category(tax_category=None, billing_address=None, shipping_address=None):
-	addr_tax_category_from = frappe.db.get_single_value("Accounts Settings", "determine_address_tax_category_from")
+	addr_tax_category_from = frappe.db.get_single_value(
+		"Accounts Settings", "determine_address_tax_category_from"
+	)
 	if addr_tax_category_from == "Shipping Address":
 		if shipping_address:
 			tax_category = frappe.db.get_value("Address", shipping_address, "tax_category") or tax_category
@@ -403,36 +575,48 @@
 
 	return cstr(tax_category)
 
+
 @frappe.whitelist()
-def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_group=None, tax_category=None,
-	billing_address=None, shipping_address=None, use_for_shopping_cart=None):
+def set_taxes(
+	party,
+	party_type,
+	posting_date,
+	company,
+	customer_group=None,
+	supplier_group=None,
+	tax_category=None,
+	billing_address=None,
+	shipping_address=None,
+	use_for_shopping_cart=None,
+):
 	from erpnext.accounts.doctype.tax_rule.tax_rule import get_party_details, get_tax_template
-	args = {
-		party_type.lower(): party,
-		"company": company
-	}
+
+	args = {party_type.lower(): party, "company": company}
 
 	if tax_category:
-		args['tax_category'] = tax_category
+		args["tax_category"] = tax_category
 
 	if customer_group:
-		args['customer_group'] = customer_group
+		args["customer_group"] = customer_group
 
 	if supplier_group:
-		args['supplier_group'] = supplier_group
+		args["supplier_group"] = supplier_group
 
 	if billing_address or shipping_address:
-		args.update(get_party_details(party, party_type, {"billing_address": billing_address, \
-			"shipping_address": shipping_address }))
+		args.update(
+			get_party_details(
+				party, party_type, {"billing_address": billing_address, "shipping_address": shipping_address}
+			)
+		)
 	else:
 		args.update(get_party_details(party, party_type))
 
 	if party_type in ("Customer", "Lead"):
 		args.update({"tax_type": "Sales"})
 
-		if party_type=='Lead':
-			args['customer'] = None
-			del args['lead']
+		if party_type == "Lead":
+			args["customer"] = None
+			del args["lead"]
 	else:
 		args.update({"tax_type": "Purchase"})
 
@@ -447,25 +631,27 @@
 	if party_type not in ("Customer", "Supplier"):
 		return
 	template = None
-	if party_type == 'Customer':
-		customer = frappe.get_cached_value("Customer", party_name,
-			fieldname=['payment_terms', "customer_group"], as_dict=1)
+	if party_type == "Customer":
+		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.get_cached_value("Customer Group",
-				customer.customer_group, 'payment_terms')
+			template = frappe.get_cached_value("Customer Group", customer.customer_group, "payment_terms")
 	else:
-		supplier = frappe.get_cached_value("Supplier", party_name,
-			fieldname=['payment_terms', "supplier_group"], as_dict=1)
+		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.get_cached_value("Supplier Group", supplier.supplier_group, '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')
+		template = frappe.get_cached_value("Company", company, fieldname="payment_terms")
 	return template
 
+
 def validate_party_frozen_disabled(party_type, party_name):
 
 	if frappe.flags.ignore_party_validation:
@@ -477,7 +663,9 @@
 			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_single_value( 'Accounts Settings', '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)
 
@@ -485,99 +673,124 @@
 			if frappe.db.get_value("Employee", party_name, "status") != "Active":
 				frappe.msgprint(_("{0} {1} is not active").format(party_type, party_name), alert=True)
 
+
 def get_timeline_data(doctype, name):
-	'''returns timeline data for the past one year'''
+	"""returns timeline data for the past one year"""
 	from frappe.desk.form.load import get_communication_data
 
 	out = {}
-	fields = 'creation, count(*)'
-	after = add_years(None, -1).strftime('%Y-%m-%d')
-	group_by='group by Date(creation)'
+	fields = "creation, count(*)"
+	after = add_years(None, -1).strftime("%Y-%m-%d")
+	group_by = "group by Date(creation)"
 
-	data = get_communication_data(doctype, name, after=after, group_by='group by creation',
-		fields='C.creation as creation, count(C.name)',as_dict=False)
+	data = get_communication_data(
+		doctype,
+		name,
+		after=after,
+		group_by="group by creation",
+		fields="C.creation as creation, count(C.name)",
+		as_dict=False,
+	)
 
 	# fetch and append data from Activity Log
-	data += frappe.db.sql("""select {fields}
+	data += frappe.db.sql(
+		"""select {fields}
 		from `tabActivity Log`
 		where (reference_doctype=%(doctype)s and reference_name=%(name)s)
 		or (timeline_doctype in (%(doctype)s) and timeline_name=%(name)s)
 		or (reference_doctype in ("Quotation", "Opportunity") and timeline_name=%(name)s)
 		and status!='Success' and creation > {after}
 		{group_by} order by creation desc
-		""".format(fields=fields, group_by=group_by, after=after), {
-			"doctype": doctype,
-			"name": name
-		}, as_dict=False)
+		""".format(
+			fields=fields, group_by=group_by, after=after
+		),
+		{"doctype": doctype, "name": name},
+		as_dict=False,
+	)
 
 	timeline_items = dict(data)
 
 	for date, count in timeline_items.items():
 		timestamp = get_timestamp(date)
-		out.update({ timestamp: count })
+		out.update({timestamp: count})
 
 	return out
 
+
 def get_dashboard_info(party_type, party, loyalty_program=None):
 	current_fiscal_year = get_fiscal_year(nowdate(), as_dict=True)
 
-	doctype = "Sales Invoice" if party_type=="Customer" else "Purchase Invoice"
+	doctype = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice"
 
-	companies = frappe.get_all(doctype, filters={
-		'docstatus': 1,
-		party_type.lower(): party
-	}, distinct=1, fields=['company'])
+	companies = frappe.get_all(
+		doctype, filters={"docstatus": 1, party_type.lower(): party}, distinct=1, fields=["company"]
+	)
 
 	company_wise_info = []
 
-	company_wise_grand_total = frappe.get_all(doctype,
+	company_wise_grand_total = frappe.get_all(
+		doctype,
 		filters={
-			'docstatus': 1,
+			"docstatus": 1,
 			party_type.lower(): party,
-			'posting_date': ('between', [current_fiscal_year.year_start_date, current_fiscal_year.year_end_date])
-			},
-			group_by="company",
-			fields=["company", "sum(grand_total) as grand_total", "sum(base_grand_total) as base_grand_total"]
-		)
+			"posting_date": (
+				"between",
+				[current_fiscal_year.year_start_date, current_fiscal_year.year_end_date],
+			),
+		},
+		group_by="company",
+		fields=[
+			"company",
+			"sum(grand_total) as grand_total",
+			"sum(base_grand_total) as base_grand_total",
+		],
+	)
 
 	loyalty_point_details = []
 
 	if party_type == "Customer":
-		loyalty_point_details = frappe._dict(frappe.get_all("Loyalty Point Entry",
-			filters={
-				'customer': party,
-				'expiry_date': ('>=', getdate()),
+		loyalty_point_details = frappe._dict(
+			frappe.get_all(
+				"Loyalty Point Entry",
+				filters={
+					"customer": party,
+					"expiry_date": (">=", getdate()),
 				},
 				group_by="company",
 				fields=["company", "sum(loyalty_points) as loyalty_points"],
-				as_list =1
-			))
+				as_list=1,
+			)
+		)
 
 	company_wise_billing_this_year = frappe._dict()
 
 	for d in company_wise_grand_total:
 		company_wise_billing_this_year.setdefault(
-			d.company,{
-				"grand_total": d.grand_total,
-				"base_grand_total": d.base_grand_total
-			})
+			d.company, {"grand_total": d.grand_total, "base_grand_total": d.base_grand_total}
+		)
 
-
-	company_wise_total_unpaid = frappe._dict(frappe.db.sql("""
+	company_wise_total_unpaid = frappe._dict(
+		frappe.db.sql(
+			"""
 		select company, sum(debit_in_account_currency) - sum(credit_in_account_currency)
 		from `tabGL Entry`
 		where party_type = %s and party=%s
 		and is_cancelled = 0
-		group by company""", (party_type, party)))
+		group by company""",
+			(party_type, party),
+		)
+	)
 
 	for d in companies:
-		company_default_currency = frappe.db.get_value("Company", d.company, 'default_currency')
+		company_default_currency = frappe.db.get_value("Company", d.company, "default_currency")
 		party_account_currency = get_party_account_currency(party_type, party, d.company)
 
-		if party_account_currency==company_default_currency:
-			billing_this_year = flt(company_wise_billing_this_year.get(d.company,{}).get("base_grand_total"))
+		if party_account_currency == company_default_currency:
+			billing_this_year = flt(
+				company_wise_billing_this_year.get(d.company, {}).get("base_grand_total")
+			)
 		else:
-			billing_this_year = flt(company_wise_billing_this_year.get(d.company,{}).get("grand_total"))
+			billing_this_year = flt(company_wise_billing_this_year.get(d.company, {}).get("grand_total"))
 
 		total_unpaid = flt(company_wise_total_unpaid.get(d.company))
 
@@ -600,6 +813,7 @@
 
 	return company_wise_info
 
+
 def get_party_shipping_address(doctype, name):
 	"""
 	Returns an Address name (best guess) for the given doctype and name for which `address_type == 'Shipping'` is true.
@@ -612,50 +826,59 @@
 	:return: String
 	"""
 	out = frappe.db.sql(
-		'SELECT dl.parent '
-		'from `tabDynamic Link` dl join `tabAddress` ta on dl.parent=ta.name '
-		'where '
-		'dl.link_doctype=%s '
-		'and dl.link_name=%s '
+		"SELECT dl.parent "
+		"from `tabDynamic Link` dl join `tabAddress` ta on dl.parent=ta.name "
+		"where "
+		"dl.link_doctype=%s "
+		"and dl.link_name=%s "
 		'and dl.parenttype="Address" '
-		'and ifnull(ta.disabled, 0) = 0 and'
+		"and ifnull(ta.disabled, 0) = 0 and"
 		'(ta.address_type="Shipping" or ta.is_shipping_address=1) '
-		'order by ta.is_shipping_address desc, ta.address_type desc limit 1',
-		(doctype, name)
+		"order by ta.is_shipping_address desc, ta.address_type desc limit 1",
+		(doctype, name),
 	)
 	if out:
 		return out[0][0]
 	else:
-		return ''
+		return ""
 
-def get_partywise_advanced_payment_amount(party_type, posting_date = None, future_payment=0, company=None):
+
+def get_partywise_advanced_payment_amount(
+	party_type, posting_date=None, future_payment=0, company=None
+):
 	cond = "1=1"
 	if posting_date:
 		if future_payment:
-			cond = "posting_date <= '{0}' OR DATE(creation) <= '{0}' """.format(posting_date)
+			cond = "posting_date <= '{0}' OR DATE(creation) <= '{0}' " "".format(posting_date)
 		else:
 			cond = "posting_date <= '{0}'".format(posting_date)
 
 	if company:
 		cond += "and company = {0}".format(frappe.db.escape(company))
 
-	data = frappe.db.sql(""" SELECT party, sum({0}) as amount
+	data = frappe.db.sql(
+		""" SELECT party, sum({0}) as amount
 		FROM `tabGL Entry`
 		WHERE
 			party_type = %s and against_voucher is null
 			and is_cancelled = 0
-			and {1} GROUP BY party"""
-		.format(("credit") if party_type == "Customer" else "debit", cond) , party_type)
+			and {1} GROUP BY party""".format(
+			("credit") if party_type == "Customer" else "debit", cond
+		),
+		party_type,
+	)
 
 	if data:
 		return frappe._dict(data)
 
+
 def get_default_contact(doctype, name):
 	"""
-		Returns default contact for the given doctype and name.
-		Can be ordered by `contact_type` to either is_primary_contact or is_billing_contact.
+	Returns default contact for the given doctype and name.
+	Can be ordered by `contact_type` to either is_primary_contact or is_billing_contact.
 	"""
-	out = frappe.db.sql("""
+	out = frappe.db.sql(
+		"""
 			SELECT dl.parent, c.is_primary_contact, c.is_billing_contact
 			FROM `tabDynamic Link` dl
 			INNER JOIN tabContact c ON c.name = dl.parent
@@ -664,7 +887,9 @@
 				dl.link_name=%s AND
 				dl.parenttype = "Contact"
 			ORDER BY is_primary_contact DESC, is_billing_contact DESC
-		""", (doctype, name))
+		""",
+		(doctype, name),
+	)
 	if out:
 		try:
 			return out[0][0]
diff --git a/erpnext/accounts/report/account_balance/account_balance.py b/erpnext/accounts/report/account_balance/account_balance.py
index a2c70a4..824a965 100644
--- a/erpnext/accounts/report/account_balance/account_balance.py
+++ b/erpnext/accounts/report/account_balance/account_balance.py
@@ -14,6 +14,7 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -21,7 +22,7 @@
 			"fieldtype": "Link",
 			"fieldname": "account",
 			"options": "Account",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Currency"),
@@ -29,19 +30,20 @@
 			"fieldname": "currency",
 			"options": "Currency",
 			"hidden": 1,
-			"width": 50
+			"width": 50,
 		},
 		{
 			"label": _("Balance"),
 			"fieldtype": "Currency",
 			"fieldname": "balance",
 			"options": "currency",
-			"width": 100
-		}
+			"width": 100,
+		},
 	]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = {}
 
@@ -57,12 +59,14 @@
 
 	return conditions
 
+
 def get_data(filters):
 
 	data = []
 	conditions = get_conditions(filters)
-	accounts = frappe.db.get_all("Account", fields=["name", "account_currency"],
-		filters=conditions, order_by='name')
+	accounts = frappe.db.get_all(
+		"Account", fields=["name", "account_currency"], filters=conditions, order_by="name"
+	)
 
 	for d in accounts:
 		balance = get_balance_on(d.name, date=filters.report_date)
diff --git a/erpnext/accounts/report/account_balance/test_account_balance.py b/erpnext/accounts/report/account_balance/test_account_balance.py
index 73370e4..13fa05d 100644
--- a/erpnext/accounts/report/account_balance/test_account_balance.py
+++ b/erpnext/accounts/report/account_balance/test_account_balance.py
@@ -13,9 +13,9 @@
 		frappe.db.sql("delete from `tabGL Entry` where company='_Test Company 2'")
 
 		filters = {
-			'company': '_Test Company 2',
-			'report_date': getdate(),
-			'root_type': 'Income',
+			"company": "_Test Company 2",
+			"report_date": getdate(),
+			"root_type": "Income",
 		}
 
 		make_sales_invoice()
@@ -24,42 +24,45 @@
 
 		expected_data = [
 			{
-				"account": 'Direct Income - _TC2',
-				"currency": 'EUR',
+				"account": "Direct Income - _TC2",
+				"currency": "EUR",
 				"balance": -100.0,
 			},
 			{
-				"account": 'Income - _TC2',
-				"currency": 'EUR',
+				"account": "Income - _TC2",
+				"currency": "EUR",
 				"balance": -100.0,
 			},
 			{
-				"account": 'Indirect Income - _TC2',
-				"currency": 'EUR',
+				"account": "Indirect Income - _TC2",
+				"currency": "EUR",
 				"balance": 0.0,
 			},
 			{
-				"account": 'Sales - _TC2',
-				"currency": 'EUR',
+				"account": "Sales - _TC2",
+				"currency": "EUR",
 				"balance": -100.0,
 			},
 			{
-				"account": 'Service - _TC2',
-				"currency": 'EUR',
+				"account": "Service - _TC2",
+				"currency": "EUR",
 				"balance": 0.0,
-			}
+			},
 		]
 
 		self.assertEqual(expected_data, report[1])
 
+
 def make_sales_invoice():
 	frappe.set_user("Administrator")
 
-	create_sales_invoice(company="_Test Company 2",
-		customer = '_Test Customer 2',
-		currency = 'EUR',
-		warehouse = 'Finished Goods - _TC2',
-		debit_to = 'Debtors - _TC2',
-		income_account = 'Sales - _TC2',
-		expense_account = 'Cost of Goods Sold - _TC2',
-		cost_center = 'Main - _TC2')
+	create_sales_invoice(
+		company="_Test Company 2",
+		customer="_Test Customer 2",
+		currency="EUR",
+		warehouse="Finished Goods - _TC2",
+		debit_to="Debtors - _TC2",
+		income_account="Sales - _TC2",
+		expense_account="Cost of Goods Sold - _TC2",
+		cost_center="Main - _TC2",
+	)
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index a990f23..7bf9539 100755
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -29,6 +29,7 @@
 #  9. Report amounts are in "Party Currency" if party is selected, or company currency for multi-party
 # 10. This reports is based on all GL Entries that are made against account_type "Receivable" or "Payable"
 
+
 def execute(filters=None):
 	args = {
 		"party_type": "Customer",
@@ -36,18 +37,23 @@
 	}
 	return ReceivablePayableReport(filters).run(args)
 
+
 class ReceivablePayableReport(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
 		self.filters.report_date = getdate(self.filters.report_date or nowdate())
-		self.age_as_on = getdate(nowdate()) \
-			if self.filters.report_date > getdate(nowdate()) \
+		self.age_as_on = (
+			getdate(nowdate())
+			if self.filters.report_date > getdate(nowdate())
 			else self.filters.report_date
+		)
 
 	def run(self, args):
 		self.filters.update(args)
 		self.set_defaults()
-		self.party_naming_by = frappe.db.get_value(args.get("naming_by")[0], None, args.get("naming_by")[1])
+		self.party_naming_by = frappe.db.get_value(
+			args.get("naming_by")[0], None, args.get("naming_by")[1]
+		)
 		self.get_columns()
 		self.get_data()
 		self.get_chart_data()
@@ -55,8 +61,10 @@
 
 	def set_defaults(self):
 		if not self.filters.get("company"):
-			self.filters.company = frappe.db.get_single_value('Global Defaults', 'default_company')
-		self.company_currency = frappe.get_cached_value('Company',  self.filters.get("company"), "default_currency")
+			self.filters.company = frappe.db.get_single_value("Global Defaults", "default_company")
+		self.company_currency = frappe.get_cached_value(
+			"Company", self.filters.get("company"), "default_currency"
+		)
 		self.currency_precision = get_currency_precision() or 2
 		self.dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
 		self.party_type = self.filters.party_type
@@ -64,8 +72,8 @@
 		self.invoices = set()
 		self.skip_total_row = 0
 
-		if self.filters.get('group_by_party'):
-			self.previous_party=''
+		if self.filters.get("group_by_party"):
+			self.previous_party = ""
 			self.total_row_map = {}
 			self.skip_total_row = 1
 
@@ -73,7 +81,7 @@
 		self.get_gl_entries()
 		self.get_sales_invoices_or_customers_based_on_sales_person()
 		self.voucher_balance = OrderedDict()
-		self.init_voucher_balance() # invoiced, paid, credit_note, outstanding
+		self.init_voucher_balance()  # invoiced, paid, credit_note, outstanding
 
 		# Build delivery note map against all sales invoices
 		self.build_delivery_note_map()
@@ -100,64 +108,72 @@
 			key = (gle.voucher_type, gle.voucher_no, gle.party)
 			if not key in self.voucher_balance:
 				self.voucher_balance[key] = frappe._dict(
-					voucher_type = gle.voucher_type,
-					voucher_no = gle.voucher_no,
-					party = gle.party,
-					posting_date = gle.posting_date,
-					account_currency = gle.account_currency,
-					remarks = gle.remarks if self.filters.get("show_remarks") else None,
-					invoiced = 0.0,
-					paid = 0.0,
-					credit_note = 0.0,
-					outstanding = 0.0,
-					invoiced_in_account_currency = 0.0,
-					paid_in_account_currency = 0.0,
-					credit_note_in_account_currency = 0.0,
-					outstanding_in_account_currency = 0.0
+					voucher_type=gle.voucher_type,
+					voucher_no=gle.voucher_no,
+					party=gle.party,
+					posting_date=gle.posting_date,
+					account_currency=gle.account_currency,
+					remarks=gle.remarks if self.filters.get("show_remarks") else None,
+					invoiced=0.0,
+					paid=0.0,
+					credit_note=0.0,
+					outstanding=0.0,
+					invoiced_in_account_currency=0.0,
+					paid_in_account_currency=0.0,
+					credit_note_in_account_currency=0.0,
+					outstanding_in_account_currency=0.0,
 				)
 			self.get_invoices(gle)
 
-			if self.filters.get('group_by_party'):
+			if self.filters.get("group_by_party"):
 				self.init_subtotal_row(gle.party)
 
-		if self.filters.get('group_by_party'):
-			self.init_subtotal_row('Total')
+		if self.filters.get("group_by_party"):
+			self.init_subtotal_row("Total")
 
 	def get_invoices(self, gle):
-		if gle.voucher_type in ('Sales Invoice', 'Purchase Invoice'):
+		if gle.voucher_type in ("Sales Invoice", "Purchase Invoice"):
 			if self.filters.get("sales_person"):
-				if gle.voucher_no in self.sales_person_records.get("Sales Invoice", []) \
-					or gle.party in self.sales_person_records.get("Customer", []):
-						self.invoices.add(gle.voucher_no)
+				if gle.voucher_no in self.sales_person_records.get(
+					"Sales Invoice", []
+				) or gle.party in self.sales_person_records.get("Customer", []):
+					self.invoices.add(gle.voucher_no)
 			else:
 				self.invoices.add(gle.voucher_no)
 
 	def init_subtotal_row(self, party):
 		if not self.total_row_map.get(party):
-			self.total_row_map.setdefault(party, {
-				'party': party,
-				'bold': 1
-			})
+			self.total_row_map.setdefault(party, {"party": party, "bold": 1})
 
 			for field in self.get_currency_fields():
 				self.total_row_map[party][field] = 0.0
 
 	def get_currency_fields(self):
-		return ['invoiced', 'paid', 'credit_note', 'outstanding', 'range1',
-			'range2', 'range3', 'range4', 'range5']
+		return [
+			"invoiced",
+			"paid",
+			"credit_note",
+			"outstanding",
+			"range1",
+			"range2",
+			"range3",
+			"range4",
+			"range5",
+		]
 
 	def update_voucher_balance(self, gle):
 		# get the row where this balance needs to be updated
 		# if its a payment, it will return the linked invoice or will be considered as advance
 		row = self.get_voucher_balance(gle)
-		if not row: return
+		if not row:
+			return
 		# gle_balance will be the total "debit - credit" for receivable type reports and
 		# and vice-versa for payable type reports
 		gle_balance = self.get_gle_balance(gle)
 		gle_balance_in_account_currency = self.get_gle_balance_in_account_currency(gle)
 
 		if gle_balance > 0:
-			if gle.voucher_type in ('Journal Entry', 'Payment Entry') and gle.against_voucher:
+			if gle.voucher_type in ("Journal Entry", "Payment Entry") and gle.against_voucher:
 				# debit against sales / purchase invoice
 				row.paid -= gle_balance
 				row.paid_in_account_currency -= gle_balance_in_account_currency
@@ -177,7 +193,7 @@
 				row.paid_in_account_currency -= gle_balance_in_account_currency
 
 		if gle.cost_center:
-			row.cost_center =  str(gle.cost_center)
+			row.cost_center = str(gle.cost_center)
 
 	def update_sub_total_row(self, row, party):
 		total_row = self.total_row_map.get(party)
@@ -191,14 +207,16 @@
 		if sub_total_row:
 			self.data.append(sub_total_row)
 			self.data.append({})
-			self.update_sub_total_row(sub_total_row, 'Total')
+			self.update_sub_total_row(sub_total_row, "Total")
 
 	def get_voucher_balance(self, gle):
 		if self.filters.get("sales_person"):
 			against_voucher = gle.against_voucher or gle.voucher_no
-			if not (gle.party in self.sales_person_records.get("Customer", []) or \
-				against_voucher in self.sales_person_records.get("Sales Invoice", [])):
-					return
+			if not (
+				gle.party in self.sales_person_records.get("Customer", [])
+				or against_voucher in self.sales_person_records.get("Sales Invoice", [])
+			):
+				return
 
 		voucher_balance = None
 		if gle.against_voucher:
@@ -208,13 +226,15 @@
 			# If payment is made against credit note
 			# and credit note is made against a Sales Invoice
 			# then consider the payment against original sales invoice.
-			if gle.against_voucher_type in ('Sales Invoice', 'Purchase Invoice'):
+			if gle.against_voucher_type in ("Sales Invoice", "Purchase Invoice"):
 				if gle.against_voucher in self.return_entries:
 					return_against = self.return_entries.get(gle.against_voucher)
 					if return_against:
 						against_voucher = return_against
 
-			voucher_balance = self.voucher_balance.get((gle.against_voucher_type, against_voucher, gle.party))
+			voucher_balance = self.voucher_balance.get(
+				(gle.against_voucher_type, against_voucher, gle.party)
+			)
 
 		if not voucher_balance:
 			# no invoice, this is an invoice / stand-alone payment / credit note
@@ -227,13 +247,18 @@
 		# as we can use this to filter out invoices without outstanding
 		for key, row in self.voucher_balance.items():
 			row.outstanding = flt(row.invoiced - row.paid - row.credit_note, self.currency_precision)
-			row.outstanding_in_account_currency = flt(row.invoiced_in_account_currency - row.paid_in_account_currency - \
-				row.credit_note_in_account_currency, self.currency_precision)
+			row.outstanding_in_account_currency = flt(
+				row.invoiced_in_account_currency
+				- row.paid_in_account_currency
+				- row.credit_note_in_account_currency,
+				self.currency_precision,
+			)
 
 			row.invoice_grand_total = row.invoiced
 
-			if (abs(row.outstanding) > 1.0/10 ** self.currency_precision) and \
-				(abs(row.outstanding_in_account_currency) > 1.0/10 ** self.currency_precision):
+			if (abs(row.outstanding) > 1.0 / 10**self.currency_precision) and (
+				abs(row.outstanding_in_account_currency) > 1.0 / 10**self.currency_precision
+			):
 				# non-zero oustanding, we must consider this row
 
 				if self.is_invoice(row) and self.filters.based_on_payment_terms:
@@ -254,10 +279,10 @@
 				else:
 					self.append_row(row)
 
-		if self.filters.get('group_by_party'):
+		if self.filters.get("group_by_party"):
 			self.append_subtotal_row(self.previous_party)
 			if self.data:
-				self.data.append(self.total_row_map.get('Total'))
+				self.data.append(self.total_row_map.get("Total"))
 
 	def append_row(self, row):
 		self.allocate_future_payments(row)
@@ -265,7 +290,7 @@
 		self.set_party_details(row)
 		self.set_ageing(row)
 
-		if self.filters.get('group_by_party'):
+		if self.filters.get("group_by_party"):
 			self.update_sub_total_row(row, row.party)
 			if self.previous_party and (self.previous_party != row.party):
 				self.append_subtotal_row(self.previous_party)
@@ -279,39 +304,49 @@
 			invoice_details.pop("due_date", None)
 		row.update(invoice_details)
 
-		if row.voucher_type == 'Sales Invoice':
+		if row.voucher_type == "Sales Invoice":
 			if self.filters.show_delivery_notes:
 				self.set_delivery_notes(row)
 
 			if self.filters.show_sales_person and row.sales_team:
 				row.sales_person = ", ".join(row.sales_team)
-				del row['sales_team']
+				del row["sales_team"]
 
 	def set_delivery_notes(self, row):
 		delivery_notes = self.delivery_notes.get(row.voucher_no, [])
 		if delivery_notes:
-			row.delivery_notes = ', '.join(delivery_notes)
+			row.delivery_notes = ", ".join(delivery_notes)
 
 	def build_delivery_note_map(self):
 		if self.invoices and self.filters.show_delivery_notes:
 			self.delivery_notes = frappe._dict()
 
 			# delivery note link inside sales invoice
-			si_against_dn = frappe.db.sql("""
+			si_against_dn = frappe.db.sql(
+				"""
 				select parent, delivery_note
 				from `tabSales Invoice Item`
 				where docstatus=1 and parent in (%s)
-			""" % (','.join(['%s'] * len(self.invoices))), tuple(self.invoices), as_dict=1)
+			"""
+				% (",".join(["%s"] * len(self.invoices))),
+				tuple(self.invoices),
+				as_dict=1,
+			)
 
 			for d in si_against_dn:
 				if d.delivery_note:
 					self.delivery_notes.setdefault(d.parent, set()).add(d.delivery_note)
 
-			dn_against_si = frappe.db.sql("""
+			dn_against_si = frappe.db.sql(
+				"""
 				select distinct parent, against_sales_invoice
 				from `tabDelivery Note Item`
 				where against_sales_invoice in (%s)
-			""" % (','.join(['%s'] * len(self.invoices))), tuple(self.invoices) , as_dict=1)
+			"""
+				% (",".join(["%s"] * len(self.invoices))),
+				tuple(self.invoices),
+				as_dict=1,
+			)
 
 			for d in dn_against_si:
 				self.delivery_notes.setdefault(d.against_sales_invoice, set()).add(d.parent)
@@ -319,39 +354,55 @@
 	def get_invoice_details(self):
 		self.invoice_details = frappe._dict()
 		if self.party_type == "Customer":
-			si_list = frappe.db.sql("""
+			si_list = frappe.db.sql(
+				"""
 				select name, due_date, po_no
 				from `tabSales Invoice`
 				where posting_date <= %s
-			""",self.filters.report_date, as_dict=1)
+			""",
+				self.filters.report_date,
+				as_dict=1,
+			)
 			for d in si_list:
 				self.invoice_details.setdefault(d.name, d)
 
 			# Get Sales Team
 			if self.filters.show_sales_person:
-				sales_team = frappe.db.sql("""
+				sales_team = frappe.db.sql(
+					"""
 					select parent, sales_person
 					from `tabSales Team`
 					where parenttype = 'Sales Invoice'
-				""", as_dict=1)
+				""",
+					as_dict=1,
+				)
 				for d in sales_team:
-					self.invoice_details.setdefault(d.parent, {})\
-						.setdefault('sales_team', []).append(d.sales_person)
+					self.invoice_details.setdefault(d.parent, {}).setdefault("sales_team", []).append(
+						d.sales_person
+					)
 
 		if self.party_type == "Supplier":
-			for pi in frappe.db.sql("""
+			for pi in frappe.db.sql(
+				"""
 				select name, due_date, bill_no, bill_date
 				from `tabPurchase Invoice`
 				where posting_date <= %s
-			""", self.filters.report_date, as_dict=1):
+			""",
+				self.filters.report_date,
+				as_dict=1,
+			):
 				self.invoice_details.setdefault(pi.name, pi)
 
 		# Invoices booked via Journal Entries
-		journal_entries = frappe.db.sql("""
+		journal_entries = frappe.db.sql(
+			"""
 			select name, due_date, bill_no, bill_date
 			from `tabJournal Entry`
 			where posting_date <= %s
-		""", self.filters.report_date, as_dict=1)
+		""",
+			self.filters.report_date,
+			as_dict=1,
+		)
 
 		for je in journal_entries:
 			if je.bill_no:
@@ -372,17 +423,18 @@
 
 			# update "paid" and "oustanding" for this term
 			if not term.paid:
-				self.allocate_closing_to_term(row, term, 'paid')
+				self.allocate_closing_to_term(row, term, "paid")
 
 			# update "credit_note" and "oustanding" for this term
 			if term.outstanding:
-				self.allocate_closing_to_term(row, term, 'credit_note')
+				self.allocate_closing_to_term(row, term, "credit_note")
 
-		row.payment_terms = sorted(row.payment_terms, key=lambda x: x['due_date'])
+		row.payment_terms = sorted(row.payment_terms, key=lambda x: x["due_date"])
 
 	def get_payment_terms(self, row):
 		# build payment_terms for row
-		payment_terms_details = frappe.db.sql("""
+		payment_terms_details = frappe.db.sql(
+			"""
 			select
 				si.name, si.party_account_currency, si.currency, si.conversion_rate,
 				ps.due_date, ps.payment_term, ps.payment_amount, ps.description, ps.paid_amount, ps.discounted_amount
@@ -391,8 +443,12 @@
 				si.name = ps.parent and
 				si.name = %s
 			order by ps.paid_amount desc, due_date
-		""".format(row.voucher_type), row.voucher_no, as_dict = 1)
-
+		""".format(
+				row.voucher_type
+			),
+			row.voucher_no,
+			as_dict=1,
+		)
 
 		original_row = frappe._dict(row)
 		row.payment_terms = []
@@ -406,23 +462,29 @@
 			self.append_payment_term(row, d, term)
 
 	def append_payment_term(self, row, d, term):
-		if (self.filters.get("customer") or self.filters.get("supplier")) and d.currency == d.party_account_currency:
+		if (
+			self.filters.get("customer") or self.filters.get("supplier")
+		) and d.currency == d.party_account_currency:
 			invoiced = d.payment_amount
 		else:
 			invoiced = flt(flt(d.payment_amount) * flt(d.conversion_rate), self.currency_precision)
 
-		row.payment_terms.append(term.update({
-			"due_date": d.due_date,
-			"invoiced": invoiced,
-			"invoice_grand_total": row.invoiced,
-			"payment_term": d.description or d.payment_term,
-			"paid": d.paid_amount + d.discounted_amount,
-			"credit_note": 0.0,
-			"outstanding": invoiced - d.paid_amount - d.discounted_amount
-		}))
+		row.payment_terms.append(
+			term.update(
+				{
+					"due_date": d.due_date,
+					"invoiced": invoiced,
+					"invoice_grand_total": row.invoiced,
+					"payment_term": d.description or d.payment_term,
+					"paid": d.paid_amount + d.discounted_amount,
+					"credit_note": 0.0,
+					"outstanding": invoiced - d.paid_amount - d.discounted_amount,
+				}
+			)
+		)
 
 		if d.paid_amount:
-			row['paid'] -= d.paid_amount + d.discounted_amount
+			row["paid"] -= d.paid_amount + d.discounted_amount
 
 	def allocate_closing_to_term(self, row, term, key):
 		if row[key]:
@@ -437,7 +499,7 @@
 	def allocate_extra_payments_or_credits(self, row):
 		# allocate extra payments / credits
 		additional_row = None
-		for key in ('paid', 'credit_note'):
+		for key in ("paid", "credit_note"):
 			if row[key] > 0:
 				if not additional_row:
 					additional_row = frappe._dict(row)
@@ -445,7 +507,9 @@
 				additional_row[key] = row[key]
 
 		if additional_row:
-			additional_row.outstanding = additional_row.invoiced - additional_row.paid - additional_row.credit_note
+			additional_row.outstanding = (
+				additional_row.invoiced - additional_row.paid - additional_row.credit_note
+			)
 			self.append_row(additional_row)
 
 	def get_future_payments(self):
@@ -459,7 +523,8 @@
 						self.future_payments.setdefault((d.invoice_no, d.party), []).append(d)
 
 	def get_future_payments_from_payment_entry(self):
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select
 				ref.reference_name as invoice_no,
 				payment_entry.party,
@@ -475,16 +540,23 @@
 				payment_entry.docstatus < 2
 				and payment_entry.posting_date > %s
 				and payment_entry.party_type = %s
-			""", (self.filters.report_date, self.party_type), as_dict=1)
+			""",
+			(self.filters.report_date, self.party_type),
+			as_dict=1,
+		)
 
 	def get_future_payments_from_journal_entry(self):
-		if self.filters.get('party'):
-			amount_field = ("jea.debit_in_account_currency - jea.credit_in_account_currency"
-				if self.party_type == 'Supplier' else "jea.credit_in_account_currency - jea.debit_in_account_currency")
+		if self.filters.get("party"):
+			amount_field = (
+				"jea.debit_in_account_currency - jea.credit_in_account_currency"
+				if self.party_type == "Supplier"
+				else "jea.credit_in_account_currency - jea.debit_in_account_currency"
+			)
 		else:
-			amount_field = ("jea.debit - " if self.party_type == 'Supplier' else "jea.credit")
+			amount_field = "jea.debit - " if self.party_type == "Supplier" else "jea.credit"
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select
 				jea.reference_name as invoice_no,
 				jea.party,
@@ -503,7 +575,12 @@
 				and jea.reference_name is not null and jea.reference_name != ''
 			group by je.name, jea.reference_name
 			having future_amount > 0
-			""".format(amount_field), (self.filters.report_date, self.party_type), as_dict=1)
+			""".format(
+				amount_field
+			),
+			(self.filters.report_date, self.party_type),
+			as_dict=1,
+		)
 
 	def allocate_future_payments(self, row):
 		# future payments are captured in additional columns
@@ -525,22 +602,21 @@
 					future.future_amount = 0
 					row.remaining_balance = row.outstanding - row.future_amount
 
-				row.setdefault('future_ref', []).append(cstr(future.future_ref) + '/' + cstr(future.future_date))
+				row.setdefault("future_ref", []).append(
+					cstr(future.future_ref) + "/" + cstr(future.future_date)
+				)
 
 		if row.future_ref:
-			row.future_ref = ', '.join(row.future_ref)
+			row.future_ref = ", ".join(row.future_ref)
 
 	def get_return_entries(self):
 		doctype = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
-		filters={
-			'is_return': 1,
-			'docstatus': 1
-		}
+		filters = {"is_return": 1, "docstatus": 1}
 		party_field = scrub(self.filters.party_type)
 		if self.filters.get(party_field):
 			filters.update({party_field: self.filters.get(party_field)})
 		self.return_entries = frappe._dict(
-			frappe.get_all(doctype, filters, ['name', 'return_against'], as_list=1)
+			frappe.get_all(doctype, filters, ["name", "return_against"], as_list=1)
 		)
 
 	def set_ageing(self, row):
@@ -571,16 +647,26 @@
 		row.age = (getdate(self.age_as_on) - getdate(entry_date)).days or 0
 		index = None
 
-		if not (self.filters.range1 and self.filters.range2 and self.filters.range3 and self.filters.range4):
-			self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4 = 30, 60, 90, 120
+		if not (
+			self.filters.range1 and self.filters.range2 and self.filters.range3 and self.filters.range4
+		):
+			self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4 = (
+				30,
+				60,
+				90,
+				120,
+			)
 
-		for i, days in enumerate([self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4]):
+		for i, days in enumerate(
+			[self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4]
+		):
 			if cint(row.age) <= cint(days):
 				index = i
 				break
 
-		if index is None: index = 4
-		row['range' + str(index+1)] = row.outstanding
+		if index is None:
+			index = 4
+		row["range" + str(index + 1)] = row.outstanding
 
 	def get_gl_entries(self):
 		# get all the GL entries filtered by the given filters
@@ -605,7 +691,8 @@
 
 		remarks = ", remarks" if self.filters.get("show_remarks") else ""
 
-		self.gl_entries = frappe.db.sql("""
+		self.gl_entries = frappe.db.sql(
+			"""
 			select
 				name, posting_date, account, party_type, party, voucher_type, voucher_no, cost_center,
 				against_voucher_type, against_voucher, account_currency, {0}, {1} {remarks}
@@ -616,20 +703,27 @@
 				and is_cancelled = 0
 				and party_type=%s
 				and (party is not null and party != '')
-				{2} {3} {4}"""
-			.format(select_fields, doc_currency_fields, date_condition, conditions, order_by, remarks=remarks), values, as_dict=True)
+				{2} {3} {4}""".format(
+				select_fields, doc_currency_fields, date_condition, conditions, order_by, remarks=remarks
+			),
+			values,
+			as_dict=True,
+		)
 
 	def get_sales_invoices_or_customers_based_on_sales_person(self):
 		if self.filters.get("sales_person"):
-			lft, rgt = frappe.db.get_value("Sales Person",
-				self.filters.get("sales_person"), ["lft", "rgt"])
+			lft, rgt = frappe.db.get_value("Sales Person", self.filters.get("sales_person"), ["lft", "rgt"])
 
-			records = frappe.db.sql("""
+			records = frappe.db.sql(
+				"""
 				select distinct parent, parenttype
 				from `tabSales Team` steam
 				where parenttype in ('Customer', 'Sales Invoice')
 					and exists(select name from `tabSales Person` where lft >= %s and rgt <= %s and name = steam.sales_person)
-			""", (lft, rgt), as_dict=1)
+			""",
+				(lft, rgt),
+				as_dict=1,
+			)
 
 			self.sales_person_records = frappe._dict()
 			for d in records:
@@ -642,10 +736,10 @@
 
 		self.add_common_filters(conditions, values, party_type_field)
 
-		if party_type_field=="customer":
+		if party_type_field == "customer":
 			self.add_customer_filters(conditions, values)
 
-		elif party_type_field=="supplier":
+		elif party_type_field == "supplier":
 			self.add_supplier_filters(conditions, values)
 
 		if self.filters.cost_center:
@@ -656,13 +750,16 @@
 
 	def get_cost_center_conditions(self, conditions):
 		lft, rgt = frappe.db.get_value("Cost Center", self.filters.cost_center, ["lft", "rgt"])
-		cost_center_list = [center.name for center in frappe.get_list("Cost Center", filters = {'lft': (">=", lft), 'rgt': ("<=", rgt)})]
+		cost_center_list = [
+			center.name
+			for center in frappe.get_list("Cost Center", filters={"lft": (">=", lft), "rgt": ("<=", rgt)})
+		]
 
 		cost_center_string = '", "'.join(cost_center_list)
 		conditions.append('cost_center in ("{0}")'.format(cost_center_string))
 
 	def get_order_by_condition(self):
-		if self.filters.get('group_by_party'):
+		if self.filters.get("group_by_party"):
 			return "order by party, posting_date"
 		else:
 			return "order by posting_date, party"
@@ -682,19 +779,23 @@
 
 		# get GL with "receivable" or "payable" account_type
 		account_type = "Receivable" if self.party_type == "Customer" else "Payable"
-		accounts = [d.name for d in frappe.get_all("Account",
-			filters={"account_type": account_type, "company": self.filters.company})]
+		accounts = [
+			d.name
+			for d in frappe.get_all(
+				"Account", filters={"account_type": account_type, "company": self.filters.company}
+			)
+		]
 
 		if accounts:
-			conditions.append("account in (%s)" % ','.join(['%s'] *len(accounts)))
+			conditions.append("account in (%s)" % ",".join(["%s"] * len(accounts)))
 			values += accounts
 
 	def add_customer_filters(self, conditions, values):
 		if self.filters.get("customer_group"):
-			conditions.append(self.get_hierarchical_filters('Customer Group', 'customer_group'))
+			conditions.append(self.get_hierarchical_filters("Customer Group", "customer_group"))
 
 		if self.filters.get("territory"):
-			conditions.append(self.get_hierarchical_filters('Territory', 'territory'))
+			conditions.append(self.get_hierarchical_filters("Territory", "territory"))
 
 		if self.filters.get("payment_terms_template"):
 			conditions.append("party in (select name from tabCustomer where payment_terms=%s)")
@@ -706,8 +807,10 @@
 
 	def add_supplier_filters(self, conditions, values):
 		if self.filters.get("supplier_group"):
-			conditions.append("""party in (select name from tabSupplier
-				where supplier_group=%s)""")
+			conditions.append(
+				"""party in (select name from tabSupplier
+				where supplier_group=%s)"""
+			)
 			values.append(self.filters.get("supplier_group"))
 
 		if self.filters.get("payment_terms_template"):
@@ -720,7 +823,8 @@
 		return """party in (select name from tabCustomer
 			where exists(select name from `tab{doctype}` where lft >= {lft} and rgt <= {rgt}
 				and name=tabCustomer.{key}))""".format(
-					doctype=doctype, lft=lft, rgt=rgt, key=key)
+			doctype=doctype, lft=lft, rgt=rgt, key=key
+		)
 
 	def add_accounting_dimensions_filters(self, conditions, values):
 		accounting_dimensions = get_accounting_dimensions(as_list=False)
@@ -728,9 +832,10 @@
 		if accounting_dimensions:
 			for dimension in accounting_dimensions:
 				if self.filters.get(dimension.fieldname):
-					if frappe.get_cached_value('DocType', dimension.document_type, 'is_tree'):
-						self.filters[dimension.fieldname] = get_dimension_with_children(dimension.document_type,
-							self.filters.get(dimension.fieldname))
+					if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"):
+						self.filters[dimension.fieldname] = get_dimension_with_children(
+							dimension.document_type, self.filters.get(dimension.fieldname)
+						)
 					conditions.append("{0} in %s".format(dimension.fieldname))
 					values.append(tuple(self.filters.get(dimension.fieldname)))
 
@@ -740,123 +845,168 @@
 
 	def get_gle_balance_in_account_currency(self, gle):
 		# get the balance of the GL (debit - credit) or reverse balance based on report type
-		return gle.get(self.dr_or_cr + '_in_account_currency') - self.get_reverse_balance_in_account_currency(gle)
+		return gle.get(
+			self.dr_or_cr + "_in_account_currency"
+		) - self.get_reverse_balance_in_account_currency(gle)
 
 	def get_reverse_balance_in_account_currency(self, gle):
-		return gle.get('debit_in_account_currency' if self.dr_or_cr=='credit' else 'credit_in_account_currency')
+		return gle.get(
+			"debit_in_account_currency" if self.dr_or_cr == "credit" else "credit_in_account_currency"
+		)
 
 	def get_reverse_balance(self, gle):
 		# get "credit" balance if report type is "debit" and vice versa
-		return gle.get('debit' if self.dr_or_cr=='credit' else 'credit')
+		return gle.get("debit" if self.dr_or_cr == "credit" else "credit")
 
 	def is_invoice(self, gle):
-		if gle.voucher_type in ('Sales Invoice', 'Purchase Invoice'):
+		if gle.voucher_type in ("Sales Invoice", "Purchase Invoice"):
 			return True
 
 	def get_party_details(self, party):
 		if not party in self.party_details:
-			if self.party_type == 'Customer':
-				self.party_details[party] = frappe.db.get_value('Customer', party, ['customer_name',
-					'territory', 'customer_group', 'customer_primary_contact'], as_dict=True)
+			if self.party_type == "Customer":
+				self.party_details[party] = frappe.db.get_value(
+					"Customer",
+					party,
+					["customer_name", "territory", "customer_group", "customer_primary_contact"],
+					as_dict=True,
+				)
 			else:
-				self.party_details[party] = frappe.db.get_value('Supplier', party, ['supplier_name',
-					'supplier_group'], as_dict=True)
+				self.party_details[party] = frappe.db.get_value(
+					"Supplier", party, ["supplier_name", "supplier_group"], as_dict=True
+				)
 
 		return self.party_details[party]
 
-
 	def get_columns(self):
 		self.columns = []
-		self.add_column('Posting Date', fieldtype='Date')
-		self.add_column(label=_(self.party_type), fieldname='party',
-			fieldtype='Link', options=self.party_type, width=180)
+		self.add_column("Posting Date", fieldtype="Date")
+		self.add_column(
+			label=_(self.party_type),
+			fieldname="party",
+			fieldtype="Link",
+			options=self.party_type,
+			width=180,
+		)
 
 		if self.party_naming_by == "Naming Series":
-			self.add_column(_('{0} Name').format(self.party_type),
-				fieldname = scrub(self.party_type) + '_name', fieldtype='Data')
+			self.add_column(
+				_("{0} Name").format(self.party_type),
+				fieldname=scrub(self.party_type) + "_name",
+				fieldtype="Data",
+			)
 
-		if self.party_type == 'Customer':
-			self.add_column(_("Customer Contact"), fieldname='customer_primary_contact',
-				fieldtype='Link', options='Contact')
+		if self.party_type == "Customer":
+			self.add_column(
+				_("Customer Contact"),
+				fieldname="customer_primary_contact",
+				fieldtype="Link",
+				options="Contact",
+			)
 
-		self.add_column(label=_('Cost Center'), fieldname='cost_center', fieldtype='Data')
-		self.add_column(label=_('Voucher Type'), fieldname='voucher_type', fieldtype='Data')
-		self.add_column(label=_('Voucher No'), fieldname='voucher_no', fieldtype='Dynamic Link',
-			options='voucher_type', width=180)
+		self.add_column(label=_("Cost Center"), fieldname="cost_center", fieldtype="Data")
+		self.add_column(label=_("Voucher Type"), fieldname="voucher_type", fieldtype="Data")
+		self.add_column(
+			label=_("Voucher No"),
+			fieldname="voucher_no",
+			fieldtype="Dynamic Link",
+			options="voucher_type",
+			width=180,
+		)
 
 		if self.filters.show_remarks:
-			self.add_column(label=_('Remarks'), fieldname='remarks', fieldtype='Text', width=200),
+			self.add_column(label=_("Remarks"), fieldname="remarks", fieldtype="Text", width=200),
 
-		self.add_column(label='Due Date', fieldtype='Date')
+		self.add_column(label="Due Date", fieldtype="Date")
 
 		if self.party_type == "Supplier":
-			self.add_column(label=_('Bill No'), fieldname='bill_no', fieldtype='Data')
-			self.add_column(label=_('Bill Date'), fieldname='bill_date', fieldtype='Date')
+			self.add_column(label=_("Bill No"), fieldname="bill_no", fieldtype="Data")
+			self.add_column(label=_("Bill Date"), fieldname="bill_date", fieldtype="Date")
 
 		if self.filters.based_on_payment_terms:
-			self.add_column(label=_('Payment Term'), fieldname='payment_term', fieldtype='Data')
-			self.add_column(label=_('Invoice Grand Total'), fieldname='invoice_grand_total')
+			self.add_column(label=_("Payment Term"), fieldname="payment_term", fieldtype="Data")
+			self.add_column(label=_("Invoice Grand Total"), fieldname="invoice_grand_total")
 
-		self.add_column(_('Invoiced Amount'), fieldname='invoiced')
-		self.add_column(_('Paid Amount'), fieldname='paid')
+		self.add_column(_("Invoiced Amount"), fieldname="invoiced")
+		self.add_column(_("Paid Amount"), fieldname="paid")
 		if self.party_type == "Customer":
-			self.add_column(_('Credit Note'), fieldname='credit_note')
+			self.add_column(_("Credit Note"), fieldname="credit_note")
 		else:
 			# note: fieldname is still `credit_note`
-			self.add_column(_('Debit Note'), fieldname='credit_note')
-		self.add_column(_('Outstanding Amount'), fieldname='outstanding')
+			self.add_column(_("Debit Note"), fieldname="credit_note")
+		self.add_column(_("Outstanding Amount"), fieldname="outstanding")
 
 		self.setup_ageing_columns()
 
-		self.add_column(label=_('Currency'), fieldname='currency', fieldtype='Link', options='Currency', width=80)
+		self.add_column(
+			label=_("Currency"), fieldname="currency", fieldtype="Link", options="Currency", width=80
+		)
 
 		if self.filters.show_future_payments:
-			self.add_column(label=_('Future Payment Ref'), fieldname='future_ref', fieldtype='Data')
-			self.add_column(label=_('Future Payment Amount'), fieldname='future_amount')
-			self.add_column(label=_('Remaining Balance'), fieldname='remaining_balance')
+			self.add_column(label=_("Future Payment Ref"), fieldname="future_ref", fieldtype="Data")
+			self.add_column(label=_("Future Payment Amount"), fieldname="future_amount")
+			self.add_column(label=_("Remaining Balance"), fieldname="remaining_balance")
 
-		if self.filters.party_type == 'Customer':
-			self.add_column(label=_('Customer LPO'), fieldname='po_no', fieldtype='Data')
+		if self.filters.party_type == "Customer":
+			self.add_column(label=_("Customer LPO"), fieldname="po_no", fieldtype="Data")
 
 			# comma separated list of linked delivery notes
 			if self.filters.show_delivery_notes:
-				self.add_column(label=_('Delivery Notes'), fieldname='delivery_notes', fieldtype='Data')
-			self.add_column(label=_('Territory'), fieldname='territory', fieldtype='Link',
-				options='Territory')
-			self.add_column(label=_('Customer Group'), fieldname='customer_group', fieldtype='Link',
-				options='Customer Group')
+				self.add_column(label=_("Delivery Notes"), fieldname="delivery_notes", fieldtype="Data")
+			self.add_column(
+				label=_("Territory"), fieldname="territory", fieldtype="Link", options="Territory"
+			)
+			self.add_column(
+				label=_("Customer Group"),
+				fieldname="customer_group",
+				fieldtype="Link",
+				options="Customer Group",
+			)
 			if self.filters.show_sales_person:
-				self.add_column(label=_('Sales Person'), fieldname='sales_person', fieldtype='Data')
+				self.add_column(label=_("Sales Person"), fieldname="sales_person", fieldtype="Data")
 
 		if self.filters.party_type == "Supplier":
-			self.add_column(label=_('Supplier Group'), fieldname='supplier_group', fieldtype='Link',
-				options='Supplier Group')
+			self.add_column(
+				label=_("Supplier Group"),
+				fieldname="supplier_group",
+				fieldtype="Link",
+				options="Supplier Group",
+			)
 
-	def add_column(self, label, fieldname=None, fieldtype='Currency', options=None, width=120):
-		if not fieldname: fieldname = scrub(label)
-		if fieldtype=='Currency': options='currency'
-		if fieldtype=='Date': width = 90
+	def add_column(self, label, fieldname=None, fieldtype="Currency", options=None, width=120):
+		if not fieldname:
+			fieldname = scrub(label)
+		if fieldtype == "Currency":
+			options = "currency"
+		if fieldtype == "Date":
+			width = 90
 
-		self.columns.append(dict(
-			label=label,
-			fieldname=fieldname,
-			fieldtype=fieldtype,
-			options=options,
-			width=width
-		))
+		self.columns.append(
+			dict(label=label, fieldname=fieldname, fieldtype=fieldtype, options=options, width=width)
+		)
 
 	def setup_ageing_columns(self):
 		# for charts
 		self.ageing_column_labels = []
-		self.add_column(label=_('Age (Days)'), fieldname='age', fieldtype='Int', width=80)
+		self.add_column(label=_("Age (Days)"), fieldname="age", fieldtype="Int", width=80)
 
-		for i, label in enumerate(["0-{range1}".format(range1=self.filters["range1"]),
-			"{range1}-{range2}".format(range1=cint(self.filters["range1"])+ 1, range2=self.filters["range2"]),
-			"{range2}-{range3}".format(range2=cint(self.filters["range2"])+ 1, range3=self.filters["range3"]),
-			"{range3}-{range4}".format(range3=cint(self.filters["range3"])+ 1, range4=self.filters["range4"]),
-			"{range4}-{above}".format(range4=cint(self.filters["range4"])+ 1, above=_("Above"))]):
-				self.add_column(label=label, fieldname='range' + str(i+1))
-				self.ageing_column_labels.append(label)
+		for i, label in enumerate(
+			[
+				"0-{range1}".format(range1=self.filters["range1"]),
+				"{range1}-{range2}".format(
+					range1=cint(self.filters["range1"]) + 1, range2=self.filters["range2"]
+				),
+				"{range2}-{range3}".format(
+					range2=cint(self.filters["range2"]) + 1, range3=self.filters["range3"]
+				),
+				"{range3}-{range4}".format(
+					range3=cint(self.filters["range3"]) + 1, range4=self.filters["range4"]
+				),
+				"{range4}-{above}".format(range4=cint(self.filters["range4"]) + 1, above=_("Above")),
+			]
+		):
+			self.add_column(label=label, fieldname="range" + str(i + 1))
+			self.ageing_column_labels.append(label)
 
 	def get_chart_data(self):
 		rows = []
@@ -865,14 +1015,9 @@
 			if not cint(row.bold):
 				values = [row.range1, row.range2, row.range3, row.range4, row.range5]
 				precision = cint(frappe.db.get_default("float_precision")) or 2
-				rows.append({
-					'values': [flt(val, precision) for val in values]
-				})
+				rows.append({"values": [flt(val, precision) for val in values]})
 
 		self.chart = {
-			"data": {
-				'labels': self.ageing_column_labels,
-				'datasets': rows
-			},
-			"type": 'percentage'
+			"data": {"labels": self.ageing_column_labels, "datasets": rows},
+			"type": "percentage",
 		}
diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
index ab95c93..7a6989f 100644
--- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
@@ -14,13 +14,13 @@
 		frappe.db.sql("delete from `tabGL Entry` where company='_Test Company 2'")
 
 		filters = {
-			'company': '_Test Company 2',
-			'based_on_payment_terms': 1,
-			'report_date': today(),
-			'range1': 30,
-			'range2': 60,
-			'range3': 90,
-			'range4': 120
+			"company": "_Test Company 2",
+			"based_on_payment_terms": 1,
+			"report_date": today(),
+			"range1": 30,
+			"range2": 60,
+			"range3": 90,
+			"range4": 120,
 		}
 
 		# check invoice grand total and invoiced column's value for 3 payment terms
@@ -30,8 +30,8 @@
 		expected_data = [[100, 30], [100, 50], [100, 20]]
 
 		for i in range(3):
-			row = report[1][i-1]
-			self.assertEqual(expected_data[i-1], [row.invoice_grand_total, row.invoiced])
+			row = report[1][i - 1]
+			self.assertEqual(expected_data[i - 1], [row.invoice_grand_total, row.invoiced])
 
 		# check invoice grand total, invoiced, paid and outstanding column's value after payment
 		make_payment(name)
@@ -40,9 +40,11 @@
 		expected_data_after_payment = [[100, 50, 10, 40], [100, 20, 0, 20]]
 
 		for i in range(2):
-			row = report[1][i-1]
-			self.assertEqual(expected_data_after_payment[i-1],
-				[row.invoice_grand_total, row.invoiced, row.paid, row.outstanding])
+			row = report[1][i - 1]
+			self.assertEqual(
+				expected_data_after_payment[i - 1],
+				[row.invoice_grand_total, row.invoiced, row.paid, row.outstanding],
+			)
 
 		# check invoice grand total, invoiced, paid and outstanding column's value after credit note
 		make_credit_note(name)
@@ -51,30 +53,45 @@
 		expected_data_after_credit_note = [100, 0, 0, 40, -40]
 
 		row = report[1][0]
-		self.assertEqual(expected_data_after_credit_note,
-			[row.invoice_grand_total, row.invoiced, row.paid, row.credit_note, row.outstanding])
+		self.assertEqual(
+			expected_data_after_credit_note,
+			[row.invoice_grand_total, row.invoiced, row.paid, row.credit_note, row.outstanding],
+		)
+
 
 def make_sales_invoice():
 	frappe.set_user("Administrator")
 
-	si = create_sales_invoice(company="_Test Company 2",
-			customer = '_Test Customer 2',
-			currency = 'EUR',
-			warehouse = 'Finished Goods - _TC2',
-			debit_to = 'Debtors - _TC2',
-			income_account = 'Sales - _TC2',
-			expense_account = 'Cost of Goods Sold - _TC2',
-			cost_center = 'Main - _TC2',
-			do_not_save=1)
+	si = create_sales_invoice(
+		company="_Test Company 2",
+		customer="_Test Customer 2",
+		currency="EUR",
+		warehouse="Finished Goods - _TC2",
+		debit_to="Debtors - _TC2",
+		income_account="Sales - _TC2",
+		expense_account="Cost of Goods Sold - _TC2",
+		cost_center="Main - _TC2",
+		do_not_save=1,
+	)
 
-	si.append('payment_schedule', dict(due_date=getdate(add_days(today(), 30)), invoice_portion=30.00, payment_amount=30))
-	si.append('payment_schedule', dict(due_date=getdate(add_days(today(), 60)), invoice_portion=50.00, payment_amount=50))
-	si.append('payment_schedule', dict(due_date=getdate(add_days(today(), 90)), invoice_portion=20.00, payment_amount=20))
+	si.append(
+		"payment_schedule",
+		dict(due_date=getdate(add_days(today(), 30)), invoice_portion=30.00, payment_amount=30),
+	)
+	si.append(
+		"payment_schedule",
+		dict(due_date=getdate(add_days(today(), 60)), invoice_portion=50.00, payment_amount=50),
+	)
+	si.append(
+		"payment_schedule",
+		dict(due_date=getdate(add_days(today(), 90)), invoice_portion=20.00, payment_amount=20),
+	)
 
 	si.submit()
 
 	return si.name
 
+
 def make_payment(docname):
 	pe = get_payment_entry("Sales Invoice", docname, bank_account="Cash - _TC2", party_amount=40)
 	pe.paid_from = "Debtors - _TC2"
@@ -83,14 +100,16 @@
 
 
 def make_credit_note(docname):
-	create_sales_invoice(company="_Test Company 2",
-		customer = '_Test Customer 2',
-		currency = 'EUR',
-		qty = -1,
-		warehouse = 'Finished Goods - _TC2',
-		debit_to = 'Debtors - _TC2',
-		income_account = 'Sales - _TC2',
-		expense_account = 'Cost of Goods Sold - _TC2',
-		cost_center = 'Main - _TC2',
-		is_return = 1,
-		return_against = docname)
+	create_sales_invoice(
+		company="_Test Company 2",
+		customer="_Test Customer 2",
+		currency="EUR",
+		qty=-1,
+		warehouse="Finished Goods - _TC2",
+		debit_to="Debtors - _TC2",
+		income_account="Sales - _TC2",
+		expense_account="Cost of Goods Sold - _TC2",
+		cost_center="Main - _TC2",
+		is_return=1,
+		return_against=docname,
+	)
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
index 8e3bd8b..889f5a2 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
@@ -18,10 +18,13 @@
 
 	return AccountsReceivableSummary(filters).run(args)
 
+
 class AccountsReceivableSummary(ReceivablePayableReport):
 	def run(self, args):
-		self.party_type = args.get('party_type')
-		self.party_naming_by = frappe.db.get_value(args.get("naming_by")[0], None, args.get("naming_by")[1])
+		self.party_type = args.get("party_type")
+		self.party_naming_by = frappe.db.get_value(
+			args.get("naming_by")[0], None, args.get("naming_by")[1]
+		)
 		self.get_columns()
 		self.get_data(args)
 		return self.columns, self.data
@@ -33,8 +36,15 @@
 
 		self.get_party_total(args)
 
-		party_advance_amount = get_partywise_advanced_payment_amount(self.party_type,
-			self.filters.report_date, self.filters.show_future_payments, self.filters.company) or {}
+		party_advance_amount = (
+			get_partywise_advanced_payment_amount(
+				self.party_type,
+				self.filters.report_date,
+				self.filters.show_future_payments,
+				self.filters.company,
+			)
+			or {}
+		)
 
 		if self.filters.show_gl_balance:
 			gl_balance_map = get_gl_balance(self.filters.report_date)
@@ -47,7 +57,9 @@
 
 			row.party = party
 			if self.party_naming_by == "Naming Series":
-				row.party_name = frappe.get_cached_value(self.party_type, party, scrub(self.party_type) + "_name")
+				row.party_name = frappe.get_cached_value(
+					self.party_type, party, scrub(self.party_type) + "_name"
+				)
 
 			row.update(party_dict)
 
@@ -80,24 +92,29 @@
 			self.set_party_details(d)
 
 	def init_party_total(self, row):
-		self.party_total.setdefault(row.party, frappe._dict({
-			"invoiced": 0.0,
-			"paid": 0.0,
-			"credit_note": 0.0,
-			"outstanding": 0.0,
-			"range1": 0.0,
-			"range2": 0.0,
-			"range3": 0.0,
-			"range4": 0.0,
-			"range5": 0.0,
-			"total_due": 0.0,
-			"sales_person": []
-		}))
+		self.party_total.setdefault(
+			row.party,
+			frappe._dict(
+				{
+					"invoiced": 0.0,
+					"paid": 0.0,
+					"credit_note": 0.0,
+					"outstanding": 0.0,
+					"range1": 0.0,
+					"range2": 0.0,
+					"range3": 0.0,
+					"range4": 0.0,
+					"range5": 0.0,
+					"total_due": 0.0,
+					"sales_person": [],
+				}
+			),
+		)
 
 	def set_party_details(self, row):
 		self.party_total[row.party].currency = row.currency
 
-		for key in ('territory', 'customer_group', 'supplier_group'):
+		for key in ("territory", "customer_group", "supplier_group"):
 			if row.get(key):
 				self.party_total[row.party][key] = row.get(key)
 
@@ -106,52 +123,84 @@
 
 	def get_columns(self):
 		self.columns = []
-		self.add_column(label=_(self.party_type), fieldname='party',
-			fieldtype='Link', options=self.party_type, width=180)
+		self.add_column(
+			label=_(self.party_type),
+			fieldname="party",
+			fieldtype="Link",
+			options=self.party_type,
+			width=180,
+		)
 
 		if self.party_naming_by == "Naming Series":
-			self.add_column(_('{0} Name').format(self.party_type),
-				fieldname = 'party_name', fieldtype='Data')
+			self.add_column(_("{0} Name").format(self.party_type), fieldname="party_name", fieldtype="Data")
 
-		credit_debit_label = "Credit Note" if self.party_type == 'Customer' else "Debit Note"
+		credit_debit_label = "Credit Note" if self.party_type == "Customer" else "Debit Note"
 
-		self.add_column(_('Advance Amount'), fieldname='advance')
-		self.add_column(_('Invoiced Amount'), fieldname='invoiced')
-		self.add_column(_('Paid Amount'), fieldname='paid')
-		self.add_column(_(credit_debit_label), fieldname='credit_note')
-		self.add_column(_('Outstanding Amount'), fieldname='outstanding')
+		self.add_column(_("Advance Amount"), fieldname="advance")
+		self.add_column(_("Invoiced Amount"), fieldname="invoiced")
+		self.add_column(_("Paid Amount"), fieldname="paid")
+		self.add_column(_(credit_debit_label), fieldname="credit_note")
+		self.add_column(_("Outstanding Amount"), fieldname="outstanding")
 
 		if self.filters.show_gl_balance:
-			self.add_column(_('GL Balance'), fieldname='gl_balance')
-			self.add_column(_('Difference'), fieldname='diff')
+			self.add_column(_("GL Balance"), fieldname="gl_balance")
+			self.add_column(_("Difference"), fieldname="diff")
 
 		self.setup_ageing_columns()
 
 		if self.party_type == "Customer":
-			self.add_column(label=_('Territory'), fieldname='territory', fieldtype='Link',
-				options='Territory')
-			self.add_column(label=_('Customer Group'), fieldname='customer_group', fieldtype='Link',
-				options='Customer Group')
+			self.add_column(
+				label=_("Territory"), fieldname="territory", fieldtype="Link", options="Territory"
+			)
+			self.add_column(
+				label=_("Customer Group"),
+				fieldname="customer_group",
+				fieldtype="Link",
+				options="Customer Group",
+			)
 			if self.filters.show_sales_person:
-				self.add_column(label=_('Sales Person'), fieldname='sales_person', fieldtype='Data')
+				self.add_column(label=_("Sales Person"), fieldname="sales_person", fieldtype="Data")
 		else:
-			self.add_column(label=_('Supplier Group'), fieldname='supplier_group', fieldtype='Link',
-				options='Supplier Group')
+			self.add_column(
+				label=_("Supplier Group"),
+				fieldname="supplier_group",
+				fieldtype="Link",
+				options="Supplier Group",
+			)
 
-		self.add_column(label=_('Currency'), fieldname='currency', fieldtype='Link',
-			options='Currency', width=80)
+		self.add_column(
+			label=_("Currency"), fieldname="currency", fieldtype="Link", options="Currency", width=80
+		)
 
 	def setup_ageing_columns(self):
-		for i, label in enumerate(["0-{range1}".format(range1=self.filters["range1"]),
-			"{range1}-{range2}".format(range1=cint(self.filters["range1"])+ 1, range2=self.filters["range2"]),
-			"{range2}-{range3}".format(range2=cint(self.filters["range2"])+ 1, range3=self.filters["range3"]),
-			"{range3}-{range4}".format(range3=cint(self.filters["range3"])+ 1, range4=self.filters["range4"]),
-			"{range4}-{above}".format(range4=cint(self.filters["range4"])+ 1, above=_("Above"))]):
-				self.add_column(label=label, fieldname='range' + str(i+1))
+		for i, label in enumerate(
+			[
+				"0-{range1}".format(range1=self.filters["range1"]),
+				"{range1}-{range2}".format(
+					range1=cint(self.filters["range1"]) + 1, range2=self.filters["range2"]
+				),
+				"{range2}-{range3}".format(
+					range2=cint(self.filters["range2"]) + 1, range3=self.filters["range3"]
+				),
+				"{range3}-{range4}".format(
+					range3=cint(self.filters["range3"]) + 1, range4=self.filters["range4"]
+				),
+				"{range4}-{above}".format(range4=cint(self.filters["range4"]) + 1, above=_("Above")),
+			]
+		):
+			self.add_column(label=label, fieldname="range" + str(i + 1))
 
 		# Add column for total due amount
-		self.add_column(label="Total Amount Due", fieldname='total_due')
+		self.add_column(label="Total Amount Due", fieldname="total_due")
+
 
 def get_gl_balance(report_date):
-	return frappe._dict(frappe.db.get_all("GL Entry", fields=['party', 'sum(debit -  credit)'],
-		filters={'posting_date': ("<=", report_date), 'is_cancelled': 0}, group_by='party', as_list=1))
+	return frappe._dict(
+		frappe.db.get_all(
+			"GL Entry",
+			fields=["party", "sum(debit -  credit)"],
+			filters={"posting_date": ("<=", report_date), "is_cancelled": 0},
+			group_by="party",
+			as_list=1,
+		)
+	)
diff --git a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
index 98f5b74..57d8049 100644
--- a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
+++ b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py
@@ -11,34 +11,44 @@
 	columns, data = get_columns(), get_data(filters)
 	return columns, data
 
+
 def get_data(filters):
 	data = []
-	depreciation_accounts = frappe.db.sql_list(""" select name from tabAccount
-		where ifnull(account_type, '') = 'Depreciation' """)
+	depreciation_accounts = frappe.db.sql_list(
+		""" select name from tabAccount
+		where ifnull(account_type, '') = 'Depreciation' """
+	)
 
-	filters_data = [["company", "=", filters.get('company')],
-		["posting_date", ">=", filters.get('from_date')],
-		["posting_date", "<=", filters.get('to_date')],
+	filters_data = [
+		["company", "=", filters.get("company")],
+		["posting_date", ">=", filters.get("from_date")],
+		["posting_date", "<=", filters.get("to_date")],
 		["against_voucher_type", "=", "Asset"],
-		["account", "in", depreciation_accounts]]
+		["account", "in", depreciation_accounts],
+	]
 
 	if filters.get("asset"):
 		filters_data.append(["against_voucher", "=", filters.get("asset")])
 
 	if filters.get("asset_category"):
 
-		assets = frappe.db.sql_list("""select name from tabAsset
-			where asset_category = %s and docstatus=1""", filters.get("asset_category"))
+		assets = frappe.db.sql_list(
+			"""select name from tabAsset
+			where asset_category = %s and docstatus=1""",
+			filters.get("asset_category"),
+		)
 
 		filters_data.append(["against_voucher", "in", assets])
 
 	if filters.get("finance_book"):
-		filters_data.append(["finance_book", "in", ['', filters.get('finance_book')]])
+		filters_data.append(["finance_book", "in", ["", filters.get("finance_book")]])
 
-	gl_entries = frappe.get_all('GL Entry',
-		filters= filters_data,
-		fields = ["against_voucher", "debit_in_account_currency as debit", "voucher_no", "posting_date"],
-		order_by= "against_voucher, posting_date")
+	gl_entries = frappe.get_all(
+		"GL Entry",
+		filters=filters_data,
+		fields=["against_voucher", "debit_in_account_currency as debit", "voucher_no", "posting_date"],
+		order_by="against_voucher, posting_date",
+	)
 
 	if not gl_entries:
 		return data
@@ -55,29 +65,40 @@
 				asset_data.accumulated_depreciation_amount += d.debit
 
 			row = frappe._dict(asset_data)
-			row.update({
-				"depreciation_amount": d.debit,
-				"depreciation_date": d.posting_date,
-				"amount_after_depreciation": (flt(row.gross_purchase_amount) -
-					flt(row.accumulated_depreciation_amount)),
-				"depreciation_entry": d.voucher_no
-			})
+			row.update(
+				{
+					"depreciation_amount": d.debit,
+					"depreciation_date": d.posting_date,
+					"amount_after_depreciation": (
+						flt(row.gross_purchase_amount) - flt(row.accumulated_depreciation_amount)
+					),
+					"depreciation_entry": d.voucher_no,
+				}
+			)
 
 			data.append(row)
 
 	return data
 
+
 def get_assets_details(assets):
 	assets_details = {}
 
-	fields = ["name as asset", "gross_purchase_amount",
-		"asset_category", "status", "depreciation_method", "purchase_date"]
+	fields = [
+		"name as asset",
+		"gross_purchase_amount",
+		"asset_category",
+		"status",
+		"depreciation_method",
+		"purchase_date",
+	]
 
-	for d in frappe.get_all("Asset", fields = fields, filters = {'name': ('in', assets)}):
+	for d in frappe.get_all("Asset", fields=fields, filters={"name": ("in", assets)}):
 		assets_details.setdefault(d.asset, d)
 
 	return assets_details
 
+
 def get_columns():
 	return [
 		{
@@ -85,68 +106,58 @@
 			"fieldname": "asset",
 			"fieldtype": "Link",
 			"options": "Asset",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Depreciation Date"),
 			"fieldname": "depreciation_date",
 			"fieldtype": "Date",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Purchase Amount"),
 			"fieldname": "gross_purchase_amount",
 			"fieldtype": "Currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Depreciation Amount"),
 			"fieldname": "depreciation_amount",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Accumulated Depreciation Amount"),
 			"fieldname": "accumulated_depreciation_amount",
 			"fieldtype": "Currency",
-			"width": 210
+			"width": 210,
 		},
 		{
 			"label": _("Amount After Depreciation"),
 			"fieldname": "amount_after_depreciation",
 			"fieldtype": "Currency",
-			"width": 180
+			"width": 180,
 		},
 		{
 			"label": _("Depreciation Entry"),
 			"fieldname": "depreciation_entry",
 			"fieldtype": "Link",
 			"options": "Journal Entry",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Asset Category"),
 			"fieldname": "asset_category",
 			"fieldtype": "Link",
 			"options": "Asset Category",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Current Status"),
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"label": _("Current Status"), "fieldname": "status", "fieldtype": "Data", "width": 120},
 		{
 			"label": _("Depreciation Method"),
 			"fieldname": "depreciation_method",
 			"fieldtype": "Data",
-			"width": 130
+			"width": 130,
 		},
-		{
-			"label": _("Purchase Date"),
-			"fieldname": "purchase_date",
-			"fieldtype": "Date",
-			"width": 120
-		}
+		{"label": _("Purchase Date"), "fieldname": "purchase_date", "fieldtype": "Date", "width": 120},
 	]
diff --git a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py
index 0f9435f..ad9b1ba 100644
--- a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py
+++ b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py
@@ -24,18 +24,33 @@
 		# row.asset_category = asset_category
 		row.update(asset_category)
 
-		row.cost_as_on_to_date = (flt(row.cost_as_on_from_date) + flt(row.cost_of_new_purchase) -
-				flt(row.cost_of_sold_asset) - flt(row.cost_of_scrapped_asset))
+		row.cost_as_on_to_date = (
+			flt(row.cost_as_on_from_date)
+			+ flt(row.cost_of_new_purchase)
+			- flt(row.cost_of_sold_asset)
+			- flt(row.cost_of_scrapped_asset)
+		)
 
-		row.update(next(asset for asset in assets if asset["asset_category"] == asset_category.get("asset_category", "")))
-		row.accumulated_depreciation_as_on_to_date = (flt(row.accumulated_depreciation_as_on_from_date) +
-				flt(row.depreciation_amount_during_the_period) - flt(row.depreciation_eliminated_during_the_period))
+		row.update(
+			next(
+				asset
+				for asset in assets
+				if asset["asset_category"] == asset_category.get("asset_category", "")
+			)
+		)
+		row.accumulated_depreciation_as_on_to_date = (
+			flt(row.accumulated_depreciation_as_on_from_date)
+			+ flt(row.depreciation_amount_during_the_period)
+			- flt(row.depreciation_eliminated_during_the_period)
+		)
 
-		row.net_asset_value_as_on_from_date = (flt(row.cost_as_on_from_date) -
-				flt(row.accumulated_depreciation_as_on_from_date))
+		row.net_asset_value_as_on_from_date = flt(row.cost_as_on_from_date) - flt(
+			row.accumulated_depreciation_as_on_from_date
+		)
 
-		row.net_asset_value_as_on_to_date = (flt(row.cost_as_on_to_date) -
-				flt(row.accumulated_depreciation_as_on_to_date))
+		row.net_asset_value_as_on_to_date = flt(row.cost_as_on_to_date) - flt(
+			row.accumulated_depreciation_as_on_to_date
+		)
 
 		data.append(row)
 
@@ -43,7 +58,8 @@
 
 
 def get_asset_categories(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT asset_category,
 			   ifnull(sum(case when purchase_date < %(from_date)s then
 							   case when ifnull(disposal_date, 0) = 0 or disposal_date >= %(from_date)s then
@@ -84,10 +100,15 @@
 		from `tabAsset`
 		where docstatus=1 and company=%(company)s and purchase_date <= %(to_date)s
 		group by asset_category
-	""", {"to_date": filters.to_date, "from_date": filters.from_date, "company": filters.company}, as_dict=1)
+	""",
+		{"to_date": filters.to_date, "from_date": filters.from_date, "company": filters.company},
+		as_dict=1,
+	)
+
 
 def get_assets(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT results.asset_category,
 			   sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date,
 			   sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period,
@@ -130,7 +151,10 @@
 			where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s
 			group by a.asset_category) as results
 		group by results.asset_category
-		""", {"to_date": filters.to_date, "from_date": filters.from_date, "company": filters.company}, as_dict=1)
+		""",
+		{"to_date": filters.to_date, "from_date": filters.from_date, "company": filters.company},
+		as_dict=1,
+	)
 
 
 def get_columns(filters):
@@ -140,72 +164,72 @@
 			"fieldname": "asset_category",
 			"fieldtype": "Link",
 			"options": "Asset Category",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Cost as on") + " " + formatdate(filters.day_before_from_date),
 			"fieldname": "cost_as_on_from_date",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Cost of New Purchase"),
 			"fieldname": "cost_of_new_purchase",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Cost of Sold Asset"),
 			"fieldname": "cost_of_sold_asset",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Cost of Scrapped Asset"),
 			"fieldname": "cost_of_scrapped_asset",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Cost as on") + " " + formatdate(filters.to_date),
 			"fieldname": "cost_as_on_to_date",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Accumulated Depreciation as on") + " " + formatdate(filters.day_before_from_date),
 			"fieldname": "accumulated_depreciation_as_on_from_date",
 			"fieldtype": "Currency",
-			"width": 270
+			"width": 270,
 		},
 		{
 			"label": _("Depreciation Amount during the period"),
 			"fieldname": "depreciation_amount_during_the_period",
 			"fieldtype": "Currency",
-			"width": 240
+			"width": 240,
 		},
 		{
 			"label": _("Depreciation Eliminated due to disposal of assets"),
 			"fieldname": "depreciation_eliminated_during_the_period",
 			"fieldtype": "Currency",
-			"width": 300
+			"width": 300,
 		},
 		{
 			"label": _("Accumulated Depreciation as on") + " " + formatdate(filters.to_date),
 			"fieldname": "accumulated_depreciation_as_on_to_date",
 			"fieldtype": "Currency",
-			"width": 270
+			"width": 270,
 		},
 		{
 			"label": _("Net Asset value as on") + " " + formatdate(filters.day_before_from_date),
 			"fieldname": "net_asset_value_as_on_from_date",
 			"fieldtype": "Currency",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Net Asset value as on") + " " + formatdate(filters.to_date),
 			"fieldname": "net_asset_value_as_on_to_date",
 			"fieldtype": "Currency",
-			"width": 200
-		}
+			"width": 200,
+		},
 	]
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py
index f10a5ea..7b1e979 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.py
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py
@@ -15,26 +15,53 @@
 
 
 def execute(filters=None):
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
-		filters.period_start_date, filters.period_end_date, filters.filter_based_on,
-		filters.periodicity, company=filters.company)
+	period_list = get_period_list(
+		filters.from_fiscal_year,
+		filters.to_fiscal_year,
+		filters.period_start_date,
+		filters.period_end_date,
+		filters.filter_based_on,
+		filters.periodicity,
+		company=filters.company,
+	)
 
-	currency = filters.presentation_currency or frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	currency = filters.presentation_currency or frappe.get_cached_value(
+		"Company", filters.company, "default_currency"
+	)
 
-	asset = get_data(filters.company, "Asset", "Debit", period_list,
-		only_current_fiscal_year=False, filters=filters,
-		accumulated_values=filters.accumulated_values)
+	asset = get_data(
+		filters.company,
+		"Asset",
+		"Debit",
+		period_list,
+		only_current_fiscal_year=False,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+	)
 
-	liability = get_data(filters.company, "Liability", "Credit", period_list,
-		only_current_fiscal_year=False, filters=filters,
-		accumulated_values=filters.accumulated_values)
+	liability = get_data(
+		filters.company,
+		"Liability",
+		"Credit",
+		period_list,
+		only_current_fiscal_year=False,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+	)
 
-	equity = get_data(filters.company, "Equity", "Credit", period_list,
-		only_current_fiscal_year=False, filters=filters,
-		accumulated_values=filters.accumulated_values)
+	equity = get_data(
+		filters.company,
+		"Equity",
+		"Credit",
+		period_list,
+		only_current_fiscal_year=False,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+	)
 
-	provisional_profit_loss, total_credit = get_provisional_profit_loss(asset, liability, equity,
-		period_list, filters.company, currency)
+	provisional_profit_loss, total_credit = get_provisional_profit_loss(
+		asset, liability, equity, period_list, filters.company, currency
+	)
 
 	message, opening_balance = check_opening_balance(asset, liability, equity)
 
@@ -42,19 +69,19 @@
 	data.extend(asset or [])
 	data.extend(liability or [])
 	data.extend(equity or [])
-	if opening_balance and round(opening_balance,2) !=0:
-		unclosed ={
+	if opening_balance and round(opening_balance, 2) != 0:
+		unclosed = {
 			"account_name": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'",
 			"account": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'",
 			"warn_if_negative": True,
-			"currency": currency
+			"currency": currency,
 		}
 		for period in period_list:
 			unclosed[period.key] = opening_balance
 			if provisional_profit_loss:
 				provisional_profit_loss[period.key] = provisional_profit_loss[period.key] - opening_balance
 
-		unclosed["total"]=opening_balance
+		unclosed["total"] = opening_balance
 		data.append(unclosed)
 
 	if provisional_profit_loss:
@@ -62,26 +89,32 @@
 	if total_credit:
 		data.append(total_credit)
 
-	columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, company=filters.company)
+	columns = get_columns(
+		filters.periodicity, period_list, filters.accumulated_values, company=filters.company
+	)
 
 	chart = get_chart_data(filters, columns, asset, liability, equity)
 
-	report_summary = get_report_summary(period_list, asset, liability, equity, provisional_profit_loss,
-		total_credit, currency, filters)
+	report_summary = get_report_summary(
+		period_list, asset, liability, equity, provisional_profit_loss, total_credit, currency, filters
+	)
 
 	return columns, data, message, chart, report_summary
 
-def get_provisional_profit_loss(asset, liability, equity, period_list, company, currency=None, consolidated=False):
+
+def get_provisional_profit_loss(
+	asset, liability, equity, period_list, company, currency=None, consolidated=False
+):
 	provisional_profit_loss = {}
 	total_row = {}
 	if asset and (liability or equity):
-		total = total_row_total=0
-		currency = currency or frappe.get_cached_value('Company',  company,  "default_currency")
+		total = total_row_total = 0
+		currency = currency or frappe.get_cached_value("Company", company, "default_currency")
 		total_row = {
 			"account_name": "'" + _("Total (Credit)") + "'",
 			"account": "'" + _("Total (Credit)") + "'",
 			"warn_if_negative": True,
-			"currency": currency
+			"currency": currency,
 		}
 		has_value = False
 
@@ -106,15 +139,18 @@
 			total_row["total"] = total_row_total
 
 		if has_value:
-			provisional_profit_loss.update({
-				"account_name": "'" + _("Provisional Profit / Loss (Credit)") + "'",
-				"account": "'" + _("Provisional Profit / Loss (Credit)") + "'",
-				"warn_if_negative": True,
-				"currency": currency
-			})
+			provisional_profit_loss.update(
+				{
+					"account_name": "'" + _("Provisional Profit / Loss (Credit)") + "'",
+					"account": "'" + _("Provisional Profit / Loss (Credit)") + "'",
+					"warn_if_negative": True,
+					"currency": currency,
+				}
+			)
 
 	return provisional_profit_loss, total_row
 
+
 def check_opening_balance(asset, liability, equity):
 	# Check if previous year balance sheet closed
 	opening_balance = 0
@@ -128,19 +164,29 @@
 
 	opening_balance = flt(opening_balance, float_precision)
 	if opening_balance:
-		return _("Previous Financial Year is not closed"),opening_balance
-	return None,None
+		return _("Previous Financial Year is not closed"), opening_balance
+	return None, None
 
-def get_report_summary(period_list, asset, liability, equity, provisional_profit_loss, total_credit, currency,
-	filters, consolidated=False):
+
+def get_report_summary(
+	period_list,
+	asset,
+	liability,
+	equity,
+	provisional_profit_loss,
+	total_credit,
+	currency,
+	filters,
+	consolidated=False,
+):
 
 	net_asset, net_liability, net_equity, net_provisional_profit_loss = 0.0, 0.0, 0.0, 0.0
 
-	if filters.get('accumulated_values'):
+	if filters.get("accumulated_values"):
 		period_list = [period_list[-1]]
 
 	# from consolidated financial statement
-	if filters.get('accumulated_in_group_company'):
+	if filters.get("accumulated_in_group_company"):
 		period_list = get_filtered_list_for_consolidated_report(filters, period_list)
 
 	for period in period_list:
@@ -155,33 +201,24 @@
 			net_provisional_profit_loss += provisional_profit_loss.get(key)
 
 	return [
-		{
-			"value": net_asset,
-			"label": "Total Asset",
-			"datatype": "Currency",
-			"currency": currency
-		},
+		{"value": net_asset, "label": "Total Asset", "datatype": "Currency", "currency": currency},
 		{
 			"value": net_liability,
 			"label": "Total Liability",
 			"datatype": "Currency",
-			"currency": currency
+			"currency": currency,
 		},
-		{
-			"value": net_equity,
-			"label": "Total Equity",
-			"datatype": "Currency",
-			"currency": currency
-		},
+		{"value": net_equity, "label": "Total Equity", "datatype": "Currency", "currency": currency},
 		{
 			"value": net_provisional_profit_loss,
 			"label": "Provisional Profit / Loss (Credit)",
 			"indicator": "Green" if net_provisional_profit_loss > 0 else "Red",
 			"datatype": "Currency",
-			"currency": currency
-		}
+			"currency": currency,
+		},
 	]
 
+
 def get_chart_data(filters, columns, asset, liability, equity):
 	labels = [d.get("label") for d in columns[2:]]
 
@@ -197,18 +234,13 @@
 
 	datasets = []
 	if asset_data:
-		datasets.append({'name': _('Assets'), 'values': asset_data})
+		datasets.append({"name": _("Assets"), "values": asset_data})
 	if liability_data:
-		datasets.append({'name': _('Liabilities'), 'values': liability_data})
+		datasets.append({"name": _("Liabilities"), "values": liability_data})
 	if equity_data:
-		datasets.append({'name': _('Equity'), 'values': equity_data})
+		datasets.append({"name": _("Equity"), "values": equity_data})
 
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		}
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}}
 
 	if not filters.accumulated_values:
 		chart["type"] = "bar"
diff --git a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
index b456e89..20f7643 100644
--- a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
+++ b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
@@ -8,86 +8,88 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns()
 	data = get_entries(filters)
 
 	return columns, data
 
+
 def get_columns():
-	columns = [{
+	columns = [
+		{
 			"label": _("Payment Document Type"),
 			"fieldname": "payment_document_type",
 			"fieldtype": "Link",
 			"options": "Doctype",
-			"width": 130
+			"width": 130,
 		},
 		{
 			"label": _("Payment Entry"),
 			"fieldname": "payment_entry",
 			"fieldtype": "Dynamic Link",
 			"options": "payment_document_type",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Cheque/Reference No"),
-			"fieldname": "cheque_no",
-			"width": 120
-		},
-		{
-			"label": _("Clearance Date"),
-			"fieldname": "clearance_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
+		{"label": _("Cheque/Reference No"), "fieldname": "cheque_no", "width": 120},
+		{"label": _("Clearance Date"), "fieldname": "clearance_date", "fieldtype": "Date", "width": 100},
 		{
 			"label": _("Against Account"),
 			"fieldname": "against",
 			"fieldtype": "Link",
 			"options": "Account",
-			"width": 170
+			"width": 170,
 		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"width": 120
-		}]
+		{"label": _("Amount"), "fieldname": "amount", "width": 120},
+	]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 
-	if filters.get("from_date"): conditions += " and posting_date>=%(from_date)s"
-	if filters.get("to_date"): conditions += " and posting_date<=%(to_date)s"
+	if filters.get("from_date"):
+		conditions += " and posting_date>=%(from_date)s"
+	if filters.get("to_date"):
+		conditions += " and posting_date<=%(to_date)s"
 
 	return conditions
 
+
 def get_entries(filters):
 	conditions = get_conditions(filters)
-	journal_entries =  frappe.db.sql("""SELECT
+	journal_entries = frappe.db.sql(
+		"""SELECT
 			"Journal Entry", jv.name, jv.posting_date, jv.cheque_no,
 			jv.clearance_date, jvd.against_account, jvd.debit - jvd.credit
 		FROM
 			`tabJournal Entry Account` jvd, `tabJournal Entry` jv
 		WHERE
 			jvd.parent = jv.name and jv.docstatus=1 and jvd.account = %(account)s {0}
-			order by posting_date DESC, jv.name DESC""".format(conditions), filters, as_list=1)
+			order by posting_date DESC, jv.name DESC""".format(
+			conditions
+		),
+		filters,
+		as_list=1,
+	)
 
-	payment_entries =  frappe.db.sql("""SELECT
+	payment_entries = frappe.db.sql(
+		"""SELECT
 			"Payment Entry", name, posting_date, reference_no, clearance_date, party,
 			if(paid_from=%(account)s, paid_amount * -1, received_amount)
 		FROM
 			`tabPayment Entry`
 		WHERE
 			docstatus=1 and (paid_from = %(account)s or paid_to = %(account)s) {0}
-			order by posting_date DESC, name DESC""".format(conditions), filters, as_list=1)
+			order by posting_date DESC, name DESC""".format(
+			conditions
+		),
+		filters,
+		as_list=1,
+	)
 
 	return sorted(journal_entries + payment_entries, key=lambda k: k[2] or getdate(nowdate()))
diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
index fe644ed..2ac1fea 100644
--- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
+++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
@@ -13,11 +13,13 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns()
 
-	if not filters.get("account"): return columns, []
+	if not filters.get("account"):
+		return columns, []
 
 	account_currency = frappe.db.get_value("Account", filters.account, "account_currency")
 
@@ -25,102 +27,91 @@
 
 	balance_as_per_system = get_balance_on(filters["account"], filters["report_date"])
 
-	total_debit, total_credit = 0,0
+	total_debit, total_credit = 0, 0
 	for d in data:
 		total_debit += flt(d.debit)
 		total_credit += flt(d.credit)
 
 	amounts_not_reflected_in_system = get_amounts_not_reflected_in_system(filters)
 
-	bank_bal = flt(balance_as_per_system) - flt(total_debit) + flt(total_credit) \
+	bank_bal = (
+		flt(balance_as_per_system)
+		- flt(total_debit)
+		+ flt(total_credit)
 		+ amounts_not_reflected_in_system
+	)
 
 	data += [
-		get_balance_row(_("Bank Statement balance as per General Ledger"), balance_as_per_system, account_currency),
+		get_balance_row(
+			_("Bank Statement balance as per General Ledger"), balance_as_per_system, account_currency
+		),
 		{},
 		{
 			"payment_entry": _("Outstanding Cheques and Deposits to clear"),
 			"debit": total_debit,
 			"credit": total_credit,
-			"account_currency": account_currency
+			"account_currency": account_currency,
 		},
-		get_balance_row(_("Cheques and Deposits incorrectly cleared"), amounts_not_reflected_in_system,
-			account_currency),
+		get_balance_row(
+			_("Cheques and Deposits incorrectly cleared"), amounts_not_reflected_in_system, account_currency
+		),
 		{},
-		get_balance_row(_("Calculated Bank Statement balance"), bank_bal, account_currency)
+		get_balance_row(_("Calculated Bank Statement balance"), bank_bal, account_currency),
 	]
 
 	return columns, data
 
+
 def get_columns():
 	return [
-		{
-			"fieldname": "posting_date",
-			"label": _("Posting Date"),
-			"fieldtype": "Date",
-			"width": 90
-		},
+		{"fieldname": "posting_date", "label": _("Posting Date"), "fieldtype": "Date", "width": 90},
 		{
 			"fieldname": "payment_document",
 			"label": _("Payment Document Type"),
 			"fieldtype": "Data",
-			"width": 220
+			"width": 220,
 		},
 		{
 			"fieldname": "payment_entry",
 			"label": _("Payment Document"),
 			"fieldtype": "Dynamic Link",
 			"options": "payment_document",
-			"width": 220
+			"width": 220,
 		},
 		{
 			"fieldname": "debit",
 			"label": _("Debit"),
 			"fieldtype": "Currency",
 			"options": "account_currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "credit",
 			"label": _("Credit"),
 			"fieldtype": "Currency",
 			"options": "account_currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "against_account",
 			"label": _("Against Account"),
 			"fieldtype": "Link",
 			"options": "Account",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"fieldname": "reference_no",
-			"label": _("Reference"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "ref_date",
-			"label": _("Ref Date"),
-			"fieldtype": "Date",
-			"width": 110
-		},
-		{
-			"fieldname": "clearance_date",
-			"label": _("Clearance Date"),
-			"fieldtype": "Date",
-			"width": 110
-		},
+		{"fieldname": "reference_no", "label": _("Reference"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "ref_date", "label": _("Ref Date"), "fieldtype": "Date", "width": 110},
+		{"fieldname": "clearance_date", "label": _("Clearance Date"), "fieldtype": "Date", "width": 110},
 		{
 			"fieldname": "account_currency",
 			"label": _("Currency"),
 			"fieldtype": "Link",
 			"options": "Currency",
-			"width": 100
-		}
+			"width": 100,
+		},
 	]
 
+
 def get_entries(filters):
 	journal_entries = get_journal_entries(filters)
 
@@ -132,11 +123,15 @@
 	if filters.include_pos_transactions:
 		pos_entries = get_pos_entries(filters)
 
-	return sorted(list(payment_entries)+list(journal_entries+list(pos_entries) + list(loan_entries)),
-			key=lambda k: getdate(k['posting_date']))
+	return sorted(
+		list(payment_entries) + list(journal_entries + list(pos_entries) + list(loan_entries)),
+		key=lambda k: getdate(k["posting_date"]),
+	)
+
 
 def get_journal_entries(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select "Journal Entry" as payment_document, jv.posting_date,
 			jv.name as payment_entry, jvd.debit_in_account_currency as debit,
 			jvd.credit_in_account_currency as credit, jvd.against_account,
@@ -146,10 +141,15 @@
 		where jvd.parent = jv.name and jv.docstatus=1
 			and jvd.account = %(account)s and jv.posting_date <= %(report_date)s
 			and ifnull(jv.clearance_date, '4000-01-01') > %(report_date)s
-			and ifnull(jv.is_opening, 'No') = 'No'""", filters, as_dict=1)
+			and ifnull(jv.is_opening, 'No') = 'No'""",
+		filters,
+		as_dict=1,
+	)
+
 
 def get_payment_entries(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			"Payment Entry" as payment_document, name as payment_entry,
 			reference_no, reference_date as ref_date,
@@ -162,10 +162,15 @@
 			(paid_from=%(account)s or paid_to=%(account)s) and docstatus=1
 			and posting_date <= %(report_date)s
 			and ifnull(clearance_date, '4000-01-01') > %(report_date)s
-	""", filters, as_dict=1)
+	""",
+		filters,
+		as_dict=1,
+	)
+
 
 def get_pos_entries(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 			select
 				"Sales Invoice Payment" as payment_document, sip.name as payment_entry, sip.amount as debit,
 				si.posting_date, si.debit_to as against_account, sip.clearance_date,
@@ -177,13 +182,17 @@
 				ifnull(sip.clearance_date, '4000-01-01') > %(report_date)s
 			order by
 				si.posting_date ASC, si.name DESC
-		""", filters, as_dict=1)
+		""",
+		filters,
+		as_dict=1,
+	)
+
 
 def get_loan_entries(filters):
 	loan_docs = []
 	for doctype in ["Loan Disbursement", "Loan Repayment"]:
 		loan_doc = frappe.qb.DocType(doctype)
-		ifnull = CustomFunction('IFNULL', ['value', 'default'])
+		ifnull = CustomFunction("IFNULL", ["value", "default"])
 
 		if doctype == "Loan Disbursement":
 			amount_field = (loan_doc.disbursed_amount).as_("credit")
@@ -194,22 +203,22 @@
 			posting_date = (loan_doc.posting_date).as_("posting_date")
 			account = loan_doc.payment_account
 
-		entries = frappe.qb.from_(loan_doc).select(
-			ConstantColumn(doctype).as_("payment_document"),
-			(loan_doc.name).as_("payment_entry"),
-			(loan_doc.reference_number).as_("reference_no"),
-			(loan_doc.reference_date).as_("ref_date"),
-			amount_field,
-			posting_date,
-		).where(
-			loan_doc.docstatus == 1
-		).where(
-			account == filters.get('account')
-		).where(
-			posting_date <= getdate(filters.get('report_date'))
-		).where(
-			ifnull(loan_doc.clearance_date, '4000-01-01') > getdate(filters.get('report_date'))
-		).run(as_dict=1)
+		entries = (
+			frappe.qb.from_(loan_doc)
+			.select(
+				ConstantColumn(doctype).as_("payment_document"),
+				(loan_doc.name).as_("payment_entry"),
+				(loan_doc.reference_number).as_("reference_no"),
+				(loan_doc.reference_date).as_("ref_date"),
+				amount_field,
+				posting_date,
+			)
+			.where(loan_doc.docstatus == 1)
+			.where(account == filters.get("account"))
+			.where(posting_date <= getdate(filters.get("report_date")))
+			.where(ifnull(loan_doc.clearance_date, "4000-01-01") > getdate(filters.get("report_date")))
+			.run(as_dict=1)
+		)
 
 		loan_docs.extend(entries)
 
@@ -217,20 +226,26 @@
 
 
 def get_amounts_not_reflected_in_system(filters):
-	je_amount = frappe.db.sql("""
+	je_amount = frappe.db.sql(
+		"""
 		select sum(jvd.debit_in_account_currency - jvd.credit_in_account_currency)
 		from `tabJournal Entry Account` jvd, `tabJournal Entry` jv
 		where jvd.parent = jv.name and jv.docstatus=1 and jvd.account=%(account)s
 		and jv.posting_date > %(report_date)s and jv.clearance_date <= %(report_date)s
-		and ifnull(jv.is_opening, 'No') = 'No' """, filters)
+		and ifnull(jv.is_opening, 'No') = 'No' """,
+		filters,
+	)
 
 	je_amount = flt(je_amount[0][0]) if je_amount else 0.0
 
-	pe_amount = frappe.db.sql("""
+	pe_amount = frappe.db.sql(
+		"""
 		select sum(if(paid_from=%(account)s, paid_amount, received_amount))
 		from `tabPayment Entry`
 		where (paid_from=%(account)s or paid_to=%(account)s) and docstatus=1
-		and posting_date > %(report_date)s and clearance_date <= %(report_date)s""", filters)
+		and posting_date > %(report_date)s and clearance_date <= %(report_date)s""",
+		filters,
+	)
 
 	pe_amount = flt(pe_amount[0][0]) if pe_amount else 0.0
 
@@ -238,11 +253,12 @@
 
 	return je_amount + pe_amount + loan_amount
 
+
 def get_loan_amount(filters):
 	total_amount = 0
 	for doctype in ["Loan Disbursement", "Loan Repayment"]:
 		loan_doc = frappe.qb.DocType(doctype)
-		ifnull = CustomFunction('IFNULL', ['value', 'default'])
+		ifnull = CustomFunction("IFNULL", ["value", "default"])
 
 		if doctype == "Loan Disbursement":
 			amount_field = Sum(loan_doc.disbursed_amount)
@@ -253,34 +269,33 @@
 			posting_date = (loan_doc.posting_date).as_("posting_date")
 			account = loan_doc.payment_account
 
-		amount = frappe.qb.from_(loan_doc).select(
-			amount_field
-		).where(
-			loan_doc.docstatus == 1
-		).where(
-			account == filters.get('account')
-		).where(
-			posting_date > getdate(filters.get('report_date'))
-		).where(
-			ifnull(loan_doc.clearance_date, '4000-01-01') <= getdate(filters.get('report_date'))
-		).run()[0][0]
+		amount = (
+			frappe.qb.from_(loan_doc)
+			.select(amount_field)
+			.where(loan_doc.docstatus == 1)
+			.where(account == filters.get("account"))
+			.where(posting_date > getdate(filters.get("report_date")))
+			.where(ifnull(loan_doc.clearance_date, "4000-01-01") <= getdate(filters.get("report_date")))
+			.run()[0][0]
+		)
 
 		total_amount += flt(amount)
 
 	return total_amount
 
+
 def get_balance_row(label, amount, account_currency):
 	if amount > 0:
 		return {
 			"payment_entry": label,
 			"debit": amount,
 			"credit": 0,
-			"account_currency": account_currency
+			"account_currency": account_currency,
 		}
 	else:
 		return {
 			"payment_entry": label,
 			"debit": 0,
 			"credit": abs(amount),
-			"account_currency": account_currency
+			"account_currency": account_currency,
 		}
diff --git a/erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py b/erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py
index 1d7463c..62bee82 100644
--- a/erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py
+++ b/erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py
@@ -12,97 +12,70 @@
 
 	return columns, data
 
+
 def get_data(report_filters):
 	filters = get_report_filters(report_filters)
 	fields = get_report_fields()
 
-	return frappe.get_all('Purchase Invoice',
-		fields= fields, filters=filters)
+	return frappe.get_all("Purchase Invoice", fields=fields, filters=filters)
+
 
 def get_report_filters(report_filters):
-	filters = [['Purchase Invoice','company','=',report_filters.get('company')],
-		['Purchase Invoice','posting_date','<=',report_filters.get('posting_date')], ['Purchase Invoice','docstatus','=',1],
-		['Purchase Invoice','per_received','<',100], ['Purchase Invoice','update_stock','=',0]]
+	filters = [
+		["Purchase Invoice", "company", "=", report_filters.get("company")],
+		["Purchase Invoice", "posting_date", "<=", report_filters.get("posting_date")],
+		["Purchase Invoice", "docstatus", "=", 1],
+		["Purchase Invoice", "per_received", "<", 100],
+		["Purchase Invoice", "update_stock", "=", 0],
+	]
 
-	if report_filters.get('purchase_invoice'):
-		filters.append(['Purchase Invoice','per_received','in',[report_filters.get('purchase_invoice')]])
+	if report_filters.get("purchase_invoice"):
+		filters.append(
+			["Purchase Invoice", "per_received", "in", [report_filters.get("purchase_invoice")]]
+		)
 
 	return filters
 
+
 def get_report_fields():
 	fields = []
-	for p_field in ['name', 'supplier', 'company', 'posting_date', 'currency']:
-		fields.append('`tabPurchase Invoice`.`{}`'.format(p_field))
+	for p_field in ["name", "supplier", "company", "posting_date", "currency"]:
+		fields.append("`tabPurchase Invoice`.`{}`".format(p_field))
 
-	for c_field in ['item_code', 'item_name', 'uom', 'qty', 'received_qty', 'rate', 'amount']:
-		fields.append('`tabPurchase Invoice Item`.`{}`'.format(c_field))
+	for c_field in ["item_code", "item_name", "uom", "qty", "received_qty", "rate", "amount"]:
+		fields.append("`tabPurchase Invoice Item`.`{}`".format(c_field))
 
 	return fields
 
+
 def get_columns():
 	return [
 		{
-			'label': _('Purchase Invoice'),
-			'fieldname': 'name',
-			'fieldtype': 'Link',
-			'options': 'Purchase Invoice',
-			'width': 170
+			"label": _("Purchase Invoice"),
+			"fieldname": "name",
+			"fieldtype": "Link",
+			"options": "Purchase Invoice",
+			"width": 170,
 		},
 		{
-			'label': _('Supplier'),
-			'fieldname': 'supplier',
-			'fieldtype': 'Link',
-			'options': 'Supplier',
-			'width': 120
+			"label": _("Supplier"),
+			"fieldname": "supplier",
+			"fieldtype": "Link",
+			"options": "Supplier",
+			"width": 120,
 		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
 		{
-			'label': _('Posting Date'),
-			'fieldname': 'posting_date',
-			'fieldtype': 'Date',
-			'width': 100
+			"label": _("Item Code"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 100,
 		},
-		{
-			'label': _('Item Code'),
-			'fieldname': 'item_code',
-			'fieldtype': 'Link',
-			'options': 'Item',
-			'width': 100
-		},
-		{
-			'label': _('Item Name'),
-			'fieldname': 'item_name',
-			'fieldtype': 'Data',
-			'width': 100
-		},
-		{
-			'label': _('UOM'),
-			'fieldname': 'uom',
-			'fieldtype': 'Link',
-			'options': 'UOM',
-			'width': 100
-		},
-		{
-			'label': _('Invoiced Qty'),
-			'fieldname': 'qty',
-			'fieldtype': 'Float',
-			'width': 100
-		},
-		{
-			'label': _('Received Qty'),
-			'fieldname': 'received_qty',
-			'fieldtype': 'Float',
-			'width': 100
-		},
-		{
-			'label': _('Rate'),
-			'fieldname': 'rate',
-			'fieldtype': 'Currency',
-			'width': 100
-		},
-		{
-			'label': _('Amount'),
-			'fieldname': 'amount',
-			'fieldtype': 'Currency',
-			'width': 100
-		}
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
+		{"label": _("UOM"), "fieldname": "uom", "fieldtype": "Link", "options": "UOM", "width": 100},
+		{"label": _("Invoiced Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 100},
+		{"label": _("Received Qty"), "fieldname": "received_qty", "fieldtype": "Float", "width": 100},
+		{"label": _("Rate"), "fieldname": "rate", "fieldtype": "Currency", "width": 100},
+		{"label": _("Amount"), "fieldname": "amount", "fieldtype": "Currency", "width": 100},
 	]
diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.py b/erpnext/accounts/report/budget_variance_report/budget_variance_report.py
index 56ee500..ca341f4 100644
--- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.py
+++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.py
@@ -34,6 +34,7 @@
 
 	return columns, data, None, chart
 
+
 def get_final_data(dimension, dimension_items, filters, period_month_ranges, data, DCC_allocation):
 	for account, monthwise_data in dimension_items.items():
 		row = [dimension, account]
@@ -53,16 +54,16 @@
 				period_data[0] += last_total
 
 				if DCC_allocation:
-					period_data[0] = period_data[0]*(DCC_allocation/100)
-					period_data[1] = period_data[1]*(DCC_allocation/100)
+					period_data[0] = period_data[0] * (DCC_allocation / 100)
+					period_data[1] = period_data[1] * (DCC_allocation / 100)
 
-				if(filters.get("show_cumulative")):
+				if filters.get("show_cumulative"):
 					last_total = period_data[0] - period_data[1]
 
 				period_data[2] = period_data[0] - period_data[1]
 				row += period_data
 		totals[2] = totals[0] - totals[1]
-		if filters["period"] != "Yearly" :
+		if filters["period"] != "Yearly":
 			row += totals
 		data.append(row)
 
@@ -72,19 +73,19 @@
 def get_columns(filters):
 	columns = [
 		{
-			'label': _(filters.get("budget_against")),
-			'fieldtype': 'Link',
-			'fieldname': 'budget_against',
-			'options': filters.get('budget_against'),
-			'width': 150
+			"label": _(filters.get("budget_against")),
+			"fieldtype": "Link",
+			"fieldname": "budget_against",
+			"options": filters.get("budget_against"),
+			"width": 150,
 		},
 		{
-			'label': _('Account'),
-			'fieldname': 'Account',
-			'fieldtype': 'Link',
-			'options': 'Account',
-			'width': 150
-		}
+			"label": _("Account"),
+			"fieldname": "Account",
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 150,
+		},
 	]
 
 	group_months = False if filters["period"] == "Monthly" else True
@@ -97,45 +98,34 @@
 				labels = [
 					_("Budget") + " " + str(year[0]),
 					_("Actual ") + " " + str(year[0]),
-					_("Variance ") + " " + str(year[0])
+					_("Variance ") + " " + str(year[0]),
 				]
 				for label in labels:
-					columns.append({
-						'label': label,
-						'fieldtype': 'Float',
-						'fieldname': frappe.scrub(label),
-						'width': 150
-					})
+					columns.append(
+						{"label": label, "fieldtype": "Float", "fieldname": frappe.scrub(label), "width": 150}
+					)
 			else:
 				for label in [
 					_("Budget") + " (%s)" + " " + str(year[0]),
 					_("Actual") + " (%s)" + " " + str(year[0]),
-					_("Variance") + " (%s)" + " " + str(year[0])
+					_("Variance") + " (%s)" + " " + str(year[0]),
 				]:
 					if group_months:
 						label = label % (
-							formatdate(from_date, format_string="MMM")
-							+ "-"
-							+ formatdate(to_date, format_string="MMM")
+							formatdate(from_date, format_string="MMM") + "-" + formatdate(to_date, format_string="MMM")
 						)
 					else:
 						label = label % formatdate(from_date, format_string="MMM")
 
-					columns.append({
-						'label': label,
-						'fieldtype': 'Float',
-						'fieldname': frappe.scrub(label),
-						'width': 150
-					})
+					columns.append(
+						{"label": label, "fieldtype": "Float", "fieldname": frappe.scrub(label), "width": 150}
+					)
 
 	if filters["period"] != "Yearly":
 		for label in [_("Total Budget"), _("Total Actual"), _("Total Variance")]:
-			columns.append({
-				'label': label,
-				'fieldtype': 'Float',
-				'fieldname': frappe.scrub(label),
-				'width': 150
-			})
+			columns.append(
+				{"label": label, "fieldtype": "Float", "fieldname": frappe.scrub(label), "width": 150}
+			)
 
 		return columns
 	else:
@@ -157,8 +147,11 @@
 				where
 					company = %s
 				{order_by}
-			""".format(tab=filters.get("budget_against"), order_by=order_by),
-			filters.get("company"))
+			""".format(
+				tab=filters.get("budget_against"), order_by=order_by
+			),
+			filters.get("company"),
+		)
 	else:
 		return frappe.db.sql_list(
 			"""
@@ -166,7 +159,10 @@
 					name
 				from
 					`tab{tab}`
-			""".format(tab=filters.get("budget_against")))  # nosec
+			""".format(
+				tab=filters.get("budget_against")
+			)
+		)  # nosec
 
 
 # Get dimension & target details
@@ -174,8 +170,9 @@
 	budget_against = frappe.scrub(filters.get("budget_against"))
 	cond = ""
 	if filters.get("budget_against_filter"):
-		cond += """ and b.{budget_against} in (%s)""".format(
-			budget_against=budget_against) % ", ".join(["%s"] * len(filters.get("budget_against_filter")))
+		cond += """ and b.{budget_against} in (%s)""".format(budget_against=budget_against) % ", ".join(
+			["%s"] * len(filters.get("budget_against_filter"))
+		)
 
 	return frappe.db.sql(
 		"""
@@ -209,7 +206,9 @@
 				filters.company,
 			]
 			+ (filters.get("budget_against_filter") or [])
-		), as_dict=True)
+		),
+		as_dict=True,
+	)
 
 
 # Get target distribution details of accounts of cost center
@@ -230,13 +229,14 @@
 			order by
 				md.fiscal_year
 		""",
-		(filters.from_fiscal_year, filters.to_fiscal_year), as_dict=1):
-		target_details.setdefault(d.name, {}).setdefault(
-			d.month, flt(d.percentage_allocation)
-		)
+		(filters.from_fiscal_year, filters.to_fiscal_year),
+		as_dict=1,
+	):
+		target_details.setdefault(d.name, {}).setdefault(d.month, flt(d.percentage_allocation))
 
 	return target_details
 
+
 # Get actual details from gl entry
 def get_actual_details(name, filters):
 	budget_against = frappe.scrub(filters.get("budget_against"))
@@ -247,7 +247,9 @@
 		cond = """
 				and lft >= "{lft}"
 				and rgt <= "{rgt}"
-			""".format(lft=cc_lft, rgt=cc_rgt)
+			""".format(
+			lft=cc_lft, rgt=cc_rgt
+		)
 
 	ac_details = frappe.db.sql(
 		"""
@@ -281,8 +283,12 @@
 				group by
 					gl.name
 				order by gl.fiscal_year
-		""".format(tab=filters.budget_against, budget_against=budget_against, cond=cond),
-		(filters.from_fiscal_year, filters.to_fiscal_year, name), as_dict=1)
+		""".format(
+			tab=filters.budget_against, budget_against=budget_against, cond=cond
+		),
+		(filters.from_fiscal_year, filters.to_fiscal_year, name),
+		as_dict=1,
+	)
 
 	cc_actual_details = {}
 	for d in ac_details:
@@ -290,6 +296,7 @@
 
 	return cc_actual_details
 
+
 def get_dimension_account_month_map(filters):
 	dimension_target_details = get_dimension_target_details(filters)
 	tdd = get_target_distribution_details(filters)
@@ -301,17 +308,13 @@
 
 		for month_id in range(1, 13):
 			month = datetime.date(2013, month_id, 1).strftime("%B")
-			cam_map.setdefault(ccd.budget_against, {}).setdefault(
-				ccd.account, {}
-			).setdefault(ccd.fiscal_year, {}).setdefault(
-				month, frappe._dict({"target": 0.0, "actual": 0.0})
-			)
+			cam_map.setdefault(ccd.budget_against, {}).setdefault(ccd.account, {}).setdefault(
+				ccd.fiscal_year, {}
+			).setdefault(month, frappe._dict({"target": 0.0, "actual": 0.0}))
 
 			tav_dict = cam_map[ccd.budget_against][ccd.account][ccd.fiscal_year][month]
 			month_percentage = (
-				tdd.get(ccd.monthly_distribution, {}).get(month, 0)
-				if ccd.monthly_distribution
-				else 100.0 / 12
+				tdd.get(ccd.monthly_distribution, {}).get(month, 0) if ccd.monthly_distribution else 100.0 / 12
 			)
 
 			tav_dict.target = flt(ccd.budget_amount) * month_percentage / 100
@@ -334,13 +337,12 @@
 			where
 				name between %(from_fiscal_year)s and %(to_fiscal_year)s
 		""",
-		{
-			"from_fiscal_year": filters["from_fiscal_year"],
-			"to_fiscal_year": filters["to_fiscal_year"]
-		})
+		{"from_fiscal_year": filters["from_fiscal_year"], "to_fiscal_year": filters["to_fiscal_year"]},
+	)
 
 	return fiscal_year
 
+
 def get_chart_data(filters, columns, data):
 
 	if not data:
@@ -353,12 +355,13 @@
 
 	for year in fiscal_year:
 		for from_date, to_date in get_period_date_ranges(filters["period"], year[0]):
-			if filters['period'] == 'Yearly':
+			if filters["period"] == "Yearly":
 				labels.append(year[0])
 			else:
 				if group_months:
-					label = formatdate(from_date, format_string="MMM") + "-" \
-						+ formatdate(to_date, format_string="MMM")
+					label = (
+						formatdate(from_date, format_string="MMM") + "-" + formatdate(to_date, format_string="MMM")
+					)
 					labels.append(label)
 				else:
 					label = formatdate(from_date, format_string="MMM")
@@ -373,16 +376,16 @@
 
 		for i in range(no_of_columns):
 			budget_values[i] += values[index]
-			actual_values[i] += values[index+1]
+			actual_values[i] += values[index + 1]
 			index += 3
 
 	return {
-		'data': {
-			'labels': labels,
-			'datasets': [
-				{'name': 'Budget', 'chartType': 'bar', 'values': budget_values},
-				{'name': 'Actual Expense', 'chartType': 'bar', 'values': actual_values}
-			]
+		"data": {
+			"labels": labels,
+			"datasets": [
+				{"name": "Budget", "chartType": "bar", "values": budget_values},
+				{"name": "Actual Expense", "chartType": "bar", "values": actual_values},
+			],
 		},
-		'type' : 'bar'
+		"type": "bar",
 	}
diff --git a/erpnext/accounts/report/cash_flow/cash_flow.py b/erpnext/accounts/report/cash_flow/cash_flow.py
index 15041f2..74926b9 100644
--- a/erpnext/accounts/report/cash_flow/cash_flow.py
+++ b/erpnext/accounts/report/cash_flow/cash_flow.py
@@ -19,65 +19,103 @@
 
 
 def execute(filters=None):
-	if cint(frappe.db.get_single_value('Accounts Settings', 'use_custom_cash_flow')):
+	if cint(frappe.db.get_single_value("Accounts Settings", "use_custom_cash_flow")):
 		from erpnext.accounts.report.cash_flow.custom_cash_flow import execute as execute_custom
+
 		return execute_custom(filters=filters)
 
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
-		filters.period_start_date, filters.period_end_date, filters.filter_based_on,
-		filters.periodicity, company=filters.company)
+	period_list = get_period_list(
+		filters.from_fiscal_year,
+		filters.to_fiscal_year,
+		filters.period_start_date,
+		filters.period_end_date,
+		filters.filter_based_on,
+		filters.periodicity,
+		company=filters.company,
+	)
 
 	cash_flow_accounts = get_cash_flow_accounts()
 
 	# compute net profit / loss
-	income = get_data(filters.company, "Income", "Credit", period_list, filters=filters,
-		accumulated_values=filters.accumulated_values, ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
-	expense = get_data(filters.company, "Expense", "Debit", period_list, filters=filters,
-		accumulated_values=filters.accumulated_values, ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
+	income = get_data(
+		filters.company,
+		"Income",
+		"Credit",
+		period_list,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
+	)
+	expense = get_data(
+		filters.company,
+		"Expense",
+		"Debit",
+		period_list,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
+	)
 
 	net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company)
 
 	data = []
 	summary_data = {}
-	company_currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	company_currency = frappe.get_cached_value("Company", filters.company, "default_currency")
 
 	for cash_flow_account in cash_flow_accounts:
 		section_data = []
-		data.append({
-			"account_name": cash_flow_account['section_header'],
-			"parent_account": None,
-			"indent": 0.0,
-			"account": cash_flow_account['section_header']
-		})
+		data.append(
+			{
+				"account_name": cash_flow_account["section_header"],
+				"parent_account": None,
+				"indent": 0.0,
+				"account": cash_flow_account["section_header"],
+			}
+		)
 
 		if len(data) == 1:
 			# add first net income in operations section
 			if net_profit_loss:
-				net_profit_loss.update({
-					"indent": 1,
-					"parent_account": cash_flow_accounts[0]['section_header']
-				})
+				net_profit_loss.update(
+					{"indent": 1, "parent_account": cash_flow_accounts[0]["section_header"]}
+				)
 				data.append(net_profit_loss)
 				section_data.append(net_profit_loss)
 
-		for account in cash_flow_account['account_types']:
-			account_data = get_account_type_based_data(filters.company,
-				account['account_type'], period_list, filters.accumulated_values, filters)
-			account_data.update({
-				"account_name": account['label'],
-				"account": account['label'],
-				"indent": 1,
-				"parent_account": cash_flow_account['section_header'],
-				"currency": company_currency
-			})
+		for account in cash_flow_account["account_types"]:
+			account_data = get_account_type_based_data(
+				filters.company, account["account_type"], period_list, filters.accumulated_values, filters
+			)
+			account_data.update(
+				{
+					"account_name": account["label"],
+					"account": account["label"],
+					"indent": 1,
+					"parent_account": cash_flow_account["section_header"],
+					"currency": company_currency,
+				}
+			)
 			data.append(account_data)
 			section_data.append(account_data)
 
-		add_total_row_account(data, section_data, cash_flow_account['section_footer'],
-			period_list, company_currency, summary_data, filters)
+		add_total_row_account(
+			data,
+			section_data,
+			cash_flow_account["section_footer"],
+			period_list,
+			company_currency,
+			summary_data,
+			filters,
+		)
 
-	add_total_row_account(data, data, _("Net Change in Cash"), period_list, company_currency, summary_data, filters)
-	columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, filters.company)
+	add_total_row_account(
+		data, data, _("Net Change in Cash"), period_list, company_currency, summary_data, filters
+	)
+	columns = get_columns(
+		filters.periodicity, period_list, filters.accumulated_values, filters.company
+	)
 
 	chart = get_chart_data(columns, data)
 
@@ -85,6 +123,7 @@
 
 	return columns, data, None, chart, report_summary
 
+
 def get_cash_flow_accounts():
 	operation_accounts = {
 		"section_name": "Operations",
@@ -94,39 +133,37 @@
 			{"account_type": "Depreciation", "label": _("Depreciation")},
 			{"account_type": "Receivable", "label": _("Net Change in Accounts Receivable")},
 			{"account_type": "Payable", "label": _("Net Change in Accounts Payable")},
-			{"account_type": "Stock", "label": _("Net Change in Inventory")}
-		]
+			{"account_type": "Stock", "label": _("Net Change in Inventory")},
+		],
 	}
 
 	investing_accounts = {
 		"section_name": "Investing",
 		"section_footer": _("Net Cash from Investing"),
 		"section_header": _("Cash Flow from Investing"),
-		"account_types": [
-			{"account_type": "Fixed Asset", "label": _("Net Change in Fixed Asset")}
-		]
+		"account_types": [{"account_type": "Fixed Asset", "label": _("Net Change in Fixed Asset")}],
 	}
 
 	financing_accounts = {
 		"section_name": "Financing",
 		"section_footer": _("Net Cash from Financing"),
 		"section_header": _("Cash Flow from Financing"),
-		"account_types": [
-			{"account_type": "Equity", "label": _("Net Change in Equity")}
-		]
+		"account_types": [{"account_type": "Equity", "label": _("Net Change in Equity")}],
 	}
 
 	# combine all cash flow accounts for iteration
 	return [operation_accounts, investing_accounts, financing_accounts]
 
+
 def get_account_type_based_data(company, account_type, period_list, accumulated_values, filters):
 	data = {}
 	total = 0
 	for period in period_list:
 		start_date = get_start_date(period, accumulated_values, company)
 
-		amount = get_account_type_based_gl_data(company, start_date,
-			period['to_date'], account_type, filters)
+		amount = get_account_type_based_gl_data(
+			company, start_date, period["to_date"], account_type, filters
+		)
 
 		if amount and account_type == "Depreciation":
 			amount *= -1
@@ -137,31 +174,42 @@
 	data["total"] = total
 	return data
 
+
 def get_account_type_based_gl_data(company, start_date, end_date, account_type, filters=None):
 	cond = ""
 	filters = frappe._dict(filters or {})
 
 	if filters.include_default_book_entries:
-		company_fb = frappe.db.get_value("Company", company, 'default_finance_book')
+		company_fb = frappe.db.get_value("Company", company, "default_finance_book")
 		cond = """ AND (finance_book in (%s, %s, '') OR finance_book IS NULL)
-			""" %(frappe.db.escape(filters.finance_book), frappe.db.escape(company_fb))
+			""" % (
+			frappe.db.escape(filters.finance_book),
+			frappe.db.escape(company_fb),
+		)
 	else:
-		cond = " AND (finance_book in (%s, '') OR finance_book IS NULL)" %(frappe.db.escape(cstr(filters.finance_book)))
+		cond = " AND (finance_book in (%s, '') OR finance_book IS NULL)" % (
+			frappe.db.escape(cstr(filters.finance_book))
+		)
 
-
-	gl_sum = frappe.db.sql_list("""
+	gl_sum = frappe.db.sql_list(
+		"""
 		select sum(credit) - sum(debit)
 		from `tabGL Entry`
 		where company=%s and posting_date >= %s and posting_date <= %s
 			and voucher_type != 'Period Closing Voucher'
 			and account in ( SELECT name FROM tabAccount WHERE account_type = %s) {cond}
-	""".format(cond=cond), (company, start_date, end_date, account_type))
+	""".format(
+			cond=cond
+		),
+		(company, start_date, end_date, account_type),
+	)
 
 	return gl_sum[0] if gl_sum and gl_sum[0] else 0
 
+
 def get_start_date(period, accumulated_values, company):
-	if not accumulated_values and period.get('from_date'):
-		return period['from_date']
+	if not accumulated_values and period.get("from_date"):
+		return period["from_date"]
 
 	start_date = period["year_start_date"]
 	if accumulated_values:
@@ -169,23 +217,26 @@
 
 	return start_date
 
-def add_total_row_account(out, data, label, period_list, currency, summary_data, filters, consolidated=False):
+
+def add_total_row_account(
+	out, data, label, period_list, currency, summary_data, filters, consolidated=False
+):
 	total_row = {
 		"account_name": "'" + _("{0}").format(label) + "'",
 		"account": "'" + _("{0}").format(label) + "'",
-		"currency": currency
+		"currency": currency,
 	}
 
 	summary_data[label] = 0
 
 	# from consolidated financial statement
-	if filters.get('accumulated_in_group_company'):
+	if filters.get("accumulated_in_group_company"):
 		period_list = get_filtered_list_for_consolidated_report(filters, period_list)
 
 	for row in data:
 		if row.get("parent_account"):
 			for period in period_list:
-				key = period if consolidated else period['key']
+				key = period if consolidated else period["key"]
 				total_row.setdefault(key, 0.0)
 				total_row[key] += row.get(key, 0.0)
 				summary_data[label] += row.get(key)
@@ -202,12 +253,7 @@
 
 	for label, value in summary_data.items():
 		report_summary.append(
-			{
-				"value": value,
-				"label": label,
-				"datatype": "Currency",
-				"currency": currency
-			}
+			{"value": value, "label": label, "datatype": "Currency", "currency": currency}
 		)
 
 	return report_summary
@@ -215,16 +261,14 @@
 
 def get_chart_data(columns, data):
 	labels = [d.get("label") for d in columns[2:]]
-	datasets = [{'name':account.get('account').replace("'", ""), 'values': [account.get('total')]}  for account in data if account.get('parent_account') == None and account.get('currency')]
+	datasets = [
+		{"name": account.get("account").replace("'", ""), "values": [account.get("total")]}
+		for account in data
+		if account.get("parent_account") == None and account.get("currency")
+	]
 	datasets = datasets[:-1]
 
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		},
-		"type": "bar"
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}, "type": "bar"}
 
 	chart["fieldtype"] = "Currency"
 
diff --git a/erpnext/accounts/report/cash_flow/custom_cash_flow.py b/erpnext/accounts/report/cash_flow/custom_cash_flow.py
index e81e0d7..b165c88 100644
--- a/erpnext/accounts/report/cash_flow/custom_cash_flow.py
+++ b/erpnext/accounts/report/cash_flow/custom_cash_flow.py
@@ -14,48 +14,59 @@
 
 
 def get_mapper_for(mappers, position):
-	mapper_list = list(filter(lambda x: x['position'] == position, mappers))
+	mapper_list = list(filter(lambda x: x["position"] == position, mappers))
 	return mapper_list[0] if mapper_list else []
 
 
 def get_mappers_from_db():
 	return frappe.get_all(
-		'Cash Flow Mapper',
+		"Cash Flow Mapper",
 		fields=[
-			'section_name', 'section_header', 'section_leader', 'section_subtotal',
-			'section_footer', 'name', 'position'],
-		order_by='position'
+			"section_name",
+			"section_header",
+			"section_leader",
+			"section_subtotal",
+			"section_footer",
+			"name",
+			"position",
+		],
+		order_by="position",
 	)
 
 
 def get_accounts_in_mappers(mapping_names):
-	cfm = frappe.qb.DocType('Cash Flow Mapping')
-	cfma = frappe.qb.DocType('Cash Flow Mapping Accounts')
+	cfm = frappe.qb.DocType("Cash Flow Mapping")
+	cfma = frappe.qb.DocType("Cash Flow Mapping Accounts")
 	result = (
-		frappe.qb
-			.select(
-				cfma.name, cfm.label, cfm.is_working_capital,
-				cfm.is_income_tax_liability, cfm.is_income_tax_expense,
-				cfm.is_finance_cost, cfm.is_finance_cost_adjustment, cfma.account
-			)
-			.from_(cfm)
-			.join(cfma)
-			.on(cfm.name == cfma.parent)
-			.where(cfma.parent.isin(mapping_names))
-		).run()
+		frappe.qb.select(
+			cfma.name,
+			cfm.label,
+			cfm.is_working_capital,
+			cfm.is_income_tax_liability,
+			cfm.is_income_tax_expense,
+			cfm.is_finance_cost,
+			cfm.is_finance_cost_adjustment,
+			cfma.account,
+		)
+		.from_(cfm)
+		.join(cfma)
+		.on(cfm.name == cfma.parent)
+		.where(cfma.parent.isin(mapping_names))
+	).run()
 
 	return result
 
+
 def setup_mappers(mappers):
 	cash_flow_accounts = []
 
 	for mapping in mappers:
-		mapping['account_types'] = []
-		mapping['tax_liabilities'] = []
-		mapping['tax_expenses'] = []
-		mapping['finance_costs'] = []
-		mapping['finance_costs_adjustments'] = []
-		doc = frappe.get_doc('Cash Flow Mapper', mapping['name'])
+		mapping["account_types"] = []
+		mapping["tax_liabilities"] = []
+		mapping["tax_expenses"] = []
+		mapping["finance_costs"] = []
+		mapping["finance_costs_adjustments"] = []
+		doc = frappe.get_doc("Cash Flow Mapper", mapping["name"])
 		mapping_names = [item.name for item in doc.accounts]
 
 		if not mapping_names:
@@ -65,96 +76,123 @@
 
 		account_types = [
 			dict(
-				name=account[0], account_name=account[7], label=account[1], is_working_capital=account[2],
-				is_income_tax_liability=account[3], is_income_tax_expense=account[4]
-			) for account in accounts if not account[3]]
+				name=account[0],
+				account_name=account[7],
+				label=account[1],
+				is_working_capital=account[2],
+				is_income_tax_liability=account[3],
+				is_income_tax_expense=account[4],
+			)
+			for account in accounts
+			if not account[3]
+		]
 
 		finance_costs_adjustments = [
 			dict(
-				name=account[0], account_name=account[7], label=account[1], is_finance_cost=account[5],
-				is_finance_cost_adjustment=account[6]
-			) for account in accounts if account[6]]
+				name=account[0],
+				account_name=account[7],
+				label=account[1],
+				is_finance_cost=account[5],
+				is_finance_cost_adjustment=account[6],
+			)
+			for account in accounts
+			if account[6]
+		]
 
 		tax_liabilities = [
 			dict(
-				name=account[0], account_name=account[7], label=account[1], is_income_tax_liability=account[3],
-				is_income_tax_expense=account[4]
-			) for account in accounts if account[3]]
+				name=account[0],
+				account_name=account[7],
+				label=account[1],
+				is_income_tax_liability=account[3],
+				is_income_tax_expense=account[4],
+			)
+			for account in accounts
+			if account[3]
+		]
 
 		tax_expenses = [
 			dict(
-				name=account[0], account_name=account[7], label=account[1], is_income_tax_liability=account[3],
-				is_income_tax_expense=account[4]
-			) for account in accounts if account[4]]
+				name=account[0],
+				account_name=account[7],
+				label=account[1],
+				is_income_tax_liability=account[3],
+				is_income_tax_expense=account[4],
+			)
+			for account in accounts
+			if account[4]
+		]
 
 		finance_costs = [
-			dict(
-				name=account[0], account_name=account[7], label=account[1], is_finance_cost=account[5])
-			for account in accounts if account[5]]
+			dict(name=account[0], account_name=account[7], label=account[1], is_finance_cost=account[5])
+			for account in accounts
+			if account[5]
+		]
 
 		account_types_labels = sorted(
 			set(
-				(d['label'], d['is_working_capital'], d['is_income_tax_liability'], d['is_income_tax_expense'])
-					for d in account_types
+				(d["label"], d["is_working_capital"], d["is_income_tax_liability"], d["is_income_tax_expense"])
+				for d in account_types
 			),
-			key=lambda x: x[1]
+			key=lambda x: x[1],
 		)
 
 		fc_adjustment_labels = sorted(
 			set(
-				[(d['label'], d['is_finance_cost'], d['is_finance_cost_adjustment'])
-					for d in finance_costs_adjustments if d['is_finance_cost_adjustment']]
+				[
+					(d["label"], d["is_finance_cost"], d["is_finance_cost_adjustment"])
+					for d in finance_costs_adjustments
+					if d["is_finance_cost_adjustment"]
+				]
 			),
-			key=lambda x: x[2]
+			key=lambda x: x[2],
 		)
 
 		unique_liability_labels = sorted(
 			set(
-				[(d['label'], d['is_income_tax_liability'], d['is_income_tax_expense'])
-					for d in tax_liabilities]
+				[
+					(d["label"], d["is_income_tax_liability"], d["is_income_tax_expense"])
+					for d in tax_liabilities
+				]
 			),
-			key=lambda x: x[0]
+			key=lambda x: x[0],
 		)
 
 		unique_expense_labels = sorted(
 			set(
-				[(d['label'], d['is_income_tax_liability'], d['is_income_tax_expense'])
-					for d in tax_expenses]
+				[(d["label"], d["is_income_tax_liability"], d["is_income_tax_expense"]) for d in tax_expenses]
 			),
-			key=lambda x: x[0]
+			key=lambda x: x[0],
 		)
 
 		unique_finance_costs_labels = sorted(
-			set(
-				[(d['label'], d['is_finance_cost']) for d in finance_costs]
-			),
-			key=lambda x: x[0]
+			set([(d["label"], d["is_finance_cost"]) for d in finance_costs]), key=lambda x: x[0]
 		)
 
 		for label in account_types_labels:
-			names = [d['account_name'] for d in account_types if d['label'] == label[0]]
+			names = [d["account_name"] for d in account_types if d["label"] == label[0]]
 			m = dict(label=label[0], names=names, is_working_capital=label[1])
-			mapping['account_types'].append(m)
+			mapping["account_types"].append(m)
 
 		for label in fc_adjustment_labels:
-			names = [d['account_name'] for d in finance_costs_adjustments if d['label'] == label[0]]
+			names = [d["account_name"] for d in finance_costs_adjustments if d["label"] == label[0]]
 			m = dict(label=label[0], names=names)
-			mapping['finance_costs_adjustments'].append(m)
+			mapping["finance_costs_adjustments"].append(m)
 
 		for label in unique_liability_labels:
-			names = [d['account_name'] for d in tax_liabilities if d['label'] == label[0]]
+			names = [d["account_name"] for d in tax_liabilities if d["label"] == label[0]]
 			m = dict(label=label[0], names=names, tax_liability=label[1], tax_expense=label[2])
-			mapping['tax_liabilities'].append(m)
+			mapping["tax_liabilities"].append(m)
 
 		for label in unique_expense_labels:
-			names = [d['account_name'] for d in tax_expenses if d['label'] == label[0]]
+			names = [d["account_name"] for d in tax_expenses if d["label"] == label[0]]
 			m = dict(label=label[0], names=names, tax_liability=label[1], tax_expense=label[2])
-			mapping['tax_expenses'].append(m)
+			mapping["tax_expenses"].append(m)
 
 		for label in unique_finance_costs_labels:
-			names = [d['account_name'] for d in finance_costs if d['label'] == label[0]]
+			names = [d["account_name"] for d in finance_costs if d["label"] == label[0]]
 			m = dict(label=label[0], names=names, is_finance_cost=label[1])
-			mapping['finance_costs'].append(m)
+			mapping["finance_costs"].append(m)
 
 		cash_flow_accounts.append(mapping)
 
@@ -162,119 +200,145 @@
 
 
 def add_data_for_operating_activities(
-	filters, company_currency, profit_data, period_list, light_mappers, mapper, data):
+	filters, company_currency, profit_data, period_list, light_mappers, mapper, data
+):
 	has_added_working_capital_header = False
 	section_data = []
 
-	data.append({
-		"account_name": mapper['section_header'],
-		"parent_account": None,
-		"indent": 0.0,
-		"account": mapper['section_header']
-	})
+	data.append(
+		{
+			"account_name": mapper["section_header"],
+			"parent_account": None,
+			"indent": 0.0,
+			"account": mapper["section_header"],
+		}
+	)
 
 	if profit_data:
-		profit_data.update({
-			"indent": 1,
-			"parent_account": get_mapper_for(light_mappers, position=1)['section_header']
-		})
+		profit_data.update(
+			{"indent": 1, "parent_account": get_mapper_for(light_mappers, position=1)["section_header"]}
+		)
 		data.append(profit_data)
 		section_data.append(profit_data)
 
-		data.append({
-			"account_name": mapper["section_leader"],
-			"parent_account": None,
-			"indent": 1.0,
-			"account": mapper["section_leader"]
-		})
-
-	for account in mapper['account_types']:
-		if account['is_working_capital'] and not has_added_working_capital_header:
-			data.append({
-				"account_name": 'Movement in working capital',
+		data.append(
+			{
+				"account_name": mapper["section_leader"],
 				"parent_account": None,
 				"indent": 1.0,
-				"account": ""
-			})
+				"account": mapper["section_leader"],
+			}
+		)
+
+	for account in mapper["account_types"]:
+		if account["is_working_capital"] and not has_added_working_capital_header:
+			data.append(
+				{
+					"account_name": "Movement in working capital",
+					"parent_account": None,
+					"indent": 1.0,
+					"account": "",
+				}
+			)
 			has_added_working_capital_header = True
 
 		account_data = _get_account_type_based_data(
-			filters, account['names'], period_list, filters.accumulated_values)
+			filters, account["names"], period_list, filters.accumulated_values
+		)
 
-		if not account['is_working_capital']:
+		if not account["is_working_capital"]:
 			for key in account_data:
-				if key != 'total':
+				if key != "total":
 					account_data[key] *= -1
 
-		if account_data['total'] != 0:
-			account_data.update({
-				"account_name": account['label'],
-				"account": account['names'],
-				"indent": 1.0,
-				"parent_account": mapper['section_header'],
-				"currency": company_currency
-			})
+		if account_data["total"] != 0:
+			account_data.update(
+				{
+					"account_name": account["label"],
+					"account": account["names"],
+					"indent": 1.0,
+					"parent_account": mapper["section_header"],
+					"currency": company_currency,
+				}
+			)
 			data.append(account_data)
 			section_data.append(account_data)
 
 	_add_total_row_account(
-		data, section_data, mapper['section_subtotal'], period_list, company_currency, indent=1)
+		data, section_data, mapper["section_subtotal"], period_list, company_currency, indent=1
+	)
 
 	# calculate adjustment for tax paid and add to data
-	if not mapper['tax_liabilities']:
-		mapper['tax_liabilities'] = [
-			dict(label='Income tax paid', names=[''], tax_liability=1, tax_expense=0)]
+	if not mapper["tax_liabilities"]:
+		mapper["tax_liabilities"] = [
+			dict(label="Income tax paid", names=[""], tax_liability=1, tax_expense=0)
+		]
 
-	for account in mapper['tax_liabilities']:
+	for account in mapper["tax_liabilities"]:
 		tax_paid = calculate_adjustment(
-			filters, mapper['tax_liabilities'], mapper['tax_expenses'],
-			filters.accumulated_values, period_list)
+			filters,
+			mapper["tax_liabilities"],
+			mapper["tax_expenses"],
+			filters.accumulated_values,
+			period_list,
+		)
 
 		if tax_paid:
-			tax_paid.update({
-				'parent_account': mapper['section_header'],
-				'currency': company_currency,
-				'account_name': account['label'],
-				'indent': 1.0
-			})
+			tax_paid.update(
+				{
+					"parent_account": mapper["section_header"],
+					"currency": company_currency,
+					"account_name": account["label"],
+					"indent": 1.0,
+				}
+			)
 			data.append(tax_paid)
 			section_data.append(tax_paid)
 
-	if not mapper['finance_costs_adjustments']:
-		mapper['finance_costs_adjustments'] = [dict(label='Interest Paid', names=[''])]
+	if not mapper["finance_costs_adjustments"]:
+		mapper["finance_costs_adjustments"] = [dict(label="Interest Paid", names=[""])]
 
-	for account in mapper['finance_costs_adjustments']:
+	for account in mapper["finance_costs_adjustments"]:
 		interest_paid = calculate_adjustment(
-			filters, mapper['finance_costs_adjustments'], mapper['finance_costs'],
-			filters.accumulated_values, period_list
+			filters,
+			mapper["finance_costs_adjustments"],
+			mapper["finance_costs"],
+			filters.accumulated_values,
+			period_list,
 		)
 
 		if interest_paid:
-			interest_paid.update({
-				'parent_account': mapper['section_header'],
-				'currency': company_currency,
-				'account_name': account['label'],
-				'indent': 1.0
-			})
+			interest_paid.update(
+				{
+					"parent_account": mapper["section_header"],
+					"currency": company_currency,
+					"account_name": account["label"],
+					"indent": 1.0,
+				}
+			)
 			data.append(interest_paid)
 			section_data.append(interest_paid)
 
 	_add_total_row_account(
-		data, section_data, mapper['section_footer'], period_list, company_currency)
+		data, section_data, mapper["section_footer"], period_list, company_currency
+	)
 
 
-def calculate_adjustment(filters, non_expense_mapper, expense_mapper, use_accumulated_values, period_list):
-	liability_accounts = [d['names'] for d in non_expense_mapper]
-	expense_accounts = [d['names'] for d in expense_mapper]
+def calculate_adjustment(
+	filters, non_expense_mapper, expense_mapper, use_accumulated_values, period_list
+):
+	liability_accounts = [d["names"] for d in non_expense_mapper]
+	expense_accounts = [d["names"] for d in expense_mapper]
 
-	non_expense_closing = _get_account_type_based_data(
-		filters, liability_accounts, period_list, 0)
+	non_expense_closing = _get_account_type_based_data(filters, liability_accounts, period_list, 0)
 
 	non_expense_opening = _get_account_type_based_data(
-		filters, liability_accounts, period_list, use_accumulated_values, opening_balances=1)
+		filters, liability_accounts, period_list, use_accumulated_values, opening_balances=1
+	)
 
 	expense_data = _get_account_type_based_data(
-		filters, expense_accounts, period_list, use_accumulated_values)
+		filters, expense_accounts, period_list, use_accumulated_values
+	)
 
 	data = _calculate_adjustment(non_expense_closing, non_expense_opening, expense_data)
 	return data
@@ -284,7 +348,9 @@
 	account_data = {}
 	for month in non_expense_opening.keys():
 		if non_expense_opening[month] and non_expense_closing[month]:
-			account_data[month] = non_expense_opening[month] - expense_data[month] + non_expense_closing[month]
+			account_data[month] = (
+				non_expense_opening[month] - expense_data[month] + non_expense_closing[month]
+			)
 		elif expense_data[month]:
 			account_data[month] = expense_data[month]
 
@@ -292,32 +358,39 @@
 
 
 def add_data_for_other_activities(
-	filters, company_currency, profit_data, period_list, light_mappers, mapper_list, data):
+	filters, company_currency, profit_data, period_list, light_mappers, mapper_list, data
+):
 	for mapper in mapper_list:
 		section_data = []
-		data.append({
-			"account_name": mapper['section_header'],
-			"parent_account": None,
-			"indent": 0.0,
-			"account": mapper['section_header']
-		})
+		data.append(
+			{
+				"account_name": mapper["section_header"],
+				"parent_account": None,
+				"indent": 0.0,
+				"account": mapper["section_header"],
+			}
+		)
 
-		for account in mapper['account_types']:
-			account_data = _get_account_type_based_data(filters,
-				account['names'], period_list, filters.accumulated_values)
-			if account_data['total'] != 0:
-				account_data.update({
-					"account_name": account['label'],
-					"account": account['names'],
-					"indent": 1,
-					"parent_account": mapper['section_header'],
-					"currency": company_currency
-				})
+		for account in mapper["account_types"]:
+			account_data = _get_account_type_based_data(
+				filters, account["names"], period_list, filters.accumulated_values
+			)
+			if account_data["total"] != 0:
+				account_data.update(
+					{
+						"account_name": account["label"],
+						"account": account["names"],
+						"indent": 1,
+						"parent_account": mapper["section_header"],
+						"currency": company_currency,
+					}
+				)
 				data.append(account_data)
 				section_data.append(account_data)
 
-		_add_total_row_account(data, section_data, mapper['section_footer'],
-			period_list, company_currency)
+		_add_total_row_account(
+			data, section_data, mapper["section_footer"], period_list, company_currency
+		)
 
 
 def compute_data(filters, company_currency, profit_data, period_list, light_mappers, full_mapper):
@@ -326,13 +399,18 @@
 	operating_activities_mapper = get_mapper_for(light_mappers, position=1)
 	other_mappers = [
 		get_mapper_for(light_mappers, position=2),
-		get_mapper_for(light_mappers, position=3)
+		get_mapper_for(light_mappers, position=3),
 	]
 
 	if operating_activities_mapper:
 		add_data_for_operating_activities(
-			filters, company_currency, profit_data, period_list, light_mappers,
-			operating_activities_mapper, data
+			filters,
+			company_currency,
+			profit_data,
+			period_list,
+			light_mappers,
+			operating_activities_mapper,
+			data,
 		)
 
 	if all(other_mappers):
@@ -344,10 +422,17 @@
 
 
 def execute(filters=None):
-	if not filters.periodicity: filters.periodicity = "Monthly"
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
-		filters.period_start_date, filters.period_end_date, filters.filter_based_on,
-		filters.periodicity, company=filters.company)
+	if not filters.periodicity:
+		filters.periodicity = "Monthly"
+	period_list = get_period_list(
+		filters.from_fiscal_year,
+		filters.to_fiscal_year,
+		filters.period_start_date,
+		filters.period_end_date,
+		filters.filter_based_on,
+		filters.periodicity,
+		company=filters.company,
+	)
 
 	mappers = get_mappers_from_db()
 
@@ -355,30 +440,46 @@
 
 	# compute net profit / loss
 	income = get_data(
-		filters.company, "Income", "Credit", period_list, filters=filters,
-		accumulated_values=filters.accumulated_values, ignore_closing_entries=True,
-		ignore_accumulated_values_for_fy=True
+		filters.company,
+		"Income",
+		"Credit",
+		period_list,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
 	)
 
 	expense = get_data(
-		filters.company, "Expense", "Debit", period_list, filters=filters,
-		accumulated_values=filters.accumulated_values, ignore_closing_entries=True,
-		ignore_accumulated_values_for_fy=True
+		filters.company,
+		"Expense",
+		"Debit",
+		period_list,
+		filters=filters,
+		accumulated_values=filters.accumulated_values,
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
 	)
 
 	net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company)
 
-	company_currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	company_currency = frappe.get_cached_value("Company", filters.company, "default_currency")
 
-	data = compute_data(filters, company_currency, net_profit_loss, period_list, mappers, cash_flow_accounts)
+	data = compute_data(
+		filters, company_currency, net_profit_loss, period_list, mappers, cash_flow_accounts
+	)
 
 	_add_total_row_account(data, data, _("Net Change in Cash"), period_list, company_currency)
-	columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, filters.company)
+	columns = get_columns(
+		filters.periodicity, period_list, filters.accumulated_values, filters.company
+	)
 
 	return columns, data
 
 
-def _get_account_type_based_data(filters, account_names, period_list, accumulated_values, opening_balances=0):
+def _get_account_type_based_data(
+	filters, account_names, period_list, accumulated_values, opening_balances=0
+):
 	if not account_names or not account_names[0] or not type(account_names[0]) == str:
 		# only proceed if account_names is a list of account names
 		return {}
@@ -388,26 +489,23 @@
 	company = filters.company
 	data = {}
 	total = 0
-	GLEntry = frappe.qb.DocType('GL Entry')
-	Account = frappe.qb.DocType('Account')
+	GLEntry = frappe.qb.DocType("GL Entry")
+	Account = frappe.qb.DocType("Account")
 
 	for period in period_list:
 		start_date = get_start_date(period, accumulated_values, company)
 
 		account_subquery = (
 			frappe.qb.from_(Account)
-			.where(
-				(Account.name.isin(account_names)) |
-				(Account.parent_account.isin(account_names))
-			)
+			.where((Account.name.isin(account_names)) | (Account.parent_account.isin(account_names)))
 			.select(Account.name)
 			.as_("account_subquery")
 		)
 
 		if opening_balances:
 			date_info = dict(date=start_date)
-			months_map = {'Monthly': -1, 'Quarterly': -3, 'Half-Yearly': -6}
-			years_map = {'Yearly': -1}
+			months_map = {"Monthly": -1, "Quarterly": -3, "Half-Yearly": -6}
+			years_map = {"Yearly": -1}
 
 			if months_map.get(filters.periodicity):
 				date_info.update(months=months_map[filters.periodicity])
@@ -415,25 +513,25 @@
 				date_info.update(years=years_map[filters.periodicity])
 
 			if accumulated_values:
-				start, end = add_to_date(start_date, years=-1), add_to_date(period['to_date'], years=-1)
+				start, end = add_to_date(start_date, years=-1), add_to_date(period["to_date"], years=-1)
 			else:
 				start, end = add_to_date(**date_info), add_to_date(**date_info)
 
 			start, end = get_date_str(start), get_date_str(end)
 
 		else:
-			start, end = start_date if accumulated_values else period['from_date'], period['to_date']
+			start, end = start_date if accumulated_values else period["from_date"], period["to_date"]
 			start, end = get_date_str(start), get_date_str(end)
 
 		result = (
 			frappe.qb.from_(GLEntry)
 			.select(Sum(GLEntry.credit) - Sum(GLEntry.debit))
 			.where(
-				(GLEntry.company == company) &
-				(GLEntry.posting_date >= start) &
-				(GLEntry.posting_date <= end) &
-				(GLEntry.voucher_type != 'Period Closing Voucher') &
-				(GLEntry.account.isin(account_subquery))
+				(GLEntry.company == company)
+				& (GLEntry.posting_date >= start)
+				& (GLEntry.posting_date <= end)
+				& (GLEntry.voucher_type != "Period Closing Voucher")
+				& (GLEntry.account.isin(account_subquery))
 			)
 		).run()
 
@@ -454,7 +552,7 @@
 		"indent": indent,
 		"account_name": "'" + _("{0}").format(label) + "'",
 		"account": "'" + _("{0}").format(label) + "'",
-		"currency": currency
+		"currency": currency,
 	}
 	for row in data:
 		if row.get("parent_account"):
diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
index 1e20f7b..98dbbf6 100644
--- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
+++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
@@ -42,26 +42,32 @@
 def execute(filters=None):
 	columns, data, message, chart = [], [], [], []
 
-	if not filters.get('company'):
+	if not filters.get("company"):
 		return columns, data, message, chart
 
-	fiscal_year = get_fiscal_year_data(filters.get('from_fiscal_year'), filters.get('to_fiscal_year'))
+	fiscal_year = get_fiscal_year_data(filters.get("from_fiscal_year"), filters.get("to_fiscal_year"))
 	companies_column, companies = get_companies(filters)
 	columns = get_columns(companies_column, filters)
 
-	if filters.get('report') == "Balance Sheet":
-		data, message, chart, report_summary = get_balance_sheet_data(fiscal_year, companies, columns, filters)
-	elif filters.get('report') == "Profit and Loss Statement":
-		data, message, chart, report_summary = get_profit_loss_data(fiscal_year, companies, columns, filters)
+	if filters.get("report") == "Balance Sheet":
+		data, message, chart, report_summary = get_balance_sheet_data(
+			fiscal_year, companies, columns, filters
+		)
+	elif filters.get("report") == "Profit and Loss Statement":
+		data, message, chart, report_summary = get_profit_loss_data(
+			fiscal_year, companies, columns, filters
+		)
 	else:
-		if cint(frappe.db.get_single_value('Accounts Settings', 'use_custom_cash_flow')):
+		if cint(frappe.db.get_single_value("Accounts Settings", "use_custom_cash_flow")):
 			from erpnext.accounts.report.cash_flow.custom_cash_flow import execute as execute_custom
+
 			return execute_custom(filters=filters)
 
 		data, report_summary = get_cash_flow_data(fiscal_year, companies, filters)
 
 	return columns, data, message, chart, report_summary
 
+
 def get_balance_sheet_data(fiscal_year, companies, columns, filters):
 	asset = get_data(companies, "Asset", "Debit", fiscal_year, filters=filters)
 
@@ -75,24 +81,27 @@
 	data.extend(equity or [])
 
 	company_currency = get_company_currency(filters)
-	provisional_profit_loss, total_credit = get_provisional_profit_loss(asset, liability, equity,
-		companies, filters.get('company'), company_currency, True)
+	provisional_profit_loss, total_credit = get_provisional_profit_loss(
+		asset, liability, equity, companies, filters.get("company"), company_currency, True
+	)
 
-	message, opening_balance = prepare_companywise_opening_balance(asset, liability, equity, companies)
+	message, opening_balance = prepare_companywise_opening_balance(
+		asset, liability, equity, companies
+	)
 
 	if opening_balance:
 		unclosed = {
 			"account_name": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'",
 			"account": "'" + _("Unclosed Fiscal Years Profit / Loss (Credit)") + "'",
 			"warn_if_negative": True,
-			"currency": company_currency
+			"currency": company_currency,
 		}
 
 		for company in companies:
 			unclosed[company] = opening_balance.get(company)
 			if provisional_profit_loss and provisional_profit_loss.get(company):
-				provisional_profit_loss[company] = (
-					flt(provisional_profit_loss[company]) - flt(opening_balance.get(company))
+				provisional_profit_loss[company] = flt(provisional_profit_loss[company]) - flt(
+					opening_balance.get(company)
 				)
 
 		unclosed["total"] = opening_balance.get(company)
@@ -103,13 +112,23 @@
 	if total_credit:
 		data.append(total_credit)
 
-	report_summary = get_bs_summary(companies, asset, liability, equity, provisional_profit_loss, total_credit,
-		company_currency, filters, True)
+	report_summary = get_bs_summary(
+		companies,
+		asset,
+		liability,
+		equity,
+		provisional_profit_loss,
+		total_credit,
+		company_currency,
+		filters,
+		True,
+	)
 
 	chart = get_chart_data(filters, columns, asset, liability, equity)
 
 	return data, message, chart, report_summary
 
+
 def prepare_companywise_opening_balance(asset_data, liability_data, equity_data, companies):
 	opening_balance = {}
 	for company in companies:
@@ -119,29 +138,36 @@
 		for data in [asset_data, liability_data, equity_data]:
 			if data:
 				account_name = get_root_account_name(data[0].root_type, company)
-				opening_value += (get_opening_balance(account_name, data, company) or 0.0)
+				opening_value += get_opening_balance(account_name, data, company) or 0.0
 
 		opening_balance[company] = opening_value
 
 	if opening_balance:
 		return _("Previous Financial Year is not closed"), opening_balance
 
-	return '', {}
+	return "", {}
+
 
 def get_opening_balance(account_name, data, company):
 	for row in data:
-		if row.get('account_name') == account_name:
-			return row.get('company_wise_opening_bal', {}).get(company, 0.0)
+		if row.get("account_name") == account_name:
+			return row.get("company_wise_opening_bal", {}).get(company, 0.0)
+
 
 def get_root_account_name(root_type, company):
 	return frappe.get_all(
-		'Account',
-		fields=['account_name'],
-		filters = {'root_type': root_type, 'is_group': 1,
-			'company': company, 'parent_account': ('is', 'not set')},
-		as_list=1
+		"Account",
+		fields=["account_name"],
+		filters={
+			"root_type": root_type,
+			"is_group": 1,
+			"company": company,
+			"parent_account": ("is", "not set"),
+		},
+		as_list=1,
 	)[0][0]
 
+
 def get_profit_loss_data(fiscal_year, companies, columns, filters):
 	income, expense, net_profit_loss = get_income_expense_data(companies, fiscal_year, filters)
 	company_currency = get_company_currency(filters)
@@ -154,20 +180,26 @@
 
 	chart = get_pl_chart_data(filters, columns, income, expense, net_profit_loss)
 
-	report_summary = get_pl_summary(companies, '', income, expense, net_profit_loss, company_currency, filters, True)
+	report_summary = get_pl_summary(
+		companies, "", income, expense, net_profit_loss, company_currency, filters, True
+	)
 
 	return data, None, chart, report_summary
 
+
 def get_income_expense_data(companies, fiscal_year, filters):
 	company_currency = get_company_currency(filters)
 	income = get_data(companies, "Income", "Credit", fiscal_year, filters, True)
 
 	expense = get_data(companies, "Expense", "Debit", fiscal_year, filters, True)
 
-	net_profit_loss = get_net_profit_loss(income, expense, companies, filters.company, company_currency, True)
+	net_profit_loss = get_net_profit_loss(
+		income, expense, companies, filters.company, company_currency, True
+	)
 
 	return income, expense, net_profit_loss
 
+
 def get_cash_flow_data(fiscal_year, companies, filters):
 	cash_flow_accounts = get_cash_flow_accounts()
 
@@ -179,50 +211,67 @@
 
 	for cash_flow_account in cash_flow_accounts:
 		section_data = []
-		data.append({
-			"account_name": cash_flow_account['section_header'],
-			"parent_account": None,
-			"indent": 0.0,
-			"account": cash_flow_account['section_header']
-		})
+		data.append(
+			{
+				"account_name": cash_flow_account["section_header"],
+				"parent_account": None,
+				"indent": 0.0,
+				"account": cash_flow_account["section_header"],
+			}
+		)
 
 		if len(data) == 1:
 			# add first net income in operations section
 			if net_profit_loss:
-				net_profit_loss.update({
-					"indent": 1,
-					"parent_account": cash_flow_accounts[0]['section_header']
-				})
+				net_profit_loss.update(
+					{"indent": 1, "parent_account": cash_flow_accounts[0]["section_header"]}
+				)
 				data.append(net_profit_loss)
 				section_data.append(net_profit_loss)
 
-		for account in cash_flow_account['account_types']:
-			account_data = get_account_type_based_data(account['account_type'], companies, fiscal_year, filters)
-			account_data.update({
-				"account_name": account['label'],
-				"account": account['label'],
-				"indent": 1,
-				"parent_account": cash_flow_account['section_header'],
-				"currency": company_currency
-			})
+		for account in cash_flow_account["account_types"]:
+			account_data = get_account_type_based_data(
+				account["account_type"], companies, fiscal_year, filters
+			)
+			account_data.update(
+				{
+					"account_name": account["label"],
+					"account": account["label"],
+					"indent": 1,
+					"parent_account": cash_flow_account["section_header"],
+					"currency": company_currency,
+				}
+			)
 			data.append(account_data)
 			section_data.append(account_data)
 
-		add_total_row_account(data, section_data, cash_flow_account['section_footer'],
-			companies, company_currency, summary_data, filters, True)
+		add_total_row_account(
+			data,
+			section_data,
+			cash_flow_account["section_footer"],
+			companies,
+			company_currency,
+			summary_data,
+			filters,
+			True,
+		)
 
-	add_total_row_account(data, data, _("Net Change in Cash"), companies, company_currency, summary_data, filters, True)
+	add_total_row_account(
+		data, data, _("Net Change in Cash"), companies, company_currency, summary_data, filters, True
+	)
 
 	report_summary = get_cash_flow_summary(summary_data, company_currency)
 
 	return data, report_summary
 
+
 def get_account_type_based_data(account_type, companies, fiscal_year, filters):
 	data = {}
 	total = 0
 	for company in companies:
-		amount = get_account_type_based_gl_data(company,
-			fiscal_year.year_start_date, fiscal_year.year_end_date, account_type, filters)
+		amount = get_account_type_based_gl_data(
+			company, fiscal_year.year_start_date, fiscal_year.year_end_date, account_type, filters
+		)
 
 		if amount and account_type == "Depreciation":
 			amount *= -1
@@ -233,6 +282,7 @@
 	data["total"] = total
 	return data
 
+
 def get_columns(companies, filters):
 	columns = [
 		{
@@ -240,14 +290,15 @@
 			"label": _("Account"),
 			"fieldtype": "Link",
 			"options": "Account",
-			"width": 300
-		}, {
+			"width": 300,
+		},
+		{
 			"fieldname": "currency",
 			"label": _("Currency"),
 			"fieldtype": "Link",
 			"options": "Currency",
-			"hidden": 1
-		}
+			"hidden": 1,
+		},
 	]
 
 	for company in companies:
@@ -256,69 +307,96 @@
 		if not currency:
 			currency = erpnext.get_company_currency(company)
 
-		columns.append({
-			"fieldname": company,
-			"label": f'{company} ({currency})',
-			"fieldtype": "Currency",
-			"options": "currency",
-			"width": 150,
-			"apply_currency_formatter": apply_currency_formatter,
-			"company_name": company
-		})
+		columns.append(
+			{
+				"fieldname": company,
+				"label": f"{company} ({currency})",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 150,
+				"apply_currency_formatter": apply_currency_formatter,
+				"company_name": company,
+			}
+		)
 
 	return columns
 
-def get_data(companies, root_type, balance_must_be, fiscal_year, filters=None, ignore_closing_entries=False):
-	accounts, accounts_by_name, parent_children_map = get_account_heads(root_type,
-		companies, filters)
 
-	if not accounts: return []
+def get_data(
+	companies, root_type, balance_must_be, fiscal_year, filters=None, ignore_closing_entries=False
+):
+	accounts, accounts_by_name, parent_children_map = get_account_heads(root_type, companies, filters)
+
+	if not accounts:
+		return []
 
 	company_currency = get_company_currency(filters)
 
-	if filters.filter_based_on == 'Fiscal Year':
-		start_date = fiscal_year.year_start_date if filters.report != 'Balance Sheet' else None
+	if filters.filter_based_on == "Fiscal Year":
+		start_date = fiscal_year.year_start_date if filters.report != "Balance Sheet" else None
 		end_date = fiscal_year.year_end_date
 	else:
-		start_date = filters.period_start_date if filters.report != 'Balance Sheet' else None
+		start_date = filters.period_start_date if filters.report != "Balance Sheet" else None
 		end_date = filters.period_end_date
 
 	filters.end_date = end_date
 
 	gl_entries_by_account = {}
-	for root in frappe.db.sql("""select lft, rgt from tabAccount
-			where root_type=%s and ifnull(parent_account, '') = ''""", root_type, as_dict=1):
+	for root in frappe.db.sql(
+		"""select lft, rgt from tabAccount
+			where root_type=%s and ifnull(parent_account, '') = ''""",
+		root_type,
+		as_dict=1,
+	):
 
-		set_gl_entries_by_account(start_date,
-			end_date, root.lft, root.rgt, filters,
-			gl_entries_by_account, accounts_by_name, accounts, ignore_closing_entries=False)
+		set_gl_entries_by_account(
+			start_date,
+			end_date,
+			root.lft,
+			root.rgt,
+			filters,
+			gl_entries_by_account,
+			accounts_by_name,
+			accounts,
+			ignore_closing_entries=False,
+		)
 
 	calculate_values(accounts_by_name, gl_entries_by_account, companies, filters, fiscal_year)
 	accumulate_values_into_parents(accounts, accounts_by_name, companies)
 
-	out = prepare_data(accounts, start_date, end_date, balance_must_be, companies, company_currency, filters)
+	out = prepare_data(
+		accounts, start_date, end_date, balance_must_be, companies, company_currency, filters
+	)
 
-	out = filter_out_zero_value_rows(out, parent_children_map, show_zero_values=filters.get("show_zero_values"))
+	out = filter_out_zero_value_rows(
+		out, parent_children_map, show_zero_values=filters.get("show_zero_values")
+	)
 
 	if out:
 		add_total_row(out, root_type, balance_must_be, companies, company_currency)
 
 	return out
 
+
 def get_company_currency(filters=None):
-	return (filters.get('presentation_currency')
-		or frappe.get_cached_value('Company',  filters.company,  "default_currency"))
+	return filters.get("presentation_currency") or frappe.get_cached_value(
+		"Company", filters.company, "default_currency"
+	)
+
 
 def calculate_values(accounts_by_name, gl_entries_by_account, companies, filters, fiscal_year):
-	start_date = (fiscal_year.year_start_date
-		if filters.filter_based_on == 'Fiscal Year' else filters.period_start_date)
+	start_date = (
+		fiscal_year.year_start_date
+		if filters.filter_based_on == "Fiscal Year"
+		else filters.period_start_date
+	)
 
 	for entries in gl_entries_by_account.values():
 		for entry in entries:
 			if entry.account_number:
-				account_name = entry.account_number + ' - ' + entry.account_name
+				account_name = entry.account_number + " - " + entry.account_name
 			else:
-				account_name =  entry.account_name
+				account_name = entry.account_name
 
 			d = accounts_by_name.get(account_name)
 
@@ -326,28 +404,34 @@
 				debit, credit = 0, 0
 				for company in companies:
 					# check if posting date is within the period
-					if (entry.company == company or (filters.get('accumulated_in_group_company'))
-						and entry.company in companies.get(company)):
+					if (
+						entry.company == company
+						or (filters.get("accumulated_in_group_company"))
+						and entry.company in companies.get(company)
+					):
 						parent_company_currency = erpnext.get_company_currency(d.company)
 						child_company_currency = erpnext.get_company_currency(entry.company)
 
 						debit, credit = flt(entry.debit), flt(entry.credit)
 
-						if (not filters.get('presentation_currency')
+						if (
+							not filters.get("presentation_currency")
 							and entry.company != company
 							and parent_company_currency != child_company_currency
-							and filters.get('accumulated_in_group_company')):
+							and filters.get("accumulated_in_group_company")
+						):
 							debit = convert(debit, parent_company_currency, child_company_currency, filters.end_date)
 							credit = convert(credit, parent_company_currency, child_company_currency, filters.end_date)
 
 						d[company] = d.get(company, 0.0) + flt(debit) - flt(credit)
 
 						if entry.posting_date < getdate(start_date):
-							d['company_wise_opening_bal'][company] += (flt(debit) - flt(credit))
+							d["company_wise_opening_bal"][company] += flt(debit) - flt(credit)
 
 				if entry.posting_date < getdate(start_date):
 					d["opening_balance"] = d.get("opening_balance", 0.0) + flt(debit) - flt(credit)
 
+
 def accumulate_values_into_parents(accounts, accounts_by_name, companies):
 	"""accumulate children's values in parent accounts"""
 	for d in reversed(accounts):
@@ -355,13 +439,18 @@
 			account = d.parent_account_name
 
 			for company in companies:
-				accounts_by_name[account][company] = \
-					accounts_by_name[account].get(company, 0.0) + d.get(company, 0.0)
+				accounts_by_name[account][company] = accounts_by_name[account].get(company, 0.0) + d.get(
+					company, 0.0
+				)
 
-				accounts_by_name[account]['company_wise_opening_bal'][company] += d.get('company_wise_opening_bal', {}).get(company, 0.0)
+				accounts_by_name[account]["company_wise_opening_bal"][company] += d.get(
+					"company_wise_opening_bal", {}
+				).get(company, 0.0)
 
-			accounts_by_name[account]["opening_balance"] = \
-				accounts_by_name[account].get("opening_balance", 0.0) + d.get("opening_balance", 0.0)
+			accounts_by_name[account]["opening_balance"] = accounts_by_name[account].get(
+				"opening_balance", 0.0
+			) + d.get("opening_balance", 0.0)
+
 
 def get_account_heads(root_type, companies, filters):
 	accounts = get_accounts(root_type, companies)
@@ -375,20 +464,21 @@
 
 	return accounts, accounts_by_name, parent_children_map
 
+
 def update_parent_account_names(accounts):
 	"""Update parent_account_name in accounts list.
 
-		parent_name is `name` of parent account which could have other prefix
-		of account_number and suffix of company abbr. This function adds key called
-		`parent_account_name` which does not have such prefix/suffix.
+	parent_name is `name` of parent account which could have other prefix
+	of account_number and suffix of company abbr. This function adds key called
+	`parent_account_name` which does not have such prefix/suffix.
 	"""
 	name_to_account_map = {}
 
 	for d in accounts:
 		if d.account_number:
-			account_name = d.account_number + ' - ' + d.account_name
+			account_name = d.account_number + " - " + d.account_name
 		else:
-			account_name =  d.account_name
+			account_name = d.account_name
 		name_to_account_map[d.name] = account_name
 
 	for account in accounts:
@@ -397,10 +487,11 @@
 
 	return accounts
 
+
 def get_companies(filters):
 	companies = {}
-	all_companies = get_subsidiary_companies(filters.get('company'))
-	companies.setdefault(filters.get('company'), all_companies)
+	all_companies = get_subsidiary_companies(filters.get("company"))
+	companies.setdefault(filters.get("company"), all_companies)
 
 	for d in all_companies:
 		if d not in companies:
@@ -409,47 +500,73 @@
 
 	return all_companies, companies
 
-def get_subsidiary_companies(company):
-	lft, rgt = frappe.get_cached_value('Company',
-		company,  ["lft", "rgt"])
 
-	return frappe.db.sql_list("""select name from `tabCompany`
-		where lft >= {0} and rgt <= {1} order by lft, rgt""".format(lft, rgt))
+def get_subsidiary_companies(company):
+	lft, rgt = frappe.get_cached_value("Company", company, ["lft", "rgt"])
+
+	return frappe.db.sql_list(
+		"""select name from `tabCompany`
+		where lft >= {0} and rgt <= {1} order by lft, rgt""".format(
+			lft, rgt
+		)
+	)
+
 
 def get_accounts(root_type, companies):
 	accounts = []
 	added_accounts = []
 
 	for company in companies:
-		for account in frappe.get_all("Account", fields=["name", "is_group", "company",
-			"parent_account", "lft", "rgt", "root_type", "report_type", "account_name", "account_number"],
-			filters={"company": company, "root_type": root_type}):
+		for account in frappe.get_all(
+			"Account",
+			fields=[
+				"name",
+				"is_group",
+				"company",
+				"parent_account",
+				"lft",
+				"rgt",
+				"root_type",
+				"report_type",
+				"account_name",
+				"account_number",
+			],
+			filters={"company": company, "root_type": root_type},
+		):
 			if account.account_name not in added_accounts:
 				accounts.append(account)
 				added_accounts.append(account.account_name)
 
 	return accounts
 
-def prepare_data(accounts, start_date, end_date, balance_must_be, companies, company_currency, filters):
+
+def prepare_data(
+	accounts, start_date, end_date, balance_must_be, companies, company_currency, filters
+):
 	data = []
 
 	for d in accounts:
 		# add to output
 		has_value = False
 		total = 0
-		row = frappe._dict({
-			"account_name": ('%s - %s' %(_(d.account_number), _(d.account_name))
-				if d.account_number else _(d.account_name)),
-			"account": _(d.name),
-			"parent_account": _(d.parent_account),
-			"indent": flt(d.indent),
-			"year_start_date": start_date,
-			"root_type": d.root_type,
-			"year_end_date": end_date,
-			"currency": filters.presentation_currency,
-			"company_wise_opening_bal": d.company_wise_opening_bal,
-			"opening_balance": d.get("opening_balance", 0.0) * (1 if balance_must_be == "Debit" else -1)
-		})
+		row = frappe._dict(
+			{
+				"account_name": (
+					"%s - %s" % (_(d.account_number), _(d.account_name))
+					if d.account_number
+					else _(d.account_name)
+				),
+				"account": _(d.name),
+				"parent_account": _(d.parent_account),
+				"indent": flt(d.indent),
+				"year_start_date": start_date,
+				"root_type": d.root_type,
+				"year_end_date": end_date,
+				"currency": filters.presentation_currency,
+				"company_wise_opening_bal": d.company_wise_opening_bal,
+				"opening_balance": d.get("opening_balance", 0.0) * (1 if balance_must_be == "Debit" else -1),
+			}
+		)
 
 		for company in companies:
 			if d.get(company) and balance_must_be == "Credit":
@@ -470,32 +587,49 @@
 
 	return data
 
-def set_gl_entries_by_account(from_date, to_date, root_lft, root_rgt, filters, gl_entries_by_account,
-	accounts_by_name, accounts, ignore_closing_entries=False):
+
+def set_gl_entries_by_account(
+	from_date,
+	to_date,
+	root_lft,
+	root_rgt,
+	filters,
+	gl_entries_by_account,
+	accounts_by_name,
+	accounts,
+	ignore_closing_entries=False,
+):
 	"""Returns a dict like { "account": [gl entries], ... }"""
 
-	company_lft, company_rgt = frappe.get_cached_value('Company',
-		filters.get('company'),  ["lft", "rgt"])
+	company_lft, company_rgt = frappe.get_cached_value(
+		"Company", filters.get("company"), ["lft", "rgt"]
+	)
 
 	additional_conditions = get_additional_conditions(from_date, ignore_closing_entries, filters)
-	companies = frappe.db.sql(""" select name, default_currency from `tabCompany`
-		where lft >= %(company_lft)s and rgt <= %(company_rgt)s""", {
+	companies = frappe.db.sql(
+		""" select name, default_currency from `tabCompany`
+		where lft >= %(company_lft)s and rgt <= %(company_rgt)s""",
+		{
 			"company_lft": company_lft,
 			"company_rgt": company_rgt,
-		}, as_dict=1)
+		},
+		as_dict=1,
+	)
 
-	currency_info = frappe._dict({
-		'report_date': to_date,
-		'presentation_currency': filters.get('presentation_currency')
-	})
+	currency_info = frappe._dict(
+		{"report_date": to_date, "presentation_currency": filters.get("presentation_currency")}
+	)
 
 	for d in companies:
-		gl_entries = frappe.db.sql("""select gl.posting_date, gl.account, gl.debit, gl.credit, gl.is_opening, gl.company,
+		gl_entries = frappe.db.sql(
+			"""select gl.posting_date, gl.account, gl.debit, gl.credit, gl.is_opening, gl.company,
 			gl.fiscal_year, gl.debit_in_account_currency, gl.credit_in_account_currency, gl.account_currency,
 			acc.account_name, acc.account_number
 			from `tabGL Entry` gl, `tabAccount` acc where acc.name = gl.account and gl.company = %(company)s and gl.is_cancelled = 0
 			{additional_conditions} and gl.posting_date <= %(to_date)s and acc.lft >= %(lft)s and acc.rgt <= %(rgt)s
-			order by gl.account, gl.posting_date""".format(additional_conditions=additional_conditions),
+			order by gl.account, gl.posting_date""".format(
+				additional_conditions=additional_conditions
+			),
 			{
 				"from_date": from_date,
 				"to_date": to_date,
@@ -503,29 +637,47 @@
 				"rgt": root_rgt,
 				"company": d.name,
 				"finance_book": filters.get("finance_book"),
-				"company_fb": frappe.db.get_value("Company", d.name, 'default_finance_book')
+				"company_fb": frappe.db.get_value("Company", d.name, "default_finance_book"),
 			},
-			as_dict=True)
+			as_dict=True,
+		)
 
-		if filters and filters.get('presentation_currency') != d.default_currency:
-			currency_info['company'] = d.name
-			currency_info['company_currency'] = d.default_currency
-			convert_to_presentation_currency(gl_entries, currency_info, filters.get('company'))
+		if filters and filters.get("presentation_currency") != d.default_currency:
+			currency_info["company"] = d.name
+			currency_info["company_currency"] = d.default_currency
+			convert_to_presentation_currency(gl_entries, currency_info, filters.get("company"))
 
 		for entry in gl_entries:
 			if entry.account_number:
-				account_name = entry.account_number + ' - ' + entry.account_name
+				account_name = entry.account_number + " - " + entry.account_name
 			else:
-				account_name =  entry.account_name
+				account_name = entry.account_name
 
 			validate_entries(account_name, entry, accounts_by_name, accounts)
 			gl_entries_by_account.setdefault(account_name, []).append(entry)
 
 	return gl_entries_by_account
 
+
 def get_account_details(account):
-	return frappe.get_cached_value('Account', account, ['name', 'report_type', 'root_type', 'company',
-		'is_group', 'account_name', 'account_number', 'parent_account', 'lft', 'rgt'], as_dict=1)
+	return frappe.get_cached_value(
+		"Account",
+		account,
+		[
+			"name",
+			"report_type",
+			"root_type",
+			"company",
+			"is_group",
+			"account_name",
+			"account_number",
+			"parent_account",
+			"lft",
+			"rgt",
+		],
+		as_dict=1,
+	)
+
 
 def validate_entries(key, entry, accounts_by_name, accounts):
 	# If an account present in the child company and not in the parent company
@@ -535,15 +687,17 @@
 		if args.parent_account:
 			parent_args = get_account_details(args.parent_account)
 
-			args.update({
-				'lft': parent_args.lft + 1,
-				'rgt': parent_args.rgt - 1,
-				'indent': 3,
-				'root_type': parent_args.root_type,
-				'report_type': parent_args.report_type,
-				'parent_account_name': parent_args.account_name,
-				'company_wise_opening_bal': defaultdict(float)
-			})
+			args.update(
+				{
+					"lft": parent_args.lft + 1,
+					"rgt": parent_args.rgt - 1,
+					"indent": 3,
+					"root_type": parent_args.root_type,
+					"report_type": parent_args.report_type,
+					"parent_account_name": parent_args.account_name,
+					"company_wise_opening_bal": defaultdict(float),
+				}
+			)
 
 		accounts_by_name.setdefault(key, args)
 
@@ -554,7 +708,8 @@
 				idx = index
 				break
 
-		accounts.insert(idx+1, args)
+		accounts.insert(idx + 1, args)
+
 
 def get_additional_conditions(from_date, ignore_closing_entries, filters):
 	additional_conditions = []
@@ -566,17 +721,20 @@
 		additional_conditions.append("gl.posting_date >= %(from_date)s")
 
 	if filters.get("include_default_book_entries"):
-		additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)")
+		additional_conditions.append(
+			"(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)"
+		)
 	else:
 		additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)")
 
 	return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
 
+
 def add_total_row(out, root_type, balance_must_be, companies, company_currency):
 	total_row = {
 		"account_name": "'" + _("Total {0} ({1})").format(_(root_type), _(balance_must_be)) + "'",
 		"account": "'" + _("Total {0} ({1})").format(_(root_type), _(balance_must_be)) + "'",
-		"currency": company_currency
+		"currency": company_currency,
 	}
 
 	for row in out:
@@ -595,15 +753,16 @@
 		# blank row after Total
 		out.append({})
 
+
 def filter_accounts(accounts, depth=10):
 	parent_children_map = {}
 	accounts_by_name = {}
 	for d in accounts:
 		if d.account_number:
-			account_name = d.account_number + ' - ' + d.account_name
+			account_name = d.account_number + " - " + d.account_name
 		else:
-			account_name =  d.account_name
-		d['company_wise_opening_bal'] = defaultdict(float)
+			account_name = d.account_name
+		d["company_wise_opening_bal"] = defaultdict(float)
 		accounts_by_name[account_name] = d
 
 		parent_children_map.setdefault(d.parent_account or None, []).append(d)
@@ -613,7 +772,7 @@
 	def add_to_list(parent, level):
 		if level < depth:
 			children = parent_children_map.get(parent) or []
-			sort_accounts(children, is_root=True if parent==None else False)
+			sort_accounts(children, is_root=True if parent == None else False)
 
 			for child in children:
 				child.indent = level
diff --git a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
index 56db841..cafe95b 100644
--- a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
+++ b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
@@ -14,14 +14,16 @@
 		self.filters.to_date = getdate(self.filters.to_date or nowdate())
 
 		if not self.filters.get("company"):
-			self.filters["company"] = frappe.db.get_single_value('Global Defaults', 'default_company')
+			self.filters["company"] = frappe.db.get_single_value("Global Defaults", "default_company")
 
 	def run(self, args):
 		if self.filters.from_date > self.filters.to_date:
 			frappe.throw(_("From Date must be before To Date"))
 
 		self.filters.party_type = args.get("party_type")
-		self.party_naming_by = frappe.db.get_value(args.get("naming_by")[0], None, args.get("naming_by")[1])
+		self.party_naming_by = frappe.db.get_value(
+			args.get("naming_by")[0], None, args.get("naming_by")[1]
+		)
 
 		self.get_gl_entries()
 		self.get_return_invoices()
@@ -32,21 +34,25 @@
 		return columns, data
 
 	def get_columns(self):
-		columns = [{
-			"label": _(self.filters.party_type),
-			"fieldtype": "Link",
-			"fieldname": "party",
-			"options": self.filters.party_type,
-			"width": 200
-		}]
+		columns = [
+			{
+				"label": _(self.filters.party_type),
+				"fieldtype": "Link",
+				"fieldname": "party",
+				"options": self.filters.party_type,
+				"width": 200,
+			}
+		]
 
 		if self.party_naming_by == "Naming Series":
-			columns.append({
-				"label": _(self.filters.party_type + "Name"),
-				"fieldtype": "Data",
-				"fieldname": "party_name",
-				"width": 110
-			})
+			columns.append(
+				{
+					"label": _(self.filters.party_type + "Name"),
+					"fieldtype": "Data",
+					"fieldname": "party_name",
+					"width": 110,
+				}
+			)
 
 		credit_or_debit_note = "Credit Note" if self.filters.party_type == "Customer" else "Debit Note"
 
@@ -56,40 +62,42 @@
 				"fieldname": "opening_balance",
 				"fieldtype": "Currency",
 				"options": "currency",
-				"width": 120
+				"width": 120,
 			},
 			{
 				"label": _("Invoiced Amount"),
 				"fieldname": "invoiced_amount",
 				"fieldtype": "Currency",
 				"options": "currency",
-				"width": 120
+				"width": 120,
 			},
 			{
 				"label": _("Paid Amount"),
 				"fieldname": "paid_amount",
 				"fieldtype": "Currency",
 				"options": "currency",
-				"width": 120
+				"width": 120,
 			},
 			{
 				"label": _(credit_or_debit_note),
 				"fieldname": "return_amount",
 				"fieldtype": "Currency",
 				"options": "currency",
-				"width": 120
+				"width": 120,
 			},
 		]
 
 		for account in self.party_adjustment_accounts:
-			columns.append({
-				"label": account,
-				"fieldname": "adj_" + scrub(account),
-				"fieldtype": "Currency",
-				"options": "currency",
-				"width": 120,
-				"is_adjustment": 1
-			})
+			columns.append(
+				{
+					"label": account,
+					"fieldname": "adj_" + scrub(account),
+					"fieldtype": "Currency",
+					"options": "currency",
+					"width": 120,
+					"is_adjustment": 1,
+				}
+			)
 
 		columns += [
 			{
@@ -97,36 +105,43 @@
 				"fieldname": "closing_balance",
 				"fieldtype": "Currency",
 				"options": "currency",
-				"width": 120
+				"width": 120,
 			},
 			{
 				"label": _("Currency"),
 				"fieldname": "currency",
 				"fieldtype": "Link",
 				"options": "Currency",
-				"width": 50
-			}
+				"width": 50,
+			},
 		]
 
 		return columns
 
 	def get_data(self):
-		company_currency = frappe.get_cached_value('Company',  self.filters.get("company"),  "default_currency")
+		company_currency = frappe.get_cached_value(
+			"Company", self.filters.get("company"), "default_currency"
+		)
 		invoice_dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
 		reverse_dr_or_cr = "credit" if self.filters.party_type == "Customer" else "debit"
 
 		self.party_data = frappe._dict({})
 		for gle in self.gl_entries:
-			self.party_data.setdefault(gle.party, frappe._dict({
-				"party": gle.party,
-				"party_name": gle.party_name,
-				"opening_balance": 0,
-				"invoiced_amount": 0,
-				"paid_amount": 0,
-				"return_amount": 0,
-				"closing_balance": 0,
-				"currency": company_currency
-			}))
+			self.party_data.setdefault(
+				gle.party,
+				frappe._dict(
+					{
+						"party": gle.party,
+						"party_name": gle.party_name,
+						"opening_balance": 0,
+						"invoiced_amount": 0,
+						"paid_amount": 0,
+						"return_amount": 0,
+						"closing_balance": 0,
+						"currency": company_currency,
+					}
+				),
+			)
 
 			amount = gle.get(invoice_dr_or_cr) - gle.get(reverse_dr_or_cr)
 			self.party_data[gle.party].closing_balance += amount
@@ -143,8 +158,16 @@
 
 		out = []
 		for party, row in self.party_data.items():
-			if row.opening_balance or row.invoiced_amount or row.paid_amount or row.return_amount or row.closing_amount:
-				total_party_adjustment = sum(amount for amount in self.party_adjustment_details.get(party, {}).values())
+			if (
+				row.opening_balance
+				or row.invoiced_amount
+				or row.paid_amount
+				or row.return_amount
+				or row.closing_amount
+			):
+				total_party_adjustment = sum(
+					amount for amount in self.party_adjustment_details.get(party, {}).values()
+				)
 				row.paid_amount -= total_party_adjustment
 
 				adjustments = self.party_adjustment_details.get(party, {})
@@ -165,7 +188,8 @@
 			join_field = ", p.supplier_name as party_name"
 			join = "left join `tabSupplier` p on gle.party = p.name"
 
-		self.gl_entries = frappe.db.sql("""
+		self.gl_entries = frappe.db.sql(
+			"""
 			select
 				gle.posting_date, gle.party, gle.voucher_type, gle.voucher_no, gle.against_voucher_type,
 				gle.against_voucher, gle.debit, gle.credit, gle.is_opening {join_field}
@@ -175,7 +199,12 @@
 				gle.docstatus < 2 and gle.is_cancelled = 0 and gle.party_type=%(party_type)s and ifnull(gle.party, '') != ''
 				and gle.posting_date <= %(to_date)s {conditions}
 			order by gle.posting_date
-		""".format(join=join, join_field=join_field, conditions=conditions), self.filters, as_dict=True)
+		""".format(
+				join=join, join_field=join_field, conditions=conditions
+			),
+			self.filters,
+			as_dict=True,
+		)
 
 	def prepare_conditions(self):
 		conditions = [""]
@@ -191,57 +220,88 @@
 
 		if self.filters.party_type == "Customer":
 			if self.filters.get("customer_group"):
-				lft, rgt = frappe.db.get_value("Customer Group",
-					self.filters.get("customer_group"), ["lft", "rgt"])
+				lft, rgt = frappe.db.get_value(
+					"Customer Group", self.filters.get("customer_group"), ["lft", "rgt"]
+				)
 
-				conditions.append("""party in (select name from tabCustomer
+				conditions.append(
+					"""party in (select name from tabCustomer
 					where exists(select name from `tabCustomer Group` where lft >= {0} and rgt <= {1}
-						and name=tabCustomer.customer_group))""".format(lft, rgt))
+						and name=tabCustomer.customer_group))""".format(
+						lft, rgt
+					)
+				)
 
 			if self.filters.get("territory"):
-				lft, rgt = frappe.db.get_value("Territory",
-					self.filters.get("territory"), ["lft", "rgt"])
+				lft, rgt = frappe.db.get_value("Territory", self.filters.get("territory"), ["lft", "rgt"])
 
-				conditions.append("""party in (select name from tabCustomer
+				conditions.append(
+					"""party in (select name from tabCustomer
 					where exists(select name from `tabTerritory` where lft >= {0} and rgt <= {1}
-						and name=tabCustomer.territory))""".format(lft, rgt))
+						and name=tabCustomer.territory))""".format(
+						lft, rgt
+					)
+				)
 
 			if self.filters.get("payment_terms_template"):
-				conditions.append("party in (select name from tabCustomer where payment_terms=%(payment_terms_template)s)")
+				conditions.append(
+					"party in (select name from tabCustomer where payment_terms=%(payment_terms_template)s)"
+				)
 
 			if self.filters.get("sales_partner"):
-				conditions.append("party in (select name from tabCustomer where default_sales_partner=%(sales_partner)s)")
+				conditions.append(
+					"party in (select name from tabCustomer where default_sales_partner=%(sales_partner)s)"
+				)
 
 			if self.filters.get("sales_person"):
-				lft, rgt = frappe.db.get_value("Sales Person",
-					self.filters.get("sales_person"), ["lft", "rgt"])
+				lft, rgt = frappe.db.get_value(
+					"Sales Person", self.filters.get("sales_person"), ["lft", "rgt"]
+				)
 
-				conditions.append("""exists(select name from `tabSales Team` steam where
+				conditions.append(
+					"""exists(select name from `tabSales Team` steam where
 					steam.sales_person in (select name from `tabSales Person` where lft >= {0} and rgt <= {1})
 					and ((steam.parent = voucher_no and steam.parenttype = voucher_type)
 						or (steam.parent = against_voucher and steam.parenttype = against_voucher_type)
-						or (steam.parent = party and steam.parenttype = 'Customer')))""".format(lft, rgt))
+						or (steam.parent = party and steam.parenttype = 'Customer')))""".format(
+						lft, rgt
+					)
+				)
 
 		if self.filters.party_type == "Supplier":
 			if self.filters.get("supplier_group"):
-				conditions.append("""party in (select name from tabSupplier
-					where supplier_group=%(supplier_group)s)""")
+				conditions.append(
+					"""party in (select name from tabSupplier
+					where supplier_group=%(supplier_group)s)"""
+				)
 
 		return " and ".join(conditions)
 
 	def get_return_invoices(self):
 		doctype = "Sales Invoice" if self.filters.party_type == "Customer" else "Purchase Invoice"
-		self.return_invoices = [d.name for d in frappe.get_all(doctype, filters={"is_return": 1, "docstatus": 1,
-			"posting_date": ["between", [self.filters.from_date, self.filters.to_date]]})]
+		self.return_invoices = [
+			d.name
+			for d in frappe.get_all(
+				doctype,
+				filters={
+					"is_return": 1,
+					"docstatus": 1,
+					"posting_date": ["between", [self.filters.from_date, self.filters.to_date]],
+				},
+			)
+		]
 
 	def get_party_adjustment_amounts(self):
 		conditions = self.prepare_conditions()
-		income_or_expense = "Expense Account" if self.filters.party_type == "Customer" else "Income Account"
+		income_or_expense = (
+			"Expense Account" if self.filters.party_type == "Customer" else "Income Account"
+		)
 		invoice_dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
 		reverse_dr_or_cr = "credit" if self.filters.party_type == "Customer" else "debit"
-		round_off_account = frappe.get_cached_value('Company', self.filters.company, "round_off_account")
+		round_off_account = frappe.get_cached_value("Company", self.filters.company, "round_off_account")
 
-		gl_entries = frappe.db.sql("""
+		gl_entries = frappe.db.sql(
+			"""
 			select
 				posting_date, account, party, voucher_type, voucher_no, debit, credit
 			from
@@ -257,7 +317,12 @@
 					where gle.party_type=%(party_type)s and ifnull(party, '') != ''
 					and gle.posting_date between %(from_date)s and %(to_date)s and gle.docstatus < 2 {conditions}
 				)
-		""".format(conditions=conditions, income_or_expense=income_or_expense), self.filters, as_dict=True)
+		""".format(
+				conditions=conditions, income_or_expense=income_or_expense
+			),
+			self.filters,
+			as_dict=True,
+		)
 
 		self.party_adjustment_details = {}
 		self.party_adjustment_accounts = set()
@@ -299,6 +364,7 @@
 						self.party_adjustment_details[party].setdefault(account, 0)
 						self.party_adjustment_details[party][account] += amount
 
+
 def execute(filters=None):
 	args = {
 		"party_type": "Customer",
diff --git a/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py b/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
index 3a51db8..1eb257a 100644
--- a/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
+++ b/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
@@ -361,7 +361,8 @@
 					"fieldname": period.key,
 					"fieldtype": "Currency",
 					"read_only": 1,
-				})
+				}
+			)
 		return columns
 
 	def generate_report_data(self):
@@ -408,11 +409,9 @@
 		}
 
 		if self.filters.with_upcoming_postings:
-			chart["data"]["datasets"].append({
-				"name": "Expected",
-				"chartType": "line",
-				"values": [x.total for x in self.period_total]
-			})
+			chart["data"]["datasets"].append(
+				{"name": "Expected", "chartType": "line", "values": [x.total for x in self.period_total]}
+			)
 
 		return chart
 
diff --git a/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py b/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py
index 17475a7..023ff22 100644
--- a/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py
+++ b/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py
@@ -322,6 +322,7 @@
 		]
 		self.assertEqual(report.period_total, expected)
 
+
 def create_company():
 	company = frappe.db.exists("Company", "_Test Company DR")
 	if not company:
diff --git a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py
index 004d092..59914dc 100644
--- a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py
+++ b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py
@@ -13,6 +13,7 @@
 	data = get_ordered_to_be_billed_data(args)
 	return columns, data
 
+
 def get_column():
 	return [
 		{
@@ -20,90 +21,76 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Delivery Note",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label": _("Date"),
-			"fieldname": "date",
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"label": _("Date"), "fieldname": "date", "fieldtype": "Date", "width": 100},
 		{
 			"label": _("Customer"),
 			"fieldname": "customer",
 			"fieldtype": "Link",
 			"options": "Customer",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Customer Name"),
-			"fieldname": "customer_name",
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"label": _("Customer Name"), "fieldname": "customer_name", "fieldtype": "Data", "width": 120},
 		{
 			"label": _("Item Code"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Amount"),
 			"fieldname": "amount",
 			"fieldtype": "Currency",
 			"width": 100,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
 		{
 			"label": _("Billed Amount"),
 			"fieldname": "billed_amount",
 			"fieldtype": "Currency",
 			"width": 100,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
 		{
 			"label": _("Returned Amount"),
 			"fieldname": "returned_amount",
 			"fieldtype": "Currency",
 			"width": 120,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
 		{
 			"label": _("Pending Amount"),
 			"fieldname": "pending_amount",
 			"fieldtype": "Currency",
 			"width": 120,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("Description"),
-			"fieldname": "description",
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 120},
+		{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 120},
 		{
 			"label": _("Project"),
 			"fieldname": "project",
 			"fieldtype": "Link",
 			"options": "Project",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Company"),
 			"fieldname": "company",
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
+
 def get_args():
-	return {'doctype': 'Delivery Note', 'party': 'customer',
-		'date': 'posting_date', 'order': 'name', 'order_by': 'desc'}
+	return {
+		"doctype": "Delivery Note",
+		"party": "customer",
+		"date": "posting_date",
+		"order": "name",
+		"order_by": "desc",
+	}
diff --git a/erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.py b/erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.py
index 0c2b6cb..8e8465c 100644
--- a/erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.py
+++ b/erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.py
@@ -27,10 +27,12 @@
 
 	return columns, data
 
+
 def get_data(filters, dimension_list):
 	company_currency = erpnext.get_company_currency(filters.company)
 
-	acc = frappe.db.sql("""
+	acc = frappe.db.sql(
+		"""
 		select
 			name, account_number, parent_account, lft, rgt, root_type,
 			report_type, account_name, include_in_gross, account_type, is_group
@@ -38,50 +40,62 @@
 			`tabAccount`
 		where
 			company=%s
-			order by lft""", (filters.company), as_dict=True)
+			order by lft""",
+		(filters.company),
+		as_dict=True,
+	)
 
 	if not acc:
 		return None
 
 	accounts, accounts_by_name, parent_children_map = filter_accounts(acc)
 
-	min_lft, max_rgt = frappe.db.sql("""select min(lft), max(rgt) from `tabAccount`
-		where company=%s""", (filters.company))[0]
+	min_lft, max_rgt = frappe.db.sql(
+		"""select min(lft), max(rgt) from `tabAccount`
+		where company=%s""",
+		(filters.company),
+	)[0]
 
-	account = frappe.db.sql_list("""select name from `tabAccount`
-		where lft >= %s and rgt <= %s and company = %s""", (min_lft, max_rgt, filters.company))
+	account = frappe.db.sql_list(
+		"""select name from `tabAccount`
+		where lft >= %s and rgt <= %s and company = %s""",
+		(min_lft, max_rgt, filters.company),
+	)
 
 	gl_entries_by_account = {}
 	set_gl_entries_by_account(dimension_list, filters, account, gl_entries_by_account)
-	format_gl_entries(gl_entries_by_account, accounts_by_name, dimension_list,
-		frappe.scrub(filters.get('dimension')))
+	format_gl_entries(
+		gl_entries_by_account, accounts_by_name, dimension_list, frappe.scrub(filters.get("dimension"))
+	)
 	accumulate_values_into_parents(accounts, accounts_by_name, dimension_list)
 	out = prepare_data(accounts, filters, company_currency, dimension_list)
 	out = filter_out_zero_value_rows(out, parent_children_map)
 
 	return out
 
+
 def set_gl_entries_by_account(dimension_list, filters, account, gl_entries_by_account):
-	condition = get_condition(filters.get('dimension'))
+	condition = get_condition(filters.get("dimension"))
 
 	if account:
-		condition += " and account in ({})"\
-			.format(", ".join([frappe.db.escape(d) for d in account]))
+		condition += " and account in ({})".format(", ".join([frappe.db.escape(d) for d in account]))
 
 	gl_filters = {
 		"company": filters.get("company"),
 		"from_date": filters.get("from_date"),
 		"to_date": filters.get("to_date"),
-		"finance_book": cstr(filters.get("finance_book"))
+		"finance_book": cstr(filters.get("finance_book")),
 	}
 
-	gl_filters['dimensions'] = set(dimension_list)
+	gl_filters["dimensions"] = set(dimension_list)
 
 	if filters.get("include_default_book_entries"):
-		gl_filters["company_fb"] = frappe.db.get_value("Company",
-			filters.company, 'default_finance_book')
+		gl_filters["company_fb"] = frappe.db.get_value(
+			"Company", filters.company, "default_finance_book"
+		)
 
-	gl_entries = frappe.db.sql("""
+	gl_entries = frappe.db.sql(
+		"""
 		select
 			posting_date, account, {dimension}, debit, credit, is_opening, fiscal_year,
 			debit_in_account_currency, credit_in_account_currency, account_currency
@@ -94,11 +108,16 @@
 		and posting_date <= %(to_date)s
 		and is_cancelled = 0
 		order by account, posting_date""".format(
-		dimension = frappe.scrub(filters.get('dimension')), condition=condition), gl_filters, as_dict=True) #nosec
+			dimension=frappe.scrub(filters.get("dimension")), condition=condition
+		),
+		gl_filters,
+		as_dict=True,
+	)  # nosec
 
 	for entry in gl_entries:
 		gl_entries_by_account.setdefault(entry.account, []).append(entry)
 
+
 def format_gl_entries(gl_entries_by_account, accounts_by_name, dimension_list, dimension_type):
 
 	for entries in gl_entries_by_account.values():
@@ -106,13 +125,17 @@
 			d = accounts_by_name.get(entry.account)
 			if not d:
 				frappe.msgprint(
-					_("Could not retrieve information for {0}.").format(entry.account), title="Error",
-					raise_exception=1
+					_("Could not retrieve information for {0}.").format(entry.account),
+					title="Error",
+					raise_exception=1,
 				)
 
 			for dimension in dimension_list:
 				if dimension == entry.get(dimension_type):
-					d[frappe.scrub(dimension)] = d.get(frappe.scrub(dimension), 0.0) + flt(entry.debit) - flt(entry.credit)
+					d[frappe.scrub(dimension)] = (
+						d.get(frappe.scrub(dimension), 0.0) + flt(entry.debit) - flt(entry.credit)
+					)
+
 
 def prepare_data(accounts, filters, company_currency, dimension_list):
 	data = []
@@ -127,8 +150,9 @@
 			"from_date": filters.from_date,
 			"to_date": filters.to_date,
 			"currency": company_currency,
-			"account_name": ('{} - {}'.format(d.account_number, d.account_name)
-				if d.account_number else d.account_name)
+			"account_name": (
+				"{} - {}".format(d.account_number, d.account_name) if d.account_number else d.account_name
+			),
 		}
 
 		for dimension in dimension_list:
@@ -145,13 +169,16 @@
 
 	return data
 
+
 def accumulate_values_into_parents(accounts, accounts_by_name, dimension_list):
 	"""accumulate children's values in parent accounts"""
 	for d in reversed(accounts):
 		if d.parent_account:
 			for dimension in dimension_list:
-				accounts_by_name[d.parent_account][frappe.scrub(dimension)] = \
-					accounts_by_name[d.parent_account].get(frappe.scrub(dimension), 0.0) + d.get(frappe.scrub(dimension), 0.0)
+				accounts_by_name[d.parent_account][frappe.scrub(dimension)] = accounts_by_name[
+					d.parent_account
+				].get(frappe.scrub(dimension), 0.0) + d.get(frappe.scrub(dimension), 0.0)
+
 
 def get_condition(dimension):
 	conditions = []
@@ -160,46 +187,54 @@
 
 	return " and {}".format(" and ".join(conditions)) if conditions else ""
 
+
 def get_dimensions(filters):
-	meta = frappe.get_meta(filters.get('dimension'), cached=False)
+	meta = frappe.get_meta(filters.get("dimension"), cached=False)
 	query_filters = {}
 
-	if meta.has_field('company'):
-		query_filters = {'company': filters.get('company')}
+	if meta.has_field("company"):
+		query_filters = {"company": filters.get("company")}
 
-	return frappe.get_all(filters.get('dimension'), filters=query_filters, pluck='name')
+	return frappe.get_all(filters.get("dimension"), filters=query_filters, pluck="name")
+
 
 def get_columns(dimension_list):
-	columns = [{
-		"fieldname": "account",
-		"label": _("Account"),
-		"fieldtype": "Link",
-		"options": "Account",
-		"width": 300
-	},
-	{
-		"fieldname": "currency",
-		"label": _("Currency"),
-		"fieldtype": "Link",
-		"options": "Currency",
-		"hidden": 1
-	}]
+	columns = [
+		{
+			"fieldname": "account",
+			"label": _("Account"),
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 300,
+		},
+		{
+			"fieldname": "currency",
+			"label": _("Currency"),
+			"fieldtype": "Link",
+			"options": "Currency",
+			"hidden": 1,
+		},
+	]
 
 	for dimension in dimension_list:
-		columns.append({
-			"fieldname": frappe.scrub(dimension),
-			"label": dimension,
-			"fieldtype": "Currency",
-			"options": "currency",
-			"width": 150
-		})
+		columns.append(
+			{
+				"fieldname": frappe.scrub(dimension),
+				"label": dimension,
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 150,
+			}
+		)
 
-	columns.append({
+	columns.append(
+		{
 			"fieldname": "total",
 			"label": "Total",
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 150
-		})
+			"width": 150,
+		}
+	)
 
 	return columns
diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py
index db28cdf..56d68e1 100644
--- a/erpnext/accounts/report/financial_statements.py
+++ b/erpnext/accounts/report/financial_statements.py
@@ -18,12 +18,22 @@
 from erpnext.accounts.utils import get_fiscal_year
 
 
-def get_period_list(from_fiscal_year, to_fiscal_year, period_start_date, period_end_date, filter_based_on, periodicity, accumulated_values=False,
-	company=None, reset_period_on_fy_change=True, ignore_fiscal_year=False):
+def get_period_list(
+	from_fiscal_year,
+	to_fiscal_year,
+	period_start_date,
+	period_end_date,
+	filter_based_on,
+	periodicity,
+	accumulated_values=False,
+	company=None,
+	reset_period_on_fy_change=True,
+	ignore_fiscal_year=False,
+):
 	"""Get a list of dict {"from_date": from_date, "to_date": to_date, "key": key, "label": label}
-		Periodicity can be (Yearly, Quarterly, Monthly)"""
+	Periodicity can be (Yearly, Quarterly, Monthly)"""
 
-	if filter_based_on == 'Fiscal Year':
+	if filter_based_on == "Fiscal Year":
 		fiscal_year = get_fiscal_year_data(from_fiscal_year, to_fiscal_year)
 		validate_fiscal_year(fiscal_year, from_fiscal_year, to_fiscal_year)
 		year_start_date = getdate(fiscal_year.year_start_date)
@@ -33,12 +43,7 @@
 		year_start_date = getdate(period_start_date)
 		year_end_date = getdate(period_end_date)
 
-	months_to_add = {
-		"Yearly": 12,
-		"Half-Yearly": 6,
-		"Quarterly": 3,
-		"Monthly": 1
-	}[periodicity]
+	months_to_add = {"Yearly": 12, "Half-Yearly": 6, "Quarterly": 3, "Monthly": 1}[periodicity]
 
 	period_list = []
 
@@ -46,11 +51,9 @@
 	months = get_months(year_start_date, year_end_date)
 
 	for i in range(cint(math.ceil(months / months_to_add))):
-		period = frappe._dict({
-			"from_date": start_date
-		})
+		period = frappe._dict({"from_date": start_date})
 
-		if i==0 and filter_based_on == 'Date Range':
+		if i == 0 and filter_based_on == "Date Range":
 			to_date = add_months(get_first_day(start_date), months_to_add)
 		else:
 			to_date = add_months(start_date, months_to_add)
@@ -90,32 +93,38 @@
 				else:
 					label = get_label(periodicity, period_list[0].from_date, opts["to_date"])
 
-		opts.update({
-			"key": key.replace(" ", "_").replace("-", "_"),
-			"label": label,
-			"year_start_date": year_start_date,
-			"year_end_date": year_end_date
-		})
+		opts.update(
+			{
+				"key": key.replace(" ", "_").replace("-", "_"),
+				"label": label,
+				"year_start_date": year_start_date,
+				"year_end_date": year_end_date,
+			}
+		)
 
 	return period_list
 
 
 def get_fiscal_year_data(from_fiscal_year, to_fiscal_year):
-	fiscal_year = frappe.db.sql("""select min(year_start_date) as year_start_date,
+	fiscal_year = frappe.db.sql(
+		"""select min(year_start_date) as year_start_date,
 		max(year_end_date) as year_end_date from `tabFiscal Year` where
 		name between %(from_fiscal_year)s and %(to_fiscal_year)s""",
-		{'from_fiscal_year': from_fiscal_year, 'to_fiscal_year': to_fiscal_year}, as_dict=1)
+		{"from_fiscal_year": from_fiscal_year, "to_fiscal_year": to_fiscal_year},
+		as_dict=1,
+	)
 
 	return fiscal_year[0] if fiscal_year else {}
 
 
 def validate_fiscal_year(fiscal_year, from_fiscal_year, to_fiscal_year):
-	if not fiscal_year.get('year_start_date') or not fiscal_year.get('year_end_date'):
+	if not fiscal_year.get("year_start_date") or not fiscal_year.get("year_end_date"):
 		frappe.throw(_("Start Year and End Year are mandatory"))
 
-	if getdate(fiscal_year.get('year_end_date')) < getdate(fiscal_year.get('year_start_date')):
+	if getdate(fiscal_year.get("year_end_date")) < getdate(fiscal_year.get("year_start_date")):
 		frappe.throw(_("End Year cannot be before Start Year"))
 
+
 def validate_dates(from_date, to_date):
 	if not from_date or not to_date:
 		frappe.throw(_("From Date and To Date are mandatory"))
@@ -123,6 +132,7 @@
 	if to_date < from_date:
 		frappe.throw(_("To Date cannot be less than From Date"))
 
+
 def get_months(start_date, end_date):
 	diff = (12 * end_date.year + end_date.month) - (12 * start_date.year + start_date.month)
 	return diff + 1
@@ -141,9 +151,17 @@
 
 
 def get_data(
-		company, root_type, balance_must_be, period_list, filters=None,
-		accumulated_values=1, only_current_fiscal_year=True, ignore_closing_entries=False,
-		ignore_accumulated_values_for_fy=False , total = True):
+	company,
+	root_type,
+	balance_must_be,
+	period_list,
+	filters=None,
+	accumulated_values=1,
+	only_current_fiscal_year=True,
+	ignore_closing_entries=False,
+	ignore_accumulated_values_for_fy=False,
+	total=True,
+):
 
 	accounts = get_accounts(company, root_type)
 	if not accounts:
@@ -154,19 +172,31 @@
 	company_currency = get_appropriate_currency(company, filters)
 
 	gl_entries_by_account = {}
-	for root in frappe.db.sql("""select lft, rgt from tabAccount
-			where root_type=%s and ifnull(parent_account, '') = ''""", root_type, as_dict=1):
+	for root in frappe.db.sql(
+		"""select lft, rgt from tabAccount
+			where root_type=%s and ifnull(parent_account, '') = ''""",
+		root_type,
+		as_dict=1,
+	):
 
 		set_gl_entries_by_account(
 			company,
 			period_list[0]["year_start_date"] if only_current_fiscal_year else None,
 			period_list[-1]["to_date"],
-			root.lft, root.rgt, filters,
-			gl_entries_by_account, ignore_closing_entries=ignore_closing_entries
+			root.lft,
+			root.rgt,
+			filters,
+			gl_entries_by_account,
+			ignore_closing_entries=ignore_closing_entries,
 		)
 
 	calculate_values(
-		accounts_by_name, gl_entries_by_account, period_list, accumulated_values, ignore_accumulated_values_for_fy)
+		accounts_by_name,
+		gl_entries_by_account,
+		period_list,
+		accumulated_values,
+		ignore_accumulated_values_for_fy,
+	)
 	accumulate_values_into_parents(accounts, accounts_by_name, period_list)
 	out = prepare_data(accounts, balance_must_be, period_list, company_currency)
 	out = filter_out_zero_value_rows(out, parent_children_map)
@@ -181,26 +211,32 @@
 	if filters and filters.get("presentation_currency"):
 		return filters["presentation_currency"]
 	else:
-		return frappe.get_cached_value('Company',  company,  "default_currency")
+		return frappe.get_cached_value("Company", company, "default_currency")
 
 
 def calculate_values(
-		accounts_by_name, gl_entries_by_account, period_list, accumulated_values, ignore_accumulated_values_for_fy):
+	accounts_by_name,
+	gl_entries_by_account,
+	period_list,
+	accumulated_values,
+	ignore_accumulated_values_for_fy,
+):
 	for entries in gl_entries_by_account.values():
 		for entry in entries:
 			d = accounts_by_name.get(entry.account)
 			if not d:
 				frappe.msgprint(
-					_("Could not retrieve information for {0}.").format(entry.account), title="Error",
-					raise_exception=1
+					_("Could not retrieve information for {0}.").format(entry.account),
+					title="Error",
+					raise_exception=1,
 				)
 			for period in period_list:
 				# check if posting date is within the period
 
 				if entry.posting_date <= period.to_date:
-					if (accumulated_values or entry.posting_date >= period.from_date) and \
-						(not ignore_accumulated_values_for_fy or
-							entry.fiscal_year == period.to_date_fiscal_year):
+					if (accumulated_values or entry.posting_date >= period.from_date) and (
+						not ignore_accumulated_values_for_fy or entry.fiscal_year == period.to_date_fiscal_year
+					):
 						d[period.key] = d.get(period.key, 0.0) + flt(entry.debit) - flt(entry.credit)
 
 			if entry.posting_date < period_list[0].year_start_date:
@@ -212,11 +248,13 @@
 	for d in reversed(accounts):
 		if d.parent_account:
 			for period in period_list:
-				accounts_by_name[d.parent_account][period.key] = \
-					accounts_by_name[d.parent_account].get(period.key, 0.0) + d.get(period.key, 0.0)
+				accounts_by_name[d.parent_account][period.key] = accounts_by_name[d.parent_account].get(
+					period.key, 0.0
+				) + d.get(period.key, 0.0)
 
-			accounts_by_name[d.parent_account]["opening_balance"] = \
-				accounts_by_name[d.parent_account].get("opening_balance", 0.0) + d.get("opening_balance", 0.0)
+			accounts_by_name[d.parent_account]["opening_balance"] = accounts_by_name[d.parent_account].get(
+				"opening_balance", 0.0
+			) + d.get("opening_balance", 0.0)
 
 
 def prepare_data(accounts, balance_must_be, period_list, company_currency):
@@ -228,20 +266,25 @@
 		# add to output
 		has_value = False
 		total = 0
-		row = frappe._dict({
-			"account": _(d.name),
-			"parent_account": _(d.parent_account) if d.parent_account else '',
-			"indent": flt(d.indent),
-			"year_start_date": year_start_date,
-			"year_end_date": year_end_date,
-			"currency": company_currency,
-			"include_in_gross": d.include_in_gross,
-			"account_type": d.account_type,
-			"is_group": d.is_group,
-			"opening_balance": d.get("opening_balance", 0.0) * (1 if balance_must_be=="Debit" else -1),
-			"account_name": ('%s - %s' %(_(d.account_number), _(d.account_name))
-				if d.account_number else _(d.account_name))
-		})
+		row = frappe._dict(
+			{
+				"account": _(d.name),
+				"parent_account": _(d.parent_account) if d.parent_account else "",
+				"indent": flt(d.indent),
+				"year_start_date": year_start_date,
+				"year_end_date": year_end_date,
+				"currency": company_currency,
+				"include_in_gross": d.include_in_gross,
+				"account_type": d.account_type,
+				"is_group": d.is_group,
+				"opening_balance": d.get("opening_balance", 0.0) * (1 if balance_must_be == "Debit" else -1),
+				"account_name": (
+					"%s - %s" % (_(d.account_number), _(d.account_name))
+					if d.account_number
+					else _(d.account_name)
+				),
+			}
+		)
 		for period in period_list:
 			if d.get(period.key) and balance_must_be == "Credit":
 				# change sign based on Debit or Credit, since calculation is done using (debit - credit)
@@ -283,7 +326,7 @@
 		"account_name": _("Total {0} ({1})").format(_(root_type), _(balance_must_be)),
 		"account": _("Total {0} ({1})").format(_(root_type), _(balance_must_be)),
 		"currency": company_currency,
-		"opening_balance": 0.0
+		"opening_balance": 0.0,
 	}
 
 	for row in out:
@@ -306,10 +349,14 @@
 
 
 def get_accounts(company, root_type):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select name, account_number, parent_account, lft, rgt, root_type, report_type, account_name, include_in_gross, account_type, is_group, lft, rgt
 		from `tabAccount`
-		where company=%s and root_type=%s order by lft""", (company, root_type), as_dict=True)
+		where company=%s and root_type=%s order by lft""",
+		(company, root_type),
+		as_dict=True,
+	)
 
 
 def filter_accounts(accounts, depth=20):
@@ -324,7 +371,7 @@
 	def add_to_list(parent, level):
 		if level < depth:
 			children = parent_children_map.get(parent) or []
-			sort_accounts(children, is_root=True if parent==None else False)
+			sort_accounts(children, is_root=True if parent == None else False)
 
 			for child in children:
 				child.indent = level
@@ -340,7 +387,7 @@
 	"""Sort root types as Asset, Liability, Equity, Income, Expense"""
 
 	def compare_accounts(a, b):
-		if re.split(r'\W+', a[key])[0].isdigit():
+		if re.split(r"\W+", a[key])[0].isdigit():
 			# if chart of accounts is numbered, then sort by number
 			return int(a[key] > b[key]) - int(a[key] < b[key])
 		elif is_root:
@@ -357,50 +404,64 @@
 			return int(a[key] > b[key]) - int(a[key] < b[key])
 		return 1
 
-	accounts.sort(key = functools.cmp_to_key(compare_accounts))
+	accounts.sort(key=functools.cmp_to_key(compare_accounts))
+
 
 def set_gl_entries_by_account(
-		company, from_date, to_date, root_lft, root_rgt, filters, gl_entries_by_account, ignore_closing_entries=False):
+	company,
+	from_date,
+	to_date,
+	root_lft,
+	root_rgt,
+	filters,
+	gl_entries_by_account,
+	ignore_closing_entries=False,
+):
 	"""Returns a dict like { "account": [gl entries], ... }"""
 
 	additional_conditions = get_additional_conditions(from_date, ignore_closing_entries, filters)
 
-	accounts = frappe.db.sql_list("""select name from `tabAccount`
-		where lft >= %s and rgt <= %s and company = %s""", (root_lft, root_rgt, company))
+	accounts = frappe.db.sql_list(
+		"""select name from `tabAccount`
+		where lft >= %s and rgt <= %s and company = %s""",
+		(root_lft, root_rgt, company),
+	)
 
 	if accounts:
-		additional_conditions += " and account in ({})"\
-			.format(", ".join(frappe.db.escape(d) for d in accounts))
+		additional_conditions += " and account in ({})".format(
+			", ".join(frappe.db.escape(d) for d in accounts)
+		)
 
 		gl_filters = {
 			"company": company,
 			"from_date": from_date,
 			"to_date": to_date,
-			"finance_book": cstr(filters.get("finance_book"))
+			"finance_book": cstr(filters.get("finance_book")),
 		}
 
 		if filters.get("include_default_book_entries"):
-			gl_filters["company_fb"] = frappe.db.get_value("Company",
-				company, 'default_finance_book')
+			gl_filters["company_fb"] = frappe.db.get_value("Company", company, "default_finance_book")
 
 		for key, value in filters.items():
 			if value:
-				gl_filters.update({
-					key: value
-				})
+				gl_filters.update({key: value})
 
-		gl_entries = frappe.db.sql("""
+		gl_entries = frappe.db.sql(
+			"""
 			select posting_date, account, debit, credit, is_opening, fiscal_year,
 				debit_in_account_currency, credit_in_account_currency, account_currency from `tabGL Entry`
 			where company=%(company)s
 			{additional_conditions}
 			and posting_date <= %(to_date)s
 			and is_cancelled = 0""".format(
-			additional_conditions=additional_conditions), gl_filters, as_dict=True
+				additional_conditions=additional_conditions
+			),
+			gl_filters,
+			as_dict=True,
 		)
 
-		if filters and filters.get('presentation_currency'):
-			convert_to_presentation_currency(gl_entries, get_currency(filters), filters.get('company'))
+		if filters and filters.get("presentation_currency"):
+			convert_to_presentation_currency(gl_entries, get_currency(filters), filters.get("company"))
 
 		for entry in gl_entries:
 			gl_entries_by_account.setdefault(entry.account, []).append(entry)
@@ -431,25 +492,29 @@
 			additional_conditions.append("cost_center in %(cost_center)s")
 
 		if filters.get("include_default_book_entries"):
-			additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)")
+			additional_conditions.append(
+				"(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)"
+			)
 		else:
 			additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)")
 
 	if accounting_dimensions:
 		for dimension in accounting_dimensions:
 			if filters.get(dimension.fieldname):
-				if frappe.get_cached_value('DocType', dimension.document_type, 'is_tree'):
-					filters[dimension.fieldname] = get_dimension_with_children(dimension.document_type,
-						filters.get(dimension.fieldname))
+				if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"):
+					filters[dimension.fieldname] = get_dimension_with_children(
+						dimension.document_type, filters.get(dimension.fieldname)
+					)
 					additional_conditions.append("{0} in %({0})s".format(dimension.fieldname))
 				else:
 					additional_conditions.append("{0} in (%({0})s)".format(dimension.fieldname))
 
 	return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
 
+
 def get_cost_centers_with_children(cost_centers):
 	if not isinstance(cost_centers, list):
-		cost_centers = [d.strip() for d in cost_centers.strip().split(',') if d]
+		cost_centers = [d.strip() for d in cost_centers.strip().split(",") if d]
 
 	all_cost_centers = []
 	for d in cost_centers:
@@ -462,45 +527,50 @@
 
 	return list(set(all_cost_centers))
 
+
 def get_columns(periodicity, period_list, accumulated_values=1, company=None):
-	columns = [{
-		"fieldname": "account",
-		"label": _("Account"),
-		"fieldtype": "Link",
-		"options": "Account",
-		"width": 300
-	}]
-	if company:
-		columns.append({
-			"fieldname": "currency",
-			"label": _("Currency"),
+	columns = [
+		{
+			"fieldname": "account",
+			"label": _("Account"),
 			"fieldtype": "Link",
-			"options": "Currency",
-			"hidden": 1
-		})
+			"options": "Account",
+			"width": 300,
+		}
+	]
+	if company:
+		columns.append(
+			{
+				"fieldname": "currency",
+				"label": _("Currency"),
+				"fieldtype": "Link",
+				"options": "Currency",
+				"hidden": 1,
+			}
+		)
 	for period in period_list:
-		columns.append({
-			"fieldname": period.key,
-			"label": period.label,
-			"fieldtype": "Currency",
-			"options": "currency",
-			"width": 150
-		})
-	if periodicity!="Yearly":
-		if not accumulated_values:
-			columns.append({
-				"fieldname": "total",
-				"label": _("Total"),
+		columns.append(
+			{
+				"fieldname": period.key,
+				"label": period.label,
 				"fieldtype": "Currency",
-				"width": 150
-			})
+				"options": "currency",
+				"width": 150,
+			}
+		)
+	if periodicity != "Yearly":
+		if not accumulated_values:
+			columns.append(
+				{"fieldname": "total", "label": _("Total"), "fieldtype": "Currency", "width": 150}
+			)
 
 	return columns
 
+
 def get_filtered_list_for_consolidated_report(filters, period_list):
 	filtered_summary_list = []
 	for period in period_list:
-		if period == filters.get('company'):
+		if period == filters.get("company"):
 			filtered_summary_list.append(period)
 
 	return filtered_summary_list
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index 4ff0297..636d624 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -20,20 +20,20 @@
 # to cache translations
 TRANSLATIONS = frappe._dict()
 
+
 def execute(filters=None):
 	if not filters:
 		return [], []
 
 	account_details = {}
 
-	if filters and filters.get('print_in_account_currency') and \
-		not filters.get('account'):
+	if filters and filters.get("print_in_account_currency") and not filters.get("account"):
 		frappe.throw(_("Select an account to print in account currency"))
 
 	for acc in frappe.db.sql("""select name, is_group from tabAccount""", as_dict=1):
 		account_details.setdefault(acc.name, acc)
 
-	if filters.get('party'):
+	if filters.get("party"):
 		filters.party = frappe.parse_json(filters.get("party"))
 
 	validate_filters(filters, account_details)
@@ -50,46 +50,45 @@
 
 	return columns, res
 
+
 def update_translations():
 	TRANSLATIONS.update(
-		dict(
-			OPENING = _('Opening'),
-			TOTAL = _('Total'),
-			CLOSING_TOTAL = _('Closing (Opening + Total)')
-		)
+		dict(OPENING=_("Opening"), TOTAL=_("Total"), CLOSING_TOTAL=_("Closing (Opening + Total)"))
 	)
 
+
 def validate_filters(filters, account_details):
 	if not filters.get("company"):
 		frappe.throw(_("{0} is mandatory").format(_("Company")))
 
 	if not filters.get("from_date") and not filters.get("to_date"):
-		frappe.throw(_("{0} and {1} are mandatory").format(frappe.bold(_("From Date")), frappe.bold(_("To Date"))))
+		frappe.throw(
+			_("{0} and {1} are mandatory").format(frappe.bold(_("From Date")), frappe.bold(_("To Date")))
+		)
 
-	if filters.get('account'):
-		filters.account = frappe.parse_json(filters.get('account'))
+	if filters.get("account"):
+		filters.account = frappe.parse_json(filters.get("account"))
 		for account in filters.account:
 			if not account_details.get(account):
 				frappe.throw(_("Account {0} does not exists").format(account))
 
-	if (filters.get("account") and filters.get("group_by") == 'Group by Account'):
-		filters.account = frappe.parse_json(filters.get('account'))
+	if filters.get("account") and filters.get("group_by") == "Group by Account":
+		filters.account = frappe.parse_json(filters.get("account"))
 		for account in filters.account:
 			if account_details[account].is_group == 0:
 				frappe.throw(_("Can not filter based on Child Account, if grouped by Account"))
 
-	if (filters.get("voucher_no")
-		and filters.get("group_by") in ['Group by Voucher']):
+	if filters.get("voucher_no") and filters.get("group_by") in ["Group by Voucher"]:
 		frappe.throw(_("Can not filter based on Voucher No, if grouped by Voucher"))
 
 	if filters.from_date > filters.to_date:
 		frappe.throw(_("From Date must be before To Date"))
 
-	if filters.get('project'):
-		filters.project = frappe.parse_json(filters.get('project'))
+	if filters.get("project"):
+		filters.project = frappe.parse_json(filters.get("project"))
 
-	if filters.get('cost_center'):
-		filters.cost_center = frappe.parse_json(filters.get('cost_center'))
+	if filters.get("cost_center"):
+		filters.cost_center = frappe.parse_json(filters.get("cost_center"))
 
 
 def validate_party(filters):
@@ -100,9 +99,12 @@
 			if not frappe.db.exists(party_type, d):
 				frappe.throw(_("Invalid {0}: {1}").format(party_type, d))
 
+
 def set_account_currency(filters):
-	if filters.get("account") or (filters.get('party') and len(filters.party) == 1):
-		filters["company_currency"] = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	if filters.get("account") or (filters.get("party") and len(filters.party) == 1):
+		filters["company_currency"] = frappe.get_cached_value(
+			"Company", filters.company, "default_currency"
+		)
 		account_currency = None
 
 		if filters.get("account"):
@@ -121,17 +123,19 @@
 
 		elif filters.get("party"):
 			gle_currency = frappe.db.get_value(
-				"GL Entry", {
-					"party_type": filters.party_type, "party": filters.party[0], "company": filters.company
-				},
-				"account_currency"
+				"GL Entry",
+				{"party_type": filters.party_type, "party": filters.party[0], "company": filters.company},
+				"account_currency",
 			)
 
 			if gle_currency:
 				account_currency = gle_currency
 			else:
-				account_currency = (None if filters.party_type in ["Employee", "Student", "Shareholder", "Member"] else
-					frappe.db.get_value(filters.party_type, filters.party[0], "default_currency"))
+				account_currency = (
+					None
+					if filters.party_type in ["Employee", "Student", "Shareholder", "Member"]
+					else frappe.db.get_value(filters.party_type, filters.party[0], "default_currency")
+				)
 
 		filters["account_currency"] = account_currency or filters.company_currency
 		if filters.account_currency != filters.company_currency and not filters.presentation_currency:
@@ -139,6 +143,7 @@
 
 	return filters
 
+
 def get_result(filters, account_details):
 	accounting_dimensions = []
 	if filters.get("include_dimensions"):
@@ -146,13 +151,13 @@
 
 	gl_entries = get_gl_entries(filters, accounting_dimensions)
 
-	data = get_data_with_opening_closing(filters, account_details,
-		accounting_dimensions, gl_entries)
+	data = get_data_with_opening_closing(filters, account_details, accounting_dimensions, gl_entries)
 
 	result = get_result_as_list(data, filters)
 
 	return result
 
+
 def get_gl_entries(filters, accounting_dimensions):
 	currency_map = get_currency(filters)
 	select_fields = """, debit, credit, debit_in_account_currency,
@@ -169,14 +174,16 @@
 		order_by_statement = "order by account, posting_date, creation"
 
 	if filters.get("include_default_book_entries"):
-		filters['company_fb'] = frappe.db.get_value("Company",
-			filters.get("company"), 'default_finance_book')
+		filters["company_fb"] = frappe.db.get_value(
+			"Company", filters.get("company"), "default_finance_book"
+		)
 
 	dimension_fields = ""
 	if accounting_dimensions:
-		dimension_fields = ', '.join(accounting_dimensions) + ','
+		dimension_fields = ", ".join(accounting_dimensions) + ","
 
-	gl_entries = frappe.db.sql("""
+	gl_entries = frappe.db.sql(
+		"""
 		select
 			name as gl_entry, posting_date, account, party_type, party,
 			voucher_type, voucher_no, {dimension_fields}
@@ -187,12 +194,17 @@
 		where company=%(company)s {conditions}
 		{order_by_statement}
 	""".format(
-		dimension_fields=dimension_fields, select_fields=select_fields,
-		conditions=get_conditions(filters), order_by_statement=order_by_statement
-	), filters, as_dict=1)
+			dimension_fields=dimension_fields,
+			select_fields=select_fields,
+			conditions=get_conditions(filters),
+			order_by_statement=order_by_statement,
+		),
+		filters,
+		as_dict=1,
+	)
 
-	if filters.get('presentation_currency'):
-		return convert_to_presentation_currency(gl_entries, currency_map, filters.get('company'))
+	if filters.get("presentation_currency"):
+		return convert_to_presentation_currency(gl_entries, currency_map, filters.get("company"))
 	else:
 		return gl_entries
 
@@ -220,8 +232,11 @@
 	if filters.get("party"):
 		conditions.append("party in %(party)s")
 
-	if not (filters.get("account") or filters.get("party") or
-		filters.get("group_by") in ["Group by Account", "Group by Party"]):
+	if not (
+		filters.get("account")
+		or filters.get("party")
+		or filters.get("group_by") in ["Group by Account", "Group by Party"]
+	):
 		conditions.append("posting_date >=%(from_date)s")
 
 	conditions.append("(posting_date <=%(to_date)s or is_opening = 'Yes')")
@@ -231,7 +246,9 @@
 
 	if filters.get("finance_book"):
 		if filters.get("include_default_book_entries"):
-			conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)")
+			conditions.append(
+				"(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)"
+			)
 		else:
 			conditions.append("finance_book in (%(finance_book)s)")
 
@@ -239,6 +256,7 @@
 		conditions.append("is_cancelled = 0")
 
 	from frappe.desk.reportview import build_match_conditions
+
 	match_conditions = build_match_conditions("GL Entry")
 
 	if match_conditions:
@@ -251,18 +269,20 @@
 			for dimension in accounting_dimensions:
 				if not dimension.disabled:
 					if filters.get(dimension.fieldname):
-						if frappe.get_cached_value('DocType', dimension.document_type, 'is_tree'):
-							filters[dimension.fieldname] = get_dimension_with_children(dimension.document_type,
-								filters.get(dimension.fieldname))
+						if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"):
+							filters[dimension.fieldname] = get_dimension_with_children(
+								dimension.document_type, filters.get(dimension.fieldname)
+							)
 							conditions.append("{0} in %({0})s".format(dimension.fieldname))
 						else:
 							conditions.append("{0} in (%({0})s)".format(dimension.fieldname))
 
 	return "and {}".format(" and ".join(conditions)) if conditions else ""
 
+
 def get_accounts_with_children(accounts):
 	if not isinstance(accounts, list):
-		accounts = [d.strip() for d in accounts.strip().split(',') if d]
+		accounts = [d.strip() for d in accounts.strip().split(",") if d]
 
 	all_accounts = []
 	for d in accounts:
@@ -275,6 +295,7 @@
 
 	return list(set(all_accounts))
 
+
 def get_data_with_opening_closing(filters, account_details, accounting_dimensions, gl_entries):
 	data = []
 
@@ -285,7 +306,7 @@
 	# Opening for filtered account
 	data.append(totals.opening)
 
-	if filters.get("group_by") != 'Group by Voucher (Consolidated)':
+	if filters.get("group_by") != "Group by Voucher (Consolidated)":
 		for acc, acc_dict in gle_map.items():
 			# acc
 			if acc_dict.entries:
@@ -314,6 +335,7 @@
 
 	return data
 
+
 def get_totals_dict():
 	def _get_debit_credit_dict(label):
 		return _dict(
@@ -321,25 +343,28 @@
 			debit=0.0,
 			credit=0.0,
 			debit_in_account_currency=0.0,
-			credit_in_account_currency=0.0
+			credit_in_account_currency=0.0,
 		)
+
 	return _dict(
-		opening = _get_debit_credit_dict(TRANSLATIONS.OPENING),
-		total = _get_debit_credit_dict(TRANSLATIONS.TOTAL),
-		closing = _get_debit_credit_dict(TRANSLATIONS.CLOSING_TOTAL)
+		opening=_get_debit_credit_dict(TRANSLATIONS.OPENING),
+		total=_get_debit_credit_dict(TRANSLATIONS.TOTAL),
+		closing=_get_debit_credit_dict(TRANSLATIONS.CLOSING_TOTAL),
 	)
 
+
 def group_by_field(group_by):
-	if group_by == 'Group by Party':
-		return 'party'
-	elif group_by in ['Group by Voucher (Consolidated)', 'Group by Account']:
-		return 'account'
+	if group_by == "Group by Party":
+		return "party"
+	elif group_by in ["Group by Voucher (Consolidated)", "Group by Account"]:
+		return "account"
 	else:
-		return 'voucher_no'
+		return "voucher_no"
+
 
 def initialize_gle_map(gl_entries, filters):
 	gle_map = OrderedDict()
-	group_by = group_by_field(filters.get('group_by'))
+	group_by = group_by_field(filters.get("group_by"))
 
 	for gle in gl_entries:
 		gle_map.setdefault(gle.get(group_by), _dict(totals=get_totals_dict(), entries=[]))
@@ -350,11 +375,11 @@
 	totals = get_totals_dict()
 	entries = []
 	consolidated_gle = OrderedDict()
-	group_by = group_by_field(filters.get('group_by'))
-	group_by_voucher_consolidated = filters.get("group_by") == 'Group by Voucher (Consolidated)'
+	group_by = group_by_field(filters.get("group_by"))
+	group_by_voucher_consolidated = filters.get("group_by") == "Group by Voucher (Consolidated)"
 
-	if filters.get('show_net_values_in_party_account'):
-		account_type_map = get_account_type_map(filters.get('company'))
+	if filters.get("show_net_values_in_party_account"):
+		account_type_map = get_account_type_map(filters.get("company"))
 
 	def update_value_in_dict(data, key, gle):
 		data[key].debit += gle.debit
@@ -363,26 +388,28 @@
 		data[key].debit_in_account_currency += gle.debit_in_account_currency
 		data[key].credit_in_account_currency += gle.credit_in_account_currency
 
-		if filters.get('show_net_values_in_party_account') and \
-			account_type_map.get(data[key].account) in ('Receivable', 'Payable'):
+		if filters.get("show_net_values_in_party_account") and account_type_map.get(
+			data[key].account
+		) in ("Receivable", "Payable"):
 			net_value = data[key].debit - data[key].credit
-			net_value_in_account_currency = data[key].debit_in_account_currency \
-				- data[key].credit_in_account_currency
+			net_value_in_account_currency = (
+				data[key].debit_in_account_currency - data[key].credit_in_account_currency
+			)
 
 			if net_value < 0:
-				dr_or_cr = 'credit'
-				rev_dr_or_cr = 'debit'
+				dr_or_cr = "credit"
+				rev_dr_or_cr = "debit"
 			else:
-				dr_or_cr = 'debit'
-				rev_dr_or_cr = 'credit'
+				dr_or_cr = "debit"
+				rev_dr_or_cr = "credit"
 
 			data[key][dr_or_cr] = abs(net_value)
-			data[key][dr_or_cr+'_in_account_currency'] = abs(net_value_in_account_currency)
+			data[key][dr_or_cr + "_in_account_currency"] = abs(net_value_in_account_currency)
 			data[key][rev_dr_or_cr] = 0
-			data[key][rev_dr_or_cr+'_in_account_currency'] = 0
+			data[key][rev_dr_or_cr + "_in_account_currency"] = 0
 
 		if data[key].against_voucher and gle.against_voucher:
-			data[key].against_voucher += ', ' + gle.against_voucher
+			data[key].against_voucher += ", " + gle.against_voucher
 
 	from_date, to_date = getdate(filters.from_date), getdate(filters.to_date)
 	show_opening_entries = filters.get("show_opening_entries")
@@ -390,20 +417,20 @@
 	for gle in gl_entries:
 		group_by_value = gle.get(group_by)
 
-		if (gle.posting_date < from_date or (cstr(gle.is_opening) == "Yes" and not show_opening_entries)):
+		if gle.posting_date < from_date or (cstr(gle.is_opening) == "Yes" and not show_opening_entries):
 			if not group_by_voucher_consolidated:
-				update_value_in_dict(gle_map[group_by_value].totals, 'opening', gle)
-				update_value_in_dict(gle_map[group_by_value].totals, 'closing', gle)
+				update_value_in_dict(gle_map[group_by_value].totals, "opening", gle)
+				update_value_in_dict(gle_map[group_by_value].totals, "closing", gle)
 
-			update_value_in_dict(totals, 'opening', gle)
-			update_value_in_dict(totals, 'closing', gle)
+			update_value_in_dict(totals, "opening", gle)
+			update_value_in_dict(totals, "closing", gle)
 
 		elif gle.posting_date <= to_date:
 			if not group_by_voucher_consolidated:
-				update_value_in_dict(gle_map[group_by_value].totals, 'total', gle)
-				update_value_in_dict(gle_map[group_by_value].totals, 'closing', gle)
-				update_value_in_dict(totals, 'total', gle)
-				update_value_in_dict(totals, 'closing', gle)
+				update_value_in_dict(gle_map[group_by_value].totals, "total", gle)
+				update_value_in_dict(gle_map[group_by_value].totals, "closing", gle)
+				update_value_in_dict(totals, "total", gle)
+				update_value_in_dict(totals, "closing", gle)
 
 				gle_map[group_by_value].entries.append(gle)
 
@@ -421,47 +448,58 @@
 					update_value_in_dict(consolidated_gle, key, gle)
 
 	for key, value in consolidated_gle.items():
-		update_value_in_dict(totals, 'total', value)
-		update_value_in_dict(totals, 'closing', value)
+		update_value_in_dict(totals, "total", value)
+		update_value_in_dict(totals, "closing", value)
 		entries.append(value)
 
 	return totals, entries
 
+
 def get_account_type_map(company):
-	account_type_map = frappe._dict(frappe.get_all('Account', fields=['name', 'account_type'],
-		filters={'company': company}, as_list=1))
+	account_type_map = frappe._dict(
+		frappe.get_all(
+			"Account", fields=["name", "account_type"], filters={"company": company}, as_list=1
+		)
+	)
 
 	return account_type_map
 
+
 def get_result_as_list(data, filters):
 	balance, balance_in_account_currency = 0, 0
 	inv_details = get_supplier_invoice_details()
 
 	for d in data:
-		if not d.get('posting_date'):
+		if not d.get("posting_date"):
 			balance, balance_in_account_currency = 0, 0
 
-		balance = get_balance(d, balance, 'debit', 'credit')
-		d['balance'] = balance
+		balance = get_balance(d, balance, "debit", "credit")
+		d["balance"] = balance
 
-		d['account_currency'] = filters.account_currency
-		d['bill_no'] = inv_details.get(d.get('against_voucher'), '')
+		d["account_currency"] = filters.account_currency
+		d["bill_no"] = inv_details.get(d.get("against_voucher"), "")
 
 	return data
 
+
 def get_supplier_invoice_details():
 	inv_details = {}
-	for d in frappe.db.sql(""" select name, bill_no from `tabPurchase Invoice`
-		where docstatus = 1 and bill_no is not null and bill_no != '' """, as_dict=1):
+	for d in frappe.db.sql(
+		""" select name, bill_no from `tabPurchase Invoice`
+		where docstatus = 1 and bill_no is not null and bill_no != '' """,
+		as_dict=1,
+	):
 		inv_details[d.name] = d.bill_no
 
 	return inv_details
 
+
 def get_balance(row, balance, debit_field, credit_field):
-	balance += (row.get(debit_field, 0) -  row.get(credit_field, 0))
+	balance += row.get(debit_field, 0) - row.get(credit_field, 0)
 
 	return balance
 
+
 def get_columns(filters):
 	if filters.get("presentation_currency"):
 		currency = filters["presentation_currency"]
@@ -478,113 +516,70 @@
 			"fieldname": "gl_entry",
 			"fieldtype": "Link",
 			"options": "GL Entry",
-			"hidden": 1
+			"hidden": 1,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 90
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 90},
 		{
 			"label": _("Account"),
 			"fieldname": "account",
 			"fieldtype": "Link",
 			"options": "Account",
-			"width": 180
+			"width": 180,
 		},
 		{
 			"label": _("Debit ({0})").format(currency),
 			"fieldname": "debit",
 			"fieldtype": "Float",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Credit ({0})").format(currency),
 			"fieldname": "credit",
 			"fieldtype": "Float",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Balance ({0})").format(currency),
 			"fieldname": "balance",
 			"fieldtype": "Float",
-			"width": 130
+			"width": 130,
 		},
-		{
-			"label": _("Voucher Type"),
-			"fieldname": "voucher_type",
-			"width": 120
-		},
+		{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": 120},
 		{
 			"label": _("Voucher No"),
 			"fieldname": "voucher_no",
 			"fieldtype": "Dynamic Link",
 			"options": "voucher_type",
-			"width": 180
+			"width": 180,
 		},
-		{
-			"label": _("Against Account"),
-			"fieldname": "against",
-			"width": 120
-		},
-		{
-			"label": _("Party Type"),
-			"fieldname": "party_type",
-			"width": 100
-		},
-		{
-			"label": _("Party"),
-			"fieldname": "party",
-			"width": 100
-		},
-		{
-			"label": _("Project"),
-			"options": "Project",
-			"fieldname": "project",
-			"width": 100
-		}
+		{"label": _("Against Account"), "fieldname": "against", "width": 120},
+		{"label": _("Party Type"), "fieldname": "party_type", "width": 100},
+		{"label": _("Party"), "fieldname": "party", "width": 100},
+		{"label": _("Project"), "options": "Project", "fieldname": "project", "width": 100},
 	]
 
 	if filters.get("include_dimensions"):
-		for dim in get_accounting_dimensions(as_list = False):
-			columns.append({
-				"label": _(dim.label),
-				"options": dim.label,
-				"fieldname": dim.fieldname,
-				"width": 100
-			})
-		columns.append({
-			"label": _("Cost Center"),
-			"options": "Cost Center",
-			"fieldname": "cost_center",
-			"width": 100
-		})
+		for dim in get_accounting_dimensions(as_list=False):
+			columns.append(
+				{"label": _(dim.label), "options": dim.label, "fieldname": dim.fieldname, "width": 100}
+			)
+		columns.append(
+			{"label": _("Cost Center"), "options": "Cost Center", "fieldname": "cost_center", "width": 100}
+		)
 
-	columns.extend([
-		{
-			"label": _("Against Voucher Type"),
-			"fieldname": "against_voucher_type",
-			"width": 100
-		},
-		{
-			"label": _("Against Voucher"),
-			"fieldname": "against_voucher",
-			"fieldtype": "Dynamic Link",
-			"options": "against_voucher_type",
-			"width": 100
-		},
-		{
-			"label": _("Supplier Invoice No"),
-			"fieldname": "bill_no",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Remarks"),
-			"fieldname": "remarks",
-			"width": 400
-		}
-	])
+	columns.extend(
+		[
+			{"label": _("Against Voucher Type"), "fieldname": "against_voucher_type", "width": 100},
+			{
+				"label": _("Against Voucher"),
+				"fieldname": "against_voucher",
+				"fieldtype": "Dynamic Link",
+				"options": "against_voucher_type",
+				"width": 100,
+			},
+			{"label": _("Supplier Invoice No"), "fieldname": "bill_no", "fieldtype": "Data", "width": 100},
+			{"label": _("Remarks"), "fieldname": "remarks", "width": 400},
+		]
+	)
 
 	return columns
diff --git a/erpnext/accounts/report/general_ledger/test_general_ledger.py b/erpnext/accounts/report/general_ledger/test_general_ledger.py
index 2373c8c..b10e769 100644
--- a/erpnext/accounts/report/general_ledger/test_general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/test_general_ledger.py
@@ -9,7 +9,6 @@
 
 
 class TestGeneralLedger(FrappeTestCase):
-
 	def test_foreign_account_balance_after_exchange_rate_revaluation(self):
 		"""
 		Checks the correctness of balance after exchange rate revaluation
@@ -17,18 +16,20 @@
 		# create a new account with USD currency
 		account_name = "Test USD Account for Revalutation"
 		company = "_Test Company"
-		account = frappe.get_doc({
-			"account_name": account_name,
-			"is_group": 0,
-			"company": company,
-			"root_type": "Asset",
-			"report_type": "Balance Sheet",
-			"account_currency": "USD",
-			"inter_company_account": 0,
-			"parent_account": "Bank Accounts - _TC",
-			"account_type": "Bank",
-			"doctype": "Account"
-		})
+		account = frappe.get_doc(
+			{
+				"account_name": account_name,
+				"is_group": 0,
+				"company": company,
+				"root_type": "Asset",
+				"report_type": "Balance Sheet",
+				"account_currency": "USD",
+				"inter_company_account": 0,
+				"parent_account": "Bank Accounts - _TC",
+				"account_type": "Bank",
+				"doctype": "Account",
+			}
+		)
 		account.insert(ignore_if_duplicate=True)
 		# create a JV to debit 1000 USD at 75 exchange rate
 		jv = frappe.new_doc("Journal Entry")
@@ -36,21 +37,24 @@
 		jv.company = company
 		jv.multi_currency = 1
 		jv.cost_center = "_Test Cost Center - _TC"
-		jv.set("accounts", [
-			{
-				"account": account.name,
-				"debit_in_account_currency": 1000,
-				"credit_in_account_currency": 0,
-				"exchange_rate": 75,
-				"cost_center": "_Test Cost Center - _TC",
-			},
-			{
-				"account": "Cash - _TC",
-				"debit_in_account_currency": 0,
-				"credit_in_account_currency": 75000,
-				"cost_center": "_Test Cost Center - _TC",
-			},
-		])
+		jv.set(
+			"accounts",
+			[
+				{
+					"account": account.name,
+					"debit_in_account_currency": 1000,
+					"credit_in_account_currency": 0,
+					"exchange_rate": 75,
+					"cost_center": "_Test Cost Center - _TC",
+				},
+				{
+					"account": "Cash - _TC",
+					"debit_in_account_currency": 0,
+					"credit_in_account_currency": 75000,
+					"cost_center": "_Test Cost Center - _TC",
+				},
+			],
+		)
 		jv.save()
 		jv.submit()
 		# create a JV to credit 900 USD at 100 exchange rate
@@ -59,21 +63,24 @@
 		jv.company = company
 		jv.multi_currency = 1
 		jv.cost_center = "_Test Cost Center - _TC"
-		jv.set("accounts", [
-			{
-				"account": account.name,
-				"debit_in_account_currency": 0,
-				"credit_in_account_currency": 900,
-				"exchange_rate": 100,
-				"cost_center": "_Test Cost Center - _TC",
-			},
-			{
-				"account": "Cash - _TC",
-				"debit_in_account_currency": 90000,
-				"credit_in_account_currency": 0,
-				"cost_center": "_Test Cost Center - _TC",
-			},
-		])
+		jv.set(
+			"accounts",
+			[
+				{
+					"account": account.name,
+					"debit_in_account_currency": 0,
+					"credit_in_account_currency": 900,
+					"exchange_rate": 100,
+					"cost_center": "_Test Cost Center - _TC",
+				},
+				{
+					"account": "Cash - _TC",
+					"debit_in_account_currency": 90000,
+					"credit_in_account_currency": 0,
+					"cost_center": "_Test Cost Center - _TC",
+				},
+			],
+		)
 		jv.save()
 		jv.submit()
 
@@ -81,22 +88,27 @@
 		revaluation = frappe.new_doc("Exchange Rate Revaluation")
 		revaluation.posting_date = today()
 		revaluation.company = company
-		revaluation.set("accounts", [
-			{
-				"account": account.name,
-				"account_currency": "USD",
-				"new_exchange_rate": 77,
-				"new_balance_in_base_currency": 7700,
-				"balance_in_base_currency": -15000,
-				"balance_in_account_currency": 100,
-				"current_exchange_rate": -150
-			}
-		])
+		revaluation.set(
+			"accounts",
+			[
+				{
+					"account": account.name,
+					"account_currency": "USD",
+					"new_exchange_rate": 77,
+					"new_balance_in_base_currency": 7700,
+					"balance_in_base_currency": -15000,
+					"balance_in_account_currency": 100,
+					"current_exchange_rate": -150,
+				}
+			],
+		)
 		revaluation.save()
 		revaluation.submit()
 
 		# post journal entry to revaluate
-		frappe.db.set_value('Company',  company, "unrealized_exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC")
+		frappe.db.set_value(
+			"Company", company, "unrealized_exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC"
+		)
 		revaluation_jv = revaluation.make_jv_entry()
 		revaluation_jv = frappe.get_doc(revaluation_jv)
 		revaluation_jv.cost_center = "_Test Cost Center - _TC"
@@ -112,18 +124,24 @@
 				from `tabGL Entry`
 				where account = %s
 				group by account
-			""", account.name)
+			""",
+			account.name,
+		)
 
 		self.assertEqual(balance[0][0], 100)
 
 		# check if general ledger shows correct balance
-		columns, data = execute(frappe._dict({
-			"company": company,
-			"from_date": today(),
-			"to_date": today(),
-			"account": [account.name],
-			"group_by": "Group by Voucher (Consolidated)",
-		}))
+		columns, data = execute(
+			frappe._dict(
+				{
+					"company": company,
+					"from_date": today(),
+					"to_date": today(),
+					"account": [account.name],
+					"group_by": "Group by Voucher (Consolidated)",
+				}
+			)
+		)
 
 		self.assertEqual(data[1]["account"], account.name)
 		self.assertEqual(data[1]["debit"], 1000)
@@ -131,4 +149,4 @@
 		self.assertEqual(data[2]["debit"], 0)
 		self.assertEqual(data[2]["credit"], 900)
 		self.assertEqual(data[3]["debit"], 100)
-		self.assertEqual(data[3]["credit"], 100)
\ No newline at end of file
+		self.assertEqual(data[3]["credit"], 100)
diff --git a/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py b/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
index b18b940..9d56678 100644
--- a/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
+++ b/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
@@ -12,30 +12,57 @@
 
 
 def execute(filters=None):
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year, filters.period_start_date,
-		filters.period_end_date, filters.filter_based_on, filters.periodicity, filters.accumulated_values, filters.company)
+	period_list = get_period_list(
+		filters.from_fiscal_year,
+		filters.to_fiscal_year,
+		filters.period_start_date,
+		filters.period_end_date,
+		filters.filter_based_on,
+		filters.periodicity,
+		filters.accumulated_values,
+		filters.company,
+	)
 
 	columns, data = [], []
 
-	income = get_data(filters.company, "Income", "Credit", period_list, filters = filters,
+	income = get_data(
+		filters.company,
+		"Income",
+		"Credit",
+		period_list,
+		filters=filters,
 		accumulated_values=filters.accumulated_values,
-		ignore_closing_entries=True, ignore_accumulated_values_for_fy= True, total= False)
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
+		total=False,
+	)
 
-	expense = get_data(filters.company, "Expense", "Debit", period_list, filters=filters,
+	expense = get_data(
+		filters.company,
+		"Expense",
+		"Debit",
+		period_list,
+		filters=filters,
 		accumulated_values=filters.accumulated_values,
-		ignore_closing_entries=True, ignore_accumulated_values_for_fy= True, total= False)
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
+		total=False,
+	)
 
-	columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, filters.company)
-
+	columns = get_columns(
+		filters.periodicity, period_list, filters.accumulated_values, filters.company
+	)
 
 	gross_income = get_revenue(income, period_list)
 	gross_expense = get_revenue(expense, period_list)
 
-	if(len(gross_income)==0 and len(gross_expense)== 0):
-		data.append({
-			"account_name": "'" + _("Nothing is included in gross") + "'",
-			"account": "'" + _("Nothing is included in gross") + "'"
-		})
+	if len(gross_income) == 0 and len(gross_expense) == 0:
+		data.append(
+			{
+				"account_name": "'" + _("Nothing is included in gross") + "'",
+				"account": "'" + _("Nothing is included in gross") + "'",
+			}
+		)
 		return columns, data
 
 	# to avoid error eg: gross_income[0] : list index out of range
@@ -44,10 +71,12 @@
 	if not gross_expense:
 		gross_expense = [{}]
 
-	data.append({
-		"account_name": "'" + _("Included in Gross Profit") + "'",
-		"account": "'" + _("Included in Gross Profit") + "'"
-	})
+	data.append(
+		{
+			"account_name": "'" + _("Included in Gross Profit") + "'",
+			"account": "'" + _("Included in Gross Profit") + "'",
+		}
+	)
 
 	data.append({})
 	data.extend(gross_income or [])
@@ -56,7 +85,14 @@
 	data.extend(gross_expense or [])
 
 	data.append({})
-	gross_profit = get_profit(gross_income, gross_expense, period_list, filters.company, 'Gross Profit',filters.presentation_currency)
+	gross_profit = get_profit(
+		gross_income,
+		gross_expense,
+		period_list,
+		filters.company,
+		"Gross Profit",
+		filters.presentation_currency,
+	)
 	data.append(gross_profit)
 
 	non_gross_income = get_revenue(income, period_list, 0)
@@ -67,28 +103,40 @@
 	data.append({})
 	data.extend(non_gross_expense or [])
 
-	net_profit = get_net_profit(non_gross_income, gross_income, gross_expense, non_gross_expense, period_list, filters.company,filters.presentation_currency)
+	net_profit = get_net_profit(
+		non_gross_income,
+		gross_income,
+		gross_expense,
+		non_gross_expense,
+		period_list,
+		filters.company,
+		filters.presentation_currency,
+	)
 	data.append({})
 	data.append(net_profit)
 
 	return columns, data
 
-def get_revenue(data, period_list, include_in_gross=1):
-	revenue = [item for item in data if item['include_in_gross']==include_in_gross or item['is_group']==1]
 
-	data_to_be_removed =True
+def get_revenue(data, period_list, include_in_gross=1):
+	revenue = [
+		item for item in data if item["include_in_gross"] == include_in_gross or item["is_group"] == 1
+	]
+
+	data_to_be_removed = True
 	while data_to_be_removed:
 		revenue, data_to_be_removed = remove_parent_with_no_child(revenue, period_list)
 	revenue = adjust_account(revenue, period_list)
 	return copy.deepcopy(revenue)
 
+
 def remove_parent_with_no_child(data, period_list):
 	data_to_be_removed = False
 	for parent in data:
-		if 'is_group' in parent and parent.get("is_group") == 1:
+		if "is_group" in parent and parent.get("is_group") == 1:
 			have_child = False
 			for child in data:
-				if 'parent_account' in child  and child.get("parent_account") == parent.get("account"):
+				if "parent_account" in child and child.get("parent_account") == parent.get("account"):
 					have_child = True
 					break
 
@@ -98,8 +146,9 @@
 
 	return data, data_to_be_removed
 
-def adjust_account(data, period_list, consolidated= False):
-	leaf_nodes = [item for item in data if item['is_group'] == 0]
+
+def adjust_account(data, period_list, consolidated=False):
+	leaf_nodes = [item for item in data if item["is_group"] == 0]
 	totals = {}
 	for node in leaf_nodes:
 		set_total(node, node["total"], data, totals)
@@ -107,25 +156,30 @@
 		for period in period_list:
 			key = period if consolidated else period.key
 			d[key] = totals[d["account"]]
-			d['total'] = totals[d["account"]]
+			d["total"] = totals[d["account"]]
 	return data
 
+
 def set_total(node, value, complete_list, totals):
-	if not totals.get(node['account']):
+	if not totals.get(node["account"]):
 		totals[node["account"]] = 0
 	totals[node["account"]] += value
 
-	parent = node['parent_account']
-	if not parent == '':
-		return set_total(next(item for item in complete_list if item['account'] == parent), value, complete_list, totals)
+	parent = node["parent_account"]
+	if not parent == "":
+		return set_total(
+			next(item for item in complete_list if item["account"] == parent), value, complete_list, totals
+		)
 
 
-def get_profit(gross_income, gross_expense, period_list, company, profit_type, currency=None, consolidated=False):
+def get_profit(
+	gross_income, gross_expense, period_list, company, profit_type, currency=None, consolidated=False
+):
 	profit_loss = {
 		"account_name": "'" + _(profit_type) + "'",
 		"account": "'" + _(profit_type) + "'",
 		"warn_if_negative": True,
-		"currency": currency or frappe.get_cached_value('Company',  company,  "default_currency")
+		"currency": currency or frappe.get_cached_value("Company", company, "default_currency"),
 	}
 
 	has_value = False
@@ -137,17 +191,27 @@
 		profit_loss[key] = gross_income_for_period - gross_expense_for_period
 
 		if profit_loss[key]:
-			has_value=True
+			has_value = True
 
 	if has_value:
 		return profit_loss
 
-def get_net_profit(non_gross_income, gross_income, gross_expense, non_gross_expense, period_list, company, currency=None, consolidated=False):
+
+def get_net_profit(
+	non_gross_income,
+	gross_income,
+	gross_expense,
+	non_gross_expense,
+	period_list,
+	company,
+	currency=None,
+	consolidated=False,
+):
 	profit_loss = {
 		"account_name": "'" + _("Net Profit") + "'",
 		"account": "'" + _("Net Profit") + "'",
 		"warn_if_negative": True,
-		"currency": currency or frappe.get_cached_value('Company',  company,  "default_currency")
+		"currency": currency or frappe.get_cached_value("Company", company, "default_currency"),
 	}
 
 	has_value = False
@@ -165,7 +229,7 @@
 		profit_loss[key] = flt(total_income) - flt(total_expense)
 
 		if profit_loss[key]:
-			has_value=True
+			has_value = True
 
 	if has_value:
 		return profit_loss
diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py
index b03bb9b..9668992 100644
--- a/erpnext/accounts/report/gross_profit/gross_profit.py
+++ b/erpnext/accounts/report/gross_profit/gross_profit.py
@@ -11,38 +11,125 @@
 
 
 def execute(filters=None):
-	if not filters: filters = frappe._dict()
-	filters.currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	if not filters:
+		filters = frappe._dict()
+	filters.currency = frappe.get_cached_value("Company", filters.company, "default_currency")
 
 	gross_profit_data = GrossProfitGenerator(filters)
 
 	data = []
 
-	group_wise_columns = frappe._dict({
-		"invoice": ["invoice_or_item", "customer", "customer_group", "posting_date","item_code", "item_name","item_group", "brand", "description",
-			"warehouse", "qty", "base_rate", "buying_rate", "base_amount",
-			"buying_amount", "gross_profit", "gross_profit_percent", "project"],
-		"item_code": ["item_code", "item_name", "brand", "description", "qty", "base_rate",
-			"buying_rate", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"],
-		"warehouse": ["warehouse", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
-			"gross_profit", "gross_profit_percent"],
-		"brand": ["brand", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
-			"gross_profit", "gross_profit_percent"],
-		"item_group": ["item_group", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
-			"gross_profit", "gross_profit_percent"],
-		"customer": ["customer", "customer_group", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
-			"gross_profit", "gross_profit_percent"],
-		"customer_group": ["customer_group", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
-			"gross_profit", "gross_profit_percent"],
-		"sales_person": ["sales_person", "allocated_amount", "qty", "base_rate", "buying_rate", "base_amount", "buying_amount",
-			"gross_profit", "gross_profit_percent"],
-		"project": ["project", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"],
-		"territory": ["territory", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"]
-	})
+	group_wise_columns = frappe._dict(
+		{
+			"invoice": [
+				"invoice_or_item",
+				"customer",
+				"customer_group",
+				"posting_date",
+				"item_code",
+				"item_name",
+				"item_group",
+				"brand",
+				"description",
+				"warehouse",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+				"project",
+			],
+			"item_code": [
+				"item_code",
+				"item_name",
+				"brand",
+				"description",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"warehouse": [
+				"warehouse",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"brand": [
+				"brand",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"item_group": [
+				"item_group",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"customer": [
+				"customer",
+				"customer_group",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"customer_group": [
+				"customer_group",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"sales_person": [
+				"sales_person",
+				"allocated_amount",
+				"qty",
+				"base_rate",
+				"buying_rate",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+			"project": ["project", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"],
+			"territory": [
+				"territory",
+				"base_amount",
+				"buying_amount",
+				"gross_profit",
+				"gross_profit_percent",
+			],
+		}
+	)
 
 	columns = get_columns(group_wise_columns, filters)
 
-	if filters.group_by == 'Invoice':
+	if filters.group_by == "Invoice":
 		get_data_when_grouped_by_invoice(columns, gross_profit_data, filters, group_wise_columns, data)
 
 	else:
@@ -50,11 +137,14 @@
 
 	return columns, data
 
-def get_data_when_grouped_by_invoice(columns, gross_profit_data, filters, group_wise_columns, data):
+
+def get_data_when_grouped_by_invoice(
+	columns, gross_profit_data, filters, group_wise_columns, data
+):
 	column_names = get_column_names()
 
 	# to display item as Item Code: Item Name
-	columns[0] = 'Sales Invoice:Link/Item:300'
+	columns[0] = "Sales Invoice:Link/Item:300"
 	# removing Item Code and Item Name columns
 	del columns[4:6]
 
@@ -69,6 +159,7 @@
 
 		data.append(row)
 
+
 def get_data_when_not_grouped_by_invoice(gross_profit_data, filters, group_wise_columns, data):
 	for src in gross_profit_data.grouped_data:
 		row = []
@@ -79,69 +170,196 @@
 
 		data.append(row)
 
+
 def get_columns(group_wise_columns, filters):
 	columns = []
-	column_map = frappe._dict({
-		"parent": {"label": _('Sales Invoice'), "fieldname": "parent_invoice", "fieldtype": "Link", "options": "Sales Invoice", "width": 120},
-		"invoice_or_item": {"label": _('Sales Invoice'), "fieldtype": "Link", "options": "Sales Invoice", "width": 120},
-		"posting_date": {"label": _('Posting Date'), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
-		"posting_time": {"label": _('Posting Time'), "fieldname": "posting_time", "fieldtype": "Data", "width": 100},
-		"item_code": {"label": _('Item Code'), "fieldname": "item_code", "fieldtype": "Link", "options": "Item", "width": 100},
-		"item_name": {"label": _('Item Name'), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
-		"item_group": {"label": _('Item Group'), "fieldname": "item_group", "fieldtype": "Link", "options": "Item Group", "width": 100},
-		"brand": {"label": _('Brand'), "fieldtype": "Link", "options": "Brand", "width": 100},
-		"description": {"label": _('Description'), "fieldname": "description",  "fieldtype": "Data", "width": 100},
-		"warehouse": {"label": _('Warehouse'), "fieldname": "warehouse", "fieldtype": "Link", "options": "warehouse", "width": 100},
-		"qty": {"label": _('Qty'), "fieldname": "qty", "fieldtype": "Float", "width": 80},
-		"base_rate": {"label": _('Avg. Selling Rate'), "fieldname": "avg._selling_rate",  "fieldtype": "Currency", "options": "currency", "width": 100},
-		"buying_rate": {"label": _('Valuation Rate'), "fieldname": "valuation_rate", "fieldtype": "Currency", "options": "currency", "width": 100},
-		"base_amount": {"label": _('Selling Amount'), "fieldname": "selling_amount", "fieldtype": "Currency", "options": "currency", "width": 100},
-		"buying_amount": {"label": _('Buying Amount'), "fieldname": "buying_amount", "fieldtype": "Currency", "options": "currency", "width": 100},
-		"gross_profit": {"label": _('Gross Profit'), "fieldname": "gross_profit", "fieldtype": "Currency", "options": "currency", "width": 100},
-		"gross_profit_percent": {"label": _('Gross Profit Percent'), "fieldname": "gross_profit_%",
-			"fieldtype": "Percent", "width": 100},
-		"project": {"label": _('Project'), "fieldname": "project", "fieldtype": "Link", "options": "Project", "width": 100},
-		"sales_person": {"label": _('Sales Person'), "fieldname": "sales_person", "fieldtype": "Data","width": 100},
-		"allocated_amount": {"label": _('Allocated Amount'), "fieldname": "allocated_amount", "fieldtype": "Currency", "options": "currency", "width": 100},
-		"customer": {"label": _('Customer'), "fieldname": "customer", "fieldtype": "Link", "options": "Customer", "width": 100},
-		"customer_group": {"label": _('Customer Group'), "fieldname": "customer_group", "fieldtype": "Link", "options": "customer", "width": 100},
-		"territory": {"label": _('Territory'), "fieldname": "territory",  "fieldtype": "Link", "options": "territory", "width": 100},
-	})
+	column_map = frappe._dict(
+		{
+			"parent": {
+				"label": _("Sales Invoice"),
+				"fieldname": "parent_invoice",
+				"fieldtype": "Link",
+				"options": "Sales Invoice",
+				"width": 120,
+			},
+			"invoice_or_item": {
+				"label": _("Sales Invoice"),
+				"fieldtype": "Link",
+				"options": "Sales Invoice",
+				"width": 120,
+			},
+			"posting_date": {
+				"label": _("Posting Date"),
+				"fieldname": "posting_date",
+				"fieldtype": "Date",
+				"width": 100,
+			},
+			"posting_time": {
+				"label": _("Posting Time"),
+				"fieldname": "posting_time",
+				"fieldtype": "Data",
+				"width": 100,
+			},
+			"item_code": {
+				"label": _("Item Code"),
+				"fieldname": "item_code",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 100,
+			},
+			"item_name": {
+				"label": _("Item Name"),
+				"fieldname": "item_name",
+				"fieldtype": "Data",
+				"width": 100,
+			},
+			"item_group": {
+				"label": _("Item Group"),
+				"fieldname": "item_group",
+				"fieldtype": "Link",
+				"options": "Item Group",
+				"width": 100,
+			},
+			"brand": {"label": _("Brand"), "fieldtype": "Link", "options": "Brand", "width": 100},
+			"description": {
+				"label": _("Description"),
+				"fieldname": "description",
+				"fieldtype": "Data",
+				"width": 100,
+			},
+			"warehouse": {
+				"label": _("Warehouse"),
+				"fieldname": "warehouse",
+				"fieldtype": "Link",
+				"options": "warehouse",
+				"width": 100,
+			},
+			"qty": {"label": _("Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 80},
+			"base_rate": {
+				"label": _("Avg. Selling Rate"),
+				"fieldname": "avg._selling_rate",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			},
+			"buying_rate": {
+				"label": _("Valuation Rate"),
+				"fieldname": "valuation_rate",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			},
+			"base_amount": {
+				"label": _("Selling Amount"),
+				"fieldname": "selling_amount",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			},
+			"buying_amount": {
+				"label": _("Buying Amount"),
+				"fieldname": "buying_amount",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			},
+			"gross_profit": {
+				"label": _("Gross Profit"),
+				"fieldname": "gross_profit",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			},
+			"gross_profit_percent": {
+				"label": _("Gross Profit Percent"),
+				"fieldname": "gross_profit_%",
+				"fieldtype": "Percent",
+				"width": 100,
+			},
+			"project": {
+				"label": _("Project"),
+				"fieldname": "project",
+				"fieldtype": "Link",
+				"options": "Project",
+				"width": 100,
+			},
+			"sales_person": {
+				"label": _("Sales Person"),
+				"fieldname": "sales_person",
+				"fieldtype": "Data",
+				"width": 100,
+			},
+			"allocated_amount": {
+				"label": _("Allocated Amount"),
+				"fieldname": "allocated_amount",
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			},
+			"customer": {
+				"label": _("Customer"),
+				"fieldname": "customer",
+				"fieldtype": "Link",
+				"options": "Customer",
+				"width": 100,
+			},
+			"customer_group": {
+				"label": _("Customer Group"),
+				"fieldname": "customer_group",
+				"fieldtype": "Link",
+				"options": "customer",
+				"width": 100,
+			},
+			"territory": {
+				"label": _("Territory"),
+				"fieldname": "territory",
+				"fieldtype": "Link",
+				"options": "territory",
+				"width": 100,
+			},
+		}
+	)
 
 	for col in group_wise_columns.get(scrub(filters.group_by)):
 		columns.append(column_map.get(col))
 
-	columns.append({
-		"fieldname": "currency",
-		"label" : _("Currency"),
-		"fieldtype": "Link",
-		"options": "Currency",
-		"hidden": 1
-	})
+	columns.append(
+		{
+			"fieldname": "currency",
+			"label": _("Currency"),
+			"fieldtype": "Link",
+			"options": "Currency",
+			"hidden": 1,
+		}
+	)
 
 	return columns
 
+
 def get_column_names():
-	return frappe._dict({
-		'invoice_or_item': 'sales_invoice',
-		'customer': 'customer',
-		'customer_group': 'customer_group',
-		'posting_date': 'posting_date',
-		'item_code': 'item_code',
-		'item_name': 'item_name',
-		'item_group': 'item_group',
-		'brand': 'brand',
-		'description': 'description',
-		'warehouse': 'warehouse',
-		'qty': 'qty',
-		'base_rate': 'avg._selling_rate',
-		'buying_rate': 'valuation_rate',
-		'base_amount': 'selling_amount',
-		'buying_amount': 'buying_amount',
-		'gross_profit': 'gross_profit',
-		'gross_profit_percent': 'gross_profit_%',
-		'project': 'project'
-	})
+	return frappe._dict(
+		{
+			"invoice_or_item": "sales_invoice",
+			"customer": "customer",
+			"customer_group": "customer_group",
+			"posting_date": "posting_date",
+			"item_code": "item_code",
+			"item_name": "item_name",
+			"item_group": "item_group",
+			"brand": "brand",
+			"description": "description",
+			"warehouse": "warehouse",
+			"qty": "qty",
+			"base_rate": "avg._selling_rate",
+			"buying_rate": "valuation_rate",
+			"base_amount": "selling_amount",
+			"buying_amount": "buying_amount",
+			"gross_profit": "gross_profit",
+			"gross_profit_percent": "gross_profit_%",
+			"project": "project",
+		}
+	)
+
 
 class GrossProfitGenerator(object):
 	def __init__(self, filters=None):
@@ -150,7 +368,7 @@
 		self.filters = frappe._dict(filters)
 		self.load_invoice_items()
 
-		if filters.group_by == 'Invoice':
+		if filters.group_by == "Invoice":
 			self.group_items_by_invoice()
 
 		self.load_stock_ledger_entries()
@@ -181,17 +399,19 @@
 			if row.update_stock:
 				product_bundles = self.product_bundles.get(row.parenttype, {}).get(row.parent, frappe._dict())
 			elif row.dn_detail:
-				product_bundles = self.product_bundles.get("Delivery Note", {})\
-					.get(row.delivery_note, frappe._dict())
+				product_bundles = self.product_bundles.get("Delivery Note", {}).get(
+					row.delivery_note, frappe._dict()
+				)
 				row.item_row = row.dn_detail
 
 			# get buying amount
 			if row.item_code in product_bundles:
-				row.buying_amount = flt(self.get_buying_amount_from_product_bundle(row,
-					product_bundles[row.item_code]), self.currency_precision)
+				row.buying_amount = flt(
+					self.get_buying_amount_from_product_bundle(row, product_bundles[row.item_code]),
+					self.currency_precision,
+				)
 			else:
-				row.buying_amount = flt(self.get_buying_amount(row, row.item_code),
-					self.currency_precision)
+				row.buying_amount = flt(self.get_buying_amount(row, row.item_code), self.currency_precision)
 
 			if grouped_by_invoice:
 				if row.indent == 1.0:
@@ -211,7 +431,9 @@
 			# calculate gross profit
 			row.gross_profit = flt(row.base_amount - row.buying_amount, self.currency_precision)
 			if row.base_amount:
-				row.gross_profit_percent = flt((row.gross_profit / row.base_amount) * 100.0, self.currency_precision)
+				row.gross_profit_percent = flt(
+					(row.gross_profit / row.base_amount) * 100.0, self.currency_precision
+				)
 			else:
 				row.gross_profit_percent = 0.0
 
@@ -225,7 +447,7 @@
 		for key in list(self.grouped):
 			if self.filters.get("group_by") != "Invoice":
 				for i, row in enumerate(self.grouped[key]):
-					if i==0:
+					if i == 0:
 						new_row = row
 					else:
 						new_row.qty += flt(row.qty)
@@ -236,33 +458,44 @@
 			else:
 				for i, row in enumerate(self.grouped[key]):
 					if row.indent == 1.0:
-						if row.parent in self.returned_invoices \
-								and row.item_code in self.returned_invoices[row.parent]:
+						if (
+							row.parent in self.returned_invoices and row.item_code in self.returned_invoices[row.parent]
+						):
 							returned_item_rows = self.returned_invoices[row.parent][row.item_code]
 							for returned_item_row in returned_item_rows:
 								row.qty += flt(returned_item_row.qty)
 								row.base_amount += flt(returned_item_row.base_amount, self.currency_precision)
 							row.buying_amount = flt(flt(row.qty) * flt(row.buying_rate), self.currency_precision)
-						if (flt(row.qty) or row.base_amount):
+						if flt(row.qty) or row.base_amount:
 							row = self.set_average_rate(row)
 							self.grouped_data.append(row)
 
 	def is_not_invoice_row(self, row):
-		return (self.filters.get("group_by") == "Invoice" and row.indent != 0.0) or self.filters.get("group_by") != "Invoice"
+		return (self.filters.get("group_by") == "Invoice" and row.indent != 0.0) or self.filters.get(
+			"group_by"
+		) != "Invoice"
 
 	def set_average_rate(self, new_row):
 		self.set_average_gross_profit(new_row)
-		new_row.buying_rate = flt(new_row.buying_amount / new_row.qty, self.float_precision) if new_row.qty else 0
-		new_row.base_rate = flt(new_row.base_amount / new_row.qty, self.float_precision) if new_row.qty else 0
+		new_row.buying_rate = (
+			flt(new_row.buying_amount / new_row.qty, self.float_precision) if new_row.qty else 0
+		)
+		new_row.base_rate = (
+			flt(new_row.base_amount / new_row.qty, self.float_precision) if new_row.qty else 0
+		)
 		return new_row
 
 	def set_average_gross_profit(self, new_row):
 		new_row.gross_profit = flt(new_row.base_amount - new_row.buying_amount, self.currency_precision)
-		new_row.gross_profit_percent = flt(((new_row.gross_profit / new_row.base_amount) * 100.0), self.currency_precision) \
-			if new_row.base_amount else 0
+		new_row.gross_profit_percent = (
+			flt(((new_row.gross_profit / new_row.base_amount) * 100.0), self.currency_precision)
+			if new_row.base_amount
+			else 0
+		)
 
 	def get_returned_invoice_items(self):
-		returned_invoices = frappe.db.sql("""
+		returned_invoices = frappe.db.sql(
+			"""
 			select
 				si.name, si_item.item_code, si_item.stock_qty as qty, si_item.base_net_amount as base_amount, si.return_against
 			from
@@ -271,12 +504,15 @@
 				si.name = si_item.parent
 				and si.docstatus = 1
 				and si.is_return = 1
-		""", as_dict=1)
+		""",
+			as_dict=1,
+		)
 
 		self.returned_invoices = frappe._dict()
 		for inv in returned_invoices:
-			self.returned_invoices.setdefault(inv.return_against, frappe._dict())\
-				.setdefault(inv.item_code, []).append(inv)
+			self.returned_invoices.setdefault(inv.return_against, frappe._dict()).setdefault(
+				inv.item_code, []
+			).append(inv)
 
 	def skip_row(self, row):
 		if self.filters.get("group_by") != "Invoice":
@@ -288,7 +524,7 @@
 	def get_buying_amount_from_product_bundle(self, row, product_bundle):
 		buying_amount = 0.0
 		for packed_item in product_bundle:
-			if packed_item.get("parent_detail_docname")==row.item_row:
+			if packed_item.get("parent_detail_docname") == row.item_row:
 				buying_amount += self.get_buying_amount(row, packed_item.item_code)
 
 		return flt(buying_amount, self.currency_precision)
@@ -298,7 +534,7 @@
 		# stock_ledger_entries should already be filtered by item_code and warehouse and
 		# sorted by posting_date desc, posting_time desc
 		if item_code in self.non_stock_items and (row.project or row.cost_center):
-			#Issue 6089-Get last purchasing rate for non-stock item
+			# Issue 6089-Get last purchasing rate for non-stock item
 			item_rate = self.get_last_purchase_rate(item_code, row)
 			return flt(row.qty) * item_rate
 
@@ -311,15 +547,17 @@
 
 				for i, sle in enumerate(my_sle):
 					# find the stock valution rate from stock ledger entry
-					if sle.voucher_type == parenttype and parent == sle.voucher_no and \
-						sle.voucher_detail_no == row.item_row:
-							previous_stock_value = len(my_sle) > i+1 and \
-								flt(my_sle[i+1].stock_value) or 0.0
+					if (
+						sle.voucher_type == parenttype
+						and parent == sle.voucher_no
+						and sle.voucher_detail_no == row.item_row
+					):
+						previous_stock_value = len(my_sle) > i + 1 and flt(my_sle[i + 1].stock_value) or 0.0
 
-							if previous_stock_value:
-								return (previous_stock_value - flt(sle.stock_value)) * flt(row.qty) / abs(flt(sle.qty))
-							else:
-								return flt(row.qty) * self.get_average_buying_rate(row, item_code)
+						if previous_stock_value:
+							return (previous_stock_value - flt(sle.stock_value)) * flt(row.qty) / abs(flt(sle.qty))
+						else:
+							return flt(row.qty) * self.get_average_buying_rate(row, item_code)
 			else:
 				return flt(row.qty) * self.get_average_buying_rate(row, item_code)
 
@@ -328,15 +566,17 @@
 	def get_average_buying_rate(self, row, item_code):
 		args = row
 		if not item_code in self.average_buying_rate:
-			args.update({
-				'voucher_type': row.parenttype,
-				'voucher_no': row.parent,
-				'allow_zero_valuation': True,
-				'company': self.filters.company
-			})
+			args.update(
+				{
+					"voucher_type": row.parenttype,
+					"voucher_no": row.parent,
+					"allow_zero_valuation": True,
+					"company": self.filters.company,
+				}
+			)
 
 			average_buying_rate = get_incoming_rate(args)
-			self.average_buying_rate[item_code] =  flt(average_buying_rate)
+			self.average_buying_rate[item_code] = flt(average_buying_rate)
 
 		return self.average_buying_rate[item_code]
 
@@ -344,30 +584,21 @@
 		purchase_invoice = frappe.qb.DocType("Purchase Invoice")
 		purchase_invoice_item = frappe.qb.DocType("Purchase Invoice Item")
 
-		query = (frappe.qb.from_(purchase_invoice_item)
-			.inner_join(
-				purchase_invoice
-			).on(
-				purchase_invoice.name == purchase_invoice_item.parent
-			).select(
-				purchase_invoice_item.base_rate / purchase_invoice_item.conversion_factor
-			).where(
-				purchase_invoice.docstatus == 1
-			).where(
-				purchase_invoice.posting_date <= self.filters.to_date
-			).where(
-				purchase_invoice_item.item_code == item_code
-			))
+		query = (
+			frappe.qb.from_(purchase_invoice_item)
+			.inner_join(purchase_invoice)
+			.on(purchase_invoice.name == purchase_invoice_item.parent)
+			.select(purchase_invoice_item.base_rate / purchase_invoice_item.conversion_factor)
+			.where(purchase_invoice.docstatus == 1)
+			.where(purchase_invoice.posting_date <= self.filters.to_date)
+			.where(purchase_invoice_item.item_code == item_code)
+		)
 
 		if row.project:
-			query.where(
-				purchase_invoice_item.project == row.project
-			)
+			query.where(purchase_invoice_item.project == row.project)
 
 		if row.cost_center:
-			query.where(
-				purchase_invoice_item.cost_center == row.cost_center
-			)
+			query.where(purchase_invoice_item.cost_center == row.cost_center)
 
 		query.orderby(purchase_invoice.posting_date, order=frappe.qb.desc)
 		query.limit(1)
@@ -384,7 +615,7 @@
 		if self.filters.to_date:
 			conditions += " and posting_date <= %(to_date)s"
 
-		if self.filters.group_by=="Sales Person":
+		if self.filters.group_by == "Sales Person":
 			sales_person_cols = ", sales.sales_person, sales.allocated_amount, sales.incentives"
 			sales_team_table = "left join `tabSales Team` sales on sales.parent = `tabSales Invoice`.name"
 		else:
@@ -397,7 +628,8 @@
 		if self.filters.get("item_code"):
 			conditions += " and `tabSales Invoice Item`.item_code = %(item_code)s"
 
-		self.si_list = frappe.db.sql("""
+		self.si_list = frappe.db.sql(
+			"""
 			select
 				`tabSales Invoice Item`.parenttype, `tabSales Invoice Item`.parent,
 				`tabSales Invoice`.posting_date, `tabSales Invoice`.posting_time,
@@ -419,13 +651,19 @@
 			where
 				`tabSales Invoice`.docstatus=1 and `tabSales Invoice`.is_opening!='Yes' {conditions} {match_cond}
 			order by
-				`tabSales Invoice`.posting_date desc, `tabSales Invoice`.posting_time desc"""
-			.format(conditions=conditions, sales_person_cols=sales_person_cols,
-				sales_team_table=sales_team_table, match_cond = get_match_cond('Sales Invoice')), self.filters, as_dict=1)
+				`tabSales Invoice`.posting_date desc, `tabSales Invoice`.posting_time desc""".format(
+				conditions=conditions,
+				sales_person_cols=sales_person_cols,
+				sales_team_table=sales_team_table,
+				match_cond=get_match_cond("Sales Invoice"),
+			),
+			self.filters,
+			as_dict=1,
+		)
 
 	def group_items_by_invoice(self):
 		"""
-			Turns list of Sales Invoice Items to a tree of Sales Invoices with their Items as children.
+		Turns list of Sales Invoice Items to a tree of Sales Invoices with their Items as children.
 		"""
 
 		parents = []
@@ -448,94 +686,96 @@
 					row.parent_invoice = row.parent
 					row.invoice_or_item = row.item_code
 
-					if frappe.db.exists('Product Bundle', row.item_code):
+					if frappe.db.exists("Product Bundle", row.item_code):
 						self.add_bundle_items(row, index)
 
 	def get_invoice_row(self, row):
-		return frappe._dict({
-			'parent_invoice': "",
-			'indent': 0.0,
-			'invoice_or_item': row.parent,
-			'parent': None,
-			'posting_date': row.posting_date,
-			'posting_time': row.posting_time,
-			'project': row.project,
-			'update_stock': row.update_stock,
-			'customer': row.customer,
-			'customer_group': row.customer_group,
-			'item_code': None,
-			'item_name': None,
-			'description': None,
-			'warehouse': None,
-			'item_group': None,
-			'brand': None,
-			'dn_detail': None,
-			'delivery_note': None,
-			'qty': None,
-			'item_row': None,
-			'is_return': row.is_return,
-			'cost_center': row.cost_center,
-			'base_net_amount': frappe.db.get_value('Sales Invoice', row.parent, 'base_net_total')
-		})
+		return frappe._dict(
+			{
+				"parent_invoice": "",
+				"indent": 0.0,
+				"invoice_or_item": row.parent,
+				"parent": None,
+				"posting_date": row.posting_date,
+				"posting_time": row.posting_time,
+				"project": row.project,
+				"update_stock": row.update_stock,
+				"customer": row.customer,
+				"customer_group": row.customer_group,
+				"item_code": None,
+				"item_name": None,
+				"description": None,
+				"warehouse": None,
+				"item_group": None,
+				"brand": None,
+				"dn_detail": None,
+				"delivery_note": None,
+				"qty": None,
+				"item_row": None,
+				"is_return": row.is_return,
+				"cost_center": row.cost_center,
+				"base_net_amount": frappe.db.get_value("Sales Invoice", row.parent, "base_net_total"),
+			}
+		)
 
 	def add_bundle_items(self, product_bundle, index):
 		bundle_items = self.get_bundle_items(product_bundle)
 
 		for i, item in enumerate(bundle_items):
 			bundle_item = self.get_bundle_item_row(product_bundle, item)
-			self.si_list.insert((index+i+1), bundle_item)
+			self.si_list.insert((index + i + 1), bundle_item)
 
 	def get_bundle_items(self, product_bundle):
 		return frappe.get_all(
-			'Product Bundle Item',
-			filters = {
-				'parent': product_bundle.item_code
-			},
-			fields = ['item_code', 'qty']
+			"Product Bundle Item", filters={"parent": product_bundle.item_code}, fields=["item_code", "qty"]
 		)
 
 	def get_bundle_item_row(self, product_bundle, item):
 		item_name, description, item_group, brand = self.get_bundle_item_details(item.item_code)
 
-		return frappe._dict({
-			'parent_invoice': product_bundle.item_code,
-			'indent': product_bundle.indent + 1,
-			'parent': None,
-			'invoice_or_item': item.item_code,
-			'posting_date': product_bundle.posting_date,
-			'posting_time': product_bundle.posting_time,
-			'project': product_bundle.project,
-			'customer': product_bundle.customer,
-			'customer_group': product_bundle.customer_group,
-			'item_code': item.item_code,
-			'item_name': item_name,
-			'description': description,
-			'warehouse': product_bundle.warehouse,
-			'item_group': item_group,
-			'brand': brand,
-			'dn_detail': product_bundle.dn_detail,
-			'delivery_note': product_bundle.delivery_note,
-			'qty': (flt(product_bundle.qty) * flt(item.qty)),
-			'item_row': None,
-			'is_return': product_bundle.is_return,
-			'cost_center': product_bundle.cost_center
-		})
+		return frappe._dict(
+			{
+				"parent_invoice": product_bundle.item_code,
+				"indent": product_bundle.indent + 1,
+				"parent": None,
+				"invoice_or_item": item.item_code,
+				"posting_date": product_bundle.posting_date,
+				"posting_time": product_bundle.posting_time,
+				"project": product_bundle.project,
+				"customer": product_bundle.customer,
+				"customer_group": product_bundle.customer_group,
+				"item_code": item.item_code,
+				"item_name": item_name,
+				"description": description,
+				"warehouse": product_bundle.warehouse,
+				"item_group": item_group,
+				"brand": brand,
+				"dn_detail": product_bundle.dn_detail,
+				"delivery_note": product_bundle.delivery_note,
+				"qty": (flt(product_bundle.qty) * flt(item.qty)),
+				"item_row": None,
+				"is_return": product_bundle.is_return,
+				"cost_center": product_bundle.cost_center,
+			}
+		)
 
 	def get_bundle_item_details(self, item_code):
 		return frappe.db.get_value(
-			'Item',
-			item_code,
-			['item_name', 'description', 'item_group', 'brand']
+			"Item", item_code, ["item_name", "description", "item_group", "brand"]
 		)
 
 	def load_stock_ledger_entries(self):
-		res = frappe.db.sql("""select item_code, voucher_type, voucher_no,
+		res = frappe.db.sql(
+			"""select item_code, voucher_type, voucher_no,
 				voucher_detail_no, stock_value, warehouse, actual_qty as qty
 			from `tabStock Ledger Entry`
 			where company=%(company)s and is_cancelled = 0
 			order by
 				item_code desc, warehouse desc, posting_date desc,
-				posting_time desc, creation desc""", self.filters, as_dict=True)
+				posting_time desc, creation desc""",
+			self.filters,
+			as_dict=True,
+		)
 		self.sle = {}
 		for r in res:
 			if (r.item_code, r.warehouse) not in self.sle:
@@ -546,12 +786,18 @@
 	def load_product_bundle(self):
 		self.product_bundles = {}
 
-		for d in frappe.db.sql("""select parenttype, parent, parent_item,
+		for d in frappe.db.sql(
+			"""select parenttype, parent, parent_item,
 			item_code, warehouse, -1*qty as total_qty, parent_detail_docname
-			from `tabPacked Item` where docstatus=1""", as_dict=True):
-			self.product_bundles.setdefault(d.parenttype, frappe._dict()).setdefault(d.parent,
-				frappe._dict()).setdefault(d.parent_item, []).append(d)
+			from `tabPacked Item` where docstatus=1""",
+			as_dict=True,
+		):
+			self.product_bundles.setdefault(d.parenttype, frappe._dict()).setdefault(
+				d.parent, frappe._dict()
+			).setdefault(d.parent_item, []).append(d)
 
 	def load_non_stock_items(self):
-		self.non_stock_items = frappe.db.sql_list("""select name from tabItem
-			where is_stock_item=0""")
+		self.non_stock_items = frappe.db.sql_list(
+			"""select name from tabItem
+			where is_stock_item=0"""
+		)
diff --git a/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py
index 2f23c8e..8db72de 100644
--- a/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py
+++ b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py
@@ -12,6 +12,7 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns():
 	columns = [
 		{
@@ -19,53 +20,36 @@
 			"fieldtype": "Link",
 			"label": _("Territory"),
 			"options": "Territory",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"fieldname": "item_group",
 			"fieldtype": "Link",
 			"label": _("Item Group"),
 			"options": "Item Group",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"fieldname": "item",
-			"fieldtype": "Link",
-			"options": "Item",
-			"label": "Item",
-			"width": 150
-		},
-		{
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"label": _("Item Name"),
-			"width": 150
-		},
-
+		{"fieldname": "item", "fieldtype": "Link", "options": "Item", "label": "Item", "width": 150},
+		{"fieldname": "item_name", "fieldtype": "Data", "label": _("Item Name"), "width": 150},
 		{
 			"fieldname": "customer",
 			"fieldtype": "Link",
 			"label": _("Customer"),
 			"options": "Customer",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"fieldname": "last_order_date",
 			"fieldtype": "Date",
 			"label": _("Last Order Date"),
-			"width": 100
+			"width": 100,
 		},
-		{
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"label": _("Quantity"),
-			"width": 100
-		},
+		{"fieldname": "qty", "fieldtype": "Float", "label": _("Quantity"), "width": 100},
 		{
 			"fieldname": "days_since_last_order",
 			"fieldtype": "Int",
 			"label": _("Days Since Last Order"),
-			"width": 100
+			"width": 100,
 		},
 	]
 
@@ -84,19 +68,21 @@
 				"territory": territory.name,
 				"item_group": item.item_group,
 				"item": item.item_code,
-				"item_name": item.item_name
+				"item_name": item.item_name,
 			}
 
-			if sales_invoice_data.get((territory.name,item.item_code)):
-				item_obj = sales_invoice_data[(territory.name,item.item_code)]
-				if item_obj.days_since_last_order > cint(filters['days']):
-					row.update({
-						"territory": item_obj.territory,
-						"customer": item_obj.customer,
-						"last_order_date": item_obj.last_order_date,
-						"qty": item_obj.qty,
-						"days_since_last_order": item_obj.days_since_last_order
-					})
+			if sales_invoice_data.get((territory.name, item.item_code)):
+				item_obj = sales_invoice_data[(territory.name, item.item_code)]
+				if item_obj.days_since_last_order > cint(filters["days"]):
+					row.update(
+						{
+							"territory": item_obj.territory,
+							"customer": item_obj.customer,
+							"last_order_date": item_obj.last_order_date,
+							"qty": item_obj.qty,
+							"days_since_last_order": item_obj.days_since_last_order,
+						}
+					)
 				else:
 					continue
 
@@ -111,45 +97,49 @@
 
 	date_field = "s.transaction_date" if filters["based_on"] == "Sales Order" else "s.posting_date"
 
-	sales_data = frappe.db.sql("""
+	sales_data = frappe.db.sql(
+		"""
 		select s.territory, s.customer, si.item_group, si.item_code, si.qty, {date_field} as last_order_date,
 		DATEDIFF(CURDATE(), {date_field}) as days_since_last_order
 		from `tab{doctype}` s, `tab{doctype} Item` si
 		where s.name = si.parent and s.docstatus = 1
-		order by days_since_last_order """ #nosec
-		.format(date_field = date_field, doctype = filters['based_on']), as_dict=1)
+		order by days_since_last_order """.format(  # nosec
+			date_field=date_field, doctype=filters["based_on"]
+		),
+		as_dict=1,
+	)
 
 	for d in sales_data:
-		item_details_map.setdefault((d.territory,d.item_code), d)
+		item_details_map.setdefault((d.territory, d.item_code), d)
 
 	return item_details_map
 
+
 def get_territories(filters):
 
 	filter_dict = {}
 	if filters.get("territory"):
-		filter_dict.update({'name': filters['territory']})
+		filter_dict.update({"name": filters["territory"]})
 
 	territories = frappe.get_all("Territory", fields=["name"], filters=filter_dict)
 
 	return territories
 
+
 def get_items(filters):
-	filters_dict = {
-		"disabled": 0,
-		"is_stock_item": 1
-	}
+	filters_dict = {"disabled": 0, "is_stock_item": 1}
 
 	if filters.get("item_group"):
-		filters_dict.update({
-			"item_group": filters["item_group"]
-		})
+		filters_dict.update({"item_group": filters["item_group"]})
 
 	if filters.get("item"):
-		filters_dict.update({
-			"name": filters["item"]
-		})
+		filters_dict.update({"name": filters["item"]})
 
-	items = frappe.get_all("Item", fields=["name", "item_group", "item_name", "item_code"], filters=filters_dict, order_by="name")
+	items = frappe.get_all(
+		"Item",
+		fields=["name", "item_group", "item_name", "item_code"],
+		filters=filters_dict,
+		order_by="name",
+	)
 
 	return items
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index aaed58d..c04b9c7 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -21,8 +21,10 @@
 def execute(filters=None):
 	return _execute(filters)
 
+
 def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 	columns = get_columns(additional_table_columns, filters)
 
 	company_currency = erpnext.get_company_currency(filters.company)
@@ -30,18 +32,23 @@
 	item_list = get_items(filters, additional_query_columns)
 	aii_account_map = get_aii_accounts()
 	if item_list:
-		itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency,
-			doctype='Purchase Invoice', tax_doctype='Purchase Taxes and Charges')
+		itemised_tax, tax_columns = get_tax_accounts(
+			item_list,
+			columns,
+			company_currency,
+			doctype="Purchase Invoice",
+			tax_doctype="Purchase Taxes and Charges",
+		)
 
 	po_pr_map = get_purchase_receipts_against_purchase_order(item_list)
 
 	data = []
 	total_row_map = {}
 	skip_total_row = 0
-	prev_group_by_value = ''
+	prev_group_by_value = ""
 
-	if filters.get('group_by'):
-		grand_total = get_grand_total(filters, 'Purchase Invoice')
+	if filters.get("group_by"):
+		grand_total = get_grand_total(filters, "Purchase Invoice")
 
 	item_details = get_item_details()
 
@@ -57,71 +64,81 @@
 		elif d.po_detail:
 			purchase_receipt = ", ".join(po_pr_map.get(d.po_detail, []))
 
-		expense_account = d.unrealized_profit_loss_account or d.expense_account \
-			or aii_account_map.get(d.company)
+		expense_account = (
+			d.unrealized_profit_loss_account or d.expense_account or aii_account_map.get(d.company)
+		)
 
 		row = {
-			'item_code': d.item_code,
-			'item_name': item_record.item_name if item_record else d.item_name,
-			'item_group': item_record.item_group if item_record else d.item_group,
-			'description': d.description,
-			'invoice': d.parent,
-			'posting_date': d.posting_date,
-			'supplier': d.supplier,
-			'supplier_name': d.supplier_name
+			"item_code": d.item_code,
+			"item_name": item_record.item_name if item_record else d.item_name,
+			"item_group": item_record.item_group if item_record else d.item_group,
+			"description": d.description,
+			"invoice": d.parent,
+			"posting_date": d.posting_date,
+			"supplier": d.supplier,
+			"supplier_name": d.supplier_name,
 		}
 
 		if additional_query_columns:
 			for col in additional_query_columns:
-				row.update({
-					col: d.get(col)
-				})
+				row.update({col: d.get(col)})
 
-		row.update({
-			'credit_to': d.credit_to,
-			'mode_of_payment': d.mode_of_payment,
-			'project': d.project,
-			'company': d.company,
-			'purchase_order': d.purchase_order,
-			'purchase_receipt': d.purchase_receipt,
-			'expense_account': expense_account,
-			'stock_qty': d.stock_qty,
-			'stock_uom': d.stock_uom,
-			'rate': d.base_net_amount / d.stock_qty,
-			'amount': d.base_net_amount
-		})
+		row.update(
+			{
+				"credit_to": d.credit_to,
+				"mode_of_payment": d.mode_of_payment,
+				"project": d.project,
+				"company": d.company,
+				"purchase_order": d.purchase_order,
+				"purchase_receipt": d.purchase_receipt,
+				"expense_account": expense_account,
+				"stock_qty": d.stock_qty,
+				"stock_uom": d.stock_uom,
+				"rate": d.base_net_amount / d.stock_qty,
+				"amount": d.base_net_amount,
+			}
+		)
 
 		total_tax = 0
 		for tax in tax_columns:
 			item_tax = itemised_tax.get(d.name, {}).get(tax, {})
-			row.update({
-				frappe.scrub(tax + ' Rate'): item_tax.get('tax_rate', 0),
-				frappe.scrub(tax + ' Amount'): item_tax.get('tax_amount', 0),
-			})
-			total_tax += flt(item_tax.get('tax_amount'))
+			row.update(
+				{
+					frappe.scrub(tax + " Rate"): item_tax.get("tax_rate", 0),
+					frappe.scrub(tax + " Amount"): item_tax.get("tax_amount", 0),
+				}
+			)
+			total_tax += flt(item_tax.get("tax_amount"))
 
-		row.update({
-			'total_tax': total_tax,
-			'total': d.base_net_amount + total_tax,
-			'currency': company_currency
-		})
+		row.update(
+			{"total_tax": total_tax, "total": d.base_net_amount + total_tax, "currency": company_currency}
+		)
 
-		if filters.get('group_by'):
-			row.update({'percent_gt': flt(row['total']/grand_total) * 100})
+		if filters.get("group_by"):
+			row.update({"percent_gt": flt(row["total"] / grand_total) * 100})
 			group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters)
-			data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map,
-				group_by_field, subtotal_display_field, grand_total, tax_columns)
-			add_sub_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns)
+			data, prev_group_by_value = add_total_row(
+				data,
+				filters,
+				prev_group_by_value,
+				d,
+				total_row_map,
+				group_by_field,
+				subtotal_display_field,
+				grand_total,
+				tax_columns,
+			)
+			add_sub_total_row(row, total_row_map, d.get(group_by_field, ""), tax_columns)
 
 		data.append(row)
 
-	if filters.get('group_by') and item_list:
-		total_row = total_row_map.get(prev_group_by_value or d.get('item_name'))
-		total_row['percent_gt'] = flt(total_row['total']/grand_total * 100)
+	if filters.get("group_by") and item_list:
+		total_row = total_row_map.get(prev_group_by_value or d.get("item_name"))
+		total_row["percent_gt"] = flt(total_row["total"] / grand_total * 100)
 		data.append(total_row)
 		data.append({})
-		add_sub_total_row(total_row, total_row_map, 'total_row', tax_columns)
-		data.append(total_row_map.get('total_row'))
+		add_sub_total_row(total_row, total_row_map, "total_row", tax_columns)
+		data.append(total_row_map.get("total_row"))
 		skip_total_row = 1
 
 	return columns, data, None, None, None, skip_total_row
@@ -131,195 +148,180 @@
 
 	columns = []
 
-	if filters.get('group_by') != ('Item'):
+	if filters.get("group_by") != ("Item"):
 		columns.extend(
 			[
 				{
-					'label': _('Item Code'),
-					'fieldname': 'item_code',
-					'fieldtype': 'Link',
-					'options': 'Item',
-					'width': 120
+					"label": _("Item Code"),
+					"fieldname": "item_code",
+					"fieldtype": "Link",
+					"options": "Item",
+					"width": 120,
 				},
+				{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 120},
+			]
+		)
+
+	if filters.get("group_by") not in ("Item", "Item Group"):
+		columns.extend(
+			[
 				{
-					'label': _('Item Name'),
-					'fieldname': 'item_name',
-					'fieldtype': 'Data',
-					'width': 120
+					"label": _("Item Group"),
+					"fieldname": "item_group",
+					"fieldtype": "Link",
+					"options": "Item Group",
+					"width": 120,
 				}
 			]
 		)
 
-	if filters.get('group_by') not in ('Item', 'Item Group'):
-		columns.extend([
+	columns.extend(
+		[
+			{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 150},
 			{
-				'label': _('Item Group'),
-				'fieldname': 'item_group',
-				'fieldtype': 'Link',
-				'options': 'Item Group',
-				'width': 120
-			}
-		])
-
-	columns.extend([
-		{
-			'label': _('Description'),
-			'fieldname': 'description',
-			'fieldtype': 'Data',
-			'width': 150
-		},
-		{
-			'label': _('Invoice'),
-			'fieldname': 'invoice',
-			'fieldtype': 'Link',
-			'options': 'Purchase Invoice',
-			'width': 120
-		},
-		{
-			'label': _('Posting Date'),
-			'fieldname': 'posting_date',
-			'fieldtype': 'Date',
-			'width': 120
-		}
-	])
-
-	if filters.get('group_by') != 'Supplier':
-		columns.extend([
-			{
-				'label': _('Supplier'),
-				'fieldname': 'supplier',
-				'fieldtype': 'Link',
-				'options': 'Supplier',
-				'width': 120
+				"label": _("Invoice"),
+				"fieldname": "invoice",
+				"fieldtype": "Link",
+				"options": "Purchase Invoice",
+				"width": 120,
 			},
-			{
-				'label': _('Supplier Name'),
-				'fieldname': 'supplier_name',
-				'fieldtype': 'Data',
-				'width': 120
-			}
-		])
+			{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 120},
+		]
+	)
+
+	if filters.get("group_by") != "Supplier":
+		columns.extend(
+			[
+				{
+					"label": _("Supplier"),
+					"fieldname": "supplier",
+					"fieldtype": "Link",
+					"options": "Supplier",
+					"width": 120,
+				},
+				{"label": _("Supplier Name"), "fieldname": "supplier_name", "fieldtype": "Data", "width": 120},
+			]
+		)
 
 	if additional_table_columns:
 		columns += additional_table_columns
 
 	columns += [
 		{
-			'label': _('Payable Account'),
-			'fieldname': 'credit_to',
-			'fieldtype': 'Link',
-			'options': 'Account',
-			'width': 80
+			"label": _("Payable Account"),
+			"fieldname": "credit_to",
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 80,
 		},
 		{
-			'label': _('Mode Of Payment'),
-			'fieldname': 'mode_of_payment',
-			'fieldtype': 'Link',
-			'options': 'Mode of Payment',
-			'width': 120
+			"label": _("Mode Of Payment"),
+			"fieldname": "mode_of_payment",
+			"fieldtype": "Link",
+			"options": "Mode of Payment",
+			"width": 120,
 		},
 		{
-			'label': _('Project'),
-			'fieldname': 'project',
-			'fieldtype': 'Link',
-			'options': 'Project',
-			'width': 80
+			"label": _("Project"),
+			"fieldname": "project",
+			"fieldtype": "Link",
+			"options": "Project",
+			"width": 80,
 		},
 		{
-			'label': _('Company'),
-			'fieldname': 'company',
-			'fieldtype': 'Link',
-			'options': 'Company',
-			'width': 80
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 80,
 		},
 		{
-			'label': _('Purchase Order'),
-			'fieldname': 'purchase_order',
-			'fieldtype': 'Link',
-			'options': 'Purchase Order',
-			'width': 100
+			"label": _("Purchase Order"),
+			"fieldname": "purchase_order",
+			"fieldtype": "Link",
+			"options": "Purchase Order",
+			"width": 100,
 		},
 		{
-			'label': _("Purchase Receipt"),
-			'fieldname': 'Purchase Receipt',
-			'fieldtype': 'Link',
-			'options': 'Purchase Receipt',
-			'width': 100
+			"label": _("Purchase Receipt"),
+			"fieldname": "Purchase Receipt",
+			"fieldtype": "Link",
+			"options": "Purchase Receipt",
+			"width": 100,
 		},
 		{
-			'label': _('Expense Account'),
-			'fieldname': 'expense_account',
-			'fieldtype': 'Link',
-			'options': 'Account',
-			'width': 100
+			"label": _("Expense Account"),
+			"fieldname": "expense_account",
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 100,
+		},
+		{"label": _("Stock Qty"), "fieldname": "stock_qty", "fieldtype": "Float", "width": 100},
+		{
+			"label": _("Stock UOM"),
+			"fieldname": "stock_uom",
+			"fieldtype": "Link",
+			"options": "UOM",
+			"width": 100,
 		},
 		{
-			'label': _('Stock Qty'),
-			'fieldname': 'stock_qty',
-			'fieldtype': 'Float',
-			'width': 100
+			"label": _("Rate"),
+			"fieldname": "rate",
+			"fieldtype": "Float",
+			"options": "currency",
+			"width": 100,
 		},
 		{
-			'label': _('Stock UOM'),
-			'fieldname': 'stock_uom',
-			'fieldtype': 'Link',
-			'options': 'UOM',
-			'width': 100
+			"label": _("Amount"),
+			"fieldname": "amount",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
 		},
-		{
-			'label': _('Rate'),
-			'fieldname': 'rate',
-			'fieldtype': 'Float',
-			'options': 'currency',
-			'width': 100
-		},
-		{
-			'label': _('Amount'),
-			'fieldname': 'amount',
-			'fieldtype': 'Currency',
-			'options': 'currency',
-			'width': 100
-		}
 	]
 
-	if filters.get('group_by'):
-		columns.append({
-			'label': _('% Of Grand Total'),
-			'fieldname': 'percent_gt',
-			'fieldtype': 'Float',
-			'width': 80
-		})
+	if filters.get("group_by"):
+		columns.append(
+			{"label": _("% Of Grand Total"), "fieldname": "percent_gt", "fieldtype": "Float", "width": 80}
+		)
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 
-	for opts in (("company", " and company=%(company)s"),
+	for opts in (
+		("company", " and company=%(company)s"),
 		("supplier", " and `tabPurchase Invoice`.supplier = %(supplier)s"),
 		("item_code", " and `tabPurchase Invoice Item`.item_code = %(item_code)s"),
 		("from_date", " and `tabPurchase Invoice`.posting_date>=%(from_date)s"),
 		("to_date", " and `tabPurchase Invoice`.posting_date<=%(to_date)s"),
-		("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s")):
-			if filters.get(opts[0]):
-				conditions += opts[1]
+		("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s"),
+	):
+		if filters.get(opts[0]):
+			conditions += opts[1]
 
 	if not filters.get("group_by"):
-		conditions += "ORDER BY `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc"
+		conditions += (
+			"ORDER BY `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc"
+		)
 	else:
-		conditions += get_group_by_conditions(filters, 'Purchase Invoice')
+		conditions += get_group_by_conditions(filters, "Purchase Invoice")
 
 	return conditions
 
+
 def get_items(filters, additional_query_columns):
 	conditions = get_conditions(filters)
 
 	if additional_query_columns:
-		additional_query_columns = ', ' + ', '.join(additional_query_columns)
+		additional_query_columns = ", " + ", ".join(additional_query_columns)
 	else:
-		additional_query_columns = ''
+		additional_query_columns = ""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			`tabPurchase Invoice Item`.`name`, `tabPurchase Invoice Item`.`parent`,
 			`tabPurchase Invoice`.posting_date, `tabPurchase Invoice`.credit_to, `tabPurchase Invoice`.company,
@@ -335,22 +337,35 @@
 		from `tabPurchase Invoice`, `tabPurchase Invoice Item`
 		where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and
 		`tabPurchase Invoice`.docstatus = 1 %s
-	""".format(additional_query_columns) % (conditions), filters, as_dict=1)
+	""".format(
+			additional_query_columns
+		)
+		% (conditions),
+		filters,
+		as_dict=1,
+	)
+
 
 def get_aii_accounts():
 	return dict(frappe.db.sql("select name, stock_received_but_not_billed from tabCompany"))
 
+
 def get_purchase_receipts_against_purchase_order(item_list):
 	po_pr_map = frappe._dict()
 	po_item_rows = list(set(d.po_detail for d in item_list))
 
 	if po_item_rows:
-		purchase_receipts = frappe.db.sql("""
+		purchase_receipts = frappe.db.sql(
+			"""
 			select parent, purchase_order_item
 			from `tabPurchase Receipt Item`
 			where docstatus=1 and purchase_order_item in (%s)
 			group by purchase_order_item, parent
-		""" % (', '.join(['%s']*len(po_item_rows))), tuple(po_item_rows), as_dict=1)
+		"""
+			% (", ".join(["%s"] * len(po_item_rows))),
+			tuple(po_item_rows),
+			as_dict=1,
+		)
 
 		for pr in purchase_receipts:
 			po_pr_map.setdefault(pr.po_detail, []).append(pr.parent)
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index 9b35538..2e7213f 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -18,11 +18,13 @@
 def execute(filters=None):
 	return _execute(filters)
 
+
 def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 	columns = get_columns(additional_table_columns, filters)
 
-	company_currency = frappe.get_cached_value('Company',  filters.get('company'),  'default_currency')
+	company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
 
 	item_list = get_items(filters, additional_query_columns)
 	if item_list:
@@ -34,10 +36,10 @@
 	data = []
 	total_row_map = {}
 	skip_total_row = 0
-	prev_group_by_value = ''
+	prev_group_by_value = ""
 
-	if filters.get('group_by'):
-		grand_total = get_grand_total(filters, 'Sales Invoice')
+	if filters.get("group_by"):
+		grand_total = get_grand_total(filters, "Sales Invoice")
 
 	customer_details = get_customer_details()
 	item_details = get_item_details()
@@ -56,289 +58,279 @@
 			delivery_note = d.parent
 
 		row = {
-			'item_code': d.item_code,
-			'item_name': item_record.item_name if item_record else d.item_name,
-			'item_group': item_record.item_group if item_record else d.item_group,
-			'description': d.description,
-			'invoice': d.parent,
-			'posting_date': d.posting_date,
-			'customer': d.customer,
-			'customer_name': customer_record.customer_name,
-			'customer_group': customer_record.customer_group,
+			"item_code": d.item_code,
+			"item_name": item_record.item_name if item_record else d.item_name,
+			"item_group": item_record.item_group if item_record else d.item_group,
+			"description": d.description,
+			"invoice": d.parent,
+			"posting_date": d.posting_date,
+			"customer": d.customer,
+			"customer_name": customer_record.customer_name,
+			"customer_group": customer_record.customer_group,
 		}
 
 		if additional_query_columns:
 			for col in additional_query_columns:
-				row.update({
-					col: d.get(col)
-				})
+				row.update({col: d.get(col)})
 
-		row.update({
-			'debit_to': d.debit_to,
-			'mode_of_payment': ", ".join(mode_of_payments.get(d.parent, [])),
-			'territory': d.territory,
-			'project': d.project,
-			'company': d.company,
-			'sales_order': d.sales_order,
-			'delivery_note': d.delivery_note,
-			'income_account': d.unrealized_profit_loss_account if d.is_internal_customer == 1 else d.income_account,
-			'cost_center': d.cost_center,
-			'stock_qty': d.stock_qty,
-			'stock_uom': d.stock_uom
-		})
+		row.update(
+			{
+				"debit_to": d.debit_to,
+				"mode_of_payment": ", ".join(mode_of_payments.get(d.parent, [])),
+				"territory": d.territory,
+				"project": d.project,
+				"company": d.company,
+				"sales_order": d.sales_order,
+				"delivery_note": d.delivery_note,
+				"income_account": d.unrealized_profit_loss_account
+				if d.is_internal_customer == 1
+				else d.income_account,
+				"cost_center": d.cost_center,
+				"stock_qty": d.stock_qty,
+				"stock_uom": d.stock_uom,
+			}
+		)
 
 		if d.stock_uom != d.uom and d.stock_qty:
-			row.update({
-				'rate': (d.base_net_rate * d.qty)/d.stock_qty,
-				'amount': d.base_net_amount
-			})
+			row.update({"rate": (d.base_net_rate * d.qty) / d.stock_qty, "amount": d.base_net_amount})
 		else:
-			row.update({
-				'rate': d.base_net_rate,
-				'amount': d.base_net_amount
-			})
+			row.update({"rate": d.base_net_rate, "amount": d.base_net_amount})
 
 		total_tax = 0
 		for tax in tax_columns:
 			item_tax = itemised_tax.get(d.name, {}).get(tax, {})
-			row.update({
-				frappe.scrub(tax + ' Rate'): item_tax.get('tax_rate', 0),
-				frappe.scrub(tax + ' Amount'): item_tax.get('tax_amount', 0),
-			})
-			total_tax += flt(item_tax.get('tax_amount'))
+			row.update(
+				{
+					frappe.scrub(tax + " Rate"): item_tax.get("tax_rate", 0),
+					frappe.scrub(tax + " Amount"): item_tax.get("tax_amount", 0),
+				}
+			)
+			total_tax += flt(item_tax.get("tax_amount"))
 
-		row.update({
-			'total_tax': total_tax,
-			'total': d.base_net_amount + total_tax,
-			'currency': company_currency
-		})
+		row.update(
+			{"total_tax": total_tax, "total": d.base_net_amount + total_tax, "currency": company_currency}
+		)
 
-		if filters.get('group_by'):
-			row.update({'percent_gt': flt(row['total']/grand_total) * 100})
+		if filters.get("group_by"):
+			row.update({"percent_gt": flt(row["total"] / grand_total) * 100})
 			group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters)
-			data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map,
-				group_by_field, subtotal_display_field, grand_total, tax_columns)
-			add_sub_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns)
+			data, prev_group_by_value = add_total_row(
+				data,
+				filters,
+				prev_group_by_value,
+				d,
+				total_row_map,
+				group_by_field,
+				subtotal_display_field,
+				grand_total,
+				tax_columns,
+			)
+			add_sub_total_row(row, total_row_map, d.get(group_by_field, ""), tax_columns)
 
 		data.append(row)
 
-	if filters.get('group_by') and item_list:
-		total_row = total_row_map.get(prev_group_by_value or d.get('item_name'))
-		total_row['percent_gt'] = flt(total_row['total']/grand_total * 100)
+	if filters.get("group_by") and item_list:
+		total_row = total_row_map.get(prev_group_by_value or d.get("item_name"))
+		total_row["percent_gt"] = flt(total_row["total"] / grand_total * 100)
 		data.append(total_row)
 		data.append({})
-		add_sub_total_row(total_row, total_row_map, 'total_row', tax_columns)
-		data.append(total_row_map.get('total_row'))
+		add_sub_total_row(total_row, total_row_map, "total_row", tax_columns)
+		data.append(total_row_map.get("total_row"))
 		skip_total_row = 1
 
 	return columns, data, None, None, None, skip_total_row
 
+
 def get_columns(additional_table_columns, filters):
 	columns = []
 
-	if filters.get('group_by') != ('Item'):
+	if filters.get("group_by") != ("Item"):
 		columns.extend(
 			[
 				{
-					'label': _('Item Code'),
-					'fieldname': 'item_code',
-					'fieldtype': 'Link',
-					'options': 'Item',
-					'width': 120
+					"label": _("Item Code"),
+					"fieldname": "item_code",
+					"fieldtype": "Link",
+					"options": "Item",
+					"width": 120,
 				},
+				{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 120},
+			]
+		)
+
+	if filters.get("group_by") not in ("Item", "Item Group"):
+		columns.extend(
+			[
 				{
-					'label': _('Item Name'),
-					'fieldname': 'item_name',
-					'fieldtype': 'Data',
-					'width': 120
+					"label": _("Item Group"),
+					"fieldname": "item_group",
+					"fieldtype": "Link",
+					"options": "Item Group",
+					"width": 120,
 				}
 			]
 		)
 
-	if filters.get('group_by') not in ('Item', 'Item Group'):
-		columns.extend([
+	columns.extend(
+		[
+			{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 150},
 			{
-				'label': _('Item Group'),
-				'fieldname': 'item_group',
-				'fieldtype': 'Link',
-				'options': 'Item Group',
-				'width': 120
-			}
-		])
-
-	columns.extend([
-		{
-			'label': _('Description'),
-			'fieldname': 'description',
-			'fieldtype': 'Data',
-			'width': 150
-		},
-		{
-			'label': _('Invoice'),
-			'fieldname': 'invoice',
-			'fieldtype': 'Link',
-			'options': 'Sales Invoice',
-			'width': 120
-		},
-		{
-			'label': _('Posting Date'),
-			'fieldname': 'posting_date',
-			'fieldtype': 'Date',
-			'width': 120
-		}
-	])
-
-	if filters.get('group_by') != 'Customer':
-		columns.extend([
-			{
-				'label': _('Customer Group'),
-				'fieldname': 'customer_group',
-				'fieldtype': 'Link',
-				'options': 'Customer Group',
-				'width': 120
-			}
-		])
-
-	if filters.get('group_by') not in ('Customer', 'Customer Group'):
-		columns.extend([
-			{
-				'label': _('Customer'),
-				'fieldname': 'customer',
-				'fieldtype': 'Link',
-				'options': 'Customer',
-				'width': 120
+				"label": _("Invoice"),
+				"fieldname": "invoice",
+				"fieldtype": "Link",
+				"options": "Sales Invoice",
+				"width": 120,
 			},
-			{
-				'label': _('Customer Name'),
-				'fieldname': 'customer_name',
-				'fieldtype': 'Data',
-				'width': 120
-			}
-		])
+			{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 120},
+		]
+	)
+
+	if filters.get("group_by") != "Customer":
+		columns.extend(
+			[
+				{
+					"label": _("Customer Group"),
+					"fieldname": "customer_group",
+					"fieldtype": "Link",
+					"options": "Customer Group",
+					"width": 120,
+				}
+			]
+		)
+
+	if filters.get("group_by") not in ("Customer", "Customer Group"):
+		columns.extend(
+			[
+				{
+					"label": _("Customer"),
+					"fieldname": "customer",
+					"fieldtype": "Link",
+					"options": "Customer",
+					"width": 120,
+				},
+				{"label": _("Customer Name"), "fieldname": "customer_name", "fieldtype": "Data", "width": 120},
+			]
+		)
 
 	if additional_table_columns:
 		columns += additional_table_columns
 
 	columns += [
 		{
-			'label': _('Receivable Account'),
-			'fieldname': 'debit_to',
-			'fieldtype': 'Link',
-			'options': 'Account',
-			'width': 80
+			"label": _("Receivable Account"),
+			"fieldname": "debit_to",
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 80,
 		},
 		{
-			'label': _('Mode Of Payment'),
-			'fieldname': 'mode_of_payment',
-			'fieldtype': 'Data',
-			'width': 120
-		}
+			"label": _("Mode Of Payment"),
+			"fieldname": "mode_of_payment",
+			"fieldtype": "Data",
+			"width": 120,
+		},
 	]
 
-	if filters.get('group_by') != 'Territory':
-		columns.extend([
-			{
-				'label': _('Territory'),
-				'fieldname': 'territory',
-				'fieldtype': 'Link',
-				'options': 'Territory',
-				'width': 80
-			}
-		])
-
+	if filters.get("group_by") != "Territory":
+		columns.extend(
+			[
+				{
+					"label": _("Territory"),
+					"fieldname": "territory",
+					"fieldtype": "Link",
+					"options": "Territory",
+					"width": 80,
+				}
+			]
+		)
 
 	columns += [
 		{
-			'label': _('Project'),
-			'fieldname': 'project',
-			'fieldtype': 'Link',
-			'options': 'Project',
-			'width': 80
+			"label": _("Project"),
+			"fieldname": "project",
+			"fieldtype": "Link",
+			"options": "Project",
+			"width": 80,
 		},
 		{
-			'label': _('Company'),
-			'fieldname': 'company',
-			'fieldtype': 'Link',
-			'options': 'Company',
-			'width': 80
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 80,
 		},
 		{
-			'label': _('Sales Order'),
-			'fieldname': 'sales_order',
-			'fieldtype': 'Link',
-			'options': 'Sales Order',
-			'width': 100
+			"label": _("Sales Order"),
+			"fieldname": "sales_order",
+			"fieldtype": "Link",
+			"options": "Sales Order",
+			"width": 100,
 		},
 		{
-			'label': _("Delivery Note"),
-			'fieldname': 'delivery_note',
-			'fieldtype': 'Link',
-			'options': 'Delivery Note',
-			'width': 100
+			"label": _("Delivery Note"),
+			"fieldname": "delivery_note",
+			"fieldtype": "Link",
+			"options": "Delivery Note",
+			"width": 100,
 		},
 		{
-			'label': _('Income Account'),
-			'fieldname': 'income_account',
-			'fieldtype': 'Link',
-			'options': 'Account',
-			'width': 100
+			"label": _("Income Account"),
+			"fieldname": "income_account",
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 100,
 		},
 		{
-			'label': _("Cost Center"),
-			'fieldname': 'cost_center',
-			'fieldtype': 'Link',
-			'options': 'Cost Center',
-			'width': 100
+			"label": _("Cost Center"),
+			"fieldname": "cost_center",
+			"fieldtype": "Link",
+			"options": "Cost Center",
+			"width": 100,
+		},
+		{"label": _("Stock Qty"), "fieldname": "stock_qty", "fieldtype": "Float", "width": 100},
+		{
+			"label": _("Stock UOM"),
+			"fieldname": "stock_uom",
+			"fieldtype": "Link",
+			"options": "UOM",
+			"width": 100,
 		},
 		{
-			'label': _('Stock Qty'),
-			'fieldname': 'stock_qty',
-			'fieldtype': 'Float',
-			'width': 100
+			"label": _("Rate"),
+			"fieldname": "rate",
+			"fieldtype": "Float",
+			"options": "currency",
+			"width": 100,
 		},
 		{
-			'label': _('Stock UOM'),
-			'fieldname': 'stock_uom',
-			'fieldtype': 'Link',
-			'options': 'UOM',
-			'width': 100
+			"label": _("Amount"),
+			"fieldname": "amount",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
 		},
-		{
-			'label': _('Rate'),
-			'fieldname': 'rate',
-			'fieldtype': 'Float',
-			'options': 'currency',
-			'width': 100
-		},
-		{
-			'label': _('Amount'),
-			'fieldname': 'amount',
-			'fieldtype': 'Currency',
-			'options': 'currency',
-			'width': 100
-		}
 	]
 
-	if filters.get('group_by'):
-		columns.append({
-			'label': _('% Of Grand Total'),
-			'fieldname': 'percent_gt',
-			'fieldtype': 'Float',
-			'width': 80
-		})
+	if filters.get("group_by"):
+		columns.append(
+			{"label": _("% Of Grand Total"), "fieldname": "percent_gt", "fieldtype": "Float", "width": 80}
+		)
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 
-	for opts in (("company", " and company=%(company)s"),
+	for opts in (
+		("company", " and company=%(company)s"),
 		("customer", " and `tabSales Invoice`.customer = %(customer)s"),
 		("item_code", " and `tabSales Invoice Item`.item_code = %(item_code)s"),
 		("from_date", " and `tabSales Invoice`.posting_date>=%(from_date)s"),
-		("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s")):
-			if filters.get(opts[0]):
-				conditions += opts[1]
+		("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s"),
+	):
+		if filters.get(opts[0]):
+			conditions += opts[1]
 
 	if filters.get("mode_of_payment"):
 		conditions += """ and exists(select name from `tabSales Invoice Payment`
@@ -346,41 +338,45 @@
 				and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
 
 	if filters.get("warehouse"):
-		conditions +=  """and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s"""
-
+		conditions += """and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s"""
 
 	if filters.get("brand"):
-		conditions +=  """and ifnull(`tabSales Invoice Item`.brand, '') = %(brand)s"""
+		conditions += """and ifnull(`tabSales Invoice Item`.brand, '') = %(brand)s"""
 
 	if filters.get("item_group"):
-		conditions +=  """and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s"""
+		conditions += """and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s"""
 
 	if not filters.get("group_by"):
-		conditions += "ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_group desc"
+		conditions += (
+			"ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_group desc"
+		)
 	else:
-		conditions += get_group_by_conditions(filters, 'Sales Invoice')
+		conditions += get_group_by_conditions(filters, "Sales Invoice")
 
 	return conditions
 
+
 def get_group_by_conditions(filters, doctype):
-	if filters.get("group_by") == 'Invoice':
+	if filters.get("group_by") == "Invoice":
 		return "ORDER BY `tab{0} Item`.parent desc".format(doctype)
-	elif filters.get("group_by") == 'Item':
+	elif filters.get("group_by") == "Item":
 		return "ORDER BY `tab{0} Item`.`item_code`".format(doctype)
-	elif filters.get("group_by") == 'Item Group':
-		return "ORDER BY `tab{0} Item`.{1}".format(doctype, frappe.scrub(filters.get('group_by')))
-	elif filters.get("group_by") in ('Customer', 'Customer Group', 'Territory', 'Supplier'):
-		return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get('group_by')))
+	elif filters.get("group_by") == "Item Group":
+		return "ORDER BY `tab{0} Item`.{1}".format(doctype, frappe.scrub(filters.get("group_by")))
+	elif filters.get("group_by") in ("Customer", "Customer Group", "Territory", "Supplier"):
+		return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get("group_by")))
+
 
 def get_items(filters, additional_query_columns):
 	conditions = get_conditions(filters)
 
 	if additional_query_columns:
-		additional_query_columns = ', ' + ', '.join(additional_query_columns)
+		additional_query_columns = ", " + ", ".join(additional_query_columns)
 	else:
-		additional_query_columns = ''
+		additional_query_columns = ""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			`tabSales Invoice Item`.name, `tabSales Invoice Item`.parent,
 			`tabSales Invoice`.posting_date, `tabSales Invoice`.debit_to,
@@ -399,47 +395,80 @@
 		from `tabSales Invoice`, `tabSales Invoice Item`
 		where `tabSales Invoice`.name = `tabSales Invoice Item`.parent
 			and `tabSales Invoice`.docstatus = 1 {1}
-		""".format(additional_query_columns or '', conditions), filters, as_dict=1) #nosec
+		""".format(
+			additional_query_columns or "", conditions
+		),
+		filters,
+		as_dict=1,
+	)  # nosec
+
 
 def get_delivery_notes_against_sales_order(item_list):
 	so_dn_map = frappe._dict()
 	so_item_rows = list(set([d.so_detail for d in item_list]))
 
 	if so_item_rows:
-		delivery_notes = frappe.db.sql("""
+		delivery_notes = frappe.db.sql(
+			"""
 			select parent, so_detail
 			from `tabDelivery Note Item`
 			where docstatus=1 and so_detail in (%s)
 			group by so_detail, parent
-		""" % (', '.join(['%s']*len(so_item_rows))), tuple(so_item_rows), as_dict=1)
+		"""
+			% (", ".join(["%s"] * len(so_item_rows))),
+			tuple(so_item_rows),
+			as_dict=1,
+		)
 
 		for dn in delivery_notes:
 			so_dn_map.setdefault(dn.so_detail, []).append(dn.parent)
 
 	return so_dn_map
 
+
 def get_grand_total(filters, doctype):
 
-	return frappe.db.sql(""" SELECT
+	return frappe.db.sql(
+		""" SELECT
 		SUM(`tab{0}`.base_grand_total)
 		FROM `tab{0}`
 		WHERE `tab{0}`.docstatus = 1
 		and posting_date between %s and %s
-	""".format(doctype), (filters.get('from_date'), filters.get('to_date')))[0][0] #nosec
+	""".format(
+			doctype
+		),
+		(filters.get("from_date"), filters.get("to_date")),
+	)[0][
+		0
+	]  # nosec
+
 
 def get_deducted_taxes():
-	return frappe.db.sql_list("select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'")
+	return frappe.db.sql_list(
+		"select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'"
+	)
 
-def get_tax_accounts(item_list, columns, company_currency,
-		doctype='Sales Invoice', tax_doctype='Sales Taxes and Charges'):
+
+def get_tax_accounts(
+	item_list,
+	columns,
+	company_currency,
+	doctype="Sales Invoice",
+	tax_doctype="Sales Taxes and Charges",
+):
 	import json
+
 	item_row_map = {}
 	tax_columns = []
 	invoice_item_row = {}
 	itemised_tax = {}
 
-	tax_amount_precision = get_field_precision(frappe.get_meta(tax_doctype).get_field('tax_amount'),
-		currency=company_currency) or 2
+	tax_amount_precision = (
+		get_field_precision(
+			frappe.get_meta(tax_doctype).get_field("tax_amount"), currency=company_currency
+		)
+		or 2
+	)
 
 	for d in item_list:
 		invoice_item_row.setdefault(d.parent, []).append(d)
@@ -450,7 +479,8 @@
 		conditions = " and category in ('Total', 'Valuation and Total') and base_tax_amount_after_discount_amount != 0"
 
 	deducted_tax = get_deducted_taxes()
-	tax_details = frappe.db.sql("""
+	tax_details = frappe.db.sql(
+		"""
 		select
 			name, parent, description, item_wise_tax_detail,
 			charge_type, base_tax_amount_after_discount_amount
@@ -461,8 +491,10 @@
 			and parent in (%s)
 			%s
 		order by description
-	""" % (tax_doctype, '%s', ', '.join(['%s']*len(invoice_item_row)), conditions),
-		tuple([doctype] + list(invoice_item_row)))
+	"""
+		% (tax_doctype, "%s", ", ".join(["%s"] * len(invoice_item_row)), conditions),
+		tuple([doctype] + list(invoice_item_row)),
+	)
 
 	for name, parent, description, item_wise_tax_detail, charge_type, tax_amount in tax_details:
 		description = handle_html(description)
@@ -483,151 +515,187 @@
 						tax_rate = tax_data
 						tax_amount = 0
 
-					if charge_type == 'Actual' and not tax_rate:
-						tax_rate = 'NA'
+					if charge_type == "Actual" and not tax_rate:
+						tax_rate = "NA"
 
-					item_net_amount = sum([flt(d.base_net_amount)
-						for d in item_row_map.get(parent, {}).get(item_code, [])])
+					item_net_amount = sum(
+						[flt(d.base_net_amount) for d in item_row_map.get(parent, {}).get(item_code, [])]
+					)
 
 					for d in item_row_map.get(parent, {}).get(item_code, []):
-						item_tax_amount = flt((tax_amount * d.base_net_amount) / item_net_amount) \
-							if item_net_amount else 0
+						item_tax_amount = (
+							flt((tax_amount * d.base_net_amount) / item_net_amount) if item_net_amount else 0
+						)
 						if item_tax_amount:
 							tax_value = flt(item_tax_amount, tax_amount_precision)
-							tax_value = (tax_value * -1
-								if (doctype == 'Purchase Invoice' and name in deducted_tax) else tax_value)
+							tax_value = (
+								tax_value * -1 if (doctype == "Purchase Invoice" and name in deducted_tax) else tax_value
+							)
 
-							itemised_tax.setdefault(d.name, {})[description] = frappe._dict({
-								'tax_rate': tax_rate,
-								'tax_amount': tax_value
-							})
+							itemised_tax.setdefault(d.name, {})[description] = frappe._dict(
+								{"tax_rate": tax_rate, "tax_amount": tax_value}
+							)
 
 			except ValueError:
 				continue
-		elif charge_type == 'Actual' and tax_amount:
+		elif charge_type == "Actual" and tax_amount:
 			for d in invoice_item_row.get(parent, []):
-				itemised_tax.setdefault(d.name, {})[description] = frappe._dict({
-					'tax_rate': 'NA',
-					'tax_amount': flt((tax_amount * d.base_net_amount) / d.base_net_total,
-						tax_amount_precision)
-				})
+				itemised_tax.setdefault(d.name, {})[description] = frappe._dict(
+					{
+						"tax_rate": "NA",
+						"tax_amount": flt((tax_amount * d.base_net_amount) / d.base_net_total, tax_amount_precision),
+					}
+				)
 
 	tax_columns.sort()
 	for desc in tax_columns:
-		columns.append({
-			'label': _(desc + ' Rate'),
-			'fieldname': frappe.scrub(desc + ' Rate'),
-			'fieldtype': 'Float',
-			'width': 100
-		})
+		columns.append(
+			{
+				"label": _(desc + " Rate"),
+				"fieldname": frappe.scrub(desc + " Rate"),
+				"fieldtype": "Float",
+				"width": 100,
+			}
+		)
 
-		columns.append({
-			'label': _(desc + ' Amount'),
-			'fieldname': frappe.scrub(desc + ' Amount'),
-			'fieldtype': 'Currency',
-			'options': 'currency',
-			'width': 100
-		})
+		columns.append(
+			{
+				"label": _(desc + " Amount"),
+				"fieldname": frappe.scrub(desc + " Amount"),
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 100,
+			}
+		)
 
 	columns += [
 		{
-			'label': _('Total Tax'),
-			'fieldname': 'total_tax',
-			'fieldtype': 'Currency',
-			'options': 'currency',
-			'width': 100
+			"label": _("Total Tax"),
+			"fieldname": "total_tax",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
 		},
 		{
-			'label': _('Total'),
-			'fieldname': 'total',
-			'fieldtype': 'Currency',
-			'options': 'currency',
-			'width': 100
+			"label": _("Total"),
+			"fieldname": "total",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
 		},
 		{
-			'fieldname': 'currency',
-			'label': _('Currency'),
-			'fieldtype': 'Currency',
-			'width': 80,
-			'hidden': 1
-		}
+			"fieldname": "currency",
+			"label": _("Currency"),
+			"fieldtype": "Currency",
+			"width": 80,
+			"hidden": 1,
+		},
 	]
 
 	return itemised_tax, tax_columns
 
-def add_total_row(data, filters, prev_group_by_value, item, total_row_map,
-	group_by_field, subtotal_display_field, grand_total, tax_columns):
-	if prev_group_by_value != item.get(group_by_field, ''):
+
+def add_total_row(
+	data,
+	filters,
+	prev_group_by_value,
+	item,
+	total_row_map,
+	group_by_field,
+	subtotal_display_field,
+	grand_total,
+	tax_columns,
+):
+	if prev_group_by_value != item.get(group_by_field, ""):
 		if prev_group_by_value:
 			total_row = total_row_map.get(prev_group_by_value)
 			data.append(total_row)
 			data.append({})
-			add_sub_total_row(total_row, total_row_map, 'total_row', tax_columns)
+			add_sub_total_row(total_row, total_row_map, "total_row", tax_columns)
 
-		prev_group_by_value = item.get(group_by_field, '')
+		prev_group_by_value = item.get(group_by_field, "")
 
-		total_row_map.setdefault(item.get(group_by_field, ''), {
-			subtotal_display_field: get_display_value(filters, group_by_field, item),
-			'stock_qty': 0.0,
-			'amount': 0.0,
-			'bold': 1,
-			'total_tax': 0.0,
-			'total': 0.0,
-			'percent_gt': 0.0
-		})
+		total_row_map.setdefault(
+			item.get(group_by_field, ""),
+			{
+				subtotal_display_field: get_display_value(filters, group_by_field, item),
+				"stock_qty": 0.0,
+				"amount": 0.0,
+				"bold": 1,
+				"total_tax": 0.0,
+				"total": 0.0,
+				"percent_gt": 0.0,
+			},
+		)
 
-		total_row_map.setdefault('total_row', {
-			subtotal_display_field: 'Total',
-			'stock_qty': 0.0,
-			'amount': 0.0,
-			'bold': 1,
-			'total_tax': 0.0,
-			'total': 0.0,
-			'percent_gt': 0.0
-		})
+		total_row_map.setdefault(
+			"total_row",
+			{
+				subtotal_display_field: "Total",
+				"stock_qty": 0.0,
+				"amount": 0.0,
+				"bold": 1,
+				"total_tax": 0.0,
+				"total": 0.0,
+				"percent_gt": 0.0,
+			},
+		)
 
 	return data, prev_group_by_value
 
+
 def get_display_value(filters, group_by_field, item):
-	if filters.get('group_by') == 'Item':
-		if item.get('item_code') != item.get('item_name'):
-			value =  cstr(item.get('item_code')) + "<br><br>" + \
-			"<span style='font-weight: normal'>" + cstr(item.get('item_name')) + "</span>"
+	if filters.get("group_by") == "Item":
+		if item.get("item_code") != item.get("item_name"):
+			value = (
+				cstr(item.get("item_code"))
+				+ "<br><br>"
+				+ "<span style='font-weight: normal'>"
+				+ cstr(item.get("item_name"))
+				+ "</span>"
+			)
 		else:
-			value =  item.get('item_code', '')
-	elif filters.get('group_by') in ('Customer', 'Supplier'):
-		party = frappe.scrub(filters.get('group_by'))
-		if item.get(party) != item.get(party+'_name'):
-			value = item.get(party) + "<br><br>" + \
-			"<span style='font-weight: normal'>" + item.get(party+'_name') + "</span>"
+			value = item.get("item_code", "")
+	elif filters.get("group_by") in ("Customer", "Supplier"):
+		party = frappe.scrub(filters.get("group_by"))
+		if item.get(party) != item.get(party + "_name"):
+			value = (
+				item.get(party)
+				+ "<br><br>"
+				+ "<span style='font-weight: normal'>"
+				+ item.get(party + "_name")
+				+ "</span>"
+			)
 		else:
-			value =  item.get(party)
+			value = item.get(party)
 	else:
 		value = item.get(group_by_field)
 
 	return value
 
+
 def get_group_by_and_display_fields(filters):
-	if filters.get('group_by') == 'Item':
-		group_by_field = 'item_code'
-		subtotal_display_field = 'invoice'
-	elif filters.get('group_by') == 'Invoice':
-		group_by_field = 'parent'
-		subtotal_display_field = 'item_code'
+	if filters.get("group_by") == "Item":
+		group_by_field = "item_code"
+		subtotal_display_field = "invoice"
+	elif filters.get("group_by") == "Invoice":
+		group_by_field = "parent"
+		subtotal_display_field = "item_code"
 	else:
-		group_by_field = frappe.scrub(filters.get('group_by'))
-		subtotal_display_field = 'item_code'
+		group_by_field = frappe.scrub(filters.get("group_by"))
+		subtotal_display_field = "item_code"
 
 	return group_by_field, subtotal_display_field
 
+
 def add_sub_total_row(item, total_row_map, group_by_value, tax_columns):
 	total_row = total_row_map.get(group_by_value)
-	total_row['stock_qty'] += item['stock_qty']
-	total_row['amount'] += item['amount']
-	total_row['total_tax'] += item['total_tax']
-	total_row['total'] += item['total']
-	total_row['percent_gt'] += item['percent_gt']
+	total_row["stock_qty"] += item["stock_qty"]
+	total_row["amount"] += item["amount"]
+	total_row["total_tax"] += item["total_tax"]
+	total_row["total"] += item["total"]
+	total_row["percent_gt"] += item["percent_gt"]
 
 	for tax in tax_columns:
-		total_row.setdefault(frappe.scrub(tax + ' Amount'), 0.0)
-		total_row[frappe.scrub(tax + ' Amount')] += flt(item[frappe.scrub(tax + ' Amount')])
+		total_row.setdefault(frappe.scrub(tax + " Amount"), 0.0)
+		total_row[frappe.scrub(tax + " Amount")] += flt(item[frappe.scrub(tax + " Amount")])
diff --git a/erpnext/accounts/report/non_billed_report.py b/erpnext/accounts/report/non_billed_report.py
index a421bc5..39c5311 100644
--- a/erpnext/accounts/report/non_billed_report.py
+++ b/erpnext/accounts/report/non_billed_report.py
@@ -9,14 +9,19 @@
 
 
 def get_ordered_to_be_billed_data(args):
-	doctype, party = args.get('doctype'), args.get('party')
+	doctype, party = args.get("doctype"), args.get("party")
 	child_tab = doctype + " Item"
-	precision = get_field_precision(frappe.get_meta(child_tab).get_field("billed_amt"),
-		currency=get_default_currency()) or 2
+	precision = (
+		get_field_precision(
+			frappe.get_meta(child_tab).get_field("billed_amt"), currency=get_default_currency()
+		)
+		or 2
+	)
 
 	project_field = get_project_field(doctype, party)
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		Select
 			`{parent_tab}`.name, `{parent_tab}`.{date_field},
 			`{parent_tab}`.{party}, `{parent_tab}`.{party}_name,
@@ -40,9 +45,20 @@
 			(`{child_tab}`.base_rate * ifnull(`{child_tab}`.returned_qty, 0))) > 0
 		order by
 			`{parent_tab}`.{order} {order_by}
-		""".format(parent_tab = 'tab' + doctype, child_tab = 'tab' + child_tab, precision= precision, party = party,
-			date_field = args.get('date'), project_field = project_field, order= args.get('order'), order_by = args.get('order_by')))
+		""".format(
+			parent_tab="tab" + doctype,
+			child_tab="tab" + child_tab,
+			precision=precision,
+			party=party,
+			date_field=args.get("date"),
+			project_field=project_field,
+			order=args.get("order"),
+			order_by=args.get("order_by"),
+		)
+	)
+
 
 def get_project_field(doctype, party):
-	if party == "supplier": doctype = doctype + ' Item'
-	return "`tab%s`.project"%(doctype)
+	if party == "supplier":
+		doctype = doctype + " Item"
+	return "`tab%s`.project" % (doctype)
diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
index 6c12093..00f5948 100644
--- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
+++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
@@ -28,21 +28,28 @@
 		else:
 			payment_amount = flt(d.credit) or -1 * flt(d.debit)
 
-		d.update({
-			"range1": 0,
-			"range2": 0,
-			"range3": 0,
-			"range4": 0,
-			"outstanding": payment_amount
-		})
+		d.update({"range1": 0, "range2": 0, "range3": 0, "range4": 0, "outstanding": payment_amount})
 
 		if d.against_voucher:
 			ReceivablePayableReport(filters).get_ageing_data(invoice.posting_date, d)
 
 		row = [
-			d.voucher_type, d.voucher_no, d.party_type, d.party, d.posting_date, d.against_voucher,
-			invoice.posting_date, invoice.due_date, d.debit, d.credit, d.remarks,
-			d.age, d.range1, d.range2, d.range3, d.range4
+			d.voucher_type,
+			d.voucher_no,
+			d.party_type,
+			d.party,
+			d.posting_date,
+			d.against_voucher,
+			invoice.posting_date,
+			invoice.due_date,
+			d.debit,
+			d.credit,
+			d.remarks,
+			d.age,
+			d.range1,
+			d.range2,
+			d.range3,
+			d.range4,
 		]
 
 		if invoice.due_date:
@@ -52,11 +59,17 @@
 
 	return columns, data
 
+
 def validate_filters(filters):
-	if (filters.get("payment_type") == _("Incoming") and filters.get("party_type") == "Supplier") or \
-		(filters.get("payment_type") == _("Outgoing") and filters.get("party_type") == "Customer"):
-			frappe.throw(_("{0} payment entries can not be filtered by {1}")\
-				.format(filters.payment_type, filters.party_type))
+	if (filters.get("payment_type") == _("Incoming") and filters.get("party_type") == "Supplier") or (
+		filters.get("payment_type") == _("Outgoing") and filters.get("party_type") == "Customer"
+	):
+		frappe.throw(
+			_("{0} payment entries can not be filtered by {1}").format(
+				filters.payment_type, filters.party_type
+			)
+		)
+
 
 def get_columns(filters):
 	return [
@@ -64,109 +77,57 @@
 			"fieldname": "payment_document",
 			"label": _("Payment Document Type"),
 			"fieldtype": "Data",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"fieldname": "payment_entry",
 			"label": _("Payment Document"),
 			"fieldtype": "Dynamic Link",
 			"options": "payment_document",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"fieldname": "party_type",
-			"label": _("Party Type"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "party_type", "label": _("Party Type"), "fieldtype": "Data", "width": 100},
 		{
 			"fieldname": "party",
 			"label": _("Party"),
 			"fieldtype": "Dynamic Link",
 			"options": "party_type",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"fieldname": "posting_date",
-			"label": _("Posting Date"),
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"fieldname": "posting_date", "label": _("Posting Date"), "fieldtype": "Date", "width": 100},
 		{
 			"fieldname": "invoice",
 			"label": _("Invoice"),
 			"fieldtype": "Link",
-			"options": "Purchase Invoice" if filters.get("payment_type") == _("Outgoing") else "Sales Invoice",
-			"width": 160
+			"options": "Purchase Invoice"
+			if filters.get("payment_type") == _("Outgoing")
+			else "Sales Invoice",
+			"width": 160,
 		},
 		{
 			"fieldname": "invoice_posting_date",
 			"label": _("Invoice Posting Date"),
 			"fieldtype": "Date",
-			"width": 100
+			"width": 100,
 		},
+		{"fieldname": "due_date", "label": _("Payment Due Date"), "fieldtype": "Date", "width": 100},
+		{"fieldname": "debit", "label": _("Debit"), "fieldtype": "Currency", "width": 140},
+		{"fieldname": "credit", "label": _("Credit"), "fieldtype": "Currency", "width": 140},
+		{"fieldname": "remarks", "label": _("Remarks"), "fieldtype": "Data", "width": 200},
+		{"fieldname": "age", "label": _("Age"), "fieldtype": "Int", "width": 50},
+		{"fieldname": "range1", "label": "0-30", "fieldtype": "Currency", "width": 140},
+		{"fieldname": "range2", "label": "30-60", "fieldtype": "Currency", "width": 140},
+		{"fieldname": "range3", "label": "60-90", "fieldtype": "Currency", "width": 140},
+		{"fieldname": "range4", "label": _("90 Above"), "fieldtype": "Currency", "width": 140},
 		{
-			"fieldname": "due_date",
-			"label": _("Payment Due Date"),
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"fieldname": "debit",
-			"label": _("Debit"),
-			"fieldtype": "Currency",
-			"width": 140
-		},
-		{
-			"fieldname": "credit",
-			"label": _("Credit"),
-			"fieldtype": "Currency",
-			"width": 140
-		},
-		{
-			"fieldname": "remarks",
-			"label": _("Remarks"),
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"fieldname": "age",
-			"label": _("Age"),
-			"fieldtype": "Int",
-			"width": 50
-		},
-		{
-			"fieldname": "range1",
-			"label": "0-30",
-			"fieldtype": "Currency",
-			"width": 140
-		},
-		{
-			"fieldname": "range2",
-			"label": "30-60",
-			"fieldtype": "Currency",
-			"width": 140
-		},
-		{
-			"fieldname": "range3",
-			"label": "60-90",
-			"fieldtype": "Currency",
-			"width": 140
-		},
-		{
-			"fieldname": "range4",
-			"label": _("90 Above"),
-			"fieldtype": "Currency",
-			"width": 140
-		},
-			{
 			"fieldname": "delay_in_payment",
 			"label": _("Delay in payment (Days)"),
 			"fieldtype": "Int",
-			"width": 100
-		}
+			"width": 100,
+		},
 	]
 
+
 def get_conditions(filters):
 	conditions = []
 
@@ -184,7 +145,9 @@
 
 	if filters.party_type:
 		conditions.append("against_voucher_type=%(reference_type)s")
-		filters["reference_type"] = "Sales Invoice" if filters.party_type=="Customer" else "Purchase Invoice"
+		filters["reference_type"] = (
+			"Sales Invoice" if filters.party_type == "Customer" else "Purchase Invoice"
+		)
 
 	if filters.get("from_date"):
 		conditions.append("posting_date >= %(from_date)s")
@@ -194,12 +157,20 @@
 
 	return "and " + " and ".join(conditions) if conditions else ""
 
+
 def get_entries(filters):
-	return frappe.db.sql("""select
+	return frappe.db.sql(
+		"""select
 		voucher_type, voucher_no, party_type, party, posting_date, debit, credit, remarks, against_voucher
 		from `tabGL Entry`
 		where company=%(company)s and voucher_type in ('Journal Entry', 'Payment Entry') {0}
-	""".format(get_conditions(filters)), filters, as_dict=1)
+	""".format(
+			get_conditions(filters)
+		),
+		filters,
+		as_dict=1,
+	)
+
 
 def get_invoice_posting_date_map(filters):
 	invoice_details = {}
diff --git a/erpnext/accounts/report/pos_register/pos_register.py b/erpnext/accounts/report/pos_register/pos_register.py
index 77e7568..1bda0d8 100644
--- a/erpnext/accounts/report/pos_register/pos_register.py
+++ b/erpnext/accounts/report/pos_register/pos_register.py
@@ -37,11 +37,14 @@
 		add_subtotal_row(grouped_data, invoices, group_by_field, key)
 
 	# move group by column to first position
-	column_index = next((index for (index, d) in enumerate(columns) if d["fieldname"] == group_by_field), None)
+	column_index = next(
+		(index for (index, d) in enumerate(columns) if d["fieldname"] == group_by_field), None
+	)
 	columns.insert(0, columns.pop(column_index))
 
 	return columns, grouped_data
 
+
 def get_pos_entries(filters, group_by_field):
 	conditions = get_conditions(filters)
 	order_by = "p.posting_date"
@@ -74,8 +77,12 @@
 			from_sales_invoice_payment=from_sales_invoice_payment,
 			group_by_mop_condition=group_by_mop_condition,
 			conditions=conditions,
-			order_by=order_by
-		), filters, as_dict=1)
+			order_by=order_by,
+		),
+		filters,
+		as_dict=1,
+	)
+
 
 def concat_mode_of_payments(pos_entries):
 	mode_of_payments = get_mode_of_payments(set(d.pos_invoice for d in pos_entries))
@@ -83,41 +90,50 @@
 		if mode_of_payments.get(entry.pos_invoice):
 			entry.mode_of_payment = ", ".join(mode_of_payments.get(entry.pos_invoice, []))
 
+
 def add_subtotal_row(data, group_invoices, group_by_field, group_by_value):
 	grand_total = sum(d.grand_total for d in group_invoices)
 	paid_amount = sum(d.paid_amount for d in group_invoices)
-	data.append({
-		group_by_field: group_by_value,
-		"grand_total": grand_total,
-		"paid_amount": paid_amount,
-		"bold": 1
-	})
+	data.append(
+		{
+			group_by_field: group_by_value,
+			"grand_total": grand_total,
+			"paid_amount": paid_amount,
+			"bold": 1,
+		}
+	)
 	data.append({})
 
+
 def validate_filters(filters):
 	if not filters.get("company"):
 		frappe.throw(_("{0} is mandatory").format(_("Company")))
 
 	if not filters.get("from_date") and not filters.get("to_date"):
-		frappe.throw(_("{0} and {1} are mandatory").format(frappe.bold(_("From Date")), frappe.bold(_("To Date"))))
+		frappe.throw(
+			_("{0} and {1} are mandatory").format(frappe.bold(_("From Date")), frappe.bold(_("To Date")))
+		)
 
 	if filters.from_date > filters.to_date:
 		frappe.throw(_("From Date must be before To Date"))
 
-	if (filters.get("pos_profile") and filters.get("group_by") == _('POS Profile')):
+	if filters.get("pos_profile") and filters.get("group_by") == _("POS Profile"):
 		frappe.throw(_("Can not filter based on POS Profile, if grouped by POS Profile"))
 
-	if (filters.get("customer") and filters.get("group_by") == _('Customer')):
+	if filters.get("customer") and filters.get("group_by") == _("Customer"):
 		frappe.throw(_("Can not filter based on Customer, if grouped by Customer"))
 
-	if (filters.get("owner") and filters.get("group_by") == _('Cashier')):
+	if filters.get("owner") and filters.get("group_by") == _("Cashier"):
 		frappe.throw(_("Can not filter based on Cashier, if grouped by Cashier"))
 
-	if (filters.get("mode_of_payment") and filters.get("group_by") == _('Payment Method')):
+	if filters.get("mode_of_payment") and filters.get("group_by") == _("Payment Method"):
 		frappe.throw(_("Can not filter based on Payment Method, if grouped by Payment Method"))
 
+
 def get_conditions(filters):
-	conditions = "company = %(company)s AND posting_date >= %(from_date)s AND posting_date <= %(to_date)s"
+	conditions = (
+		"company = %(company)s AND posting_date >= %(from_date)s AND posting_date <= %(to_date)s"
+	)
 
 	if filters.get("pos_profile"):
 		conditions += " AND pos_profile = %(pos_profile)s"
@@ -140,6 +156,7 @@
 
 	return conditions
 
+
 def get_group_by_field(group_by):
 	group_by_field = ""
 
@@ -154,68 +171,59 @@
 
 	return group_by_field
 
+
 def get_columns(filters):
 	columns = [
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 90
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 90},
 		{
 			"label": _("POS Invoice"),
 			"fieldname": "pos_invoice",
 			"fieldtype": "Link",
 			"options": "POS Invoice",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Customer"),
 			"fieldname": "customer",
 			"fieldtype": "Link",
 			"options": "Customer",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("POS Profile"),
 			"fieldname": "pos_profile",
 			"fieldtype": "Link",
 			"options": "POS Profile",
-			"width": 160
+			"width": 160,
 		},
 		{
 			"label": _("Cashier"),
 			"fieldname": "owner",
 			"fieldtype": "Link",
 			"options": "User",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Grand Total"),
 			"fieldname": "grand_total",
 			"fieldtype": "Currency",
 			"options": "company:currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Paid Amount"),
 			"fieldname": "paid_amount",
 			"fieldtype": "Currency",
 			"options": "company:currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Payment Method"),
 			"fieldname": "mode_of_payment",
 			"fieldtype": "Data",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Is Return"),
-			"fieldname": "is_return",
-			"fieldtype": "Data",
-			"width": 80
-		},
+		{"label": _("Is Return"), "fieldname": "is_return", "fieldtype": "Data", "width": 80},
 	]
 
 	return columns
diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
index 882e411..6635335 100644
--- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
+++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
@@ -15,19 +15,41 @@
 
 
 def execute(filters=None):
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
-		filters.period_start_date, filters.period_end_date, filters.filter_based_on, filters.periodicity,
-		company=filters.company)
+	period_list = get_period_list(
+		filters.from_fiscal_year,
+		filters.to_fiscal_year,
+		filters.period_start_date,
+		filters.period_end_date,
+		filters.filter_based_on,
+		filters.periodicity,
+		company=filters.company,
+	)
 
-	income = get_data(filters.company, "Income", "Credit", period_list, filters = filters,
+	income = get_data(
+		filters.company,
+		"Income",
+		"Credit",
+		period_list,
+		filters=filters,
 		accumulated_values=filters.accumulated_values,
-		ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
+	)
 
-	expense = get_data(filters.company, "Expense", "Debit", period_list, filters=filters,
+	expense = get_data(
+		filters.company,
+		"Expense",
+		"Debit",
+		period_list,
+		filters=filters,
 		accumulated_values=filters.accumulated_values,
-		ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
+		ignore_closing_entries=True,
+		ignore_accumulated_values_for_fy=True,
+	)
 
-	net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company, filters.presentation_currency)
+	net_profit_loss = get_net_profit_loss(
+		income, expense, period_list, filters.company, filters.presentation_currency
+	)
 
 	data = []
 	data.extend(income or [])
@@ -35,20 +57,29 @@
 	if net_profit_loss:
 		data.append(net_profit_loss)
 
-	columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, filters.company)
+	columns = get_columns(
+		filters.periodicity, period_list, filters.accumulated_values, filters.company
+	)
 
 	chart = get_chart_data(filters, columns, income, expense, net_profit_loss)
 
-	currency = filters.presentation_currency or frappe.get_cached_value('Company', filters.company, "default_currency")
-	report_summary = get_report_summary(period_list, filters.periodicity, income, expense, net_profit_loss, currency, filters)
+	currency = filters.presentation_currency or frappe.get_cached_value(
+		"Company", filters.company, "default_currency"
+	)
+	report_summary = get_report_summary(
+		period_list, filters.periodicity, income, expense, net_profit_loss, currency, filters
+	)
 
 	return columns, data, None, chart, report_summary
 
-def get_report_summary(period_list, periodicity, income, expense, net_profit_loss, currency, filters, consolidated=False):
+
+def get_report_summary(
+	period_list, periodicity, income, expense, net_profit_loss, currency, filters, consolidated=False
+):
 	net_income, net_expense, net_profit = 0.0, 0.0, 0.0
 
 	# from consolidated financial statement
-	if filters.get('accumulated_in_group_company'):
+	if filters.get("accumulated_in_group_company"):
 		period_list = get_filtered_list_for_consolidated_report(filters, period_list)
 
 	for period in period_list:
@@ -60,37 +91,27 @@
 		if net_profit_loss:
 			net_profit += net_profit_loss.get(key)
 
-	if (len(period_list) == 1 and periodicity== 'Yearly'):
-			profit_label = _("Profit This Year")
-			income_label = _("Total Income This Year")
-			expense_label = _("Total Expense This Year")
+	if len(period_list) == 1 and periodicity == "Yearly":
+		profit_label = _("Profit This Year")
+		income_label = _("Total Income This Year")
+		expense_label = _("Total Expense This Year")
 	else:
 		profit_label = _("Net Profit")
 		income_label = _("Total Income")
 		expense_label = _("Total Expense")
 
 	return [
-		{
-			"value": net_income,
-			"label": income_label,
-			"datatype": "Currency",
-			"currency": currency
-		},
-		{ "type": "separator", "value": "-"},
-		{
-			"value": net_expense,
-			"label": expense_label,
-			"datatype": "Currency",
-			"currency": currency
-		},
-		{ "type": "separator", "value": "=", "color": "blue"},
+		{"value": net_income, "label": income_label, "datatype": "Currency", "currency": currency},
+		{"type": "separator", "value": "-"},
+		{"value": net_expense, "label": expense_label, "datatype": "Currency", "currency": currency},
+		{"type": "separator", "value": "=", "color": "blue"},
 		{
 			"value": net_profit,
 			"indicator": "Green" if net_profit > 0 else "Red",
 			"label": profit_label,
 			"datatype": "Currency",
-			"currency": currency
-		}
+			"currency": currency,
+		},
 	]
 
 
@@ -100,7 +121,7 @@
 		"account_name": "'" + _("Profit for the year") + "'",
 		"account": "'" + _("Profit for the year") + "'",
 		"warn_if_negative": True,
-		"currency": currency or frappe.get_cached_value('Company',  company,  "default_currency")
+		"currency": currency or frappe.get_cached_value("Company", company, "default_currency"),
 	}
 
 	has_value = False
@@ -113,7 +134,7 @@
 		net_profit_loss[key] = total_income - total_expense
 
 		if net_profit_loss[key]:
-			has_value=True
+			has_value = True
 
 		total += flt(net_profit_loss[key])
 		net_profit_loss["total"] = total
@@ -121,6 +142,7 @@
 	if has_value:
 		return net_profit_loss
 
+
 def get_chart_data(filters, columns, income, expense, net_profit_loss):
 	labels = [d.get("label") for d in columns[2:]]
 
@@ -136,18 +158,13 @@
 
 	datasets = []
 	if income_data:
-		datasets.append({'name': _('Income'), 'values': income_data})
+		datasets.append({"name": _("Income"), "values": income_data})
 	if expense_data:
-		datasets.append({'name': _('Expense'), 'values': expense_data})
+		datasets.append({"name": _("Expense"), "values": expense_data})
 	if net_profit:
-		datasets.append({'name': _('Net Profit/Loss'), 'values': net_profit})
+		datasets.append({"name": _("Net Profit/Loss"), "values": net_profit})
 
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		}
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}}
 
 	if not filters.accumulated_values:
 		chart["type"] = "bar"
diff --git a/erpnext/accounts/report/profitability_analysis/profitability_analysis.py b/erpnext/accounts/report/profitability_analysis/profitability_analysis.py
index f4b8731..3e7aa1e 100644
--- a/erpnext/accounts/report/profitability_analysis/profitability_analysis.py
+++ b/erpnext/accounts/report/profitability_analysis/profitability_analysis.py
@@ -14,31 +14,39 @@
 
 value_fields = ("income", "expense", "gross_profit_loss")
 
-def execute(filters=None):
-	if not filters.get('based_on'): filters["based_on"] = 'Cost Center'
 
-	based_on = filters.based_on.replace(' ', '_').lower()
+def execute(filters=None):
+	if not filters.get("based_on"):
+		filters["based_on"] = "Cost Center"
+
+	based_on = filters.based_on.replace(" ", "_").lower()
 	validate_filters(filters)
 	accounts = get_accounts_data(based_on, filters.get("company"))
 	data = get_data(accounts, filters, based_on)
 	columns = get_columns(filters)
 	return columns, data
 
+
 def get_accounts_data(based_on, company):
-	if based_on == 'cost_center':
-		return frappe.db.sql("""select name, parent_cost_center as parent_account, cost_center_name as account_name, lft, rgt
-			from `tabCost Center` where company=%s order by name""", company, as_dict=True)
-	elif based_on == 'project':
-		return frappe.get_all('Project', fields = ["name"], filters = {'company': company}, order_by = 'name')
+	if based_on == "cost_center":
+		return frappe.db.sql(
+			"""select name, parent_cost_center as parent_account, cost_center_name as account_name, lft, rgt
+			from `tabCost Center` where company=%s order by name""",
+			company,
+			as_dict=True,
+		)
+	elif based_on == "project":
+		return frappe.get_all("Project", fields=["name"], filters={"company": company}, order_by="name")
 	else:
 		filters = {}
 		doctype = frappe.unscrub(based_on)
-		has_company = frappe.db.has_column(doctype, 'company')
+		has_company = frappe.db.has_column(doctype, "company")
 
 		if has_company:
-			filters.update({'company': company})
+			filters.update({"company": company})
 
-		return frappe.get_all(doctype, fields = ["name"], filters = filters, order_by = 'name')
+		return frappe.get_all(doctype, fields=["name"], filters=filters, order_by="name")
+
 
 def get_data(accounts, filters, based_on):
 	if not accounts:
@@ -48,24 +56,28 @@
 
 	gl_entries_by_account = {}
 
-	set_gl_entries_by_account(filters.get("company"), filters.get("from_date"),
-		filters.get("to_date"), based_on, gl_entries_by_account, ignore_closing_entries=not flt(filters.get("with_period_closing_entry")))
+	set_gl_entries_by_account(
+		filters.get("company"),
+		filters.get("from_date"),
+		filters.get("to_date"),
+		based_on,
+		gl_entries_by_account,
+		ignore_closing_entries=not flt(filters.get("with_period_closing_entry")),
+	)
 
 	total_row = calculate_values(accounts, gl_entries_by_account, filters)
 	accumulate_values_into_parents(accounts, accounts_by_name)
 
 	data = prepare_data(accounts, filters, total_row, parent_children_map, based_on)
-	data = filter_out_zero_value_rows(data, parent_children_map,
-		show_zero_values=filters.get("show_zero_values"))
+	data = filter_out_zero_value_rows(
+		data, parent_children_map, show_zero_values=filters.get("show_zero_values")
+	)
 
 	return data
 
+
 def calculate_values(accounts, gl_entries_by_account, filters):
-	init = {
-		"income": 0.0,
-		"expense": 0.0,
-		"gross_profit_loss": 0.0
-	}
+	init = {"income": 0.0, "expense": 0.0, "gross_profit_loss": 0.0}
 
 	total_row = {
 		"cost_center": None,
@@ -77,7 +89,7 @@
 		"account": "'" + _("Total") + "'",
 		"parent_account": None,
 		"indent": 0,
-		"has_value": True
+		"has_value": True,
 	}
 
 	for d in accounts:
@@ -87,9 +99,9 @@
 
 		for entry in gl_entries_by_account.get(d.name, []):
 			if cstr(entry.is_opening) != "Yes":
-				if entry.type == 'Income':
+				if entry.type == "Income":
 					d["income"] += flt(entry.credit) - flt(entry.debit)
-				if entry.type == 'Expense':
+				if entry.type == "Expense":
 					d["expense"] += flt(entry.debit) - flt(entry.credit)
 
 				d["gross_profit_loss"] = d.get("income") - d.get("expense")
@@ -101,15 +113,17 @@
 
 	return total_row
 
+
 def accumulate_values_into_parents(accounts, accounts_by_name):
 	for d in reversed(accounts):
 		if d.parent_account:
 			for key in value_fields:
 				accounts_by_name[d.parent_account][key] += d[key]
 
+
 def prepare_data(accounts, filters, total_row, parent_children_map, based_on):
 	data = []
-	company_currency = frappe.get_cached_value('Company',  filters.get("company"),  "default_currency")
+	company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
 
 	for d in accounts:
 		has_value = False
@@ -120,7 +134,7 @@
 			"indent": d.indent,
 			"fiscal_year": filters.get("fiscal_year"),
 			"currency": company_currency,
-			"based_on": based_on
+			"based_on": based_on,
 		}
 
 		for key in value_fields:
@@ -133,10 +147,11 @@
 		row["has_value"] = has_value
 		data.append(row)
 
-	data.extend([{},total_row])
+	data.extend([{}, total_row])
 
 	return data
 
+
 def get_columns(filters):
 	return [
 		{
@@ -144,43 +159,42 @@
 			"label": _(filters.get("based_on")),
 			"fieldtype": "Link",
 			"options": filters.get("based_on"),
-			"width": 300
+			"width": 300,
 		},
 		{
 			"fieldname": "currency",
 			"label": _("Currency"),
 			"fieldtype": "Link",
 			"options": "Currency",
-			"hidden": 1
+			"hidden": 1,
 		},
 		{
 			"fieldname": "income",
 			"label": _("Income"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 305
-
+			"width": 305,
 		},
 		{
 			"fieldname": "expense",
 			"label": _("Expense"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 305
-
+			"width": 305,
 		},
 		{
 			"fieldname": "gross_profit_loss",
 			"label": _("Gross Profit / Loss"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 307
-
-		}
+			"width": 307,
+		},
 	]
 
-def set_gl_entries_by_account(company, from_date, to_date, based_on, gl_entries_by_account,
-		ignore_closing_entries=False):
+
+def set_gl_entries_by_account(
+	company, from_date, to_date, based_on, gl_entries_by_account, ignore_closing_entries=False
+):
 	"""Returns a dict like { "account": [gl entries], ... }"""
 	additional_conditions = []
 
@@ -190,19 +204,19 @@
 	if from_date:
 		additional_conditions.append("and posting_date >= %(from_date)s")
 
-	gl_entries = frappe.db.sql("""select posting_date, {based_on} as based_on, debit, credit,
+	gl_entries = frappe.db.sql(
+		"""select posting_date, {based_on} as based_on, debit, credit,
 		is_opening, (select root_type from `tabAccount` where name = account) as type
 		from `tabGL Entry` where company=%(company)s
 		{additional_conditions}
 		and posting_date <= %(to_date)s
 		and {based_on} is not null
-		order by {based_on}, posting_date""".format(additional_conditions="\n".join(additional_conditions), based_on= based_on),
-		{
-			"company": company,
-			"from_date": from_date,
-			"to_date": to_date
-		},
-		as_dict=True)
+		order by {based_on}, posting_date""".format(
+			additional_conditions="\n".join(additional_conditions), based_on=based_on
+		),
+		{"company": company, "from_date": from_date, "to_date": to_date},
+		as_dict=True,
+	)
 
 	for entry in gl_entries:
 		gl_entries_by_account.setdefault(entry.based_on, []).append(entry)
diff --git a/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py b/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py
index 406f7a5..8af9bb3 100644
--- a/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py
+++ b/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py
@@ -6,7 +6,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Purchase Invoice")
 	data = get_data(filters, conditions)
diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py
index a9696bd..c359959 100644
--- a/erpnext/accounts/report/purchase_register/purchase_register.py
+++ b/erpnext/accounts/report/purchase_register/purchase_register.py
@@ -15,12 +15,15 @@
 def execute(filters=None):
 	return _execute(filters)
 
+
 def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	invoice_list = get_invoices(filters, additional_query_columns)
-	columns, expense_accounts, tax_accounts, unrealized_profit_loss_accounts \
-		= get_columns(invoice_list, additional_table_columns)
+	columns, expense_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns(
+		invoice_list, additional_table_columns
+	)
 
 	if not invoice_list:
 		msgprint(_("No record found"))
@@ -28,13 +31,14 @@
 
 	invoice_expense_map = get_invoice_expense_map(invoice_list)
 	internal_invoice_map = get_internal_invoice_map(invoice_list)
-	invoice_expense_map, invoice_tax_map = get_invoice_tax_map(invoice_list,
-		invoice_expense_map, expense_accounts)
+	invoice_expense_map, invoice_tax_map = get_invoice_tax_map(
+		invoice_list, invoice_expense_map, expense_accounts
+	)
 	invoice_po_pr_map = get_invoice_po_pr_map(invoice_list)
 	suppliers = list(set(d.supplier for d in invoice_list))
 	supplier_details = get_supplier_details(suppliers)
 
-	company_currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	company_currency = frappe.get_cached_value("Company", filters.company, "default_currency")
 
 	data = []
 	for inv in invoice_list:
@@ -50,10 +54,17 @@
 				row.append(inv.get(col))
 
 		row += [
-			supplier_details.get(inv.supplier), # supplier_group
-			inv.tax_id, inv.credit_to, inv.mode_of_payment, ", ".join(project),
-			inv.bill_no, inv.bill_date, inv.remarks,
-			", ".join(purchase_order), ", ".join(purchase_receipt), company_currency
+			supplier_details.get(inv.supplier),  # supplier_group
+			inv.tax_id,
+			inv.credit_to,
+			inv.mode_of_payment,
+			", ".join(project),
+			inv.bill_no,
+			inv.bill_date,
+			inv.remarks,
+			", ".join(purchase_order),
+			", ".join(purchase_receipt),
+			company_currency,
 		]
 
 		# map expense values
@@ -91,85 +102,117 @@
 def get_columns(invoice_list, additional_table_columns):
 	"""return columns based on filters"""
 	columns = [
-		_("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80",
-		_("Supplier Id") + "::120", _("Supplier Name") + "::120"]
+		_("Invoice") + ":Link/Purchase Invoice:120",
+		_("Posting Date") + ":Date:80",
+		_("Supplier Id") + "::120",
+		_("Supplier Name") + "::120",
+	]
 
 	if additional_table_columns:
 		columns += additional_table_columns
 
 	columns += [
-		_("Supplier Group") + ":Link/Supplier Group:120", _("Tax Id") + "::80", _("Payable Account") + ":Link/Account:120",
-		_("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
-		_("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
+		_("Supplier Group") + ":Link/Supplier Group:120",
+		_("Tax Id") + "::80",
+		_("Payable Account") + ":Link/Account:120",
+		_("Mode of Payment") + ":Link/Mode of Payment:80",
+		_("Project") + ":Link/Project:80",
+		_("Bill No") + "::120",
+		_("Bill Date") + ":Date:80",
+		_("Remarks") + "::150",
 		_("Purchase Order") + ":Link/Purchase Order:100",
 		_("Purchase Receipt") + ":Link/Purchase Receipt:100",
-		{
-			"fieldname": "currency",
-			"label": _("Currency"),
-			"fieldtype": "Data",
-			"width": 80
-		}
+		{"fieldname": "currency", "label": _("Currency"), "fieldtype": "Data", "width": 80},
 	]
-	expense_accounts = tax_accounts = expense_columns = tax_columns = unrealized_profit_loss_accounts = \
-		unrealized_profit_loss_account_columns = []
+	expense_accounts = (
+		tax_accounts
+	) = (
+		expense_columns
+	) = tax_columns = unrealized_profit_loss_accounts = unrealized_profit_loss_account_columns = []
 
 	if invoice_list:
-		expense_accounts = frappe.db.sql_list("""select distinct expense_account
+		expense_accounts = frappe.db.sql_list(
+			"""select distinct expense_account
 			from `tabPurchase Invoice Item` where docstatus = 1
 			and (expense_account is not null and expense_account != '')
-			and parent in (%s) order by expense_account""" %
-			', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]))
+			and parent in (%s) order by expense_account"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple([inv.name for inv in invoice_list]),
+		)
 
-		tax_accounts = 	frappe.db.sql_list("""select distinct account_head
+		tax_accounts = frappe.db.sql_list(
+			"""select distinct account_head
 			from `tabPurchase Taxes and Charges` where parenttype = 'Purchase Invoice'
 			and docstatus = 1 and (account_head is not null and account_head != '')
 			and category in ('Total', 'Valuation and Total')
-			and parent in (%s) order by account_head""" %
-			', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list))
+			and parent in (%s) order by account_head"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple(inv.name for inv in invoice_list),
+		)
 
-		unrealized_profit_loss_accounts = frappe.db.sql_list("""SELECT distinct unrealized_profit_loss_account
+		unrealized_profit_loss_accounts = frappe.db.sql_list(
+			"""SELECT distinct unrealized_profit_loss_account
 			from `tabPurchase Invoice` where docstatus = 1 and name in (%s)
 			and ifnull(unrealized_profit_loss_account, '') != ''
-			order by unrealized_profit_loss_account""" %
-			', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list))
+			order by unrealized_profit_loss_account"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple(inv.name for inv in invoice_list),
+		)
 
 	expense_columns = [(account + ":Currency/currency:120") for account in expense_accounts]
-	unrealized_profit_loss_account_columns = [(account + ":Currency/currency:120") for account in unrealized_profit_loss_accounts]
+	unrealized_profit_loss_account_columns = [
+		(account + ":Currency/currency:120") for account in unrealized_profit_loss_accounts
+	]
 
 	for account in tax_accounts:
 		if account not in expense_accounts:
 			tax_columns.append(account + ":Currency/currency:120")
 
-	columns = columns + expense_columns + unrealized_profit_loss_account_columns + \
-		[_("Net Total") + ":Currency/currency:120"] + tax_columns + \
-		[_("Total Tax") + ":Currency/currency:120", _("Grand Total") + ":Currency/currency:120",
-			_("Rounded Total") + ":Currency/currency:120", _("Outstanding Amount") + ":Currency/currency:120"]
+	columns = (
+		columns
+		+ expense_columns
+		+ unrealized_profit_loss_account_columns
+		+ [_("Net Total") + ":Currency/currency:120"]
+		+ tax_columns
+		+ [
+			_("Total Tax") + ":Currency/currency:120",
+			_("Grand Total") + ":Currency/currency:120",
+			_("Rounded Total") + ":Currency/currency:120",
+			_("Outstanding Amount") + ":Currency/currency:120",
+		]
+	)
 
 	return columns, expense_accounts, tax_accounts, unrealized_profit_loss_accounts
 
+
 def get_conditions(filters):
 	conditions = ""
 
-	if filters.get("company"): conditions += " and company=%(company)s"
-	if filters.get("supplier"): conditions += " and supplier = %(supplier)s"
+	if filters.get("company"):
+		conditions += " and company=%(company)s"
+	if filters.get("supplier"):
+		conditions += " and supplier = %(supplier)s"
 
-	if filters.get("from_date"): conditions += " and posting_date>=%(from_date)s"
-	if filters.get("to_date"): conditions += " and posting_date<=%(to_date)s"
+	if filters.get("from_date"):
+		conditions += " and posting_date>=%(from_date)s"
+	if filters.get("to_date"):
+		conditions += " and posting_date<=%(to_date)s"
 
-	if filters.get("mode_of_payment"): conditions += " and ifnull(mode_of_payment, '') = %(mode_of_payment)s"
+	if filters.get("mode_of_payment"):
+		conditions += " and ifnull(mode_of_payment, '') = %(mode_of_payment)s"
 
 	if filters.get("cost_center"):
-		conditions +=  """ and exists(select name from `tabPurchase Invoice Item`
+		conditions += """ and exists(select name from `tabPurchase Invoice Item`
 			 where parent=`tabPurchase Invoice`.name
 			 	and ifnull(`tabPurchase Invoice Item`.cost_center, '') = %(cost_center)s)"""
 
 	if filters.get("warehouse"):
-		conditions +=  """ and exists(select name from `tabPurchase Invoice Item`
+		conditions += """ and exists(select name from `tabPurchase Invoice Item`
 			 where parent=`tabPurchase Invoice`.name
 			 	and ifnull(`tabPurchase Invoice Item`.warehouse, '') = %(warehouse)s)"""
 
 	if filters.get("item_group"):
-		conditions +=  """ and exists(select name from `tabPurchase Invoice Item`
+		conditions += """ and exists(select name from `tabPurchase Invoice Item`
 			 where parent=`tabPurchase Invoice`.name
 			 	and ifnull(`tabPurchase Invoice Item`.item_group, '') = %(item_group)s)"""
 
@@ -182,38 +225,58 @@
 			"""
 		for dimension in accounting_dimensions:
 			if filters.get(dimension.fieldname):
-				if frappe.get_cached_value('DocType', dimension.document_type, 'is_tree'):
-					filters[dimension.fieldname] = get_dimension_with_children(dimension.document_type,
-						filters.get(dimension.fieldname))
+				if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"):
+					filters[dimension.fieldname] = get_dimension_with_children(
+						dimension.document_type, filters.get(dimension.fieldname)
+					)
 
-					conditions += common_condition + "and ifnull(`tabPurchase Invoice Item`.{0}, '') in %({0})s)".format(dimension.fieldname)
+					conditions += (
+						common_condition
+						+ "and ifnull(`tabPurchase Invoice Item`.{0}, '') in %({0})s)".format(dimension.fieldname)
+					)
 				else:
-					conditions += common_condition + "and ifnull(`tabPurchase Invoice Item`.{0}, '') in (%({0})s))".format(dimension.fieldname)
+					conditions += (
+						common_condition
+						+ "and ifnull(`tabPurchase Invoice Item`.{0}, '') in (%({0})s))".format(dimension.fieldname)
+					)
 
 	return conditions
 
+
 def get_invoices(filters, additional_query_columns):
 	if additional_query_columns:
-		additional_query_columns = ', ' + ', '.join(additional_query_columns)
+		additional_query_columns = ", " + ", ".join(additional_query_columns)
 
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			name, posting_date, credit_to, supplier, supplier_name, tax_id, bill_no, bill_date,
 			remarks, base_net_total, base_grand_total, outstanding_amount,
 			mode_of_payment {0}
 		from `tabPurchase Invoice`
 		where docstatus = 1 %s
-		order by posting_date desc, name desc""".format(additional_query_columns or '') % conditions, filters, as_dict=1)
+		order by posting_date desc, name desc""".format(
+			additional_query_columns or ""
+		)
+		% conditions,
+		filters,
+		as_dict=1,
+	)
 
 
 def get_invoice_expense_map(invoice_list):
-	expense_details = frappe.db.sql("""
+	expense_details = frappe.db.sql(
+		"""
 		select parent, expense_account, sum(base_net_amount) as amount
 		from `tabPurchase Invoice Item`
 		where parent in (%s)
 		group by parent, expense_account
-	""" % ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+	"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_expense_map = {}
 	for d in expense_details:
@@ -222,11 +285,16 @@
 
 	return invoice_expense_map
 
+
 def get_internal_invoice_map(invoice_list):
-	unrealized_amount_details = frappe.db.sql("""SELECT name, unrealized_profit_loss_account,
+	unrealized_amount_details = frappe.db.sql(
+		"""SELECT name, unrealized_profit_loss_account,
 		base_net_total as amount from `tabPurchase Invoice` where name in (%s)
-		and is_internal_supplier = 1 and company = represents_company""" %
-		', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+		and is_internal_supplier = 1 and company = represents_company"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	internal_invoice_map = {}
 	for d in unrealized_amount_details:
@@ -235,15 +303,21 @@
 
 	return internal_invoice_map
 
+
 def get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts):
-	tax_details = frappe.db.sql("""
+	tax_details = frappe.db.sql(
+		"""
 		select parent, account_head, case add_deduct_tax when "Add" then sum(base_tax_amount_after_discount_amount)
 		else sum(base_tax_amount_after_discount_amount) * -1 end as tax_amount
 		from `tabPurchase Taxes and Charges`
 		where parent in (%s) and category in ('Total', 'Valuation and Total')
 			and base_tax_amount_after_discount_amount != 0
 		group by parent, account_head, add_deduct_tax
-	""" % ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+	"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_tax_map = {}
 	for d in tax_details:
@@ -258,48 +332,71 @@
 
 	return invoice_expense_map, invoice_tax_map
 
+
 def get_invoice_po_pr_map(invoice_list):
-	pi_items = frappe.db.sql("""
+	pi_items = frappe.db.sql(
+		"""
 		select parent, purchase_order, purchase_receipt, po_detail, project
 		from `tabPurchase Invoice Item`
 		where parent in (%s)
-	""" % ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+	"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_po_pr_map = {}
 	for d in pi_items:
 		if d.purchase_order:
-			invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"purchase_order", []).append(d.purchase_order)
+			invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault("purchase_order", []).append(
+				d.purchase_order
+			)
 
 		pr_list = None
 		if d.purchase_receipt:
 			pr_list = [d.purchase_receipt]
 		elif d.po_detail:
-			pr_list = frappe.db.sql_list("""select distinct parent from `tabPurchase Receipt Item`
-				where docstatus=1 and purchase_order_item=%s""", d.po_detail)
+			pr_list = frappe.db.sql_list(
+				"""select distinct parent from `tabPurchase Receipt Item`
+				where docstatus=1 and purchase_order_item=%s""",
+				d.po_detail,
+			)
 
 		if pr_list:
 			invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault("purchase_receipt", pr_list)
 
 		if d.project:
-			invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"project", []).append(d.project)
+			invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault("project", []).append(
+				d.project
+			)
 
 	return invoice_po_pr_map
 
+
 def get_account_details(invoice_list):
 	account_map = {}
 	accounts = list(set([inv.credit_to for inv in invoice_list]))
-	for acc in frappe.db.sql("""select name, parent_account from tabAccount
-		where name in (%s)""" % ", ".join(["%s"]*len(accounts)), tuple(accounts), as_dict=1):
-			account_map[acc.name] = acc.parent_account
+	for acc in frappe.db.sql(
+		"""select name, parent_account from tabAccount
+		where name in (%s)"""
+		% ", ".join(["%s"] * len(accounts)),
+		tuple(accounts),
+		as_dict=1,
+	):
+		account_map[acc.name] = acc.parent_account
 
 	return account_map
 
+
 def get_supplier_details(suppliers):
 	supplier_details = {}
-	for supp in frappe.db.sql("""select name, supplier_group from `tabSupplier`
-		where name in (%s)""" % ", ".join(["%s"]*len(suppliers)), tuple(suppliers), as_dict=1):
-			supplier_details.setdefault(supp.name, supp.supplier_group)
+	for supp in frappe.db.sql(
+		"""select name, supplier_group from `tabSupplier`
+		where name in (%s)"""
+		% ", ".join(["%s"] * len(suppliers)),
+		tuple(suppliers),
+		as_dict=1,
+	):
+		supplier_details.setdefault(supp.name, supp.supplier_group)
 
 	return supplier_details
diff --git a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py
index e88675b..1dcacb9 100644
--- a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py
+++ b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py
@@ -13,6 +13,7 @@
 	data = get_ordered_to_be_billed_data(args)
 	return columns, data
 
+
 def get_column():
 	return [
 		{
@@ -20,90 +21,76 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Purchase Receipt",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label": _("Date"),
-			"fieldname": "date",
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"label": _("Date"), "fieldname": "date", "fieldtype": "Date", "width": 100},
 		{
 			"label": _("Supplier"),
 			"fieldname": "supplier",
 			"fieldtype": "Link",
 			"options": "Supplier",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Supplier Name"),
-			"fieldname": "supplier_name",
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"label": _("Supplier Name"), "fieldname": "supplier_name", "fieldtype": "Data", "width": 120},
 		{
 			"label": _("Item Code"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Amount"),
 			"fieldname": "amount",
 			"fieldtype": "Currency",
 			"width": 100,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
 		{
 			"label": _("Billed Amount"),
 			"fieldname": "billed_amount",
 			"fieldtype": "Currency",
 			"width": 100,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
 		{
 			"label": _("Returned Amount"),
 			"fieldname": "returned_amount",
 			"fieldtype": "Currency",
 			"width": 120,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
 		{
 			"label": _("Pending Amount"),
 			"fieldname": "pending_amount",
 			"fieldtype": "Currency",
 			"width": 120,
-			"options": "Company:company:default_currency"
+			"options": "Company:company:default_currency",
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("Description"),
-			"fieldname": "description",
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 120},
+		{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 120},
 		{
 			"label": _("Project"),
 			"fieldname": "project",
 			"fieldtype": "Link",
 			"options": "Project",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Company"),
 			"fieldname": "company",
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
+
 def get_args():
-	return {'doctype': 'Purchase Receipt', 'party': 'supplier',
-		'date': 'posting_date', 'order': 'name', 'order_by': 'desc'}
+	return {
+		"doctype": "Purchase Receipt",
+		"party": "supplier",
+		"date": "posting_date",
+		"order": "name",
+		"order_by": "desc",
+	}
diff --git a/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.py b/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.py
index 966b1d4..483deba 100644
--- a/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.py
+++ b/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.py
@@ -6,7 +6,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Sales Invoice")
 	data = get_data(filters, conditions)
diff --git a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py
index 904513c..4eef307 100644
--- a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py
+++ b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py
@@ -9,7 +9,11 @@
 def execute(filters=None):
 	columns, data = [], []
 	columns = get_columns(filters)
-	data = get_pos_sales_payment_data(filters) if filters.get('is_pos') else get_sales_payment_data(filters, columns)
+	data = (
+		get_pos_sales_payment_data(filters)
+		if filters.get("is_pos")
+		else get_sales_payment_data(filters, columns)
+	)
 	return columns, data
 
 
@@ -22,12 +26,12 @@
 		_("Taxes") + ":Currency/currency:120",
 		_("Payments") + ":Currency/currency:120",
 		_("Warehouse") + ":Data:200",
-		_("Cost Center") + ":Data:200"
+		_("Cost Center") + ":Data:200",
 	]
 
 
 def get_columns(filters):
-	if filters.get('is_pos'):
+	if filters.get("is_pos"):
 		return get_pos_columns()
 	else:
 		return [
@@ -44,15 +48,17 @@
 	sales_invoice_data = get_pos_invoice_data(filters)
 	data = [
 		[
-			row['posting_date'],
-			row['owner'],
-			row['mode_of_payment'],
-			row['net_total'],
-			row['total_taxes'],
-			row['paid_amount'],
-			row['warehouse'],
-			row['cost_center']
-		] for row in sales_invoice_data]
+			row["posting_date"],
+			row["owner"],
+			row["mode_of_payment"],
+			row["net_total"],
+			row["total_taxes"],
+			row["paid_amount"],
+			row["warehouse"],
+			row["cost_center"],
+		]
+		for row in sales_invoice_data
+	]
 
 	return data
 
@@ -71,19 +77,25 @@
 		show_payment_detail = False
 
 	for inv in sales_invoice_data:
-		owner_posting_date = inv["owner"]+cstr(inv["posting_date"])
+		owner_posting_date = inv["owner"] + cstr(inv["posting_date"])
 		if show_payment_detail:
-			row = [inv.posting_date, inv.owner," ",inv.net_total,inv.total_taxes, 0]
+			row = [inv.posting_date, inv.owner, " ", inv.net_total, inv.total_taxes, 0]
 			data.append(row)
-			for mop_detail in mode_of_payment_details.get(owner_posting_date,[]):
-				row = [inv.posting_date, inv.owner,mop_detail[0],0,0,mop_detail[1],0]
+			for mop_detail in mode_of_payment_details.get(owner_posting_date, []):
+				row = [inv.posting_date, inv.owner, mop_detail[0], 0, 0, mop_detail[1], 0]
 				data.append(row)
 		else:
 			total_payment = 0
-			for mop_detail in mode_of_payment_details.get(owner_posting_date,[]):
+			for mop_detail in mode_of_payment_details.get(owner_posting_date, []):
 				total_payment = total_payment + mop_detail[1]
-			row = [inv.posting_date, inv.owner,", ".join(mode_of_payments.get(owner_posting_date, [])),
-			inv.net_total,inv.total_taxes,total_payment]
+			row = [
+				inv.posting_date,
+				inv.owner,
+				", ".join(mode_of_payments.get(owner_posting_date, [])),
+				inv.net_total,
+				inv.total_taxes,
+				total_payment,
+			]
 			data.append(row)
 	return data
 
@@ -107,40 +119,44 @@
 
 def get_pos_invoice_data(filters):
 	conditions = get_conditions(filters)
-	result = frappe.db.sql(''
-							'SELECT '
-							'posting_date, owner, sum(net_total) as "net_total", sum(total_taxes) as "total_taxes", '
-							'sum(paid_amount) as "paid_amount", sum(outstanding_amount) as "outstanding_amount", '
-							'mode_of_payment, warehouse, cost_center '
-							'FROM ('
-							'SELECT '
-							'parent, item_code, sum(amount) as "base_total", warehouse, cost_center '
-							'from `tabSales Invoice Item`  group by parent'
-							') t1 '
-							'left join '
-							'(select parent, mode_of_payment from `tabSales Invoice Payment` group by parent) t3 '
-							'on (t3.parent = t1.parent) '
-							'JOIN ('
-							'SELECT '
-							'docstatus, company, is_pos, name, posting_date, owner, sum(base_total) as "base_total", '
-							'sum(net_total) as "net_total", sum(total_taxes_and_charges) as "total_taxes", '
-							'sum(base_paid_amount) as "paid_amount", sum(outstanding_amount) as "outstanding_amount" '
-							'FROM `tabSales Invoice` '
-							'GROUP BY name'
-							') a '
-							'ON ('
-							't1.parent = a.name and t1.base_total = a.base_total) '
-							'WHERE a.docstatus = 1'
-							' AND {conditions} '
-							'GROUP BY '
-							'owner, posting_date, warehouse'.format(conditions=conditions), filters, as_dict=1
-							)
+	result = frappe.db.sql(
+		""
+		"SELECT "
+		'posting_date, owner, sum(net_total) as "net_total", sum(total_taxes) as "total_taxes", '
+		'sum(paid_amount) as "paid_amount", sum(outstanding_amount) as "outstanding_amount", '
+		"mode_of_payment, warehouse, cost_center "
+		"FROM ("
+		"SELECT "
+		'parent, item_code, sum(amount) as "base_total", warehouse, cost_center '
+		"from `tabSales Invoice Item`  group by parent"
+		") t1 "
+		"left join "
+		"(select parent, mode_of_payment from `tabSales Invoice Payment` group by parent) t3 "
+		"on (t3.parent = t1.parent) "
+		"JOIN ("
+		"SELECT "
+		'docstatus, company, is_pos, name, posting_date, owner, sum(base_total) as "base_total", '
+		'sum(net_total) as "net_total", sum(total_taxes_and_charges) as "total_taxes", '
+		'sum(base_paid_amount) as "paid_amount", sum(outstanding_amount) as "outstanding_amount" '
+		"FROM `tabSales Invoice` "
+		"GROUP BY name"
+		") a "
+		"ON ("
+		"t1.parent = a.name and t1.base_total = a.base_total) "
+		"WHERE a.docstatus = 1"
+		" AND {conditions} "
+		"GROUP BY "
+		"owner, posting_date, warehouse".format(conditions=conditions),
+		filters,
+		as_dict=1,
+	)
 	return result
 
 
 def get_sales_invoice_data(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			a.posting_date, a.owner,
 			sum(a.net_total) as "net_total",
@@ -152,15 +168,21 @@
 			and {conditions}
 			group by
 			a.owner, a.posting_date
-	""".format(conditions=conditions), filters, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 
 def get_mode_of_payments(filters):
 	mode_of_payments = {}
 	invoice_list = get_invoices(filters)
-	invoice_list_names = ",".join('"' + invoice['name'] + '"' for invoice in invoice_list)
+	invoice_list_names = ",".join('"' + invoice["name"] + '"' for invoice in invoice_list)
 	if invoice_list:
-		inv_mop = frappe.db.sql("""select a.owner,a.posting_date, ifnull(b.mode_of_payment, '') as mode_of_payment
+		inv_mop = frappe.db.sql(
+			"""select a.owner,a.posting_date, ifnull(b.mode_of_payment, '') as mode_of_payment
 			from `tabSales Invoice` a, `tabSales Invoice Payment` b
 			where a.name = b.parent
 			and a.docstatus = 1
@@ -180,26 +202,36 @@
 			and a.docstatus = 1
 			and b.reference_type = "Sales Invoice"
 			and b.reference_name in ({invoice_list_names})
-			""".format(invoice_list_names=invoice_list_names), as_dict=1)
+			""".format(
+				invoice_list_names=invoice_list_names
+			),
+			as_dict=1,
+		)
 		for d in inv_mop:
-			mode_of_payments.setdefault(d["owner"]+cstr(d["posting_date"]), []).append(d.mode_of_payment)
+			mode_of_payments.setdefault(d["owner"] + cstr(d["posting_date"]), []).append(d.mode_of_payment)
 	return mode_of_payments
 
 
 def get_invoices(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""select a.name
+	return frappe.db.sql(
+		"""select a.name
 		from `tabSales Invoice` a
-		where a.docstatus = 1 and {conditions}""".format(conditions=conditions),
-		filters, as_dict=1)
+		where a.docstatus = 1 and {conditions}""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 
 def get_mode_of_payment_details(filters):
 	mode_of_payment_details = {}
 	invoice_list = get_invoices(filters)
-	invoice_list_names = ",".join('"' + invoice['name'] + '"' for invoice in invoice_list)
+	invoice_list_names = ",".join('"' + invoice["name"] + '"' for invoice in invoice_list)
 	if invoice_list:
-		inv_mop_detail = frappe.db.sql("""
+		inv_mop_detail = frappe.db.sql(
+			"""
 			select t.owner,
 			       t.posting_date,
 				   t.mode_of_payment,
@@ -232,24 +264,39 @@
 				group by a.owner, a.posting_date, mode_of_payment
 			) t
 			group by t.owner, t.posting_date, t.mode_of_payment
-			""".format(invoice_list_names=invoice_list_names), as_dict=1)
+			""".format(
+				invoice_list_names=invoice_list_names
+			),
+			as_dict=1,
+		)
 
-		inv_change_amount = frappe.db.sql("""select a.owner, a.posting_date,
+		inv_change_amount = frappe.db.sql(
+			"""select a.owner, a.posting_date,
 			ifnull(b.mode_of_payment, '') as mode_of_payment, sum(a.base_change_amount) as change_amount
 			from `tabSales Invoice` a, `tabSales Invoice Payment` b
 			where a.name = b.parent
 			and a.name in ({invoice_list_names})
 			and b.type = 'Cash'
 			and a.base_change_amount > 0
-			group by a.owner, a.posting_date, mode_of_payment""".format(invoice_list_names=invoice_list_names), as_dict=1)
+			group by a.owner, a.posting_date, mode_of_payment""".format(
+				invoice_list_names=invoice_list_names
+			),
+			as_dict=1,
+		)
 
 		for d in inv_change_amount:
 			for det in inv_mop_detail:
-				if det["owner"] == d["owner"] and det["posting_date"] == d["posting_date"] and det["mode_of_payment"] == d["mode_of_payment"]:
+				if (
+					det["owner"] == d["owner"]
+					and det["posting_date"] == d["posting_date"]
+					and det["mode_of_payment"] == d["mode_of_payment"]
+				):
 					paid_amount = det["paid_amount"] - d["change_amount"]
 					det["paid_amount"] = paid_amount
 
 		for d in inv_mop_detail:
-			mode_of_payment_details.setdefault(d["owner"]+cstr(d["posting_date"]), []).append((d.mode_of_payment,d.paid_amount))
+			mode_of_payment_details.setdefault(d["owner"] + cstr(d["posting_date"]), []).append(
+				(d.mode_of_payment, d.paid_amount)
+			)
 
 	return mode_of_payment_details
diff --git a/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py b/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py
index b3f6c72..3ad0ff2 100644
--- a/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py
+++ b/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py
@@ -15,6 +15,7 @@
 
 test_dependencies = ["Sales Invoice"]
 
+
 class TestSalesPaymentSummary(unittest.TestCase):
 	@classmethod
 	def setUpClass(self):
@@ -37,7 +38,7 @@
 			si.insert()
 			si.submit()
 
-			if int(si.name[-3:])%2 == 0:
+			if int(si.name[-3:]) % 2 == 0:
 				bank_account = "_Test Cash - _TC"
 				mode_of_payment = "Cash"
 			else:
@@ -52,18 +53,22 @@
 			pe.submit()
 
 		mop = get_mode_of_payments(filters)
-		self.assertTrue('Credit Card' in list(mop.values())[0])
-		self.assertTrue('Cash' in list(mop.values())[0])
+		self.assertTrue("Credit Card" in list(mop.values())[0])
+		self.assertTrue("Cash" in list(mop.values())[0])
 
 		# Cancel all Cash payment entry and check if this mode of payment is still fetched.
-		payment_entries = frappe.get_all("Payment Entry", filters={"mode_of_payment": "Cash", "docstatus": 1}, fields=["name", "docstatus"])
+		payment_entries = frappe.get_all(
+			"Payment Entry",
+			filters={"mode_of_payment": "Cash", "docstatus": 1},
+			fields=["name", "docstatus"],
+		)
 		for payment_entry in payment_entries:
 			pe = frappe.get_doc("Payment Entry", payment_entry.name)
 			pe.cancel()
 
 		mop = get_mode_of_payments(filters)
-		self.assertTrue('Credit Card' in list(mop.values())[0])
-		self.assertTrue('Cash' not in list(mop.values())[0])
+		self.assertTrue("Credit Card" in list(mop.values())[0])
+		self.assertTrue("Cash" not in list(mop.values())[0])
 
 	def test_get_mode_of_payments_details(self):
 		filters = get_filters()
@@ -73,7 +78,7 @@
 			si.insert()
 			si.submit()
 
-			if int(si.name[-3:])%2 == 0:
+			if int(si.name[-3:]) % 2 == 0:
 				bank_account = "_Test Cash - _TC"
 				mode_of_payment = "Cash"
 			else:
@@ -95,7 +100,11 @@
 				cc_init_amount = mopd_value[1]
 
 		# Cancel one Credit Card Payment Entry and check that it is not fetched in mode of payment details.
-		payment_entries = frappe.get_all("Payment Entry", filters={"mode_of_payment": "Credit Card", "docstatus": 1}, fields=["name", "docstatus"])
+		payment_entries = frappe.get_all(
+			"Payment Entry",
+			filters={"mode_of_payment": "Credit Card", "docstatus": 1},
+			fields=["name", "docstatus"],
+		)
 		for payment_entry in payment_entries[:1]:
 			pe = frappe.get_doc("Payment Entry", payment_entry.name)
 			pe.cancel()
@@ -108,63 +117,72 @@
 
 		self.assertTrue(cc_init_amount > cc_final_amount)
 
+
 def get_filters():
-	return {
-		"from_date": "1900-01-01",
-		"to_date": today(),
-		"company": "_Test Company"
-	}
+	return {"from_date": "1900-01-01", "to_date": today(), "company": "_Test Company"}
+
 
 def create_sales_invoice_record(qty=1):
 	# return sales invoice doc object
-	return frappe.get_doc({
-		"doctype": "Sales Invoice",
-		"customer": frappe.get_doc('Customer', {"customer_name": "Prestiga-Biz"}).name,
-		"company": '_Test Company',
-		"due_date": today(),
-		"posting_date": today(),
-		"currency": "INR",
-		"taxes_and_charges": "",
-		"debit_to": "Debtors - _TC",
-		"taxes": [],
-		"items": [{
-			'doctype': 'Sales Invoice Item',
-			'item_code': frappe.get_doc('Item', {'item_name': 'Consulting'}).name,
-			'qty': qty,
-			"rate": 10000,
-			'income_account': 'Sales - _TC',
-			'cost_center': 'Main - _TC',
-			'expense_account': 'Cost of Goods Sold - _TC'
-		}]
-	})
+	return frappe.get_doc(
+		{
+			"doctype": "Sales Invoice",
+			"customer": frappe.get_doc("Customer", {"customer_name": "Prestiga-Biz"}).name,
+			"company": "_Test Company",
+			"due_date": today(),
+			"posting_date": today(),
+			"currency": "INR",
+			"taxes_and_charges": "",
+			"debit_to": "Debtors - _TC",
+			"taxes": [],
+			"items": [
+				{
+					"doctype": "Sales Invoice Item",
+					"item_code": frappe.get_doc("Item", {"item_name": "Consulting"}).name,
+					"qty": qty,
+					"rate": 10000,
+					"income_account": "Sales - _TC",
+					"cost_center": "Main - _TC",
+					"expense_account": "Cost of Goods Sold - _TC",
+				}
+			],
+		}
+	)
+
 
 def create_records():
 	if frappe.db.exists("Customer", "Prestiga-Biz"):
 		return
 
-	#customer
-	frappe.get_doc({
-		"customer_group": "_Test Customer Group",
-		"customer_name": "Prestiga-Biz",
-		"customer_type": "Company",
-		"doctype": "Customer",
-		"territory": "_Test Territory"
-	}).insert()
+	# customer
+	frappe.get_doc(
+		{
+			"customer_group": "_Test Customer Group",
+			"customer_name": "Prestiga-Biz",
+			"customer_type": "Company",
+			"doctype": "Customer",
+			"territory": "_Test Territory",
+		}
+	).insert()
 
 	# item
-	item = frappe.get_doc({
-		"doctype": "Item",
-		"item_code": "Consulting",
-		"item_name": "Consulting",
-		"item_group": "All Item Groups",
-		"company": "_Test Company",
-		"is_stock_item": 0
-	}).insert()
+	item = frappe.get_doc(
+		{
+			"doctype": "Item",
+			"item_code": "Consulting",
+			"item_name": "Consulting",
+			"item_group": "All Item Groups",
+			"company": "_Test Company",
+			"is_stock_item": 0,
+		}
+	).insert()
 
 	# item price
-	frappe.get_doc({
-		"doctype": "Item Price",
-		"price_list": "Standard Selling",
-		"item_code": item.item_code,
-		"price_list_rate": 10000
-	}).insert()
+	frappe.get_doc(
+		{
+			"doctype": "Item Price",
+			"price_list": "Standard Selling",
+			"item_code": item.item_code,
+			"price_list_rate": 10000,
+		}
+	).insert()
diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py
index a9d0081..fc48dd2 100644
--- a/erpnext/accounts/report/sales_register/sales_register.py
+++ b/erpnext/accounts/report/sales_register/sales_register.py
@@ -16,11 +16,15 @@
 def execute(filters=None):
 	return _execute(filters)
 
+
 def _execute(filters, additional_table_columns=None, additional_query_columns=None):
-	if not filters: filters = frappe._dict({})
+	if not filters:
+		filters = frappe._dict({})
 
 	invoice_list = get_invoices(filters, additional_query_columns)
-	columns, income_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns(invoice_list, additional_table_columns)
+	columns, income_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns(
+		invoice_list, additional_table_columns
+	)
 
 	if not invoice_list:
 		msgprint(_("No record found"))
@@ -28,12 +32,13 @@
 
 	invoice_income_map = get_invoice_income_map(invoice_list)
 	internal_invoice_map = get_internal_invoice_map(invoice_list)
-	invoice_income_map, invoice_tax_map = get_invoice_tax_map(invoice_list,
-		invoice_income_map, income_accounts)
-	#Cost Center & Warehouse Map
+	invoice_income_map, invoice_tax_map = get_invoice_tax_map(
+		invoice_list, invoice_income_map, income_accounts
+	)
+	# Cost Center & Warehouse Map
 	invoice_cc_wh_map = get_invoice_cc_wh_map(invoice_list)
 	invoice_so_dn_map = get_invoice_so_dn_map(invoice_list)
-	company_currency = frappe.get_cached_value('Company',  filters.get("company"),  "default_currency")
+	company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
 	mode_of_payments = get_mode_of_payments([inv.name for inv in invoice_list])
 
 	data = []
@@ -45,33 +50,33 @@
 		warehouse = list(set(invoice_cc_wh_map.get(inv.name, {}).get("warehouse", [])))
 
 		row = {
-			'invoice': inv.name,
-			'posting_date': inv.posting_date,
-			'customer': inv.customer,
-			'customer_name': inv.customer_name
+			"invoice": inv.name,
+			"posting_date": inv.posting_date,
+			"customer": inv.customer,
+			"customer_name": inv.customer_name,
 		}
 
 		if additional_query_columns:
 			for col in additional_query_columns:
-				row.update({
-					col: inv.get(col)
-				})
+				row.update({col: inv.get(col)})
 
-		row.update({
-			'customer_group': inv.get("customer_group"),
-			'territory': inv.get("territory"),
-			'tax_id': inv.get("tax_id"),
-			'receivable_account': inv.debit_to,
-			'mode_of_payment':  ", ".join(mode_of_payments.get(inv.name, [])),
-			'project': inv.project,
-			'owner': inv.owner,
-			'remarks': inv.remarks,
-			'sales_order': ", ".join(sales_order),
-			'delivery_note': ", ".join(delivery_note),
-			'cost_center': ", ".join(cost_center),
-			'warehouse': ", ".join(warehouse),
-			'currency': company_currency
-		})
+		row.update(
+			{
+				"customer_group": inv.get("customer_group"),
+				"territory": inv.get("territory"),
+				"tax_id": inv.get("tax_id"),
+				"receivable_account": inv.debit_to,
+				"mode_of_payment": ", ".join(mode_of_payments.get(inv.name, [])),
+				"project": inv.project,
+				"owner": inv.owner,
+				"remarks": inv.remarks,
+				"sales_order": ", ".join(sales_order),
+				"delivery_note": ", ".join(delivery_note),
+				"cost_center": ", ".join(cost_center),
+				"warehouse": ", ".join(warehouse),
+				"currency": company_currency,
+			}
+		)
 
 		# map income values
 		base_net_total = 0
@@ -82,164 +87,138 @@
 				income_amount = flt(invoice_income_map.get(inv.name, {}).get(income_acc))
 
 			base_net_total += income_amount
-			row.update({
-				frappe.scrub(income_acc): income_amount
-			})
+			row.update({frappe.scrub(income_acc): income_amount})
 
 		# Add amount in unrealized account
 		for account in unrealized_profit_loss_accounts:
-			row.update({
-				frappe.scrub(account+"_unrealized"): flt(internal_invoice_map.get((inv.name, account)))
-			})
+			row.update(
+				{frappe.scrub(account + "_unrealized"): flt(internal_invoice_map.get((inv.name, account)))}
+			)
 
 		# net total
-		row.update({'net_total': base_net_total or inv.base_net_total})
+		row.update({"net_total": base_net_total or inv.base_net_total})
 
 		# tax account
 		total_tax = 0
 		for tax_acc in tax_accounts:
 			if tax_acc not in income_accounts:
-				tax_amount_precision = get_field_precision(frappe.get_meta("Sales Taxes and Charges").get_field("tax_amount"), currency=company_currency) or 2
+				tax_amount_precision = (
+					get_field_precision(
+						frappe.get_meta("Sales Taxes and Charges").get_field("tax_amount"), currency=company_currency
+					)
+					or 2
+				)
 				tax_amount = flt(invoice_tax_map.get(inv.name, {}).get(tax_acc), tax_amount_precision)
 				total_tax += tax_amount
-				row.update({
-					frappe.scrub(tax_acc): tax_amount
-				})
+				row.update({frappe.scrub(tax_acc): tax_amount})
 
 		# total tax, grand total, outstanding amount & rounded total
 
-		row.update({
-			'tax_total': total_tax,
-			'grand_total': inv.base_grand_total,
-			'rounded_total': inv.base_rounded_total,
-			'outstanding_amount': inv.outstanding_amount
-		})
+		row.update(
+			{
+				"tax_total": total_tax,
+				"grand_total": inv.base_grand_total,
+				"rounded_total": inv.base_rounded_total,
+				"outstanding_amount": inv.outstanding_amount,
+			}
+		)
 
 		data.append(row)
 
 	return columns, data
 
+
 def get_columns(invoice_list, additional_table_columns):
 	"""return columns based on filters"""
 	columns = [
 		{
-			'label': _("Invoice"),
-			'fieldname': 'invoice',
-			'fieldtype': 'Link',
-			'options': 'Sales Invoice',
-			'width': 120
+			"label": _("Invoice"),
+			"fieldname": "invoice",
+			"fieldtype": "Link",
+			"options": "Sales Invoice",
+			"width": 120,
 		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 80},
 		{
-			'label': _("Posting Date"),
-			'fieldname': 'posting_date',
-			'fieldtype': 'Date',
-			'width': 80
+			"label": _("Customer"),
+			"fieldname": "customer",
+			"fieldtype": "Link",
+			"options": "Customer",
+			"width": 120,
 		},
-		{
-			'label': _("Customer"),
-			'fieldname': 'customer',
-			'fieldtype': 'Link',
-			'options': 'Customer',
-			'width': 120
-		},
-		{
-			'label': _("Customer Name"),
-			'fieldname': 'customer_name',
-			'fieldtype': 'Data',
-			'width': 120
-		},
+		{"label": _("Customer Name"), "fieldname": "customer_name", "fieldtype": "Data", "width": 120},
 	]
 
 	if additional_table_columns:
 		columns += additional_table_columns
 
-	columns +=[
+	columns += [
 		{
-			'label': _("Customer Group"),
-			'fieldname': 'customer_group',
-			'fieldtype': 'Link',
-			'options': 'Customer Group',
-			'width': 120
+			"label": _("Customer Group"),
+			"fieldname": "customer_group",
+			"fieldtype": "Link",
+			"options": "Customer Group",
+			"width": 120,
 		},
 		{
-			'label': _("Territory"),
-			'fieldname': 'territory',
-			'fieldtype': 'Link',
-			'options': 'Territory',
-			'width': 80
+			"label": _("Territory"),
+			"fieldname": "territory",
+			"fieldtype": "Link",
+			"options": "Territory",
+			"width": 80,
+		},
+		{"label": _("Tax Id"), "fieldname": "tax_id", "fieldtype": "Data", "width": 120},
+		{
+			"label": _("Receivable Account"),
+			"fieldname": "receivable_account",
+			"fieldtype": "Link",
+			"options": "Account",
+			"width": 80,
 		},
 		{
-			'label': _("Tax Id"),
-			'fieldname': 'tax_id',
-			'fieldtype': 'Data',
-			'width': 120
-		},
-		{
-			'label': _("Receivable Account"),
-			'fieldname': 'receivable_account',
-			'fieldtype': 'Link',
-			'options': 'Account',
-			'width': 80
-		},
-		{
-			'label': _("Mode Of Payment"),
-			'fieldname': 'mode_of_payment',
-			'fieldtype': 'Data',
-			'width': 120
-		},
-		{
-			'label': _("Project"),
-			'fieldname': 'project',
-			'fieldtype': 'Link',
-			'options': 'Project',
-			'width': 80
-		},
-		{
-			'label': _("Owner"),
-			'fieldname': 'owner',
-			'fieldtype': 'Data',
-			'width': 150
-		},
-		{
-			'label': _("Remarks"),
-			'fieldname': 'remarks',
-			'fieldtype': 'Data',
-			'width': 150
-		},
-		{
-			'label': _("Sales Order"),
-			'fieldname': 'sales_order',
-			'fieldtype': 'Link',
-			'options': 'Sales Order',
-			'width': 100
-		},
-		{
-			'label': _("Delivery Note"),
-			'fieldname': 'delivery_note',
-			'fieldtype': 'Link',
-			'options': 'Delivery Note',
-			'width': 100
-		},
-		{
-			'label': _("Cost Center"),
-			'fieldname': 'cost_center',
-			'fieldtype': 'Link',
-			'options': 'Cost Center',
-			'width': 100
-		},
-		{
-			'label': _("Warehouse"),
-			'fieldname': 'warehouse',
-			'fieldtype': 'Link',
-			'options': 'Warehouse',
-			'width': 100
-		},
-		{
-			"fieldname": "currency",
-			"label": _("Currency"),
+			"label": _("Mode Of Payment"),
+			"fieldname": "mode_of_payment",
 			"fieldtype": "Data",
-			"width": 80
-		}
+			"width": 120,
+		},
+		{
+			"label": _("Project"),
+			"fieldname": "project",
+			"fieldtype": "Link",
+			"options": "Project",
+			"width": 80,
+		},
+		{"label": _("Owner"), "fieldname": "owner", "fieldtype": "Data", "width": 150},
+		{"label": _("Remarks"), "fieldname": "remarks", "fieldtype": "Data", "width": 150},
+		{
+			"label": _("Sales Order"),
+			"fieldname": "sales_order",
+			"fieldtype": "Link",
+			"options": "Sales Order",
+			"width": 100,
+		},
+		{
+			"label": _("Delivery Note"),
+			"fieldname": "delivery_note",
+			"fieldtype": "Link",
+			"options": "Delivery Note",
+			"width": 100,
+		},
+		{
+			"label": _("Cost Center"),
+			"fieldname": "cost_center",
+			"fieldtype": "Link",
+			"options": "Cost Center",
+			"width": 100,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 100,
+		},
+		{"fieldname": "currency", "label": _("Currency"), "fieldtype": "Data", "width": 80},
 	]
 
 	income_accounts = []
@@ -250,106 +229,135 @@
 	unrealized_profit_loss_account_columns = []
 
 	if invoice_list:
-		income_accounts = frappe.db.sql_list("""select distinct income_account
+		income_accounts = frappe.db.sql_list(
+			"""select distinct income_account
 			from `tabSales Invoice Item` where docstatus = 1 and parent in (%s)
-			order by income_account""" %
-			', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list))
+			order by income_account"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple(inv.name for inv in invoice_list),
+		)
 
-		tax_accounts = 	frappe.db.sql_list("""select distinct account_head
+		tax_accounts = frappe.db.sql_list(
+			"""select distinct account_head
 			from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice'
 			and docstatus = 1 and base_tax_amount_after_discount_amount != 0
-			and parent in (%s) order by account_head""" %
-			', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list))
+			and parent in (%s) order by account_head"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple(inv.name for inv in invoice_list),
+		)
 
-		unrealized_profit_loss_accounts = frappe.db.sql_list("""SELECT distinct unrealized_profit_loss_account
+		unrealized_profit_loss_accounts = frappe.db.sql_list(
+			"""SELECT distinct unrealized_profit_loss_account
 			from `tabSales Invoice` where docstatus = 1 and name in (%s)
 			and is_internal_customer = 1
 			and ifnull(unrealized_profit_loss_account, '') != ''
-			order by unrealized_profit_loss_account""" %
-			', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list))
+			order by unrealized_profit_loss_account"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple(inv.name for inv in invoice_list),
+		)
 
 	for account in income_accounts:
-		income_columns.append({
-			"label": account,
-			"fieldname": frappe.scrub(account),
-			"fieldtype": "Currency",
-			"options": "currency",
-			"width": 120
-		})
-
-	for account in tax_accounts:
-		if account not in income_accounts:
-			tax_columns.append({
+		income_columns.append(
+			{
 				"label": account,
 				"fieldname": frappe.scrub(account),
 				"fieldtype": "Currency",
 				"options": "currency",
-				"width": 120
-			})
+				"width": 120,
+			}
+		)
+
+	for account in tax_accounts:
+		if account not in income_accounts:
+			tax_columns.append(
+				{
+					"label": account,
+					"fieldname": frappe.scrub(account),
+					"fieldtype": "Currency",
+					"options": "currency",
+					"width": 120,
+				}
+			)
 
 	for account in unrealized_profit_loss_accounts:
-		unrealized_profit_loss_account_columns.append({
-			"label": account,
-			"fieldname": frappe.scrub(account+"_unrealized"),
+		unrealized_profit_loss_account_columns.append(
+			{
+				"label": account,
+				"fieldname": frappe.scrub(account + "_unrealized"),
+				"fieldtype": "Currency",
+				"options": "currency",
+				"width": 120,
+			}
+		)
+
+	net_total_column = [
+		{
+			"label": _("Net Total"),
+			"fieldname": "net_total",
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
-		})
-
-	net_total_column = [{
-		"label": _("Net Total"),
-		"fieldname": "net_total",
-		"fieldtype": "Currency",
-		"options": "currency",
-		"width": 120
-	}]
+			"width": 120,
+		}
+	]
 
 	total_columns = [
 		{
 			"label": _("Tax Total"),
 			"fieldname": "tax_total",
 			"fieldtype": "Currency",
-			"options": 'currency',
-			"width": 120
+			"options": "currency",
+			"width": 120,
 		},
 		{
 			"label": _("Grand Total"),
 			"fieldname": "grand_total",
 			"fieldtype": "Currency",
-			"options": 'currency',
-			"width": 120
+			"options": "currency",
+			"width": 120,
 		},
 		{
 			"label": _("Rounded Total"),
 			"fieldname": "rounded_total",
 			"fieldtype": "Currency",
-			"options": 'currency',
-			"width": 120
+			"options": "currency",
+			"width": 120,
 		},
 		{
 			"label": _("Outstanding Amount"),
 			"fieldname": "outstanding_amount",
 			"fieldtype": "Currency",
-			"options": 'currency',
-			"width": 120
-		}
+			"options": "currency",
+			"width": 120,
+		},
 	]
 
-	columns = columns + income_columns + unrealized_profit_loss_account_columns + \
-		net_total_column + tax_columns + total_columns
+	columns = (
+		columns
+		+ income_columns
+		+ unrealized_profit_loss_account_columns
+		+ net_total_column
+		+ tax_columns
+		+ total_columns
+	)
 
 	return columns, income_accounts, tax_accounts, unrealized_profit_loss_accounts
 
+
 def get_conditions(filters):
 	conditions = ""
 
-	if filters.get("company"): conditions += " and company=%(company)s"
-	if filters.get("customer"): conditions += " and customer = %(customer)s"
+	if filters.get("company"):
+		conditions += " and company=%(company)s"
+	if filters.get("customer"):
+		conditions += " and customer = %(customer)s"
 
-	if filters.get("from_date"): conditions += " and posting_date >= %(from_date)s"
-	if filters.get("to_date"): conditions += " and posting_date <= %(to_date)s"
+	if filters.get("from_date"):
+		conditions += " and posting_date >= %(from_date)s"
+	if filters.get("to_date"):
+		conditions += " and posting_date <= %(to_date)s"
 
-	if filters.get("owner"): conditions += " and owner = %(owner)s"
+	if filters.get("owner"):
+		conditions += " and owner = %(owner)s"
 
 	if filters.get("mode_of_payment"):
 		conditions += """ and exists(select name from `tabSales Invoice Payment`
@@ -357,22 +365,22 @@
 			 	and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
 
 	if filters.get("cost_center"):
-		conditions +=  """ and exists(select name from `tabSales Invoice Item`
+		conditions += """ and exists(select name from `tabSales Invoice Item`
 			 where parent=`tabSales Invoice`.name
 			 	and ifnull(`tabSales Invoice Item`.cost_center, '') = %(cost_center)s)"""
 
 	if filters.get("warehouse"):
-		conditions +=  """ and exists(select name from `tabSales Invoice Item`
+		conditions += """ and exists(select name from `tabSales Invoice Item`
 			 where parent=`tabSales Invoice`.name
 			 	and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s)"""
 
 	if filters.get("brand"):
-		conditions +=  """ and exists(select name from `tabSales Invoice Item`
+		conditions += """ and exists(select name from `tabSales Invoice Item`
 			 where parent=`tabSales Invoice`.name
 			 	and ifnull(`tabSales Invoice Item`.brand, '') = %(brand)s)"""
 
 	if filters.get("item_group"):
-		conditions +=  """ and exists(select name from `tabSales Invoice Item`
+		conditions += """ and exists(select name from `tabSales Invoice Item`
 			 where parent=`tabSales Invoice`.name
 			 	and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s)"""
 
@@ -385,34 +393,53 @@
 			"""
 		for dimension in accounting_dimensions:
 			if filters.get(dimension.fieldname):
-				if frappe.get_cached_value('DocType', dimension.document_type, 'is_tree'):
-					filters[dimension.fieldname] = get_dimension_with_children(dimension.document_type,
-						filters.get(dimension.fieldname))
+				if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"):
+					filters[dimension.fieldname] = get_dimension_with_children(
+						dimension.document_type, filters.get(dimension.fieldname)
+					)
 
-					conditions += common_condition + "and ifnull(`tabSales Invoice Item`.{0}, '') in %({0})s)".format(dimension.fieldname)
+					conditions += (
+						common_condition
+						+ "and ifnull(`tabSales Invoice Item`.{0}, '') in %({0})s)".format(dimension.fieldname)
+					)
 				else:
-					conditions += common_condition + "and ifnull(`tabSales Invoice Item`.{0}, '') in (%({0})s))".format(dimension.fieldname)
+					conditions += (
+						common_condition
+						+ "and ifnull(`tabSales Invoice Item`.{0}, '') in (%({0})s))".format(dimension.fieldname)
+					)
 
 	return conditions
 
+
 def get_invoices(filters, additional_query_columns):
 	if additional_query_columns:
-		additional_query_columns = ', ' + ', '.join(additional_query_columns)
+		additional_query_columns = ", " + ", ".join(additional_query_columns)
 
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select name, posting_date, debit_to, project, customer,
 		customer_name, owner, remarks, territory, tax_id, customer_group,
 		base_net_total, base_grand_total, base_rounded_total, outstanding_amount,
 		is_internal_customer, represents_company, company {0}
 		from `tabSales Invoice`
-		where docstatus = 1 %s order by posting_date desc, name desc""".format(additional_query_columns or '') %
-		conditions, filters, as_dict=1)
+		where docstatus = 1 %s order by posting_date desc, name desc""".format(
+			additional_query_columns or ""
+		)
+		% conditions,
+		filters,
+		as_dict=1,
+	)
+
 
 def get_invoice_income_map(invoice_list):
-	income_details = frappe.db.sql("""select parent, income_account, sum(base_net_amount) as amount
-		from `tabSales Invoice Item` where parent in (%s) group by parent, income_account""" %
-		', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+	income_details = frappe.db.sql(
+		"""select parent, income_account, sum(base_net_amount) as amount
+		from `tabSales Invoice Item` where parent in (%s) group by parent, income_account"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_income_map = {}
 	for d in income_details:
@@ -421,11 +448,16 @@
 
 	return invoice_income_map
 
+
 def get_internal_invoice_map(invoice_list):
-	unrealized_amount_details = frappe.db.sql("""SELECT name, unrealized_profit_loss_account,
+	unrealized_amount_details = frappe.db.sql(
+		"""SELECT name, unrealized_profit_loss_account,
 		base_net_total as amount from `tabSales Invoice` where name in (%s)
-		and is_internal_customer = 1 and company = represents_company""" %
-		', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+		and is_internal_customer = 1 and company = represents_company"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	internal_invoice_map = {}
 	for d in unrealized_amount_details:
@@ -434,11 +466,16 @@
 
 	return internal_invoice_map
 
+
 def get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts):
-	tax_details = frappe.db.sql("""select parent, account_head,
+	tax_details = frappe.db.sql(
+		"""select parent, account_head,
 		sum(base_tax_amount_after_discount_amount) as tax_amount
-		from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head""" %
-		', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+		from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_tax_map = {}
 	for d in tax_details:
@@ -453,54 +490,77 @@
 
 	return invoice_income_map, invoice_tax_map
 
+
 def get_invoice_so_dn_map(invoice_list):
-	si_items = frappe.db.sql("""select parent, sales_order, delivery_note, so_detail
+	si_items = frappe.db.sql(
+		"""select parent, sales_order, delivery_note, so_detail
 		from `tabSales Invoice Item` where parent in (%s)
-		and (ifnull(sales_order, '') != '' or ifnull(delivery_note, '') != '')""" %
-		', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+		and (ifnull(sales_order, '') != '' or ifnull(delivery_note, '') != '')"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_so_dn_map = {}
 	for d in si_items:
 		if d.sales_order:
-			invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"sales_order", []).append(d.sales_order)
+			invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault("sales_order", []).append(
+				d.sales_order
+			)
 
 		delivery_note_list = None
 		if d.delivery_note:
 			delivery_note_list = [d.delivery_note]
 		elif d.sales_order:
-			delivery_note_list = frappe.db.sql_list("""select distinct parent from `tabDelivery Note Item`
-				where docstatus=1 and so_detail=%s""", d.so_detail)
+			delivery_note_list = frappe.db.sql_list(
+				"""select distinct parent from `tabDelivery Note Item`
+				where docstatus=1 and so_detail=%s""",
+				d.so_detail,
+			)
 
 		if delivery_note_list:
-			invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault("delivery_note", delivery_note_list)
+			invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault(
+				"delivery_note", delivery_note_list
+			)
 
 	return invoice_so_dn_map
 
+
 def get_invoice_cc_wh_map(invoice_list):
-	si_items = frappe.db.sql("""select parent, cost_center, warehouse
+	si_items = frappe.db.sql(
+		"""select parent, cost_center, warehouse
 		from `tabSales Invoice Item` where parent in (%s)
-		and (ifnull(cost_center, '') != '' or ifnull(warehouse, '') != '')""" %
-		', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1)
+		and (ifnull(cost_center, '') != '' or ifnull(warehouse, '') != '')"""
+		% ", ".join(["%s"] * len(invoice_list)),
+		tuple(inv.name for inv in invoice_list),
+		as_dict=1,
+	)
 
 	invoice_cc_wh_map = {}
 	for d in si_items:
 		if d.cost_center:
-			invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"cost_center", []).append(d.cost_center)
+			invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault("cost_center", []).append(
+				d.cost_center
+			)
 
 		if d.warehouse:
-			invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"warehouse", []).append(d.warehouse)
+			invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault("warehouse", []).append(
+				d.warehouse
+			)
 
 	return invoice_cc_wh_map
 
+
 def get_mode_of_payments(invoice_list):
 	mode_of_payments = {}
 	if invoice_list:
-		inv_mop = frappe.db.sql("""select parent, mode_of_payment
-			from `tabSales Invoice Payment` where parent in (%s) group by parent, mode_of_payment""" %
-			', '.join(['%s']*len(invoice_list)), tuple(invoice_list), as_dict=1)
+		inv_mop = frappe.db.sql(
+			"""select parent, mode_of_payment
+			from `tabSales Invoice Payment` where parent in (%s) group by parent, mode_of_payment"""
+			% ", ".join(["%s"] * len(invoice_list)),
+			tuple(invoice_list),
+			as_dict=1,
+		)
 
 		for d in inv_mop:
 			mode_of_payments.setdefault(d.parent, []).append(d.mode_of_payment)
diff --git a/erpnext/accounts/report/share_balance/share_balance.py b/erpnext/accounts/report/share_balance/share_balance.py
index 943c4e1..d02f53b 100644
--- a/erpnext/accounts/report/share_balance/share_balance.py
+++ b/erpnext/accounts/report/share_balance/share_balance.py
@@ -7,7 +7,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if not filters.get("date"):
 		frappe.throw(_("Please select date"))
@@ -38,22 +39,29 @@
 					break
 			# new entry
 			if not row:
-				row = [filters.get("shareholder"),
-					share_entry.share_type, share_entry.no_of_shares, share_entry.rate, share_entry.amount]
+				row = [
+					filters.get("shareholder"),
+					share_entry.share_type,
+					share_entry.no_of_shares,
+					share_entry.rate,
+					share_entry.amount,
+				]
 
 				data.append(row)
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		_("Shareholder") + ":Link/Shareholder:150",
 		_("Share Type") + "::90",
 		_("No of Shares") + "::90",
 		_("Average Rate") + ":Currency:90",
-		_("Amount") + ":Currency:90"
+		_("Amount") + ":Currency:90",
 	]
 	return columns
 
+
 def get_all_shares(shareholder):
-	return frappe.get_doc('Shareholder', shareholder).share_balance
+	return frappe.get_doc("Shareholder", shareholder).share_balance
diff --git a/erpnext/accounts/report/share_ledger/share_ledger.py b/erpnext/accounts/report/share_ledger/share_ledger.py
index b3ff6e4..d6c3bd0 100644
--- a/erpnext/accounts/report/share_ledger/share_ledger.py
+++ b/erpnext/accounts/report/share_ledger/share_ledger.py
@@ -7,7 +7,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if not filters.get("date"):
 		frappe.throw(_("Please select date"))
@@ -23,19 +24,28 @@
 	else:
 		transfers = get_all_transfers(date, filters.get("shareholder"))
 		for transfer in transfers:
-			if transfer.transfer_type == 'Transfer':
+			if transfer.transfer_type == "Transfer":
 				if transfer.from_shareholder == filters.get("shareholder"):
-					transfer.transfer_type += ' to {}'.format(transfer.to_shareholder)
+					transfer.transfer_type += " to {}".format(transfer.to_shareholder)
 				else:
-					transfer.transfer_type += ' from {}'.format(transfer.from_shareholder)
-			row = [filters.get("shareholder"), transfer.date, transfer.transfer_type,
-				transfer.share_type, transfer.no_of_shares, transfer.rate, transfer.amount,
-				transfer.company, transfer.name]
+					transfer.transfer_type += " from {}".format(transfer.from_shareholder)
+			row = [
+				filters.get("shareholder"),
+				transfer.date,
+				transfer.transfer_type,
+				transfer.share_type,
+				transfer.no_of_shares,
+				transfer.rate,
+				transfer.amount,
+				transfer.company,
+				transfer.name,
+			]
 
 			data.append(row)
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		_("Shareholder") + ":Link/Shareholder:150",
@@ -46,16 +56,22 @@
 		_("Rate") + ":Currency:90",
 		_("Amount") + ":Currency:90",
 		_("Company") + "::150",
-		_("Share Transfer") + ":Link/Share Transfer:90"
+		_("Share Transfer") + ":Link/Share Transfer:90",
 	]
 	return columns
 
+
 def get_all_transfers(date, shareholder):
-	condition = ' '
+	condition = " "
 	# if company:
 	# 	condition = 'AND company = %(company)s '
-	return frappe.db.sql("""SELECT * FROM `tabShare Transfer`
+	return frappe.db.sql(
+		"""SELECT * FROM `tabShare Transfer`
 		WHERE (DATE(date) <= %(date)s AND from_shareholder = %(shareholder)s {condition})
 		OR (DATE(date) <= %(date)s AND to_shareholder = %(shareholder)s {condition})
-		ORDER BY date""".format(condition=condition),
-		{'date': date, 'shareholder': shareholder}, as_dict=1)
+		ORDER BY date""".format(
+			condition=condition
+		),
+		{"date": date, "shareholder": shareholder},
+		as_dict=1,
+	)
diff --git a/erpnext/accounts/report/tax_detail/tax_detail.py b/erpnext/accounts/report/tax_detail/tax_detail.py
index eeb8483..ba8d307 100644
--- a/erpnext/accounts/report/tax_detail/tax_detail.py
+++ b/erpnext/accounts/report/tax_detail/tax_detail.py
@@ -15,7 +15,13 @@
 	("GL Entry", 1): ["posting_date"],
 	("Account",): ["root_type", "account_type"],
 	("GL Entry", 2): ["account", "voucher_type", "voucher_no", "debit", "credit"],
-	("Purchase Invoice Item", "Sales Invoice Item"): ["base_net_amount", "item_tax_rate", "item_tax_template", "item_group", "item_name"],
+	("Purchase Invoice Item", "Sales Invoice Item"): [
+		"base_net_amount",
+		"item_tax_rate",
+		"item_tax_template",
+		"item_group",
+		"item_name",
+	],
 	("Purchase Invoice", "Sales Invoice"): ["taxes_and_charges", "tax_category"],
 }
 
@@ -27,7 +33,8 @@
 	fieldlist = required_sql_fields
 	fieldstr = get_fieldstr(fieldlist)
 
-	gl_entries = frappe.db.sql("""
+	gl_entries = frappe.db.sql(
+		"""
 		select {fieldstr}
 		from `tabGL Entry` ge
 		inner join `tabAccount` a on
@@ -45,61 +52,73 @@
 			ge.posting_date>=%(from_date)s and
 			ge.posting_date<=%(to_date)s
 		order by ge.posting_date, ge.voucher_no
-		""".format(fieldstr=fieldstr), filters, as_dict=1)
+		""".format(
+			fieldstr=fieldstr
+		),
+		filters,
+		as_dict=1,
+	)
 
 	report_data = modify_report_data(gl_entries)
 	summary = None
-	if filters['mode'] == 'run' and filters['report_name'] != 'Tax Detail':
-		report_data, summary = run_report(filters['report_name'], report_data)
+	if filters["mode"] == "run" and filters["report_name"] != "Tax Detail":
+		report_data, summary = run_report(filters["report_name"], report_data)
 
 	# return columns, data, message, chart, report_summary
 	return get_columns(fieldlist), report_data, None, None, summary
 
+
 def run_report(report_name, data):
 	"Applies the sections and filters saved in the custom report"
-	report_config = json.loads(frappe.get_doc('Report', report_name).json)
+	report_config = json.loads(frappe.get_doc("Report", report_name).json)
 	# Columns indexed from 1 wrt colno
-	columns = report_config.get('columns')
-	sections = report_config.get('sections', {})
-	show_detail = report_config.get('show_detail', 1)
+	columns = report_config.get("columns")
+	sections = report_config.get("sections", {})
+	show_detail = report_config.get("show_detail", 1)
 	report = {}
 	new_data = []
 	summary = []
 	for section_name, section in sections.items():
-		report[section_name] = {'rows': [], 'subtotal': 0.0}
+		report[section_name] = {"rows": [], "subtotal": 0.0}
 		for component_name, component in section.items():
-			if component['type'] == 'filter':
+			if component["type"] == "filter":
 				for row in data:
 					matched = True
-					for colno, filter_string in component['filters'].items():
-						filter_field = columns[int(colno) - 1]['fieldname']
+					for colno, filter_string in component["filters"].items():
+						filter_field = columns[int(colno) - 1]["fieldname"]
 						if not filter_match(row[filter_field], filter_string):
 							matched = False
 							break
 					if matched:
-						report[section_name]['rows'] += [row]
-						report[section_name]['subtotal'] += row['amount']
-			if component['type'] == 'section':
+						report[section_name]["rows"] += [row]
+						report[section_name]["subtotal"] += row["amount"]
+			if component["type"] == "section":
 				if component_name == section_name:
 					frappe.throw(_("A report component cannot refer to its parent section") + ": " + section_name)
 				try:
-					report[section_name]['rows'] += report[component_name]['rows']
-					report[section_name]['subtotal'] += report[component_name]['subtotal']
+					report[section_name]["rows"] += report[component_name]["rows"]
+					report[section_name]["subtotal"] += report[component_name]["subtotal"]
 				except KeyError:
-					frappe.throw(_("A report component can only refer to an earlier section") + ": " + section_name)
+					frappe.throw(
+						_("A report component can only refer to an earlier section") + ": " + section_name
+					)
 
 		if show_detail:
-			new_data += report[section_name]['rows']
-		new_data += [{'voucher_no': section_name, 'amount': report[section_name]['subtotal']}]
-		summary += [{'label': section_name, 'datatype': 'Currency', 'value': report[section_name]['subtotal']}]
+			new_data += report[section_name]["rows"]
+		new_data += [{"voucher_no": section_name, "amount": report[section_name]["subtotal"]}]
+		summary += [
+			{"label": section_name, "datatype": "Currency", "value": report[section_name]["subtotal"]}
+		]
 		if show_detail:
 			new_data += [{}]
 	return new_data or data, summary or None
 
+
 def filter_match(value, string):
 	"Approximation to datatable filters"
 	import datetime
-	if string == '':
+
+	if string == "":
 		return True
 	if value is None:
 		value = -999999999999999
@@ -109,64 +128,68 @@
 	if isinstance(value, str):
 		value = value.lower()
 		string = string.lower()
-		if string[0] == '<':
+		if string[0] == "<":
 			return True if string[1:].strip() else False
-		elif string[0] == '>':
+		elif string[0] == ">":
 			return False if string[1:].strip() else True
-		elif string[0] == '=':
+		elif string[0] == "=":
 			return string[1:] in value if string[1:] else False
-		elif string[0:2] == '!=':
+		elif string[0:2] == "!=":
 			return string[2:] not in value
-		elif len(string.split(':')) == 2:
-			pre, post = string.split(':')
-			return (True if not pre.strip() and post.strip() in value else False)
+		elif len(string.split(":")) == 2:
+			pre, post = string.split(":")
+			return True if not pre.strip() and post.strip() in value else False
 		else:
 			return string in value
 	else:
-		if string[0] in ['<', '>', '=']:
+		if string[0] in ["<", ">", "="]:
 			operator = string[0]
-			if operator == '=':
-				operator = '=='
+			if operator == "=":
+				operator = "=="
 			string = string[1:].strip()
-		elif string[0:2] == '!=':
-			operator = '!='
+		elif string[0:2] == "!=":
+			operator = "!="
 			string = string[2:].strip()
-		elif len(string.split(':')) == 2:
-			pre, post = string.split(':')
+		elif len(string.split(":")) == 2:
+			pre, post = string.split(":")
 			try:
-				return (True if float(pre) <= value and float(post) >= value else False)
+				return True if float(pre) <= value and float(post) >= value else False
 			except ValueError:
-				return (False if pre.strip() else True)
+				return False if pre.strip() else True
 		else:
 			return string in str(value)
 
 	try:
 		num = float(string) if string.strip() else 0
-		return frappe.safe_eval(f'{value} {operator} {num}')
+		return frappe.safe_eval(f"{value} {operator} {num}")
 	except ValueError:
-		if operator == '<':
+		if operator == "<":
 			return True
 		return False
 
 
 def abbrev(dt):
-	return ''.join(l[0].lower() for l in dt.split(' ')) + '.'
+	return "".join(l[0].lower() for l in dt.split(" ")) + "."
+
 
 def doclist(dt, dfs):
 	return [abbrev(dt) + f for f in dfs]
 
+
 def as_split(fields):
 	for field in fields:
-		split = field.split(' as ')
+		split = field.split(" as ")
 		yield (split[0], split[1] if len(split) > 1 else split[0])
 
+
 def coalesce(doctypes, fields):
 	coalesce = []
 	for name, new_name in as_split(fields):
-		sharedfields = ', '.join(abbrev(dt) + name for dt in doctypes)
-		coalesce += [f'coalesce({sharedfields}) as {new_name}']
+		sharedfields = ", ".join(abbrev(dt) + name for dt in doctypes)
+		coalesce += [f"coalesce({sharedfields}) as {new_name}"]
 	return coalesce
 
+
 def get_fieldstr(fieldlist):
 	fields = []
 	for doctypes, docfields in fieldlist.items():
@@ -174,7 +197,8 @@
 			fields += doclist(doctypes[0], docfields)
 		else:
 			fields += coalesce(doctypes, docfields)
-	return ', '.join(fields)
+	return ", ".join(fields)
+
 
 def get_columns(fieldlist):
 	columns = {}
@@ -186,14 +210,14 @@
 			meta = frappe.get_meta(doctype)
 			# get column field metadata from the db
 			fieldmeta = {}
-			for field in meta.get('fields'):
+			for field in meta.get("fields"):
 				if field.fieldname in fieldmap.keys():
 					new_name = fieldmap[field.fieldname]
 					fieldmeta[new_name] = {
 						"label": _(field.label),
 						"fieldname": new_name,
 						"fieldtype": field.fieldtype,
-						"options": field.options
+						"options": field.options,
 					}
 			# edit the columns to match the modified data
 			for field in fieldmap.values():
@@ -203,6 +227,7 @@
 	# use of a dict ensures duplicate columns are removed
 	return list(columns.values())
 
+
 def modify_report_columns(doctype, field, column):
 	"Because data is rearranged into other columns"
 	if doctype in ["Sales Invoice Item", "Purchase Invoice Item"]:
@@ -216,8 +241,10 @@
 		column.update({"label": _("Taxes and Charges Template")})
 	return column
 
+
 def modify_report_data(data):
 	import json
+
 	new_data = []
 	for line in data:
 		if line.debit:
@@ -249,39 +276,37 @@
 # JS client utilities
 
 custom_report_dict = {
-	'ref_doctype': 'GL Entry',
-	'report_type': 'Custom Report',
-	'reference_report': 'Tax Detail'
+	"ref_doctype": "GL Entry",
+	"report_type": "Custom Report",
+	"reference_report": "Tax Detail",
 }
 
+
 @frappe.whitelist()
 def get_custom_reports(name=None):
 	filters = custom_report_dict.copy()
 	if name:
-		filters['name'] = name
-	reports = frappe.get_list('Report',
-		filters = filters,
-		fields = ['name', 'json'],
-		as_list=False
-	)
-	reports_dict = {rep.pop('name'): rep for rep in reports}
+		filters["name"] = name
+	reports = frappe.get_list("Report", filters=filters, fields=["name", "json"], as_list=False)
+	reports_dict = {rep.pop("name"): rep for rep in reports}
 	# Prevent custom reports with the same name
-	reports_dict['Tax Detail'] = {'json': None}
+	reports_dict["Tax Detail"] = {"json": None}
 	return reports_dict
 
+
 @frappe.whitelist()
 def save_custom_report(reference_report, report_name, data):
-	if reference_report != 'Tax Detail':
+	if reference_report != "Tax Detail":
 		frappe.throw(_("The wrong report is referenced."))
-	if report_name == 'Tax Detail':
+	if report_name == "Tax Detail":
 		frappe.throw(_("The parent report cannot be overwritten."))
 
 	doc = {
-		'doctype': 'Report',
-		'report_name': report_name,
-		'is_standard': 'No',
-		'module': 'Accounts',
-		'json': data
+		"doctype": "Report",
+		"report_name": report_name,
+		"is_standard": "No",
+		"module": "Accounts",
+		"json": data,
 	}
 	doc.update(custom_report_dict)
 
@@ -290,7 +315,7 @@
 		newdoc.insert()
 		frappe.msgprint(_("Report created successfully"))
 	except frappe.exceptions.DuplicateEntryError:
-		dbdoc = frappe.get_doc('Report', report_name)
+		dbdoc = frappe.get_doc("Report", report_name)
 		dbdoc.update(doc)
 		dbdoc.save()
 		frappe.msgprint(_("Report updated successfully"))
diff --git a/erpnext/accounts/report/tax_detail/test_tax_detail.py b/erpnext/accounts/report/tax_detail/test_tax_detail.py
index 621de82..869f245 100644
--- a/erpnext/accounts/report/tax_detail/test_tax_detail.py
+++ b/erpnext/accounts/report/tax_detail/test_tax_detail.py
@@ -19,8 +19,9 @@
 class TestTaxDetail(unittest.TestCase):
 	def load_testdocs(self):
 		from erpnext.accounts.utils import FiscalYearError, get_fiscal_year
+
 		datapath, _ = os.path.splitext(os.path.realpath(__file__))
-		with open(datapath + '.json', 'r') as fp:
+		with open(datapath + ".json", "r") as fp:
 			docs = json.load(fp)
 
 		now = getdate()
@@ -30,32 +31,38 @@
 		try:
 			get_fiscal_year(now, company="_T")
 		except FiscalYearError:
-			docs = [{
-				"companies": [{
-					"company": "_T",
-					"parent": "_Test Fiscal",
-					"parentfield": "companies",
-					"parenttype": "Fiscal Year"
-				}],
-				"doctype": "Fiscal Year",
-				"year": "_Test Fiscal",
-				"year_end_date": get_year_ending(now),
-				"year_start_date": get_year_start(now)
-			}] + docs
+			docs = [
+				{
+					"companies": [
+						{
+							"company": "_T",
+							"parent": "_Test Fiscal",
+							"parentfield": "companies",
+							"parenttype": "Fiscal Year",
+						}
+					],
+					"doctype": "Fiscal Year",
+					"year": "_Test Fiscal",
+					"year_end_date": get_year_ending(now),
+					"year_start_date": get_year_start(now),
+				}
+			] + docs
 
-		docs = [{
-			"abbr": "_T",
-			"company_name": "_T",
-			"country": "United Kingdom",
-			"default_currency": "GBP",
-			"doctype": "Company",
-			"name": "_T"
-		}] + docs
+		docs = [
+			{
+				"abbr": "_T",
+				"company_name": "_T",
+				"country": "United Kingdom",
+				"default_currency": "GBP",
+				"doctype": "Company",
+				"name": "_T",
+			}
+		] + docs
 
 		for doc in docs:
 			try:
 				db_doc = frappe.get_doc(doc)
-				if 'Invoice' in db_doc.doctype:
+				if "Invoice" in db_doc.doctype:
 					db_doc.due_date = add_to_date(now, days=1)
 					db_doc.insert()
 					# Create GL Entries:
@@ -66,119 +73,141 @@
 				pass
 
 	def load_defcols(self):
-		self.company = frappe.get_doc('Company', '_T')
-		custom_report = frappe.get_doc('Report', 'Tax Detail')
+		self.company = frappe.get_doc("Company", "_T")
+		custom_report = frappe.get_doc("Report", "Tax Detail")
 		self.default_columns, _ = custom_report.run_query_report(
 			filters={
-				'from_date': '2021-03-01',
-				'to_date': '2021-03-31',
-				'company': self.company.name,
-				'mode': 'run',
-				'report_name': 'Tax Detail'
-			}, user=frappe.session.user)
+				"from_date": "2021-03-01",
+				"to_date": "2021-03-31",
+				"company": self.company.name,
+				"mode": "run",
+				"report_name": "Tax Detail",
+			},
+			user=frappe.session.user,
+		)
 
 	def rm_testdocs(self):
 		"Remove the Company and all data"
 		from erpnext.setup.doctype.company.company import create_transaction_deletion_request
+
 		create_transaction_deletion_request(self.company.name)
 
 	def test_report(self):
 		self.load_testdocs()
 		self.load_defcols()
 		report_name = save_custom_report(
-			'Tax Detail',
-			'_Test Tax Detail',
-			json.dumps({
-				'columns': self.default_columns,
-				'sections': {
-					'Box1':{'Filter0':{'type':'filter','filters':{'4':'VAT on Sales'}}},
-					'Box2':{'Filter0':{'type':'filter','filters':{'4':'Acquisition'}}},
-					'Box3':{'Box1':{'type':'section'},'Box2':{'type':'section'}},
-					'Box4':{'Filter0':{'type':'filter','filters':{'4':'VAT on Purchases'}}},
-					'Box5':{'Box3':{'type':'section'},'Box4':{'type':'section'}},
-					'Box6':{'Filter0':{'type':'filter','filters':{'3':'!=Tax','4':'Sales'}}},
-					'Box7':{'Filter0':{'type':'filter','filters':{'2':'Expense','3':'!=Tax'}}},
-					'Box8':{'Filter0':{'type':'filter','filters':{'3':'!=Tax','4':'Sales','12':'EU'}}},
-					'Box9':{'Filter0':{'type':'filter','filters':{'2':'Expense','3':'!=Tax','12':'EU'}}}
-				},
-				'show_detail': 1
-			}))
-		data = frappe.desk.query_report.run(report_name,
+			"Tax Detail",
+			"_Test Tax Detail",
+			json.dumps(
+				{
+					"columns": self.default_columns,
+					"sections": {
+						"Box1": {"Filter0": {"type": "filter", "filters": {"4": "VAT on Sales"}}},
+						"Box2": {"Filter0": {"type": "filter", "filters": {"4": "Acquisition"}}},
+						"Box3": {"Box1": {"type": "section"}, "Box2": {"type": "section"}},
+						"Box4": {"Filter0": {"type": "filter", "filters": {"4": "VAT on Purchases"}}},
+						"Box5": {"Box3": {"type": "section"}, "Box4": {"type": "section"}},
+						"Box6": {"Filter0": {"type": "filter", "filters": {"3": "!=Tax", "4": "Sales"}}},
+						"Box7": {"Filter0": {"type": "filter", "filters": {"2": "Expense", "3": "!=Tax"}}},
+						"Box8": {"Filter0": {"type": "filter", "filters": {"3": "!=Tax", "4": "Sales", "12": "EU"}}},
+						"Box9": {
+							"Filter0": {"type": "filter", "filters": {"2": "Expense", "3": "!=Tax", "12": "EU"}}
+						},
+					},
+					"show_detail": 1,
+				}
+			),
+		)
+		data = frappe.desk.query_report.run(
+			report_name,
 			filters={
-				'from_date': self.from_date,
-				'to_date': self.to_date,
-				'company': self.company.name,
-				'mode': 'run',
-				'report_name': report_name
-			}, user=frappe.session.user)
+				"from_date": self.from_date,
+				"to_date": self.to_date,
+				"company": self.company.name,
+				"mode": "run",
+				"report_name": report_name,
+			},
+			user=frappe.session.user,
+		)
 
-		self.assertListEqual(data.get('columns'), self.default_columns)
-		expected = (('Box1', 43.25), ('Box2', 0.0), ('Box3', 43.25), ('Box4', -85.28), ('Box5', -42.03),
-			('Box6', 825.0), ('Box7', -426.40), ('Box8', 0.0), ('Box9', 0.0))
+		self.assertListEqual(data.get("columns"), self.default_columns)
+		expected = (
+			("Box1", 43.25),
+			("Box2", 0.0),
+			("Box3", 43.25),
+			("Box4", -85.28),
+			("Box5", -42.03),
+			("Box6", 825.0),
+			("Box7", -426.40),
+			("Box8", 0.0),
+			("Box9", 0.0),
+		)
 		exrow = iter(expected)
-		for row in data.get('result'):
-			if row.get('voucher_no') and not row.get('posting_date'):
+		for row in data.get("result"):
+			if row.get("voucher_no") and not row.get("posting_date"):
 				label, value = next(exrow)
-				self.assertDictEqual(row, {'voucher_no': label, 'amount': value})
-		self.assertListEqual(data.get('report_summary'),
-			[{'label': label, 'datatype': 'Currency', 'value': value} for label, value in expected])
+				self.assertDictEqual(row, {"voucher_no": label, "amount": value})
+		self.assertListEqual(
+			data.get("report_summary"),
+			[{"label": label, "datatype": "Currency", "value": value} for label, value in expected],
+		)
 
 		self.rm_testdocs()
 
 	def test_filter_match(self):
 		# None - treated as -inf number except range
-		self.assertTrue(filter_match(None, '!='))
-		self.assertTrue(filter_match(None, '<'))
-		self.assertTrue(filter_match(None, '<jjj'))
-		self.assertTrue(filter_match(None, '  :  '))
-		self.assertTrue(filter_match(None, ':56'))
-		self.assertTrue(filter_match(None, ':de'))
-		self.assertFalse(filter_match(None, '3.4'))
-		self.assertFalse(filter_match(None, '='))
-		self.assertFalse(filter_match(None, '=3.4'))
-		self.assertFalse(filter_match(None, '>3.4'))
-		self.assertFalse(filter_match(None, '   <'))
-		self.assertFalse(filter_match(None, 'ew'))
-		self.assertFalse(filter_match(None, ' '))
-		self.assertFalse(filter_match(None, ' f :'))
+		self.assertTrue(filter_match(None, "!="))
+		self.assertTrue(filter_match(None, "<"))
+		self.assertTrue(filter_match(None, "<jjj"))
+		self.assertTrue(filter_match(None, "  :  "))
+		self.assertTrue(filter_match(None, ":56"))
+		self.assertTrue(filter_match(None, ":de"))
+		self.assertFalse(filter_match(None, "3.4"))
+		self.assertFalse(filter_match(None, "="))
+		self.assertFalse(filter_match(None, "=3.4"))
+		self.assertFalse(filter_match(None, ">3.4"))
+		self.assertFalse(filter_match(None, "   <"))
+		self.assertFalse(filter_match(None, "ew"))
+		self.assertFalse(filter_match(None, " "))
+		self.assertFalse(filter_match(None, " f :"))
 
 		# Numbers
-		self.assertTrue(filter_match(3.4, '3.4'))
-		self.assertTrue(filter_match(3.4, '.4'))
-		self.assertTrue(filter_match(3.4, '3'))
-		self.assertTrue(filter_match(-3.4, '< -3'))
-		self.assertTrue(filter_match(-3.4, '> -4'))
-		self.assertTrue(filter_match(3.4, '= 3.4 '))
-		self.assertTrue(filter_match(3.4, '!=4.5'))
-		self.assertTrue(filter_match(3.4, ' 3 : 4 '))
-		self.assertTrue(filter_match(0.0, '  :  '))
-		self.assertFalse(filter_match(3.4, '=4.5'))
-		self.assertFalse(filter_match(3.4, ' = 3.4 '))
-		self.assertFalse(filter_match(3.4, '!=3.4'))
-		self.assertFalse(filter_match(3.4, '>6'))
-		self.assertFalse(filter_match(3.4, '<-4.5'))
-		self.assertFalse(filter_match(3.4, '4.5'))
-		self.assertFalse(filter_match(3.4, '5:9'))
+		self.assertTrue(filter_match(3.4, "3.4"))
+		self.assertTrue(filter_match(3.4, ".4"))
+		self.assertTrue(filter_match(3.4, "3"))
+		self.assertTrue(filter_match(-3.4, "< -3"))
+		self.assertTrue(filter_match(-3.4, "> -4"))
+		self.assertTrue(filter_match(3.4, "= 3.4 "))
+		self.assertTrue(filter_match(3.4, "!=4.5"))
+		self.assertTrue(filter_match(3.4, " 3 : 4 "))
+		self.assertTrue(filter_match(0.0, "  :  "))
+		self.assertFalse(filter_match(3.4, "=4.5"))
+		self.assertFalse(filter_match(3.4, " = 3.4 "))
+		self.assertFalse(filter_match(3.4, "!=3.4"))
+		self.assertFalse(filter_match(3.4, ">6"))
+		self.assertFalse(filter_match(3.4, "<-4.5"))
+		self.assertFalse(filter_match(3.4, "4.5"))
+		self.assertFalse(filter_match(3.4, "5:9"))
 
 		# Strings
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', 'SINV'))
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', 'sinv'))
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', '-2021'))
-		self.assertTrue(filter_match(' ACC-SINV-2021-00001', ' acc'))
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', '=2021'))
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', '!=zz'))
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', '<   zzz  '))
-		self.assertTrue(filter_match('ACC-SINV-2021-00001', '  :  sinv  '))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', '  sinv  :'))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' acc'))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', '= 2021 '))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', '!=sinv'))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' >'))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', '>aa'))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' <'))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', '<   '))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' ='))
-		self.assertFalse(filter_match('ACC-SINV-2021-00001', '='))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "SINV"))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "sinv"))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "-2021"))
+		self.assertTrue(filter_match(" ACC-SINV-2021-00001", " acc"))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "=2021"))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "!=zz"))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "<   zzz  "))
+		self.assertTrue(filter_match("ACC-SINV-2021-00001", "  :  sinv  "))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", "  sinv  :"))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", " acc"))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", "= 2021 "))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", "!=sinv"))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", " >"))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", ">aa"))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", " <"))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", "<   "))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", " ="))
+		self.assertFalse(filter_match("ACC-SINV-2021-00001", "="))
 
 		# Date - always match
-		self.assertTrue(filter_match(datetime.date(2021, 3, 19), ' kdsjkldfs '))
+		self.assertTrue(filter_match(datetime.date(2021, 3, 19), " kdsjkldfs "))
diff --git a/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py b/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py
index 07f2e43..08d2008 100644
--- a/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py
+++ b/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py
@@ -11,7 +11,7 @@
 def execute(filters=None):
 	validate_filters(filters)
 
-	filters.naming_series = frappe.db.get_single_value('Buying Settings', 'supp_master_name')
+	filters.naming_series = frappe.db.get_single_value("Buying Settings", "supp_master_name")
 
 	columns = get_columns(filters)
 	tds_docs, tds_accounts, tax_category_map = get_tds_docs(filters)
@@ -21,8 +21,9 @@
 
 	return columns, final_result
 
+
 def validate_filters(filters):
-	''' Validate if dates are properly set and lie in the same fiscal year'''
+	"""Validate if dates are properly set and lie in the same fiscal year"""
 	if filters.from_date > filters.to_date:
 		frappe.throw(_("From Date must be before To Date"))
 
@@ -33,26 +34,32 @@
 
 	filters["fiscal_year"] = from_year
 
+
 def group_by_supplier_and_category(data):
 	supplier_category_wise_map = {}
 
 	for row in data:
-		supplier_category_wise_map.setdefault((row.get('supplier'), row.get('section_code')), {
-			'pan': row.get('pan'),
-			'supplier': row.get('supplier'),
-			'supplier_name': row.get('supplier_name'),
-			'section_code': row.get('section_code'),
-			'entity_type': row.get('entity_type'),
-			'tds_rate': row.get('tds_rate'),
-			'total_amount_credited': 0.0,
-			'tds_deducted': 0.0
-		})
+		supplier_category_wise_map.setdefault(
+			(row.get("supplier"), row.get("section_code")),
+			{
+				"pan": row.get("pan"),
+				"supplier": row.get("supplier"),
+				"supplier_name": row.get("supplier_name"),
+				"section_code": row.get("section_code"),
+				"entity_type": row.get("entity_type"),
+				"tds_rate": row.get("tds_rate"),
+				"total_amount_credited": 0.0,
+				"tds_deducted": 0.0,
+			},
+		)
 
-		supplier_category_wise_map.get((row.get('supplier'), row.get('section_code')))['total_amount_credited'] += \
-			row.get('total_amount_credited', 0.0)
+		supplier_category_wise_map.get((row.get("supplier"), row.get("section_code")))[
+			"total_amount_credited"
+		] += row.get("total_amount_credited", 0.0)
 
-		supplier_category_wise_map.get((row.get('supplier'), row.get('section_code')))['tds_deducted'] += \
-			row.get('tds_deducted', 0.0)
+		supplier_category_wise_map.get((row.get("supplier"), row.get("section_code")))[
+			"tds_deducted"
+		] += row.get("tds_deducted", 0.0)
 
 	final_result = get_final_result(supplier_category_wise_map)
 
@@ -66,62 +73,48 @@
 
 	return out
 
+
 def get_columns(filters):
 	columns = [
-		{
-			"label": _("PAN"),
-			"fieldname": "pan",
-			"fieldtype": "Data",
-			"width": 90
-		},
+		{"label": _("PAN"), "fieldname": "pan", "fieldtype": "Data", "width": 90},
 		{
 			"label": _("Supplier"),
 			"options": "Supplier",
 			"fieldname": "supplier",
 			"fieldtype": "Link",
-			"width": 180
-		}]
+			"width": 180,
+		},
+	]
 
-	if filters.naming_series == 'Naming Series':
-		columns.append({
-			"label": _("Supplier Name"),
-			"fieldname": "supplier_name",
-			"fieldtype": "Data",
-			"width": 180
-		})
+	if filters.naming_series == "Naming Series":
+		columns.append(
+			{"label": _("Supplier Name"), "fieldname": "supplier_name", "fieldtype": "Data", "width": 180}
+		)
 
-	columns.extend([
-		{
-			"label": _("Section Code"),
-			"options": "Tax Withholding Category",
-			"fieldname": "section_code",
-			"fieldtype": "Link",
-			"width": 180
-		},
-		{
-			"label": _("Entity Type"),
-			"fieldname": "entity_type",
-			"fieldtype": "Data",
-			"width": 180
-		},
-		{
-			"label": _("TDS Rate %"),
-			"fieldname": "tds_rate",
-			"fieldtype": "Percent",
-			"width": 90
-		},
-		{
-			"label": _("Total Amount Credited"),
-			"fieldname": "total_amount_credited",
-			"fieldtype": "Float",
-			"width": 90
-		},
-		{
-			"label": _("Amount of TDS Deducted"),
-			"fieldname": "tds_deducted",
-			"fieldtype": "Float",
-			"width": 90
-		}
-	])
+	columns.extend(
+		[
+			{
+				"label": _("Section Code"),
+				"options": "Tax Withholding Category",
+				"fieldname": "section_code",
+				"fieldtype": "Link",
+				"width": 180,
+			},
+			{"label": _("Entity Type"), "fieldname": "entity_type", "fieldtype": "Data", "width": 180},
+			{"label": _("TDS Rate %"), "fieldname": "tds_rate", "fieldtype": "Percent", "width": 90},
+			{
+				"label": _("Total Amount Credited"),
+				"fieldname": "total_amount_credited",
+				"fieldtype": "Float",
+				"width": 90,
+			},
+			{
+				"label": _("Amount of TDS Deducted"),
+				"fieldname": "tds_deducted",
+				"fieldtype": "Float",
+				"width": 90,
+			},
+		]
+	)
 
 	return columns
diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py
index e6cbff5..30ea5a9 100644
--- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py
+++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py
@@ -15,11 +15,13 @@
 	res = get_result(filters, tds_docs, tds_accounts, tax_category_map)
 	return columns, res
 
+
 def validate_filters(filters):
-	''' Validate if dates are properly set '''
+	"""Validate if dates are properly set"""
 	if filters.from_date > filters.to_date:
 		frappe.throw(_("From Date must be before To Date"))
 
+
 def get_result(filters, tds_docs, tds_accounts, tax_category_map):
 	supplier_map = get_supplier_pan_map()
 	tax_rate_map = get_tax_rate_map(filters)
@@ -37,57 +39,63 @@
 			voucher_type = entry.voucher_type
 
 			if not tax_withholding_category:
-				tax_withholding_category = supplier_map.get(supplier, {}).get('tax_withholding_category')
+				tax_withholding_category = supplier_map.get(supplier, {}).get("tax_withholding_category")
 				rate = tax_rate_map.get(tax_withholding_category)
 
 			if entry.account in tds_accounts:
-				tds_deducted += (entry.credit - entry.debit)
+				tds_deducted += entry.credit - entry.debit
 
 			total_amount_credited += entry.credit
 
 		if tds_deducted:
 			row = {
-				'pan' if frappe.db.has_column('Supplier', 'pan') else 'tax_id': supplier_map.get(supplier, {}).get('pan'),
-				'supplier': supplier_map.get(supplier, {}).get('name')
+				"pan"
+				if frappe.db.has_column("Supplier", "pan")
+				else "tax_id": supplier_map.get(supplier, {}).get("pan"),
+				"supplier": supplier_map.get(supplier, {}).get("name"),
 			}
 
-			if filters.naming_series == 'Naming Series':
-				row.update({'supplier_name': supplier_map.get(supplier, {}).get('supplier_name')})
+			if filters.naming_series == "Naming Series":
+				row.update({"supplier_name": supplier_map.get(supplier, {}).get("supplier_name")})
 
-			row.update({
-				'section_code': tax_withholding_category,
-				'entity_type': supplier_map.get(supplier, {}).get('supplier_type'),
-				'tds_rate': rate,
-				'total_amount_credited': total_amount_credited,
-				'tds_deducted': tds_deducted,
-				'transaction_date': posting_date,
-				'transaction_type': voucher_type,
-				'ref_no': name
-			})
+			row.update(
+				{
+					"section_code": tax_withholding_category,
+					"entity_type": supplier_map.get(supplier, {}).get("supplier_type"),
+					"tds_rate": rate,
+					"total_amount_credited": total_amount_credited,
+					"tds_deducted": tds_deducted,
+					"transaction_date": posting_date,
+					"transaction_type": voucher_type,
+					"ref_no": name,
+				}
+			)
 
 			out.append(row)
 
 	return out
 
+
 def get_supplier_pan_map():
 	supplier_map = frappe._dict()
-	suppliers = frappe.db.get_all('Supplier', fields=['name', 'pan', 'supplier_type', 'supplier_name', 'tax_withholding_category'])
+	suppliers = frappe.db.get_all(
+		"Supplier", fields=["name", "pan", "supplier_type", "supplier_name", "tax_withholding_category"]
+	)
 
 	for d in suppliers:
 		supplier_map[d.name] = d
 
 	return supplier_map
 
+
 def get_gle_map(documents):
 	# create gle_map of the form
 	# {"purchase_invoice": list of dict of all gle created for this invoice}
 	gle_map = {}
 
-	gle = frappe.db.get_all('GL Entry',
-		{
-			"voucher_no": ["in", documents],
-			"is_cancelled": 0
-		},
+	gle = frappe.db.get_all(
+		"GL Entry",
+		{"voucher_no": ["in", documents], "is_cancelled": 0},
 		["credit", "debit", "account", "voucher_no", "posting_date", "voucher_type", "against", "party"],
 	)
 
@@ -99,85 +107,68 @@
 
 	return gle_map
 
+
 def get_columns(filters):
 	pan = "pan" if frappe.db.has_column("Supplier", "pan") else "tax_id"
 	columns = [
-		{
-			"label": _(frappe.unscrub(pan)),
-			"fieldname": pan,
-			"fieldtype": "Data",
-			"width": 90
-		},
+		{"label": _(frappe.unscrub(pan)), "fieldname": pan, "fieldtype": "Data", "width": 90},
 		{
 			"label": _("Supplier"),
 			"options": "Supplier",
 			"fieldname": "supplier",
 			"fieldtype": "Link",
-			"width": 180
-		}]
+			"width": 180,
+		},
+	]
 
-	if filters.naming_series == 'Naming Series':
-		columns.append({
-			"label": _("Supplier Name"),
-			"fieldname": "supplier_name",
-			"fieldtype": "Data",
-			"width": 180
-		})
+	if filters.naming_series == "Naming Series":
+		columns.append(
+			{"label": _("Supplier Name"), "fieldname": "supplier_name", "fieldtype": "Data", "width": 180}
+		)
 
-	columns.extend([
-		{
-			"label": _("Section Code"),
-			"options": "Tax Withholding Category",
-			"fieldname": "section_code",
-			"fieldtype": "Link",
-			"width": 180
-		},
-		{
-			"label": _("Entity Type"),
-			"fieldname": "entity_type",
-			"fieldtype": "Data",
-			"width": 180
-		},
-		{
-			"label": _("TDS Rate %"),
-			"fieldname": "tds_rate",
-			"fieldtype": "Percent",
-			"width": 90
-		},
-		{
-			"label": _("Total Amount Credited"),
-			"fieldname": "total_amount_credited",
-			"fieldtype": "Float",
-			"width": 90
-		},
-		{
-			"label": _("Amount of TDS Deducted"),
-			"fieldname": "tds_deducted",
-			"fieldtype": "Float",
-			"width": 90
-		},
-		{
-			"label": _("Date of Transaction"),
-			"fieldname": "transaction_date",
-			"fieldtype": "Date",
-			"width": 90
-		},
-		{
-			"label": _("Transaction Type"),
-			"fieldname": "transaction_type",
-			"width": 90
-		},
-		{
-			"label": _("Reference No."),
-			"fieldname": "ref_no",
-			"fieldtype": "Dynamic Link",
-			"options": "transaction_type",
-			"width": 90
-		}
-	])
+	columns.extend(
+		[
+			{
+				"label": _("Section Code"),
+				"options": "Tax Withholding Category",
+				"fieldname": "section_code",
+				"fieldtype": "Link",
+				"width": 180,
+			},
+			{"label": _("Entity Type"), "fieldname": "entity_type", "fieldtype": "Data", "width": 180},
+			{"label": _("TDS Rate %"), "fieldname": "tds_rate", "fieldtype": "Percent", "width": 90},
+			{
+				"label": _("Total Amount Credited"),
+				"fieldname": "total_amount_credited",
+				"fieldtype": "Float",
+				"width": 90,
+			},
+			{
+				"label": _("Amount of TDS Deducted"),
+				"fieldname": "tds_deducted",
+				"fieldtype": "Float",
+				"width": 90,
+			},
+			{
+				"label": _("Date of Transaction"),
+				"fieldname": "transaction_date",
+				"fieldtype": "Date",
+				"width": 90,
+			},
+			{"label": _("Transaction Type"), "fieldname": "transaction_type", "width": 90},
+			{
+				"label": _("Reference No."),
+				"fieldname": "ref_no",
+				"fieldtype": "Dynamic Link",
+				"options": "transaction_type",
+				"width": 90,
+			},
+		]
+	)
 
 	return columns
 
+
 def get_tds_docs(filters):
 	tds_documents = []
 	purchase_invoices = []
@@ -185,27 +176,30 @@
 	journal_entries = []
 	tax_category_map = {}
 	or_filters = {}
-	bank_accounts = frappe.get_all('Account', {'is_group': 0, 'account_type': 'Bank'}, pluck="name")
+	bank_accounts = frappe.get_all("Account", {"is_group": 0, "account_type": "Bank"}, pluck="name")
 
-	tds_accounts = frappe.get_all("Tax Withholding Account", {'company': filters.get('company')},
-		pluck="account")
+	tds_accounts = frappe.get_all(
+		"Tax Withholding Account", {"company": filters.get("company")}, pluck="account"
+	)
 
 	query_filters = {
 		"account": ("in", tds_accounts),
 		"posting_date": ("between", [filters.get("from_date"), filters.get("to_date")]),
 		"is_cancelled": 0,
-		"against": ("not in", bank_accounts)
+		"against": ("not in", bank_accounts),
 	}
 
 	if filters.get("supplier"):
 		del query_filters["account"]
 		del query_filters["against"]
-		or_filters = {
-			"against": filters.get('supplier'),
-			"party": filters.get('supplier')
-		}
+		or_filters = {"against": filters.get("supplier"), "party": filters.get("supplier")}
 
-	tds_docs = frappe.get_all("GL Entry", filters=query_filters, or_filters=or_filters, fields=["voucher_no", "voucher_type", "against", "party"])
+	tds_docs = frappe.get_all(
+		"GL Entry",
+		filters=query_filters,
+		or_filters=or_filters,
+		fields=["voucher_no", "voucher_type", "against", "party"],
+	)
 
 	for d in tds_docs:
 		if d.voucher_type == "Purchase Invoice":
@@ -218,24 +212,39 @@
 		tds_documents.append(d.voucher_no)
 
 	if purchase_invoices:
-		get_tax_category_map(purchase_invoices, 'Purchase Invoice', tax_category_map)
+		get_tax_category_map(purchase_invoices, "Purchase Invoice", tax_category_map)
 
 	if payment_entries:
-		get_tax_category_map(payment_entries, 'Payment Entry', tax_category_map)
+		get_tax_category_map(payment_entries, "Payment Entry", tax_category_map)
 
 	if journal_entries:
-		get_tax_category_map(journal_entries, 'Journal Entry', tax_category_map)
+		get_tax_category_map(journal_entries, "Journal Entry", tax_category_map)
 
 	return tds_documents, tds_accounts, tax_category_map
 
+
 def get_tax_category_map(vouchers, doctype, tax_category_map):
-	tax_category_map.update(frappe._dict(frappe.get_all(doctype,
-		filters = {'name': ('in', vouchers)}, fields=['name', 'tax_withholding_category'], as_list=1)))
+	tax_category_map.update(
+		frappe._dict(
+			frappe.get_all(
+				doctype,
+				filters={"name": ("in", vouchers)},
+				fields=["name", "tax_withholding_category"],
+				as_list=1,
+			)
+		)
+	)
+
 
 def get_tax_rate_map(filters):
-	rate_map = frappe.get_all('Tax Withholding Rate', filters={
-		'from_date': ('<=', filters.get('from_date')),
-		'to_date': ('>=', filters.get('to_date'))
-	}, fields=['parent', 'tax_withholding_rate'], as_list=1)
+	rate_map = frappe.get_all(
+		"Tax Withholding Rate",
+		filters={
+			"from_date": ("<=", filters.get("from_date")),
+			"to_date": (">=", filters.get("to_date")),
+		},
+		fields=["parent", "tax_withholding_rate"],
+		as_list=1,
+	)
 
-	return frappe._dict(rate_map)
\ No newline at end of file
+	return frappe._dict(rate_map)
diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py
index bda44f6..dd0ac75 100644
--- a/erpnext/accounts/report/trial_balance/trial_balance.py
+++ b/erpnext/accounts/report/trial_balance/trial_balance.py
@@ -17,7 +17,15 @@
 	set_gl_entries_by_account,
 )
 
-value_fields = ("opening_debit", "opening_credit", "debit", "credit", "closing_debit", "closing_credit")
+value_fields = (
+	"opening_debit",
+	"opening_credit",
+	"debit",
+	"credit",
+	"closing_debit",
+	"closing_credit",
+)
+
 
 def execute(filters=None):
 	validate_filters(filters)
@@ -25,11 +33,14 @@
 	columns = get_columns()
 	return columns, data
 
+
 def validate_filters(filters):
 	if not filters.fiscal_year:
 		frappe.throw(_("Fiscal Year {0} is required").format(filters.fiscal_year))
 
-	fiscal_year = frappe.db.get_value("Fiscal Year", filters.fiscal_year, ["year_start_date", "year_end_date"], as_dict=True)
+	fiscal_year = frappe.db.get_value(
+		"Fiscal Year", filters.fiscal_year, ["year_start_date", "year_end_date"], as_dict=True
+	)
 	if not fiscal_year:
 		frappe.throw(_("Fiscal Year {0} does not exist").format(filters.fiscal_year))
 	else:
@@ -49,21 +60,32 @@
 		frappe.throw(_("From Date cannot be greater than To Date"))
 
 	if (filters.from_date < filters.year_start_date) or (filters.from_date > filters.year_end_date):
-		frappe.msgprint(_("From Date should be within the Fiscal Year. Assuming From Date = {0}")\
-			.format(formatdate(filters.year_start_date)))
+		frappe.msgprint(
+			_("From Date should be within the Fiscal Year. Assuming From Date = {0}").format(
+				formatdate(filters.year_start_date)
+			)
+		)
 
 		filters.from_date = filters.year_start_date
 
 	if (filters.to_date < filters.year_start_date) or (filters.to_date > filters.year_end_date):
-		frappe.msgprint(_("To Date should be within the Fiscal Year. Assuming To Date = {0}")\
-			.format(formatdate(filters.year_end_date)))
+		frappe.msgprint(
+			_("To Date should be within the Fiscal Year. Assuming To Date = {0}").format(
+				formatdate(filters.year_end_date)
+			)
+		)
 		filters.to_date = filters.year_end_date
 
+
 def get_data(filters):
 
-	accounts = frappe.db.sql("""select name, account_number, parent_account, account_name, root_type, report_type, lft, rgt
+	accounts = frappe.db.sql(
+		"""select name, account_number, parent_account, account_name, root_type, report_type, lft, rgt
 
-		from `tabAccount` where company=%s order by lft""", filters.company, as_dict=True)
+		from `tabAccount` where company=%s order by lft""",
+		filters.company,
+		as_dict=True,
+	)
 	company_currency = filters.presentation_currency or erpnext.get_company_currency(filters.company)
 
 	if not accounts:
@@ -71,28 +93,44 @@
 
 	accounts, accounts_by_name, parent_children_map = filter_accounts(accounts)
 
-	min_lft, max_rgt = frappe.db.sql("""select min(lft), max(rgt) from `tabAccount`
-		where company=%s""", (filters.company,))[0]
+	min_lft, max_rgt = frappe.db.sql(
+		"""select min(lft), max(rgt) from `tabAccount`
+		where company=%s""",
+		(filters.company,),
+	)[0]
 
 	gl_entries_by_account = {}
 
 	opening_balances = get_opening_balances(filters)
 
-	#add filter inside list so that the query in financial_statements.py doesn't break
+	# add filter inside list so that the query in financial_statements.py doesn't break
 	if filters.project:
 		filters.project = [filters.project]
 
-	set_gl_entries_by_account(filters.company, filters.from_date,
-		filters.to_date, min_lft, max_rgt, filters, gl_entries_by_account, ignore_closing_entries=not flt(filters.with_period_closing_entry))
+	set_gl_entries_by_account(
+		filters.company,
+		filters.from_date,
+		filters.to_date,
+		min_lft,
+		max_rgt,
+		filters,
+		gl_entries_by_account,
+		ignore_closing_entries=not flt(filters.with_period_closing_entry),
+	)
 
-	total_row = calculate_values(accounts, gl_entries_by_account, opening_balances, filters, company_currency)
+	total_row = calculate_values(
+		accounts, gl_entries_by_account, opening_balances, filters, company_currency
+	)
 	accumulate_values_into_parents(accounts, accounts_by_name)
 
 	data = prepare_data(accounts, filters, total_row, parent_children_map, company_currency)
-	data = filter_out_zero_value_rows(data, parent_children_map, show_zero_values=filters.get("show_zero_values"))
+	data = filter_out_zero_value_rows(
+		data, parent_children_map, show_zero_values=filters.get("show_zero_values")
+	)
 
 	return data
 
+
 def get_opening_balances(filters):
 	balance_sheet_opening = get_rootwise_opening_balances(filters, "Balance Sheet")
 	pl_opening = get_rootwise_opening_balances(filters, "Profit and Loss")
@@ -104,16 +142,20 @@
 def get_rootwise_opening_balances(filters, report_type):
 	additional_conditions = ""
 	if not filters.show_unclosed_fy_pl_balances:
-		additional_conditions = " and posting_date >= %(year_start_date)s" \
-			if report_type == "Profit and Loss" else ""
+		additional_conditions = (
+			" and posting_date >= %(year_start_date)s" if report_type == "Profit and Loss" else ""
+		)
 
 	if not flt(filters.with_period_closing_entry):
 		additional_conditions += " and ifnull(voucher_type, '')!='Period Closing Voucher'"
 
 	if filters.cost_center:
-		lft, rgt = frappe.db.get_value('Cost Center', filters.cost_center, ['lft', 'rgt'])
+		lft, rgt = frappe.db.get_value("Cost Center", filters.cost_center, ["lft", "rgt"])
 		additional_conditions += """ and cost_center in (select name from `tabCost Center`
-			where lft >= %s and rgt <= %s)""" % (lft, rgt)
+			where lft >= %s and rgt <= %s)""" % (
+			lft,
+			rgt,
+		)
 
 	if filters.project:
 		additional_conditions += " and project = %(project)s"
@@ -121,7 +163,9 @@
 	if filters.finance_book:
 		fb_conditions = " AND finance_book = %(finance_book)s"
 		if filters.include_default_book_entries:
-			fb_conditions = " AND (finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)"
+			fb_conditions = (
+				" AND (finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)"
+			)
 
 		additional_conditions += fb_conditions
 
@@ -134,24 +178,24 @@
 		"year_start_date": filters.year_start_date,
 		"project": filters.project,
 		"finance_book": filters.finance_book,
-		"company_fb": frappe.db.get_value("Company", filters.company, 'default_finance_book')
+		"company_fb": frappe.db.get_value("Company", filters.company, "default_finance_book"),
 	}
 
 	if accounting_dimensions:
 		for dimension in accounting_dimensions:
 			if filters.get(dimension.fieldname):
-				if frappe.get_cached_value('DocType', dimension.document_type, 'is_tree'):
-					filters[dimension.fieldname] = get_dimension_with_children(dimension.document_type,
-						filters.get(dimension.fieldname))
+				if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"):
+					filters[dimension.fieldname] = get_dimension_with_children(
+						dimension.document_type, filters.get(dimension.fieldname)
+					)
 					additional_conditions += "and {0} in %({0})s".format(dimension.fieldname)
 				else:
 					additional_conditions += "and {0} in (%({0})s)".format(dimension.fieldname)
 
-				query_filters.update({
-					dimension.fieldname: filters.get(dimension.fieldname)
-				})
+				query_filters.update({dimension.fieldname: filters.get(dimension.fieldname)})
 
-	gle = frappe.db.sql("""
+	gle = frappe.db.sql(
+		"""
 		select
 			account, sum(debit) as opening_debit, sum(credit) as opening_credit
 		from `tabGL Entry`
@@ -161,7 +205,12 @@
 			and (posting_date < %(from_date)s or ifnull(is_opening, 'No') = 'Yes')
 			and account in (select name from `tabAccount` where report_type=%(report_type)s)
 			and is_cancelled = 0
-		group by account""".format(additional_conditions=additional_conditions), query_filters , as_dict=True)
+		group by account""".format(
+			additional_conditions=additional_conditions
+		),
+		query_filters,
+		as_dict=True,
+	)
 
 	opening = frappe._dict()
 	for d in gle:
@@ -169,6 +218,7 @@
 
 	return opening
 
+
 def calculate_values(accounts, gl_entries_by_account, opening_balances, filters, company_currency):
 	init = {
 		"opening_debit": 0.0,
@@ -176,7 +226,7 @@
 		"debit": 0.0,
 		"credit": 0.0,
 		"closing_debit": 0.0,
-		"closing_credit": 0.0
+		"closing_credit": 0.0,
 	}
 
 	total_row = {
@@ -192,7 +242,7 @@
 		"parent_account": None,
 		"indent": 0,
 		"has_value": True,
-		"currency": company_currency
+		"currency": company_currency,
 	}
 
 	for d in accounts:
@@ -217,12 +267,14 @@
 
 	return total_row
 
+
 def accumulate_values_into_parents(accounts, accounts_by_name):
 	for d in reversed(accounts):
 		if d.parent_account:
 			for key in value_fields:
 				accounts_by_name[d.parent_account][key] += d[key]
 
+
 def prepare_data(accounts, filters, total_row, parent_children_map, company_currency):
 	data = []
 
@@ -239,8 +291,9 @@
 			"from_date": filters.from_date,
 			"to_date": filters.to_date,
 			"currency": company_currency,
-			"account_name": ('{} - {}'.format(d.account_number, d.account_name)
-				if d.account_number else d.account_name)
+			"account_name": (
+				"{} - {}".format(d.account_number, d.account_name) if d.account_number else d.account_name
+			),
 		}
 
 		for key in value_fields:
@@ -253,10 +306,11 @@
 		row["has_value"] = has_value
 		data.append(row)
 
-	data.extend([{},total_row])
+	data.extend([{}, total_row])
 
 	return data
 
+
 def get_columns():
 	return [
 		{
@@ -264,59 +318,60 @@
 			"label": _("Account"),
 			"fieldtype": "Link",
 			"options": "Account",
-			"width": 300
+			"width": 300,
 		},
 		{
 			"fieldname": "currency",
 			"label": _("Currency"),
 			"fieldtype": "Link",
 			"options": "Currency",
-			"hidden": 1
+			"hidden": 1,
 		},
 		{
 			"fieldname": "opening_debit",
 			"label": _("Opening (Dr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "opening_credit",
 			"label": _("Opening (Cr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "debit",
 			"label": _("Debit"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "credit",
 			"label": _("Credit"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "closing_debit",
 			"label": _("Closing (Dr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "closing_credit",
 			"label": _("Closing (Cr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
+
 def prepare_opening_closing(row):
 	dr_or_cr = "debit" if row["root_type"] in ["Asset", "Equity", "Expense"] else "credit"
 	reverse_dr_or_cr = "credit" if dr_or_cr == "debit" else "debit"
diff --git a/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py b/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
index 70effce..869f6aa 100644
--- a/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
+++ b/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
@@ -19,91 +19,88 @@
 
 	return columns, data
 
+
 def get_data(filters, show_party_name):
-	if filters.get('party_type') in ('Customer', 'Supplier', 'Employee', 'Member'):
-		party_name_field = "{0}_name".format(frappe.scrub(filters.get('party_type')))
-	elif filters.get('party_type') == 'Student':
-		party_name_field = 'first_name'
-	elif filters.get('party_type') == 'Shareholder':
-		party_name_field = 'title'
+	if filters.get("party_type") in ("Customer", "Supplier", "Employee", "Member"):
+		party_name_field = "{0}_name".format(frappe.scrub(filters.get("party_type")))
+	elif filters.get("party_type") == "Student":
+		party_name_field = "first_name"
+	elif filters.get("party_type") == "Shareholder":
+		party_name_field = "title"
 	else:
-		party_name_field = 'name'
+		party_name_field = "name"
 
 	party_filters = {"name": filters.get("party")} if filters.get("party") else {}
-	parties = frappe.get_all(filters.get("party_type"), fields = ["name", party_name_field],
-		filters = party_filters, order_by="name")
-	company_currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	parties = frappe.get_all(
+		filters.get("party_type"),
+		fields=["name", party_name_field],
+		filters=party_filters,
+		order_by="name",
+	)
+	company_currency = frappe.get_cached_value("Company", filters.company, "default_currency")
 	opening_balances = get_opening_balances(filters)
 	balances_within_period = get_balances_within_period(filters)
 
 	data = []
 	# total_debit, total_credit = 0, 0
-	total_row = frappe._dict({
-		"opening_debit": 0,
-		"opening_credit": 0,
-		"debit": 0,
-		"credit": 0,
-		"closing_debit": 0,
-		"closing_credit": 0
-	})
+	total_row = frappe._dict(
+		{
+			"opening_debit": 0,
+			"opening_credit": 0,
+			"debit": 0,
+			"credit": 0,
+			"closing_debit": 0,
+			"closing_credit": 0,
+		}
+	)
 	for party in parties:
-		row = { "party": party.name }
+		row = {"party": party.name}
 		if show_party_name:
 			row["party_name"] = party.get(party_name_field)
 
 		# opening
 		opening_debit, opening_credit = opening_balances.get(party.name, [0, 0])
-		row.update({
-			"opening_debit": opening_debit,
-			"opening_credit": opening_credit
-		})
+		row.update({"opening_debit": opening_debit, "opening_credit": opening_credit})
 
 		# within period
 		debit, credit = balances_within_period.get(party.name, [0, 0])
-		row.update({
-			"debit": debit,
-			"credit": credit
-		})
+		row.update({"debit": debit, "credit": credit})
 
 		# closing
-		closing_debit, closing_credit = toggle_debit_credit(opening_debit + debit, opening_credit + credit)
-		row.update({
-			"closing_debit": closing_debit,
-			"closing_credit": closing_credit
-		})
+		closing_debit, closing_credit = toggle_debit_credit(
+			opening_debit + debit, opening_credit + credit
+		)
+		row.update({"closing_debit": closing_debit, "closing_credit": closing_credit})
 
 		# totals
 		for col in total_row:
 			total_row[col] += row.get(col)
 
-		row.update({
-			"currency": company_currency
-		})
+		row.update({"currency": company_currency})
 
 		has_value = False
-		if (opening_debit or opening_credit or debit or credit or closing_debit or closing_credit):
-			has_value  =True
+		if opening_debit or opening_credit or debit or credit or closing_debit or closing_credit:
+			has_value = True
 
 		if cint(filters.show_zero_values) or has_value:
 			data.append(row)
 
 	# Add total row
 
-	total_row.update({
-		"party": "'" + _("Totals") + "'",
-		"currency": company_currency
-	})
+	total_row.update({"party": "'" + _("Totals") + "'", "currency": company_currency})
 	data.append(total_row)
 
 	return data
 
+
 def get_opening_balances(filters):
 
-	account_filter = ''
-	if filters.get('account'):
-		account_filter = "and account = %s" % (frappe.db.escape(filters.get('account')))
+	account_filter = ""
+	if filters.get("account"):
+		account_filter = "and account = %s" % (frappe.db.escape(filters.get("account")))
 
-	gle = frappe.db.sql("""
+	gle = frappe.db.sql(
+		"""
 		select party, sum(debit) as opening_debit, sum(credit) as opening_credit
 		from `tabGL Entry`
 		where company=%(company)s
@@ -111,11 +108,12 @@
 			and ifnull(party_type, '') = %(party_type)s and ifnull(party, '') != ''
 			and (posting_date < %(from_date)s or ifnull(is_opening, 'No') = 'Yes')
 			{account_filter}
-		group by party""".format(account_filter=account_filter), {
-			"company": filters.company,
-			"from_date": filters.from_date,
-			"party_type": filters.party_type
-		}, as_dict=True)
+		group by party""".format(
+			account_filter=account_filter
+		),
+		{"company": filters.company, "from_date": filters.from_date, "party_type": filters.party_type},
+		as_dict=True,
+	)
 
 	opening = frappe._dict()
 	for d in gle:
@@ -124,13 +122,15 @@
 
 	return opening
 
+
 def get_balances_within_period(filters):
 
-	account_filter = ''
-	if filters.get('account'):
-		account_filter = "and account = %s" % (frappe.db.escape(filters.get('account')))
+	account_filter = ""
+	if filters.get("account"):
+		account_filter = "and account = %s" % (frappe.db.escape(filters.get("account")))
 
-	gle = frappe.db.sql("""
+	gle = frappe.db.sql(
+		"""
 		select party, sum(debit) as debit, sum(credit) as credit
 		from `tabGL Entry`
 		where company=%(company)s
@@ -139,12 +139,17 @@
 			and posting_date >= %(from_date)s and posting_date <= %(to_date)s
 			and ifnull(is_opening, 'No') = 'No'
 			{account_filter}
-		group by party""".format(account_filter=account_filter), {
+		group by party""".format(
+			account_filter=account_filter
+		),
+		{
 			"company": filters.company,
 			"from_date": filters.from_date,
 			"to_date": filters.to_date,
-			"party_type": filters.party_type
-		}, as_dict=True)
+			"party_type": filters.party_type,
+		},
+		as_dict=True,
+	)
 
 	balances_within_period = frappe._dict()
 	for d in gle:
@@ -152,6 +157,7 @@
 
 	return balances_within_period
 
+
 def toggle_debit_credit(debit, credit):
 	if flt(debit) > flt(credit):
 		debit = flt(debit) - flt(credit)
@@ -162,6 +168,7 @@
 
 	return debit, credit
 
+
 def get_columns(filters, show_party_name):
 	columns = [
 		{
@@ -169,73 +176,77 @@
 			"label": _(filters.party_type),
 			"fieldtype": "Link",
 			"options": filters.party_type,
-			"width": 200
+			"width": 200,
 		},
 		{
 			"fieldname": "opening_debit",
 			"label": _("Opening (Dr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "opening_credit",
 			"label": _("Opening (Cr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "debit",
 			"label": _("Debit"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "credit",
 			"label": _("Credit"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "closing_debit",
 			"label": _("Closing (Dr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "closing_credit",
 			"label": _("Closing (Cr)"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "currency",
 			"label": _("Currency"),
 			"fieldtype": "Link",
 			"options": "Currency",
-			"hidden": 1
-		}
+			"hidden": 1,
+		},
 	]
 
 	if show_party_name:
-		columns.insert(1, {
-			"fieldname": "party_name",
-			"label": _(filters.party_type) + " Name",
-			"fieldtype": "Data",
-			"width": 200
-		})
+		columns.insert(
+			1,
+			{
+				"fieldname": "party_name",
+				"label": _(filters.party_type) + " Name",
+				"fieldtype": "Data",
+				"width": 200,
+			},
+		)
 
 	return columns
 
+
 def is_party_name_visible(filters):
 	show_party_name = False
 
-	if filters.get('party_type') in ['Customer', 'Supplier']:
+	if filters.get("party_type") in ["Customer", "Supplier"]:
 		if filters.get("party_type") == "Customer":
 			party_naming_by = frappe.db.get_single_value("Selling Settings", "cust_master_name")
 		else:
diff --git a/erpnext/accounts/report/unpaid_expense_claim/unpaid_expense_claim.py b/erpnext/accounts/report/unpaid_expense_claim/unpaid_expense_claim.py
index 26b9389..62b4f63 100644
--- a/erpnext/accounts/report/unpaid_expense_claim/unpaid_expense_claim.py
+++ b/erpnext/accounts/report/unpaid_expense_claim/unpaid_expense_claim.py
@@ -12,16 +12,25 @@
 	data = get_unclaimed_expese_claims(filters)
 	return columns, data
 
+
 def get_columns():
-	return [_("Employee") + ":Link/Employee:120", _("Employee Name") + "::120",_("Expense Claim") + ":Link/Expense Claim:120",
-		_("Sanctioned Amount") + ":Currency:120", _("Paid Amount") + ":Currency:120", _("Outstanding Amount") + ":Currency:150"]
+	return [
+		_("Employee") + ":Link/Employee:120",
+		_("Employee Name") + "::120",
+		_("Expense Claim") + ":Link/Expense Claim:120",
+		_("Sanctioned Amount") + ":Currency:120",
+		_("Paid Amount") + ":Currency:120",
+		_("Outstanding Amount") + ":Currency:150",
+	]
+
 
 def get_unclaimed_expese_claims(filters):
 	cond = "1=1"
 	if filters.get("employee"):
 		cond = "ec.employee = %(employee)s"
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			ec.employee, ec.employee_name, ec.name, ec.total_sanctioned_amount, ec.total_amount_reimbursed,
 			sum(gle.credit_in_account_currency - gle.debit_in_account_currency) as outstanding_amt
@@ -32,4 +41,9 @@
 			and gle.party is not null and ec.docstatus = 1 and ec.is_paid = 0 and {cond} group by ec.name
 		having
 			outstanding_amt > 0
-	""".format(cond=cond), filters, as_list=1)
+	""".format(
+			cond=cond
+		),
+		filters,
+		as_list=1,
+	)
diff --git a/erpnext/accounts/report/utils.py b/erpnext/accounts/report/utils.py
index 9e721fb..eed5836 100644
--- a/erpnext/accounts/report/utils.py
+++ b/erpnext/accounts/report/utils.py
@@ -7,6 +7,7 @@
 
 __exchange_rates = {}
 
+
 def get_currency(filters):
 	"""
 	Returns a dictionary containing currency information. The keys of the dict are
@@ -23,15 +24,22 @@
 	"""
 	company = get_appropriate_company(filters)
 	company_currency = get_company_currency(company)
-	presentation_currency = filters['presentation_currency'] if filters.get('presentation_currency') else company_currency
+	presentation_currency = (
+		filters["presentation_currency"] if filters.get("presentation_currency") else company_currency
+	)
 
-	report_date = filters.get('to_date')
+	report_date = filters.get("to_date")
 
 	if not report_date:
-		fiscal_year_to_date = get_from_and_to_date(filters.get('to_fiscal_year'))["to_date"]
+		fiscal_year_to_date = get_from_and_to_date(filters.get("to_fiscal_year"))["to_date"]
 		report_date = formatdate(get_datetime_str(fiscal_year_to_date), "dd-MM-yyyy")
 
-	currency_map = dict(company=company, company_currency=company_currency, presentation_currency=presentation_currency, report_date=report_date)
+	currency_map = dict(
+		company=company,
+		company_currency=company_currency,
+		presentation_currency=presentation_currency,
+		report_date=report_date,
+	)
 
 	return currency_map
 
@@ -62,13 +70,14 @@
 	:return: Retrieved exchange rate
 	"""
 
-	rate = __exchange_rates.get('{0}-{1}@{2}'.format(from_currency, to_currency, date))
+	rate = __exchange_rates.get("{0}-{1}@{2}".format(from_currency, to_currency, date))
 	if not rate:
 		rate = get_exchange_rate(from_currency, to_currency, date) or 1
-		__exchange_rates['{0}-{1}@{2}'.format(from_currency, to_currency, date)] = rate
+		__exchange_rates["{0}-{1}@{2}".format(from_currency, to_currency, date)] = rate
 
 	return rate
 
+
 def convert_to_presentation_currency(gl_entries, currency_info, company):
 	"""
 	Take a list of GL Entries and change the 'debit' and 'credit' values to currencies
@@ -78,35 +87,35 @@
 	:return:
 	"""
 	converted_gl_list = []
-	presentation_currency = currency_info['presentation_currency']
-	company_currency = currency_info['company_currency']
+	presentation_currency = currency_info["presentation_currency"]
+	company_currency = currency_info["company_currency"]
 
-	account_currencies = list(set(entry['account_currency'] for entry in gl_entries))
+	account_currencies = list(set(entry["account_currency"] for entry in gl_entries))
 
 	for entry in gl_entries:
-		account = entry['account']
-		debit = flt(entry['debit'])
-		credit = flt(entry['credit'])
-		debit_in_account_currency = flt(entry['debit_in_account_currency'])
-		credit_in_account_currency = flt(entry['credit_in_account_currency'])
-		account_currency = entry['account_currency']
+		account = entry["account"]
+		debit = flt(entry["debit"])
+		credit = flt(entry["credit"])
+		debit_in_account_currency = flt(entry["debit_in_account_currency"])
+		credit_in_account_currency = flt(entry["credit_in_account_currency"])
+		account_currency = entry["account_currency"]
 
 		if len(account_currencies) == 1 and account_currency == presentation_currency:
 			if debit_in_account_currency:
-				entry['debit'] = debit_in_account_currency
+				entry["debit"] = debit_in_account_currency
 
 			if credit_in_account_currency:
-				entry['credit'] = credit_in_account_currency
+				entry["credit"] = credit_in_account_currency
 		else:
-			date = currency_info['report_date']
+			date = currency_info["report_date"]
 			converted_debit_value = convert(debit, presentation_currency, company_currency, date)
 			converted_credit_value = convert(credit, presentation_currency, company_currency, date)
 
-			if entry.get('debit'):
-				entry['debit'] = converted_debit_value
+			if entry.get("debit"):
+				entry["debit"] = converted_debit_value
 
-			if entry.get('credit'):
-				entry['credit'] = converted_credit_value
+			if entry.get("credit"):
+				entry["credit"] = converted_credit_value
 
 		converted_gl_list.append(entry)
 
@@ -114,26 +123,29 @@
 
 
 def get_appropriate_company(filters):
-	if filters.get('company'):
-		company = filters['company']
+	if filters.get("company"):
+		company = filters["company"]
 	else:
 		company = get_default_company()
 
 	return company
 
+
 @frappe.whitelist()
-def get_invoiced_item_gross_margin(sales_invoice=None, item_code=None, company=None, with_item_data=False):
+def get_invoiced_item_gross_margin(
+	sales_invoice=None, item_code=None, company=None, with_item_data=False
+):
 	from erpnext.accounts.report.gross_profit.gross_profit import GrossProfitGenerator
 
-	sales_invoice = sales_invoice or frappe.form_dict.get('sales_invoice')
-	item_code = item_code or frappe.form_dict.get('item_code')
-	company = company or frappe.get_cached_value("Sales Invoice", sales_invoice, 'company')
+	sales_invoice = sales_invoice or frappe.form_dict.get("sales_invoice")
+	item_code = item_code or frappe.form_dict.get("item_code")
+	company = company or frappe.get_cached_value("Sales Invoice", sales_invoice, "company")
 
 	filters = {
-		'sales_invoice': sales_invoice,
-		'item_code': item_code,
-		'company': company,
-		'group_by': 'Invoice'
+		"sales_invoice": sales_invoice,
+		"item_code": item_code,
+		"company": company,
+		"group_by": "Invoice",
 	}
 
 	gross_profit_data = GrossProfitGenerator(filters)
diff --git a/erpnext/accounts/test/test_reports.py b/erpnext/accounts/test/test_reports.py
index 4ed966d..19fe74f 100644
--- a/erpnext/accounts/test/test_reports.py
+++ b/erpnext/accounts/test/test_reports.py
@@ -8,18 +8,18 @@
 	"from_date": "2010-01-01",
 	"to_date": "2030-01-01",
 	"period_start_date": "2010-01-01",
-	"period_end_date": "2030-01-01"
+	"period_end_date": "2030-01-01",
 }
 
 
 REPORT_FILTER_TEST_CASES: List[Tuple[ReportName, ReportFilters]] = [
-	("General Ledger", {"group_by": "Group by Voucher (Consolidated)"} ),
-	("General Ledger", {"group_by": "Group by Voucher (Consolidated)", "include_dimensions": 1} ),
+	("General Ledger", {"group_by": "Group by Voucher (Consolidated)"}),
+	("General Ledger", {"group_by": "Group by Voucher (Consolidated)", "include_dimensions": 1}),
 	("Accounts Payable", {"range1": 30, "range2": 60, "range3": 90, "range4": 120}),
 	("Accounts Receivable", {"range1": 30, "range2": 60, "range3": 90, "range4": 120}),
-	("Consolidated Financial Statement", {"report": "Balance Sheet"} ),
-	("Consolidated Financial Statement", {"report": "Profit and Loss Statement"} ),
-	("Consolidated Financial Statement", {"report": "Cash Flow"} ),
+	("Consolidated Financial Statement", {"report": "Balance Sheet"}),
+	("Consolidated Financial Statement", {"report": "Profit and Loss Statement"}),
+	("Consolidated Financial Statement", {"report": "Cash Flow"}),
 	("Gross Profit", {"group_by": "Invoice"}),
 	("Gross Profit", {"group_by": "Item Code"}),
 	("Gross Profit", {"group_by": "Item Group"}),
@@ -29,7 +29,10 @@
 	("Item-wise Purchase Register", {}),
 	("Sales Register", {}),
 	("Purchase Register", {}),
-	("Tax Detail", {"mode": "run", "report_name": "Tax Detail"},),
+	(
+		"Tax Detail",
+		{"mode": "run", "report_name": "Tax Detail"},
+	),
 ]
 
 OPTIONAL_FILTERS = {}
diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py
index effc913..0fe5008 100644
--- a/erpnext/accounts/test/test_utils.py
+++ b/erpnext/accounts/test/test_utils.py
@@ -43,7 +43,8 @@
 		posting_date = "2021-01-01"
 		gl_entries = get_voucherwise_gl_entries(future_vouchers, posting_date)
 		self.assertTrue(
-			voucher_type_and_no in gl_entries, msg="get_voucherwise_gl_entries not returning expected GLes",
+			voucher_type_and_no in gl_entries,
+			msg="get_voucherwise_gl_entries not returning expected GLes",
 		)
 
 
diff --git a/erpnext/accounts/test_party.py b/erpnext/accounts/test_party.py
index f7a1a85..9d3de5e 100644
--- a/erpnext/accounts/test_party.py
+++ b/erpnext/accounts/test_party.py
@@ -6,10 +6,12 @@
 
 class PartyTestCase(FrappeTestCase):
 	def test_get_default_price_list_should_return_none_for_invalid_group(self):
-		customer = frappe.get_doc({
-			'doctype': 'Customer',
-			'customer_name': 'test customer',
-		}).insert(ignore_permissions=True, ignore_mandatory=True)
+		customer = frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_name": "test customer",
+			}
+		).insert(ignore_permissions=True, ignore_mandatory=True)
 		customer.customer_group = None
 		customer.save()
 		price_list = get_default_price_list(customer)
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index b17b90b..d17207a 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -18,15 +18,28 @@
 from erpnext.stock.utils import get_stock_value_on
 
 
-class StockValueAndAccountBalanceOutOfSync(frappe.ValidationError): pass
-class FiscalYearError(frappe.ValidationError): pass
-class PaymentEntryUnlinkError(frappe.ValidationError): pass
+class StockValueAndAccountBalanceOutOfSync(frappe.ValidationError):
+	pass
+
+
+class FiscalYearError(frappe.ValidationError):
+	pass
+
+
+class PaymentEntryUnlinkError(frappe.ValidationError):
+	pass
+
 
 @frappe.whitelist()
-def get_fiscal_year(date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False):
+def get_fiscal_year(
+	date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False
+):
 	return get_fiscal_years(date, fiscal_year, label, verbose, company, as_dict=as_dict)[0]
 
-def get_fiscal_years(transaction_date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False):
+
+def get_fiscal_years(
+	transaction_date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False
+):
 	fiscal_years = frappe.cache().hget("fiscal_years", company) or []
 
 	if not fiscal_years:
@@ -46,7 +59,8 @@
 				)
 			"""
 
-		fiscal_years = frappe.db.sql("""
+		fiscal_years = frappe.db.sql(
+			"""
 			select
 				fy.name, fy.year_start_date, fy.year_end_date
 			from
@@ -54,9 +68,12 @@
 			where
 				disabled = 0 {0}
 			order by
-				fy.year_start_date desc""".format(cond), {
-				"company": company
-			}, as_dict=True)
+				fy.year_start_date desc""".format(
+				cond
+			),
+			{"company": company},
+			as_dict=True,
+		)
 
 		frappe.cache().hset("fiscal_years", company, fiscal_years)
 
@@ -71,8 +88,11 @@
 		if fiscal_year and fy.name == fiscal_year:
 			matched = True
 
-		if (transaction_date and getdate(fy.year_start_date) <= transaction_date
-			and getdate(fy.year_end_date) >= transaction_date):
+		if (
+			transaction_date
+			and getdate(fy.year_start_date) <= transaction_date
+			and getdate(fy.year_end_date) >= transaction_date
+		):
 			matched = True
 
 		if matched:
@@ -81,30 +101,35 @@
 			else:
 				return ((fy.name, fy.year_start_date, fy.year_end_date),)
 
-	error_msg = _("""{0} {1} is not in any active Fiscal Year""").format(label, formatdate(transaction_date))
+	error_msg = _("""{0} {1} is not in any active Fiscal Year""").format(
+		label, formatdate(transaction_date)
+	)
 	if company:
 		error_msg = _("""{0} for {1}""").format(error_msg, frappe.bold(company))
 
-	if verbose==1: frappe.msgprint(error_msg)
+	if verbose == 1:
+		frappe.msgprint(error_msg)
 	raise FiscalYearError(error_msg)
 
+
 @frappe.whitelist()
 def get_fiscal_year_filter_field(company=None):
-	field = {
-		"fieldtype": "Select",
-		"options": [],
-		"operator": "Between",
-		"query_value": True
-	}
+	field = {"fieldtype": "Select", "options": [], "operator": "Between", "query_value": True}
 	fiscal_years = get_fiscal_years(company=company)
 	for fiscal_year in fiscal_years:
-		field["options"].append({
-			"label": fiscal_year.name,
-			"value": fiscal_year.name,
-			"query_value": [fiscal_year.year_start_date.strftime("%Y-%m-%d"), fiscal_year.year_end_date.strftime("%Y-%m-%d")]
-		})
+		field["options"].append(
+			{
+				"label": fiscal_year.name,
+				"value": fiscal_year.name,
+				"query_value": [
+					fiscal_year.year_start_date.strftime("%Y-%m-%d"),
+					fiscal_year.year_end_date.strftime("%Y-%m-%d"),
+				],
+			}
+		)
 	return field
 
+
 def validate_fiscal_year(date, fiscal_year, company, label="Date", doc=None):
 	years = [f[0] for f in get_fiscal_years(date, label=_(label), company=company)]
 	if fiscal_year not in years:
@@ -113,9 +138,18 @@
 		else:
 			throw(_("{0} '{1}' not in Fiscal Year {2}").format(label, formatdate(date), fiscal_year))
 
+
 @frappe.whitelist()
-def get_balance_on(account=None, date=None, party_type=None, party=None, company=None,
-	in_account_currency=True, cost_center=None, ignore_account_permission=False):
+def get_balance_on(
+	account=None,
+	date=None,
+	party_type=None,
+	party=None,
+	company=None,
+	in_account_currency=True,
+	cost_center=None,
+	ignore_account_permission=False,
+):
 	if not account and frappe.form_dict.get("account"):
 		account = frappe.form_dict.get("account")
 	if not date and frappe.form_dict.get("date"):
@@ -127,7 +161,6 @@
 	if not cost_center and frappe.form_dict.get("cost_center"):
 		cost_center = frappe.form_dict.get("cost_center")
 
-
 	cond = ["is_cancelled=0"]
 	if date:
 		cond.append("posting_date <= %s" % frappe.db.escape(cstr(date)))
@@ -155,45 +188,52 @@
 	else:
 		report_type = ""
 
-	if cost_center and report_type == 'Profit and Loss':
+	if cost_center and report_type == "Profit and Loss":
 		cc = frappe.get_doc("Cost Center", cost_center)
 		if cc.is_group:
-			cond.append(""" exists (
+			cond.append(
+				""" exists (
 				select 1 from `tabCost Center` cc where cc.name = gle.cost_center
 				and cc.lft >= %s and cc.rgt <= %s
-			)""" % (cc.lft, cc.rgt))
+			)"""
+				% (cc.lft, cc.rgt)
+			)
 
 		else:
-			cond.append("""gle.cost_center = %s """ % (frappe.db.escape(cost_center, percent=False), ))
-
+			cond.append("""gle.cost_center = %s """ % (frappe.db.escape(cost_center, percent=False),))
 
 	if account:
 
-		if not (frappe.flags.ignore_account_permission
-			or ignore_account_permission):
+		if not (frappe.flags.ignore_account_permission or ignore_account_permission):
 			acc.check_permission("read")
 
-		if report_type == 'Profit and Loss':
+		if report_type == "Profit and Loss":
 			# for pl accounts, get balance within a fiscal year
-			cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
-				% year_start_date)
+			cond.append(
+				"posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" % year_start_date
+			)
 		# different filter for group and ledger - improved performance
 		if acc.is_group:
-			cond.append("""exists (
+			cond.append(
+				"""exists (
 				select name from `tabAccount` ac where ac.name = gle.account
 				and ac.lft >= %s and ac.rgt <= %s
-			)""" % (acc.lft, acc.rgt))
+			)"""
+				% (acc.lft, acc.rgt)
+			)
 
 			# If group and currency same as company,
 			# always return balance based on debit and credit in company currency
-			if acc.account_currency == frappe.get_cached_value('Company',  acc.company,  "default_currency"):
+			if acc.account_currency == frappe.get_cached_value("Company", acc.company, "default_currency"):
 				in_account_currency = False
 		else:
-			cond.append("""gle.account = %s """ % (frappe.db.escape(account, percent=False), ))
+			cond.append("""gle.account = %s """ % (frappe.db.escape(account, percent=False),))
 
 	if party_type and party:
-		cond.append("""gle.party_type = %s and gle.party = %s """ %
-			(frappe.db.escape(party_type), frappe.db.escape(party, percent=False)))
+		cond.append(
+			"""gle.party_type = %s and gle.party = %s """
+			% (frappe.db.escape(party_type), frappe.db.escape(party, percent=False))
+		)
 
 	if company:
 		cond.append("""gle.company = %s """ % (frappe.db.escape(company, percent=False)))
@@ -203,14 +243,19 @@
 			select_field = "sum(debit_in_account_currency) - sum(credit_in_account_currency)"
 		else:
 			select_field = "sum(debit) - sum(credit)"
-		bal = frappe.db.sql("""
+		bal = frappe.db.sql(
+			"""
 			SELECT {0}
 			FROM `tabGL Entry` gle
-			WHERE {1}""".format(select_field, " and ".join(cond)))[0][0]
+			WHERE {1}""".format(
+				select_field, " and ".join(cond)
+			)
+		)[0][0]
 
 		# if bal is None, return 0
 		return flt(bal)
 
+
 def get_count_on(account, fieldname, date):
 	cond = ["is_cancelled=0"]
 	if date:
@@ -238,53 +283,71 @@
 			acc.check_permission("read")
 
 		# for pl accounts, get balance within a fiscal year
-		if acc.report_type == 'Profit and Loss':
-			cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
-				% year_start_date)
+		if acc.report_type == "Profit and Loss":
+			cond.append(
+				"posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" % year_start_date
+			)
 
 		# different filter for group and ledger - improved performance
 		if acc.is_group:
-			cond.append("""exists (
+			cond.append(
+				"""exists (
 				select name from `tabAccount` ac where ac.name = gle.account
 				and ac.lft >= %s and ac.rgt <= %s
-			)""" % (acc.lft, acc.rgt))
+			)"""
+				% (acc.lft, acc.rgt)
+			)
 		else:
-			cond.append("""gle.account = %s """ % (frappe.db.escape(account, percent=False), ))
+			cond.append("""gle.account = %s """ % (frappe.db.escape(account, percent=False),))
 
-		entries = frappe.db.sql("""
+		entries = frappe.db.sql(
+			"""
 			SELECT name, posting_date, account, party_type, party,debit,credit,
 				voucher_type, voucher_no, against_voucher_type, against_voucher
 			FROM `tabGL Entry` gle
-			WHERE {0}""".format(" and ".join(cond)), as_dict=True)
+			WHERE {0}""".format(
+				" and ".join(cond)
+			),
+			as_dict=True,
+		)
 
 		count = 0
 		for gle in entries:
-			if fieldname not in ('invoiced_amount','payables'):
+			if fieldname not in ("invoiced_amount", "payables"):
 				count += 1
 			else:
 				dr_or_cr = "debit" if fieldname == "invoiced_amount" else "credit"
 				cr_or_dr = "credit" if fieldname == "invoiced_amount" else "debit"
-				select_fields = "ifnull(sum(credit-debit),0)" \
-					if fieldname == "invoiced_amount" else "ifnull(sum(debit-credit),0)"
+				select_fields = (
+					"ifnull(sum(credit-debit),0)"
+					if fieldname == "invoiced_amount"
+					else "ifnull(sum(debit-credit),0)"
+				)
 
-				if ((not gle.against_voucher) or (gle.against_voucher_type in ["Sales Order", "Purchase Order"]) or
-				(gle.against_voucher==gle.voucher_no and gle.get(dr_or_cr) > 0)):
-					payment_amount = frappe.db.sql("""
+				if (
+					(not gle.against_voucher)
+					or (gle.against_voucher_type in ["Sales Order", "Purchase Order"])
+					or (gle.against_voucher == gle.voucher_no and gle.get(dr_or_cr) > 0)
+				):
+					payment_amount = frappe.db.sql(
+						"""
 						SELECT {0}
 						FROM `tabGL Entry` gle
 						WHERE docstatus < 2 and posting_date <= %(date)s and against_voucher = %(voucher_no)s
-						and party = %(party)s and name != %(name)s"""
-						.format(select_fields),
-						{"date": date, "voucher_no": gle.voucher_no,
-							"party": gle.party, "name": gle.name})[0][0]
+						and party = %(party)s and name != %(name)s""".format(
+							select_fields
+						),
+						{"date": date, "voucher_no": gle.voucher_no, "party": gle.party, "name": gle.name},
+					)[0][0]
 
 					outstanding_amount = flt(gle.get(dr_or_cr)) - flt(gle.get(cr_or_dr)) - payment_amount
 					currency_precision = get_currency_precision() or 2
-					if abs(flt(outstanding_amount)) > 0.1/10**currency_precision:
+					if abs(flt(outstanding_amount)) > 0.1 / 10**currency_precision:
 						count += 1
 
 		return count
 
+
 @frappe.whitelist()
 def add_ac(args=None):
 	from frappe.desk.treeview import make_tree_args
@@ -316,6 +379,7 @@
 
 	return ac.name
 
+
 @frappe.whitelist()
 def add_cc(args=None):
 	from frappe.desk.treeview import make_tree_args
@@ -327,8 +391,9 @@
 	args = make_tree_args(**args)
 
 	if args.parent_cost_center == args.company:
-		args.parent_cost_center = "{0} - {1}".format(args.parent_cost_center,
-			frappe.get_cached_value('Company',  args.company,  'abbr'))
+		args.parent_cost_center = "{0} - {1}".format(
+			args.parent_cost_center, frappe.get_cached_value("Company", args.company, "abbr")
+		)
 
 	cc = frappe.new_doc("Cost Center")
 	cc.update(args)
@@ -340,9 +405,10 @@
 	cc.insert()
 	return cc.name
 
+
 def reconcile_against_document(args):
 	"""
-		Cancel PE or JV, Update against document, split if required and resubmit
+	Cancel PE or JV, Update against document, split if required and resubmit
 	"""
 	# To optimize making GL Entry for PE or JV with multiple references
 	reconciled_entries = {}
@@ -374,36 +440,44 @@
 		doc.save(ignore_permissions=True)
 		# re-submit advance entry
 		doc = frappe.get_doc(entry.voucher_type, entry.voucher_no)
-		doc.make_gl_entries(cancel = 0, adv_adj =1)
+		doc.make_gl_entries(cancel=0, adv_adj=1)
 		frappe.flags.ignore_party_validation = False
 
-		if entry.voucher_type in ('Payment Entry', 'Journal Entry'):
+		if entry.voucher_type in ("Payment Entry", "Journal Entry"):
 			doc.update_expense_claim()
 
+
 def check_if_advance_entry_modified(args):
 	"""
-		check if there is already a voucher reference
-		check if amount is same
-		check if jv is submitted
+	check if there is already a voucher reference
+	check if amount is same
+	check if jv is submitted
 	"""
-	if not args.get('unreconciled_amount'):
-		args.update({'unreconciled_amount': args.get('unadjusted_amount')})
+	if not args.get("unreconciled_amount"):
+		args.update({"unreconciled_amount": args.get("unadjusted_amount")})
 
 	ret = None
 	if args.voucher_type == "Journal Entry":
-		ret = frappe.db.sql("""
+		ret = frappe.db.sql(
+			"""
 			select t2.{dr_or_cr} from `tabJournal Entry` t1, `tabJournal Entry Account` t2
 			where t1.name = t2.parent and t2.account = %(account)s
 			and t2.party_type = %(party_type)s and t2.party = %(party)s
 			and (t2.reference_type is null or t2.reference_type in ("", "Sales Order", "Purchase Order"))
 			and t1.name = %(voucher_no)s and t2.name = %(voucher_detail_no)s
-			and t1.docstatus=1 """.format(dr_or_cr = args.get("dr_or_cr")), args)
+			and t1.docstatus=1 """.format(
+				dr_or_cr=args.get("dr_or_cr")
+			),
+			args,
+		)
 	else:
-		party_account_field = ("paid_from"
-			if erpnext.get_party_account_type(args.party_type) == 'Receivable' else "paid_to")
+		party_account_field = (
+			"paid_from" if erpnext.get_party_account_type(args.party_type) == "Receivable" else "paid_to"
+		)
 
 		if args.voucher_detail_no:
-			ret = frappe.db.sql("""select t1.name
+			ret = frappe.db.sql(
+				"""select t1.name
 				from `tabPayment Entry` t1, `tabPayment Entry Reference` t2
 				where
 					t1.name = t2.parent and t1.docstatus = 1
@@ -411,37 +485,53 @@
 					and t1.party_type = %(party_type)s and t1.party = %(party)s and t1.{0} = %(account)s
 					and t2.reference_doctype in ("", "Sales Order", "Purchase Order")
 					and t2.allocated_amount = %(unreconciled_amount)s
-			""".format(party_account_field), args)
+			""".format(
+					party_account_field
+				),
+				args,
+			)
 		else:
-			ret = frappe.db.sql("""select name from `tabPayment Entry`
+			ret = frappe.db.sql(
+				"""select name from `tabPayment Entry`
 				where
 					name = %(voucher_no)s and docstatus = 1
 					and party_type = %(party_type)s and party = %(party)s and {0} = %(account)s
 					and unallocated_amount = %(unreconciled_amount)s
-			""".format(party_account_field), args)
+			""".format(
+					party_account_field
+				),
+				args,
+			)
 
 	if not ret:
 		throw(_("""Payment Entry has been modified after you pulled it. Please pull it again."""))
 
+
 def validate_allocated_amount(args):
-	precision = args.get('precision') or frappe.db.get_single_value("System Settings", "currency_precision")
+	precision = args.get("precision") or frappe.db.get_single_value(
+		"System Settings", "currency_precision"
+	)
 	if args.get("allocated_amount") < 0:
 		throw(_("Allocated amount cannot be negative"))
 	elif flt(args.get("allocated_amount"), precision) > flt(args.get("unadjusted_amount"), precision):
 		throw(_("Allocated amount cannot be greater than unadjusted amount"))
 
+
 def update_reference_in_journal_entry(d, journal_entry, do_not_save=False):
 	"""
-		Updates against document, if partial amount splits into rows
+	Updates against document, if partial amount splits into rows
 	"""
 	jv_detail = journal_entry.get("accounts", {"name": d["voucher_detail_no"]})[0]
 
-	if flt(d['unadjusted_amount']) - flt(d['allocated_amount']) != 0:
+	if flt(d["unadjusted_amount"]) - flt(d["allocated_amount"]) != 0:
 		# adjust the unreconciled balance
-		amount_in_account_currency = flt(d['unadjusted_amount']) - flt(d['allocated_amount'])
+		amount_in_account_currency = flt(d["unadjusted_amount"]) - flt(d["allocated_amount"])
 		amount_in_company_currency = amount_in_account_currency * flt(jv_detail.exchange_rate)
-		jv_detail.set(d['dr_or_cr'], amount_in_account_currency)
-		jv_detail.set('debit' if d['dr_or_cr'] == 'debit_in_account_currency' else 'credit', amount_in_company_currency)
+		jv_detail.set(d["dr_or_cr"], amount_in_account_currency)
+		jv_detail.set(
+			"debit" if d["dr_or_cr"] == "debit_in_account_currency" else "credit",
+			amount_in_company_currency,
+		)
 	else:
 		journal_entry.remove(jv_detail)
 
@@ -451,12 +541,18 @@
 	new_row.update((frappe.copy_doc(jv_detail)).as_dict())
 
 	new_row.set(d["dr_or_cr"], d["allocated_amount"])
-	new_row.set('debit' if d['dr_or_cr'] == 'debit_in_account_currency' else 'credit',
-		d["allocated_amount"] * flt(jv_detail.exchange_rate))
+	new_row.set(
+		"debit" if d["dr_or_cr"] == "debit_in_account_currency" else "credit",
+		d["allocated_amount"] * flt(jv_detail.exchange_rate),
+	)
 
-	new_row.set('credit_in_account_currency' if d['dr_or_cr'] == 'debit_in_account_currency'
-		else 'debit_in_account_currency', 0)
-	new_row.set('credit' if d['dr_or_cr'] == 'debit_in_account_currency' else 'debit', 0)
+	new_row.set(
+		"credit_in_account_currency"
+		if d["dr_or_cr"] == "debit_in_account_currency"
+		else "debit_in_account_currency",
+		0,
+	)
+	new_row.set("credit" if d["dr_or_cr"] == "debit_in_account_currency" else "debit", 0)
 
 	new_row.set("reference_type", d["against_voucher_type"])
 	new_row.set("reference_name", d["against_voucher"])
@@ -470,6 +566,7 @@
 	if not do_not_save:
 		journal_entry.save(ignore_permissions=True)
 
+
 def update_reference_in_payment_entry(d, payment_entry, do_not_save=False):
 	reference_details = {
 		"reference_doctype": d.against_voucher_type,
@@ -477,8 +574,10 @@
 		"total_amount": d.grand_total,
 		"outstanding_amount": d.outstanding_amount,
 		"allocated_amount": d.allocated_amount,
-		"exchange_rate": d.exchange_rate if not d.exchange_gain_loss else payment_entry.get_exchange_rate(),
-		"exchange_gain_loss": d.exchange_gain_loss # only populated from invoice in case of advance allocation
+		"exchange_rate": d.exchange_rate
+		if not d.exchange_gain_loss
+		else payment_entry.get_exchange_rate(),
+		"exchange_gain_loss": d.exchange_gain_loss,  # only populated from invoice in case of advance allocation
 	}
 
 	if d.voucher_detail_no:
@@ -505,57 +604,75 @@
 
 	if d.difference_amount and d.difference_account:
 		account_details = {
-			'account': d.difference_account,
-			'cost_center': payment_entry.cost_center or frappe.get_cached_value('Company',
-				payment_entry.company, "cost_center")
+			"account": d.difference_account,
+			"cost_center": payment_entry.cost_center
+			or frappe.get_cached_value("Company", payment_entry.company, "cost_center"),
 		}
 		if d.difference_amount:
-			account_details['amount'] = d.difference_amount
+			account_details["amount"] = d.difference_amount
 
 		payment_entry.set_gain_or_loss(account_details=account_details)
 
 	if not do_not_save:
 		payment_entry.save(ignore_permissions=True)
 
+
 def unlink_ref_doc_from_payment_entries(ref_doc):
 	remove_ref_doc_link_from_jv(ref_doc.doctype, ref_doc.name)
 	remove_ref_doc_link_from_pe(ref_doc.doctype, ref_doc.name)
 
-	frappe.db.sql("""update `tabGL Entry`
+	frappe.db.sql(
+		"""update `tabGL Entry`
 		set against_voucher_type=null, against_voucher=null,
 		modified=%s, modified_by=%s
 		where against_voucher_type=%s and against_voucher=%s
 		and voucher_no != ifnull(against_voucher, '')""",
-		(now(), frappe.session.user, ref_doc.doctype, ref_doc.name))
+		(now(), frappe.session.user, ref_doc.doctype, ref_doc.name),
+	)
 
 	if ref_doc.doctype in ("Sales Invoice", "Purchase Invoice"):
 		ref_doc.set("advances", [])
 
-		frappe.db.sql("""delete from `tab{0} Advance` where parent = %s"""
-			.format(ref_doc.doctype), ref_doc.name)
+		frappe.db.sql(
+			"""delete from `tab{0} Advance` where parent = %s""".format(ref_doc.doctype), ref_doc.name
+		)
+
 
 def remove_ref_doc_link_from_jv(ref_type, ref_no):
-	linked_jv = frappe.db.sql_list("""select parent from `tabJournal Entry Account`
-		where reference_type=%s and reference_name=%s and docstatus < 2""", (ref_type, ref_no))
+	linked_jv = frappe.db.sql_list(
+		"""select parent from `tabJournal Entry Account`
+		where reference_type=%s and reference_name=%s and docstatus < 2""",
+		(ref_type, ref_no),
+	)
 
 	if linked_jv:
-		frappe.db.sql("""update `tabJournal Entry Account`
+		frappe.db.sql(
+			"""update `tabJournal Entry Account`
 			set reference_type=null, reference_name = null,
 			modified=%s, modified_by=%s
 			where reference_type=%s and reference_name=%s
-			and docstatus < 2""", (now(), frappe.session.user, ref_type, ref_no))
+			and docstatus < 2""",
+			(now(), frappe.session.user, ref_type, ref_no),
+		)
 
 		frappe.msgprint(_("Journal Entries {0} are un-linked").format("\n".join(linked_jv)))
 
+
 def remove_ref_doc_link_from_pe(ref_type, ref_no):
-	linked_pe = frappe.db.sql_list("""select parent from `tabPayment Entry Reference`
-		where reference_doctype=%s and reference_name=%s and docstatus < 2""", (ref_type, ref_no))
+	linked_pe = frappe.db.sql_list(
+		"""select parent from `tabPayment Entry Reference`
+		where reference_doctype=%s and reference_name=%s and docstatus < 2""",
+		(ref_type, ref_no),
+	)
 
 	if linked_pe:
-		frappe.db.sql("""update `tabPayment Entry Reference`
+		frappe.db.sql(
+			"""update `tabPayment Entry Reference`
 			set allocated_amount=0, modified=%s, modified_by=%s
 			where reference_doctype=%s and reference_name=%s
-			and docstatus < 2""", (now(), frappe.session.user, ref_type, ref_no))
+			and docstatus < 2""",
+			(now(), frappe.session.user, ref_type, ref_no),
+		)
 
 		for pe in linked_pe:
 			try:
@@ -565,42 +682,62 @@
 				pe_doc.validate_payment_type_with_outstanding()
 			except Exception as e:
 				msg = _("There were issues unlinking payment entry {0}.").format(pe_doc.name)
-				msg += '<br>'
+				msg += "<br>"
 				msg += _("Please cancel payment entry manually first")
 				frappe.throw(msg, exc=PaymentEntryUnlinkError, title=_("Payment Unlink Error"))
 
-			frappe.db.sql("""update `tabPayment Entry` set total_allocated_amount=%s,
+			frappe.db.sql(
+				"""update `tabPayment Entry` set total_allocated_amount=%s,
 				base_total_allocated_amount=%s, unallocated_amount=%s, modified=%s, modified_by=%s
-				where name=%s""", (pe_doc.total_allocated_amount, pe_doc.base_total_allocated_amount,
-					pe_doc.unallocated_amount, now(), frappe.session.user, pe))
+				where name=%s""",
+				(
+					pe_doc.total_allocated_amount,
+					pe_doc.base_total_allocated_amount,
+					pe_doc.unallocated_amount,
+					now(),
+					frappe.session.user,
+					pe,
+				),
+			)
 
 		frappe.msgprint(_("Payment Entries {0} are un-linked").format("\n".join(linked_pe)))
 
+
 @frappe.whitelist()
 def get_company_default(company, fieldname, ignore_validation=False):
-	value = frappe.get_cached_value('Company',  company,  fieldname)
+	value = frappe.get_cached_value("Company", company, fieldname)
 
 	if not ignore_validation and not value:
-		throw(_("Please set default {0} in Company {1}")
-			.format(frappe.get_meta("Company").get_label(fieldname), company))
+		throw(
+			_("Please set default {0} in Company {1}").format(
+				frappe.get_meta("Company").get_label(fieldname), company
+			)
+		)
 
 	return value
 
+
 def fix_total_debit_credit():
-	vouchers = frappe.db.sql("""select voucher_type, voucher_no,
+	vouchers = frappe.db.sql(
+		"""select voucher_type, voucher_no,
 		sum(debit) - sum(credit) as diff
 		from `tabGL Entry`
 		group by voucher_type, voucher_no
-		having sum(debit) != sum(credit)""", as_dict=1)
+		having sum(debit) != sum(credit)""",
+		as_dict=1,
+	)
 
 	for d in vouchers:
 		if abs(d.diff) > 0:
 			dr_or_cr = d.voucher_type == "Sales Invoice" and "credit" or "debit"
 
-			frappe.db.sql("""update `tabGL Entry` set %s = %s + %s
-				where voucher_type = %s and voucher_no = %s and %s > 0 limit 1""" %
-				(dr_or_cr, dr_or_cr, '%s', '%s', '%s', dr_or_cr),
-				(d.diff, d.voucher_type, d.voucher_no))
+			frappe.db.sql(
+				"""update `tabGL Entry` set %s = %s + %s
+				where voucher_type = %s and voucher_no = %s and %s > 0 limit 1"""
+				% (dr_or_cr, dr_or_cr, "%s", "%s", "%s", dr_or_cr),
+				(d.diff, d.voucher_type, d.voucher_no),
+			)
+
 
 def get_currency_precision():
 	precision = cint(frappe.db.get_default("currency_precision"))
@@ -610,29 +747,41 @@
 
 	return precision
 
-def get_stock_rbnb_difference(posting_date, company):
-	stock_items = frappe.db.sql_list("""select distinct item_code
-		from `tabStock Ledger Entry` where company=%s""", company)
 
-	pr_valuation_amount = frappe.db.sql("""
+def get_stock_rbnb_difference(posting_date, company):
+	stock_items = frappe.db.sql_list(
+		"""select distinct item_code
+		from `tabStock Ledger Entry` where company=%s""",
+		company,
+	)
+
+	pr_valuation_amount = frappe.db.sql(
+		"""
 		select sum(pr_item.valuation_rate * pr_item.qty * pr_item.conversion_factor)
 		from `tabPurchase Receipt Item` pr_item, `tabPurchase Receipt` pr
 		where pr.name = pr_item.parent and pr.docstatus=1 and pr.company=%s
-		and pr.posting_date <= %s and pr_item.item_code in (%s)""" %
-		('%s', '%s', ', '.join(['%s']*len(stock_items))), tuple([company, posting_date] + stock_items))[0][0]
+		and pr.posting_date <= %s and pr_item.item_code in (%s)"""
+		% ("%s", "%s", ", ".join(["%s"] * len(stock_items))),
+		tuple([company, posting_date] + stock_items),
+	)[0][0]
 
-	pi_valuation_amount = frappe.db.sql("""
+	pi_valuation_amount = frappe.db.sql(
+		"""
 		select sum(pi_item.valuation_rate * pi_item.qty * pi_item.conversion_factor)
 		from `tabPurchase Invoice Item` pi_item, `tabPurchase Invoice` pi
 		where pi.name = pi_item.parent and pi.docstatus=1 and pi.company=%s
-		and pi.posting_date <= %s and pi_item.item_code in (%s)""" %
-		('%s', '%s', ', '.join(['%s']*len(stock_items))), tuple([company, posting_date] + stock_items))[0][0]
+		and pi.posting_date <= %s and pi_item.item_code in (%s)"""
+		% ("%s", "%s", ", ".join(["%s"] * len(stock_items))),
+		tuple([company, posting_date] + stock_items),
+	)[0][0]
 
 	# Balance should be
 	stock_rbnb = flt(pr_valuation_amount, 2) - flt(pi_valuation_amount, 2)
 
 	# Balance as per system
-	stock_rbnb_account = "Stock Received But Not Billed - " + frappe.get_cached_value('Company',  company,  "abbr")
+	stock_rbnb_account = "Stock Received But Not Billed - " + frappe.get_cached_value(
+		"Company", company, "abbr"
+	)
 	sys_bal = get_balance_on(stock_rbnb_account, posting_date, in_account_currency=False)
 
 	# Amount should be credited
@@ -645,12 +794,12 @@
 	"""
 	held_invoices = None
 
-	if party_type == 'Supplier':
+	if party_type == "Supplier":
 		held_invoices = frappe.db.sql(
-			'select name from `tabPurchase Invoice` where release_date IS NOT NULL and release_date > CURDATE()',
-			as_dict=1
+			"select name from `tabPurchase Invoice` where release_date IS NOT NULL and release_date > CURDATE()",
+			as_dict=1,
 		)
-		held_invoices = set(d['name'] for d in held_invoices)
+		held_invoices = set(d["name"] for d in held_invoices)
 
 	return held_invoices
 
@@ -660,13 +809,15 @@
 	precision = frappe.get_precision("Sales Invoice", "outstanding_amount") or 2
 
 	if account:
-		root_type, account_type = frappe.get_cached_value("Account", account, ["root_type", "account_type"])
+		root_type, account_type = frappe.get_cached_value(
+			"Account", account, ["root_type", "account_type"]
+		)
 		party_account_type = "Receivable" if root_type == "Asset" else "Payable"
 		party_account_type = account_type or party_account_type
 	else:
 		party_account_type = erpnext.get_party_account_type(party_type)
 
-	if party_account_type == 'Receivable':
+	if party_account_type == "Receivable":
 		dr_or_cr = "debit_in_account_currency - credit_in_account_currency"
 		payment_dr_or_cr = "credit_in_account_currency - debit_in_account_currency"
 	else:
@@ -675,7 +826,8 @@
 
 	held_invoices = get_held_invoices(party_type, party)
 
-	invoice_list = frappe.db.sql("""
+	invoice_list = frappe.db.sql(
+		"""
 		select
 			voucher_no, voucher_type, posting_date, due_date,
 			ifnull(sum({dr_or_cr}), 0) as invoice_amount,
@@ -692,15 +844,18 @@
 				or (voucher_type not in ('Journal Entry', 'Payment Entry')))
 		group by voucher_type, voucher_no
 		order by posting_date, name""".format(
-			dr_or_cr=dr_or_cr,
-			condition=condition or ""
-		), {
+			dr_or_cr=dr_or_cr, condition=condition or ""
+		),
+		{
 			"party_type": party_type,
 			"party": party,
 			"account": account,
-		}, as_dict=True)
+		},
+		as_dict=True,
+	)
 
-	payment_entries = frappe.db.sql("""
+	payment_entries = frappe.db.sql(
+		"""
 		select against_voucher_type, against_voucher,
 			ifnull(sum({payment_dr_or_cr}), 0) as payment_amount
 		from `tabGL Entry`
@@ -710,11 +865,12 @@
 			and against_voucher is not null and against_voucher != ''
 			and is_cancelled=0
 		group by against_voucher_type, against_voucher
-	""".format(payment_dr_or_cr=payment_dr_or_cr), {
-		"party_type": party_type,
-		"party": party,
-		"account": account
-	}, as_dict=True)
+	""".format(
+			payment_dr_or_cr=payment_dr_or_cr
+		),
+		{"party_type": party_type, "party": party, "account": account},
+		as_dict=True,
+	)
 
 	pe_map = frappe._dict()
 	for d in payment_entries:
@@ -724,73 +880,87 @@
 		payment_amount = pe_map.get((d.voucher_type, d.voucher_no), 0)
 		outstanding_amount = flt(d.invoice_amount - payment_amount, precision)
 		if outstanding_amount > 0.5 / (10**precision):
-			if (filters and filters.get("outstanding_amt_greater_than") and
-				not (outstanding_amount >= filters.get("outstanding_amt_greater_than") and
-				outstanding_amount <= filters.get("outstanding_amt_less_than"))):
+			if (
+				filters
+				and filters.get("outstanding_amt_greater_than")
+				and not (
+					outstanding_amount >= filters.get("outstanding_amt_greater_than")
+					and outstanding_amount <= filters.get("outstanding_amt_less_than")
+				)
+			):
 				continue
 
 			if not d.voucher_type == "Purchase Invoice" or d.voucher_no not in held_invoices:
 				outstanding_invoices.append(
-					frappe._dict({
-						'voucher_no': d.voucher_no,
-						'voucher_type': d.voucher_type,
-						'posting_date': d.posting_date,
-						'invoice_amount': flt(d.invoice_amount),
-						'payment_amount': payment_amount,
-						'outstanding_amount': outstanding_amount,
-						'due_date': d.due_date,
-						'currency': d.currency
-					})
+					frappe._dict(
+						{
+							"voucher_no": d.voucher_no,
+							"voucher_type": d.voucher_type,
+							"posting_date": d.posting_date,
+							"invoice_amount": flt(d.invoice_amount),
+							"payment_amount": payment_amount,
+							"outstanding_amount": outstanding_amount,
+							"due_date": d.due_date,
+							"currency": d.currency,
+						}
+					)
 				)
 
-	outstanding_invoices = sorted(outstanding_invoices, key=lambda k: k['due_date'] or getdate(nowdate()))
+	outstanding_invoices = sorted(
+		outstanding_invoices, key=lambda k: k["due_date"] or getdate(nowdate())
+	)
 	return outstanding_invoices
 
 
-def get_account_name(account_type=None, root_type=None, is_group=None, account_currency=None, company=None):
+def get_account_name(
+	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")
+	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",
+	)
+
 
 @frappe.whitelist()
 def get_companies():
 	"""get a list of companies based on permission"""
-	return [d.name for d in frappe.get_list("Company", fields=["name"],
-		order_by="name")]
+	return [d.name for d in frappe.get_list("Company", fields=["name"], order_by="name")]
+
 
 @frappe.whitelist()
 def get_children(doctype, parent, company, is_root=False):
 	from erpnext.accounts.report.financial_statements import sort_accounts
 
-	parent_fieldname = 'parent_' + doctype.lower().replace(' ', '_')
-	fields = [
-		'name as value',
-		'is_group as expandable'
-	]
-	filters = [['docstatus', '<', 2]]
+	parent_fieldname = "parent_" + doctype.lower().replace(" ", "_")
+	fields = ["name as value", "is_group as expandable"]
+	filters = [["docstatus", "<", 2]]
 
-	filters.append(['ifnull(`{0}`,"")'.format(parent_fieldname), '=', '' if is_root else parent])
+	filters.append(['ifnull(`{0}`,"")'.format(parent_fieldname), "=", "" if is_root else parent])
 
 	if is_root:
-		fields += ['root_type', 'report_type', 'account_currency'] if doctype == 'Account' else []
-		filters.append(['company', '=', company])
+		fields += ["root_type", "report_type", "account_currency"] if doctype == "Account" else []
+		filters.append(["company", "=", company])
 
 	else:
-		fields += ['root_type', 'account_currency'] if doctype == 'Account' else []
-		fields += [parent_fieldname + ' as parent']
+		fields += ["root_type", "account_currency"] if doctype == "Account" else []
+		fields += [parent_fieldname + " as parent"]
 
 	acc = frappe.get_list(doctype, fields=fields, filters=filters)
 
-	if doctype == 'Account':
+	if doctype == "Account":
 		sort_accounts(acc, is_root, key="value")
 
 	return acc
 
+
 @frappe.whitelist()
 def get_account_balances(accounts, company):
 
@@ -800,16 +970,19 @@
 	if not accounts:
 		return []
 
-	company_currency = frappe.get_cached_value("Company",  company,  "default_currency")
+	company_currency = frappe.get_cached_value("Company", company, "default_currency")
 
 	for account in accounts:
 		account["company_currency"] = company_currency
-		account["balance"] = flt(get_balance_on(account["value"], in_account_currency=False, company=company))
+		account["balance"] = flt(
+			get_balance_on(account["value"], in_account_currency=False, company=company)
+		)
 		if account["account_currency"] and account["account_currency"] != company_currency:
 			account["balance_in_account_currency"] = flt(get_balance_on(account["value"], company=company))
 
 	return accounts
 
+
 def create_payment_gateway_account(gateway, payment_channel="Email"):
 	from erpnext.setup.setup_wizard.operations.install_fixtures import create_bank_account
 
@@ -818,13 +991,21 @@
 		return
 
 	# NOTE: we translate Payment Gateway account name because that is going to be used by the end user
-	bank_account = frappe.db.get_value("Account", {"account_name": _(gateway), "company": company},
-		["name", 'account_currency'], as_dict=1)
+	bank_account = frappe.db.get_value(
+		"Account",
+		{"account_name": _(gateway), "company": company},
+		["name", "account_currency"],
+		as_dict=1,
+	)
 
 	if not bank_account:
 		# check for untranslated one
-		bank_account = frappe.db.get_value("Account", {"account_name": gateway, "company": company},
-			["name", 'account_currency'], as_dict=1)
+		bank_account = frappe.db.get_value(
+			"Account",
+			{"account_name": gateway, "company": company},
+			["name", "account_currency"],
+			as_dict=1,
+		)
 
 	if not bank_account:
 		# try creating one
@@ -835,30 +1016,35 @@
 		return
 
 	# if payment gateway account exists, return
-	if frappe.db.exists("Payment Gateway Account",
-		{"payment_gateway": gateway, "currency": bank_account.account_currency}):
+	if frappe.db.exists(
+		"Payment Gateway Account",
+		{"payment_gateway": gateway, "currency": bank_account.account_currency},
+	):
 		return
 
 	try:
-		frappe.get_doc({
-			"doctype": "Payment Gateway Account",
-			"is_default": 1,
-			"payment_gateway": gateway,
-			"payment_account": bank_account.name,
-			"currency": bank_account.account_currency,
-			"payment_channel": payment_channel
-		}).insert(ignore_permissions=True, ignore_if_duplicate=True)
+		frappe.get_doc(
+			{
+				"doctype": "Payment Gateway Account",
+				"is_default": 1,
+				"payment_gateway": gateway,
+				"payment_account": bank_account.name,
+				"currency": bank_account.account_currency,
+				"payment_channel": payment_channel,
+			}
+		).insert(ignore_permissions=True, ignore_if_duplicate=True)
 
 	except frappe.DuplicateEntryError:
 		# already exists, due to a reinstall?
 		pass
 
+
 @frappe.whitelist()
 def update_cost_center(docname, cost_center_name, cost_center_number, company, merge):
-	'''
-		Renames the document by adding the number as a prefix to the current name and updates
-		all transaction where it was present.
-	'''
+	"""
+	Renames the document by adding the number as a prefix to the current name and updates
+	all transaction where it was present.
+	"""
 	validate_field_number("Cost Center", docname, cost_center_number, company, "cost_center_number")
 
 	if cost_center_number:
@@ -873,8 +1059,9 @@
 		frappe.rename_doc("Cost Center", docname, new_name, force=1, merge=merge)
 		return new_name
 
+
 def validate_field_number(doctype_name, docname, number_value, company, field_name):
-	''' Validate if the number entered isn't already assigned to some other document. '''
+	"""Validate if the number entered isn't already assigned to some other document."""
 	if number_value:
 		filters = {field_name: number_value, "name": ["!=", docname]}
 		if company:
@@ -883,20 +1070,25 @@
 		doctype_with_same_number = frappe.db.get_value(doctype_name, filters)
 
 		if doctype_with_same_number:
-			frappe.throw(_("{0} Number {1} is already used in {2} {3}")
-				.format(doctype_name, number_value, doctype_name.lower(), doctype_with_same_number))
+			frappe.throw(
+				_("{0} Number {1} is already used in {2} {3}").format(
+					doctype_name, number_value, doctype_name.lower(), doctype_with_same_number
+				)
+			)
+
 
 def get_autoname_with_number(number_value, doc_title, name, company):
-	''' append title with prefix as number and suffix as company's abbreviation separated by '-' '''
+	"""append title with prefix as number and suffix as company's abbreviation separated by '-'"""
 	if name:
-		name_split=name.split("-")
-		parts = [doc_title.strip(), name_split[len(name_split)-1].strip()]
+		name_split = name.split("-")
+		parts = [doc_title.strip(), name_split[len(name_split) - 1].strip()]
 	else:
-		abbr = frappe.get_cached_value('Company',  company,  ["abbr"], as_dict=True)
+		abbr = frappe.get_cached_value("Company", company, ["abbr"], as_dict=True)
 		parts = [doc_title.strip(), abbr.abbr]
 	if cstr(number_value).strip():
 		parts.insert(0, cstr(number_value).strip())
-	return ' - '.join(parts)
+	return " - ".join(parts)
+
 
 @frappe.whitelist()
 def get_coa(doctype, parent, is_root, chart=None):
@@ -908,24 +1100,38 @@
 	chart = chart if chart else frappe.flags.chart
 	frappe.flags.chart = chart
 
-	parent = None if parent==_('All Accounts') else parent
-	accounts = build_tree_from_json(chart) # returns alist of dict in a tree render-able form
+	parent = None if parent == _("All Accounts") else parent
+	accounts = build_tree_from_json(chart)  # returns alist of dict in a tree render-able form
 
 	# filter out to show data for the selected node only
-	accounts = [d for d in accounts if d['parent_account']==parent]
+	accounts = [d for d in accounts if d["parent_account"] == parent]
 
 	return accounts
 
-def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for_items=None,
-		warehouse_account=None, company=None):
-	stock_vouchers = get_future_stock_vouchers(posting_date, posting_time, for_warehouses, for_items, company)
+
+def update_gl_entries_after(
+	posting_date,
+	posting_time,
+	for_warehouses=None,
+	for_items=None,
+	warehouse_account=None,
+	company=None,
+):
+	stock_vouchers = get_future_stock_vouchers(
+		posting_date, posting_time, for_warehouses, for_items, company
+	)
 	repost_gle_for_stock_vouchers(stock_vouchers, posting_date, company, warehouse_account)
 
 
-def repost_gle_for_stock_vouchers(stock_vouchers, posting_date, company=None, warehouse_account=None):
+def repost_gle_for_stock_vouchers(
+	stock_vouchers, posting_date, company=None, warehouse_account=None
+):
 	def _delete_gl_entries(voucher_type, voucher_no):
-		frappe.db.sql("""delete from `tabGL Entry`
-			where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no))
+		frappe.db.sql(
+			"""delete from `tabGL Entry`
+			where voucher_type=%s and voucher_no=%s""",
+			(voucher_type, voucher_no),
+		)
 
 	if not warehouse_account:
 		warehouse_account = get_warehouse_account_map(company)
@@ -938,13 +1144,18 @@
 		voucher_obj = frappe.get_cached_doc(voucher_type, voucher_no)
 		expected_gle = voucher_obj.get_gl_entries(warehouse_account)
 		if expected_gle:
-			if not existing_gle or not compare_existing_and_expected_gle(existing_gle, expected_gle, precision):
+			if not existing_gle or not compare_existing_and_expected_gle(
+				existing_gle, expected_gle, precision
+			):
 				_delete_gl_entries(voucher_type, voucher_no)
 				voucher_obj.make_gl_entries(gl_entries=expected_gle, from_repost=True)
 		else:
 			_delete_gl_entries(voucher_type, voucher_no)
 
-def get_future_stock_vouchers(posting_date, posting_time, for_warehouses=None, for_items=None, company=None):
+
+def get_future_stock_vouchers(
+	posting_date, posting_time, for_warehouses=None, for_items=None, company=None
+):
 
 	values = []
 	condition = ""
@@ -960,25 +1171,31 @@
 		condition += " and company = %s"
 		values.append(company)
 
-	future_stock_vouchers = frappe.db.sql("""select distinct sle.voucher_type, sle.voucher_no
+	future_stock_vouchers = frappe.db.sql(
+		"""select distinct sle.voucher_type, sle.voucher_no
 		from `tabStock Ledger Entry` sle
 		where
 			timestamp(sle.posting_date, sle.posting_time) >= timestamp(%s, %s)
 			and is_cancelled = 0
 			{condition}
-		order by timestamp(sle.posting_date, sle.posting_time) asc, creation asc for update""".format(condition=condition),
-		tuple([posting_date, posting_time] + values), as_dict=True)
+		order by timestamp(sle.posting_date, sle.posting_time) asc, creation asc for update""".format(
+			condition=condition
+		),
+		tuple([posting_date, posting_time] + values),
+		as_dict=True,
+	)
 
 	return [(d.voucher_type, d.voucher_no) for d in future_stock_vouchers]
 
+
 def get_voucherwise_gl_entries(future_stock_vouchers, posting_date):
-	""" Get voucherwise list of GL entries.
+	"""Get voucherwise list of GL entries.
 
 	Only fetches GLE fields required for comparing with new GLE.
 	Check compare_existing_and_expected_gle function below.
 
 	returns:
-		Dict[Tuple[voucher_type, voucher_no], List[GL Entries]]
+	        Dict[Tuple[voucher_type, voucher_no], List[GL Entries]]
 	"""
 	gl_entries = {}
 	if not future_stock_vouchers:
@@ -986,19 +1203,23 @@
 
 	voucher_nos = [d[1] for d in future_stock_vouchers]
 
-	gles = frappe.db.sql("""
+	gles = frappe.db.sql(
+		"""
 		select name, account, credit, debit, cost_center, project, voucher_type, voucher_no
 			from `tabGL Entry`
 		where
-			posting_date >= %s and voucher_no in (%s)""" %
-		('%s', ', '.join(['%s'] * len(voucher_nos))),
-		tuple([posting_date] + voucher_nos), as_dict=1)
+			posting_date >= %s and voucher_no in (%s)"""
+		% ("%s", ", ".join(["%s"] * len(voucher_nos))),
+		tuple([posting_date] + voucher_nos),
+		as_dict=1,
+	)
 
 	for d in gles:
 		gl_entries.setdefault((d.voucher_type, d.voucher_no), []).append(d)
 
 	return gl_entries
 
+
 def compare_existing_and_expected_gle(existing_gle, expected_gle, precision):
 	if len(existing_gle) != len(expected_gle):
 		return False
@@ -1009,10 +1230,14 @@
 		for e in existing_gle:
 			if entry.account == e.account:
 				account_existed = True
-			if (entry.account == e.account
-					and (not entry.cost_center or not e.cost_center or entry.cost_center == e.cost_center)
-					and ( flt(entry.debit, precision) != flt(e.debit, precision) or
-						flt(entry.credit, precision) != flt(e.credit, precision))):
+			if (
+				entry.account == e.account
+				and (not entry.cost_center or not e.cost_center or entry.cost_center == e.cost_center)
+				and (
+					flt(entry.debit, precision) != flt(e.debit, precision)
+					or flt(entry.credit, precision) != flt(e.credit, precision)
+				)
+			):
 				matched = False
 				break
 		if not account_existed:
@@ -1020,7 +1245,10 @@
 			break
 	return matched
 
-def check_if_stock_and_account_balance_synced(posting_date, company, voucher_type=None, voucher_no=None):
+
+def check_if_stock_and_account_balance_synced(
+	posting_date, company, voucher_type=None, voucher_no=None
+):
 	if not cint(erpnext.is_perpetual_inventory_enabled(company)):
 		return
 
@@ -1028,61 +1256,81 @@
 	stock_adjustment_account = frappe.db.get_value("Company", company, "stock_adjustment_account")
 
 	for account in accounts:
-		account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(account,
-			posting_date, company)
+		account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(
+			account, posting_date, company
+		)
 
 		if abs(account_bal - stock_bal) > 0.1:
-			precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"),
-				currency=frappe.get_cached_value('Company',  company,  "default_currency"))
+			precision = get_field_precision(
+				frappe.get_meta("GL Entry").get_field("debit"),
+				currency=frappe.get_cached_value("Company", company, "default_currency"),
+			)
 
 			diff = flt(stock_bal - account_bal, precision)
 
-			error_reason = _("Stock Value ({0}) and Account Balance ({1}) are out of sync for account {2} and it's linked warehouses as on {3}.").format(
-				stock_bal, account_bal, frappe.bold(account), posting_date)
-			error_resolution = _("Please create an adjustment Journal Entry for amount {0} on {1}")\
-				.format(frappe.bold(diff), frappe.bold(posting_date))
+			error_reason = _(
+				"Stock Value ({0}) and Account Balance ({1}) are out of sync for account {2} and it's linked warehouses as on {3}."
+			).format(stock_bal, account_bal, frappe.bold(account), posting_date)
+			error_resolution = _("Please create an adjustment Journal Entry for amount {0} on {1}").format(
+				frappe.bold(diff), frappe.bold(posting_date)
+			)
 
 			frappe.msgprint(
 				msg="""{0}<br></br>{1}<br></br>""".format(error_reason, error_resolution),
 				raise_exception=StockValueAndAccountBalanceOutOfSync,
-				title=_('Values Out Of Sync'),
+				title=_("Values Out Of Sync"),
 				primary_action={
-					'label': _('Make Journal Entry'),
-					'client_action': 'erpnext.route_to_adjustment_jv',
-					'args': get_journal_entry(account, stock_adjustment_account, diff)
-				})
+					"label": _("Make Journal Entry"),
+					"client_action": "erpnext.route_to_adjustment_jv",
+					"args": get_journal_entry(account, stock_adjustment_account, diff),
+				},
+			)
+
 
 def get_stock_accounts(company, voucher_type=None, voucher_no=None):
-	stock_accounts = [d.name for d in frappe.db.get_all("Account", {
-		"account_type": "Stock",
-		"company": company,
-		"is_group": 0
-	})]
+	stock_accounts = [
+		d.name
+		for d in frappe.db.get_all(
+			"Account", {"account_type": "Stock", "company": company, "is_group": 0}
+		)
+	]
 	if voucher_type and voucher_no:
 		if voucher_type == "Journal Entry":
-			stock_accounts = [d.account for d in frappe.db.get_all("Journal Entry Account", {
-				"parent": voucher_no,
-				"account": ["in", stock_accounts]
-			}, "account")]
+			stock_accounts = [
+				d.account
+				for d in frappe.db.get_all(
+					"Journal Entry Account", {"parent": voucher_no, "account": ["in", stock_accounts]}, "account"
+				)
+			]
 
 		else:
-			stock_accounts = [d.account for d in frappe.db.get_all("GL Entry", {
-				"voucher_type": voucher_type,
-				"voucher_no": voucher_no,
-				"account": ["in", stock_accounts]
-			}, "account")]
+			stock_accounts = [
+				d.account
+				for d in frappe.db.get_all(
+					"GL Entry",
+					{"voucher_type": voucher_type, "voucher_no": voucher_no, "account": ["in", stock_accounts]},
+					"account",
+				)
+			]
 
 	return stock_accounts
 
+
 def get_stock_and_account_balance(account=None, posting_date=None, company=None):
-	if not posting_date: posting_date = nowdate()
+	if not posting_date:
+		posting_date = nowdate()
 
 	warehouse_account = get_warehouse_account_map(company)
 
-	account_balance = get_balance_on(account, posting_date, in_account_currency=False, ignore_account_permission=True)
+	account_balance = get_balance_on(
+		account, posting_date, in_account_currency=False, ignore_account_permission=True
+	)
 
-	related_warehouses = [wh for wh, wh_details in warehouse_account.items()
-		if wh_details.account == account and not wh_details.is_group]
+	related_warehouses = [
+		wh
+		for wh, wh_details in warehouse_account.items()
+		if wh_details.account == account and not wh_details.is_group
+	]
 
 	total_stock_value = 0.0
 	for warehouse in related_warehouses:
@@ -1092,27 +1340,26 @@
 	precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
 	return flt(account_balance, precision), flt(total_stock_value, precision), related_warehouses
 
+
 def get_journal_entry(account, stock_adjustment_account, amount):
-	db_or_cr_warehouse_account =('credit_in_account_currency' if amount < 0 else 'debit_in_account_currency')
-	db_or_cr_stock_adjustment_account = ('debit_in_account_currency' if amount < 0 else 'credit_in_account_currency')
+	db_or_cr_warehouse_account = (
+		"credit_in_account_currency" if amount < 0 else "debit_in_account_currency"
+	)
+	db_or_cr_stock_adjustment_account = (
+		"debit_in_account_currency" if amount < 0 else "credit_in_account_currency"
+	)
 
 	return {
-		'accounts':[{
-			'account': account,
-			db_or_cr_warehouse_account: abs(amount)
-		}, {
-			'account': stock_adjustment_account,
-			db_or_cr_stock_adjustment_account : abs(amount)
-		}]
+		"accounts": [
+			{"account": account, db_or_cr_warehouse_account: abs(amount)},
+			{"account": stock_adjustment_account, db_or_cr_stock_adjustment_account: abs(amount)},
+		]
 	}
 
+
 def check_and_delete_linked_reports(report):
-	""" Check if reports are referenced in Desktop Icon """
-	icons = frappe.get_all("Desktop Icon",
-						fields = ['name'],
-						filters = {
-							"_report": report
-						})
+	"""Check if reports are referenced in Desktop Icon"""
+	icons = frappe.get_all("Desktop Icon", fields=["name"], filters={"_report": report})
 	if icons:
 		for icon in icons:
 			frappe.delete_doc("Desktop Icon", icon)
diff --git a/erpnext/assets/dashboard_fixtures.py b/erpnext/assets/dashboard_fixtures.py
index 39f0f1a..fc9ba38 100644
--- a/erpnext/assets/dashboard_fixtures.py
+++ b/erpnext/assets/dashboard_fixtures.py
@@ -18,30 +18,36 @@
 	if not fiscal_year:
 		return frappe._dict()
 
-	year_start_date = get_date_str(fiscal_year.get('year_start_date'))
-	year_end_date = get_date_str(fiscal_year.get('year_end_date'))
+	year_start_date = get_date_str(fiscal_year.get("year_start_date"))
+	year_end_date = get_date_str(fiscal_year.get("year_end_date"))
 
-	return frappe._dict({
-		"dashboards": get_dashboards(),
-		"charts": get_charts(fiscal_year, year_start_date, year_end_date),
-		"number_cards": get_number_cards(fiscal_year, year_start_date, year_end_date),
-	})
+	return frappe._dict(
+		{
+			"dashboards": get_dashboards(),
+			"charts": get_charts(fiscal_year, year_start_date, year_end_date),
+			"number_cards": get_number_cards(fiscal_year, year_start_date, year_end_date),
+		}
+	)
+
 
 def get_dashboards():
-	return [{
-		"name": "Asset",
-		"dashboard_name": "Asset",
-        "charts": [
-			{ "chart": "Asset Value Analytics", "width": "Full" },
-            { "chart": "Category-wise Asset Value", "width": "Half" },
-            { "chart": "Location-wise Asset Value", "width": "Half" },
-        ],
-		"cards": [
-			{"card": "Total Assets"},
-			{"card": "New Assets (This Year)"},
-			{"card": "Asset Value"}
-		]
-    }]
+	return [
+		{
+			"name": "Asset",
+			"dashboard_name": "Asset",
+			"charts": [
+				{"chart": "Asset Value Analytics", "width": "Full"},
+				{"chart": "Category-wise Asset Value", "width": "Half"},
+				{"chart": "Location-wise Asset Value", "width": "Half"},
+			],
+			"cards": [
+				{"card": "Total Assets"},
+				{"card": "New Assets (This Year)"},
+				{"card": "Asset Value"},
+			],
+		}
+	]
+
 
 def get_charts(fiscal_year, year_start_date, year_end_date):
 	company = get_company_for_dashboards()
@@ -58,26 +64,30 @@
 			"timespan": "Last Year",
 			"time_interval": "Yearly",
 			"timeseries": 0,
-			"filters_json": json.dumps({
-				"company": company,
-				"status": "In Location",
-				"filter_based_on": "Fiscal Year",
-				"from_fiscal_year": fiscal_year.get('name'),
-				"to_fiscal_year": fiscal_year.get('name'),
-				"period_start_date": year_start_date,
-				"period_end_date": year_end_date,
-				"date_based_on": "Purchase Date",
-				"group_by": "--Select a group--"
-			}),
+			"filters_json": json.dumps(
+				{
+					"company": company,
+					"status": "In Location",
+					"filter_based_on": "Fiscal Year",
+					"from_fiscal_year": fiscal_year.get("name"),
+					"to_fiscal_year": fiscal_year.get("name"),
+					"period_start_date": year_start_date,
+					"period_end_date": year_end_date,
+					"date_based_on": "Purchase Date",
+					"group_by": "--Select a group--",
+				}
+			),
 			"type": "Bar",
-			"custom_options": json.dumps({
-				"type": "bar",
-				"barOptions": { "stacked": 1 },
-				"axisOptions": { "shortenYAxisNumbers": 1 },
-				"tooltipOptions": {}
-			}),
+			"custom_options": json.dumps(
+				{
+					"type": "bar",
+					"barOptions": {"stacked": 1},
+					"axisOptions": {"shortenYAxisNumbers": 1},
+					"tooltipOptions": {},
+				}
+			),
 			"doctype": "Dashboard Chart",
-			"y_axis": []
+			"y_axis": [],
 		},
 		{
 			"name": "Category-wise Asset Value",
@@ -86,12 +96,14 @@
 			"report_name": "Fixed Asset Register",
 			"x_field": "asset_category",
 			"timeseries": 0,
-			"filters_json": json.dumps({
-				"company": company,
-				"status":"In Location",
-				"group_by":"Asset Category",
-				"is_existing_asset":0
-			}),
+			"filters_json": json.dumps(
+				{
+					"company": company,
+					"status": "In Location",
+					"group_by": "Asset Category",
+					"is_existing_asset": 0,
+				}
+			),
 			"type": "Donut",
 			"doctype": "Dashboard Chart",
 			"y_axis": [
@@ -100,14 +112,12 @@
 					"parentfield": "y_axis",
 					"parenttype": "Dashboard Chart",
 					"y_field": "asset_value",
-					"doctype": "Dashboard Chart Field"
+					"doctype": "Dashboard Chart Field",
 				}
 			],
-			"custom_options": json.dumps({
-				"type": "donut",
-				"height": 300,
-				"axisOptions": {"shortenYAxisNumbers": 1}
-			})
+			"custom_options": json.dumps(
+				{"type": "donut", "height": 300, "axisOptions": {"shortenYAxisNumbers": 1}}
+			),
 		},
 		{
 			"name": "Location-wise Asset Value",
@@ -116,12 +126,9 @@
 			"report_name": "Fixed Asset Register",
 			"x_field": "location",
 			"timeseries": 0,
-			"filters_json": json.dumps({
-				"company": company,
-				"status":"In Location",
-				"group_by":"Location",
-				"is_existing_asset":0
-			}),
+			"filters_json": json.dumps(
+				{"company": company, "status": "In Location", "group_by": "Location", "is_existing_asset": 0}
+			),
 			"type": "Donut",
 			"doctype": "Dashboard Chart",
 			"y_axis": [
@@ -130,17 +137,16 @@
 					"parentfield": "y_axis",
 					"parenttype": "Dashboard Chart",
 					"y_field": "asset_value",
-					"doctype": "Dashboard Chart Field"
+					"doctype": "Dashboard Chart Field",
 				}
 			],
-			"custom_options": json.dumps({
-				"type": "donut",
-				"height": 300,
-				"axisOptions": {"shortenYAxisNumbers": 1}
-			})
-		}
+			"custom_options": json.dumps(
+				{"type": "donut", "height": 300, "axisOptions": {"shortenYAxisNumbers": 1}}
+			),
+		},
 	]
 
+
 def get_number_cards(fiscal_year, year_start_date, year_end_date):
 	return [
 		{
@@ -162,9 +168,9 @@
 			"is_public": 1,
 			"show_percentage_stats": 1,
 			"stats_time_interval": "Monthly",
-			"filters_json": json.dumps([
-				['Asset', 'creation', 'between', [year_start_date, year_end_date]]
-			]),
+			"filters_json": json.dumps(
+				[["Asset", "creation", "between", [year_start_date, year_end_date]]]
+			),
 			"doctype": "Number Card",
 		},
 		{
@@ -177,6 +183,6 @@
 			"show_percentage_stats": 1,
 			"stats_time_interval": "Monthly",
 			"filters_json": "[]",
-			"doctype": "Number Card"
-		}
+			"doctype": "Number Card",
+		},
 	]
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index ea473fa..257488d 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -58,21 +58,26 @@
 		self.cancel_movement_entries()
 		self.delete_depreciation_entries()
 		self.set_status()
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
-		make_reverse_gl_entries(voucher_type='Asset', voucher_no=self.name)
-		self.db_set('booked_fixed_asset', 0)
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
+		make_reverse_gl_entries(voucher_type="Asset", voucher_no=self.name)
+		self.db_set("booked_fixed_asset", 0)
 
 	def validate_asset_and_reference(self):
 		if self.purchase_invoice or self.purchase_receipt:
-			reference_doc = 'Purchase Invoice' if self.purchase_invoice else 'Purchase Receipt'
+			reference_doc = "Purchase Invoice" if self.purchase_invoice else "Purchase Receipt"
 			reference_name = self.purchase_invoice or self.purchase_receipt
 			reference_doc = frappe.get_doc(reference_doc, reference_name)
-			if reference_doc.get('company') != self.company:
-				frappe.throw(_("Company of asset {0} and purchase document {1} doesn't matches.").format(self.name, reference_doc.get('name')))
-
+			if reference_doc.get("company") != self.company:
+				frappe.throw(
+					_("Company of asset {0} and purchase document {1} doesn't matches.").format(
+						self.name, reference_doc.get("name")
+					)
+				)
 
 		if self.is_existing_asset and self.purchase_invoice:
-			frappe.throw(_("Purchase Invoice cannot be made against an existing asset {0}").format(self.name))
+			frappe.throw(
+				_("Purchase Invoice cannot be made against an existing asset {0}").format(self.name)
+			)
 
 	def prepare_depreciation_data(self, date_of_sale=None, date_of_return=None):
 		if self.calculate_depreciation:
@@ -82,12 +87,14 @@
 			self.set_accumulated_depreciation(date_of_sale, date_of_return)
 		else:
 			self.finance_books = []
-			self.value_after_depreciation = (flt(self.gross_purchase_amount) -
-				flt(self.opening_accumulated_depreciation))
+			self.value_after_depreciation = flt(self.gross_purchase_amount) - flt(
+				self.opening_accumulated_depreciation
+			)
 
 	def validate_item(self):
-		item = frappe.get_cached_value("Item", self.item_code,
-			["is_fixed_asset", "is_stock_item", "disabled"], as_dict=1)
+		item = frappe.get_cached_value(
+			"Item", self.item_code, ["is_fixed_asset", "is_stock_item", "disabled"], as_dict=1
+		)
 		if not item:
 			frappe.throw(_("Item {0} does not exist").format(self.item_code))
 		elif item.disabled:
@@ -98,16 +105,16 @@
 			frappe.throw(_("Item {0} must be a non-stock item").format(self.item_code))
 
 	def validate_cost_center(self):
-		if not self.cost_center: return
+		if not self.cost_center:
+			return
 
-		cost_center_company = frappe.db.get_value('Cost Center', self.cost_center, 'company')
+		cost_center_company = frappe.db.get_value("Cost Center", self.cost_center, "company")
 		if cost_center_company != self.company:
 			frappe.throw(
 				_("Selected Cost Center {} doesn't belongs to {}").format(
-					frappe.bold(self.cost_center),
-					frappe.bold(self.company)
+					frappe.bold(self.cost_center), frappe.bold(self.company)
 				),
-				title=_("Invalid Cost Center")
+				title=_("Invalid Cost Center"),
 			)
 
 	def validate_in_use_date(self):
@@ -116,16 +123,20 @@
 
 		for d in self.finance_books:
 			if d.depreciation_start_date == self.available_for_use_date:
-				frappe.throw(_("Row #{}: Depreciation Posting Date should not be equal to Available for Use Date.").format(d.idx),
-					title=_("Incorrect Date"))
+				frappe.throw(
+					_("Row #{}: Depreciation Posting Date should not be equal to Available for Use Date.").format(
+						d.idx
+					),
+					title=_("Incorrect Date"),
+				)
 
 	def set_missing_values(self):
 		if not self.asset_category:
 			self.asset_category = frappe.get_cached_value("Item", self.item_code, "asset_category")
 
-		if self.item_code and not self.get('finance_books'):
+		if self.item_code and not self.get("finance_books"):
 			finance_books = get_item_details(self.item_code, self.asset_category)
-			self.set('finance_books', finance_books)
+			self.set("finance_books", finance_books)
 
 	def validate_asset_values(self):
 		if not self.asset_category:
@@ -136,13 +147,20 @@
 
 		if is_cwip_accounting_enabled(self.asset_category):
 			if not self.is_existing_asset and not (self.purchase_receipt or self.purchase_invoice):
-				frappe.throw(_("Please create purchase receipt or purchase invoice for the item {0}").
-					format(self.item_code))
+				frappe.throw(
+					_("Please create purchase receipt or purchase invoice for the item {0}").format(
+						self.item_code
+					)
+				)
 
-			if (not self.purchase_receipt and self.purchase_invoice
-				and not frappe.db.get_value('Purchase Invoice', self.purchase_invoice, 'update_stock')):
-				frappe.throw(_("Update stock must be enable for the purchase invoice {0}").
-					format(self.purchase_invoice))
+			if (
+				not self.purchase_receipt
+				and self.purchase_invoice
+				and not frappe.db.get_value("Purchase Invoice", self.purchase_invoice, "update_stock")
+			):
+				frappe.throw(
+					_("Update stock must be enable for the purchase invoice {0}").format(self.purchase_invoice)
+				)
 
 		if not self.calculate_depreciation:
 			return
@@ -152,49 +170,63 @@
 		if self.is_existing_asset:
 			return
 
-		if self.available_for_use_date and getdate(self.available_for_use_date) < getdate(self.purchase_date):
+		if self.available_for_use_date and getdate(self.available_for_use_date) < getdate(
+			self.purchase_date
+		):
 			frappe.throw(_("Available-for-use Date should be after purchase date"))
 
 	def validate_gross_and_purchase_amount(self):
-		if self.is_existing_asset: return
+		if self.is_existing_asset:
+			return
 
 		if self.gross_purchase_amount and self.gross_purchase_amount != self.purchase_receipt_amount:
-			error_message = _("Gross Purchase Amount should be <b>equal</b> to purchase amount of one single Asset.")
+			error_message = _(
+				"Gross Purchase Amount should be <b>equal</b> to purchase amount of one single Asset."
+			)
 			error_message += "<br>"
 			error_message += _("Please do not book expense of multiple assets against one single Asset.")
 			frappe.throw(error_message, title=_("Invalid Gross Purchase Amount"))
 
 	def make_asset_movement(self):
-		reference_doctype = 'Purchase Receipt' if self.purchase_receipt else 'Purchase Invoice'
+		reference_doctype = "Purchase Receipt" if self.purchase_receipt else "Purchase Invoice"
 		reference_docname = self.purchase_receipt or self.purchase_invoice
 		transaction_date = getdate(self.purchase_date)
 		if reference_docname:
-			posting_date, posting_time = frappe.db.get_value(reference_doctype, reference_docname, ["posting_date", "posting_time"])
+			posting_date, posting_time = frappe.db.get_value(
+				reference_doctype, reference_docname, ["posting_date", "posting_time"]
+			)
 			transaction_date = get_datetime("{} {}".format(posting_date, posting_time))
-		assets = [{
-			'asset': self.name,
-			'asset_name': self.asset_name,
-			'target_location': self.location,
-			'to_employee': self.custodian
-		}]
-		asset_movement = frappe.get_doc({
-			'doctype': 'Asset Movement',
-			'assets': assets,
-			'purpose': 'Receipt',
-			'company': self.company,
-			'transaction_date': transaction_date,
-			'reference_doctype': reference_doctype,
-			'reference_name': reference_docname
-		}).insert()
+		assets = [
+			{
+				"asset": self.name,
+				"asset_name": self.asset_name,
+				"target_location": self.location,
+				"to_employee": self.custodian,
+			}
+		]
+		asset_movement = frappe.get_doc(
+			{
+				"doctype": "Asset Movement",
+				"assets": assets,
+				"purpose": "Receipt",
+				"company": self.company,
+				"transaction_date": transaction_date,
+				"reference_doctype": reference_doctype,
+				"reference_name": reference_docname,
+			}
+		).insert()
 		asset_movement.submit()
 
 	def set_depreciation_rate(self):
 		for d in self.get("finance_books"):
-			d.rate_of_depreciation = flt(self.get_depreciation_rate(d, on_validate=True),
-				d.precision("rate_of_depreciation"))
+			d.rate_of_depreciation = flt(
+				self.get_depreciation_rate(d, on_validate=True), d.precision("rate_of_depreciation")
+			)
 
 	def make_depreciation_schedule(self, date_of_sale):
-		if 'Manual' not in [d.depreciation_method for d in self.finance_books] and not self.get('schedules'):
+		if "Manual" not in [d.depreciation_method for d in self.finance_books] and not self.get(
+			"schedules"
+		):
 			self.schedules = []
 
 		if not self.available_for_use_date:
@@ -202,7 +234,7 @@
 
 		start = self.clear_depreciation_schedule()
 
-		for finance_book in self.get('finance_books'):
+		for finance_book in self.get("finance_books"):
 			self._make_depreciation_schedule(finance_book, start, date_of_sale)
 
 	def _make_depreciation_schedule(self, finance_book, start, date_of_sale):
@@ -211,8 +243,9 @@
 		value_after_depreciation = self._get_value_after_depreciation(finance_book)
 		finance_book.value_after_depreciation = value_after_depreciation
 
-		number_of_pending_depreciations = cint(finance_book.total_number_of_depreciations) - \
-			cint(self.number_of_depreciations_booked)
+		number_of_pending_depreciations = cint(finance_book.total_number_of_depreciations) - cint(
+			self.number_of_depreciations_booked
+		)
 
 		has_pro_rata = self.check_is_pro_rata(finance_book)
 		if has_pro_rata:
@@ -220,70 +253,89 @@
 
 		skip_row = False
 
-		for n in range(start[finance_book.idx-1], number_of_pending_depreciations):
+		for n in range(start[finance_book.idx - 1], number_of_pending_depreciations):
 			# If depreciation is already completed (for double declining balance)
-			if skip_row: continue
+			if skip_row:
+				continue
 
 			depreciation_amount = get_depreciation_amount(self, value_after_depreciation, finance_book)
 
 			if not has_pro_rata or n < cint(number_of_pending_depreciations) - 1:
-				schedule_date = add_months(finance_book.depreciation_start_date,
-					n * cint(finance_book.frequency_of_depreciation))
+				schedule_date = add_months(
+					finance_book.depreciation_start_date, n * cint(finance_book.frequency_of_depreciation)
+				)
 
 				# schedule date will be a year later from start date
 				# so monthly schedule date is calculated by removing 11 months from it
-				monthly_schedule_date = add_months(schedule_date, - finance_book.frequency_of_depreciation + 1)
+				monthly_schedule_date = add_months(schedule_date, -finance_book.frequency_of_depreciation + 1)
 
 			# if asset is being sold
 			if date_of_sale:
 				from_date = self.get_from_date(finance_book.finance_book)
-				depreciation_amount, days, months = self.get_pro_rata_amt(finance_book, depreciation_amount,
-					from_date, date_of_sale)
+				depreciation_amount, days, months = self.get_pro_rata_amt(
+					finance_book, depreciation_amount, from_date, date_of_sale
+				)
 
 				if depreciation_amount > 0:
-					self._add_depreciation_row(date_of_sale, depreciation_amount, finance_book.depreciation_method,
-						finance_book.finance_book, finance_book.idx)
+					self._add_depreciation_row(
+						date_of_sale,
+						depreciation_amount,
+						finance_book.depreciation_method,
+						finance_book.finance_book,
+						finance_book.idx,
+					)
 
 				break
 
 			# For first row
-			if has_pro_rata and not self.opening_accumulated_depreciation and n==0:
-				from_date = add_days(self.available_for_use_date, -1) # needed to calc depr amount for available_for_use_date too
-				depreciation_amount, days, months = self.get_pro_rata_amt(finance_book, depreciation_amount,
-					from_date, finance_book.depreciation_start_date)
+			if has_pro_rata and not self.opening_accumulated_depreciation and n == 0:
+				from_date = add_days(
+					self.available_for_use_date, -1
+				)  # needed to calc depr amount for available_for_use_date too
+				depreciation_amount, days, months = self.get_pro_rata_amt(
+					finance_book, depreciation_amount, from_date, finance_book.depreciation_start_date
+				)
 
 				# For first depr schedule date will be the start date
 				# so monthly schedule date is calculated by removing month difference between use date and start date
-				monthly_schedule_date = add_months(finance_book.depreciation_start_date, - months + 1)
+				monthly_schedule_date = add_months(finance_book.depreciation_start_date, -months + 1)
 
 			# For last row
 			elif has_pro_rata and n == cint(number_of_pending_depreciations) - 1:
 				if not self.flags.increase_in_asset_life:
 					# In case of increase_in_asset_life, the self.to_date is already set on asset_repair submission
-					self.to_date = add_months(self.available_for_use_date,
-						(n + self.number_of_depreciations_booked) * cint(finance_book.frequency_of_depreciation))
+					self.to_date = add_months(
+						self.available_for_use_date,
+						(n + self.number_of_depreciations_booked) * cint(finance_book.frequency_of_depreciation),
+					)
 
 				depreciation_amount_without_pro_rata = depreciation_amount
 
-				depreciation_amount, days, months = self.get_pro_rata_amt(finance_book,
-					depreciation_amount, schedule_date, self.to_date)
+				depreciation_amount, days, months = self.get_pro_rata_amt(
+					finance_book, depreciation_amount, schedule_date, self.to_date
+				)
 
-				depreciation_amount = self.get_adjusted_depreciation_amount(depreciation_amount_without_pro_rata,
-					depreciation_amount, finance_book.finance_book)
+				depreciation_amount = self.get_adjusted_depreciation_amount(
+					depreciation_amount_without_pro_rata, depreciation_amount, finance_book.finance_book
+				)
 
 				monthly_schedule_date = add_months(schedule_date, 1)
 				schedule_date = add_days(schedule_date, days)
 				last_schedule_date = schedule_date
 
-			if not depreciation_amount: continue
-			value_after_depreciation -= flt(depreciation_amount,
-				self.precision("gross_purchase_amount"))
+			if not depreciation_amount:
+				continue
+			value_after_depreciation -= flt(depreciation_amount, self.precision("gross_purchase_amount"))
 
 			# Adjust depreciation amount in the last period based on the expected value after useful life
-			if finance_book.expected_value_after_useful_life and ((n == cint(number_of_pending_depreciations) - 1
-				and value_after_depreciation != finance_book.expected_value_after_useful_life)
-				or value_after_depreciation < finance_book.expected_value_after_useful_life):
-				depreciation_amount += (value_after_depreciation - finance_book.expected_value_after_useful_life)
+			if finance_book.expected_value_after_useful_life and (
+				(
+					n == cint(number_of_pending_depreciations) - 1
+					and value_after_depreciation != finance_book.expected_value_after_useful_life
+				)
+				or value_after_depreciation < finance_book.expected_value_after_useful_life
+			):
+				depreciation_amount += value_after_depreciation - finance_book.expected_value_after_useful_life
 				skip_row = True
 
 			if depreciation_amount > 0:
@@ -291,12 +343,15 @@
 				if self.allow_monthly_depreciation:
 					# month range is 1 to 12
 					# In pro rata case, for first and last depreciation, month range would be different
-					month_range = months \
-						if (has_pro_rata and n==0) or (has_pro_rata and n == cint(number_of_pending_depreciations) - 1) \
+					month_range = (
+						months
+						if (has_pro_rata and n == 0)
+						or (has_pro_rata and n == cint(number_of_pending_depreciations) - 1)
 						else finance_book.frequency_of_depreciation
+					)
 
 					for r in range(month_range):
-						if (has_pro_rata and n == 0):
+						if has_pro_rata and n == 0:
 							# For first entry of monthly depr
 							if r == 0:
 								days_until_first_depr = date_diff(monthly_schedule_date, self.available_for_use_date)
@@ -308,7 +363,9 @@
 							else:
 								date = add_months(monthly_schedule_date, r)
 								amount = depreciation_amount / (month_range - 1)
-						elif (has_pro_rata and n == cint(number_of_pending_depreciations) - 1) and r == cint(month_range) - 1:
+						elif (has_pro_rata and n == cint(number_of_pending_depreciations) - 1) and r == cint(
+							month_range
+						) - 1:
 							# For last entry of monthly depr
 							date = last_schedule_date
 							amount = depreciation_amount / month_range
@@ -316,28 +373,40 @@
 							date = add_months(monthly_schedule_date, r)
 							amount = depreciation_amount / month_range
 
-						self._add_depreciation_row(date, amount, finance_book.depreciation_method,
-							finance_book.finance_book, finance_book.idx)
+						self._add_depreciation_row(
+							date, amount, finance_book.depreciation_method, finance_book.finance_book, finance_book.idx
+						)
 				else:
-					self._add_depreciation_row(schedule_date, depreciation_amount, finance_book.depreciation_method,
-						finance_book.finance_book, finance_book.idx)
+					self._add_depreciation_row(
+						schedule_date,
+						depreciation_amount,
+						finance_book.depreciation_method,
+						finance_book.finance_book,
+						finance_book.idx,
+					)
 
-	def _add_depreciation_row(self, schedule_date, depreciation_amount, depreciation_method, finance_book, finance_book_id):
-		self.append("schedules", {
-			"schedule_date": schedule_date,
-			"depreciation_amount": depreciation_amount,
-			"depreciation_method": depreciation_method,
-			"finance_book": finance_book,
-			"finance_book_id": finance_book_id
-		})
+	def _add_depreciation_row(
+		self, schedule_date, depreciation_amount, depreciation_method, finance_book, finance_book_id
+	):
+		self.append(
+			"schedules",
+			{
+				"schedule_date": schedule_date,
+				"depreciation_amount": depreciation_amount,
+				"depreciation_method": depreciation_method,
+				"finance_book": finance_book,
+				"finance_book_id": finance_book_id,
+			},
+		)
 
 	def _get_value_after_depreciation(self, finance_book):
 		# value_after_depreciation - current Asset value
 		if self.docstatus == 1 and finance_book.value_after_depreciation:
 			value_after_depreciation = flt(finance_book.value_after_depreciation)
 		else:
-			value_after_depreciation = (flt(self.gross_purchase_amount) -
-				flt(self.opening_accumulated_depreciation))
+			value_after_depreciation = flt(self.gross_purchase_amount) - flt(
+				self.opening_accumulated_depreciation
+			)
 
 		return value_after_depreciation
 
@@ -348,7 +417,7 @@
 		num_of_depreciations_completed = 0
 		depr_schedule = []
 
-		for schedule in self.get('schedules'):
+		for schedule in self.get("schedules"):
 			# to update start when there are JEs linked with all the schedule rows corresponding to an FB
 			if len(start) == (int(schedule.finance_book_id) - 2):
 				start.append(num_of_depreciations_completed)
@@ -376,14 +445,14 @@
 		return start
 
 	def get_from_date(self, finance_book):
-		if not self.get('schedules'):
+		if not self.get("schedules"):
 			return self.available_for_use_date
 
 		if len(self.finance_books) == 1:
 			return self.schedules[-1].schedule_date
 
 		from_date = ""
-		for schedule in self.get('schedules'):
+		for schedule in self.get("schedules"):
 			if schedule.finance_book == finance_book:
 				from_date = schedule.schedule_date
 
@@ -412,17 +481,25 @@
 		return has_pro_rata
 
 	def get_modified_available_for_use_date(self, row):
-		return add_months(self.available_for_use_date, (self.number_of_depreciations_booked * row.frequency_of_depreciation))
+		return add_months(
+			self.available_for_use_date,
+			(self.number_of_depreciations_booked * row.frequency_of_depreciation),
+		)
 
 	def validate_asset_finance_books(self, row):
 		if flt(row.expected_value_after_useful_life) >= flt(self.gross_purchase_amount):
-			frappe.throw(_("Row {0}: Expected Value After Useful Life must be less than Gross Purchase Amount")
-				.format(row.idx), title=_("Invalid Schedule"))
+			frappe.throw(
+				_("Row {0}: Expected Value After Useful Life must be less than Gross Purchase Amount").format(
+					row.idx
+				),
+				title=_("Invalid Schedule"),
+			)
 
 		if not row.depreciation_start_date:
 			if not self.available_for_use_date:
-				frappe.throw(_("Row {0}: Depreciation Start Date is required")
-					.format(row.idx), title=_("Invalid Schedule"))
+				frappe.throw(
+					_("Row {0}: Depreciation Start Date is required").format(row.idx), title=_("Invalid Schedule")
+				)
 			row.depreciation_start_date = get_last_day(self.available_for_use_date)
 
 		if not self.is_existing_asset:
@@ -431,8 +508,11 @@
 		else:
 			depreciable_amount = flt(self.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
 			if flt(self.opening_accumulated_depreciation) > depreciable_amount:
-					frappe.throw(_("Opening Accumulated Depreciation must be less than equal to {0}")
-						.format(depreciable_amount))
+				frappe.throw(
+					_("Opening Accumulated Depreciation must be less than equal to {0}").format(
+						depreciable_amount
+					)
+				)
 
 			if self.opening_accumulated_depreciation:
 				if not self.number_of_depreciations_booked:
@@ -441,24 +521,45 @@
 				self.number_of_depreciations_booked = 0
 
 			if flt(row.total_number_of_depreciations) <= cint(self.number_of_depreciations_booked):
-				frappe.throw(_("Row {0}: Total Number of Depreciations cannot be less than or equal to Number of Depreciations Booked")
-					.format(row.idx), title=_("Invalid Schedule"))
+				frappe.throw(
+					_(
+						"Row {0}: Total Number of Depreciations cannot be less than or equal to Number of Depreciations Booked"
+					).format(row.idx),
+					title=_("Invalid Schedule"),
+				)
 
-		if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(self.purchase_date):
-			frappe.throw(_("Depreciation Row {0}: Next Depreciation Date cannot be before Purchase Date")
-				.format(row.idx))
+		if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(
+			self.purchase_date
+		):
+			frappe.throw(
+				_("Depreciation Row {0}: Next Depreciation Date cannot be before Purchase Date").format(
+					row.idx
+				)
+			)
 
-		if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(self.available_for_use_date):
-			frappe.throw(_("Depreciation Row {0}: Next Depreciation Date cannot be before Available-for-use Date")
-				.format(row.idx))
+		if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(
+			self.available_for_use_date
+		):
+			frappe.throw(
+				_(
+					"Depreciation Row {0}: Next Depreciation Date cannot be before Available-for-use Date"
+				).format(row.idx)
+			)
 
 	# to ensure that final accumulated depreciation amount is accurate
-	def get_adjusted_depreciation_amount(self, depreciation_amount_without_pro_rata, depreciation_amount_for_last_row, finance_book):
+	def get_adjusted_depreciation_amount(
+		self, depreciation_amount_without_pro_rata, depreciation_amount_for_last_row, finance_book
+	):
 		if not self.opening_accumulated_depreciation:
 			depreciation_amount_for_first_row = self.get_depreciation_amount_for_first_row(finance_book)
 
-			if depreciation_amount_for_first_row + depreciation_amount_for_last_row != depreciation_amount_without_pro_rata:
-				depreciation_amount_for_last_row = depreciation_amount_without_pro_rata - depreciation_amount_for_first_row
+			if (
+				depreciation_amount_for_first_row + depreciation_amount_for_last_row
+				!= depreciation_amount_without_pro_rata
+			):
+				depreciation_amount_for_last_row = (
+					depreciation_amount_without_pro_rata - depreciation_amount_for_first_row
+				)
 
 		return depreciation_amount_for_last_row
 
@@ -474,8 +575,12 @@
 		if len(self.finance_books) == 1:
 			return True
 
-	def set_accumulated_depreciation(self, date_of_sale=None, date_of_return=None, ignore_booked_entry = False):
-		straight_line_idx = [d.idx for d in self.get("schedules") if d.depreciation_method == 'Straight Line']
+	def set_accumulated_depreciation(
+		self, date_of_sale=None, date_of_return=None, ignore_booked_entry=False
+	):
+		straight_line_idx = [
+			d.idx for d in self.get("schedules") if d.depreciation_method == "Straight Line"
+		]
 		finance_books = []
 
 		for i, d in enumerate(self.get("schedules")):
@@ -491,41 +596,64 @@
 			value_after_depreciation -= flt(depreciation_amount)
 
 			# for the last row, if depreciation method = Straight Line
-			if straight_line_idx and i == max(straight_line_idx) - 1 and not date_of_sale and not date_of_return:
-				book = self.get('finance_books')[cint(d.finance_book_id) - 1]
-				depreciation_amount += flt(value_after_depreciation -
-					flt(book.expected_value_after_useful_life), d.precision("depreciation_amount"))
+			if (
+				straight_line_idx
+				and i == max(straight_line_idx) - 1
+				and not date_of_sale
+				and not date_of_return
+			):
+				book = self.get("finance_books")[cint(d.finance_book_id) - 1]
+				depreciation_amount += flt(
+					value_after_depreciation - flt(book.expected_value_after_useful_life),
+					d.precision("depreciation_amount"),
+				)
 
 			d.depreciation_amount = depreciation_amount
 			accumulated_depreciation += d.depreciation_amount
-			d.accumulated_depreciation_amount = flt(accumulated_depreciation,
-				d.precision("accumulated_depreciation_amount"))
+			d.accumulated_depreciation_amount = flt(
+				accumulated_depreciation, d.precision("accumulated_depreciation_amount")
+			)
 
 	def get_value_after_depreciation(self, idx):
-		return flt(self.get('finance_books')[cint(idx)-1].value_after_depreciation)
+		return flt(self.get("finance_books")[cint(idx) - 1].value_after_depreciation)
 
 	def validate_expected_value_after_useful_life(self):
-		for row in self.get('finance_books'):
-			accumulated_depreciation_after_full_schedule = [d.accumulated_depreciation_amount
-				for d in self.get("schedules") if cint(d.finance_book_id) == row.idx]
+		for row in self.get("finance_books"):
+			accumulated_depreciation_after_full_schedule = [
+				d.accumulated_depreciation_amount
+				for d in self.get("schedules")
+				if cint(d.finance_book_id) == row.idx
+			]
 
 			if accumulated_depreciation_after_full_schedule:
-				accumulated_depreciation_after_full_schedule = max(accumulated_depreciation_after_full_schedule)
+				accumulated_depreciation_after_full_schedule = max(
+					accumulated_depreciation_after_full_schedule
+				)
 
 				asset_value_after_full_schedule = flt(
-					flt(self.gross_purchase_amount) -
-					flt(accumulated_depreciation_after_full_schedule), self.precision('gross_purchase_amount'))
+					flt(self.gross_purchase_amount) - flt(accumulated_depreciation_after_full_schedule),
+					self.precision("gross_purchase_amount"),
+				)
 
-				if (row.expected_value_after_useful_life and
-					row.expected_value_after_useful_life < asset_value_after_full_schedule):
-					frappe.throw(_("Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}")
-						.format(row.idx, asset_value_after_full_schedule))
+				if (
+					row.expected_value_after_useful_life
+					and row.expected_value_after_useful_life < asset_value_after_full_schedule
+				):
+					frappe.throw(
+						_(
+							"Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}"
+						).format(row.idx, asset_value_after_full_schedule)
+					)
 				elif not row.expected_value_after_useful_life:
 					row.expected_value_after_useful_life = asset_value_after_full_schedule
 
 	def validate_cancellation(self):
 		if self.status in ("In Maintenance", "Out of Order"):
-			frappe.throw(_("There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset."))
+			frappe.throw(
+				_(
+					"There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset."
+				)
+			)
 		if self.status not in ("Submitted", "Partially Depreciated", "Fully Depreciated"):
 			frappe.throw(_("Asset cannot be cancelled, as it is already {0}").format(self.status))
 
@@ -533,10 +661,13 @@
 		movements = frappe.db.sql(
 			"""SELECT asm.name, asm.docstatus
 			FROM `tabAsset Movement` asm, `tabAsset Movement Item` asm_item
-			WHERE asm_item.parent=asm.name and asm_item.asset=%s and asm.docstatus=1""", self.name, as_dict=1)
+			WHERE asm_item.parent=asm.name and asm_item.asset=%s and asm.docstatus=1""",
+			self.name,
+			as_dict=1,
+		)
 
 		for movement in movements:
-			movement = frappe.get_doc('Asset Movement', movement.get('name'))
+			movement = frappe.get_doc("Asset Movement", movement.get("name"))
 			movement.cancel()
 
 	def delete_depreciation_entries(self):
@@ -545,17 +676,19 @@
 				frappe.get_doc("Journal Entry", d.journal_entry).cancel()
 				d.db_set("journal_entry", None)
 
-		self.db_set("value_after_depreciation",
-			(flt(self.gross_purchase_amount) - flt(self.opening_accumulated_depreciation)))
+		self.db_set(
+			"value_after_depreciation",
+			(flt(self.gross_purchase_amount) - flt(self.opening_accumulated_depreciation)),
+		)
 
 	def set_status(self, status=None):
-		'''Get and update status'''
+		"""Get and update status"""
 		if not status:
 			status = self.get_status()
 		self.db_set("status", status)
 
 	def get_status(self):
-		'''Returns status based on whether it is draft, submitted, scrapped or depreciated'''
+		"""Returns status based on whether it is draft, submitted, scrapped or depreciated"""
 		if self.docstatus == 0:
 			status = "Draft"
 		elif self.docstatus == 1:
@@ -572,17 +705,17 @@
 				if flt(value_after_depreciation) <= expected_value_after_useful_life:
 					status = "Fully Depreciated"
 				elif flt(value_after_depreciation) < flt(self.gross_purchase_amount):
-					status = 'Partially Depreciated'
+					status = "Partially Depreciated"
 		elif self.docstatus == 2:
 			status = "Cancelled"
 		return status
 
 	def get_default_finance_book_idx(self):
-		if not self.get('default_finance_book') and self.company:
+		if not self.get("default_finance_book") and self.company:
 			self.default_finance_book = erpnext.get_default_finance_book(self.company)
 
-		if self.get('default_finance_book'):
-			for d in self.get('finance_books'):
+		if self.get("default_finance_book"):
+			for d in self.get("finance_books"):
 				if d.finance_book == self.default_finance_book:
 					return cint(d.idx) - 1
 
@@ -591,7 +724,7 @@
 		if not purchase_document:
 			return False
 
-		asset_bought_with_invoice = (purchase_document == self.purchase_invoice)
+		asset_bought_with_invoice = purchase_document == self.purchase_invoice
 		fixed_asset_account = self.get_fixed_asset_account()
 
 		cwip_enabled = is_cwip_accounting_enabled(self.asset_category)
@@ -621,13 +754,17 @@
 			return cwip_booked
 
 	def get_purchase_document(self):
-		asset_bought_with_invoice = self.purchase_invoice and frappe.db.get_value('Purchase Invoice', self.purchase_invoice, 'update_stock')
+		asset_bought_with_invoice = self.purchase_invoice and frappe.db.get_value(
+			"Purchase Invoice", self.purchase_invoice, "update_stock"
+		)
 		purchase_document = self.purchase_invoice if asset_bought_with_invoice else self.purchase_receipt
 
 		return purchase_document
 
 	def get_fixed_asset_account(self):
-		fixed_asset_account = get_asset_category_account('fixed_asset_account', None, self.name, None, self.asset_category, self.company)
+		fixed_asset_account = get_asset_category_account(
+			"fixed_asset_account", None, self.name, None, self.asset_category, self.company
+		)
 		if not fixed_asset_account:
 			frappe.throw(
 				_("Set {0} in asset category {1} for company {2}").format(
@@ -642,7 +779,9 @@
 	def get_cwip_account(self, cwip_enabled=False):
 		cwip_account = None
 		try:
-			cwip_account = get_asset_account("capital_work_in_progress_account", self.name, self.asset_category, self.company)
+			cwip_account = get_asset_account(
+				"capital_work_in_progress_account", self.name, self.asset_category, self.company
+			)
 		except Exception:
 			# if no cwip account found in category or company and "cwip is enabled" then raise else silently pass
 			if cwip_enabled:
@@ -656,33 +795,45 @@
 		purchase_document = self.get_purchase_document()
 		fixed_asset_account, cwip_account = self.get_fixed_asset_account(), self.get_cwip_account()
 
-		if (purchase_document and self.purchase_receipt_amount and self.available_for_use_date <= nowdate()):
+		if (
+			purchase_document and self.purchase_receipt_amount and self.available_for_use_date <= nowdate()
+		):
 
-			gl_entries.append(self.get_gl_dict({
-				"account": cwip_account,
-				"against": fixed_asset_account,
-				"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
-				"posting_date": self.available_for_use_date,
-				"credit": self.purchase_receipt_amount,
-				"credit_in_account_currency": self.purchase_receipt_amount,
-				"cost_center": self.cost_center
-			}, item=self))
+			gl_entries.append(
+				self.get_gl_dict(
+					{
+						"account": cwip_account,
+						"against": fixed_asset_account,
+						"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+						"posting_date": self.available_for_use_date,
+						"credit": self.purchase_receipt_amount,
+						"credit_in_account_currency": self.purchase_receipt_amount,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
+			)
 
-			gl_entries.append(self.get_gl_dict({
-				"account": fixed_asset_account,
-				"against": cwip_account,
-				"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
-				"posting_date": self.available_for_use_date,
-				"debit": self.purchase_receipt_amount,
-				"debit_in_account_currency": self.purchase_receipt_amount,
-				"cost_center": self.cost_center
-			}, item=self))
+			gl_entries.append(
+				self.get_gl_dict(
+					{
+						"account": fixed_asset_account,
+						"against": cwip_account,
+						"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+						"posting_date": self.available_for_use_date,
+						"debit": self.purchase_receipt_amount,
+						"debit_in_account_currency": self.purchase_receipt_amount,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
+			)
 
 		if gl_entries:
 			from erpnext.accounts.general_ledger import make_gl_entries
 
 			make_gl_entries(gl_entries)
-			self.db_set('booked_fixed_asset', 1)
+			self.db_set("booked_fixed_asset", 1)
 
 	@frappe.whitelist()
 	def get_depreciation_rate(self, args, on_validate=False):
@@ -691,18 +842,21 @@
 
 		float_precision = cint(frappe.db.get_default("float_precision")) or 2
 
-		if args.get("depreciation_method") == 'Double Declining Balance':
+		if args.get("depreciation_method") == "Double Declining Balance":
 			return 200.0 / args.get("total_number_of_depreciations")
 
 		if args.get("depreciation_method") == "Written Down Value":
 			if args.get("rate_of_depreciation") and on_validate:
 				return args.get("rate_of_depreciation")
 
-			no_of_years = flt(args.get("total_number_of_depreciations") * flt(args.get("frequency_of_depreciation"))) / 12
+			no_of_years = (
+				flt(args.get("total_number_of_depreciations") * flt(args.get("frequency_of_depreciation")))
+				/ 12
+			)
 			value = flt(args.get("expected_value_after_useful_life")) / flt(self.gross_purchase_amount)
 
 			# square root of flt(salvage_value) / flt(asset_cost)
-			depreciation_rate = math.pow(value, 1.0/flt(no_of_years, 2))
+			depreciation_rate = math.pow(value, 1.0 / flt(no_of_years, 2))
 
 			return 100 * (1 - flt(depreciation_rate, float_precision))
 
@@ -713,93 +867,104 @@
 
 		return (depreciation_amount * flt(days)) / flt(total_days), days, months
 
+
 def update_maintenance_status():
-	assets = frappe.get_all(
-		"Asset", filters={"docstatus": 1, "maintenance_required": 1}
-	)
+	assets = frappe.get_all("Asset", filters={"docstatus": 1, "maintenance_required": 1})
 
 	for asset in assets:
 		asset = frappe.get_doc("Asset", asset.name)
 		if frappe.db.exists("Asset Repair", {"asset_name": asset.name, "repair_status": "Pending"}):
 			asset.set_status("Out of Order")
-		elif frappe.db.exists("Asset Maintenance Task", {"parent": asset.name, "next_due_date": today()}):
+		elif frappe.db.exists(
+			"Asset Maintenance Task", {"parent": asset.name, "next_due_date": today()}
+		):
 			asset.set_status("In Maintenance")
 		else:
 			asset.set_status()
 
+
 def make_post_gl_entry():
 
-	asset_categories = frappe.db.get_all('Asset Category', fields = ['name', 'enable_cwip_accounting'])
+	asset_categories = frappe.db.get_all("Asset Category", fields=["name", "enable_cwip_accounting"])
 
 	for asset_category in asset_categories:
 		if cint(asset_category.enable_cwip_accounting):
-			assets = frappe.db.sql_list(""" select name from `tabAsset`
+			assets = frappe.db.sql_list(
+				""" select name from `tabAsset`
 				where asset_category = %s and ifnull(booked_fixed_asset, 0) = 0
-				and available_for_use_date = %s""", (asset_category.name, nowdate()))
+				and available_for_use_date = %s""",
+				(asset_category.name, nowdate()),
+			)
 
 			for asset in assets:
-				doc = frappe.get_doc('Asset', asset)
+				doc = frappe.get_doc("Asset", asset)
 				doc.make_gl_entries()
 
+
 def get_asset_naming_series():
-	meta = frappe.get_meta('Asset')
+	meta = frappe.get_meta("Asset")
 	return meta.get_field("naming_series").options
 
+
 @frappe.whitelist()
 def make_sales_invoice(asset, item_code, company, serial_no=None):
 	si = frappe.new_doc("Sales Invoice")
 	si.company = company
-	si.currency = frappe.get_cached_value('Company',  company,  "default_currency")
+	si.currency = frappe.get_cached_value("Company", company, "default_currency")
 	disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(company)
-	si.append("items", {
-		"item_code": item_code,
-		"is_fixed_asset": 1,
-		"asset": asset,
-		"income_account": disposal_account,
-		"serial_no": serial_no,
-		"cost_center": depreciation_cost_center,
-		"qty": 1
-	})
+	si.append(
+		"items",
+		{
+			"item_code": item_code,
+			"is_fixed_asset": 1,
+			"asset": asset,
+			"income_account": disposal_account,
+			"serial_no": serial_no,
+			"cost_center": depreciation_cost_center,
+			"qty": 1,
+		},
+	)
 	si.set_missing_values()
 	return si
 
+
 @frappe.whitelist()
 def create_asset_maintenance(asset, item_code, item_name, asset_category, company):
 	asset_maintenance = frappe.new_doc("Asset Maintenance")
-	asset_maintenance.update({
-		"asset_name": asset,
-		"company": company,
-		"item_code": item_code,
-		"item_name": item_name,
-		"asset_category": asset_category
-	})
+	asset_maintenance.update(
+		{
+			"asset_name": asset,
+			"company": company,
+			"item_code": item_code,
+			"item_name": item_name,
+			"asset_category": asset_category,
+		}
+	)
 	return asset_maintenance
 
+
 @frappe.whitelist()
 def create_asset_repair(asset, asset_name):
 	asset_repair = frappe.new_doc("Asset Repair")
-	asset_repair.update({
-		"asset": asset,
-		"asset_name": asset_name
-	})
+	asset_repair.update({"asset": asset, "asset_name": asset_name})
 	return asset_repair
 
+
 @frappe.whitelist()
 def create_asset_value_adjustment(asset, asset_category, company):
 	asset_value_adjustment = frappe.new_doc("Asset Value Adjustment")
-	asset_value_adjustment.update({
-		"asset": asset,
-		"company": company,
-		"asset_category": asset_category
-	})
+	asset_value_adjustment.update(
+		{"asset": asset, "company": company, "asset_category": asset_category}
+	)
 	return asset_value_adjustment
 
+
 @frappe.whitelist()
 def transfer_asset(args):
 	args = json.loads(args)
 
-	if args.get('serial_no'):
-		args['quantity'] = len(args.get('serial_no').split('\n'))
+	if args.get("serial_no"):
+		args["quantity"] = len(args.get("serial_no").split("\n"))
 
 	movement_entry = frappe.new_doc("Asset Movement")
 	movement_entry.update(args)
@@ -808,52 +973,73 @@
 
 	frappe.db.commit()
 
-	frappe.msgprint(_("Asset Movement record {0} created").format("<a href='/app/Form/Asset Movement/{0}'>{0}</a>").format(movement_entry.name))
+	frappe.msgprint(
+		_("Asset Movement record {0} created")
+		.format("<a href='/app/Form/Asset Movement/{0}'>{0}</a>")
+		.format(movement_entry.name)
+	)
+
 
 @frappe.whitelist()
 def get_item_details(item_code, asset_category):
-	asset_category_doc = frappe.get_doc('Asset Category', asset_category)
+	asset_category_doc = frappe.get_doc("Asset Category", asset_category)
 	books = []
 	for d in asset_category_doc.finance_books:
-		books.append({
-			'finance_book': d.finance_book,
-			'depreciation_method': d.depreciation_method,
-			'total_number_of_depreciations': d.total_number_of_depreciations,
-			'frequency_of_depreciation': d.frequency_of_depreciation,
-			'start_date': nowdate()
-		})
+		books.append(
+			{
+				"finance_book": d.finance_book,
+				"depreciation_method": d.depreciation_method,
+				"total_number_of_depreciations": d.total_number_of_depreciations,
+				"frequency_of_depreciation": d.frequency_of_depreciation,
+				"start_date": nowdate(),
+			}
+		)
 
 	return books
 
+
 def get_asset_account(account_name, asset=None, asset_category=None, company=None):
 	account = None
 	if asset:
-		account = get_asset_category_account(account_name, asset=asset,
-				asset_category = asset_category, company = company)
+		account = get_asset_category_account(
+			account_name, asset=asset, asset_category=asset_category, company=company
+		)
 
 	if not asset and not account:
-		account = get_asset_category_account(account_name, asset_category = asset_category, company = company)
+		account = get_asset_category_account(
+			account_name, asset_category=asset_category, company=company
+		)
 
 	if not account:
-		account = frappe.get_cached_value('Company',  company,  account_name)
+		account = frappe.get_cached_value("Company", company, account_name)
 
 	if not account:
 		if not asset_category:
-			frappe.throw(_("Set {0} in company {1}").format(account_name.replace('_', ' ').title(), company))
+			frappe.throw(
+				_("Set {0} in company {1}").format(account_name.replace("_", " ").title(), company)
+			)
 		else:
-			frappe.throw(_("Set {0} in asset category {1} or company {2}")
-				.format(account_name.replace('_', ' ').title(), asset_category, company))
+			frappe.throw(
+				_("Set {0} in asset category {1} or company {2}").format(
+					account_name.replace("_", " ").title(), asset_category, company
+				)
+			)
 
 	return account
 
+
 @frappe.whitelist()
 def make_journal_entry(asset_name):
 	asset = frappe.get_doc("Asset", asset_name)
-	fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account = \
-		get_depreciation_accounts(asset)
+	(
+		fixed_asset_account,
+		accumulated_depreciation_account,
+		depreciation_expense_account,
+	) = get_depreciation_accounts(asset)
 
-	depreciation_cost_center, depreciation_series = frappe.db.get_value("Company", asset.company,
-		["depreciation_cost_center", "series_for_depreciation_entry"])
+	depreciation_cost_center, depreciation_series = frappe.db.get_value(
+		"Company", asset.company, ["depreciation_cost_center", "series_for_depreciation_entry"]
+	)
 	depreciation_cost_center = asset.cost_center or depreciation_cost_center
 
 	je = frappe.new_doc("Journal Entry")
@@ -862,21 +1048,28 @@
 	je.company = asset.company
 	je.remark = "Depreciation Entry against asset {0}".format(asset_name)
 
-	je.append("accounts", {
-		"account": depreciation_expense_account,
-		"reference_type": "Asset",
-		"reference_name": asset.name,
-		"cost_center": depreciation_cost_center
-	})
+	je.append(
+		"accounts",
+		{
+			"account": depreciation_expense_account,
+			"reference_type": "Asset",
+			"reference_name": asset.name,
+			"cost_center": depreciation_cost_center,
+		},
+	)
 
-	je.append("accounts", {
-		"account": accumulated_depreciation_account,
-		"reference_type": "Asset",
-		"reference_name": asset.name
-	})
+	je.append(
+		"accounts",
+		{
+			"account": accumulated_depreciation_account,
+			"reference_type": "Asset",
+			"reference_name": asset.name,
+		},
+	)
 
 	return je
 
+
 @frappe.whitelist()
 def make_asset_movement(assets, purpose=None):
 	import json
@@ -885,48 +1078,56 @@
 		assets = json.loads(assets)
 
 	if len(assets) == 0:
-		frappe.throw(_('Atleast one asset has to be selected.'))
+		frappe.throw(_("Atleast one asset has to be selected."))
 
 	asset_movement = frappe.new_doc("Asset Movement")
 	asset_movement.quantity = len(assets)
 	for asset in assets:
-		asset = frappe.get_doc('Asset', asset.get('name'))
-		asset_movement.company = asset.get('company')
-		asset_movement.append("assets", {
-			'asset': asset.get('name'),
-			'source_location': asset.get('location'),
-			'from_employee': asset.get('custodian')
-		})
+		asset = frappe.get_doc("Asset", asset.get("name"))
+		asset_movement.company = asset.get("company")
+		asset_movement.append(
+			"assets",
+			{
+				"asset": asset.get("name"),
+				"source_location": asset.get("location"),
+				"from_employee": asset.get("custodian"),
+			},
+		)
 
-	if asset_movement.get('assets'):
+	if asset_movement.get("assets"):
 		return asset_movement.as_dict()
 
+
 def is_cwip_accounting_enabled(asset_category):
 	return cint(frappe.db.get_value("Asset Category", asset_category, "enable_cwip_accounting"))
 
+
 def get_total_days(date, frequency):
-	period_start_date = add_months(date,
-		cint(frequency) * -1)
+	period_start_date = add_months(date, cint(frequency) * -1)
 
 	return date_diff(date, period_start_date)
 
+
 @erpnext.allow_regional
 def get_depreciation_amount(asset, depreciable_value, row):
 	if row.depreciation_method in ("Straight Line", "Manual"):
 		# if the Depreciation Schedule is being prepared for the first time
 		if not asset.flags.increase_in_asset_life:
-			depreciation_amount = (flt(asset.gross_purchase_amount) -
-				flt(row.expected_value_after_useful_life)) / flt(row.total_number_of_depreciations)
+			depreciation_amount = (
+				flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
+			) / flt(row.total_number_of_depreciations)
 
 		# if the Depreciation Schedule is being modified after Asset Repair
 		else:
-			depreciation_amount = (flt(row.value_after_depreciation) -
-				flt(row.expected_value_after_useful_life)) / (date_diff(asset.to_date, asset.available_for_use_date) / 365)
+			depreciation_amount = (
+				flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
+			) / (date_diff(asset.to_date, asset.available_for_use_date) / 365)
 	else:
 		depreciation_amount = flt(depreciable_value * (flt(row.rate_of_depreciation) / 100))
 
 	return depreciation_amount
 
+
 @frappe.whitelist()
 def split_asset(asset_name, split_qty):
 	asset = frappe.get_doc("Asset", asset_name)
@@ -942,34 +1143,61 @@
 
 	return new_asset
 
+
 def update_existing_asset(asset, remaining_qty):
-	remaining_gross_purchase_amount = flt((asset.gross_purchase_amount * remaining_qty) / asset.asset_quantity)
-	opening_accumulated_depreciation = flt((asset.opening_accumulated_depreciation * remaining_qty) / asset.asset_quantity)
+	remaining_gross_purchase_amount = flt(
+		(asset.gross_purchase_amount * remaining_qty) / asset.asset_quantity
+	)
+	opening_accumulated_depreciation = flt(
+		(asset.opening_accumulated_depreciation * remaining_qty) / asset.asset_quantity
+	)
 
-	frappe.db.set_value("Asset", asset.name, {
-		'opening_accumulated_depreciation': opening_accumulated_depreciation,
-		'gross_purchase_amount': remaining_gross_purchase_amount,
-		'asset_quantity': remaining_qty
-	})
+	frappe.db.set_value(
+		"Asset",
+		asset.name,
+		{
+			"opening_accumulated_depreciation": opening_accumulated_depreciation,
+			"gross_purchase_amount": remaining_gross_purchase_amount,
+			"asset_quantity": remaining_qty,
+		},
+	)
 
-	for finance_book in asset.get('finance_books'):
-		value_after_depreciation = flt((finance_book.value_after_depreciation * remaining_qty)/asset.asset_quantity)
-		expected_value_after_useful_life = flt((finance_book.expected_value_after_useful_life * remaining_qty)/asset.asset_quantity)
-		frappe.db.set_value('Asset Finance Book', finance_book.name, 'value_after_depreciation', value_after_depreciation)
-		frappe.db.set_value('Asset Finance Book', finance_book.name, 'expected_value_after_useful_life', expected_value_after_useful_life)
+	for finance_book in asset.get("finance_books"):
+		value_after_depreciation = flt(
+			(finance_book.value_after_depreciation * remaining_qty) / asset.asset_quantity
+		)
+		expected_value_after_useful_life = flt(
+			(finance_book.expected_value_after_useful_life * remaining_qty) / asset.asset_quantity
+		)
+		frappe.db.set_value(
+			"Asset Finance Book", finance_book.name, "value_after_depreciation", value_after_depreciation
+		)
+		frappe.db.set_value(
+			"Asset Finance Book",
+			finance_book.name,
+			"expected_value_after_useful_life",
+			expected_value_after_useful_life,
+		)
 
 	accumulated_depreciation = 0
 
-	for term in asset.get('schedules'):
-		depreciation_amount = flt((term.depreciation_amount * remaining_qty)/asset.asset_quantity)
-		frappe.db.set_value('Depreciation Schedule', term.name, 'depreciation_amount', depreciation_amount)
+	for term in asset.get("schedules"):
+		depreciation_amount = flt((term.depreciation_amount * remaining_qty) / asset.asset_quantity)
+		frappe.db.set_value(
+			"Depreciation Schedule", term.name, "depreciation_amount", depreciation_amount
+		)
 		accumulated_depreciation += depreciation_amount
-		frappe.db.set_value('Depreciation Schedule', term.name, 'accumulated_depreciation_amount', accumulated_depreciation)
+		frappe.db.set_value(
+			"Depreciation Schedule", term.name, "accumulated_depreciation_amount", accumulated_depreciation
+		)
+
 
 def create_new_asset_after_split(asset, split_qty):
 	new_asset = frappe.copy_doc(asset)
 	new_gross_purchase_amount = flt((asset.gross_purchase_amount * split_qty) / asset.asset_quantity)
-	opening_accumulated_depreciation = flt((asset.opening_accumulated_depreciation * split_qty) / asset.asset_quantity)
+	opening_accumulated_depreciation = flt(
+		(asset.opening_accumulated_depreciation * split_qty) / asset.asset_quantity
+	)
 
 	new_asset.gross_purchase_amount = new_gross_purchase_amount
 	new_asset.opening_accumulated_depreciation = opening_accumulated_depreciation
@@ -977,12 +1205,16 @@
 	new_asset.split_from = asset.name
 	accumulated_depreciation = 0
 
-	for finance_book in new_asset.get('finance_books'):
-		finance_book.value_after_depreciation = flt((finance_book.value_after_depreciation * split_qty)/asset.asset_quantity)
-		finance_book.expected_value_after_useful_life = flt((finance_book.expected_value_after_useful_life * split_qty)/asset.asset_quantity)
+	for finance_book in new_asset.get("finance_books"):
+		finance_book.value_after_depreciation = flt(
+			(finance_book.value_after_depreciation * split_qty) / asset.asset_quantity
+		)
+		finance_book.expected_value_after_useful_life = flt(
+			(finance_book.expected_value_after_useful_life * split_qty) / asset.asset_quantity
+		)
 
-	for term in new_asset.get('schedules'):
-		depreciation_amount = flt((term.depreciation_amount * split_qty)/asset.asset_quantity)
+	for term in new_asset.get("schedules"):
+		depreciation_amount = flt((term.depreciation_amount * split_qty) / asset.asset_quantity)
 		term.depreciation_amount = depreciation_amount
 		accumulated_depreciation += depreciation_amount
 		term.accumulated_depreciation_amount = accumulated_depreciation
@@ -990,29 +1222,34 @@
 	new_asset.submit()
 	new_asset.set_status()
 
-	for term in new_asset.get('schedules'):
+	for term in new_asset.get("schedules"):
 		# Update references in JV
 		if term.journal_entry:
-			add_reference_in_jv_on_split(term.journal_entry, new_asset.name, asset.name, term.depreciation_amount)
+			add_reference_in_jv_on_split(
+				term.journal_entry, new_asset.name, asset.name, term.depreciation_amount
+			)
 
 	return new_asset
 
-def add_reference_in_jv_on_split(entry_name, new_asset_name, old_asset_name, depreciation_amount):
-	journal_entry = frappe.get_doc('Journal Entry', entry_name)
-	entries_to_add = []
-	idx = len(journal_entry.get('accounts')) + 1
 
-	for account in journal_entry.get('accounts'):
+def add_reference_in_jv_on_split(entry_name, new_asset_name, old_asset_name, depreciation_amount):
+	journal_entry = frappe.get_doc("Journal Entry", entry_name)
+	entries_to_add = []
+	idx = len(journal_entry.get("accounts")) + 1
+
+	for account in journal_entry.get("accounts"):
 		if account.reference_name == old_asset_name:
 			entries_to_add.append(frappe.copy_doc(account).as_dict())
 			if account.credit:
 				account.credit = account.credit - depreciation_amount
-				account.credit_in_account_currency = account.credit_in_account_currency - \
-					account.exchange_rate * depreciation_amount
+				account.credit_in_account_currency = (
+					account.credit_in_account_currency - account.exchange_rate * depreciation_amount
+				)
 			elif account.debit:
 				account.debit = account.debit - depreciation_amount
-				account.debit_in_account_currency = account.debit_in_account_currency - \
-					account.exchange_rate * depreciation_amount
+				account.debit_in_account_currency = (
+					account.debit_in_account_currency - account.exchange_rate * depreciation_amount
+				)
 
 	for entry in entries_to_add:
 		entry.reference_name = new_asset_name
@@ -1026,7 +1263,7 @@
 		entry.idx = idx
 		idx += 1
 
-		journal_entry.append('accounts', entry)
+		journal_entry.append("accounts", entry)
 
 	journal_entry.flags.ignore_validate_update_after_submit = True
 	journal_entry.save()
@@ -1035,4 +1272,4 @@
 	journal_entry.docstatus = 2
 	journal_entry.make_gl_entries(1)
 	journal_entry.docstatus = 1
-	journal_entry.make_gl_entries()
\ No newline at end of file
+	journal_entry.make_gl_entries()
diff --git a/erpnext/assets/doctype/asset/asset_dashboard.py b/erpnext/assets/doctype/asset/asset_dashboard.py
index c81b611..9a45bcb 100644
--- a/erpnext/assets/doctype/asset/asset_dashboard.py
+++ b/erpnext/assets/doctype/asset/asset_dashboard.py
@@ -3,13 +3,6 @@
 
 def get_data():
 	return {
-		'non_standard_fieldnames': {
-			'Asset Movement': 'asset'
-		},
-		'transactions': [
-			{
-				'label': _('Movement'),
-				'items': ['Asset Movement']
-			}
-		]
+		"non_standard_fieldnames": {"Asset Movement": "asset"},
+		"transactions": [{"label": _("Movement"), "items": ["Asset Movement"]}],
 	}
diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py
index 6e04242..3f7e945 100644
--- a/erpnext/assets/doctype/asset/depreciation.py
+++ b/erpnext/assets/doctype/asset/depreciation.py
@@ -13,7 +13,9 @@
 
 def post_depreciation_entries(date=None):
 	# Return if automatic booking of asset depreciation is disabled
-	if not cint(frappe.db.get_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically")):
+	if not cint(
+		frappe.db.get_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically")
+	):
 		return
 
 	if not date:
@@ -22,26 +24,35 @@
 		make_depreciation_entry(asset, date)
 		frappe.db.commit()
 
+
 def get_depreciable_assets(date):
-	return frappe.db.sql_list("""select distinct a.name
+	return frappe.db.sql_list(
+		"""select distinct a.name
 		from tabAsset a, `tabDepreciation Schedule` ds
 		where a.name = ds.parent and a.docstatus=1 and ds.schedule_date<=%s and a.calculate_depreciation = 1
 			and a.status in ('Submitted', 'Partially Depreciated')
-			and ifnull(ds.journal_entry, '')=''""", date)
+			and ifnull(ds.journal_entry, '')=''""",
+		date,
+	)
+
 
 @frappe.whitelist()
 def make_depreciation_entry(asset_name, date=None):
-	frappe.has_permission('Journal Entry', throw=True)
+	frappe.has_permission("Journal Entry", throw=True)
 
 	if not date:
 		date = today()
 
 	asset = frappe.get_doc("Asset", asset_name)
-	fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account = \
-		get_depreciation_accounts(asset)
+	(
+		fixed_asset_account,
+		accumulated_depreciation_account,
+		depreciation_expense_account,
+	) = get_depreciation_accounts(asset)
 
-	depreciation_cost_center, depreciation_series = frappe.get_cached_value('Company',  asset.company,
-		["depreciation_cost_center", "series_for_depreciation_entry"])
+	depreciation_cost_center, depreciation_series = frappe.get_cached_value(
+		"Company", asset.company, ["depreciation_cost_center", "series_for_depreciation_entry"]
+	)
 
 	depreciation_cost_center = asset.cost_center or depreciation_cost_center
 
@@ -57,14 +68,16 @@
 			je.finance_book = d.finance_book
 			je.remark = "Depreciation Entry against {0} worth {1}".format(asset_name, d.depreciation_amount)
 
-			credit_account, debit_account = get_credit_and_debit_accounts(accumulated_depreciation_account, depreciation_expense_account)
+			credit_account, debit_account = get_credit_and_debit_accounts(
+				accumulated_depreciation_account, depreciation_expense_account
+			)
 
 			credit_entry = {
 				"account": credit_account,
 				"credit_in_account_currency": d.depreciation_amount,
 				"reference_type": "Asset",
 				"reference_name": asset.name,
-				"cost_center": depreciation_cost_center
+				"cost_center": depreciation_cost_center,
 			}
 
 			debit_entry = {
@@ -72,19 +85,25 @@
 				"debit_in_account_currency": d.depreciation_amount,
 				"reference_type": "Asset",
 				"reference_name": asset.name,
-				"cost_center": depreciation_cost_center
+				"cost_center": depreciation_cost_center,
 			}
 
 			for dimension in accounting_dimensions:
-				if (asset.get(dimension['fieldname']) or dimension.get('mandatory_for_bs')):
-					credit_entry.update({
-						dimension['fieldname']: asset.get(dimension['fieldname']) or dimension.get('default_dimension')
-					})
+				if asset.get(dimension["fieldname"]) or dimension.get("mandatory_for_bs"):
+					credit_entry.update(
+						{
+							dimension["fieldname"]: asset.get(dimension["fieldname"])
+							or dimension.get("default_dimension")
+						}
+					)
 
-				if (asset.get(dimension['fieldname']) or dimension.get('mandatory_for_pl')):
-					debit_entry.update({
-						dimension['fieldname']: asset.get(dimension['fieldname']) or dimension.get('default_dimension')
-					})
+				if asset.get(dimension["fieldname"]) or dimension.get("mandatory_for_pl"):
+					debit_entry.update(
+						{
+							dimension["fieldname"]: asset.get(dimension["fieldname"])
+							or dimension.get("default_dimension")
+						}
+					)
 
 			je.append("accounts", credit_entry)
 
@@ -98,7 +117,7 @@
 			d.db_set("journal_entry", je.name)
 
 			idx = cint(d.finance_book_id)
-			finance_books = asset.get('finance_books')[idx - 1]
+			finance_books = asset.get("finance_books")[idx - 1]
 			finance_books.value_after_depreciation -= d.depreciation_amount
 			finance_books.db_update()
 
@@ -106,13 +125,20 @@
 
 	return asset
 
+
 def get_depreciation_accounts(asset):
 	fixed_asset_account = accumulated_depreciation_account = depreciation_expense_account = None
 
-	accounts = frappe.db.get_value("Asset Category Account",
-		filters={'parent': asset.asset_category, 'company_name': asset.company},
-		fieldname = ['fixed_asset_account', 'accumulated_depreciation_account',
-			'depreciation_expense_account'], as_dict=1)
+	accounts = frappe.db.get_value(
+		"Asset Category Account",
+		filters={"parent": asset.asset_category, "company_name": asset.company},
+		fieldname=[
+			"fixed_asset_account",
+			"accumulated_depreciation_account",
+			"depreciation_expense_account",
+		],
+		as_dict=1,
+	)
 
 	if accounts:
 		fixed_asset_account = accounts.fixed_asset_account
@@ -120,20 +146,29 @@
 		depreciation_expense_account = accounts.depreciation_expense_account
 
 	if not accumulated_depreciation_account or not depreciation_expense_account:
-		accounts = frappe.get_cached_value('Company',  asset.company,
-			["accumulated_depreciation_account", "depreciation_expense_account"])
+		accounts = frappe.get_cached_value(
+			"Company", asset.company, ["accumulated_depreciation_account", "depreciation_expense_account"]
+		)
 
 		if not accumulated_depreciation_account:
 			accumulated_depreciation_account = accounts[0]
 		if not depreciation_expense_account:
 			depreciation_expense_account = accounts[1]
 
-	if not fixed_asset_account or not accumulated_depreciation_account or not depreciation_expense_account:
-		frappe.throw(_("Please set Depreciation related Accounts in Asset Category {0} or Company {1}")
-			.format(asset.asset_category, asset.company))
+	if (
+		not fixed_asset_account
+		or not accumulated_depreciation_account
+		or not depreciation_expense_account
+	):
+		frappe.throw(
+			_("Please set Depreciation related Accounts in Asset Category {0} or Company {1}").format(
+				asset.asset_category, asset.company
+			)
+		)
 
 	return fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account
 
+
 def get_credit_and_debit_accounts(accumulated_depreciation_account, depreciation_expense_account):
 	root_type = frappe.get_value("Account", depreciation_expense_account, "root_type")
 
@@ -148,6 +183,7 @@
 
 	return credit_account, debit_account
 
+
 @frappe.whitelist()
 def scrap_asset(asset_name):
 	asset = frappe.get_doc("Asset", asset_name)
@@ -155,9 +191,13 @@
 	if asset.docstatus != 1:
 		frappe.throw(_("Asset {0} must be submitted").format(asset.name))
 	elif asset.status in ("Cancelled", "Sold", "Scrapped"):
-		frappe.throw(_("Asset {0} cannot be scrapped, as it is already {1}").format(asset.name, asset.status))
+		frappe.throw(
+			_("Asset {0} cannot be scrapped, as it is already {1}").format(asset.name, asset.status)
+		)
 
-	depreciation_series = frappe.get_cached_value('Company',  asset.company,  "series_for_depreciation_entry")
+	depreciation_series = frappe.get_cached_value(
+		"Company", asset.company, "series_for_depreciation_entry"
+	)
 
 	je = frappe.new_doc("Journal Entry")
 	je.voucher_type = "Journal Entry"
@@ -167,10 +207,7 @@
 	je.remark = "Scrap Entry for asset {0}".format(asset_name)
 
 	for entry in get_gl_entries_on_asset_disposal(asset):
-		entry.update({
-			"reference_type": "Asset",
-			"reference_name": asset_name
-		})
+		entry.update({"reference_type": "Asset", "reference_name": asset_name})
 		je.append("accounts", entry)
 
 	je.flags.ignore_permissions = True
@@ -182,6 +219,7 @@
 
 	frappe.msgprint(_("Asset scrapped via Journal Entry {0}").format(je.name))
 
+
 @frappe.whitelist()
 def restore_asset(asset_name):
 	asset = frappe.get_doc("Asset", asset_name)
@@ -195,23 +233,31 @@
 
 	asset.set_status()
 
+
 def get_gl_entries_on_asset_regain(asset, selling_amount=0, finance_book=None):
-	fixed_asset_account, asset, depreciation_cost_center, accumulated_depr_account, accumulated_depr_amount, disposal_account, value_after_depreciation = \
-		get_asset_details(asset, finance_book)
+	(
+		fixed_asset_account,
+		asset,
+		depreciation_cost_center,
+		accumulated_depr_account,
+		accumulated_depr_amount,
+		disposal_account,
+		value_after_depreciation,
+	) = get_asset_details(asset, finance_book)
 
 	gl_entries = [
 		{
 			"account": fixed_asset_account,
 			"debit_in_account_currency": asset.gross_purchase_amount,
 			"debit": asset.gross_purchase_amount,
-			"cost_center": depreciation_cost_center
+			"cost_center": depreciation_cost_center,
 		},
 		{
 			"account": accumulated_depr_account,
 			"credit_in_account_currency": accumulated_depr_amount,
 			"credit": accumulated_depr_amount,
-			"cost_center": depreciation_cost_center
-		}
+			"cost_center": depreciation_cost_center,
+		},
 	]
 
 	profit_amount = abs(flt(value_after_depreciation)) - abs(flt(selling_amount))
@@ -220,23 +266,31 @@
 
 	return gl_entries
 
+
 def get_gl_entries_on_asset_disposal(asset, selling_amount=0, finance_book=None):
-	fixed_asset_account, asset, depreciation_cost_center, accumulated_depr_account, accumulated_depr_amount, disposal_account, value_after_depreciation = \
-		get_asset_details(asset, finance_book)
+	(
+		fixed_asset_account,
+		asset,
+		depreciation_cost_center,
+		accumulated_depr_account,
+		accumulated_depr_amount,
+		disposal_account,
+		value_after_depreciation,
+	) = get_asset_details(asset, finance_book)
 
 	gl_entries = [
 		{
 			"account": fixed_asset_account,
 			"credit_in_account_currency": asset.gross_purchase_amount,
 			"credit": asset.gross_purchase_amount,
-			"cost_center": depreciation_cost_center
+			"cost_center": depreciation_cost_center,
 		},
 		{
 			"account": accumulated_depr_account,
 			"debit_in_account_currency": accumulated_depr_amount,
 			"debit": accumulated_depr_amount,
-			"cost_center": depreciation_cost_center
-		}
+			"cost_center": depreciation_cost_center,
+		},
 	]
 
 	profit_amount = flt(selling_amount) - flt(value_after_depreciation)
@@ -245,8 +299,11 @@
 
 	return gl_entries
 
+
 def get_asset_details(asset, finance_book=None):
-	fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset)
+	fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(
+		asset
+	)
 	disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company)
 	depreciation_cost_center = asset.cost_center or depreciation_cost_center
 
@@ -257,28 +314,46 @@
 				idx = d.idx
 				break
 
-	value_after_depreciation = (asset.finance_books[idx - 1].value_after_depreciation
-		if asset.calculate_depreciation else asset.value_after_depreciation)
+	value_after_depreciation = (
+		asset.finance_books[idx - 1].value_after_depreciation
+		if asset.calculate_depreciation
+		else asset.value_after_depreciation
+	)
 	accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(value_after_depreciation)
 
-	return fixed_asset_account, asset, depreciation_cost_center, accumulated_depr_account, accumulated_depr_amount, disposal_account, value_after_depreciation
+	return (
+		fixed_asset_account,
+		asset,
+		depreciation_cost_center,
+		accumulated_depr_account,
+		accumulated_depr_amount,
+		disposal_account,
+		value_after_depreciation,
+	)
+
 
 def get_profit_gl_entries(profit_amount, gl_entries, disposal_account, depreciation_cost_center):
 	debit_or_credit = "debit" if profit_amount < 0 else "credit"
-	gl_entries.append({
-		"account": disposal_account,
-		"cost_center": depreciation_cost_center,
-		debit_or_credit: abs(profit_amount),
-		debit_or_credit + "_in_account_currency": abs(profit_amount)
-	})
+	gl_entries.append(
+		{
+			"account": disposal_account,
+			"cost_center": depreciation_cost_center,
+			debit_or_credit: abs(profit_amount),
+			debit_or_credit + "_in_account_currency": abs(profit_amount),
+		}
+	)
+
 
 @frappe.whitelist()
 def get_disposal_account_and_cost_center(company):
-	disposal_account, depreciation_cost_center = frappe.get_cached_value('Company',  company,
-		["disposal_account", "depreciation_cost_center"])
+	disposal_account, depreciation_cost_center = frappe.get_cached_value(
+		"Company", company, ["disposal_account", "depreciation_cost_center"]
+	)
 
 	if not disposal_account:
-		frappe.throw(_("Please set 'Gain/Loss Account on Asset Disposal' in Company {0}").format(company))
+		frappe.throw(
+			_("Please set 'Gain/Loss Account on Asset Disposal' in Company {0}").format(company)
+		)
 	if not depreciation_cost_center:
 		frappe.throw(_("Please set 'Asset Depreciation Cost Center' in Company {0}").format(company))
 
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index ffd1065..f681b34 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -32,6 +32,7 @@
 	def tearDownClass(cls):
 		frappe.db.rollback()
 
+
 class TestAsset(AssetSetup):
 	def test_asset_category_is_fetched(self):
 		"""Tests if the Item's Asset Category value is assigned to the Asset, if the field is empty."""
@@ -52,7 +53,7 @@
 		"""Tests if either PI or PR is present if CWIP is enabled and is_existing_asset=0."""
 
 		asset = create_asset(item_code="Macbook Pro", do_not_save=1)
-		asset.is_existing_asset=0
+		asset.is_existing_asset = 0
 
 		self.assertRaises(frappe.ValidationError, asset.save)
 
@@ -86,11 +87,12 @@
 		self.assertRaises(frappe.ValidationError, asset.save)
 
 	def test_purchase_asset(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=100000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"
+		)
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset = frappe.get_doc("Asset", asset_name)
 		asset.calculate_depreciation = 1
 
 		month_end_date = get_last_day(nowdate())
@@ -98,13 +100,16 @@
 
 		asset.available_for_use_date = purchase_date
 		asset.purchase_date = purchase_date
-		asset.append("finance_books", {
-			"expected_value_after_useful_life": 10000,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10,
-			"depreciation_start_date": month_end_date
-		})
+		asset.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 10000,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+				"depreciation_start_date": month_end_date,
+			},
+		)
 		asset.submit()
 
 		pi = make_invoice(pr.name)
@@ -119,12 +124,15 @@
 
 		expected_gle = (
 			("Asset Received But Not Billed - _TC", 100000.0, 0.0),
-			("Creditors - _TC", 0.0, 100000.0)
+			("Creditors - _TC", 0.0, 100000.0),
 		)
 
-		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Purchase Invoice' and voucher_no = %s
-			order by account""", pi.name)
+			order by account""",
+			pi.name,
+		)
 		self.assertEqual(gle, expected_gle)
 
 		pi.cancel()
@@ -138,8 +146,8 @@
 		create_fixed_asset_item("Rack", is_grouped_asset=1)
 		pr = make_purchase_receipt(item_code="Rack", qty=3, rate=100000.0, location="Test Location")
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset = frappe.get_doc("Asset", asset_name)
 		self.assertEqual(asset.asset_quantity, 3)
 		asset.calculate_depreciation = 1
 
@@ -148,40 +156,39 @@
 
 		asset.available_for_use_date = purchase_date
 		asset.purchase_date = purchase_date
-		asset.append("finance_books", {
-			"expected_value_after_useful_life": 10000,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10,
-			"depreciation_start_date": month_end_date
-		})
+		asset.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 10000,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+				"depreciation_start_date": month_end_date,
+			},
+		)
 		asset.submit()
 
 	def test_is_fixed_asset_set(self):
-		asset = create_asset(is_existing_asset = 1)
-		doc = frappe.new_doc('Purchase Invoice')
-		doc.supplier = '_Test Supplier'
-		doc.append('items', {
-			'item_code': 'Macbook Pro',
-			'qty': 1,
-			'asset': asset.name
-		})
+		asset = create_asset(is_existing_asset=1)
+		doc = frappe.new_doc("Purchase Invoice")
+		doc.supplier = "_Test Supplier"
+		doc.append("items", {"item_code": "Macbook Pro", "qty": 1, "asset": asset.name})
 
 		doc.set_missing_values()
 		self.assertEqual(doc.items[0].is_fixed_asset, 1)
 
 	def test_scrap_asset(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = '2020-01-01',
-			purchase_date = '2020-01-01',
-			expected_value_after_useful_life = 10000,
-			total_number_of_depreciations = 10,
-			frequency_of_depreciation = 1,
-			submit = 1
+			calculate_depreciation=1,
+			available_for_use_date="2020-01-01",
+			purchase_date="2020-01-01",
+			expected_value_after_useful_life=10000,
+			total_number_of_depreciations=10,
+			frequency_of_depreciation=1,
+			submit=1,
 		)
 
-		post_depreciation_entries(date=add_months('2020-01-01', 4))
+		post_depreciation_entries(date=add_months("2020-01-01", 4))
 
 		scrap_asset(asset.name)
 
@@ -192,12 +199,15 @@
 		expected_gle = (
 			("_Test Accumulated Depreciations - _TC", 36000.0, 0.0),
 			("_Test Fixed Asset - _TC", 0.0, 100000.0),
-			("_Test Gain/Loss on Asset Disposal - _TC", 64000.0, 0.0)
+			("_Test Gain/Loss on Asset Disposal - _TC", 64000.0, 0.0),
 		)
 
-		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Journal Entry' and voucher_no = %s
-			order by account""", asset.journal_entry_for_scrap)
+			order by account""",
+			asset.journal_entry_for_scrap,
+		)
 		self.assertEqual(gle, expected_gle)
 
 		restore_asset(asset.name)
@@ -208,14 +218,14 @@
 
 	def test_gle_made_by_asset_sale(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = '2020-06-06',
-			purchase_date = '2020-01-01',
-			expected_value_after_useful_life = 10000,
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 10,
-			depreciation_start_date = '2020-12-31',
-			submit = 1
+			calculate_depreciation=1,
+			available_for_use_date="2020-06-06",
+			purchase_date="2020-01-01",
+			expected_value_after_useful_life=10000,
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=10,
+			depreciation_start_date="2020-12-31",
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-01-01")
@@ -233,12 +243,15 @@
 			("_Test Accumulated Depreciations - _TC", 20490.2, 0.0),
 			("_Test Fixed Asset - _TC", 0.0, 100000.0),
 			("_Test Gain/Loss on Asset Disposal - _TC", 54509.8, 0.0),
-			("Debtors - _TC", 25000.0, 0.0)
+			("Debtors - _TC", 25000.0, 0.0),
 		)
 
-		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Sales Invoice' and voucher_no = %s
-			order by account""", si.name)
+			order by account""",
+			si.name,
+		)
 
 		self.assertEqual(gle, expected_gle)
 
@@ -247,18 +260,18 @@
 
 	def test_asset_splitting(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
+			calculate_depreciation=1,
 			asset_quantity=10,
-			available_for_use_date = '2020-01-01',
-			purchase_date = '2020-01-01',
-			expected_value_after_useful_life = 0,
-			total_number_of_depreciations = 6,
-			number_of_depreciations_booked = 1,
-			frequency_of_depreciation = 10,
-			depreciation_start_date = '2021-01-01',
+			available_for_use_date="2020-01-01",
+			purchase_date="2020-01-01",
+			expected_value_after_useful_life=0,
+			total_number_of_depreciations=6,
+			number_of_depreciations_booked=1,
+			frequency_of_depreciation=10,
+			depreciation_start_date="2021-01-01",
 			opening_accumulated_depreciation=20000,
 			gross_purchase_amount=120000,
-			submit = 1
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-01-01")
@@ -285,7 +298,7 @@
 
 		journal_entry = asset.schedules[0].journal_entry
 
-		jv = frappe.get_doc('Journal Entry', journal_entry)
+		jv = frappe.get_doc("Journal Entry", journal_entry)
 		self.assertEqual(jv.accounts[0].credit_in_account_currency, 16000)
 		self.assertEqual(jv.accounts[1].debit_in_account_currency, 16000)
 		self.assertEqual(jv.accounts[2].credit_in_account_currency, 4000)
@@ -297,45 +310,56 @@
 		self.assertEqual(jv.accounts[3].reference_name, new_asset.name)
 
 	def test_expense_head(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=2, rate=200000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=2, rate=200000.0, location="Test Location"
+		)
 		doc = make_invoice(pr.name)
 
-		self.assertEqual('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
+		self.assertEqual("Asset Received But Not Billed - _TC", doc.items[0].expense_account)
 
 	# CWIP: Capital Work In Progress
 	def test_cwip_accounting(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=5000, do_not_submit=True, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=5000, do_not_submit=True, location="Test Location"
+		)
 
-		pr.set('taxes', [{
-			'category': 'Total',
-			'add_deduct_tax': 'Add',
-			'charge_type': 'On Net Total',
-			'account_head': '_Test Account Service Tax - _TC',
-			'description': '_Test Account Service Tax',
-			'cost_center': 'Main - _TC',
-			'rate': 5.0
-		}, {
-			'category': 'Valuation and Total',
-			'add_deduct_tax': 'Add',
-			'charge_type': 'On Net Total',
-			'account_head': '_Test Account Shipping Charges - _TC',
-			'description': '_Test Account Shipping Charges',
-			'cost_center': 'Main - _TC',
-			'rate': 5.0
-		}])
+		pr.set(
+			"taxes",
+			[
+				{
+					"category": "Total",
+					"add_deduct_tax": "Add",
+					"charge_type": "On Net Total",
+					"account_head": "_Test Account Service Tax - _TC",
+					"description": "_Test Account Service Tax",
+					"cost_center": "Main - _TC",
+					"rate": 5.0,
+				},
+				{
+					"category": "Valuation and Total",
+					"add_deduct_tax": "Add",
+					"charge_type": "On Net Total",
+					"account_head": "_Test Account Shipping Charges - _TC",
+					"description": "_Test Account Shipping Charges",
+					"cost_center": "Main - _TC",
+					"rate": 5.0,
+				},
+			],
+		)
 
 		pr.submit()
 
 		expected_gle = (
 			("Asset Received But Not Billed - _TC", 0.0, 5250.0),
-			("CWIP Account - _TC", 5250.0, 0.0)
+			("CWIP Account - _TC", 5250.0, 0.0),
 		)
 
-		pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		pr_gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Purchase Receipt' and voucher_no = %s
-			order by account""", pr.name)
+			order by account""",
+			pr.name,
+		)
 
 		self.assertEqual(pr_gle, expected_gle)
 
@@ -350,45 +374,53 @@
 			("Expenses Included In Asset Valuation - _TC", 0.0, 250.0),
 		)
 
-		pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		pi_gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Purchase Invoice' and voucher_no = %s
-			order by account""", pi.name)
+			order by account""",
+			pi.name,
+		)
 
 		self.assertEqual(pi_gle, expected_gle)
 
-		asset = frappe.db.get_value('Asset',
-			{'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
+		asset = frappe.db.get_value("Asset", {"purchase_receipt": pr.name, "docstatus": 0}, "name")
 
-		asset_doc = frappe.get_doc('Asset', asset)
+		asset_doc = frappe.get_doc("Asset", asset)
 
 		month_end_date = get_last_day(nowdate())
-		asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
+		asset_doc.available_for_use_date = (
+			nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
+		)
 		self.assertEqual(asset_doc.gross_purchase_amount, 5250.0)
 
-		asset_doc.append("finance_books", {
-			"expected_value_after_useful_life": 200,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10,
-			"depreciation_start_date": month_end_date
-		})
+		asset_doc.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 200,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+				"depreciation_start_date": month_end_date,
+			},
+		)
 		asset_doc.submit()
 
-		expected_gle = (
-			("_Test Fixed Asset - _TC", 5250.0, 0.0),
-			("CWIP Account - _TC", 0.0, 5250.0)
-		)
+		expected_gle = (("_Test Fixed Asset - _TC", 5250.0, 0.0), ("CWIP Account - _TC", 0.0, 5250.0))
 
-		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Asset' and voucher_no = %s
-			order by account""", asset_doc.name)
-
+			order by account""",
+			asset_doc.name,
+		)
 
 		self.assertEqual(gle, expected_gle)
 
 	def test_asset_cwip_toggling_cases(self):
 		cwip = frappe.db.get_value("Asset Category", "Computers", "enable_cwip_accounting")
-		name = frappe.db.get_value("Asset Category Account", filters={"parent": "Computers"}, fieldname=["name"])
+		name = frappe.db.get_value(
+			"Asset Category Account", filters={"parent": "Computers"}, fieldname=["name"]
+		)
 		cwip_acc = "CWIP Account - _TC"
 
 		frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0)
@@ -396,197 +428,231 @@
 		frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", "")
 
 		# case 0 -- PI with cwip disable, Asset with cwip disabled, No cwip account set
-		pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1)
-		asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset)
+		pi = make_purchase_invoice(
+			item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1
+		)
+		asset = frappe.db.get_value("Asset", {"purchase_invoice": pi.name, "docstatus": 0}, "name")
+		asset_doc = frappe.get_doc("Asset", asset)
 		asset_doc.available_for_use_date = nowdate()
 		asset_doc.calculate_depreciation = 0
 		asset_doc.submit()
-		gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""",
+			asset_doc.name,
+		)
 		self.assertFalse(gle)
 
 		# case 1 -- PR with cwip disabled, Asset with cwip enabled
-		pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location"
+		)
 		frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 1)
 		frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc)
-		asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset)
+		asset = frappe.db.get_value("Asset", {"purchase_receipt": pr.name, "docstatus": 0}, "name")
+		asset_doc = frappe.get_doc("Asset", asset)
 		asset_doc.available_for_use_date = nowdate()
 		asset_doc.calculate_depreciation = 0
 		asset_doc.submit()
-		gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""",
+			asset_doc.name,
+		)
 		self.assertFalse(gle)
 
 		# case 2 -- PR with cwip enabled, Asset with cwip disabled
-		pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location"
+		)
 		frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0)
-		asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset)
+		asset = frappe.db.get_value("Asset", {"purchase_receipt": pr.name, "docstatus": 0}, "name")
+		asset_doc = frappe.get_doc("Asset", asset)
 		asset_doc.available_for_use_date = nowdate()
 		asset_doc.calculate_depreciation = 0
 		asset_doc.submit()
-		gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""",
+			asset_doc.name,
+		)
 		self.assertTrue(gle)
 
 		# case 3 -- PI with cwip disabled, Asset with cwip enabled
-		pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1)
+		pi = make_purchase_invoice(
+			item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1
+		)
 		frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 1)
-		asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset)
+		asset = frappe.db.get_value("Asset", {"purchase_invoice": pi.name, "docstatus": 0}, "name")
+		asset_doc = frappe.get_doc("Asset", asset)
 		asset_doc.available_for_use_date = nowdate()
 		asset_doc.calculate_depreciation = 0
 		asset_doc.submit()
-		gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""",
+			asset_doc.name,
+		)
 		self.assertFalse(gle)
 
 		# case 4 -- PI with cwip enabled, Asset with cwip disabled
-		pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1)
+		pi = make_purchase_invoice(
+			item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1
+		)
 		frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0)
-		asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset)
+		asset = frappe.db.get_value("Asset", {"purchase_invoice": pi.name, "docstatus": 0}, "name")
+		asset_doc = frappe.get_doc("Asset", asset)
 		asset_doc.available_for_use_date = nowdate()
 		asset_doc.calculate_depreciation = 0
 		asset_doc.submit()
-		gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name)
+		gle = frappe.db.sql(
+			"""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""",
+			asset_doc.name,
+		)
 		self.assertTrue(gle)
 
 		frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", cwip)
 		frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc)
 		frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", cwip_acc)
 
+
 class TestDepreciationMethods(AssetSetup):
 	def test_schedule_for_straight_line_method(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-01-01",
-			purchase_date = "2030-01-01",
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-01-01",
+			purchase_date="2030-01-01",
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.status, "Draft")
 		expected_schedules = [
 			["2030-12-31", 30000.00, 30000.00],
 			["2031-12-31", 30000.00, 60000.00],
-			["2032-12-31", 30000.00, 90000.00]
+			["2032-12-31", 30000.00, 90000.00],
 		]
 
-		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-			for d in asset.get("schedules")]
+		schedules = [
+			[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
 	def test_schedule_for_straight_line_method_for_existing_asset(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-06-06",
-			is_existing_asset = 1,
-			number_of_depreciations_booked = 2,
-			opening_accumulated_depreciation = 47095.89,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2032-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-06-06",
+			is_existing_asset=1,
+			number_of_depreciations_booked=2,
+			opening_accumulated_depreciation=47095.89,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2032-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.status, "Draft")
-		expected_schedules = [
-			["2032-12-31", 30000.0, 77095.89],
-			["2033-06-06", 12904.11, 90000.0]
+		expected_schedules = [["2032-12-31", 30000.0, 77095.89], ["2033-06-06", 12904.11, 90000.0]]
+		schedules = [
+			[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")
 		]
-		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
-			for d in asset.get("schedules")]
 
 		self.assertEqual(schedules, expected_schedules)
 
 	def test_schedule_for_double_declining_method(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-01-01",
-			purchase_date = "2030-01-01",
-			depreciation_method = "Double Declining Balance",
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-01-01",
+			purchase_date="2030-01-01",
+			depreciation_method="Double Declining Balance",
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.status, "Draft")
 
 		expected_schedules = [
-			['2030-12-31', 66667.00, 66667.00],
-			['2031-12-31', 22222.11, 88889.11],
-			['2032-12-31', 1110.89, 90000.0]
+			["2030-12-31", 66667.00, 66667.00],
+			["2031-12-31", 22222.11, 88889.11],
+			["2032-12-31", 1110.89, 90000.0],
 		]
 
-		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-			for d in asset.get("schedules")]
+		schedules = [
+			[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
 	def test_schedule_for_double_declining_method_for_existing_asset(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-01-01",
-			is_existing_asset = 1,
-			depreciation_method = "Double Declining Balance",
-			number_of_depreciations_booked = 1,
-			opening_accumulated_depreciation = 50000,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-01-01",
+			is_existing_asset=1,
+			depreciation_method="Double Declining Balance",
+			number_of_depreciations_booked=1,
+			opening_accumulated_depreciation=50000,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.status, "Draft")
 
-		expected_schedules = [
-			["2030-12-31", 33333.50, 83333.50],
-			["2031-12-31", 6666.50, 90000.0]
-		]
+		expected_schedules = [["2030-12-31", 33333.50, 83333.50], ["2031-12-31", 6666.50, 90000.0]]
 
-		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-			for d in asset.get("schedules")]
+		schedules = [
+			[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
 	def test_schedule_for_prorated_straight_line_method(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-01-30",
-			purchase_date = "2030-01-30",
-			depreciation_method = "Straight Line",
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-01-30",
+			purchase_date="2030-01-30",
+			depreciation_method="Straight Line",
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		expected_schedules = [
-			['2030-12-31', 27616.44, 27616.44],
-			['2031-12-31', 30000.0, 57616.44],
-			['2032-12-31', 30000.0, 87616.44],
-			['2033-01-30', 2383.56, 90000.0]
+			["2030-12-31", 27616.44, 27616.44],
+			["2031-12-31", 30000.0, 57616.44],
+			["2032-12-31", 30000.0, 87616.44],
+			["2033-01-30", 2383.56, 90000.0],
 		]
 
-		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-			for d in asset.get("schedules")]
+		schedules = [
+			[
+				cstr(d.schedule_date),
+				flt(d.depreciation_amount, 2),
+				flt(d.accumulated_depreciation_amount, 2),
+			]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
 	# WDV: Written Down Value method
 	def test_depreciation_entry_for_wdv_without_pro_rata(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-01-01",
-			purchase_date = "2030-01-01",
-			depreciation_method = "Written Down Value",
-			expected_value_after_useful_life = 12500,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-01-01",
+			purchase_date="2030-01-01",
+			depreciation_method="Written Down Value",
+			expected_value_after_useful_life=12500,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
@@ -597,35 +663,47 @@
 			["2032-12-31", 12500.0, 87500.0],
 		]
 
-		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-			for d in asset.get("schedules")]
+		schedules = [
+			[
+				cstr(d.schedule_date),
+				flt(d.depreciation_amount, 2),
+				flt(d.accumulated_depreciation_amount, 2),
+			]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
 	# WDV: Written Down Value method
 	def test_pro_rata_depreciation_entry_for_wdv(self):
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-06-06",
-			purchase_date = "2030-01-01",
-			depreciation_method = "Written Down Value",
-			expected_value_after_useful_life = 12500,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-06-06",
+			purchase_date="2030-01-01",
+			depreciation_method="Written Down Value",
+			expected_value_after_useful_life=12500,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
 
 		expected_schedules = [
-			['2030-12-31', 28630.14, 28630.14],
-			['2031-12-31', 35684.93, 64315.07],
-			['2032-12-31', 17842.47, 82157.54],
-			['2033-06-06', 5342.46, 87500.0]
+			["2030-12-31", 28630.14, 28630.14],
+			["2031-12-31", 35684.93, 64315.07],
+			["2032-12-31", 17842.47, 82157.54],
+			["2033-06-06", 5342.46, 87500.0],
 		]
 
-		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-			for d in asset.get("schedules")]
+		schedules = [
+			[
+				cstr(d.schedule_date),
+				flt(d.depreciation_amount, 2),
+				flt(d.accumulated_depreciation_amount, 2),
+			]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
@@ -637,18 +715,18 @@
 		finance_book = frappe.new_doc("Finance Book")
 		finance_book.finance_book_name = "Income Tax"
 		finance_book.for_income_tax = 1
-		finance_book.insert(ignore_if_duplicate = True)
+		finance_book.insert(ignore_if_duplicate=True)
 
 		asset = create_asset(
-			calculate_depreciation = 1,
-			available_for_use_date = "2030-07-12",
-			purchase_date = "2030-01-01",
-			finance_book = finance_book.name,
-			depreciation_method = "Written Down Value",
-			expected_value_after_useful_life = 12500,
-			depreciation_start_date = "2030-12-31",
-			total_number_of_depreciations = 3,
-			frequency_of_depreciation = 12
+			calculate_depreciation=1,
+			available_for_use_date="2030-07-12",
+			purchase_date="2030-01-01",
+			finance_book=finance_book.name,
+			depreciation_method="Written Down Value",
+			expected_value_after_useful_life=12500,
+			depreciation_start_date="2030-12-31",
+			total_number_of_depreciations=3,
+			frequency_of_depreciation=12,
 		)
 
 		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
@@ -657,33 +735,40 @@
 			["2030-12-31", 11849.32, 11849.32],
 			["2031-12-31", 44075.34, 55924.66],
 			["2032-12-31", 22037.67, 77962.33],
-			["2033-07-12", 9537.67, 87500.0]
+			["2033-07-12", 9537.67, 87500.0],
 		]
 
-		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-			for d in asset.get("schedules")]
+		schedules = [
+			[
+				cstr(d.schedule_date),
+				flt(d.depreciation_amount, 2),
+				flt(d.accumulated_depreciation_amount, 2),
+			]
+			for d in asset.get("schedules")
+		]
 
 		self.assertEqual(schedules, expected_schedules)
 
 		# reset indian company
 		frappe.flags.company = company_flag
 
+
 class TestDepreciationBasics(AssetSetup):
 	def test_depreciation_without_pro_rata(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = getdate("2019-12-31"),
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = getdate("2020-12-31"),
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date=getdate("2019-12-31"),
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date=getdate("2020-12-31"),
+			submit=1,
 		)
 
 		expected_values = [
 			["2020-12-31", 30000, 30000],
 			["2021-12-31", 30000, 60000],
-			["2022-12-31", 30000, 90000]
+			["2022-12-31", 30000, 90000],
 		]
 
 		for i, schedule in enumerate(asset.schedules):
@@ -693,20 +778,20 @@
 
 	def test_depreciation_with_pro_rata(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = getdate("2020-01-01"),
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = getdate("2020-07-01"),
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date=getdate("2020-01-01"),
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date=getdate("2020-07-01"),
+			submit=1,
 		)
 
 		expected_values = [
 			["2020-07-01", 15000, 15000],
 			["2021-07-01", 30000, 45000],
 			["2022-07-01", 30000, 75000],
-			["2023-01-01", 15000, 90000]
+			["2023-01-01", 15000, 90000],
 		]
 
 		for i, schedule in enumerate(asset.schedules):
@@ -719,19 +804,19 @@
 
 		from erpnext.assets.doctype.asset.asset import get_depreciation_amount
 
-		asset = create_asset(
-			item_code = "Macbook Pro",
-			available_for_use_date = "2019-12-31"
-		)
+		asset = create_asset(item_code="Macbook Pro", available_for_use_date="2019-12-31")
 
 		asset.calculate_depreciation = 1
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 12,
-			"total_number_of_depreciations": 3,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-12-31"
-		})
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 12,
+				"total_number_of_depreciations": 3,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-12-31",
+			},
+		)
 
 		depreciation_amount = get_depreciation_amount(asset, 100000, asset.finance_books[0])
 		self.assertEqual(depreciation_amount, 30000)
@@ -740,21 +825,17 @@
 		"""Tests if make_depreciation_schedule() returns the right values."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			depreciation_method = "Straight Line",
-			frequency_of_depreciation = 12,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2020-12-31"
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			depreciation_method="Straight Line",
+			frequency_of_depreciation=12,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2020-12-31",
 		)
 
-		expected_values = [
-			['2020-12-31', 30000.0],
-			['2021-12-31', 30000.0],
-			['2022-12-31', 30000.0]
-		]
+		expected_values = [["2020-12-31", 30000.0], ["2021-12-31", 30000.0], ["2022-12-31", 30000.0]]
 
 		for i, schedule in enumerate(asset.schedules):
 			self.assertEqual(expected_values[i][0], schedule.schedule_date)
@@ -764,14 +845,14 @@
 		"""Tests if set_accumulated_depreciation() returns the right values."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			depreciation_method = "Straight Line",
-			frequency_of_depreciation = 12,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2020-12-31"
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			depreciation_method="Straight Line",
+			frequency_of_depreciation=12,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2020-12-31",
 		)
 
 		expected_values = [30000.0, 60000.0, 90000.0]
@@ -782,32 +863,34 @@
 	def test_check_is_pro_rata(self):
 		"""Tests if check_is_pro_rata() returns the right value(i.e. checks if has_pro_rata is accurate)."""
 
-		asset = create_asset(
-			item_code = "Macbook Pro",
-			available_for_use_date = "2019-12-31",
-			do_not_save = 1
-		)
+		asset = create_asset(item_code="Macbook Pro", available_for_use_date="2019-12-31", do_not_save=1)
 
 		asset.calculate_depreciation = 1
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 12,
-			"total_number_of_depreciations": 3,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-12-31"
-		})
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 12,
+				"total_number_of_depreciations": 3,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-12-31",
+			},
+		)
 
 		has_pro_rata = asset.check_is_pro_rata(asset.finance_books[0])
 		self.assertFalse(has_pro_rata)
 
 		asset.finance_books = []
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 12,
-			"total_number_of_depreciations": 3,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-07-01"
-		})
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 12,
+				"total_number_of_depreciations": 3,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-07-01",
+			},
+		)
 
 		has_pro_rata = asset.check_is_pro_rata(asset.finance_books[0])
 		self.assertTrue(has_pro_rata)
@@ -816,13 +899,13 @@
 		"""Tests if an error is raised when expected_value_after_useful_life(110,000) > gross_purchase_amount(100,000)."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 110000,
-			depreciation_start_date = "2020-07-01",
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=110000,
+			depreciation_start_date="2020-07-01",
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
@@ -831,11 +914,11 @@
 		"""Tests if an error is raised when neither depreciation_start_date nor available_for_use_date are specified."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 110000,
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=110000,
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
@@ -844,14 +927,14 @@
 		"""Tests if an error is raised when opening_accumulated_depreciation > (gross_purchase_amount - expected_value_after_useful_life)."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2020-07-01",
-			opening_accumulated_depreciation = 100000,
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2020-07-01",
+			opening_accumulated_depreciation=100000,
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
@@ -860,14 +943,14 @@
 		"""Tests if an error is raised when number_of_depreciations_booked is not specified when opening_accumulated_depreciation is."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2020-07-01",
-			opening_accumulated_depreciation = 10000,
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2020-07-01",
+			opening_accumulated_depreciation=10000,
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
@@ -877,56 +960,56 @@
 
 		# number_of_depreciations_booked > total_number_of_depreciations
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2020-07-01",
-			opening_accumulated_depreciation = 10000,
-			number_of_depreciations_booked = 5,
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2020-07-01",
+			opening_accumulated_depreciation=10000,
+			number_of_depreciations_booked=5,
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
 
 		# number_of_depreciations_booked = total_number_of_depreciations
 		asset_2 = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 5,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2020-07-01",
-			opening_accumulated_depreciation = 10000,
-			number_of_depreciations_booked = 5,
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=5,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2020-07-01",
+			opening_accumulated_depreciation=10000,
+			number_of_depreciations_booked=5,
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset_2.save)
 
 	def test_depreciation_start_date_is_before_purchase_date(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2014-07-01",
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2014-07-01",
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
 
 	def test_depreciation_start_date_is_before_available_for_use_date(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			depreciation_start_date = "2018-07-01",
-			do_not_save = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			depreciation_start_date="2018-07-01",
+			do_not_save=1,
 		)
 
 		self.assertRaises(frappe.ValidationError, asset.save)
@@ -941,14 +1024,14 @@
 		"""Tests if post_depreciation_entries() works as expected."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			depreciation_start_date = "2020-12-31",
-			frequency_of_depreciation = 12,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			depreciation_start_date="2020-12-31",
+			frequency_of_depreciation=12,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-06-01")
@@ -962,21 +1045,24 @@
 		"""Tests if the Depreciation Expense Account gets debited and the Accumulated Depreciation Account gets credited when the former's an Expense Account."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			depreciation_start_date = "2020-12-31",
-			frequency_of_depreciation = 12,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			depreciation_start_date="2020-12-31",
+			frequency_of_depreciation=12,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-06-01")
 		asset.load_from_db()
 
 		je = frappe.get_doc("Journal Entry", asset.schedules[0].journal_entry)
-		accounting_entries = [{"account": entry.account, "debit": entry.debit, "credit": entry.credit} for entry in je.accounts]
+		accounting_entries = [
+			{"account": entry.account, "debit": entry.debit, "credit": entry.credit}
+			for entry in je.accounts
+		]
 
 		for entry in accounting_entries:
 			if entry["account"] == "_Test Depreciations - _TC":
@@ -995,21 +1081,24 @@
 		depr_expense_account.save()
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			depreciation_start_date = "2020-12-31",
-			frequency_of_depreciation = 12,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			depreciation_start_date="2020-12-31",
+			frequency_of_depreciation=12,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-06-01")
 		asset.load_from_db()
 
 		je = frappe.get_doc("Journal Entry", asset.schedules[0].journal_entry)
-		accounting_entries = [{"account": entry.account, "debit": entry.debit, "credit": entry.credit} for entry in je.accounts]
+		accounting_entries = [
+			{"account": entry.account, "debit": entry.debit, "credit": entry.credit}
+			for entry in je.accounts
+		]
 
 		for entry in accounting_entries:
 			if entry["account"] == "_Test Depreciations - _TC":
@@ -1028,14 +1117,14 @@
 		"""Tests if clear_depreciation_schedule() works as expected."""
 
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2019-12-31",
-			depreciation_start_date = "2020-12-31",
-			frequency_of_depreciation = 12,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2019-12-31",
+			depreciation_start_date="2020-12-31",
+			frequency_of_depreciation=12,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-06-01")
@@ -1046,34 +1135,39 @@
 		self.assertEqual(len(asset.schedules), 1)
 
 	def test_clear_depreciation_schedule_for_multiple_finance_books(self):
-		asset = create_asset(
-			item_code = "Macbook Pro",
-			available_for_use_date = "2019-12-31",
-			do_not_save = 1
-		)
+		asset = create_asset(item_code="Macbook Pro", available_for_use_date="2019-12-31", do_not_save=1)
 
 		asset.calculate_depreciation = 1
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 1,
-			"total_number_of_depreciations": 3,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-01-31"
-		})
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 1,
-			"total_number_of_depreciations": 6,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-01-31"
-		})
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 12,
-			"total_number_of_depreciations": 3,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-12-31"
-		})
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 1,
+				"total_number_of_depreciations": 3,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-01-31",
+			},
+		)
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 1,
+				"total_number_of_depreciations": 6,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-01-31",
+			},
+		)
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 12,
+				"total_number_of_depreciations": 3,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-12-31",
+			},
+		)
 		asset.submit()
 
 		post_depreciation_entries(date="2020-04-01")
@@ -1090,27 +1184,29 @@
 				self.assertEqual(schedule.finance_book_id, "2")
 
 	def test_depreciation_schedules_are_set_up_for_multiple_finance_books(self):
-		asset = create_asset(
-			item_code = "Macbook Pro",
-			available_for_use_date = "2019-12-31",
-			do_not_save = 1
-		)
+		asset = create_asset(item_code="Macbook Pro", available_for_use_date="2019-12-31", do_not_save=1)
 
 		asset.calculate_depreciation = 1
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 12,
-			"total_number_of_depreciations": 3,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-12-31"
-		})
-		asset.append("finance_books", {
-			"depreciation_method": "Straight Line",
-			"frequency_of_depreciation": 12,
-			"total_number_of_depreciations": 6,
-			"expected_value_after_useful_life": 10000,
-			"depreciation_start_date": "2020-12-31"
-		})
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 12,
+				"total_number_of_depreciations": 3,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-12-31",
+			},
+		)
+		asset.append(
+			"finance_books",
+			{
+				"depreciation_method": "Straight Line",
+				"frequency_of_depreciation": 12,
+				"total_number_of_depreciations": 6,
+				"expected_value_after_useful_life": 10000,
+				"depreciation_start_date": "2020-12-31",
+			},
+		)
 		asset.save()
 
 		self.assertEqual(len(asset.schedules), 9)
@@ -1123,15 +1219,15 @@
 
 	def test_depreciation_entry_cancellation(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			purchase_date = "2020-06-06",
-			available_for_use_date = "2020-06-06",
-			depreciation_start_date = "2020-12-31",
-			frequency_of_depreciation = 10,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			purchase_date="2020-06-06",
+			available_for_use_date="2020-06-06",
+			depreciation_start_date="2020-12-31",
+			frequency_of_depreciation=10,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			submit=1,
 		)
 
 		post_depreciation_entries(date="2021-01-01")
@@ -1149,34 +1245,38 @@
 
 	def test_asset_expected_value_after_useful_life(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			available_for_use_date = "2020-06-06",
-			purchase_date = "2020-06-06",
-			frequency_of_depreciation = 10,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			available_for_use_date="2020-06-06",
+			purchase_date="2020-06-06",
+			frequency_of_depreciation=10,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
 		)
 
-		accumulated_depreciation_after_full_schedule = \
-			max(d.accumulated_depreciation_amount for d in asset.get("schedules"))
+		accumulated_depreciation_after_full_schedule = max(
+			d.accumulated_depreciation_amount for d in asset.get("schedules")
+		)
 
-		asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) -
-			flt(accumulated_depreciation_after_full_schedule))
+		asset_value_after_full_schedule = flt(asset.gross_purchase_amount) - flt(
+			accumulated_depreciation_after_full_schedule
+		)
 
-		self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule)
+		self.assertTrue(
+			asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule
+		)
 
 	def test_gle_made_by_depreciation_entries(self):
 		asset = create_asset(
-			item_code = "Macbook Pro",
-			calculate_depreciation = 1,
-			purchase_date = "2020-01-30",
-			available_for_use_date = "2020-01-30",
-			depreciation_start_date = "2020-12-31",
-			frequency_of_depreciation = 10,
-			total_number_of_depreciations = 3,
-			expected_value_after_useful_life = 10000,
-			submit = 1
+			item_code="Macbook Pro",
+			calculate_depreciation=1,
+			purchase_date="2020-01-30",
+			available_for_use_date="2020-01-30",
+			depreciation_start_date="2020-12-31",
+			frequency_of_depreciation=10,
+			total_number_of_depreciations=3,
+			expected_value_after_useful_life=10000,
+			submit=1,
 		)
 
 		self.assertEqual(asset.status, "Submitted")
@@ -1190,20 +1290,23 @@
 
 		expected_gle = (
 			("_Test Accumulated Depreciations - _TC", 0.0, 30000.0),
-			("_Test Depreciations - _TC", 30000.0, 0.0)
+			("_Test Depreciations - _TC", 30000.0, 0.0),
 		)
 
-		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where against_voucher_type='Asset' and against_voucher = %s
-			order by account""", asset.name)
+			order by account""",
+			asset.name,
+		)
 
 		self.assertEqual(gle, expected_gle)
 		self.assertEqual(asset.get("value_after_depreciation"), 0)
 
 	def test_expected_value_change(self):
 		"""
-			tests if changing `expected_value_after_useful_life`
-			affects `value_after_depreciation`
+		tests if changing `expected_value_after_useful_life`
+		affects `value_after_depreciation`
 		"""
 
 		asset = create_asset(calculate_depreciation=1)
@@ -1222,7 +1325,7 @@
 		self.assertEquals(asset.finance_books[0].value_after_depreciation, 98000.0)
 
 	def test_asset_cost_center(self):
-		asset = create_asset(is_existing_asset = 1, do_not_save=1)
+		asset = create_asset(is_existing_asset=1, do_not_save=1)
 		asset.cost_center = "Main - WP"
 
 		self.assertRaises(frappe.ValidationError, asset.submit)
@@ -1230,6 +1333,7 @@
 		asset.cost_center = "Main - _TC"
 		asset.submit()
 
+
 def create_asset_data():
 	if not frappe.db.exists("Asset Category", "Computers"):
 		create_asset_category()
@@ -1238,45 +1342,48 @@
 		create_fixed_asset_item()
 
 	if not frappe.db.exists("Location", "Test Location"):
-		frappe.get_doc({
-			'doctype': 'Location',
-			'location_name': 'Test Location'
-		}).insert()
+		frappe.get_doc({"doctype": "Location", "location_name": "Test Location"}).insert()
+
 
 def create_asset(**args):
 	args = frappe._dict(args)
 
 	create_asset_data()
 
-	asset = frappe.get_doc({
-		"doctype": "Asset",
-		"asset_name": args.asset_name or "Macbook Pro 1",
-		"asset_category": args.asset_category or "Computers",
-		"item_code": args.item_code or "Macbook Pro",
-		"company": args.company or "_Test Company",
-		"purchase_date": args.purchase_date or "2015-01-01",
-		"calculate_depreciation": args.calculate_depreciation or 0,
-		"opening_accumulated_depreciation": args.opening_accumulated_depreciation or 0,
-		"number_of_depreciations_booked": args.number_of_depreciations_booked or 0,
-		"gross_purchase_amount": args.gross_purchase_amount or 100000,
-		"purchase_receipt_amount": args.purchase_receipt_amount or 100000,
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"available_for_use_date": args.available_for_use_date or "2020-06-06",
-		"location": args.location or "Test Location",
-		"asset_owner": args.asset_owner or "Company",
-		"is_existing_asset": args.is_existing_asset or 1,
-		"asset_quantity": args.get("asset_quantity") or 1
-	})
+	asset = frappe.get_doc(
+		{
+			"doctype": "Asset",
+			"asset_name": args.asset_name or "Macbook Pro 1",
+			"asset_category": args.asset_category or "Computers",
+			"item_code": args.item_code or "Macbook Pro",
+			"company": args.company or "_Test Company",
+			"purchase_date": args.purchase_date or "2015-01-01",
+			"calculate_depreciation": args.calculate_depreciation or 0,
+			"opening_accumulated_depreciation": args.opening_accumulated_depreciation or 0,
+			"number_of_depreciations_booked": args.number_of_depreciations_booked or 0,
+			"gross_purchase_amount": args.gross_purchase_amount or 100000,
+			"purchase_receipt_amount": args.purchase_receipt_amount or 100000,
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"available_for_use_date": args.available_for_use_date or "2020-06-06",
+			"location": args.location or "Test Location",
+			"asset_owner": args.asset_owner or "Company",
+			"is_existing_asset": args.is_existing_asset or 1,
+			"asset_quantity": args.get("asset_quantity") or 1,
+		}
+	)
 
 	if asset.calculate_depreciation:
-		asset.append("finance_books", {
-			"finance_book": args.finance_book,
-			"depreciation_method": args.depreciation_method or "Straight Line",
-			"frequency_of_depreciation": args.frequency_of_depreciation or 12,
-			"total_number_of_depreciations": args.total_number_of_depreciations or 5,
-			"expected_value_after_useful_life": args.expected_value_after_useful_life or 0,
-			"depreciation_start_date": args.depreciation_start_date
-		})
+		asset.append(
+			"finance_books",
+			{
+				"finance_book": args.finance_book,
+				"depreciation_method": args.depreciation_method or "Straight Line",
+				"frequency_of_depreciation": args.frequency_of_depreciation or 12,
+				"total_number_of_depreciations": args.total_number_of_depreciations or 5,
+				"expected_value_after_useful_life": args.expected_value_after_useful_life or 0,
+				"depreciation_start_date": args.depreciation_start_date,
+			},
+		)
 
 	if not args.do_not_save:
 		try:
@@ -1289,43 +1396,51 @@
 
 	return asset
 
+
 def create_asset_category():
 	asset_category = frappe.new_doc("Asset Category")
 	asset_category.asset_category_name = "Computers"
 	asset_category.total_number_of_depreciations = 3
 	asset_category.frequency_of_depreciation = 3
 	asset_category.enable_cwip_accounting = 1
-	asset_category.append("accounts", {
-		"company_name": "_Test Company",
-		"fixed_asset_account": "_Test Fixed Asset - _TC",
-		"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
-		"depreciation_expense_account": "_Test Depreciations - _TC"
-	})
+	asset_category.append(
+		"accounts",
+		{
+			"company_name": "_Test Company",
+			"fixed_asset_account": "_Test Fixed Asset - _TC",
+			"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
+			"depreciation_expense_account": "_Test Depreciations - _TC",
+		},
+	)
 	asset_category.insert()
 
+
 def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_asset=0):
-	meta = frappe.get_meta('Asset')
-	naming_series = meta.get_field("naming_series").options.splitlines()[0] or 'ACC-ASS-.YYYY.-'
+	meta = frappe.get_meta("Asset")
+	naming_series = meta.get_field("naming_series").options.splitlines()[0] or "ACC-ASS-.YYYY.-"
 	try:
-		item = frappe.get_doc({
-			"doctype": "Item",
-			"item_code": item_code or "Macbook Pro",
-			"item_name": "Macbook Pro",
-			"description": "Macbook Pro Retina Display",
-			"asset_category": "Computers",
-			"item_group": "All Item Groups",
-			"stock_uom": "Nos",
-			"is_stock_item": 0,
-			"is_fixed_asset": 1,
-			"auto_create_assets": auto_create_assets,
-			"is_grouped_asset": is_grouped_asset,
-			"asset_naming_series": naming_series
-		})
+		item = frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": item_code or "Macbook Pro",
+				"item_name": "Macbook Pro",
+				"description": "Macbook Pro Retina Display",
+				"asset_category": "Computers",
+				"item_group": "All Item Groups",
+				"stock_uom": "Nos",
+				"is_stock_item": 0,
+				"is_fixed_asset": 1,
+				"auto_create_assets": auto_create_assets,
+				"is_grouped_asset": is_grouped_asset,
+				"asset_naming_series": naming_series,
+			}
+		)
 		item.insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
 		pass
 	return item
 
+
 def set_depreciation_settings_in_company():
 	company = frappe.get_doc("Company", "_Test Company")
 	company.accumulated_depreciation_account = "_Test Accumulated Depreciations - _TC"
@@ -1337,5 +1452,6 @@
 	# Enable booking asset depreciation entry automatically
 	frappe.db.set_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically", 1)
 
+
 def enable_cwip_accounting(asset_category, enable=1):
 	frappe.db.set_value("Asset Category", asset_category, "enable_cwip_accounting", enable)
diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py
index bd573bf..7291daf 100644
--- a/erpnext/assets/doctype/asset_category/asset_category.py
+++ b/erpnext/assets/doctype/asset_category/asset_category.py
@@ -18,79 +18,104 @@
 	def validate_finance_books(self):
 		for d in self.finance_books:
 			for field in ("Total Number of Depreciations", "Frequency of Depreciation"):
-				if cint(d.get(frappe.scrub(field)))<1:
-					frappe.throw(_("Row {0}: {1} must be greater than 0").format(d.idx, field), frappe.MandatoryError)
+				if cint(d.get(frappe.scrub(field))) < 1:
+					frappe.throw(
+						_("Row {0}: {1} must be greater than 0").format(d.idx, field), frappe.MandatoryError
+					)
 
 	def validate_account_currency(self):
 		account_types = [
-			'fixed_asset_account', 'accumulated_depreciation_account', 'depreciation_expense_account', 'capital_work_in_progress_account'
+			"fixed_asset_account",
+			"accumulated_depreciation_account",
+			"depreciation_expense_account",
+			"capital_work_in_progress_account",
 		]
 		invalid_accounts = []
 		for d in self.accounts:
-			company_currency = frappe.get_value('Company', d.get('company_name'), 'default_currency')
+			company_currency = frappe.get_value("Company", d.get("company_name"), "default_currency")
 			for type_of_account in account_types:
 				if d.get(type_of_account):
 					account_currency = frappe.get_value("Account", d.get(type_of_account), "account_currency")
 					if account_currency != company_currency:
-						invalid_accounts.append(frappe._dict({ 'type': type_of_account, 'idx': d.idx, 'account': d.get(type_of_account) }))
+						invalid_accounts.append(
+							frappe._dict({"type": type_of_account, "idx": d.idx, "account": d.get(type_of_account)})
+						)
 
 		for d in invalid_accounts:
-			frappe.throw(_("Row #{}: Currency of {} - {} doesn't matches company currency.")
-				.format(d.idx, frappe.bold(frappe.unscrub(d.type)), frappe.bold(d.account)),
-				title=_("Invalid Account"))
-
+			frappe.throw(
+				_("Row #{}: Currency of {} - {} doesn't matches company currency.").format(
+					d.idx, frappe.bold(frappe.unscrub(d.type)), frappe.bold(d.account)
+				),
+				title=_("Invalid Account"),
+			)
 
 	def validate_account_types(self):
 		account_type_map = {
-			'fixed_asset_account': {'account_type': ['Fixed Asset']},
-			'accumulated_depreciation_account': {'account_type': ['Accumulated Depreciation']},
-			'depreciation_expense_account': {'root_type': ['Expense', 'Income']},
-			'capital_work_in_progress_account': {'account_type': ['Capital Work in Progress']}
+			"fixed_asset_account": {"account_type": ["Fixed Asset"]},
+			"accumulated_depreciation_account": {"account_type": ["Accumulated Depreciation"]},
+			"depreciation_expense_account": {"root_type": ["Expense", "Income"]},
+			"capital_work_in_progress_account": {"account_type": ["Capital Work in Progress"]},
 		}
 		for d in self.accounts:
 			for fieldname in account_type_map.keys():
 				if d.get(fieldname):
 					selected_account = d.get(fieldname)
-					key_to_match = next(iter(account_type_map.get(fieldname))) # acount_type or root_type
-					selected_key_type = frappe.db.get_value('Account', selected_account, key_to_match)
+					key_to_match = next(iter(account_type_map.get(fieldname)))  # acount_type or root_type
+					selected_key_type = frappe.db.get_value("Account", selected_account, key_to_match)
 					expected_key_types = account_type_map[fieldname][key_to_match]
 
 					if selected_key_type not in expected_key_types:
-						frappe.throw(_("Row #{}: {} of {} should be {}. Please modify the account or select a different account.")
-							.format(d.idx, frappe.unscrub(key_to_match), frappe.bold(selected_account), frappe.bold(expected_key_types)),
-							title=_("Invalid Account"))
+						frappe.throw(
+							_(
+								"Row #{}: {} of {} should be {}. Please modify the account or select a different account."
+							).format(
+								d.idx,
+								frappe.unscrub(key_to_match),
+								frappe.bold(selected_account),
+								frappe.bold(expected_key_types),
+							),
+							title=_("Invalid Account"),
+						)
 
 	def valide_cwip_account(self):
 		if self.enable_cwip_accounting:
 			missing_cwip_accounts_for_company = []
 			for d in self.accounts:
-				if (not d.capital_work_in_progress_account and
-					not frappe.db.get_value("Company", d.company_name, "capital_work_in_progress_account")):
+				if not d.capital_work_in_progress_account and not frappe.db.get_value(
+					"Company", d.company_name, "capital_work_in_progress_account"
+				):
 					missing_cwip_accounts_for_company.append(get_link_to_form("Company", d.company_name))
 
 			if missing_cwip_accounts_for_company:
 				msg = _("""To enable Capital Work in Progress Accounting, """)
 				msg += _("""you must select Capital Work in Progress Account in accounts table""")
 				msg += "<br><br>"
-				msg += _("You can also set default CWIP account in Company {}").format(", ".join(missing_cwip_accounts_for_company))
+				msg += _("You can also set default CWIP account in Company {}").format(
+					", ".join(missing_cwip_accounts_for_company)
+				)
 				frappe.throw(msg, title=_("Missing Account"))
 
 
 @frappe.whitelist()
-def get_asset_category_account(fieldname, item=None, asset=None, account=None, asset_category = None, company = None):
+def get_asset_category_account(
+	fieldname, item=None, asset=None, account=None, asset_category=None, company=None
+):
 	if item and frappe.db.get_value("Item", item, "is_fixed_asset"):
 		asset_category = frappe.db.get_value("Item", item, ["asset_category"])
 
 	elif not asset_category or not company:
 		if account:
 			if frappe.db.get_value("Account", account, "account_type") != "Fixed Asset":
-				account=None
+				account = None
 
 		if not account:
 			asset_details = frappe.db.get_value("Asset", asset, ["asset_category", "company"])
 			asset_category, company = asset_details or [None, None]
 
-	account = frappe.db.get_value("Asset Category Account",
-		filters={"parent": asset_category, "company_name": company}, fieldname=fieldname)
+	account = frappe.db.get_value(
+		"Asset Category Account",
+		filters={"parent": asset_category, "company_name": company},
+		fieldname=fieldname,
+	)
 
 	return account
diff --git a/erpnext/assets/doctype/asset_category/test_asset_category.py b/erpnext/assets/doctype/asset_category/test_asset_category.py
index 2f52248..2c92656 100644
--- a/erpnext/assets/doctype/asset_category/test_asset_category.py
+++ b/erpnext/assets/doctype/asset_category/test_asset_category.py
@@ -15,12 +15,15 @@
 
 		asset_category.total_number_of_depreciations = 3
 		asset_category.frequency_of_depreciation = 3
-		asset_category.append("accounts", {
-			"company_name": "_Test Company",
-			"fixed_asset_account": "_Test Fixed Asset - _TC",
-			"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
-			"depreciation_expense_account": "_Test Depreciations - _TC"
-		})
+		asset_category.append(
+			"accounts",
+			{
+				"company_name": "_Test Company",
+				"fixed_asset_account": "_Test Fixed Asset - _TC",
+				"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
+				"depreciation_expense_account": "_Test Depreciations - _TC",
+			},
+		)
 
 		try:
 			asset_category.insert(ignore_if_duplicate=True)
@@ -28,7 +31,9 @@
 			pass
 
 	def test_cwip_accounting(self):
-		company_cwip_acc = frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account")
+		company_cwip_acc = frappe.db.get_value(
+			"Company", "_Test Company", "capital_work_in_progress_account"
+		)
 		frappe.db.set_value("Company", "_Test Company", "capital_work_in_progress_account", "")
 
 		asset_category = frappe.new_doc("Asset Category")
@@ -37,11 +42,14 @@
 
 		asset_category.total_number_of_depreciations = 3
 		asset_category.frequency_of_depreciation = 3
-		asset_category.append("accounts", {
-			"company_name": "_Test Company",
-			"fixed_asset_account": "_Test Fixed Asset - _TC",
-			"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
-			"depreciation_expense_account": "_Test Depreciations - _TC"
-		})
+		asset_category.append(
+			"accounts",
+			{
+				"company_name": "_Test Company",
+				"fixed_asset_account": "_Test Fixed Asset - _TC",
+				"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
+				"depreciation_expense_account": "_Test Depreciations - _TC",
+			},
+		)
 
 		self.assertRaises(frappe.ValidationError, asset_category.insert)
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
index 4fc4c4c..e603d34 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
@@ -11,7 +11,7 @@
 
 class AssetMaintenance(Document):
 	def validate(self):
-		for task in self.get('asset_maintenance_tasks'):
+		for task in self.get("asset_maintenance_tasks"):
 			if task.end_date and (getdate(task.start_date) >= getdate(task.end_date)):
 				throw(_("Start date should be less than end date for task {0}").format(task.maintenance_task))
 			if getdate(task.next_due_date) < getdate(nowdate()):
@@ -20,83 +20,109 @@
 				throw(_("Row #{}: Please asign task to a member.").format(task.idx))
 
 	def on_update(self):
-		for task in self.get('asset_maintenance_tasks'):
+		for task in self.get("asset_maintenance_tasks"):
 			assign_tasks(self.name, task.assign_to, task.maintenance_task, task.next_due_date)
 		self.sync_maintenance_tasks()
 
 	def sync_maintenance_tasks(self):
 		tasks_names = []
-		for task in self.get('asset_maintenance_tasks'):
+		for task in self.get("asset_maintenance_tasks"):
 			tasks_names.append(task.name)
-			update_maintenance_log(asset_maintenance = self.name, item_code = self.item_code, item_name = self.item_name, task = task)
-		asset_maintenance_logs = frappe.get_all("Asset Maintenance Log", fields=["name"], filters = {"asset_maintenance": self.name,
-			"task": ("not in", tasks_names)})
+			update_maintenance_log(
+				asset_maintenance=self.name, item_code=self.item_code, item_name=self.item_name, task=task
+			)
+		asset_maintenance_logs = frappe.get_all(
+			"Asset Maintenance Log",
+			fields=["name"],
+			filters={"asset_maintenance": self.name, "task": ("not in", tasks_names)},
+		)
 		if asset_maintenance_logs:
 			for asset_maintenance_log in asset_maintenance_logs:
-				maintenance_log = frappe.get_doc('Asset Maintenance Log', asset_maintenance_log.name)
-				maintenance_log.db_set('maintenance_status', 'Cancelled')
+				maintenance_log = frappe.get_doc("Asset Maintenance Log", asset_maintenance_log.name)
+				maintenance_log.db_set("maintenance_status", "Cancelled")
+
 
 @frappe.whitelist()
 def assign_tasks(asset_maintenance_name, assign_to_member, maintenance_task, next_due_date):
-	team_member = frappe.db.get_value('User', assign_to_member, "email")
+	team_member = frappe.db.get_value("User", assign_to_member, "email")
 	args = {
-		'doctype' : 'Asset Maintenance',
-		'assign_to' : [team_member],
-		'name' : asset_maintenance_name,
-		'description' : maintenance_task,
-		'date' : next_due_date
+		"doctype": "Asset Maintenance",
+		"assign_to": [team_member],
+		"name": asset_maintenance_name,
+		"description": maintenance_task,
+		"date": next_due_date,
 	}
-	if not frappe.db.sql("""select owner from `tabToDo`
+	if not frappe.db.sql(
+		"""select owner from `tabToDo`
 		where reference_type=%(doctype)s and reference_name=%(name)s and status="Open"
-		and owner=%(assign_to)s""", args):
+		and owner=%(assign_to)s""",
+		args,
+	):
 		assign_to.add(args)
 
+
 @frappe.whitelist()
-def calculate_next_due_date(periodicity, start_date = None, end_date = None, last_completion_date = None, next_due_date = None):
+def calculate_next_due_date(
+	periodicity, start_date=None, end_date=None, last_completion_date=None, next_due_date=None
+):
 	if not start_date and not last_completion_date:
 		start_date = frappe.utils.now()
 
-	if last_completion_date and ((start_date and last_completion_date > start_date) or not start_date):
+	if last_completion_date and (
+		(start_date and last_completion_date > start_date) or not start_date
+	):
 		start_date = last_completion_date
-	if periodicity == 'Daily':
+	if periodicity == "Daily":
 		next_due_date = add_days(start_date, 1)
-	if periodicity == 'Weekly':
+	if periodicity == "Weekly":
 		next_due_date = add_days(start_date, 7)
-	if periodicity == 'Monthly':
+	if periodicity == "Monthly":
 		next_due_date = add_months(start_date, 1)
-	if periodicity == 'Yearly':
+	if periodicity == "Yearly":
 		next_due_date = add_years(start_date, 1)
-	if periodicity == '2 Yearly':
+	if periodicity == "2 Yearly":
 		next_due_date = add_years(start_date, 2)
-	if periodicity == 'Quarterly':
+	if periodicity == "Quarterly":
 		next_due_date = add_months(start_date, 3)
-	if end_date and ((start_date and start_date >= end_date) or (last_completion_date and last_completion_date >= end_date) or next_due_date):
+	if end_date and (
+		(start_date and start_date >= end_date)
+		or (last_completion_date and last_completion_date >= end_date)
+		or next_due_date
+	):
 		next_due_date = ""
 	return next_due_date
 
 
 def update_maintenance_log(asset_maintenance, item_code, item_name, task):
-	asset_maintenance_log = frappe.get_value("Asset Maintenance Log", {"asset_maintenance": asset_maintenance,
-		"task": task.name, "maintenance_status": ('in',['Planned','Overdue'])})
+	asset_maintenance_log = frappe.get_value(
+		"Asset Maintenance Log",
+		{
+			"asset_maintenance": asset_maintenance,
+			"task": task.name,
+			"maintenance_status": ("in", ["Planned", "Overdue"]),
+		},
+	)
 
 	if not asset_maintenance_log:
-		asset_maintenance_log = frappe.get_doc({
-			"doctype": "Asset Maintenance Log",
-			"asset_maintenance": asset_maintenance,
-			"asset_name": asset_maintenance,
-			"item_code": item_code,
-			"item_name": item_name,
-			"task": task.name,
-			"has_certificate": task.certificate_required,
-			"description": task.description,
-			"assign_to_name": task.assign_to_name,
-			"periodicity": str(task.periodicity),
-			"maintenance_type": task.maintenance_type,
-			"due_date": task.next_due_date
-		})
+		asset_maintenance_log = frappe.get_doc(
+			{
+				"doctype": "Asset Maintenance Log",
+				"asset_maintenance": asset_maintenance,
+				"asset_name": asset_maintenance,
+				"item_code": item_code,
+				"item_name": item_name,
+				"task": task.name,
+				"has_certificate": task.certificate_required,
+				"description": task.description,
+				"assign_to_name": task.assign_to_name,
+				"periodicity": str(task.periodicity),
+				"maintenance_type": task.maintenance_type,
+				"due_date": task.next_due_date,
+			}
+		)
 		asset_maintenance_log.insert()
 	else:
-		maintenance_log = frappe.get_doc('Asset Maintenance Log', asset_maintenance_log)
+		maintenance_log = frappe.get_doc("Asset Maintenance Log", asset_maintenance_log)
 		maintenance_log.assign_to_name = task.assign_to_name
 		maintenance_log.has_certificate = task.certificate_required
 		maintenance_log.description = task.description
@@ -105,15 +131,22 @@
 		maintenance_log.due_date = task.next_due_date
 		maintenance_log.save()
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_team_members(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.get_values('Maintenance Team Member', { 'parent': filters.get("maintenance_team") }, "team_member")
+	return frappe.db.get_values(
+		"Maintenance Team Member", {"parent": filters.get("maintenance_team")}, "team_member"
+	)
+
 
 @frappe.whitelist()
 def get_maintenance_log(asset_name):
-    return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
         select maintenance_status, count(asset_name) as count, asset_name
         from `tabAsset Maintenance Log`
         where asset_name=%s group by maintenance_status""",
-        (asset_name), as_dict=1)
+		(asset_name),
+		as_dict=1,
+	)
diff --git a/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py
index 8acb61b..e40a551 100644
--- a/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py
+++ b/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py
@@ -17,11 +17,12 @@
 		create_maintenance_team()
 
 	def test_create_asset_maintenance(self):
-		pr = make_purchase_receipt(item_code="Photocopier",
-			qty=1, rate=100000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Photocopier", qty=1, rate=100000.0, location="Test Location"
+		)
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset_doc = frappe.get_doc("Asset", asset_name)
 		month_end_date = get_last_day(nowdate())
 
 		purchase_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
@@ -30,66 +31,74 @@
 		asset_doc.purchase_date = purchase_date
 
 		asset_doc.calculate_depreciation = 1
-		asset_doc.append("finance_books", {
-			"expected_value_after_useful_life": 200,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10,
-			"depreciation_start_date": month_end_date
-		})
+		asset_doc.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 200,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+				"depreciation_start_date": month_end_date,
+			},
+		)
 
 		asset_doc.save()
 
 		if not frappe.db.exists("Asset Maintenance", "Photocopier"):
-			asset_maintenance =	frappe.get_doc({
+			asset_maintenance = frappe.get_doc(
+				{
 					"doctype": "Asset Maintenance",
 					"asset_name": "Photocopier",
 					"maintenance_team": "Team Awesome",
 					"company": "_Test Company",
-					"asset_maintenance_tasks": get_maintenance_tasks()
-				}).insert()
+					"asset_maintenance_tasks": get_maintenance_tasks(),
+				}
+			).insert()
 
 			next_due_date = calculate_next_due_date(nowdate(), "Monthly")
 			self.assertEqual(asset_maintenance.asset_maintenance_tasks[0].next_due_date, next_due_date)
 
 	def test_create_asset_maintenance_log(self):
 		if not frappe.db.exists("Asset Maintenance Log", "Photocopier"):
-			asset_maintenance_log =	frappe.get_doc({
+			asset_maintenance_log = frappe.get_doc(
+				{
 					"doctype": "Asset Maintenance Log",
 					"asset_maintenance": "Photocopier",
 					"task": "Change Oil",
 					"completion_date": add_days(nowdate(), 2),
-					"maintenance_status": "Completed"
-				}).insert()
+					"maintenance_status": "Completed",
+				}
+			).insert()
 		asset_maintenance = frappe.get_doc("Asset Maintenance", "Photocopier")
 		next_due_date = calculate_next_due_date(asset_maintenance_log.completion_date, "Monthly")
 		self.assertEqual(asset_maintenance.asset_maintenance_tasks[0].next_due_date, next_due_date)
 
+
 def create_asset_data():
 	if not frappe.db.exists("Asset Category", "Equipment"):
 		create_asset_category()
 
 	if not frappe.db.exists("Location", "Test Location"):
-		frappe.get_doc({
-			'doctype': 'Location',
-			'location_name': 'Test Location'
-		}).insert()
+		frappe.get_doc({"doctype": "Location", "location_name": "Test Location"}).insert()
 
 	if not frappe.db.exists("Item", "Photocopier"):
-		meta = frappe.get_meta('Asset')
+		meta = frappe.get_meta("Asset")
 		naming_series = meta.get_field("naming_series").options
-		frappe.get_doc({
-			"doctype": "Item",
-			"item_code": "Photocopier",
-			"item_name": "Photocopier",
-			"item_group": "All Item Groups",
-			"company": "_Test Company",
-			"is_fixed_asset": 1,
-			"is_stock_item": 0,
-			"asset_category": "Equipment",
-			"auto_create_assets": 1,
-			"asset_naming_series": naming_series
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": "Photocopier",
+				"item_name": "Photocopier",
+				"item_group": "All Item Groups",
+				"company": "_Test Company",
+				"is_fixed_asset": 1,
+				"is_stock_item": 0,
+				"asset_category": "Equipment",
+				"auto_create_assets": 1,
+				"asset_naming_series": naming_series,
+			}
+		).insert()
+
 
 def create_maintenance_team():
 	user_list = ["marcus@abc.com", "thalia@abc.com", "mathias@abc.com"]
@@ -97,60 +106,73 @@
 		frappe.get_doc({"doctype": "Role", "role_name": "Technician"}).insert()
 	for user in user_list:
 		if not frappe.db.get_value("User", user):
-			frappe.get_doc({
-				"doctype": "User",
-				"email": user,
-				"first_name": user,
-				"new_password": "password",
-				"roles": [{"doctype": "Has Role", "role": "Technician"}]
-			}).insert()
+			frappe.get_doc(
+				{
+					"doctype": "User",
+					"email": user,
+					"first_name": user,
+					"new_password": "password",
+					"roles": [{"doctype": "Has Role", "role": "Technician"}],
+				}
+			).insert()
 
 	if not frappe.db.exists("Asset Maintenance Team", "Team Awesome"):
-		frappe.get_doc({
-			"doctype": "Asset Maintenance Team",
-			"maintenance_manager": "marcus@abc.com",
-			"maintenance_team_name": "Team Awesome",
-			"company": "_Test Company",
-			"maintenance_team_members": get_maintenance_team(user_list)
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Asset Maintenance Team",
+				"maintenance_manager": "marcus@abc.com",
+				"maintenance_team_name": "Team Awesome",
+				"company": "_Test Company",
+				"maintenance_team_members": get_maintenance_team(user_list),
+			}
+		).insert()
+
 
 def get_maintenance_team(user_list):
-	return [{"team_member": user,
-			"full_name": user,
-			"maintenance_role": "Technician"
-			}
-		for user in user_list[1:]]
+	return [
+		{"team_member": user, "full_name": user, "maintenance_role": "Technician"}
+		for user in user_list[1:]
+	]
+
 
 def get_maintenance_tasks():
-	return [{"maintenance_task": "Change Oil",
+	return [
+		{
+			"maintenance_task": "Change Oil",
 			"start_date": nowdate(),
 			"periodicity": "Monthly",
 			"maintenance_type": "Preventive Maintenance",
 			"maintenance_status": "Planned",
-			"assign_to": "marcus@abc.com"
-			},
-			{"maintenance_task": "Check Gears",
+			"assign_to": "marcus@abc.com",
+		},
+		{
+			"maintenance_task": "Check Gears",
 			"start_date": nowdate(),
 			"periodicity": "Yearly",
 			"maintenance_type": "Calibration",
 			"maintenance_status": "Planned",
-			"assign_to": "thalia@abc.com"
-			}
-		]
+			"assign_to": "thalia@abc.com",
+		},
+	]
+
 
 def create_asset_category():
 	asset_category = frappe.new_doc("Asset Category")
 	asset_category.asset_category_name = "Equipment"
 	asset_category.total_number_of_depreciations = 3
 	asset_category.frequency_of_depreciation = 3
-	asset_category.append("accounts", {
-		"company_name": "_Test Company",
-		"fixed_asset_account": "_Test Fixed Asset - _TC",
-		"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
-		"depreciation_expense_account": "_Test Depreciations - _TC"
-	})
+	asset_category.append(
+		"accounts",
+		{
+			"company_name": "_Test Company",
+			"fixed_asset_account": "_Test Fixed Asset - _TC",
+			"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
+			"depreciation_expense_account": "_Test Depreciations - _TC",
+		},
+	)
 	asset_category.insert()
 
+
 def set_depreciation_settings_in_company():
 	company = frappe.get_doc("Company", "_Test Company")
 	company.accumulated_depreciation_account = "_Test Accumulated Depreciations - _TC"
diff --git a/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py b/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py
index 7d3453f..ff791b2 100644
--- a/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py
+++ b/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py
@@ -12,7 +12,10 @@
 
 class AssetMaintenanceLog(Document):
 	def validate(self):
-		if getdate(self.due_date) < getdate(nowdate()) and self.maintenance_status not in ["Completed", "Cancelled"]:
+		if getdate(self.due_date) < getdate(nowdate()) and self.maintenance_status not in [
+			"Completed",
+			"Cancelled",
+		]:
 			self.maintenance_status = "Overdue"
 
 		if self.maintenance_status == "Completed" and not self.completion_date:
@@ -22,15 +25,17 @@
 			frappe.throw(_("Please select Maintenance Status as Completed or remove Completion Date"))
 
 	def on_submit(self):
-		if self.maintenance_status not in ['Completed', 'Cancelled']:
+		if self.maintenance_status not in ["Completed", "Cancelled"]:
 			frappe.throw(_("Maintenance Status has to be Cancelled or Completed to Submit"))
 		self.update_maintenance_task()
 
 	def update_maintenance_task(self):
-		asset_maintenance_doc = frappe.get_doc('Asset Maintenance Task', self.task)
+		asset_maintenance_doc = frappe.get_doc("Asset Maintenance Task", self.task)
 		if self.maintenance_status == "Completed":
 			if asset_maintenance_doc.last_completion_date != self.completion_date:
-				next_due_date = calculate_next_due_date(periodicity = self.periodicity, last_completion_date = self.completion_date)
+				next_due_date = calculate_next_due_date(
+					periodicity=self.periodicity, last_completion_date=self.completion_date
+				)
 				asset_maintenance_doc.last_completion_date = self.completion_date
 				asset_maintenance_doc.next_due_date = next_due_date
 				asset_maintenance_doc.maintenance_status = "Planned"
@@ -38,11 +43,14 @@
 		if self.maintenance_status == "Cancelled":
 			asset_maintenance_doc.maintenance_status = "Cancelled"
 			asset_maintenance_doc.save()
-		asset_maintenance_doc = frappe.get_doc('Asset Maintenance', self.asset_maintenance)
+		asset_maintenance_doc = frappe.get_doc("Asset Maintenance", self.asset_maintenance)
 		asset_maintenance_doc.save()
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_maintenance_tasks(doctype, txt, searchfield, start, page_len, filters):
-	asset_maintenance_tasks = frappe.db.get_values('Asset Maintenance Task', {'parent':filters.get("asset_maintenance")}, 'maintenance_task')
+	asset_maintenance_tasks = frappe.db.get_values(
+		"Asset Maintenance Task", {"parent": filters.get("asset_maintenance")}, "maintenance_task"
+	)
 	return asset_maintenance_tasks
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.py b/erpnext/assets/doctype/asset_movement/asset_movement.py
index 07bea61..e61efad 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.py
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.py
@@ -16,7 +16,7 @@
 	def validate_asset(self):
 		for d in self.assets:
 			status, company = frappe.db.get_value("Asset", d.asset, ["status", "company"])
-			if self.purpose == 'Transfer' and status in ("Draft", "Scrapped", "Sold"):
+			if self.purpose == "Transfer" and status in ("Draft", "Scrapped", "Sold"):
 				frappe.throw(_("{0} asset cannot be transferred").format(status))
 
 			if company != self.company:
@@ -27,7 +27,7 @@
 
 	def validate_location(self):
 		for d in self.assets:
-			if self.purpose in ['Transfer', 'Issue']:
+			if self.purpose in ["Transfer", "Issue"]:
 				if not d.source_location:
 					d.source_location = frappe.db.get_value("Asset", d.asset, "location")
 
@@ -38,52 +38,76 @@
 					current_location = frappe.db.get_value("Asset", d.asset, "location")
 
 					if current_location != d.source_location:
-						frappe.throw(_("Asset {0} does not belongs to the location {1}").
-							format(d.asset, d.source_location))
+						frappe.throw(
+							_("Asset {0} does not belongs to the location {1}").format(d.asset, d.source_location)
+						)
 
-			if self.purpose == 'Issue':
+			if self.purpose == "Issue":
 				if d.target_location:
-					frappe.throw(_("Issuing cannot be done to a location. \
-						Please enter employee who has issued Asset {0}").format(d.asset), title="Incorrect Movement Purpose")
+					frappe.throw(
+						_(
+							"Issuing cannot be done to a location. \
+						Please enter employee who has issued Asset {0}"
+						).format(d.asset),
+						title="Incorrect Movement Purpose",
+					)
 				if not d.to_employee:
 					frappe.throw(_("Employee is required while issuing Asset {0}").format(d.asset))
 
-			if self.purpose == 'Transfer':
+			if self.purpose == "Transfer":
 				if d.to_employee:
-					frappe.throw(_("Transferring cannot be done to an Employee. \
-						Please enter location where Asset {0} has to be transferred").format(
-							d.asset), title="Incorrect Movement Purpose")
+					frappe.throw(
+						_(
+							"Transferring cannot be done to an Employee. \
+						Please enter location where Asset {0} has to be transferred"
+						).format(d.asset),
+						title="Incorrect Movement Purpose",
+					)
 				if not d.target_location:
 					frappe.throw(_("Target Location is required while transferring Asset {0}").format(d.asset))
 				if d.source_location == d.target_location:
 					frappe.throw(_("Source and Target Location cannot be same"))
 
-			if self.purpose == 'Receipt':
+			if self.purpose == "Receipt":
 				# only when asset is bought and first entry is made
 				if not d.source_location and not (d.target_location or d.to_employee):
-					frappe.throw(_("Target Location or To Employee is required while receiving Asset {0}").format(d.asset))
+					frappe.throw(
+						_("Target Location or To Employee is required while receiving Asset {0}").format(d.asset)
+					)
 				elif d.source_location:
 					# when asset is received from an employee
 					if d.target_location and not d.from_employee:
-						frappe.throw(_("From employee is required while receiving Asset {0} to a target location").format(d.asset))
+						frappe.throw(
+							_("From employee is required while receiving Asset {0} to a target location").format(
+								d.asset
+							)
+						)
 					if d.from_employee and not d.target_location:
-						frappe.throw(_("Target Location is required while receiving Asset {0} from an employee").format(d.asset))
+						frappe.throw(
+							_("Target Location is required while receiving Asset {0} from an employee").format(d.asset)
+						)
 					if d.to_employee and d.target_location:
-						frappe.throw(_("Asset {0} cannot be received at a location and \
-							given to employee in a single movement").format(d.asset))
+						frappe.throw(
+							_(
+								"Asset {0} cannot be received at a location and \
+							given to employee in a single movement"
+							).format(d.asset)
+						)
 
 	def validate_employee(self):
 		for d in self.assets:
 			if d.from_employee:
-					current_custodian = frappe.db.get_value("Asset", d.asset, "custodian")
+				current_custodian = frappe.db.get_value("Asset", d.asset, "custodian")
 
-					if current_custodian != d.from_employee:
-						frappe.throw(_("Asset {0} does not belongs to the custodian {1}").
-							format(d.asset, d.from_employee))
+				if current_custodian != d.from_employee:
+					frappe.throw(
+						_("Asset {0} does not belongs to the custodian {1}").format(d.asset, d.from_employee)
+					)
 
 			if d.to_employee and frappe.db.get_value("Employee", d.to_employee, "company") != self.company:
-				frappe.throw(_("Employee {0} does not belongs to the company {1}").
-							format(d.to_employee, self.company))
+				frappe.throw(
+					_("Employee {0} does not belongs to the company {1}").format(d.to_employee, self.company)
+				)
 
 	def on_submit(self):
 		self.set_latest_location_in_asset()
@@ -92,14 +116,11 @@
 		self.set_latest_location_in_asset()
 
 	def set_latest_location_in_asset(self):
-		current_location, current_employee = '', ''
+		current_location, current_employee = "", ""
 		cond = "1=1"
 
 		for d in self.assets:
-			args = {
-				'asset': d.asset,
-				'company': self.company
-			}
+			args = {"asset": d.asset, "company": self.company}
 
 			# latest entry corresponds to current document's location, employee when transaction date > previous dates
 			# In case of cancellation it corresponds to previous latest document's location, employee
@@ -114,10 +135,14 @@
 					asm.docstatus=1 and {0}
 				ORDER BY
 					asm.transaction_date desc limit 1
-				""".format(cond), args)
+				""".format(
+					cond
+				),
+				args,
+			)
 			if latest_movement_entry:
 				current_location = latest_movement_entry[0][0]
 				current_employee = latest_movement_entry[0][1]
 
-			frappe.db.set_value('Asset', d.asset, 'location', current_location)
-			frappe.db.set_value('Asset', d.asset, 'custodian', current_employee)
+			frappe.db.set_value("Asset", d.asset, "location", current_location)
+			frappe.db.set_value("Asset", d.asset, "custodian", current_employee)
diff --git a/erpnext/assets/doctype/asset_movement/test_asset_movement.py b/erpnext/assets/doctype/asset_movement/test_asset_movement.py
index 025facc..a5fe52c 100644
--- a/erpnext/assets/doctype/asset_movement/test_asset_movement.py
+++ b/erpnext/assets/doctype/asset_movement/test_asset_movement.py
@@ -13,95 +13,122 @@
 
 class TestAssetMovement(unittest.TestCase):
 	def setUp(self):
-		frappe.db.set_value("Company", "_Test Company", "capital_work_in_progress_account", "CWIP Account - _TC")
+		frappe.db.set_value(
+			"Company", "_Test Company", "capital_work_in_progress_account", "CWIP Account - _TC"
+		)
 		create_asset_data()
 		make_location()
 
 	def test_movement(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=100000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"
+		)
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset = frappe.get_doc("Asset", asset_name)
 		asset.calculate_depreciation = 1
-		asset.available_for_use_date = '2020-06-06'
-		asset.purchase_date = '2020-06-06'
-		asset.append("finance_books", {
-			"expected_value_after_useful_life": 10000,
-			"next_depreciation_date": "2020-12-31",
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10
-		})
+		asset.available_for_use_date = "2020-06-06"
+		asset.purchase_date = "2020-06-06"
+		asset.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 10000,
+				"next_depreciation_date": "2020-12-31",
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+			},
+		)
 
 		if asset.docstatus == 0:
 			asset.submit()
 
 		# check asset movement is created
 		if not frappe.db.exists("Location", "Test Location 2"):
-			frappe.get_doc({
-				'doctype': 'Location',
-				'location_name': 'Test Location 2'
-			}).insert()
+			frappe.get_doc({"doctype": "Location", "location_name": "Test Location 2"}).insert()
 
-		movement1 = create_asset_movement(purpose = 'Transfer', company = asset.company,
-			assets = [{ 'asset': asset.name , 'source_location': 'Test Location', 'target_location': 'Test Location 2'}],
-			reference_doctype = 'Purchase Receipt', reference_name = pr.name)
+		movement1 = create_asset_movement(
+			purpose="Transfer",
+			company=asset.company,
+			assets=[
+				{"asset": asset.name, "source_location": "Test Location", "target_location": "Test Location 2"}
+			],
+			reference_doctype="Purchase Receipt",
+			reference_name=pr.name,
+		)
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location 2")
 
-		create_asset_movement(purpose = 'Transfer', company = asset.company,
-			assets = [{ 'asset': asset.name , 'source_location': 'Test Location 2', 'target_location': 'Test Location'}],
-			reference_doctype = 'Purchase Receipt', reference_name = pr.name)
+		create_asset_movement(
+			purpose="Transfer",
+			company=asset.company,
+			assets=[
+				{"asset": asset.name, "source_location": "Test Location 2", "target_location": "Test Location"}
+			],
+			reference_doctype="Purchase Receipt",
+			reference_name=pr.name,
+		)
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location")
 
 		movement1.cancel()
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location")
 
 		employee = make_employee("testassetmovemp@example.com", company="_Test Company")
-		create_asset_movement(purpose = 'Issue', company = asset.company,
-			assets = [{ 'asset': asset.name , 'source_location': 'Test Location', 'to_employee': employee}],
-			reference_doctype = 'Purchase Receipt', reference_name = pr.name)
+		create_asset_movement(
+			purpose="Issue",
+			company=asset.company,
+			assets=[{"asset": asset.name, "source_location": "Test Location", "to_employee": employee}],
+			reference_doctype="Purchase Receipt",
+			reference_name=pr.name,
+		)
 
 		# after issuing asset should belong to an employee not at a location
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), None)
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "custodian"), employee)
 
 	def test_last_movement_cancellation(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=100000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"
+		)
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset = frappe.get_doc("Asset", asset_name)
 		asset.calculate_depreciation = 1
-		asset.available_for_use_date = '2020-06-06'
-		asset.purchase_date = '2020-06-06'
-		asset.append("finance_books", {
-			"expected_value_after_useful_life": 10000,
-			"next_depreciation_date": "2020-12-31",
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10
-		})
+		asset.available_for_use_date = "2020-06-06"
+		asset.purchase_date = "2020-06-06"
+		asset.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 10000,
+				"next_depreciation_date": "2020-12-31",
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+			},
+		)
 		if asset.docstatus == 0:
 			asset.submit()
 
 		if not frappe.db.exists("Location", "Test Location 2"):
-			frappe.get_doc({
-				'doctype': 'Location',
-				'location_name': 'Test Location 2'
-			}).insert()
+			frappe.get_doc({"doctype": "Location", "location_name": "Test Location 2"}).insert()
 
-		movement = frappe.get_doc({'doctype': 'Asset Movement', 'reference_name': pr.name })
+		movement = frappe.get_doc({"doctype": "Asset Movement", "reference_name": pr.name})
 		self.assertRaises(frappe.ValidationError, movement.cancel)
 
-		movement1 = create_asset_movement(purpose = 'Transfer', company = asset.company,
-			assets = [{ 'asset': asset.name , 'source_location': 'Test Location', 'target_location': 'Test Location 2'}],
-			reference_doctype = 'Purchase Receipt', reference_name = pr.name)
+		movement1 = create_asset_movement(
+			purpose="Transfer",
+			company=asset.company,
+			assets=[
+				{"asset": asset.name, "source_location": "Test Location", "target_location": "Test Location 2"}
+			],
+			reference_doctype="Purchase Receipt",
+			reference_name=pr.name,
+		)
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location 2")
 
 		movement1.cancel()
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location")
 
+
 def create_asset_movement(**args):
 	args = frappe._dict(args)
 
@@ -109,24 +136,26 @@
 		args.transaction_date = now()
 
 	movement = frappe.new_doc("Asset Movement")
-	movement.update({
-		"assets": args.assets,
-		"transaction_date": args.transaction_date,
-		"company": args.company,
-		'purpose': args.purpose or 'Receipt',
-		'reference_doctype': args.reference_doctype,
-		'reference_name': args.reference_name
-	})
+	movement.update(
+		{
+			"assets": args.assets,
+			"transaction_date": args.transaction_date,
+			"company": args.company,
+			"purpose": args.purpose or "Receipt",
+			"reference_doctype": args.reference_doctype,
+			"reference_name": args.reference_name,
+		}
+	)
 
 	movement.insert()
 	movement.submit()
 
 	return movement
 
+
 def make_location():
-	for location in ['Pune', 'Mumbai', 'Nagpur']:
-		if not frappe.db.exists('Location', location):
-			frappe.get_doc({
-				'doctype': 'Location',
-				'location_name': location
-			}).insert(ignore_permissions = True)
+	for location in ["Pune", "Mumbai", "Nagpur"]:
+		if not frappe.db.exists("Location", location):
+			frappe.get_doc({"doctype": "Location", "location_name": location}).insert(
+				ignore_permissions=True
+			)
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index 36848e9..5bf6011 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -13,21 +13,21 @@
 
 class AssetRepair(AccountsController):
 	def validate(self):
-		self.asset_doc = frappe.get_doc('Asset', self.asset)
+		self.asset_doc = frappe.get_doc("Asset", self.asset)
 		self.update_status()
 
-		if self.get('stock_items'):
+		if self.get("stock_items"):
 			self.set_total_value()
 		self.calculate_total_repair_cost()
 
 	def update_status(self):
-		if self.repair_status == 'Pending':
-			frappe.db.set_value('Asset', self.asset, 'status', 'Out of Order')
+		if self.repair_status == "Pending":
+			frappe.db.set_value("Asset", self.asset, "status", "Out of Order")
 		else:
 			self.asset_doc.set_status()
 
 	def set_total_value(self):
-		for item in self.get('stock_items'):
+		for item in self.get("stock_items"):
 			item.total_value = flt(item.valuation_rate) * flt(item.consumed_quantity)
 
 	def calculate_total_repair_cost(self):
@@ -39,14 +39,17 @@
 	def before_submit(self):
 		self.check_repair_status()
 
-		if self.get('stock_consumption') or self.get('capitalize_repair_cost'):
+		if self.get("stock_consumption") or self.get("capitalize_repair_cost"):
 			self.increase_asset_value()
-		if self.get('stock_consumption'):
+		if self.get("stock_consumption"):
 			self.check_for_stock_items_and_warehouse()
 			self.decrease_stock_quantity()
-		if self.get('capitalize_repair_cost'):
+		if self.get("capitalize_repair_cost"):
 			self.make_gl_entries()
-			if frappe.db.get_value('Asset', self.asset, 'calculate_depreciation') and self.increase_in_asset_life:
+			if (
+				frappe.db.get_value("Asset", self.asset, "calculate_depreciation")
+				and self.increase_in_asset_life
+			):
 				self.modify_depreciation_schedule()
 
 		self.asset_doc.flags.ignore_validate_update_after_submit = True
@@ -54,16 +57,19 @@
 		self.asset_doc.save()
 
 	def before_cancel(self):
-		self.asset_doc = frappe.get_doc('Asset', self.asset)
+		self.asset_doc = frappe.get_doc("Asset", self.asset)
 
-		if self.get('stock_consumption') or self.get('capitalize_repair_cost'):
+		if self.get("stock_consumption") or self.get("capitalize_repair_cost"):
 			self.decrease_asset_value()
-		if self.get('stock_consumption'):
+		if self.get("stock_consumption"):
 			self.increase_stock_quantity()
-		if self.get('capitalize_repair_cost'):
-			self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		if self.get("capitalize_repair_cost"):
+			self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 			self.make_gl_entries(cancel=True)
-			if frappe.db.get_value('Asset', self.asset, 'calculate_depreciation') and self.increase_in_asset_life:
+			if (
+				frappe.db.get_value("Asset", self.asset, "calculate_depreciation")
+				and self.increase_in_asset_life
+			):
 				self.revert_depreciation_schedule_on_cancellation()
 
 		self.asset_doc.flags.ignore_validate_update_after_submit = True
@@ -75,10 +81,15 @@
 			frappe.throw(_("Please update Repair Status."))
 
 	def check_for_stock_items_and_warehouse(self):
-		if not self.get('stock_items'):
-			frappe.throw(_("Please enter Stock Items consumed during the Repair."), title=_("Missing Items"))
+		if not self.get("stock_items"):
+			frappe.throw(
+				_("Please enter Stock Items consumed during the Repair."), title=_("Missing Items")
+			)
 		if not self.warehouse:
-			frappe.throw(_("Please enter Warehouse from which Stock Items consumed during the Repair were taken."), title=_("Missing Warehouse"))
+			frappe.throw(
+				_("Please enter Warehouse from which Stock Items consumed during the Repair were taken."),
+				title=_("Missing Warehouse"),
+			)
 
 	def increase_asset_value(self):
 		total_value_of_stock_consumed = self.get_total_value_of_stock_consumed()
@@ -102,35 +113,36 @@
 
 	def get_total_value_of_stock_consumed(self):
 		total_value_of_stock_consumed = 0
-		if self.get('stock_consumption'):
-			for item in self.get('stock_items'):
+		if self.get("stock_consumption"):
+			for item in self.get("stock_items"):
 				total_value_of_stock_consumed += item.total_value
 
 		return total_value_of_stock_consumed
 
 	def decrease_stock_quantity(self):
-		stock_entry = frappe.get_doc({
-			"doctype": "Stock Entry",
-			"stock_entry_type": "Material Issue",
-			"company": self.company
-		})
+		stock_entry = frappe.get_doc(
+			{"doctype": "Stock Entry", "stock_entry_type": "Material Issue", "company": self.company}
+		)
 
-		for stock_item in self.get('stock_items'):
-			stock_entry.append('items', {
-				"s_warehouse": self.warehouse,
-				"item_code": stock_item.item_code,
-				"qty": stock_item.consumed_quantity,
-				"basic_rate": stock_item.valuation_rate,
-				"serial_no": stock_item.serial_no
-			})
+		for stock_item in self.get("stock_items"):
+			stock_entry.append(
+				"items",
+				{
+					"s_warehouse": self.warehouse,
+					"item_code": stock_item.item_code,
+					"qty": stock_item.consumed_quantity,
+					"basic_rate": stock_item.valuation_rate,
+					"serial_no": stock_item.serial_no,
+				},
+			)
 
 		stock_entry.insert()
 		stock_entry.submit()
 
-		self.db_set('stock_entry', stock_entry.name)
+		self.db_set("stock_entry", stock_entry.name)
 
 	def increase_stock_quantity(self):
-		stock_entry = frappe.get_doc('Stock Entry', self.stock_entry)
+		stock_entry = frappe.get_doc("Stock Entry", self.stock_entry)
 		stock_entry.flags.ignore_links = True
 		stock_entry.cancel()
 
@@ -141,63 +153,78 @@
 
 	def get_gl_entries(self):
 		gl_entries = []
-		repair_and_maintenance_account = frappe.db.get_value('Company', self.company, 'repair_and_maintenance_account')
-		fixed_asset_account = get_asset_account("fixed_asset_account", asset=self.asset, company=self.company)
-		expense_account = frappe.get_doc('Purchase Invoice', self.purchase_invoice).items[0].expense_account
-
-		gl_entries.append(
-			self.get_gl_dict({
-				"account": expense_account,
-				"credit": self.repair_cost,
-				"credit_in_account_currency": self.repair_cost,
-				"against": repair_and_maintenance_account,
-				"voucher_type": self.doctype,
-				"voucher_no": self.name,
-				"cost_center": self.cost_center,
-				"posting_date": getdate(),
-				"company": self.company
-			}, item=self)
+		repair_and_maintenance_account = frappe.db.get_value(
+			"Company", self.company, "repair_and_maintenance_account"
+		)
+		fixed_asset_account = get_asset_account(
+			"fixed_asset_account", asset=self.asset, company=self.company
+		)
+		expense_account = (
+			frappe.get_doc("Purchase Invoice", self.purchase_invoice).items[0].expense_account
 		)
 
-		if self.get('stock_consumption'):
+		gl_entries.append(
+			self.get_gl_dict(
+				{
+					"account": expense_account,
+					"credit": self.repair_cost,
+					"credit_in_account_currency": self.repair_cost,
+					"against": repair_and_maintenance_account,
+					"voucher_type": self.doctype,
+					"voucher_no": self.name,
+					"cost_center": self.cost_center,
+					"posting_date": getdate(),
+					"company": self.company,
+				},
+				item=self,
+			)
+		)
+
+		if self.get("stock_consumption"):
 			# creating GL Entries for each row in Stock Items based on the Stock Entry created for it
-			stock_entry = frappe.get_doc('Stock Entry', self.stock_entry)
+			stock_entry = frappe.get_doc("Stock Entry", self.stock_entry)
 			for item in stock_entry.items:
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": item.expense_account,
-						"credit": item.amount,
-						"credit_in_account_currency": item.amount,
-						"against": repair_and_maintenance_account,
-						"voucher_type": self.doctype,
-						"voucher_no": self.name,
-						"cost_center": self.cost_center,
-						"posting_date": getdate(),
-						"company": self.company
-					}, item=self)
+					self.get_gl_dict(
+						{
+							"account": item.expense_account,
+							"credit": item.amount,
+							"credit_in_account_currency": item.amount,
+							"against": repair_and_maintenance_account,
+							"voucher_type": self.doctype,
+							"voucher_no": self.name,
+							"cost_center": self.cost_center,
+							"posting_date": getdate(),
+							"company": self.company,
+						},
+						item=self,
+					)
 				)
 
 		gl_entries.append(
-			self.get_gl_dict({
-				"account": fixed_asset_account,
-				"debit": self.total_repair_cost,
-				"debit_in_account_currency": self.total_repair_cost,
-				"against": expense_account,
-				"voucher_type": self.doctype,
-				"voucher_no": self.name,
-				"cost_center": self.cost_center,
-				"posting_date": getdate(),
-				"against_voucher_type": "Purchase Invoice",
-				"against_voucher": self.purchase_invoice,
-				"company": self.company
-			}, item=self)
+			self.get_gl_dict(
+				{
+					"account": fixed_asset_account,
+					"debit": self.total_repair_cost,
+					"debit_in_account_currency": self.total_repair_cost,
+					"against": expense_account,
+					"voucher_type": self.doctype,
+					"voucher_no": self.name,
+					"cost_center": self.cost_center,
+					"posting_date": getdate(),
+					"against_voucher_type": "Purchase Invoice",
+					"against_voucher": self.purchase_invoice,
+					"company": self.company,
+				},
+				item=self,
+			)
 		)
 
 		return gl_entries
 
 	def modify_depreciation_schedule(self):
 		for row in self.asset_doc.finance_books:
-			row.total_number_of_depreciations += self.increase_in_asset_life/row.frequency_of_depreciation
+			row.total_number_of_depreciations += self.increase_in_asset_life / row.frequency_of_depreciation
 
 			self.asset_doc.flags.increase_in_asset_life = False
 			extra_months = self.increase_in_asset_life % row.frequency_of_depreciation
@@ -207,26 +234,29 @@
 	# to help modify depreciation schedule when increase_in_asset_life is not a multiple of frequency_of_depreciation
 	def calculate_last_schedule_date(self, asset, row, extra_months):
 		asset.flags.increase_in_asset_life = True
-		number_of_pending_depreciations = cint(row.total_number_of_depreciations) - \
-			cint(asset.number_of_depreciations_booked)
+		number_of_pending_depreciations = cint(row.total_number_of_depreciations) - cint(
+			asset.number_of_depreciations_booked
+		)
 
 		# the Schedule Date in the final row of the old Depreciation Schedule
-		last_schedule_date = asset.schedules[len(asset.schedules)-1].schedule_date
+		last_schedule_date = asset.schedules[len(asset.schedules) - 1].schedule_date
 
 		# the Schedule Date in the final row of the new Depreciation Schedule
 		asset.to_date = add_months(last_schedule_date, extra_months)
 
 		# the latest possible date at which the depreciation can occur, without increasing the Total Number of Depreciations
 		# if depreciations happen yearly and the Depreciation Posting Date is 01-01-2020, this could be 01-01-2021, 01-01-2022...
-		schedule_date = add_months(row.depreciation_start_date,
-			number_of_pending_depreciations * cint(row.frequency_of_depreciation))
+		schedule_date = add_months(
+			row.depreciation_start_date,
+			number_of_pending_depreciations * cint(row.frequency_of_depreciation),
+		)
 
 		if asset.to_date > schedule_date:
 			row.total_number_of_depreciations += 1
 
 	def revert_depreciation_schedule_on_cancellation(self):
 		for row in self.asset_doc.finance_books:
-			row.total_number_of_depreciations -= self.increase_in_asset_life/row.frequency_of_depreciation
+			row.total_number_of_depreciations -= self.increase_in_asset_life / row.frequency_of_depreciation
 
 			self.asset_doc.flags.increase_in_asset_life = False
 			extra_months = self.increase_in_asset_life % row.frequency_of_depreciation
@@ -235,23 +265,27 @@
 
 	def calculate_last_schedule_date_before_modification(self, asset, row, extra_months):
 		asset.flags.increase_in_asset_life = True
-		number_of_pending_depreciations = cint(row.total_number_of_depreciations) - \
-			cint(asset.number_of_depreciations_booked)
+		number_of_pending_depreciations = cint(row.total_number_of_depreciations) - cint(
+			asset.number_of_depreciations_booked
+		)
 
 		# the Schedule Date in the final row of the modified Depreciation Schedule
-		last_schedule_date = asset.schedules[len(asset.schedules)-1].schedule_date
+		last_schedule_date = asset.schedules[len(asset.schedules) - 1].schedule_date
 
 		# the Schedule Date in the final row of the original Depreciation Schedule
 		asset.to_date = add_months(last_schedule_date, -extra_months)
 
 		# the latest possible date at which the depreciation can occur, without decreasing the Total Number of Depreciations
 		# if depreciations happen yearly and the Depreciation Posting Date is 01-01-2020, this could be 01-01-2021, 01-01-2022...
-		schedule_date = add_months(row.depreciation_start_date,
-			(number_of_pending_depreciations - 1) * cint(row.frequency_of_depreciation))
+		schedule_date = add_months(
+			row.depreciation_start_date,
+			(number_of_pending_depreciations - 1) * cint(row.frequency_of_depreciation),
+		)
 
 		if asset.to_date < schedule_date:
 			row.total_number_of_depreciations -= 1
 
+
 @frappe.whitelist()
 def get_downtime(failure_date, completion_date):
 	downtime = time_diff_in_hours(completion_date, failure_date)
diff --git a/erpnext/assets/doctype/asset_repair/test_asset_repair.py b/erpnext/assets/doctype/asset_repair/test_asset_repair.py
index 7c0d057..4e7cf78 100644
--- a/erpnext/assets/doctype/asset_repair/test_asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/test_asset_repair.py
@@ -25,7 +25,7 @@
 	def test_update_status(self):
 		asset = create_asset(submit=1)
 		initial_status = asset.status
-		asset_repair = create_asset_repair(asset = asset)
+		asset_repair = create_asset_repair(asset=asset)
 
 		if asset_repair.repair_status == "Pending":
 			asset.reload()
@@ -37,14 +37,14 @@
 		self.assertEqual(asset_status, initial_status)
 
 	def test_stock_item_total_value(self):
-		asset_repair = create_asset_repair(stock_consumption = 1)
+		asset_repair = create_asset_repair(stock_consumption=1)
 
 		for item in asset_repair.stock_items:
 			total_value = flt(item.valuation_rate) * flt(item.consumed_quantity)
 			self.assertEqual(item.total_value, total_value)
 
 	def test_total_repair_cost(self):
-		asset_repair = create_asset_repair(stock_consumption = 1)
+		asset_repair = create_asset_repair(stock_consumption=1)
 
 		total_repair_cost = asset_repair.repair_cost
 		self.assertEqual(total_repair_cost, asset_repair.repair_cost)
@@ -54,22 +54,22 @@
 		self.assertEqual(total_repair_cost, asset_repair.total_repair_cost)
 
 	def test_repair_status_after_submit(self):
-		asset_repair = create_asset_repair(submit = 1)
+		asset_repair = create_asset_repair(submit=1)
 		self.assertNotEqual(asset_repair.repair_status, "Pending")
 
 	def test_stock_items(self):
-		asset_repair = create_asset_repair(stock_consumption = 1)
+		asset_repair = create_asset_repair(stock_consumption=1)
 		self.assertTrue(asset_repair.stock_consumption)
 		self.assertTrue(asset_repair.stock_items)
 
 	def test_warehouse(self):
-		asset_repair = create_asset_repair(stock_consumption = 1)
+		asset_repair = create_asset_repair(stock_consumption=1)
 		self.assertTrue(asset_repair.stock_consumption)
 		self.assertTrue(asset_repair.warehouse)
 
 	def test_decrease_stock_quantity(self):
-		asset_repair = create_asset_repair(stock_consumption = 1, submit = 1)
-		stock_entry = frappe.get_last_doc('Stock Entry')
+		asset_repair = create_asset_repair(stock_consumption=1, submit=1)
+		stock_entry = frappe.get_last_doc("Stock Entry")
 
 		self.assertEqual(stock_entry.stock_entry_type, "Material Issue")
 		self.assertEqual(stock_entry.items[0].s_warehouse, asset_repair.warehouse)
@@ -85,58 +85,72 @@
 		serial_no = serial_nos.split("\n")[0]
 
 		# should not raise any error
-		create_asset_repair(stock_consumption = 1, item_code = stock_entry.get("items")[0].item_code,
-			warehouse = "_Test Warehouse - _TC", serial_no = serial_no, submit = 1)
+		create_asset_repair(
+			stock_consumption=1,
+			item_code=stock_entry.get("items")[0].item_code,
+			warehouse="_Test Warehouse - _TC",
+			serial_no=serial_no,
+			submit=1,
+		)
 
 		# should raise error
-		asset_repair = create_asset_repair(stock_consumption = 1, warehouse = "_Test Warehouse - _TC",
-			item_code = stock_entry.get("items")[0].item_code)
+		asset_repair = create_asset_repair(
+			stock_consumption=1,
+			warehouse="_Test Warehouse - _TC",
+			item_code=stock_entry.get("items")[0].item_code,
+		)
 
 		asset_repair.repair_status = "Completed"
 		self.assertRaises(SerialNoRequiredError, asset_repair.submit)
 
 	def test_increase_in_asset_value_due_to_stock_consumption(self):
-		asset = create_asset(calculate_depreciation = 1, submit=1)
+		asset = create_asset(calculate_depreciation=1, submit=1)
 		initial_asset_value = get_asset_value(asset)
-		asset_repair = create_asset_repair(asset= asset, stock_consumption = 1, submit = 1)
+		asset_repair = create_asset_repair(asset=asset, stock_consumption=1, submit=1)
 		asset.reload()
 
 		increase_in_asset_value = get_asset_value(asset) - initial_asset_value
 		self.assertEqual(asset_repair.stock_items[0].total_value, increase_in_asset_value)
 
 	def test_increase_in_asset_value_due_to_repair_cost_capitalisation(self):
-		asset = create_asset(calculate_depreciation = 1, submit=1)
+		asset = create_asset(calculate_depreciation=1, submit=1)
 		initial_asset_value = get_asset_value(asset)
-		asset_repair = create_asset_repair(asset= asset, capitalize_repair_cost = 1, submit = 1)
+		asset_repair = create_asset_repair(asset=asset, capitalize_repair_cost=1, submit=1)
 		asset.reload()
 
 		increase_in_asset_value = get_asset_value(asset) - initial_asset_value
 		self.assertEqual(asset_repair.repair_cost, increase_in_asset_value)
 
 	def test_purchase_invoice(self):
-		asset_repair = create_asset_repair(capitalize_repair_cost = 1, submit = 1)
+		asset_repair = create_asset_repair(capitalize_repair_cost=1, submit=1)
 		self.assertTrue(asset_repair.purchase_invoice)
 
 	def test_gl_entries(self):
-		asset_repair = create_asset_repair(capitalize_repair_cost = 1, submit = 1)
-		gl_entry = frappe.get_last_doc('GL Entry')
+		asset_repair = create_asset_repair(capitalize_repair_cost=1, submit=1)
+		gl_entry = frappe.get_last_doc("GL Entry")
 		self.assertEqual(asset_repair.name, gl_entry.voucher_no)
 
 	def test_increase_in_asset_life(self):
-		asset = create_asset(calculate_depreciation = 1, submit=1)
+		asset = create_asset(calculate_depreciation=1, submit=1)
 		initial_num_of_depreciations = num_of_depreciations(asset)
-		create_asset_repair(asset= asset, capitalize_repair_cost = 1, submit = 1)
+		create_asset_repair(asset=asset, capitalize_repair_cost=1, submit=1)
 		asset.reload()
 
 		self.assertEqual((initial_num_of_depreciations + 1), num_of_depreciations(asset))
-		self.assertEqual(asset.schedules[-1].accumulated_depreciation_amount, asset.finance_books[0].value_after_depreciation)
+		self.assertEqual(
+			asset.schedules[-1].accumulated_depreciation_amount,
+			asset.finance_books[0].value_after_depreciation,
+		)
+
 
 def get_asset_value(asset):
 	return asset.finance_books[0].value_after_depreciation
 
+
 def num_of_depreciations(asset):
 	return asset.finance_books[0].total_number_of_depreciations
 
+
 def create_asset_repair(**args):
 	from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
 	from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
@@ -146,26 +160,33 @@
 	if args.asset:
 		asset = args.asset
 	else:
-		asset = create_asset(is_existing_asset = 1, submit=1)
+		asset = create_asset(is_existing_asset=1, submit=1)
 	asset_repair = frappe.new_doc("Asset Repair")
-	asset_repair.update({
-		"asset": asset.name,
-		"asset_name": asset.asset_name,
-		"failure_date": nowdate(),
-		"description": "Test Description",
-		"repair_cost": 0,
-		"company": asset.company
-	})
+	asset_repair.update(
+		{
+			"asset": asset.name,
+			"asset_name": asset.asset_name,
+			"failure_date": nowdate(),
+			"description": "Test Description",
+			"repair_cost": 0,
+			"company": asset.company,
+		}
+	)
 
 	if args.stock_consumption:
 		asset_repair.stock_consumption = 1
-		asset_repair.warehouse = args.warehouse or create_warehouse("Test Warehouse", company = asset.company)
-		asset_repair.append("stock_items", {
-			"item_code": args.item_code or "_Test Stock Item",
-			"valuation_rate": args.rate if args.get("rate") is not None else 100,
-			"consumed_quantity": args.qty or 1,
-			"serial_no": args.serial_no
-		})
+		asset_repair.warehouse = args.warehouse or create_warehouse(
+			"Test Warehouse", company=asset.company
+		)
+		asset_repair.append(
+			"stock_items",
+			{
+				"item_code": args.item_code or "_Test Stock Item",
+				"valuation_rate": args.rate if args.get("rate") is not None else 100,
+				"consumed_quantity": args.qty or 1,
+				"serial_no": args.serial_no,
+			},
+		)
 
 	asset_repair.insert(ignore_if_duplicate=True)
 
@@ -174,16 +195,17 @@
 		asset_repair.cost_center = "_Test Cost Center - _TC"
 
 		if args.stock_consumption:
-			stock_entry = frappe.get_doc({
-				"doctype": "Stock Entry",
-				"stock_entry_type": "Material Receipt",
-				"company": asset.company
-			})
-			stock_entry.append('items', {
-				"t_warehouse": asset_repair.warehouse,
-				"item_code": asset_repair.stock_items[0].item_code,
-				"qty": asset_repair.stock_items[0].consumed_quantity
-			})
+			stock_entry = frappe.get_doc(
+				{"doctype": "Stock Entry", "stock_entry_type": "Material Receipt", "company": asset.company}
+			)
+			stock_entry.append(
+				"items",
+				{
+					"t_warehouse": asset_repair.warehouse,
+					"item_code": asset_repair.stock_items[0].item_code,
+					"qty": asset_repair.stock_items[0].consumed_quantity,
+				},
+			)
 			stock_entry.submit()
 
 		if args.capitalize_repair_cost:
diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
index 0b646ed..9953c61 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
+++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
@@ -31,10 +31,14 @@
 		self.reschedule_depreciations(self.current_asset_value)
 
 	def validate_date(self):
-		asset_purchase_date = frappe.db.get_value('Asset', self.asset, 'purchase_date')
+		asset_purchase_date = frappe.db.get_value("Asset", self.asset, "purchase_date")
 		if getdate(self.date) < getdate(asset_purchase_date):
-			frappe.throw(_("Asset Value Adjustment cannot be posted before Asset's purchase date <b>{0}</b>.")
-				.format(formatdate(asset_purchase_date)), title="Incorrect Date")
+			frappe.throw(
+				_("Asset Value Adjustment cannot be posted before Asset's purchase date <b>{0}</b>.").format(
+					formatdate(asset_purchase_date)
+				),
+				title="Incorrect Date",
+			)
 
 	def set_difference_amount(self):
 		self.difference_amount = flt(self.current_asset_value - self.new_asset_value)
@@ -45,11 +49,15 @@
 
 	def make_depreciation_entry(self):
 		asset = frappe.get_doc("Asset", self.asset)
-		fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account = \
-			get_depreciation_accounts(asset)
+		(
+			fixed_asset_account,
+			accumulated_depreciation_account,
+			depreciation_expense_account,
+		) = get_depreciation_accounts(asset)
 
-		depreciation_cost_center, depreciation_series = frappe.get_cached_value('Company',  asset.company,
-			["depreciation_cost_center", "series_for_depreciation_entry"])
+		depreciation_cost_center, depreciation_series = frappe.get_cached_value(
+			"Company", asset.company, ["depreciation_cost_center", "series_for_depreciation_entry"]
+		)
 
 		je = frappe.new_doc("Journal Entry")
 		je.voucher_type = "Depreciation Entry"
@@ -62,27 +70,33 @@
 		credit_entry = {
 			"account": accumulated_depreciation_account,
 			"credit_in_account_currency": self.difference_amount,
-			"cost_center": depreciation_cost_center or self.cost_center
+			"cost_center": depreciation_cost_center or self.cost_center,
 		}
 
 		debit_entry = {
 			"account": depreciation_expense_account,
 			"debit_in_account_currency": self.difference_amount,
-			"cost_center": depreciation_cost_center or self.cost_center
+			"cost_center": depreciation_cost_center or self.cost_center,
 		}
 
 		accounting_dimensions = get_checks_for_pl_and_bs_accounts()
 
 		for dimension in accounting_dimensions:
-			if dimension.get('mandatory_for_bs'):
-				credit_entry.update({
-					dimension['fieldname']: self.get(dimension['fieldname']) or dimension.get('default_dimension')
-				})
+			if dimension.get("mandatory_for_bs"):
+				credit_entry.update(
+					{
+						dimension["fieldname"]: self.get(dimension["fieldname"])
+						or dimension.get("default_dimension")
+					}
+				)
 
-			if dimension.get('mandatory_for_pl'):
-				debit_entry.update({
-					dimension['fieldname']: self.get(dimension['fieldname']) or dimension.get('default_dimension')
-				})
+			if dimension.get("mandatory_for_pl"):
+				debit_entry.update(
+					{
+						dimension["fieldname"]: self.get(dimension["fieldname"])
+						or dimension.get("default_dimension")
+					}
+				)
 
 		je.append("accounts", credit_entry)
 		je.append("accounts", debit_entry)
@@ -93,8 +107,8 @@
 		self.db_set("journal_entry", je.name)
 
 	def reschedule_depreciations(self, asset_value):
-		asset = frappe.get_doc('Asset', self.asset)
-		country = frappe.get_value('Company', self.company, 'country')
+		asset = frappe.get_doc("Asset", self.asset)
+		country = frappe.get_value("Company", self.company, "country")
 
 		for d in asset.finance_books:
 			d.value_after_depreciation = asset_value
@@ -105,8 +119,11 @@
 				rate_per_day = flt(d.value_after_depreciation) / flt(total_days)
 				from_date = self.date
 			else:
-				no_of_depreciations = len([s.name for s in asset.schedules
-					if (cint(s.finance_book_id) == d.idx and not s.journal_entry)])
+				no_of_depreciations = len(
+					[
+						s.name for s in asset.schedules if (cint(s.finance_book_id) == d.idx and not s.journal_entry)
+					]
+				)
 
 			value_after_depreciation = d.value_after_depreciation
 			for data in asset.schedules:
@@ -132,10 +149,11 @@
 			if not asset_data.journal_entry:
 				asset_data.db_update()
 
+
 @frappe.whitelist()
 def get_current_asset_value(asset, finance_book=None):
-	cond = {'parent': asset, 'parenttype': 'Asset'}
+	cond = {"parent": asset, "parenttype": "Asset"}
 	if finance_book:
-		cond.update({'finance_book': finance_book})
+		cond.update({"finance_book": finance_book})
 
-	return frappe.db.get_value('Asset Finance Book', cond, 'value_after_depreciation')
+	return frappe.db.get_value("Asset Finance Book", cond, "value_after_depreciation")
diff --git a/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py
index ef13c56..ebeb174 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py
+++ b/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py
@@ -18,11 +18,12 @@
 		create_asset_data()
 
 	def test_current_asset_value(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=100000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"
+		)
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset_doc = frappe.get_doc("Asset", asset_name)
 
 		month_end_date = get_last_day(nowdate())
 		purchase_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
@@ -30,24 +31,28 @@
 		asset_doc.available_for_use_date = purchase_date
 		asset_doc.purchase_date = purchase_date
 		asset_doc.calculate_depreciation = 1
-		asset_doc.append("finance_books", {
-			"expected_value_after_useful_life": 200,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10,
-			"depreciation_start_date": month_end_date
-		})
+		asset_doc.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 200,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+				"depreciation_start_date": month_end_date,
+			},
+		)
 		asset_doc.submit()
 
 		current_value = get_current_asset_value(asset_doc.name)
 		self.assertEqual(current_value, 100000.0)
 
 	def test_asset_depreciation_value_adjustment(self):
-		pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=100000.0, location="Test Location")
+		pr = make_purchase_receipt(
+			item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"
+		)
 
-		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
-		asset_doc = frappe.get_doc('Asset', asset_name)
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
+		asset_doc = frappe.get_doc("Asset", asset_name)
 		asset_doc.calculate_depreciation = 1
 
 		month_end_date = get_last_day(nowdate())
@@ -56,42 +61,52 @@
 		asset_doc.available_for_use_date = purchase_date
 		asset_doc.purchase_date = purchase_date
 		asset_doc.calculate_depreciation = 1
-		asset_doc.append("finance_books", {
-			"expected_value_after_useful_life": 200,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 10,
-			"depreciation_start_date": month_end_date
-		})
+		asset_doc.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 200,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 10,
+				"depreciation_start_date": month_end_date,
+			},
+		)
 		asset_doc.submit()
 
 		current_value = get_current_asset_value(asset_doc.name)
-		adj_doc = make_asset_value_adjustment(asset = asset_doc.name,
-			current_asset_value = current_value, new_asset_value = 50000.0)
+		adj_doc = make_asset_value_adjustment(
+			asset=asset_doc.name, current_asset_value=current_value, new_asset_value=50000.0
+		)
 		adj_doc.submit()
 
 		expected_gle = (
 			("_Test Accumulated Depreciations - _TC", 0.0, 50000.0),
-			("_Test Depreciations - _TC", 50000.0, 0.0)
+			("_Test Depreciations - _TC", 50000.0, 0.0),
 		)
 
-		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+		gle = frappe.db.sql(
+			"""select account, debit, credit from `tabGL Entry`
 			where voucher_type='Journal Entry' and voucher_no = %s
-			order by account""", adj_doc.journal_entry)
+			order by account""",
+			adj_doc.journal_entry,
+		)
 
 		self.assertEqual(gle, expected_gle)
 
+
 def make_asset_value_adjustment(**args):
 	args = frappe._dict(args)
 
-	doc = frappe.get_doc({
-		"doctype": "Asset Value Adjustment",
-		"company": args.company or "_Test Company",
-		"asset": args.asset,
-		"date": args.date or nowdate(),
-		"new_asset_value": args.new_asset_value,
-		"current_asset_value": args.current_asset_value,
-		"cost_center": args.cost_center or "Main - _TC"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Asset Value Adjustment",
+			"company": args.company or "_Test Company",
+			"asset": args.asset,
+			"date": args.date or nowdate(),
+			"new_asset_value": args.new_asset_value,
+			"current_asset_value": args.current_asset_value,
+			"cost_center": args.cost_center or "Main - _TC",
+		}
+	).insert()
 
 	return doc
diff --git a/erpnext/assets/doctype/location/location.py b/erpnext/assets/doctype/location/location.py
index abc7325..0d87bb2 100644
--- a/erpnext/assets/doctype/location/location.py
+++ b/erpnext/assets/doctype/location/location.py
@@ -13,12 +13,12 @@
 
 
 class Location(NestedSet):
-	nsm_parent_field = 'parent_location'
+	nsm_parent_field = "parent_location"
 
 	def validate(self):
 		self.calculate_location_area()
 
-		if not self.is_new() and self.get('parent_location'):
+		if not self.is_new() and self.get("parent_location"):
 			self.update_ancestor_location_features()
 
 	def on_update(self):
@@ -42,7 +42,7 @@
 		if not self.location:
 			return []
 
-		features = json.loads(self.location).get('features')
+		features = json.loads(self.location).get("features")
 
 		if not isinstance(features, list):
 			features = json.loads(features)
@@ -54,15 +54,15 @@
 			self.location = '{"type":"FeatureCollection","features":[]}'
 
 		location = json.loads(self.location)
-		location['features'] = features
+		location["features"] = features
 
-		self.db_set('location', json.dumps(location), commit=True)
+		self.db_set("location", json.dumps(location), commit=True)
 
 	def update_ancestor_location_features(self):
 		self_features = set(self.add_child_property())
 
 		for ancestor in self.get_ancestors():
-			ancestor_doc = frappe.get_doc('Location', ancestor)
+			ancestor_doc = frappe.get_doc("Location", ancestor)
 			child_features, ancestor_features = ancestor_doc.feature_seperator(child_feature=self.name)
 
 			ancestor_features = list(set(ancestor_features))
@@ -84,25 +84,27 @@
 				ancestor_features[index] = json.loads(feature)
 
 			ancestor_doc.set_location_features(features=ancestor_features)
-			ancestor_doc.db_set('area', ancestor_doc.area + self.area_difference, commit=True)
+			ancestor_doc.db_set("area", ancestor_doc.area + self.area_difference, commit=True)
 
 	def remove_ancestor_location_features(self):
 		for ancestor in self.get_ancestors():
-			ancestor_doc = frappe.get_doc('Location', ancestor)
+			ancestor_doc = frappe.get_doc("Location", ancestor)
 			child_features, ancestor_features = ancestor_doc.feature_seperator(child_feature=self.name)
 
 			for index, feature in enumerate(ancestor_features):
 				ancestor_features[index] = json.loads(feature)
 
 			ancestor_doc.set_location_features(features=ancestor_features)
-			ancestor_doc.db_set('area', ancestor_doc.area - self.area, commit=True)
+			ancestor_doc.db_set("area", ancestor_doc.area - self.area, commit=True)
 
 	def add_child_property(self):
 		features = self.get_location_features()
-		filter_features = [feature for feature in features if not feature.get('properties').get('child_feature')]
+		filter_features = [
+			feature for feature in features if not feature.get("properties").get("child_feature")
+		]
 
 		for index, feature in enumerate(filter_features):
-			feature['properties'].update({'child_feature': True, 'feature_of': self.location_name})
+			feature["properties"].update({"child_feature": True, "feature_of": self.location_name})
 			filter_features[index] = json.dumps(filter_features[index])
 
 		return filter_features
@@ -112,7 +114,7 @@
 		features = self.get_location_features()
 
 		for feature in features:
-			if feature.get('properties').get('feature_of') == child_feature:
+			if feature.get("properties").get("feature_of") == child_feature:
 				child_features.extend([json.dumps(feature)])
 			else:
 				non_child_features.extend([json.dumps(feature)])
@@ -126,22 +128,22 @@
 	Reference from https://github.com/scisco/area.
 
 	Args:
-		`features` (list of dict): Features marked on the map as
-			GeoJSON data
+	        `features` (list of dict): Features marked on the map as
+	                GeoJSON data
 
 	Returns:
-		float: The approximate signed geodesic area (in sq. meters)
+	        float: The approximate signed geodesic area (in sq. meters)
 	"""
 
 	layer_area = 0.0
 
 	for feature in features:
-		feature_type = feature.get('geometry', {}).get('type')
+		feature_type = feature.get("geometry", {}).get("type")
 
-		if feature_type == 'Polygon':
-			layer_area += _polygon_area(coords=feature.get('geometry').get('coordinates'))
-		elif feature_type == 'Point' and feature.get('properties').get('point_type') == 'circle':
-			layer_area += math.pi * math.pow(feature.get('properties').get('radius'), 2)
+		if feature_type == "Polygon":
+			layer_area += _polygon_area(coords=feature.get("geometry").get("coordinates"))
+		elif feature_type == "Point" and feature.get("properties").get("point_type") == "circle":
+			layer_area += math.pi * math.pow(feature.get("properties").get("radius"), 2)
 
 	return layer_area
 
@@ -192,7 +194,8 @@
 	if parent is None or parent == "All Locations":
 		parent = ""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			name as value,
 			is_group as expandable
@@ -201,17 +204,20 @@
 		where
 			ifnull(parent_location, "")={parent}
 		""".format(
-			doctype=doctype,
-			parent=frappe.db.escape(parent)
-		), as_dict=1)
+			doctype=doctype, parent=frappe.db.escape(parent)
+		),
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def add_node():
 	from frappe.desk.treeview import make_tree_args
+
 	args = frappe.form_dict
 	args = make_tree_args(**args)
 
-	if args.parent_location == 'All Locations':
+	if args.parent_location == "All Locations":
 		args.parent_location = None
 
 	frappe.get_doc(args).insert()
diff --git a/erpnext/assets/doctype/location/test_location.py b/erpnext/assets/doctype/location/test_location.py
index 36e1dd4..b8563cb 100644
--- a/erpnext/assets/doctype/location/test_location.py
+++ b/erpnext/assets/doctype/location/test_location.py
@@ -6,29 +6,34 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Location')
+test_records = frappe.get_test_records("Location")
+
 
 class TestLocation(unittest.TestCase):
 	def runTest(self):
-		locations = ['Basil Farm', 'Division 1', 'Field 1', 'Block 1']
+		locations = ["Basil Farm", "Division 1", "Field 1", "Block 1"]
 		area = 0
 		formatted_locations = []
 
 		for location in locations:
-			doc = frappe.get_doc('Location', location)
+			doc = frappe.get_doc("Location", location)
 			doc.save()
 			area += doc.area
 			temp = json.loads(doc.location)
-			temp['features'][0]['properties']['child_feature'] = True
-			temp['features'][0]['properties']['feature_of'] = location
-			formatted_locations.extend(temp['features'])
+			temp["features"][0]["properties"]["child_feature"] = True
+			temp["features"][0]["properties"]["feature_of"] = location
+			formatted_locations.extend(temp["features"])
 
-		test_location = frappe.get_doc('Location', 'Test Location Area')
+		test_location = frappe.get_doc("Location", "Test Location Area")
 		test_location.save()
 
-		test_location_features = json.loads(test_location.get('location'))['features']
-		ordered_test_location_features = sorted(test_location_features, key=lambda x: x['properties']['feature_of'])
-		ordered_formatted_locations = sorted(formatted_locations, key=lambda x: x['properties']['feature_of'])
+		test_location_features = json.loads(test_location.get("location"))["features"]
+		ordered_test_location_features = sorted(
+			test_location_features, key=lambda x: x["properties"]["feature_of"]
+		)
+		ordered_formatted_locations = sorted(
+			formatted_locations, key=lambda x: x["properties"]["feature_of"]
+		)
 
 		self.assertEqual(ordered_formatted_locations, ordered_test_location_features)
-		self.assertEqual(area, test_location.get('area'))
+		self.assertEqual(area, test_location.get("area"))
diff --git a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
index db51336..6b14dce 100644
--- a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
+++ b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
@@ -17,16 +17,21 @@
 	filters = frappe._dict(filters or {})
 	columns = get_columns(filters)
 	data = get_data(filters)
-	chart = prepare_chart_data(data, filters) if filters.get("group_by") not in ("Asset Category", "Location") else {}
+	chart = (
+		prepare_chart_data(data, filters)
+		if filters.get("group_by") not in ("Asset Category", "Location")
+		else {}
+	)
 
 	return columns, data, None, chart
 
+
 def get_conditions(filters):
-	conditions = { 'docstatus': 1 }
+	conditions = {"docstatus": 1}
 	status = filters.status
 	date_field = frappe.scrub(filters.date_based_on or "Purchase Date")
 
-	if filters.get('company'):
+	if filters.get("company"):
 		conditions["company"] = filters.company
 	if filters.filter_based_on == "Date Range":
 		conditions[date_field] = ["between", [filters.from_date, filters.to_date]]
@@ -37,23 +42,24 @@
 		filters.year_end_date = getdate(fiscal_year.year_end_date)
 
 		conditions[date_field] = ["between", [filters.year_start_date, filters.year_end_date]]
-	if filters.get('is_existing_asset'):
-		conditions["is_existing_asset"] = filters.get('is_existing_asset')
-	if filters.get('asset_category'):
-		conditions["asset_category"] = filters.get('asset_category')
-	if filters.get('cost_center'):
-		conditions["cost_center"] = filters.get('cost_center')
+	if filters.get("is_existing_asset"):
+		conditions["is_existing_asset"] = filters.get("is_existing_asset")
+	if filters.get("asset_category"):
+		conditions["asset_category"] = filters.get("asset_category")
+	if filters.get("cost_center"):
+		conditions["cost_center"] = filters.get("cost_center")
 
 	if status:
 		# In Store assets are those that are not sold or scrapped
-		operand = 'not in'
-		if status not in 'In Location':
-			operand = 'in'
+		operand = "not in"
+		if status not in "In Location":
+			operand = "in"
 
-		conditions['status'] = (operand, ['Sold', 'Scrapped'])
+		conditions["status"] = (operand, ["Sold", "Scrapped"])
 
 	return conditions
 
+
 def get_data(filters):
 
 	data = []
@@ -74,21 +80,37 @@
 		assets_record = frappe.db.get_all("Asset", filters=conditions, fields=fields, group_by=group_by)
 
 	else:
-		fields = ["name as asset_id", "asset_name", "status", "department", "cost_center", "purchase_receipt",
-			"asset_category", "purchase_date", "gross_purchase_amount", "location",
-			"available_for_use_date", "purchase_invoice", "opening_accumulated_depreciation"]
+		fields = [
+			"name as asset_id",
+			"asset_name",
+			"status",
+			"department",
+			"cost_center",
+			"purchase_receipt",
+			"asset_category",
+			"purchase_date",
+			"gross_purchase_amount",
+			"location",
+			"available_for_use_date",
+			"purchase_invoice",
+			"opening_accumulated_depreciation",
+		]
 		assets_record = frappe.db.get_all("Asset", filters=conditions, fields=fields)
 
 	for asset in assets_record:
-		asset_value = asset.gross_purchase_amount - flt(asset.opening_accumulated_depreciation) \
+		asset_value = (
+			asset.gross_purchase_amount
+			- flt(asset.opening_accumulated_depreciation)
 			- flt(depreciation_amount_map.get(asset.name))
+		)
 		row = {
 			"asset_id": asset.asset_id,
 			"asset_name": asset.asset_name,
 			"status": asset.status,
 			"department": asset.department,
 			"cost_center": asset.cost_center,
-			"vendor_name": pr_supplier_map.get(asset.purchase_receipt) or pi_supplier_map.get(asset.purchase_invoice),
+			"vendor_name": pr_supplier_map.get(asset.purchase_receipt)
+			or pi_supplier_map.get(asset.purchase_invoice),
 			"gross_purchase_amount": asset.gross_purchase_amount,
 			"opening_accumulated_depreciation": asset.opening_accumulated_depreciation,
 			"depreciated_amount": depreciation_amount_map.get(asset.asset_id) or 0.0,
@@ -96,21 +118,31 @@
 			"location": asset.location,
 			"asset_category": asset.asset_category,
 			"purchase_date": asset.purchase_date,
-			"asset_value": asset_value
+			"asset_value": asset_value,
 		}
 		data.append(row)
 
 	return data
 
+
 def prepare_chart_data(data, filters):
 	labels_values_map = {}
 	date_field = frappe.scrub(filters.date_based_on)
 
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
-		filters.from_date, filters.to_date, filters.filter_based_on, "Monthly", company=filters.company)
+	period_list = get_period_list(
+		filters.from_fiscal_year,
+		filters.to_fiscal_year,
+		filters.from_date,
+		filters.to_date,
+		filters.filter_based_on,
+		"Monthly",
+		company=filters.company,
+	)
 
 	for d in period_list:
-		labels_values_map.setdefault(d.get('label'), frappe._dict({'asset_value': 0, 'depreciated_amount': 0}))
+		labels_values_map.setdefault(
+			d.get("label"), frappe._dict({"asset_value": 0, "depreciated_amount": 0})
+		)
 
 	for d in data:
 		date = d.get(date_field)
@@ -120,23 +152,30 @@
 		labels_values_map[belongs_to_month].depreciated_amount += d.get("depreciated_amount")
 
 	return {
-		"data" : {
+		"data": {
 			"labels": labels_values_map.keys(),
 			"datasets": [
-				{ 'name': _('Asset Value'), 'values': [d.get("asset_value") for d in labels_values_map.values()] },
-				{ 'name': _('Depreciatied Amount'), 'values': [d.get("depreciated_amount") for d in labels_values_map.values()] }
-			]
+				{
+					"name": _("Asset Value"),
+					"values": [d.get("asset_value") for d in labels_values_map.values()],
+				},
+				{
+					"name": _("Depreciatied Amount"),
+					"values": [d.get("depreciated_amount") for d in labels_values_map.values()],
+				},
+			],
 		},
 		"type": "bar",
-		"barOptions": {
-			"stacked": 1
-		},
+		"barOptions": {"stacked": 1},
 	}
 
+
 def get_finance_book_value_map(filters):
 	date = filters.to_date if filters.filter_based_on == "Date Range" else filters.year_end_date
 
-	return frappe._dict(frappe.db.sql(''' Select
+	return frappe._dict(
+		frappe.db.sql(
+			""" Select
 		parent, SUM(depreciation_amount)
 		FROM `tabDepreciation Schedule`
 		WHERE
@@ -144,27 +183,41 @@
 			AND schedule_date<=%s
 			AND journal_entry IS NOT NULL
 			AND ifnull(finance_book, '')=%s
-		GROUP BY parent''', (date, cstr(filters.finance_book or ''))))
+		GROUP BY parent""",
+			(date, cstr(filters.finance_book or "")),
+		)
+	)
+
 
 def get_purchase_receipt_supplier_map():
-	return frappe._dict(frappe.db.sql(''' Select
+	return frappe._dict(
+		frappe.db.sql(
+			""" Select
 		pr.name, pr.supplier
 		FROM `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri
 		WHERE
 			pri.parent = pr.name
 			AND pri.is_fixed_asset=1
 			AND pr.docstatus=1
-			AND pr.is_return=0'''))
+			AND pr.is_return=0"""
+		)
+	)
+
 
 def get_purchase_invoice_supplier_map():
-	return frappe._dict(frappe.db.sql(''' Select
+	return frappe._dict(
+		frappe.db.sql(
+			""" Select
 		pi.name, pi.supplier
 		FROM `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pii
 		WHERE
 			pii.parent = pi.name
 			AND pii.is_fixed_asset=1
 			AND pi.docstatus=1
-			AND pi.is_return=0'''))
+			AND pi.is_return=0"""
+		)
+	)
+
 
 def get_columns(filters):
 	if filters.get("group_by") in ["Asset Category", "Location"]:
@@ -174,36 +227,36 @@
 				"fieldtype": "Link",
 				"fieldname": frappe.scrub(filters.get("group_by")),
 				"options": filters.get("group_by"),
-				"width": 120
+				"width": 120,
 			},
 			{
 				"label": _("Gross Purchase Amount"),
 				"fieldname": "gross_purchase_amount",
 				"fieldtype": "Currency",
 				"options": "company:currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"label": _("Opening Accumulated Depreciation"),
 				"fieldname": "opening_accumulated_depreciation",
 				"fieldtype": "Currency",
 				"options": "company:currency",
-				"width": 90
+				"width": 90,
 			},
 			{
 				"label": _("Depreciated Amount"),
 				"fieldname": "depreciated_amount",
 				"fieldtype": "Currency",
 				"options": "company:currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"label": _("Asset Value"),
 				"fieldname": "asset_value",
 				"fieldtype": "Currency",
 				"options": "company:currency",
-				"width": 100
-			}
+				"width": 100,
+			},
 		]
 
 	return [
@@ -212,92 +265,72 @@
 			"fieldtype": "Link",
 			"fieldname": "asset_id",
 			"options": "Asset",
-			"width": 60
+			"width": 60,
 		},
-		{
-			"label": _("Asset Name"),
-			"fieldtype": "Data",
-			"fieldname": "asset_name",
-			"width": 140
-		},
+		{"label": _("Asset Name"), "fieldtype": "Data", "fieldname": "asset_name", "width": 140},
 		{
 			"label": _("Asset Category"),
 			"fieldtype": "Link",
 			"fieldname": "asset_category",
 			"options": "Asset Category",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Status"),
-			"fieldtype": "Data",
-			"fieldname": "status",
-			"width": 80
-		},
-		{
-			"label": _("Purchase Date"),
-			"fieldtype": "Date",
-			"fieldname": "purchase_date",
-			"width": 90
-		},
+		{"label": _("Status"), "fieldtype": "Data", "fieldname": "status", "width": 80},
+		{"label": _("Purchase Date"), "fieldtype": "Date", "fieldname": "purchase_date", "width": 90},
 		{
 			"label": _("Available For Use Date"),
 			"fieldtype": "Date",
 			"fieldname": "available_for_use_date",
-			"width": 90
+			"width": 90,
 		},
 		{
 			"label": _("Gross Purchase Amount"),
 			"fieldname": "gross_purchase_amount",
 			"fieldtype": "Currency",
 			"options": "company:currency",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Asset Value"),
 			"fieldname": "asset_value",
 			"fieldtype": "Currency",
 			"options": "company:currency",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Opening Accumulated Depreciation"),
 			"fieldname": "opening_accumulated_depreciation",
 			"fieldtype": "Currency",
 			"options": "company:currency",
-			"width": 90
+			"width": 90,
 		},
 		{
 			"label": _("Depreciated Amount"),
 			"fieldname": "depreciated_amount",
 			"fieldtype": "Currency",
 			"options": "company:currency",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Cost Center"),
 			"fieldtype": "Link",
 			"fieldname": "cost_center",
 			"options": "Cost Center",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Department"),
 			"fieldtype": "Link",
 			"fieldname": "department",
 			"options": "Department",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Vendor Name"),
-			"fieldtype": "Data",
-			"fieldname": "vendor_name",
-			"width": 100
-		},
+		{"label": _("Vendor Name"), "fieldtype": "Data", "fieldname": "vendor_name", "width": 100},
 		{
 			"label": _("Location"),
 			"fieldtype": "Link",
 			"fieldname": "location",
 			"options": "Location",
-			"width": 100
+			"width": 100,
 		},
 	]
diff --git a/erpnext/bulk_transaction/doctype/bulk_transaction_log/bulk_transaction_log.py b/erpnext/bulk_transaction/doctype/bulk_transaction_log/bulk_transaction_log.py
index 92f37f5..0596be4 100644
--- a/erpnext/bulk_transaction/doctype/bulk_transaction_log/bulk_transaction_log.py
+++ b/erpnext/bulk_transaction/doctype/bulk_transaction_log/bulk_transaction_log.py
@@ -27,7 +27,7 @@
 		.where(btp.date == log_date)
 	).run(as_dict=True)
 
-	if data :
+	if data:
 		if len(data) > 10:
 			frappe.enqueue(job, queue="long", job_name="bulk_retry", data=data, log_date=log_date)
 		else:
@@ -35,6 +35,7 @@
 	else:
 		return "No Failed Records"
 
+
 def job(data, log_date):
 	for d in data:
 		failed = []
@@ -51,7 +52,7 @@
 				d.to_doctype,
 				status="Failed",
 				log_date=log_date,
-				restarted=1
+				restarted=1,
 			)
 
 		if not failed:
diff --git a/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py b/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py
index a78e697..646dba5 100644
--- a/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py
+++ b/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py
@@ -10,7 +10,6 @@
 
 
 class TestBulkTransactionLog(unittest.TestCase):
-
 	def setUp(self):
 		create_company()
 		create_customer()
@@ -19,7 +18,11 @@
 	def test_for_single_record(self):
 		so_name = create_so()
 		transaction_processing([{"name": so_name}], "Sales Order", "Sales Invoice")
-		data = frappe.db.get_list("Sales Invoice", filters = {"posting_date": date.today(), "customer": "Bulk Customer"}, fields=["*"])
+		data = frappe.db.get_list(
+			"Sales Invoice",
+			filters={"posting_date": date.today(), "customer": "Bulk Customer"},
+			fields=["*"],
+		)
 		if not data:
 			self.fail("No Sales Invoice Created !")
 
@@ -36,32 +39,35 @@
 				self.assertEqual(d.retried, 0)
 
 
-
 def create_company():
-	if not frappe.db.exists('Company', '_Test Company'):
-		frappe.get_doc({
-			'doctype': 'Company',
-			'company_name': '_Test Company',
-			'country': 'India',
-			'default_currency': 'INR'
-		}).insert()
+	if not frappe.db.exists("Company", "_Test Company"):
+		frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": "_Test Company",
+				"country": "India",
+				"default_currency": "INR",
+			}
+		).insert()
+
 
 def create_customer():
-	if not frappe.db.exists('Customer', 'Bulk Customer'):
-		frappe.get_doc({
-			'doctype': 'Customer',
-			'customer_name': 'Bulk Customer'
-		}).insert()
+	if not frappe.db.exists("Customer", "Bulk Customer"):
+		frappe.get_doc({"doctype": "Customer", "customer_name": "Bulk Customer"}).insert()
+
 
 def create_item():
 	if not frappe.db.exists("Item", "MK"):
-		frappe.get_doc({
-			"doctype": "Item",
-			"item_code": "MK",
-			"item_name": "Milk",
-			"description": "Milk",
-			"item_group": "Products"
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": "MK",
+				"item_name": "Milk",
+				"description": "Milk",
+				"item_group": "Products",
+			}
+		).insert()
+
 
 def create_so(intent=None):
 	so = frappe.new_doc("Sales Order")
@@ -70,12 +76,15 @@
 	so.transaction_date = date.today()
 
 	so.set_warehouse = "Finished Goods - _TC"
-	so.append("items", {
-		"item_code": "MK",
-		"delivery_date": date.today(),
-		"qty": 10,
-		"rate": 80,
-	})
+	so.append(
+		"items",
+		{
+			"item_code": "MK",
+			"delivery_date": date.today(),
+			"qty": 10,
+			"rate": 80,
+		},
+	)
 	so.insert()
 	so.submit()
-	return so.name
\ No newline at end of file
+	return so.name
diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.py b/erpnext/buying/doctype/buying_settings/buying_settings.py
index 2b6ff43..5507254 100644
--- a/erpnext/buying/doctype/buying_settings/buying_settings.py
+++ b/erpnext/buying/doctype/buying_settings/buying_settings.py
@@ -14,5 +14,10 @@
 			frappe.db.set_default(key, self.get(key, ""))
 
 		from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series
-		set_by_naming_series("Supplier", "supplier_name",
-			self.get("supp_master_name")=="Naming Series", hide_name_field=False)
+
+		set_by_naming_series(
+			"Supplier",
+			"supplier_name",
+			self.get("supp_master_name") == "Naming Series",
+			hide_name_field=False,
+		)
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index f93f9fe..582bd8d 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -26,24 +26,25 @@
 from erpnext.stock.stock_balance import get_ordered_qty, update_bin_qty
 from erpnext.stock.utils import get_bin
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class PurchaseOrder(BuyingController):
 	def __init__(self, *args, **kwargs):
 		super(PurchaseOrder, self).__init__(*args, **kwargs)
-		self.status_updater = [{
-			'source_dt': 'Purchase Order Item',
-			'target_dt': 'Material Request Item',
-			'join_field': 'material_request_item',
-			'target_field': 'ordered_qty',
-			'target_parent_dt': 'Material Request',
-			'target_parent_field': 'per_ordered',
-			'target_ref_field': 'stock_qty',
-			'source_field': 'stock_qty',
-			'percent_join_field': 'material_request'
-		}]
+		self.status_updater = [
+			{
+				"source_dt": "Purchase Order Item",
+				"target_dt": "Material Request Item",
+				"join_field": "material_request_item",
+				"target_field": "ordered_qty",
+				"target_parent_dt": "Material Request",
+				"target_parent_field": "per_ordered",
+				"target_ref_field": "stock_qty",
+				"source_field": "stock_qty",
+				"percent_join_field": "material_request",
+			}
+		]
 
 	def onload(self):
 		supplier_tds = frappe.db.get_value("Supplier", self.supplier, "tax_withholding_category")
@@ -71,35 +72,44 @@
 		self.validate_bom_for_subcontracting_items()
 		self.create_raw_materials_supplied("supplied_items")
 		self.set_received_qty_for_drop_ship_items()
-		validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_order_reference)
+		validate_inter_company_party(
+			self.doctype, self.supplier, self.company, self.inter_company_order_reference
+		)
 		self.reset_default_field_value("set_warehouse", "items", "warehouse")
 
 	def validate_with_previous_doc(self):
-		super(PurchaseOrder, self).validate_with_previous_doc({
-			"Supplier Quotation": {
-				"ref_dn_field": "supplier_quotation",
-				"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
-			},
-			"Supplier Quotation Item": {
-				"ref_dn_field": "supplier_quotation_item",
-				"compare_fields": [["project", "="], ["item_code", "="],
-					["uom", "="], ["conversion_factor", "="]],
-				"is_child_table": True
-			},
-			"Material Request": {
-				"ref_dn_field": "material_request",
-				"compare_fields": [["company", "="]],
-			},
-			"Material Request Item": {
-				"ref_dn_field": "material_request_item",
-				"compare_fields": [["project", "="], ["item_code", "="]],
-				"is_child_table": True
+		super(PurchaseOrder, self).validate_with_previous_doc(
+			{
+				"Supplier Quotation": {
+					"ref_dn_field": "supplier_quotation",
+					"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
+				},
+				"Supplier Quotation Item": {
+					"ref_dn_field": "supplier_quotation_item",
+					"compare_fields": [
+						["project", "="],
+						["item_code", "="],
+						["uom", "="],
+						["conversion_factor", "="],
+					],
+					"is_child_table": True,
+				},
+				"Material Request": {
+					"ref_dn_field": "material_request",
+					"compare_fields": [["company", "="]],
+				},
+				"Material Request Item": {
+					"ref_dn_field": "material_request_item",
+					"compare_fields": [["project", "="], ["item_code", "="]],
+					"is_child_table": True,
+				},
 			}
-		})
+		)
 
-
-		if cint(frappe.db.get_single_value('Buying Settings', 'maintain_same_rate')):
-			self.validate_rate_with_reference_doc([["Supplier Quotation", "supplier_quotation", "supplier_quotation_item"]])
+		if cint(frappe.db.get_single_value("Buying Settings", "maintain_same_rate")):
+			self.validate_rate_with_reference_doc(
+				[["Supplier Quotation", "supplier_quotation", "supplier_quotation_item"]]
+			)
 
 	def set_tax_withholding(self):
 		if not self.apply_tds:
@@ -119,8 +129,11 @@
 		if not accounts or tax_withholding_details.get("account_head") not in accounts:
 			self.append("taxes", tax_withholding_details)
 
-		to_remove = [d for d in self.taxes
-			if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")]
+		to_remove = [
+			d
+			for d in self.taxes
+			if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")
+		]
 
 		for d in to_remove:
 			self.remove(d)
@@ -129,26 +142,43 @@
 		self.calculate_taxes_and_totals()
 
 	def validate_supplier(self):
-		prevent_po = frappe.db.get_value("Supplier", self.supplier, 'prevent_pos')
+		prevent_po = frappe.db.get_value("Supplier", self.supplier, "prevent_pos")
 		if prevent_po:
-			standing = frappe.db.get_value("Supplier Scorecard", self.supplier, 'status')
+			standing = frappe.db.get_value("Supplier Scorecard", self.supplier, "status")
 			if standing:
-				frappe.throw(_("Purchase Orders are not allowed for {0} due to a scorecard standing of {1}.")
-					.format(self.supplier, standing))
+				frappe.throw(
+					_("Purchase Orders are not allowed for {0} due to a scorecard standing of {1}.").format(
+						self.supplier, standing
+					)
+				)
 
-		warn_po = frappe.db.get_value("Supplier", self.supplier, 'warn_pos')
+		warn_po = frappe.db.get_value("Supplier", self.supplier, "warn_pos")
 		if warn_po:
-			standing = frappe.db.get_value("Supplier Scorecard",self.supplier, 'status')
-			frappe.msgprint(_("{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution.").format(self.supplier, standing), title=_("Caution"), indicator='orange')
+			standing = frappe.db.get_value("Supplier Scorecard", self.supplier, "status")
+			frappe.msgprint(
+				_(
+					"{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution."
+				).format(self.supplier, standing),
+				title=_("Caution"),
+				indicator="orange",
+			)
 
 		self.party_account_currency = get_party_account_currency("Supplier", self.supplier, self.company)
 
 	def validate_minimum_order_qty(self):
-		if not self.get("items"): return
+		if not self.get("items"):
+			return
 		items = list(set(d.item_code for d in self.get("items")))
 
-		itemwise_min_order_qty = frappe._dict(frappe.db.sql("""select name, min_order_qty
-			from tabItem where name in ({0})""".format(", ".join(["%s"] * len(items))), items))
+		itemwise_min_order_qty = frappe._dict(
+			frappe.db.sql(
+				"""select name, min_order_qty
+			from tabItem where name in ({0})""".format(
+					", ".join(["%s"] * len(items))
+				),
+				items,
+			)
+		)
 
 		itemwise_qty = frappe._dict()
 		for d in self.get("items"):
@@ -157,36 +187,43 @@
 
 		for item_code, qty in itemwise_qty.items():
 			if flt(qty) < flt(itemwise_min_order_qty.get(item_code)):
-				frappe.throw(_("Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item).").format(item_code,
-					qty, itemwise_min_order_qty.get(item_code)))
+				frappe.throw(
+					_(
+						"Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)."
+					).format(item_code, qty, itemwise_min_order_qty.get(item_code))
+				)
 
 	def validate_bom_for_subcontracting_items(self):
 		if self.is_subcontracted == "Yes":
 			for item in self.items:
 				if not item.bom:
-					frappe.throw(_("BOM is not specified for subcontracting item {0} at row {1}")
-						.format(item.item_code, item.idx))
+					frappe.throw(
+						_("BOM is not specified for subcontracting item {0} at row {1}").format(
+							item.item_code, item.idx
+						)
+					)
 
 	def get_schedule_dates(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.material_request_item and not d.schedule_date:
-				d.schedule_date = frappe.db.get_value("Material Request Item",
-						d.material_request_item, "schedule_date")
-
+				d.schedule_date = frappe.db.get_value(
+					"Material Request Item", d.material_request_item, "schedule_date"
+				)
 
 	@frappe.whitelist()
 	def get_last_purchase_rate(self):
 		"""get last purchase rates for all items"""
 
-		conversion_rate = flt(self.get('conversion_rate')) or 1.0
+		conversion_rate = flt(self.get("conversion_rate")) or 1.0
 		for d in self.get("items"):
 			if d.item_code:
 				last_purchase_details = get_last_purchase_details(d.item_code, self.name)
 				if last_purchase_details:
-					d.base_price_list_rate = (last_purchase_details['base_price_list_rate'] *
-						(flt(d.conversion_factor) or 1.0))
-					d.discount_percentage = last_purchase_details['discount_percentage']
-					d.base_rate = last_purchase_details['base_rate'] * (flt(d.conversion_factor) or 1.0)
+					d.base_price_list_rate = last_purchase_details["base_price_list_rate"] * (
+						flt(d.conversion_factor) or 1.0
+					)
+					d.discount_percentage = last_purchase_details["discount_percentage"]
+					d.base_rate = last_purchase_details["base_rate"] * (flt(d.conversion_factor) or 1.0)
 					d.price_list_rate = d.base_price_list_rate / conversion_rate
 					d.rate = d.base_rate / conversion_rate
 					d.last_purchase_rate = d.rate
@@ -194,16 +231,21 @@
 
 					item_last_purchase_rate = frappe.get_cached_value("Item", d.item_code, "last_purchase_rate")
 					if item_last_purchase_rate:
-						d.base_price_list_rate = d.base_rate = d.price_list_rate \
-							= d.rate = d.last_purchase_rate = item_last_purchase_rate
+						d.base_price_list_rate = (
+							d.base_rate
+						) = d.price_list_rate = d.rate = d.last_purchase_rate = item_last_purchase_rate
 
 	# Check for Closed status
 	def check_on_hold_or_closed_status(self):
-		check_list =[]
-		for d in self.get('items'):
-			if d.meta.get_field('material_request') and d.material_request and d.material_request not in check_list:
+		check_list = []
+		for d in self.get("items"):
+			if (
+				d.meta.get_field("material_request")
+				and d.material_request
+				and d.material_request not in check_list
+			):
 				check_list.append(d.material_request)
-				check_on_hold_or_closed_status('Material Request', d.material_request)
+				check_on_hold_or_closed_status("Material Request", d.material_request)
 
 	def update_requested_qty(self):
 		material_request_map = {}
@@ -216,7 +258,9 @@
 				mr_obj = frappe.get_doc("Material Request", mr)
 
 				if mr_obj.status in ["Stopped", "Cancelled"]:
-					frappe.throw(_("Material Request {0} is cancelled or stopped").format(mr), frappe.InvalidStatusError)
+					frappe.throw(
+						_("Material Request {0} is cancelled or stopped").format(mr), frappe.InvalidStatusError
+					)
 
 				mr_obj.update_requested_qty(mr_item_rows)
 
@@ -224,24 +268,26 @@
 		"""update requested qty (before ordered_qty is updated)"""
 		item_wh_list = []
 		for d in self.get("items"):
-			if (not po_item_rows or d.name in po_item_rows) \
-				and [d.item_code, d.warehouse] not in item_wh_list \
-				and frappe.get_cached_value("Item", d.item_code, "is_stock_item") \
-				and d.warehouse and not d.delivered_by_supplier:
-					item_wh_list.append([d.item_code, d.warehouse])
+			if (
+				(not po_item_rows or d.name in po_item_rows)
+				and [d.item_code, d.warehouse] not in item_wh_list
+				and frappe.get_cached_value("Item", d.item_code, "is_stock_item")
+				and d.warehouse
+				and not d.delivered_by_supplier
+			):
+				item_wh_list.append([d.item_code, d.warehouse])
 		for item_code, warehouse in item_wh_list:
-			update_bin_qty(item_code, warehouse, {
-				"ordered_qty": get_ordered_qty(item_code, warehouse)
-			})
+			update_bin_qty(item_code, warehouse, {"ordered_qty": get_ordered_qty(item_code, warehouse)})
 
 	def check_modified_date(self):
-		mod_db = frappe.db.sql("select modified from `tabPurchase Order` where name = %s",
-			self.name)
+		mod_db = frappe.db.sql("select modified from `tabPurchase Order` where name = %s", self.name)
 		date_diff = frappe.db.sql("select '%s' - '%s' " % (mod_db[0][0], cstr(self.modified)))
 
 		if date_diff and date_diff[0][0]:
-			msgprint(_("{0} {1} has been modified. Please refresh.").format(self.doctype, self.name),
-				raise_exception=True)
+			msgprint(
+				_("{0} {1} has been modified. Please refresh.").format(self.doctype, self.name),
+				raise_exception=True,
+			)
 
 	def update_status(self, status):
 		self.check_modified_date()
@@ -268,8 +314,9 @@
 		if self.is_subcontracted == "Yes":
 			self.update_reserved_qty_for_subcontract()
 
-		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
-			self.company, self.base_grand_total)
+		frappe.get_doc("Authorization Control").validate_approving_authority(
+			self.doctype, self.company, self.base_grand_total
+		)
 
 		self.update_blanket_order()
 
@@ -289,7 +336,7 @@
 
 		self.check_on_hold_or_closed_status()
 
-		frappe.db.set(self,'status','Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 
 		self.update_prevdoc_status()
 
@@ -306,26 +353,30 @@
 		pass
 
 	def update_status_updater(self):
-		self.status_updater.append({
-			'source_dt': 'Purchase Order Item',
-			'target_dt': 'Sales Order Item',
-			'target_field': 'ordered_qty',
-			'target_parent_dt': 'Sales Order',
-			'target_parent_field': '',
-			'join_field': 'sales_order_item',
-			'target_ref_field': 'stock_qty',
-			'source_field': 'stock_qty'
-		})
-		self.status_updater.append({
-			'source_dt': 'Purchase Order Item',
-			'target_dt': 'Packed Item',
-			'target_field': 'ordered_qty',
-			'target_parent_dt': 'Sales Order',
-			'target_parent_field': '',
-			'join_field': 'sales_order_packed_item',
-			'target_ref_field': 'qty',
-			'source_field': 'stock_qty'
-		})
+		self.status_updater.append(
+			{
+				"source_dt": "Purchase Order Item",
+				"target_dt": "Sales Order Item",
+				"target_field": "ordered_qty",
+				"target_parent_dt": "Sales Order",
+				"target_parent_field": "",
+				"join_field": "sales_order_item",
+				"target_ref_field": "stock_qty",
+				"source_field": "stock_qty",
+			}
+		)
+		self.status_updater.append(
+			{
+				"source_dt": "Purchase Order Item",
+				"target_dt": "Packed Item",
+				"target_field": "ordered_qty",
+				"target_parent_dt": "Sales Order",
+				"target_parent_field": "",
+				"join_field": "sales_order_packed_item",
+				"target_ref_field": "qty",
+				"source_field": "stock_qty",
+			}
+		)
 
 	def update_delivered_qty_in_sales_order(self):
 		"""Update delivered qty in Sales Order for drop ship"""
@@ -364,24 +415,28 @@
 			received_qty += item.received_qty
 			total_qty += item.qty
 		if total_qty:
-			self.db_set("per_received", flt(received_qty/total_qty) * 100, update_modified=False)
+			self.db_set("per_received", flt(received_qty / total_qty) * 100, update_modified=False)
 		else:
 			self.db_set("per_received", 0, update_modified=False)
 
-def item_last_purchase_rate(name, conversion_rate, item_code, conversion_factor= 1.0):
+
+def item_last_purchase_rate(name, conversion_rate, item_code, conversion_factor=1.0):
 	"""get last purchase rate for an item"""
 
 	conversion_rate = flt(conversion_rate) or 1.0
 
-	last_purchase_details =  get_last_purchase_details(item_code, name)
+	last_purchase_details = get_last_purchase_details(item_code, name)
 	if last_purchase_details:
-		last_purchase_rate = (last_purchase_details['base_net_rate'] * (flt(conversion_factor) or 1.0)) / conversion_rate
+		last_purchase_rate = (
+			last_purchase_details["base_net_rate"] * (flt(conversion_factor) or 1.0)
+		) / conversion_rate
 		return last_purchase_rate
 	else:
 		item_last_purchase_rate = frappe.get_cached_value("Item", item_code, "last_purchase_rate")
 		if item_last_purchase_rate:
 			return item_last_purchase_rate
 
+
 @frappe.whitelist()
 def close_or_unclose_purchase_orders(names, status):
 	if not frappe.has_permission("Purchase Order", "write"):
@@ -392,7 +447,7 @@
 		po = frappe.get_doc("Purchase Order", name)
 		if po.docstatus == 1:
 			if status == "Closed":
-				if po.status not in ( "Cancelled", "Closed") and (po.per_received < 100 or po.per_billed < 100):
+				if po.status not in ("Cancelled", "Closed") and (po.per_received < 100 or po.per_billed < 100):
 					po.update_status(status)
 			else:
 				if po.status == "Closed":
@@ -401,70 +456,78 @@
 
 	frappe.local.message_log = []
 
+
 def set_missing_values(source, target):
 	target.run_method("set_missing_values")
 	target.run_method("calculate_taxes_and_totals")
 
+
 @frappe.whitelist()
 def make_purchase_receipt(source_name, target_doc=None):
 	def update_item(obj, target, source_parent):
 		target.qty = flt(obj.qty) - flt(obj.received_qty)
 		target.stock_qty = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor)
 		target.amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate)
-		target.base_amount = (flt(obj.qty) - flt(obj.received_qty)) * \
-			flt(obj.rate) * flt(source_parent.conversion_rate)
+		target.base_amount = (
+			(flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate) * flt(source_parent.conversion_rate)
+		)
 
-	doc = get_mapped_doc("Purchase Order", source_name,	{
-		"Purchase Order": {
-			"doctype": "Purchase Receipt",
-			"field_map": {
-				"supplier_warehouse":"supplier_warehouse"
+	doc = get_mapped_doc(
+		"Purchase Order",
+		source_name,
+		{
+			"Purchase Order": {
+				"doctype": "Purchase Receipt",
+				"field_map": {"supplier_warehouse": "supplier_warehouse"},
+				"validation": {
+					"docstatus": ["=", 1],
+				},
 			},
-			"validation": {
-				"docstatus": ["=", 1],
-			}
-		},
-		"Purchase Order Item": {
-			"doctype": "Purchase Receipt Item",
-			"field_map": {
-				"name": "purchase_order_item",
-				"parent": "purchase_order",
-				"bom": "bom",
-				"material_request": "material_request",
-				"material_request_item": "material_request_item"
+			"Purchase Order Item": {
+				"doctype": "Purchase Receipt Item",
+				"field_map": {
+					"name": "purchase_order_item",
+					"parent": "purchase_order",
+					"bom": "bom",
+					"material_request": "material_request",
+					"material_request_item": "material_request_item",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty)
+				and doc.delivered_by_supplier != 1,
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
+			"Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges", "add_if_empty": True},
 		},
-		"Purchase Taxes and Charges": {
-			"doctype": "Purchase Taxes and Charges",
-			"add_if_empty": True
-		}
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
-	doc.set_onload('ignore_price_list', True)
+	doc.set_onload("ignore_price_list", True)
 
 	return doc
 
+
 @frappe.whitelist()
 def make_purchase_invoice(source_name, target_doc=None):
 	return get_mapped_purchase_invoice(source_name, target_doc)
 
+
 @frappe.whitelist()
 def make_purchase_invoice_from_portal(purchase_order_name):
 	doc = get_mapped_purchase_invoice(purchase_order_name, ignore_permissions=True)
 	if doc.contact_email != frappe.session.user:
-		frappe.throw(_('Not Permitted'), frappe.PermissionError)
+		frappe.throw(_("Not Permitted"), frappe.PermissionError)
 	doc.save()
 	frappe.db.commit()
-	frappe.response['type'] = 'redirect'
-	frappe.response.location = '/purchase-invoices/' + doc.name
+	frappe.response["type"] = "redirect"
+	frappe.response.location = "/purchase-invoices/" + doc.name
+
 
 def get_mapped_purchase_invoice(source_name, target_doc=None, ignore_permissions=False):
 	def postprocess(source, target):
 		target.flags.ignore_permissions = ignore_permissions
 		set_missing_values(source, target)
-		#Get the advance paid Journal Entries in Purchase Invoice Advance
+		# Get the advance paid Journal Entries in Purchase Invoice Advance
 		if target.get("allocate_advances_automatically"):
 			target.set_advances()
 
@@ -473,26 +536,30 @@
 	def update_item(obj, target, source_parent):
 		target.amount = flt(obj.amount) - flt(obj.billed_amt)
 		target.base_amount = target.amount * flt(source_parent.conversion_rate)
-		target.qty = target.amount / flt(obj.rate) if (flt(obj.rate) and flt(obj.billed_amt)) else flt(obj.qty)
+		target.qty = (
+			target.amount / flt(obj.rate) if (flt(obj.rate) and flt(obj.billed_amt)) else flt(obj.qty)
+		)
 
 		item = get_item_defaults(target.item_code, source_parent.company)
 		item_group = get_item_group_defaults(target.item_code, source_parent.company)
-		target.cost_center = (obj.cost_center
+		target.cost_center = (
+			obj.cost_center
 			or frappe.db.get_value("Project", obj.project, "cost_center")
 			or item.get("buying_cost_center")
-			or item_group.get("buying_cost_center"))
+			or item_group.get("buying_cost_center")
+		)
 
 	fields = {
 		"Purchase Order": {
 			"doctype": "Purchase Invoice",
 			"field_map": {
 				"party_account_currency": "party_account_currency",
-				"supplier_warehouse":"supplier_warehouse"
+				"supplier_warehouse": "supplier_warehouse",
 			},
-			"field_no_map" : ["payment_terms_template"],
+			"field_no_map": ["payment_terms_template"],
 			"validation": {
 				"docstatus": ["=", 1],
-			}
+			},
 		},
 		"Purchase Order Item": {
 			"doctype": "Purchase Invoice Item",
@@ -501,20 +568,24 @@
 				"parent": "purchase_order",
 			},
 			"postprocess": update_item,
-			"condition": lambda doc: (doc.base_amount==0 or abs(doc.billed_amt) < abs(doc.amount))
+			"condition": lambda doc: (doc.base_amount == 0 or abs(doc.billed_amt) < abs(doc.amount)),
 		},
-		"Purchase Taxes and Charges": {
-			"doctype": "Purchase Taxes and Charges",
-			"add_if_empty": True
-		},
+		"Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges", "add_if_empty": True},
 	}
 
-	doc = get_mapped_doc("Purchase Order", source_name,	fields,
-		target_doc, postprocess, ignore_permissions=ignore_permissions)
-	doc.set_onload('ignore_price_list', True)
+	doc = get_mapped_doc(
+		"Purchase Order",
+		source_name,
+		fields,
+		target_doc,
+		postprocess,
+		ignore_permissions=ignore_permissions,
+	)
+	doc.set_onload("ignore_price_list", True)
 
 	return doc
 
+
 @frappe.whitelist()
 def make_rm_stock_entry(purchase_order, rm_items):
 	rm_items_list = rm_items
@@ -555,14 +626,14 @@
 						rm_item_code: {
 							"po_detail": rm_item_data.get("name"),
 							"item_name": rm_item_data["item_name"],
-							"description": item_wh.get(rm_item_code, {}).get('description', ""),
-							'qty': rm_item_data["qty"],
-							'from_warehouse': rm_item_data["warehouse"],
-							'stock_uom': rm_item_data["stock_uom"],
-							'serial_no': rm_item_data.get('serial_no'),
-							'batch_no': rm_item_data.get('batch_no'),
-							'main_item_code': rm_item_data["item_code"],
-							'allow_alternative_item': item_wh.get(rm_item_code, {}).get('allow_alternative_item')
+							"description": item_wh.get(rm_item_code, {}).get("description", ""),
+							"qty": rm_item_data["qty"],
+							"from_warehouse": rm_item_data["warehouse"],
+							"stock_uom": rm_item_data["stock_uom"],
+							"serial_no": rm_item_data.get("serial_no"),
+							"batch_no": rm_item_data.get("batch_no"),
+							"main_item_code": rm_item_data["item_code"],
+							"allow_alternative_item": item_wh.get(rm_item_code, {}).get("allow_alternative_item"),
 						}
 					}
 					stock_entry.add_to_stock_entry_detail(items_dict)
@@ -571,55 +642,72 @@
 		frappe.throw(_("No Items selected for transfer"))
 	return purchase_order.name
 
+
 def get_item_details(items):
 	item_details = {}
-	for d in frappe.db.sql("""select item_code, description, allow_alternative_item from `tabItem`
-		where name in ({0})""".format(", ".join(["%s"] * len(items))), items, as_dict=1):
+	for d in frappe.db.sql(
+		"""select item_code, description, allow_alternative_item from `tabItem`
+		where name in ({0})""".format(
+			", ".join(["%s"] * len(items))
+		),
+		items,
+		as_dict=1,
+	):
 		item_details[d.item_code] = d
 
 	return item_details
 
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Purchase Orders'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Purchase Orders"),
+		}
+	)
 	return list_context
 
+
 @frappe.whitelist()
 def update_status(status, name):
 	po = frappe.get_doc("Purchase Order", name)
 	po.update_status(status)
 	po.update_delivered_qty_in_sales_order()
 
+
 @frappe.whitelist()
 def make_inter_company_sales_order(source_name, target_doc=None):
 	from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
+
 	return make_inter_company_transaction("Purchase Order", source_name, target_doc)
 
+
 @frappe.whitelist()
 def get_materials_from_supplier(purchase_order, po_details):
 	if isinstance(po_details, str):
 		po_details = json.loads(po_details)
 
-	doc = frappe.get_cached_doc('Purchase Order', purchase_order)
+	doc = frappe.get_cached_doc("Purchase Order", purchase_order)
 	doc.initialized_fields()
 	doc.purchase_orders = [doc.name]
 	doc.get_available_materials()
 
 	if not doc.available_materials:
-		frappe.throw(_('Materials are already received against the purchase order {0}')
-			.format(purchase_order))
+		frappe.throw(
+			_("Materials are already received against the purchase order {0}").format(purchase_order)
+		)
 
 	return make_return_stock_entry_for_subcontract(doc.available_materials, doc, po_details)
 
+
 def make_return_stock_entry_for_subcontract(available_materials, po_doc, po_details):
-	ste_doc = frappe.new_doc('Stock Entry')
-	ste_doc.purpose = 'Material Transfer'
+	ste_doc = frappe.new_doc("Stock Entry")
+	ste_doc.purpose = "Material Transfer"
 	ste_doc.purchase_order = po_doc.name
 	ste_doc.company = po_doc.company
 	ste_doc.is_return = 1
@@ -640,18 +728,21 @@
 
 	return ste_doc
 
+
 def add_items_in_ste(ste_doc, row, qty, po_details, batch_no=None):
-	item = ste_doc.append('items', row.item_details)
+	item = ste_doc.append("items", row.item_details)
 
 	po_detail = list(set(row.po_details).intersection(po_details))
-	item.update({
-		'qty': qty,
-		'batch_no': batch_no,
-		'basic_rate': row.item_details['rate'],
-		'po_detail': po_detail[0] if po_detail else '',
-		's_warehouse': row.item_details['t_warehouse'],
-		't_warehouse': row.item_details['s_warehouse'],
-		'item_code': row.item_details['rm_item_code'],
-		'subcontracted_item': row.item_details['main_item_code'],
-		'serial_no': '\n'.join(row.serial_no) if row.serial_no else ''
-	})
+	item.update(
+		{
+			"qty": qty,
+			"batch_no": batch_no,
+			"basic_rate": row.item_details["rate"],
+			"po_detail": po_detail[0] if po_detail else "",
+			"s_warehouse": row.item_details["t_warehouse"],
+			"t_warehouse": row.item_details["s_warehouse"],
+			"item_code": row.item_details["rm_item_code"],
+			"subcontracted_item": row.item_details["main_item_code"],
+			"serial_no": "\n".join(row.serial_no) if row.serial_no else "",
+		}
+	)
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py b/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py
index d288f88..81f2010 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py
@@ -3,34 +3,25 @@
 
 def get_data():
 	return {
-		'fieldname': 'purchase_order',
-		'non_standard_fieldnames': {
-			'Journal Entry': 'reference_name',
-			'Payment Entry': 'reference_name',
-			'Payment Request': 'reference_name',
-			'Auto Repeat': 'reference_document'
+		"fieldname": "purchase_order",
+		"non_standard_fieldnames": {
+			"Journal Entry": "reference_name",
+			"Payment Entry": "reference_name",
+			"Payment Request": "reference_name",
+			"Auto Repeat": "reference_document",
 		},
-		'internal_links': {
-			'Material Request': ['items', 'material_request'],
-			'Supplier Quotation': ['items', 'supplier_quotation'],
-			'Project': ['items', 'project'],
+		"internal_links": {
+			"Material Request": ["items", "material_request"],
+			"Supplier Quotation": ["items", "supplier_quotation"],
+			"Project": ["items", "project"],
 		},
-		'transactions': [
+		"transactions": [
+			{"label": _("Related"), "items": ["Purchase Receipt", "Purchase Invoice"]},
+			{"label": _("Payment"), "items": ["Payment Entry", "Journal Entry", "Payment Request"]},
 			{
-				'label': _('Related'),
-				'items': ['Purchase Receipt', 'Purchase Invoice']
+				"label": _("Reference"),
+				"items": ["Material Request", "Supplier Quotation", "Project", "Auto Repeat"],
 			},
-			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Journal Entry', 'Payment Request']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Material Request', 'Supplier Quotation', 'Project', 'Auto Repeat']
-			},
-			{
-				'label': _('Sub-contracting'),
-				'items': ['Stock Entry']
-			},
-		]
+			{"label": _("Sub-contracting"), "items": ["Stock Entry"]},
+		],
 	}
diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py
index efa2ab1..e4fb970 100644
--- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py
@@ -51,7 +51,7 @@
 		po.load_from_db()
 		self.assertEqual(po.get("items")[0].received_qty, 4)
 
-		frappe.db.set_value('Item', '_Test Item', 'over_delivery_receipt_allowance', 50)
+		frappe.db.set_value("Item", "_Test Item", "over_delivery_receipt_allowance", 50)
 
 		pr = create_pr_against_po(po.name, received_qty=8)
 		self.assertEqual(get_ordered_qty(), existing_ordered_qty)
@@ -71,8 +71,8 @@
 
 		self.assertEqual(get_ordered_qty(), existing_ordered_qty + 10)
 
-		frappe.db.set_value('Item', '_Test Item', 'over_delivery_receipt_allowance', 50)
-		frappe.db.set_value('Item', '_Test Item', 'over_billing_allowance', 20)
+		frappe.db.set_value("Item", "_Test Item", "over_delivery_receipt_allowance", 50)
+		frappe.db.set_value("Item", "_Test Item", "over_billing_allowance", 20)
 
 		pi = make_pi_from_po(po.name)
 		pi.update_stock = 1
@@ -91,8 +91,8 @@
 		po.load_from_db()
 		self.assertEqual(po.get("items")[0].received_qty, 0)
 
-		frappe.db.set_value('Item', '_Test Item', 'over_delivery_receipt_allowance', 0)
-		frappe.db.set_value('Item', '_Test Item', 'over_billing_allowance', 0)
+		frappe.db.set_value("Item", "_Test Item", "over_delivery_receipt_allowance", 0)
+		frappe.db.set_value("Item", "_Test Item", "over_billing_allowance", 0)
 		frappe.db.set_value("Accounts Settings", None, "over_billing_allowance", 0)
 
 	def test_update_remove_child_linked_to_mr(self):
@@ -104,41 +104,41 @@
 		po.submit()
 
 		first_item_of_po = po.get("items")[0]
-		existing_ordered_qty = get_ordered_qty() # 10
-		existing_requested_qty = get_requested_qty() # 0
+		existing_ordered_qty = get_ordered_qty()  # 10
+		existing_requested_qty = get_requested_qty()  # 0
 
 		# decrease ordered qty by 3 (10 -> 7) and add item
-		trans_item = json.dumps([
-			{
-				'item_code': first_item_of_po.item_code,
-				'rate': first_item_of_po.rate,
-				'qty': 7,
-				'docname': first_item_of_po.name
-			},
-			{'item_code' : '_Test Item 2', 'rate' : 200, 'qty' : 2}
-		])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[
+				{
+					"item_code": first_item_of_po.item_code,
+					"rate": first_item_of_po.rate,
+					"qty": 7,
+					"docname": first_item_of_po.name,
+				},
+				{"item_code": "_Test Item 2", "rate": 200, "qty": 2},
+			]
+		)
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 		mr.reload()
 
 		# requested qty increases as ordered qty decreases
-		self.assertEqual(get_requested_qty(), existing_requested_qty + 3) # 3
+		self.assertEqual(get_requested_qty(), existing_requested_qty + 3)  # 3
 		self.assertEqual(mr.items[0].ordered_qty, 7)
 
-		self.assertEqual(get_ordered_qty(), existing_ordered_qty - 3) # 7
+		self.assertEqual(get_ordered_qty(), existing_ordered_qty - 3)  # 7
 
 		# delete first item linked to Material Request
-		trans_item = json.dumps([
-			{'item_code' : '_Test Item 2', 'rate' : 200, 'qty' : 2}
-		])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps([{"item_code": "_Test Item 2", "rate": 200, "qty": 2}])
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 		mr.reload()
 
 		# requested qty increases as ordered qty is 0 (deleted row)
-		self.assertEqual(get_requested_qty(), existing_requested_qty + 10) # 10
+		self.assertEqual(get_requested_qty(), existing_requested_qty + 10)  # 10
 		self.assertEqual(mr.items[0].ordered_qty, 0)
 
 		# ordered qty decreases as ordered qty is 0 (deleted row)
-		self.assertEqual(get_ordered_qty(), existing_ordered_qty - 10) # 0
+		self.assertEqual(get_ordered_qty(), existing_ordered_qty - 10)  # 0
 
 	def test_update_child(self):
 		mr = make_material_request(qty=10)
@@ -155,8 +155,10 @@
 		existing_ordered_qty = get_ordered_qty()
 		existing_requested_qty = get_requested_qty()
 
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': po.items[0].name}])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": po.items[0].name}]
+		)
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 
 		mr.reload()
 		self.assertEqual(mr.items[0].ordered_qty, 7)
@@ -180,20 +182,22 @@
 		existing_ordered_qty = get_ordered_qty()
 		first_item_of_po = po.get("items")[0]
 
-		trans_item = json.dumps([
-			{
-				'item_code': first_item_of_po.item_code,
-				'rate': first_item_of_po.rate,
-				'qty': first_item_of_po.qty,
-				'docname': first_item_of_po.name
-			},
-			{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7}
-		])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[
+				{
+					"item_code": first_item_of_po.item_code,
+					"rate": first_item_of_po.rate,
+					"qty": first_item_of_po.qty,
+					"docname": first_item_of_po.name,
+				},
+				{"item_code": "_Test Item", "rate": 200, "qty": 7},
+			]
+		)
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 
 		po.reload()
-		self.assertEqual(len(po.get('items')), 2)
-		self.assertEqual(po.status, 'To Receive and Bill')
+		self.assertEqual(len(po.get("items")), 2)
+		self.assertEqual(po.status, "To Receive and Bill")
 		# ordered qty should increase on row addition
 		self.assertEqual(get_ordered_qty(), existing_ordered_qty + 7)
 
@@ -208,15 +212,18 @@
 		first_item_of_po = po.get("items")[0]
 		existing_ordered_qty = get_ordered_qty()
 		# add an item
-		trans_item = json.dumps([
-			{
-				'item_code': first_item_of_po.item_code,
-				'rate': first_item_of_po.rate,
-				'qty': first_item_of_po.qty,
-				'docname': first_item_of_po.name
-			},
-			{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7}])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[
+				{
+					"item_code": first_item_of_po.item_code,
+					"rate": first_item_of_po.rate,
+					"qty": first_item_of_po.qty,
+					"docname": first_item_of_po.name,
+				},
+				{"item_code": "_Test Item", "rate": 200, "qty": 7},
+			]
+		)
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 
 		po.reload()
 
@@ -224,115 +231,145 @@
 		self.assertEqual(get_ordered_qty(), existing_ordered_qty + 7)
 
 		# check if can remove received item
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': po.get("items")[1].name}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate, 'Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": po.get("items")[1].name}]
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name
+		)
 
 		first_item_of_po = po.get("items")[0]
-		trans_item = json.dumps([
-			{
-				'item_code': first_item_of_po.item_code,
-				'rate': first_item_of_po.rate,
-				'qty': first_item_of_po.qty,
-				'docname': first_item_of_po.name
-			}
-		])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[
+				{
+					"item_code": first_item_of_po.item_code,
+					"rate": first_item_of_po.rate,
+					"qty": first_item_of_po.qty,
+					"docname": first_item_of_po.name,
+				}
+			]
+		)
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 
 		po.reload()
-		self.assertEqual(len(po.get('items')), 1)
-		self.assertEqual(po.status, 'To Receive and Bill')
+		self.assertEqual(len(po.get("items")), 1)
+		self.assertEqual(po.status, "To Receive and Bill")
 
 		# ordered qty should decrease (back to initial) on row deletion
 		self.assertEqual(get_ordered_qty(), existing_ordered_qty)
 
 	def test_update_child_perm(self):
-		po = create_purchase_order(item_code= "_Test Item", qty=4)
+		po = create_purchase_order(item_code="_Test Item", qty=4)
 
-		user = 'test@example.com'
-		test_user = frappe.get_doc('User', user)
+		user = "test@example.com"
+		test_user = frappe.get_doc("User", user)
 		test_user.add_roles("Accounts User")
 		frappe.set_user(user)
 
 		# update qty
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': po.items[0].name}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": po.items[0].name}]
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name
+		)
 
 		# add new item
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Purchase Order', trans_item, po.name)
+		trans_item = json.dumps([{"item_code": "_Test Item", "rate": 100, "qty": 2}])
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name
+		)
 		frappe.set_user("Administrator")
 
 	def test_update_child_with_tax_template(self):
 		"""
-			Test Action: Create a PO with one item having its tax account head already in the PO.
-			Add the same item + new item with tax template via Update Items.
-			Expected result: First Item's tax row is updated. New tax row is added for second Item.
+		Test Action: Create a PO with one item having its tax account head already in the PO.
+		Add the same item + new item with tax template via Update Items.
+		Expected result: First Item's tax row is updated. New tax row is added for second Item.
 		"""
 		if not frappe.db.exists("Item", "Test Item with Tax"):
-			make_item("Test Item with Tax", {
-				'is_stock_item': 1,
-			})
+			make_item(
+				"Test Item with Tax",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		if not frappe.db.exists("Item Tax Template", {"title": 'Test Update Items Template'}):
-			frappe.get_doc({
-				'doctype': 'Item Tax Template',
-				'title': 'Test Update Items Template',
-				'company': '_Test Company',
-				'taxes': [
-					{
-						'tax_type': "_Test Account Service Tax - _TC",
-						'tax_rate': 10,
-					}
-				]
-			}).insert()
+		if not frappe.db.exists("Item Tax Template", {"title": "Test Update Items Template"}):
+			frappe.get_doc(
+				{
+					"doctype": "Item Tax Template",
+					"title": "Test Update Items Template",
+					"company": "_Test Company",
+					"taxes": [
+						{
+							"tax_type": "_Test Account Service Tax - _TC",
+							"tax_rate": 10,
+						}
+					],
+				}
+			).insert()
 
 		new_item_with_tax = frappe.get_doc("Item", "Test Item with Tax")
 
-		if not frappe.db.exists("Item Tax",
-			{"item_tax_template": "Test Update Items Template - _TC", "parent": "Test Item with Tax"}):
-			new_item_with_tax.append("taxes", {
-				"item_tax_template": "Test Update Items Template - _TC",
-				"valid_from": nowdate()
-			})
+		if not frappe.db.exists(
+			"Item Tax",
+			{"item_tax_template": "Test Update Items Template - _TC", "parent": "Test Item with Tax"},
+		):
+			new_item_with_tax.append(
+				"taxes", {"item_tax_template": "Test Update Items Template - _TC", "valid_from": nowdate()}
+			)
 			new_item_with_tax.save()
 
 		tax_template = "_Test Account Excise Duty @ 10 - _TC"
-		item =  "_Test Item Home Desktop 100"
-		if not frappe.db.exists("Item Tax", {"parent":item, "item_tax_template":tax_template}):
+		item = "_Test Item Home Desktop 100"
+		if not frappe.db.exists("Item Tax", {"parent": item, "item_tax_template": tax_template}):
 			item_doc = frappe.get_doc("Item", item)
-			item_doc.append("taxes", {
-				"item_tax_template": tax_template,
-				"valid_from": nowdate()
-			})
+			item_doc.append("taxes", {"item_tax_template": tax_template, "valid_from": nowdate()})
 			item_doc.save()
 		else:
 			# update valid from
-			frappe.db.sql("""UPDATE `tabItem Tax` set valid_from = CURDATE()
+			frappe.db.sql(
+				"""UPDATE `tabItem Tax` set valid_from = CURDATE()
 				where parent = %(item)s and item_tax_template = %(tax)s""",
-					{"item": item, "tax": tax_template})
+				{"item": item, "tax": tax_template},
+			)
 
 		po = create_purchase_order(item_code=item, qty=1, do_not_save=1)
 
-		po.append("taxes", {
-			"account_head": "_Test Account Excise Duty - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Excise Duty",
-			"doctype": "Purchase Taxes and Charges",
-			"rate": 10
-		})
+		po.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Excise Duty - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Excise Duty",
+				"doctype": "Purchase Taxes and Charges",
+				"rate": 10,
+			},
+		)
 		po.insert()
 		po.submit()
 
 		self.assertEqual(po.taxes[0].tax_amount, 50)
 		self.assertEqual(po.taxes[0].total, 550)
 
-		items = json.dumps([
-			{'item_code' : item, 'rate' : 500, 'qty' : 1, 'docname': po.items[0].name},
-			{'item_code' : item, 'rate' : 100, 'qty' : 1}, # added item whose tax account head already exists in PO
-			{'item_code' : new_item_with_tax.name, 'rate' : 100, 'qty' : 1} # added item whose tax account head  is missing in PO
-		])
-		update_child_qty_rate('Purchase Order', items, po.name)
+		items = json.dumps(
+			[
+				{"item_code": item, "rate": 500, "qty": 1, "docname": po.items[0].name},
+				{
+					"item_code": item,
+					"rate": 100,
+					"qty": 1,
+				},  # added item whose tax account head already exists in PO
+				{
+					"item_code": new_item_with_tax.name,
+					"rate": 100,
+					"qty": 1,
+				},  # added item whose tax account head  is missing in PO
+			]
+		)
+		update_child_qty_rate("Purchase Order", items, po.name)
 
 		po.reload()
 		self.assertEqual(po.taxes[0].tax_amount, 70)
@@ -342,8 +379,11 @@
 		self.assertEqual(po.taxes[1].total, 840)
 
 		# teardown
-		frappe.db.sql("""UPDATE `tabItem Tax` set valid_from = NULL
-			where parent = %(item)s and item_tax_template = %(tax)s""", {"item": item, "tax": tax_template})
+		frappe.db.sql(
+			"""UPDATE `tabItem Tax` set valid_from = NULL
+			where parent = %(item)s and item_tax_template = %(tax)s""",
+			{"item": item, "tax": tax_template},
+		)
 		po.cancel()
 		po.delete()
 		new_item_with_tax.delete()
@@ -353,18 +393,24 @@
 		po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
 		total_reqd_qty = sum([d.get("required_qty") for d in po.as_dict().get("supplied_items")])
 
-		trans_item = json.dumps([{
-			'item_code': po.get("items")[0].item_code,
-			'rate': po.get("items")[0].rate,
-			'qty': po.get("items")[0].qty,
-			'uom': "_Test UOM 1",
-			'conversion_factor': 2,
-			'docname': po.get("items")[0].name
-		}])
-		update_child_qty_rate('Purchase Order', trans_item, po.name)
+		trans_item = json.dumps(
+			[
+				{
+					"item_code": po.get("items")[0].item_code,
+					"rate": po.get("items")[0].rate,
+					"qty": po.get("items")[0].qty,
+					"uom": "_Test UOM 1",
+					"conversion_factor": 2,
+					"docname": po.get("items")[0].name,
+				}
+			]
+		)
+		update_child_qty_rate("Purchase Order", trans_item, po.name)
 		po.reload()
 
-		total_reqd_qty_after_change = sum(d.get("required_qty") for d in po.as_dict().get("supplied_items"))
+		total_reqd_qty_after_change = sum(
+			d.get("required_qty") for d in po.as_dict().get("supplied_items")
+		)
 
 		self.assertEqual(total_reqd_qty_after_change, 2 * total_reqd_qty)
 
@@ -401,8 +447,6 @@
 		po.load_from_db()
 		self.assertEqual(po.get("items")[0].received_qty, 6)
 
-
-
 	def test_return_against_purchase_order(self):
 		po = create_purchase_order()
 
@@ -428,17 +472,20 @@
 			make_purchase_receipt as make_purchase_receipt_return,
 		)
 
-		pr1 = make_purchase_receipt_return(is_return=1, return_against=pr.name, qty=-3, do_not_submit=True)
+		pr1 = make_purchase_receipt_return(
+			is_return=1, return_against=pr.name, qty=-3, do_not_submit=True
+		)
 		pr1.items[0].purchase_order = po.name
 		pr1.items[0].purchase_order_item = po.items[0].name
 		pr1.submit()
 
-		pi1= make_purchase_invoice_return(is_return=1, return_against=pi2.name, qty=-1, update_stock=1, do_not_submit=True)
+		pi1 = make_purchase_invoice_return(
+			is_return=1, return_against=pi2.name, qty=-1, update_stock=1, do_not_submit=True
+		)
 		pi1.items[0].purchase_order = po.name
 		pi1.items[0].po_detail = po.items[0].name
 		pi1.submit()
 
-
 		po.load_from_db()
 		self.assertEqual(po.get("items")[0].received_qty, 5)
 
@@ -484,13 +531,12 @@
 
 	def test_purchase_order_on_hold(self):
 		po = create_purchase_order(item_code="_Test Product Bundle Item")
-		po.db_set('Status', "On Hold")
+		po.db_set("Status", "On Hold")
 		pi = make_pi_from_po(po.name)
 		pr = make_purchase_receipt(po.name)
 		self.assertRaises(frappe.ValidationError, pr.submit)
 		self.assertRaises(frappe.ValidationError, pi.submit)
 
-
 	def test_make_purchase_invoice_with_terms(self):
 		from erpnext.selling.doctype.sales_order.test_sales_order import (
 			automatically_fetch_payment_terms,
@@ -501,9 +547,7 @@
 
 		self.assertRaises(frappe.ValidationError, make_pi_from_po, po.name)
 
-		po.update(
-			{"payment_terms_template": "_Test Payment Term Template"}
-		)
+		po.update({"payment_terms_template": "_Test Payment Term Template"})
 
 		po.save()
 		po.submit()
@@ -511,7 +555,9 @@
 		self.assertEqual(po.payment_schedule[0].payment_amount, 2500.0)
 		self.assertEqual(getdate(po.payment_schedule[0].due_date), getdate(po.transaction_date))
 		self.assertEqual(po.payment_schedule[1].payment_amount, 2500.0)
-		self.assertEqual(getdate(po.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30))
+		self.assertEqual(
+			getdate(po.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30)
+		)
 		pi = make_pi_from_po(po.name)
 		pi.save()
 
@@ -521,7 +567,9 @@
 		self.assertEqual(pi.payment_schedule[0].payment_amount, 2500.0)
 		self.assertEqual(getdate(pi.payment_schedule[0].due_date), getdate(po.transaction_date))
 		self.assertEqual(pi.payment_schedule[1].payment_amount, 2500.0)
-		self.assertEqual(getdate(pi.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30))
+		self.assertEqual(
+			getdate(pi.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30)
+		)
 		automatically_fetch_payment_terms(enable=0)
 
 	def test_subcontracting(self):
@@ -530,66 +578,78 @@
 
 	def test_warehouse_company_validation(self):
 		from erpnext.stock.utils import InvalidWarehouseCompany
+
 		po = create_purchase_order(company="_Test Company 1", do_not_save=True)
 		self.assertRaises(InvalidWarehouseCompany, po.insert)
 
 	def test_uom_integer_validation(self):
 		from erpnext.utilities.transaction_base import UOMMustBeIntegerError
+
 		po = create_purchase_order(qty=3.4, do_not_save=True)
 		self.assertRaises(UOMMustBeIntegerError, po.insert)
 
 	def test_ordered_qty_for_closing_po(self):
-		bin = frappe.get_all("Bin", filters={"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
-			fields=["ordered_qty"])
+		bin = frappe.get_all(
+			"Bin",
+			filters={"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
+			fields=["ordered_qty"],
+		)
 
 		existing_ordered_qty = bin[0].ordered_qty if bin else 0.0
 
-		po = create_purchase_order(item_code= "_Test Item", qty=1)
+		po = create_purchase_order(item_code="_Test Item", qty=1)
 
-		self.assertEqual(get_ordered_qty(item_code= "_Test Item", warehouse="_Test Warehouse - _TC"), existing_ordered_qty+1)
+		self.assertEqual(
+			get_ordered_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"),
+			existing_ordered_qty + 1,
+		)
 
 		po.update_status("Closed")
 
-		self.assertEqual(get_ordered_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_ordered_qty)
+		self.assertEqual(
+			get_ordered_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_ordered_qty
+		)
 
 	def test_group_same_items(self):
 		frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
-		frappe.get_doc({
-			"doctype": "Purchase Order",
-			"company": "_Test Company",
-			"supplier" : "_Test Supplier",
-			"is_subcontracted" : "No",
-			"schedule_date": add_days(nowdate(), 1),
-			"currency" : frappe.get_cached_value('Company',  "_Test Company",  "default_currency"),
-			"conversion_factor" : 1,
-			"items" : get_same_items(),
-			"group_same_items": 1
-			}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Purchase Order",
+				"company": "_Test Company",
+				"supplier": "_Test Supplier",
+				"is_subcontracted": "No",
+				"schedule_date": add_days(nowdate(), 1),
+				"currency": frappe.get_cached_value("Company", "_Test Company", "default_currency"),
+				"conversion_factor": 1,
+				"items": get_same_items(),
+				"group_same_items": 1,
+			}
+		).insert(ignore_permissions=True)
 
 	def test_make_po_without_terms(self):
 		po = create_purchase_order(do_not_save=1)
 
-		self.assertFalse(po.get('payment_schedule'))
+		self.assertFalse(po.get("payment_schedule"))
 
 		po.insert()
 
-		self.assertTrue(po.get('payment_schedule'))
+		self.assertTrue(po.get("payment_schedule"))
 
 	def test_po_for_blocked_supplier_all(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
 		supplier.save()
 
-		self.assertEqual(supplier.hold_type, 'All')
+		self.assertEqual(supplier.hold_type, "All")
 		self.assertRaises(frappe.ValidationError, create_purchase_order)
 
 		supplier.on_hold = 0
 		supplier.save()
 
 	def test_po_for_blocked_supplier_invoices(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Invoices'
+		supplier.hold_type = "Invoices"
 		supplier.save()
 
 		self.assertRaises(frappe.ValidationError, create_purchase_order)
@@ -598,30 +658,40 @@
 		supplier.save()
 
 	def test_po_for_blocked_supplier_payments(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
-		supplier.hold_type = 'Payments'
+		supplier.hold_type = "Payments"
 		supplier.save()
 
 		po = create_purchase_order()
 
 		self.assertRaises(
-			frappe.ValidationError, get_payment_entry, dt='Purchase Order', dn=po.name, bank_account="_Test Bank - _TC")
+			frappe.ValidationError,
+			get_payment_entry,
+			dt="Purchase Order",
+			dn=po.name,
+			bank_account="_Test Bank - _TC",
+		)
 
 		supplier.on_hold = 0
 		supplier.save()
 
 	def test_po_for_blocked_supplier_payments_with_today_date(self):
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
 		supplier.on_hold = 1
 		supplier.release_date = nowdate()
-		supplier.hold_type = 'Payments'
+		supplier.hold_type = "Payments"
 		supplier.save()
 
 		po = create_purchase_order()
 
 		self.assertRaises(
-			frappe.ValidationError, get_payment_entry, dt='Purchase Order', dn=po.name, bank_account="_Test Bank - _TC")
+			frappe.ValidationError,
+			get_payment_entry,
+			dt="Purchase Order",
+			dn=po.name,
+			bank_account="_Test Bank - _TC",
+		)
 
 		supplier.on_hold = 0
 		supplier.save()
@@ -630,14 +700,14 @@
 		# this test is meant to fail only if something fails in the try block
 		with self.assertRaises(Exception):
 			try:
-				supplier = frappe.get_doc('Supplier', '_Test Supplier')
+				supplier = frappe.get_doc("Supplier", "_Test Supplier")
 				supplier.on_hold = 1
-				supplier.hold_type = 'Payments'
-				supplier.release_date = '2018-03-01'
+				supplier.hold_type = "Payments"
+				supplier.release_date = "2018-03-01"
 				supplier.save()
 
 				po = create_purchase_order()
-				get_payment_entry('Purchase Order', po.name, bank_account='_Test Bank - _TC')
+				get_payment_entry("Purchase Order", po.name, bank_account="_Test Bank - _TC")
 
 				supplier.on_hold = 0
 				supplier.save()
@@ -648,88 +718,124 @@
 
 	def test_terms_are_not_copied_if_automatically_fetch_payment_terms_is_unchecked(self):
 		po = create_purchase_order(do_not_save=1)
-		po.payment_terms_template = '_Test Payment Term Template'
+		po.payment_terms_template = "_Test Payment Term Template"
 		po.save()
 		po.submit()
 
-		frappe.db.set_value('Company', '_Test Company', 'payment_terms', '_Test Payment Term Template 1')
+		frappe.db.set_value("Company", "_Test Company", "payment_terms", "_Test Payment Term Template 1")
 		pi = make_pi_from_po(po.name)
 		pi.save()
 
-		self.assertEqual(pi.get('payment_terms_template'), '_Test Payment Term Template 1')
-		frappe.db.set_value('Company', '_Test Company', 'payment_terms', '')
+		self.assertEqual(pi.get("payment_terms_template"), "_Test Payment Term Template 1")
+		frappe.db.set_value("Company", "_Test Company", "payment_terms", "")
 
 	def test_terms_copied(self):
 		po = create_purchase_order(do_not_save=1)
-		po.payment_terms_template = '_Test Payment Term Template'
+		po.payment_terms_template = "_Test Payment Term Template"
 		po.insert()
 		po.submit()
-		self.assertTrue(po.get('payment_schedule'))
+		self.assertTrue(po.get("payment_schedule"))
 
 		pi = make_pi_from_po(po.name)
 		pi.insert()
-		self.assertTrue(pi.get('payment_schedule'))
+		self.assertTrue(pi.get("payment_schedule"))
 
 	def test_reserved_qty_subcontract_po(self):
 		# Make stock available for raw materials
 		make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse - _TC", item_code="_Test Item Home Desktop 100",
-			qty=20, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse 1 - _TC", item_code="_Test Item",
-			qty=30, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse 1 - _TC", item_code="_Test Item Home Desktop 100",
-			qty=30, basic_rate=100)
+		make_stock_entry(
+			target="_Test Warehouse - _TC", item_code="_Test Item Home Desktop 100", qty=20, basic_rate=100
+		)
+		make_stock_entry(
+			target="_Test Warehouse 1 - _TC", item_code="_Test Item", qty=30, basic_rate=100
+		)
+		make_stock_entry(
+			target="_Test Warehouse 1 - _TC",
+			item_code="_Test Item Home Desktop 100",
+			qty=30,
+			basic_rate=100,
+		)
 
-		bin1 = frappe.db.get_value("Bin",
+		bin1 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname=["reserved_qty_for_sub_contract", "projected_qty", "modified"], as_dict=1)
+			fieldname=["reserved_qty_for_sub_contract", "projected_qty", "modified"],
+			as_dict=1,
+		)
 
 		# Submit PO
 		po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
 
-		bin2 = frappe.db.get_value("Bin",
+		bin2 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname=["reserved_qty_for_sub_contract", "projected_qty", "modified"], as_dict=1)
+			fieldname=["reserved_qty_for_sub_contract", "projected_qty", "modified"],
+			as_dict=1,
+		)
 
 		self.assertEqual(bin2.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract + 10)
 		self.assertEqual(bin2.projected_qty, bin1.projected_qty - 10)
 		self.assertNotEqual(bin1.modified, bin2.modified)
 
 		# Create stock transfer
-		rm_item = [{"item_code":"_Test FG Item","rm_item_code":"_Test Item","item_name":"_Test Item",
-					"qty":6,"warehouse":"_Test Warehouse - _TC","rate":100,"amount":600,"stock_uom":"Nos"}]
+		rm_item = [
+			{
+				"item_code": "_Test FG Item",
+				"rm_item_code": "_Test Item",
+				"item_name": "_Test Item",
+				"qty": 6,
+				"warehouse": "_Test Warehouse - _TC",
+				"rate": 100,
+				"amount": 600,
+				"stock_uom": "Nos",
+			}
+		]
 		rm_item_string = json.dumps(rm_item)
 		se = frappe.get_doc(make_subcontract_transfer_entry(po.name, rm_item_string))
 		se.to_warehouse = "_Test Warehouse 1 - _TC"
 		se.save()
 		se.submit()
 
-		bin3 = frappe.db.get_value("Bin",
+		bin3 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin3.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
 
 		# close PO
 		po.update_status("Closed")
-		bin4 = frappe.db.get_value("Bin",
+		bin4 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin4.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
 
 		# Re-open PO
 		po.update_status("Submitted")
-		bin5 = frappe.db.get_value("Bin",
+		bin5 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin5.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
 
-		make_stock_entry(target="_Test Warehouse 1 - _TC", item_code="_Test Item",
-			qty=40, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse 1 - _TC", item_code="_Test Item Home Desktop 100",
-			qty=40, basic_rate=100)
+		make_stock_entry(
+			target="_Test Warehouse 1 - _TC", item_code="_Test Item", qty=40, basic_rate=100
+		)
+		make_stock_entry(
+			target="_Test Warehouse 1 - _TC",
+			item_code="_Test Item Home Desktop 100",
+			qty=40,
+			basic_rate=100,
+		)
 
 		# make Purchase Receipt against PO
 		pr = make_purchase_receipt(po.name)
@@ -737,17 +843,23 @@
 		pr.save()
 		pr.submit()
 
-		bin6 = frappe.db.get_value("Bin",
+		bin6 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin6.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
 
 		# Cancel PR
 		pr.cancel()
-		bin7 = frappe.db.get_value("Bin",
+		bin7 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin7.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
 
@@ -757,34 +869,46 @@
 		pi.supplier_warehouse = "_Test Warehouse 1 - _TC"
 		pi.insert()
 		pi.submit()
-		bin8 = frappe.db.get_value("Bin",
+		bin8 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin8.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
 
 		# Cancel PR
 		pi.cancel()
-		bin9 = frappe.db.get_value("Bin",
+		bin9 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin9.reserved_qty_for_sub_contract, bin2.reserved_qty_for_sub_contract - 6)
 
 		# Cancel Stock Entry
 		se.cancel()
-		bin10 = frappe.db.get_value("Bin",
+		bin10 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin10.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract + 10)
 
 		# Cancel PO
 		po.reload()
 		po.cancel()
-		bin11 = frappe.db.get_value("Bin",
+		bin11 = frappe.db.get_value(
+			"Bin",
 			filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"},
-			fieldname="reserved_qty_for_sub_contract", as_dict=1)
+			fieldname="reserved_qty_for_sub_contract",
+			as_dict=1,
+		)
 
 		self.assertEqual(bin11.reserved_qty_for_sub_contract, bin1.reserved_qty_for_sub_contract)
 
@@ -792,56 +916,101 @@
 		item_code = "_Test Subcontracted FG Item 11"
 		make_subcontracted_item(item_code=item_code)
 
-		po = create_purchase_order(item_code=item_code, qty=1,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC", include_exploded_items=1)
+		po = create_purchase_order(
+			item_code=item_code,
+			qty=1,
+			is_subcontracted="Yes",
+			supplier_warehouse="_Test Warehouse 1 - _TC",
+			include_exploded_items=1,
+		)
 
-		name = frappe.db.get_value('BOM', {'item': item_code}, 'name')
-		bom = frappe.get_doc('BOM', name)
+		name = frappe.db.get_value("BOM", {"item": item_code}, "name")
+		bom = frappe.get_doc("BOM", name)
 
-		exploded_items = sorted([d.item_code for d in bom.exploded_items if not d.get('sourced_by_supplier')])
+		exploded_items = sorted(
+			[d.item_code for d in bom.exploded_items if not d.get("sourced_by_supplier")]
+		)
 		supplied_items = sorted([d.rm_item_code for d in po.supplied_items])
 		self.assertEqual(exploded_items, supplied_items)
 
-		po1 = create_purchase_order(item_code=item_code, qty=1,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC", include_exploded_items=0)
+		po1 = create_purchase_order(
+			item_code=item_code,
+			qty=1,
+			is_subcontracted="Yes",
+			supplier_warehouse="_Test Warehouse 1 - _TC",
+			include_exploded_items=0,
+		)
 
 		supplied_items1 = sorted([d.rm_item_code for d in po1.supplied_items])
-		bom_items = sorted([d.item_code for d in bom.items if not d.get('sourced_by_supplier')])
+		bom_items = sorted([d.item_code for d in bom.items if not d.get("sourced_by_supplier")])
 
 		self.assertEqual(supplied_items1, bom_items)
 
 	def test_backflush_based_on_stock_entry(self):
 		item_code = "_Test Subcontracted FG Item 1"
 		make_subcontracted_item(item_code=item_code)
-		make_item('Sub Contracted Raw Material 1', {
-			'is_stock_item': 1,
-			'is_sub_contracted_item': 1
-		})
+		make_item("Sub Contracted Raw Material 1", {"is_stock_item": 1, "is_sub_contracted_item": 1})
 
 		update_backflush_based_on("Material Transferred for Subcontract")
 
 		order_qty = 5
-		po = create_purchase_order(item_code=item_code, qty=order_qty,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			item_code=item_code,
+			qty=order_qty,
+			is_subcontracted="Yes",
+			supplier_warehouse="_Test Warehouse 1 - _TC",
+		)
 
-		make_stock_entry(target="_Test Warehouse - _TC",
-			item_code="_Test Item Home Desktop 100", qty=20, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse - _TC",
-			item_code = "Test Extra Item 1", qty=100, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse - _TC",
-			item_code = "Test Extra Item 2", qty=10, basic_rate=100)
-		make_stock_entry(target="_Test Warehouse - _TC",
-			item_code = "Sub Contracted Raw Material 1", qty=10, basic_rate=100)
+		make_stock_entry(
+			target="_Test Warehouse - _TC", item_code="_Test Item Home Desktop 100", qty=20, basic_rate=100
+		)
+		make_stock_entry(
+			target="_Test Warehouse - _TC", item_code="Test Extra Item 1", qty=100, basic_rate=100
+		)
+		make_stock_entry(
+			target="_Test Warehouse - _TC", item_code="Test Extra Item 2", qty=10, basic_rate=100
+		)
+		make_stock_entry(
+			target="_Test Warehouse - _TC",
+			item_code="Sub Contracted Raw Material 1",
+			qty=10,
+			basic_rate=100,
+		)
 
 		rm_items = [
-			{"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 1","item_name":"_Test Item",
-				"qty":10,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"},
-			{"item_code":item_code,"rm_item_code":"_Test Item Home Desktop 100","item_name":"_Test Item Home Desktop 100",
-				"qty":20,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"},
-			{"item_code":item_code,"rm_item_code":"Test Extra Item 1","item_name":"Test Extra Item 1",
-				"qty":10,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"},
-			{'item_code': item_code, 'rm_item_code': 'Test Extra Item 2', 'stock_uom':'Nos',
-				'qty': 10, 'warehouse': '_Test Warehouse - _TC', 'item_name':'Test Extra Item 2'}]
+			{
+				"item_code": item_code,
+				"rm_item_code": "Sub Contracted Raw Material 1",
+				"item_name": "_Test Item",
+				"qty": 10,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
+			},
+			{
+				"item_code": item_code,
+				"rm_item_code": "_Test Item Home Desktop 100",
+				"item_name": "_Test Item Home Desktop 100",
+				"qty": 20,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
+			},
+			{
+				"item_code": item_code,
+				"rm_item_code": "Test Extra Item 1",
+				"item_name": "Test Extra Item 1",
+				"qty": 10,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
+			},
+			{
+				"item_code": item_code,
+				"rm_item_code": "Test Extra Item 2",
+				"stock_uom": "Nos",
+				"qty": 10,
+				"warehouse": "_Test Warehouse - _TC",
+				"item_name": "Test Extra Item 2",
+			},
+		]
 
 		rm_item_string = json.dumps(rm_items)
 		se = frappe.get_doc(make_subcontract_transfer_entry(po.name, rm_item_string))
@@ -851,61 +1020,80 @@
 
 		received_qty = 2
 		# partial receipt
-		pr.get('items')[0].qty = received_qty
+		pr.get("items")[0].qty = received_qty
 		pr.save()
 		pr.submit()
 
-		transferred_items = sorted([d.item_code for d in se.get('items') if se.purchase_order == po.name])
-		issued_items = sorted([d.rm_item_code for d in pr.get('supplied_items')])
+		transferred_items = sorted(
+			[d.item_code for d in se.get("items") if se.purchase_order == po.name]
+		)
+		issued_items = sorted([d.rm_item_code for d in pr.get("supplied_items")])
 
 		self.assertEqual(transferred_items, issued_items)
-		self.assertEqual(pr.get('items')[0].rm_supp_cost, 2000)
-
+		self.assertEqual(pr.get("items")[0].rm_supp_cost, 2000)
 
 		transferred_rm_map = frappe._dict()
 		for item in rm_items:
-			transferred_rm_map[item.get('rm_item_code')] = item
+			transferred_rm_map[item.get("rm_item_code")] = item
 
 		update_backflush_based_on("BOM")
 
 	def test_supplied_qty_against_subcontracted_po(self):
 		item_code = "_Test Subcontracted FG Item 5"
-		make_item('Sub Contracted Raw Material 4', {
-			'is_stock_item': 1,
-			'is_sub_contracted_item': 1
-		})
+		make_item("Sub Contracted Raw Material 4", {"is_stock_item": 1, "is_sub_contracted_item": 1})
 
 		make_subcontracted_item(item_code=item_code, raw_materials=["Sub Contracted Raw Material 4"])
 
 		update_backflush_based_on("Material Transferred for Subcontract")
 
 		order_qty = 250
-		po = create_purchase_order(item_code=item_code, qty=order_qty,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC", do_not_save=True)
+		po = create_purchase_order(
+			item_code=item_code,
+			qty=order_qty,
+			is_subcontracted="Yes",
+			supplier_warehouse="_Test Warehouse 1 - _TC",
+			do_not_save=True,
+		)
 
 		# Add same subcontracted items multiple times
-		po.append("items", {
-			"item_code": item_code,
-			"qty": order_qty,
-			"schedule_date": add_days(nowdate(), 1),
-			"warehouse": "_Test Warehouse - _TC"
-		})
+		po.append(
+			"items",
+			{
+				"item_code": item_code,
+				"qty": order_qty,
+				"schedule_date": add_days(nowdate(), 1),
+				"warehouse": "_Test Warehouse - _TC",
+			},
+		)
 
 		po.set_missing_values()
 		po.submit()
 
 		# Material receipt entry for the raw materials which will be send to supplier
-		make_stock_entry(target="_Test Warehouse - _TC",
-			item_code = "Sub Contracted Raw Material 4", qty=500, basic_rate=100)
+		make_stock_entry(
+			target="_Test Warehouse - _TC",
+			item_code="Sub Contracted Raw Material 4",
+			qty=500,
+			basic_rate=100,
+		)
 
 		rm_items = [
 			{
-				"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 4","item_name":"_Test Item",
-				"qty":250,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos", "name": po.supplied_items[0].name
+				"item_code": item_code,
+				"rm_item_code": "Sub Contracted Raw Material 4",
+				"item_name": "_Test Item",
+				"qty": 250,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
+				"name": po.supplied_items[0].name,
 			},
 			{
-				"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 4","item_name":"_Test Item",
-				"qty":250,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos"
+				"item_code": item_code,
+				"rm_item_code": "Sub Contracted Raw Material 4",
+				"item_name": "_Test Item",
+				"qty": 250,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
 			},
 		]
 
@@ -927,8 +1115,10 @@
 
 	def test_advance_payment_entry_unlink_against_purchase_order(self):
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
-		frappe.db.set_value("Accounts Settings", "Accounts Settings",
-			"unlink_advance_payment_on_cancelation_of_order", 1)
+
+		frappe.db.set_value(
+			"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 1
+		)
 
 		po_doc = create_purchase_order()
 
@@ -943,24 +1133,23 @@
 		pe.save(ignore_permissions=True)
 		pe.submit()
 
-		po_doc = frappe.get_doc('Purchase Order', po_doc.name)
+		po_doc = frappe.get_doc("Purchase Order", po_doc.name)
 		po_doc.cancel()
 
-		pe_doc = frappe.get_doc('Payment Entry', pe.name)
+		pe_doc = frappe.get_doc("Payment Entry", pe.name)
 		pe_doc.cancel()
 
-		frappe.db.set_value("Accounts Settings", "Accounts Settings",
-			"unlink_advance_payment_on_cancelation_of_order", 0)
+		frappe.db.set_value(
+			"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 0
+		)
 
 	def test_schedule_date(self):
 		po = create_purchase_order(do_not_submit=True)
 		po.schedule_date = None
-		po.append("items", {
-			"item_code": "_Test Item",
-			"qty": 1,
-			"rate": 100,
-			"schedule_date": add_days(nowdate(), 5)
-		})
+		po.append(
+			"items",
+			{"item_code": "_Test Item", "qty": 1, "rate": 100, "schedule_date": add_days(nowdate(), 5)},
+		)
 		po.save()
 		self.assertEqual(po.schedule_date, add_days(nowdate(), 1))
 
@@ -968,22 +1157,21 @@
 		po.save()
 		self.assertEqual(po.schedule_date, add_days(nowdate(), 2))
 
-
 	def test_po_optional_blanket_order(self):
 		"""
-			Expected result: Blanket order Ordered Quantity should only be affected on Purchase Order with against_blanket_order = 1.
-			Second Purchase Order should not add on to Blanket Orders Ordered Quantity.
+		Expected result: Blanket order Ordered Quantity should only be affected on Purchase Order with against_blanket_order = 1.
+		Second Purchase Order should not add on to Blanket Orders Ordered Quantity.
 		"""
 
-		bo = make_blanket_order(blanket_order_type = "Purchasing", quantity = 10, rate = 10)
+		bo = make_blanket_order(blanket_order_type="Purchasing", quantity=10, rate=10)
 
-		po = create_purchase_order(item_code= "_Test Item", qty = 5, against_blanket_order = 1)
-		po_doc = frappe.get_doc('Purchase Order', po.get('name'))
+		po = create_purchase_order(item_code="_Test Item", qty=5, against_blanket_order=1)
+		po_doc = frappe.get_doc("Purchase Order", po.get("name"))
 		# To test if the PO has a Blanket Order
 		self.assertTrue(po_doc.items[0].blanket_order)
 
-		po = create_purchase_order(item_code= "_Test Item", qty = 5, against_blanket_order = 0)
-		po_doc = frappe.get_doc('Purchase Order', po.get('name'))
+		po = create_purchase_order(item_code="_Test Item", qty=5, against_blanket_order=0)
+		po_doc = frappe.get_doc("Purchase Order", po.get("name"))
 		# To test if the PO does NOT have a Blanket Order
 		self.assertEqual(po_doc.items[0].blanket_order, None)
 
@@ -1001,7 +1189,7 @@
 
 		po = create_purchase_order(qty=10, rate=100, do_not_save=1)
 		create_payment_terms_template()
-		po.payment_terms_template = 'Test Receivable Template'
+		po.payment_terms_template = "Test Receivable Template"
 		po.submit()
 
 		pi = make_purchase_invoice(qty=10, rate=100, do_not_save=1)
@@ -1014,6 +1202,7 @@
 
 		automatically_fetch_payment_terms(enable=0)
 
+
 def make_pr_against_po(po, received_qty=0):
 	pr = make_purchase_receipt(po)
 	pr.get("items")[0].qty = received_qty or 5
@@ -1021,39 +1210,51 @@
 	pr.submit()
 	return pr
 
+
 def make_subcontracted_item(**args):
 	from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
 
 	args = frappe._dict(args)
 
-	if not frappe.db.exists('Item', args.item_code):
-		make_item(args.item_code, {
-			'is_stock_item': 1,
-			'is_sub_contracted_item': 1,
-			'has_batch_no': args.get("has_batch_no") or 0
-		})
+	if not frappe.db.exists("Item", args.item_code):
+		make_item(
+			args.item_code,
+			{
+				"is_stock_item": 1,
+				"is_sub_contracted_item": 1,
+				"has_batch_no": args.get("has_batch_no") or 0,
+			},
+		)
 
 	if not args.raw_materials:
-		if not frappe.db.exists('Item', "Test Extra Item 1"):
-			make_item("Test Extra Item 1", {
-				'is_stock_item': 1,
-			})
+		if not frappe.db.exists("Item", "Test Extra Item 1"):
+			make_item(
+				"Test Extra Item 1",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		if not frappe.db.exists('Item', "Test Extra Item 2"):
-			make_item("Test Extra Item 2", {
-				'is_stock_item': 1,
-			})
+		if not frappe.db.exists("Item", "Test Extra Item 2"):
+			make_item(
+				"Test Extra Item 2",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		args.raw_materials = ['_Test FG Item', 'Test Extra Item 1']
+		args.raw_materials = ["_Test FG Item", "Test Extra Item 1"]
 
-	if not frappe.db.get_value('BOM', {'item': args.item_code}, 'name'):
-		make_bom(item = args.item_code, raw_materials = args.get("raw_materials"))
+	if not frappe.db.get_value("BOM", {"item": args.item_code}, "name"):
+		make_bom(item=args.item_code, raw_materials=args.get("raw_materials"))
+
 
 def update_backflush_based_on(based_on):
-	doc = frappe.get_doc('Buying Settings')
+	doc = frappe.get_doc("Buying Settings")
 	doc.backflush_raw_materials_of_subcontract_based_on = based_on
 	doc.save()
 
+
 def get_same_items():
 	return [
 		{
@@ -1061,17 +1262,18 @@
 			"warehouse": "_Test Warehouse - _TC",
 			"qty": 1,
 			"rate": 500,
-			"schedule_date": add_days(nowdate(), 1)
+			"schedule_date": add_days(nowdate(), 1),
 		},
 		{
 			"item_code": "_Test FG Item",
 			"warehouse": "_Test Warehouse - _TC",
 			"qty": 4,
 			"rate": 500,
-			"schedule_date": add_days(nowdate(), 1)
-		}
+			"schedule_date": add_days(nowdate(), 1),
+		},
 	]
 
+
 def create_purchase_order(**args):
 	po = frappe.new_doc("Purchase Order")
 	args = frappe._dict(args)
@@ -1082,7 +1284,7 @@
 	po.company = args.company or "_Test Company"
 	po.supplier = args.supplier or "_Test Supplier"
 	po.is_subcontracted = args.is_subcontracted or "No"
-	po.currency = args.currency or frappe.get_cached_value('Company',  po.company,  "default_currency")
+	po.currency = args.currency or frappe.get_cached_value("Company", po.company, "default_currency")
 	po.conversion_factor = args.conversion_factor or 1
 	po.supplier_warehouse = args.supplier_warehouse or None
 
@@ -1090,15 +1292,18 @@
 		for row in args.rm_items:
 			po.append("items", row)
 	else:
-		po.append("items", {
-			"item_code": args.item or args.item_code or "_Test Item",
-			"warehouse": args.warehouse or "_Test Warehouse - _TC",
-			"qty": args.qty or 10,
-			"rate": args.rate or 500,
-			"schedule_date": add_days(nowdate(), 1),
-			"include_exploded_items": args.get('include_exploded_items', 1),
-			"against_blanket_order": args.against_blanket_order
-		})
+		po.append(
+			"items",
+			{
+				"item_code": args.item or args.item_code or "_Test Item",
+				"warehouse": args.warehouse or "_Test Warehouse - _TC",
+				"qty": args.qty or 10,
+				"rate": args.rate or 500,
+				"schedule_date": add_days(nowdate(), 1),
+				"include_exploded_items": args.get("include_exploded_items", 1),
+				"against_blanket_order": args.against_blanket_order,
+			},
+		)
 
 	po.set_missing_values()
 	if not args.do_not_save:
@@ -1113,6 +1318,7 @@
 
 	return po
 
+
 def create_pr_against_po(po, received_qty=4):
 	pr = make_purchase_receipt(po)
 	pr.get("items")[0].qty = received_qty
@@ -1120,14 +1326,19 @@
 	pr.submit()
 	return pr
 
+
 def get_ordered_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"):
-	return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
-		"ordered_qty"))
+	return flt(
+		frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "ordered_qty")
+	)
+
 
 def get_requested_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"):
-	return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
-		"indented_qty"))
+	return flt(
+		frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty")
+	)
+
 
 test_dependencies = ["BOM", "Item Price"]
 
-test_records = frappe.get_test_records('Purchase Order')
+test_records = frappe.get_test_records("Purchase Order")
diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.py b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.py
index 0cef0de..a8bafda 100644
--- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.py
+++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.py
@@ -9,5 +9,6 @@
 class PurchaseOrderItem(Document):
 	pass
 
+
 def on_doctype_update():
 	frappe.db.add_index("Purchase Order Item", ["item_code", "warehouse"])
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
index 2db750e..d39aec1 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
@@ -20,6 +20,7 @@
 
 STANDARD_USERS = ("Guest", "Administrator")
 
+
 class RequestforQuotation(BuyingController):
 	def validate(self):
 		self.validate_duplicate_supplier()
@@ -30,7 +31,7 @@
 
 		if self.docstatus < 1:
 			# after amend and save, status still shows as cancelled, until submit
-			frappe.db.set(self, 'status', 'Draft')
+			frappe.db.set(self, "status", "Draft")
 
 	def validate_duplicate_supplier(self):
 		supplier_list = [d.supplier for d in self.suppliers]
@@ -39,14 +40,24 @@
 
 	def validate_supplier_list(self):
 		for d in self.suppliers:
-			prevent_rfqs = frappe.db.get_value("Supplier", d.supplier, 'prevent_rfqs')
+			prevent_rfqs = frappe.db.get_value("Supplier", d.supplier, "prevent_rfqs")
 			if prevent_rfqs:
-				standing = frappe.db.get_value("Supplier Scorecard",d.supplier, 'status')
-				frappe.throw(_("RFQs are not allowed for {0} due to a scorecard standing of {1}").format(d.supplier, standing))
-			warn_rfqs = frappe.db.get_value("Supplier", d.supplier, 'warn_rfqs')
+				standing = frappe.db.get_value("Supplier Scorecard", d.supplier, "status")
+				frappe.throw(
+					_("RFQs are not allowed for {0} due to a scorecard standing of {1}").format(
+						d.supplier, standing
+					)
+				)
+			warn_rfqs = frappe.db.get_value("Supplier", d.supplier, "warn_rfqs")
 			if warn_rfqs:
-				standing = frappe.db.get_value("Supplier Scorecard",d.supplier, 'status')
-				frappe.msgprint(_("{0} currently has a {1} Supplier Scorecard standing, and RFQs to this supplier should be issued with caution.").format(d.supplier, standing), title=_("Caution"), indicator='orange')
+				standing = frappe.db.get_value("Supplier Scorecard", d.supplier, "status")
+				frappe.msgprint(
+					_(
+						"{0} currently has a {1} Supplier Scorecard standing, and RFQs to this supplier should be issued with caution."
+					).format(d.supplier, standing),
+					title=_("Caution"),
+					indicator="orange",
+				)
 
 	def update_email_id(self):
 		for rfq_supplier in self.suppliers:
@@ -55,17 +66,21 @@
 
 	def validate_email_id(self, args):
 		if not args.email_id:
-			frappe.throw(_("Row {0}: For Supplier {1}, Email Address is Required to send an email").format(args.idx, frappe.bold(args.supplier)))
+			frappe.throw(
+				_("Row {0}: For Supplier {1}, Email Address is Required to send an email").format(
+					args.idx, frappe.bold(args.supplier)
+				)
+			)
 
 	def on_submit(self):
-		frappe.db.set(self, 'status', 'Submitted')
+		frappe.db.set(self, "status", "Submitted")
 		for supplier in self.suppliers:
 			supplier.email_sent = 0
-			supplier.quote_status = 'Pending'
+			supplier.quote_status = "Pending"
 		self.send_to_supplier()
 
 	def on_cancel(self):
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 
 	@frappe.whitelist()
 	def get_supplier_email_preview(self, supplier):
@@ -75,7 +90,7 @@
 
 		self.validate_email_id(rfq_supplier)
 
-		message  = self.supplier_rfq_mail(rfq_supplier, '', self.get_link(), True)
+		message = self.supplier_rfq_mail(rfq_supplier, "", self.get_link(), True)
 
 		return message
 
@@ -102,12 +117,13 @@
 	def update_supplier_part_no(self, supplier):
 		self.vendor = supplier
 		for item in self.items:
-			item.supplier_part_no = frappe.db.get_value('Item Supplier',
-				{'parent': item.item_code, 'supplier': supplier}, 'supplier_part_no')
+			item.supplier_part_no = frappe.db.get_value(
+				"Item Supplier", {"parent": item.item_code, "supplier": supplier}, "supplier_part_no"
+			)
 
 	def update_supplier_contact(self, rfq_supplier, link):
-		'''Create a new user for the supplier if not set in contact'''
-		update_password_link, contact = '', ''
+		"""Create a new user for the supplier if not set in contact"""
+		update_password_link, contact = "", ""
 
 		if frappe.db.exists("User", rfq_supplier.email_id):
 			user = frappe.get_doc("User", rfq_supplier.email_id)
@@ -125,14 +141,8 @@
 		else:
 			contact = frappe.new_doc("Contact")
 			contact.first_name = rfq_supplier.supplier_name or rfq_supplier.supplier
-			contact.append('links', {
-				'link_doctype': 'Supplier',
-				'link_name': rfq_supplier.supplier
-			})
-			contact.append('email_ids', {
-				'email_id': user.name,
-				'is_primary': 1
-			})
+			contact.append("links", {"link_doctype": "Supplier", "link_name": rfq_supplier.supplier})
+			contact.append("email_ids", {"email_id": user.name, "is_primary": 1})
 
 		if not contact.email_id and not contact.user:
 			contact.email_id = user.name
@@ -145,39 +155,38 @@
 			return contact.name
 
 	def create_user(self, rfq_supplier, link):
-		user = frappe.get_doc({
-			'doctype': 'User',
-			'send_welcome_email': 0,
-			'email': rfq_supplier.email_id,
-			'first_name': rfq_supplier.supplier_name or rfq_supplier.supplier,
-			'user_type': 'Website User',
-			'redirect_url': link
-		})
+		user = frappe.get_doc(
+			{
+				"doctype": "User",
+				"send_welcome_email": 0,
+				"email": rfq_supplier.email_id,
+				"first_name": rfq_supplier.supplier_name or rfq_supplier.supplier,
+				"user_type": "Website User",
+				"redirect_url": link,
+			}
+		)
 		user.save(ignore_permissions=True)
 		update_password_link = user.reset_password()
 
 		return user, update_password_link
 
 	def supplier_rfq_mail(self, data, update_password_link, rfq_link, preview=False):
-		full_name = get_user_fullname(frappe.session['user'])
+		full_name = get_user_fullname(frappe.session["user"])
 		if full_name == "Guest":
 			full_name = "Administrator"
 
 		# send document dict and some important data from suppliers row
 		# to render message_for_supplier from any template
 		doc_args = self.as_dict()
-		doc_args.update({
-			'supplier': data.get('supplier'),
-			'supplier_name': data.get('supplier_name')
-		})
+		doc_args.update({"supplier": data.get("supplier"), "supplier_name": data.get("supplier_name")})
 
 		args = {
-			'update_password_link': update_password_link,
-			'message': frappe.render_template(self.message_for_supplier, doc_args),
-			'rfq_link': rfq_link,
-			'user_fullname': full_name,
-			'supplier_name' : data.get('supplier_name'),
-			'supplier_salutation' : self.salutation or 'Dear Mx.',
+			"update_password_link": update_password_link,
+			"message": frappe.render_template(self.message_for_supplier, doc_args),
+			"rfq_link": rfq_link,
+			"user_fullname": full_name,
+			"supplier_name": data.get("supplier_name"),
+			"supplier_salutation": self.salutation or "Dear Mx.",
 		}
 
 		subject = self.subject or _("Request for Quotation")
@@ -193,9 +202,16 @@
 		self.send_email(data, sender, subject, message, attachments)
 
 	def send_email(self, data, sender, subject, message, attachments):
-		make(subject = subject, content=message,recipients=data.email_id,
-			sender=sender,attachments = attachments, send_email=True,
-		     	doctype=self.doctype, name=self.name)["name"]
+		make(
+			subject=subject,
+			content=message,
+			recipients=data.email_id,
+			sender=sender,
+			attachments=attachments,
+			send_email=True,
+			doctype=self.doctype,
+			name=self.name,
+		)["name"]
 
 		frappe.msgprint(_("Email Sent to Supplier {0}").format(data.supplier))
 
@@ -207,9 +223,10 @@
 	def update_rfq_supplier_status(self, sup_name=None):
 		for supplier in self.suppliers:
 			if sup_name == None or supplier.supplier == sup_name:
-				quote_status = _('Received')
+				quote_status = _("Received")
 				for item in self.items:
-					sqi_count = frappe.db.sql("""
+					sqi_count = frappe.db.sql(
+						"""
 						SELECT
 							COUNT(sqi.name) as count
 						FROM
@@ -219,42 +236,59 @@
 							AND sqi.docstatus = 1
 							AND sqi.request_for_quotation_item = %(rqi)s
 							AND sqi.parent = sq.name""",
-						{"supplier": supplier.supplier, "rqi": item.name}, as_dict=1)[0]
+						{"supplier": supplier.supplier, "rqi": item.name},
+						as_dict=1,
+					)[0]
 					if (sqi_count.count) == 0:
-						quote_status = _('Pending')
+						quote_status = _("Pending")
 				supplier.quote_status = quote_status
 
 
 @frappe.whitelist()
 def send_supplier_emails(rfq_name):
-	check_portal_enabled('Request for Quotation')
+	check_portal_enabled("Request for Quotation")
 	rfq = frappe.get_doc("Request for Quotation", rfq_name)
-	if rfq.docstatus==1:
+	if rfq.docstatus == 1:
 		rfq.send_to_supplier()
 
+
 def check_portal_enabled(reference_doctype):
-	if not frappe.db.get_value('Portal Menu Item',
-		{'reference_doctype': reference_doctype}, 'enabled'):
-		frappe.throw(_("The Access to Request for Quotation From Portal is Disabled. To Allow Access, Enable it in Portal Settings."))
+	if not frappe.db.get_value(
+		"Portal Menu Item", {"reference_doctype": reference_doctype}, "enabled"
+	):
+		frappe.throw(
+			_(
+				"The Access to Request for Quotation From Portal is Disabled. To Allow Access, Enable it in Portal Settings."
+			)
+		)
+
 
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Request for Quotation'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Request for Quotation"),
+		}
+	)
 	return list_context
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_supplier_contacts(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql("""select `tabContact`.name from `tabContact`, `tabDynamic Link`
+	return frappe.db.sql(
+		"""select `tabContact`.name from `tabContact`, `tabDynamic Link`
 		where `tabDynamic Link`.link_doctype = 'Supplier' and (`tabDynamic Link`.link_name=%(name)s
 		and `tabDynamic Link`.link_name like %(txt)s) and `tabContact`.name = `tabDynamic Link`.parent
-		limit %(start)s, %(page_len)s""", {"start": start, "page_len":page_len, "txt": "%%%s%%" % txt, "name": filters.get('supplier')})
+		limit %(start)s, %(page_len)s""",
+		{"start": start, "page_len": page_len, "txt": "%%%s%%" % txt, "name": filters.get("supplier")},
+	)
+
 
 @frappe.whitelist()
 def make_supplier_quotation_from_rfq(source_name, target_doc=None, for_supplier=None):
@@ -262,28 +296,34 @@
 		if for_supplier:
 			target_doc.supplier = for_supplier
 			args = get_party_details(for_supplier, party_type="Supplier", ignore_permissions=True)
-			target_doc.currency = args.currency or get_party_account_currency('Supplier', for_supplier, source.company)
-			target_doc.buying_price_list = args.buying_price_list or frappe.db.get_value('Buying Settings', None, 'buying_price_list')
+			target_doc.currency = args.currency or get_party_account_currency(
+				"Supplier", for_supplier, source.company
+			)
+			target_doc.buying_price_list = args.buying_price_list or frappe.db.get_value(
+				"Buying Settings", None, "buying_price_list"
+			)
 		set_missing_values(source, target_doc)
 
-	doclist = get_mapped_doc("Request for Quotation", source_name, {
-		"Request for Quotation": {
-			"doctype": "Supplier Quotation",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Request for Quotation Item": {
-			"doctype": "Supplier Quotation Item",
-			"field_map": {
-				"name": "request_for_quotation_item",
-				"parent": "request_for_quotation"
+	doclist = get_mapped_doc(
+		"Request for Quotation",
+		source_name,
+		{
+			"Request for Quotation": {
+				"doctype": "Supplier Quotation",
+				"validation": {"docstatus": ["=", 1]},
 			},
-		}
-	}, target_doc, postprocess)
+			"Request for Quotation Item": {
+				"doctype": "Supplier Quotation Item",
+				"field_map": {"name": "request_for_quotation_item", "parent": "request_for_quotation"},
+			},
+		},
+		target_doc,
+		postprocess,
+	)
 
 	return doclist
 
+
 # This method is used to make supplier quotation from supplier's portal.
 @frappe.whitelist()
 def create_supplier_quotation(doc):
@@ -291,15 +331,19 @@
 		doc = json.loads(doc)
 
 	try:
-		sq_doc = frappe.get_doc({
-			"doctype": "Supplier Quotation",
-			"supplier": doc.get('supplier'),
-			"terms": doc.get("terms"),
-			"company": doc.get("company"),
-			"currency": doc.get('currency') or get_party_account_currency('Supplier', doc.get('supplier'), doc.get('company')),
-			"buying_price_list": doc.get('buying_price_list') or frappe.db.get_value('Buying Settings', None, 'buying_price_list')
-		})
-		add_items(sq_doc, doc.get('supplier'), doc.get('items'))
+		sq_doc = frappe.get_doc(
+			{
+				"doctype": "Supplier Quotation",
+				"supplier": doc.get("supplier"),
+				"terms": doc.get("terms"),
+				"company": doc.get("company"),
+				"currency": doc.get("currency")
+				or get_party_account_currency("Supplier", doc.get("supplier"), doc.get("company")),
+				"buying_price_list": doc.get("buying_price_list")
+				or frappe.db.get_value("Buying Settings", None, "buying_price_list"),
+			}
+		)
+		add_items(sq_doc, doc.get("supplier"), doc.get("items"))
 		sq_doc.flags.ignore_permissions = True
 		sq_doc.run_method("set_missing_values")
 		sq_doc.save()
@@ -308,6 +352,7 @@
 	except Exception:
 		return None
 
+
 def add_items(sq_doc, supplier, items):
 	for data in items:
 		if data.get("qty") > 0:
@@ -316,21 +361,36 @@
 
 			create_rfq_items(sq_doc, supplier, data)
 
+
 def create_rfq_items(sq_doc, supplier, data):
 	args = {}
 
-	for field in ['item_code', 'item_name', 'description', 'qty', 'rate', 'conversion_factor',
-		'warehouse', 'material_request', 'material_request_item', 'stock_qty']:
+	for field in [
+		"item_code",
+		"item_name",
+		"description",
+		"qty",
+		"rate",
+		"conversion_factor",
+		"warehouse",
+		"material_request",
+		"material_request_item",
+		"stock_qty",
+	]:
 		args[field] = data.get(field)
 
-	args.update({
-		"request_for_quotation_item": data.name,
-		"request_for_quotation": data.parent,
-		"supplier_part_no": frappe.db.get_value("Item Supplier",
-			{'parent': data.item_code, 'supplier': supplier}, "supplier_part_no")
-	})
+	args.update(
+		{
+			"request_for_quotation_item": data.name,
+			"request_for_quotation": data.parent,
+			"supplier_part_no": frappe.db.get_value(
+				"Item Supplier", {"parent": data.item_code, "supplier": supplier}, "supplier_part_no"
+			),
+		}
+	)
 
-	sq_doc.append('items', args)
+	sq_doc.append("items", args)
+
 
 @frappe.whitelist()
 def get_pdf(doctype, name, supplier):
@@ -338,15 +398,18 @@
 	if doc:
 		download_pdf(doctype, name, doc=doc)
 
+
 def get_rfq_doc(doctype, name, supplier):
 	if supplier:
 		doc = frappe.get_doc(doctype, name)
 		doc.update_supplier_part_no(supplier)
 		return doc
 
+
 @frappe.whitelist()
-def get_item_from_material_requests_based_on_supplier(source_name, target_doc = None):
-	mr_items_list = frappe.db.sql("""
+def get_item_from_material_requests_based_on_supplier(source_name, target_doc=None):
+	mr_items_list = frappe.db.sql(
+		"""
 		SELECT
 			mr.name, mr_item.item_code
 		FROM
@@ -361,52 +424,65 @@
 			AND mr.status != "Stopped"
 			AND mr.material_request_type = "Purchase"
 			AND mr.docstatus = 1
-			AND mr.per_ordered < 99.99""", {"supplier": source_name}, as_dict=1)
+			AND mr.per_ordered < 99.99""",
+		{"supplier": source_name},
+		as_dict=1,
+	)
 
 	material_requests = {}
 	for d in mr_items_list:
 		material_requests.setdefault(d.name, []).append(d.item_code)
 
 	for mr, items in material_requests.items():
-		target_doc = get_mapped_doc("Material Request", mr, {
-			"Material Request": {
-				"doctype": "Request for Quotation",
-				"validation": {
-					"docstatus": ["=", 1],
-					"material_request_type": ["=", "Purchase"],
-				}
+		target_doc = get_mapped_doc(
+			"Material Request",
+			mr,
+			{
+				"Material Request": {
+					"doctype": "Request for Quotation",
+					"validation": {
+						"docstatus": ["=", 1],
+						"material_request_type": ["=", "Purchase"],
+					},
+				},
+				"Material Request Item": {
+					"doctype": "Request for Quotation Item",
+					"condition": lambda row: row.item_code in items,
+					"field_map": [
+						["name", "material_request_item"],
+						["parent", "material_request"],
+						["uom", "uom"],
+					],
+				},
 			},
-			"Material Request Item": {
-				"doctype": "Request for Quotation Item",
-				"condition": lambda row: row.item_code in items,
-				"field_map": [
-					["name", "material_request_item"],
-					["parent", "material_request"],
-					["uom", "uom"]
-				]
-			}
-		}, target_doc)
+			target_doc,
+		)
 
 	return target_doc
 
+
 @frappe.whitelist()
 def get_supplier_tag():
 	filters = {"document_type": "Supplier"}
-	tags = list(set(tag.tag for tag in frappe.get_all("Tag Link", filters=filters, fields=["tag"]) if tag))
+	tags = list(
+		set(tag.tag for tag in frappe.get_all("Tag Link", filters=filters, fields=["tag"]) if tag)
+	)
 
 	return tags
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_rfq_containing_supplier(doctype, txt, searchfield, start, page_len, filters):
 	conditions = ""
 	if txt:
-		conditions += "and rfq.name like '%%"+txt+"%%' "
+		conditions += "and rfq.name like '%%" + txt + "%%' "
 
 	if filters.get("transaction_date"):
 		conditions += "and rfq.transaction_date = '{0}'".format(filters.get("transaction_date"))
 
-	rfq_data = frappe.db.sql("""
+	rfq_data = frappe.db.sql(
+		"""
 		select
 			distinct rfq.name, rfq.transaction_date,
 			rfq.company
@@ -419,8 +495,11 @@
 			and rfq.company = '{1}'
 			{2}
 		order by rfq.transaction_date ASC
-		limit %(page_len)s offset %(start)s """ \
-		.format(filters.get("supplier"), filters.get("company"), conditions),
-			{"page_len": page_len, "start": start}, as_dict=1)
+		limit %(page_len)s offset %(start)s """.format(
+			filters.get("supplier"), filters.get("company"), conditions
+		),
+		{"page_len": page_len, "start": start},
+		as_dict=1,
+	)
 
 	return rfq_data
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation_dashboard.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation_dashboard.py
index dc1cda1..505e3e0 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation_dashboard.py
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation_dashboard.py
@@ -1,10 +1,8 @@
 def get_data():
 	return {
-		'docstatus': 1,
-		'fieldname': 'request_for_quotation',
-		'transactions': [
-			{
-				'items': ['Supplier Quotation']
-			},
-		]
+		"docstatus": 1,
+		"fieldname": "request_for_quotation",
+		"transactions": [
+			{"items": ["Supplier Quotation"]},
+		],
 	}
diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
index 5b21124..dcdba09 100644
--- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
+++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
@@ -20,36 +20,36 @@
 	def test_quote_status(self):
 		rfq = make_request_for_quotation()
 
-		self.assertEqual(rfq.get('suppliers')[0].quote_status, 'Pending')
-		self.assertEqual(rfq.get('suppliers')[1].quote_status, 'Pending')
+		self.assertEqual(rfq.get("suppliers")[0].quote_status, "Pending")
+		self.assertEqual(rfq.get("suppliers")[1].quote_status, "Pending")
 
 		# Submit the first supplier quotation
-		sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get('suppliers')[0].supplier)
+		sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get("suppliers")[0].supplier)
 		sq.submit()
 
-		rfq.update_rfq_supplier_status() #rfq.get('suppliers')[1].supplier)
+		rfq.update_rfq_supplier_status()  # rfq.get('suppliers')[1].supplier)
 
-		self.assertEqual(rfq.get('suppliers')[0].quote_status, 'Received')
-		self.assertEqual(rfq.get('suppliers')[1].quote_status, 'Pending')
+		self.assertEqual(rfq.get("suppliers")[0].quote_status, "Received")
+		self.assertEqual(rfq.get("suppliers")[1].quote_status, "Pending")
 
 	def test_make_supplier_quotation(self):
 		rfq = make_request_for_quotation()
 
-		sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get('suppliers')[0].supplier)
+		sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get("suppliers")[0].supplier)
 		sq.submit()
 
-		sq1 = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get('suppliers')[1].supplier)
+		sq1 = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get("suppliers")[1].supplier)
 		sq1.submit()
 
-		self.assertEqual(sq.supplier, rfq.get('suppliers')[0].supplier)
-		self.assertEqual(sq.get('items')[0].request_for_quotation, rfq.name)
-		self.assertEqual(sq.get('items')[0].item_code, "_Test Item")
-		self.assertEqual(sq.get('items')[0].qty, 5)
+		self.assertEqual(sq.supplier, rfq.get("suppliers")[0].supplier)
+		self.assertEqual(sq.get("items")[0].request_for_quotation, rfq.name)
+		self.assertEqual(sq.get("items")[0].item_code, "_Test Item")
+		self.assertEqual(sq.get("items")[0].qty, 5)
 
-		self.assertEqual(sq1.supplier, rfq.get('suppliers')[1].supplier)
-		self.assertEqual(sq1.get('items')[0].request_for_quotation, rfq.name)
-		self.assertEqual(sq1.get('items')[0].item_code, "_Test Item")
-		self.assertEqual(sq1.get('items')[0].qty, 5)
+		self.assertEqual(sq1.supplier, rfq.get("suppliers")[1].supplier)
+		self.assertEqual(sq1.get("items")[0].request_for_quotation, rfq.name)
+		self.assertEqual(sq1.get("items")[0].item_code, "_Test Item")
+		self.assertEqual(sq1.get("items")[0].qty, 5)
 
 	def test_make_supplier_quotation_with_special_characters(self):
 		frappe.delete_doc_if_exists("Supplier", "_Test Supplier '1", force=1)
@@ -60,52 +60,50 @@
 
 		rfq = make_request_for_quotation(supplier_data=supplier_wt_appos)
 
-		sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=supplier_wt_appos[0].get("supplier"))
+		sq = make_supplier_quotation_from_rfq(
+			rfq.name, for_supplier=supplier_wt_appos[0].get("supplier")
+		)
 		sq.submit()
 
 		frappe.form_dict = frappe.local("form_dict")
 		frappe.form_dict.name = rfq.name
 
-		self.assertEqual(
-			check_supplier_has_docname_access(supplier_wt_appos[0].get('supplier')),
-			True
-		)
+		self.assertEqual(check_supplier_has_docname_access(supplier_wt_appos[0].get("supplier")), True)
 
 		# reset form_dict
 		frappe.form_dict.name = None
 
 	def test_make_supplier_quotation_from_portal(self):
 		rfq = make_request_for_quotation()
-		rfq.get('items')[0].rate = 100
+		rfq.get("items")[0].rate = 100
 		rfq.supplier = rfq.suppliers[0].supplier
 		supplier_quotation_name = create_supplier_quotation(rfq)
 
-		supplier_quotation_doc = frappe.get_doc('Supplier Quotation', supplier_quotation_name)
+		supplier_quotation_doc = frappe.get_doc("Supplier Quotation", supplier_quotation_name)
 
-		self.assertEqual(supplier_quotation_doc.supplier, rfq.get('suppliers')[0].supplier)
-		self.assertEqual(supplier_quotation_doc.get('items')[0].request_for_quotation, rfq.name)
-		self.assertEqual(supplier_quotation_doc.get('items')[0].item_code, "_Test Item")
-		self.assertEqual(supplier_quotation_doc.get('items')[0].qty, 5)
-		self.assertEqual(supplier_quotation_doc.get('items')[0].amount, 500)
+		self.assertEqual(supplier_quotation_doc.supplier, rfq.get("suppliers")[0].supplier)
+		self.assertEqual(supplier_quotation_doc.get("items")[0].request_for_quotation, rfq.name)
+		self.assertEqual(supplier_quotation_doc.get("items")[0].item_code, "_Test Item")
+		self.assertEqual(supplier_quotation_doc.get("items")[0].qty, 5)
+		self.assertEqual(supplier_quotation_doc.get("items")[0].amount, 500)
 
 	def test_make_multi_uom_supplier_quotation(self):
 		item_code = "_Test Multi UOM RFQ Item"
-		if not frappe.db.exists('Item', item_code):
-			item = make_item(item_code, {'stock_uom': '_Test UOM'})
-			row = item.append('uoms', {
-				'uom': 'Kg',
-				'conversion_factor': 2
-			})
+		if not frappe.db.exists("Item", item_code):
+			item = make_item(item_code, {"stock_uom": "_Test UOM"})
+			row = item.append("uoms", {"uom": "Kg", "conversion_factor": 2})
 			row.db_update()
 
-		rfq = make_request_for_quotation(item_code="_Test Multi UOM RFQ Item", uom="Kg", conversion_factor=2)
-		rfq.get('items')[0].rate = 100
+		rfq = make_request_for_quotation(
+			item_code="_Test Multi UOM RFQ Item", uom="Kg", conversion_factor=2
+		)
+		rfq.get("items")[0].rate = 100
 		rfq.supplier = rfq.suppliers[0].supplier
 
 		self.assertEqual(rfq.items[0].stock_qty, 10)
 
 		supplier_quotation_name = create_supplier_quotation(rfq)
-		supplier_quotation = frappe.get_doc('Supplier Quotation', supplier_quotation_name)
+		supplier_quotation = frappe.get_doc("Supplier Quotation", supplier_quotation_name)
 
 		self.assertEqual(supplier_quotation.items[0].qty, 5)
 		self.assertEqual(supplier_quotation.items[0].stock_qty, 10)
@@ -116,58 +114,62 @@
 		rfq = make_rfq(opportunity.name)
 
 		self.assertEqual(len(rfq.get("items")), len(opportunity.get("items")))
-		rfq.message_for_supplier = 'Please supply the specified items at the best possible rates.'
+		rfq.message_for_supplier = "Please supply the specified items at the best possible rates."
 
 		for item in rfq.items:
 			item.warehouse = "_Test Warehouse - _TC"
 
 		for data in supplier_data:
-			rfq.append('suppliers', data)
+			rfq.append("suppliers", data)
 
-		rfq.status = 'Draft'
+		rfq.status = "Draft"
 		rfq.submit()
 
+
 def make_request_for_quotation(**args):
 	"""
 	:param supplier_data: List containing supplier data
 	"""
 	args = frappe._dict(args)
 	supplier_data = args.get("supplier_data") if args.get("supplier_data") else get_supplier_data()
-	rfq = frappe.new_doc('Request for Quotation')
+	rfq = frappe.new_doc("Request for Quotation")
 	rfq.transaction_date = nowdate()
-	rfq.status = 'Draft'
-	rfq.company = '_Test Company'
-	rfq.message_for_supplier = 'Please supply the specified items at the best possible rates.'
+	rfq.status = "Draft"
+	rfq.company = "_Test Company"
+	rfq.message_for_supplier = "Please supply the specified items at the best possible rates."
 
 	for data in supplier_data:
-		rfq.append('suppliers', data)
+		rfq.append("suppliers", data)
 
-	rfq.append("items", {
-		"item_code": args.item_code or "_Test Item",
-		"description": "_Test Item",
-		"uom": args.uom or "_Test UOM",
-		"stock_uom": args.stock_uom or "_Test UOM",
-		"qty": args.qty or 5,
-		"conversion_factor": args.conversion_factor or 1.0,
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"schedule_date": nowdate()
-	})
+	rfq.append(
+		"items",
+		{
+			"item_code": args.item_code or "_Test Item",
+			"description": "_Test Item",
+			"uom": args.uom or "_Test UOM",
+			"stock_uom": args.stock_uom or "_Test UOM",
+			"qty": args.qty or 5,
+			"conversion_factor": args.conversion_factor or 1.0,
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"schedule_date": nowdate(),
+		},
+	)
 
 	rfq.submit()
 
 	return rfq
 
-def get_supplier_data():
-	return [{
-		"supplier": "_Test Supplier",
-		"supplier_name": "_Test Supplier"
-	},
-	{
-		"supplier": "_Test Supplier 1",
-		"supplier_name": "_Test Supplier 1"
-	}]
 
-supplier_wt_appos = [{
-	"supplier": "_Test Supplier '1",
-	"supplier_name": "_Test Supplier '1",
-}]
+def get_supplier_data():
+	return [
+		{"supplier": "_Test Supplier", "supplier_name": "_Test Supplier"},
+		{"supplier": "_Test Supplier 1", "supplier_name": "_Test Supplier 1"},
+	]
+
+
+supplier_wt_appos = [
+	{
+		"supplier": "_Test Supplier '1",
+		"supplier_name": "_Test Supplier '1",
+	}
+]
diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py
index 4f9ff43..97d0ba0 100644
--- a/erpnext/buying/doctype/supplier/supplier.py
+++ b/erpnext/buying/doctype/supplier/supplier.py
@@ -30,27 +30,27 @@
 
 	def before_save(self):
 		if not self.on_hold:
-			self.hold_type = ''
-			self.release_date = ''
+			self.hold_type = ""
+			self.release_date = ""
 		elif self.on_hold and not self.hold_type:
-			self.hold_type = 'All'
+			self.hold_type = "All"
 
 	def load_dashboard_info(self):
 		info = get_dashboard_info(self.doctype, self.name)
-		self.set_onload('dashboard_info', info)
+		self.set_onload("dashboard_info", info)
 
 	def autoname(self):
-		supp_master_name = frappe.defaults.get_global_default('supp_master_name')
-		if supp_master_name == 'Supplier Name':
+		supp_master_name = frappe.defaults.get_global_default("supp_master_name")
+		if supp_master_name == "Supplier Name":
 			self.name = self.supplier_name
-		elif supp_master_name == 'Naming Series':
+		elif supp_master_name == "Naming Series":
 			set_name_by_naming_series(self)
 		else:
 			self.name = set_name_from_naming_options(frappe.get_meta(self.doctype).autoname, self)
 
 	def on_update(self):
 		if not self.naming_series:
-			self.naming_series = ''
+			self.naming_series = ""
 
 		self.create_primary_contact()
 		self.create_primary_address()
@@ -59,7 +59,7 @@
 		self.flags.is_new_doc = self.is_new()
 
 		# validation for Naming Series mandatory field...
-		if frappe.defaults.get_global_default('supp_master_name') == 'Naming Series':
+		if frappe.defaults.get_global_default("supp_master_name") == "Naming Series":
 			if not self.naming_series:
 				msgprint(_("Series is mandatory"), raise_exception=1)
 
@@ -68,13 +68,13 @@
 
 	@frappe.whitelist()
 	def get_supplier_group_details(self):
-		doc = frappe.get_doc('Supplier Group', self.supplier_group)
+		doc = frappe.get_doc("Supplier Group", self.supplier_group)
 		self.payment_terms = ""
 		self.accounts = []
 
 		if doc.accounts:
 			for account in doc.accounts:
-				child = self.append('accounts')
+				child = self.append("accounts")
 				child.company = account.company
 				child.account = account.account
 
@@ -84,12 +84,22 @@
 		self.save()
 
 	def validate_internal_supplier(self):
-		internal_supplier = frappe.db.get_value("Supplier",
-			{"is_internal_supplier": 1, "represents_company": self.represents_company, "name": ("!=", self.name)}, "name")
+		internal_supplier = frappe.db.get_value(
+			"Supplier",
+			{
+				"is_internal_supplier": 1,
+				"represents_company": self.represents_company,
+				"name": ("!=", self.name),
+			},
+			"name",
+		)
 
 		if internal_supplier:
-			frappe.throw(_("Internal Supplier for company {0} already exists").format(
-				frappe.bold(self.represents_company)))
+			frappe.throw(
+				_("Internal Supplier for company {0} already exists").format(
+					frappe.bold(self.represents_company)
+				)
+			)
 
 	def create_primary_contact(self):
 		from erpnext.selling.doctype.customer.customer import make_contact
@@ -97,16 +107,16 @@
 		if not self.supplier_primary_contact:
 			if self.mobile_no or self.email_id:
 				contact = make_contact(self)
-				self.db_set('supplier_primary_contact', contact.name)
-				self.db_set('mobile_no', self.mobile_no)
-				self.db_set('email_id', self.email_id)
+				self.db_set("supplier_primary_contact", contact.name)
+				self.db_set("mobile_no", self.mobile_no)
+				self.db_set("email_id", self.email_id)
 
 	def create_primary_address(self):
 		from frappe.contacts.doctype.address.address import get_address_display
 
 		from erpnext.selling.doctype.customer.customer import make_address
 
-		if self.flags.is_new_doc and self.get('address_line1'):
+		if self.flags.is_new_doc and self.get("address_line1"):
 			address = make_address(self)
 			address_display = get_address_display(address.name)
 
@@ -115,7 +125,8 @@
 
 	def on_trash(self):
 		if self.supplier_primary_contact:
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				UPDATE `tabSupplier`
 				SET
 					supplier_primary_contact=null,
@@ -123,19 +134,23 @@
 					mobile_no=null,
 					email_id=null,
 					primary_address=null
-				WHERE name=%(name)s""", {"name": self.name})
+				WHERE name=%(name)s""",
+				{"name": self.name},
+			)
 
-		delete_contact_and_address('Supplier', self.name)
+		delete_contact_and_address("Supplier", self.name)
 
 	def after_rename(self, olddn, newdn, merge=False):
-		if frappe.defaults.get_global_default('supp_master_name') == 'Supplier Name':
+		if frappe.defaults.get_global_default("supp_master_name") == "Supplier Name":
 			frappe.db.set(self, "supplier_name", newdn)
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_supplier_primary_contact(doctype, txt, searchfield, start, page_len, filters):
 	supplier = filters.get("supplier")
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			`tabContact`.name from `tabContact`,
 			`tabDynamic Link`
@@ -144,7 +159,6 @@
 			and `tabDynamic Link`.link_name = %(supplier)s
 			and `tabDynamic Link`.link_doctype = 'Supplier'
 			and `tabContact`.name like %(txt)s
-		""", {
-			'supplier': supplier,
-			'txt': '%%%s%%' % txt
-		})
+		""",
+		{"supplier": supplier, "txt": "%%%s%%" % txt},
+	)
diff --git a/erpnext/buying/doctype/supplier/supplier_dashboard.py b/erpnext/buying/doctype/supplier/supplier_dashboard.py
index 78efd8e..11bb06e 100644
--- a/erpnext/buying/doctype/supplier/supplier_dashboard.py
+++ b/erpnext/buying/doctype/supplier/supplier_dashboard.py
@@ -3,29 +3,16 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on transactions against this Supplier. See timeline below for details'),
-		'fieldname': 'supplier',
-		'non_standard_fieldnames': {
-			'Payment Entry': 'party_name',
-			'Bank Account': 'party'
-		},
-		'transactions': [
-			{
-				'label': _('Procurement'),
-				'items': ['Request for Quotation', 'Supplier Quotation']
-			},
-			{
-				'label': _('Orders'),
-				'items': ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']
-			},
-			{
-				'label': _('Payments'),
-				'items': ['Payment Entry', 'Bank Account']
-			},
-			{
-				'label': _('Pricing'),
-				'items': ['Pricing Rule']
-			}
-		]
+		"heatmap": True,
+		"heatmap_message": _(
+			"This is based on transactions against this Supplier. See timeline below for details"
+		),
+		"fieldname": "supplier",
+		"non_standard_fieldnames": {"Payment Entry": "party_name", "Bank Account": "party"},
+		"transactions": [
+			{"label": _("Procurement"), "items": ["Request for Quotation", "Supplier Quotation"]},
+			{"label": _("Orders"), "items": ["Purchase Order", "Purchase Receipt", "Purchase Invoice"]},
+			{"label": _("Payments"), "items": ["Payment Entry", "Bank Account"]},
+			{"label": _("Pricing"), "items": ["Pricing Rule"]},
+		],
 	}
diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py
index 7358e2a..5572268 100644
--- a/erpnext/buying/doctype/supplier/test_supplier.py
+++ b/erpnext/buying/doctype/supplier/test_supplier.py
@@ -8,8 +8,8 @@
 from erpnext.accounts.party import get_due_date
 from erpnext.exceptions import PartyDisabled
 
-test_dependencies = ['Payment Term', 'Payment Terms Template']
-test_records = frappe.get_test_records('Supplier')
+test_dependencies = ["Payment Term", "Payment Terms Template"]
+test_records = frappe.get_test_records("Supplier")
 
 from frappe.tests.utils import FrappeTestCase
 
@@ -42,7 +42,8 @@
 	def test_supplier_default_payment_terms(self):
 		# Payment Term based on Days after invoice date
 		frappe.db.set_value(
-			"Supplier", "_Test Supplier With Template 1", "payment_terms", "_Test Payment Term Template 3")
+			"Supplier", "_Test Supplier With Template 1", "payment_terms", "_Test Payment Term Template 3"
+		)
 
 		due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1")
 		self.assertEqual(due_date, "2016-02-21")
@@ -52,7 +53,8 @@
 
 		# Payment Term based on last day of month
 		frappe.db.set_value(
-			"Supplier", "_Test Supplier With Template 1", "payment_terms", "_Test Payment Term Template 1")
+			"Supplier", "_Test Supplier With Template 1", "payment_terms", "_Test Payment Term Template 1"
+		)
 
 		due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1")
 		self.assertEqual(due_date, "2016-02-29")
@@ -63,13 +65,17 @@
 		frappe.db.set_value("Supplier", "_Test Supplier With Template 1", "payment_terms", "")
 
 		# Set credit limit for the supplier group instead of supplier and evaluate the due date
-		frappe.db.set_value("Supplier Group", "_Test Supplier Group", "payment_terms", "_Test Payment Term Template 3")
+		frappe.db.set_value(
+			"Supplier Group", "_Test Supplier Group", "payment_terms", "_Test Payment Term Template 3"
+		)
 
 		due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1")
 		self.assertEqual(due_date, "2016-02-21")
 
 		# Payment terms for Supplier Group instead of supplier and evaluate the due date
-		frappe.db.set_value("Supplier Group", "_Test Supplier Group", "payment_terms", "_Test Payment Term Template 1")
+		frappe.db.set_value(
+			"Supplier Group", "_Test Supplier Group", "payment_terms", "_Test Payment Term Template 1"
+		)
 
 		# Leap year
 		due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1")
@@ -105,15 +111,15 @@
 
 	def test_supplier_country(self):
 		# Test that country field exists in Supplier DocType
-		supplier = frappe.get_doc('Supplier', '_Test Supplier with Country')
-		self.assertTrue('country' in supplier.as_dict())
+		supplier = frappe.get_doc("Supplier", "_Test Supplier with Country")
+		self.assertTrue("country" in supplier.as_dict())
 
 		# Test if test supplier field record is 'Greece'
 		self.assertEqual(supplier.country, "Greece")
 
 		# Test update Supplier instance country value
-		supplier = frappe.get_doc('Supplier', '_Test Supplier')
-		supplier.country = 'Greece'
+		supplier = frappe.get_doc("Supplier", "_Test Supplier")
+		supplier.country = "Greece"
 		supplier.save()
 		self.assertEqual(supplier.country, "Greece")
 
@@ -126,19 +132,18 @@
 		details = get_party_details("_Test Supplier With Tax Category", party_type="Supplier")
 		self.assertEqual(details.tax_category, "_Test Tax Category 1")
 
-		address = frappe.get_doc(dict(
-			doctype='Address',
-			address_title='_Test Address With Tax Category',
-			tax_category='_Test Tax Category 2',
-			address_type='Billing',
-			address_line1='Station Road',
-			city='_Test City',
-			country='India',
-			links=[dict(
-				link_doctype='Supplier',
-				link_name='_Test Supplier With Tax Category'
-			)]
-		)).insert()
+		address = frappe.get_doc(
+			dict(
+				doctype="Address",
+				address_title="_Test Address With Tax Category",
+				tax_category="_Test Tax Category 2",
+				address_type="Billing",
+				address_line1="Station Road",
+				city="_Test City",
+				country="India",
+				links=[dict(link_doctype="Supplier", link_name="_Test Supplier With Tax Category")],
+			)
+		).insert()
 
 		# Tax Category with Address
 		details = get_party_details("_Test Supplier With Tax Category", party_type="Supplier")
@@ -147,18 +152,21 @@
 		# Rollback
 		address.delete()
 
+
 def create_supplier(**args):
 	args = frappe._dict(args)
 
 	if frappe.db.exists("Supplier", args.supplier_name):
 		return frappe.get_doc("Supplier", args.supplier_name)
 
-	doc = frappe.get_doc({
-		"doctype": "Supplier",
-		"supplier_name": args.supplier_name,
-		"supplier_group": args.supplier_group or "Services",
-		"supplier_type": args.supplier_type or "Company",
-		"tax_withholding_category": args.tax_withholding_category
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Supplier",
+			"supplier_name": args.supplier_name,
+			"supplier_group": args.supplier_group or "Services",
+			"supplier_type": args.supplier_type or "Company",
+			"tax_withholding_category": args.tax_withholding_category,
+		}
+	).insert()
 
 	return doc
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py
index d578863..c19c1df 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py
@@ -10,9 +10,8 @@
 from erpnext.buying.utils import validate_for_items
 from erpnext.controllers.buying_controller import BuyingController
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class SupplierQuotation(BuyingController):
 	def validate(self):
@@ -22,8 +21,8 @@
 			self.status = "Draft"
 
 		from erpnext.controllers.status_updater import validate_status
-		validate_status(self.status, ["Draft", "Submitted", "Stopped",
-			"Cancelled"])
+
+		validate_status(self.status, ["Draft", "Submitted", "Stopped", "Cancelled"])
 
 		validate_for_items(self)
 		self.validate_with_previous_doc()
@@ -42,17 +41,19 @@
 		pass
 
 	def validate_with_previous_doc(self):
-		super(SupplierQuotation, self).validate_with_previous_doc({
-			"Material Request": {
-				"ref_dn_field": "prevdoc_docname",
-				"compare_fields": [["company", "="]],
-			},
-			"Material Request Item": {
-				"ref_dn_field": "prevdoc_detail_docname",
-				"compare_fields": [["item_code", "="], ["uom", "="]],
-				"is_child_table": True
+		super(SupplierQuotation, self).validate_with_previous_doc(
+			{
+				"Material Request": {
+					"ref_dn_field": "prevdoc_docname",
+					"compare_fields": [["company", "="]],
+				},
+				"Material Request Item": {
+					"ref_dn_field": "prevdoc_detail_docname",
+					"compare_fields": [["item_code", "="], ["uom", "="]],
+					"is_child_table": True,
+				},
 			}
-		})
+		)
 
 	def validate_valid_till(self):
 		if self.valid_till and getdate(self.valid_till) < getdate(self.transaction_date):
@@ -64,18 +65,28 @@
 			if item.request_for_quotation:
 				rfq_list.add(item.request_for_quotation)
 		for rfq in rfq_list:
-			doc = frappe.get_doc('Request for Quotation', rfq)
-			doc_sup = frappe.get_all('Request for Quotation Supplier', filters=
-				{'parent': doc.name, 'supplier': self.supplier}, fields=['name', 'quote_status'])
+			doc = frappe.get_doc("Request for Quotation", rfq)
+			doc_sup = frappe.get_all(
+				"Request for Quotation Supplier",
+				filters={"parent": doc.name, "supplier": self.supplier},
+				fields=["name", "quote_status"],
+			)
 
 			doc_sup = doc_sup[0] if doc_sup else None
 			if not doc_sup:
-				frappe.throw(_("Supplier {0} not found in {1}").format(self.supplier,
-					"<a href='desk/app/Form/Request for Quotation/{0}'> Request for Quotation {0} </a>".format(doc.name)))
+				frappe.throw(
+					_("Supplier {0} not found in {1}").format(
+						self.supplier,
+						"<a href='desk/app/Form/Request for Quotation/{0}'> Request for Quotation {0} </a>".format(
+							doc.name
+						),
+					)
+				)
 
-			quote_status = _('Received')
+			quote_status = _("Received")
 			for item in doc.items:
-				sqi_count = frappe.db.sql("""
+				sqi_count = frappe.db.sql(
+					"""
 					SELECT
 						COUNT(sqi.name) as count
 					FROM
@@ -86,26 +97,38 @@
 						AND sq.name != %(me)s
 						AND sqi.request_for_quotation_item = %(rqi)s
 						AND sqi.parent = sq.name""",
-					{"supplier": self.supplier, "rqi": item.name, 'me': self.name}, as_dict=1)[0]
-				self_count = sum(my_item.request_for_quotation_item == item.name
-					for my_item in self.items) if include_me else 0
+					{"supplier": self.supplier, "rqi": item.name, "me": self.name},
+					as_dict=1,
+				)[0]
+				self_count = (
+					sum(my_item.request_for_quotation_item == item.name for my_item in self.items)
+					if include_me
+					else 0
+				)
 				if (sqi_count.count + self_count) == 0:
-					quote_status = _('Pending')
+					quote_status = _("Pending")
 
-				frappe.db.set_value('Request for Quotation Supplier', doc_sup.name, 'quote_status', quote_status)
+				frappe.db.set_value(
+					"Request for Quotation Supplier", doc_sup.name, "quote_status", quote_status
+				)
+
 
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Supplier Quotation'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Supplier Quotation"),
+		}
+	)
 
 	return list_context
 
+
 @frappe.whitelist()
 def make_purchase_order(source_name, target_doc=None):
 	def set_missing_values(source, target):
@@ -116,74 +139,91 @@
 	def update_item(obj, target, source_parent):
 		target.stock_qty = flt(obj.qty) * flt(obj.conversion_factor)
 
-	doclist = get_mapped_doc("Supplier Quotation", source_name,		{
-		"Supplier Quotation": {
-			"doctype": "Purchase Order",
-			"validation": {
-				"docstatus": ["=", 1],
-			}
+	doclist = get_mapped_doc(
+		"Supplier Quotation",
+		source_name,
+		{
+			"Supplier Quotation": {
+				"doctype": "Purchase Order",
+				"validation": {
+					"docstatus": ["=", 1],
+				},
+			},
+			"Supplier Quotation Item": {
+				"doctype": "Purchase Order Item",
+				"field_map": [
+					["name", "supplier_quotation_item"],
+					["parent", "supplier_quotation"],
+					["material_request", "material_request"],
+					["material_request_item", "material_request_item"],
+					["sales_order", "sales_order"],
+				],
+				"postprocess": update_item,
+			},
+			"Purchase Taxes and Charges": {
+				"doctype": "Purchase Taxes and Charges",
+			},
 		},
-		"Supplier Quotation Item": {
-			"doctype": "Purchase Order Item",
-			"field_map": [
-				["name", "supplier_quotation_item"],
-				["parent", "supplier_quotation"],
-				["material_request", "material_request"],
-				["material_request_item", "material_request_item"],
-				["sales_order", "sales_order"]
-			],
-			"postprocess": update_item
-		},
-		"Purchase Taxes and Charges": {
-			"doctype": "Purchase Taxes and Charges",
-		},
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 	return doclist
 
+
 @frappe.whitelist()
 def make_purchase_invoice(source_name, target_doc=None):
-	doc = get_mapped_doc("Supplier Quotation", source_name, {
-		"Supplier Quotation": {
-			"doctype": "Purchase Invoice",
-			"validation": {
-				"docstatus": ["=", 1],
-			}
+	doc = get_mapped_doc(
+		"Supplier Quotation",
+		source_name,
+		{
+			"Supplier Quotation": {
+				"doctype": "Purchase Invoice",
+				"validation": {
+					"docstatus": ["=", 1],
+				},
+			},
+			"Supplier Quotation Item": {"doctype": "Purchase Invoice Item"},
+			"Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges"},
 		},
-		"Supplier Quotation Item": {
-			"doctype": "Purchase Invoice Item"
-		},
-		"Purchase Taxes and Charges": {
-			"doctype": "Purchase Taxes and Charges"
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doc
 
 
 @frappe.whitelist()
 def make_quotation(source_name, target_doc=None):
-	doclist = get_mapped_doc("Supplier Quotation", source_name, {
-		"Supplier Quotation": {
-			"doctype": "Quotation",
-			"field_map": {
-				"name": "supplier_quotation",
-			}
+	doclist = get_mapped_doc(
+		"Supplier Quotation",
+		source_name,
+		{
+			"Supplier Quotation": {
+				"doctype": "Quotation",
+				"field_map": {
+					"name": "supplier_quotation",
+				},
+			},
+			"Supplier Quotation Item": {
+				"doctype": "Quotation Item",
+				"condition": lambda doc: frappe.db.get_value("Item", doc.item_code, "is_sales_item") == 1,
+				"add_if_empty": True,
+			},
 		},
-		"Supplier Quotation Item": {
-			"doctype": "Quotation Item",
-			"condition": lambda doc: frappe.db.get_value("Item", doc.item_code, "is_sales_item")==1,
-			"add_if_empty": True
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
 
+
 def set_expired_status():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE
 			`tabSupplier Quotation` SET `status` = 'Expired'
 		WHERE
 			`status` not in ('Cancelled', 'Stopped') AND `valid_till` < %s
-		""", (nowdate()))
+		""",
+		(nowdate()),
+	)
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py b/erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py
index 236b91a..369fc94 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py
@@ -3,28 +3,16 @@
 
 def get_data():
 	return {
-		'fieldname': 'supplier_quotation',
-		'non_standard_fieldnames': {
-			'Auto Repeat': 'reference_document'
+		"fieldname": "supplier_quotation",
+		"non_standard_fieldnames": {"Auto Repeat": "reference_document"},
+		"internal_links": {
+			"Material Request": ["items", "material_request"],
+			"Request for Quotation": ["items", "request_for_quotation"],
+			"Project": ["items", "project"],
 		},
-		'internal_links': {
-			'Material Request': ['items', 'material_request'],
-			'Request for Quotation': ['items', 'request_for_quotation'],
-			'Project': ['items', 'project'],
-		},
-		'transactions': [
-			{
-				'label': _('Related'),
-				'items': ['Purchase Order', 'Quotation']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Material Request', 'Request for Quotation', 'Project']
-			},
-			{
-				'label': _('Subscription'),
-				'items': ['Auto Repeat']
-			},
-		]
-
+		"transactions": [
+			{"label": _("Related"), "items": ["Purchase Order", "Quotation"]},
+			{"label": _("Reference"), "items": ["Material Request", "Request for Quotation", "Project"]},
+			{"label": _("Subscription"), "items": ["Auto Repeat"]},
+		],
 	}
diff --git a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
index a4d4597..13c851c 100644
--- a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
+++ b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
@@ -2,8 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
-
 import frappe
 from frappe.tests.utils import FrappeTestCase
 
@@ -14,8 +12,7 @@
 
 		sq = frappe.copy_doc(test_records[0]).insert()
 
-		self.assertRaises(frappe.ValidationError, make_purchase_order,
-			sq.name)
+		self.assertRaises(frappe.ValidationError, make_purchase_order, sq.name)
 
 		sq = frappe.get_doc("Supplier Quotation", sq.name)
 		sq.submit()
@@ -32,4 +29,5 @@
 
 		po.insert()
 
-test_records = frappe.get_test_records('Supplier Quotation')
+
+test_records = frappe.get_test_records("Supplier Quotation")
diff --git a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py
index 3bcc0de..992bc80 100644
--- a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py
+++ b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py
@@ -16,7 +16,6 @@
 
 
 class SupplierScorecard(Document):
-
 	def validate(self):
 		self.validate_standings()
 		self.validate_criteria_weights()
@@ -34,12 +33,16 @@
 		for c1 in self.standings:
 			for c2 in self.standings:
 				if c1 != c2:
-					if (c1.max_grade > c2.min_grade and c1.min_grade < c2.max_grade):
-						throw(_('Overlap in scoring between {0} and {1}').format(c1.standing_name,c2.standing_name))
+					if c1.max_grade > c2.min_grade and c1.min_grade < c2.max_grade:
+						throw(_("Overlap in scoring between {0} and {1}").format(c1.standing_name, c2.standing_name))
 				if c2.min_grade == score:
 					score = c2.max_grade
 		if score < 100:
-			throw(_('Unable to find score starting at {0}. You need to have standing scores covering 0 to 100').format(score))
+			throw(
+				_(
+					"Unable to find score starting at {0}. You need to have standing scores covering 0 to 100"
+				).format(score)
+			)
 
 	def validate_criteria_weights(self):
 
@@ -48,10 +51,11 @@
 			weight += c.weight
 
 		if weight != 100:
-			throw(_('Criteria weights must add up to 100%'))
+			throw(_("Criteria weights must add up to 100%"))
 
 	def calculate_total_score(self):
-		scorecards = frappe.db.sql("""
+		scorecards = frappe.db.sql(
+			"""
 			SELECT
 				scp.name
 			FROM
@@ -61,18 +65,20 @@
 				AND scp.docstatus = 1
 			ORDER BY
 				scp.end_date DESC""",
-				{"sc": self.name}, as_dict=1)
+			{"sc": self.name},
+			as_dict=1,
+		)
 
 		period = 0
 		total_score = 0
 		total_max_score = 0
 		for scp in scorecards:
-			my_sc = frappe.get_doc('Supplier Scorecard Period', scp.name)
+			my_sc = frappe.get_doc("Supplier Scorecard Period", scp.name)
 			my_scp_weight = self.weighting_function
-			my_scp_weight = my_scp_weight.replace('{period_number}', str(period))
+			my_scp_weight = my_scp_weight.replace("{period_number}", str(period))
 
-			my_scp_maxweight = my_scp_weight.replace('{total_score}', '100')
-			my_scp_weight = my_scp_weight.replace('{total_score}', str(my_sc.total_score))
+			my_scp_maxweight = my_scp_weight.replace("{total_score}", "100")
+			my_scp_weight = my_scp_weight.replace("{total_score}", str(my_sc.total_score))
 
 			max_score = my_sc.calculate_weighted_score(my_scp_maxweight)
 			score = my_sc.calculate_weighted_score(my_scp_weight)
@@ -81,24 +87,25 @@
 			total_max_score += max_score
 			period += 1
 		if total_max_score > 0:
-			self.supplier_score = round(100.0 * (total_score / total_max_score) ,1)
+			self.supplier_score = round(100.0 * (total_score / total_max_score), 1)
 		else:
-			self.supplier_score =  100
+			self.supplier_score = 100
 
 	def update_standing(self):
 		# Get the setup document
 
 		for standing in self.standings:
-			if (not standing.min_grade or (standing.min_grade <= self.supplier_score)) and \
-				(not standing.max_grade or (standing.max_grade > self.supplier_score)):
+			if (not standing.min_grade or (standing.min_grade <= self.supplier_score)) and (
+				not standing.max_grade or (standing.max_grade > self.supplier_score)
+			):
 				self.status = standing.standing_name
 				self.indicator_color = standing.standing_color
 				self.notify_supplier = standing.notify_supplier
 				self.notify_employee = standing.notify_employee
 				self.employee_link = standing.employee_link
 
-				#Update supplier standing info
-				for fieldname in ('prevent_pos', 'prevent_rfqs','warn_rfqs','warn_pos'):
+				# Update supplier standing info
+				for fieldname in ("prevent_pos", "prevent_rfqs", "warn_rfqs", "warn_pos"):
 					self.set(fieldname, standing.get(fieldname))
 					frappe.db.set_value("Supplier", self.supplier, fieldname, self.get(fieldname))
 
@@ -109,7 +116,8 @@
 	scs = frappe.get_doc(doctype, name)
 	out = {}
 	timeline_data = {}
-	scorecards = frappe.db.sql("""
+	scorecards = frappe.db.sql(
+		"""
 		SELECT
 			sc.name
 		FROM
@@ -117,39 +125,48 @@
 		WHERE
 			sc.scorecard = %(scs)s
 			AND sc.docstatus = 1""",
-			{"scs": scs.name}, as_dict=1)
+		{"scs": scs.name},
+		as_dict=1,
+	)
 
 	for sc in scorecards:
-		start_date, end_date, total_score = frappe.db.get_value('Supplier Scorecard Period', sc.name, ['start_date', 'end_date', 'total_score'])
+		start_date, end_date, total_score = frappe.db.get_value(
+			"Supplier Scorecard Period", sc.name, ["start_date", "end_date", "total_score"]
+		)
 		for single_date in daterange(start_date, end_date):
-			timeline_data[time.mktime(single_date.timetuple())] =  total_score
+			timeline_data[time.mktime(single_date.timetuple())] = total_score
 
-	out['timeline_data'] = timeline_data
+	out["timeline_data"] = timeline_data
 	return out
 
+
 def daterange(start_date, end_date):
-    for n in range(int ((end_date - start_date).days)+1):
-        yield start_date + timedelta(n)
+	for n in range(int((end_date - start_date).days) + 1):
+		yield start_date + timedelta(n)
+
 
 def refresh_scorecards():
-	scorecards = frappe.db.sql("""
+	scorecards = frappe.db.sql(
+		"""
 		SELECT
 			sc.name
 		FROM
 			`tabSupplier Scorecard` sc""",
-			{}, as_dict=1)
+		{},
+		as_dict=1,
+	)
 	for sc in scorecards:
 		# Check to see if any new scorecard periods are created
 		if make_all_scorecards(sc.name) > 0:
 			# Save the scorecard to update the score and standings
-			frappe.get_doc('Supplier Scorecard', sc.name).save()
+			frappe.get_doc("Supplier Scorecard", sc.name).save()
 
 
 @frappe.whitelist()
 def make_all_scorecards(docname):
 
-	sc = frappe.get_doc('Supplier Scorecard', docname)
-	supplier = frappe.get_doc('Supplier',sc.supplier)
+	sc = frappe.get_doc("Supplier Scorecard", docname)
+	supplier = frappe.get_doc("Supplier", sc.supplier)
 
 	start_date = getdate(supplier.creation)
 	end_date = get_scorecard_date(sc.period, start_date)
@@ -161,7 +178,8 @@
 
 	while (start_date < todays) and (end_date <= todays):
 		# check to make sure there is no scorecard period already created
-		scorecards = frappe.db.sql("""
+		scorecards = frappe.db.sql(
+			"""
 			SELECT
 				scp.name
 			FROM
@@ -177,7 +195,9 @@
 					AND scp.end_date > %(start_date)s))
 			ORDER BY
 				scp.end_date DESC""",
-				{"sc": docname, "start_date": start_date, "end_date": end_date}, as_dict=1)
+			{"sc": docname, "start_date": start_date, "end_date": end_date},
+			as_dict=1,
+		)
 		if len(scorecards) == 0:
 			period_card = make_supplier_scorecard(docname, None)
 			period_card.start_date = start_date
@@ -189,82 +209,178 @@
 				first_start_date = start_date
 			last_end_date = end_date
 
-		start_date = getdate(add_days(end_date,1))
+		start_date = getdate(add_days(end_date, 1))
 		end_date = get_scorecard_date(sc.period, start_date)
 	if scp_count > 0:
-		frappe.msgprint(_("Created {0} scorecards for {1} between: ").format(scp_count, sc.supplier) + str(first_start_date) + " - " + str(last_end_date))
+		frappe.msgprint(
+			_("Created {0} scorecards for {1} between: ").format(scp_count, sc.supplier)
+			+ str(first_start_date)
+			+ " - "
+			+ str(last_end_date)
+		)
 	return scp_count
 
+
 def get_scorecard_date(period, start_date):
-	if period == 'Per Week':
-		end_date = getdate(add_days(start_date,7))
-	elif period == 'Per Month':
+	if period == "Per Week":
+		end_date = getdate(add_days(start_date, 7))
+	elif period == "Per Month":
 		end_date = get_last_day(start_date)
-	elif period == 'Per Year':
-		end_date = add_days(add_years(start_date,1), -1)
+	elif period == "Per Year":
+		end_date = add_days(add_years(start_date, 1), -1)
 	return end_date
 
+
 def make_default_records():
 	install_variable_docs = [
-		{"param_name": "total_accepted_items", "variable_label": "Total Accepted Items", \
-			"path": "get_total_accepted_items"},
-		{"param_name": "total_accepted_amount", "variable_label": "Total Accepted Amount", \
-			"path": "get_total_accepted_amount"},
-		{"param_name": "total_rejected_items", "variable_label": "Total Rejected Items", \
-			"path": "get_total_rejected_items"},
-		{"param_name": "total_rejected_amount", "variable_label": "Total Rejected Amount", \
-			"path": "get_total_rejected_amount"},
-		{"param_name": "total_received_items", "variable_label": "Total Received Items", \
-			"path": "get_total_received_items"},
-		{"param_name": "total_received_amount", "variable_label": "Total Received Amount", \
-			"path": "get_total_received_amount"},
-		{"param_name": "rfq_response_days", "variable_label": "RFQ Response Days", \
-			"path": "get_rfq_response_days"},
-		{"param_name": "sq_total_items", "variable_label": "SQ Total Items", \
-			"path": "get_sq_total_items"},
-		{"param_name": "sq_total_number", "variable_label": "SQ Total Number", \
-			"path": "get_sq_total_number"},
-		{"param_name": "rfq_total_number", "variable_label": "RFQ Total Number", \
-			"path": "get_rfq_total_number"},
-		{"param_name": "rfq_total_items", "variable_label": "RFQ Total Items", \
-			"path": "get_rfq_total_items"},
-		{"param_name": "tot_item_days", "variable_label": "Total Item Days", \
-			"path": "get_item_workdays"},
-		{"param_name": "on_time_shipment_num", "variable_label": "# of On Time Shipments", "path": \
-			"get_on_time_shipments"},
-		{"param_name": "cost_of_delayed_shipments", "variable_label": "Cost of Delayed Shipments", \
-			"path": "get_cost_of_delayed_shipments"},
-		{"param_name": "cost_of_on_time_shipments", "variable_label": "Cost of On Time Shipments", \
-			"path": "get_cost_of_on_time_shipments"},
-		{"param_name": "total_working_days", "variable_label": "Total Working Days", \
-			"path": "get_total_workdays"},
-		{"param_name": "tot_cost_shipments", "variable_label": "Total Cost of Shipments", \
-			"path": "get_total_cost_of_shipments"},
-		{"param_name": "tot_days_late", "variable_label": "Total Days Late", \
-			"path": "get_total_days_late"},
-		{"param_name": "total_shipments", "variable_label": "Total Shipments", \
-			"path": "get_total_shipments"}
+		{
+			"param_name": "total_accepted_items",
+			"variable_label": "Total Accepted Items",
+			"path": "get_total_accepted_items",
+		},
+		{
+			"param_name": "total_accepted_amount",
+			"variable_label": "Total Accepted Amount",
+			"path": "get_total_accepted_amount",
+		},
+		{
+			"param_name": "total_rejected_items",
+			"variable_label": "Total Rejected Items",
+			"path": "get_total_rejected_items",
+		},
+		{
+			"param_name": "total_rejected_amount",
+			"variable_label": "Total Rejected Amount",
+			"path": "get_total_rejected_amount",
+		},
+		{
+			"param_name": "total_received_items",
+			"variable_label": "Total Received Items",
+			"path": "get_total_received_items",
+		},
+		{
+			"param_name": "total_received_amount",
+			"variable_label": "Total Received Amount",
+			"path": "get_total_received_amount",
+		},
+		{
+			"param_name": "rfq_response_days",
+			"variable_label": "RFQ Response Days",
+			"path": "get_rfq_response_days",
+		},
+		{
+			"param_name": "sq_total_items",
+			"variable_label": "SQ Total Items",
+			"path": "get_sq_total_items",
+		},
+		{
+			"param_name": "sq_total_number",
+			"variable_label": "SQ Total Number",
+			"path": "get_sq_total_number",
+		},
+		{
+			"param_name": "rfq_total_number",
+			"variable_label": "RFQ Total Number",
+			"path": "get_rfq_total_number",
+		},
+		{
+			"param_name": "rfq_total_items",
+			"variable_label": "RFQ Total Items",
+			"path": "get_rfq_total_items",
+		},
+		{
+			"param_name": "tot_item_days",
+			"variable_label": "Total Item Days",
+			"path": "get_item_workdays",
+		},
+		{
+			"param_name": "on_time_shipment_num",
+			"variable_label": "# of On Time Shipments",
+			"path": "get_on_time_shipments",
+		},
+		{
+			"param_name": "cost_of_delayed_shipments",
+			"variable_label": "Cost of Delayed Shipments",
+			"path": "get_cost_of_delayed_shipments",
+		},
+		{
+			"param_name": "cost_of_on_time_shipments",
+			"variable_label": "Cost of On Time Shipments",
+			"path": "get_cost_of_on_time_shipments",
+		},
+		{
+			"param_name": "total_working_days",
+			"variable_label": "Total Working Days",
+			"path": "get_total_workdays",
+		},
+		{
+			"param_name": "tot_cost_shipments",
+			"variable_label": "Total Cost of Shipments",
+			"path": "get_total_cost_of_shipments",
+		},
+		{
+			"param_name": "tot_days_late",
+			"variable_label": "Total Days Late",
+			"path": "get_total_days_late",
+		},
+		{
+			"param_name": "total_shipments",
+			"variable_label": "Total Shipments",
+			"path": "get_total_shipments",
+		},
 	]
 	install_standing_docs = [
-		{"min_grade": 0.0, "prevent_rfqs": 1, "notify_supplier": 0, "max_grade": 30.0, "prevent_pos": 1, \
-			"standing_color": "Red", "notify_employee": 0, "standing_name": "Very Poor"},
-		{"min_grade": 30.0, "prevent_rfqs": 1, "notify_supplier": 0, "max_grade": 50.0, "prevent_pos": 0, \
-			"standing_color": "Red", "notify_employee": 0, "standing_name": "Poor"},
-		{"min_grade": 50.0, "prevent_rfqs": 0, "notify_supplier": 0, "max_grade": 80.0, "prevent_pos": 0, \
-			"standing_color": "Green", "notify_employee": 0, "standing_name": "Average"},
-		{"min_grade": 80.0, "prevent_rfqs": 0, "notify_supplier": 0, "max_grade": 100.0, "prevent_pos": 0, \
-			"standing_color": "Blue", "notify_employee": 0, "standing_name": "Excellent"},
+		{
+			"min_grade": 0.0,
+			"prevent_rfqs": 1,
+			"notify_supplier": 0,
+			"max_grade": 30.0,
+			"prevent_pos": 1,
+			"standing_color": "Red",
+			"notify_employee": 0,
+			"standing_name": "Very Poor",
+		},
+		{
+			"min_grade": 30.0,
+			"prevent_rfqs": 1,
+			"notify_supplier": 0,
+			"max_grade": 50.0,
+			"prevent_pos": 0,
+			"standing_color": "Red",
+			"notify_employee": 0,
+			"standing_name": "Poor",
+		},
+		{
+			"min_grade": 50.0,
+			"prevent_rfqs": 0,
+			"notify_supplier": 0,
+			"max_grade": 80.0,
+			"prevent_pos": 0,
+			"standing_color": "Green",
+			"notify_employee": 0,
+			"standing_name": "Average",
+		},
+		{
+			"min_grade": 80.0,
+			"prevent_rfqs": 0,
+			"notify_supplier": 0,
+			"max_grade": 100.0,
+			"prevent_pos": 0,
+			"standing_color": "Blue",
+			"notify_employee": 0,
+			"standing_name": "Excellent",
+		},
 	]
 
 	for d in install_variable_docs:
 		try:
-			d['doctype'] = "Supplier Scorecard Variable"
+			d["doctype"] = "Supplier Scorecard Variable"
 			frappe.get_doc(d).insert()
 		except frappe.NameError:
 			pass
 	for d in install_standing_docs:
 		try:
-			d['doctype'] = "Supplier Scorecard Standing"
+			d["doctype"] = "Supplier Scorecard Standing"
 			frappe.get_doc(d).insert()
 		except frappe.NameError:
 			pass
diff --git a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard_dashboard.py b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard_dashboard.py
index 5d69326..e3557bd 100644
--- a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard_dashboard.py
+++ b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard_dashboard.py
@@ -3,14 +3,9 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This covers all scorecards tied to this Setup'),
-		'fieldname': 'supplier',
-		'method' : 'erpnext.buying.doctype.supplier_scorecard.supplier_scorecard.get_timeline_data',
-		'transactions': [
-			{
-				'label': _('Scorecards'),
-				'items': ['Supplier Scorecard Period']
-			}
-		]
+		"heatmap": True,
+		"heatmap_message": _("This covers all scorecards tied to this Setup"),
+		"fieldname": "supplier",
+		"method": "erpnext.buying.doctype.supplier_scorecard.supplier_scorecard.get_timeline_data",
+		"transactions": [{"label": _("Scorecards"), "items": ["Supplier Scorecard Period"]}],
 	}
diff --git a/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py b/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py
index 8ecc2cd..2694f96 100644
--- a/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py
+++ b/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py
@@ -7,7 +7,6 @@
 
 
 class TestSupplierScorecard(FrappeTestCase):
-
 	def test_create_scorecard(self):
 		doc = make_supplier_scorecard().insert()
 		self.assertEqual(doc.name, valid_scorecard[0].get("supplier"))
@@ -17,7 +16,8 @@
 		my_doc = make_supplier_scorecard()
 		for d in my_doc.criteria:
 			d.weight = 0
-		self.assertRaises(frappe.ValidationError,my_doc.insert)
+		self.assertRaises(frappe.ValidationError, my_doc.insert)
+
 
 def make_supplier_scorecard():
 	my_doc = frappe.get_doc(valid_scorecard[0])
@@ -36,95 +36,106 @@
 	my_doc = make_supplier_scorecard()
 	if frappe.db.exists("Supplier Scorecard", my_doc.name):
 		# Delete all the periods, then delete the scorecard
-		frappe.db.sql("""delete from `tabSupplier Scorecard Period` where scorecard = %(scorecard)s""", {'scorecard': my_doc.name})
-		frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Criteria` where parenttype = 'Supplier Scorecard Period'""")
-		frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Standing` where parenttype = 'Supplier Scorecard Period'""")
-		frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Variable` where parenttype = 'Supplier Scorecard Period'""")
+		frappe.db.sql(
+			"""delete from `tabSupplier Scorecard Period` where scorecard = %(scorecard)s""",
+			{"scorecard": my_doc.name},
+		)
+		frappe.db.sql(
+			"""delete from `tabSupplier Scorecard Scoring Criteria` where parenttype = 'Supplier Scorecard Period'"""
+		)
+		frappe.db.sql(
+			"""delete from `tabSupplier Scorecard Scoring Standing` where parenttype = 'Supplier Scorecard Period'"""
+		)
+		frappe.db.sql(
+			"""delete from `tabSupplier Scorecard Scoring Variable` where parenttype = 'Supplier Scorecard Period'"""
+		)
 		frappe.delete_doc(my_doc.doctype, my_doc.name)
 
+
 valid_scorecard = [
 	{
-		"standings":[
+		"standings": [
 			{
-				"min_grade":0.0,"name":"Very Poor",
-				"prevent_rfqs":1,
-				"notify_supplier":0,
-				"doctype":"Supplier Scorecard Scoring Standing",
-				"max_grade":30.0,
-				"prevent_pos":1,
-				"warn_pos":0,
-				"warn_rfqs":0,
-				"standing_color":"Red",
-				"notify_employee":0,
-				"standing_name":"Very Poor",
-				"parenttype":"Supplier Scorecard",
-				"parentfield":"standings"
+				"min_grade": 0.0,
+				"name": "Very Poor",
+				"prevent_rfqs": 1,
+				"notify_supplier": 0,
+				"doctype": "Supplier Scorecard Scoring Standing",
+				"max_grade": 30.0,
+				"prevent_pos": 1,
+				"warn_pos": 0,
+				"warn_rfqs": 0,
+				"standing_color": "Red",
+				"notify_employee": 0,
+				"standing_name": "Very Poor",
+				"parenttype": "Supplier Scorecard",
+				"parentfield": "standings",
 			},
 			{
-				"min_grade":30.0,
-				"name":"Poor",
-				"prevent_rfqs":1,
-				"notify_supplier":0,
-				"doctype":"Supplier Scorecard Scoring Standing",
-				"max_grade":50.0,
-				"prevent_pos":0,
-				"warn_pos":0,
-				"warn_rfqs":0,
-				"standing_color":"Red",
-				"notify_employee":0,
-				"standing_name":"Poor",
-				"parenttype":"Supplier Scorecard",
-				"parentfield":"standings"
+				"min_grade": 30.0,
+				"name": "Poor",
+				"prevent_rfqs": 1,
+				"notify_supplier": 0,
+				"doctype": "Supplier Scorecard Scoring Standing",
+				"max_grade": 50.0,
+				"prevent_pos": 0,
+				"warn_pos": 0,
+				"warn_rfqs": 0,
+				"standing_color": "Red",
+				"notify_employee": 0,
+				"standing_name": "Poor",
+				"parenttype": "Supplier Scorecard",
+				"parentfield": "standings",
 			},
 			{
-				"min_grade":50.0,
-				"name":"Average",
-				"prevent_rfqs":0,
-				"notify_supplier":0,
-				"doctype":"Supplier Scorecard Scoring Standing",
-				"max_grade":80.0,
-				"prevent_pos":0,
-				"warn_pos":0,
-				"warn_rfqs":0,
-				"standing_color":"Green",
-				"notify_employee":0,
-				"standing_name":"Average",
-				"parenttype":"Supplier Scorecard",
-				"parentfield":"standings"
+				"min_grade": 50.0,
+				"name": "Average",
+				"prevent_rfqs": 0,
+				"notify_supplier": 0,
+				"doctype": "Supplier Scorecard Scoring Standing",
+				"max_grade": 80.0,
+				"prevent_pos": 0,
+				"warn_pos": 0,
+				"warn_rfqs": 0,
+				"standing_color": "Green",
+				"notify_employee": 0,
+				"standing_name": "Average",
+				"parenttype": "Supplier Scorecard",
+				"parentfield": "standings",
 			},
 			{
-				"min_grade":80.0,
-				"name":"Excellent",
-				"prevent_rfqs":0,
-				"notify_supplier":0,
-				"doctype":"Supplier Scorecard Scoring Standing",
-				"max_grade":100.0,
-				"prevent_pos":0,
-				"warn_pos":0,
-				"warn_rfqs":0,
-				"standing_color":"Blue",
-				"notify_employee":0,
-				"standing_name":"Excellent",
-				"parenttype":"Supplier Scorecard",
-				"parentfield":"standings"
+				"min_grade": 80.0,
+				"name": "Excellent",
+				"prevent_rfqs": 0,
+				"notify_supplier": 0,
+				"doctype": "Supplier Scorecard Scoring Standing",
+				"max_grade": 100.0,
+				"prevent_pos": 0,
+				"warn_pos": 0,
+				"warn_rfqs": 0,
+				"standing_color": "Blue",
+				"notify_employee": 0,
+				"standing_name": "Excellent",
+				"parenttype": "Supplier Scorecard",
+				"parentfield": "standings",
+			},
+		],
+		"prevent_pos": 0,
+		"period": "Per Month",
+		"doctype": "Supplier Scorecard",
+		"warn_pos": 0,
+		"warn_rfqs": 0,
+		"notify_supplier": 0,
+		"criteria": [
+			{
+				"weight": 100.0,
+				"doctype": "Supplier Scorecard Scoring Criteria",
+				"criteria_name": "Delivery",
+				"formula": "100",
 			}
 		],
-		"prevent_pos":0,
-		"period":"Per Month",
-		"doctype":"Supplier Scorecard",
-		"warn_pos":0,
-		"warn_rfqs":0,
-		"notify_supplier":0,
-		"criteria":[
-			{
-				"weight":100.0,
-				"doctype":"Supplier Scorecard Scoring Criteria",
-				"criteria_name":"Delivery",
-				"formula": "100"
-			}
-		],
-		"supplier":"_Test Supplier",
-		"name":"_Test Supplier",
-		"weighting_function":"{total_score} * max( 0, min ( 1 , (12 - {period_number}) / 12) )"
+		"supplier": "_Test Supplier",
+		"name": "_Test Supplier",
+		"weighting_function": "{total_score} * max( 0, min ( 1 , (12 - {period_number}) / 12) )",
 	}
 ]
diff --git a/erpnext/buying/doctype/supplier_scorecard_criteria/supplier_scorecard_criteria.py b/erpnext/buying/doctype/supplier_scorecard_criteria/supplier_scorecard_criteria.py
index 7cd18c3..130adc9 100644
--- a/erpnext/buying/doctype/supplier_scorecard_criteria/supplier_scorecard_criteria.py
+++ b/erpnext/buying/doctype/supplier_scorecard_criteria/supplier_scorecard_criteria.py
@@ -9,7 +9,9 @@
 from frappe.model.document import Document
 
 
-class InvalidFormulaVariable(frappe.ValidationError): pass
+class InvalidFormulaVariable(frappe.ValidationError):
+	pass
+
 
 class SupplierScorecardCriteria(Document):
 	def validate(self):
@@ -29,28 +31,34 @@
 		mylist = re.finditer(regex, test_formula, re.MULTILINE | re.DOTALL)
 		for dummy1, match in enumerate(mylist):
 			for dummy2 in range(0, len(match.groups())):
-				test_formula = test_formula.replace('{' + match.group(1) + '}', "0")
+				test_formula = test_formula.replace("{" + match.group(1) + "}", "0")
 
 		try:
-			frappe.safe_eval(test_formula,  None, {'max':max, 'min': min})
+			frappe.safe_eval(test_formula, None, {"max": max, "min": min})
 		except Exception:
 			frappe.throw(_("Error evaluating the criteria formula"))
 
+
 @frappe.whitelist()
 def get_criteria_list():
-	criteria = frappe.db.sql("""
+	criteria = frappe.db.sql(
+		"""
 		SELECT
 			scs.name
 		FROM
 			`tabSupplier Scorecard Criteria` scs""",
-			{}, as_dict=1)
+		{},
+		as_dict=1,
+	)
 
 	return criteria
 
+
 def get_variables(criteria_name):
 	criteria = frappe.get_doc("Supplier Scorecard Criteria", criteria_name)
 	return _get_variables(criteria)
 
+
 def _get_variables(criteria):
 	my_variables = []
 	regex = r"\{(.*?)\}"
@@ -59,16 +67,19 @@
 	for dummy1, match in enumerate(mylist):
 		for dummy2 in range(0, len(match.groups())):
 			try:
-				var = frappe.db.sql("""
+				var = frappe.db.sql(
+					"""
 					SELECT
 						scv.variable_label, scv.description, scv.param_name, scv.path
 					FROM
 						`tabSupplier Scorecard Variable` scv
 					WHERE
 						param_name=%(param)s""",
-						{'param':match.group(1)}, as_dict=1)[0]
+					{"param": match.group(1)},
+					as_dict=1,
+				)[0]
 				my_variables.append(var)
 			except Exception:
-				frappe.throw(_('Unable to find variable: ') + str(match.group(1)), InvalidFormulaVariable)
+				frappe.throw(_("Unable to find variable: ") + str(match.group(1)), InvalidFormulaVariable)
 
 	return my_variables
diff --git a/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py b/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py
index 7ff84c1..90468d6 100644
--- a/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py
+++ b/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py
@@ -12,19 +12,26 @@
 		for d in test_good_criteria:
 			frappe.get_doc(d).insert()
 
-		self.assertRaises(frappe.ValidationError,frappe.get_doc(test_bad_criteria[0]).insert)
+		self.assertRaises(frappe.ValidationError, frappe.get_doc(test_bad_criteria[0]).insert)
 
 	def test_formula_validate(self):
 		delete_test_scorecards()
-		self.assertRaises(frappe.ValidationError,frappe.get_doc(test_bad_criteria[1]).insert)
-		self.assertRaises(frappe.ValidationError,frappe.get_doc(test_bad_criteria[2]).insert)
+		self.assertRaises(frappe.ValidationError, frappe.get_doc(test_bad_criteria[1]).insert)
+		self.assertRaises(frappe.ValidationError, frappe.get_doc(test_bad_criteria[2]).insert)
+
 
 def delete_test_scorecards():
 	# Delete all the periods so we can delete all the criteria
 	frappe.db.sql("""delete from `tabSupplier Scorecard Period`""")
-	frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Criteria` where parenttype = 'Supplier Scorecard Period'""")
-	frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Standing` where parenttype = 'Supplier Scorecard Period'""")
-	frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Variable` where parenttype = 'Supplier Scorecard Period'""")
+	frappe.db.sql(
+		"""delete from `tabSupplier Scorecard Scoring Criteria` where parenttype = 'Supplier Scorecard Period'"""
+	)
+	frappe.db.sql(
+		"""delete from `tabSupplier Scorecard Scoring Standing` where parenttype = 'Supplier Scorecard Period'"""
+	)
+	frappe.db.sql(
+		"""delete from `tabSupplier Scorecard Scoring Variable` where parenttype = 'Supplier Scorecard Period'"""
+	)
 
 	for d in test_good_criteria:
 		if frappe.db.exists("Supplier Scorecard Criteria", d.get("name")):
@@ -36,40 +43,41 @@
 			# Delete all the periods, then delete the scorecard
 			frappe.delete_doc(d.get("doctype"), d.get("name"))
 
+
 test_good_criteria = [
 	{
-		"name":"Delivery",
-		"weight":40.0,
-		"doctype":"Supplier Scorecard Criteria",
-		"formula":"(({cost_of_on_time_shipments} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100",
-		"criteria_name":"Delivery",
-		"max_score":100.0
+		"name": "Delivery",
+		"weight": 40.0,
+		"doctype": "Supplier Scorecard Criteria",
+		"formula": "(({cost_of_on_time_shipments} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100",
+		"criteria_name": "Delivery",
+		"max_score": 100.0,
 	},
 ]
 
 test_bad_criteria = [
 	{
-		"name":"Fake Criteria 1",
-		"weight":40.0,
-		"doctype":"Supplier Scorecard Criteria",
-		"formula":"(({fake_variable} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100", # Invalid variable name
-		"criteria_name":"Fake Criteria 1",
-		"max_score":100.0
+		"name": "Fake Criteria 1",
+		"weight": 40.0,
+		"doctype": "Supplier Scorecard Criteria",
+		"formula": "(({fake_variable} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100",  # Invalid variable name
+		"criteria_name": "Fake Criteria 1",
+		"max_score": 100.0,
 	},
 	{
-		"name":"Fake Criteria 2",
-		"weight":40.0,
-		"doctype":"Supplier Scorecard Criteria",
-		"formula":"(({cost_of_on_time_shipments} / {tot_cost_shipments}))* 100", # Force 0 divided by 0
-		"criteria_name":"Fake Criteria 2",
-		"max_score":100.0
+		"name": "Fake Criteria 2",
+		"weight": 40.0,
+		"doctype": "Supplier Scorecard Criteria",
+		"formula": "(({cost_of_on_time_shipments} / {tot_cost_shipments}))* 100",  # Force 0 divided by 0
+		"criteria_name": "Fake Criteria 2",
+		"max_score": 100.0,
 	},
 	{
-		"name":"Fake Criteria 3",
-		"weight":40.0,
-		"doctype":"Supplier Scorecard Criteria",
-		"formula":"(({cost_of_on_time_shipments} {cost_of_on_time_shipments} / {tot_cost_shipments}))* 100", # Two variables beside eachother
-		"criteria_name":"Fake Criteria 3",
-		"max_score":100.0
+		"name": "Fake Criteria 3",
+		"weight": 40.0,
+		"doctype": "Supplier Scorecard Criteria",
+		"formula": "(({cost_of_on_time_shipments} {cost_of_on_time_shipments} / {tot_cost_shipments}))* 100",  # Two variables beside eachother
+		"criteria_name": "Fake Criteria 3",
+		"max_score": 100.0,
 	},
 ]
diff --git a/erpnext/buying/doctype/supplier_scorecard_period/supplier_scorecard_period.py b/erpnext/buying/doctype/supplier_scorecard_period/supplier_scorecard_period.py
index c247241..a8b76db 100644
--- a/erpnext/buying/doctype/supplier_scorecard_period/supplier_scorecard_period.py
+++ b/erpnext/buying/doctype/supplier_scorecard_period/supplier_scorecard_period.py
@@ -14,7 +14,6 @@
 
 
 class SupplierScorecardPeriod(Document):
-
 	def validate(self):
 		self.validate_criteria_weights()
 		self.calculate_variables()
@@ -28,69 +27,84 @@
 			weight += c.weight
 
 		if weight != 100:
-			throw(_('Criteria weights must add up to 100%'))
+			throw(_("Criteria weights must add up to 100%"))
 
 	def calculate_variables(self):
 		for var in self.variables:
-			if '.' in var.path:
+			if "." in var.path:
 				method_to_call = import_string_path(var.path)
 				var.value = method_to_call(self)
 			else:
 				method_to_call = getattr(variable_functions, var.path)
 				var.value = method_to_call(self)
 
-
-
 	def calculate_criteria(self):
 		for crit in self.criteria:
 			try:
-				crit.score = min(crit.max_score, max( 0 ,frappe.safe_eval(self.get_eval_statement(crit.formula),  None, {'max':max, 'min': min})))
+				crit.score = min(
+					crit.max_score,
+					max(
+						0, frappe.safe_eval(self.get_eval_statement(crit.formula), None, {"max": max, "min": min})
+					),
+				)
 			except Exception:
-				frappe.throw(_("Could not solve criteria score function for {0}. Make sure the formula is valid.").format(crit.criteria_name),frappe.ValidationError)
+				frappe.throw(
+					_("Could not solve criteria score function for {0}. Make sure the formula is valid.").format(
+						crit.criteria_name
+					),
+					frappe.ValidationError,
+				)
 				crit.score = 0
 
 	def calculate_score(self):
 		myscore = 0
 		for crit in self.criteria:
-			myscore += crit.score * crit.weight/100.0
+			myscore += crit.score * crit.weight / 100.0
 		self.total_score = myscore
 
 	def calculate_weighted_score(self, weighing_function):
 		try:
-			weighed_score = frappe.safe_eval(self.get_eval_statement(weighing_function),  None, {'max':max, 'min': min})
+			weighed_score = frappe.safe_eval(
+				self.get_eval_statement(weighing_function), None, {"max": max, "min": min}
+			)
 		except Exception:
-			frappe.throw(_("Could not solve weighted score function. Make sure the formula is valid."),frappe.ValidationError)
+			frappe.throw(
+				_("Could not solve weighted score function. Make sure the formula is valid."),
+				frappe.ValidationError,
+			)
 			weighed_score = 0
 		return weighed_score
 
-
 	def get_eval_statement(self, formula):
 		my_eval_statement = formula.replace("\r", "").replace("\n", "")
 
 		for var in self.variables:
-				if var.value:
-					if var.param_name in my_eval_statement:
-						my_eval_statement = my_eval_statement.replace('{' + var.param_name + '}', "{:.2f}".format(var.value))
-				else:
-					if var.param_name in my_eval_statement:
-						my_eval_statement = my_eval_statement.replace('{' + var.param_name + '}', '0.0')
+			if var.value:
+				if var.param_name in my_eval_statement:
+					my_eval_statement = my_eval_statement.replace(
+						"{" + var.param_name + "}", "{:.2f}".format(var.value)
+					)
+			else:
+				if var.param_name in my_eval_statement:
+					my_eval_statement = my_eval_statement.replace("{" + var.param_name + "}", "0.0")
 
 		return my_eval_statement
 
 
 def import_string_path(path):
-    components = path.split('.')
-    mod = __import__(components[0])
-    for comp in components[1:]:
-        mod = getattr(mod, comp)
-    return mod
+	components = path.split(".")
+	mod = __import__(components[0])
+	for comp in components[1:]:
+		mod = getattr(mod, comp)
+	return mod
 
 
 @frappe.whitelist()
 def make_supplier_scorecard(source_name, target_doc=None):
 	def update_criteria_fields(obj, target, source_parent):
-		target.max_score, target.formula = frappe.db.get_value('Supplier Scorecard Criteria',
-			obj.criteria_name, ['max_score', 'formula'])
+		target.max_score, target.formula = frappe.db.get_value(
+			"Supplier Scorecard Criteria", obj.criteria_name, ["max_score", "formula"]
+		)
 
 	def post_process(source, target):
 		variables = []
@@ -99,16 +113,21 @@
 				if var not in variables:
 					variables.append(var)
 
-		target.extend('variables', variables)
+		target.extend("variables", variables)
 
-	doc = get_mapped_doc("Supplier Scorecard", source_name,	{
-		"Supplier Scorecard": {
-			"doctype": "Supplier Scorecard Period"
+	doc = get_mapped_doc(
+		"Supplier Scorecard",
+		source_name,
+		{
+			"Supplier Scorecard": {"doctype": "Supplier Scorecard Period"},
+			"Supplier Scorecard Scoring Criteria": {
+				"doctype": "Supplier Scorecard Scoring Criteria",
+				"postprocess": update_criteria_fields,
+			},
 		},
-		"Supplier Scorecard Scoring Criteria": {
-			"doctype": "Supplier Scorecard Scoring Criteria",
-			"postprocess": update_criteria_fields,
-		}
-	}, target_doc, post_process, ignore_permissions=True)
+		target_doc,
+		post_process,
+		ignore_permissions=True,
+	)
 
 	return doc
diff --git a/erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.py b/erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.py
index 11ebe6d..929e8a3 100644
--- a/erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.py
+++ b/erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.py
@@ -19,11 +19,14 @@
 
 @frappe.whitelist()
 def get_standings_list():
-	standings = frappe.db.sql("""
+	standings = frappe.db.sql(
+		"""
 		SELECT
 			scs.name
 		FROM
 			`tabSupplier Scorecard Standing` scs""",
-			{}, as_dict=1)
+		{},
+		as_dict=1,
+	)
 
 	return standings
diff --git a/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py b/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py
index 217aadba6..fb8819e 100644
--- a/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py
+++ b/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py
@@ -10,18 +10,21 @@
 from frappe.utils import getdate
 
 
-class VariablePathNotFound(frappe.ValidationError): pass
+class VariablePathNotFound(frappe.ValidationError):
+	pass
+
 
 class SupplierScorecardVariable(Document):
 	def validate(self):
 		self.validate_path_exists()
 
 	def validate_path_exists(self):
-		if '.' in self.path:
+		if "." in self.path:
 			try:
 				from erpnext.buying.doctype.supplier_scorecard_period.supplier_scorecard_period import (
 					import_string_path,
 				)
+
 				import_string_path(self.path)
 			except AttributeError:
 				frappe.throw(_("Could not find path for " + self.path), VariablePathNotFound)
@@ -30,15 +33,18 @@
 			if not hasattr(sys.modules[__name__], self.path):
 				frappe.throw(_("Could not find path for " + self.path), VariablePathNotFound)
 
+
 def get_total_workdays(scorecard):
-	""" Gets the number of days in this period"""
+	"""Gets the number of days in this period"""
 	delta = getdate(scorecard.end_date) - getdate(scorecard.start_date)
 	return delta.days
 
+
 def get_item_workdays(scorecard):
-	""" Gets the number of days in this period"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
-	total_item_days = frappe.db.sql("""
+	"""Gets the number of days in this period"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
+	total_item_days = frappe.db.sql(
+		"""
 			SELECT
 				SUM(DATEDIFF( %(end_date)s, po_item.schedule_date) * (po_item.qty))
 			FROM
@@ -49,20 +55,22 @@
 				AND po_item.received_qty < po_item.qty
 				AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
 				AND po_item.parent = po.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not total_item_days:
 		total_item_days = 0
 	return total_item_days
 
 
-
 def get_total_cost_of_shipments(scorecard):
-	""" Gets the total cost of all shipments in the period (based on Purchase Orders)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total cost of all shipments in the period (based on Purchase Orders)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(po_item.base_amount)
 			FROM
@@ -73,24 +81,29 @@
 				AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
 				AND po_item.docstatus = 1
 				AND po_item.parent = po.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if data:
 		return data
 	else:
 		return 0
 
+
 def get_cost_of_delayed_shipments(scorecard):
-	""" Gets the total cost of all delayed shipments in the period (based on Purchase Receipts - POs)"""
+	"""Gets the total cost of all delayed shipments in the period (based on Purchase Receipts - POs)"""
 	return get_total_cost_of_shipments(scorecard) - get_cost_of_on_time_shipments(scorecard)
 
+
 def get_cost_of_on_time_shipments(scorecard):
-	""" Gets the total cost of all on_time shipments in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total cost of all on_time shipments in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
 
-	total_delivered_on_time_costs = frappe.db.sql("""
+	total_delivered_on_time_costs = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.base_amount)
 			FROM
@@ -106,7 +119,9 @@
 				AND pr_item.purchase_order_item = po_item.name
 				AND po_item.parent = po.name
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if total_delivered_on_time_costs:
 		return total_delivered_on_time_costs
@@ -115,9 +130,10 @@
 
 
 def get_total_days_late(scorecard):
-	""" Gets the number of item days late in the period (based on Purchase Receipts vs POs)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
-	total_delivered_late_days = frappe.db.sql("""
+	"""Gets the number of item days late in the period (based on Purchase Receipts vs POs)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
+	total_delivered_late_days = frappe.db.sql(
+		"""
 			SELECT
 				SUM(DATEDIFF(pr.posting_date,po_item.schedule_date)* pr_item.qty)
 			FROM
@@ -133,11 +149,14 @@
 				AND pr_item.purchase_order_item = po_item.name
 				AND po_item.parent = po.name
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 	if not total_delivered_late_days:
 		total_delivered_late_days = 0
 
-	total_missed_late_days = frappe.db.sql("""
+	total_missed_late_days = frappe.db.sql(
+		"""
 			SELECT
 				SUM(DATEDIFF( %(end_date)s, po_item.schedule_date) * (po_item.qty - po_item.received_qty))
 			FROM
@@ -148,19 +167,23 @@
 				AND po_item.received_qty < po_item.qty
 				AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
 				AND po_item.parent = po.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not total_missed_late_days:
 		total_missed_late_days = 0
 	return total_missed_late_days + total_delivered_late_days
 
-def get_on_time_shipments(scorecard):
-	""" Gets the number of late shipments (counting each item) in the period (based on Purchase Receipts vs POs)"""
 
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+def get_on_time_shipments(scorecard):
+	"""Gets the number of late shipments (counting each item) in the period (based on Purchase Receipts vs POs)"""
+
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	total_items_delivered_on_time = frappe.db.sql("""
+	total_items_delivered_on_time = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(pr_item.qty)
 			FROM
@@ -177,22 +200,27 @@
 				AND pr_item.purchase_order_item = po_item.name
 				AND po_item.parent = po.name
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not total_items_delivered_on_time:
 		total_items_delivered_on_time = 0
 	return total_items_delivered_on_time
 
+
 def get_late_shipments(scorecard):
-	""" Gets the number of late shipments (counting each item) in the period (based on Purchase Receipts vs POs)"""
+	"""Gets the number of late shipments (counting each item) in the period (based on Purchase Receipts vs POs)"""
 	return get_total_shipments(scorecard) - get_on_time_shipments(scorecard)
 
+
 def get_total_received(scorecard):
-	""" Gets the total number of received shipments in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of received shipments in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(pr_item.base_amount)
 			FROM
@@ -203,18 +231,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_received_amount(scorecard):
-	""" Gets the total amount (in company currency) received in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total amount (in company currency) received in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.received_qty * pr_item.base_rate)
 			FROM
@@ -225,18 +257,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_received_items(scorecard):
-	""" Gets the total number of received shipments in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of received shipments in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.received_qty)
 			FROM
@@ -247,18 +283,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_rejected_amount(scorecard):
-	""" Gets the total amount (in company currency) rejected in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total amount (in company currency) rejected in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.rejected_qty * pr_item.base_rate)
 			FROM
@@ -269,18 +309,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_rejected_items(scorecard):
-	""" Gets the total number of rejected items in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of rejected items in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.rejected_qty)
 			FROM
@@ -291,18 +335,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_accepted_amount(scorecard):
-	""" Gets the total amount (in company currency) accepted in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total amount (in company currency) accepted in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.qty * pr_item.base_rate)
 			FROM
@@ -313,18 +361,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_accepted_items(scorecard):
-	""" Gets the total number of rejected items in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of rejected items in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				SUM(pr_item.qty)
 			FROM
@@ -335,18 +387,22 @@
 				AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
 				AND pr_item.docstatus = 1
 				AND pr_item.parent = pr.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_total_shipments(scorecard):
-	""" Gets the total number of ordered shipments to arrive in the period (based on Purchase Receipts)"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of ordered shipments to arrive in the period (based on Purchase Receipts)"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(po_item.base_amount)
 			FROM
@@ -357,18 +413,22 @@
 				AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
 				AND po_item.docstatus = 1
 				AND po_item.parent = po.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_rfq_total_number(scorecard):
-	""" Gets the total number of RFQs sent to supplier"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of RFQs sent to supplier"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(rfq.name) as total_rfqs
 			FROM
@@ -381,18 +441,22 @@
 				AND rfq_item.docstatus = 1
 				AND rfq_item.parent = rfq.name
 				AND rfq_sup.parent = rfq.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 
 	if not data:
 		data = 0
 	return data
 
+
 def get_rfq_total_items(scorecard):
-	""" Gets the total number of RFQ items sent to supplier"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of RFQ items sent to supplier"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(rfq_item.name) as total_rfqs
 			FROM
@@ -405,18 +469,21 @@
 				AND rfq_item.docstatus = 1
 				AND rfq_item.parent = rfq.name
 				AND rfq_sup.parent = rfq.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 	if not data:
 		data = 0
 	return data
 
 
 def get_sq_total_number(scorecard):
-	""" Gets the total number of RFQ items sent to supplier"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of RFQ items sent to supplier"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(sq.name) as total_sqs
 			FROM
@@ -435,17 +502,21 @@
 				AND sq_item.parent = sq.name
 				AND rfq_item.parent = rfq.name
 				AND rfq_sup.parent = rfq.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 	if not data:
 		data = 0
 	return data
 
+
 def get_sq_total_items(scorecard):
-	""" Gets the total number of RFQ items sent to supplier"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
+	"""Gets the total number of RFQ items sent to supplier"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
 
 	# Look up all PO Items with delivery dates between our dates
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 			SELECT
 				COUNT(sq_item.name) as total_sqs
 			FROM
@@ -464,15 +535,19 @@
 				AND rfq_item.docstatus = 1
 				AND rfq_item.parent = rfq.name
 				AND rfq_sup.parent = rfq.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 	if not data:
 		data = 0
 	return data
 
+
 def get_rfq_response_days(scorecard):
-	""" Gets the total number of days it has taken a supplier to respond to rfqs in the period"""
-	supplier = frappe.get_doc('Supplier', scorecard.supplier)
-	total_sq_days = frappe.db.sql("""
+	"""Gets the total number of days it has taken a supplier to respond to rfqs in the period"""
+	supplier = frappe.get_doc("Supplier", scorecard.supplier)
+	total_sq_days = frappe.db.sql(
+		"""
 			SELECT
 				SUM(DATEDIFF(sq.transaction_date, rfq.transaction_date))
 			FROM
@@ -491,9 +566,10 @@
 				AND rfq_item.docstatus = 1
 				AND rfq_item.parent = rfq.name
 				AND rfq_sup.parent = rfq.name""",
-				{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
+		{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
+		as_dict=0,
+	)[0][0]
 	if not total_sq_days:
 		total_sq_days = 0
 
-
 	return total_sq_days
diff --git a/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py b/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py
index 32005a3..60d8464 100644
--- a/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py
+++ b/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py
@@ -14,9 +14,9 @@
 	def test_variable_exist(self):
 		for d in test_existing_variables:
 			my_doc = frappe.get_doc("Supplier Scorecard Variable", d.get("name"))
-			self.assertEqual(my_doc.param_name, d.get('param_name'))
-			self.assertEqual(my_doc.variable_label, d.get('variable_label'))
-			self.assertEqual(my_doc.path, d.get('path'))
+			self.assertEqual(my_doc.param_name, d.get("param_name"))
+			self.assertEqual(my_doc.variable_label, d.get("variable_label"))
+			self.assertEqual(my_doc.path, d.get("path"))
 
 	def test_path_exists(self):
 		for d in test_good_variables:
@@ -25,34 +25,35 @@
 			frappe.get_doc(d).insert()
 
 		for d in test_bad_variables:
-			self.assertRaises(VariablePathNotFound,frappe.get_doc(d).insert)
+			self.assertRaises(VariablePathNotFound, frappe.get_doc(d).insert)
+
 
 test_existing_variables = [
 	{
-		"param_name":"total_accepted_items",
-		"name":"Total Accepted Items",
-		"doctype":"Supplier Scorecard Variable",
-		"variable_label":"Total Accepted Items",
-		"path":"get_total_accepted_items"
+		"param_name": "total_accepted_items",
+		"name": "Total Accepted Items",
+		"doctype": "Supplier Scorecard Variable",
+		"variable_label": "Total Accepted Items",
+		"path": "get_total_accepted_items",
 	},
 ]
 
 test_good_variables = [
 	{
-		"param_name":"good_variable1",
-		"name":"Good Variable 1",
-		"doctype":"Supplier Scorecard Variable",
-		"variable_label":"Good Variable 1",
-		"path":"get_total_accepted_items"
+		"param_name": "good_variable1",
+		"name": "Good Variable 1",
+		"doctype": "Supplier Scorecard Variable",
+		"variable_label": "Good Variable 1",
+		"path": "get_total_accepted_items",
 	},
 ]
 
 test_bad_variables = [
 	{
-		"param_name":"fake_variable1",
-		"name":"Fake Variable 1",
-		"doctype":"Supplier Scorecard Variable",
-		"variable_label":"Fake Variable 1",
-		"path":"get_fake_variable1"
+		"param_name": "fake_variable1",
+		"name": "Fake Variable 1",
+		"doctype": "Supplier Scorecard Variable",
+		"variable_label": "Fake Variable 1",
+		"path": "get_fake_variable1",
 	},
 ]
diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.py b/erpnext/buying/report/procurement_tracker/procurement_tracker.py
index 295a19d..e0b02ee 100644
--- a/erpnext/buying/report/procurement_tracker/procurement_tracker.py
+++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.py
@@ -12,152 +12,143 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{
 			"label": _("Material Request Date"),
 			"fieldname": "material_request_date",
 			"fieldtype": "Date",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Material Request No"),
 			"options": "Material Request",
 			"fieldname": "material_request_no",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Cost Center"),
 			"options": "Cost Center",
 			"fieldname": "cost_center",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Project"),
 			"options": "Project",
 			"fieldname": "project",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Requesting Site"),
 			"options": "Warehouse",
 			"fieldname": "requesting_site",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Requestor"),
 			"options": "Employee",
 			"fieldname": "requestor",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Item"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Quantity"),
-			"fieldname": "quantity",
-			"fieldtype": "Float",
-			"width": 140
-		},
+		{"label": _("Quantity"), "fieldname": "quantity", "fieldtype": "Float", "width": 140},
 		{
 			"label": _("Unit of Measure"),
 			"options": "UOM",
 			"fieldname": "unit_of_measurement",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Status"),
-			"fieldname": "status",
-			"fieldtype": "data",
-			"width": 140
-		},
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "data", "width": 140},
 		{
 			"label": _("Purchase Order Date"),
 			"fieldname": "purchase_order_date",
 			"fieldtype": "Date",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Purchase Order"),
 			"options": "Purchase Order",
 			"fieldname": "purchase_order",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Supplier"),
 			"options": "Supplier",
 			"fieldname": "supplier",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Estimated Cost"),
 			"fieldname": "estimated_cost",
 			"fieldtype": "Float",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Actual Cost"),
-			"fieldname": "actual_cost",
-			"fieldtype": "Float",
-			"width": 140
-		},
+		{"label": _("Actual Cost"), "fieldname": "actual_cost", "fieldtype": "Float", "width": 140},
 		{
 			"label": _("Purchase Order Amount"),
 			"fieldname": "purchase_order_amt",
 			"fieldtype": "Float",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Purchase Order Amount(Company Currency)"),
 			"fieldname": "purchase_order_amt_in_company_currency",
 			"fieldtype": "Float",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Expected Delivery Date"),
 			"fieldname": "expected_delivery_date",
 			"fieldtype": "Date",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Actual Delivery Date"),
 			"fieldname": "actual_delivery_date",
 			"fieldtype": "Date",
-			"width": 140
+			"width": 140,
 		},
 	]
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 
 	if filters.get("company"):
-		conditions += " AND parent.company=%s" % frappe.db.escape(filters.get('company'))
+		conditions += " AND parent.company=%s" % frappe.db.escape(filters.get("company"))
 
 	if filters.get("cost_center") or filters.get("project"):
 		conditions += """
 			AND (child.`cost_center`=%s OR child.`project`=%s)
-			""" % (frappe.db.escape(filters.get('cost_center')), frappe.db.escape(filters.get('project')))
+			""" % (
+			frappe.db.escape(filters.get("cost_center")),
+			frappe.db.escape(filters.get("project")),
+		)
 
 	if filters.get("from_date"):
-		conditions += " AND parent.transaction_date>='%s'" % filters.get('from_date')
+		conditions += " AND parent.transaction_date>='%s'" % filters.get("from_date")
 
 	if filters.get("to_date"):
-		conditions += " AND parent.transaction_date<='%s'" % filters.get('to_date')
+		conditions += " AND parent.transaction_date<='%s'" % filters.get("to_date")
 	return conditions
 
+
 def get_data(filters):
 	conditions = get_conditions(filters)
 	purchase_order_entry = get_po_entries(conditions)
@@ -165,14 +156,14 @@
 	pr_records = get_mapped_pr_records()
 	pi_records = get_mapped_pi_records()
 
-	procurement_record=[]
+	procurement_record = []
 	if procurement_record_against_mr:
 		procurement_record += procurement_record_against_mr
 	for po in purchase_order_entry:
 		# fetch material records linked to the purchase order item
 		mr_record = mr_records.get(po.material_request_item, [{}])[0]
 		procurement_detail = {
-			"material_request_date": mr_record.get('transaction_date'),
+			"material_request_date": mr_record.get("transaction_date"),
 			"cost_center": po.cost_center,
 			"project": po.project,
 			"requesting_site": po.warehouse,
@@ -185,19 +176,21 @@
 			"purchase_order_date": po.transaction_date,
 			"purchase_order": po.parent,
 			"supplier": po.supplier,
-			"estimated_cost": flt(mr_record.get('amount')),
+			"estimated_cost": flt(mr_record.get("amount")),
 			"actual_cost": flt(pi_records.get(po.name)),
 			"purchase_order_amt": flt(po.amount),
 			"purchase_order_amt_in_company_currency": flt(po.base_amount),
 			"expected_delivery_date": po.schedule_date,
-			"actual_delivery_date": pr_records.get(po.name)
+			"actual_delivery_date": pr_records.get(po.name),
 		}
 		procurement_record.append(procurement_detail)
 	return procurement_record
 
+
 def get_mapped_mr_details(conditions):
 	mr_records = {}
-	mr_details = frappe.db.sql("""
+	mr_details = frappe.db.sql(
+		"""
 		SELECT
 			parent.transaction_date,
 			parent.per_ordered,
@@ -217,7 +210,11 @@
 			AND parent.name=child.parent
 			AND parent.docstatus=1
 			{conditions}
-		""".format(conditions=conditions), as_dict=1) #nosec
+		""".format(
+			conditions=conditions
+		),
+		as_dict=1,
+	)  # nosec
 
 	procurement_record_against_mr = []
 	for record in mr_details:
@@ -236,14 +233,17 @@
 				actual_cost=0,
 				purchase_order_amt=0,
 				purchase_order_amt_in_company_currency=0,
-				project = record.project,
-				cost_center = record.cost_center
+				project=record.project,
+				cost_center=record.cost_center,
 			)
 			procurement_record_against_mr.append(procurement_record_details)
 	return mr_records, procurement_record_against_mr
 
+
 def get_mapped_pi_records():
-	return frappe._dict(frappe.db.sql("""
+	return frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT
 			pi_item.po_detail,
 			pi_item.base_amount
@@ -254,10 +254,15 @@
 			pi_item.docstatus = 1
 			AND po.status not in ("Closed","Completed","Cancelled")
 			AND pi_item.po_detail IS NOT NULL
-		"""))
+		"""
+		)
+	)
+
 
 def get_mapped_pr_records():
-	return frappe._dict(frappe.db.sql("""
+	return frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT
 			pr_item.purchase_order_item,
 			pr.posting_date
@@ -267,10 +272,14 @@
 			AND pr.name=pr_item.parent
 			AND pr_item.purchase_order_item IS NOT NULL
 			AND pr.status not in  ("Closed","Completed","Cancelled")
-		"""))
+		"""
+		)
+	)
+
 
 def get_po_entries(conditions):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			child.name,
 			child.parent,
@@ -297,4 +306,8 @@
 			{conditions}
 		GROUP BY
 			parent.name, child.item_code
-		""".format(conditions=conditions), as_dict=1) #nosec
+		""".format(
+			conditions=conditions
+		),
+		as_dict=1,
+	)  # nosec
diff --git a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py
index 4452452..47a66ad 100644
--- a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py
+++ b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py
@@ -16,27 +16,28 @@
 
 class TestProcurementTracker(FrappeTestCase):
 	def test_result_for_procurement_tracker(self):
-		filters = {
-			'company': '_Test Procurement Company',
-			'cost_center': 'Main - _TPC'
-		}
+		filters = {"company": "_Test Procurement Company", "cost_center": "Main - _TPC"}
 		expected_data = self.generate_expected_data()
 		report = execute(filters)
 
 		length = len(report[1])
-		self.assertEqual(expected_data, report[1][length-1])
+		self.assertEqual(expected_data, report[1][length - 1])
 
 	def generate_expected_data(self):
 		if not frappe.db.exists("Company", "_Test Procurement Company"):
-			frappe.get_doc(dict(
-				doctype="Company",
-				company_name="_Test Procurement Company",
-				abbr="_TPC",
-				default_currency="INR",
-				country="Pakistan"
-				)).insert()
+			frappe.get_doc(
+				dict(
+					doctype="Company",
+					company_name="_Test Procurement Company",
+					abbr="_TPC",
+					default_currency="INR",
+					country="Pakistan",
+				)
+			).insert()
 		warehouse = create_warehouse("_Test Procurement Warehouse", company="_Test Procurement Company")
-		mr = make_material_request(company="_Test Procurement Company", warehouse=warehouse, cost_center="Main - _TPC")
+		mr = make_material_request(
+			company="_Test Procurement Company", warehouse=warehouse, cost_center="Main - _TPC"
+		)
 		po = make_purchase_order(mr.name)
 		po.supplier = "_Test Supplier"
 		po.get("items")[0].cost_center = "Main - _TPC"
@@ -55,7 +56,7 @@
 			"requesting_site": "_Test Procurement Warehouse - _TPC",
 			"requestor": "Administrator",
 			"material_request_no": mr.name,
-			"item_code": '_Test Item',
+			"item_code": "_Test Item",
 			"quantity": 10.0,
 			"unit_of_measurement": "_Test UOM",
 			"status": "To Bill",
@@ -67,7 +68,7 @@
 			"purchase_order_amt": po.net_total,
 			"purchase_order_amt_in_company_currency": po.base_net_total,
 			"expected_delivery_date": date_obj,
-			"actual_delivery_date": date_obj
+			"actual_delivery_date": date_obj,
 		}
 
 		return expected_data
diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
index 9dd9121..a5c4649 100644
--- a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
+++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
@@ -27,6 +27,7 @@
 
 	return columns, data, None, chart_data
 
+
 def validate_filters(filters):
 	from_date, to_date = filters.get("from_date"), filters.get("to_date")
 
@@ -35,25 +36,28 @@
 	elif date_diff(to_date, from_date) < 0:
 		frappe.throw(_("To Date cannot be before From Date."))
 
+
 def get_conditions(filters):
 	conditions = ""
 	if filters.get("from_date") and filters.get("to_date"):
 		conditions += " and po.transaction_date between %(from_date)s and %(to_date)s"
 
-	for field in ['company', 'name']:
+	for field in ["company", "name"]:
 		if filters.get(field):
 			conditions += f" and po.{field} = %({field})s"
 
-	if filters.get('status'):
+	if filters.get("status"):
 		conditions += " and po.status in %(status)s"
 
-	if filters.get('project'):
+	if filters.get("project"):
 		conditions += " and poi.project = %(project)s"
 
 	return conditions
 
+
 def get_data(conditions, filters):
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		SELECT
 			po.transaction_date as date,
 			poi.schedule_date as required_date,
@@ -81,13 +85,19 @@
 			{0}
 		GROUP BY poi.name
 		ORDER BY po.transaction_date ASC
-	""".format(conditions), filters, as_dict=1)
+	""".format(
+			conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return data
 
+
 def prepare_data(data, filters):
 	completed, pending = 0, 0
-	pending_field =  "pending_amount"
+	pending_field = "pending_amount"
 	completed_field = "billed_amount"
 
 	if filters.get("group_by_po"):
@@ -114,8 +124,17 @@
 				po_row["required_date"] = min(getdate(po_row["required_date"]), getdate(row["required_date"]))
 
 				# sum numeric columns
-				fields = ["qty", "received_qty", "pending_qty", "billed_qty", "qty_to_bill", "amount",
-					"received_qty_amount", "billed_amount", "pending_amount"]
+				fields = [
+					"qty",
+					"received_qty",
+					"pending_qty",
+					"billed_qty",
+					"qty_to_bill",
+					"amount",
+					"received_qty_amount",
+					"billed_amount",
+					"pending_amount",
+				]
 				for field in fields:
 					po_row[field] = flt(row[field]) + flt(po_row[field])
 
@@ -129,152 +148,140 @@
 
 	return data, chart_data
 
+
 def prepare_chart_data(pending, completed):
 	labels = ["Amount to Bill", "Billed Amount"]
 
 	return {
-		"data" : {
-			"labels": labels,
-			"datasets": [
-				{"values": [pending, completed]}
-				]
-		},
-		"type": 'donut',
-		"height": 300
+		"data": {"labels": labels, "datasets": [{"values": [pending, completed]}]},
+		"type": "donut",
+		"height": 300,
 	}
 
+
 def get_columns(filters):
 	columns = [
-		{
-			"label":_("Date"),
-			"fieldname": "date",
-			"fieldtype": "Date",
-			"width": 90
-		},
-		{
-			"label":_("Required By"),
-			"fieldname": "required_date",
-			"fieldtype": "Date",
-			"width": 90
-		},
+		{"label": _("Date"), "fieldname": "date", "fieldtype": "Date", "width": 90},
+		{"label": _("Required By"), "fieldname": "required_date", "fieldtype": "Date", "width": 90},
 		{
 			"label": _("Purchase Order"),
 			"fieldname": "purchase_order",
 			"fieldtype": "Link",
 			"options": "Purchase Order",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label":_("Status"),
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"width": 130
-		},
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 130},
 		{
 			"label": _("Supplier"),
 			"fieldname": "supplier",
 			"fieldtype": "Link",
 			"options": "Supplier",
-			"width": 130
-		},{
+			"width": 130,
+		},
+		{
 			"label": _("Project"),
 			"fieldname": "project",
 			"fieldtype": "Link",
 			"options": "Project",
-			"width": 130
-		}]
+			"width": 130,
+		},
+	]
 
 	if not filters.get("group_by_po"):
-		columns.append({
-			"label":_("Item Code"),
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 100
-		})
+		columns.append(
+			{
+				"label": _("Item Code"),
+				"fieldname": "item_code",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 100,
+			}
+		)
 
-	columns.extend([
-		{
-			"label": _("Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Received Qty"),
-			"fieldname": "received_qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Pending Qty"),
-			"fieldname": "pending_qty",
-			"fieldtype": "Float",
-			"width": 80,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Billed Qty"),
-			"fieldname": "billed_qty",
-			"fieldtype": "Float",
-			"width": 80,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Qty to Bill"),
-			"fieldname": "qty_to_bill",
-			"fieldtype": "Float",
-			"width": 80,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 110,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label": _("Billed Amount"),
-			"fieldname": "billed_amount",
-			"fieldtype": "Currency",
-			"width": 110,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label": _("Pending Amount"),
-			"fieldname": "pending_amount",
-			"fieldtype": "Currency",
-			"width": 130,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label": _("Received Qty Amount"),
-			"fieldname": "received_qty_amount",
-			"fieldtype": "Currency",
-			"width": 130,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label": _("Warehouse"),
-			"fieldname": "warehouse",
-			"fieldtype": "Link",
-			"options": "Warehouse",
-			"width": 100
-		},
-		{
-			"label": _("Company"),
-			"fieldname": "company",
-			"fieldtype": "Link",
-			"options": "Company",
-			"width": 100
-		}
-	])
+	columns.extend(
+		[
+			{
+				"label": _("Qty"),
+				"fieldname": "qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Received Qty"),
+				"fieldname": "received_qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Pending Qty"),
+				"fieldname": "pending_qty",
+				"fieldtype": "Float",
+				"width": 80,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Billed Qty"),
+				"fieldname": "billed_qty",
+				"fieldtype": "Float",
+				"width": 80,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Qty to Bill"),
+				"fieldname": "qty_to_bill",
+				"fieldtype": "Float",
+				"width": 80,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Amount"),
+				"fieldname": "amount",
+				"fieldtype": "Currency",
+				"width": 110,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Billed Amount"),
+				"fieldname": "billed_amount",
+				"fieldtype": "Currency",
+				"width": 110,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Pending Amount"),
+				"fieldname": "pending_amount",
+				"fieldtype": "Currency",
+				"width": 130,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Received Qty Amount"),
+				"fieldname": "received_qty_amount",
+				"fieldtype": "Currency",
+				"width": 130,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Warehouse"),
+				"fieldname": "warehouse",
+				"fieldtype": "Link",
+				"options": "Warehouse",
+				"width": 100,
+			},
+			{
+				"label": _("Company"),
+				"fieldname": "company",
+				"fieldtype": "Link",
+				"options": "Company",
+				"width": 100,
+			},
+		]
+	)
 
 	return columns
diff --git a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py
index 21643a8..11a7449 100644
--- a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py
+++ b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Purchase Order")
 	data = get_data(filters, conditions)
@@ -16,6 +17,7 @@
 
 	return conditions["columns"], data, None, chart_data
 
+
 def get_chart_data(data, conditions, filters):
 	if not (data and conditions):
 		return []
@@ -28,32 +30,27 @@
 
 	# fetch only periodic columns as labels
 	columns = conditions.get("columns")[start:-2][1::2]
-	labels = [column.split(':')[0] for column in columns]
+	labels = [column.split(":")[0] for column in columns]
 	datapoints = [0] * len(labels)
 
 	for row in data:
 		# If group by filter, don't add first row of group (it's already summed)
-		if not row[start-1]:
+		if not row[start - 1]:
 			continue
 		# Remove None values and compute only periodic data
 		row = [x if x else 0 for x in row[start:-2]]
-		row  = row[1::2]
+		row = row[1::2]
 
 		for i in range(len(row)):
 			datapoints[i] += row[i]
 
 	return {
-		"data" : {
-			"labels" : labels,
-			"datasets" : [
-				{
-					"name" : _("{0}").format(filters.get("period")) + _(" Purchase Value"),
-					"values" : datapoints
-				}
-			]
+		"data": {
+			"labels": labels,
+			"datasets": [
+				{"name": _("{0}").format(filters.get("period")) + _(" Purchase Value"), "values": datapoints}
+			],
 		},
-		"type" : "line",
-		"lineOptions": {
-			"regionFill": 1
-		}
+		"type": "line",
+		"lineOptions": {"regionFill": 1},
 	}
diff --git a/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py b/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py
index 60a8f92..21241e0 100644
--- a/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py
+++ b/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py
@@ -12,7 +12,7 @@
 
 def execute(filters=None):
 	if not filters:
-		return [],[]
+		return [], []
 
 	validate_filters(filters)
 
@@ -24,6 +24,7 @@
 
 	return columns, data, None, chart_data
 
+
 def validate_filters(filters):
 	from_date, to_date = filters.get("from_date"), filters.get("to_date")
 
@@ -32,33 +33,36 @@
 	elif date_diff(to_date, from_date) < 0:
 		frappe.throw(_("To Date cannot be before From Date."))
 
+
 def get_data(filters):
 	mr = frappe.qb.DocType("Material Request")
 	mr_item = frappe.qb.DocType("Material Request Item")
 
 	query = (
 		frappe.qb.from_(mr)
-		.join(mr_item).on(mr_item.parent == mr.name)
+		.join(mr_item)
+		.on(mr_item.parent == mr.name)
 		.select(
 			mr.name.as_("material_request"),
 			mr.transaction_date.as_("date"),
 			mr_item.schedule_date.as_("required_date"),
 			mr_item.item_code.as_("item_code"),
 			Sum(Coalesce(mr_item.stock_qty, 0)).as_("qty"),
-			Coalesce(mr_item.stock_uom, '').as_("uom"),
+			Coalesce(mr_item.stock_uom, "").as_("uom"),
 			Sum(Coalesce(mr_item.ordered_qty, 0)).as_("ordered_qty"),
 			Sum(Coalesce(mr_item.received_qty, 0)).as_("received_qty"),
-			(
-				Sum(Coalesce(mr_item.stock_qty, 0)) - Sum(Coalesce(mr_item.received_qty, 0))
-			).as_("qty_to_receive"),
+			(Sum(Coalesce(mr_item.stock_qty, 0)) - Sum(Coalesce(mr_item.received_qty, 0))).as_(
+				"qty_to_receive"
+			),
 			Sum(Coalesce(mr_item.received_qty, 0)).as_("received_qty"),
-			(
-				Sum(Coalesce(mr_item.stock_qty, 0)) - Sum(Coalesce(mr_item.ordered_qty, 0))
-			).as_("qty_to_order"),
+			(Sum(Coalesce(mr_item.stock_qty, 0)) - Sum(Coalesce(mr_item.ordered_qty, 0))).as_(
+				"qty_to_order"
+			),
 			mr_item.item_name,
 			mr_item.description,
-			mr.company
-		).where(
+			mr.company,
+		)
+		.where(
 			(mr.material_request_type == "Purchase")
 			& (mr.docstatus == 1)
 			& (mr.status != "Stopped")
@@ -66,25 +70,18 @@
 		)
 	)
 
-	query = get_conditions(filters, query, mr, mr_item) # add conditional conditions
+	query = get_conditions(filters, query, mr, mr_item)  # add conditional conditions
 
-	query = (
-		query.groupby(
-			mr.name, mr_item.item_code
-		).orderby(
-			mr.transaction_date, mr.schedule_date
-		)
-	)
+	query = query.groupby(mr.name, mr_item.item_code).orderby(mr.transaction_date, mr.schedule_date)
 	data = query.run(as_dict=True)
 	return data
 
+
 def get_conditions(filters, query, mr, mr_item):
 	if filters.get("from_date") and filters.get("to_date"):
-		query = (
-			query.where(
-				(mr.transaction_date >= filters.get("from_date"))
-				& (mr.transaction_date <= filters.get("to_date"))
-			)
+		query = query.where(
+			(mr.transaction_date >= filters.get("from_date"))
+			& (mr.transaction_date <= filters.get("to_date"))
 		)
 	if filters.get("company"):
 		query = query.where(mr.company == filters.get("company"))
@@ -97,11 +94,13 @@
 
 	return query
 
+
 def update_qty_columns(row_to_update, data_row):
 	fields = ["qty", "ordered_qty", "received_qty", "qty_to_receive", "qty_to_order"]
 	for field in fields:
 		row_to_update[field] += flt(data_row[field])
 
+
 def prepare_data(data, filters):
 	"""Prepare consolidated Report data and Chart data"""
 	material_request_map, item_qty_map = {}, {}
@@ -110,11 +109,11 @@
 		# item wise map for charts
 		if not row["item_code"] in item_qty_map:
 			item_qty_map[row["item_code"]] = {
-				"qty" : row["qty"],
-				"ordered_qty" : row["ordered_qty"],
+				"qty": row["qty"],
+				"ordered_qty": row["ordered_qty"],
 				"received_qty": row["received_qty"],
 				"qty_to_receive": row["qty_to_receive"],
-				"qty_to_order" : row["qty_to_order"],
+				"qty_to_order": row["qty_to_order"],
 			}
 		else:
 			item_entry = item_qty_map[row["item_code"]]
@@ -130,19 +129,20 @@
 				mr_row = material_request_map[row["material_request"]]
 				mr_row["required_date"] = min(getdate(mr_row["required_date"]), getdate(row["required_date"]))
 
-				#sum numeric columns
+				# sum numeric columns
 				update_qty_columns(mr_row, row)
 
 	chart_data = prepare_chart_data(item_qty_map)
 
 	if filters.get("group_by_mr"):
-		data =[]
+		data = []
 		for mr in material_request_map:
 			data.append(material_request_map[mr])
 		return data, chart_data
 
 	return data, chart_data
 
+
 def prepare_chart_data(item_data):
 	labels, qty_to_order, ordered_qty, received_qty, qty_to_receive = [], [], [], [], []
 
@@ -158,35 +158,22 @@
 		qty_to_receive.append(mr_row["qty_to_receive"])
 
 	chart_data = {
-		"data" : {
+		"data": {
 			"labels": labels,
 			"datasets": [
-				{
-					'name': _('Qty to Order'),
-					'values': qty_to_order
-				},
-				{
-					'name': _('Ordered Qty'),
-					'values': ordered_qty
-				},
-				{
-					'name': _('Received Qty'),
-					'values': received_qty
-				},
-				{
-					'name': _('Qty to Receive'),
-					'values': qty_to_receive
-				}
-			]
+				{"name": _("Qty to Order"), "values": qty_to_order},
+				{"name": _("Ordered Qty"), "values": ordered_qty},
+				{"name": _("Received Qty"), "values": received_qty},
+				{"name": _("Qty to Receive"), "values": qty_to_receive},
+			],
 		},
 		"type": "bar",
-		"barOptions": {
-			"stacked": 1
-		},
+		"barOptions": {"stacked": 1},
 	}
 
 	return chart_data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -194,92 +181,78 @@
 			"fieldname": "material_request",
 			"fieldtype": "Link",
 			"options": "Material Request",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label":_("Date"),
-			"fieldname": "date",
-			"fieldtype": "Date",
-			"width": 90
-		},
-		{
-			"label":_("Required By"),
-			"fieldname": "required_date",
-			"fieldtype": "Date",
-			"width": 100
-		}
+		{"label": _("Date"), "fieldname": "date", "fieldtype": "Date", "width": 90},
+		{"label": _("Required By"), "fieldname": "required_date", "fieldtype": "Date", "width": 100},
 	]
 
 	if not filters.get("group_by_mr"):
-		columns.extend([{
-			"label":_("Item Code"),
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 100
-		},
-		{
-			"label":_("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Description"),
-			"fieldname": "description",
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"label": _("Stock UOM"),
-			"fieldname": "uom",
-			"fieldtype": "Data",
-			"width": 100,
-		}])
+		columns.extend(
+			[
+				{
+					"label": _("Item Code"),
+					"fieldname": "item_code",
+					"fieldtype": "Link",
+					"options": "Item",
+					"width": 100,
+				},
+				{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
+				{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 200},
+				{
+					"label": _("Stock UOM"),
+					"fieldname": "uom",
+					"fieldtype": "Data",
+					"width": 100,
+				},
+			]
+		)
 
-	columns.extend([
-		{
-			"label": _("Stock Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Ordered Qty"),
-			"fieldname": "ordered_qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Received Qty"),
-			"fieldname": "received_qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Qty to Receive"),
-			"fieldname": "qty_to_receive",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Qty to Order"),
-			"fieldname": "qty_to_order",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Company"),
-			"fieldname": "company",
-			"fieldtype": "Link",
-			"options": "Company",
-			"width": 100
-		}
-	])
+	columns.extend(
+		[
+			{
+				"label": _("Stock Qty"),
+				"fieldname": "qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Ordered Qty"),
+				"fieldname": "ordered_qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Received Qty"),
+				"fieldname": "received_qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Qty to Receive"),
+				"fieldname": "qty_to_receive",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Qty to Order"),
+				"fieldname": "qty_to_order",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Company"),
+				"fieldname": "company",
+				"fieldtype": "Link",
+				"options": "Company",
+				"width": 100,
+			},
+		]
+	)
 
 	return columns
diff --git a/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py b/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py
index a533da0..5b84113 100644
--- a/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py
+++ b/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py
@@ -16,13 +16,15 @@
 class TestRequestedItemsToOrderAndReceive(FrappeTestCase):
 	def setUp(self) -> None:
 		create_item("Test MR Report Item")
-		self.setup_material_request() # to order and receive
-		self.setup_material_request(order=True, days=1) # to receive (ordered)
-		self.setup_material_request(order=True, receive=True, days=2) # complete (ordered & received)
+		self.setup_material_request()  # to order and receive
+		self.setup_material_request(order=True, days=1)  # to receive (ordered)
+		self.setup_material_request(order=True, receive=True, days=2)  # complete (ordered & received)
 
 		self.filters = frappe._dict(
-			company="_Test Company", from_date=today(), to_date=add_days(today(), 30),
-			item_code="Test MR Report Item"
+			company="_Test Company",
+			from_date=today(),
+			to_date=add_days(today(), 30),
+			item_code="Test MR Report Item",
 		)
 
 	def tearDown(self) -> None:
@@ -30,10 +32,10 @@
 
 	def test_date_range(self):
 		data = get_data(self.filters)
-		self.assertEqual(len(data), 2) # MRs today should be fetched
+		self.assertEqual(len(data), 2)  # MRs today should be fetched
 
 		data = get_data(self.filters.update({"from_date": add_days(today(), 10)}))
-		self.assertEqual(len(data), 0) # MRs today should not be fetched as from date is in future
+		self.assertEqual(len(data), 0)  # MRs today should not be fetched as from date is in future
 
 	def test_ordered_received_material_requests(self):
 		data = get_data(self.filters)
@@ -45,7 +47,7 @@
 
 	def setup_material_request(self, order=False, receive=False, days=0):
 		po = None
-		test_records = frappe.get_test_records('Material Request')
+		test_records = frappe.get_test_records("Material Request")
 
 		mr = frappe.copy_doc(test_records[0])
 		mr.transaction_date = add_days(today(), days)
@@ -65,4 +67,3 @@
 			if receive:
 				pr = make_purchase_receipt(po.name)
 				pr.submit()
-
diff --git a/erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.py b/erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.py
index 8e5c2f9..1b2705a 100644
--- a/erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.py
+++ b/erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.py
@@ -13,6 +13,7 @@
 
 	return columns, data
 
+
 def get_data(report_filters):
 	data = []
 	orders = get_subcontracted_orders(report_filters)
@@ -24,57 +25,85 @@
 
 	return data
 
+
 def get_subcontracted_orders(report_filters):
-	fields = ['`tabPurchase Order Item`.`parent` as po_id', '`tabPurchase Order Item`.`item_code`',
-		'`tabPurchase Order Item`.`item_name`', '`tabPurchase Order Item`.`qty`', '`tabPurchase Order Item`.`name`',
-		'`tabPurchase Order Item`.`received_qty`', '`tabPurchase Order`.`status`']
+	fields = [
+		"`tabPurchase Order Item`.`parent` as po_id",
+		"`tabPurchase Order Item`.`item_code`",
+		"`tabPurchase Order Item`.`item_name`",
+		"`tabPurchase Order Item`.`qty`",
+		"`tabPurchase Order Item`.`name`",
+		"`tabPurchase Order Item`.`received_qty`",
+		"`tabPurchase Order`.`status`",
+	]
 
 	filters = get_filters(report_filters)
 
-	return frappe.get_all('Purchase Order', fields = fields, filters=filters) or []
+	return frappe.get_all("Purchase Order", fields=fields, filters=filters) or []
+
 
 def get_filters(report_filters):
-	filters = [['Purchase Order', 'docstatus', '=', 1], ['Purchase Order', 'is_subcontracted', '=', 'Yes'],
-		['Purchase Order', 'transaction_date', 'between', (report_filters.from_date, report_filters.to_date)]]
+	filters = [
+		["Purchase Order", "docstatus", "=", 1],
+		["Purchase Order", "is_subcontracted", "=", "Yes"],
+		[
+			"Purchase Order",
+			"transaction_date",
+			"between",
+			(report_filters.from_date, report_filters.to_date),
+		],
+	]
 
-	for field in ['name', 'company']:
+	for field in ["name", "company"]:
 		if report_filters.get(field):
-			filters.append(['Purchase Order', field, '=', report_filters.get(field)])
+			filters.append(["Purchase Order", field, "=", report_filters.get(field)])
 
 	return filters
 
+
 def get_supplied_items(orders, report_filters):
 	if not orders:
 		return []
 
-	fields = ['parent', 'main_item_code', 'rm_item_code', 'required_qty',
-		'supplied_qty', 'returned_qty', 'total_supplied_qty', 'consumed_qty', 'reference_name']
+	fields = [
+		"parent",
+		"main_item_code",
+		"rm_item_code",
+		"required_qty",
+		"supplied_qty",
+		"returned_qty",
+		"total_supplied_qty",
+		"consumed_qty",
+		"reference_name",
+	]
 
-	filters = {'parent': ('in', [d.po_id for d in orders]), 'docstatus': 1}
+	filters = {"parent": ("in", [d.po_id for d in orders]), "docstatus": 1}
 
 	supplied_items = {}
-	for row in frappe.get_all('Purchase Order Item Supplied', fields = fields, filters=filters):
+	for row in frappe.get_all("Purchase Order Item Supplied", fields=fields, filters=filters):
 		new_key = (row.parent, row.reference_name, row.main_item_code)
 
 		supplied_items.setdefault(new_key, []).append(row)
 
 	return supplied_items
 
+
 def prepare_subcontracted_data(orders, supplied_items):
 	po_details = {}
 	for row in orders:
 		key = (row.po_id, row.name, row.item_code)
 		if key not in po_details:
-			po_details.setdefault(key, frappe._dict({'po_item': row, 'supplied_items': []}))
+			po_details.setdefault(key, frappe._dict({"po_item": row, "supplied_items": []}))
 
 		details = po_details[key]
 
 		if supplied_items.get(key):
 			for supplied_item in supplied_items[key]:
-				details['supplied_items'].append(supplied_item)
+				details["supplied_items"].append(supplied_item)
 
 	return po_details
 
+
 def get_subcontracted_data(po_details, data):
 	for key, details in po_details.items():
 		res = details.po_item
@@ -85,6 +114,7 @@
 			res.update(row)
 			data.append(res)
 
+
 def get_columns():
 	return [
 		{
@@ -92,62 +122,27 @@
 			"fieldname": "po_id",
 			"fieldtype": "Link",
 			"options": "Purchase Order",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Status"),
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"width": 80
-		},
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 80},
 		{
 			"label": _("Subcontracted Item"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label": _("Order Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 90
-		},
-		{
-			"label": _("Received Qty"),
-			"fieldname": "received_qty",
-			"fieldtype": "Float",
-			"width": 110
-		},
+		{"label": _("Order Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 90},
+		{"label": _("Received Qty"), "fieldname": "received_qty", "fieldtype": "Float", "width": 110},
 		{
 			"label": _("Supplied Item"),
 			"fieldname": "rm_item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label": _("Required Qty"),
-			"fieldname": "required_qty",
-			"fieldtype": "Float",
-			"width": 110
-		},
-		{
-			"label": _("Supplied Qty"),
-			"fieldname": "supplied_qty",
-			"fieldtype": "Float",
-			"width": 110
-		},
-		{
-			"label": _("Consumed Qty"),
-			"fieldname": "consumed_qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("Returned Qty"),
-			"fieldname": "returned_qty",
-			"fieldtype": "Float",
-			"width": 110
-		}
+		{"label": _("Required Qty"), "fieldname": "required_qty", "fieldtype": "Float", "width": 110},
+		{"label": _("Supplied Qty"), "fieldname": "supplied_qty", "fieldtype": "Float", "width": 110},
+		{"label": _("Consumed Qty"), "fieldname": "consumed_qty", "fieldtype": "Float", "width": 120},
+		{"label": _("Returned Qty"), "fieldname": "returned_qty", "fieldtype": "Float", "width": 110},
 	]
diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py
index 67e275f..004657b 100644
--- a/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py
+++ b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py
@@ -12,9 +12,10 @@
 
 	data = []
 	columns = get_columns()
-	get_data(data , filters)
+	get_data(data, filters)
 	return columns, data
 
+
 def get_columns():
 	return [
 		{
@@ -22,54 +23,39 @@
 			"fieldtype": "Link",
 			"fieldname": "purchase_order",
 			"options": "Purchase Order",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Date"),
-			"fieldtype": "Date",
-			"fieldname": "date",
-			"hidden": 1,
-			"width": 150
-		},
+		{"label": _("Date"), "fieldtype": "Date", "fieldname": "date", "hidden": 1, "width": 150},
 		{
 			"label": _("Supplier"),
 			"fieldtype": "Link",
 			"fieldname": "supplier",
 			"options": "Supplier",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Finished Good Item Code"),
 			"fieldtype": "Data",
 			"fieldname": "fg_item_code",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Item name"),
-			"fieldtype": "Data",
-			"fieldname": "item_name",
-			"width": 100
-		},
+		{"label": _("Item name"), "fieldtype": "Data", "fieldname": "item_name", "width": 100},
 		{
 			"label": _("Required Quantity"),
 			"fieldtype": "Float",
 			"fieldname": "required_qty",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Received Quantity"),
 			"fieldtype": "Float",
 			"fieldname": "received_qty",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Pending Quantity"),
-			"fieldtype": "Float",
-			"fieldname": "pending_qty",
-			"width": 100
-		}
+		{"label": _("Pending Quantity"), "fieldtype": "Float", "fieldname": "pending_qty", "width": 100},
 	]
 
+
 def get_data(data, filters):
 	po = get_po(filters)
 	po_name = [v.name for v in po]
@@ -77,29 +63,35 @@
 	for item in sub_items:
 		for order in po:
 			if order.name == item.parent and item.received_qty < item.qty:
-				row ={
-					'purchase_order': item.parent,
-					'date': order.transaction_date,
-					'supplier': order.supplier,
-					'fg_item_code': item.item_code,
-					'item_name': item.item_name,
-					'required_qty': item.qty,
-					'received_qty':item.received_qty,
-					'pending_qty':item.qty - item.received_qty
+				row = {
+					"purchase_order": item.parent,
+					"date": order.transaction_date,
+					"supplier": order.supplier,
+					"fg_item_code": item.item_code,
+					"item_name": item.item_name,
+					"required_qty": item.qty,
+					"received_qty": item.received_qty,
+					"pending_qty": item.qty - item.received_qty,
 				}
 				data.append(row)
 
+
 def get_po(filters):
 	record_filters = [
-			["is_subcontracted", "=", "Yes"],
-			["supplier", "=", filters.supplier],
-			["transaction_date", "<=", filters.to_date],
-			["transaction_date", ">=", filters.from_date],
-			["docstatus", "=", 1]
-		]
-	return frappe.get_all("Purchase Order", filters=record_filters, fields=["name", "transaction_date", "supplier"])
+		["is_subcontracted", "=", "Yes"],
+		["supplier", "=", filters.supplier],
+		["transaction_date", "<=", filters.to_date],
+		["transaction_date", ">=", filters.from_date],
+		["docstatus", "=", 1],
+	]
+	return frappe.get_all(
+		"Purchase Order", filters=record_filters, fields=["name", "transaction_date", "supplier"]
+	)
+
 
 def get_purchase_order_item_supplied(po):
-	return frappe.get_all("Purchase Order Item", filters=[
-			('parent', 'IN', po)
-	], fields=["parent", "item_code", "item_name", "qty", "received_qty"])
+	return frappe.get_all(
+		"Purchase Order Item",
+		filters=[("parent", "IN", po)],
+		fields=["parent", "item_code", "item_name", "qty", "received_qty"],
+	)
diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py b/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py
index c2b38d3..26e4243 100644
--- a/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py
+++ b/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py
@@ -16,26 +16,40 @@
 
 
 class TestSubcontractedItemToBeReceived(FrappeTestCase):
-
 	def test_pending_and_received_qty(self):
-		po = create_purchase_order(item_code='_Test FG Item', is_subcontracted='Yes')
+		po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
 		transfer_param = []
-		make_stock_entry(item_code='_Test Item', target='_Test Warehouse 1 - _TC', qty=100, basic_rate=100)
-		make_stock_entry(item_code='_Test Item Home Desktop 100', target='_Test Warehouse 1 - _TC', qty=100, basic_rate=100)
+		make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse 1 - _TC", qty=100, basic_rate=100
+		)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse 1 - _TC",
+			qty=100,
+			basic_rate=100,
+		)
 		make_purchase_receipt_against_po(po.name)
 		po.reload()
-		col, data = execute(filters=frappe._dict({'supplier': po.supplier,
-		   'from_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=-10)),
-		   'to_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=10))}))
-		self.assertEqual(data[0]['pending_qty'], 5)
-		self.assertEqual(data[0]['received_qty'], 5)
-		self.assertEqual(data[0]['purchase_order'], po.name)
-		self.assertEqual(data[0]['supplier'], po.supplier)
+		col, data = execute(
+			filters=frappe._dict(
+				{
+					"supplier": po.supplier,
+					"from_date": frappe.utils.get_datetime(
+						frappe.utils.add_to_date(po.transaction_date, days=-10)
+					),
+					"to_date": frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=10)),
+				}
+			)
+		)
+		self.assertEqual(data[0]["pending_qty"], 5)
+		self.assertEqual(data[0]["received_qty"], 5)
+		self.assertEqual(data[0]["purchase_order"], po.name)
+		self.assertEqual(data[0]["supplier"], po.supplier)
 
 
 def make_purchase_receipt_against_po(po, quantity=5):
 	pr = make_purchase_receipt(po)
 	pr.items[0].qty = quantity
-	pr.supplier_warehouse = '_Test Warehouse 1 - _TC'
+	pr.supplier_warehouse = "_Test Warehouse 1 - _TC"
 	pr.insert()
 	pr.submit()
diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py
index 6b605ad..98b18da 100644
--- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py
+++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py
@@ -15,6 +15,7 @@
 
 	return columns, data or []
 
+
 def get_columns():
 	return [
 		{
@@ -22,47 +23,28 @@
 			"fieldtype": "Link",
 			"fieldname": "purchase_order",
 			"options": "Purchase Order",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Date"),
-			"fieldtype": "Date",
-			"fieldname": "date",
-			"width": 150
-		},
+		{"label": _("Date"), "fieldtype": "Date", "fieldname": "date", "width": 150},
 		{
 			"label": _("Supplier"),
 			"fieldtype": "Link",
 			"fieldname": "supplier",
 			"options": "Supplier",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Item Code"),
-			"fieldtype": "Data",
-			"fieldname": "rm_item_code",
-			"width": 150
-		},
-		{
-			"label": _("Required Quantity"),
-			"fieldtype": "Float",
-			"fieldname": "reqd_qty",
-			"width": 150
-		},
+		{"label": _("Item Code"), "fieldtype": "Data", "fieldname": "rm_item_code", "width": 150},
+		{"label": _("Required Quantity"), "fieldtype": "Float", "fieldname": "reqd_qty", "width": 150},
 		{
 			"label": _("Transferred Quantity"),
 			"fieldtype": "Float",
 			"fieldname": "transferred_qty",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Pending Quantity"),
-			"fieldtype": "Float",
-			"fieldname": "p_qty",
-			"width": 150
-		}
+		{"label": _("Pending Quantity"), "fieldtype": "Float", "fieldname": "p_qty", "width": 150},
 	]
 
+
 def get_data(filters):
 	po_rm_item_details = get_po_items_to_supply(filters)
 
@@ -76,6 +58,7 @@
 
 	return data
 
+
 def get_po_items_to_supply(filters):
 	return frappe.db.get_all(
 		"Purchase Order",
@@ -85,14 +68,14 @@
 			"supplier as supplier",
 			"`tabPurchase Order Item Supplied`.rm_item_code as rm_item_code",
 			"`tabPurchase Order Item Supplied`.required_qty as reqd_qty",
-			"`tabPurchase Order Item Supplied`.supplied_qty as transferred_qty"
+			"`tabPurchase Order Item Supplied`.supplied_qty as transferred_qty",
 		],
-		filters = [
+		filters=[
 			["Purchase Order", "per_received", "<", "100"],
 			["Purchase Order", "is_subcontracted", "=", "Yes"],
 			["Purchase Order", "supplier", "=", filters.supplier],
 			["Purchase Order", "transaction_date", "<=", filters.to_date],
 			["Purchase Order", "transaction_date", ">=", filters.from_date],
-			["Purchase Order", "docstatus", "=", 1]
-		]
+			["Purchase Order", "docstatus", "=", 1],
+		],
 	)
diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
index fc9acab..401176d 100644
--- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
+++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
@@ -17,82 +17,87 @@
 
 
 class TestSubcontractedItemToBeTransferred(FrappeTestCase):
-
 	def test_pending_and_transferred_qty(self):
-		po = create_purchase_order(item_code='_Test FG Item', is_subcontracted='Yes', supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			item_code="_Test FG Item", is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		# Material Receipt of RMs
-		make_stock_entry(item_code='_Test Item', target='_Test Warehouse - _TC', qty=100, basic_rate=100)
-		make_stock_entry(item_code='_Test Item Home Desktop 100', target='_Test Warehouse - _TC', qty=100, basic_rate=100)
+		make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=100, basic_rate=100)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=100, basic_rate=100
+		)
 
 		se = transfer_subcontracted_raw_materials(po)
 
-		col, data = execute(filters=frappe._dict(
-			{
-				'supplier': po.supplier,
-				'from_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=-10)),
-				'to_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=10))
-			}
-		))
+		col, data = execute(
+			filters=frappe._dict(
+				{
+					"supplier": po.supplier,
+					"from_date": frappe.utils.get_datetime(
+						frappe.utils.add_to_date(po.transaction_date, days=-10)
+					),
+					"to_date": frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=10)),
+				}
+			)
+		)
 		po.reload()
 
-		po_data = [row for row in data if row.get('purchase_order') == po.name]
+		po_data = [row for row in data if row.get("purchase_order") == po.name]
 		# Alphabetically sort to be certain of order
-		po_data = sorted(po_data, key = lambda i: i['rm_item_code'])
+		po_data = sorted(po_data, key=lambda i: i["rm_item_code"])
 
 		self.assertEqual(len(po_data), 2)
-		self.assertEqual(po_data[0]['purchase_order'], po.name)
+		self.assertEqual(po_data[0]["purchase_order"], po.name)
 
-		self.assertEqual(po_data[0]['rm_item_code'], '_Test Item')
-		self.assertEqual(po_data[0]['p_qty'], 8)
-		self.assertEqual(po_data[0]['transferred_qty'], 2)
+		self.assertEqual(po_data[0]["rm_item_code"], "_Test Item")
+		self.assertEqual(po_data[0]["p_qty"], 8)
+		self.assertEqual(po_data[0]["transferred_qty"], 2)
 
-		self.assertEqual(po_data[1]['rm_item_code'], '_Test Item Home Desktop 100')
-		self.assertEqual(po_data[1]['p_qty'], 19)
-		self.assertEqual(po_data[1]['transferred_qty'], 1)
+		self.assertEqual(po_data[1]["rm_item_code"], "_Test Item Home Desktop 100")
+		self.assertEqual(po_data[1]["p_qty"], 19)
+		self.assertEqual(po_data[1]["transferred_qty"], 1)
 
 		se.cancel()
 		po.cancel()
 
+
 def transfer_subcontracted_raw_materials(po):
 	# Order of supplied items fetched in PO is flaky
-	transfer_qty_map = {
-		'_Test Item': 2,
-		'_Test Item Home Desktop 100': 1
-	}
+	transfer_qty_map = {"_Test Item": 2, "_Test Item Home Desktop 100": 1}
 
 	item_1 = po.supplied_items[0].rm_item_code
 	item_2 = po.supplied_items[1].rm_item_code
 
 	rm_item = [
 		{
-			'name': po.supplied_items[0].name,
-			'item_code': item_1,
-			'rm_item_code': item_1,
-			'item_name': item_1,
-			'qty': transfer_qty_map[item_1],
-			'warehouse': '_Test Warehouse - _TC',
-			'rate': 100,
-			'amount': 100 * transfer_qty_map[item_1],
-			'stock_uom': 'Nos'
+			"name": po.supplied_items[0].name,
+			"item_code": item_1,
+			"rm_item_code": item_1,
+			"item_name": item_1,
+			"qty": transfer_qty_map[item_1],
+			"warehouse": "_Test Warehouse - _TC",
+			"rate": 100,
+			"amount": 100 * transfer_qty_map[item_1],
+			"stock_uom": "Nos",
 		},
 		{
-			'name': po.supplied_items[1].name,
-			'item_code': item_2,
-			'rm_item_code': item_2,
-			'item_name': item_2,
-			'qty': transfer_qty_map[item_2],
-			'warehouse': '_Test Warehouse - _TC',
-			'rate': 100,
-			'amount': 100 * transfer_qty_map[item_2],
-			'stock_uom': 'Nos'
-		}
+			"name": po.supplied_items[1].name,
+			"item_code": item_2,
+			"rm_item_code": item_2,
+			"item_name": item_2,
+			"qty": transfer_qty_map[item_2],
+			"warehouse": "_Test Warehouse - _TC",
+			"rate": 100,
+			"amount": 100 * transfer_qty_map[item_2],
+			"stock_uom": "Nos",
+		},
 	]
 	rm_item_string = json.dumps(rm_item)
 	se = frappe.get_doc(make_rm_stock_entry(po.name, rm_item_string))
-	se.from_warehouse = '_Test Warehouse - _TC'
-	se.to_warehouse = '_Test Warehouse - _TC'
-	se.stock_entry_type = 'Send to Subcontractor'
+	se.from_warehouse = "_Test Warehouse - _TC"
+	se.to_warehouse = "_Test Warehouse - _TC"
+	se.stock_entry_type = "Send to Subcontractor"
 	se.save()
 	se.submit()
 	return se
diff --git a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py
index 65f9ce3..3013b6d 100644
--- a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py
+++ b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py
@@ -24,6 +24,7 @@
 
 	return columns, data, message, chart_data
 
+
 def get_conditions(filters):
 	conditions = ""
 	if filters.get("item_code"):
@@ -43,8 +44,10 @@
 
 	return conditions
 
+
 def get_data(filters, conditions):
-	supplier_quotation_data = frappe.db.sql("""
+	supplier_quotation_data = frappe.db.sql(
+		"""
 		SELECT
 			sqi.parent, sqi.item_code,
 			sqi.qty, sqi.stock_qty, sqi.amount,
@@ -60,23 +63,33 @@
 			AND sq.company = %(company)s
 			AND sq.transaction_date between %(from_date)s and %(to_date)s
 			{0}
-			order by sq.transaction_date, sqi.item_code""".format(conditions), filters, as_dict=1)
+			order by sq.transaction_date, sqi.item_code""".format(
+			conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return supplier_quotation_data
 
+
 def prepare_data(supplier_quotation_data, filters):
 	out, groups, qty_list, suppliers, chart_data = [], [], [], [], []
 	group_wise_map = defaultdict(list)
 	supplier_qty_price_map = {}
 
-	group_by_field = "supplier_name" if filters.get("group_by") == "Group by Supplier" else "item_code"
+	group_by_field = (
+		"supplier_name" if filters.get("group_by") == "Group by Supplier" else "item_code"
+	)
 	company_currency = frappe.db.get_default("currency")
 	float_precision = cint(frappe.db.get_default("float_precision")) or 2
 
 	for data in supplier_quotation_data:
-		group = data.get(group_by_field) # get item or supplier value for this row
+		group = data.get(group_by_field)  # get item or supplier value for this row
 
-		supplier_currency = frappe.db.get_value("Supplier", data.get("supplier_name"), "default_currency")
+		supplier_currency = frappe.db.get_value(
+			"Supplier", data.get("supplier_name"), "default_currency"
+		)
 
 		if supplier_currency:
 			exchange_rate = get_exchange_rate(supplier_currency, company_currency)
@@ -84,16 +97,18 @@
 			exchange_rate = 1
 
 		row = {
-			"item_code":  "" if group_by_field=="item_code" else data.get("item_code"), # leave blank if group by field
-			"supplier_name": "" if group_by_field=="supplier_name" else data.get("supplier_name"),
+			"item_code": ""
+			if group_by_field == "item_code"
+			else data.get("item_code"),  # leave blank if group by field
+			"supplier_name": "" if group_by_field == "supplier_name" else data.get("supplier_name"),
 			"quotation": data.get("parent"),
 			"qty": data.get("qty"),
 			"price": flt(data.get("amount") * exchange_rate, float_precision),
 			"uom": data.get("uom"),
-			"stock_uom": data.get('stock_uom'),
+			"stock_uom": data.get("stock_uom"),
 			"request_for_quotation": data.get("request_for_quotation"),
-			"valid_till": data.get('valid_till'),
-			"lead_time_days": data.get('lead_time_days')
+			"valid_till": data.get("valid_till"),
+			"lead_time_days": data.get("lead_time_days"),
 		}
 		row["price_per_unit"] = flt(row["price"]) / (flt(data.get("stock_qty")) or 1)
 
@@ -119,8 +134,8 @@
 
 	# final data format for report view
 	for group in groups:
-		group_entries = group_wise_map[group] # all entries pertaining to item/supplier
-		group_entries[0].update({group_by_field : group}) # Add item/supplier name in first group row
+		group_entries = group_wise_map[group]  # all entries pertaining to item/supplier
+		group_entries[0].update({group_by_field: group})  # Add item/supplier name in first group row
 
 		if highlight_min_price:
 			prices = [group_entry["price_per_unit"] for group_entry in group_entries]
@@ -137,6 +152,7 @@
 
 	return out, chart_data
 
+
 def prepare_chart_data(suppliers, qty_list, supplier_qty_price_map):
 	data_points_map = {}
 	qty_list.sort()
@@ -157,107 +173,89 @@
 	for qty in qty_list:
 		datapoints = {
 			"name": currency_symbol + " (Qty " + str(qty) + " )",
-			"values": data_points_map[qty]
+			"values": data_points_map[qty],
 		}
 		dataset.append(datapoints)
 
-	chart_data = {
-		"data": {
-			"labels": suppliers,
-			"datasets": dataset
-		},
-		"type": "bar"
-	}
+	chart_data = {"data": {"labels": suppliers, "datasets": dataset}, "type": "bar"}
 
 	return chart_data
 
+
 def get_columns(filters):
 	group_by_columns = [
-	{
-		"fieldname": "supplier_name",
-		"label": _("Supplier"),
-		"fieldtype": "Link",
-		"options": "Supplier",
-		"width": 150
-	},
-	{
-		"fieldname": "item_code",
-		"label": _("Item"),
-		"fieldtype": "Link",
-		"options": "Item",
-		"width": 150
-	}]
+		{
+			"fieldname": "supplier_name",
+			"label": _("Supplier"),
+			"fieldtype": "Link",
+			"options": "Supplier",
+			"width": 150,
+		},
+		{
+			"fieldname": "item_code",
+			"label": _("Item"),
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 150,
+		},
+	]
 
 	columns = [
-	{
-		"fieldname": "uom",
-		"label": _("UOM"),
-		"fieldtype": "Link",
-		"options": "UOM",
-		"width": 90
-	},
-	{
-		"fieldname": "qty",
-		"label": _("Quantity"),
-		"fieldtype": "Float",
-		"width": 80
-	},
-	{
-		"fieldname": "price",
-		"label": _("Price"),
-		"fieldtype": "Currency",
-		"options": "Company:company:default_currency",
-		"width": 110
-	},
-	{
-		"fieldname": "stock_uom",
-		"label": _("Stock UOM"),
-		"fieldtype": "Link",
-		"options": "UOM",
-		"width": 90
-	},
-	{
-		"fieldname": "price_per_unit",
-		"label": _("Price per Unit (Stock UOM)"),
-		"fieldtype": "Currency",
-		"options": "Company:company:default_currency",
-		"width": 120
-	},
-	{
-		"fieldname": "quotation",
-		"label": _("Supplier Quotation"),
-		"fieldtype": "Link",
-		"options": "Supplier Quotation",
-		"width": 200
-	},
-	{
-		"fieldname": "valid_till",
-		"label": _("Valid Till"),
-		"fieldtype": "Date",
-		"width": 100
-	},
-	{
-		"fieldname": "lead_time_days",
-		"label": _("Lead Time (Days)"),
-		"fieldtype": "Int",
-		"width": 100
-	},
-	{
-		"fieldname": "request_for_quotation",
-		"label": _("Request for Quotation"),
-		"fieldtype": "Link",
-		"options": "Request for Quotation",
-		"width": 150
-	}]
+		{"fieldname": "uom", "label": _("UOM"), "fieldtype": "Link", "options": "UOM", "width": 90},
+		{"fieldname": "qty", "label": _("Quantity"), "fieldtype": "Float", "width": 80},
+		{
+			"fieldname": "price",
+			"label": _("Price"),
+			"fieldtype": "Currency",
+			"options": "Company:company:default_currency",
+			"width": 110,
+		},
+		{
+			"fieldname": "stock_uom",
+			"label": _("Stock UOM"),
+			"fieldtype": "Link",
+			"options": "UOM",
+			"width": 90,
+		},
+		{
+			"fieldname": "price_per_unit",
+			"label": _("Price per Unit (Stock UOM)"),
+			"fieldtype": "Currency",
+			"options": "Company:company:default_currency",
+			"width": 120,
+		},
+		{
+			"fieldname": "quotation",
+			"label": _("Supplier Quotation"),
+			"fieldtype": "Link",
+			"options": "Supplier Quotation",
+			"width": 200,
+		},
+		{"fieldname": "valid_till", "label": _("Valid Till"), "fieldtype": "Date", "width": 100},
+		{
+			"fieldname": "lead_time_days",
+			"label": _("Lead Time (Days)"),
+			"fieldtype": "Int",
+			"width": 100,
+		},
+		{
+			"fieldname": "request_for_quotation",
+			"label": _("Request for Quotation"),
+			"fieldtype": "Link",
+			"options": "Request for Quotation",
+			"width": 150,
+		},
+	]
 
 	if filters.get("group_by") == "Group by Item":
 		group_by_columns.reverse()
 
-	columns[0:0] = group_by_columns # add positioned group by columns to the report
+	columns[0:0] = group_by_columns  # add positioned group by columns to the report
 	return columns
 
+
 def get_message():
-	return  """<span class="indicator">
+	return """<span class="indicator">
 		Valid till : &nbsp;&nbsp;
 		</span>
 		<span class="indicator orange">
diff --git a/erpnext/buying/utils.py b/erpnext/buying/utils.py
index 66c60d5..f97cd5e 100644
--- a/erpnext/buying/utils.py
+++ b/erpnext/buying/utils.py
@@ -14,7 +14,8 @@
 def update_last_purchase_rate(doc, is_submit):
 	"""updates last_purchase_rate in item table for each item"""
 	import frappe.utils
-	this_purchase_date = frappe.utils.getdate(doc.get('posting_date') or doc.get('transaction_date'))
+
+	this_purchase_date = frappe.utils.getdate(doc.get("posting_date") or doc.get("transaction_date"))
 
 	for d in doc.get("items"):
 		# get last purchase details
@@ -22,9 +23,10 @@
 
 		# compare last purchase date and this transaction's date
 		last_purchase_rate = None
-		if last_purchase_details and \
-				(doc.get('docstatus') == 2 or last_purchase_details.purchase_date > this_purchase_date):
-			last_purchase_rate = last_purchase_details['base_net_rate']
+		if last_purchase_details and (
+			doc.get("docstatus") == 2 or last_purchase_details.purchase_date > this_purchase_date
+		):
+			last_purchase_rate = last_purchase_details["base_net_rate"]
 		elif is_submit == 1:
 			# even if this transaction is the latest one, it should be submitted
 			# for it to be considered for latest purchase rate
@@ -36,9 +38,7 @@
 				frappe.throw(_("UOM Conversion factor is required in row {0}").format(d.idx))
 
 		# update last purchsae rate
-		frappe.db.set_value('Item', d.item_code, 'last_purchase_rate', flt(last_purchase_rate))
-
-
+		frappe.db.set_value("Item", d.item_code, "last_purchase_rate", flt(last_purchase_rate))
 
 
 def validate_for_items(doc):
@@ -50,44 +50,65 @@
 			frappe.throw(_("Please enter quantity for Item {0}").format(d.item_code))
 
 		# update with latest quantities
-		bin = frappe.db.sql("""select projected_qty from `tabBin` where
-			item_code = %s and warehouse = %s""", (d.item_code, d.warehouse), as_dict=1)
+		bin = frappe.db.sql(
+			"""select projected_qty from `tabBin` where
+			item_code = %s and warehouse = %s""",
+			(d.item_code, d.warehouse),
+			as_dict=1,
+		)
 
-		f_lst ={'projected_qty': bin and flt(bin[0]['projected_qty']) or 0, 'ordered_qty': 0, 'received_qty' : 0}
-		if d.doctype in ('Purchase Receipt Item', 'Purchase Invoice Item'):
-			f_lst.pop('received_qty')
-		for x in f_lst :
+		f_lst = {
+			"projected_qty": bin and flt(bin[0]["projected_qty"]) or 0,
+			"ordered_qty": 0,
+			"received_qty": 0,
+		}
+		if d.doctype in ("Purchase Receipt Item", "Purchase Invoice Item"):
+			f_lst.pop("received_qty")
+		for x in f_lst:
 			if d.meta.get_field(x):
 				d.set(x, f_lst[x])
 
-		item = frappe.db.sql("""select is_stock_item,
+		item = frappe.db.sql(
+			"""select is_stock_item,
 			is_sub_contracted_item, end_of_life, disabled from `tabItem` where name=%s""",
-			d.item_code, as_dict=1)[0]
+			d.item_code,
+			as_dict=1,
+		)[0]
 
 		validate_end_of_life(d.item_code, item.end_of_life, item.disabled)
 
 		# validate stock item
-		if item.is_stock_item==1 and d.qty and not d.warehouse and not d.get("delivered_by_supplier"):
-			frappe.throw(_("Warehouse is mandatory for stock Item {0} in row {1}").format(d.item_code, d.idx))
+		if item.is_stock_item == 1 and d.qty and not d.warehouse and not d.get("delivered_by_supplier"):
+			frappe.throw(
+				_("Warehouse is mandatory for stock Item {0} in row {1}").format(d.item_code, d.idx)
+			)
 
 		items.append(cstr(d.item_code))
 
-	if items and len(items) != len(set(items)) and \
-		not cint(frappe.db.get_single_value("Buying Settings", "allow_multiple_items") or 0):
+	if (
+		items
+		and len(items) != len(set(items))
+		and not cint(frappe.db.get_single_value("Buying Settings", "allow_multiple_items") or 0)
+	):
 		frappe.throw(_("Same item cannot be entered multiple times."))
 
+
 def check_on_hold_or_closed_status(doctype, docname):
 	status = frappe.db.get_value(doctype, docname, "status")
 
 	if status in ("Closed", "On Hold"):
-		frappe.throw(_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError)
+		frappe.throw(
+			_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError
+		)
+
 
 @frappe.whitelist()
 def get_linked_material_requests(items):
 	items = json.loads(items)
 	mr_list = []
 	for item in items:
-		material_request = frappe.db.sql("""SELECT distinct mr.name AS mr_name,
+		material_request = frappe.db.sql(
+			"""SELECT distinct mr.name AS mr_name,
 				(mr_item.qty - mr_item.ordered_qty) AS qty,
 				mr_item.item_code AS item_code,
 				mr_item.name AS mr_item
@@ -98,7 +119,10 @@
 				AND mr.per_ordered < 99.99
 				AND mr.docstatus = 1
 				AND mr.status != 'Stopped'
-                        ORDER BY mr_item.item_code ASC""",{"item": item}, as_dict=1)
+                        ORDER BY mr_item.item_code ASC""",
+			{"item": item},
+			as_dict=1,
+		)
 		if material_request:
 			mr_list.append(material_request)
 
diff --git a/erpnext/commands/__init__.py b/erpnext/commands/__init__.py
index 8e12fad..ddf0acc 100644
--- a/erpnext/commands/__init__.py
+++ b/erpnext/commands/__init__.py
@@ -7,4 +7,5 @@
 def call_command(cmd, context):
 	return click.Context(cmd, obj=context).forward(cmd)
 
+
 commands = []
diff --git a/erpnext/config/education.py b/erpnext/config/education.py
index d718a94..c37cf2b 100644
--- a/erpnext/config/education.py
+++ b/erpnext/config/education.py
@@ -11,113 +11,61 @@
 					"name": "Student",
 					"onboard": 1,
 				},
-				{
-					"type": "doctype",
-					"name": "Guardian"
-				},
-				{
-					"type": "doctype",
-					"name": "Student Log"
-				},
-				{
-					"type": "doctype",
-					"name": "Student Group"
-				}
-			]
+				{"type": "doctype", "name": "Guardian"},
+				{"type": "doctype", "name": "Student Log"},
+				{"type": "doctype", "name": "Student Group"},
+			],
 		},
 		{
 			"label": _("Admission"),
 			"items": [
-
-				{
-					"type": "doctype",
-					"name": "Student Applicant"
-				},
-				{
-					"type": "doctype",
-					"name": "Web Academy Applicant"
-				},
-				{
-					"type": "doctype",
-					"name": "Student Admission"
-				},
-				{
-					"type": "doctype",
-					"name": "Program Enrollment"
-				}
-			]
+				{"type": "doctype", "name": "Student Applicant"},
+				{"type": "doctype", "name": "Web Academy Applicant"},
+				{"type": "doctype", "name": "Student Admission"},
+				{"type": "doctype", "name": "Program Enrollment"},
+			],
 		},
 		{
 			"label": _("Attendance"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Student Attendance"
-				},
-				{
-					"type": "doctype",
-					"name": "Student Leave Application"
-				},
+				{"type": "doctype", "name": "Student Attendance"},
+				{"type": "doctype", "name": "Student Leave Application"},
 				{
 					"type": "report",
 					"is_query_report": True,
 					"name": "Absent Student Report",
-					"doctype": "Student Attendance"
+					"doctype": "Student Attendance",
 				},
 				{
 					"type": "report",
 					"is_query_report": True,
 					"name": "Student Batch-Wise Attendance",
-					"doctype": "Student Attendance"
+					"doctype": "Student Attendance",
 				},
-			]
+			],
 		},
 		{
 			"label": _("Tools"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Student Attendance Tool"
-				},
-				{
-					"type": "doctype",
-					"name": "Assessment Result Tool"
-				},
-				{
-					"type": "doctype",
-					"name": "Student Group Creation Tool"
-				},
-				{
-					"type": "doctype",
-					"name": "Program Enrollment Tool"
-				},
-				{
-					"type": "doctype",
-					"name": "Course Scheduling Tool"
-				}
-			]
+				{"type": "doctype", "name": "Student Attendance Tool"},
+				{"type": "doctype", "name": "Assessment Result Tool"},
+				{"type": "doctype", "name": "Student Group Creation Tool"},
+				{"type": "doctype", "name": "Program Enrollment Tool"},
+				{"type": "doctype", "name": "Course Scheduling Tool"},
+			],
 		},
 		{
 			"label": _("Assessment"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Assessment Plan"
-				},
+				{"type": "doctype", "name": "Assessment Plan"},
 				{
 					"type": "doctype",
 					"name": "Assessment Group",
 					"link": "Tree/Assessment Group",
 				},
-				{
-					"type": "doctype",
-					"name": "Assessment Result"
-				},
-				{
-					"type": "doctype",
-					"name": "Assessment Criteria"
-				}
-			]
+				{"type": "doctype", "name": "Assessment Result"},
+				{"type": "doctype", "name": "Assessment Criteria"},
+			],
 		},
 		{
 			"label": _("Assessment Reports"),
@@ -126,60 +74,38 @@
 					"type": "report",
 					"is_query_report": True,
 					"name": "Course wise Assessment Report",
-					"doctype": "Assessment Result"
+					"doctype": "Assessment Result",
 				},
 				{
 					"type": "report",
 					"is_query_report": True,
 					"name": "Final Assessment Grades",
-					"doctype": "Assessment Result"
+					"doctype": "Assessment Result",
 				},
 				{
 					"type": "report",
 					"is_query_report": True,
 					"name": "Assessment Plan Status",
-					"doctype": "Assessment Plan"
+					"doctype": "Assessment Plan",
 				},
-				{
-					"type": "doctype",
-					"name": "Student Report Generation Tool"
-				}
-			]
+				{"type": "doctype", "name": "Student Report Generation Tool"},
+			],
 		},
 		{
 			"label": _("Fees"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Fees"
-				},
-				{
-					"type": "doctype",
-					"name": "Fee Schedule"
-				},
-				{
-					"type": "doctype",
-					"name": "Fee Structure"
-				},
-				{
-					"type": "doctype",
-					"name": "Fee Category"
-				}
-			]
+				{"type": "doctype", "name": "Fees"},
+				{"type": "doctype", "name": "Fee Schedule"},
+				{"type": "doctype", "name": "Fee Structure"},
+				{"type": "doctype", "name": "Fee Category"},
+			],
 		},
 		{
 			"label": _("Schedule"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Course Schedule",
-					"route": "/app/List/Course Schedule/Calendar"
-				},
-				{
-					"type": "doctype",
-					"name": "Course Scheduling Tool"
-				}
-			]
+				{"type": "doctype", "name": "Course Schedule", "route": "/app/List/Course Schedule/Calendar"},
+				{"type": "doctype", "name": "Course Scheduling Tool"},
+			],
 		},
 		{
 			"label": _("Masters"),
@@ -206,72 +132,39 @@
 					"type": "doctype",
 					"name": "Room",
 					"onboard": 1,
-				}
-			]
+				},
+			],
 		},
 		{
 			"label": _("Content Masters"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Article"
-				},
-				{
-					"type": "doctype",
-					"name": "Video"
-				},
-				{
-					"type": "doctype",
-					"name": "Quiz"
-				}
-			]
+				{"type": "doctype", "name": "Article"},
+				{"type": "doctype", "name": "Video"},
+				{"type": "doctype", "name": "Quiz"},
+			],
 		},
 		{
 			"label": _("LMS Activity"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Course Enrollment"
-				},
-				{
-					"type": "doctype",
-					"name": "Course Activity"
-				},
-				{
-					"type": "doctype",
-					"name": "Quiz Activity"
-				}
-			]
+				{"type": "doctype", "name": "Course Enrollment"},
+				{"type": "doctype", "name": "Course Activity"},
+				{"type": "doctype", "name": "Quiz Activity"},
+			],
 		},
 		{
 			"label": _("Settings"),
 			"items": [
-				{
-					"type": "doctype",
-					"name": "Student Category"
-				},
-				{
-					"type": "doctype",
-					"name": "Student Batch Name"
-				},
+				{"type": "doctype", "name": "Student Category"},
+				{"type": "doctype", "name": "Student Batch Name"},
 				{
 					"type": "doctype",
 					"name": "Grading Scale",
 					"onboard": 1,
 				},
-				{
-					"type": "doctype",
-					"name": "Academic Term"
-				},
-				{
-					"type": "doctype",
-					"name": "Academic Year"
-				},
-				{
-					"type": "doctype",
-					"name": "Education Settings"
-				}
-			]
+				{"type": "doctype", "name": "Academic Term"},
+				{"type": "doctype", "name": "Academic Year"},
+				{"type": "doctype", "name": "Education Settings"},
+			],
 		},
 		{
 			"label": _("Other Reports"),
@@ -280,20 +173,20 @@
 					"type": "report",
 					"is_query_report": True,
 					"name": "Student and Guardian Contact Details",
-					"doctype": "Program Enrollment"
+					"doctype": "Program Enrollment",
 				},
 				{
 					"type": "report",
 					"is_query_report": True,
 					"name": "Student Monthly Attendance Sheet",
-					"doctype": "Student Attendance"
+					"doctype": "Student Attendance",
 				},
 				{
 					"type": "report",
 					"name": "Student Fee Collection",
 					"doctype": "Fees",
-					"is_query_report": True
-				}
-			]
-		}
+					"is_query_report": True,
+				},
+			],
+		},
 	]
diff --git a/erpnext/config/projects.py b/erpnext/config/projects.py
index f4675e7..6186a4e 100644
--- a/erpnext/config/projects.py
+++ b/erpnext/config/projects.py
@@ -44,7 +44,7 @@
 					"description": _("Project Update."),
 					"dependencies": ["Project"],
 				},
-			]
+			],
 		},
 		{
 			"label": _("Time Tracking"),
@@ -67,7 +67,7 @@
 					"description": _("Cost of various activities"),
 					"dependencies": ["Activity Type"],
 				},
-			]
+			],
 		},
 		{
 			"label": _("Reports"),
@@ -95,7 +95,6 @@
 					"doctype": "Project",
 					"dependencies": ["Project"],
 				},
-			]
+			],
 		},
-
 	]
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 34ff457..72ac1b3 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -56,10 +56,22 @@
 from erpnext.utilities.transaction_base import TransactionBase
 
 
-class AccountMissingError(frappe.ValidationError): pass
+class AccountMissingError(frappe.ValidationError):
+	pass
 
-force_item_fields = ("item_group", "brand", "stock_uom", "is_fixed_asset", "item_tax_rate",
-	"pricing_rules", "weight_per_unit", "weight_uom", "total_weight")
+
+force_item_fields = (
+	"item_group",
+	"brand",
+	"stock_uom",
+	"is_fixed_asset",
+	"item_tax_rate",
+	"pricing_rules",
+	"weight_per_unit",
+	"weight_uom",
+	"total_weight",
+)
+
 
 class AccountsController(TransactionBase):
 	def __init__(self, *args, **kwargs):
@@ -67,14 +79,14 @@
 
 	def get_print_settings(self):
 		print_setting_fields = []
-		items_field = self.meta.get_field('items')
+		items_field = self.meta.get_field("items")
 
-		if items_field and items_field.fieldtype == 'Table':
-			print_setting_fields += ['compact_item_print', 'print_uom_after_quantity']
+		if items_field and items_field.fieldtype == "Table":
+			print_setting_fields += ["compact_item_print", "print_uom_after_quantity"]
 
-		taxes_field = self.meta.get_field('taxes')
-		if taxes_field and taxes_field.fieldtype == 'Table':
-			print_setting_fields += ['print_taxes_with_zero_amount']
+		taxes_field = self.meta.get_field("taxes")
+		if taxes_field and taxes_field.fieldtype == "Table":
+			print_setting_fields += ["print_taxes_with_zero_amount"]
 
 		return print_setting_fields
 
@@ -86,34 +98,44 @@
 		return self.__company_currency
 
 	def onload(self):
-		self.set_onload("make_payment_via_journal_entry",
-			frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry'))
+		self.set_onload(
+			"make_payment_via_journal_entry",
+			frappe.db.get_single_value("Accounts Settings", "make_payment_via_journal_entry"),
+		)
 
 		if self.is_new():
-			relevant_docs = ("Quotation", "Purchase Order", "Sales Order",
-							 "Purchase Invoice", "Sales Invoice")
+			relevant_docs = (
+				"Quotation",
+				"Purchase Order",
+				"Sales Order",
+				"Purchase Invoice",
+				"Sales Invoice",
+			)
 			if self.doctype in relevant_docs:
 				self.set_payment_schedule()
 
 	def ensure_supplier_is_not_blocked(self):
-		is_supplier_payment = self.doctype == 'Payment Entry' and self.party_type == 'Supplier'
-		is_buying_invoice = self.doctype in ['Purchase Invoice', 'Purchase Order']
+		is_supplier_payment = self.doctype == "Payment Entry" and self.party_type == "Supplier"
+		is_buying_invoice = self.doctype in ["Purchase Invoice", "Purchase Order"]
 		supplier = None
 		supplier_name = None
 
 		if is_buying_invoice or is_supplier_payment:
 			supplier_name = self.supplier if is_buying_invoice else self.party
-			supplier = frappe.get_doc('Supplier', supplier_name)
+			supplier = frappe.get_doc("Supplier", supplier_name)
 
 		if supplier and supplier_name and supplier.on_hold:
-			if (is_buying_invoice and supplier.hold_type in ['All', 'Invoices']) or \
-					(is_supplier_payment and supplier.hold_type in ['All', 'Payments']):
+			if (is_buying_invoice and supplier.hold_type in ["All", "Invoices"]) or (
+				is_supplier_payment and supplier.hold_type in ["All", "Payments"]
+			):
 				if not supplier.release_date or getdate(nowdate()) <= supplier.release_date:
 					frappe.msgprint(
-						_('{0} is blocked so this transaction cannot proceed').format(supplier_name), raise_exception=1)
+						_("{0} is blocked so this transaction cannot proceed").format(supplier_name),
+						raise_exception=1,
+					)
 
 	def validate(self):
-		if not self.get('is_return') and not self.get('is_debit_note'):
+		if not self.get("is_return") and not self.get("is_debit_note"):
 			self.validate_qty_is_not_zero()
 
 		if self.get("_action") and self._action != "update_after_submit":
@@ -146,8 +168,8 @@
 		self.validate_party()
 		self.validate_currency()
 
-		if self.doctype in ['Purchase Invoice', 'Sales Invoice']:
-			pos_check_field = "is_pos" if self.doctype=="Sales Invoice" else "is_paid"
+		if self.doctype in ["Purchase Invoice", "Sales Invoice"]:
+			pos_check_field = "is_pos" if self.doctype == "Sales Invoice" else "is_paid"
 			if cint(self.allocate_advances_automatically) and not cint(self.get(pos_check_field)):
 				self.set_advances()
 
@@ -160,7 +182,7 @@
 
 			self.set_inter_company_account()
 
-		if self.doctype == 'Purchase Invoice':
+		if self.doctype == "Purchase Invoice":
 			self.calculate_paid_amount()
 			# apply tax withholding only if checked and applicable
 			self.set_tax_withholding()
@@ -169,7 +191,7 @@
 
 		validate_einvoice_fields(self)
 
-		if self.doctype != 'Material Request':
+		if self.doctype != "Material Request":
 			apply_pricing_rule_on_transaction(self)
 
 	def before_cancel(self):
@@ -177,26 +199,37 @@
 
 	def on_trash(self):
 		# delete sl and gl entries on deletion of transaction
-		if frappe.db.get_single_value('Accounts Settings', 'delete_linked_ledger_entries'):
-			frappe.db.sql("delete from `tabGL Entry` where voucher_type=%s and voucher_no=%s", (self.doctype, self.name))
-			frappe.db.sql("delete from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s", (self.doctype, self.name))
+		if frappe.db.get_single_value("Accounts Settings", "delete_linked_ledger_entries"):
+			frappe.db.sql(
+				"delete from `tabGL Entry` where voucher_type=%s and voucher_no=%s", (self.doctype, self.name)
+			)
+			frappe.db.sql(
+				"delete from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s",
+				(self.doctype, self.name),
+			)
 
 	def validate_deferred_start_and_end_date(self):
 		for d in self.items:
 			if d.get("enable_deferred_revenue") or d.get("enable_deferred_expense"):
 				if not (d.service_start_date and d.service_end_date):
-					frappe.throw(_("Row #{0}: Service Start and End Date is required for deferred accounting").format(d.idx))
+					frappe.throw(
+						_("Row #{0}: Service Start and End Date is required for deferred accounting").format(d.idx)
+					)
 				elif getdate(d.service_start_date) > getdate(d.service_end_date):
-					frappe.throw(_("Row #{0}: Service Start Date cannot be greater than Service End Date").format(d.idx))
+					frappe.throw(
+						_("Row #{0}: Service Start Date cannot be greater than Service End Date").format(d.idx)
+					)
 				elif getdate(self.posting_date) > getdate(d.service_end_date):
-					frappe.throw(_("Row #{0}: Service End Date cannot be before Invoice Posting Date").format(d.idx))
+					frappe.throw(
+						_("Row #{0}: Service End Date cannot be before Invoice Posting Date").format(d.idx)
+					)
 
 	def validate_invoice_documents_schedule(self):
 		self.validate_payment_schedule_dates()
 		self.set_due_date()
 		self.set_payment_schedule()
 		self.validate_payment_schedule_amount()
-		if not self.get('ignore_default_payment_terms_template'):
+		if not self.get("ignore_default_payment_terms_template"):
 			self.validate_due_date()
 		self.validate_advance_entries()
 
@@ -212,8 +245,16 @@
 			self.validate_non_invoice_documents_schedule()
 
 	def before_print(self, settings=None):
-		if self.doctype in ['Purchase Order', 'Sales Order', 'Sales Invoice', 'Purchase Invoice',
-							'Supplier Quotation', 'Purchase Receipt', 'Delivery Note', 'Quotation']:
+		if self.doctype in [
+			"Purchase Order",
+			"Sales Order",
+			"Sales Invoice",
+			"Purchase Invoice",
+			"Supplier Quotation",
+			"Purchase Receipt",
+			"Delivery Note",
+			"Quotation",
+		]:
 			if self.get("group_same_items"):
 				self.group_similar_items()
 
@@ -234,7 +275,9 @@
 			if is_paid:
 				if not self.cash_bank_account:
 					# show message that the amount is not paid
-					frappe.throw(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified"))
+					frappe.throw(
+						_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified")
+					)
 
 				if cint(self.is_return) and self.grand_total > self.paid_amount:
 					self.paid_amount = flt(flt(self.grand_total), self.precision("paid_amount"))
@@ -242,8 +285,9 @@
 				elif not flt(self.paid_amount) and flt(self.outstanding_amount) > 0:
 					self.paid_amount = flt(flt(self.outstanding_amount), self.precision("paid_amount"))
 
-				self.base_paid_amount = flt(self.paid_amount * self.conversion_rate,
-										self.precision("base_paid_amount"))
+				self.base_paid_amount = flt(
+					self.paid_amount * self.conversion_rate, self.precision("base_paid_amount")
+				)
 
 	def set_missing_values(self, for_validate=False):
 		if frappe.flags.in_test:
@@ -254,13 +298,14 @@
 
 	def calculate_taxes_and_totals(self):
 		from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals
+
 		calculate_taxes_and_totals(self)
 
 		if self.doctype in (
-			'Sales Order',
-			'Delivery Note',
-			'Sales Invoice',
-			'POS Invoice',
+			"Sales Order",
+			"Delivery Note",
+			"Sales Invoice",
+			"POS Invoice",
 		):
 			self.calculate_commission()
 			self.calculate_contribution()
@@ -274,50 +319,75 @@
 				date_field = "transaction_date"
 
 			if date_field and self.get(date_field):
-				validate_fiscal_year(self.get(date_field), self.fiscal_year, self.company,
-									 self.meta.get_label(date_field), self)
+				validate_fiscal_year(
+					self.get(date_field), self.fiscal_year, self.company, self.meta.get_label(date_field), self
+				)
 
 	def validate_party_accounts(self):
-		if self.doctype not in ('Sales Invoice', 'Purchase Invoice'):
+		if self.doctype not in ("Sales Invoice", "Purchase Invoice"):
 			return
 
-		if self.doctype == 'Sales Invoice':
-			party_account_field = 'debit_to'
-			item_field = 'income_account'
+		if self.doctype == "Sales Invoice":
+			party_account_field = "debit_to"
+			item_field = "income_account"
 		else:
-			party_account_field = 'credit_to'
-			item_field = 'expense_account'
+			party_account_field = "credit_to"
+			item_field = "expense_account"
 
-		for item in self.get('items'):
+		for item in self.get("items"):
 			if item.get(item_field) == self.get(party_account_field):
-				frappe.throw(_("Row {0}: {1} {2} cannot be same as {3} (Party Account) {4}").format(item.idx,
-					frappe.bold(frappe.unscrub(item_field)), item.get(item_field),
-					frappe.bold(frappe.unscrub(party_account_field)), self.get(party_account_field)))
+				frappe.throw(
+					_("Row {0}: {1} {2} cannot be same as {3} (Party Account) {4}").format(
+						item.idx,
+						frappe.bold(frappe.unscrub(item_field)),
+						item.get(item_field),
+						frappe.bold(frappe.unscrub(party_account_field)),
+						self.get(party_account_field),
+					)
+				)
 
 	def validate_inter_company_reference(self):
-		if self.doctype not in ('Purchase Invoice', 'Purchase Receipt', 'Purchase Order'):
+		if self.doctype not in ("Purchase Invoice", "Purchase Receipt", "Purchase Order"):
 			return
 
 		if self.is_internal_transfer():
-			if not (self.get('inter_company_reference') or self.get('inter_company_invoice_reference')
-				or self.get('inter_company_order_reference')):
+			if not (
+				self.get("inter_company_reference")
+				or self.get("inter_company_invoice_reference")
+				or self.get("inter_company_order_reference")
+			):
 				msg = _("Internal Sale or Delivery Reference missing.")
 				msg += _("Please create purchase from internal sale or delivery document itself")
 				frappe.throw(msg, title=_("Internal Sales Reference Missing"))
 
 	def validate_due_date(self):
-		if self.get('is_pos'): return
+		if self.get("is_pos"):
+			return
 
 		from erpnext.accounts.party import validate_due_date
+
 		if self.doctype == "Sales Invoice":
 			if not self.due_date:
 				frappe.throw(_("Due Date is mandatory"))
 
-			validate_due_date(self.posting_date, self.due_date,
-				"Customer", self.customer, self.company, self.payment_terms_template)
+			validate_due_date(
+				self.posting_date,
+				self.due_date,
+				"Customer",
+				self.customer,
+				self.company,
+				self.payment_terms_template,
+			)
 		elif self.doctype == "Purchase Invoice":
-			validate_due_date(self.bill_date or self.posting_date, self.due_date,
-				"Supplier", self.supplier, self.company, self.bill_date, self.payment_terms_template)
+			validate_due_date(
+				self.bill_date or self.posting_date,
+				self.due_date,
+				"Supplier",
+				self.supplier,
+				self.company,
+				self.bill_date,
+				self.payment_terms_template,
+			)
 
 	def set_price_list_currency(self, buying_or_selling):
 		if self.meta.get_field("posting_date"):
@@ -335,15 +405,15 @@
 				args = "for_buying"
 
 			if self.meta.get_field(fieldname) and self.get(fieldname):
-				self.price_list_currency = frappe.db.get_value("Price List",
-															   self.get(fieldname), "currency")
+				self.price_list_currency = frappe.db.get_value("Price List", self.get(fieldname), "currency")
 
 				if self.price_list_currency == self.company_currency:
 					self.plc_conversion_rate = 1.0
 
 				elif not self.plc_conversion_rate:
-					self.plc_conversion_rate = get_exchange_rate(self.price_list_currency,
-																 self.company_currency, transaction_date, args)
+					self.plc_conversion_rate = get_exchange_rate(
+						self.price_list_currency, self.company_currency, transaction_date, args
+					)
 
 			# currency
 			if not self.currency:
@@ -352,8 +422,9 @@
 			elif self.currency == self.company_currency:
 				self.conversion_rate = 1.0
 			elif not self.conversion_rate:
-				self.conversion_rate = get_exchange_rate(self.currency,
-														 self.company_currency, transaction_date, args)
+				self.conversion_rate = get_exchange_rate(
+					self.currency, self.company_currency, transaction_date, args
+				)
 
 	def set_missing_item_details(self, for_validate=False):
 		"""set missing item values"""
@@ -369,7 +440,11 @@
 				parent_dict.update({"document_type": document_type})
 
 			# party_name field used for customer in quotation
-			if self.doctype == "Quotation" and self.quotation_to == "Customer" and parent_dict.get("party_name"):
+			if (
+				self.doctype == "Quotation"
+				and self.quotation_to == "Customer"
+				and parent_dict.get("party_name")
+			):
 				parent_dict.update({"customer": parent_dict.get("party_name")})
 
 			self.pricing_rules = []
@@ -381,7 +456,9 @@
 					args["doctype"] = self.doctype
 					args["name"] = self.name
 					args["child_docname"] = item.name
-					args["ignore_pricing_rule"] = self.ignore_pricing_rule if hasattr(self, 'ignore_pricing_rule') else 0
+					args["ignore_pricing_rule"] = (
+						self.ignore_pricing_rule if hasattr(self, "ignore_pricing_rule") else 0
+					)
 
 					if not args.get("transaction_date"):
 						args["transaction_date"] = args.get("posting_date")
@@ -393,10 +470,10 @@
 
 					for fieldname, value in ret.items():
 						if item.meta.get_field(fieldname) and value is not None:
-							if (item.get(fieldname) is None or fieldname in force_item_fields):
+							if item.get(fieldname) is None or fieldname in force_item_fields:
 								item.set(fieldname, value)
 
-							elif fieldname in ['cost_center', 'conversion_factor'] and not item.get(fieldname):
+							elif fieldname in ["cost_center", "conversion_factor"] and not item.get(fieldname):
 								item.set(fieldname, value)
 
 							elif fieldname == "serial_no":
@@ -404,7 +481,7 @@
 								item_conversion_factor = item.get("conversion_factor") or 1.0
 								item_qty = abs(item.get("qty")) * item_conversion_factor
 
-								if item_qty != len(get_serial_nos(item.get('serial_no'))):
+								if item_qty != len(get_serial_nos(item.get("serial_no"))):
 									item.set(fieldname, value)
 
 							elif (
@@ -423,13 +500,17 @@
 								# reset pricing rule fields if pricing_rule_removed
 								item.set(fieldname, value)
 
-					if self.doctype in ["Purchase Invoice", "Sales Invoice"] and item.meta.get_field('is_fixed_asset'):
-						item.set('is_fixed_asset', ret.get('is_fixed_asset', 0))
+					if self.doctype in ["Purchase Invoice", "Sales Invoice"] and item.meta.get_field(
+						"is_fixed_asset"
+					):
+						item.set("is_fixed_asset", ret.get("is_fixed_asset", 0))
 
 					# Double check for cost center
 					# Items add via promotional scheme may not have cost center set
-					if hasattr(item, 'cost_center') and not item.get('cost_center'):
-						item.set('cost_center', self.get('cost_center') or erpnext.get_default_cost_center(self.company))
+					if hasattr(item, "cost_center") and not item.get("cost_center"):
+						item.set(
+							"cost_center", self.get("cost_center") or erpnext.get_default_cost_center(self.company)
+						)
 
 					if ret.get("pricing_rules"):
 						self.apply_pricing_rule_on_items(item, ret)
@@ -441,7 +522,7 @@
 	def apply_pricing_rule_on_items(self, item, pricing_rule_args):
 		if not pricing_rule_args.get("validate_applied_rule", 0):
 			# if user changed the discount percentage then set user's discount percentage ?
-			if pricing_rule_args.get("price_or_product_discount") == 'Price':
+			if pricing_rule_args.get("price_or_product_discount") == "Price":
 				item.set("pricing_rules", pricing_rule_args.get("pricing_rules"))
 				item.set("discount_percentage", pricing_rule_args.get("discount_percentage"))
 				item.set("discount_amount", pricing_rule_args.get("discount_amount"))
@@ -449,39 +530,48 @@
 					item.set("price_list_rate", pricing_rule_args.get("price_list_rate"))
 
 				if item.get("price_list_rate"):
-					item.rate = flt(item.price_list_rate *
-						(1.0 - (flt(item.discount_percentage) / 100.0)), item.precision("rate"))
+					item.rate = flt(
+						item.price_list_rate * (1.0 - (flt(item.discount_percentage) / 100.0)),
+						item.precision("rate"),
+					)
 
-					if item.get('discount_amount'):
+					if item.get("discount_amount"):
 						item.rate = item.price_list_rate - item.discount_amount
 
 				if item.get("apply_discount_on_discounted_rate") and pricing_rule_args.get("rate"):
 					item.rate = pricing_rule_args.get("rate")
 
-			elif pricing_rule_args.get('free_item_data'):
-				apply_pricing_rule_for_free_items(self, pricing_rule_args.get('free_item_data'))
+			elif pricing_rule_args.get("free_item_data"):
+				apply_pricing_rule_for_free_items(self, pricing_rule_args.get("free_item_data"))
 
 		elif pricing_rule_args.get("validate_applied_rule"):
-			for pricing_rule in get_applied_pricing_rules(item.get('pricing_rules')):
+			for pricing_rule in get_applied_pricing_rules(item.get("pricing_rules")):
 				pricing_rule_doc = frappe.get_cached_doc("Pricing Rule", pricing_rule)
-				for field in ['discount_percentage', 'discount_amount', 'rate']:
+				for field in ["discount_percentage", "discount_amount", "rate"]:
 					if item.get(field) < pricing_rule_doc.get(field):
 						title = get_link_to_form("Pricing Rule", pricing_rule)
 
-						frappe.msgprint(_("Row {0}: user has not applied the rule {1} on the item {2}")
-							.format(item.idx, frappe.bold(title), frappe.bold(item.item_code)))
+						frappe.msgprint(
+							_("Row {0}: user has not applied the rule {1} on the item {2}").format(
+								item.idx, frappe.bold(title), frappe.bold(item.item_code)
+							)
+						)
 
 	def set_pricing_rule_details(self, item_row, args):
 		pricing_rules = get_applied_pricing_rules(args.get("pricing_rules"))
-		if not pricing_rules: return
+		if not pricing_rules:
+			return
 
 		for pricing_rule in pricing_rules:
-			self.append("pricing_rules", {
-				"pricing_rule": pricing_rule,
-				"item_code": item_row.item_code,
-				"child_docname": item_row.name,
-				"rule_applied": True
-			})
+			self.append(
+				"pricing_rules",
+				{
+					"pricing_rule": pricing_rule,
+					"item_code": item_row.item_code,
+					"child_docname": item_row.name,
+					"rule_applied": True,
+				},
+			)
 
 	def set_taxes(self):
 		if not self.meta.get_field("taxes"):
@@ -492,14 +582,18 @@
 		if (self.is_new() or self.is_pos_profile_changed()) and not self.get("taxes"):
 			if self.company and not self.get("taxes_and_charges"):
 				# get the default tax master
-				self.taxes_and_charges = frappe.db.get_value(tax_master_doctype,
-															 {"is_default": 1, 'company': self.company})
+				self.taxes_and_charges = frappe.db.get_value(
+					tax_master_doctype, {"is_default": 1, "company": self.company}
+				)
 
 			self.append_taxes_from_master(tax_master_doctype)
 
 	def is_pos_profile_changed(self):
-		if (self.doctype == 'Sales Invoice' and self.is_pos and
-				self.pos_profile != frappe.db.get_value('Sales Invoice', self.name, 'pos_profile')):
+		if (
+			self.doctype == "Sales Invoice"
+			and self.is_pos
+			and self.pos_profile != frappe.db.get_value("Sales Invoice", self.name, "pos_profile")
+		):
 			return True
 
 	def append_taxes_from_master(self, tax_master_doctype=None):
@@ -516,44 +610,54 @@
 	def validate_enabled_taxes_and_charges(self):
 		taxes_and_charges_doctype = self.meta.get_options("taxes_and_charges")
 		if frappe.db.get_value(taxes_and_charges_doctype, self.taxes_and_charges, "disabled"):
-			frappe.throw(_("{0} '{1}' is disabled").format(taxes_and_charges_doctype, self.taxes_and_charges))
+			frappe.throw(
+				_("{0} '{1}' is disabled").format(taxes_and_charges_doctype, self.taxes_and_charges)
+			)
 
 	def validate_tax_account_company(self):
 		for d in self.get("taxes"):
 			if d.account_head:
 				tax_account_company = frappe.db.get_value("Account", d.account_head, "company")
 				if tax_account_company != self.company:
-					frappe.throw(_("Row #{0}: Account {1} does not belong to company {2}")
-								 .format(d.idx, d.account_head, self.company))
+					frappe.throw(
+						_("Row #{0}: Account {1} does not belong to company {2}").format(
+							d.idx, d.account_head, self.company
+						)
+					)
 
 	def get_gl_dict(self, args, account_currency=None, item=None):
 		"""this method populates the common properties of a gl entry record"""
 
-		posting_date = args.get('posting_date') or self.get('posting_date')
+		posting_date = args.get("posting_date") or self.get("posting_date")
 		fiscal_years = get_fiscal_years(posting_date, company=self.company)
 		if len(fiscal_years) > 1:
-			frappe.throw(_("Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year").format(
-				formatdate(posting_date)))
+			frappe.throw(
+				_("Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year").format(
+					formatdate(posting_date)
+				)
+			)
 		else:
 			fiscal_year = fiscal_years[0][0]
 
-		gl_dict = frappe._dict({
-			'company': self.company,
-			'posting_date': posting_date,
-			'fiscal_year': fiscal_year,
-			'voucher_type': self.doctype,
-			'voucher_no': self.name,
-			'remarks': self.get("remarks") or self.get("remark"),
-			'debit': 0,
-			'credit': 0,
-			'debit_in_account_currency': 0,
-			'credit_in_account_currency': 0,
-			'is_opening': self.get("is_opening") or "No",
-			'party_type': None,
-			'party': None,
-			'project': self.get("project"),
-			'post_net_value': args.get('post_net_value')
-		})
+		gl_dict = frappe._dict(
+			{
+				"company": self.company,
+				"posting_date": posting_date,
+				"fiscal_year": fiscal_year,
+				"voucher_type": self.doctype,
+				"voucher_no": self.name,
+				"remarks": self.get("remarks") or self.get("remark"),
+				"debit": 0,
+				"credit": 0,
+				"debit_in_account_currency": 0,
+				"credit_in_account_currency": 0,
+				"is_opening": self.get("is_opening") or "No",
+				"party_type": None,
+				"party": None,
+				"project": self.get("project"),
+				"post_net_value": args.get("post_net_value"),
+			}
+		)
 
 		accounting_dimensions = get_accounting_dimensions()
 		dimension_dict = frappe._dict()
@@ -569,13 +673,24 @@
 		if not account_currency:
 			account_currency = get_account_currency(gl_dict.account)
 
-		if gl_dict.account and self.doctype not in ["Journal Entry",
-			"Period Closing Voucher", "Payment Entry", "Purchase Receipt", "Purchase Invoice", "Stock Entry"]:
+		if gl_dict.account and self.doctype not in [
+			"Journal Entry",
+			"Period Closing Voucher",
+			"Payment Entry",
+			"Purchase Receipt",
+			"Purchase Invoice",
+			"Stock Entry",
+		]:
 			self.validate_account_currency(gl_dict.account, account_currency)
 
-		if gl_dict.account and self.doctype not in ["Journal Entry", "Period Closing Voucher", "Payment Entry"]:
-			set_balance_in_account_currency(gl_dict, account_currency, self.get("conversion_rate"),
-											self.company_currency)
+		if gl_dict.account and self.doctype not in [
+			"Journal Entry",
+			"Period Closing Voucher",
+			"Payment Entry",
+		]:
+			set_balance_in_account_currency(
+				gl_dict, account_currency, self.get("conversion_rate"), self.company_currency
+			)
 
 		return gl_dict
 
@@ -591,14 +706,21 @@
 			valid_currency.append(self.currency)
 
 		if account_currency not in valid_currency:
-			frappe.throw(_("Account {0} is invalid. Account Currency must be {1}")
-				.format(account, (' ' + _("or") + ' ').join(valid_currency)))
+			frappe.throw(
+				_("Account {0} is invalid. Account Currency must be {1}").format(
+					account, (" " + _("or") + " ").join(valid_currency)
+				)
+			)
 
 	def clear_unallocated_advances(self, childtype, parentfield):
 		self.set(parentfield, self.get(parentfield, {"allocated_amount": ["not in", [0, None, ""]]}))
 
-		frappe.db.sql("""delete from `tab%s` where parentfield=%s and parent = %s
-			and allocated_amount = 0""" % (childtype, '%s', '%s'), (parentfield, self.name))
+		frappe.db.sql(
+			"""delete from `tab%s` where parentfield=%s and parent = %s
+			and allocated_amount = 0"""
+			% (childtype, "%s", "%s"),
+			(parentfield, self.name),
+		)
 
 	@frappe.whitelist()
 	def apply_shipping_rule(self):
@@ -608,16 +730,16 @@
 			self.calculate_taxes_and_totals()
 
 	def get_shipping_address(self):
-		'''Returns Address object from shipping address fields if present'''
+		"""Returns Address object from shipping address fields if present"""
 
 		# shipping address fields can be `shipping_address_name` or `shipping_address`
 		# try getting value from both
 
-		for fieldname in ('shipping_address_name', 'shipping_address'):
+		for fieldname in ("shipping_address_name", "shipping_address"):
 			shipping_field = self.meta.get_field(fieldname)
-			if shipping_field and shipping_field.fieldtype == 'Link':
+			if shipping_field and shipping_field.fieldtype == "Link":
 				if self.get(fieldname):
-					return frappe.get_doc('Address', self.get(fieldname))
+					return frappe.get_doc("Address", self.get(fieldname))
 
 		return {}
 
@@ -633,10 +755,10 @@
 			if d.against_order:
 				allocated_amount = flt(d.amount)
 			else:
-				if self.get('party_account_currency') == self.company_currency:
-					amount = self.get('base_rounded_total') or self.base_grand_total
+				if self.get("party_account_currency") == self.company_currency:
+					amount = self.get("base_rounded_total") or self.base_grand_total
 				else:
-					amount = self.get('rounded_total') or self.grand_total
+					amount = self.get("rounded_total") or self.grand_total
 
 				allocated_amount = min(amount - advance_allocated, d.amount)
 			advance_allocated += flt(allocated_amount)
@@ -649,7 +771,7 @@
 				"remarks": d.remarks,
 				"advance_amount": flt(d.amount),
 				"allocated_amount": allocated_amount,
-				"ref_exchange_rate": flt(d.exchange_rate) # exchange_rate of advance entry
+				"ref_exchange_rate": flt(d.exchange_rate),  # exchange_rate of advance entry
 			}
 
 			self.append("advances", advance_row)
@@ -670,21 +792,24 @@
 			order_field = "purchase_order"
 			order_doctype = "Purchase Order"
 
-		order_list = list(set(d.get(order_field)
-			for d in self.get("items") if d.get(order_field)))
+		order_list = list(set(d.get(order_field) for d in self.get("items") if d.get(order_field)))
 
-		journal_entries = get_advance_journal_entries(party_type, party, party_account,
-			amount_field, order_doctype, order_list, include_unallocated)
+		journal_entries = get_advance_journal_entries(
+			party_type, party, party_account, amount_field, order_doctype, order_list, include_unallocated
+		)
 
-		payment_entries = get_advance_payment_entries(party_type, party, party_account,
-			order_doctype, order_list, include_unallocated)
+		payment_entries = get_advance_payment_entries(
+			party_type, party, party_account, order_doctype, order_list, include_unallocated
+		)
 
 		res = journal_entries + payment_entries
 
 		return res
 
 	def is_inclusive_tax(self):
-		is_inclusive = cint(frappe.db.get_single_value("Accounts Settings", "show_inclusive_tax_in_print"))
+		is_inclusive = cint(
+			frappe.db.get_single_value("Accounts Settings", "show_inclusive_tax_in_print")
+		)
 
 		if is_inclusive:
 			is_inclusive = 0
@@ -695,10 +820,10 @@
 
 	def validate_advance_entries(self):
 		order_field = "sales_order" if self.doctype == "Sales Invoice" else "purchase_order"
-		order_list = list(set(d.get(order_field)
-			for d in self.get("items") if d.get(order_field)))
+		order_list = list(set(d.get(order_field) for d in self.get("items") if d.get(order_field)))
 
-		if not order_list: return
+		if not order_list:
+			return
 
 		advance_entries = self.get_advance_entries(include_unallocated=False)
 
@@ -706,22 +831,24 @@
 			advance_entries_against_si = [d.reference_name for d in self.get("advances")]
 			for d in advance_entries:
 				if not advance_entries_against_si or d.reference_name not in advance_entries_against_si:
-					frappe.msgprint(_(
-						"Payment Entry {0} is linked against Order {1}, check if it should be pulled as advance in this invoice.")
-							.format(d.reference_name, d.against_order))
+					frappe.msgprint(
+						_(
+							"Payment Entry {0} is linked against Order {1}, check if it should be pulled as advance in this invoice."
+						).format(d.reference_name, d.against_order)
+					)
 
 	def set_advance_gain_or_loss(self):
-		if self.get('conversion_rate') == 1 or not self.get("advances"):
+		if self.get("conversion_rate") == 1 or not self.get("advances"):
 			return
 
-		is_purchase_invoice = self.doctype == 'Purchase Invoice'
+		is_purchase_invoice = self.doctype == "Purchase Invoice"
 		party_account = self.credit_to if is_purchase_invoice else self.debit_to
 		if get_account_currency(party_account) != self.currency:
 			return
 
 		for d in self.get("advances"):
 			advance_exchange_rate = d.ref_exchange_rate
-			if (d.allocated_amount and self.conversion_rate != advance_exchange_rate):
+			if d.allocated_amount and self.conversion_rate != advance_exchange_rate:
 
 				base_allocated_amount_in_ref_rate = advance_exchange_rate * d.allocated_amount
 				base_allocated_amount_in_inv_rate = self.conversion_rate * d.allocated_amount
@@ -730,61 +857,71 @@
 				d.exchange_gain_loss = difference
 
 	def make_exchange_gain_loss_gl_entries(self, gl_entries):
-		if self.get('doctype') in ['Purchase Invoice', 'Sales Invoice']:
+		if self.get("doctype") in ["Purchase Invoice", "Sales Invoice"]:
 			for d in self.get("advances"):
 				if d.exchange_gain_loss:
-					is_purchase_invoice = self.get('doctype') == 'Purchase Invoice'
+					is_purchase_invoice = self.get("doctype") == "Purchase Invoice"
 					party = self.supplier if is_purchase_invoice else self.customer
 					party_account = self.credit_to if is_purchase_invoice else self.debit_to
 					party_type = "Supplier" if is_purchase_invoice else "Customer"
 
-					gain_loss_account = frappe.db.get_value('Company', self.company, 'exchange_gain_loss_account')
+					gain_loss_account = frappe.db.get_value("Company", self.company, "exchange_gain_loss_account")
 					if not gain_loss_account:
-						frappe.throw(_("Please set default Exchange Gain/Loss Account in Company {}")
-							.format(self.get('company')))
+						frappe.throw(
+							_("Please set default Exchange Gain/Loss Account in Company {}").format(self.get("company"))
+						)
 					account_currency = get_account_currency(gain_loss_account)
 					if account_currency != self.company_currency:
-						frappe.throw(_("Currency for {0} must be {1}").format(gain_loss_account, self.company_currency))
+						frappe.throw(
+							_("Currency for {0} must be {1}").format(gain_loss_account, self.company_currency)
+						)
 
 					# for purchase
-					dr_or_cr = 'debit' if d.exchange_gain_loss > 0 else 'credit'
+					dr_or_cr = "debit" if d.exchange_gain_loss > 0 else "credit"
 					if not is_purchase_invoice:
 						# just reverse for sales?
-						dr_or_cr = 'debit' if dr_or_cr == 'credit' else 'credit'
+						dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
 
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": gain_loss_account,
-							"account_currency": account_currency,
-							"against": party,
-							dr_or_cr + "_in_account_currency": abs(d.exchange_gain_loss),
-							dr_or_cr: abs(d.exchange_gain_loss),
-							"cost_center": self.cost_center or erpnext.get_default_cost_center(self.company),
-							"project": self.project
-						}, item=d)
+						self.get_gl_dict(
+							{
+								"account": gain_loss_account,
+								"account_currency": account_currency,
+								"against": party,
+								dr_or_cr + "_in_account_currency": abs(d.exchange_gain_loss),
+								dr_or_cr: abs(d.exchange_gain_loss),
+								"cost_center": self.cost_center or erpnext.get_default_cost_center(self.company),
+								"project": self.project,
+							},
+							item=d,
+						)
 					)
 
-					dr_or_cr = 'debit' if dr_or_cr == 'credit' else 'credit'
+					dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
 
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": party_account,
-							"party_type": party_type,
-							"party": party,
-							"against": gain_loss_account,
-							dr_or_cr + "_in_account_currency": flt(abs(d.exchange_gain_loss) / self.conversion_rate),
-							dr_or_cr: abs(d.exchange_gain_loss),
-							"cost_center": self.cost_center,
-							"project": self.project
-						}, self.party_account_currency, item=self)
+						self.get_gl_dict(
+							{
+								"account": party_account,
+								"party_type": party_type,
+								"party": party,
+								"against": gain_loss_account,
+								dr_or_cr + "_in_account_currency": flt(abs(d.exchange_gain_loss) / self.conversion_rate),
+								dr_or_cr: abs(d.exchange_gain_loss),
+								"cost_center": self.cost_center,
+								"project": self.project,
+							},
+							self.party_account_currency,
+							item=self,
+						)
 					)
 
 	def update_against_document_in_jv(self):
 		"""
-			Links invoice and advance voucher:
-				1. cancel advance voucher
-				2. split into multiple rows if partially adjusted, assign against voucher
-				3. submit advance voucher
+		Links invoice and advance voucher:
+		        1. cancel advance voucher
+		        2. split into multiple rows if partially adjusted, assign against voucher
+		        3. submit advance voucher
 		"""
 
 		if self.doctype == "Sales Invoice":
@@ -799,45 +936,56 @@
 			dr_or_cr = "debit_in_account_currency"
 
 		lst = []
-		for d in self.get('advances'):
+		for d in self.get("advances"):
 			if flt(d.allocated_amount) > 0:
-				args = frappe._dict({
-					'voucher_type': d.reference_type,
-					'voucher_no': d.reference_name,
-					'voucher_detail_no': d.reference_row,
-					'against_voucher_type': self.doctype,
-					'against_voucher': self.name,
-					'account': party_account,
-					'party_type': party_type,
-					'party': party,
-					'is_advance': 'Yes',
-					'dr_or_cr': dr_or_cr,
-					'unadjusted_amount': flt(d.advance_amount),
-					'allocated_amount': flt(d.allocated_amount),
-					'precision': d.precision('advance_amount'),
-					'exchange_rate': (self.conversion_rate
-						if self.party_account_currency != self.company_currency else 1),
-					'grand_total': (self.base_grand_total
-						if self.party_account_currency == self.company_currency else self.grand_total),
-					'outstanding_amount': self.outstanding_amount,
-					'difference_account': frappe.db.get_value('Company', self.company, 'exchange_gain_loss_account'),
-					'exchange_gain_loss': flt(d.get('exchange_gain_loss'))
-				})
+				args = frappe._dict(
+					{
+						"voucher_type": d.reference_type,
+						"voucher_no": d.reference_name,
+						"voucher_detail_no": d.reference_row,
+						"against_voucher_type": self.doctype,
+						"against_voucher": self.name,
+						"account": party_account,
+						"party_type": party_type,
+						"party": party,
+						"is_advance": "Yes",
+						"dr_or_cr": dr_or_cr,
+						"unadjusted_amount": flt(d.advance_amount),
+						"allocated_amount": flt(d.allocated_amount),
+						"precision": d.precision("advance_amount"),
+						"exchange_rate": (
+							self.conversion_rate if self.party_account_currency != self.company_currency else 1
+						),
+						"grand_total": (
+							self.base_grand_total
+							if self.party_account_currency == self.company_currency
+							else self.grand_total
+						),
+						"outstanding_amount": self.outstanding_amount,
+						"difference_account": frappe.db.get_value(
+							"Company", self.company, "exchange_gain_loss_account"
+						),
+						"exchange_gain_loss": flt(d.get("exchange_gain_loss")),
+					}
+				)
 				lst.append(args)
 
 		if lst:
 			from erpnext.accounts.utils import reconcile_against_document
+
 			reconcile_against_document(lst)
 
 	def on_cancel(self):
 		from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries
 
 		if self.doctype in ["Sales Invoice", "Purchase Invoice"]:
-			if frappe.db.get_single_value('Accounts Settings', 'unlink_payment_on_cancellation_of_invoice'):
+			if frappe.db.get_single_value("Accounts Settings", "unlink_payment_on_cancellation_of_invoice"):
 				unlink_ref_doc_from_payment_entries(self)
 
 		elif self.doctype in ["Sales Order", "Purchase Order"]:
-			if frappe.db.get_single_value('Accounts Settings', 'unlink_advance_payment_on_cancelation_of_order'):
+			if frappe.db.get_single_value(
+				"Accounts Settings", "unlink_advance_payment_on_cancelation_of_order"
+			):
 				unlink_ref_doc_from_payment_entries(self)
 
 			if self.doctype == "Sales Order":
@@ -848,33 +996,32 @@
 		for item in self.items:
 			so_items.append(item.name)
 
-		linked_po = list(set(frappe.get_all(
-			'Purchase Order Item',
-			filters = {
-				'sales_order': self.name,
-				'sales_order_item': ['in', so_items],
-				'docstatus': ['<', 2]
-			},
-			pluck='parent'
-		)))
+		linked_po = list(
+			set(
+				frappe.get_all(
+					"Purchase Order Item",
+					filters={
+						"sales_order": self.name,
+						"sales_order_item": ["in", so_items],
+						"docstatus": ["<", 2],
+					},
+					pluck="parent",
+				)
+			)
+		)
 
 		if linked_po:
 			frappe.db.set_value(
-				'Purchase Order Item', {
-					'sales_order': self.name,
-					'sales_order_item': ['in', so_items],
-					'docstatus': ['<', 2]
-				},{
-					'sales_order': None,
-					'sales_order_item': None
-				}
+				"Purchase Order Item",
+				{"sales_order": self.name, "sales_order_item": ["in", so_items], "docstatus": ["<", 2]},
+				{"sales_order": None, "sales_order_item": None},
 			)
 
 			frappe.msgprint(_("Purchase Orders {0} are un-linked").format("\n".join(linked_po)))
 
 	def get_tax_map(self):
 		tax_map = {}
-		for tax in self.get('taxes'):
+		for tax in self.get("taxes"):
 			tax_map.setdefault(tax.account_head, 0.0)
 			tax_map[tax.account_head] += tax.tax_amount
 
@@ -884,7 +1031,11 @@
 		amount = item.net_amount
 		base_amount = item.base_net_amount
 
-		if enable_discount_accounting and self.get('discount_amount') and self.get('additional_discount_account'):
+		if (
+			enable_discount_accounting
+			and self.get("discount_amount")
+			and self.get("additional_discount_account")
+		):
 			amount = item.amount
 			base_amount = item.base_amount
 
@@ -894,15 +1045,21 @@
 		amount = tax.tax_amount_after_discount_amount
 		base_amount = tax.base_tax_amount_after_discount_amount
 
-		if enable_discount_accounting and self.get('discount_amount') and self.get('additional_discount_account') \
-			and self.get('apply_discount_on') == 'Grand Total':
+		if (
+			enable_discount_accounting
+			and self.get("discount_amount")
+			and self.get("additional_discount_account")
+			and self.get("apply_discount_on") == "Grand Total"
+		):
 			amount = tax.tax_amount
 			base_amount = tax.base_tax_amount
 
 		return amount, base_amount
 
 	def make_discount_gl_entries(self, gl_entries):
-		enable_discount_accounting = cint(frappe.db.get_single_value('Accounts Settings', 'enable_discount_accounting'))
+		enable_discount_accounting = cint(
+			frappe.db.get_single_value("Accounts Settings", "enable_discount_accounting")
+		)
 
 		if enable_discount_accounting:
 			if self.doctype == "Purchase Invoice":
@@ -916,61 +1073,81 @@
 				supplier_or_customer = self.customer
 
 			for item in self.get("items"):
-				if item.get('discount_amount') and item.get('discount_account'):
+				if item.get("discount_amount") and item.get("discount_account"):
 					discount_amount = item.discount_amount * item.qty
 					if self.doctype == "Purchase Invoice":
-						income_or_expense_account = (item.expense_account
+						income_or_expense_account = (
+							item.expense_account
 							if (not item.enable_deferred_expense or self.is_return)
-							else item.deferred_expense_account)
+							else item.deferred_expense_account
+						)
 					else:
-						income_or_expense_account = (item.income_account
+						income_or_expense_account = (
+							item.income_account
 							if (not item.enable_deferred_revenue or self.is_return)
-							else item.deferred_revenue_account)
+							else item.deferred_revenue_account
+						)
 
 					account_currency = get_account_currency(item.discount_account)
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": item.discount_account,
-							"against": supplier_or_customer,
-							dr_or_cr: flt(discount_amount, item.precision('discount_amount')),
-							dr_or_cr + "_in_account_currency": flt(discount_amount * self.get('conversion_rate'),
-								item.precision('discount_amount')),
-							"cost_center": item.cost_center,
-							"project": item.project
-						}, account_currency, item=item)
+						self.get_gl_dict(
+							{
+								"account": item.discount_account,
+								"against": supplier_or_customer,
+								dr_or_cr: flt(discount_amount, item.precision("discount_amount")),
+								dr_or_cr
+								+ "_in_account_currency": flt(
+									discount_amount * self.get("conversion_rate"), item.precision("discount_amount")
+								),
+								"cost_center": item.cost_center,
+								"project": item.project,
+							},
+							account_currency,
+							item=item,
+						)
 					)
 
 					account_currency = get_account_currency(income_or_expense_account)
 					gl_entries.append(
-						self.get_gl_dict({
-							"account": income_or_expense_account,
-							"against": supplier_or_customer,
-							rev_dr_cr: flt(discount_amount, item.precision('discount_amount')),
-							rev_dr_cr + "_in_account_currency": flt(discount_amount * self.get('conversion_rate'),
-								item.precision('discount_amount')),
-							"cost_center": item.cost_center,
-							"project": item.project or self.project
-						}, account_currency, item=item)
+						self.get_gl_dict(
+							{
+								"account": income_or_expense_account,
+								"against": supplier_or_customer,
+								rev_dr_cr: flt(discount_amount, item.precision("discount_amount")),
+								rev_dr_cr
+								+ "_in_account_currency": flt(
+									discount_amount * self.get("conversion_rate"), item.precision("discount_amount")
+								),
+								"cost_center": item.cost_center,
+								"project": item.project or self.project,
+							},
+							account_currency,
+							item=item,
+						)
 					)
 
-			if self.get('discount_amount') and self.get('additional_discount_account'):
+			if self.get("discount_amount") and self.get("additional_discount_account"):
 				gl_entries.append(
-					self.get_gl_dict({
-						"account": self.additional_discount_account,
-						"against": supplier_or_customer,
-						dr_or_cr: self.discount_amount,
-						"cost_center": self.cost_center
-					}, item=self)
+					self.get_gl_dict(
+						{
+							"account": self.additional_discount_account,
+							"against": supplier_or_customer,
+							dr_or_cr: self.discount_amount,
+							"cost_center": self.cost_center,
+						},
+						item=self,
+					)
 				)
 
-
 	def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield):
 		from erpnext.controllers.status_updater import get_allowance_for
 
 		item_allowance = {}
 		global_qty_allowance, global_amount_allowance = None, None
 
-		role_allowed_to_over_bill = frappe.db.get_single_value('Accounts Settings', 'role_allowed_to_over_bill')
+		role_allowed_to_over_bill = frappe.db.get_single_value(
+			"Accounts Settings", "role_allowed_to_over_bill"
+		)
 		user_roles = frappe.get_roles()
 
 		total_overbilled_amt = 0.0
@@ -979,21 +1156,29 @@
 			if not item.get(item_ref_dn):
 				continue
 
-			ref_amt = flt(frappe.db.get_value(ref_dt + " Item",
-				item.get(item_ref_dn), based_on), self.precision(based_on, item))
+			ref_amt = flt(
+				frappe.db.get_value(ref_dt + " Item", item.get(item_ref_dn), based_on),
+				self.precision(based_on, item),
+			)
 			if not ref_amt:
 				frappe.msgprint(
-					_("System will not check overbilling since amount for Item {0} in {1} is zero")
-						.format(item.item_code, ref_dt), title=_("Warning"), indicator="orange")
+					_("System will not check overbilling since amount for Item {0} in {1} is zero").format(
+						item.item_code, ref_dt
+					),
+					title=_("Warning"),
+					indicator="orange",
+				)
 				continue
 
 			already_billed = self.get_billed_amount_for_item(item, item_ref_dn, based_on)
 
-			total_billed_amt = flt(flt(already_billed) + flt(item.get(based_on)),
-				self.precision(based_on, item))
+			total_billed_amt = flt(
+				flt(already_billed) + flt(item.get(based_on)), self.precision(based_on, item)
+			)
 
-			allowance, item_allowance, global_qty_allowance, global_amount_allowance = \
-				get_allowance_for(item.item_code, item_allowance, global_qty_allowance, global_amount_allowance, "amount")
+			allowance, item_allowance, global_qty_allowance, global_amount_allowance = get_allowance_for(
+				item.item_code, item_allowance, global_qty_allowance, global_amount_allowance, "amount"
+			)
 
 			max_allowed_amt = flt(ref_amt * (100 + allowance) / 100)
 
@@ -1008,20 +1193,29 @@
 			if overbill_amt > 0.01 and role_allowed_to_over_bill not in user_roles:
 				if self.doctype != "Purchase Invoice":
 					self.throw_overbill_exception(item, max_allowed_amt)
-				elif not cint(frappe.db.get_single_value("Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice")):
+				elif not cint(
+					frappe.db.get_single_value(
+						"Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"
+					)
+				):
 					self.throw_overbill_exception(item, max_allowed_amt)
 
 		if role_allowed_to_over_bill in user_roles and total_overbilled_amt > 0.1:
-			frappe.msgprint(_("Overbilling of {} ignored because you have {} role.")
-					.format(total_overbilled_amt, role_allowed_to_over_bill), indicator="orange", alert=True)
+			frappe.msgprint(
+				_("Overbilling of {} ignored because you have {} role.").format(
+					total_overbilled_amt, role_allowed_to_over_bill
+				),
+				indicator="orange",
+				alert=True,
+			)
 
 	def get_billed_amount_for_item(self, item, item_ref_dn, based_on):
-		'''
-			Returns Sum of Amount of
-			Sales/Purchase Invoice Items
-			that are linked to `item_ref_dn` (`dn_detail` / `pr_detail`)
-			that are submitted OR not submitted but are under current invoice
-		'''
+		"""
+		Returns Sum of Amount of
+		Sales/Purchase Invoice Items
+		that are linked to `item_ref_dn` (`dn_detail` / `pr_detail`)
+		that are submitted OR not submitted but are under current invoice
+		"""
 
 		from frappe.query_builder import Criterion
 		from frappe.query_builder.functions import Sum
@@ -1033,41 +1227,57 @@
 		result = (
 			frappe.qb.from_(item_doctype)
 			.select(Sum(based_on_field))
+			.where(join_field == item.get(item_ref_dn))
 			.where(
-				join_field == item.get(item_ref_dn)
-			).where(
-				Criterion.any([ # select all items from other invoices OR current invoices
-					Criterion.all([ # for selecting items from other invoices
-						item_doctype.docstatus == 1,
-						item_doctype.parent != self.name
-					]),
-					Criterion.all([ # for selecting items from current invoice, that are linked to same reference
-						item_doctype.docstatus == 0,
-						item_doctype.parent == self.name,
-						item_doctype.name != item.name
-					])
-				])
+				Criterion.any(
+					[  # select all items from other invoices OR current invoices
+						Criterion.all(
+							[  # for selecting items from other invoices
+								item_doctype.docstatus == 1,
+								item_doctype.parent != self.name,
+							]
+						),
+						Criterion.all(
+							[  # for selecting items from current invoice, that are linked to same reference
+								item_doctype.docstatus == 0,
+								item_doctype.parent == self.name,
+								item_doctype.name != item.name,
+							]
+						),
+					]
+				)
 			)
 		).run()
 
 		return result[0][0] if result else 0
 
 	def throw_overbill_exception(self, item, max_allowed_amt):
-		frappe.throw(_("Cannot overbill for Item {0} in row {1} more than {2}. To allow over-billing, please set allowance in Accounts Settings")
-			.format(item.item_code, item.idx, max_allowed_amt))
+		frappe.throw(
+			_(
+				"Cannot overbill for Item {0} in row {1} more than {2}. To allow over-billing, please set allowance in Accounts Settings"
+			).format(item.item_code, item.idx, max_allowed_amt)
+		)
 
 	def get_company_default(self, fieldname, ignore_validation=False):
 		from erpnext.accounts.utils import get_company_default
+
 		return get_company_default(self.company, fieldname, ignore_validation=ignore_validation)
 
 	def get_stock_items(self):
 		stock_items = []
 		item_codes = list(set(item.item_code for item in self.get("items")))
 		if item_codes:
-			stock_items = [r[0] for r in frappe.db.sql("""
+			stock_items = [
+				r[0]
+				for r in frappe.db.sql(
+					"""
 				select name from `tabItem`
 				where name in (%s) and is_stock_item=1
-			""" % (", ".join(["%s"] * len(item_codes)),), item_codes)]
+			"""
+					% (", ".join(["%s"] * len(item_codes)),),
+					item_codes,
+				)
+			]
 
 		return stock_items
 
@@ -1081,7 +1291,8 @@
 			rev_dr_or_cr = "credit_in_account_currency"
 			party = self.supplier
 
-		advance = frappe.db.sql("""
+		advance = frappe.db.sql(
+			"""
 			select
 				account_currency, sum({dr_or_cr}) - sum({rev_dr_cr}) as amount
 			from
@@ -1089,17 +1300,22 @@
 			where
 				against_voucher_type = %s and against_voucher = %s and party=%s
 				and docstatus = 1
-		""".format(dr_or_cr=dr_or_cr, rev_dr_cr=rev_dr_or_cr), (self.doctype, self.name, party), as_dict=1) #nosec
+		""".format(
+				dr_or_cr=dr_or_cr, rev_dr_cr=rev_dr_or_cr
+			),
+			(self.doctype, self.name, party),
+			as_dict=1,
+		)  # nosec
 
 		if advance:
 			advance = advance[0]
 
 			advance_paid = flt(advance.amount, self.precision("advance_paid"))
-			formatted_advance_paid = fmt_money(advance_paid, precision=self.precision("advance_paid"),
-											   currency=advance.account_currency)
+			formatted_advance_paid = fmt_money(
+				advance_paid, precision=self.precision("advance_paid"), currency=advance.account_currency
+			)
 
-			frappe.db.set_value(self.doctype, self.name, "party_account_currency",
-								advance.account_currency)
+			frappe.db.set_value(self.doctype, self.name, "party_account_currency", advance.account_currency)
 
 			if advance.account_currency == self.currency:
 				order_total = self.get("rounded_total") or self.grand_total
@@ -1108,34 +1324,50 @@
 				order_total = self.get("base_rounded_total") or self.base_grand_total
 				precision = "base_rounded_total" if self.get("base_rounded_total") else "base_grand_total"
 
-			formatted_order_total = fmt_money(order_total, precision=self.precision(precision),
-											  currency=advance.account_currency)
+			formatted_order_total = fmt_money(
+				order_total, precision=self.precision(precision), currency=advance.account_currency
+			)
 
 			if self.currency == self.company_currency and advance_paid > order_total:
-				frappe.throw(_("Total advance ({0}) against Order {1} cannot be greater than the Grand Total ({2})")
-							 .format(formatted_advance_paid, self.name, formatted_order_total))
+				frappe.throw(
+					_(
+						"Total advance ({0}) against Order {1} cannot be greater than the Grand Total ({2})"
+					).format(formatted_advance_paid, self.name, formatted_order_total)
+				)
 
 			frappe.db.set_value(self.doctype, self.name, "advance_paid", advance_paid)
 
 	@property
 	def company_abbr(self):
 		if not hasattr(self, "_abbr"):
-			self._abbr = frappe.db.get_value('Company',  self.company,  "abbr")
+			self._abbr = frappe.db.get_value("Company", self.company, "abbr")
 
 		return self._abbr
 
 	def raise_missing_debit_credit_account_error(self, party_type, party):
 		"""Raise an error if debit to/credit to account does not exist."""
-		db_or_cr = frappe.bold("Debit To") if self.doctype == "Sales Invoice" else frappe.bold("Credit To")
+		db_or_cr = (
+			frappe.bold("Debit To") if self.doctype == "Sales Invoice" else frappe.bold("Credit To")
+		)
 		rec_or_pay = "Receivable" if self.doctype == "Sales Invoice" else "Payable"
 
 		link_to_party = frappe.utils.get_link_to_form(party_type, party)
 		link_to_company = frappe.utils.get_link_to_form("Company", self.company)
 
-		message = _("{0} Account not found against Customer {1}.").format(db_or_cr, frappe.bold(party) or '')
+		message = _("{0} Account not found against Customer {1}.").format(
+			db_or_cr, frappe.bold(party) or ""
+		)
 		message += "<br>" + _("Please set one of the following:") + "<br>"
-		message += "<br><ul><li>" + _("'Account' in the Accounting section of Customer {0}").format(link_to_party) + "</li>"
-		message += "<li>" + _("'Default {0} Account' in Company {1}").format(rec_or_pay, link_to_company) + "</li></ul>"
+		message += (
+			"<br><ul><li>"
+			+ _("'Account' in the Accounting section of Customer {0}").format(link_to_party)
+			+ "</li>"
+		)
+		message += (
+			"<li>"
+			+ _("'Default {0} Account' in Company {1}").format(rec_or_pay, link_to_company)
+			+ "</li></ul>"
+		)
 
 		frappe.throw(message, title=_("Account Missing"), exc=AccountMissingError)
 
@@ -1146,10 +1378,15 @@
 	def get_party(self):
 		party_type = None
 		if self.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"):
-			party_type = 'Customer'
+			party_type = "Customer"
 
-		elif self.doctype in ("Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"):
-			party_type = 'Supplier'
+		elif self.doctype in (
+			"Supplier Quotation",
+			"Purchase Order",
+			"Purchase Receipt",
+			"Purchase Invoice",
+		):
+			party_type = "Supplier"
 
 		elif self.meta.get_field("customer"):
 			party_type = "Customer"
@@ -1167,11 +1404,17 @@
 			if party_type and party:
 				party_account_currency = get_party_account_currency(party_type, party, self.company)
 
-				if (party_account_currency
-						and party_account_currency != self.company_currency
-						and self.currency != party_account_currency):
-					frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
-								 .format(party_type, party, party_account_currency), InvalidCurrency)
+				if (
+					party_account_currency
+					and party_account_currency != self.company_currency
+					and self.currency != party_account_currency
+				):
+					frappe.throw(
+						_("Accounting Entry for {0}: {1} can only be made in currency: {2}").format(
+							party_type, party, party_account_currency
+						),
+						InvalidCurrency,
+					)
 
 				# Note: not validating with gle account because we don't have the account
 				# at quotation / sales order level and we shouldn't stop someone
@@ -1182,15 +1425,21 @@
 		for adv in self.advances:
 			consider_for_total_advance = True
 			if adv.reference_name == linked_doc_name:
-				frappe.db.sql("""delete from `tab{0} Advance`
-					where name = %s""".format(self.doctype), adv.name)
+				frappe.db.sql(
+					"""delete from `tab{0} Advance`
+					where name = %s""".format(
+						self.doctype
+					),
+					adv.name,
+				)
 				consider_for_total_advance = False
 
 			if consider_for_total_advance:
 				total_allocated_amount += flt(adv.allocated_amount, adv.precision("allocated_amount"))
 
-		frappe.db.set_value(self.doctype, self.name, "total_advance",
-							total_allocated_amount, update_modified=False)
+		frappe.db.set_value(
+			self.doctype, self.name, "total_advance", total_allocated_amount, update_modified=False
+		)
 
 	def group_similar_items(self):
 		group_item_qty = {}
@@ -1222,11 +1471,11 @@
 			self.remove(item)
 
 	def set_payment_schedule(self):
-		if self.doctype == 'Sales Invoice' and self.is_pos:
-			self.payment_terms_template = ''
+		if self.doctype == "Sales Invoice" and self.is_pos:
+			self.payment_terms_template = ""
 			return
 
-		party_account_currency = self.get('party_account_currency')
+		party_account_currency = self.get("party_account_currency")
 		if not party_account_currency:
 			party_type, party = self.get_party()
 
@@ -1244,47 +1493,68 @@
 			base_grand_total = base_grand_total - flt(self.base_write_off_amount)
 			grand_total = grand_total - flt(self.write_off_amount)
 			po_or_so, doctype, fieldname = self.get_order_details()
-			automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+			automatically_fetch_payment_terms = cint(
+				frappe.db.get_single_value("Accounts Settings", "automatically_fetch_payment_terms")
+			)
 
 		if self.get("total_advance"):
 			if party_account_currency == self.company_currency:
 				base_grand_total -= self.get("total_advance")
-				grand_total = flt(base_grand_total / self.get("conversion_rate"), self.precision("grand_total"))
+				grand_total = flt(
+					base_grand_total / self.get("conversion_rate"), self.precision("grand_total")
+				)
 			else:
 				grand_total -= self.get("total_advance")
-				base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total"))
+				base_grand_total = flt(
+					grand_total * self.get("conversion_rate"), self.precision("base_grand_total")
+				)
 
 		if not self.get("payment_schedule"):
-			if self.doctype in ["Sales Invoice", "Purchase Invoice"] and automatically_fetch_payment_terms \
-				and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype):
+			if (
+				self.doctype in ["Sales Invoice", "Purchase Invoice"]
+				and automatically_fetch_payment_terms
+				and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype)
+			):
 				self.fetch_payment_terms_from_order(po_or_so, doctype)
-				if self.get('payment_terms_template'):
+				if self.get("payment_terms_template"):
 					self.ignore_default_payment_terms_template = 1
 			elif self.get("payment_terms_template"):
-				data = get_payment_terms(self.payment_terms_template, posting_date, grand_total, base_grand_total)
+				data = get_payment_terms(
+					self.payment_terms_template, posting_date, grand_total, base_grand_total
+				)
 				for item in data:
 					self.append("payment_schedule", item)
 			elif self.doctype not in ["Purchase Receipt"]:
-				data = dict(due_date=due_date, invoice_portion=100, payment_amount=grand_total, base_payment_amount=base_grand_total)
+				data = dict(
+					due_date=due_date,
+					invoice_portion=100,
+					payment_amount=grand_total,
+					base_payment_amount=base_grand_total,
+				)
 				self.append("payment_schedule", data)
 
 		for d in self.get("payment_schedule"):
 			if d.invoice_portion:
-				d.payment_amount = flt(grand_total * flt(d.invoice_portion / 100), d.precision('payment_amount'))
-				d.base_payment_amount = flt(base_grand_total * flt(d.invoice_portion / 100), d.precision('base_payment_amount'))
+				d.payment_amount = flt(
+					grand_total * flt(d.invoice_portion / 100), d.precision("payment_amount")
+				)
+				d.base_payment_amount = flt(
+					base_grand_total * flt(d.invoice_portion / 100), d.precision("base_payment_amount")
+				)
 				d.outstanding = d.payment_amount
 			elif not d.invoice_portion:
-				d.base_payment_amount = flt(d.payment_amount * self.get("conversion_rate"), d.precision('base_payment_amount'))
-
+				d.base_payment_amount = flt(
+					d.payment_amount * self.get("conversion_rate"), d.precision("base_payment_amount")
+				)
 
 	def get_order_details(self):
 		if self.doctype == "Sales Invoice":
-			po_or_so = self.get('items')[0].get('sales_order')
+			po_or_so = self.get("items")[0].get("sales_order")
 			po_or_so_doctype = "Sales Order"
 			po_or_so_doctype_name = "sales_order"
 
 		else:
-			po_or_so = self.get('items')[0].get('purchase_order')
+			po_or_so = self.get("items")[0].get("purchase_order")
 			po_or_so_doctype = "Purchase Order"
 			po_or_so_doctype_name = "purchase_order"
 
@@ -1300,21 +1570,21 @@
 		return False
 
 	def all_items_have_same_po_or_so(self, po_or_so, fieldname):
-		for item in self.get('items'):
+		for item in self.get("items"):
 			if item.get(fieldname) != po_or_so:
 				return False
 
 		return True
 
 	def linked_order_has_payment_terms_template(self, po_or_so, doctype):
-		return frappe.get_value(doctype, po_or_so, 'payment_terms_template')
+		return frappe.get_value(doctype, po_or_so, "payment_terms_template")
 
 	def linked_order_has_payment_schedule(self, po_or_so):
-		return frappe.get_all('Payment Schedule', filters={'parent': po_or_so})
+		return frappe.get_all("Payment Schedule", filters={"parent": po_or_so})
 
 	def fetch_payment_terms_from_order(self, po_or_so, po_or_so_doctype):
 		"""
-			Fetch Payment Terms from Purchase/Sales Order on creating a new Purchase/Sales Invoice.
+		Fetch Payment Terms from Purchase/Sales Order on creating a new Purchase/Sales Invoice.
 		"""
 		po_or_so = frappe.get_cached_doc(po_or_so_doctype, po_or_so)
 
@@ -1323,19 +1593,19 @@
 
 		for schedule in po_or_so.payment_schedule:
 			payment_schedule = {
-				'payment_term': schedule.payment_term,
-				'due_date': schedule.due_date,
-				'invoice_portion': schedule.invoice_portion,
-				'mode_of_payment': schedule.mode_of_payment,
-				'description': schedule.description
+				"payment_term": schedule.payment_term,
+				"due_date": schedule.due_date,
+				"invoice_portion": schedule.invoice_portion,
+				"mode_of_payment": schedule.mode_of_payment,
+				"description": schedule.description,
 			}
 
-			if schedule.discount_type == 'Percentage':
-				payment_schedule['discount_type'] = schedule.discount_type
-				payment_schedule['discount'] = schedule.discount
+			if schedule.discount_type == "Percentage":
+				payment_schedule["discount_type"] = schedule.discount_type
+				payment_schedule["discount"] = schedule.discount
 
 			if not schedule.invoice_portion:
-				payment_schedule['payment_amount'] = schedule.payment_amount
+				payment_schedule["payment_amount"] = schedule.payment_amount
 
 			self.append("payment_schedule", payment_schedule)
 
@@ -1348,23 +1618,29 @@
 		dates = []
 		li = []
 
-		if self.doctype == 'Sales Invoice' and self.is_pos: return
+		if self.doctype == "Sales Invoice" and self.is_pos:
+			return
 
 		for d in self.get("payment_schedule"):
 			if self.doctype == "Sales Order" and getdate(d.due_date) < getdate(self.transaction_date):
-				frappe.throw(_("Row {0}: Due Date in the Payment Terms table cannot be before Posting Date").format(d.idx))
+				frappe.throw(
+					_("Row {0}: Due Date in the Payment Terms table cannot be before Posting Date").format(d.idx)
+				)
 			elif d.due_date in dates:
 				li.append(_("{0} in row {1}").format(d.due_date, d.idx))
 			dates.append(d.due_date)
 
 		if li:
-			duplicates = '<br>' + '<br>'.join(li)
-			frappe.throw(_("Rows with duplicate due dates in other rows were found: {0}").format(duplicates))
+			duplicates = "<br>" + "<br>".join(li)
+			frappe.throw(
+				_("Rows with duplicate due dates in other rows were found: {0}").format(duplicates)
+			)
 
 	def validate_payment_schedule_amount(self):
-		if self.doctype == 'Sales Invoice' and self.is_pos: return
+		if self.doctype == "Sales Invoice" and self.is_pos:
+			return
 
-		party_account_currency = self.get('party_account_currency')
+		party_account_currency = self.get("party_account_currency")
 		if not party_account_currency:
 			party_type, party = self.get_party()
 
@@ -1388,14 +1664,25 @@
 			if self.get("total_advance"):
 				if party_account_currency == self.company_currency:
 					base_grand_total -= self.get("total_advance")
-					grand_total = flt(base_grand_total / self.get("conversion_rate"), self.precision("grand_total"))
+					grand_total = flt(
+						base_grand_total / self.get("conversion_rate"), self.precision("grand_total")
+					)
 				else:
 					grand_total -= self.get("total_advance")
-					base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total"))
+					base_grand_total = flt(
+						grand_total * self.get("conversion_rate"), self.precision("base_grand_total")
+					)
 
-			if flt(total, self.precision("grand_total")) - flt(grand_total, self.precision("grand_total")) > 0.1 or \
-				flt(base_total, self.precision("base_grand_total")) - flt(base_grand_total, self.precision("base_grand_total")) > 0.1:
-				frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total"))
+			if (
+				flt(total, self.precision("grand_total")) - flt(grand_total, self.precision("grand_total"))
+				> 0.1
+				or flt(base_total, self.precision("base_grand_total"))
+				- flt(base_grand_total, self.precision("base_grand_total"))
+				> 0.1
+			):
+				frappe.throw(
+					_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total")
+				)
 
 	def is_rounded_total_disabled(self):
 		if self.meta.get_field("disable_rounded_total"):
@@ -1405,30 +1692,33 @@
 
 	def set_inter_company_account(self):
 		"""
-			Set intercompany account for inter warehouse transactions
-			This account will be used in case billing company and internal customer's
-			representation company is same
+		Set intercompany account for inter warehouse transactions
+		This account will be used in case billing company and internal customer's
+		representation company is same
 		"""
 
 		if self.is_internal_transfer() and not self.unrealized_profit_loss_account:
-			unrealized_profit_loss_account = frappe.db.get_value('Company', self.company, 'unrealized_profit_loss_account')
+			unrealized_profit_loss_account = frappe.db.get_value(
+				"Company", self.company, "unrealized_profit_loss_account"
+			)
 
 			if not unrealized_profit_loss_account:
-				msg = _("Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}").format(
-						frappe.bold(self.company))
+				msg = _(
+					"Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}"
+				).format(frappe.bold(self.company))
 				frappe.throw(msg)
 
 			self.unrealized_profit_loss_account = unrealized_profit_loss_account
 
 	def is_internal_transfer(self):
 		"""
-			It will an internal transfer if its an internal customer and representation
-			company is same as billing company
+		It will an internal transfer if its an internal customer and representation
+		company is same as billing company
 		"""
-		if self.doctype in ('Sales Invoice', 'Delivery Note', 'Sales Order'):
-			internal_party_field = 'is_internal_customer'
-		elif self.doctype in ('Purchase Invoice', 'Purchase Receipt', 'Purchase Order'):
-			internal_party_field = 'is_internal_supplier'
+		if self.doctype in ("Sales Invoice", "Delivery Note", "Sales Order"):
+			internal_party_field = "is_internal_customer"
+		elif self.doctype in ("Purchase Invoice", "Purchase Receipt", "Purchase Order"):
+			internal_party_field = "is_internal_supplier"
 
 		if self.get(internal_party_field) and (self.represents_company == self.company):
 			return True
@@ -1436,11 +1726,11 @@
 		return False
 
 	def process_common_party_accounting(self):
-		is_invoice = self.doctype in ['Sales Invoice', 'Purchase Invoice']
+		is_invoice = self.doctype in ["Sales Invoice", "Purchase Invoice"]
 		if not is_invoice:
 			return
 
-		if frappe.db.get_single_value('Accounts Settings', 'enable_common_party_accounting'):
+		if frappe.db.get_single_value("Accounts Settings", "enable_common_party_accounting"):
 			party_link = self.get_common_party_link()
 			if party_link and self.outstanding_amount:
 				self.create_advance_and_reconcile(party_link)
@@ -1448,10 +1738,10 @@
 	def get_common_party_link(self):
 		party_type, party = self.get_party()
 		return frappe.db.get_value(
-			doctype='Party Link',
-			filters={'secondary_role': party_type, 'secondary_party': party},
-			fieldname=['primary_role', 'primary_party'],
-			as_dict=True
+			doctype="Party Link",
+			filters={"secondary_role": party_type, "secondary_party": party},
+			fieldname=["primary_role", "primary_party"],
+			as_dict=True,
 		)
 
 	def create_advance_and_reconcile(self, party_link):
@@ -1461,11 +1751,11 @@
 		primary_account = get_party_account(primary_party_type, primary_party, self.company)
 		secondary_account = get_party_account(secondary_party_type, secondary_party, self.company)
 
-		jv = frappe.new_doc('Journal Entry')
-		jv.voucher_type = 'Journal Entry'
+		jv = frappe.new_doc("Journal Entry")
+		jv.voucher_type = "Journal Entry"
 		jv.posting_date = self.posting_date
 		jv.company = self.company
-		jv.remark = 'Adjustment for {} {}'.format(self.doctype, self.name)
+		jv.remark = "Adjustment for {} {}".format(self.doctype, self.name)
 
 		reconcilation_entry = frappe._dict()
 		advance_entry = frappe._dict()
@@ -1481,21 +1771,22 @@
 		advance_entry.party_type = primary_party_type
 		advance_entry.party = primary_party
 		advance_entry.cost_center = self.cost_center
-		advance_entry.is_advance = 'Yes'
+		advance_entry.is_advance = "Yes"
 
-		if self.doctype == 'Sales Invoice':
+		if self.doctype == "Sales Invoice":
 			reconcilation_entry.credit_in_account_currency = self.outstanding_amount
 			advance_entry.debit_in_account_currency = self.outstanding_amount
 		else:
 			advance_entry.credit_in_account_currency = self.outstanding_amount
 			reconcilation_entry.debit_in_account_currency = self.outstanding_amount
 
-		jv.append('accounts', reconcilation_entry)
-		jv.append('accounts', advance_entry)
+		jv.append("accounts", reconcilation_entry)
+		jv.append("accounts", advance_entry)
 
 		jv.save()
 		jv.submit()
 
+
 @frappe.whitelist()
 def get_tax_rate(account_head):
 	return frappe.db.get_value("Account", account_head, ["tax_rate", "account_name"], as_dict=True)
@@ -1503,7 +1794,8 @@
 
 @frappe.whitelist()
 def get_default_taxes_and_charges(master_doctype, tax_template=None, company=None):
-	if not company: return {}
+	if not company:
+		return {}
 
 	if tax_template and company:
 		tax_template_company = frappe.db.get_value(master_doctype, tax_template, "company")
@@ -1513,8 +1805,8 @@
 	default_tax = frappe.db.get_value(master_doctype, {"is_default": 1, "company": company})
 
 	return {
-		'taxes_and_charges': default_tax,
-		'taxes': get_taxes_and_charges(master_doctype, default_tax)
+		"taxes_and_charges": default_tax,
+		"taxes": get_taxes_and_charges(master_doctype, default_tax),
 	}
 
 
@@ -1523,6 +1815,7 @@
 	if not master_name:
 		return
 	from frappe.model import default_fields
+
 	tax_master = frappe.get_doc(master_doctype, master_name)
 
 	taxes_and_charges = []
@@ -1541,105 +1834,157 @@
 def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
 	"""common validation for currency and price list currency"""
 
-	company_currency = frappe.get_cached_value('Company',  company,  "default_currency")
+	company_currency = frappe.get_cached_value("Company", company, "default_currency")
 
 	if not conversion_rate:
 		throw(
-			_("{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.")
-			.format(conversion_rate_label, currency, company_currency)
+			_("{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.").format(
+				conversion_rate_label, currency, company_currency
+			)
 		)
 
 
 def validate_taxes_and_charges(tax):
-	if tax.charge_type in ['Actual', 'On Net Total', 'On Paid Amount'] and tax.row_id:
-		frappe.throw(_("Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'"))
-	elif tax.charge_type in ['On Previous Row Amount', 'On Previous Row Total']:
+	if tax.charge_type in ["Actual", "On Net Total", "On Paid Amount"] and tax.row_id:
+		frappe.throw(
+			_("Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'")
+		)
+	elif tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"]:
 		if cint(tax.idx) == 1:
 			frappe.throw(
-				_("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"))
+				_(
+					"Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"
+				)
+			)
 		elif not tax.row_id:
-			frappe.throw(_("Please specify a valid Row ID for row {0} in table {1}").format(tax.idx, _(tax.doctype)))
+			frappe.throw(
+				_("Please specify a valid Row ID for row {0} in table {1}").format(tax.idx, _(tax.doctype))
+			)
 		elif tax.row_id and cint(tax.row_id) >= cint(tax.idx):
-			frappe.throw(_("Cannot refer row number greater than or equal to current row number for this Charge type"))
+			frappe.throw(
+				_("Cannot refer row number greater than or equal to current row number for this Charge type")
+			)
 
 	if tax.charge_type == "Actual":
 		tax.rate = None
 
 
-def validate_account_head(idx, account, company, context=''):
-	account_company = frappe.get_cached_value('Account', account, 'company')
+def validate_account_head(idx, account, company, context=""):
+	account_company = frappe.get_cached_value("Account", account, "company")
 
 	if account_company != company:
-		frappe.throw(_('Row {0}: {3} Account {1} does not belong to Company {2}')
-			.format(idx, frappe.bold(account), frappe.bold(company), context), title=_('Invalid Account'))
+		frappe.throw(
+			_("Row {0}: {3} Account {1} does not belong to Company {2}").format(
+				idx, frappe.bold(account), frappe.bold(company), context
+			),
+			title=_("Invalid Account"),
+		)
 
 
 def validate_cost_center(tax, doc):
 	if not tax.cost_center:
 		return
 
-	company = frappe.get_cached_value('Cost Center',
-		tax.cost_center, 'company')
+	company = frappe.get_cached_value("Cost Center", tax.cost_center, "company")
 
 	if company != doc.company:
-		frappe.throw(_('Row {0}: Cost Center {1} does not belong to Company {2}')
-			.format(tax.idx, frappe.bold(tax.cost_center), frappe.bold(doc.company)), title=_('Invalid Cost Center'))
+		frappe.throw(
+			_("Row {0}: Cost Center {1} does not belong to Company {2}").format(
+				tax.idx, frappe.bold(tax.cost_center), frappe.bold(doc.company)
+			),
+			title=_("Invalid Cost Center"),
+		)
 
 
 def validate_inclusive_tax(tax, doc):
 	def _on_previous_row_error(row_range):
-		throw(_("To include tax in row {0} in Item rate, taxes in rows {1} must also be included").format(tax.idx, row_range))
+		throw(
+			_("To include tax in row {0} in Item rate, taxes in rows {1} must also be included").format(
+				tax.idx, row_range
+			)
+		)
 
 	if cint(getattr(tax, "included_in_print_rate", None)):
 		if tax.charge_type == "Actual":
 			# inclusive tax cannot be of type Actual
-			throw(_("Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount").format(tax.idx))
-		elif tax.charge_type == "On Previous Row Amount" and \
-				not cint(doc.get("taxes")[cint(tax.row_id) - 1].included_in_print_rate):
+			throw(
+				_("Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount").format(
+					tax.idx
+				)
+			)
+		elif tax.charge_type == "On Previous Row Amount" and not cint(
+			doc.get("taxes")[cint(tax.row_id) - 1].included_in_print_rate
+		):
 			# referred row should also be inclusive
 			_on_previous_row_error(tax.row_id)
-		elif tax.charge_type == "On Previous Row Total" and \
-				not all([cint(t.included_in_print_rate) for t in doc.get("taxes")[:cint(tax.row_id) - 1]]):
+		elif tax.charge_type == "On Previous Row Total" and not all(
+			[cint(t.included_in_print_rate) for t in doc.get("taxes")[: cint(tax.row_id) - 1]]
+		):
 			# all rows about the referred tax should be inclusive
 			_on_previous_row_error("1 - %d" % (tax.row_id,))
 		elif tax.get("category") == "Valuation":
 			frappe.throw(_("Valuation type charges can not be marked as Inclusive"))
 
 
-def set_balance_in_account_currency(gl_dict, account_currency=None, conversion_rate=None, company_currency=None):
+def set_balance_in_account_currency(
+	gl_dict, account_currency=None, conversion_rate=None, company_currency=None
+):
 	if (not conversion_rate) and (account_currency != company_currency):
-		frappe.throw(_("Account: {0} with currency: {1} can not be selected")
-					 .format(gl_dict.account, account_currency))
+		frappe.throw(
+			_("Account: {0} with currency: {1} can not be selected").format(
+				gl_dict.account, account_currency
+			)
+		)
 
-	gl_dict["account_currency"] = company_currency if account_currency == company_currency \
-		else account_currency
+	gl_dict["account_currency"] = (
+		company_currency if account_currency == company_currency else account_currency
+	)
 
 	# set debit/credit in account currency if not provided
 	if flt(gl_dict.debit) and not flt(gl_dict.debit_in_account_currency):
-		gl_dict.debit_in_account_currency = gl_dict.debit if account_currency == company_currency \
+		gl_dict.debit_in_account_currency = (
+			gl_dict.debit
+			if account_currency == company_currency
 			else flt(gl_dict.debit / conversion_rate, 2)
+		)
 
 	if flt(gl_dict.credit) and not flt(gl_dict.credit_in_account_currency):
-		gl_dict.credit_in_account_currency = gl_dict.credit if account_currency == company_currency \
+		gl_dict.credit_in_account_currency = (
+			gl_dict.credit
+			if account_currency == company_currency
 			else flt(gl_dict.credit / conversion_rate, 2)
+		)
 
 
-def get_advance_journal_entries(party_type, party, party_account, amount_field,
-								order_doctype, order_list, include_unallocated=True):
-	dr_or_cr = "credit_in_account_currency" if party_type == "Customer" else "debit_in_account_currency"
+def get_advance_journal_entries(
+	party_type,
+	party,
+	party_account,
+	amount_field,
+	order_doctype,
+	order_list,
+	include_unallocated=True,
+):
+	dr_or_cr = (
+		"credit_in_account_currency" if party_type == "Customer" else "debit_in_account_currency"
+	)
 
 	conditions = []
 	if include_unallocated:
 		conditions.append("ifnull(t2.reference_name, '')=''")
 
 	if order_list:
-		order_condition = ', '.join(['%s'] * len(order_list))
-		conditions.append(" (t2.reference_type = '{0}' and ifnull(t2.reference_name, '') in ({1}))" \
-						  .format(order_doctype, order_condition))
+		order_condition = ", ".join(["%s"] * len(order_list))
+		conditions.append(
+			" (t2.reference_type = '{0}' and ifnull(t2.reference_name, '') in ({1}))".format(
+				order_doctype, order_condition
+			)
+		)
 
 	reference_condition = " and (" + " or ".join(conditions) + ")" if conditions else ""
 
-	journal_entries = frappe.db.sql("""
+	journal_entries = frappe.db.sql(
+		"""
 		select
 			"Journal Entry" as reference_type, t1.name as reference_name,
 			t1.remark as remarks, t2.{0} as amount, t2.name as reference_row,
@@ -1651,31 +1996,50 @@
 			and t2.party_type = %s and t2.party = %s
 			and t2.is_advance = 'Yes' and t1.docstatus = 1
 			and {1} > 0 {2}
-		order by t1.posting_date""".format(amount_field, dr_or_cr, reference_condition),
-									[party_account, party_type, party] + order_list, as_dict=1)
+		order by t1.posting_date""".format(
+			amount_field, dr_or_cr, reference_condition
+		),
+		[party_account, party_type, party] + order_list,
+		as_dict=1,
+	)
 
 	return list(journal_entries)
 
 
-def get_advance_payment_entries(party_type, party, party_account, order_doctype,
-		order_list=None, include_unallocated=True, against_all_orders=False, limit=None, condition=None):
+def get_advance_payment_entries(
+	party_type,
+	party,
+	party_account,
+	order_doctype,
+	order_list=None,
+	include_unallocated=True,
+	against_all_orders=False,
+	limit=None,
+	condition=None,
+):
 	party_account_field = "paid_from" if party_type == "Customer" else "paid_to"
-	currency_field = "paid_from_account_currency" if party_type == "Customer" else "paid_to_account_currency"
+	currency_field = (
+		"paid_from_account_currency" if party_type == "Customer" else "paid_to_account_currency"
+	)
 	payment_type = "Receive" if party_type == "Customer" else "Pay"
-	exchange_rate_field = "source_exchange_rate" if payment_type == "Receive" else "target_exchange_rate"
+	exchange_rate_field = (
+		"source_exchange_rate" if payment_type == "Receive" else "target_exchange_rate"
+	)
 
 	payment_entries_against_order, unallocated_payment_entries = [], []
 	limit_cond = "limit %s" % limit if limit else ""
 
 	if order_list or against_all_orders:
 		if order_list:
-			reference_condition = " and t2.reference_name in ({0})" \
-				.format(', '.join(['%s'] * len(order_list)))
+			reference_condition = " and t2.reference_name in ({0})".format(
+				", ".join(["%s"] * len(order_list))
+			)
 		else:
 			reference_condition = ""
 			order_list = []
 
-		payment_entries_against_order = frappe.db.sql("""
+		payment_entries_against_order = frappe.db.sql(
+			"""
 			select
 				"Payment Entry" as reference_type, t1.name as reference_name,
 				t1.remarks, t2.allocated_amount as amount, t2.name as reference_row,
@@ -1687,12 +2051,16 @@
 				and t1.party_type = %s and t1.party = %s and t1.docstatus = 1
 				and t2.reference_doctype = %s {2}
 			order by t1.posting_date {3}
-		""".format(currency_field, party_account_field, reference_condition, limit_cond, exchange_rate_field),
-													  [party_account, payment_type, party_type, party,
-													   order_doctype] + order_list, as_dict=1)
+		""".format(
+				currency_field, party_account_field, reference_condition, limit_cond, exchange_rate_field
+			),
+			[party_account, payment_type, party_type, party, order_doctype] + order_list,
+			as_dict=1,
+		)
 
 	if include_unallocated:
-		unallocated_payment_entries = frappe.db.sql("""
+		unallocated_payment_entries = frappe.db.sql(
+			"""
 				select "Payment Entry" as reference_type, name as reference_name, posting_date,
 				remarks, unallocated_amount as amount, {2} as exchange_rate, {3} as currency
 				from `tabPayment Entry`
@@ -1700,11 +2068,16 @@
 					{0} = %s and party_type = %s and party = %s and payment_type = %s
 					and docstatus = 1 and unallocated_amount > 0 {condition}
 				order by posting_date {1}
-			""".format(party_account_field, limit_cond, exchange_rate_field, currency_field, condition=condition or ""),
-			(party_account, party_type, party, payment_type), as_dict=1)
+			""".format(
+				party_account_field, limit_cond, exchange_rate_field, currency_field, condition=condition or ""
+			),
+			(party_account, party_type, party, payment_type),
+			as_dict=1,
+		)
 
 	return list(payment_entries_against_order) + list(unallocated_payment_entries)
 
+
 def update_invoice_status():
 	"""Updates status as Overdue for applicable invoices. Runs daily."""
 	today = getdate()
@@ -1722,10 +2095,7 @@
 		payable_amount = (
 			frappe.qb.from_(payment_schedule)
 			.select(Sum(payment_amount))
-			.where(
-				(payment_schedule.parent == invoice.name)
-				& (payment_schedule.due_date < today)
-			)
+			.where((payment_schedule.parent == invoice.name) & (payment_schedule.due_date < today))
 		)
 
 		total = (
@@ -1740,21 +2110,14 @@
 			.else_(invoice.base_rounded_total)
 		)
 
-		total_amount = (
-			frappe.qb.terms.Case()
-			.when(consider_base_amount, base_total)
-			.else_(total)
-		)
+		total_amount = frappe.qb.terms.Case().when(consider_base_amount, base_total).else_(total)
 
 		is_overdue = total_amount - invoice.outstanding_amount < payable_amount
 
 		conditions = (
 			(invoice.docstatus == 1)
 			& (invoice.outstanding_amount > 0)
-			& (
-				invoice.status.like("Unpaid%")
-				| invoice.status.like("Partly Paid%")
-			)
+			& (invoice.status.like("Unpaid%") | invoice.status.like("Partly Paid%"))
 			& (
 				((invoice.is_pos & invoice.due_date < today) | is_overdue)
 				if doctype == "Sales Invoice"
@@ -1772,7 +2135,9 @@
 
 
 @frappe.whitelist()
-def get_payment_terms(terms_template, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None):
+def get_payment_terms(
+	terms_template, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None
+):
 	if not terms_template:
 		return
 
@@ -1780,14 +2145,18 @@
 
 	schedule = []
 	for d in terms_doc.get("terms"):
-		term_details = get_payment_term_details(d, posting_date, grand_total, base_grand_total, bill_date)
+		term_details = get_payment_term_details(
+			d, posting_date, grand_total, base_grand_total, bill_date
+		)
 		schedule.append(term_details)
 
 	return schedule
 
 
 @frappe.whitelist()
-def get_payment_term_details(term, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None):
+def get_payment_term_details(
+	term, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None
+):
 	term_details = frappe._dict()
 	if isinstance(term, str):
 		term = frappe.get_doc("Payment Term", term)
@@ -1814,6 +2183,7 @@
 
 	return term_details
 
+
 def get_due_date(term, posting_date=None, bill_date=None):
 	due_date = None
 	date = bill_date or posting_date
@@ -1825,6 +2195,7 @@
 		due_date = add_months(get_last_day(date), term.credit_months)
 	return due_date
 
+
 def get_discount_date(term, posting_date=None, bill_date=None):
 	discount_validity = None
 	date = bill_date or posting_date
@@ -1836,64 +2207,73 @@
 		discount_validity = add_months(get_last_day(date), term.discount_validity)
 	return discount_validity
 
+
 def get_supplier_block_status(party_name):
 	"""
 	Returns a dict containing the values of `on_hold`, `release_date` and `hold_type` of
 	a `Supplier`
 	"""
-	supplier = frappe.get_doc('Supplier', party_name)
+	supplier = frappe.get_doc("Supplier", party_name)
 	info = {
-		'on_hold': supplier.on_hold,
-		'release_date': supplier.release_date,
-		'hold_type': supplier.hold_type
+		"on_hold": supplier.on_hold,
+		"release_date": supplier.release_date,
+		"hold_type": supplier.hold_type,
 	}
 	return info
 
+
 def set_child_tax_template_and_map(item, child_item, parent_doc):
 	args = {
-			'item_code': item.item_code,
-			'posting_date': parent_doc.transaction_date,
-			'tax_category': parent_doc.get('tax_category'),
-			'company': parent_doc.get('company')
-		}
+		"item_code": item.item_code,
+		"posting_date": parent_doc.transaction_date,
+		"tax_category": parent_doc.get("tax_category"),
+		"company": parent_doc.get("company"),
+	}
 
 	child_item.item_tax_template = _get_item_tax_template(args, item.taxes)
 	if child_item.get("item_tax_template"):
-		child_item.item_tax_rate = get_item_tax_map(parent_doc.get('company'), child_item.item_tax_template, as_json=True)
+		child_item.item_tax_rate = get_item_tax_map(
+			parent_doc.get("company"), child_item.item_tax_template, as_json=True
+		)
+
 
 def add_taxes_from_tax_template(child_item, parent_doc, db_insert=True):
-	add_taxes_from_item_tax_template = frappe.db.get_single_value("Accounts Settings", "add_taxes_from_item_tax_template")
+	add_taxes_from_item_tax_template = frappe.db.get_single_value(
+		"Accounts Settings", "add_taxes_from_item_tax_template"
+	)
 
 	if child_item.get("item_tax_rate") and add_taxes_from_item_tax_template:
 		tax_map = json.loads(child_item.get("item_tax_rate"))
 		for tax_type in tax_map:
 			tax_rate = flt(tax_map[tax_type])
-			taxes = parent_doc.get('taxes') or []
+			taxes = parent_doc.get("taxes") or []
 			# add new row for tax head only if missing
 			found = any(tax.account_head == tax_type for tax in taxes)
 			if not found:
 				tax_row = parent_doc.append("taxes", {})
-				tax_row.update({
-					"description" : str(tax_type).split(' - ')[0],
-					"charge_type" : "On Net Total",
-					"account_head" : tax_type,
-					"rate" : tax_rate
-				})
+				tax_row.update(
+					{
+						"description": str(tax_type).split(" - ")[0],
+						"charge_type": "On Net Total",
+						"account_head": tax_type,
+						"rate": tax_rate,
+					}
+				)
 				if parent_doc.doctype == "Purchase Order":
-					tax_row.update({
-						"category" : "Total",
-						"add_deduct_tax" : "Add"
-					})
+					tax_row.update({"category": "Total", "add_deduct_tax": "Add"})
 				if db_insert:
 					tax_row.db_insert()
 
-def set_order_defaults(parent_doctype, parent_doctype_name, child_doctype, child_docname, trans_item):
+
+def set_order_defaults(
+	parent_doctype, parent_doctype_name, child_doctype, child_docname, trans_item
+):
 	"""
 	Returns a Sales/Purchase Order Item child item containing the default values
 	"""
 	p_doc = frappe.get_doc(parent_doctype, parent_doctype_name)
 	child_item = frappe.new_doc(child_doctype, p_doc, child_docname)
-	item = frappe.get_doc("Item", trans_item.get('item_code'))
+	item = frappe.get_doc("Item", trans_item.get("item_code"))
 
 	for field in ("item_code", "item_name", "description", "item_group"):
 		child_item.update({field: item.get(field)})
@@ -1903,8 +2283,10 @@
 	child_item.stock_uom = item.stock_uom
 	child_item.uom = trans_item.get("uom") or item.stock_uom
 	child_item.warehouse = get_item_warehouse(item, p_doc, overwrite_warehouse=True)
-	conversion_factor = flt(get_conversion_factor(item.item_code, child_item.uom).get("conversion_factor"))
-	child_item.conversion_factor = flt(trans_item.get('conversion_factor')) or conversion_factor
+	conversion_factor = flt(
+		get_conversion_factor(item.item_code, child_item.uom).get("conversion_factor")
+	)
+	child_item.conversion_factor = flt(trans_item.get("conversion_factor")) or conversion_factor
 
 	if child_doctype == "Purchase Order Item":
 		# Initialized value will update in parent validation
@@ -1913,28 +2295,53 @@
 	if child_doctype == "Sales Order Item":
 		child_item.warehouse = get_item_warehouse(item, p_doc, overwrite_warehouse=True)
 		if not child_item.warehouse:
-			frappe.throw(_("Cannot find {} for item {}. Please set the same in Item Master or Stock Settings.")
-				.format(frappe.bold("default warehouse"), frappe.bold(item.item_code)))
+			frappe.throw(
+				_("Cannot find {} for item {}. Please set the same in Item Master or Stock Settings.").format(
+					frappe.bold("default warehouse"), frappe.bold(item.item_code)
+				)
+			)
 
 	set_child_tax_template_and_map(item, child_item, p_doc)
 	add_taxes_from_tax_template(child_item, p_doc)
 	return child_item
 
+
 def validate_child_on_delete(row, parent):
 	"""Check if partially transacted item (row) is being deleted."""
 	if parent.doctype == "Sales Order":
 		if flt(row.delivered_qty):
-			frappe.throw(_("Row #{0}: Cannot delete item {1} which has already been delivered").format(row.idx, row.item_code))
+			frappe.throw(
+				_("Row #{0}: Cannot delete item {1} which has already been delivered").format(
+					row.idx, row.item_code
+				)
+			)
 		if flt(row.work_order_qty):
-			frappe.throw(_("Row #{0}: Cannot delete item {1} which has work order assigned to it.").format(row.idx, row.item_code))
+			frappe.throw(
+				_("Row #{0}: Cannot delete item {1} which has work order assigned to it.").format(
+					row.idx, row.item_code
+				)
+			)
 		if flt(row.ordered_qty):
-			frappe.throw(_("Row #{0}: Cannot delete item {1} which is assigned to customer's purchase order.").format(row.idx, row.item_code))
+			frappe.throw(
+				_("Row #{0}: Cannot delete item {1} which is assigned to customer's purchase order.").format(
+					row.idx, row.item_code
+				)
+			)
 
 	if parent.doctype == "Purchase Order" and flt(row.received_qty):
-		frappe.throw(_("Row #{0}: Cannot delete item {1} which has already been received").format(row.idx, row.item_code))
+		frappe.throw(
+			_("Row #{0}: Cannot delete item {1} which has already been received").format(
+				row.idx, row.item_code
+			)
+		)
 
 	if flt(row.billed_amt):
-		frappe.throw(_("Row #{0}: Cannot delete item {1} which has already been billed.").format(row.idx, row.item_code))
+		frappe.throw(
+			_("Row #{0}: Cannot delete item {1} which has already been billed.").format(
+				row.idx, row.item_code
+			)
+		)
+
 
 def update_bin_on_delete(row, doctype):
 	"""Update bin for deleted item (row)."""
@@ -1944,6 +2351,7 @@
 		get_reserved_qty,
 		update_bin_qty,
 	)
+
 	qty_dict = {}
 
 	if doctype == "Sales Order":
@@ -1957,6 +2365,7 @@
 	if row.warehouse:
 		update_bin_qty(row.item_code, row.warehouse, qty_dict)
 
+
 def validate_and_delete_children(parent, data):
 	deleted_children = []
 	updated_item_names = [d.get("docname") for d in data]
@@ -1979,14 +2388,18 @@
 
 @frappe.whitelist()
 def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, child_docname="items"):
-	def check_doc_permissions(doc, perm_type='create'):
+	def check_doc_permissions(doc, perm_type="create"):
 		try:
 			doc.check_permission(perm_type)
 		except frappe.PermissionError:
-			actions = { 'create': 'add', 'write': 'update'}
+			actions = {"create": "add", "write": "update"}
 
-			frappe.throw(_("You do not have permissions to {} items in a {}.")
-				.format(actions[perm_type], parent_doctype), title=_("Insufficient Permissions"))
+			frappe.throw(
+				_("You do not have permissions to {} items in a {}.").format(
+					actions[perm_type], parent_doctype
+				),
+				title=_("Insufficient Permissions"),
+			)
 
 	def validate_workflow_conditions(doc):
 		workflow = get_workflow_name(doc.doctype)
@@ -2006,13 +2419,17 @@
 
 		if not transitions:
 			frappe.throw(
-				_("You are not allowed to update as per the conditions set in {} Workflow.").format(get_link_to_form("Workflow", workflow)),
-				title=_("Insufficient Permissions")
+				_("You are not allowed to update as per the conditions set in {} Workflow.").format(
+					get_link_to_form("Workflow", workflow)
+				),
+				title=_("Insufficient Permissions"),
 			)
 
 	def get_new_child_item(item_row):
 		child_doctype = "Sales Order Item" if parent_doctype == "Sales Order" else "Purchase Order Item"
-		return set_order_defaults(parent_doctype, parent_doctype_name, child_doctype, child_docname, item_row)
+		return set_order_defaults(
+			parent_doctype, parent_doctype_name, child_doctype, child_docname, item_row
+		)
 
 	def validate_quantity(child_item, d):
 		if parent_doctype == "Sales Order" and flt(d.get("qty")) < flt(child_item.delivered_qty):
@@ -2023,10 +2440,10 @@
 
 	data = json.loads(trans_items)
 
-	sales_doctypes = ['Sales Order', 'Sales Invoice', 'Delivery Note', 'Quotation']
+	sales_doctypes = ["Sales Order", "Sales Invoice", "Delivery Note", "Quotation"]
 	parent = frappe.get_doc(parent_doctype, parent_doctype_name)
 
-	check_doc_permissions(parent, 'write')
+	check_doc_permissions(parent, "write")
 	validate_and_delete_children(parent, data)
 
 	for d in data:
@@ -2038,28 +2455,38 @@
 
 		if not d.get("docname"):
 			new_child_flag = True
-			check_doc_permissions(parent, 'create')
+			check_doc_permissions(parent, "create")
 			child_item = get_new_child_item(d)
 		else:
-			check_doc_permissions(parent, 'write')
-			child_item = frappe.get_doc(parent_doctype + ' Item', d.get("docname"))
+			check_doc_permissions(parent, "write")
+			child_item = frappe.get_doc(parent_doctype + " Item", d.get("docname"))
 
 			prev_rate, new_rate = flt(child_item.get("rate")), flt(d.get("rate"))
 			prev_qty, new_qty = flt(child_item.get("qty")), flt(d.get("qty"))
-			prev_con_fac, new_con_fac = flt(child_item.get("conversion_factor")), flt(d.get("conversion_factor"))
+			prev_con_fac, new_con_fac = flt(child_item.get("conversion_factor")), flt(
+				d.get("conversion_factor")
+			)
 			prev_uom, new_uom = child_item.get("uom"), d.get("uom")
 
-			if parent_doctype == 'Sales Order':
+			if parent_doctype == "Sales Order":
 				prev_date, new_date = child_item.get("delivery_date"), d.get("delivery_date")
-			elif parent_doctype == 'Purchase Order':
+			elif parent_doctype == "Purchase Order":
 				prev_date, new_date = child_item.get("schedule_date"), d.get("schedule_date")
 
 			rate_unchanged = prev_rate == new_rate
 			qty_unchanged = prev_qty == new_qty
 			uom_unchanged = prev_uom == new_uom
 			conversion_factor_unchanged = prev_con_fac == new_con_fac
-			date_unchanged = prev_date == getdate(new_date) if prev_date and new_date else False # in case of delivery note etc
-			if rate_unchanged and qty_unchanged and conversion_factor_unchanged and uom_unchanged and date_unchanged:
+			date_unchanged = (
+				prev_date == getdate(new_date) if prev_date and new_date else False
+			)  # in case of delivery note etc
+			if (
+				rate_unchanged
+				and qty_unchanged
+				and conversion_factor_unchanged
+				and uom_unchanged
+				and date_unchanged
+			):
 				continue
 
 		validate_quantity(child_item, d)
@@ -2069,9 +2496,14 @@
 		conv_fac_precision = child_item.precision("conversion_factor") or 2
 		qty_precision = child_item.precision("qty") or 2
 
-		if flt(child_item.billed_amt, rate_precision) > flt(flt(d.get("rate"), rate_precision) * flt(d.get("qty"), qty_precision), rate_precision):
-			frappe.throw(_("Row #{0}: Cannot set Rate if amount is greater than billed amount for Item {1}.")
-						 .format(child_item.idx, child_item.item_code))
+		if flt(child_item.billed_amt, rate_precision) > flt(
+			flt(d.get("rate"), rate_precision) * flt(d.get("qty"), qty_precision), rate_precision
+		):
+			frappe.throw(
+				_("Row #{0}: Cannot set Rate if amount is greater than billed amount for Item {1}.").format(
+					child_item.idx, child_item.item_code
+				)
+			)
 		else:
 			child_item.rate = flt(d.get("rate"), rate_precision)
 
@@ -2079,18 +2511,22 @@
 			if child_item.stock_uom == child_item.uom:
 				child_item.conversion_factor = 1
 			else:
-				child_item.conversion_factor = flt(d.get('conversion_factor'), conv_fac_precision)
+				child_item.conversion_factor = flt(d.get("conversion_factor"), conv_fac_precision)
 
 		if d.get("uom"):
 			child_item.uom = d.get("uom")
-			conversion_factor = flt(get_conversion_factor(child_item.item_code, child_item.uom).get("conversion_factor"))
-			child_item.conversion_factor = flt(d.get('conversion_factor'), conv_fac_precision) or conversion_factor
+			conversion_factor = flt(
+				get_conversion_factor(child_item.item_code, child_item.uom).get("conversion_factor")
+			)
+			child_item.conversion_factor = (
+				flt(d.get("conversion_factor"), conv_fac_precision) or conversion_factor
+			)
 
-		if d.get("delivery_date") and parent_doctype == 'Sales Order':
-			child_item.delivery_date = d.get('delivery_date')
+		if d.get("delivery_date") and parent_doctype == "Sales Order":
+			child_item.delivery_date = d.get("delivery_date")
 
-		if d.get("schedule_date") and parent_doctype == 'Purchase Order':
-			child_item.schedule_date = d.get('schedule_date')
+		if d.get("schedule_date") and parent_doctype == "Purchase Order":
+			child_item.schedule_date = d.get("schedule_date")
 
 		if flt(child_item.price_list_rate):
 			if flt(child_item.rate) > flt(child_item.price_list_rate):
@@ -2100,14 +2536,16 @@
 
 				if parent_doctype in sales_doctypes:
 					child_item.margin_type = "Amount"
-					child_item.margin_rate_or_amount = flt(child_item.rate - child_item.price_list_rate,
-						child_item.precision("margin_rate_or_amount"))
+					child_item.margin_rate_or_amount = flt(
+						child_item.rate - child_item.price_list_rate, child_item.precision("margin_rate_or_amount")
+					)
 					child_item.rate_with_margin = child_item.rate
 			else:
-				child_item.discount_percentage = flt((1 - flt(child_item.rate) / flt(child_item.price_list_rate)) * 100.0,
-					child_item.precision("discount_percentage"))
-				child_item.discount_amount = flt(
-					child_item.price_list_rate) - flt(child_item.rate)
+				child_item.discount_percentage = flt(
+					(1 - flt(child_item.rate) / flt(child_item.price_list_rate)) * 100.0,
+					child_item.precision("discount_percentage"),
+				)
+				child_item.discount_amount = flt(child_item.price_list_rate) - flt(child_item.rate)
 
 				if parent_doctype in sales_doctypes:
 					child_item.margin_type = ""
@@ -2130,11 +2568,12 @@
 	if parent_doctype == "Sales Order":
 		make_packing_list(parent)
 		parent.set_gross_profit()
-	frappe.get_doc('Authorization Control').validate_approving_authority(parent.doctype,
-		parent.company, parent.base_grand_total)
+	frappe.get_doc("Authorization Control").validate_approving_authority(
+		parent.doctype, parent.company, parent.base_grand_total
+	)
 
 	parent.set_payment_schedule()
-	if parent_doctype == 'Purchase Order':
+	if parent_doctype == "Purchase Order":
 		parent.validate_minimum_order_qty()
 		parent.validate_budget()
 		if parent.is_against_so():
@@ -2148,8 +2587,8 @@
 
 	parent.save()
 
-	if parent_doctype == 'Purchase Order':
-		update_last_purchase_rate(parent, is_submit = 1)
+	if parent_doctype == "Purchase Order":
+		update_last_purchase_rate(parent, is_submit=1)
 		parent.update_prevdoc_status()
 		parent.update_requested_qty()
 		parent.update_ordered_qty()
@@ -2162,7 +2601,7 @@
 	else:
 		parent.update_reserved_qty()
 		parent.update_project()
-		parent.update_prevdoc_status('submit')
+		parent.update_prevdoc_status("submit")
 		parent.update_delivery_status()
 
 	parent.reload()
@@ -2172,10 +2611,12 @@
 	parent.update_billing_percentage()
 	parent.set_status()
 
+
 @erpnext.allow_regional
 def validate_regional(doc):
 	pass
 
+
 @erpnext.allow_regional
 def validate_einvoice_fields(doc):
 	pass
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index b740476..4789207 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -20,12 +20,11 @@
 class QtyMismatchError(ValidationError):
 	pass
 
-class BuyingController(StockController, Subcontracting):
 
+class BuyingController(StockController, Subcontracting):
 	def get_feed(self):
 		if self.get("supplier_name"):
-			return _("From {0} | {1} {2}").format(self.supplier_name, self.currency,
-				self.grand_total)
+			return _("From {0} | {1} {2}").format(self.supplier_name, self.currency, self.grand_total)
 
 	def validate(self):
 		super(BuyingController, self).validate()
@@ -40,16 +39,18 @@
 		self.set_supplier_address()
 		self.validate_asset_return()
 
-		if self.doctype=="Purchase Invoice":
+		if self.doctype == "Purchase Invoice":
 			self.validate_purchase_receipt_if_update_stock()
 
-		if self.doctype=="Purchase Receipt" or (self.doctype=="Purchase Invoice" and self.update_stock):
+		if self.doctype == "Purchase Receipt" or (
+			self.doctype == "Purchase Invoice" and self.update_stock
+		):
 			# self.validate_purchase_return()
 			self.validate_rejected_warehouse()
 			self.validate_accepted_rejected_qty()
 			validate_for_items(self)
 
-			#sub-contracting
+			# sub-contracting
 			self.validate_for_subcontracting()
 			self.create_raw_materials_supplied("supplied_items")
 			self.set_landed_cost_voucher_amount()
@@ -59,8 +60,12 @@
 
 	def onload(self):
 		super(BuyingController, self).onload()
-		self.set_onload("backflush_based_on", frappe.db.get_single_value('Buying Settings',
-			'backflush_raw_materials_of_subcontract_based_on'))
+		self.set_onload(
+			"backflush_based_on",
+			frappe.db.get_single_value(
+				"Buying Settings", "backflush_raw_materials_of_subcontract_based_on"
+			),
+		)
 
 	def set_missing_values(self, for_validate=False):
 		super(BuyingController, self).set_missing_values(for_validate)
@@ -77,9 +82,9 @@
 					doctype=self.doctype,
 					company=self.company,
 					party_address=self.get("supplier_address"),
-					shipping_address=self.get('shipping_address'),
-					fetch_payment_terms_template= not self.get('ignore_default_payment_terms_template'),
-					ignore_permissions=self.flags.ignore_permissions
+					shipping_address=self.get("shipping_address"),
+					fetch_payment_terms_template=not self.get("ignore_default_payment_terms_template"),
+					ignore_permissions=self.flags.ignore_permissions,
 				)
 			)
 
@@ -88,14 +93,16 @@
 	def set_supplier_from_item_default(self):
 		if self.meta.get_field("supplier") and not self.supplier:
 			for d in self.get("items"):
-				supplier = frappe.db.get_value("Item Default",
-					{"parent": d.item_code, "company": self.company}, "default_supplier")
+				supplier = frappe.db.get_value(
+					"Item Default", {"parent": d.item_code, "company": self.company}, "default_supplier"
+				)
 				if supplier:
 					self.supplier = supplier
 				else:
 					item_group = frappe.db.get_value("Item", d.item_code, "item_group")
-					supplier = frappe.db.get_value("Item Default",
-					{"parent": item_group, "company": self.company}, "default_supplier")
+					supplier = frappe.db.get_value(
+						"Item Default", {"parent": item_group, "company": self.company}, "default_supplier"
+					)
 					if supplier:
 						self.supplier = supplier
 					break
@@ -106,55 +113,71 @@
 			self.update_tax_category(msg)
 
 	def update_tax_category(self, msg):
-		tax_for_valuation = [d for d in self.get("taxes")
-				if d.category in ["Valuation", "Valuation and Total"]]
+		tax_for_valuation = [
+			d for d in self.get("taxes") if d.category in ["Valuation", "Valuation and Total"]
+		]
 
 		if tax_for_valuation:
 			for d in tax_for_valuation:
-				d.category = 'Total'
+				d.category = "Total"
 
 			msgprint(msg)
 
 	def validate_asset_return(self):
-		if self.doctype not in ['Purchase Receipt', 'Purchase Invoice'] or not self.is_return:
+		if self.doctype not in ["Purchase Receipt", "Purchase Invoice"] or not self.is_return:
 			return
 
-		purchase_doc_field = 'purchase_receipt' if self.doctype == 'Purchase Receipt' else 'purchase_invoice'
-		not_cancelled_asset = [d.name for d in frappe.db.get_all("Asset", {
-			purchase_doc_field: self.return_against,
-			"docstatus": 1
-		})]
+		purchase_doc_field = (
+			"purchase_receipt" if self.doctype == "Purchase Receipt" else "purchase_invoice"
+		)
+		not_cancelled_asset = [
+			d.name
+			for d in frappe.db.get_all("Asset", {purchase_doc_field: self.return_against, "docstatus": 1})
+		]
 		if self.is_return and len(not_cancelled_asset):
-			frappe.throw(_("{} has submitted assets linked to it. You need to cancel the assets to create purchase return.")
-				.format(self.return_against), title=_("Not Allowed"))
+			frappe.throw(
+				_(
+					"{} has submitted assets linked to it. You need to cancel the assets to create purchase return."
+				).format(self.return_against),
+				title=_("Not Allowed"),
+			)
 
 	def get_asset_items(self):
-		if self.doctype not in ['Purchase Order', 'Purchase Invoice', 'Purchase Receipt']:
+		if self.doctype not in ["Purchase Order", "Purchase Invoice", "Purchase Receipt"]:
 			return []
 
 		return [d.item_code for d in self.items if d.is_fixed_asset]
 
 	def set_landed_cost_voucher_amount(self):
 		for d in self.get("items"):
-			lc_voucher_data = frappe.db.sql("""select sum(applicable_charges), cost_center
+			lc_voucher_data = frappe.db.sql(
+				"""select sum(applicable_charges), cost_center
 				from `tabLanded Cost Item`
-				where docstatus = 1 and purchase_receipt_item = %s""", d.name)
+				where docstatus = 1 and purchase_receipt_item = %s""",
+				d.name,
+			)
 			d.landed_cost_voucher_amount = lc_voucher_data[0][0] if lc_voucher_data else 0.0
 			if not d.cost_center and lc_voucher_data and lc_voucher_data[0][1]:
-				d.db_set('cost_center', lc_voucher_data[0][1])
+				d.db_set("cost_center", lc_voucher_data[0][1])
 
 	def validate_from_warehouse(self):
-		for item in self.get('items'):
-			if item.get('from_warehouse') and (item.get('from_warehouse') == item.get('warehouse')):
-				frappe.throw(_("Row #{0}: Accepted Warehouse and Supplier Warehouse cannot be same").format(item.idx))
+		for item in self.get("items"):
+			if item.get("from_warehouse") and (item.get("from_warehouse") == item.get("warehouse")):
+				frappe.throw(
+					_("Row #{0}: Accepted Warehouse and Supplier Warehouse cannot be same").format(item.idx)
+				)
 
-			if item.get('from_warehouse') and self.get('is_subcontracted') == 'Yes':
-				frappe.throw(_("Row #{0}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor").format(item.idx))
+			if item.get("from_warehouse") and self.get("is_subcontracted") == "Yes":
+				frappe.throw(
+					_(
+						"Row #{0}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor"
+					).format(item.idx)
+				)
 
 	def set_supplier_address(self):
 		address_dict = {
-			'supplier_address': 'address_display',
-			'shipping_address': 'shipping_address_display'
+			"supplier_address": "address_display",
+			"shipping_address": "shipping_address_display",
 		}
 
 		for address_field, address_display_field in address_dict.items():
@@ -163,6 +186,7 @@
 
 	def set_total_in_words(self):
 		from frappe.utils import money_in_words
+
 		if self.meta.get_field("base_in_words"):
 			if self.meta.get_field("base_rounded_total") and not self.is_rounded_total_disabled():
 				amount = self.base_rounded_total
@@ -181,10 +205,10 @@
 	# update valuation rate
 	def update_valuation_rate(self, reset_outgoing_rate=True):
 		"""
-			item_tax_amount is the total tax amount applied on that item
-			stored for valuation
+		item_tax_amount is the total tax amount applied on that item
+		stored for valuation
 
-			TODO: rename item_tax_amount to valuation_tax_amount
+		TODO: rename item_tax_amount to valuation_tax_amount
 		"""
 		stock_and_asset_items = []
 		stock_and_asset_items = self.get_stock_items() + self.get_asset_items()
@@ -192,36 +216,50 @@
 		stock_and_asset_items_qty, stock_and_asset_items_amount = 0, 0
 		last_item_idx = 1
 		for d in self.get("items"):
-			if (d.item_code and d.item_code in stock_and_asset_items):
+			if d.item_code and d.item_code in stock_and_asset_items:
 				stock_and_asset_items_qty += flt(d.qty)
 				stock_and_asset_items_amount += flt(d.base_net_amount)
 				last_item_idx = d.idx
 
-		total_valuation_amount = sum(flt(d.base_tax_amount_after_discount_amount) for d in self.get("taxes")
-			if d.category in ["Valuation", "Valuation and Total"])
+		total_valuation_amount = sum(
+			flt(d.base_tax_amount_after_discount_amount)
+			for d in self.get("taxes")
+			if d.category in ["Valuation", "Valuation and Total"]
+		)
 
 		valuation_amount_adjustment = total_valuation_amount
 		for i, item in enumerate(self.get("items")):
 			if item.item_code and item.qty and item.item_code in stock_and_asset_items:
-				item_proportion = flt(item.base_net_amount) / stock_and_asset_items_amount if stock_and_asset_items_amount \
+				item_proportion = (
+					flt(item.base_net_amount) / stock_and_asset_items_amount
+					if stock_and_asset_items_amount
 					else flt(item.qty) / stock_and_asset_items_qty
+				)
 
 				if i == (last_item_idx - 1):
-					item.item_tax_amount = flt(valuation_amount_adjustment,
-						self.precision("item_tax_amount", item))
+					item.item_tax_amount = flt(
+						valuation_amount_adjustment, self.precision("item_tax_amount", item)
+					)
 				else:
-					item.item_tax_amount = flt(item_proportion * total_valuation_amount,
-						self.precision("item_tax_amount", item))
+					item.item_tax_amount = flt(
+						item_proportion * total_valuation_amount, self.precision("item_tax_amount", item)
+					)
 					valuation_amount_adjustment -= item.item_tax_amount
 
 				self.round_floats_in(item)
-				if flt(item.conversion_factor)==0.0:
-					item.conversion_factor = get_conversion_factor(item.item_code, item.uom).get("conversion_factor") or 1.0
+				if flt(item.conversion_factor) == 0.0:
+					item.conversion_factor = (
+						get_conversion_factor(item.item_code, item.uom).get("conversion_factor") or 1.0
+					)
 
 				qty_in_stock_uom = flt(item.qty * item.conversion_factor)
 				item.rm_supp_cost = self.get_supplied_items_cost(item.name, reset_outgoing_rate)
-				item.valuation_rate = ((item.base_net_amount + item.item_tax_amount + item.rm_supp_cost
-					 + flt(item.landed_cost_voucher_amount)) / qty_in_stock_uom)
+				item.valuation_rate = (
+					item.base_net_amount
+					+ item.item_tax_amount
+					+ item.rm_supp_cost
+					+ flt(item.landed_cost_voucher_amount)
+				) / qty_in_stock_uom
 			else:
 				item.valuation_rate = 0.0
 
@@ -242,46 +280,55 @@
 				# Get outgoing rate based on original item cost based on valuation method
 
 				if not d.get(frappe.scrub(ref_doctype)):
-					outgoing_rate = get_incoming_rate({
-						"item_code": d.item_code,
-						"warehouse": d.get('from_warehouse'),
-						"posting_date": self.get('posting_date') or self.get('transation_date'),
-						"posting_time": self.get('posting_time'),
-						"qty": -1 * flt(d.get('stock_qty')),
-						"serial_no": d.get('serial_no'),
-						"batch_no": d.get("batch_no"),
-						"company": self.company,
-						"voucher_type": self.doctype,
-						"voucher_no": self.name,
-						"allow_zero_valuation": d.get("allow_zero_valuation")
-					}, raise_error_if_no_rate=False)
+					outgoing_rate = get_incoming_rate(
+						{
+							"item_code": d.item_code,
+							"warehouse": d.get("from_warehouse"),
+							"posting_date": self.get("posting_date") or self.get("transation_date"),
+							"posting_time": self.get("posting_time"),
+							"qty": -1 * flt(d.get("stock_qty")),
+							"serial_no": d.get("serial_no"),
+							"batch_no": d.get("batch_no"),
+							"company": self.company,
+							"voucher_type": self.doctype,
+							"voucher_no": self.name,
+							"allow_zero_valuation": d.get("allow_zero_valuation"),
+						},
+						raise_error_if_no_rate=False,
+					)
 
-					rate = flt(outgoing_rate * d.conversion_factor, d.precision('rate'))
+					rate = flt(outgoing_rate * d.conversion_factor, d.precision("rate"))
 				else:
-					rate = frappe.db.get_value(ref_doctype, d.get(frappe.scrub(ref_doctype)), 'rate')
+					rate = frappe.db.get_value(ref_doctype, d.get(frappe.scrub(ref_doctype)), "rate")
 
 				if self.is_internal_transfer():
 					if rate != d.rate:
 						d.rate = rate
 						d.discount_percentage = 0
 						d.discount_amount = 0
-						frappe.msgprint(_("Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer")
-							.format(d.idx), alert=1)
+						frappe.msgprint(
+							_(
+								"Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer"
+							).format(d.idx),
+							alert=1,
+						)
 
 	def get_supplied_items_cost(self, item_row_id, reset_outgoing_rate=True):
 		supplied_items_cost = 0.0
 		for d in self.get("supplied_items"):
 			if d.reference_name == item_row_id:
-				if reset_outgoing_rate and frappe.get_cached_value('Item', d.rm_item_code, 'is_stock_item'):
-					rate = get_incoming_rate({
-						"item_code": d.rm_item_code,
-						"warehouse": self.supplier_warehouse,
-						"posting_date": self.posting_date,
-						"posting_time": self.posting_time,
-						"qty": -1 * d.consumed_qty,
-						"serial_no": d.serial_no,
-						"batch_no": d.batch_no,
-					})
+				if reset_outgoing_rate and frappe.get_cached_value("Item", d.rm_item_code, "is_stock_item"):
+					rate = get_incoming_rate(
+						{
+							"item_code": d.rm_item_code,
+							"warehouse": self.supplier_warehouse,
+							"posting_date": self.posting_date,
+							"posting_time": self.posting_time,
+							"qty": -1 * d.consumed_qty,
+							"serial_no": d.serial_no,
+							"batch_no": d.batch_no,
+						}
+					)
 
 					if rate > 0:
 						d.rate = rate
@@ -316,7 +363,7 @@
 					item.bom = None
 
 	def create_raw_materials_supplied(self, raw_material_table):
-		if self.is_subcontracted=="Yes":
+		if self.is_subcontracted == "Yes":
 			self.set_materials_for_subcontracted_items(raw_material_table)
 
 		elif self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
@@ -324,19 +371,17 @@
 				item.rm_supp_cost = 0.0
 
 		if self.is_subcontracted == "No" and self.get("supplied_items"):
-			self.set('supplied_items', [])
+			self.set("supplied_items", [])
 
 	@property
 	def sub_contracted_items(self):
 		if not hasattr(self, "_sub_contracted_items"):
 			self._sub_contracted_items = []
-			item_codes = list(set(item.item_code for item in
-				self.get("items")))
+			item_codes = list(set(item.item_code for item in self.get("items")))
 			if item_codes:
-				items = frappe.get_all('Item', filters={
-					'name': ['in', item_codes],
-					'is_sub_contracted_item': 1
-				})
+				items = frappe.get_all(
+					"Item", filters={"name": ["in", item_codes], "is_sub_contracted_item": 1}
+				)
 				self._sub_contracted_items = [item.name for item in items]
 
 		return self._sub_contracted_items
@@ -350,9 +395,11 @@
 					frappe.throw(_("Row {0}: Conversion Factor is mandatory").format(d.idx))
 				d.stock_qty = flt(d.qty) * flt(d.conversion_factor)
 
-				if self.doctype=="Purchase Receipt" and d.meta.get_field("received_stock_qty"):
+				if self.doctype == "Purchase Receipt" and d.meta.get_field("received_stock_qty"):
 					# Set Received Qty in Stock UOM
-					d.received_stock_qty = flt(d.received_qty) * flt(d.conversion_factor, d.precision("conversion_factor"))
+					d.received_stock_qty = flt(d.received_qty) * flt(
+						d.conversion_factor, d.precision("conversion_factor")
+					)
 
 	def validate_purchase_return(self):
 		for d in self.get("items"):
@@ -368,20 +415,26 @@
 					d.rejected_warehouse = self.rejected_warehouse
 
 				if not d.rejected_warehouse:
-					frappe.throw(_("Row #{0}: Rejected Warehouse is mandatory against rejected Item {1}").format(d.idx, d.item_code))
+					frappe.throw(
+						_("Row #{0}: Rejected Warehouse is mandatory against rejected Item {1}").format(
+							d.idx, d.item_code
+						)
+					)
 
 	# validate accepted and rejected qty
 	def validate_accepted_rejected_qty(self):
 		for d in self.get("items"):
-			self.validate_negative_quantity(d, ["received_qty","qty", "rejected_qty"])
+			self.validate_negative_quantity(d, ["received_qty", "qty", "rejected_qty"])
 
 			if not flt(d.received_qty) and (flt(d.qty) or flt(d.rejected_qty)):
 				d.received_qty = flt(d.qty) + flt(d.rejected_qty)
 
 			# Check Received Qty = Accepted Qty + Rejected Qty
 			val = flt(d.qty) + flt(d.rejected_qty)
-			if (flt(val, d.precision("received_qty")) != flt(d.received_qty, d.precision("received_qty"))):
-				message = _("Row #{0}: Received Qty must be equal to Accepted + Rejected Qty for Item {1}").format(d.idx, d.item_code)
+			if flt(val, d.precision("received_qty")) != flt(d.received_qty, d.precision("received_qty")):
+				message = _(
+					"Row #{0}: Received Qty must be equal to Accepted + Rejected Qty for Item {1}"
+				).format(d.idx, d.item_code)
 				frappe.throw(msg=message, title=_("Mismatch"), exc=QtyMismatchError)
 
 	def validate_negative_quantity(self, item_row, field_list):
@@ -391,15 +444,20 @@
 		item_row = item_row.as_dict()
 		for fieldname in field_list:
 			if flt(item_row[fieldname]) < 0:
-				frappe.throw(_("Row #{0}: {1} can not be negative for item {2}").format(item_row['idx'],
-					frappe.get_meta(item_row.doctype).get_label(fieldname), item_row['item_code']))
+				frappe.throw(
+					_("Row #{0}: {1} can not be negative for item {2}").format(
+						item_row["idx"],
+						frappe.get_meta(item_row.doctype).get_label(fieldname),
+						item_row["item_code"],
+					)
+				)
 
 	def check_for_on_hold_or_closed_status(self, ref_doctype, ref_fieldname):
 		for d in self.get("items"):
 			if d.get(ref_fieldname):
 				status = frappe.db.get_value(ref_doctype, d.get(ref_fieldname), "status")
 				if status in ("Closed", "On Hold"):
-					frappe.throw(_("{0} {1} is {2}").format(ref_doctype,d.get(ref_fieldname), status))
+					frappe.throw(_("{0} {1} is {2}").format(ref_doctype, d.get(ref_fieldname), status))
 
 	def update_stock_ledger(self, allow_negative_stock=False, via_landed_cost_voucher=False):
 		self.update_ordered_and_reserved_qty()
@@ -407,76 +465,88 @@
 		sl_entries = []
 		stock_items = self.get_stock_items()
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.item_code in stock_items and d.warehouse:
 				pr_qty = flt(d.qty) * flt(d.conversion_factor)
 
 				if pr_qty:
 
-					if d.from_warehouse and ((not cint(self.is_return) and self.docstatus==1)
-						or (cint(self.is_return) and self.docstatus==2)):
-						from_warehouse_sle = self.get_sl_entries(d, {
-							"actual_qty": -1 * pr_qty,
-							"warehouse": d.from_warehouse,
-							"outgoing_rate": d.rate,
-							"recalculate_rate": 1,
-							"dependant_sle_voucher_detail_no": d.name
-						})
+					if d.from_warehouse and (
+						(not cint(self.is_return) and self.docstatus == 1)
+						or (cint(self.is_return) and self.docstatus == 2)
+					):
+						from_warehouse_sle = self.get_sl_entries(
+							d,
+							{
+								"actual_qty": -1 * pr_qty,
+								"warehouse": d.from_warehouse,
+								"outgoing_rate": d.rate,
+								"recalculate_rate": 1,
+								"dependant_sle_voucher_detail_no": d.name,
+							},
+						)
 
 						sl_entries.append(from_warehouse_sle)
 
-					sle = self.get_sl_entries(d, {
-						"actual_qty": flt(pr_qty),
-						"serial_no": cstr(d.serial_no).strip()
-					})
+					sle = self.get_sl_entries(
+						d, {"actual_qty": flt(pr_qty), "serial_no": cstr(d.serial_no).strip()}
+					)
 					if self.is_return:
-						outgoing_rate = get_rate_for_return(self.doctype, self.name, d.item_code, self.return_against, item_row=d)
+						outgoing_rate = get_rate_for_return(
+							self.doctype, self.name, d.item_code, self.return_against, item_row=d
+						)
 
-						sle.update({
-							"outgoing_rate": outgoing_rate,
-							"recalculate_rate": 1
-						})
+						sle.update({"outgoing_rate": outgoing_rate, "recalculate_rate": 1})
 						if d.from_warehouse:
 							sle.dependant_sle_voucher_detail_no = d.name
 					else:
 						val_rate_db_precision = 6 if cint(self.precision("valuation_rate", d)) <= 6 else 9
 						incoming_rate = flt(d.valuation_rate, val_rate_db_precision)
-						sle.update({
-							"incoming_rate": incoming_rate,
-							"recalculate_rate": 1 if (self.is_subcontracted and d.bom) or d.from_warehouse else 0
-						})
+						sle.update(
+							{
+								"incoming_rate": incoming_rate,
+								"recalculate_rate": 1 if (self.is_subcontracted and d.bom) or d.from_warehouse else 0,
+							}
+						)
 					sl_entries.append(sle)
 
-					if d.from_warehouse and ((not cint(self.is_return) and self.docstatus==2)
-						or (cint(self.is_return) and self.docstatus==1)):
-						from_warehouse_sle = self.get_sl_entries(d, {
-							"actual_qty": -1 * pr_qty,
-							"warehouse": d.from_warehouse,
-							"recalculate_rate": 1
-						})
+					if d.from_warehouse and (
+						(not cint(self.is_return) and self.docstatus == 2)
+						or (cint(self.is_return) and self.docstatus == 1)
+					):
+						from_warehouse_sle = self.get_sl_entries(
+							d, {"actual_qty": -1 * pr_qty, "warehouse": d.from_warehouse, "recalculate_rate": 1}
+						)
 
 						sl_entries.append(from_warehouse_sle)
 
 				if flt(d.rejected_qty) != 0:
-					sl_entries.append(self.get_sl_entries(d, {
-						"warehouse": d.rejected_warehouse,
-						"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor),
-						"serial_no": cstr(d.rejected_serial_no).strip(),
-						"incoming_rate": 0.0
-					}))
+					sl_entries.append(
+						self.get_sl_entries(
+							d,
+							{
+								"warehouse": d.rejected_warehouse,
+								"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor),
+								"serial_no": cstr(d.rejected_serial_no).strip(),
+								"incoming_rate": 0.0,
+							},
+						)
+					)
 
 		self.make_sl_entries_for_supplier_warehouse(sl_entries)
-		self.make_sl_entries(sl_entries, allow_negative_stock=allow_negative_stock,
-			via_landed_cost_voucher=via_landed_cost_voucher)
+		self.make_sl_entries(
+			sl_entries,
+			allow_negative_stock=allow_negative_stock,
+			via_landed_cost_voucher=via_landed_cost_voucher,
+		)
 
 	def update_ordered_and_reserved_qty(self):
 		po_map = {}
 		for d in self.get("items"):
-			if self.doctype=="Purchase Receipt" \
-				and d.purchase_order:
-					po_map.setdefault(d.purchase_order, []).append(d.purchase_order_item)
+			if self.doctype == "Purchase Receipt" and d.purchase_order:
+				po_map.setdefault(d.purchase_order, []).append(d.purchase_order_item)
 
-			elif self.doctype=="Purchase Invoice" and d.purchase_order and d.po_detail:
+			elif self.doctype == "Purchase Invoice" and d.purchase_order and d.po_detail:
 				po_map.setdefault(d.purchase_order, []).append(d.po_detail)
 
 		for po, po_item_rows in po_map.items():
@@ -484,68 +554,78 @@
 				po_obj = frappe.get_doc("Purchase Order", po)
 
 				if po_obj.status in ["Closed", "Cancelled"]:
-					frappe.throw(_("{0} {1} is cancelled or closed").format(_("Purchase Order"), po),
-						frappe.InvalidStatusError)
+					frappe.throw(
+						_("{0} {1} is cancelled or closed").format(_("Purchase Order"), po),
+						frappe.InvalidStatusError,
+					)
 
 				po_obj.update_ordered_qty(po_item_rows)
 				if self.is_subcontracted:
 					po_obj.update_reserved_qty_for_subcontract()
 
 	def make_sl_entries_for_supplier_warehouse(self, sl_entries):
-		if hasattr(self, 'supplied_items'):
-			for d in self.get('supplied_items'):
+		if hasattr(self, "supplied_items"):
+			for d in self.get("supplied_items"):
 				# negative quantity is passed, as raw material qty has to be decreased
 				# when PR is submitted and it has to be increased when PR is cancelled
-				sl_entries.append(self.get_sl_entries(d, {
-					"item_code": d.rm_item_code,
-					"warehouse": self.supplier_warehouse,
-					"actual_qty": -1*flt(d.consumed_qty),
-					"dependant_sle_voucher_detail_no": d.reference_name
-				}))
+				sl_entries.append(
+					self.get_sl_entries(
+						d,
+						{
+							"item_code": d.rm_item_code,
+							"warehouse": self.supplier_warehouse,
+							"actual_qty": -1 * flt(d.consumed_qty),
+							"dependant_sle_voucher_detail_no": d.reference_name,
+						},
+					)
+				)
 
 	def on_submit(self):
-		if self.get('is_return'):
+		if self.get("is_return"):
 			return
 
-		if self.doctype in ['Purchase Receipt', 'Purchase Invoice']:
-			field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt'
+		if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
+			field = "purchase_invoice" if self.doctype == "Purchase Invoice" else "purchase_receipt"
 
 			self.process_fixed_asset()
 			self.update_fixed_asset(field)
 
-		if self.doctype in ['Purchase Order', 'Purchase Receipt']:
-			update_last_purchase_rate(self, is_submit = 1)
+		if self.doctype in ["Purchase Order", "Purchase Receipt"]:
+			update_last_purchase_rate(self, is_submit=1)
 
 	def on_cancel(self):
 		super(BuyingController, self).on_cancel()
 
-		if self.get('is_return'):
+		if self.get("is_return"):
 			return
 
-		if self.doctype in ['Purchase Order', 'Purchase Receipt']:
-			update_last_purchase_rate(self, is_submit = 0)
+		if self.doctype in ["Purchase Order", "Purchase Receipt"]:
+			update_last_purchase_rate(self, is_submit=0)
 
-		if self.doctype in ['Purchase Receipt', 'Purchase Invoice']:
-			field = 'purchase_invoice' if self.doctype == 'Purchase Invoice' else 'purchase_receipt'
+		if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
+			field = "purchase_invoice" if self.doctype == "Purchase Invoice" else "purchase_receipt"
 
 			self.delete_linked_asset()
 			self.update_fixed_asset(field, delete_asset=True)
 
 	def validate_budget(self):
 		if self.docstatus == 1:
-			for data in self.get('items'):
+			for data in self.get("items"):
 				args = data.as_dict()
-				args.update({
-					'doctype': self.doctype,
-					'company': self.company,
-					'posting_date': (self.schedule_date
-						if self.doctype == 'Material Request' else self.transaction_date)
-				})
+				args.update(
+					{
+						"doctype": self.doctype,
+						"company": self.company,
+						"posting_date": (
+							self.schedule_date if self.doctype == "Material Request" else self.transaction_date
+						),
+					}
+				)
 
 				validate_expense_against_budget(args)
 
 	def process_fixed_asset(self):
-		if self.doctype == 'Purchase Invoice' and not self.update_stock:
+		if self.doctype == "Purchase Invoice" and not self.update_stock:
 			return
 
 		asset_items = self.get_asset_items()
@@ -560,12 +640,12 @@
 			if d.is_fixed_asset:
 				item_data = items_data.get(d.item_code)
 
-				if item_data.get('auto_create_assets'):
+				if item_data.get("auto_create_assets"):
 					# If asset has to be auto created
 					# Check for asset naming series
-					if item_data.get('asset_naming_series'):
+					if item_data.get("asset_naming_series"):
 						created_assets = []
-						if item_data.get('is_grouped_asset'):
+						if item_data.get("is_grouped_asset"):
 							asset = self.make_asset(d, is_grouped_asset=True)
 							created_assets.append(asset)
 						else:
@@ -575,21 +655,31 @@
 
 						if len(created_assets) > 5:
 							# dont show asset form links if more than 5 assets are created
-							messages.append(_('{} Assets created for {}').format(len(created_assets), frappe.bold(d.item_code)))
-						else:
-							assets_link = list(map(lambda d: frappe.utils.get_link_to_form('Asset', d), created_assets))
-							assets_link = frappe.bold(','.join(assets_link))
-
-							is_plural = 's' if len(created_assets) != 1 else ''
 							messages.append(
-								_('Asset{} {assets_link} created for {}').format(is_plural, frappe.bold(d.item_code), assets_link=assets_link)
+								_("{} Assets created for {}").format(len(created_assets), frappe.bold(d.item_code))
+							)
+						else:
+							assets_link = list(map(lambda d: frappe.utils.get_link_to_form("Asset", d), created_assets))
+							assets_link = frappe.bold(",".join(assets_link))
+
+							is_plural = "s" if len(created_assets) != 1 else ""
+							messages.append(
+								_("Asset{} {assets_link} created for {}").format(
+									is_plural, frappe.bold(d.item_code), assets_link=assets_link
+								)
 							)
 					else:
-						frappe.throw(_("Row {}: Asset Naming Series is mandatory for the auto creation for item {}")
-							.format(d.idx, frappe.bold(d.item_code)))
+						frappe.throw(
+							_("Row {}: Asset Naming Series is mandatory for the auto creation for item {}").format(
+								d.idx, frappe.bold(d.item_code)
+							)
+						)
 				else:
-					messages.append(_("Assets not created for {0}. You will have to create asset manually.")
-						.format(frappe.bold(d.item_code)))
+					messages.append(
+						_("Assets not created for {0}. You will have to create asset manually.").format(
+							frappe.bold(d.item_code)
+						)
+					)
 
 		for message in messages:
 			frappe.msgprint(message, title="Success", indicator="green")
@@ -598,31 +688,34 @@
 		if not row.asset_location:
 			frappe.throw(_("Row {0}: Enter location for the asset item {1}").format(row.idx, row.item_code))
 
-		item_data = frappe.db.get_value('Item',
-			row.item_code, ['asset_naming_series', 'asset_category'], as_dict=1)
+		item_data = frappe.db.get_value(
+			"Item", row.item_code, ["asset_naming_series", "asset_category"], as_dict=1
+		)
 
 		if is_grouped_asset:
 			purchase_amount = flt(row.base_amount + row.item_tax_amount)
 		else:
 			purchase_amount = flt(row.base_rate + row.item_tax_amount)
 
-		asset = frappe.get_doc({
-			'doctype': 'Asset',
-			'item_code': row.item_code,
-			'asset_name': row.item_name,
-			'naming_series': item_data.get('asset_naming_series') or 'AST',
-			'asset_category': item_data.get('asset_category'),
-			'location': row.asset_location,
-			'company': self.company,
-			'supplier': self.supplier,
-			'purchase_date': self.posting_date,
-			'calculate_depreciation': 1,
-			'purchase_receipt_amount': purchase_amount,
-			'gross_purchase_amount': purchase_amount,
-			'asset_quantity': row.qty if is_grouped_asset else 0,
-			'purchase_receipt': self.name if self.doctype == 'Purchase Receipt' else None,
-			'purchase_invoice': self.name if self.doctype == 'Purchase Invoice' else None
-		})
+		asset = frappe.get_doc(
+			{
+				"doctype": "Asset",
+				"item_code": row.item_code,
+				"asset_name": row.item_name,
+				"naming_series": item_data.get("asset_naming_series") or "AST",
+				"asset_category": item_data.get("asset_category"),
+				"location": row.asset_location,
+				"company": self.company,
+				"supplier": self.supplier,
+				"purchase_date": self.posting_date,
+				"calculate_depreciation": 1,
+				"purchase_receipt_amount": purchase_amount,
+				"gross_purchase_amount": purchase_amount,
+				"asset_quantity": row.qty if is_grouped_asset else 0,
+				"purchase_receipt": self.name if self.doctype == "Purchase Receipt" else None,
+				"purchase_invoice": self.name if self.doctype == "Purchase Invoice" else None,
+			}
+		)
 
 		asset.flags.ignore_validate = True
 		asset.flags.ignore_mandatory = True
@@ -631,22 +724,25 @@
 
 		return asset.name
 
-	def update_fixed_asset(self, field, delete_asset = False):
+	def update_fixed_asset(self, field, delete_asset=False):
 		for d in self.get("items"):
 			if d.is_fixed_asset:
-				is_auto_create_enabled = frappe.db.get_value('Item', d.item_code, 'auto_create_assets')
-				assets = frappe.db.get_all('Asset', filters={ field : self.name, 'item_code' : d.item_code })
+				is_auto_create_enabled = frappe.db.get_value("Item", d.item_code, "auto_create_assets")
+				assets = frappe.db.get_all("Asset", filters={field: self.name, "item_code": d.item_code})
 
 				for asset in assets:
-					asset = frappe.get_doc('Asset', asset.name)
+					asset = frappe.get_doc("Asset", asset.name)
 					if delete_asset and is_auto_create_enabled:
 						# need to delete movements to delete assets otherwise throws link exists error
 						movements = frappe.db.sql(
 							"""SELECT asm.name
 							FROM `tabAsset Movement` asm, `tabAsset Movement Item` asm_item
-							WHERE asm_item.parent=asm.name and asm_item.asset=%s""", asset.name, as_dict=1)
+							WHERE asm_item.parent=asm.name and asm_item.asset=%s""",
+							asset.name,
+							as_dict=1,
+						)
 						for movement in movements:
-							frappe.delete_doc('Asset Movement', movement.name, force=1)
+							frappe.delete_doc("Asset Movement", movement.name, force=1)
 						frappe.delete_doc("Asset", asset.name, force=1)
 						continue
 
@@ -659,8 +755,11 @@
 							asset.set(field, None)
 							asset.supplier = None
 						if asset.docstatus == 1 and delete_asset:
-							frappe.throw(_('Cannot cancel this document as it is linked with submitted asset {0}. Please cancel it to continue.')
-								.format(frappe.utils.get_link_to_form('Asset', asset.name)))
+							frappe.throw(
+								_(
+									"Cannot cancel this document as it is linked with submitted asset {0}. Please cancel it to continue."
+								).format(frappe.utils.get_link_to_form("Asset", asset.name))
+							)
 
 					asset.flags.ignore_validate_update_after_submit = True
 					asset.flags.ignore_mandatory = True
@@ -670,7 +769,7 @@
 					asset.save()
 
 	def delete_linked_asset(self):
-		if self.doctype == 'Purchase Invoice' and not self.get('update_stock'):
+		if self.doctype == "Purchase Invoice" and not self.get("update_stock"):
 			return
 
 		frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s", self.name)
@@ -681,37 +780,47 @@
 
 		if any(d.schedule_date for d in self.get("items")):
 			# Select earliest schedule_date.
-			self.schedule_date = min(d.schedule_date for d in self.get("items")
-							if d.schedule_date is not None)
+			self.schedule_date = min(
+				d.schedule_date for d in self.get("items") if d.schedule_date is not None
+			)
 
 		if self.schedule_date:
-			for d in self.get('items'):
+			for d in self.get("items"):
 				if not d.schedule_date:
 					d.schedule_date = self.schedule_date
 
-				if (d.schedule_date and self.transaction_date and
-					getdate(d.schedule_date) < getdate(self.transaction_date)):
+				if (
+					d.schedule_date
+					and self.transaction_date
+					and getdate(d.schedule_date) < getdate(self.transaction_date)
+				):
 					frappe.throw(_("Row #{0}: Reqd by Date cannot be before Transaction Date").format(d.idx))
 		else:
 			frappe.throw(_("Please enter Reqd by Date"))
 
 	def validate_items(self):
 		# validate items to see if they have is_purchase_item or is_subcontracted_item enabled
-		if self.doctype=="Material Request": return
+		if self.doctype == "Material Request":
+			return
 
-		if hasattr(self, "is_subcontracted") and self.is_subcontracted == 'Yes':
+		if hasattr(self, "is_subcontracted") and self.is_subcontracted == "Yes":
 			validate_item_type(self, "is_sub_contracted_item", "subcontracted")
 		else:
 			validate_item_type(self, "is_purchase_item", "purchase")
 
+
 def get_asset_item_details(asset_items):
 	asset_items_data = {}
-	for d in frappe.get_all('Item', fields = ["name", "auto_create_assets", "asset_naming_series", "is_grouped_asset"],
-		filters = {'name': ('in', asset_items)}):
+	for d in frappe.get_all(
+		"Item",
+		fields=["name", "auto_create_assets", "asset_naming_series", "is_grouped_asset"],
+		filters={"name": ("in", asset_items)},
+	):
 		asset_items_data.setdefault(d.name, d)
 
 	return asset_items_data
 
+
 def validate_item_type(doc, fieldname, message):
 	# iterate through items and check if they are valid sales or purchase items
 	items = [d.item_code for d in doc.items if d.item_code]
@@ -722,16 +831,28 @@
 
 	item_list = ", ".join(["%s" % frappe.db.escape(d) for d in items])
 
-	invalid_items = [d[0] for d in frappe.db.sql("""
+	invalid_items = [
+		d[0]
+		for d in frappe.db.sql(
+			"""
 		select item_code from tabItem where name in ({0}) and {1}=0
-		""".format(item_list, fieldname), as_list=True)]
+		""".format(
+				item_list, fieldname
+			),
+			as_list=True,
+		)
+	]
 
 	if invalid_items:
 		items = ", ".join([d for d in invalid_items])
 
 		if len(invalid_items) > 1:
-			error_message = _("Following items {0} are not marked as {1} item. You can enable them as {1} item from its Item master").format(items, message)
+			error_message = _(
+				"Following items {0} are not marked as {1} item. You can enable them as {1} item from its Item master"
+			).format(items, message)
 		else:
-			error_message = _("Following item {0} is not marked as {1} item. You can enable them as {1} item from its Item master").format(items, message)
+			error_message = _(
+				"Following item {0} is not marked as {1} item. You can enable them as {1} item from its Item master"
+			).format(items, message)
 
 		frappe.throw(error_message)
diff --git a/erpnext/controllers/employee_boarding_controller.py b/erpnext/controllers/employee_boarding_controller.py
index dd02ce1..8ff397d 100644
--- a/erpnext/controllers/employee_boarding_controller.py
+++ b/erpnext/controllers/employee_boarding_controller.py
@@ -12,34 +12,39 @@
 
 
 class EmployeeBoardingController(Document):
-	'''
-		Create the project and the task for the boarding process
-		Assign to the concerned person and roles as per the onboarding/separation template
-	'''
+	"""
+	Create the project and the task for the boarding process
+	Assign to the concerned person and roles as per the onboarding/separation template
+	"""
+
 	def validate(self):
 		# remove the task if linked before submitting the form
 		if self.amended_from:
 			for activity in self.activities:
-				activity.task = ''
+				activity.task = ""
 
 	def on_submit(self):
 		# create the project for the given employee onboarding
-		project_name = _(self.doctype) + ' : '
-		if self.doctype == 'Employee Onboarding':
+		project_name = _(self.doctype) + " : "
+		if self.doctype == "Employee Onboarding":
 			project_name += self.job_applicant
 		else:
 			project_name += self.employee
 
-		project = frappe.get_doc({
-				'doctype': 'Project',
-				'project_name': project_name,
-				'expected_start_date': self.date_of_joining if self.doctype == 'Employee Onboarding' else self.resignation_letter_date,
-				'department': self.department,
-				'company': self.company
-			}).insert(ignore_permissions=True, ignore_mandatory=True)
+		project = frappe.get_doc(
+			{
+				"doctype": "Project",
+				"project_name": project_name,
+				"expected_start_date": self.date_of_joining
+				if self.doctype == "Employee Onboarding"
+				else self.resignation_letter_date,
+				"department": self.department,
+				"company": self.company,
+			}
+		).insert(ignore_permissions=True, ignore_mandatory=True)
 
-		self.db_set('project', project.name)
-		self.db_set('boarding_status', 'Pending')
+		self.db_set("project", project.name)
+		self.db_set("boarding_status", "Pending")
 		self.reload()
 		self.create_task_and_notify_user()
 
@@ -53,22 +58,25 @@
 
 			dates = self.get_task_dates(activity, holiday_list)
 
-			task = frappe.get_doc({
-				'doctype': 'Task',
-				'project': self.project,
-				'subject': activity.activity_name + ' : ' + self.employee_name,
-				'description': activity.description,
-				'department': self.department,
-				'company': self.company,
-				'task_weight': activity.task_weight,
-				'exp_start_date': dates[0],
-				'exp_end_date': dates[1]
-			}).insert(ignore_permissions=True)
-			activity.db_set('task', task.name)
+			task = frappe.get_doc(
+				{
+					"doctype": "Task",
+					"project": self.project,
+					"subject": activity.activity_name + " : " + self.employee_name,
+					"description": activity.description,
+					"department": self.department,
+					"company": self.company,
+					"task_weight": activity.task_weight,
+					"exp_start_date": dates[0],
+					"exp_end_date": dates[1],
+				}
+			).insert(ignore_permissions=True)
+			activity.db_set("task", task.name)
 
 			users = [activity.user] if activity.user else []
 			if activity.role:
-				user_list = frappe.db.sql_list('''
+				user_list = frappe.db.sql_list(
+					"""
 					SELECT
 						DISTINCT(has_role.parent)
 					FROM
@@ -79,25 +87,27 @@
 						has_role.parenttype = 'User'
 							AND user.enabled = 1
 							AND has_role.role = %s
-				''', activity.role)
+				""",
+					activity.role,
+				)
 				users = unique(users + user_list)
 
-				if 'Administrator' in users:
-					users.remove('Administrator')
+				if "Administrator" in users:
+					users.remove("Administrator")
 
 			# assign the task the users
 			if users:
 				self.assign_task_to_users(task, users)
 
 	def get_holiday_list(self):
-		if self.doctype == 'Employee Separation':
+		if self.doctype == "Employee Separation":
 			return get_holiday_list_for_employee(self.employee)
 		else:
 			if self.employee:
 				return get_holiday_list_for_employee(self.employee)
 			else:
 				if not self.holiday_list:
-					frappe.throw(_('Please set the Holiday List.'), frappe.MandatoryError)
+					frappe.throw(_("Please set the Holiday List."), frappe.MandatoryError)
 				else:
 					return self.holiday_list
 
@@ -122,51 +132,62 @@
 	def assign_task_to_users(self, task, users):
 		for user in users:
 			args = {
-				'assign_to': [user],
-				'doctype': task.doctype,
-				'name': task.name,
-				'description': task.description or task.subject,
-				'notify': self.notify_users_by_email
+				"assign_to": [user],
+				"doctype": task.doctype,
+				"name": task.name,
+				"description": task.description or task.subject,
+				"notify": self.notify_users_by_email,
 			}
 			assign_to.add(args)
 
 	def on_cancel(self):
 		# delete task project
 		project = self.project
-		for task in frappe.get_all('Task', filters={'project': project}):
-			frappe.delete_doc('Task', task.name, force=1)
-		frappe.delete_doc('Project', project, force=1)
-		self.db_set('project', '')
+		for task in frappe.get_all("Task", filters={"project": project}):
+			frappe.delete_doc("Task", task.name, force=1)
+		frappe.delete_doc("Project", project, force=1)
+		self.db_set("project", "")
 		for activity in self.activities:
-			activity.db_set('task', '')
+			activity.db_set("task", "")
 
-		frappe.msgprint(_('Linked Project {} and Tasks deleted.').format(
-			project), alert=True, indicator='blue')
+		frappe.msgprint(
+			_("Linked Project {} and Tasks deleted.").format(project), alert=True, indicator="blue"
+		)
 
 
 @frappe.whitelist()
 def get_onboarding_details(parent, parenttype):
-	return frappe.get_all('Employee Boarding Activity',
-		fields=['activity_name', 'role', 'user', 'required_for_employee_creation',
-			'description', 'task_weight', 'begin_on', 'duration'],
-		filters={'parent': parent, 'parenttype': parenttype},
-		order_by= 'idx')
+	return frappe.get_all(
+		"Employee Boarding Activity",
+		fields=[
+			"activity_name",
+			"role",
+			"user",
+			"required_for_employee_creation",
+			"description",
+			"task_weight",
+			"begin_on",
+			"duration",
+		],
+		filters={"parent": parent, "parenttype": parenttype},
+		order_by="idx",
+	)
 
 
 def update_employee_boarding_status(project):
-	employee_onboarding = frappe.db.exists('Employee Onboarding', {'project': project.name})
-	employee_separation = frappe.db.exists('Employee Separation', {'project': project.name})
+	employee_onboarding = frappe.db.exists("Employee Onboarding", {"project": project.name})
+	employee_separation = frappe.db.exists("Employee Separation", {"project": project.name})
 
 	if not (employee_onboarding or employee_separation):
 		return
 
-	status = 'Pending'
+	status = "Pending"
 	if flt(project.percent_complete) > 0.0 and flt(project.percent_complete) < 100.0:
-		status = 'In Process'
+		status = "In Process"
 	elif flt(project.percent_complete) == 100.0:
-		status = 'Completed'
+		status = "Completed"
 
 	if employee_onboarding:
-		frappe.db.set_value('Employee Onboarding', employee_onboarding, 'boarding_status', status)
+		frappe.db.set_value("Employee Onboarding", employee_onboarding, "boarding_status", status)
 	elif employee_separation:
-		frappe.db.set_value('Employee Separation', employee_separation, 'boarding_status', status)
+		frappe.db.set_value("Employee Separation", employee_separation, "boarding_status", status)
diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py
index 68ad702..e68ee90 100644
--- a/erpnext/controllers/item_variant.py
+++ b/erpnext/controllers/item_variant.py
@@ -10,24 +10,30 @@
 from frappe.utils import cstr, flt
 
 
-class ItemVariantExistsError(frappe.ValidationError): pass
-class InvalidItemAttributeValueError(frappe.ValidationError): pass
-class ItemTemplateCannotHaveStock(frappe.ValidationError): pass
+class ItemVariantExistsError(frappe.ValidationError):
+	pass
+
+
+class InvalidItemAttributeValueError(frappe.ValidationError):
+	pass
+
+
+class ItemTemplateCannotHaveStock(frappe.ValidationError):
+	pass
+
 
 @frappe.whitelist()
-def get_variant(template, args=None, variant=None, manufacturer=None,
-	manufacturer_part_no=None):
+def get_variant(template, args=None, variant=None, manufacturer=None, manufacturer_part_no=None):
 	"""Validates Attributes and their Values, then looks for an exactly
-		matching Item Variant
+	matching Item Variant
 
-		:param item: Template Item
-		:param args: A dictionary with "Attribute" as key and "Attribute Value" as value
+	:param item: Template Item
+	:param args: A dictionary with "Attribute" as key and "Attribute Value" as value
 	"""
-	item_template = frappe.get_doc('Item', template)
+	item_template = frappe.get_doc("Item", template)
 
-	if item_template.variant_based_on=='Manufacturer' and manufacturer:
-		return make_variant_based_on_manufacturer(item_template, manufacturer,
-			manufacturer_part_no)
+	if item_template.variant_based_on == "Manufacturer" and manufacturer:
+		return make_variant_based_on_manufacturer(item_template, manufacturer, manufacturer_part_no)
 	else:
 		if isinstance(args, str):
 			args = json.loads(args)
@@ -36,28 +42,30 @@
 			frappe.throw(_("Please specify at least one attribute in the Attributes table"))
 		return find_variant(template, args, variant)
 
+
 def make_variant_based_on_manufacturer(template, manufacturer, manufacturer_part_no):
-	'''Make and return a new variant based on manufacturer and
-		manufacturer part no'''
+	"""Make and return a new variant based on manufacturer and
+	manufacturer part no"""
 	from frappe.model.naming import append_number_if_name_exists
 
-	variant = frappe.new_doc('Item')
+	variant = frappe.new_doc("Item")
 
 	copy_attributes_to_variant(template, variant)
 
 	variant.manufacturer = manufacturer
 	variant.manufacturer_part_no = manufacturer_part_no
 
-	variant.item_code = append_number_if_name_exists('Item', template.name)
+	variant.item_code = append_number_if_name_exists("Item", template.name)
 
 	return variant
 
+
 def validate_item_variant_attributes(item, args=None):
 	if isinstance(item, str):
-		item = frappe.get_doc('Item', item)
+		item = frappe.get_doc("Item", item)
 
 	if not args:
-		args = {d.attribute.lower():d.attribute_value for d in item.attributes}
+		args = {d.attribute.lower(): d.attribute_value for d in item.attributes}
 
 	attribute_values, numeric_values = get_attribute_values(item)
 
@@ -73,6 +81,7 @@
 			attributes_list = attribute_values.get(attribute.lower(), [])
 			validate_item_attribute_value(attributes_list, attribute, value, item.name, from_variant=True)
 
+
 def validate_is_incremental(numeric_attribute, attribute, value, item):
 	from_range = numeric_attribute.from_range
 	to_range = numeric_attribute.to_range
@@ -84,30 +93,48 @@
 
 	is_in_range = from_range <= flt(value) <= to_range
 	precision = max(len(cstr(v).split(".")[-1].rstrip("0")) for v in (value, increment))
-	#avoid precision error by rounding the remainder
+	# avoid precision error by rounding the remainder
 	remainder = flt((flt(value) - from_range) % increment, precision)
 
-	is_incremental = remainder==0 or remainder==increment
+	is_incremental = remainder == 0 or remainder == increment
 
 	if not (is_in_range and is_incremental):
-		frappe.throw(_("Value for Attribute {0} must be within the range of {1} to {2} in the increments of {3} for Item {4}")\
-			.format(attribute, from_range, to_range, increment, item),
-			InvalidItemAttributeValueError, title=_('Invalid Attribute'))
+		frappe.throw(
+			_(
+				"Value for Attribute {0} must be within the range of {1} to {2} in the increments of {3} for Item {4}"
+			).format(attribute, from_range, to_range, increment, item),
+			InvalidItemAttributeValueError,
+			title=_("Invalid Attribute"),
+		)
 
-def validate_item_attribute_value(attributes_list, attribute, attribute_value, item, from_variant=True):
-	allow_rename_attribute_value = frappe.db.get_single_value('Item Variant Settings', 'allow_rename_attribute_value')
+
+def validate_item_attribute_value(
+	attributes_list, attribute, attribute_value, item, from_variant=True
+):
+	allow_rename_attribute_value = frappe.db.get_single_value(
+		"Item Variant Settings", "allow_rename_attribute_value"
+	)
 	if allow_rename_attribute_value:
 		pass
 	elif attribute_value not in attributes_list:
 		if from_variant:
-			frappe.throw(_("{0} is not a valid Value for Attribute {1} of Item {2}.").format(
-				frappe.bold(attribute_value), frappe.bold(attribute), frappe.bold(item)), InvalidItemAttributeValueError, title=_("Invalid Value"))
+			frappe.throw(
+				_("{0} is not a valid Value for Attribute {1} of Item {2}.").format(
+					frappe.bold(attribute_value), frappe.bold(attribute), frappe.bold(item)
+				),
+				InvalidItemAttributeValueError,
+				title=_("Invalid Value"),
+			)
 		else:
 			msg = _("The value {0} is already assigned to an existing Item {1}.").format(
-				frappe.bold(attribute_value), frappe.bold(item))
-			msg += "<br>" + _("To still proceed with editing this Attribute Value, enable {0} in Item Variant Settings.").format(frappe.bold("Allow Rename Attribute Value"))
+				frappe.bold(attribute_value), frappe.bold(item)
+			)
+			msg += "<br>" + _(
+				"To still proceed with editing this Attribute Value, enable {0} in Item Variant Settings."
+			).format(frappe.bold("Allow Rename Attribute Value"))
 
-			frappe.throw(msg, InvalidItemAttributeValueError, title=_('Edit Not Allowed'))
+			frappe.throw(msg, InvalidItemAttributeValueError, title=_("Edit Not Allowed"))
+
 
 def get_attribute_values(item):
 	if not frappe.flags.attribute_values:
@@ -116,9 +143,11 @@
 		for t in frappe.get_all("Item Attribute Value", fields=["parent", "attribute_value"]):
 			attribute_values.setdefault(t.parent.lower(), []).append(t.attribute_value)
 
-		for t in frappe.get_all('Item Variant Attribute',
+		for t in frappe.get_all(
+			"Item Variant Attribute",
 			fields=["attribute", "from_range", "to_range", "increment"],
-			filters={'numeric_values': 1, 'parent': item.variant_of}):
+			filters={"numeric_values": 1, "parent": item.variant_of},
+		):
 			numeric_values[t.attribute.lower()] = t
 
 		frappe.flags.attribute_values = attribute_values
@@ -126,14 +155,22 @@
 
 	return frappe.flags.attribute_values, frappe.flags.numeric_values
 
+
 def find_variant(template, args, variant_item_code=None):
-	conditions = ["""(iv_attribute.attribute={0} and iv_attribute.attribute_value={1})"""\
-		.format(frappe.db.escape(key), frappe.db.escape(cstr(value))) for key, value in args.items()]
+	conditions = [
+		"""(iv_attribute.attribute={0} and iv_attribute.attribute_value={1})""".format(
+			frappe.db.escape(key), frappe.db.escape(cstr(value))
+		)
+		for key, value in args.items()
+	]
 
 	conditions = " or ".join(conditions)
 
 	from erpnext.e_commerce.variant_selector.utils import get_item_codes_by_attributes
-	possible_variants = [i for i in get_item_codes_by_attributes(args, template) if i != variant_item_code]
+
+	possible_variants = [
+		i for i in get_item_codes_by_attributes(args, template) if i != variant_item_code
+	]
 
 	for variant in possible_variants:
 		variant = frappe.get_doc("Item", variant)
@@ -145,7 +182,7 @@
 
 			for attribute, value in args.items():
 				for row in variant.attributes:
-					if row.attribute==attribute and row.attribute_value== cstr(value):
+					if row.attribute == attribute and row.attribute_value == cstr(value):
 						# this row matches
 						match_count += 1
 						break
@@ -153,6 +190,7 @@
 			if match_count == len(args.keys()):
 				return variant.name
 
+
 @frappe.whitelist()
 def create_variant(item, args):
 	if isinstance(args, str):
@@ -160,14 +198,11 @@
 
 	template = frappe.get_doc("Item", item)
 	variant = frappe.new_doc("Item")
-	variant.variant_based_on = 'Item Attribute'
+	variant.variant_based_on = "Item Attribute"
 	variant_attributes = []
 
 	for d in template.attributes:
-		variant_attributes.append({
-			"attribute": d.attribute,
-			"attribute_value": args.get(d.attribute)
-		})
+		variant_attributes.append({"attribute": d.attribute, "attribute_value": args.get(d.attribute)})
 
 	variant.set("attributes", variant_attributes)
 	copy_attributes_to_variant(template, variant)
@@ -175,6 +210,7 @@
 
 	return variant
 
+
 @frappe.whitelist()
 def enqueue_multiple_variant_creation(item, args):
 	# There can be innumerable attribute combinations, enqueue
@@ -189,9 +225,14 @@
 	if total_variants < 10:
 		return create_multiple_variants(item, args)
 	else:
-		frappe.enqueue("erpnext.controllers.item_variant.create_multiple_variants",
-			item=item, args=args, now=frappe.flags.in_test);
-		return 'queued'
+		frappe.enqueue(
+			"erpnext.controllers.item_variant.create_multiple_variants",
+			item=item,
+			args=args,
+			now=frappe.flags.in_test,
+		)
+		return "queued"
+
 
 def create_multiple_variants(item, args):
 	count = 0
@@ -204,26 +245,27 @@
 		if not get_variant(item, args=attribute_values):
 			variant = create_variant(item, attribute_values)
 			variant.save()
-			count +=1
+			count += 1
 
 	return count
 
+
 def generate_keyed_value_combinations(args):
 	"""
 	From this:
 
-		args = {"attr1": ["a", "b", "c"], "attr2": ["1", "2"], "attr3": ["A"]}
+	        args = {"attr1": ["a", "b", "c"], "attr2": ["1", "2"], "attr3": ["A"]}
 
 	To this:
 
-		[
-			{u'attr1': u'a', u'attr2': u'1', u'attr3': u'A'},
-			{u'attr1': u'b', u'attr2': u'1', u'attr3': u'A'},
-			{u'attr1': u'c', u'attr2': u'1', u'attr3': u'A'},
-			{u'attr1': u'a', u'attr2': u'2', u'attr3': u'A'},
-			{u'attr1': u'b', u'attr2': u'2', u'attr3': u'A'},
-			{u'attr1': u'c', u'attr2': u'2', u'attr3': u'A'}
-		]
+	        [
+	                {u'attr1': u'a', u'attr2': u'1', u'attr3': u'A'},
+	                {u'attr1': u'b', u'attr2': u'1', u'attr3': u'A'},
+	                {u'attr1': u'c', u'attr2': u'1', u'attr3': u'A'},
+	                {u'attr1': u'a', u'attr2': u'2', u'attr3': u'A'},
+	                {u'attr1': u'b', u'attr2': u'2', u'attr3': u'A'},
+	                {u'attr1': u'c', u'attr2': u'2', u'attr3': u'A'}
+	        ]
 
 	"""
 	# Return empty list if empty
@@ -259,17 +301,25 @@
 
 	return results
 
+
 def copy_attributes_to_variant(item, variant):
 	# copy non no-copy fields
 
-	exclude_fields = ["naming_series", "item_code", "item_name", "published_in_website",
-		"opening_stock", "variant_of", "valuation_rate"]
+	exclude_fields = [
+		"naming_series",
+		"item_code",
+		"item_name",
+		"published_in_website",
+		"opening_stock",
+		"variant_of",
+		"valuation_rate",
+	]
 
-	if item.variant_based_on=='Manufacturer':
+	if item.variant_based_on == "Manufacturer":
 		# don't copy manufacturer values if based on part no
-		exclude_fields += ['manufacturer', 'manufacturer_part_no']
+		exclude_fields += ["manufacturer", "manufacturer_part_no"]
 
-	allow_fields = [d.field_name for d in frappe.get_all("Variant Field", fields = ['field_name'])]
+	allow_fields = [d.field_name for d in frappe.get_all("Variant Field", fields=["field_name"])]
 	if "variant_based_on" not in allow_fields:
 		allow_fields.append("variant_based_on")
 	for field in item.meta.fields:
@@ -288,11 +338,11 @@
 
 	variant.variant_of = item.name
 
-	if 'description' not in allow_fields:
+	if "description" not in allow_fields:
 		if not variant.description:
-				variant.description = ""
+			variant.description = ""
 	else:
-		if item.variant_based_on=='Item Attribute':
+		if item.variant_based_on == "Item Attribute":
 			if variant.attributes:
 				attributes_description = item.description + " "
 				for d in variant.attributes:
@@ -301,6 +351,7 @@
 				if attributes_description not in variant.description:
 					variant.description = attributes_description
 
+
 def make_variant_item_code(template_item_code, template_item_name, variant):
 	"""Uses template's item code and abbreviations to make variant's item code"""
 	if variant.item_code:
@@ -308,13 +359,14 @@
 
 	abbreviations = []
 	for attr in variant.attributes:
-		item_attribute = frappe.db.sql("""select i.numeric_values, v.abbr
+		item_attribute = frappe.db.sql(
+			"""select i.numeric_values, v.abbr
 			from `tabItem Attribute` i left join `tabItem Attribute Value` v
 				on (i.name=v.parent)
-			where i.name=%(attribute)s and (v.attribute_value=%(attribute_value)s or i.numeric_values = 1)""", {
-				"attribute": attr.attribute,
-				"attribute_value": attr.attribute_value
-			}, as_dict=True)
+			where i.name=%(attribute)s and (v.attribute_value=%(attribute_value)s or i.numeric_values = 1)""",
+			{"attribute": attr.attribute, "attribute_value": attr.attribute_value},
+			as_dict=True,
+		)
 
 		if not item_attribute:
 			continue
@@ -322,13 +374,16 @@
 			# 	frappe.bold(attr.attribute_value)), title=_('Invalid Attribute'),
 			# 	exc=InvalidItemAttributeValueError)
 
-		abbr_or_value = cstr(attr.attribute_value) if item_attribute[0].numeric_values else item_attribute[0].abbr
+		abbr_or_value = (
+			cstr(attr.attribute_value) if item_attribute[0].numeric_values else item_attribute[0].abbr
+		)
 		abbreviations.append(abbr_or_value)
 
 	if abbreviations:
 		variant.item_code = "{0}-{1}".format(template_item_code, "-".join(abbreviations))
 		variant.item_name = "{0}-{1}".format(template_item_name, "-".join(abbreviations))
 
+
 @frappe.whitelist()
 def create_variant_doc_for_quick_entry(template, args):
 	variant_based_on = frappe.db.get_value("Item", template, "variant_based_on")
diff --git a/erpnext/controllers/print_settings.py b/erpnext/controllers/print_settings.py
index cf9de52..d2c8096 100644
--- a/erpnext/controllers/print_settings.py
+++ b/erpnext/controllers/print_settings.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 def set_print_templates_for_item_table(doc, settings):
 	doc.print_templates = {
 		"items": "templates/print_formats/includes/items.html",
@@ -20,16 +19,21 @@
 	doc.flags.compact_item_fields = ["description", "qty", "rate", "amount"]
 
 	if settings.compact_item_print:
-		doc.child_print_templates["items"]["description"] =\
-			"templates/print_formats/includes/item_table_description.html"
+		doc.child_print_templates["items"][
+			"description"
+		] = "templates/print_formats/includes/item_table_description.html"
 		doc.flags.format_columns = format_columns
 
+
 def set_print_templates_for_taxes(doc, settings):
 	doc.flags.show_inclusive_tax_in_print = doc.is_inclusive_tax()
-	doc.print_templates.update({
-		"total": "templates/print_formats/includes/total.html",
-		"taxes": "templates/print_formats/includes/taxes.html"
-	})
+	doc.print_templates.update(
+		{
+			"total": "templates/print_formats/includes/total.html",
+			"taxes": "templates/print_formats/includes/taxes.html",
+		}
+	)
+
 
 def format_columns(display_columns, compact_fields):
 	compact_fields = compact_fields + ["image", "item_code", "item_name"]
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index d870823..abe9977 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -21,7 +21,8 @@
 	conditions = []
 	fields = get_fields("Employee", ["name", "employee_name"])
 
-	return frappe.db.sql("""select {fields} from `tabEmployee`
+	return frappe.db.sql(
+		"""select {fields} from `tabEmployee`
 		where status in ('Active', 'Suspended')
 			and docstatus < 2
 			and ({key} like %(txt)s
@@ -32,17 +33,16 @@
 			if(locate(%(_txt)s, employee_name), locate(%(_txt)s, employee_name), 99999),
 			idx desc,
 			name, employee_name
-		limit %(start)s, %(page_len)s""".format(**{
-			'fields': ", ".join(fields),
-			'key': searchfield,
-			'fcond': get_filters_cond(doctype, filters, conditions),
-			'mcond': get_match_cond(doctype)
-		}), {
-			'txt': "%%%s%%" % txt,
-			'_txt': txt.replace("%", ""),
-			'start': start,
-			'page_len': page_len
-		})
+		limit %(start)s, %(page_len)s""".format(
+			**{
+				"fields": ", ".join(fields),
+				"key": searchfield,
+				"fcond": get_filters_cond(doctype, filters, conditions),
+				"mcond": get_match_cond(doctype),
+			}
+		),
+		{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
+	)
 
 
 # searches for leads which are not converted
@@ -51,7 +51,8 @@
 def lead_query(doctype, txt, searchfield, start, page_len, filters):
 	fields = get_fields("Lead", ["name", "lead_name", "company_name"])
 
-	return frappe.db.sql("""select {fields} from `tabLead`
+	return frappe.db.sql(
+		"""select {fields} from `tabLead`
 		where docstatus < 2
 			and ifnull(status, '') != 'Converted'
 			and ({key} like %(txt)s
@@ -64,19 +65,15 @@
 			if(locate(%(_txt)s, company_name), locate(%(_txt)s, company_name), 99999),
 			idx desc,
 			name, lead_name
-		limit %(start)s, %(page_len)s""".format(**{
-			'fields': ", ".join(fields),
-			'key': searchfield,
-			'mcond':get_match_cond(doctype)
-		}), {
-			'txt': "%%%s%%" % txt,
-			'_txt': txt.replace("%", ""),
-			'start': start,
-			'page_len': page_len
-		})
+		limit %(start)s, %(page_len)s""".format(
+			**{"fields": ", ".join(fields), "key": searchfield, "mcond": get_match_cond(doctype)}
+		),
+		{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
+	)
+
+	# searches for customer
 
 
- # searches for customer
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def customer_query(doctype, txt, searchfield, start, page_len, filters):
@@ -93,7 +90,8 @@
 	searchfields = frappe.get_meta("Customer").get_search_fields()
 	searchfields = " or ".join(field + " like %(txt)s" for field in searchfields)
 
-	return frappe.db.sql("""select {fields} from `tabCustomer`
+	return frappe.db.sql(
+		"""select {fields} from `tabCustomer`
 		where docstatus < 2
 			and ({scond}) and disabled=0
 			{fcond} {mcond}
@@ -102,17 +100,16 @@
 			if(locate(%(_txt)s, customer_name), locate(%(_txt)s, customer_name), 99999),
 			idx desc,
 			name, customer_name
-		limit %(start)s, %(page_len)s""".format(**{
-			"fields": ", ".join(fields),
-			"scond": searchfields,
-			"mcond": get_match_cond(doctype),
-			"fcond": get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
-		}), {
-			'txt': "%%%s%%" % txt,
-			'_txt': txt.replace("%", ""),
-			'start': start,
-			'page_len': page_len
-		})
+		limit %(start)s, %(page_len)s""".format(
+			**{
+				"fields": ", ".join(fields),
+				"scond": searchfields,
+				"mcond": get_match_cond(doctype),
+				"fcond": get_filters_cond(doctype, filters, conditions).replace("%", "%%"),
+			}
+		),
+		{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
+	)
 
 
 # searches for supplier
@@ -128,7 +125,8 @@
 
 	fields = get_fields("Supplier", fields)
 
-	return frappe.db.sql("""select {field} from `tabSupplier`
+	return frappe.db.sql(
+		"""select {field} from `tabSupplier`
 		where docstatus < 2
 			and ({key} like %(txt)s
 			or supplier_name like %(txt)s) and disabled=0
@@ -139,29 +137,25 @@
 			if(locate(%(_txt)s, supplier_name), locate(%(_txt)s, supplier_name), 99999),
 			idx desc,
 			name, supplier_name
-		limit %(start)s, %(page_len)s """.format(**{
-			'field': ', '.join(fields),
-			'key': searchfield,
-			'mcond':get_match_cond(doctype)
-		}), {
-			'txt': "%%%s%%" % txt,
-			'_txt': txt.replace("%", ""),
-			'start': start,
-			'page_len': page_len
-		})
+		limit %(start)s, %(page_len)s """.format(
+			**{"field": ", ".join(fields), "key": searchfield, "mcond": get_match_cond(doctype)}
+		),
+		{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
+	)
 
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def tax_account_query(doctype, txt, searchfield, start, page_len, filters):
-	company_currency = erpnext.get_company_currency(filters.get('company'))
+	company_currency = erpnext.get_company_currency(filters.get("company"))
 
 	def get_accounts(with_account_type_filter):
-		account_type_condition = ''
+		account_type_condition = ""
 		if with_account_type_filter:
 			account_type_condition = "AND account_type in %(account_types)s"
 
-		accounts = frappe.db.sql("""
+		accounts = frappe.db.sql(
+			"""
 			SELECT name, parent_account
 			FROM `tabAccount`
 			WHERE `tabAccount`.docstatus!=2
@@ -176,7 +170,7 @@
 		""".format(
 				account_type_condition=account_type_condition,
 				searchfield=searchfield,
-				mcond=get_match_cond(doctype)
+				mcond=get_match_cond(doctype),
 			),
 			dict(
 				account_types=filters.get("account_type"),
@@ -184,8 +178,8 @@
 				currency=company_currency,
 				txt="%{}%".format(txt),
 				offset=start,
-				limit=page_len
-			)
+				limit=page_len,
+			),
 		)
 
 		return accounts
@@ -206,7 +200,7 @@
 	if isinstance(filters, str):
 		filters = json.loads(filters)
 
-	#Get searchfields from meta and use in Item Link field query
+	# Get searchfields from meta and use in Item Link field query
 	meta = frappe.get_meta("Item", cached=True)
 	searchfields = meta.get_search_fields()
 
@@ -216,49 +210,56 @@
 		if ignored_field in searchfields:
 			searchfields.remove(ignored_field)
 
-	columns = ''
-	extra_searchfields = [field for field in searchfields
-		if not field in ["name", "item_group", "description", "item_name"]]
+	columns = ""
+	extra_searchfields = [
+		field
+		for field in searchfields
+		if not field in ["name", "item_group", "description", "item_name"]
+	]
 
 	if extra_searchfields:
 		columns = ", " + ", ".join(extra_searchfields)
 
-	searchfields = searchfields + [field for field in[searchfield or "name", "item_code", "item_group", "item_name"]
-		if not field in searchfields]
+	searchfields = searchfields + [
+		field
+		for field in [searchfield or "name", "item_code", "item_group", "item_name"]
+		if not field in searchfields
+	]
 	searchfields = " or ".join([field + " like %(txt)s" for field in searchfields])
 
 	if filters and isinstance(filters, dict):
-		if filters.get('customer') or filters.get('supplier'):
-			party = filters.get('customer') or filters.get('supplier')
-			item_rules_list = frappe.get_all('Party Specific Item',
-				filters = {'party': party}, fields = ['restrict_based_on', 'based_on_value'])
+		if filters.get("customer") or filters.get("supplier"):
+			party = filters.get("customer") or filters.get("supplier")
+			item_rules_list = frappe.get_all(
+				"Party Specific Item", filters={"party": party}, fields=["restrict_based_on", "based_on_value"]
+			)
 
 			filters_dict = {}
 			for rule in item_rules_list:
-				if rule['restrict_based_on'] == 'Item':
-					rule['restrict_based_on'] = 'name'
+				if rule["restrict_based_on"] == "Item":
+					rule["restrict_based_on"] = "name"
 				filters_dict[rule.restrict_based_on] = []
 
 			for rule in item_rules_list:
 				filters_dict[rule.restrict_based_on].append(rule.based_on_value)
 
 			for filter in filters_dict:
-				filters[scrub(filter)] = ['in', filters_dict[filter]]
+				filters[scrub(filter)] = ["in", filters_dict[filter]]
 
-			if filters.get('customer'):
-				del filters['customer']
+			if filters.get("customer"):
+				del filters["customer"]
 			else:
-				del filters['supplier']
+				del filters["supplier"]
 		else:
-			filters.pop('customer', None)
-			filters.pop('supplier', None)
+			filters.pop("customer", None)
+			filters.pop("supplier", None)
 
-
-	description_cond = ''
-	if frappe.db.count('Item', cache=True) < 50000:
+	description_cond = ""
+	if frappe.db.count("Item", cache=True) < 50000:
 		# scan description only if items are less than 50000
-		description_cond = 'or tabItem.description LIKE %(txt)s'
-	return frappe.db.sql("""select
+		description_cond = "or tabItem.description LIKE %(txt)s"
+	return frappe.db.sql(
+		"""select
 			tabItem.name, tabItem.item_name, tabItem.item_group,
 		if(length(tabItem.description) > 40, \
 			concat(substr(tabItem.description, 1, 40), "..."), description) as description
@@ -279,16 +280,19 @@
 		limit %(start)s, %(page_len)s """.format(
 			columns=columns,
 			scond=searchfields,
-			fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
-			mcond=get_match_cond(doctype).replace('%', '%%'),
-			description_cond = description_cond),
-			{
-				"today": nowdate(),
-				"txt": "%%%s%%" % txt,
-				"_txt": txt.replace("%", ""),
-				"start": start,
-				"page_len": page_len
-			}, as_dict=as_dict)
+			fcond=get_filters_cond(doctype, filters, conditions).replace("%", "%%"),
+			mcond=get_match_cond(doctype).replace("%", "%%"),
+			description_cond=description_cond,
+		),
+		{
+			"today": nowdate(),
+			"txt": "%%%s%%" % txt,
+			"_txt": txt.replace("%", ""),
+			"start": start,
+			"page_len": page_len,
+		},
+		as_dict=as_dict,
+	)
 
 
 @frappe.whitelist()
@@ -297,7 +301,8 @@
 	conditions = []
 	fields = get_fields("BOM", ["name", "item"])
 
-	return frappe.db.sql("""select {fields}
+	return frappe.db.sql(
+		"""select {fields}
 		from tabBOM
 		where tabBOM.docstatus=1
 			and tabBOM.is_active=1
@@ -308,30 +313,35 @@
 			idx desc, name
 		limit %(start)s, %(page_len)s """.format(
 			fields=", ".join(fields),
-			fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
-			mcond=get_match_cond(doctype).replace('%', '%%'),
-			key=searchfield),
+			fcond=get_filters_cond(doctype, filters, conditions).replace("%", "%%"),
+			mcond=get_match_cond(doctype).replace("%", "%%"),
+			key=searchfield,
+		),
 		{
-			'txt': '%' + txt + '%',
-			'_txt': txt.replace("%", ""),
-			'start': start or 0,
-			'page_len': page_len or 20
-		})
+			"txt": "%" + txt + "%",
+			"_txt": txt.replace("%", ""),
+			"start": start or 0,
+			"page_len": page_len or 20,
+		},
+	)
 
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_project_name(doctype, txt, searchfield, start, page_len, filters):
-	cond = ''
-	if filters and filters.get('customer'):
+	cond = ""
+	if filters and filters.get("customer"):
 		cond = """(`tabProject`.customer = %s or
-			ifnull(`tabProject`.customer,"")="") and""" %(frappe.db.escape(filters.get("customer")))
+			ifnull(`tabProject`.customer,"")="") and""" % (
+			frappe.db.escape(filters.get("customer"))
+		)
 
 	fields = get_fields("Project", ["name", "project_name"])
 	searchfields = frappe.get_meta("Project").get_search_fields()
 	searchfields = " or ".join([field + " like %(txt)s" for field in searchfields])
 
-	return frappe.db.sql("""select {fields} from `tabProject`
+	return frappe.db.sql(
+		"""select {fields} from `tabProject`
 		where
 			`tabProject`.status not in ("Completed", "Cancelled")
 			and {cond} {scond} {match_cond}
@@ -340,15 +350,15 @@
 			idx desc,
 			`tabProject`.name asc
 		limit {start}, {page_len}""".format(
-			fields=", ".join(['`tabProject`.{0}'.format(f) for f in fields]),
+			fields=", ".join(["`tabProject`.{0}".format(f) for f in fields]),
 			cond=cond,
 			scond=searchfields,
 			match_cond=get_match_cond(doctype),
 			start=start,
-			page_len=page_len), {
-				"txt": "%{0}%".format(txt),
-				"_txt": txt.replace('%', '')
-			})
+			page_len=page_len,
+		),
+		{"txt": "%{0}%".format(txt), "_txt": txt.replace("%", "")},
+	)
 
 
 @frappe.whitelist()
@@ -356,7 +366,8 @@
 def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters, as_dict):
 	fields = get_fields("Delivery Note", ["name", "customer", "posting_date"])
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select %(fields)s
 		from `tabDelivery Note`
 		where `tabDelivery Note`.`%(key)s` like %(txt)s and
@@ -371,15 +382,19 @@
 				)
 			)
 			%(mcond)s order by `tabDelivery Note`.`%(key)s` asc limit %(start)s, %(page_len)s
-	""" % {
-		"fields": ", ".join(["`tabDelivery Note`.{0}".format(f) for f in fields]),
-		"key": searchfield,
-		"fcond": get_filters_cond(doctype, filters, []),
-		"mcond": get_match_cond(doctype),
-		"start": start,
-		"page_len": page_len,
-		"txt": "%(txt)s"
-	}, {"txt": ("%%%s%%" % txt)}, as_dict=as_dict)
+	"""
+		% {
+			"fields": ", ".join(["`tabDelivery Note`.{0}".format(f) for f in fields]),
+			"key": searchfield,
+			"fcond": get_filters_cond(doctype, filters, []),
+			"mcond": get_match_cond(doctype),
+			"start": start,
+			"page_len": page_len,
+			"txt": "%(txt)s",
+		},
+		{"txt": ("%%%s%%" % txt)},
+		as_dict=as_dict,
+	)
 
 
 @frappe.whitelist()
@@ -391,12 +406,12 @@
 
 	batch_nos = None
 	args = {
-		'item_code': filters.get("item_code"),
-		'warehouse': filters.get("warehouse"),
-		'posting_date': filters.get('posting_date'),
-		'txt': "%{0}%".format(txt),
+		"item_code": filters.get("item_code"),
+		"warehouse": filters.get("warehouse"),
+		"posting_date": filters.get("posting_date"),
+		"txt": "%{0}%".format(txt),
 		"start": start,
-		"page_len": page_len
+		"page_len": page_len,
 	}
 
 	having_clause = "having sum(sle.actual_qty) > 0"
@@ -406,20 +421,21 @@
 	meta = frappe.get_meta("Batch", cached=True)
 	searchfields = meta.get_search_fields()
 
-	search_columns = ''
-	search_cond = ''
+	search_columns = ""
+	search_cond = ""
 
 	if searchfields:
 		search_columns = ", " + ", ".join(searchfields)
 		search_cond = " or " + " or ".join([field + " like %(txt)s" for field in searchfields])
 
-	if args.get('warehouse'):
-		searchfields = ['batch.' + field for field in searchfields]
+	if args.get("warehouse"):
+		searchfields = ["batch." + field for field in searchfields]
 		if searchfields:
 			search_columns = ", " + ", ".join(searchfields)
 			search_cond = " or " + " or ".join([field + " like %(txt)s" for field in searchfields])
 
-		batch_nos = frappe.db.sql("""select sle.batch_no, round(sum(sle.actual_qty),2), sle.stock_uom,
+		batch_nos = frappe.db.sql(
+			"""select sle.batch_no, round(sum(sle.actual_qty),2), sle.stock_uom,
 				concat('MFG-',batch.manufacturing_date), concat('EXP-',batch.expiry_date)
 				{search_columns}
 			from `tabStock Ledger Entry` sle
@@ -439,16 +455,19 @@
 			group by batch_no {having_clause}
 			order by batch.expiry_date, sle.batch_no desc
 			limit %(start)s, %(page_len)s""".format(
-				search_columns = search_columns,
+				search_columns=search_columns,
 				cond=cond,
 				match_conditions=get_match_cond(doctype),
-				having_clause = having_clause,
-				search_cond = search_cond
-			), args)
+				having_clause=having_clause,
+				search_cond=search_cond,
+			),
+			args,
+		)
 
 		return batch_nos
 	else:
-		return frappe.db.sql("""select name, concat('MFG-', manufacturing_date), concat('EXP-',expiry_date)
+		return frappe.db.sql(
+			"""select name, concat('MFG-', manufacturing_date), concat('EXP-',expiry_date)
 			{search_columns}
 			from `tabBatch` batch
 			where batch.disabled = 0
@@ -462,8 +481,14 @@
 			{match_conditions}
 
 			order by expiry_date, name desc
-			limit %(start)s, %(page_len)s""".format(cond, search_columns = search_columns,
-			search_cond = search_cond, match_conditions=get_match_cond(doctype)), args)
+			limit %(start)s, %(page_len)s""".format(
+				cond,
+				search_columns=search_columns,
+				search_cond=search_cond,
+				match_conditions=get_match_cond(doctype),
+			),
+			args,
+		)
 
 
 @frappe.whitelist()
@@ -486,25 +511,33 @@
 	if searchfield and txt:
 		filter_list.append([doctype, searchfield, "like", "%%%s%%" % txt])
 
-	return frappe.desk.reportview.execute("Account", filters = filter_list,
-		fields = ["name", "parent_account"],
-		limit_start=start, limit_page_length=page_len, as_list=True)
+	return frappe.desk.reportview.execute(
+		"Account",
+		filters=filter_list,
+		fields=["name", "parent_account"],
+		limit_start=start,
+		limit_page_length=page_len,
+		as_list=True,
+	)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_blanket_orders(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql("""select distinct bo.name, bo.blanket_order_type, bo.to_date
+	return frappe.db.sql(
+		"""select distinct bo.name, bo.blanket_order_type, bo.to_date
 		from `tabBlanket Order` bo, `tabBlanket Order Item` boi
 		where
 			boi.parent = bo.name
 			and boi.item_code = {item_code}
 			and bo.blanket_order_type = '{blanket_order_type}'
 			and bo.company = {company}
-			and bo.docstatus = 1"""
-		.format(item_code = frappe.db.escape(filters.get("item")),
-			blanket_order_type = filters.get("blanket_order_type"),
-			company = frappe.db.escape(filters.get("company"))
-		))
+			and bo.docstatus = 1""".format(
+			item_code=frappe.db.escape(filters.get("item")),
+			blanket_order_type=filters.get("blanket_order_type"),
+			company=frappe.db.escape(filters.get("company")),
+		)
+	)
 
 
 @frappe.whitelist()
@@ -515,23 +548,26 @@
 	# income account can be any Credit account,
 	# but can also be a Asset account with account_type='Income Account' in special circumstances.
 	# Hence the first condition is an "OR"
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	condition = ""
 	if filters.get("company"):
 		condition += "and tabAccount.company = %(company)s"
 
-	return frappe.db.sql("""select tabAccount.name from `tabAccount`
+	return frappe.db.sql(
+		"""select tabAccount.name from `tabAccount`
 			where (tabAccount.report_type = "Profit and Loss"
 					or tabAccount.account_type in ("Income Account", "Temporary"))
 				and tabAccount.is_group=0
 				and tabAccount.`{key}` LIKE %(txt)s
 				{condition} {match_condition}
-			order by idx desc, name"""
-			.format(condition=condition, match_condition=get_match_cond(doctype), key=searchfield), {
-				'txt': '%' + txt + '%',
-				'company': filters.get("company", "")
-			})
+			order by idx desc, name""".format(
+			condition=condition, match_condition=get_match_cond(doctype), key=searchfield
+		),
+		{"txt": "%" + txt + "%", "company": filters.get("company", "")},
+	)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
@@ -539,68 +575,73 @@
 	from erpnext.accounts.doctype.accounting_dimension_filter.accounting_dimension_filter import (
 		get_dimension_filter_map,
 	)
+
 	dimension_filters = get_dimension_filter_map()
-	dimension_filters = dimension_filters.get((filters.get('dimension'),filters.get('account')))
+	dimension_filters = dimension_filters.get((filters.get("dimension"), filters.get("account")))
 	query_filters = []
 	or_filters = []
-	fields = ['name']
+	fields = ["name"]
 
 	searchfields = frappe.get_meta(doctype).get_search_fields()
 
 	meta = frappe.get_meta(doctype)
 	if meta.is_tree:
-		query_filters.append(['is_group', '=', 0])
+		query_filters.append(["is_group", "=", 0])
 
-	if meta.has_field('disabled'):
-		query_filters.append(['disabled', '!=', 1])
+	if meta.has_field("disabled"):
+		query_filters.append(["disabled", "!=", 1])
 
-	if meta.has_field('company'):
-		query_filters.append(['company', '=', filters.get('company')])
+	if meta.has_field("company"):
+		query_filters.append(["company", "=", filters.get("company")])
 
 	for field in searchfields:
-		or_filters.append([field, 'LIKE', "%%%s%%" % txt])
+		or_filters.append([field, "LIKE", "%%%s%%" % txt])
 		fields.append(field)
 
 	if dimension_filters:
-		if dimension_filters['allow_or_restrict'] == 'Allow':
-			query_selector = 'in'
+		if dimension_filters["allow_or_restrict"] == "Allow":
+			query_selector = "in"
 		else:
-			query_selector = 'not in'
+			query_selector = "not in"
 
-		if len(dimension_filters['allowed_dimensions']) == 1:
-			dimensions = tuple(dimension_filters['allowed_dimensions'] * 2)
+		if len(dimension_filters["allowed_dimensions"]) == 1:
+			dimensions = tuple(dimension_filters["allowed_dimensions"] * 2)
 		else:
-			dimensions = tuple(dimension_filters['allowed_dimensions'])
+			dimensions = tuple(dimension_filters["allowed_dimensions"])
 
-		query_filters.append(['name', query_selector, dimensions])
+		query_filters.append(["name", query_selector, dimensions])
 
-	output = frappe.get_list(doctype, fields=fields, filters=query_filters, or_filters=or_filters, as_list=1)
+	output = frappe.get_list(
+		doctype, fields=fields, filters=query_filters, or_filters=or_filters, as_list=1
+	)
 
 	return [tuple(d) for d in set(output)]
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_expense_account(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
 
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	condition = ""
 	if filters.get("company"):
 		condition += "and tabAccount.company = %(company)s"
 
-	return frappe.db.sql("""select tabAccount.name from `tabAccount`
+	return frappe.db.sql(
+		"""select tabAccount.name from `tabAccount`
 		where (tabAccount.report_type = "Profit and Loss"
 				or tabAccount.account_type in ("Expense Account", "Fixed Asset", "Temporary", "Asset Received But Not Billed", "Capital Work in Progress"))
 			and tabAccount.is_group=0
 			and tabAccount.docstatus!=2
 			and tabAccount.{key} LIKE %(txt)s
-			{condition} {match_condition}"""
-		.format(condition=condition, key=searchfield,
-			match_condition=get_match_cond(doctype)), {
-			'company': filters.get("company", ""),
-			'txt': '%' + txt + '%'
-		})
+			{condition} {match_condition}""".format(
+			condition=condition, key=searchfield, match_condition=get_match_cond(doctype)
+		),
+		{"company": filters.get("company", ""), "txt": "%" + txt + "%"},
+	)
 
 
 @frappe.whitelist()
@@ -621,14 +662,16 @@
 		limit
 			{start}, {page_len}
 		""".format(
-			bin_conditions=get_filters_cond(doctype, filter_dict.get("Bin"),bin_conditions, ignore_permissions=True),
-			key=searchfield,
-			fcond=get_filters_cond(doctype, filter_dict.get("Warehouse"), conditions),
-			mcond=get_match_cond(doctype),
-			start=start,
-			page_len=page_len,
-			txt=frappe.db.escape('%{0}%'.format(txt))
-		)
+		bin_conditions=get_filters_cond(
+			doctype, filter_dict.get("Bin"), bin_conditions, ignore_permissions=True
+		),
+		key=searchfield,
+		fcond=get_filters_cond(doctype, filter_dict.get("Warehouse"), conditions),
+		mcond=get_match_cond(doctype),
+		start=start,
+		page_len=page_len,
+		txt=frappe.db.escape("%{0}%".format(txt)),
+	)
 
 	return frappe.db.sql(query)
 
@@ -647,10 +690,12 @@
 	query = """select batch_id from `tabBatch`
 			where disabled = 0
 			and (expiry_date >= CURDATE() or expiry_date IS NULL)
-			and name like {txt}""".format(txt = frappe.db.escape('%{0}%'.format(txt)))
+			and name like {txt}""".format(
+		txt=frappe.db.escape("%{0}%".format(txt))
+	)
 
-	if filters and filters.get('item'):
-		query += " and item = {item}".format(item = frappe.db.escape(filters.get('item')))
+	if filters and filters.get("item"):
+		query += " and item = {item}".format(item=frappe.db.escape(filters.get("item")))
 
 	return frappe.db.sql(query, filters)
 
@@ -659,8 +704,8 @@
 @frappe.validate_and_sanitize_search_inputs
 def item_manufacturer_query(doctype, txt, searchfield, start, page_len, filters):
 	item_filters = [
-		['manufacturer', 'like', '%' + txt + '%'],
-		['item_code', '=', filters.get("item_code")]
+		["manufacturer", "like", "%" + txt + "%"],
+		["item_code", "=", filters.get("item_code")],
 	]
 
 	item_manufacturers = frappe.get_all(
@@ -669,7 +714,7 @@
 		filters=item_filters,
 		limit_start=start,
 		limit_page_length=page_len,
-		as_list=1
+		as_list=1,
 	)
 	return item_manufacturers
 
@@ -681,10 +726,14 @@
 		select pr.name
 		from `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pritem
 		where pr.docstatus = 1 and pritem.parent = pr.name
-		and pr.name like {txt}""".format(txt = frappe.db.escape('%{0}%'.format(txt)))
+		and pr.name like {txt}""".format(
+		txt=frappe.db.escape("%{0}%".format(txt))
+	)
 
-	if filters and filters.get('item_code'):
-		query += " and pritem.item_code = {item_code}".format(item_code = frappe.db.escape(filters.get('item_code')))
+	if filters and filters.get("item_code"):
+		query += " and pritem.item_code = {item_code}".format(
+			item_code=frappe.db.escape(filters.get("item_code"))
+		)
 
 	return frappe.db.sql(query, filters)
 
@@ -696,10 +745,14 @@
 		select pi.name
 		from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` piitem
 		where pi.docstatus = 1 and piitem.parent = pi.name
-		and pi.name like {txt}""".format(txt = frappe.db.escape('%{0}%'.format(txt)))
+		and pi.name like {txt}""".format(
+		txt=frappe.db.escape("%{0}%".format(txt))
+	)
 
-	if filters and filters.get('item_code'):
-		query += " and piitem.item_code = {item_code}".format(item_code = frappe.db.escape(filters.get('item_code')))
+	if filters and filters.get("item_code"):
+		query += " and piitem.item_code = {item_code}".format(
+			item_code=frappe.db.escape(filters.get("item_code"))
+		)
 
 	return frappe.db.sql(query, filters)
 
@@ -708,27 +761,29 @@
 @frappe.validate_and_sanitize_search_inputs
 def get_tax_template(doctype, txt, searchfield, start, page_len, filters):
 
-	item_doc = frappe.get_cached_doc('Item', filters.get('item_code'))
-	item_group = filters.get('item_group')
-	company = filters.get('company')
+	item_doc = frappe.get_cached_doc("Item", filters.get("item_code"))
+	item_group = filters.get("item_group")
+	company = filters.get("company")
 	taxes = item_doc.taxes or []
 
 	while item_group:
-		item_group_doc = frappe.get_cached_doc('Item Group', item_group)
+		item_group_doc = frappe.get_cached_doc("Item Group", item_group)
 		taxes += item_group_doc.taxes or []
 		item_group = item_group_doc.parent_item_group
 
 	if not taxes:
-		return frappe.get_all('Item Tax Template', filters={'disabled': 0, 'company': company}, as_list=True)
+		return frappe.get_all(
+			"Item Tax Template", filters={"disabled": 0, "company": company}, as_list=True
+		)
 	else:
-		valid_from = filters.get('valid_from')
+		valid_from = filters.get("valid_from")
 		valid_from = valid_from[1] if isinstance(valid_from, list) else valid_from
 
 		args = {
-			'item_code': filters.get('item_code'),
-			'posting_date': valid_from,
-			'tax_category': filters.get('tax_category'),
-			'company': company
+			"item_code": filters.get("item_code"),
+			"posting_date": valid_from,
+			"tax_category": filters.get("tax_category"),
+			"company": company,
 		}
 
 		taxes = _get_item_tax_template(args, taxes, for_validate=True)
diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py
index d6296eb..bdde3a1 100644
--- a/erpnext/controllers/sales_and_purchase_return.py
+++ b/erpnext/controllers/sales_and_purchase_return.py
@@ -11,7 +11,9 @@
 from erpnext.stock.utils import get_incoming_rate
 
 
-class StockOverReturnError(frappe.ValidationError): pass
+class StockOverReturnError(frappe.ValidationError):
+	pass
+
 
 def validate_return(doc):
 	if not doc.meta.get_field("is_return") or not doc.is_return:
@@ -21,32 +23,50 @@
 		validate_return_against(doc)
 		validate_returned_items(doc)
 
+
 def validate_return_against(doc):
 	if not frappe.db.exists(doc.doctype, doc.return_against):
-			frappe.throw(_("Invalid {0}: {1}")
-				.format(doc.meta.get_label("return_against"), doc.return_against))
+		frappe.throw(
+			_("Invalid {0}: {1}").format(doc.meta.get_label("return_against"), doc.return_against)
+		)
 	else:
 		ref_doc = frappe.get_doc(doc.doctype, doc.return_against)
 
 		party_type = "customer" if doc.doctype in ("Sales Invoice", "Delivery Note") else "supplier"
 
-		if ref_doc.company == doc.company and ref_doc.get(party_type) == doc.get(party_type) and ref_doc.docstatus == 1:
+		if (
+			ref_doc.company == doc.company
+			and ref_doc.get(party_type) == doc.get(party_type)
+			and ref_doc.docstatus == 1
+		):
 			# validate posting date time
 			return_posting_datetime = "%s %s" % (doc.posting_date, doc.get("posting_time") or "00:00:00")
-			ref_posting_datetime = "%s %s" % (ref_doc.posting_date, ref_doc.get("posting_time") or "00:00:00")
+			ref_posting_datetime = "%s %s" % (
+				ref_doc.posting_date,
+				ref_doc.get("posting_time") or "00:00:00",
+			)
 
 			if get_datetime(return_posting_datetime) < get_datetime(ref_posting_datetime):
-				frappe.throw(_("Posting timestamp must be after {0}").format(format_datetime(ref_posting_datetime)))
+				frappe.throw(
+					_("Posting timestamp must be after {0}").format(format_datetime(ref_posting_datetime))
+				)
 
 			# validate same exchange rate
 			if doc.conversion_rate != ref_doc.conversion_rate:
-				frappe.throw(_("Exchange Rate must be same as {0} {1} ({2})")
-					.format(doc.doctype, doc.return_against, ref_doc.conversion_rate))
+				frappe.throw(
+					_("Exchange Rate must be same as {0} {1} ({2})").format(
+						doc.doctype, doc.return_against, ref_doc.conversion_rate
+					)
+				)
 
 			# validate update stock
 			if doc.doctype == "Sales Invoice" and doc.update_stock and not ref_doc.update_stock:
-					frappe.throw(_("'Update Stock' can not be checked because items are not delivered via {0}")
-						.format(doc.return_against))
+				frappe.throw(
+					_("'Update Stock' can not be checked because items are not delivered via {0}").format(
+						doc.return_against
+					)
+				)
+
 
 def validate_returned_items(doc):
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
@@ -54,43 +74,61 @@
 	valid_items = frappe._dict()
 
 	select_fields = "item_code, qty, stock_qty, rate, parenttype, conversion_factor"
-	if doc.doctype != 'Purchase Invoice':
+	if doc.doctype != "Purchase Invoice":
 		select_fields += ",serial_no, batch_no"
 
-	if doc.doctype in ['Purchase Invoice', 'Purchase Receipt']:
+	if doc.doctype in ["Purchase Invoice", "Purchase Receipt"]:
 		select_fields += ",rejected_qty, received_qty"
 
-	for d in frappe.db.sql("""select {0} from `tab{1} Item` where parent = %s"""
-		.format(select_fields, doc.doctype), doc.return_against, as_dict=1):
-			valid_items = get_ref_item_dict(valid_items, d)
+	for d in frappe.db.sql(
+		"""select {0} from `tab{1} Item` where parent = %s""".format(select_fields, doc.doctype),
+		doc.return_against,
+		as_dict=1,
+	):
+		valid_items = get_ref_item_dict(valid_items, d)
 
 	if doc.doctype in ("Delivery Note", "Sales Invoice"):
-		for d in frappe.db.sql("""select item_code, qty, serial_no, batch_no from `tabPacked Item`
-			where parent = %s""", doc.return_against, as_dict=1):
-				valid_items = get_ref_item_dict(valid_items, d)
+		for d in frappe.db.sql(
+			"""select item_code, qty, serial_no, batch_no from `tabPacked Item`
+			where parent = %s""",
+			doc.return_against,
+			as_dict=1,
+		):
+			valid_items = get_ref_item_dict(valid_items, d)
 
 	already_returned_items = get_already_returned_items(doc)
 
 	# ( not mandatory when it is Purchase Invoice or a Sales Invoice without Update Stock )
-	warehouse_mandatory = not ((doc.doctype=="Purchase Invoice" or doc.doctype=="Sales Invoice") and not doc.update_stock)
+	warehouse_mandatory = not (
+		(doc.doctype == "Purchase Invoice" or doc.doctype == "Sales Invoice") and not doc.update_stock
+	)
 
 	items_returned = False
 	for d in doc.get("items"):
-		if d.item_code and (flt(d.qty) < 0 or flt(d.get('received_qty')) < 0):
+		if d.item_code and (flt(d.qty) < 0 or flt(d.get("received_qty")) < 0):
 			if d.item_code not in valid_items:
-				frappe.throw(_("Row # {0}: Returned Item {1} does not exist in {2} {3}")
-					.format(d.idx, d.item_code, doc.doctype, doc.return_against))
+				frappe.throw(
+					_("Row # {0}: Returned Item {1} does not exist in {2} {3}").format(
+						d.idx, d.item_code, doc.doctype, doc.return_against
+					)
+				)
 			else:
 				ref = valid_items.get(d.item_code, frappe._dict())
 				validate_quantity(doc, d, ref, valid_items, already_returned_items)
 
 				if ref.rate and doc.doctype in ("Delivery Note", "Sales Invoice") and flt(d.rate) > ref.rate:
-					frappe.throw(_("Row # {0}: Rate cannot be greater than the rate used in {1} {2}")
-						.format(d.idx, doc.doctype, doc.return_against))
+					frappe.throw(
+						_("Row # {0}: Rate cannot be greater than the rate used in {1} {2}").format(
+							d.idx, doc.doctype, doc.return_against
+						)
+					)
 
 				elif ref.batch_no and d.batch_no not in ref.batch_no:
-					frappe.throw(_("Row # {0}: Batch No must be same as {1} {2}")
-						.format(d.idx, doc.doctype, doc.return_against))
+					frappe.throw(
+						_("Row # {0}: Batch No must be same as {1} {2}").format(
+							d.idx, doc.doctype, doc.return_against
+						)
+					)
 
 				elif ref.serial_no:
 					if not d.serial_no:
@@ -99,11 +137,16 @@
 						serial_nos = get_serial_nos(d.serial_no)
 						for s in serial_nos:
 							if s not in ref.serial_no:
-								frappe.throw(_("Row # {0}: Serial No {1} does not match with {2} {3}")
-									.format(d.idx, s, doc.doctype, doc.return_against))
+								frappe.throw(
+									_("Row # {0}: Serial No {1} does not match with {2} {3}").format(
+										d.idx, s, doc.doctype, doc.return_against
+									)
+								)
 
-				if (warehouse_mandatory and not d.get("warehouse") and
-					frappe.db.get_value("Item", d.item_code, "is_stock_item")
+				if (
+					warehouse_mandatory
+					and not d.get("warehouse")
+					and frappe.db.get_value("Item", d.item_code, "is_stock_item")
 				):
 					frappe.throw(_("Warehouse is mandatory"))
 
@@ -115,21 +158,23 @@
 	if not items_returned:
 		frappe.throw(_("Atleast one item should be entered with negative quantity in return document"))
 
+
 def validate_quantity(doc, args, ref, valid_items, already_returned_items):
-	fields = ['stock_qty']
-	if doc.doctype in ['Purchase Receipt', 'Purchase Invoice']:
-		fields.extend(['received_qty', 'rejected_qty'])
+	fields = ["stock_qty"]
+	if doc.doctype in ["Purchase Receipt", "Purchase Invoice"]:
+		fields.extend(["received_qty", "rejected_qty"])
 
 	already_returned_data = already_returned_items.get(args.item_code) or {}
 
 	company_currency = erpnext.get_company_currency(doc.company)
-	stock_qty_precision = get_field_precision(frappe.get_meta(doc.doctype + " Item")
-			.get_field("stock_qty"), company_currency)
+	stock_qty_precision = get_field_precision(
+		frappe.get_meta(doc.doctype + " Item").get_field("stock_qty"), company_currency
+	)
 
 	for column in fields:
 		returned_qty = flt(already_returned_data.get(column, 0)) if len(already_returned_data) > 0 else 0
 
-		if column == 'stock_qty':
+		if column == "stock_qty":
 			reference_qty = ref.get(column)
 			current_stock_qty = args.get(column)
 		else:
@@ -137,38 +182,49 @@
 			current_stock_qty = args.get(column) * args.get("conversion_factor", 1.0)
 
 		max_returnable_qty = flt(reference_qty, stock_qty_precision) - returned_qty
-		label = column.replace('_', ' ').title()
+		label = column.replace("_", " ").title()
 
 		if reference_qty:
 			if flt(args.get(column)) > 0:
 				frappe.throw(_("{0} must be negative in return document").format(label))
 			elif returned_qty >= reference_qty and args.get(column):
-				frappe.throw(_("Item {0} has already been returned")
-					.format(args.item_code), StockOverReturnError)
+				frappe.throw(
+					_("Item {0} has already been returned").format(args.item_code), StockOverReturnError
+				)
 			elif abs(flt(current_stock_qty, stock_qty_precision)) > max_returnable_qty:
-				frappe.throw(_("Row # {0}: Cannot return more than {1} for Item {2}")
-					.format(args.idx, max_returnable_qty, args.item_code), StockOverReturnError)
+				frappe.throw(
+					_("Row # {0}: Cannot return more than {1} for Item {2}").format(
+						args.idx, max_returnable_qty, args.item_code
+					),
+					StockOverReturnError,
+				)
+
 
 def get_ref_item_dict(valid_items, ref_item_row):
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
 
-	valid_items.setdefault(ref_item_row.item_code, frappe._dict({
-		"qty": 0,
-		"rate": 0,
-		"stock_qty": 0,
-		"rejected_qty": 0,
-		"received_qty": 0,
-		"serial_no": [],
-		"conversion_factor": ref_item_row.get("conversion_factor", 1),
-		"batch_no": []
-	}))
+	valid_items.setdefault(
+		ref_item_row.item_code,
+		frappe._dict(
+			{
+				"qty": 0,
+				"rate": 0,
+				"stock_qty": 0,
+				"rejected_qty": 0,
+				"received_qty": 0,
+				"serial_no": [],
+				"conversion_factor": ref_item_row.get("conversion_factor", 1),
+				"batch_no": [],
+			}
+		),
+	)
 	item_dict = valid_items[ref_item_row.item_code]
 	item_dict["qty"] += ref_item_row.qty
-	item_dict["stock_qty"] += ref_item_row.get('stock_qty', 0)
+	item_dict["stock_qty"] += ref_item_row.get("stock_qty", 0)
 	if ref_item_row.get("rate", 0) > item_dict["rate"]:
 		item_dict["rate"] = ref_item_row.get("rate", 0)
 
-	if ref_item_row.parenttype in ['Purchase Invoice', 'Purchase Receipt']:
+	if ref_item_row.parenttype in ["Purchase Invoice", "Purchase Receipt"]:
 		item_dict["received_qty"] += ref_item_row.received_qty
 		item_dict["rejected_qty"] += ref_item_row.rejected_qty
 
@@ -180,13 +236,15 @@
 
 	return valid_items
 
+
 def get_already_returned_items(doc):
-	column = 'child.item_code, sum(abs(child.qty)) as qty, sum(abs(child.stock_qty)) as stock_qty'
-	if doc.doctype in ['Purchase Invoice', 'Purchase Receipt']:
+	column = "child.item_code, sum(abs(child.qty)) as qty, sum(abs(child.stock_qty)) as stock_qty"
+	if doc.doctype in ["Purchase Invoice", "Purchase Receipt"]:
 		column += """, sum(abs(child.rejected_qty) * child.conversion_factor) as rejected_qty,
 			sum(abs(child.received_qty) * child.conversion_factor) as received_qty"""
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		select {0}
 		from
 			`tab{1} Item` child, `tab{2}` par
@@ -194,62 +252,79 @@
 			child.parent = par.name and par.docstatus = 1
 			and par.is_return = 1 and par.return_against = %s
 		group by item_code
-	""".format(column, doc.doctype, doc.doctype), doc.return_against, as_dict=1)
+	""".format(
+			column, doc.doctype, doc.doctype
+		),
+		doc.return_against,
+		as_dict=1,
+	)
 
 	items = {}
 
 	for d in data:
-		items.setdefault(d.item_code, frappe._dict({
-			"qty": d.get("qty"),
-			"stock_qty": d.get("stock_qty"),
-			"received_qty": d.get("received_qty"),
-			"rejected_qty": d.get("rejected_qty")
-		}))
+		items.setdefault(
+			d.item_code,
+			frappe._dict(
+				{
+					"qty": d.get("qty"),
+					"stock_qty": d.get("stock_qty"),
+					"received_qty": d.get("received_qty"),
+					"rejected_qty": d.get("rejected_qty"),
+				}
+			),
+		)
 
 	return items
 
+
 def get_returned_qty_map_for_row(return_against, party, row_name, doctype):
 	child_doctype = doctype + " Item"
 	reference_field = "dn_detail" if doctype == "Delivery Note" else frappe.scrub(child_doctype)
 
-	if doctype in ('Purchase Receipt', 'Purchase Invoice'):
-		party_type = 'supplier'
+	if doctype in ("Purchase Receipt", "Purchase Invoice"):
+		party_type = "supplier"
 	else:
-		party_type = 'customer'
+		party_type = "customer"
 
 	fields = [
 		"sum(abs(`tab{0}`.qty)) as qty".format(child_doctype),
-		"sum(abs(`tab{0}`.stock_qty)) as stock_qty".format(child_doctype)
+		"sum(abs(`tab{0}`.stock_qty)) as stock_qty".format(child_doctype),
 	]
 
 	if doctype in ("Purchase Receipt", "Purchase Invoice"):
 		fields += [
 			"sum(abs(`tab{0}`.rejected_qty)) as rejected_qty".format(child_doctype),
-			"sum(abs(`tab{0}`.received_qty)) as received_qty".format(child_doctype)
+			"sum(abs(`tab{0}`.received_qty)) as received_qty".format(child_doctype),
 		]
 
 		if doctype == "Purchase Receipt":
 			fields += ["sum(abs(`tab{0}`.received_stock_qty)) as received_stock_qty".format(child_doctype)]
 
 	# Used retrun against and supplier and is_retrun because there is an index added for it
-	data = frappe.db.get_list(doctype,
-		fields = fields,
-		filters = [
+	data = frappe.db.get_list(
+		doctype,
+		fields=fields,
+		filters=[
 			[doctype, "return_against", "=", return_against],
 			[doctype, party_type, "=", party],
 			[doctype, "docstatus", "=", 1],
 			[doctype, "is_return", "=", 1],
-			[child_doctype, reference_field, "=", row_name]
-	])
+			[child_doctype, reference_field, "=", row_name],
+		],
+	)
 
 	return data[0]
 
+
 def make_return_doc(doctype, source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
 
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
 	company = frappe.db.get_value("Delivery Note", source_name, "company")
-	default_warehouse_for_sales_return = frappe.db.get_value("Company", company, "default_warehouse_for_sales_return")
+	default_warehouse_for_sales_return = frappe.db.get_value(
+		"Company", company, "default_warehouse_for_sales_return"
+	)
 
 	def set_missing_values(source, target):
 		doc = frappe.get_doc(target)
@@ -273,29 +348,34 @@
 				tax.tax_amount = -1 * tax.tax_amount
 
 		if doc.get("is_return"):
-			if doc.doctype == 'Sales Invoice' or doc.doctype == 'POS Invoice':
+			if doc.doctype == "Sales Invoice" or doc.doctype == "POS Invoice":
 				doc.consolidated_invoice = ""
-				doc.set('payments', [])
+				doc.set("payments", [])
 				for data in source.payments:
 					paid_amount = 0.00
 					base_paid_amount = 0.00
-					data.base_amount = flt(data.amount*source.conversion_rate, source.precision("base_paid_amount"))
+					data.base_amount = flt(
+						data.amount * source.conversion_rate, source.precision("base_paid_amount")
+					)
 					paid_amount += data.amount
 					base_paid_amount += data.base_amount
-					doc.append('payments', {
-						'mode_of_payment': data.mode_of_payment,
-						'type': data.type,
-						'amount': -1 * paid_amount,
-						'base_amount': -1 * base_paid_amount,
-						'account': data.account,
-						'default': data.default
-					})
+					doc.append(
+						"payments",
+						{
+							"mode_of_payment": data.mode_of_payment,
+							"type": data.type,
+							"amount": -1 * paid_amount,
+							"base_amount": -1 * base_paid_amount,
+							"account": data.account,
+							"default": data.default,
+						},
+					)
 				if doc.is_pos:
 					doc.paid_amount = -1 * source.paid_amount
-			elif doc.doctype == 'Purchase Invoice':
+			elif doc.doctype == "Purchase Invoice":
 				doc.paid_amount = -1 * source.paid_amount
 				doc.base_paid_amount = -1 * source.base_paid_amount
-				doc.payment_terms_template = ''
+				doc.payment_terms_template = ""
 				doc.payment_schedule = []
 
 		if doc.get("is_return") and hasattr(doc, "packed_items"):
@@ -312,16 +392,24 @@
 			returned_serial_nos = get_returned_serial_nos(source_doc, source_parent)
 			serial_nos = list(set(get_serial_nos(source_doc.serial_no)) - set(returned_serial_nos))
 			if serial_nos:
-				target_doc.serial_no = '\n'.join(serial_nos)
+				target_doc.serial_no = "\n".join(serial_nos)
 
 		if doctype == "Purchase Receipt":
-			returned_qty_map = get_returned_qty_map_for_row(source_parent.name, source_parent.supplier, source_doc.name, doctype)
-			target_doc.received_qty = -1 * flt(source_doc.received_qty - (returned_qty_map.get('received_qty') or 0))
-			target_doc.rejected_qty = -1 * flt(source_doc.rejected_qty - (returned_qty_map.get('rejected_qty') or 0))
-			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get('qty') or 0))
+			returned_qty_map = get_returned_qty_map_for_row(
+				source_parent.name, source_parent.supplier, source_doc.name, doctype
+			)
+			target_doc.received_qty = -1 * flt(
+				source_doc.received_qty - (returned_qty_map.get("received_qty") or 0)
+			)
+			target_doc.rejected_qty = -1 * flt(
+				source_doc.rejected_qty - (returned_qty_map.get("rejected_qty") or 0)
+			)
+			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get("qty") or 0))
 
-			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get('stock_qty') or 0))
-			target_doc.received_stock_qty = -1 * flt(source_doc.received_stock_qty - (returned_qty_map.get('received_stock_qty') or 0))
+			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get("stock_qty") or 0))
+			target_doc.received_stock_qty = -1 * flt(
+				source_doc.received_stock_qty - (returned_qty_map.get("received_stock_qty") or 0)
+			)
 
 			target_doc.purchase_order = source_doc.purchase_order
 			target_doc.purchase_order_item = source_doc.purchase_order_item
@@ -329,12 +417,18 @@
 			target_doc.purchase_receipt_item = source_doc.name
 
 		elif doctype == "Purchase Invoice":
-			returned_qty_map = get_returned_qty_map_for_row(source_parent.name, source_parent.supplier, source_doc.name, doctype)
-			target_doc.received_qty = -1 * flt(source_doc.received_qty - (returned_qty_map.get('received_qty') or 0))
-			target_doc.rejected_qty = -1 * flt(source_doc.rejected_qty - (returned_qty_map.get('rejected_qty') or 0))
-			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get('qty') or 0))
+			returned_qty_map = get_returned_qty_map_for_row(
+				source_parent.name, source_parent.supplier, source_doc.name, doctype
+			)
+			target_doc.received_qty = -1 * flt(
+				source_doc.received_qty - (returned_qty_map.get("received_qty") or 0)
+			)
+			target_doc.rejected_qty = -1 * flt(
+				source_doc.rejected_qty - (returned_qty_map.get("rejected_qty") or 0)
+			)
+			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get("qty") or 0))
 
-			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get('stock_qty') or 0))
+			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get("stock_qty") or 0))
 			target_doc.purchase_order = source_doc.purchase_order
 			target_doc.purchase_receipt = source_doc.purchase_receipt
 			target_doc.rejected_warehouse = source_doc.rejected_warehouse
@@ -343,9 +437,11 @@
 			target_doc.purchase_invoice_item = source_doc.name
 
 		elif doctype == "Delivery Note":
-			returned_qty_map = get_returned_qty_map_for_row(source_parent.name, source_parent.customer, source_doc.name, doctype)
-			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get('qty') or 0))
-			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get('stock_qty') or 0))
+			returned_qty_map = get_returned_qty_map_for_row(
+				source_parent.name, source_parent.customer, source_doc.name, doctype
+			)
+			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get("qty") or 0))
+			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get("stock_qty") or 0))
 
 			target_doc.against_sales_order = source_doc.against_sales_order
 			target_doc.against_sales_invoice = source_doc.against_sales_invoice
@@ -356,9 +452,11 @@
 			if default_warehouse_for_sales_return:
 				target_doc.warehouse = default_warehouse_for_sales_return
 		elif doctype == "Sales Invoice" or doctype == "POS Invoice":
-			returned_qty_map = get_returned_qty_map_for_row(source_parent.name, source_parent.customer, source_doc.name, doctype)
-			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get('qty') or 0))
-			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get('stock_qty') or 0))
+			returned_qty_map = get_returned_qty_map_for_row(
+				source_parent.name, source_parent.customer, source_doc.name, doctype
+			)
+			target_doc.qty = -1 * flt(source_doc.qty - (returned_qty_map.get("qty") or 0))
+			target_doc.stock_qty = -1 * flt(source_doc.stock_qty - (returned_qty_map.get("stock_qty") or 0))
 
 			target_doc.sales_order = source_doc.sales_order
 			target_doc.delivery_note = source_doc.delivery_note
@@ -377,41 +475,56 @@
 	def update_terms(source_doc, target_doc, source_parent):
 		target_doc.payment_amount = -source_doc.payment_amount
 
-	doclist = get_mapped_doc(doctype, source_name,	{
-		doctype: {
-			"doctype": doctype,
-
-			"validation": {
-				"docstatus": ["=", 1],
-			}
-		},
-		doctype +" Item": {
-			"doctype": doctype + " Item",
-			"field_map": {
-				"serial_no": "serial_no",
-				"batch_no": "batch_no"
+	doclist = get_mapped_doc(
+		doctype,
+		source_name,
+		{
+			doctype: {
+				"doctype": doctype,
+				"validation": {
+					"docstatus": ["=", 1],
+				},
 			},
-			"postprocess": update_item
+			doctype
+			+ " Item": {
+				"doctype": doctype + " Item",
+				"field_map": {"serial_no": "serial_no", "batch_no": "batch_no"},
+				"postprocess": update_item,
+			},
+			"Payment Schedule": {"doctype": "Payment Schedule", "postprocess": update_terms},
 		},
-		"Payment Schedule": {
-			"doctype": "Payment Schedule",
-			"postprocess": update_terms
-		}
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 
 	return doclist
 
-def get_rate_for_return(voucher_type, voucher_no, item_code, return_against=None,
-	item_row=None, voucher_detail_no=None, sle=None):
+
+def get_rate_for_return(
+	voucher_type,
+	voucher_no,
+	item_code,
+	return_against=None,
+	item_row=None,
+	voucher_detail_no=None,
+	sle=None,
+):
 	if not return_against:
 		return_against = frappe.get_cached_value(voucher_type, voucher_no, "return_against")
 
 	return_against_item_field = get_return_against_item_fields(voucher_type)
 
-	filters = get_filters(voucher_type, voucher_no, voucher_detail_no,
-		return_against, item_code, return_against_item_field, item_row)
+	filters = get_filters(
+		voucher_type,
+		voucher_no,
+		voucher_detail_no,
+		return_against,
+		item_code,
+		return_against_item_field,
+		item_row,
+	)
 
 	if voucher_type in ("Purchase Receipt", "Purchase Invoice"):
 		select_field = "incoming_rate"
@@ -419,53 +532,66 @@
 		select_field = "abs(stock_value_difference / actual_qty)"
 
 	rate = flt(frappe.db.get_value("Stock Ledger Entry", filters, select_field))
-	if not (rate and return_against) and voucher_type in ['Sales Invoice', 'Delivery Note']:
-		rate = frappe.db.get_value(f'{voucher_type} Item', voucher_detail_no, 'incoming_rate')
+	if not (rate and return_against) and voucher_type in ["Sales Invoice", "Delivery Note"]:
+		rate = frappe.db.get_value(f"{voucher_type} Item", voucher_detail_no, "incoming_rate")
 
 		if not rate and sle:
-			rate = get_incoming_rate({
-				"item_code": sle.item_code,
-				"warehouse": sle.warehouse,
-				"posting_date": sle.get('posting_date'),
-				"posting_time": sle.get('posting_time'),
-				"qty": sle.actual_qty,
-				"serial_no": sle.get('serial_no'),
-				"batch_no": sle.get("batch_no"),
-				"company": sle.company,
-				"voucher_type": sle.voucher_type,
-				"voucher_no": sle.voucher_no
-			}, raise_error_if_no_rate=False)
+			rate = get_incoming_rate(
+				{
+					"item_code": sle.item_code,
+					"warehouse": sle.warehouse,
+					"posting_date": sle.get("posting_date"),
+					"posting_time": sle.get("posting_time"),
+					"qty": sle.actual_qty,
+					"serial_no": sle.get("serial_no"),
+					"batch_no": sle.get("batch_no"),
+					"company": sle.company,
+					"voucher_type": sle.voucher_type,
+					"voucher_no": sle.voucher_no,
+				},
+				raise_error_if_no_rate=False,
+			)
 
 	return rate
 
+
 def get_return_against_item_fields(voucher_type):
 	return_against_item_fields = {
 		"Purchase Receipt": "purchase_receipt_item",
 		"Purchase Invoice": "purchase_invoice_item",
 		"Delivery Note": "dn_detail",
-		"Sales Invoice": "sales_invoice_item"
+		"Sales Invoice": "sales_invoice_item",
 	}
 	return return_against_item_fields[voucher_type]
 
-def get_filters(voucher_type, voucher_no, voucher_detail_no, return_against, item_code, return_against_item_field, item_row):
-	filters = {
-		"voucher_type": voucher_type,
-		"voucher_no": return_against,
-		"item_code": item_code
-	}
+
+def get_filters(
+	voucher_type,
+	voucher_no,
+	voucher_detail_no,
+	return_against,
+	item_code,
+	return_against_item_field,
+	item_row,
+):
+	filters = {"voucher_type": voucher_type, "voucher_no": return_against, "item_code": item_code}
 
 	if item_row:
 		reference_voucher_detail_no = item_row.get(return_against_item_field)
 	else:
-		reference_voucher_detail_no = frappe.db.get_value(voucher_type + " Item", voucher_detail_no, return_against_item_field)
+		reference_voucher_detail_no = frappe.db.get_value(
+			voucher_type + " Item", voucher_detail_no, return_against_item_field
+		)
 
 	if reference_voucher_detail_no:
 		filters["voucher_detail_no"] = reference_voucher_detail_no
 
 	return filters
 
+
 def get_returned_serial_nos(child_doc, parent_doc):
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
 	return_ref_field = frappe.scrub(child_doc.doctype)
 	if child_doc.doctype == "Delivery Note Item":
 		return_ref_field = "dn_detail"
@@ -474,10 +600,14 @@
 
 	fields = ["`{0}`.`serial_no`".format("tab" + child_doc.doctype)]
 
-	filters = [[parent_doc.doctype, "return_against", "=", parent_doc.name], [parent_doc.doctype, "is_return", "=", 1],
-		[child_doc.doctype, return_ref_field, "=", child_doc.name], [parent_doc.doctype, "docstatus", "=", 1]]
+	filters = [
+		[parent_doc.doctype, "return_against", "=", parent_doc.name],
+		[parent_doc.doctype, "is_return", "=", 1],
+		[child_doc.doctype, return_ref_field, "=", child_doc.name],
+		[parent_doc.doctype, "docstatus", "=", 1],
+	]
 
-	for row in frappe.get_all(parent_doc.doctype, fields = fields, filters=filters):
+	for row in frappe.get_all(parent_doc.doctype, fields=fields, filters=filters):
 		serial_nos.extend(get_serial_nos(row.serial_no))
 
 	return serial_nos
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index e918cde..7877827 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -17,8 +17,7 @@
 
 class SellingController(StockController):
 	def get_feed(self):
-		return _("To {0} | {1} {2}").format(self.customer_name, self.currency,
-			self.grand_total)
+		return _("To {0} | {1} {2}").format(self.customer_name, self.currency, self.grand_total)
 
 	def onload(self):
 		super(SellingController, self).onload()
@@ -64,32 +63,43 @@
 
 		if customer:
 			from erpnext.accounts.party import _get_party_details
+
 			fetch_payment_terms_template = False
-			if (self.get("__islocal") or
-				self.company != frappe.db.get_value(self.doctype, self.name, 'company')):
+			if self.get("__islocal") or self.company != frappe.db.get_value(
+				self.doctype, self.name, "company"
+			):
 				fetch_payment_terms_template = True
 
-			party_details = _get_party_details(customer,
+			party_details = _get_party_details(
+				customer,
 				ignore_permissions=self.flags.ignore_permissions,
-				doctype=self.doctype, company=self.company,
-				posting_date=self.get('posting_date'),
+				doctype=self.doctype,
+				company=self.company,
+				posting_date=self.get("posting_date"),
 				fetch_payment_terms_template=fetch_payment_terms_template,
-				party_address=self.customer_address, shipping_address=self.shipping_address_name,
-				company_address=self.get('company_address'))
+				party_address=self.customer_address,
+				shipping_address=self.shipping_address_name,
+				company_address=self.get("company_address"),
+			)
 			if not self.meta.get_field("sales_team"):
 				party_details.pop("sales_team")
 			self.update_if_missing(party_details)
 
 		elif lead:
 			from erpnext.crm.doctype.lead.lead import get_lead_details
-			self.update_if_missing(get_lead_details(lead,
-				posting_date=self.get('transaction_date') or self.get('posting_date'),
-				company=self.company))
 
-		if self.get('taxes_and_charges') and not self.get('taxes') and not for_validate:
-			taxes = get_taxes_and_charges('Sales Taxes and Charges Template', self.taxes_and_charges)
+			self.update_if_missing(
+				get_lead_details(
+					lead,
+					posting_date=self.get("transaction_date") or self.get("posting_date"),
+					company=self.company,
+				)
+			)
+
+		if self.get("taxes_and_charges") and not self.get("taxes") and not for_validate:
+			taxes = get_taxes_and_charges("Sales Taxes and Charges Template", self.taxes_and_charges)
 			for tax in taxes:
-				self.append('taxes', tax)
+				self.append("taxes", tax)
 
 	def set_price_list_and_item_details(self, for_validate=False):
 		self.set_price_list_currency("Selling")
@@ -98,12 +108,15 @@
 	def remove_shipping_charge(self):
 		if self.shipping_rule:
 			shipping_rule = frappe.get_doc("Shipping Rule", self.shipping_rule)
-			existing_shipping_charge = self.get("taxes", {
-				"doctype": "Sales Taxes and Charges",
-				"charge_type": "Actual",
-				"account_head": shipping_rule.account,
-				"cost_center": shipping_rule.cost_center
-			})
+			existing_shipping_charge = self.get(
+				"taxes",
+				{
+					"doctype": "Sales Taxes and Charges",
+					"charge_type": "Actual",
+					"account_head": shipping_rule.account,
+					"cost_center": shipping_rule.cost_center,
+				},
+			)
 			if existing_shipping_charge:
 				self.get("taxes").remove(existing_shipping_charge[-1])
 				self.calculate_taxes_and_totals()
@@ -112,8 +125,9 @@
 		from frappe.utils import money_in_words
 
 		if self.meta.get_field("base_in_words"):
-			base_amount = abs(self.base_grand_total
-				if self.is_rounded_total_disabled() else self.base_rounded_total)
+			base_amount = abs(
+				self.base_grand_total if self.is_rounded_total_disabled() else self.base_rounded_total
+			)
 			self.base_in_words = money_in_words(base_amount, self.company_currency)
 
 		if self.meta.get_field("in_words"):
@@ -124,15 +138,15 @@
 		if not self.meta.get_field("commission_rate"):
 			return
 
-		self.round_floats_in(
-			self, ("amount_eligible_for_commission", "commission_rate")
-		)
+		self.round_floats_in(self, ("amount_eligible_for_commission", "commission_rate"))
 
 		if not (0 <= self.commission_rate <= 100.0):
-			throw("{} {}".format(
-				_(self.meta.get_label("commission_rate")),
-				_("must be between 0 and 100"),
-			))
+			throw(
+				"{} {}".format(
+					_(self.meta.get_label("commission_rate")),
+					_("must be between 0 and 100"),
+				)
+			)
 
 		self.amount_eligible_for_commission = sum(
 			item.base_net_amount for item in self.items if item.grant_commission
@@ -140,7 +154,7 @@
 
 		self.total_commission = flt(
 			self.amount_eligible_for_commission * self.commission_rate / 100.0,
-			self.precision("total_commission")
+			self.precision("total_commission"),
 		)
 
 	def calculate_contribution(self):
@@ -154,12 +168,14 @@
 
 			sales_person.allocated_amount = flt(
 				self.amount_eligible_for_commission * sales_person.allocated_percentage / 100.0,
-				self.precision("allocated_amount", sales_person))
+				self.precision("allocated_amount", sales_person),
+			)
 
 			if sales_person.commission_rate:
 				sales_person.incentives = flt(
 					sales_person.allocated_amount * flt(sales_person.commission_rate) / 100.0,
-					self.precision("incentives", sales_person))
+					self.precision("incentives", sales_person),
+				)
 
 			total += sales_person.allocated_percentage
 
@@ -183,25 +199,29 @@
 
 	def validate_selling_price(self):
 		def throw_message(idx, item_name, rate, ref_rate_field):
-			throw(_("""Row #{0}: Selling rate for item {1} is lower than its {2}.
+			throw(
+				_(
+					"""Row #{0}: Selling rate for item {1} is lower than its {2}.
 					Selling {3} should be atleast {4}.<br><br>Alternatively,
 					you can disable selling price validation in {5} to bypass
-					this validation.""").format(
-				idx,
-				bold(item_name),
-				bold(ref_rate_field),
-				bold("net rate"),
-				bold(rate),
-				get_link_to_form("Selling Settings", "Selling Settings"),
-			), title=_("Invalid Selling Price"))
+					this validation."""
+				).format(
+					idx,
+					bold(item_name),
+					bold(ref_rate_field),
+					bold("net rate"),
+					bold(rate),
+					get_link_to_form("Selling Settings", "Selling Settings"),
+				),
+				title=_("Invalid Selling Price"),
+			)
 
-		if (
-			self.get("is_return")
-			or not frappe.db.get_single_value("Selling Settings", "validate_selling_price")
+		if self.get("is_return") or not frappe.db.get_single_value(
+			"Selling Settings", "validate_selling_price"
 		):
 			return
 
-		is_internal_customer = self.get('is_internal_customer')
+		is_internal_customer = self.get("is_internal_customer")
 		valuation_rate_map = {}
 
 		for item in self.items:
@@ -212,17 +232,10 @@
 				"Item", item.item_code, ("last_purchase_rate", "is_stock_item")
 			)
 
-			last_purchase_rate_in_sales_uom = (
-				last_purchase_rate * (item.conversion_factor or 1)
-			)
+			last_purchase_rate_in_sales_uom = last_purchase_rate * (item.conversion_factor or 1)
 
 			if flt(item.base_net_rate) < flt(last_purchase_rate_in_sales_uom):
-				throw_message(
-					item.idx,
-					item.item_name,
-					last_purchase_rate_in_sales_uom,
-					"last purchase rate"
-				)
+				throw_message(item.idx, item.item_name, last_purchase_rate_in_sales_uom, "last purchase rate")
 
 			if is_internal_customer or not is_stock_item:
 				continue
@@ -238,7 +251,8 @@
 			for valuation_rate in valuation_rate_map
 		)
 
-		valuation_rates = frappe.db.sql(f"""
+		valuation_rates = frappe.db.sql(
+			f"""
 			select
 				item_code, warehouse, valuation_rate
 			from
@@ -246,7 +260,9 @@
 			where
 				({" or ".join(or_conditions)})
 				and valuation_rate > 0
-		""", as_dict=True)
+		""",
+			as_dict=True,
+		)
 
 		for rate in valuation_rates:
 			valuation_rate_map[(rate.item_code, rate.warehouse)] = rate.valuation_rate
@@ -255,24 +271,15 @@
 			if not item.item_code or item.is_free_item:
 				continue
 
-			last_valuation_rate = valuation_rate_map.get(
-				(item.item_code, item.warehouse)
-			)
+			last_valuation_rate = valuation_rate_map.get((item.item_code, item.warehouse))
 
 			if not last_valuation_rate:
 				continue
 
-			last_valuation_rate_in_sales_uom = (
-				last_valuation_rate * (item.conversion_factor or 1)
-			)
+			last_valuation_rate_in_sales_uom = last_valuation_rate * (item.conversion_factor or 1)
 
 			if flt(item.base_net_rate) < flt(last_valuation_rate_in_sales_uom):
-				throw_message(
-					item.idx,
-					item.item_name,
-					last_valuation_rate_in_sales_uom,
-					"valuation rate"
-				)
+				throw_message(item.idx, item.item_name, last_valuation_rate_in_sales_uom, "valuation rate")
 
 	def get_item_list(self):
 		il = []
@@ -284,68 +291,90 @@
 				for p in self.get("packed_items"):
 					if p.parent_detail_docname == d.name and p.parent_item == d.item_code:
 						# the packing details table's qty is already multiplied with parent's qty
-						il.append(frappe._dict({
-							'warehouse': p.warehouse or d.warehouse,
-							'item_code': p.item_code,
-							'qty': flt(p.qty),
-							'uom': p.uom,
-							'batch_no': cstr(p.batch_no).strip(),
-							'serial_no': cstr(p.serial_no).strip(),
-							'name': d.name,
-							'target_warehouse': p.target_warehouse,
-							'company': self.company,
-							'voucher_type': self.doctype,
-							'allow_zero_valuation': d.allow_zero_valuation_rate,
-							'sales_invoice_item': d.get("sales_invoice_item"),
-							'dn_detail': d.get("dn_detail"),
-							'incoming_rate': p.get("incoming_rate")
-						}))
+						il.append(
+							frappe._dict(
+								{
+									"warehouse": p.warehouse or d.warehouse,
+									"item_code": p.item_code,
+									"qty": flt(p.qty),
+									"uom": p.uom,
+									"batch_no": cstr(p.batch_no).strip(),
+									"serial_no": cstr(p.serial_no).strip(),
+									"name": d.name,
+									"target_warehouse": p.target_warehouse,
+									"company": self.company,
+									"voucher_type": self.doctype,
+									"allow_zero_valuation": d.allow_zero_valuation_rate,
+									"sales_invoice_item": d.get("sales_invoice_item"),
+									"dn_detail": d.get("dn_detail"),
+									"incoming_rate": p.get("incoming_rate"),
+								}
+							)
+						)
 			else:
-				il.append(frappe._dict({
-					'warehouse': d.warehouse,
-					'item_code': d.item_code,
-					'qty': d.stock_qty,
-					'uom': d.uom,
-					'stock_uom': d.stock_uom,
-					'conversion_factor': d.conversion_factor,
-					'batch_no': cstr(d.get("batch_no")).strip(),
-					'serial_no': cstr(d.get("serial_no")).strip(),
-					'name': d.name,
-					'target_warehouse': d.target_warehouse,
-					'company': self.company,
-					'voucher_type': self.doctype,
-					'allow_zero_valuation': d.allow_zero_valuation_rate,
-					'sales_invoice_item': d.get("sales_invoice_item"),
-					'dn_detail': d.get("dn_detail"),
-					'incoming_rate': d.get("incoming_rate")
-				}))
+				il.append(
+					frappe._dict(
+						{
+							"warehouse": d.warehouse,
+							"item_code": d.item_code,
+							"qty": d.stock_qty,
+							"uom": d.uom,
+							"stock_uom": d.stock_uom,
+							"conversion_factor": d.conversion_factor,
+							"batch_no": cstr(d.get("batch_no")).strip(),
+							"serial_no": cstr(d.get("serial_no")).strip(),
+							"name": d.name,
+							"target_warehouse": d.target_warehouse,
+							"company": self.company,
+							"voucher_type": self.doctype,
+							"allow_zero_valuation": d.allow_zero_valuation_rate,
+							"sales_invoice_item": d.get("sales_invoice_item"),
+							"dn_detail": d.get("dn_detail"),
+							"incoming_rate": d.get("incoming_rate"),
+						}
+					)
+				)
 		return il
 
 	def has_product_bundle(self, item_code):
-		return frappe.db.sql("""select name from `tabProduct Bundle`
-			where new_item_code=%s and docstatus != 2""", item_code)
+		return frappe.db.sql(
+			"""select name from `tabProduct Bundle`
+			where new_item_code=%s and docstatus != 2""",
+			item_code,
+		)
 
 	def get_already_delivered_qty(self, current_docname, so, so_detail):
-		delivered_via_dn = frappe.db.sql("""select sum(qty) from `tabDelivery Note Item`
+		delivered_via_dn = frappe.db.sql(
+			"""select sum(qty) from `tabDelivery Note Item`
 			where so_detail = %s and docstatus = 1
 			and against_sales_order = %s
-			and parent != %s""", (so_detail, so, current_docname))
+			and parent != %s""",
+			(so_detail, so, current_docname),
+		)
 
-		delivered_via_si = frappe.db.sql("""select sum(si_item.qty)
+		delivered_via_si = frappe.db.sql(
+			"""select sum(si_item.qty)
 			from `tabSales Invoice Item` si_item, `tabSales Invoice` si
 			where si_item.parent = si.name and si.update_stock = 1
 			and si_item.so_detail = %s and si.docstatus = 1
 			and si_item.sales_order = %s
-			and si.name != %s""", (so_detail, so, current_docname))
+			and si.name != %s""",
+			(so_detail, so, current_docname),
+		)
 
-		total_delivered_qty = (flt(delivered_via_dn[0][0]) if delivered_via_dn else 0) \
-			+ (flt(delivered_via_si[0][0]) if delivered_via_si else 0)
+		total_delivered_qty = (flt(delivered_via_dn[0][0]) if delivered_via_dn else 0) + (
+			flt(delivered_via_si[0][0]) if delivered_via_si else 0
+		)
 
 		return total_delivered_qty
 
 	def get_so_qty_and_warehouse(self, so_detail):
-		so_item = frappe.db.sql("""select qty, warehouse from `tabSales Order Item`
-			where name = %s and docstatus = 1""", so_detail, as_dict=1)
+		so_item = frappe.db.sql(
+			"""select qty, warehouse from `tabSales Order Item`
+			where name = %s and docstatus = 1""",
+			so_detail,
+			as_dict=1,
+		)
 		so_qty = so_item and flt(so_item[0]["qty"]) or 0.0
 		so_warehouse = so_item and so_item[0]["warehouse"] or ""
 		return so_qty, so_warehouse
@@ -371,8 +400,9 @@
 				sales_order = frappe.get_doc("Sales Order", so)
 
 				if sales_order.status in ["Closed", "Cancelled"]:
-					frappe.throw(_("{0} {1} is cancelled or closed").format(_("Sales Order"), so),
-						frappe.InvalidStatusError)
+					frappe.throw(
+						_("{0} {1} is cancelled or closed").format(_("Sales Order"), so), frappe.InvalidStatusError
+					)
 
 				sales_order.update_reserved_qty(so_item_rows)
 
@@ -384,43 +414,52 @@
 		for d in items:
 			if not self.get("return_against"):
 				# Get incoming rate based on original item cost based on valuation method
-				qty = flt(d.get('stock_qty') or d.get('actual_qty'))
+				qty = flt(d.get("stock_qty") or d.get("actual_qty"))
 
 				if not (self.get("is_return") and d.incoming_rate):
-					d.incoming_rate = get_incoming_rate({
-						"item_code": d.item_code,
-						"warehouse": d.warehouse,
-						"posting_date": self.get('posting_date') or self.get('transaction_date'),
-						"posting_time": self.get('posting_time') or nowtime(),
-						"qty": qty if cint(self.get("is_return")) else (-1 * qty),
-						"serial_no": d.get('serial_no'),
-						"batch_no": d.get("batch_no"),
-						"company": self.company,
-						"voucher_type": self.doctype,
-						"voucher_no": self.name,
-						"allow_zero_valuation": d.get("allow_zero_valuation")
-					}, raise_error_if_no_rate=False)
+					d.incoming_rate = get_incoming_rate(
+						{
+							"item_code": d.item_code,
+							"warehouse": d.warehouse,
+							"posting_date": self.get("posting_date") or self.get("transaction_date"),
+							"posting_time": self.get("posting_time") or nowtime(),
+							"qty": qty if cint(self.get("is_return")) else (-1 * qty),
+							"serial_no": d.get("serial_no"),
+							"batch_no": d.get("batch_no"),
+							"company": self.company,
+							"voucher_type": self.doctype,
+							"voucher_no": self.name,
+							"allow_zero_valuation": d.get("allow_zero_valuation"),
+						},
+						raise_error_if_no_rate=False,
+					)
 
 				# For internal transfers use incoming rate as the valuation rate
 				if self.is_internal_transfer():
 					if d.doctype == "Packed Item":
-						incoming_rate = flt(d.incoming_rate * d.conversion_factor, d.precision('incoming_rate'))
+						incoming_rate = flt(d.incoming_rate * d.conversion_factor, d.precision("incoming_rate"))
 						if d.incoming_rate != incoming_rate:
 							d.incoming_rate = incoming_rate
 					else:
-						rate = flt(d.incoming_rate * d.conversion_factor, d.precision('rate'))
+						rate = flt(d.incoming_rate * d.conversion_factor, d.precision("rate"))
 						if d.rate != rate:
 							d.rate = rate
 
 						d.discount_percentage = 0
 						d.discount_amount = 0
-						frappe.msgprint(_("Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer")
-							.format(d.idx), alert=1)
+						frappe.msgprint(
+							_(
+								"Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer"
+							).format(d.idx),
+							alert=1,
+						)
 
 			elif self.get("return_against"):
 				# Get incoming rate of return entry from reference document
 				# based on original item cost as per valuation method
-				d.incoming_rate = get_rate_for_return(self.doctype, self.name, d.item_code, self.return_against, item_row=d)
+				d.incoming_rate = get_rate_for_return(
+					self.doctype, self.name, d.item_code, self.return_against, item_row=d
+				)
 
 	def update_stock_ledger(self):
 		self.update_reserved_qty()
@@ -429,63 +468,66 @@
 		# Loop over items and packed items table
 		for d in self.get_item_list():
 			if frappe.get_cached_value("Item", d.item_code, "is_stock_item") == 1 and flt(d.qty):
-				if flt(d.conversion_factor)==0.0:
-					d.conversion_factor = get_conversion_factor(d.item_code, d.uom).get("conversion_factor") or 1.0
+				if flt(d.conversion_factor) == 0.0:
+					d.conversion_factor = (
+						get_conversion_factor(d.item_code, d.uom).get("conversion_factor") or 1.0
+					)
 
 				# On cancellation or return entry submission, make stock ledger entry for
 				# target warehouse first, to update serial no values properly
 
-				if d.warehouse and ((not cint(self.is_return) and self.docstatus==1)
-					or (cint(self.is_return) and self.docstatus==2)):
-						sl_entries.append(self.get_sle_for_source_warehouse(d))
+				if d.warehouse and (
+					(not cint(self.is_return) and self.docstatus == 1)
+					or (cint(self.is_return) and self.docstatus == 2)
+				):
+					sl_entries.append(self.get_sle_for_source_warehouse(d))
 
 				if d.target_warehouse:
 					sl_entries.append(self.get_sle_for_target_warehouse(d))
 
-				if d.warehouse and ((not cint(self.is_return) and self.docstatus==2)
-					or (cint(self.is_return) and self.docstatus==1)):
-						sl_entries.append(self.get_sle_for_source_warehouse(d))
+				if d.warehouse and (
+					(not cint(self.is_return) and self.docstatus == 2)
+					or (cint(self.is_return) and self.docstatus == 1)
+				):
+					sl_entries.append(self.get_sle_for_source_warehouse(d))
 
 		self.make_sl_entries(sl_entries)
 
 	def get_sle_for_source_warehouse(self, item_row):
-		sle = self.get_sl_entries(item_row, {
-			"actual_qty": -1*flt(item_row.qty),
-			"incoming_rate": item_row.incoming_rate,
-			"recalculate_rate": cint(self.is_return)
-		})
+		sle = self.get_sl_entries(
+			item_row,
+			{
+				"actual_qty": -1 * flt(item_row.qty),
+				"incoming_rate": item_row.incoming_rate,
+				"recalculate_rate": cint(self.is_return),
+			},
+		)
 		if item_row.target_warehouse and not cint(self.is_return):
 			sle.dependant_sle_voucher_detail_no = item_row.name
 
 		return sle
 
 	def get_sle_for_target_warehouse(self, item_row):
-		sle = self.get_sl_entries(item_row, {
-			"actual_qty": flt(item_row.qty),
-			"warehouse": item_row.target_warehouse
-		})
+		sle = self.get_sl_entries(
+			item_row, {"actual_qty": flt(item_row.qty), "warehouse": item_row.target_warehouse}
+		)
 
 		if self.docstatus == 1:
 			if not cint(self.is_return):
-				sle.update({
-					"incoming_rate": item_row.incoming_rate,
-					"recalculate_rate": 1
-				})
+				sle.update({"incoming_rate": item_row.incoming_rate, "recalculate_rate": 1})
 			else:
-				sle.update({
-					"outgoing_rate": item_row.incoming_rate
-				})
+				sle.update({"outgoing_rate": item_row.incoming_rate})
 				if item_row.warehouse:
 					sle.dependant_sle_voucher_detail_no = item_row.name
 
 		return sle
 
 	def set_po_nos(self, for_validate=False):
-		if self.doctype == 'Sales Invoice' and hasattr(self, "items"):
+		if self.doctype == "Sales Invoice" and hasattr(self, "items"):
 			if for_validate and self.po_no:
 				return
 			self.set_pos_for_sales_invoice()
-		if self.doctype == 'Delivery Note' and hasattr(self, "items"):
+		if self.doctype == "Delivery Note" and hasattr(self, "items"):
 			if for_validate and self.po_no:
 				return
 			self.set_pos_for_delivery_note()
@@ -494,34 +536,39 @@
 		po_nos = []
 		if self.po_no:
 			po_nos.append(self.po_no)
-		self.get_po_nos('Sales Order', 'sales_order', po_nos)
-		self.get_po_nos('Delivery Note', 'delivery_note', po_nos)
-		self.po_no = ', '.join(list(set(x.strip() for x in ','.join(po_nos).split(','))))
+		self.get_po_nos("Sales Order", "sales_order", po_nos)
+		self.get_po_nos("Delivery Note", "delivery_note", po_nos)
+		self.po_no = ", ".join(list(set(x.strip() for x in ",".join(po_nos).split(","))))
 
 	def set_pos_for_delivery_note(self):
 		po_nos = []
 		if self.po_no:
 			po_nos.append(self.po_no)
-		self.get_po_nos('Sales Order', 'against_sales_order', po_nos)
-		self.get_po_nos('Sales Invoice', 'against_sales_invoice', po_nos)
-		self.po_no = ', '.join(list(set(x.strip() for x in ','.join(po_nos).split(','))))
+		self.get_po_nos("Sales Order", "against_sales_order", po_nos)
+		self.get_po_nos("Sales Invoice", "against_sales_invoice", po_nos)
+		self.po_no = ", ".join(list(set(x.strip() for x in ",".join(po_nos).split(","))))
 
 	def get_po_nos(self, ref_doctype, ref_fieldname, po_nos):
 		doc_list = list(set(d.get(ref_fieldname) for d in self.items if d.get(ref_fieldname)))
 		if doc_list:
-			po_nos += [d.po_no for d in frappe.get_all(ref_doctype, 'po_no', filters = {'name': ('in', doc_list)}) if d.get('po_no')]
+			po_nos += [
+				d.po_no
+				for d in frappe.get_all(ref_doctype, "po_no", filters={"name": ("in", doc_list)})
+				if d.get("po_no")
+			]
 
 	def set_gross_profit(self):
 		if self.doctype in ["Sales Order", "Quotation"]:
 			for item in self.items:
-				item.gross_profit = flt(((item.base_rate - item.valuation_rate) * item.stock_qty), self.precision("amount", item))
-
+				item.gross_profit = flt(
+					((item.base_rate - item.valuation_rate) * item.stock_qty), self.precision("amount", item)
+				)
 
 	def set_customer_address(self):
 		address_dict = {
-			'customer_address': 'address_display',
-			'shipping_address_name': 'shipping_address',
-			'company_address': 'company_address_display'
+			"customer_address": "address_display",
+			"shipping_address_name": "shipping_address",
+			"company_address": "company_address_display",
 		}
 
 		for address_field, address_display_field in address_dict.items():
@@ -537,15 +584,31 @@
 		if self.doctype == "POS Invoice":
 			return
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if self.doctype == "Sales Invoice":
-				stock_items = [d.item_code, d.description, d.warehouse, d.sales_order or d.delivery_note, d.batch_no or '']
+				stock_items = [
+					d.item_code,
+					d.description,
+					d.warehouse,
+					d.sales_order or d.delivery_note,
+					d.batch_no or "",
+				]
 				non_stock_items = [d.item_code, d.description, d.sales_order or d.delivery_note]
 			elif self.doctype == "Delivery Note":
-				stock_items = [d.item_code, d.description, d.warehouse, d.against_sales_order or d.against_sales_invoice, d.batch_no or '']
-				non_stock_items = [d.item_code, d.description, d.against_sales_order or d.against_sales_invoice]
+				stock_items = [
+					d.item_code,
+					d.description,
+					d.warehouse,
+					d.against_sales_order or d.against_sales_invoice,
+					d.batch_no or "",
+				]
+				non_stock_items = [
+					d.item_code,
+					d.description,
+					d.against_sales_order or d.against_sales_invoice,
+				]
 			elif self.doctype in ["Sales Order", "Quotation"]:
-				stock_items = [d.item_code, d.description, d.warehouse, '']
+				stock_items = [d.item_code, d.description, d.warehouse, ""]
 				non_stock_items = [d.item_code, d.description]
 
 			if frappe.db.get_value("Item", d.item_code, "is_stock_item") == 1:
@@ -553,7 +616,7 @@
 				duplicate_items_msg += "<br><br>"
 				duplicate_items_msg += _("Please enable {} in {} to allow same item in multiple rows").format(
 					frappe.bold("Allow Item to Be Added Multiple Times in a Transaction"),
-					get_link_to_form("Selling Settings", "Selling Settings")
+					get_link_to_form("Selling Settings", "Selling Settings"),
 				)
 				if stock_items in check_list:
 					frappe.throw(duplicate_items_msg)
@@ -571,22 +634,26 @@
 		for d in items:
 			if d.get("target_warehouse") and d.get("warehouse") == d.get("target_warehouse"):
 				warehouse = frappe.bold(d.get("target_warehouse"))
-				frappe.throw(_("Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same")
-					.format(d.idx, warehouse, warehouse))
+				frappe.throw(
+					_("Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same").format(
+						d.idx, warehouse, warehouse
+					)
+				)
 
 		if not self.get("is_internal_customer") and any(d.get("target_warehouse") for d in items):
 			msg = _("Target Warehouse is set for some items but the customer is not an internal customer.")
 			msg += " " + _("This {} will be treated as material transfer.").format(_(self.doctype))
 			frappe.msgprint(msg, title="Internal Transfer", alert=True)
 
-
 	def validate_items(self):
 		# validate items to see if they have is_sales_item enabled
 		from erpnext.controllers.buying_controller import validate_item_type
+
 		validate_item_type(self, "is_sales_item", "sales")
 
+
 def set_default_income_account_for_item(obj):
 	for d in obj.get("items"):
 		if d.item_code:
 			if getattr(d, "income_account", None):
-				set_item_default(d.item_code, obj.company, 'income_account', d.income_account)
+				set_item_default(d.item_code, obj.company, "income_account", d.income_account)
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index affde4a..3c0a10e 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -8,12 +8,15 @@
 from frappe.utils import comma_or, flt, getdate, now, nowdate
 
 
-class OverAllowanceError(frappe.ValidationError): pass
+class OverAllowanceError(frappe.ValidationError):
+	pass
+
 
 def validate_status(status, options):
 	if status not in options:
 		frappe.throw(_("Status must be one of {0}").format(comma_or(options)))
 
+
 status_map = {
 	"Lead": [
 		["Lost Quotation", "has_lost_quotation"],
@@ -26,7 +29,7 @@
 		["Lost", "has_lost_quotation"],
 		["Quotation", "has_active_quotation"],
 		["Converted", "has_ordered_quotation"],
-		["Closed", "eval:self.status=='Closed'"]
+		["Closed", "eval:self.status=='Closed'"],
 	],
 	"Quotation": [
 		["Draft", None],
@@ -37,20 +40,41 @@
 	],
 	"Sales Order": [
 		["Draft", None],
-		["To Deliver and Bill", "eval:self.per_delivered < 100 and self.per_billed < 100 and self.docstatus == 1"],
-		["To Bill", "eval:(self.per_delivered == 100 or self.skip_delivery_note) and self.per_billed < 100 and self.docstatus == 1"],
-		["To Deliver", "eval:self.per_delivered < 100 and self.per_billed == 100 and self.docstatus == 1 and not self.skip_delivery_note"],
-		["Completed", "eval:(self.per_delivered == 100 or self.skip_delivery_note) and self.per_billed == 100 and self.docstatus == 1"],
+		[
+			"To Deliver and Bill",
+			"eval:self.per_delivered < 100 and self.per_billed < 100 and self.docstatus == 1",
+		],
+		[
+			"To Bill",
+			"eval:(self.per_delivered == 100 or self.skip_delivery_note) and self.per_billed < 100 and self.docstatus == 1",
+		],
+		[
+			"To Deliver",
+			"eval:self.per_delivered < 100 and self.per_billed == 100 and self.docstatus == 1 and not self.skip_delivery_note",
+		],
+		[
+			"Completed",
+			"eval:(self.per_delivered == 100 or self.skip_delivery_note) and self.per_billed == 100 and self.docstatus == 1",
+		],
 		["Cancelled", "eval:self.docstatus==2"],
 		["Closed", "eval:self.status=='Closed'"],
 		["On Hold", "eval:self.status=='On Hold'"],
 	],
 	"Purchase Order": [
 		["Draft", None],
-		["To Receive and Bill", "eval:self.per_received < 100 and self.per_billed < 100 and self.docstatus == 1"],
+		[
+			"To Receive and Bill",
+			"eval:self.per_received < 100 and self.per_billed < 100 and self.docstatus == 1",
+		],
 		["To Bill", "eval:self.per_received >= 100 and self.per_billed < 100 and self.docstatus == 1"],
-		["To Receive", "eval:self.per_received < 100 and self.per_billed == 100 and self.docstatus == 1"],
-		["Completed", "eval:self.per_received >= 100 and self.per_billed == 100 and self.docstatus == 1"],
+		[
+			"To Receive",
+			"eval:self.per_received < 100 and self.per_billed == 100 and self.docstatus == 1",
+		],
+		[
+			"Completed",
+			"eval:self.per_received >= 100 and self.per_billed == 100 and self.docstatus == 1",
+		],
 		["Delivered", "eval:self.status=='Delivered'"],
 		["Cancelled", "eval:self.docstatus==2"],
 		["On Hold", "eval:self.status=='On Hold'"],
@@ -77,18 +101,39 @@
 		["Stopped", "eval:self.status == 'Stopped'"],
 		["Cancelled", "eval:self.docstatus == 2"],
 		["Pending", "eval:self.status != 'Stopped' and self.per_ordered == 0 and self.docstatus == 1"],
-		["Ordered", "eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Purchase'"],
-		["Transferred", "eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Material Transfer'"],
-		["Issued", "eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Material Issue'"],
-		["Received", "eval:self.status != 'Stopped' and self.per_received == 100 and self.docstatus == 1 and self.material_request_type == 'Purchase'"],
-		["Partially Received", "eval:self.status != 'Stopped' and self.per_received > 0 and self.per_received < 100 and self.docstatus == 1 and self.material_request_type == 'Purchase'"],
-		["Partially Ordered", "eval:self.status != 'Stopped' and self.per_ordered < 100 and self.per_ordered > 0 and self.docstatus == 1"],
-		["Manufactured", "eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Manufacture'"]
+		[
+			"Ordered",
+			"eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Purchase'",
+		],
+		[
+			"Transferred",
+			"eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Material Transfer'",
+		],
+		[
+			"Issued",
+			"eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Material Issue'",
+		],
+		[
+			"Received",
+			"eval:self.status != 'Stopped' and self.per_received == 100 and self.docstatus == 1 and self.material_request_type == 'Purchase'",
+		],
+		[
+			"Partially Received",
+			"eval:self.status != 'Stopped' and self.per_received > 0 and self.per_received < 100 and self.docstatus == 1 and self.material_request_type == 'Purchase'",
+		],
+		[
+			"Partially Ordered",
+			"eval:self.status != 'Stopped' and self.per_ordered < 100 and self.per_ordered > 0 and self.docstatus == 1",
+		],
+		[
+			"Manufactured",
+			"eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Manufacture'",
+		],
 	],
 	"Bank Transaction": [
 		["Unreconciled", "eval:self.docstatus == 1 and self.unallocated_amount>0"],
 		["Reconciled", "eval:self.docstatus == 1 and self.unallocated_amount<=0"],
-		["Cancelled", "eval:self.docstatus == 2"]
+		["Cancelled", "eval:self.docstatus == 2"],
 	],
 	"POS Opening Entry": [
 		["Draft", None],
@@ -106,15 +151,16 @@
 	"Transaction Deletion Record": [
 		["Draft", None],
 		["Completed", "eval:self.docstatus == 1"],
-	]
+	],
 }
 
+
 class StatusUpdater(Document):
 	"""
-		Updates the status of the calling records
-		Delivery Note: Update Delivered Qty, Update Percent and Validate over delivery
-		Sales Invoice: Update Billed Amt, Update Percent and Validate over billing
-		Installation Note: Update Installed Qty, Update Percent Qty and Validate over installation
+	Updates the status of the calling records
+	Delivery Note: Update Delivered Qty, Update Percent and Validate over delivery
+	Sales Invoice: Update Billed Amt, Update Percent and Validate over billing
+	Installation Note: Update Installed Qty, Update Percent Qty and Validate over installation
 	"""
 
 	def update_prevdoc_status(self):
@@ -123,8 +169,8 @@
 
 	def set_status(self, update=False, status=None, update_modified=True):
 		if self.is_new():
-			if self.get('amended_from'):
-				self.status = 'Draft'
+			if self.get("amended_from"):
+				self.status = "Draft"
 			return
 
 		if self.doctype in status_map:
@@ -139,20 +185,33 @@
 					self.status = s[0]
 					break
 				elif s[1].startswith("eval:"):
-					if frappe.safe_eval(s[1][5:], None, { "self": self.as_dict(), "getdate": getdate,
-							"nowdate": nowdate, "get_value": frappe.db.get_value }):
+					if frappe.safe_eval(
+						s[1][5:],
+						None,
+						{
+							"self": self.as_dict(),
+							"getdate": getdate,
+							"nowdate": nowdate,
+							"get_value": frappe.db.get_value,
+						},
+					):
 						self.status = s[0]
 						break
 				elif getattr(self, s[1])():
 					self.status = s[0]
 					break
 
-			if self.status != _status and self.status not in ("Cancelled", "Partially Ordered",
-																"Ordered", "Issued", "Transferred"):
+			if self.status != _status and self.status not in (
+				"Cancelled",
+				"Partially Ordered",
+				"Ordered",
+				"Issued",
+				"Transferred",
+			):
 				self.add_comment("Label", _(self.status))
 
 			if update:
-				self.db_set('status', self.status, update_modified = update_modified)
+				self.db_set("status", self.status, update_modified=update_modified)
 
 	def validate_qty(self):
 		"""Validates qty at row level"""
@@ -167,57 +226,78 @@
 
 			# get unique transactions to update
 			for d in self.get_all_children():
-				if hasattr(d, 'qty') and d.qty < 0 and not self.get('is_return'):
+				if hasattr(d, "qty") and d.qty < 0 and not self.get("is_return"):
 					frappe.throw(_("For an item {0}, quantity must be positive number").format(d.item_code))
 
-				if hasattr(d, 'qty') and d.qty > 0 and self.get('is_return'):
+				if hasattr(d, "qty") and d.qty > 0 and self.get("is_return"):
 					frappe.throw(_("For an item {0}, quantity must be negative number").format(d.item_code))
 
-				if d.doctype == args['source_dt'] and d.get(args["join_field"]):
-					args['name'] = d.get(args['join_field'])
+				if d.doctype == args["source_dt"] and d.get(args["join_field"]):
+					args["name"] = d.get(args["join_field"])
 
 					# get all qty where qty > target_field
-					item = frappe.db.sql("""select item_code, `{target_ref_field}`,
+					item = frappe.db.sql(
+						"""select item_code, `{target_ref_field}`,
 						`{target_field}`, parenttype, parent from `tab{target_dt}`
 						where `{target_ref_field}` < `{target_field}`
-						and name=%s and docstatus=1""".format(**args),
-						args['name'], as_dict=1)
+						and name=%s and docstatus=1""".format(
+							**args
+						),
+						args["name"],
+						as_dict=1,
+					)
 					if item:
 						item = item[0]
-						item['idx'] = d.idx
-						item['target_ref_field'] = args['target_ref_field'].replace('_', ' ')
+						item["idx"] = d.idx
+						item["target_ref_field"] = args["target_ref_field"].replace("_", " ")
 
 						# if not item[args['target_ref_field']]:
 						# 	msgprint(_("Note: System will not check over-delivery and over-booking for Item {0} as quantity or amount is 0").format(item.item_code))
-						if args.get('no_allowance'):
-							item['reduce_by'] = item[args['target_field']] - item[args['target_ref_field']]
-							if item['reduce_by'] > .01:
+						if args.get("no_allowance"):
+							item["reduce_by"] = item[args["target_field"]] - item[args["target_ref_field"]]
+							if item["reduce_by"] > 0.01:
 								self.limits_crossed_error(args, item, "qty")
 
-						elif item[args['target_ref_field']]:
+						elif item[args["target_ref_field"]]:
 							self.check_overflow_with_allowance(item, args)
 
 	def check_overflow_with_allowance(self, item, args):
 		"""
-			Checks if there is overflow condering a relaxation allowance
+		Checks if there is overflow condering a relaxation allowance
 		"""
-		qty_or_amount = "qty" if "qty" in args['target_ref_field'] else "amount"
+		qty_or_amount = "qty" if "qty" in args["target_ref_field"] else "amount"
 
 		# check if overflow is within allowance
-		allowance, self.item_allowance, self.global_qty_allowance, self.global_amount_allowance = \
-			get_allowance_for(item['item_code'], self.item_allowance,
-				self.global_qty_allowance, self.global_amount_allowance, qty_or_amount)
+		(
+			allowance,
+			self.item_allowance,
+			self.global_qty_allowance,
+			self.global_amount_allowance,
+		) = get_allowance_for(
+			item["item_code"],
+			self.item_allowance,
+			self.global_qty_allowance,
+			self.global_amount_allowance,
+			qty_or_amount,
+		)
 
-		role_allowed_to_over_deliver_receive = frappe.db.get_single_value('Stock Settings', 'role_allowed_to_over_deliver_receive')
-		role_allowed_to_over_bill = frappe.db.get_single_value('Accounts Settings', 'role_allowed_to_over_bill')
-		role = role_allowed_to_over_deliver_receive if qty_or_amount == 'qty' else role_allowed_to_over_bill
+		role_allowed_to_over_deliver_receive = frappe.db.get_single_value(
+			"Stock Settings", "role_allowed_to_over_deliver_receive"
+		)
+		role_allowed_to_over_bill = frappe.db.get_single_value(
+			"Accounts Settings", "role_allowed_to_over_bill"
+		)
+		role = (
+			role_allowed_to_over_deliver_receive if qty_or_amount == "qty" else role_allowed_to_over_bill
+		)
 
-		overflow_percent = ((item[args['target_field']] - item[args['target_ref_field']]) /
-			item[args['target_ref_field']]) * 100
+		overflow_percent = (
+			(item[args["target_field"]] - item[args["target_ref_field"]]) / item[args["target_ref_field"]]
+		) * 100
 
 		if overflow_percent - allowance > 0.01:
-			item['max_allowed'] = flt(item[args['target_ref_field']] * (100+allowance)/100)
-			item['reduce_by'] = item[args['target_field']] - item['max_allowed']
+			item["max_allowed"] = flt(item[args["target_ref_field"]] * (100 + allowance) / 100)
+			item["reduce_by"] = item[args["target_field"]] - item["max_allowed"]
 
 			if role not in frappe.get_roles():
 				self.limits_crossed_error(args, item, qty_or_amount)
@@ -225,45 +305,55 @@
 				self.warn_about_bypassing_with_role(item, qty_or_amount, role)
 
 	def limits_crossed_error(self, args, item, qty_or_amount):
-		'''Raise exception for limits crossed'''
+		"""Raise exception for limits crossed"""
 		if qty_or_amount == "qty":
-			action_msg = _('To allow over receipt / delivery, update "Over Receipt/Delivery Allowance" in Stock Settings or the Item.')
+			action_msg = _(
+				'To allow over receipt / delivery, update "Over Receipt/Delivery Allowance" in Stock Settings or the Item.'
+			)
 		else:
-			action_msg = _('To allow over billing, update "Over Billing Allowance" in Accounts Settings or the Item.')
+			action_msg = _(
+				'To allow over billing, update "Over Billing Allowance" in Accounts Settings or the Item.'
+			)
 
-		frappe.throw(_('This document is over limit by {0} {1} for item {4}. Are you making another {3} against the same {2}?')
-			.format(
+		frappe.throw(
+			_(
+				"This document is over limit by {0} {1} for item {4}. Are you making another {3} against the same {2}?"
+			).format(
 				frappe.bold(_(item["target_ref_field"].title())),
 				frappe.bold(item["reduce_by"]),
-				frappe.bold(_(args.get('target_dt'))),
+				frappe.bold(_(args.get("target_dt"))),
 				frappe.bold(_(self.doctype)),
-				frappe.bold(item.get('item_code'))
-			) + '<br><br>' + action_msg, OverAllowanceError, title = _('Limit Crossed'))
+				frappe.bold(item.get("item_code")),
+			)
+			+ "<br><br>"
+			+ action_msg,
+			OverAllowanceError,
+			title=_("Limit Crossed"),
+		)
 
 	def warn_about_bypassing_with_role(self, item, qty_or_amount, role):
 		action = _("Over Receipt/Delivery") if qty_or_amount == "qty" else _("Overbilling")
 
-		msg = (_("{} of {} {} ignored for item {} because you have {} role.")
-				.format(
-					action,
-					_(item["target_ref_field"].title()),
-					frappe.bold(item["reduce_by"]),
-					frappe.bold(item.get('item_code')),
-					role)
-				)
+		msg = _("{} of {} {} ignored for item {} because you have {} role.").format(
+			action,
+			_(item["target_ref_field"].title()),
+			frappe.bold(item["reduce_by"]),
+			frappe.bold(item.get("item_code")),
+			role,
+		)
 		frappe.msgprint(msg, indicator="orange", alert=True)
 
 	def update_qty(self, update_modified=True):
 		"""Updates qty or amount at row level
 
-			:param update_modified: If true, updates `modified` and `modified_by` for target parent doc
+		:param update_modified: If true, updates `modified` and `modified_by` for target parent doc
 		"""
 		for args in self.status_updater:
 			# condition to include current record (if submit or no if cancel)
 			if self.docstatus == 1:
-				args['cond'] = ' or parent="%s"' % self.name.replace('"', '\"')
+				args["cond"] = ' or parent="%s"' % self.name.replace('"', '"')
 			else:
-				args['cond'] = ' and parent!="%s"' % self.name.replace('"', '\"')
+				args["cond"] = ' and parent!="%s"' % self.name.replace('"', '"')
 
 			self._update_children(args, update_modified)
 
@@ -273,56 +363,73 @@
 	def _update_children(self, args, update_modified):
 		"""Update quantities or amount in child table"""
 		for d in self.get_all_children():
-			if d.doctype != args['source_dt']:
+			if d.doctype != args["source_dt"]:
 				continue
 
 			self._update_modified(args, update_modified)
 
 			# updates qty in the child table
-			args['detail_id'] = d.get(args['join_field'])
+			args["detail_id"] = d.get(args["join_field"])
 
-			args['second_source_condition'] = ""
-			if args.get('second_source_dt') and args.get('second_source_field') \
-					and args.get('second_join_field'):
+			args["second_source_condition"] = ""
+			if (
+				args.get("second_source_dt")
+				and args.get("second_source_field")
+				and args.get("second_join_field")
+			):
 				if not args.get("second_source_extra_cond"):
 					args["second_source_extra_cond"] = ""
 
-				args['second_source_condition'] = frappe.db.sql(""" select ifnull((select sum(%(second_source_field)s)
+				args["second_source_condition"] = frappe.db.sql(
+					""" select ifnull((select sum(%(second_source_field)s)
 					from `tab%(second_source_dt)s`
 					where `%(second_join_field)s`="%(detail_id)s"
 					and (`tab%(second_source_dt)s`.docstatus=1)
-					%(second_source_extra_cond)s), 0) """ % args)[0][0]
+					%(second_source_extra_cond)s), 0) """
+					% args
+				)[0][0]
 
-			if args['detail_id']:
-				if not args.get("extra_cond"): args["extra_cond"] = ""
+			if args["detail_id"]:
+				if not args.get("extra_cond"):
+					args["extra_cond"] = ""
 
-				args["source_dt_value"] = frappe.db.sql("""
+				args["source_dt_value"] = (
+					frappe.db.sql(
+						"""
 						(select ifnull(sum(%(source_field)s), 0)
 							from `tab%(source_dt)s` where `%(join_field)s`="%(detail_id)s"
 							and (docstatus=1 %(cond)s) %(extra_cond)s)
-				""" % args)[0][0] or 0.0
+				"""
+						% args
+					)[0][0]
+					or 0.0
+				)
 
-				if args['second_source_condition']:
-					args["source_dt_value"] += flt(args['second_source_condition'])
+				if args["second_source_condition"]:
+					args["source_dt_value"] += flt(args["second_source_condition"])
 
-				frappe.db.sql("""update `tab%(target_dt)s`
+				frappe.db.sql(
+					"""update `tab%(target_dt)s`
 					set %(target_field)s = %(source_dt_value)s %(update_modified)s
-					where name='%(detail_id)s'""" % args)
+					where name='%(detail_id)s'"""
+					% args
+				)
 
 	def _update_percent_field_in_targets(self, args, update_modified=True):
 		"""Update percent field in parent transaction"""
-		if args.get('percent_join_field_parent'):
+		if args.get("percent_join_field_parent"):
 			# if reference to target doc where % is to be updated, is
 			# in source doc's parent form, consider percent_join_field_parent
-			args['name'] = self.get(args['percent_join_field_parent'])
+			args["name"] = self.get(args["percent_join_field_parent"])
 			self._update_percent_field(args, update_modified)
 		else:
-			distinct_transactions = set(d.get(args['percent_join_field'])
-				for d in self.get_all_children(args['source_dt']))
+			distinct_transactions = set(
+				d.get(args["percent_join_field"]) for d in self.get_all_children(args["source_dt"])
+			)
 
 			for name in distinct_transactions:
 				if name:
-					args['name'] = name
+					args["name"] = name
 					self._update_percent_field(args, update_modified)
 
 	def _update_percent_field(self, args, update_modified=True):
@@ -330,23 +437,29 @@
 
 		self._update_modified(args, update_modified)
 
-		if args.get('target_parent_field'):
-			frappe.db.sql("""update `tab%(target_parent_dt)s`
+		if args.get("target_parent_field"):
+			frappe.db.sql(
+				"""update `tab%(target_parent_dt)s`
 				set %(target_parent_field)s = round(
 					ifnull((select
 						ifnull(sum(if(abs(%(target_ref_field)s) > abs(%(target_field)s), abs(%(target_field)s), abs(%(target_ref_field)s))), 0)
 						/ sum(abs(%(target_ref_field)s)) * 100
 					from `tab%(target_dt)s` where parent="%(name)s" having sum(abs(%(target_ref_field)s)) > 0), 0), 6)
 					%(update_modified)s
-				where name='%(name)s'""" % args)
+				where name='%(name)s'"""
+				% args
+			)
 
 			# update field
-			if args.get('status_field'):
-				frappe.db.sql("""update `tab%(target_parent_dt)s`
+			if args.get("status_field"):
+				frappe.db.sql(
+					"""update `tab%(target_parent_dt)s`
 					set %(status_field)s = if(%(target_parent_field)s<0.001,
 						'Not %(keyword)s', if(%(target_parent_field)s>=99.999999,
 						'Fully %(keyword)s', 'Partly %(keyword)s'))
-					where name='%(name)s'""" % args)
+					where name='%(name)s'"""
+					% args
+				)
 
 			if update_modified:
 				target = frappe.get_doc(args["target_parent_dt"], args["name"])
@@ -355,22 +468,24 @@
 
 	def _update_modified(self, args, update_modified):
 		if not update_modified:
-			args['update_modified'] = ''
+			args["update_modified"] = ""
 			return
 
-		args['update_modified'] = ', modified = {0}, modified_by = {1}'.format(
-			frappe.db.escape(now()),
-			frappe.db.escape(frappe.session.user)
+		args["update_modified"] = ", modified = {0}, modified_by = {1}".format(
+			frappe.db.escape(now()), frappe.db.escape(frappe.session.user)
 		)
 
 	def update_billing_status_for_zero_amount_refdoc(self, ref_dt):
 		ref_fieldname = frappe.scrub(ref_dt)
 
-		ref_docs = [item.get(ref_fieldname) for item in (self.get('items') or []) if item.get(ref_fieldname)]
+		ref_docs = [
+			item.get(ref_fieldname) for item in (self.get("items") or []) if item.get(ref_fieldname)
+		]
 		if not ref_docs:
 			return
 
-		zero_amount_refdocs = frappe.db.sql_list("""
+		zero_amount_refdocs = frappe.db.sql_list(
+			"""
 			SELECT
 				name
 			from
@@ -379,21 +494,34 @@
 				docstatus = 1
 				and base_net_total = 0
 				and name in %(ref_docs)s
-		""".format(ref_dt=ref_dt), {
-			'ref_docs': ref_docs
-		})
+		""".format(
+				ref_dt=ref_dt
+			),
+			{"ref_docs": ref_docs},
+		)
 
 		if zero_amount_refdocs:
 			self.update_billing_status(zero_amount_refdocs, ref_dt, ref_fieldname)
 
 	def update_billing_status(self, zero_amount_refdoc, ref_dt, ref_fieldname):
 		for ref_dn in zero_amount_refdoc:
-			ref_doc_qty = flt(frappe.db.sql("""select ifnull(sum(qty), 0) from `tab%s Item`
-				where parent=%s""" % (ref_dt, '%s'), (ref_dn))[0][0])
+			ref_doc_qty = flt(
+				frappe.db.sql(
+					"""select ifnull(sum(qty), 0) from `tab%s Item`
+				where parent=%s"""
+					% (ref_dt, "%s"),
+					(ref_dn),
+				)[0][0]
+			)
 
-			billed_qty = flt(frappe.db.sql("""select ifnull(sum(qty), 0)
-				from `tab%s Item` where %s=%s and docstatus=1""" %
-				(self.doctype, ref_fieldname, '%s'), (ref_dn))[0][0])
+			billed_qty = flt(
+				frappe.db.sql(
+					"""select ifnull(sum(qty), 0)
+				from `tab%s Item` where %s=%s and docstatus=1"""
+					% (self.doctype, ref_fieldname, "%s"),
+					(ref_dn),
+				)[0][0]
+			)
 
 			per_billed = (min(ref_doc_qty, billed_qty) / ref_doc_qty) * 100
 
@@ -402,7 +530,7 @@
 			ref_doc.db_set("per_billed", per_billed)
 
 			# set billling status
-			if hasattr(ref_doc, 'billing_status'):
+			if hasattr(ref_doc, "billing_status"):
 				if ref_doc.per_billed < 0.001:
 					ref_doc.db_set("billing_status", "Not Billed")
 				elif ref_doc.per_billed > 99.999999:
@@ -412,29 +540,51 @@
 
 			ref_doc.set_status(update=True)
 
-def get_allowance_for(item_code, item_allowance=None, global_qty_allowance=None, global_amount_allowance=None, qty_or_amount="qty"):
+
+def get_allowance_for(
+	item_code,
+	item_allowance=None,
+	global_qty_allowance=None,
+	global_amount_allowance=None,
+	qty_or_amount="qty",
+):
 	"""
-		Returns the allowance for the item, if not set, returns global allowance
+	Returns the allowance for the item, if not set, returns global allowance
 	"""
 	if item_allowance is None:
 		item_allowance = {}
 	if qty_or_amount == "qty":
 		if item_allowance.get(item_code, frappe._dict()).get("qty"):
-			return item_allowance[item_code].qty, item_allowance, global_qty_allowance, global_amount_allowance
+			return (
+				item_allowance[item_code].qty,
+				item_allowance,
+				global_qty_allowance,
+				global_amount_allowance,
+			)
 	else:
 		if item_allowance.get(item_code, frappe._dict()).get("amount"):
-			return item_allowance[item_code].amount, item_allowance, global_qty_allowance, global_amount_allowance
+			return (
+				item_allowance[item_code].amount,
+				item_allowance,
+				global_qty_allowance,
+				global_amount_allowance,
+			)
 
-	qty_allowance, over_billing_allowance = \
-		frappe.db.get_value('Item', item_code, ['over_delivery_receipt_allowance', 'over_billing_allowance'])
+	qty_allowance, over_billing_allowance = frappe.db.get_value(
+		"Item", item_code, ["over_delivery_receipt_allowance", "over_billing_allowance"]
+	)
 
 	if qty_or_amount == "qty" and not qty_allowance:
 		if global_qty_allowance == None:
-			global_qty_allowance = flt(frappe.db.get_single_value('Stock Settings', 'over_delivery_receipt_allowance'))
+			global_qty_allowance = flt(
+				frappe.db.get_single_value("Stock Settings", "over_delivery_receipt_allowance")
+			)
 		qty_allowance = global_qty_allowance
 	elif qty_or_amount == "amount" and not over_billing_allowance:
 		if global_amount_allowance == None:
-			global_amount_allowance = flt(frappe.db.get_single_value('Accounts Settings', 'over_billing_allowance'))
+			global_amount_allowance = flt(
+				frappe.db.get_single_value("Accounts Settings", "over_billing_allowance")
+			)
 		over_billing_allowance = global_amount_allowance
 
 	if qty_or_amount == "qty":
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 8972c32..feec42f 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -21,14 +21,22 @@
 from erpnext.stock.stock_ledger import get_items_to_be_repost
 
 
-class QualityInspectionRequiredError(frappe.ValidationError): pass
-class QualityInspectionRejectedError(frappe.ValidationError): pass
-class QualityInspectionNotSubmittedError(frappe.ValidationError): pass
+class QualityInspectionRequiredError(frappe.ValidationError):
+	pass
+
+
+class QualityInspectionRejectedError(frappe.ValidationError):
+	pass
+
+
+class QualityInspectionNotSubmittedError(frappe.ValidationError):
+	pass
+
 
 class StockController(AccountsController):
 	def validate(self):
 		super(StockController, self).validate()
-		if not self.get('is_return'):
+		if not self.get("is_return"):
 			self.validate_inspection()
 		self.validate_serialized_batch()
 		self.clean_serial_nos()
@@ -41,44 +49,56 @@
 		if self.docstatus == 2:
 			make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
 
-		provisional_accounting_for_non_stock_items = \
-			cint(frappe.db.get_value('Company', self.company, 'enable_provisional_accounting_for_non_stock_items'))
+		provisional_accounting_for_non_stock_items = cint(
+			frappe.db.get_value(
+				"Company", self.company, "enable_provisional_accounting_for_non_stock_items"
+			)
+		)
 
-		if cint(erpnext.is_perpetual_inventory_enabled(self.company)) or provisional_accounting_for_non_stock_items:
+		if (
+			cint(erpnext.is_perpetual_inventory_enabled(self.company))
+			or provisional_accounting_for_non_stock_items
+		):
 			warehouse_account = get_warehouse_account_map(self.company)
 
-			if self.docstatus==1:
+			if self.docstatus == 1:
 				if not gl_entries:
 					gl_entries = self.get_gl_entries(warehouse_account)
 				make_gl_entries(gl_entries, from_repost=from_repost)
 
-		elif self.doctype in ['Purchase Receipt', 'Purchase Invoice'] and self.docstatus == 1:
+		elif self.doctype in ["Purchase Receipt", "Purchase Invoice"] and self.docstatus == 1:
 			gl_entries = []
 			gl_entries = self.get_asset_gl_entry(gl_entries)
 			make_gl_entries(gl_entries, from_repost=from_repost)
 
 	def validate_serialized_batch(self):
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
 		for d in self.get("items"):
-			if hasattr(d, 'serial_no') and hasattr(d, 'batch_no') and d.serial_no and d.batch_no:
-				serial_nos = frappe.get_all("Serial No",
+			if hasattr(d, "serial_no") and hasattr(d, "batch_no") and d.serial_no and d.batch_no:
+				serial_nos = frappe.get_all(
+					"Serial No",
 					fields=["batch_no", "name", "warehouse"],
-					filters={
-						"name": ("in", get_serial_nos(d.serial_no))
-					}
+					filters={"name": ("in", get_serial_nos(d.serial_no))},
 				)
 
 				for row in serial_nos:
 					if row.warehouse and row.batch_no != d.batch_no:
-						frappe.throw(_("Row #{0}: Serial No {1} does not belong to Batch {2}")
-							.format(d.idx, row.name, d.batch_no))
+						frappe.throw(
+							_("Row #{0}: Serial No {1} does not belong to Batch {2}").format(
+								d.idx, row.name, d.batch_no
+							)
+						)
 
 			if flt(d.qty) > 0.0 and d.get("batch_no") and self.get("posting_date") and self.docstatus < 2:
 				expiry_date = frappe.get_cached_value("Batch", d.get("batch_no"), "expiry_date")
 
 				if expiry_date and getdate(expiry_date) < getdate(self.posting_date):
-					frappe.throw(_("Row #{0}: The batch {1} has already expired.")
-						.format(d.idx, get_link_to_form("Batch", d.get("batch_no"))))
+					frappe.throw(
+						_("Row #{0}: The batch {1} has already expired.").format(
+							d.idx, get_link_to_form("Batch", d.get("batch_no"))
+						)
+					)
 
 	def clean_serial_nos(self):
 		from erpnext.stock.doctype.serial_no.serial_no import clean_serial_no_string
@@ -88,13 +108,14 @@
 				# remove extra whitespace and store one serial no on each line
 				row.serial_no = clean_serial_no_string(row.serial_no)
 
-		for row in self.get('packed_items') or []:
+		for row in self.get("packed_items") or []:
 			if hasattr(row, "serial_no") and row.serial_no:
 				# remove extra whitespace and store one serial no on each line
 				row.serial_no = clean_serial_no_string(row.serial_no)
 
-	def get_gl_entries(self, warehouse_account=None, default_expense_account=None,
-			default_cost_center=None):
+	def get_gl_entries(
+		self, warehouse_account=None, default_expense_account=None, default_cost_center=None
+	):
 
 		if not warehouse_account:
 			warehouse_account = get_warehouse_account_map(self.company)
@@ -116,44 +137,61 @@
 						self.check_expense_account(item_row)
 
 						# expense account/ target_warehouse / source_warehouse
-						if item_row.get('target_warehouse'):
-							warehouse = item_row.get('target_warehouse')
+						if item_row.get("target_warehouse"):
+							warehouse = item_row.get("target_warehouse")
 							expense_account = warehouse_account[warehouse]["account"]
 						else:
 							expense_account = item_row.expense_account
 
-						gl_list.append(self.get_gl_dict({
-							"account": warehouse_account[sle.warehouse]["account"],
-							"against": expense_account,
-							"cost_center": item_row.cost_center,
-							"project": item_row.project or self.get('project'),
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"debit": flt(sle.stock_value_difference, precision),
-							"is_opening": item_row.get("is_opening") or self.get("is_opening") or "No",
-						}, warehouse_account[sle.warehouse]["account_currency"], item=item_row))
+						gl_list.append(
+							self.get_gl_dict(
+								{
+									"account": warehouse_account[sle.warehouse]["account"],
+									"against": expense_account,
+									"cost_center": item_row.cost_center,
+									"project": item_row.project or self.get("project"),
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"debit": flt(sle.stock_value_difference, precision),
+									"is_opening": item_row.get("is_opening") or self.get("is_opening") or "No",
+								},
+								warehouse_account[sle.warehouse]["account_currency"],
+								item=item_row,
+							)
+						)
 
-						gl_list.append(self.get_gl_dict({
-							"account": expense_account,
-							"against": warehouse_account[sle.warehouse]["account"],
-							"cost_center": item_row.cost_center,
-							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-							"credit": flt(sle.stock_value_difference, precision),
-							"project": item_row.get("project") or self.get("project"),
-							"is_opening": item_row.get("is_opening") or self.get("is_opening") or "No"
-						}, item=item_row))
+						gl_list.append(
+							self.get_gl_dict(
+								{
+									"account": expense_account,
+									"against": warehouse_account[sle.warehouse]["account"],
+									"cost_center": item_row.cost_center,
+									"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+									"credit": flt(sle.stock_value_difference, precision),
+									"project": item_row.get("project") or self.get("project"),
+									"is_opening": item_row.get("is_opening") or self.get("is_opening") or "No",
+								},
+								item=item_row,
+							)
+						)
 					elif sle.warehouse not in warehouse_with_no_account:
 						warehouse_with_no_account.append(sle.warehouse)
 
 		if warehouse_with_no_account:
 			for wh in warehouse_with_no_account:
 				if frappe.db.get_value("Warehouse", wh, "company"):
-					frappe.throw(_("Warehouse {0} is not linked to any account, please mention the account in the warehouse record or set default inventory account in company {1}.").format(wh, self.company))
+					frappe.throw(
+						_(
+							"Warehouse {0} is not linked to any account, please mention the account in the warehouse record or set default inventory account in company {1}."
+						).format(wh, self.company)
+					)
 
 		return process_gl_map(gl_list, precision=precision)
 
 	def get_debit_field_precision(self):
 		if not frappe.flags.debit_field_precision:
-			frappe.flags.debit_field_precision = frappe.get_precision("GL Entry", "debit_in_account_currency")
+			frappe.flags.debit_field_precision = frappe.get_precision(
+				"GL Entry", "debit_in_account_currency"
+			)
 
 		return frappe.flags.debit_field_precision
 
@@ -163,12 +201,16 @@
 			is_opening = "Yes" if reconciliation_purpose == "Opening Stock" else "No"
 			details = []
 			for voucher_detail_no in sle_map:
-				details.append(frappe._dict({
-					"name": voucher_detail_no,
-					"expense_account": default_expense_account,
-					"cost_center": default_cost_center,
-					"is_opening": is_opening
-				}))
+				details.append(
+					frappe._dict(
+						{
+							"name": voucher_detail_no,
+							"expense_account": default_expense_account,
+							"cost_center": default_cost_center,
+							"is_opening": is_opening,
+						}
+					)
+				)
 			return details
 		else:
 			details = self.get("items")
@@ -207,7 +249,8 @@
 
 	def get_stock_ledger_details(self):
 		stock_ledger = {}
-		stock_ledger_entries = frappe.db.sql("""
+		stock_ledger_entries = frappe.db.sql(
+			"""
 			select
 				name, warehouse, stock_value_difference, valuation_rate,
 				voucher_detail_no, item_code, posting_date, posting_time,
@@ -216,110 +259,154 @@
 				`tabStock Ledger Entry`
 			where
 				voucher_type=%s and voucher_no=%s and is_cancelled = 0
-		""", (self.doctype, self.name), as_dict=True)
+		""",
+			(self.doctype, self.name),
+			as_dict=True,
+		)
 
 		for sle in stock_ledger_entries:
 			stock_ledger.setdefault(sle.voucher_detail_no, []).append(sle)
 		return stock_ledger
 
 	def make_batches(self, warehouse_field):
-		'''Create batches if required. Called before submit'''
+		"""Create batches if required. Called before submit"""
 		for d in self.items:
 			if d.get(warehouse_field) and not d.batch_no:
-				has_batch_no, create_new_batch = frappe.db.get_value('Item', d.item_code, ['has_batch_no', 'create_new_batch'])
+				has_batch_no, create_new_batch = frappe.db.get_value(
+					"Item", d.item_code, ["has_batch_no", "create_new_batch"]
+				)
 				if has_batch_no and create_new_batch:
-					d.batch_no = frappe.get_doc(dict(
-						doctype='Batch',
-						item=d.item_code,
-						supplier=getattr(self, 'supplier', None),
-						reference_doctype=self.doctype,
-						reference_name=self.name)).insert().name
+					d.batch_no = (
+						frappe.get_doc(
+							dict(
+								doctype="Batch",
+								item=d.item_code,
+								supplier=getattr(self, "supplier", None),
+								reference_doctype=self.doctype,
+								reference_name=self.name,
+							)
+						)
+						.insert()
+						.name
+					)
 
 	def check_expense_account(self, item):
 		if not item.get("expense_account"):
 			msg = _("Please set an Expense Account in the Items table")
-			frappe.throw(_("Row #{0}: Expense Account not set for the Item {1}. {2}")
-				.format(item.idx, frappe.bold(item.item_code), msg), title=_("Expense Account Missing"))
+			frappe.throw(
+				_("Row #{0}: Expense Account not set for the Item {1}. {2}").format(
+					item.idx, frappe.bold(item.item_code), msg
+				),
+				title=_("Expense Account Missing"),
+			)
 
 		else:
-			is_expense_account = frappe.get_cached_value("Account",
-				item.get("expense_account"), "report_type")=="Profit and Loss"
-			if self.doctype not in ("Purchase Receipt", "Purchase Invoice", "Stock Reconciliation", "Stock Entry") and not is_expense_account:
-				frappe.throw(_("Expense / Difference account ({0}) must be a 'Profit or Loss' account")
-					.format(item.get("expense_account")))
+			is_expense_account = (
+				frappe.get_cached_value("Account", item.get("expense_account"), "report_type")
+				== "Profit and Loss"
+			)
+			if (
+				self.doctype
+				not in ("Purchase Receipt", "Purchase Invoice", "Stock Reconciliation", "Stock Entry")
+				and not is_expense_account
+			):
+				frappe.throw(
+					_("Expense / Difference account ({0}) must be a 'Profit or Loss' account").format(
+						item.get("expense_account")
+					)
+				)
 			if is_expense_account and not item.get("cost_center"):
-				frappe.throw(_("{0} {1}: Cost Center is mandatory for Item {2}").format(
-					_(self.doctype), self.name, item.get("item_code")))
+				frappe.throw(
+					_("{0} {1}: Cost Center is mandatory for Item {2}").format(
+						_(self.doctype), self.name, item.get("item_code")
+					)
+				)
 
 	def delete_auto_created_batches(self):
 		for d in self.items:
-			if not d.batch_no: continue
+			if not d.batch_no:
+				continue
 
-			frappe.db.set_value("Serial No", {"batch_no": d.batch_no, "status": "Inactive"}, "batch_no", None)
+			frappe.db.set_value(
+				"Serial No", {"batch_no": d.batch_no, "status": "Inactive"}, "batch_no", None
+			)
 
 			d.batch_no = None
 			d.db_set("batch_no", None)
 
-		for data in frappe.get_all("Batch",
-			{'reference_name': self.name, 'reference_doctype': self.doctype}):
+		for data in frappe.get_all(
+			"Batch", {"reference_name": self.name, "reference_doctype": self.doctype}
+		):
 			frappe.delete_doc("Batch", data.name)
 
 	def get_sl_entries(self, d, args):
-		sl_dict = frappe._dict({
-			"item_code": d.get("item_code", None),
-			"warehouse": d.get("warehouse", None),
-			"posting_date": self.posting_date,
-			"posting_time": self.posting_time,
-			'fiscal_year': get_fiscal_year(self.posting_date, company=self.company)[0],
-			"voucher_type": self.doctype,
-			"voucher_no": self.name,
-			"voucher_detail_no": d.name,
-			"actual_qty": (self.docstatus==1 and 1 or -1)*flt(d.get("stock_qty")),
-			"stock_uom": frappe.db.get_value("Item", args.get("item_code") or d.get("item_code"), "stock_uom"),
-			"incoming_rate": 0,
-			"company": self.company,
-			"batch_no": cstr(d.get("batch_no")).strip(),
-			"serial_no": d.get("serial_no"),
-			"project": d.get("project") or self.get('project'),
-			"is_cancelled": 1 if self.docstatus==2 else 0
-		})
+		sl_dict = frappe._dict(
+			{
+				"item_code": d.get("item_code", None),
+				"warehouse": d.get("warehouse", None),
+				"posting_date": self.posting_date,
+				"posting_time": self.posting_time,
+				"fiscal_year": get_fiscal_year(self.posting_date, company=self.company)[0],
+				"voucher_type": self.doctype,
+				"voucher_no": self.name,
+				"voucher_detail_no": d.name,
+				"actual_qty": (self.docstatus == 1 and 1 or -1) * flt(d.get("stock_qty")),
+				"stock_uom": frappe.db.get_value(
+					"Item", args.get("item_code") or d.get("item_code"), "stock_uom"
+				),
+				"incoming_rate": 0,
+				"company": self.company,
+				"batch_no": cstr(d.get("batch_no")).strip(),
+				"serial_no": d.get("serial_no"),
+				"project": d.get("project") or self.get("project"),
+				"is_cancelled": 1 if self.docstatus == 2 else 0,
+			}
+		)
 
 		sl_dict.update(args)
 		return sl_dict
 
-	def make_sl_entries(self, sl_entries, allow_negative_stock=False,
-			via_landed_cost_voucher=False):
+	def make_sl_entries(self, sl_entries, allow_negative_stock=False, via_landed_cost_voucher=False):
 		from erpnext.stock.stock_ledger import make_sl_entries
+
 		make_sl_entries(sl_entries, allow_negative_stock, via_landed_cost_voucher)
 
 	def make_gl_entries_on_cancel(self):
-		if frappe.db.sql("""select name from `tabGL Entry` where voucher_type=%s
-			and voucher_no=%s""", (self.doctype, self.name)):
-				self.make_gl_entries()
+		if frappe.db.sql(
+			"""select name from `tabGL Entry` where voucher_type=%s
+			and voucher_no=%s""",
+			(self.doctype, self.name),
+		):
+			self.make_gl_entries()
 
 	def get_serialized_items(self):
 		serialized_items = []
 		item_codes = list(set(d.item_code for d in self.get("items")))
 		if item_codes:
-			serialized_items = frappe.db.sql_list("""select name from `tabItem`
-				where has_serial_no=1 and name in ({})""".format(", ".join(["%s"]*len(item_codes))),
-				tuple(item_codes))
+			serialized_items = frappe.db.sql_list(
+				"""select name from `tabItem`
+				where has_serial_no=1 and name in ({})""".format(
+					", ".join(["%s"] * len(item_codes))
+				),
+				tuple(item_codes),
+			)
 
 		return serialized_items
 
 	def validate_warehouse(self):
 		from erpnext.stock.utils import validate_disabled_warehouse, validate_warehouse_company
 
-		warehouses = list(set(d.warehouse for d in
-			self.get("items") if getattr(d, "warehouse", None)))
+		warehouses = list(set(d.warehouse for d in self.get("items") if getattr(d, "warehouse", None)))
 
-		target_warehouses = list(set([d.target_warehouse for d in
-			self.get("items") if getattr(d, "target_warehouse", None)]))
+		target_warehouses = list(
+			set([d.target_warehouse for d in self.get("items") if getattr(d, "target_warehouse", None)])
+		)
 
 		warehouses.extend(target_warehouses)
 
-		from_warehouse = list(set([d.from_warehouse for d in
-			self.get("items") if getattr(d, "from_warehouse", None)]))
+		from_warehouse = list(
+			set([d.from_warehouse for d in self.get("items") if getattr(d, "from_warehouse", None)])
+		)
 
 		warehouses.extend(from_warehouse)
 
@@ -332,14 +419,17 @@
 		if self.doctype == "Delivery Note":
 			target_ref_field = "amount - (returned_qty * rate)"
 
-		self._update_percent_field({
-			"target_dt": self.doctype + " Item",
-			"target_parent_dt": self.doctype,
-			"target_parent_field": "per_billed",
-			"target_ref_field": target_ref_field,
-			"target_field": "billed_amt",
-			"name": self.name,
-		}, update_modified)
+		self._update_percent_field(
+			{
+				"target_dt": self.doctype + " Item",
+				"target_parent_dt": self.doctype,
+				"target_parent_field": "per_billed",
+				"target_ref_field": target_ref_field,
+				"target_field": "billed_amt",
+				"name": self.name,
+			},
+			update_modified,
+		)
 
 	def validate_inspection(self):
 		"""Checks if quality inspection is set/ is valid for Items that require inspection."""
@@ -347,24 +437,28 @@
 			"Purchase Receipt": "inspection_required_before_purchase",
 			"Purchase Invoice": "inspection_required_before_purchase",
 			"Sales Invoice": "inspection_required_before_delivery",
-			"Delivery Note": "inspection_required_before_delivery"
+			"Delivery Note": "inspection_required_before_delivery",
 		}
 		inspection_required_fieldname = inspection_fieldname_map.get(self.doctype)
 
 		# return if inspection is not required on document level
-		if ((not inspection_required_fieldname and self.doctype != "Stock Entry") or
-			(self.doctype == "Stock Entry" and not self.inspection_required) or
-			(self.doctype in ["Sales Invoice", "Purchase Invoice"] and not self.update_stock)):
-				return
+		if (
+			(not inspection_required_fieldname and self.doctype != "Stock Entry")
+			or (self.doctype == "Stock Entry" and not self.inspection_required)
+			or (self.doctype in ["Sales Invoice", "Purchase Invoice"] and not self.update_stock)
+		):
+			return
 
-		for row in self.get('items'):
+		for row in self.get("items"):
 			qi_required = False
-			if (inspection_required_fieldname and frappe.db.get_value("Item", row.item_code, inspection_required_fieldname)):
+			if inspection_required_fieldname and frappe.db.get_value(
+				"Item", row.item_code, inspection_required_fieldname
+			):
 				qi_required = True
 			elif self.doctype == "Stock Entry" and row.t_warehouse:
-				qi_required = True # inward stock needs inspection
+				qi_required = True  # inward stock needs inspection
 
-			if qi_required: # validate row only if inspection is required on item level
+			if qi_required:  # validate row only if inspection is required on item level
 				self.validate_qi_presence(row)
 				if self.docstatus == 1:
 					self.validate_qi_submission(row)
@@ -381,12 +475,16 @@
 
 	def validate_qi_submission(self, row):
 		"""Check if QI is submitted on row level, during submission"""
-		action = frappe.db.get_single_value("Stock Settings", "action_if_quality_inspection_is_not_submitted")
+		action = frappe.db.get_single_value(
+			"Stock Settings", "action_if_quality_inspection_is_not_submitted"
+		)
 		qa_docstatus = frappe.db.get_value("Quality Inspection", row.quality_inspection, "docstatus")
 
 		if not qa_docstatus == 1:
-			link = frappe.utils.get_link_to_form('Quality Inspection', row.quality_inspection)
-			msg = f"Row #{row.idx}: Quality Inspection {link} is not submitted for the item: {row.item_code}"
+			link = frappe.utils.get_link_to_form("Quality Inspection", row.quality_inspection)
+			msg = (
+				f"Row #{row.idx}: Quality Inspection {link} is not submitted for the item: {row.item_code}"
+			)
 			if action == "Stop":
 				frappe.throw(_(msg), title=_("Inspection Submission"), exc=QualityInspectionNotSubmittedError)
 			else:
@@ -398,7 +496,7 @@
 		qa_status = frappe.db.get_value("Quality Inspection", row.quality_inspection, "status")
 
 		if qa_status == "Rejected":
-			link = frappe.utils.get_link_to_form('Quality Inspection', row.quality_inspection)
+			link = frappe.utils.get_link_to_form("Quality Inspection", row.quality_inspection)
 			msg = f"Row #{row.idx}: Quality Inspection {link} was rejected for item {row.item_code}"
 			if action == "Stop":
 				frappe.throw(_(msg), title=_("Inspection Rejected"), exc=QualityInspectionRejectedError)
@@ -411,48 +509,71 @@
 			frappe.get_doc("Blanket Order", blanket_order).update_ordered_qty()
 
 	def validate_customer_provided_item(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			# Customer Provided parts will have zero valuation rate
-			if frappe.db.get_value('Item', d.item_code, 'is_customer_provided_item'):
+			if frappe.db.get_value("Item", d.item_code, "is_customer_provided_item"):
 				d.allow_zero_valuation_rate = 1
 
 	def set_rate_of_stock_uom(self):
-		if self.doctype in ["Purchase Receipt", "Purchase Invoice", "Purchase Order", "Sales Invoice", "Sales Order", "Delivery Note", "Quotation"]:
+		if self.doctype in [
+			"Purchase Receipt",
+			"Purchase Invoice",
+			"Purchase Order",
+			"Sales Invoice",
+			"Sales Order",
+			"Delivery Note",
+			"Quotation",
+		]:
 			for d in self.get("items"):
 				d.stock_uom_rate = d.rate / (d.conversion_factor or 1)
 
 	def validate_internal_transfer(self):
-		if self.doctype in ('Sales Invoice', 'Delivery Note', 'Purchase Invoice', 'Purchase Receipt') \
-			and self.is_internal_transfer():
+		if (
+			self.doctype in ("Sales Invoice", "Delivery Note", "Purchase Invoice", "Purchase Receipt")
+			and self.is_internal_transfer()
+		):
 			self.validate_in_transit_warehouses()
 			self.validate_multi_currency()
 			self.validate_packed_items()
 
 	def validate_in_transit_warehouses(self):
-		if (self.doctype == 'Sales Invoice' and self.get('update_stock')) or self.doctype == 'Delivery Note':
-			for item in self.get('items'):
+		if (
+			self.doctype == "Sales Invoice" and self.get("update_stock")
+		) or self.doctype == "Delivery Note":
+			for item in self.get("items"):
 				if not item.target_warehouse:
-					frappe.throw(_("Row {0}: Target Warehouse is mandatory for internal transfers").format(item.idx))
+					frappe.throw(
+						_("Row {0}: Target Warehouse is mandatory for internal transfers").format(item.idx)
+					)
 
-		if (self.doctype == 'Purchase Invoice' and self.get('update_stock')) or self.doctype == 'Purchase Receipt':
-			for item in self.get('items'):
+		if (
+			self.doctype == "Purchase Invoice" and self.get("update_stock")
+		) or self.doctype == "Purchase Receipt":
+			for item in self.get("items"):
 				if not item.from_warehouse:
-					frappe.throw(_("Row {0}: From Warehouse is mandatory for internal transfers").format(item.idx))
+					frappe.throw(
+						_("Row {0}: From Warehouse is mandatory for internal transfers").format(item.idx)
+					)
 
 	def validate_multi_currency(self):
 		if self.currency != self.company_currency:
 			frappe.throw(_("Internal transfers can only be done in company's default currency"))
 
 	def validate_packed_items(self):
-		if self.doctype in ('Sales Invoice', 'Delivery Note Item') and self.get('packed_items'):
+		if self.doctype in ("Sales Invoice", "Delivery Note Item") and self.get("packed_items"):
 			frappe.throw(_("Packed Items cannot be transferred internally"))
 
 	def validate_putaway_capacity(self):
 		# if over receipt is attempted while 'apply putaway rule' is disabled
 		# and if rule was applied on the transaction, validate it.
 		from erpnext.stock.doctype.putaway_rule.putaway_rule import get_available_putaway_capacity
-		valid_doctype = self.doctype in ("Purchase Receipt", "Stock Entry", "Purchase Invoice",
-			"Stock Reconciliation")
+
+		valid_doctype = self.doctype in (
+			"Purchase Receipt",
+			"Stock Entry",
+			"Purchase Invoice",
+			"Stock Reconciliation",
+		)
 
 		if self.doctype == "Purchase Invoice" and self.get("update_stock") == 0:
 			valid_doctype = False
@@ -461,14 +582,15 @@
 			rule_map = defaultdict(dict)
 			for item in self.get("items"):
 				warehouse_field = "t_warehouse" if self.doctype == "Stock Entry" else "warehouse"
-				rule = frappe.db.get_value("Putaway Rule",
-					{
-						"item_code": item.get("item_code"),
-						"warehouse": item.get(warehouse_field)
-					},
-					["name", "disable"], as_dict=True)
+				rule = frappe.db.get_value(
+					"Putaway Rule",
+					{"item_code": item.get("item_code"), "warehouse": item.get(warehouse_field)},
+					["name", "disable"],
+					as_dict=True,
+				)
 				if rule:
-					if rule.get("disabled"): continue # dont validate for disabled rule
+					if rule.get("disabled"):
+						continue  # dont validate for disabled rule
 
 					if self.doctype == "Stock Reconciliation":
 						stock_qty = flt(item.qty)
@@ -489,46 +611,55 @@
 					frappe.throw(msg=message, title=_("Over Receipt"))
 
 	def prepare_over_receipt_message(self, rule, values):
-		message = _("{0} qty of Item {1} is being received into Warehouse {2} with capacity {3}.") \
-			.format(
-				frappe.bold(values["qty_put"]), frappe.bold(values["item"]),
-				frappe.bold(values["warehouse"]), frappe.bold(values["capacity"])
-			)
+		message = _(
+			"{0} qty of Item {1} is being received into Warehouse {2} with capacity {3}."
+		).format(
+			frappe.bold(values["qty_put"]),
+			frappe.bold(values["item"]),
+			frappe.bold(values["warehouse"]),
+			frappe.bold(values["capacity"]),
+		)
 		message += "<br><br>"
 		rule_link = frappe.utils.get_link_to_form("Putaway Rule", rule)
 		message += _("Please adjust the qty or edit {0} to proceed.").format(rule_link)
 		return message
 
 	def repost_future_sle_and_gle(self):
-		args = frappe._dict({
-			"posting_date": self.posting_date,
-			"posting_time": self.posting_time,
-			"voucher_type": self.doctype,
-			"voucher_no": self.name,
-			"company": self.company
-		})
+		args = frappe._dict(
+			{
+				"posting_date": self.posting_date,
+				"posting_time": self.posting_time,
+				"voucher_type": self.doctype,
+				"voucher_no": self.name,
+				"company": self.company,
+			}
+		)
 
 		if future_sle_exists(args) or repost_required_for_queue(self):
-			item_based_reposting =  cint(frappe.db.get_single_value("Stock Reposting Settings", "item_based_reposting"))
+			item_based_reposting = cint(
+				frappe.db.get_single_value("Stock Reposting Settings", "item_based_reposting")
+			)
 			if item_based_reposting:
 				create_item_wise_repost_entries(voucher_type=self.doctype, voucher_no=self.name)
 			else:
 				create_repost_item_valuation_entry(args)
 
+
 def repost_required_for_queue(doc: StockController) -> bool:
 	"""check if stock document contains repeated item-warehouse with queue based valuation.
 
 	if queue exists for repeated items then SLEs need to reprocessed in background again.
 	"""
 
-	consuming_sles = frappe.db.get_all("Stock Ledger Entry",
+	consuming_sles = frappe.db.get_all(
+		"Stock Ledger Entry",
 		filters={
 			"voucher_type": doc.doctype,
 			"voucher_no": doc.name,
 			"actual_qty": ("<", 0),
-			"is_cancelled": 0
+			"is_cancelled": 0,
 		},
-		fields=["item_code", "warehouse", "stock_queue"]
+		fields=["item_code", "warehouse", "stock_queue"],
 	)
 	item_warehouses = [(sle.item_code, sle.warehouse) for sle in consuming_sles]
 
@@ -551,32 +682,41 @@
 	inspections = []
 	for item in items:
 		if flt(item.get("sample_size")) > flt(item.get("qty")):
-			frappe.throw(_("{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})").format(
-				item_name=item.get("item_name"),
-				sample_size=item.get("sample_size"),
-				accepted_quantity=item.get("qty")
-			))
+			frappe.throw(
+				_(
+					"{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})"
+				).format(
+					item_name=item.get("item_name"),
+					sample_size=item.get("sample_size"),
+					accepted_quantity=item.get("qty"),
+				)
+			)
 
-		quality_inspection = frappe.get_doc({
-			"doctype": "Quality Inspection",
-			"inspection_type": "Incoming",
-			"inspected_by": frappe.session.user,
-			"reference_type": doctype,
-			"reference_name": docname,
-			"item_code": item.get("item_code"),
-			"description": item.get("description"),
-			"sample_size": flt(item.get("sample_size")),
-			"item_serial_no": item.get("serial_no").split("\n")[0] if item.get("serial_no") else None,
-			"batch_no": item.get("batch_no")
-		}).insert()
+		quality_inspection = frappe.get_doc(
+			{
+				"doctype": "Quality Inspection",
+				"inspection_type": "Incoming",
+				"inspected_by": frappe.session.user,
+				"reference_type": doctype,
+				"reference_name": docname,
+				"item_code": item.get("item_code"),
+				"description": item.get("description"),
+				"sample_size": flt(item.get("sample_size")),
+				"item_serial_no": item.get("serial_no").split("\n")[0] if item.get("serial_no") else None,
+				"batch_no": item.get("batch_no"),
+			}
+		).insert()
 		quality_inspection.save()
 		inspections.append(quality_inspection.name)
 
 	return inspections
 
+
 def is_reposting_pending():
-	return frappe.db.exists("Repost Item Valuation",
-		{'docstatus': 1, 'status': ['in', ['Queued','In Progress']]})
+	return frappe.db.exists(
+		"Repost Item Valuation", {"docstatus": 1, "status": ["in", ["Queued", "In Progress"]]}
+	)
+
 
 def future_sle_exists(args, sl_entries=None):
 	key = (args.voucher_type, args.voucher_no)
@@ -593,7 +733,8 @@
 
 	or_conditions = get_conditions_to_validate_future_sle(sl_entries)
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		select item_code, warehouse, count(name) as total_row
 		from `tabStock Ledger Entry` force index (item_warehouse)
 		where
@@ -604,43 +745,55 @@
 			and is_cancelled = 0
 		GROUP BY
 			item_code, warehouse
-		""".format(" or ".join(or_conditions)), args, as_dict=1)
+		""".format(
+			" or ".join(or_conditions)
+		),
+		args,
+		as_dict=1,
+	)
 
 	for d in data:
 		frappe.local.future_sle[key][(d.item_code, d.warehouse)] = d.total_row
 
 	return len(data)
 
-def validate_future_sle_not_exists(args, key, sl_entries=None):
-	item_key = ''
-	if args.get('item_code'):
-		item_key = (args.get('item_code'), args.get('warehouse'))
 
-	if not sl_entries and hasattr(frappe.local, 'future_sle'):
-		if (not frappe.local.future_sle.get(key) or
-			(item_key and item_key not in frappe.local.future_sle.get(key))):
+def validate_future_sle_not_exists(args, key, sl_entries=None):
+	item_key = ""
+	if args.get("item_code"):
+		item_key = (args.get("item_code"), args.get("warehouse"))
+
+	if not sl_entries and hasattr(frappe.local, "future_sle"):
+		if not frappe.local.future_sle.get(key) or (
+			item_key and item_key not in frappe.local.future_sle.get(key)
+		):
 			return True
 
+
 def get_cached_data(args, key):
-	if not hasattr(frappe.local, 'future_sle'):
+	if not hasattr(frappe.local, "future_sle"):
 		frappe.local.future_sle = {}
 
 	if key not in frappe.local.future_sle:
 		frappe.local.future_sle[key] = frappe._dict({})
 
-	if args.get('item_code'):
-		item_key = (args.get('item_code'), args.get('warehouse'))
+	if args.get("item_code"):
+		item_key = (args.get("item_code"), args.get("warehouse"))
 		count = frappe.local.future_sle[key].get(item_key)
 
 		return True if (count or count == 0) else False
 	else:
 		return frappe.local.future_sle[key]
 
+
 def get_sle_entries_against_voucher(args):
-	return frappe.get_all("Stock Ledger Entry",
+	return frappe.get_all(
+		"Stock Ledger Entry",
 		filters={"voucher_type": args.voucher_type, "voucher_no": args.voucher_no},
 		fields=["item_code", "warehouse"],
-		order_by="creation asc")
+		order_by="creation asc",
+	)
+
 
 def get_conditions_to_validate_future_sle(sl_entries):
 	warehouse_items_map = {}
@@ -654,16 +807,18 @@
 	for warehouse, items in warehouse_items_map.items():
 		or_conditions.append(
 			f"""warehouse = {frappe.db.escape(warehouse)}
-				and item_code in ({', '.join(frappe.db.escape(item) for item in items)})""")
+				and item_code in ({', '.join(frappe.db.escape(item) for item in items)})"""
+		)
 
 	return or_conditions
 
+
 def create_repost_item_valuation_entry(args):
 	args = frappe._dict(args)
 	repost_entry = frappe.new_doc("Repost Item Valuation")
 	repost_entry.based_on = args.based_on
 	if not args.based_on:
-		repost_entry.based_on = 'Transaction' if args.voucher_no else "Item and Warehouse"
+		repost_entry.based_on = "Transaction" if args.voucher_no else "Item and Warehouse"
 	repost_entry.voucher_type = args.voucher_type
 	repost_entry.voucher_no = args.voucher_no
 	repost_entry.item_code = args.item_code
diff --git a/erpnext/controllers/subcontracting.py b/erpnext/controllers/subcontracting.py
index c52c688..7083088 100644
--- a/erpnext/controllers/subcontracting.py
+++ b/erpnext/controllers/subcontracting.py
@@ -8,9 +8,9 @@
 from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
 
 
-class Subcontracting():
+class Subcontracting:
 	def set_materials_for_subcontracted_items(self, raw_material_table):
-		if self.doctype == 'Purchase Invoice' and not self.update_stock:
+		if self.doctype == "Purchase Invoice" and not self.update_stock:
 			return
 
 		self.raw_material_table = raw_material_table
@@ -33,13 +33,14 @@
 		self.__get_backflush_based_on()
 
 	def __get_backflush_based_on(self):
-		self.backflush_based_on = frappe.db.get_single_value("Buying Settings",
-			"backflush_raw_materials_of_subcontract_based_on")
+		self.backflush_based_on = frappe.db.get_single_value(
+			"Buying Settings", "backflush_raw_materials_of_subcontract_based_on"
+		)
 
 	def __get_purchase_orders(self):
 		self.purchase_orders = []
 
-		if self.doctype == 'Purchase Order':
+		if self.doctype == "Purchase Order":
 			return
 
 		self.purchase_orders = [d.purchase_order for d in self.items if d.purchase_order]
@@ -48,7 +49,7 @@
 		self.__changed_name = []
 		self.__reference_name = []
 
-		if self.doctype == 'Purchase Order' or self.is_new():
+		if self.doctype == "Purchase Order" or self.is_new():
 			self.set(self.raw_material_table, [])
 			return
 
@@ -68,20 +69,20 @@
 
 	def __get_data_before_save(self):
 		item_dict = {}
-		if self.doctype in ['Purchase Receipt', 'Purchase Invoice'] and self._doc_before_save:
-			for row in self._doc_before_save.get('items'):
+		if self.doctype in ["Purchase Receipt", "Purchase Invoice"] and self._doc_before_save:
+			for row in self._doc_before_save.get("items"):
 				item_dict[row.name] = (row.item_code, row.qty)
 
 		return item_dict
 
 	def get_available_materials(self):
-		''' Get the available raw materials which has been transferred to the supplier.
-			available_materials = {
-				(item_code, subcontracted_item, purchase_order): {
-					'qty': 1, 'serial_no': [ABC], 'batch_no': {'batch1': 1}, 'data': item_details
-				}
-			}
-		'''
+		"""Get the available raw materials which has been transferred to the supplier.
+		available_materials = {
+		        (item_code, subcontracted_item, purchase_order): {
+		                'qty': 1, 'serial_no': [ABC], 'batch_no': {'batch1': 1}, 'data': item_details
+		        }
+		}
+		"""
 		if not self.purchase_orders:
 			return
 
@@ -89,8 +90,17 @@
 			key = (row.rm_item_code, row.main_item_code, row.purchase_order)
 
 			if key not in self.available_materials:
-				self.available_materials.setdefault(key, frappe._dict({'qty': 0, 'serial_no': [],
-					'batch_no': defaultdict(float), 'item_details': row, 'po_details': []})
+				self.available_materials.setdefault(
+					key,
+					frappe._dict(
+						{
+							"qty": 0,
+							"serial_no": [],
+							"batch_no": defaultdict(float),
+							"item_details": row,
+							"po_details": [],
+						}
+					),
 				)
 
 			details = self.available_materials[key]
@@ -106,17 +116,17 @@
 			self.__set_alternative_item_details(row)
 
 		self.__transferred_items = copy.deepcopy(self.available_materials)
-		for doctype in ['Purchase Receipt', 'Purchase Invoice']:
+		for doctype in ["Purchase Receipt", "Purchase Invoice"]:
 			self.__update_consumed_materials(doctype)
 
 	def __update_consumed_materials(self, doctype, return_consumed_items=False):
-		'''Deduct the consumed materials from the available materials.'''
+		"""Deduct the consumed materials from the available materials."""
 
 		pr_items = self.__get_received_items(doctype)
 		if not pr_items:
 			return ([], {}) if return_consumed_items else None
 
-		pr_items = {d.name: d.get(self.get('po_field') or 'purchase_order') for d in pr_items}
+		pr_items = {d.name: d.get(self.get("po_field") or "purchase_order") for d in pr_items}
 		consumed_materials = self.__get_consumed_items(doctype, pr_items.keys())
 
 		if return_consumed_items:
@@ -127,97 +137,153 @@
 			if not self.available_materials.get(key):
 				continue
 
-			self.available_materials[key]['qty'] -= row.consumed_qty
+			self.available_materials[key]["qty"] -= row.consumed_qty
 			if row.serial_no:
-				self.available_materials[key]['serial_no'] = list(
-					set(self.available_materials[key]['serial_no']) - set(get_serial_nos(row.serial_no))
+				self.available_materials[key]["serial_no"] = list(
+					set(self.available_materials[key]["serial_no"]) - set(get_serial_nos(row.serial_no))
 				)
 
 			if row.batch_no:
-				self.available_materials[key]['batch_no'][row.batch_no] -= row.consumed_qty
+				self.available_materials[key]["batch_no"][row.batch_no] -= row.consumed_qty
 
 	def __get_transferred_items(self):
-		fields = ['`tabStock Entry`.`purchase_order`']
-		alias_dict = {'item_code': 'rm_item_code', 'subcontracted_item': 'main_item_code', 'basic_rate': 'rate'}
+		fields = ["`tabStock Entry`.`purchase_order`"]
+		alias_dict = {
+			"item_code": "rm_item_code",
+			"subcontracted_item": "main_item_code",
+			"basic_rate": "rate",
+		}
 
-		child_table_fields = ['item_code', 'item_name', 'description', 'qty', 'basic_rate', 'amount',
-			'serial_no', 'uom', 'subcontracted_item', 'stock_uom', 'batch_no', 'conversion_factor',
-			's_warehouse', 't_warehouse', 'item_group', 'po_detail']
+		child_table_fields = [
+			"item_code",
+			"item_name",
+			"description",
+			"qty",
+			"basic_rate",
+			"amount",
+			"serial_no",
+			"uom",
+			"subcontracted_item",
+			"stock_uom",
+			"batch_no",
+			"conversion_factor",
+			"s_warehouse",
+			"t_warehouse",
+			"item_group",
+			"po_detail",
+		]
 
-		if self.backflush_based_on == 'BOM':
-			child_table_fields.append('original_item')
+		if self.backflush_based_on == "BOM":
+			child_table_fields.append("original_item")
 
 		for field in child_table_fields:
-			fields.append(f'`tabStock Entry Detail`.`{field}` As {alias_dict.get(field, field)}')
+			fields.append(f"`tabStock Entry Detail`.`{field}` As {alias_dict.get(field, field)}")
 
-		filters = [['Stock Entry', 'docstatus', '=', 1], ['Stock Entry', 'purpose', '=', 'Send to Subcontractor'],
-			['Stock Entry', 'purchase_order', 'in', self.purchase_orders]]
+		filters = [
+			["Stock Entry", "docstatus", "=", 1],
+			["Stock Entry", "purpose", "=", "Send to Subcontractor"],
+			["Stock Entry", "purchase_order", "in", self.purchase_orders],
+		]
 
-		return frappe.get_all('Stock Entry', fields = fields, filters=filters)
+		return frappe.get_all("Stock Entry", fields=fields, filters=filters)
 
 	def __get_received_items(self, doctype):
 		fields = []
-		self.po_field = 'purchase_order'
+		self.po_field = "purchase_order"
 
-		for field in ['name', self.po_field, 'parent']:
-			fields.append(f'`tab{doctype} Item`.`{field}`')
+		for field in ["name", self.po_field, "parent"]:
+			fields.append(f"`tab{doctype} Item`.`{field}`")
 
-		filters = [[doctype, 'docstatus', '=', 1], [f'{doctype} Item', self.po_field, 'in', self.purchase_orders]]
-		if doctype == 'Purchase Invoice':
-			filters.append(['Purchase Invoice', 'update_stock', "=", 1])
+		filters = [
+			[doctype, "docstatus", "=", 1],
+			[f"{doctype} Item", self.po_field, "in", self.purchase_orders],
+		]
+		if doctype == "Purchase Invoice":
+			filters.append(["Purchase Invoice", "update_stock", "=", 1])
 
-		return frappe.get_all(f'{doctype}', fields = fields, filters = filters)
+		return frappe.get_all(f"{doctype}", fields=fields, filters=filters)
 
 	def __get_consumed_items(self, doctype, pr_items):
-		return frappe.get_all('Purchase Receipt Item Supplied',
-			fields = ['serial_no', 'rm_item_code', 'reference_name', 'batch_no', 'consumed_qty', 'main_item_code'],
-			filters = {'docstatus': 1, 'reference_name': ('in', list(pr_items)), 'parenttype': doctype})
+		return frappe.get_all(
+			"Purchase Receipt Item Supplied",
+			fields=[
+				"serial_no",
+				"rm_item_code",
+				"reference_name",
+				"batch_no",
+				"consumed_qty",
+				"main_item_code",
+			],
+			filters={"docstatus": 1, "reference_name": ("in", list(pr_items)), "parenttype": doctype},
+		)
 
 	def __set_alternative_item_details(self, row):
-		if row.get('original_item'):
-			self.alternative_item_details[row.get('original_item')] = row
+		if row.get("original_item"):
+			self.alternative_item_details[row.get("original_item")] = row
 
 	def __get_pending_qty_to_receive(self):
-		'''Get qty to be received against the purchase order.'''
+		"""Get qty to be received against the purchase order."""
 
 		self.qty_to_be_received = defaultdict(float)
 
-		if self.doctype != 'Purchase Order' and self.backflush_based_on != 'BOM' and self.purchase_orders:
-			for row in frappe.get_all('Purchase Order Item',
-				fields = ['item_code', '(qty - received_qty) as qty', 'parent', 'name'],
-				filters = {'docstatus': 1, 'parent': ('in', self.purchase_orders)}):
+		if (
+			self.doctype != "Purchase Order" and self.backflush_based_on != "BOM" and self.purchase_orders
+		):
+			for row in frappe.get_all(
+				"Purchase Order Item",
+				fields=["item_code", "(qty - received_qty) as qty", "parent", "name"],
+				filters={"docstatus": 1, "parent": ("in", self.purchase_orders)},
+			):
 
 				self.qty_to_be_received[(row.item_code, row.parent)] += row.qty
 
 	def __get_materials_from_bom(self, item_code, bom_no, exploded_item=0):
-		doctype = 'BOM Item' if not exploded_item else 'BOM Explosion Item'
-		fields = [f'`tab{doctype}`.`stock_qty` / `tabBOM`.`quantity` as qty_consumed_per_unit']
+		doctype = "BOM Item" if not exploded_item else "BOM Explosion Item"
+		fields = [f"`tab{doctype}`.`stock_qty` / `tabBOM`.`quantity` as qty_consumed_per_unit"]
 
-		alias_dict = {'item_code': 'rm_item_code', 'name': 'bom_detail_no', 'source_warehouse': 'reserve_warehouse'}
-		for field in ['item_code', 'name', 'rate', 'stock_uom',
-			'source_warehouse', 'description', 'item_name', 'stock_uom']:
-			fields.append(f'`tab{doctype}`.`{field}` As {alias_dict.get(field, field)}')
+		alias_dict = {
+			"item_code": "rm_item_code",
+			"name": "bom_detail_no",
+			"source_warehouse": "reserve_warehouse",
+		}
+		for field in [
+			"item_code",
+			"name",
+			"rate",
+			"stock_uom",
+			"source_warehouse",
+			"description",
+			"item_name",
+			"stock_uom",
+		]:
+			fields.append(f"`tab{doctype}`.`{field}` As {alias_dict.get(field, field)}")
 
-		filters = [[doctype, 'parent', '=', bom_no], [doctype, 'docstatus', '=', 1],
-			['BOM', 'item', '=', item_code], [doctype, 'sourced_by_supplier', '=', 0]]
+		filters = [
+			[doctype, "parent", "=", bom_no],
+			[doctype, "docstatus", "=", 1],
+			["BOM", "item", "=", item_code],
+			[doctype, "sourced_by_supplier", "=", 0],
+		]
 
-		return frappe.get_all('BOM', fields = fields, filters=filters, order_by = f'`tab{doctype}`.`idx`') or []
+		return (
+			frappe.get_all("BOM", fields=fields, filters=filters, order_by=f"`tab{doctype}`.`idx`") or []
+		)
 
 	def __remove_changed_rows(self):
 		if not self.__changed_name:
 			return
 
-		i=1
+		i = 1
 		self.set(self.raw_material_table, [])
 		for d in self._doc_before_save.supplied_items:
 			if d.reference_name in self.__changed_name:
 				continue
 
-			if (d.reference_name not in self.__reference_name):
+			if d.reference_name not in self.__reference_name:
 				continue
 
 			d.idx = i
-			self.append('supplied_items', d)
+			self.append("supplied_items", d)
 
 			i += 1
 
@@ -226,31 +292,35 @@
 
 		has_supplied_items = True if self.get(self.raw_material_table) else False
 		for row in self.items:
-			if (self.doctype != 'Purchase Order' and ((self.__changed_name and row.name not in self.__changed_name)
-				or (has_supplied_items and not self.__changed_name))):
+			if self.doctype != "Purchase Order" and (
+				(self.__changed_name and row.name not in self.__changed_name)
+				or (has_supplied_items and not self.__changed_name)
+			):
 				continue
 
-			if self.doctype == 'Purchase Order' or self.backflush_based_on == 'BOM':
-				for bom_item in self.__get_materials_from_bom(row.item_code, row.bom, row.get('include_exploded_items')):
-					qty = (flt(bom_item.qty_consumed_per_unit) * flt(row.qty) * row.conversion_factor)
+			if self.doctype == "Purchase Order" or self.backflush_based_on == "BOM":
+				for bom_item in self.__get_materials_from_bom(
+					row.item_code, row.bom, row.get("include_exploded_items")
+				):
+					qty = flt(bom_item.qty_consumed_per_unit) * flt(row.qty) * row.conversion_factor
 					bom_item.main_item_code = row.item_code
 					self.__update_reserve_warehouse(bom_item, row)
 					self.__set_alternative_item(bom_item)
 					self.__add_supplied_item(row, bom_item, qty)
 
-			elif self.backflush_based_on != 'BOM':
+			elif self.backflush_based_on != "BOM":
 				for key, transfer_item in self.available_materials.items():
 					if (key[1], key[2]) == (row.item_code, row.purchase_order) and transfer_item.qty > 0:
 						qty = self.__get_qty_based_on_material_transfer(row, transfer_item) or 0
 						transfer_item.qty -= qty
-						self.__add_supplied_item(row, transfer_item.get('item_details'), qty)
+						self.__add_supplied_item(row, transfer_item.get("item_details"), qty)
 
 				if self.qty_to_be_received:
 					self.qty_to_be_received[(row.item_code, row.purchase_order)] -= row.qty
 
 	def __update_reserve_warehouse(self, row, item):
-		if self.doctype == 'Purchase Order':
-			row.reserve_warehouse = (self.set_reserve_warehouse or item.warehouse)
+		if self.doctype == "Purchase Order":
+			row.reserve_warehouse = self.set_reserve_warehouse or item.warehouse
 
 	def __get_qty_based_on_material_transfer(self, item_row, transfer_item):
 		key = (item_row.item_code, item_row.purchase_order)
@@ -262,8 +332,9 @@
 			qty = (flt(item_row.qty) * flt(transfer_item.qty)) / flt(self.qty_to_be_received.get(key, 0))
 			transfer_item.item_details.required_qty = transfer_item.qty
 
-			if (transfer_item.serial_no or frappe.get_cached_value('UOM',
-				transfer_item.item_details.stock_uom, 'must_be_whole_number')):
+			if transfer_item.serial_no or frappe.get_cached_value(
+				"UOM", transfer_item.item_details.stock_uom, "must_be_whole_number"
+			):
 				return frappe.utils.ceil(qty)
 
 			return qty
@@ -277,7 +348,7 @@
 		rm_obj = self.append(self.raw_material_table, bom_item)
 		rm_obj.reference_name = item_row.name
 
-		if self.doctype == 'Purchase Order':
+		if self.doctype == "Purchase Order":
 			rm_obj.required_qty = qty
 		else:
 			rm_obj.consumed_qty = 0
@@ -287,12 +358,12 @@
 	def __set_batch_nos(self, bom_item, item_row, rm_obj, qty):
 		key = (rm_obj.rm_item_code, item_row.item_code, item_row.purchase_order)
 
-		if (self.available_materials.get(key) and self.available_materials[key]['batch_no']):
+		if self.available_materials.get(key) and self.available_materials[key]["batch_no"]:
 			new_rm_obj = None
-			for batch_no, batch_qty in self.available_materials[key]['batch_no'].items():
+			for batch_no, batch_qty in self.available_materials[key]["batch_no"].items():
 				if batch_qty >= qty:
 					self.__set_batch_no_as_per_qty(item_row, rm_obj, batch_no, qty)
-					self.available_materials[key]['batch_no'][batch_no] -= qty
+					self.available_materials[key]["batch_no"][batch_no] -= qty
 					return
 
 				elif qty > 0 and batch_qty > 0:
@@ -300,7 +371,7 @@
 					new_rm_obj = self.append(self.raw_material_table, bom_item)
 					new_rm_obj.reference_name = item_row.name
 					self.__set_batch_no_as_per_qty(item_row, new_rm_obj, batch_no, batch_qty)
-					self.available_materials[key]['batch_no'][batch_no] = 0
+					self.available_materials[key]["batch_no"][batch_no] = 0
 
 			if abs(qty) > 0 and not new_rm_obj:
 				self.__set_consumed_qty(rm_obj, qty)
@@ -313,29 +384,35 @@
 		rm_obj.consumed_qty = consumed_qty
 
 	def __set_batch_no_as_per_qty(self, item_row, rm_obj, batch_no, qty):
-		rm_obj.update({'consumed_qty': qty, 'batch_no': batch_no,
-			'required_qty': qty, 'purchase_order': item_row.purchase_order})
+		rm_obj.update(
+			{
+				"consumed_qty": qty,
+				"batch_no": batch_no,
+				"required_qty": qty,
+				"purchase_order": item_row.purchase_order,
+			}
+		)
 
 		self.__set_serial_nos(item_row, rm_obj)
 
 	def __set_serial_nos(self, item_row, rm_obj):
 		key = (rm_obj.rm_item_code, item_row.item_code, item_row.purchase_order)
-		if (self.available_materials.get(key) and self.available_materials[key]['serial_no']):
-			used_serial_nos = self.available_materials[key]['serial_no'][0: cint(rm_obj.consumed_qty)]
-			rm_obj.serial_no = '\n'.join(used_serial_nos)
+		if self.available_materials.get(key) and self.available_materials[key]["serial_no"]:
+			used_serial_nos = self.available_materials[key]["serial_no"][0 : cint(rm_obj.consumed_qty)]
+			rm_obj.serial_no = "\n".join(used_serial_nos)
 
 			# Removed the used serial nos from the list
 			for sn in used_serial_nos:
-				self.available_materials[key]['serial_no'].remove(sn)
+				self.available_materials[key]["serial_no"].remove(sn)
 
 	def set_consumed_qty_in_po(self):
 		# Update consumed qty back in the purchase order
-		if self.is_subcontracted != 'Yes':
+		if self.is_subcontracted != "Yes":
 			return
 
 		self.__get_purchase_orders()
 		itemwise_consumed_qty = defaultdict(float)
-		for doctype in ['Purchase Receipt', 'Purchase Invoice']:
+		for doctype in ["Purchase Receipt", "Purchase Invoice"]:
 			consumed_items, pr_items = self.__update_consumed_materials(doctype, return_consumed_items=True)
 
 			for row in consumed_items:
@@ -345,10 +422,12 @@
 		self.__update_consumed_qty_in_po(itemwise_consumed_qty)
 
 	def __update_consumed_qty_in_po(self, itemwise_consumed_qty):
-		fields = ['main_item_code', 'rm_item_code', 'parent', 'supplied_qty', 'name']
-		filters = {'docstatus': 1, 'parent': ('in', self.purchase_orders)}
+		fields = ["main_item_code", "rm_item_code", "parent", "supplied_qty", "name"]
+		filters = {"docstatus": 1, "parent": ("in", self.purchase_orders)}
 
-		for row in frappe.get_all('Purchase Order Item Supplied', fields = fields, filters=filters, order_by='idx'):
+		for row in frappe.get_all(
+			"Purchase Order Item Supplied", fields=fields, filters=filters, order_by="idx"
+		):
 			key = (row.rm_item_code, row.main_item_code, row.parent)
 			consumed_qty = itemwise_consumed_qty.get(key, 0)
 
@@ -356,10 +435,10 @@
 				consumed_qty = row.supplied_qty
 
 			itemwise_consumed_qty[key] -= consumed_qty
-			frappe.db.set_value('Purchase Order Item Supplied', row.name, 'consumed_qty', consumed_qty)
+			frappe.db.set_value("Purchase Order Item Supplied", row.name, "consumed_qty", consumed_qty)
 
 	def __validate_supplied_items(self):
-		if self.doctype not in ['Purchase Invoice', 'Purchase Receipt']:
+		if self.doctype not in ["Purchase Invoice", "Purchase Receipt"]:
 			return
 
 		for row in self.get(self.raw_material_table):
@@ -371,18 +450,20 @@
 			self.__validate_serial_no(row, key)
 
 	def __validate_batch_no(self, row, key):
-		if row.get('batch_no') and row.get('batch_no') not in self.__transferred_items.get(key).get('batch_no'):
-			link = get_link_to_form('Purchase Order', row.purchase_order)
+		if row.get("batch_no") and row.get("batch_no") not in self.__transferred_items.get(key).get(
+			"batch_no"
+		):
+			link = get_link_to_form("Purchase Order", row.purchase_order)
 			msg = f'The Batch No {frappe.bold(row.get("batch_no"))} has not supplied against the Purchase Order {link}'
 			frappe.throw(_(msg), title=_("Incorrect Batch Consumed"))
 
 	def __validate_serial_no(self, row, key):
-		if row.get('serial_no'):
-			serial_nos = get_serial_nos(row.get('serial_no'))
-			incorrect_sn = set(serial_nos).difference(self.__transferred_items.get(key).get('serial_no'))
+		if row.get("serial_no"):
+			serial_nos = get_serial_nos(row.get("serial_no"))
+			incorrect_sn = set(serial_nos).difference(self.__transferred_items.get(key).get("serial_no"))
 
 			if incorrect_sn:
 				incorrect_sn = "\n".join(incorrect_sn)
-				link = get_link_to_form('Purchase Order', row.purchase_order)
-				msg = f'The Serial Nos {incorrect_sn} has not supplied against the Purchase Order {link}'
+				link = get_link_to_form("Purchase Order", row.purchase_order)
+				msg = f"The Serial Nos {incorrect_sn} has not supplied against the Purchase Order {link}"
 				frappe.throw(_(msg), title=_("Incorrect Serial Number Consumed"))
diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py
index 29da5f1..ce58d5b 100644
--- a/erpnext/controllers/taxes_and_totals.py
+++ b/erpnext/controllers/taxes_and_totals.py
@@ -59,23 +59,23 @@
 		self.calculate_total_net_weight()
 
 	def validate_item_tax_template(self):
-		for item in self.doc.get('items'):
-			if item.item_code and item.get('item_tax_template'):
+		for item in self.doc.get("items"):
+			if item.item_code and item.get("item_tax_template"):
 				item_doc = frappe.get_cached_doc("Item", item.item_code)
 				args = {
-					'net_rate': item.net_rate or item.rate,
-					'tax_category': self.doc.get('tax_category'),
-					'posting_date': self.doc.get('posting_date'),
-					'bill_date': self.doc.get('bill_date'),
-					'transaction_date': self.doc.get('transaction_date'),
-					'company': self.doc.get('company')
+					"net_rate": item.net_rate or item.rate,
+					"tax_category": self.doc.get("tax_category"),
+					"posting_date": self.doc.get("posting_date"),
+					"bill_date": self.doc.get("bill_date"),
+					"transaction_date": self.doc.get("transaction_date"),
+					"company": self.doc.get("company"),
 				}
 
 				item_group = item_doc.item_group
 				item_group_taxes = []
 
 				while item_group:
-					item_group_doc = frappe.get_cached_doc('Item Group', item_group)
+					item_group_doc = frappe.get_cached_doc("Item Group", item_group)
 					item_group_taxes += item_group_doc.taxes or []
 					item_group = item_group_doc.parent_item_group
 
@@ -90,9 +90,11 @@
 				if taxes:
 					if item.item_tax_template not in taxes:
 						item.item_tax_template = taxes[0]
-						frappe.msgprint(_("Row {0}: Item Tax template updated as per validity and rate applied").format(
-							item.idx, frappe.bold(item.item_code)
-						))
+						frappe.msgprint(
+							_("Row {0}: Item Tax template updated as per validity and rate applied").format(
+								item.idx, frappe.bold(item.item_code)
+							)
+						)
 
 	def validate_conversion_rate(self):
 		# validate conversion rate
@@ -101,13 +103,17 @@
 			self.doc.currency = company_currency
 			self.doc.conversion_rate = 1.0
 		else:
-			validate_conversion_rate(self.doc.currency, self.doc.conversion_rate,
-				self.doc.meta.get_label("conversion_rate"), self.doc.company)
+			validate_conversion_rate(
+				self.doc.currency,
+				self.doc.conversion_rate,
+				self.doc.meta.get_label("conversion_rate"),
+				self.doc.company,
+			)
 
 		self.doc.conversion_rate = flt(self.doc.conversion_rate)
 
 	def calculate_item_values(self):
-		if self.doc.get('is_consolidated'):
+		if self.doc.get("is_consolidated"):
 			return
 
 		if not self.discount_amount_applied:
@@ -118,19 +124,30 @@
 					item.rate = 0.0
 				elif item.price_list_rate:
 					if not item.rate or (item.pricing_rules and item.discount_percentage > 0):
-						item.rate = flt(item.price_list_rate *
-							(1.0 - (item.discount_percentage / 100.0)), item.precision("rate"))
+						item.rate = flt(
+							item.price_list_rate * (1.0 - (item.discount_percentage / 100.0)), item.precision("rate")
+						)
 
 						item.discount_amount = item.price_list_rate * (item.discount_percentage / 100.0)
 
 					elif item.discount_amount and item.pricing_rules:
-						item.rate =  item.price_list_rate - item.discount_amount
+						item.rate = item.price_list_rate - item.discount_amount
 
-				if item.doctype in ['Quotation Item', 'Sales Order Item', 'Delivery Note Item', 'Sales Invoice Item',
-					'POS Invoice Item', 'Purchase Invoice Item', 'Purchase Order Item', 'Purchase Receipt Item']:
+				if item.doctype in [
+					"Quotation Item",
+					"Sales Order Item",
+					"Delivery Note Item",
+					"Sales Invoice Item",
+					"POS Invoice Item",
+					"Purchase Invoice Item",
+					"Purchase Order Item",
+					"Purchase Receipt Item",
+				]:
 					item.rate_with_margin, item.base_rate_with_margin = self.calculate_margin(item)
 					if flt(item.rate_with_margin) > 0:
-						item.rate = flt(item.rate_with_margin * (1.0 - (item.discount_percentage / 100.0)), item.precision("rate"))
+						item.rate = flt(
+							item.rate_with_margin * (1.0 - (item.discount_percentage / 100.0)), item.precision("rate")
+						)
 
 						if item.discount_amount and not item.discount_percentage:
 							item.rate = item.rate_with_margin - item.discount_amount
@@ -149,18 +166,22 @@
 				elif not item.qty and self.doc.get("is_debit_note"):
 					item.amount = flt(item.rate, item.precision("amount"))
 				else:
-					item.amount = flt(item.rate * item.qty,	item.precision("amount"))
+					item.amount = flt(item.rate * item.qty, item.precision("amount"))
 
 				item.net_amount = item.amount
 
-				self._set_in_company_currency(item, ["price_list_rate", "rate", "net_rate", "amount", "net_amount"])
+				self._set_in_company_currency(
+					item, ["price_list_rate", "rate", "net_rate", "amount", "net_amount"]
+				)
 
 				item.item_tax_amount = 0.0
 
 	def _set_in_company_currency(self, doc, fields):
 		"""set values in base currency"""
 		for f in fields:
-			val = flt(flt(doc.get(f), doc.precision(f)) * self.doc.conversion_rate, doc.precision("base_" + f))
+			val = flt(
+				flt(doc.get(f), doc.precision(f)) * self.doc.conversion_rate, doc.precision("base_" + f)
+			)
 			doc.set("base_" + f, val)
 
 	def initialize_taxes(self):
@@ -169,16 +190,22 @@
 				validate_taxes_and_charges(tax)
 				validate_inclusive_tax(tax, self.doc)
 
-			if not (self.doc.get('is_consolidated') or tax.get("dont_recompute_tax")):
+			if not (self.doc.get("is_consolidated") or tax.get("dont_recompute_tax")):
 				tax.item_wise_tax_detail = {}
 
-			tax_fields = ["total", "tax_amount_after_discount_amount",
-				"tax_amount_for_current_item", "grand_total_for_current_item",
-				"tax_fraction_for_current_item", "grand_total_fraction_for_current_item"]
+			tax_fields = [
+				"total",
+				"tax_amount_after_discount_amount",
+				"tax_amount_for_current_item",
+				"grand_total_for_current_item",
+				"tax_fraction_for_current_item",
+				"grand_total_fraction_for_current_item",
+			]
 
-			if tax.charge_type != "Actual" and \
-				not (self.discount_amount_applied and self.doc.apply_discount_on=="Grand Total"):
-					tax_fields.append("tax_amount")
+			if tax.charge_type != "Actual" and not (
+				self.discount_amount_applied and self.doc.apply_discount_on == "Grand Total"
+			):
+				tax_fields.append("tax_amount")
 
 			for fieldname in tax_fields:
 				tax.set(fieldname, 0.0)
@@ -194,25 +221,32 @@
 			cumulated_tax_fraction = 0
 			total_inclusive_tax_amount_per_qty = 0
 			for i, tax in enumerate(self.doc.get("taxes")):
-				tax.tax_fraction_for_current_item, inclusive_tax_amount_per_qty = self.get_current_tax_fraction(tax, item_tax_map)
+				(
+					tax.tax_fraction_for_current_item,
+					inclusive_tax_amount_per_qty,
+				) = self.get_current_tax_fraction(tax, item_tax_map)
 
-				if i==0:
+				if i == 0:
 					tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item
 				else:
-					tax.grand_total_fraction_for_current_item = \
-						self.doc.get("taxes")[i-1].grand_total_fraction_for_current_item \
+					tax.grand_total_fraction_for_current_item = (
+						self.doc.get("taxes")[i - 1].grand_total_fraction_for_current_item
 						+ tax.tax_fraction_for_current_item
+					)
 
 				cumulated_tax_fraction += tax.tax_fraction_for_current_item
 				total_inclusive_tax_amount_per_qty += inclusive_tax_amount_per_qty * flt(item.qty)
 
-			if not self.discount_amount_applied and item.qty and (cumulated_tax_fraction or total_inclusive_tax_amount_per_qty):
+			if (
+				not self.discount_amount_applied
+				and item.qty
+				and (cumulated_tax_fraction or total_inclusive_tax_amount_per_qty)
+			):
 				amount = flt(item.amount) - total_inclusive_tax_amount_per_qty
 
 				item.net_amount = flt(amount / (1 + cumulated_tax_fraction))
 				item.net_rate = flt(item.net_amount / item.qty, item.precision("net_rate"))
-				item.discount_percentage = flt(item.discount_percentage,
-					item.precision("discount_percentage"))
+				item.discount_percentage = flt(item.discount_percentage, item.precision("discount_percentage"))
 
 				self._set_in_company_currency(item, ["net_rate", "net_amount"])
 
@@ -221,8 +255,8 @@
 
 	def get_current_tax_fraction(self, tax, item_tax_map):
 		"""
-			Get tax fraction for calculating tax exclusive amount
-			from tax inclusive amount
+		Get tax fraction for calculating tax exclusive amount
+		from tax inclusive amount
 		"""
 		current_tax_fraction = 0
 		inclusive_tax_amount_per_qty = 0
@@ -234,12 +268,14 @@
 				current_tax_fraction = tax_rate / 100.0
 
 			elif tax.charge_type == "On Previous Row Amount":
-				current_tax_fraction = (tax_rate / 100.0) * \
-					self.doc.get("taxes")[cint(tax.row_id) - 1].tax_fraction_for_current_item
+				current_tax_fraction = (tax_rate / 100.0) * self.doc.get("taxes")[
+					cint(tax.row_id) - 1
+				].tax_fraction_for_current_item
 
 			elif tax.charge_type == "On Previous Row Total":
-				current_tax_fraction = (tax_rate / 100.0) * \
-					self.doc.get("taxes")[cint(tax.row_id) - 1].grand_total_fraction_for_current_item
+				current_tax_fraction = (tax_rate / 100.0) * self.doc.get("taxes")[
+					cint(tax.row_id) - 1
+				].grand_total_fraction_for_current_item
 
 			elif tax.charge_type == "On Item Quantity":
 				inclusive_tax_amount_per_qty = flt(tax_rate)
@@ -257,7 +293,9 @@
 			return tax.rate
 
 	def calculate_net_total(self):
-		self.doc.total_qty = self.doc.total = self.doc.base_total = self.doc.net_total = self.doc.base_net_total = 0.0
+		self.doc.total_qty = (
+			self.doc.total
+		) = self.doc.base_total = self.doc.net_total = self.doc.base_net_total = 0.0
 
 		for item in self.doc.get("items"):
 			self.doc.total += item.amount
@@ -276,13 +314,20 @@
 			self._calculate()
 
 	def calculate_taxes(self):
-		rounding_adjustment_computed = self.doc.get('is_consolidated') and self.doc.get('rounding_adjustment')
+		rounding_adjustment_computed = self.doc.get("is_consolidated") and self.doc.get(
+			"rounding_adjustment"
+		)
 		if not rounding_adjustment_computed:
 			self.doc.rounding_adjustment = 0
 
 		# maintain actual tax rate based on idx
-		actual_tax_dict = dict([[tax.idx, flt(tax.tax_amount, tax.precision("tax_amount"))]
-			for tax in self.doc.get("taxes") if tax.charge_type == "Actual"])
+		actual_tax_dict = dict(
+			[
+				[tax.idx, flt(tax.tax_amount, tax.precision("tax_amount"))]
+				for tax in self.doc.get("taxes")
+				if tax.charge_type == "Actual"
+			]
+		)
 
 		for n, item in enumerate(self.doc.get("items")):
 			item_tax_map = self._load_item_tax_rate(item.item_tax_rate)
@@ -297,9 +342,10 @@
 						current_tax_amount += actual_tax_dict[tax.idx]
 
 				# accumulate tax amount into tax.tax_amount
-				if tax.charge_type != "Actual" and \
-					not (self.discount_amount_applied and self.doc.apply_discount_on=="Grand Total"):
-						tax.tax_amount += current_tax_amount
+				if tax.charge_type != "Actual" and not (
+					self.discount_amount_applied and self.doc.apply_discount_on == "Grand Total"
+				):
+					tax.tax_amount += current_tax_amount
 
 				# store tax_amount for current item as it will be used for
 				# charge type = 'On Previous Row Amount'
@@ -312,17 +358,17 @@
 
 				# note: grand_total_for_current_item contains the contribution of
 				# item's amount, previously applied tax and the current tax on that item
-				if i==0:
+				if i == 0:
 					tax.grand_total_for_current_item = flt(item.net_amount + current_tax_amount)
 				else:
-					tax.grand_total_for_current_item = \
-						flt(self.doc.get("taxes")[i-1].grand_total_for_current_item + current_tax_amount)
+					tax.grand_total_for_current_item = flt(
+						self.doc.get("taxes")[i - 1].grand_total_for_current_item + current_tax_amount
+					)
 
 				# set precision in the last item iteration
 				if n == len(self.doc.get("items")) - 1:
 					self.round_off_totals(tax)
-					self._set_in_company_currency(tax,
-						["tax_amount", "tax_amount_after_discount_amount"])
+					self._set_in_company_currency(tax, ["tax_amount", "tax_amount_after_discount_amount"])
 
 					self.round_off_base_values(tax)
 					self.set_cumulative_total(i, tax)
@@ -330,20 +376,29 @@
 					self._set_in_company_currency(tax, ["total"])
 
 					# adjust Discount Amount loss in last tax iteration
-					if i == (len(self.doc.get("taxes")) - 1) and self.discount_amount_applied \
-						and self.doc.discount_amount \
-						and self.doc.apply_discount_on == "Grand Total" \
-						and not rounding_adjustment_computed:
-							self.doc.rounding_adjustment = flt(self.doc.grand_total
-								- flt(self.doc.discount_amount) - tax.total,
-								self.doc.precision("rounding_adjustment"))
+					if (
+						i == (len(self.doc.get("taxes")) - 1)
+						and self.discount_amount_applied
+						and self.doc.discount_amount
+						and self.doc.apply_discount_on == "Grand Total"
+						and not rounding_adjustment_computed
+					):
+						self.doc.rounding_adjustment = flt(
+							self.doc.grand_total - flt(self.doc.discount_amount) - tax.total,
+							self.doc.precision("rounding_adjustment"),
+						)
 
 	def get_tax_amount_if_for_valuation_or_deduction(self, tax_amount, tax):
 		# if just for valuation, do not add the tax amount in total
 		# if tax/charges is for deduction, multiply by -1
 		if getattr(tax, "category", None):
 			tax_amount = 0.0 if (tax.category == "Valuation") else tax_amount
-			if self.doc.doctype in ["Purchase Order", "Purchase Invoice", "Purchase Receipt", "Supplier Quotation"]:
+			if self.doc.doctype in [
+				"Purchase Order",
+				"Purchase Invoice",
+				"Purchase Receipt",
+				"Supplier Quotation",
+			]:
 				tax_amount *= -1.0 if (tax.add_deduct_tax == "Deduct") else 1.0
 		return tax_amount
 
@@ -354,7 +409,7 @@
 		if row_idx == 0:
 			tax.total = flt(self.doc.net_total + tax_amount, tax.precision("total"))
 		else:
-			tax.total = flt(self.doc.get("taxes")[row_idx-1].total + tax_amount, tax.precision("total"))
+			tax.total = flt(self.doc.get("taxes")[row_idx - 1].total + tax_amount, tax.precision("total"))
 
 	def get_current_tax_amount(self, item, tax, item_tax_map):
 		tax_rate = self._get_tax_rate(tax, item_tax_map)
@@ -363,16 +418,20 @@
 		if tax.charge_type == "Actual":
 			# distribute the tax amount proportionally to each item row
 			actual = flt(tax.tax_amount, tax.precision("tax_amount"))
-			current_tax_amount = item.net_amount*actual / self.doc.net_total if self.doc.net_total else 0.0
+			current_tax_amount = (
+				item.net_amount * actual / self.doc.net_total if self.doc.net_total else 0.0
+			)
 
 		elif tax.charge_type == "On Net Total":
 			current_tax_amount = (tax_rate / 100.0) * item.net_amount
 		elif tax.charge_type == "On Previous Row Amount":
-			current_tax_amount = (tax_rate / 100.0) * \
-				self.doc.get("taxes")[cint(tax.row_id) - 1].tax_amount_for_current_item
+			current_tax_amount = (tax_rate / 100.0) * self.doc.get("taxes")[
+				cint(tax.row_id) - 1
+			].tax_amount_for_current_item
 		elif tax.charge_type == "On Previous Row Total":
-			current_tax_amount = (tax_rate / 100.0) * \
-				self.doc.get("taxes")[cint(tax.row_id) - 1].grand_total_for_current_item
+			current_tax_amount = (tax_rate / 100.0) * self.doc.get("taxes")[
+				cint(tax.row_id) - 1
+			].grand_total_for_current_item
 		elif tax.charge_type == "On Item Quantity":
 			current_tax_amount = tax_rate * item.qty
 
@@ -384,11 +443,11 @@
 	def set_item_wise_tax(self, item, tax, tax_rate, current_tax_amount):
 		# store tax breakup for each item
 		key = item.item_code or item.item_name
-		item_wise_tax_amount = current_tax_amount*self.doc.conversion_rate
+		item_wise_tax_amount = current_tax_amount * self.doc.conversion_rate
 		if tax.item_wise_tax_detail.get(key):
 			item_wise_tax_amount += tax.item_wise_tax_detail[key][1]
 
-		tax.item_wise_tax_detail[key] = [tax_rate,flt(item_wise_tax_amount)]
+		tax.item_wise_tax_detail[key] = [tax_rate, flt(item_wise_tax_amount)]
 
 	def round_off_totals(self, tax):
 		if tax.account_head in frappe.flags.round_off_applicable_accounts:
@@ -396,8 +455,9 @@
 			tax.tax_amount_after_discount_amount = round(tax.tax_amount_after_discount_amount, 0)
 
 		tax.tax_amount = flt(tax.tax_amount, tax.precision("tax_amount"))
-		tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount,
-			tax.precision("tax_amount"))
+		tax.tax_amount_after_discount_amount = flt(
+			tax.tax_amount_after_discount_amount, tax.precision("tax_amount")
+		)
 
 	def round_off_base_values(self, tax):
 		# Round off to nearest integer based on regional settings
@@ -409,11 +469,15 @@
 		# if fully inclusive taxes and diff
 		if self.doc.get("taxes") and any(cint(t.included_in_print_rate) for t in self.doc.get("taxes")):
 			last_tax = self.doc.get("taxes")[-1]
-			non_inclusive_tax_amount = sum(flt(d.tax_amount_after_discount_amount)
-				for d in self.doc.get("taxes") if not d.included_in_print_rate)
+			non_inclusive_tax_amount = sum(
+				flt(d.tax_amount_after_discount_amount)
+				for d in self.doc.get("taxes")
+				if not d.included_in_print_rate
+			)
 
-			diff = self.doc.total + non_inclusive_tax_amount \
-				- flt(last_tax.total, last_tax.precision("total"))
+			diff = (
+				self.doc.total + non_inclusive_tax_amount - flt(last_tax.total, last_tax.precision("total"))
+			)
 
 			# If discount amount applied, deduct the discount amount
 			# because self.doc.total is always without discount, but last_tax.total is after discount
@@ -422,7 +486,7 @@
 
 			diff = flt(diff, self.doc.precision("rounding_adjustment"))
 
-			if diff and abs(diff) <= (5.0 / 10**last_tax.precision("tax_amount")):
+			if diff and abs(diff) <= (5.0 / 10 ** last_tax.precision("tax_amount")):
 				self.doc.rounding_adjustment = diff
 
 	def calculate_totals(self):
@@ -432,16 +496,27 @@
 			self.doc.grand_total = flt(self.doc.net_total)
 
 		if self.doc.get("taxes"):
-			self.doc.total_taxes_and_charges = flt(self.doc.grand_total - self.doc.net_total
-			- flt(self.doc.rounding_adjustment), self.doc.precision("total_taxes_and_charges"))
+			self.doc.total_taxes_and_charges = flt(
+				self.doc.grand_total - self.doc.net_total - flt(self.doc.rounding_adjustment),
+				self.doc.precision("total_taxes_and_charges"),
+			)
 		else:
 			self.doc.total_taxes_and_charges = 0.0
 
 		self._set_in_company_currency(self.doc, ["total_taxes_and_charges", "rounding_adjustment"])
 
-		if self.doc.doctype in ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice", "POS Invoice"]:
-			self.doc.base_grand_total = flt(self.doc.grand_total * self.doc.conversion_rate, self.doc.precision("base_grand_total")) \
-				if self.doc.total_taxes_and_charges else self.doc.base_net_total
+		if self.doc.doctype in [
+			"Quotation",
+			"Sales Order",
+			"Delivery Note",
+			"Sales Invoice",
+			"POS Invoice",
+		]:
+			self.doc.base_grand_total = (
+				flt(self.doc.grand_total * self.doc.conversion_rate, self.doc.precision("base_grand_total"))
+				if self.doc.total_taxes_and_charges
+				else self.doc.base_net_total
+			)
 		else:
 			self.doc.taxes_and_charges_added = self.doc.taxes_and_charges_deducted = 0.0
 			for tax in self.doc.get("taxes"):
@@ -453,26 +528,29 @@
 
 			self.doc.round_floats_in(self.doc, ["taxes_and_charges_added", "taxes_and_charges_deducted"])
 
-			self.doc.base_grand_total = flt(self.doc.grand_total * self.doc.conversion_rate) \
-				if (self.doc.taxes_and_charges_added or self.doc.taxes_and_charges_deducted) \
+			self.doc.base_grand_total = (
+				flt(self.doc.grand_total * self.doc.conversion_rate)
+				if (self.doc.taxes_and_charges_added or self.doc.taxes_and_charges_deducted)
 				else self.doc.base_net_total
+			)
 
-			self._set_in_company_currency(self.doc,
-				["taxes_and_charges_added", "taxes_and_charges_deducted"])
+			self._set_in_company_currency(
+				self.doc, ["taxes_and_charges_added", "taxes_and_charges_deducted"]
+			)
 
 		self.doc.round_floats_in(self.doc, ["grand_total", "base_grand_total"])
 
 		self.set_rounded_total()
 
 	def calculate_total_net_weight(self):
-		if self.doc.meta.get_field('total_net_weight'):
+		if self.doc.meta.get_field("total_net_weight"):
 			self.doc.total_net_weight = 0.0
 			for d in self.doc.items:
 				if d.total_weight:
 					self.doc.total_net_weight += d.total_weight
 
 	def set_rounded_total(self):
-		if self.doc.get('is_consolidated') and self.doc.get('rounding_adjustment'):
+		if self.doc.get("is_consolidated") and self.doc.get("rounding_adjustment"):
 			return
 
 		if self.doc.meta.get_field("rounded_total"):
@@ -480,33 +558,40 @@
 				self.doc.rounded_total = self.doc.base_rounded_total = 0
 				return
 
-			self.doc.rounded_total = round_based_on_smallest_currency_fraction(self.doc.grand_total,
-				self.doc.currency, self.doc.precision("rounded_total"))
+			self.doc.rounded_total = round_based_on_smallest_currency_fraction(
+				self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total")
+			)
 
-			#if print_in_rate is set, we would have already calculated rounding adjustment
-			self.doc.rounding_adjustment += flt(self.doc.rounded_total - self.doc.grand_total,
-				self.doc.precision("rounding_adjustment"))
+			# if print_in_rate is set, we would have already calculated rounding adjustment
+			self.doc.rounding_adjustment += flt(
+				self.doc.rounded_total - self.doc.grand_total, self.doc.precision("rounding_adjustment")
+			)
 
 			self._set_in_company_currency(self.doc, ["rounding_adjustment", "rounded_total"])
 
 	def _cleanup(self):
-		if not self.doc.get('is_consolidated'):
+		if not self.doc.get("is_consolidated"):
 			for tax in self.doc.get("taxes"):
 				if not tax.get("dont_recompute_tax"):
-					tax.item_wise_tax_detail = json.dumps(tax.item_wise_tax_detail, separators=(',', ':'))
+					tax.item_wise_tax_detail = json.dumps(tax.item_wise_tax_detail, separators=(",", ":"))
 
 	def set_discount_amount(self):
 		if self.doc.additional_discount_percentage:
-			self.doc.discount_amount = flt(flt(self.doc.get(scrub(self.doc.apply_discount_on)))
-				* self.doc.additional_discount_percentage / 100, self.doc.precision("discount_amount"))
+			self.doc.discount_amount = flt(
+				flt(self.doc.get(scrub(self.doc.apply_discount_on)))
+				* self.doc.additional_discount_percentage
+				/ 100,
+				self.doc.precision("discount_amount"),
+			)
 
 	def apply_discount_amount(self):
 		if self.doc.discount_amount:
 			if not self.doc.apply_discount_on:
 				frappe.throw(_("Please select Apply Discount On"))
 
-			self.doc.base_discount_amount = flt(self.doc.discount_amount * self.doc.conversion_rate,
-				self.doc.precision("base_discount_amount"))
+			self.doc.base_discount_amount = flt(
+				self.doc.discount_amount * self.doc.conversion_rate, self.doc.precision("base_discount_amount")
+			)
 
 			total_for_discount_amount = self.get_total_for_discount_amount()
 			taxes = self.doc.get("taxes")
@@ -515,20 +600,24 @@
 			if total_for_discount_amount:
 				# calculate item amount after Discount Amount
 				for i, item in enumerate(self.doc.get("items")):
-					distributed_amount = flt(self.doc.discount_amount) * \
-						item.net_amount / total_for_discount_amount
+					distributed_amount = (
+						flt(self.doc.discount_amount) * item.net_amount / total_for_discount_amount
+					)
 
 					item.net_amount = flt(item.net_amount - distributed_amount, item.precision("net_amount"))
 					net_total += item.net_amount
 
 					# discount amount rounding loss adjustment if no taxes
-					if (self.doc.apply_discount_on == "Net Total" or not taxes or total_for_discount_amount==self.doc.net_total) \
-						and i == len(self.doc.get("items")) - 1:
-							discount_amount_loss = flt(self.doc.net_total - net_total - self.doc.discount_amount,
-								self.doc.precision("net_total"))
+					if (
+						self.doc.apply_discount_on == "Net Total"
+						or not taxes
+						or total_for_discount_amount == self.doc.net_total
+					) and i == len(self.doc.get("items")) - 1:
+						discount_amount_loss = flt(
+							self.doc.net_total - net_total - self.doc.discount_amount, self.doc.precision("net_total")
+						)
 
-							item.net_amount = flt(item.net_amount + discount_amount_loss,
-								item.precision("net_amount"))
+						item.net_amount = flt(item.net_amount + discount_amount_loss, item.precision("net_amount"))
 
 					item.net_rate = flt(item.net_amount / item.qty, item.precision("net_rate")) if item.qty else 0
 
@@ -553,42 +642,52 @@
 					actual_tax_amount = flt(actual_taxes_dict.get(tax.row_id, 0)) * flt(tax.rate) / 100
 					actual_taxes_dict.setdefault(tax.idx, actual_tax_amount)
 
-			return flt(self.doc.grand_total - sum(actual_taxes_dict.values()),
-				self.doc.precision("grand_total"))
-
+			return flt(
+				self.doc.grand_total - sum(actual_taxes_dict.values()), self.doc.precision("grand_total")
+			)
 
 	def calculate_total_advance(self):
 		if self.doc.docstatus < 2:
-			total_allocated_amount = sum(flt(adv.allocated_amount, adv.precision("allocated_amount"))
-				for adv in self.doc.get("advances"))
+			total_allocated_amount = sum(
+				flt(adv.allocated_amount, adv.precision("allocated_amount"))
+				for adv in self.doc.get("advances")
+			)
 
 			self.doc.total_advance = flt(total_allocated_amount, self.doc.precision("total_advance"))
 
 			grand_total = self.doc.rounded_total or self.doc.grand_total
 
 			if self.doc.party_account_currency == self.doc.currency:
-				invoice_total = flt(grand_total - flt(self.doc.write_off_amount),
-					self.doc.precision("grand_total"))
+				invoice_total = flt(
+					grand_total - flt(self.doc.write_off_amount), self.doc.precision("grand_total")
+				)
 			else:
-				base_write_off_amount = flt(flt(self.doc.write_off_amount) * self.doc.conversion_rate,
-					self.doc.precision("base_write_off_amount"))
-				invoice_total = flt(grand_total * self.doc.conversion_rate,
-					self.doc.precision("grand_total")) - base_write_off_amount
+				base_write_off_amount = flt(
+					flt(self.doc.write_off_amount) * self.doc.conversion_rate,
+					self.doc.precision("base_write_off_amount"),
+				)
+				invoice_total = (
+					flt(grand_total * self.doc.conversion_rate, self.doc.precision("grand_total"))
+					- base_write_off_amount
+				)
 
 			if invoice_total > 0 and self.doc.total_advance > invoice_total:
-				frappe.throw(_("Advance amount cannot be greater than {0} {1}")
-					.format(self.doc.party_account_currency, invoice_total))
+				frappe.throw(
+					_("Advance amount cannot be greater than {0} {1}").format(
+						self.doc.party_account_currency, invoice_total
+					)
+				)
 
 			if self.doc.docstatus == 0:
 				self.calculate_outstanding_amount()
 
 	def is_internal_invoice(self):
 		"""
-			Checks if its an internal transfer invoice
-			and decides if to calculate any out standing amount or not
+		Checks if its an internal transfer invoice
+		and decides if to calculate any out standing amount or not
 		"""
 
-		if self.doc.doctype in ('Sales Invoice', 'Purchase Invoice') and self.doc.is_internal_transfer():
+		if self.doc.doctype in ("Sales Invoice", "Purchase Invoice") and self.doc.is_internal_transfer():
 			return True
 
 		return False
@@ -600,43 +699,62 @@
 		if self.doc.doctype == "Sales Invoice":
 			self.calculate_paid_amount()
 
-		if self.doc.is_return and self.doc.return_against and not self.doc.get('is_pos') or \
-			self.is_internal_invoice(): return
+		if (
+			self.doc.is_return
+			and self.doc.return_against
+			and not self.doc.get("is_pos")
+			or self.is_internal_invoice()
+		):
+			return
 
 		self.doc.round_floats_in(self.doc, ["grand_total", "total_advance", "write_off_amount"])
-		self._set_in_company_currency(self.doc, ['write_off_amount'])
+		self._set_in_company_currency(self.doc, ["write_off_amount"])
 
 		if self.doc.doctype in ["Sales Invoice", "Purchase Invoice"]:
 			grand_total = self.doc.rounded_total or self.doc.grand_total
 			base_grand_total = self.doc.base_rounded_total or self.doc.base_grand_total
 
 			if self.doc.party_account_currency == self.doc.currency:
-				total_amount_to_pay = flt(grand_total - self.doc.total_advance
-					- flt(self.doc.write_off_amount), self.doc.precision("grand_total"))
+				total_amount_to_pay = flt(
+					grand_total - self.doc.total_advance - flt(self.doc.write_off_amount),
+					self.doc.precision("grand_total"),
+				)
 			else:
-				total_amount_to_pay = flt(flt(base_grand_total, self.doc.precision("base_grand_total")) - self.doc.total_advance
-						- flt(self.doc.base_write_off_amount), self.doc.precision("base_grand_total"))
+				total_amount_to_pay = flt(
+					flt(base_grand_total, self.doc.precision("base_grand_total"))
+					- self.doc.total_advance
+					- flt(self.doc.base_write_off_amount),
+					self.doc.precision("base_grand_total"),
+				)
 
 			self.doc.round_floats_in(self.doc, ["paid_amount"])
 			change_amount = 0
 
-			if self.doc.doctype == "Sales Invoice" and not self.doc.get('is_return'):
+			if self.doc.doctype == "Sales Invoice" and not self.doc.get("is_return"):
 				self.calculate_write_off_amount()
 				self.calculate_change_amount()
-				change_amount = self.doc.change_amount \
-					if self.doc.party_account_currency == self.doc.currency else self.doc.base_change_amount
+				change_amount = (
+					self.doc.change_amount
+					if self.doc.party_account_currency == self.doc.currency
+					else self.doc.base_change_amount
+				)
 
-			paid_amount = self.doc.paid_amount \
-				if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount
+			paid_amount = (
+				self.doc.paid_amount
+				if self.doc.party_account_currency == self.doc.currency
+				else self.doc.base_paid_amount
+			)
 
-			self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) + flt(change_amount),
-				self.doc.precision("outstanding_amount"))
+			self.doc.outstanding_amount = flt(
+				total_amount_to_pay - flt(paid_amount) + flt(change_amount),
+				self.doc.precision("outstanding_amount"),
+			)
 
 			if (
-				self.doc.doctype == 'Sales Invoice'
-				and self.doc.get('is_pos')
-				and self.doc.get('is_return')
-				and not self.doc.get('is_consolidated')
+				self.doc.doctype == "Sales Invoice"
+				and self.doc.get("is_pos")
+				and self.doc.get("is_return")
+				and not self.doc.get("is_consolidated")
 			):
 				self.set_total_amount_to_default_mop(total_amount_to_pay)
 				self.calculate_paid_amount()
@@ -646,17 +764,17 @@
 		paid_amount = base_paid_amount = 0.0
 
 		if self.doc.is_pos:
-			for payment in self.doc.get('payments'):
+			for payment in self.doc.get("payments"):
 				payment.amount = flt(payment.amount)
 				payment.base_amount = payment.amount * flt(self.doc.conversion_rate)
 				paid_amount += payment.amount
 				base_paid_amount += payment.base_amount
 		elif not self.doc.is_return:
-			self.doc.set('payments', [])
+			self.doc.set("payments", [])
 
 		if self.doc.redeem_loyalty_points and self.doc.loyalty_amount:
 			base_paid_amount += self.doc.loyalty_amount
-			paid_amount += (self.doc.loyalty_amount / flt(self.doc.conversion_rate))
+			paid_amount += self.doc.loyalty_amount / flt(self.doc.conversion_rate)
 
 		self.doc.paid_amount = flt(paid_amount, self.doc.precision("paid_amount"))
 		self.doc.base_paid_amount = flt(base_paid_amount, self.doc.precision("base_paid_amount"))
@@ -667,22 +785,33 @@
 		grand_total = self.doc.rounded_total or self.doc.grand_total
 		base_grand_total = self.doc.base_rounded_total or self.doc.base_grand_total
 
-		if self.doc.doctype == "Sales Invoice" \
-			and self.doc.paid_amount > grand_total and not self.doc.is_return \
-			and any(d.type == "Cash" for d in self.doc.payments):
+		if (
+			self.doc.doctype == "Sales Invoice"
+			and self.doc.paid_amount > grand_total
+			and not self.doc.is_return
+			and any(d.type == "Cash" for d in self.doc.payments)
+		):
 
-			self.doc.change_amount = flt(self.doc.paid_amount - grand_total +
-				self.doc.write_off_amount, self.doc.precision("change_amount"))
+			self.doc.change_amount = flt(
+				self.doc.paid_amount - grand_total + self.doc.write_off_amount,
+				self.doc.precision("change_amount"),
+			)
 
-			self.doc.base_change_amount = flt(self.doc.base_paid_amount - base_grand_total +
-				self.doc.base_write_off_amount, self.doc.precision("base_change_amount"))
+			self.doc.base_change_amount = flt(
+				self.doc.base_paid_amount - base_grand_total + self.doc.base_write_off_amount,
+				self.doc.precision("base_change_amount"),
+			)
 
 	def calculate_write_off_amount(self):
 		if flt(self.doc.change_amount) > 0:
-			self.doc.write_off_amount = flt(self.doc.grand_total - self.doc.paid_amount
-				+ self.doc.change_amount, self.doc.precision("write_off_amount"))
-			self.doc.base_write_off_amount = flt(self.doc.write_off_amount * self.doc.conversion_rate,
-				self.doc.precision("base_write_off_amount"))
+			self.doc.write_off_amount = flt(
+				self.doc.grand_total - self.doc.paid_amount + self.doc.change_amount,
+				self.doc.precision("write_off_amount"),
+			)
+			self.doc.base_write_off_amount = flt(
+				self.doc.write_off_amount * self.doc.conversion_rate,
+				self.doc.precision("base_write_off_amount"),
+			)
 
 	def calculate_margin(self, item):
 		rate_with_margin = 0.0
@@ -691,10 +820,15 @@
 			if item.pricing_rules and not self.doc.ignore_pricing_rule:
 				has_margin = False
 				for d in get_applied_pricing_rules(item.pricing_rules):
-					pricing_rule = frappe.get_cached_doc('Pricing Rule', d)
+					pricing_rule = frappe.get_cached_doc("Pricing Rule", d)
 
-					if pricing_rule.margin_rate_or_amount and ((pricing_rule.currency == self.doc.currency and
-						pricing_rule.margin_type in ['Amount', 'Percentage']) or pricing_rule.margin_type == 'Percentage'):
+					if pricing_rule.margin_rate_or_amount and (
+						(
+							pricing_rule.currency == self.doc.currency
+							and pricing_rule.margin_type in ["Amount", "Percentage"]
+						)
+						or pricing_rule.margin_type == "Percentage"
+					):
 						item.margin_type = pricing_rule.margin_type
 						item.margin_rate_or_amount = pricing_rule.margin_rate_or_amount
 						has_margin = True
@@ -705,12 +839,17 @@
 
 			if not item.pricing_rules and flt(item.rate) > flt(item.price_list_rate):
 				item.margin_type = "Amount"
-				item.margin_rate_or_amount = flt(item.rate - item.price_list_rate,
-						item.precision("margin_rate_or_amount"))
+				item.margin_rate_or_amount = flt(
+					item.rate - item.price_list_rate, item.precision("margin_rate_or_amount")
+				)
 				item.rate_with_margin = item.rate
 
 			elif item.margin_type and item.margin_rate_or_amount:
-				margin_value = item.margin_rate_or_amount if item.margin_type == 'Amount' else flt(item.price_list_rate) * flt(item.margin_rate_or_amount) / 100
+				margin_value = (
+					item.margin_rate_or_amount
+					if item.margin_type == "Amount"
+					else flt(item.price_list_rate) * flt(item.margin_rate_or_amount) / 100
+				)
 				rate_with_margin = flt(item.price_list_rate) + flt(margin_value)
 				base_rate_with_margin = flt(rate_with_margin) * flt(self.doc.conversion_rate)
 
@@ -720,16 +859,24 @@
 		self.doc.other_charges_calculation = get_itemised_tax_breakup_html(self.doc)
 
 	def set_total_amount_to_default_mop(self, total_amount_to_pay):
-		default_mode_of_payment = frappe.db.get_value('POS Payment Method',
-			{'parent': self.doc.pos_profile, 'default': 1}, ['mode_of_payment'], as_dict=1)
+		default_mode_of_payment = frappe.db.get_value(
+			"POS Payment Method",
+			{"parent": self.doc.pos_profile, "default": 1},
+			["mode_of_payment"],
+			as_dict=1,
+		)
 
 		if default_mode_of_payment:
 			self.doc.payments = []
-			self.doc.append('payments', {
-				'mode_of_payment': default_mode_of_payment.mode_of_payment,
-				'amount': total_amount_to_pay,
-				'default': 1
-			})
+			self.doc.append(
+				"payments",
+				{
+					"mode_of_payment": default_mode_of_payment.mode_of_payment,
+					"amount": total_amount_to_pay,
+					"default": 1,
+				},
+			)
+
 
 def get_itemised_tax_breakup_html(doc):
 	if not doc.taxes:
@@ -739,7 +886,7 @@
 	# get headers
 	tax_accounts = []
 	for tax in doc.taxes:
-		if getattr(tax, "category", None) and tax.category=="Valuation":
+		if getattr(tax, "category", None) and tax.category == "Valuation":
 			continue
 		if tax.description not in tax_accounts:
 			tax_accounts.append(tax.description)
@@ -755,34 +902,40 @@
 	frappe.flags.company = None
 
 	return frappe.render_template(
-		"templates/includes/itemised_tax_breakup.html", dict(
+		"templates/includes/itemised_tax_breakup.html",
+		dict(
 			headers=headers,
 			itemised_tax=itemised_tax,
 			itemised_taxable_amount=itemised_taxable_amount,
 			tax_accounts=tax_accounts,
-			doc=doc
-		)
+			doc=doc,
+		),
 	)
 
+
 @frappe.whitelist()
 def get_round_off_applicable_accounts(company, account_list):
 	account_list = get_regional_round_off_accounts(company, account_list)
 
 	return account_list
 
+
 @erpnext.allow_regional
 def get_regional_round_off_accounts(company, account_list):
 	pass
 
+
 @erpnext.allow_regional
 def update_itemised_tax_data(doc):
-	#Don't delete this method, used for localization
+	# Don't delete this method, used for localization
 	pass
 
+
 @erpnext.allow_regional
 def get_itemised_tax_breakup_header(item_doctype, tax_accounts):
 	return [_("Item"), _("Taxable Amount")] + tax_accounts
 
+
 @erpnext.allow_regional
 def get_itemised_tax_breakup_data(doc):
 	itemised_tax = get_itemised_tax(doc.taxes)
@@ -791,10 +944,11 @@
 
 	return itemised_tax, itemised_taxable_amount
 
+
 def get_itemised_tax(taxes, with_tax_account=False):
 	itemised_tax = {}
 	for tax in taxes:
-		if getattr(tax, "category", None) and tax.category=="Valuation":
+		if getattr(tax, "category", None) and tax.category == "Valuation":
 			continue
 
 		item_tax_map = json.loads(tax.item_wise_tax_detail) if tax.item_wise_tax_detail else {}
@@ -811,16 +965,16 @@
 				else:
 					tax_rate = flt(tax_data)
 
-				itemised_tax[item_code][tax.description] = frappe._dict(dict(
-					tax_rate = tax_rate,
-					tax_amount = tax_amount
-				))
+				itemised_tax[item_code][tax.description] = frappe._dict(
+					dict(tax_rate=tax_rate, tax_amount=tax_amount)
+				)
 
 				if with_tax_account:
 					itemised_tax[item_code][tax.description].tax_account = tax.account_head
 
 	return itemised_tax
 
+
 def get_itemised_taxable_amount(items):
 	itemised_taxable_amount = frappe._dict()
 	for item in items:
@@ -830,16 +984,18 @@
 
 	return itemised_taxable_amount
 
+
 def get_rounded_tax_amount(itemised_tax, precision):
 	# Rounding based on tax_amount precision
 	for taxes in itemised_tax.values():
 		for tax_account in taxes:
 			taxes[tax_account]["tax_amount"] = flt(taxes[tax_account]["tax_amount"], precision)
 
+
 class init_landed_taxes_and_totals(object):
 	def __init__(self, doc):
 		self.doc = doc
-		self.tax_field = 'taxes' if self.doc.doctype == 'Landed Cost Voucher' else 'additional_costs'
+		self.tax_field = "taxes" if self.doc.doctype == "Landed Cost Voucher" else "additional_costs"
 		self.set_account_currency()
 		self.set_exchange_rate()
 		self.set_amounts_in_company_currency()
@@ -848,7 +1004,7 @@
 		company_currency = erpnext.get_company_currency(self.doc.company)
 		for d in self.doc.get(self.tax_field):
 			if not d.account_currency:
-				account_currency = frappe.db.get_value('Account', d.expense_account, 'account_currency')
+				account_currency = frappe.db.get_value("Account", d.expense_account, "account_currency")
 				d.account_currency = account_currency or company_currency
 
 	def set_exchange_rate(self):
@@ -857,8 +1013,12 @@
 			if d.account_currency == company_currency:
 				d.exchange_rate = 1
 			elif not d.exchange_rate:
-				d.exchange_rate = get_exchange_rate(self.doc.posting_date, account=d.expense_account,
-					account_currency=d.account_currency, company=self.doc.company)
+				d.exchange_rate = get_exchange_rate(
+					self.doc.posting_date,
+					account=d.expense_account,
+					account_currency=d.account_currency,
+					company=self.doc.company,
+				)
 
 			if not d.exchange_rate:
 				frappe.throw(_("Row {0}: Exchange Rate is mandatory").format(d.idx))
diff --git a/erpnext/controllers/tests/test_item_variant.py b/erpnext/controllers/tests/test_item_variant.py
index 5c6e06a..68c8d2c 100644
--- a/erpnext/controllers/tests/test_item_variant.py
+++ b/erpnext/controllers/tests/test_item_variant.py
@@ -12,11 +12,12 @@
 
 class TestItemVariant(unittest.TestCase):
 	def test_tables_in_template_copied_to_variant(self):
-		fields = [{'field_name': 'quality_inspection_template'}]
+		fields = [{"field_name": "quality_inspection_template"}]
 		set_item_variant_settings(fields)
 		variant = make_item_variant()
 		self.assertEqual(variant.get("quality_inspection_template"), "_Test QC Template")
 
+
 def create_variant_with_tables(item, args):
 	if isinstance(args, str):
 		args = json.loads(args)
@@ -27,14 +28,11 @@
 	template.save()
 
 	variant = frappe.new_doc("Item")
-	variant.variant_based_on = 'Item Attribute'
+	variant.variant_based_on = "Item Attribute"
 	variant_attributes = []
 
 	for d in template.attributes:
-		variant_attributes.append({
-			"attribute": d.attribute,
-			"attribute_value": args.get(d.attribute)
-		})
+		variant_attributes.append({"attribute": d.attribute, "attribute_value": args.get(d.attribute)})
 
 	variant.set("attributes", variant_attributes)
 	copy_attributes_to_variant(template, variant)
@@ -42,6 +40,7 @@
 
 	return variant
 
+
 def make_item_variant():
 	frappe.delete_doc_if_exists("Item", "_Test Variant Item-XSL", force=1)
 	variant = create_variant_with_tables("_Test Variant Item", '{"Test Size": "Extra Small"}')
@@ -50,6 +49,7 @@
 	variant.save()
 	return variant
 
+
 def make_quality_inspection_template():
 	qc_template = "_Test QC Template"
 	if frappe.db.exists("Quality Inspection Template", qc_template):
@@ -59,10 +59,13 @@
 	qc.quality_inspection_template_name = qc_template
 
 	create_quality_inspection_parameter("Moisture")
-	qc.append('item_quality_inspection_parameter', {
-		"specification": "Moisture",
-		"value": "&lt; 5%",
-	})
+	qc.append(
+		"item_quality_inspection_parameter",
+		{
+			"specification": "Moisture",
+			"value": "&lt; 5%",
+		},
+	)
 
 	qc.insert()
 	return qc.name
diff --git a/erpnext/controllers/tests/test_mapper.py b/erpnext/controllers/tests/test_mapper.py
index e755876..919bcda 100644
--- a/erpnext/controllers/tests/test_mapper.py
+++ b/erpnext/controllers/tests/test_mapper.py
@@ -10,14 +10,14 @@
 
 class TestMapper(unittest.TestCase):
 	def test_map_docs(self):
-		'''Test mapping of multiple source docs on a single target doc'''
+		"""Test mapping of multiple source docs on a single target doc"""
 
 		make_test_records("Item")
-		items = ['_Test Item', '_Test Item 2', '_Test FG Item']
+		items = ["_Test Item", "_Test Item 2", "_Test FG Item"]
 
 		# Make source docs (quotations) and a target doc (sales order)
-		qtn1, item_list_1 = self.make_quotation(items, '_Test Customer')
-		qtn2, item_list_2 = self.make_quotation(items, '_Test Customer')
+		qtn1, item_list_1 = self.make_quotation(items, "_Test Customer")
+		qtn2, item_list_2 = self.make_quotation(items, "_Test Customer")
 		so, item_list_3 = self.make_sales_order()
 
 		# Map source docs to target with corresponding mapper method
@@ -26,20 +26,20 @@
 
 		# Assert that all inserted items are present in updated sales order
 		src_items = item_list_1 + item_list_2 + item_list_3
-		self.assertEqual(set(d for d in src_items),
-			set(d.item_code for d in updated_so.items))
-
+		self.assertEqual(set(d for d in src_items), set(d.item_code for d in updated_so.items))
 
 	def make_quotation(self, item_list, customer):
 
-		qtn = frappe.get_doc({
-			"doctype": "Quotation",
-			"quotation_to": "Customer",
-			"party_name": customer,
-			"order_type": "Sales",
-			"transaction_date" : nowdate(),
-			"valid_till" : add_months(nowdate(), 1)
-		})
+		qtn = frappe.get_doc(
+			{
+				"doctype": "Quotation",
+				"quotation_to": "Customer",
+				"party_name": customer,
+				"order_type": "Sales",
+				"transaction_date": nowdate(),
+				"valid_till": add_months(nowdate(), 1),
+			}
+		)
 		for item in item_list:
 			qtn.append("items", {"qty": "2", "item_code": item})
 
@@ -47,21 +47,23 @@
 		return qtn, item_list
 
 	def make_sales_order(self):
-		item = frappe.get_doc({
-			"base_amount": 1000.0,
-			"base_rate": 100.0,
-			"description": "CPU",
-			"doctype": "Sales Order Item",
-			"item_code": "_Test Item",
-			"item_name": "CPU",
-			"parentfield": "items",
-			"qty": 10.0,
-			"rate": 100.0,
-			"warehouse": "_Test Warehouse - _TC",
-			"stock_uom": "_Test UOM",
-			"conversion_factor": 1.0,
-			"uom": "_Test UOM"
-		})
-		so = frappe.get_doc(frappe.get_test_records('Sales Order')[0])
+		item = frappe.get_doc(
+			{
+				"base_amount": 1000.0,
+				"base_rate": 100.0,
+				"description": "CPU",
+				"doctype": "Sales Order Item",
+				"item_code": "_Test Item",
+				"item_name": "CPU",
+				"parentfield": "items",
+				"qty": 10.0,
+				"rate": 100.0,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "_Test UOM",
+				"conversion_factor": 1.0,
+				"uom": "_Test UOM",
+			}
+		)
+		so = frappe.get_doc(frappe.get_test_records("Sales Order")[0])
 		so.insert(ignore_permissions=True)
 		return so, [item.item_code]
diff --git a/erpnext/controllers/tests/test_qty_based_taxes.py b/erpnext/controllers/tests/test_qty_based_taxes.py
index 49b844b..2e9dfd2 100644
--- a/erpnext/controllers/tests/test_qty_based_taxes.py
+++ b/erpnext/controllers/tests/test_qty_based_taxes.py
@@ -5,104 +5,131 @@
 
 
 def uuid4():
-    return str(_uuid4())
+	return str(_uuid4())
+
 
 class TestTaxes(unittest.TestCase):
-    def setUp(self):
-        self.company = frappe.get_doc({
-            'doctype': 'Company',
-            'company_name': uuid4(),
-            'abbr': ''.join(s[0] for s in uuid4().split('-')),
-            'default_currency': 'USD',
-            'country': 'United States',
-        }).insert()
-        self.account = frappe.get_doc({
-            'doctype': 'Account',
-            'account_name': uuid4(),
-            'account_type': 'Tax',
-            'company': self.company.name,
-            'parent_account': 'Duties and Taxes - {self.company.abbr}'.format(self=self)
-        }).insert()
-        self.item_group = frappe.get_doc({
-            'doctype': 'Item Group',
-            'item_group_name': uuid4(),
-            'parent_item_group': 'All Item Groups',
-        }).insert()
-        self.item_tax_template = frappe.get_doc({
-            'doctype': 'Item Tax Template',
-            'title': uuid4(),
-            'company': self.company.name,
-            'taxes': [
-                {
-                    'tax_type': self.account.name,
-                    'tax_rate': 2,
-                }
-            ]
-        }).insert()
-        self.item = frappe.get_doc({
-            'doctype': 'Item',
-            'item_code': uuid4(),
-            'item_group': self.item_group.name,
-            'is_stock_item': 0,
-            'taxes': [
-                {
-                    'item_tax_template': self.item_tax_template.name,
-                    'tax_category': '',
-                }
-            ],
-        }).insert()
-        self.customer = frappe.get_doc({
-            'doctype': 'Customer',
-            'customer_name': uuid4(),
-            'customer_group': 'All Customer Groups',
-        }).insert()
-        self.supplier = frappe.get_doc({
-            'doctype': 'Supplier',
-            'supplier_name': uuid4(),
-            'supplier_group': 'All Supplier Groups',
-        }).insert()
+	def setUp(self):
+		self.company = frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": uuid4(),
+				"abbr": "".join(s[0] for s in uuid4().split("-")),
+				"default_currency": "USD",
+				"country": "United States",
+			}
+		).insert()
+		self.account = frappe.get_doc(
+			{
+				"doctype": "Account",
+				"account_name": uuid4(),
+				"account_type": "Tax",
+				"company": self.company.name,
+				"parent_account": "Duties and Taxes - {self.company.abbr}".format(self=self),
+			}
+		).insert()
+		self.item_group = frappe.get_doc(
+			{
+				"doctype": "Item Group",
+				"item_group_name": uuid4(),
+				"parent_item_group": "All Item Groups",
+			}
+		).insert()
+		self.item_tax_template = frappe.get_doc(
+			{
+				"doctype": "Item Tax Template",
+				"title": uuid4(),
+				"company": self.company.name,
+				"taxes": [
+					{
+						"tax_type": self.account.name,
+						"tax_rate": 2,
+					}
+				],
+			}
+		).insert()
+		self.item = frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": uuid4(),
+				"item_group": self.item_group.name,
+				"is_stock_item": 0,
+				"taxes": [
+					{
+						"item_tax_template": self.item_tax_template.name,
+						"tax_category": "",
+					}
+				],
+			}
+		).insert()
+		self.customer = frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_name": uuid4(),
+				"customer_group": "All Customer Groups",
+			}
+		).insert()
+		self.supplier = frappe.get_doc(
+			{
+				"doctype": "Supplier",
+				"supplier_name": uuid4(),
+				"supplier_group": "All Supplier Groups",
+			}
+		).insert()
 
-    def test_taxes(self):
-        self.created_docs = []
-        for dt in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice',
-                'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']:
-            doc = frappe.get_doc({
-                'doctype': dt,
-                'company': self.company.name,
-                'supplier': self.supplier.name,
-                'currency': "USD",
-                'schedule_date': frappe.utils.nowdate(),
-                'delivery_date': frappe.utils.nowdate(),
-                'customer': self.customer.name,
-                'buying_price_list' if dt.startswith('Purchase') else 'selling_price_list'
-                : 'Standard Buying' if dt.startswith('Purchase') else 'Standard Selling',
-                'items': [
-                    {
-                        'item_code': self.item.name,
-                        'qty': 300,
-                        'rate': 100,
-                    }
-                ],
-                'taxes': [
-                    {
-                        'charge_type': 'On Item Quantity',
-                        'account_head': self.account.name,
-                        'description': 'N/A',
-                        'rate': 0,
-                    },
-                ],
-            })
-            doc.run_method('set_missing_values')
-            doc.run_method('calculate_taxes_and_totals')
-            doc.insert()
-            self.assertEqual(doc.taxes[0].tax_amount, 600)
-            self.created_docs.append(doc)
+	def test_taxes(self):
+		self.created_docs = []
+		for dt in [
+			"Purchase Order",
+			"Purchase Receipt",
+			"Purchase Invoice",
+			"Quotation",
+			"Sales Order",
+			"Delivery Note",
+			"Sales Invoice",
+		]:
+			doc = frappe.get_doc(
+				{
+					"doctype": dt,
+					"company": self.company.name,
+					"supplier": self.supplier.name,
+					"currency": "USD",
+					"schedule_date": frappe.utils.nowdate(),
+					"delivery_date": frappe.utils.nowdate(),
+					"customer": self.customer.name,
+					"buying_price_list"
+					if dt.startswith("Purchase")
+					else "selling_price_list": "Standard Buying"
+					if dt.startswith("Purchase")
+					else "Standard Selling",
+					"items": [
+						{
+							"item_code": self.item.name,
+							"qty": 300,
+							"rate": 100,
+						}
+					],
+					"taxes": [
+						{
+							"charge_type": "On Item Quantity",
+							"account_head": self.account.name,
+							"description": "N/A",
+							"rate": 0,
+						},
+					],
+				}
+			)
+			doc.run_method("set_missing_values")
+			doc.run_method("calculate_taxes_and_totals")
+			doc.insert()
+			self.assertEqual(doc.taxes[0].tax_amount, 600)
+			self.created_docs.append(doc)
 
-    def tearDown(self):
-        for doc in self.created_docs:
-            doc.delete()
-        self.item.delete()
-        self.item_group.delete()
-        self.item_tax_template.delete()
-        self.account.delete()
-        self.company.delete()
+	def tearDown(self):
+		for doc in self.created_docs:
+			doc.delete()
+		self.item.delete()
+		self.item_group.delete()
+		self.item_tax_template.delete()
+		self.account.delete()
+		self.company.delete()
diff --git a/erpnext/controllers/tests/test_transaction_base.py b/erpnext/controllers/tests/test_transaction_base.py
index f4d3f97..1471543 100644
--- a/erpnext/controllers/tests/test_transaction_base.py
+++ b/erpnext/controllers/tests/test_transaction_base.py
@@ -5,18 +5,28 @@
 
 class TestUtils(unittest.TestCase):
 	def test_reset_default_field_value(self):
-		doc = frappe.get_doc({
-			"doctype": "Purchase Receipt",
-			"set_warehouse": "Warehouse 1",
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Purchase Receipt",
+				"set_warehouse": "Warehouse 1",
+			}
+		)
 
 		# Same values
-		doc.items = [{"warehouse": "Warehouse 1"}, {"warehouse": "Warehouse 1"}, {"warehouse": "Warehouse 1"}]
+		doc.items = [
+			{"warehouse": "Warehouse 1"},
+			{"warehouse": "Warehouse 1"},
+			{"warehouse": "Warehouse 1"},
+		]
 		doc.reset_default_field_value("set_warehouse", "items", "warehouse")
 		self.assertEqual(doc.set_warehouse, "Warehouse 1")
 
 		# Mixed values
-		doc.items = [{"warehouse": "Warehouse 1"}, {"warehouse": "Warehouse 2"}, {"warehouse": "Warehouse 1"}]
+		doc.items = [
+			{"warehouse": "Warehouse 1"},
+			{"warehouse": "Warehouse 2"},
+			{"warehouse": "Warehouse 1"},
+		]
 		doc.reset_default_field_value("set_warehouse", "items", "warehouse")
 		self.assertEqual(doc.set_warehouse, None)
 
@@ -30,9 +40,13 @@
 			from_warehouse="_Test Warehouse - _TC",
 			to_warehouse="_Test Warehouse 1 - _TC",
 			items=[
-				frappe._dict(item_code="_Test Item", qty=1, basic_rate=200, s_warehouse="_Test Warehouse - _TC"),
-				frappe._dict(item_code="_Test FG Item", qty=4, t_warehouse="_Test Warehouse 1 - _TC", is_finished_item=1)
-			]
+				frappe._dict(
+					item_code="_Test Item", qty=1, basic_rate=200, s_warehouse="_Test Warehouse - _TC"
+				),
+				frappe._dict(
+					item_code="_Test FG Item", qty=4, t_warehouse="_Test Warehouse 1 - _TC", is_finished_item=1
+				),
+			],
 		)
 		se.save()
 
@@ -43,18 +57,20 @@
 		se.delete()
 
 	def test_reset_default_field_value_in_transfer_stock_entry(self):
-		doc = frappe.get_doc({
-			"doctype": "Stock Entry",
-			"purpose": "Material Receipt",
-			"from_warehouse": "Warehouse 1",
-			"to_warehouse": "Warehouse 2",
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Stock Entry",
+				"purpose": "Material Receipt",
+				"from_warehouse": "Warehouse 1",
+				"to_warehouse": "Warehouse 2",
+			}
+		)
 
 		# Same values
 		doc.items = [
 			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"},
 			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"},
-			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"}
+			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"},
 		]
 
 		doc.reset_default_field_value("from_warehouse", "items", "s_warehouse")
@@ -66,10 +82,10 @@
 		doc.items = [
 			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"},
 			{"s_warehouse": "Warehouse 3", "t_warehouse": "Warehouse 2"},
-			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"}
+			{"s_warehouse": "Warehouse 1", "t_warehouse": "Warehouse 2"},
 		]
 
 		doc.reset_default_field_value("from_warehouse", "items", "s_warehouse")
 		doc.reset_default_field_value("to_warehouse", "items", "t_warehouse")
 		self.assertEqual(doc.from_warehouse, None)
-		self.assertEqual(doc.to_warehouse, "Warehouse 2")
\ No newline at end of file
+		self.assertEqual(doc.to_warehouse, "Warehouse 2")
diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py
index 1cb101f..1d6c5dc 100644
--- a/erpnext/controllers/trends.py
+++ b/erpnext/controllers/trends.py
@@ -17,17 +17,33 @@
 	# get conditions for grouping filter cond
 	group_by_cols = group_wise_column(filters.get("group_by"))
 
-	columns = based_on_details["based_on_cols"] + period_cols + [_("Total(Qty)") + ":Float:120", _("Total(Amt)") + ":Currency:120"]
+	columns = (
+		based_on_details["based_on_cols"]
+		+ period_cols
+		+ [_("Total(Qty)") + ":Float:120", _("Total(Amt)") + ":Currency:120"]
+	)
 	if group_by_cols:
-		columns = based_on_details["based_on_cols"] + group_by_cols + period_cols + \
-			[_("Total(Qty)") + ":Float:120", _("Total(Amt)") + ":Currency:120"]
+		columns = (
+			based_on_details["based_on_cols"]
+			+ group_by_cols
+			+ period_cols
+			+ [_("Total(Qty)") + ":Float:120", _("Total(Amt)") + ":Currency:120"]
+		)
 
-	conditions = {"based_on_select": based_on_details["based_on_select"], "period_wise_select": period_select,
-		"columns": columns, "group_by": based_on_details["based_on_group_by"], "grbc": group_by_cols, "trans": trans,
-		"addl_tables": based_on_details["addl_tables"], "addl_tables_relational_cond": based_on_details.get("addl_tables_relational_cond", "")}
+	conditions = {
+		"based_on_select": based_on_details["based_on_select"],
+		"period_wise_select": period_select,
+		"columns": columns,
+		"group_by": based_on_details["based_on_group_by"],
+		"grbc": group_by_cols,
+		"trans": trans,
+		"addl_tables": based_on_details["addl_tables"],
+		"addl_tables_relational_cond": based_on_details.get("addl_tables_relational_cond", ""),
+	}
 
 	return conditions
 
+
 def validate_filters(filters):
 	for f in ["Fiscal Year", "Based On", "Period", "Company"]:
 		if not filters.get(f.lower().replace(" ", "_")):
@@ -39,153 +55,231 @@
 	if filters.get("based_on") == filters.get("group_by"):
 		frappe.throw(_("'Based On' and 'Group By' can not be same"))
 
+
 def get_data(filters, conditions):
 	data = []
-	inc, cond= '',''
-	query_details =  conditions["based_on_select"] + conditions["period_wise_select"]
+	inc, cond = "", ""
+	query_details = conditions["based_on_select"] + conditions["period_wise_select"]
 
-	posting_date = 't1.transaction_date'
-	if conditions.get('trans') in ['Sales Invoice', 'Purchase Invoice', 'Purchase Receipt', 'Delivery Note']:
-		posting_date = 't1.posting_date'
+	posting_date = "t1.transaction_date"
+	if conditions.get("trans") in [
+		"Sales Invoice",
+		"Purchase Invoice",
+		"Purchase Receipt",
+		"Delivery Note",
+	]:
+		posting_date = "t1.posting_date"
 		if filters.period_based_on:
-			posting_date = 't1.'+filters.period_based_on
+			posting_date = "t1." + filters.period_based_on
 
 	if conditions["based_on_select"] in ["t1.project,", "t2.project,"]:
-		cond = ' and '+ conditions["based_on_select"][:-1] +' IS Not NULL'
-	if conditions.get('trans') in ['Sales Order', 'Purchase Order']:
+		cond = " and " + conditions["based_on_select"][:-1] + " IS Not NULL"
+	if conditions.get("trans") in ["Sales Order", "Purchase Order"]:
 		cond += " and t1.status != 'Closed'"
 
-	if conditions.get('trans') == 'Quotation' and filters.get("group_by") == 'Customer':
+	if conditions.get("trans") == "Quotation" and filters.get("group_by") == "Customer":
 		cond += " and t1.quotation_to = 'Customer'"
 
-	year_start_date, year_end_date = frappe.db.get_value("Fiscal Year",
-		filters.get('fiscal_year'), ["year_start_date", "year_end_date"])
+	year_start_date, year_end_date = frappe.db.get_value(
+		"Fiscal Year", filters.get("fiscal_year"), ["year_start_date", "year_end_date"]
+	)
 
 	if filters.get("group_by"):
-		sel_col = ''
+		sel_col = ""
 		ind = conditions["columns"].index(conditions["grbc"][0])
 
-		if filters.get("group_by") == 'Item':
-			sel_col = 't2.item_code'
-		elif filters.get("group_by") == 'Customer':
-			sel_col = 't1.party_name' if conditions.get('trans') == 'Quotation' else 't1.customer'
-		elif filters.get("group_by") == 'Supplier':
-			sel_col = 't1.supplier'
+		if filters.get("group_by") == "Item":
+			sel_col = "t2.item_code"
+		elif filters.get("group_by") == "Customer":
+			sel_col = "t1.party_name" if conditions.get("trans") == "Quotation" else "t1.customer"
+		elif filters.get("group_by") == "Supplier":
+			sel_col = "t1.supplier"
 
-		if filters.get('based_on') in ['Item','Customer','Supplier']:
+		if filters.get("based_on") in ["Item", "Customer", "Supplier"]:
 			inc = 2
-		else :
+		else:
 			inc = 1
-		data1 = frappe.db.sql(""" select %s from `tab%s` t1, `tab%s Item` t2 %s
+		data1 = frappe.db.sql(
+			""" select %s from `tab%s` t1, `tab%s Item` t2 %s
 					where t2.parent = t1.name and t1.company = %s and %s between %s and %s and
 					t1.docstatus = 1 %s %s
 					group by %s
-				""" % (query_details,  conditions["trans"],  conditions["trans"], conditions["addl_tables"], "%s",
-					posting_date, "%s", "%s", conditions.get("addl_tables_relational_cond"), cond, conditions["group_by"]), (filters.get("company"),
-					year_start_date, year_end_date),as_list=1)
+				"""
+			% (
+				query_details,
+				conditions["trans"],
+				conditions["trans"],
+				conditions["addl_tables"],
+				"%s",
+				posting_date,
+				"%s",
+				"%s",
+				conditions.get("addl_tables_relational_cond"),
+				cond,
+				conditions["group_by"],
+			),
+			(filters.get("company"), year_start_date, year_end_date),
+			as_list=1,
+		)
 
 		for d in range(len(data1)):
-			#to add blanck column
+			# to add blanck column
 			dt = data1[d]
-			dt.insert(ind,'')
+			dt.insert(ind, "")
 			data.append(dt)
 
-			#to get distinct value of col specified by group_by in filter
-			row = frappe.db.sql("""select DISTINCT(%s) from `tab%s` t1, `tab%s Item` t2 %s
+			# to get distinct value of col specified by group_by in filter
+			row = frappe.db.sql(
+				"""select DISTINCT(%s) from `tab%s` t1, `tab%s Item` t2 %s
 						where t2.parent = t1.name and t1.company = %s and %s between %s and %s
 						and t1.docstatus = 1 and %s = %s %s %s
-					""" %
-					(sel_col,  conditions["trans"],  conditions["trans"], conditions["addl_tables"],
-						"%s", posting_date, "%s", "%s", conditions["group_by"], "%s", conditions.get("addl_tables_relational_cond"), cond),
-					(filters.get("company"), year_start_date, year_end_date, data1[d][0]), as_list=1)
+					"""
+				% (
+					sel_col,
+					conditions["trans"],
+					conditions["trans"],
+					conditions["addl_tables"],
+					"%s",
+					posting_date,
+					"%s",
+					"%s",
+					conditions["group_by"],
+					"%s",
+					conditions.get("addl_tables_relational_cond"),
+					cond,
+				),
+				(filters.get("company"), year_start_date, year_end_date, data1[d][0]),
+				as_list=1,
+			)
 
 			for i in range(len(row)):
-				des = ['' for q in range(len(conditions["columns"]))]
+				des = ["" for q in range(len(conditions["columns"]))]
 
-				#get data for group_by filter
-				row1 = frappe.db.sql(""" select %s , %s from `tab%s` t1, `tab%s Item` t2 %s
+				# get data for group_by filter
+				row1 = frappe.db.sql(
+					""" select %s , %s from `tab%s` t1, `tab%s Item` t2 %s
 							where t2.parent = t1.name and t1.company = %s and %s between %s and %s
 							and t1.docstatus = 1 and %s = %s and %s = %s %s %s
-						""" %
-						(sel_col, conditions["period_wise_select"], conditions["trans"],
-							conditions["trans"], conditions["addl_tables"], "%s", posting_date, "%s","%s", sel_col,
-							"%s", conditions["group_by"], "%s", conditions.get("addl_tables_relational_cond"), cond),
-						(filters.get("company"), year_start_date, year_end_date, row[i][0],
-							data1[d][0]), as_list=1)
+						"""
+					% (
+						sel_col,
+						conditions["period_wise_select"],
+						conditions["trans"],
+						conditions["trans"],
+						conditions["addl_tables"],
+						"%s",
+						posting_date,
+						"%s",
+						"%s",
+						sel_col,
+						"%s",
+						conditions["group_by"],
+						"%s",
+						conditions.get("addl_tables_relational_cond"),
+						cond,
+					),
+					(filters.get("company"), year_start_date, year_end_date, row[i][0], data1[d][0]),
+					as_list=1,
+				)
 
 				des[ind] = row[i][0]
 
-				for j in range(1,len(conditions["columns"])-inc):
-					des[j+inc] = row1[0][j]
+				for j in range(1, len(conditions["columns"]) - inc):
+					des[j + inc] = row1[0][j]
 
 				data.append(des)
 	else:
-		data = frappe.db.sql(""" select %s from `tab%s` t1, `tab%s Item` t2 %s
+		data = frappe.db.sql(
+			""" select %s from `tab%s` t1, `tab%s Item` t2 %s
 					where t2.parent = t1.name and t1.company = %s and %s between %s and %s and
 					t1.docstatus = 1 %s %s
 					group by %s
-				""" %
-				(query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"],
-					"%s", posting_date, "%s", "%s", cond, conditions.get("addl_tables_relational_cond", ""), conditions["group_by"]),
-				(filters.get("company"), year_start_date, year_end_date), as_list=1)
+				"""
+			% (
+				query_details,
+				conditions["trans"],
+				conditions["trans"],
+				conditions["addl_tables"],
+				"%s",
+				posting_date,
+				"%s",
+				"%s",
+				cond,
+				conditions.get("addl_tables_relational_cond", ""),
+				conditions["group_by"],
+			),
+			(filters.get("company"), year_start_date, year_end_date),
+			as_list=1,
+		)
 
 	return data
 
+
 def get_mon(dt):
 	return getdate(dt).strftime("%b")
 
+
 def period_wise_columns_query(filters, trans):
-	query_details = ''
+	query_details = ""
 	pwc = []
 	bet_dates = get_period_date_ranges(filters.get("period"), filters.get("fiscal_year"))
 
-	if trans in ['Purchase Receipt', 'Delivery Note', 'Purchase Invoice', 'Sales Invoice']:
-		trans_date = 'posting_date'
+	if trans in ["Purchase Receipt", "Delivery Note", "Purchase Invoice", "Sales Invoice"]:
+		trans_date = "posting_date"
 		if filters.period_based_on:
 			trans_date = filters.period_based_on
 	else:
-		trans_date = 'transaction_date'
+		trans_date = "transaction_date"
 
-	if filters.get("period") != 'Yearly':
+	if filters.get("period") != "Yearly":
 		for dt in bet_dates:
 			get_period_wise_columns(dt, filters.get("period"), pwc)
 			query_details = get_period_wise_query(dt, trans_date, query_details)
 	else:
-		pwc = [_(filters.get("fiscal_year")) + " ("+_("Qty") + "):Float:120",
-			_(filters.get("fiscal_year")) + " ("+ _("Amt") + "):Currency:120"]
+		pwc = [
+			_(filters.get("fiscal_year")) + " (" + _("Qty") + "):Float:120",
+			_(filters.get("fiscal_year")) + " (" + _("Amt") + "):Currency:120",
+		]
 		query_details = " SUM(t2.stock_qty), SUM(t2.base_net_amount),"
 
-	query_details += 'SUM(t2.stock_qty), SUM(t2.base_net_amount)'
+	query_details += "SUM(t2.stock_qty), SUM(t2.base_net_amount)"
 	return pwc, query_details
 
+
 def get_period_wise_columns(bet_dates, period, pwc):
-	if period == 'Monthly':
-		pwc += [_(get_mon(bet_dates[0])) + " (" + _("Qty") + "):Float:120",
-			_(get_mon(bet_dates[0])) + " (" + _("Amt") + "):Currency:120"]
+	if period == "Monthly":
+		pwc += [
+			_(get_mon(bet_dates[0])) + " (" + _("Qty") + "):Float:120",
+			_(get_mon(bet_dates[0])) + " (" + _("Amt") + "):Currency:120",
+		]
 	else:
-		pwc += [_(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Qty") + "):Float:120",
-			_(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Amt") + "):Currency:120"]
+		pwc += [
+			_(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Qty") + "):Float:120",
+			_(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Amt") + "):Currency:120",
+		]
+
 
 def get_period_wise_query(bet_dates, trans_date, query_details):
 	query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.stock_qty, NULL)),
 					SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.base_net_amount, NULL)),
-				""" % {"trans_date": trans_date, "sd": bet_dates[0],"ed": bet_dates[1]}
+				""" % {
+		"trans_date": trans_date,
+		"sd": bet_dates[0],
+		"ed": bet_dates[1],
+	}
 	return query_details
 
+
 @frappe.whitelist(allow_guest=True)
 def get_period_date_ranges(period, fiscal_year=None, year_start_date=None):
 	from dateutil.relativedelta import relativedelta
 
 	if not year_start_date:
-		year_start_date, year_end_date = frappe.db.get_value("Fiscal Year",
-			fiscal_year, ["year_start_date", "year_end_date"])
+		year_start_date, year_end_date = frappe.db.get_value(
+			"Fiscal Year", fiscal_year, ["year_start_date", "year_end_date"]
+		)
 
-	increment = {
-		"Monthly": 1,
-		"Quarterly": 3,
-		"Half-Yearly": 6,
-		"Yearly": 12
-	}.get(period)
+	increment = {"Monthly": 1, "Quarterly": 3, "Half-Yearly": 6, "Yearly": 12}.get(period)
 
 	period_date_ranges = []
 	for i in range(1, 13, increment):
@@ -199,8 +293,10 @@
 
 	return period_date_ranges
 
+
 def get_period_month_ranges(period, fiscal_year):
 	from dateutil.relativedelta import relativedelta
+
 	period_month_ranges = []
 
 	for start_date, end_date in get_period_date_ranges(period, fiscal_year):
@@ -212,6 +308,7 @@
 
 	return period_month_ranges
 
+
 def based_wise_columns_query(based_on, trans):
 	based_on_details = {}
 
@@ -219,65 +316,74 @@
 	if based_on == "Item":
 		based_on_details["based_on_cols"] = ["Item:Link/Item:120", "Item Name:Data:120"]
 		based_on_details["based_on_select"] = "t2.item_code, t2.item_name,"
-		based_on_details["based_on_group_by"] = 't2.item_code'
-		based_on_details["addl_tables"] = ''
+		based_on_details["based_on_group_by"] = "t2.item_code"
+		based_on_details["addl_tables"] = ""
 
 	elif based_on == "Item Group":
 		based_on_details["based_on_cols"] = ["Item Group:Link/Item Group:120"]
 		based_on_details["based_on_select"] = "t2.item_group,"
-		based_on_details["based_on_group_by"] = 't2.item_group'
-		based_on_details["addl_tables"] = ''
+		based_on_details["based_on_group_by"] = "t2.item_group"
+		based_on_details["addl_tables"] = ""
 
 	elif based_on == "Customer":
-		based_on_details["based_on_cols"] = ["Customer:Link/Customer:120", "Territory:Link/Territory:120"]
+		based_on_details["based_on_cols"] = [
+			"Customer:Link/Customer:120",
+			"Territory:Link/Territory:120",
+		]
 		based_on_details["based_on_select"] = "t1.customer_name, t1.territory, "
-		based_on_details["based_on_group_by"] = 't1.party_name' if trans == 'Quotation' else 't1.customer'
-		based_on_details["addl_tables"] = ''
+		based_on_details["based_on_group_by"] = (
+			"t1.party_name" if trans == "Quotation" else "t1.customer"
+		)
+		based_on_details["addl_tables"] = ""
 
 	elif based_on == "Customer Group":
 		based_on_details["based_on_cols"] = ["Customer Group:Link/Customer Group"]
 		based_on_details["based_on_select"] = "t1.customer_group,"
-		based_on_details["based_on_group_by"] = 't1.customer_group'
-		based_on_details["addl_tables"] = ''
+		based_on_details["based_on_group_by"] = "t1.customer_group"
+		based_on_details["addl_tables"] = ""
 
-	elif based_on == 'Supplier':
-		based_on_details["based_on_cols"] = ["Supplier:Link/Supplier:120", "Supplier Group:Link/Supplier Group:140"]
+	elif based_on == "Supplier":
+		based_on_details["based_on_cols"] = [
+			"Supplier:Link/Supplier:120",
+			"Supplier Group:Link/Supplier Group:140",
+		]
 		based_on_details["based_on_select"] = "t1.supplier, t3.supplier_group,"
-		based_on_details["based_on_group_by"] = 't1.supplier'
-		based_on_details["addl_tables"] = ',`tabSupplier` t3'
+		based_on_details["based_on_group_by"] = "t1.supplier"
+		based_on_details["addl_tables"] = ",`tabSupplier` t3"
 		based_on_details["addl_tables_relational_cond"] = " and t1.supplier = t3.name"
 
-	elif based_on == 'Supplier Group':
+	elif based_on == "Supplier Group":
 		based_on_details["based_on_cols"] = ["Supplier Group:Link/Supplier Group:140"]
 		based_on_details["based_on_select"] = "t3.supplier_group,"
-		based_on_details["based_on_group_by"] = 't3.supplier_group'
-		based_on_details["addl_tables"] = ',`tabSupplier` t3'
+		based_on_details["based_on_group_by"] = "t3.supplier_group"
+		based_on_details["addl_tables"] = ",`tabSupplier` t3"
 		based_on_details["addl_tables_relational_cond"] = " and t1.supplier = t3.name"
 
 	elif based_on == "Territory":
 		based_on_details["based_on_cols"] = ["Territory:Link/Territory:120"]
 		based_on_details["based_on_select"] = "t1.territory,"
-		based_on_details["based_on_group_by"] = 't1.territory'
-		based_on_details["addl_tables"] = ''
+		based_on_details["based_on_group_by"] = "t1.territory"
+		based_on_details["addl_tables"] = ""
 
 	elif based_on == "Project":
-		if trans in ['Sales Invoice', 'Delivery Note', 'Sales Order']:
+		if trans in ["Sales Invoice", "Delivery Note", "Sales Order"]:
 			based_on_details["based_on_cols"] = ["Project:Link/Project:120"]
 			based_on_details["based_on_select"] = "t1.project,"
-			based_on_details["based_on_group_by"] = 't1.project'
-			based_on_details["addl_tables"] = ''
-		elif trans in ['Purchase Order', 'Purchase Invoice', 'Purchase Receipt']:
+			based_on_details["based_on_group_by"] = "t1.project"
+			based_on_details["addl_tables"] = ""
+		elif trans in ["Purchase Order", "Purchase Invoice", "Purchase Receipt"]:
 			based_on_details["based_on_cols"] = ["Project:Link/Project:120"]
 			based_on_details["based_on_select"] = "t2.project,"
-			based_on_details["based_on_group_by"] = 't2.project'
-			based_on_details["addl_tables"] = ''
+			based_on_details["based_on_group_by"] = "t2.project"
+			based_on_details["addl_tables"] = ""
 		else:
 			frappe.throw(_("Project-wise data is not available for Quotation"))
 
 	return based_on_details
 
+
 def group_wise_column(group_by):
 	if group_by:
-		return [group_by+":Link/"+group_by+":120"]
+		return [group_by + ":Link/" + group_by + ":120"]
 	else:
 		return []
diff --git a/erpnext/controllers/website_list_for_contact.py b/erpnext/controllers/website_list_for_contact.py
index 23463ab..4673230 100644
--- a/erpnext/controllers/website_list_for_contact.py
+++ b/erpnext/controllers/website_list_for_contact.py
@@ -15,21 +15,29 @@
 	return {
 		"global_number_format": frappe.db.get_default("number_format") or "#,###.##",
 		"currency": frappe.db.get_default("currency"),
-		"currency_symbols": json.dumps(dict(frappe.db.sql("""select name, symbol
-			from tabCurrency where enabled=1"""))),
+		"currency_symbols": json.dumps(
+			dict(
+				frappe.db.sql(
+					"""select name, symbol
+			from tabCurrency where enabled=1"""
+				)
+			)
+		),
 		"row_template": "templates/includes/transaction_row.html",
-		"get_list": get_transaction_list
+		"get_list": get_transaction_list,
 	}
 
+
 def get_webform_list_context(module):
-	if get_module_app(module) != 'erpnext':
+	if get_module_app(module) != "erpnext":
 		return
-	return {
-		"get_list": get_webform_transaction_list
-	}
+	return {"get_list": get_webform_transaction_list}
 
-def get_webform_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by="modified"):
-	""" Get List of transactions for custom doctypes """
+
+def get_webform_transaction_list(
+	doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by="modified"
+):
+	"""Get List of transactions for custom doctypes"""
 	from frappe.www.list import get_list
 
 	if not filters:
@@ -38,42 +46,62 @@
 	meta = frappe.get_meta(doctype)
 
 	for d in meta.fields:
-		if d.fieldtype == 'Link' and d.fieldname != 'amended_from':
+		if d.fieldtype == "Link" and d.fieldname != "amended_from":
 			allowed_docs = [d.name for d in get_transaction_list(doctype=d.options, custom=True)]
-			allowed_docs.append('')
-			filters.append((d.fieldname, 'in', allowed_docs))
+			allowed_docs.append("")
+			filters.append((d.fieldname, "in", allowed_docs))
 
-	return get_list(doctype, txt, filters, limit_start, limit_page_length, ignore_permissions=False,
-		fields=None, order_by="modified")
+	return get_list(
+		doctype,
+		txt,
+		filters,
+		limit_start,
+		limit_page_length,
+		ignore_permissions=False,
+		fields=None,
+		order_by="modified",
+	)
 
-def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by="modified", custom=False):
+
+def get_transaction_list(
+	doctype,
+	txt=None,
+	filters=None,
+	limit_start=0,
+	limit_page_length=20,
+	order_by="modified",
+	custom=False,
+):
 	user = frappe.session.user
 	ignore_permissions = False
 
-	if not filters: filters = []
+	if not filters:
+		filters = []
 
-	if doctype in ['Supplier Quotation', 'Purchase Invoice']:
-		filters.append((doctype, 'docstatus', '<', 2))
+	if doctype in ["Supplier Quotation", "Purchase Invoice"]:
+		filters.append((doctype, "docstatus", "<", 2))
 	else:
-		filters.append((doctype, 'docstatus', '=', 1))
+		filters.append((doctype, "docstatus", "=", 1))
 
-	if (user != 'Guest' and is_website_user()) or doctype == 'Request for Quotation':
-		parties_doctype = 'Request for Quotation Supplier' if doctype == 'Request for Quotation' else doctype
+	if (user != "Guest" and is_website_user()) or doctype == "Request for Quotation":
+		parties_doctype = (
+			"Request for Quotation Supplier" if doctype == "Request for Quotation" else doctype
+		)
 		# find party for this contact
 		customers, suppliers = get_customers_suppliers(parties_doctype, user)
 
 		if customers:
-			if doctype == 'Quotation':
-				filters.append(('quotation_to', '=', 'Customer'))
-				filters.append(('party_name', 'in', customers))
+			if doctype == "Quotation":
+				filters.append(("quotation_to", "=", "Customer"))
+				filters.append(("party_name", "in", customers))
 			else:
-				filters.append(('customer', 'in', customers))
+				filters.append(("customer", "in", customers))
 		elif suppliers:
-			filters.append(('supplier', 'in', suppliers))
+			filters.append(("supplier", "in", suppliers))
 		elif not custom:
 			return []
 
-		if doctype == 'Request for Quotation':
+		if doctype == "Request for Quotation":
 			parties = customers or suppliers
 			return rfq_transaction_list(parties_doctype, doctype, parties, limit_start, limit_page_length)
 
@@ -84,49 +112,88 @@
 			ignore_permissions = False
 			filters = []
 
-	transactions = get_list_for_transactions(doctype, txt, filters, limit_start, limit_page_length,
-		fields='name', ignore_permissions=ignore_permissions, order_by='modified desc')
+	transactions = get_list_for_transactions(
+		doctype,
+		txt,
+		filters,
+		limit_start,
+		limit_page_length,
+		fields="name",
+		ignore_permissions=ignore_permissions,
+		order_by="modified desc",
+	)
 
 	if custom:
 		return transactions
 
 	return post_process(doctype, transactions)
 
-def get_list_for_transactions(doctype, txt, filters, limit_start, limit_page_length=20,
-	ignore_permissions=False, fields=None, order_by=None):
-	""" Get List of transactions like Invoices, Orders """
+
+def get_list_for_transactions(
+	doctype,
+	txt,
+	filters,
+	limit_start,
+	limit_page_length=20,
+	ignore_permissions=False,
+	fields=None,
+	order_by=None,
+):
+	"""Get List of transactions like Invoices, Orders"""
 	from frappe.www.list import get_list
+
 	meta = frappe.get_meta(doctype)
 	data = []
 	or_filters = []
 
-	for d in get_list(doctype, txt, filters=filters, fields="name", limit_start=limit_start,
-		limit_page_length=limit_page_length, ignore_permissions=ignore_permissions, order_by="modified desc"):
+	for d in get_list(
+		doctype,
+		txt,
+		filters=filters,
+		fields="name",
+		limit_start=limit_start,
+		limit_page_length=limit_page_length,
+		ignore_permissions=ignore_permissions,
+		order_by="modified desc",
+	):
 		data.append(d)
 
 	if txt:
-		if meta.get_field('items'):
-			if meta.get_field('items').options:
-				child_doctype = meta.get_field('items').options
-				for item in frappe.get_all(child_doctype, {"item_name": ['like', "%" + txt + "%"]}):
+		if meta.get_field("items"):
+			if meta.get_field("items").options:
+				child_doctype = meta.get_field("items").options
+				for item in frappe.get_all(child_doctype, {"item_name": ["like", "%" + txt + "%"]}):
 					child = frappe.get_doc(child_doctype, item.name)
 					or_filters.append([doctype, "name", "=", child.parent])
 
 	if or_filters:
-		for r in frappe.get_list(doctype, fields=fields,filters=filters, or_filters=or_filters,
-			limit_start=limit_start, limit_page_length=limit_page_length,
-			ignore_permissions=ignore_permissions, order_by=order_by):
+		for r in frappe.get_list(
+			doctype,
+			fields=fields,
+			filters=filters,
+			or_filters=or_filters,
+			limit_start=limit_start,
+			limit_page_length=limit_page_length,
+			ignore_permissions=ignore_permissions,
+			order_by=order_by,
+		):
 			data.append(r)
 
 	return data
 
+
 def rfq_transaction_list(parties_doctype, doctype, parties, limit_start, limit_page_length):
-	data = frappe.db.sql("""select distinct parent as name, supplier from `tab{doctype}`
-			where supplier = '{supplier}' and docstatus=1  order by modified desc limit {start}, {len}""".
-			format(doctype=parties_doctype, supplier=parties[0], start=limit_start, len = limit_page_length), as_dict=1)
+	data = frappe.db.sql(
+		"""select distinct parent as name, supplier from `tab{doctype}`
+			where supplier = '{supplier}' and docstatus=1  order by modified desc limit {start}, {len}""".format(
+			doctype=parties_doctype, supplier=parties[0], start=limit_start, len=limit_page_length
+		),
+		as_dict=1,
+	)
 
 	return post_process(doctype, data)
 
+
 def post_process(doctype, data):
 	result = []
 	for d in data:
@@ -137,11 +204,15 @@
 
 		if doc.get("per_billed"):
 			doc.status_percent += flt(doc.per_billed)
-			doc.status_display.append(_("Billed") if doc.per_billed==100 else _("{0}% Billed").format(doc.per_billed))
+			doc.status_display.append(
+				_("Billed") if doc.per_billed == 100 else _("{0}% Billed").format(doc.per_billed)
+			)
 
 		if doc.get("per_delivered"):
 			doc.status_percent += flt(doc.per_delivered)
-			doc.status_display.append(_("Delivered") if doc.per_delivered==100 else _("{0}% Delivered").format(doc.per_delivered))
+			doc.status_display.append(
+				_("Delivered") if doc.per_delivered == 100 else _("{0}% Delivered").format(doc.per_delivered)
+			)
 
 		if hasattr(doc, "set_indicator"):
 			doc.set_indicator()
@@ -152,6 +223,7 @@
 
 	return result
 
+
 def get_customers_suppliers(doctype, user):
 	customers = []
 	suppliers = []
@@ -160,10 +232,11 @@
 	customer_field_name = get_customer_field_name(doctype)
 
 	has_customer_field = meta.has_field(customer_field_name)
-	has_supplier_field = meta.has_field('supplier')
+	has_supplier_field = meta.has_field("supplier")
 
 	if has_common(["Supplier", "Customer"], frappe.get_roles(user)):
-		contacts = frappe.db.sql("""
+		contacts = frappe.db.sql(
+			"""
 			select
 				`tabContact`.email_id,
 				`tabDynamic Link`.link_doctype,
@@ -172,15 +245,18 @@
 				`tabContact`, `tabDynamic Link`
 			where
 				`tabContact`.name=`tabDynamic Link`.parent and `tabContact`.email_id =%s
-			""", user, as_dict=1)
-		customers = [c.link_name for c in contacts if c.link_doctype == 'Customer']
-		suppliers = [c.link_name for c in contacts if c.link_doctype == 'Supplier']
-	elif frappe.has_permission(doctype, 'read', user=user):
+			""",
+			user,
+			as_dict=1,
+		)
+		customers = [c.link_name for c in contacts if c.link_doctype == "Customer"]
+		suppliers = [c.link_name for c in contacts if c.link_doctype == "Supplier"]
+	elif frappe.has_permission(doctype, "read", user=user):
 		customer_list = frappe.get_list("Customer")
 		customers = suppliers = [customer.name for customer in customer_list]
 
-	return customers if has_customer_field else None, \
-		suppliers if has_supplier_field else None
+	return customers if has_customer_field else None, suppliers if has_supplier_field else None
+
 
 def has_website_permission(doc, ptype, user, verbose=False):
 	doctype = doc.doctype
@@ -188,25 +264,24 @@
 	if customers:
 		return frappe.db.exists(doctype, get_customer_filter(doc, customers))
 	elif suppliers:
-		fieldname = 'suppliers' if doctype == 'Request for Quotation' else 'supplier'
-		return frappe.db.exists(doctype, {
-			'name': doc.name,
-			fieldname: ["in", suppliers]
-		})
+		fieldname = "suppliers" if doctype == "Request for Quotation" else "supplier"
+		return frappe.db.exists(doctype, {"name": doc.name, fieldname: ["in", suppliers]})
 	else:
 		return False
 
+
 def get_customer_filter(doc, customers):
 	doctype = doc.doctype
 	filters = frappe._dict()
 	filters.name = doc.name
-	filters[get_customer_field_name(doctype)] = ['in', customers]
-	if doctype == 'Quotation':
-		filters.quotation_to = 'Customer'
+	filters[get_customer_field_name(doctype)] = ["in", customers]
+	if doctype == "Quotation":
+		filters.quotation_to = "Customer"
 	return filters
 
+
 def get_customer_field_name(doctype):
-	if doctype == 'Quotation':
-		return 'party_name'
+	if doctype == "Quotation":
+		return "party_name"
 	else:
-		return 'customer'
+		return "customer"
diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py
index 88a9c10..5f5923d 100644
--- a/erpnext/crm/doctype/appointment/appointment.py
+++ b/erpnext/crm/doctype/appointment/appointment.py
@@ -12,17 +12,17 @@
 
 
 class Appointment(Document):
-
 	def find_lead_by_email(self):
 		lead_list = frappe.get_list(
-			'Lead', filters={'email_id': self.customer_email}, ignore_permissions=True)
+			"Lead", filters={"email_id": self.customer_email}, ignore_permissions=True
+		)
 		if lead_list:
 			return lead_list[0].name
 		return None
 
 	def find_customer_by_email(self):
 		customer_list = frappe.get_list(
-			'Customer', filters={'email_id': self.customer_email}, ignore_permissions=True
+			"Customer", filters={"email_id": self.customer_email}, ignore_permissions=True
 		)
 		if customer_list:
 			return customer_list[0].name
@@ -30,11 +30,12 @@
 
 	def before_insert(self):
 		number_of_appointments_in_same_slot = frappe.db.count(
-			'Appointment', filters={'scheduled_time': self.scheduled_time})
-		number_of_agents = frappe.db.get_single_value('Appointment Booking Settings', 'number_of_agents')
+			"Appointment", filters={"scheduled_time": self.scheduled_time}
+		)
+		number_of_agents = frappe.db.get_single_value("Appointment Booking Settings", "number_of_agents")
 		if not number_of_agents == 0:
-			if (number_of_appointments_in_same_slot >= number_of_agents):
-				frappe.throw(_('Time slot is not available'))
+			if number_of_appointments_in_same_slot >= number_of_agents:
+				frappe.throw(_("Time slot is not available"))
 		# Link lead
 		if not self.party:
 			lead = self.find_lead_by_email()
@@ -53,45 +54,46 @@
 			self.create_calendar_event()
 		else:
 			# Set status to unverified
-			self.status = 'Unverified'
+			self.status = "Unverified"
 			# Send email to confirm
 			self.send_confirmation_email()
 
 	def send_confirmation_email(self):
 		verify_url = self._get_verify_url()
-		template = 'confirm_appointment'
+		template = "confirm_appointment"
 		args = {
-			"link":verify_url,
-			"site_url":frappe.utils.get_url(),
-			"full_name":self.customer_name,
+			"link": verify_url,
+			"site_url": frappe.utils.get_url(),
+			"full_name": self.customer_name,
 		}
-		frappe.sendmail(recipients=[self.customer_email],
-						template=template,
-						args=args,
-						subject=_('Appointment Confirmation'))
+		frappe.sendmail(
+			recipients=[self.customer_email],
+			template=template,
+			args=args,
+			subject=_("Appointment Confirmation"),
+		)
 		if frappe.session.user == "Guest":
+			frappe.msgprint(_("Please check your email to confirm the appointment"))
+		else:
 			frappe.msgprint(
-				_('Please check your email to confirm the appointment'))
-		else :
-			frappe.msgprint(
-				_('Appointment was created. But no lead was found. Please check the email to confirm'))
+				_("Appointment was created. But no lead was found. Please check the email to confirm")
+			)
 
 	def on_change(self):
 		# Sync Calendar
 		if not self.calendar_event:
 			return
-		cal_event = frappe.get_doc('Event', self.calendar_event)
+		cal_event = frappe.get_doc("Event", self.calendar_event)
 		cal_event.starts_on = self.scheduled_time
 		cal_event.save(ignore_permissions=True)
 
-
 	def set_verified(self, email):
 		if not email == self.customer_email:
-			frappe.throw(_('Email verification failed.'))
+			frappe.throw(_("Email verification failed."))
 		# Create new lead
 		self.create_lead_and_link()
 		# Remove unverified status
-		self.status = 'Open'
+		self.status = "Open"
 		# Create calender event
 		self.auto_assign()
 		self.create_calendar_event()
@@ -102,58 +104,53 @@
 		# Return if already linked
 		if self.party:
 			return
-		lead = frappe.get_doc({
-			'doctype': 'Lead',
-			'lead_name': self.customer_name,
-			'email_id': self.customer_email,
-			'notes': self.customer_details,
-			'phone': self.customer_phone_number,
-		})
+		lead = frappe.get_doc(
+			{
+				"doctype": "Lead",
+				"lead_name": self.customer_name,
+				"email_id": self.customer_email,
+				"notes": self.customer_details,
+				"phone": self.customer_phone_number,
+			}
+		)
 		lead.insert(ignore_permissions=True)
 		# Link lead
 		self.party = lead.name
 
 	def auto_assign(self):
 		from frappe.desk.form.assign_to import add as add_assignemnt
+
 		existing_assignee = self.get_assignee_from_latest_opportunity()
 		if existing_assignee:
 			# If the latest opportunity is assigned to someone
 			# Assign the appointment to the same
-			add_assignemnt({
-				'doctype': self.doctype,
-				'name': self.name,
-				'assign_to': [existing_assignee]
-			})
+			add_assignemnt({"doctype": self.doctype, "name": self.name, "assign_to": [existing_assignee]})
 			return
 		if self._assign:
 			return
-		available_agents = _get_agents_sorted_by_asc_workload(
-			getdate(self.scheduled_time))
+		available_agents = _get_agents_sorted_by_asc_workload(getdate(self.scheduled_time))
 		for agent in available_agents:
-			if(_check_agent_availability(agent, self.scheduled_time)):
+			if _check_agent_availability(agent, self.scheduled_time):
 				agent = agent[0]
-				add_assignemnt({
-					'doctype': self.doctype,
-					'name': self.name,
-					'assign_to': [agent]
-				})
+				add_assignemnt({"doctype": self.doctype, "name": self.name, "assign_to": [agent]})
 			break
 
 	def get_assignee_from_latest_opportunity(self):
 		if not self.party:
 			return None
-		if not frappe.db.exists('Lead', self.party):
+		if not frappe.db.exists("Lead", self.party):
 			return None
 		opporutnities = frappe.get_list(
-			'Opportunity',
+			"Opportunity",
 			filters={
-				'party_name': self.party,
+				"party_name": self.party,
 			},
 			ignore_permissions=True,
-			order_by='creation desc')
+			order_by="creation desc",
+		)
 		if not opporutnities:
 			return None
-		latest_opportunity = frappe.get_doc('Opportunity', opporutnities[0].name )
+		latest_opportunity = frappe.get_doc("Opportunity", opporutnities[0].name)
 		assignee = latest_opportunity._assign
 		if not assignee:
 			return None
@@ -163,35 +160,36 @@
 	def create_calendar_event(self):
 		if self.calendar_event:
 			return
-		appointment_event = frappe.get_doc({
-			'doctype': 'Event',
-			'subject': ' '.join(['Appointment with', self.customer_name]),
-			'starts_on': self.scheduled_time,
-			'status': 'Open',
-			'type': 'Public',
-			'send_reminder': frappe.db.get_single_value('Appointment Booking Settings', 'email_reminders'),
-			'event_participants': [dict(reference_doctype=self.appointment_with, reference_docname=self.party)]
-		})
+		appointment_event = frappe.get_doc(
+			{
+				"doctype": "Event",
+				"subject": " ".join(["Appointment with", self.customer_name]),
+				"starts_on": self.scheduled_time,
+				"status": "Open",
+				"type": "Public",
+				"send_reminder": frappe.db.get_single_value("Appointment Booking Settings", "email_reminders"),
+				"event_participants": [
+					dict(reference_doctype=self.appointment_with, reference_docname=self.party)
+				],
+			}
+		)
 		employee = _get_employee_from_user(self._assign)
 		if employee:
-			appointment_event.append('event_participants', dict(
-				reference_doctype='Employee',
-				reference_docname=employee.name))
+			appointment_event.append(
+				"event_participants", dict(reference_doctype="Employee", reference_docname=employee.name)
+			)
 		appointment_event.insert(ignore_permissions=True)
 		self.calendar_event = appointment_event.name
 		self.save(ignore_permissions=True)
 
 	def _get_verify_url(self):
-		verify_route = '/book_appointment/verify'
-		params = {
-			'email': self.customer_email,
-			'appointment': self.name
-		}
-		return get_url(verify_route + '?' + get_signed_params(params))
+		verify_route = "/book_appointment/verify"
+		params = {"email": self.customer_email, "appointment": self.name}
+		return get_url(verify_route + "?" + get_signed_params(params))
 
 
 def _get_agents_sorted_by_asc_workload(date):
-	appointments = frappe.db.get_list('Appointment', fields='*')
+	appointments = frappe.db.get_list("Appointment", fields="*")
 	agent_list = _get_agent_list_as_strings()
 	if not appointments:
 		return agent_list
@@ -209,7 +207,7 @@
 
 def _get_agent_list_as_strings():
 	agent_list_as_strings = []
-	agent_list = frappe.get_doc('Appointment Booking Settings').agent_list
+	agent_list = frappe.get_doc("Appointment Booking Settings").agent_list
 	for agent in agent_list:
 		agent_list_as_strings.append(agent.user)
 	return agent_list_as_strings
@@ -217,7 +215,8 @@
 
 def _check_agent_availability(agent_email, scheduled_time):
 	appointemnts_at_scheduled_time = frappe.get_list(
-		'Appointment', filters={'scheduled_time': scheduled_time})
+		"Appointment", filters={"scheduled_time": scheduled_time}
+	)
 	for appointment in appointemnts_at_scheduled_time:
 		if appointment._assign == agent_email:
 			return False
@@ -225,7 +224,7 @@
 
 
 def _get_employee_from_user(user):
-	employee_docname = frappe.db.get_value('Employee', {'user_id': user})
+	employee_docname = frappe.db.get_value("Employee", {"user_id": user})
 	if employee_docname:
-		return frappe.get_doc('Employee', employee_docname)
+		return frappe.get_doc("Employee", employee_docname)
 	return None
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
index 1431b03..e43f460 100644
--- a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
@@ -10,8 +10,8 @@
 
 
 class AppointmentBookingSettings(Document):
-	agent_list = [] #Hack
-	min_date = '01/01/1970 '
+	agent_list = []  # Hack
+	min_date = "01/01/1970 "
 	format_string = "%d/%m/%Y %H:%M:%S"
 
 	def validate(self):
@@ -23,21 +23,22 @@
 
 	def validate_availability_of_slots(self):
 		for record in self.availability_of_slots:
-			from_time = datetime.datetime.strptime(
-				self.min_date+record.from_time, self.format_string)
-			to_time = datetime.datetime.strptime(
-				self.min_date+record.to_time, self.format_string)
-			timedelta = to_time-from_time
+			from_time = datetime.datetime.strptime(self.min_date + record.from_time, self.format_string)
+			to_time = datetime.datetime.strptime(self.min_date + record.to_time, self.format_string)
+			timedelta = to_time - from_time
 			self.validate_from_and_to_time(from_time, to_time, record)
 			self.duration_is_divisible(from_time, to_time)
 
 	def validate_from_and_to_time(self, from_time, to_time, record):
 		if from_time > to_time:
-			err_msg = _('<b>From Time</b> cannot be later than <b>To Time</b> for {0}').format(record.day_of_week)
+			err_msg = _("<b>From Time</b> cannot be later than <b>To Time</b> for {0}").format(
+				record.day_of_week
+			)
 			frappe.throw(_(err_msg))
 
 	def duration_is_divisible(self, from_time, to_time):
 		timedelta = to_time - from_time
 		if timedelta.total_seconds() % (self.appointment_duration * 60):
 			frappe.throw(
-				_('The difference between from time and To Time must be a multiple of Appointment'))
+				_("The difference between from time and To Time must be a multiple of Appointment")
+			)
diff --git a/erpnext/crm/doctype/campaign/campaign.py b/erpnext/crm/doctype/campaign/campaign.py
index 8b62800..5d06075 100644
--- a/erpnext/crm/doctype/campaign/campaign.py
+++ b/erpnext/crm/doctype/campaign/campaign.py
@@ -8,7 +8,7 @@
 
 class Campaign(Document):
 	def autoname(self):
-		if frappe.defaults.get_global_default('campaign_naming_by') != 'Naming Series':
+		if frappe.defaults.get_global_default("campaign_naming_by") != "Naming Series":
 			self.name = self.campaign_name
 		else:
 			set_name_by_naming_series(self)
diff --git a/erpnext/crm/doctype/contract/contract.py b/erpnext/crm/doctype/contract/contract.py
index e21f46a..1c2470b 100644
--- a/erpnext/crm/doctype/contract/contract.py
+++ b/erpnext/crm/doctype/contract/contract.py
@@ -75,11 +75,11 @@
 	Get a Contract's status based on the start, current and end dates
 
 	Args:
-		start_date (str): The start date of the contract
-		end_date (str): The end date of the contract
+	        start_date (str): The start date of the contract
+	        end_date (str): The end date of the contract
 
 	Returns:
-		str: 'Active' if within range, otherwise 'Inactive'
+	        str: 'Active' if within range, otherwise 'Inactive'
 	"""
 
 	if not end_date:
@@ -98,13 +98,13 @@
 	and submitted Contracts
 	"""
 
-	contracts = frappe.get_all("Contract",
-								filters={"is_signed": True,
-										"docstatus": 1},
-								fields=["name", "start_date", "end_date"])
+	contracts = frappe.get_all(
+		"Contract",
+		filters={"is_signed": True, "docstatus": 1},
+		fields=["name", "start_date", "end_date"],
+	)
 
 	for contract in contracts:
-		status = get_status(contract.get("start_date"),
-							contract.get("end_date"))
+		status = get_status(contract.get("start_date"), contract.get("end_date"))
 
 		frappe.db.set_value("Contract", contract.get("name"), "status", status)
diff --git a/erpnext/crm/doctype/contract/test_contract.py b/erpnext/crm/doctype/contract/test_contract.py
index e685362..1390168 100644
--- a/erpnext/crm/doctype/contract/test_contract.py
+++ b/erpnext/crm/doctype/contract/test_contract.py
@@ -8,7 +8,6 @@
 
 
 class TestContract(unittest.TestCase):
-
 	def setUp(self):
 		frappe.db.sql("delete from `tabContract`")
 		self.contract_doc = get_contract()
@@ -65,10 +64,7 @@
 		# Mark all the terms as fulfilled
 		self.contract_doc.requires_fulfilment = 1
 		fulfilment_terms = []
-		fulfilment_terms.append({
-			"requirement": "This is a test requirement.",
-			"fulfilled": 0
-		})
+		fulfilment_terms.append({"requirement": "This is a test requirement.", "fulfilled": 0})
 		self.contract_doc.set("fulfilment_terms", fulfilment_terms)
 
 		for term in self.contract_doc.fulfilment_terms:
@@ -85,14 +81,8 @@
 		# Mark only the first term as fulfilled
 		self.contract_doc.save()
 		fulfilment_terms = []
-		fulfilment_terms.append({
-			"requirement": "This is a test requirement.",
-			"fulfilled": 0
-		})
-		fulfilment_terms.append({
-			"requirement": "This is another test requirement.",
-			"fulfilled": 0
-		})
+		fulfilment_terms.append({"requirement": "This is a test requirement.", "fulfilled": 0})
+		fulfilment_terms.append({"requirement": "This is another test requirement.", "fulfilled": 0})
 
 		self.contract_doc.set("fulfilment_terms", fulfilment_terms)
 		self.contract_doc.fulfilment_terms[0].fulfilled = 1
@@ -110,6 +100,7 @@
 
 		self.assertEqual(self.contract_doc.fulfilment_status, "Lapsed")
 
+
 def get_contract():
 	doc = frappe.new_doc("Contract")
 	doc.party_type = "Customer"
diff --git a/erpnext/crm/doctype/contract_template/contract_template.py b/erpnext/crm/doctype/contract_template/contract_template.py
index 7439e4c..a5b0ee0 100644
--- a/erpnext/crm/doctype/contract_template/contract_template.py
+++ b/erpnext/crm/doctype/contract_template/contract_template.py
@@ -14,6 +14,7 @@
 		if self.contract_terms:
 			validate_template(self.contract_terms)
 
+
 @frappe.whitelist()
 def get_contract_template(template_name, doc):
 	if isinstance(doc, str):
@@ -25,7 +26,4 @@
 	if contract_template.contract_terms:
 		contract_terms = frappe.render_template(contract_template.contract_terms, doc)
 
-	return {
-		'contract_template': contract_template,
-		'contract_terms': contract_terms
-	}
+	return {"contract_template": contract_template, "contract_terms": contract_terms}
diff --git a/erpnext/crm/doctype/email_campaign/email_campaign.py b/erpnext/crm/doctype/email_campaign/email_campaign.py
index d444432..9ec54ff 100644
--- a/erpnext/crm/doctype/email_campaign/email_campaign.py
+++ b/erpnext/crm/doctype/email_campaign/email_campaign.py
@@ -12,7 +12,7 @@
 class EmailCampaign(Document):
 	def validate(self):
 		self.set_date()
-		#checking if email is set for lead. Not checking for contact as email is a mandatory field for contact.
+		# checking if email is set for lead. Not checking for contact as email is a mandatory field for contact.
 		if self.email_campaign_for == "Lead":
 			self.validate_lead()
 		self.validate_email_campaign_already_exists()
@@ -21,7 +21,7 @@
 	def set_date(self):
 		if getdate(self.start_date) < getdate(today()):
 			frappe.throw(_("Start Date cannot be before the current date"))
-		#set the end date as start date + max(send after days) in campaign schedule
+		# set the end date as start date + max(send after days) in campaign schedule
 		send_after_days = []
 		campaign = frappe.get_doc("Campaign", self.campaign_name)
 		for entry in campaign.get("campaign_schedules"):
@@ -29,23 +29,32 @@
 		try:
 			self.end_date = add_days(getdate(self.start_date), max(send_after_days))
 		except ValueError:
-			frappe.throw(_("Please set up the Campaign Schedule in the Campaign {0}").format(self.campaign_name))
+			frappe.throw(
+				_("Please set up the Campaign Schedule in the Campaign {0}").format(self.campaign_name)
+			)
 
 	def validate_lead(self):
-		lead_email_id = frappe.db.get_value("Lead", self.recipient, 'email_id')
+		lead_email_id = frappe.db.get_value("Lead", self.recipient, "email_id")
 		if not lead_email_id:
-			lead_name = frappe.db.get_value("Lead", self.recipient, 'lead_name')
+			lead_name = frappe.db.get_value("Lead", self.recipient, "lead_name")
 			frappe.throw(_("Please set an email id for the Lead {0}").format(lead_name))
 
 	def validate_email_campaign_already_exists(self):
-		email_campaign_exists = frappe.db.exists("Email Campaign", {
-			"campaign_name": self.campaign_name,
-			"recipient": self.recipient,
-			"status": ("in", ["In Progress", "Scheduled"]),
-			"name": ("!=", self.name)
-		})
+		email_campaign_exists = frappe.db.exists(
+			"Email Campaign",
+			{
+				"campaign_name": self.campaign_name,
+				"recipient": self.recipient,
+				"status": ("in", ["In Progress", "Scheduled"]),
+				"name": ("!=", self.name),
+			},
+		)
 		if email_campaign_exists:
-			frappe.throw(_("The Campaign '{0}' already exists for the {1} '{2}'").format(self.campaign_name, self.email_campaign_for, self.recipient))
+			frappe.throw(
+				_("The Campaign '{0}' already exists for the {1} '{2}'").format(
+					self.campaign_name, self.email_campaign_for, self.recipient
+				)
+			)
 
 	def update_status(self):
 		start_date = getdate(self.start_date)
@@ -58,51 +67,63 @@
 		elif end_date < today_date:
 			self.status = "Completed"
 
-#called through hooks to send campaign mails to leads
+
+# called through hooks to send campaign mails to leads
 def send_email_to_leads_or_contacts():
-	email_campaigns = frappe.get_all("Email Campaign", filters = { 'status': ('not in', ['Unsubscribed', 'Completed', 'Scheduled']) })
+	email_campaigns = frappe.get_all(
+		"Email Campaign", filters={"status": ("not in", ["Unsubscribed", "Completed", "Scheduled"])}
+	)
 	for camp in email_campaigns:
 		email_campaign = frappe.get_doc("Email Campaign", camp.name)
 		campaign = frappe.get_cached_doc("Campaign", email_campaign.campaign_name)
 		for entry in campaign.get("campaign_schedules"):
-			scheduled_date = add_days(email_campaign.get('start_date'), entry.get('send_after_days'))
+			scheduled_date = add_days(email_campaign.get("start_date"), entry.get("send_after_days"))
 			if scheduled_date == getdate(today()):
 				send_mail(entry, email_campaign)
 
+
 def send_mail(entry, email_campaign):
 	recipient_list = []
 	if email_campaign.email_campaign_for == "Email Group":
-		for member in frappe.db.get_list("Email Group Member", filters={"email_group": email_campaign.get("recipient")}, fields=["email"]):
-			recipient_list.append(member['email'])
+		for member in frappe.db.get_list(
+			"Email Group Member", filters={"email_group": email_campaign.get("recipient")}, fields=["email"]
+		):
+			recipient_list.append(member["email"])
 	else:
-		recipient_list.append(frappe.db.get_value(email_campaign.email_campaign_for, email_campaign.get("recipient"), "email_id"))
+		recipient_list.append(
+			frappe.db.get_value(
+				email_campaign.email_campaign_for, email_campaign.get("recipient"), "email_id"
+			)
+		)
 
 	email_template = frappe.get_doc("Email Template", entry.get("email_template"))
 	sender = frappe.db.get_value("User", email_campaign.get("sender"), "email")
 	context = {"doc": frappe.get_doc(email_campaign.email_campaign_for, email_campaign.recipient)}
 	# send mail and link communication to document
 	comm = make(
-		doctype = "Email Campaign",
-		name = email_campaign.name,
-		subject = frappe.render_template(email_template.get("subject"), context),
-		content = frappe.render_template(email_template.get("response"), context),
-		sender = sender,
-		recipients = recipient_list,
-		communication_medium = "Email",
-		sent_or_received = "Sent",
-		send_email = True,
-		email_template = email_template.name
+		doctype="Email Campaign",
+		name=email_campaign.name,
+		subject=frappe.render_template(email_template.get("subject"), context),
+		content=frappe.render_template(email_template.get("response"), context),
+		sender=sender,
+		recipients=recipient_list,
+		communication_medium="Email",
+		sent_or_received="Sent",
+		send_email=True,
+		email_template=email_template.name,
 	)
 	return comm
 
-#called from hooks on doc_event Email Unsubscribe
+
+# called from hooks on doc_event Email Unsubscribe
 def unsubscribe_recipient(unsubscribe, method):
-	if unsubscribe.reference_doctype == 'Email Campaign':
+	if unsubscribe.reference_doctype == "Email Campaign":
 		frappe.db.set_value("Email Campaign", unsubscribe.reference_name, "status", "Unsubscribed")
 
-#called through hooks to update email campaign status daily
+
+# called through hooks to update email campaign status daily
 def set_email_campaign_status():
-	email_campaigns = frappe.get_all("Email Campaign", filters = { 'status': ('!=', 'Unsubscribed')})
+	email_campaigns = frappe.get_all("Email Campaign", filters={"status": ("!=", "Unsubscribed")})
 	for entry in email_campaigns:
 		email_campaign = frappe.get_doc("Email Campaign", entry.name)
 		email_campaign.update_status()
diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py
index 33ec552..c9a64ff 100644
--- a/erpnext/crm/doctype/lead/lead.py
+++ b/erpnext/crm/doctype/lead/lead.py
@@ -23,7 +23,7 @@
 
 class Lead(SellingController):
 	def get_feed(self):
-		return '{0}: {1}'.format(_(self.status), self.lead_name)
+		return "{0}: {1}".format(_(self.status), self.lead_name)
 
 	def onload(self):
 		customer = frappe.db.get_value("Customer", {"lead_name": self.name})
@@ -62,8 +62,7 @@
 		if self.contact_date and getdate(self.contact_date) < getdate(nowdate()):
 			frappe.throw(_("Next Contact Date cannot be in the past"))
 
-		if (self.ends_on and self.contact_date and
-			(getdate(self.ends_on) < getdate(self.contact_date))):
+		if self.ends_on and self.contact_date and (getdate(self.ends_on) < getdate(self.contact_date)):
 			frappe.throw(_("Ends On date cannot be before Next Contact Date."))
 
 	def on_update(self):
@@ -72,13 +71,11 @@
 
 	def set_prev(self):
 		if self.is_new():
-			self._prev = frappe._dict({
-				"contact_date": None,
-				"ends_on": None,
-				"contact_by": None
-			})
+			self._prev = frappe._dict({"contact_date": None, "ends_on": None, "contact_by": None})
 		else:
-			self._prev = frappe.db.get_value("Lead", self.name, ["contact_date", "ends_on", "contact_by"], as_dict=1)
+			self._prev = frappe.db.get_value(
+				"Lead", self.name, ["contact_date", "ends_on", "contact_by"], as_dict=1
+			)
 
 	def before_insert(self):
 		self.contact_doc = self.create_contact()
@@ -89,39 +86,47 @@
 	def update_links(self):
 		# update contact links
 		if self.contact_doc:
-			self.contact_doc.append("links", {
-				"link_doctype": "Lead",
-				"link_name": self.name,
-				"link_title": self.lead_name
-			})
+			self.contact_doc.append(
+				"links", {"link_doctype": "Lead", "link_name": self.name, "link_title": self.lead_name}
+			)
 			self.contact_doc.save()
 
 	def add_calendar_event(self, opts=None, force=False):
-		if frappe.db.get_single_value('CRM Settings', 'create_event_on_next_contact_date'):
-			super(Lead, self).add_calendar_event({
-				"owner": self.lead_owner,
-				"starts_on": self.contact_date,
-				"ends_on": self.ends_on or "",
-				"subject": ('Contact ' + cstr(self.lead_name)),
-				"description": ('Contact ' + cstr(self.lead_name)) + (self.contact_by and ('. By : ' + cstr(self.contact_by)) or '')
-			}, force)
+		if frappe.db.get_single_value("CRM Settings", "create_event_on_next_contact_date"):
+			super(Lead, self).add_calendar_event(
+				{
+					"owner": self.lead_owner,
+					"starts_on": self.contact_date,
+					"ends_on": self.ends_on or "",
+					"subject": ("Contact " + cstr(self.lead_name)),
+					"description": ("Contact " + cstr(self.lead_name))
+					+ (self.contact_by and (". By : " + cstr(self.contact_by)) or ""),
+				},
+				force,
+			)
 
 	def update_prospects(self):
-		prospects = frappe.get_all('Prospect Lead', filters={'lead': self.name}, fields=['parent'])
+		prospects = frappe.get_all("Prospect Lead", filters={"lead": self.name}, fields=["parent"])
 		for row in prospects:
-			prospect = frappe.get_doc('Prospect', row.parent)
+			prospect = frappe.get_doc("Prospect", row.parent)
 			prospect.save(ignore_permissions=True)
 
 	def check_email_id_is_unique(self):
 		if self.email_id:
 			# validate email is unique
-			if not frappe.db.get_single_value('CRM Settings', 'allow_lead_duplication_based_on_emails'):
-				duplicate_leads = frappe.get_all("Lead", filters={"email_id": self.email_id, "name": ["!=", self.name]})
-				duplicate_leads = [frappe.bold(get_link_to_form('Lead', lead.name)) for lead in duplicate_leads]
+			if not frappe.db.get_single_value("CRM Settings", "allow_lead_duplication_based_on_emails"):
+				duplicate_leads = frappe.get_all(
+					"Lead", filters={"email_id": self.email_id, "name": ["!=", self.name]}
+				)
+				duplicate_leads = [
+					frappe.bold(get_link_to_form("Lead", lead.name)) for lead in duplicate_leads
+				]
 
 				if duplicate_leads:
-					frappe.throw(_("Email Address must be unique, already exists for {0}")
-						.format(comma_and(duplicate_leads)), frappe.DuplicateEntryError)
+					frappe.throw(
+						_("Email Address must be unique, already exists for {0}").format(comma_and(duplicate_leads)),
+						frappe.DuplicateEntryError,
+					)
 
 	def on_trash(self):
 		frappe.db.sql("""update `tabIssue` set lead='' where lead=%s""", self.name)
@@ -130,16 +135,20 @@
 		self.delete_events()
 
 	def unlink_dynamic_links(self):
-		links = frappe.get_all('Dynamic Link', filters={'link_doctype': self.doctype, 'link_name': self.name}, fields=['parent', 'parenttype'])
+		links = frappe.get_all(
+			"Dynamic Link",
+			filters={"link_doctype": self.doctype, "link_name": self.name},
+			fields=["parent", "parenttype"],
+		)
 
 		for link in links:
-			linked_doc = frappe.get_doc(link['parenttype'], link['parent'])
+			linked_doc = frappe.get_doc(link["parenttype"], link["parent"])
 
-			if len(linked_doc.get('links')) == 1:
+			if len(linked_doc.get("links")) == 1:
 				linked_doc.delete(ignore_permissions=True)
 			else:
 				to_remove = None
-				for d in linked_doc.get('links'):
+				for d in linked_doc.get("links"):
 					if d.link_doctype == self.doctype and d.link_name == self.name:
 						to_remove = d
 				if to_remove:
@@ -153,18 +162,14 @@
 		return frappe.db.get_value("Opportunity", {"party_name": self.name, "status": ["!=", "Lost"]})
 
 	def has_quotation(self):
-		return frappe.db.get_value("Quotation", {
-			"party_name": self.name,
-			"docstatus": 1,
-			"status": ["!=", "Lost"]
-		})
+		return frappe.db.get_value(
+			"Quotation", {"party_name": self.name, "docstatus": 1, "status": ["!=", "Lost"]}
+		)
 
 	def has_lost_quotation(self):
-		return frappe.db.get_value("Quotation", {
-			"party_name": self.name,
-			"docstatus": 1,
-			"status": "Lost"
-		})
+		return frappe.db.get_value(
+			"Quotation", {"party_name": self.name, "docstatus": 1, "status": "Lost"}
+		)
 
 	def set_lead_name(self):
 		if not self.lead_name:
@@ -180,44 +185,38 @@
 		self.title = self.company_name or self.lead_name
 
 	def create_contact(self):
-		if frappe.db.get_single_value('CRM Settings', 'auto_creation_of_contact'):
+		if frappe.db.get_single_value("CRM Settings", "auto_creation_of_contact"):
 			if not self.lead_name:
 				self.set_full_name()
 				self.set_lead_name()
 
 			contact = frappe.new_doc("Contact")
-			contact.update({
-				"first_name": self.first_name or self.lead_name,
-				"last_name": self.last_name,
-				"salutation": self.salutation,
-				"gender": self.gender,
-				"designation": self.designation,
-				"company_name": self.company_name,
-			})
+			contact.update(
+				{
+					"first_name": self.first_name or self.lead_name,
+					"last_name": self.last_name,
+					"salutation": self.salutation,
+					"gender": self.gender,
+					"designation": self.designation,
+					"company_name": self.company_name,
+				}
+			)
 
 			if self.email_id:
-				contact.append("email_ids", {
-					"email_id": self.email_id,
-					"is_primary": 1
-				})
+				contact.append("email_ids", {"email_id": self.email_id, "is_primary": 1})
 
 			if self.phone:
-				contact.append("phone_nos", {
-					"phone": self.phone,
-					"is_primary_phone": 1
-				})
+				contact.append("phone_nos", {"phone": self.phone, "is_primary_phone": 1})
 
 			if self.mobile_no:
-				contact.append("phone_nos", {
-					"phone": self.mobile_no,
-					"is_primary_mobile_no":1
-				})
+				contact.append("phone_nos", {"phone": self.mobile_no, "is_primary_mobile_no": 1})
 
 			contact.insert(ignore_permissions=True)
-			contact.reload() # load changes by hooks on contact
+			contact.reload()  # load changes by hooks on contact
 
 			return contact
 
+
 @frappe.whitelist()
 def make_customer(source_name, target_doc=None):
 	return _make_customer(source_name, target_doc)
@@ -234,16 +233,24 @@
 
 		target.customer_group = frappe.db.get_default("Customer Group")
 
-	doclist = get_mapped_doc("Lead", source_name,
-		{"Lead": {
-			"doctype": "Customer",
-			"field_map": {
-				"name": "lead_name",
-				"company_name": "customer_name",
-				"contact_no": "phone_1",
-				"fax": "fax_1"
+	doclist = get_mapped_doc(
+		"Lead",
+		source_name,
+		{
+			"Lead": {
+				"doctype": "Customer",
+				"field_map": {
+					"name": "lead_name",
+					"company_name": "customer_name",
+					"contact_no": "phone_1",
+					"fax": "fax_1",
+				},
 			}
-		}}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
+		},
+		target_doc,
+		set_missing_values,
+		ignore_permissions=ignore_permissions,
+	)
 
 	return doclist
 
@@ -253,19 +260,26 @@
 	def set_missing_values(source, target):
 		_set_missing_values(source, target)
 
-	target_doc = get_mapped_doc("Lead", source_name,
-		{"Lead": {
-			"doctype": "Opportunity",
-			"field_map": {
-				"campaign_name": "campaign",
-				"doctype": "opportunity_from",
-				"name": "party_name",
-				"lead_name": "contact_display",
-				"company_name": "customer_name",
-				"email_id": "contact_email",
-				"mobile_no": "contact_mobile"
+	target_doc = get_mapped_doc(
+		"Lead",
+		source_name,
+		{
+			"Lead": {
+				"doctype": "Opportunity",
+				"field_map": {
+					"campaign_name": "campaign",
+					"doctype": "opportunity_from",
+					"name": "party_name",
+					"lead_name": "contact_display",
+					"company_name": "customer_name",
+					"email_id": "contact_email",
+					"mobile_no": "contact_mobile",
+				},
 			}
-		}}, target_doc, set_missing_values)
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return target_doc
 
@@ -275,13 +289,13 @@
 	def set_missing_values(source, target):
 		_set_missing_values(source, target)
 
-	target_doc = get_mapped_doc("Lead", source_name,
-		{"Lead": {
-			"doctype": "Quotation",
-			"field_map": {
-				"name": "party_name"
-			}
-		}}, target_doc, set_missing_values)
+	target_doc = get_mapped_doc(
+		"Lead",
+		source_name,
+		{"Lead": {"doctype": "Quotation", "field_map": {"name": "party_name"}}},
+		target_doc,
+		set_missing_values,
+	)
 
 	target_doc.quotation_to = "Lead"
 	target_doc.run_method("set_missing_values")
@@ -290,18 +304,29 @@
 
 	return target_doc
 
-def _set_missing_values(source, target):
-	address = frappe.get_all('Dynamic Link', {
-			'link_doctype': source.doctype,
-			'link_name': source.name,
-			'parenttype': 'Address',
-		}, ['parent'], limit=1)
 
-	contact = frappe.get_all('Dynamic Link', {
-			'link_doctype': source.doctype,
-			'link_name': source.name,
-			'parenttype': 'Contact',
-		}, ['parent'], limit=1)
+def _set_missing_values(source, target):
+	address = frappe.get_all(
+		"Dynamic Link",
+		{
+			"link_doctype": source.doctype,
+			"link_name": source.name,
+			"parenttype": "Address",
+		},
+		["parent"],
+		limit=1,
+	)
+
+	contact = frappe.get_all(
+		"Dynamic Link",
+		{
+			"link_doctype": source.doctype,
+			"link_name": source.name,
+			"parenttype": "Contact",
+		},
+		["parent"],
+		limit=1,
+	)
 
 	if address:
 		target.customer_address = address[0].parent
@@ -309,39 +334,49 @@
 	if contact:
 		target.contact_person = contact[0].parent
 
+
 @frappe.whitelist()
 def get_lead_details(lead, posting_date=None, company=None):
 	if not lead:
 		return {}
 
 	from erpnext.accounts.party import set_address_details
+
 	out = frappe._dict()
 
 	lead_doc = frappe.get_doc("Lead", lead)
 	lead = lead_doc
 
-	out.update({
-		"territory": lead.territory,
-		"customer_name": lead.company_name or lead.lead_name,
-		"contact_display": " ".join(filter(None, [lead.salutation, lead.lead_name])),
-		"contact_email": lead.email_id,
-		"contact_mobile": lead.mobile_no,
-		"contact_phone": lead.phone,
-	})
+	out.update(
+		{
+			"territory": lead.territory,
+			"customer_name": lead.company_name or lead.lead_name,
+			"contact_display": " ".join(filter(None, [lead.salutation, lead.lead_name])),
+			"contact_email": lead.email_id,
+			"contact_mobile": lead.mobile_no,
+			"contact_phone": lead.phone,
+		}
+	)
 
 	set_address_details(out, lead, "Lead")
 
-	taxes_and_charges = set_taxes(None, 'Lead', posting_date, company,
-		billing_address=out.get('customer_address'), shipping_address=out.get('shipping_address_name'))
+	taxes_and_charges = set_taxes(
+		None,
+		"Lead",
+		posting_date,
+		company,
+		billing_address=out.get("customer_address"),
+		shipping_address=out.get("shipping_address_name"),
+	)
 	if taxes_and_charges:
-		out['taxes_and_charges'] = taxes_and_charges
+		out["taxes_and_charges"] = taxes_and_charges
 
 	return out
 
 
 @frappe.whitelist()
 def make_lead_from_communication(communication, ignore_communication_links=False):
-	""" raise a issue from email """
+	"""raise a issue from email"""
 
 	doc = frappe.get_doc("Communication", communication)
 	lead_name = None
@@ -350,12 +385,14 @@
 	if not lead_name and doc.phone_no:
 		lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no})
 	if not lead_name:
-		lead = frappe.get_doc({
-			"doctype": "Lead",
-			"lead_name": doc.sender_full_name,
-			"email_id": doc.sender,
-			"mobile_no": doc.phone_no
-		})
+		lead = frappe.get_doc(
+			{
+				"doctype": "Lead",
+				"lead_name": doc.sender_full_name,
+				"email_id": doc.sender,
+				"mobile_no": doc.phone_no,
+			}
+		)
 		lead.flags.ignore_mandatory = True
 		lead.flags.ignore_permissions = True
 		lead.insert()
@@ -365,29 +402,41 @@
 	link_communication_to_document(doc, "Lead", lead_name, ignore_communication_links)
 	return lead_name
 
-def get_lead_with_phone_number(number):
-	if not number: return
 
-	leads = frappe.get_all('Lead', or_filters={
-		'phone': ['like', '%{}'.format(number)],
-		'mobile_no': ['like', '%{}'.format(number)]
-	}, limit=1, order_by="creation DESC")
+def get_lead_with_phone_number(number):
+	if not number:
+		return
+
+	leads = frappe.get_all(
+		"Lead",
+		or_filters={
+			"phone": ["like", "%{}".format(number)],
+			"mobile_no": ["like", "%{}".format(number)],
+		},
+		limit=1,
+		order_by="creation DESC",
+	)
 
 	lead = leads[0].name if leads else None
 
 	return lead
 
+
 def daily_open_lead():
-	leads = frappe.get_all("Lead", filters = [["contact_date", "Between", [nowdate(), nowdate()]]])
+	leads = frappe.get_all("Lead", filters=[["contact_date", "Between", [nowdate(), nowdate()]]])
 	for lead in leads:
 		frappe.db.set_value("Lead", lead.name, "status", "Open")
 
+
 @frappe.whitelist()
 def add_lead_to_prospect(lead, prospect):
-	prospect = frappe.get_doc('Prospect', prospect)
-	prospect.append('prospect_lead', {
-		'lead': lead
-	})
+	prospect = frappe.get_doc("Prospect", prospect)
+	prospect.append("prospect_lead", {"lead": lead})
 	prospect.save(ignore_permissions=True)
-	frappe.msgprint(_('Lead {0} has been added to prospect {1}.').format(frappe.bold(lead), frappe.bold(prospect.name)),
-		title=_('Lead Added'), indicator='green')
+	frappe.msgprint(
+		_("Lead {0} has been added to prospect {1}.").format(
+			frappe.bold(lead), frappe.bold(prospect.name)
+		),
+		title=_("Lead Added"),
+		indicator="green",
+	)
diff --git a/erpnext/crm/doctype/lead/lead_dashboard.py b/erpnext/crm/doctype/lead/lead_dashboard.py
index 017390d..730e8e6 100644
--- a/erpnext/crm/doctype/lead/lead_dashboard.py
+++ b/erpnext/crm/doctype/lead/lead_dashboard.py
@@ -1,16 +1,9 @@
 def get_data():
 	return {
-		'fieldname': 'lead',
-		'non_standard_fieldnames': {
-			'Quotation': 'party_name',
-			'Opportunity': 'party_name'
-		},
-		'dynamic_links': {
-			'party_name': ['Lead', 'quotation_to']
-		},
-		'transactions': [
-			{
-				'items': ['Opportunity', 'Quotation', 'Prospect']
-			},
-		]
+		"fieldname": "lead",
+		"non_standard_fieldnames": {"Quotation": "party_name", "Opportunity": "party_name"},
+		"dynamic_links": {"party_name": ["Lead", "quotation_to"]},
+		"transactions": [
+			{"items": ["Opportunity", "Quotation", "Prospect"]},
+		],
 	}
diff --git a/erpnext/crm/doctype/lead/test_lead.py b/erpnext/crm/doctype/lead/test_lead.py
index 3882974..166ae2c 100644
--- a/erpnext/crm/doctype/lead/test_lead.py
+++ b/erpnext/crm/doctype/lead/test_lead.py
@@ -7,7 +7,8 @@
 import frappe
 from frappe.utils import random_string
 
-test_records = frappe.get_test_records('Lead')
+test_records = frappe.get_test_records("Lead")
+
 
 class TestLead(unittest.TestCase):
 	def test_make_customer(self):
@@ -23,12 +24,16 @@
 		customer.customer_group = "_Test Customer Group"
 		customer.insert()
 
-		#check whether lead contact is carried forward to the customer.
-		contact = frappe.db.get_value('Dynamic Link', {
-			"parenttype": "Contact",
-			"link_doctype": "Lead",
-			"link_name": customer.lead_name,
-		}, "parent")
+		# check whether lead contact is carried forward to the customer.
+		contact = frappe.db.get_value(
+			"Dynamic Link",
+			{
+				"parenttype": "Contact",
+				"link_doctype": "Lead",
+				"link_name": customer.lead_name,
+			},
+			"parent",
+		)
 
 		if contact:
 			contact_doc = frappe.get_doc("Contact", contact)
@@ -46,51 +51,49 @@
 		customer.insert()
 
 	def test_create_lead_and_unlinking_dynamic_links(self):
-		lead_doc = make_lead(first_name = "Lorem", last_name="Ipsum", email_id="lorem_ipsum@example.com")
+		lead_doc = make_lead(first_name="Lorem", last_name="Ipsum", email_id="lorem_ipsum@example.com")
 		lead_doc_1 = make_lead()
-		frappe.get_doc({
-			"doctype": "Address",
-			"address_type": "Billing",
-			"city": "Mumbai",
-			"address_line1": "Vidya Vihar West",
-			"country": "India",
-			"links": [{
-				"link_doctype": "Lead",
-				"link_name": lead_doc.name
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Address",
+				"address_type": "Billing",
+				"city": "Mumbai",
+				"address_line1": "Vidya Vihar West",
+				"country": "India",
+				"links": [{"link_doctype": "Lead", "link_name": lead_doc.name}],
+			}
+		).insert()
 
-		address_1 = frappe.get_doc({
-			"doctype": "Address",
-			"address_type": "Billing",
-			"address_line1": "Baner",
-			"city": "Pune",
-			"country": "India",
-			"links": [
-				{
-					"link_doctype": "Lead",
-					"link_name": lead_doc.name
-				},
-				{
-					"link_doctype": "Lead",
-					"link_name": lead_doc_1.name
-				}
-			]
-		}).insert()
+		address_1 = frappe.get_doc(
+			{
+				"doctype": "Address",
+				"address_type": "Billing",
+				"address_line1": "Baner",
+				"city": "Pune",
+				"country": "India",
+				"links": [
+					{"link_doctype": "Lead", "link_name": lead_doc.name},
+					{"link_doctype": "Lead", "link_name": lead_doc_1.name},
+				],
+			}
+		).insert()
 
 		lead_doc.delete()
 		address_1.reload()
-		self.assertEqual(frappe.db.exists("Lead",lead_doc.name), None)
-		self.assertEqual(len(address_1.get('links')), 1)
+		self.assertEqual(frappe.db.exists("Lead", lead_doc.name), None)
+		self.assertEqual(len(address_1.get("links")), 1)
+
 
 def make_lead(**args):
 	args = frappe._dict(args)
 
-	lead_doc = frappe.get_doc({
-		"doctype": "Lead",
-		"first_name": args.first_name or "_Test",
-		"last_name": args.last_name or "Lead",
-		"email_id": args.email_id or "new_lead_{}@example.com".format(random_string(5)),
-	}).insert()
+	lead_doc = frappe.get_doc(
+		{
+			"doctype": "Lead",
+			"first_name": args.first_name or "_Test",
+			"last_name": args.last_name or "Lead",
+			"email_id": args.email_id or "new_lead_{}@example.com".format(random_string(5)),
+		}
+	).insert()
 
 	return lead_doc
diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
index d2ac10a..b4657a2 100644
--- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
+++ b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
@@ -15,12 +15,16 @@
 class LinkedInSettings(Document):
 	@frappe.whitelist()
 	def get_authorization_url(self):
-		params = urlencode({
-			"response_type":"code",
-			"client_id": self.consumer_key,
-			"redirect_uri": "{0}/api/method/erpnext.crm.doctype.linkedin_settings.linkedin_settings.callback?".format(frappe.utils.get_url()),
-			"scope": "r_emailaddress w_organization_social r_basicprofile r_liteprofile r_organization_social rw_organization_admin w_member_social"
-		})
+		params = urlencode(
+			{
+				"response_type": "code",
+				"client_id": self.consumer_key,
+				"redirect_uri": "{0}/api/method/erpnext.crm.doctype.linkedin_settings.linkedin_settings.callback?".format(
+					frappe.utils.get_url()
+				),
+				"scope": "r_emailaddress w_organization_social r_basicprofile r_liteprofile r_organization_social rw_organization_admin w_member_social",
+			}
+		)
 
 		url = "https://www.linkedin.com/oauth/v2/authorization?{}".format(params)
 
@@ -33,11 +37,11 @@
 			"code": code,
 			"client_id": self.consumer_key,
 			"client_secret": self.get_password(fieldname="consumer_secret"),
-			"redirect_uri": "{0}/api/method/erpnext.crm.doctype.linkedin_settings.linkedin_settings.callback?".format(frappe.utils.get_url()),
+			"redirect_uri": "{0}/api/method/erpnext.crm.doctype.linkedin_settings.linkedin_settings.callback?".format(
+				frappe.utils.get_url()
+			),
 		}
-		headers = {
-			"Content-Type": "application/x-www-form-urlencoded"
-		}
+		headers = {"Content-Type": "application/x-www-form-urlencoded"}
 
 		response = self.http_post(url=url, data=body, headers=headers)
 		response = frappe.parse_json(response.content.decode())
@@ -47,11 +51,15 @@
 		response = requests.get(url="https://api.linkedin.com/v2/me", headers=self.get_headers())
 		response = frappe.parse_json(response.content.decode())
 
-		frappe.db.set_value(self.doctype, self.name, {
-			"person_urn": response["id"],
-			"account_name": response["vanityName"],
-			"session_status": "Active"
-		})
+		frappe.db.set_value(
+			self.doctype,
+			self.name,
+			{
+				"person_urn": response["id"],
+				"account_name": response["vanityName"],
+				"session_status": "Active",
+			},
+		)
 		frappe.local.response["type"] = "redirect"
 		frappe.local.response["location"] = get_url_to_form("LinkedIn Settings", "LinkedIn Settings")
 
@@ -64,8 +72,7 @@
 			if media_id:
 				return self.post_text(text, title, media_id=media_id)
 			else:
-				frappe.log_error("Failed to upload media.","LinkedIn Upload Error")
-
+				frappe.log_error("Failed to upload media.", "LinkedIn Upload Error")
 
 	def upload_image(self, media):
 		media = get_file_path(media)
@@ -74,10 +81,9 @@
 			"registerUploadRequest": {
 				"recipes": ["urn:li:digitalmediaRecipe:feedshare-image"],
 				"owner": "urn:li:organization:{0}".format(self.company_id),
-				"serviceRelationships": [{
-					"relationshipType": "OWNER",
-					"identifier": "urn:li:userGeneratedContent"
-				}]
+				"serviceRelationships": [
+					{"relationshipType": "OWNER", "identifier": "urn:li:userGeneratedContent"}
+				],
 			}
 		}
 		headers = self.get_headers()
@@ -86,11 +92,16 @@
 		if response.status_code == 200:
 			response = response.json()
 			asset = response["value"]["asset"]
-			upload_url = response["value"]["uploadMechanism"]["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"]["uploadUrl"]
-			headers['Content-Type']='image/jpeg'
-			response = self.http_post(upload_url, headers=headers, data=open(media,"rb"))
+			upload_url = response["value"]["uploadMechanism"][
+				"com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"
+			]["uploadUrl"]
+			headers["Content-Type"] = "image/jpeg"
+			response = self.http_post(upload_url, headers=headers, data=open(media, "rb"))
 			if response.status_code < 200 and response.status_code > 299:
-				frappe.throw(_("Error While Uploading Image"), title="{0} {1}".format(response.status_code, response.reason))
+				frappe.throw(
+					_("Error While Uploading Image"),
+					title="{0} {1}".format(response.status_code, response.reason),
+				)
 				return None
 			return asset
 
@@ -103,46 +114,26 @@
 		headers["Content-Type"] = "application/json; charset=UTF-8"
 
 		body = {
-			"distribution": {
-				"linkedInDistributionTarget": {}
-			},
-			"owner":"urn:li:organization:{0}".format(self.company_id),
+			"distribution": {"linkedInDistributionTarget": {}},
+			"owner": "urn:li:organization:{0}".format(self.company_id),
 			"subject": title,
-			"text": {
-				"text": text
-			}
+			"text": {"text": text},
 		}
 
 		reference_url = self.get_reference_url(text)
 		if reference_url:
-			body["content"] = {
-				"contentEntities": [
-					{
-						"entityLocation": reference_url
-					}
-				]
-			}
+			body["content"] = {"contentEntities": [{"entityLocation": reference_url}]}
 
 		if media_id:
-			body["content"]= {
-				"contentEntities": [{
-					"entity": media_id
-				}],
-				"shareMediaCategory": "IMAGE"
-			}
+			body["content"] = {"contentEntities": [{"entity": media_id}], "shareMediaCategory": "IMAGE"}
 
 		response = self.http_post(url=url, headers=headers, body=body)
 		return response
 
 	def http_post(self, url, headers=None, body=None, data=None):
 		try:
-			response = requests.post(
-				url = url,
-				json = body,
-				data = data,
-				headers = headers
-			)
-			if response.status_code not in [201,200]:
+			response = requests.post(url=url, json=body, data=data, headers=headers)
+			if response.status_code not in [201, 200]:
 				raise
 
 		except Exception as e:
@@ -151,12 +142,11 @@
 		return response
 
 	def get_headers(self):
-		return {
-			"Authorization": "Bearer {}".format(self.access_token)
-		}
+		return {"Authorization": "Bearer {}".format(self.access_token)}
 
 	def get_reference_url(self, text):
 		import re
+
 		regex_url = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
 		urls = re.findall(regex_url, text)
 		if urls:
@@ -164,18 +154,23 @@
 
 	def delete_post(self, post_id):
 		try:
-			response = requests.delete(url="https://api.linkedin.com/v2/shares/urn:li:share:{0}".format(post_id), headers=self.get_headers())
-			if response.status_code !=200:
+			response = requests.delete(
+				url="https://api.linkedin.com/v2/shares/urn:li:share:{0}".format(post_id),
+				headers=self.get_headers(),
+			)
+			if response.status_code != 200:
 				raise
 		except Exception:
 			self.api_error(response)
 
 	def get_post(self, post_id):
-		url = "https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:{0}&shares[0]=urn:li:share:{1}".format(self.company_id, post_id)
+		url = "https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:{0}&shares[0]=urn:li:share:{1}".format(
+			self.company_id, post_id
+		)
 
 		try:
 			response = requests.get(url=url, headers=self.get_headers())
-			if response.status_code !=200:
+			if response.status_code != 200:
 				raise
 
 		except Exception:
@@ -200,6 +195,7 @@
 		else:
 			frappe.throw(response.reason, title=response.status_code)
 
+
 @frappe.whitelist(allow_guest=True)
 def callback(code=None, error=None, error_description=None):
 	if not error:
@@ -209,4 +205,4 @@
 		frappe.db.commit()
 	else:
 		frappe.local.response["type"] = "redirect"
-		frappe.local.response["location"] = get_url_to_form("LinkedIn Settings","LinkedIn Settings")
+		frappe.local.response["location"] = get_url_to_form("LinkedIn Settings", "LinkedIn Settings")
diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py
index 2d53874..03ff269 100644
--- a/erpnext/crm/doctype/opportunity/opportunity.py
+++ b/erpnext/crm/doctype/opportunity/opportunity.py
@@ -27,12 +27,16 @@
 				add_link_in_communication(self.opportunity_from, self.party_name, self)
 
 	def validate(self):
-		self._prev = frappe._dict({
-			"contact_date": frappe.db.get_value("Opportunity", self.name, "contact_date") if \
-				(not cint(self.get("__islocal"))) else None,
-			"contact_by": frappe.db.get_value("Opportunity", self.name, "contact_by") if \
-				(not cint(self.get("__islocal"))) else None,
-		})
+		self._prev = frappe._dict(
+			{
+				"contact_date": frappe.db.get_value("Opportunity", self.name, "contact_date")
+				if (not cint(self.get("__islocal")))
+				else None,
+				"contact_by": frappe.db.get_value("Opportunity", self.name, "contact_by")
+				if (not cint(self.get("__islocal")))
+				else None,
+			}
+		)
 
 		self.make_new_lead_if_required()
 		self.validate_item_details()
@@ -60,7 +64,7 @@
 
 	def calculate_totals(self):
 		total = base_total = 0
-		for item in self.get('items'):
+		for item in self.get("items"):
 			item.amount = flt(item.rate) * flt(item.qty)
 			item.base_rate = flt(self.conversion_rate * item.rate)
 			item.base_amount = flt(self.conversion_rate * item.amount)
@@ -75,17 +79,18 @@
 		if (not self.get("party_name")) and self.contact_email:
 			# check if customer is already created agains the self.contact_email
 			dynamic_link, contact = DocType("Dynamic Link"), DocType("Contact")
-			customer = frappe.qb.from_(
-				dynamic_link
-			).join(
-				contact
-			).on(
-				(contact.name == dynamic_link.parent)
-				& (dynamic_link.link_doctype == "Customer")
-				& (contact.email_id == self.contact_email)
-			).select(
-				dynamic_link.link_name
-			).distinct().run(as_dict=True)
+			customer = (
+				frappe.qb.from_(dynamic_link)
+				.join(contact)
+				.on(
+					(contact.name == dynamic_link.parent)
+					& (dynamic_link.link_doctype == "Customer")
+					& (contact.email_id == self.contact_email)
+				)
+				.select(dynamic_link.link_name)
+				.distinct()
+				.run(as_dict=True)
+			)
 
 			if customer and customer[0].link_name:
 				self.party_name = customer[0].link_name
@@ -98,19 +103,17 @@
 				if sender_name == self.contact_email:
 					sender_name = None
 
-				if not sender_name and ('@' in self.contact_email):
-					email_name = self.contact_email.split('@')[0]
+				if not sender_name and ("@" in self.contact_email):
+					email_name = self.contact_email.split("@")[0]
 
-					email_split = email_name.split('.')
-					sender_name = ''
+					email_split = email_name.split(".")
+					sender_name = ""
 					for s in email_split:
-						sender_name += s.capitalize() + ' '
+						sender_name += s.capitalize() + " "
 
-				lead = frappe.get_doc({
-					"doctype": "Lead",
-					"email_id": self.contact_email,
-					"lead_name": sender_name or 'Unknown'
-				})
+				lead = frappe.get_doc(
+					{"doctype": "Lead", "email_id": self.contact_email, "lead_name": sender_name or "Unknown"}
+				)
 
 				lead.flags.ignore_email_validation = True
 				lead.insert(ignore_permissions=True)
@@ -122,17 +125,17 @@
 	@frappe.whitelist()
 	def declare_enquiry_lost(self, lost_reasons_list, competitors, detailed_reason=None):
 		if not self.has_active_quotation():
-			self.status = 'Lost'
+			self.status = "Lost"
 			self.lost_reasons = self.competitors = []
 
 			if detailed_reason:
 				self.order_lost_reason = detailed_reason
 
 			for reason in lost_reasons_list:
-				self.append('lost_reasons', reason)
+				self.append("lost_reasons", reason)
 
 			for competitor in competitors:
-				self.append('competitors', competitor)
+				self.append("competitors", competitor)
 
 			self.save()
 
@@ -144,85 +147,92 @@
 
 	def has_active_quotation(self):
 		if not self.with_items:
-			return frappe.get_all('Quotation',
-				{
-					'opportunity': self.name,
-					'status': ("not in", ['Lost', 'Closed']),
-					'docstatus': 1
-				}, 'name')
+			return frappe.get_all(
+				"Quotation",
+				{"opportunity": self.name, "status": ("not in", ["Lost", "Closed"]), "docstatus": 1},
+				"name",
+			)
 		else:
-			return frappe.db.sql("""
+			return frappe.db.sql(
+				"""
 				select q.name
 				from `tabQuotation` q, `tabQuotation Item` qi
 				where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s
-				and q.status not in ('Lost', 'Closed')""", self.name)
+				and q.status not in ('Lost', 'Closed')""",
+				self.name,
+			)
 
 	def has_ordered_quotation(self):
 		if not self.with_items:
-			return frappe.get_all('Quotation',
-				{
-					'opportunity': self.name,
-					'status': 'Ordered',
-					'docstatus': 1
-				}, 'name')
+			return frappe.get_all(
+				"Quotation", {"opportunity": self.name, "status": "Ordered", "docstatus": 1}, "name"
+			)
 		else:
-			return frappe.db.sql("""
+			return frappe.db.sql(
+				"""
 				select q.name
 				from `tabQuotation` q, `tabQuotation Item` qi
 				where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s
-				and q.status = 'Ordered'""", self.name)
+				and q.status = 'Ordered'""",
+				self.name,
+			)
 
 	def has_lost_quotation(self):
-		lost_quotation = frappe.db.sql("""
+		lost_quotation = frappe.db.sql(
+			"""
 			select name
 			from `tabQuotation`
 			where docstatus=1
 				and opportunity =%s and status = 'Lost'
-			""", self.name)
+			""",
+			self.name,
+		)
 		if lost_quotation:
 			if self.has_active_quotation():
 				return False
 			return True
 
 	def validate_cust_name(self):
-		if self.party_name and self.opportunity_from == 'Customer':
+		if self.party_name and self.opportunity_from == "Customer":
 			self.customer_name = frappe.db.get_value("Customer", self.party_name, "customer_name")
-		elif self.party_name and self.opportunity_from == 'Lead':
-			lead_name, company_name = frappe.db.get_value("Lead", self.party_name, ["lead_name", "company_name"])
+		elif self.party_name and self.opportunity_from == "Lead":
+			lead_name, company_name = frappe.db.get_value(
+				"Lead", self.party_name, ["lead_name", "company_name"]
+			)
 			self.customer_name = company_name or lead_name
 
 	def on_update(self):
 		self.add_calendar_event()
 
 	def add_calendar_event(self, opts=None, force=False):
-		if frappe.db.get_single_value('CRM Settings', 'create_event_on_next_contact_date_opportunity'):
+		if frappe.db.get_single_value("CRM Settings", "create_event_on_next_contact_date_opportunity"):
 			if not opts:
 				opts = frappe._dict()
 
 			opts.description = ""
 			opts.contact_date = self.contact_date
 
-			if self.party_name and self.opportunity_from == 'Customer':
+			if self.party_name and self.opportunity_from == "Customer":
 				if self.contact_person:
-					opts.description = 'Contact '+cstr(self.contact_person)
+					opts.description = "Contact " + cstr(self.contact_person)
 				else:
-					opts.description = 'Contact customer '+cstr(self.party_name)
-			elif self.party_name and self.opportunity_from == 'Lead':
+					opts.description = "Contact customer " + cstr(self.party_name)
+			elif self.party_name and self.opportunity_from == "Lead":
 				if self.contact_display:
-					opts.description = 'Contact '+cstr(self.contact_display)
+					opts.description = "Contact " + cstr(self.contact_display)
 				else:
-					opts.description = 'Contact lead '+cstr(self.party_name)
+					opts.description = "Contact lead " + cstr(self.party_name)
 
 			opts.subject = opts.description
-			opts.description += '. By : ' + cstr(self.contact_by)
+			opts.description += ". By : " + cstr(self.contact_by)
 
 			if self.to_discuss:
-				opts.description += ' To Discuss : ' + cstr(self.to_discuss)
+				opts.description += " To Discuss : " + cstr(self.to_discuss)
 
 			super(Opportunity, self).add_calendar_event(opts, force)
 
 	def validate_item_details(self):
-		if not self.get('items'):
+		if not self.get("items"):
 			return
 
 		# set missing values
@@ -234,41 +244,51 @@
 
 			item = frappe.db.get_value("Item", d.item_code, item_fields, as_dict=True)
 			for key in item_fields:
-				if not d.get(key): d.set(key, item.get(key))
+				if not d.get(key):
+					d.set(key, item.get(key))
 
 
 @frappe.whitelist()
 def get_item_details(item_code):
-	item = frappe.db.sql("""select item_name, stock_uom, image, description, item_group, brand
-		from `tabItem` where name = %s""", item_code, as_dict=1)
+	item = frappe.db.sql(
+		"""select item_name, stock_uom, image, description, item_group, brand
+		from `tabItem` where name = %s""",
+		item_code,
+		as_dict=1,
+	)
 	return {
-		'item_name': item and item[0]['item_name'] or '',
-		'uom': item and item[0]['stock_uom'] or '',
-		'description': item and item[0]['description'] or '',
-		'image': item and item[0]['image'] or '',
-		'item_group': item and item[0]['item_group'] or '',
-		'brand': item and item[0]['brand'] or ''
+		"item_name": item and item[0]["item_name"] or "",
+		"uom": item and item[0]["stock_uom"] or "",
+		"description": item and item[0]["description"] or "",
+		"image": item and item[0]["image"] or "",
+		"item_group": item and item[0]["item_group"] or "",
+		"brand": item and item[0]["brand"] or "",
 	}
 
+
 @frappe.whitelist()
 def make_quotation(source_name, target_doc=None):
 	def set_missing_values(source, target):
 		from erpnext.controllers.accounts_controller import get_default_taxes_and_charges
+
 		quotation = frappe.get_doc(target)
 
-		company_currency = frappe.get_cached_value('Company',  quotation.company,  "default_currency")
+		company_currency = frappe.get_cached_value("Company", quotation.company, "default_currency")
 
 		if company_currency == quotation.currency:
 			exchange_rate = 1
 		else:
-			exchange_rate = get_exchange_rate(quotation.currency, company_currency,
-				quotation.transaction_date, args="for_selling")
+			exchange_rate = get_exchange_rate(
+				quotation.currency, company_currency, quotation.transaction_date, args="for_selling"
+			)
 
 		quotation.conversion_rate = exchange_rate
 
 		# get default taxes
-		taxes = get_default_taxes_and_charges("Sales Taxes and Charges Template", company=quotation.company)
-		if taxes.get('taxes'):
+		taxes = get_default_taxes_and_charges(
+			"Sales Taxes and Charges Template", company=quotation.company
+		)
+		if taxes.get("taxes"):
 			quotation.update(taxes)
 
 		quotation.run_method("set_missing_values")
@@ -276,49 +296,53 @@
 		if not source.with_items:
 			quotation.opportunity = source.name
 
-	doclist = get_mapped_doc("Opportunity", source_name, {
-		"Opportunity": {
-			"doctype": "Quotation",
-			"field_map": {
-				"opportunity_from": "quotation_to",
-				"name": "enq_no"
-			}
-		},
-		"Opportunity Item": {
-			"doctype": "Quotation Item",
-			"field_map": {
-				"parent": "prevdoc_docname",
-				"parenttype": "prevdoc_doctype",
-				"uom": "stock_uom"
+	doclist = get_mapped_doc(
+		"Opportunity",
+		source_name,
+		{
+			"Opportunity": {
+				"doctype": "Quotation",
+				"field_map": {"opportunity_from": "quotation_to", "name": "enq_no"},
 			},
-			"add_if_empty": True
-		}
-	}, target_doc, set_missing_values)
+			"Opportunity Item": {
+				"doctype": "Quotation Item",
+				"field_map": {
+					"parent": "prevdoc_docname",
+					"parenttype": "prevdoc_doctype",
+					"uom": "stock_uom",
+				},
+				"add_if_empty": True,
+			},
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_request_for_quotation(source_name, target_doc=None):
 	def update_item(obj, target, source_parent):
 		target.conversion_factor = 1.0
 
-	doclist = get_mapped_doc("Opportunity", source_name, {
-		"Opportunity": {
-			"doctype": "Request for Quotation"
+	doclist = get_mapped_doc(
+		"Opportunity",
+		source_name,
+		{
+			"Opportunity": {"doctype": "Request for Quotation"},
+			"Opportunity Item": {
+				"doctype": "Request for Quotation Item",
+				"field_map": [["name", "opportunity_item"], ["parent", "opportunity"], ["uom", "uom"]],
+				"postprocess": update_item,
+			},
 		},
-		"Opportunity Item": {
-			"doctype": "Request for Quotation Item",
-			"field_map": [
-				["name", "opportunity_item"],
-				["parent", "opportunity"],
-				["uom", "uom"]
-			],
-			"postprocess": update_item
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_customer(source_name, target_doc=None):
 	def set_missing_values(source, target):
@@ -327,37 +351,37 @@
 		if source.opportunity_from == "Lead":
 			target.lead_name = source.party_name
 
-	doclist = get_mapped_doc("Opportunity", source_name, {
-		"Opportunity": {
-			"doctype": "Customer",
-			"field_map": {
-				"currency": "default_currency",
-				"customer_name": "customer_name"
+	doclist = get_mapped_doc(
+		"Opportunity",
+		source_name,
+		{
+			"Opportunity": {
+				"doctype": "Customer",
+				"field_map": {"currency": "default_currency", "customer_name": "customer_name"},
 			}
-		}
-	}, target_doc, set_missing_values)
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_supplier_quotation(source_name, target_doc=None):
-	doclist = get_mapped_doc("Opportunity", source_name, {
-		"Opportunity": {
-			"doctype": "Supplier Quotation",
-			"field_map": {
-				"name": "opportunity"
-			}
+	doclist = get_mapped_doc(
+		"Opportunity",
+		source_name,
+		{
+			"Opportunity": {"doctype": "Supplier Quotation", "field_map": {"name": "opportunity"}},
+			"Opportunity Item": {"doctype": "Supplier Quotation Item", "field_map": {"uom": "stock_uom"}},
 		},
-		"Opportunity Item": {
-			"doctype": "Supplier Quotation Item",
-			"field_map": {
-				"uom": "stock_uom"
-			}
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def set_multiple_status(names, status):
 	names = json.loads(names)
@@ -366,12 +390,19 @@
 		opp.status = status
 		opp.save()
 
-def auto_close_opportunity():
-	""" auto close the `Replied` Opportunities after 7 days """
-	auto_close_after_days = frappe.db.get_single_value("CRM Settings", "close_opportunity_after_days") or 15
 
-	opportunities = frappe.db.sql(""" select name from tabOpportunity where status='Replied' and
-		modified<DATE_SUB(CURDATE(), INTERVAL %s DAY) """, (auto_close_after_days), as_dict=True)
+def auto_close_opportunity():
+	"""auto close the `Replied` Opportunities after 7 days"""
+	auto_close_after_days = (
+		frappe.db.get_single_value("CRM Settings", "close_opportunity_after_days") or 15
+	)
+
+	opportunities = frappe.db.sql(
+		""" select name from tabOpportunity where status='Replied' and
+		modified<DATE_SUB(CURDATE(), INTERVAL %s DAY) """,
+		(auto_close_after_days),
+		as_dict=True,
+	)
 
 	for opportunity in opportunities:
 		doc = frappe.get_doc("Opportunity", opportunity.get("name"))
@@ -380,9 +411,11 @@
 		doc.flags.ignore_mandatory = True
 		doc.save()
 
+
 @frappe.whitelist()
 def make_opportunity_from_communication(communication, company, ignore_communication_links=False):
 	from erpnext.crm.doctype.lead.lead import make_lead_from_communication
+
 	doc = frappe.get_doc("Communication", communication)
 
 	lead = doc.reference_name if doc.reference_doctype == "Lead" else None
@@ -391,16 +424,20 @@
 
 	opportunity_from = "Lead"
 
-	opportunity = frappe.get_doc({
-		"doctype": "Opportunity",
-		"company": company,
-		"opportunity_from": opportunity_from,
-		"party_name": lead
-	}).insert(ignore_permissions=True)
+	opportunity = frappe.get_doc(
+		{
+			"doctype": "Opportunity",
+			"company": company,
+			"opportunity_from": opportunity_from,
+			"party_name": lead,
+		}
+	).insert(ignore_permissions=True)
 
 	link_communication_to_document(doc, "Opportunity", opportunity.name, ignore_communication_links)
 
 	return opportunity.name
+
+
 @frappe.whitelist()
 def get_events(start, end, filters=None):
 	"""Returns events for Gantt / Calendar view rendering.
@@ -409,9 +446,11 @@
 	:param filters: Filters (JSON).
 	"""
 	from frappe.desk.calendar import get_event_conditions
+
 	conditions = get_event_conditions("Opportunity", filters)
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		select
 			distinct `tabOpportunity`.name, `tabOpportunity`.customer_name, `tabOpportunity`.opportunity_amount,
 			`tabOpportunity`.title, `tabOpportunity`.contact_date
@@ -420,8 +459,11 @@
 		where
 			(`tabOpportunity`.contact_date between %(start)s and %(end)s)
 			{conditions}
-		""".format(conditions=conditions), {
-			"start": start,
-			"end": end
-		}, as_dict=True, update={"allDay": 0})
+		""".format(
+			conditions=conditions
+		),
+		{"start": start, "end": end},
+		as_dict=True,
+		update={"allDay": 0},
+	)
 	return data
diff --git a/erpnext/crm/doctype/opportunity/opportunity_dashboard.py b/erpnext/crm/doctype/opportunity/opportunity_dashboard.py
index 708fb12..d4c5e02 100644
--- a/erpnext/crm/doctype/opportunity/opportunity_dashboard.py
+++ b/erpnext/crm/doctype/opportunity/opportunity_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
 	return {
-		'fieldname': 'opportunity',
-		'transactions': [
-			{
-				'items': ['Quotation', 'Supplier Quotation']
-			},
-		]
+		"fieldname": "opportunity",
+		"transactions": [
+			{"items": ["Quotation", "Supplier Quotation"]},
+		],
 	}
diff --git a/erpnext/crm/doctype/opportunity/test_opportunity.py b/erpnext/crm/doctype/opportunity/test_opportunity.py
index db44b6a..481c7f1 100644
--- a/erpnext/crm/doctype/opportunity/test_opportunity.py
+++ b/erpnext/crm/doctype/opportunity/test_opportunity.py
@@ -11,22 +11,20 @@
 from erpnext.crm.doctype.opportunity.opportunity import make_quotation
 from erpnext.crm.utils import get_linked_communication_list
 
-test_records = frappe.get_test_records('Opportunity')
+test_records = frappe.get_test_records("Opportunity")
+
 
 class TestOpportunity(unittest.TestCase):
 	def test_opportunity_status(self):
 		doc = make_opportunity(with_items=0)
 		quotation = make_quotation(doc.name)
-		quotation.append('items', {
-			"item_code": "_Test Item",
-			"qty": 1
-		})
+		quotation.append("items", {"item_code": "_Test Item", "qty": 1})
 
 		quotation.run_method("set_missing_values")
 		quotation.run_method("calculate_taxes_and_totals")
 		quotation.submit()
 
-		doc = frappe.get_doc('Opportunity', doc.name)
+		doc = frappe.get_doc("Opportunity", doc.name)
 		self.assertEqual(doc.status, "Quotation")
 
 	def test_make_new_lead_if_required(self):
@@ -34,18 +32,19 @@
 
 		self.assertTrue(opp_doc.party_name)
 		self.assertEqual(opp_doc.opportunity_from, "Lead")
-		self.assertEqual(frappe.db.get_value("Lead", opp_doc.party_name, "email_id"), opp_doc.contact_email)
+		self.assertEqual(
+			frappe.db.get_value("Lead", opp_doc.party_name, "email_id"), opp_doc.contact_email
+		)
 
 		# create new customer and create new contact against 'new.opportunity@example.com'
 		customer = make_customer(opp_doc.party_name).insert(ignore_permissions=True)
-		contact = frappe.get_doc({
-			"doctype": "Contact",
-			"first_name": "_Test Opportunity Customer",
-			"links": [{
-				"link_doctype": "Customer",
-				"link_name": customer.name
-			}]
-		})
+		contact = frappe.get_doc(
+			{
+				"doctype": "Contact",
+				"first_name": "_Test Opportunity Customer",
+				"links": [{"link_doctype": "Customer", "link_name": customer.name}],
+			}
+		)
 		contact.add_email(opp_doc.contact_email, is_primary=True)
 		contact.insert(ignore_permissions=True)
 
@@ -54,38 +53,51 @@
 		self.assertEqual(opportunity_doc.total, 2200)
 
 	def test_carry_forward_of_email_and_comments(self):
-		frappe.db.set_value("CRM Settings", "CRM Settings", "carry_forward_communication_and_comments", 1)
+		frappe.db.set_value(
+			"CRM Settings", "CRM Settings", "carry_forward_communication_and_comments", 1
+		)
 		lead_doc = make_lead()
-		lead_doc.add_comment('Comment', text='Test Comment 1')
-		lead_doc.add_comment('Comment', text='Test Comment 2')
+		lead_doc.add_comment("Comment", text="Test Comment 1")
+		lead_doc.add_comment("Comment", text="Test Comment 2")
 		create_communication(lead_doc.doctype, lead_doc.name, lead_doc.email_id)
 		create_communication(lead_doc.doctype, lead_doc.name, lead_doc.email_id)
 
 		opp_doc = make_opportunity(opportunity_from="Lead", lead=lead_doc.name)
-		opportunity_comment_count = frappe.db.count("Comment", {"reference_doctype": opp_doc.doctype, "reference_name": opp_doc.name})
-		opportunity_communication_count = len(get_linked_communication_list(opp_doc.doctype, opp_doc.name))
+		opportunity_comment_count = frappe.db.count(
+			"Comment", {"reference_doctype": opp_doc.doctype, "reference_name": opp_doc.name}
+		)
+		opportunity_communication_count = len(
+			get_linked_communication_list(opp_doc.doctype, opp_doc.name)
+		)
 		self.assertEqual(opportunity_comment_count, 2)
 		self.assertEqual(opportunity_communication_count, 2)
 
-		opp_doc.add_comment('Comment', text='Test Comment 3')
-		opp_doc.add_comment('Comment', text='Test Comment 4')
+		opp_doc.add_comment("Comment", text="Test Comment 3")
+		opp_doc.add_comment("Comment", text="Test Comment 4")
 		create_communication(opp_doc.doctype, opp_doc.name, opp_doc.contact_email)
 		create_communication(opp_doc.doctype, opp_doc.name, opp_doc.contact_email)
 
 		quotation_doc = make_quotation(opp_doc.name)
-		quotation_doc.append('items', {
-			"item_code": "_Test Item",
-			"qty": 1
-		})
+		quotation_doc.append("items", {"item_code": "_Test Item", "qty": 1})
 		quotation_doc.run_method("set_missing_values")
 		quotation_doc.run_method("calculate_taxes_and_totals")
 		quotation_doc.save()
 
-		quotation_comment_count = frappe.db.count("Comment", {"reference_doctype": quotation_doc.doctype, "reference_name": quotation_doc.name, "comment_type": "Comment"})
-		quotation_communication_count = len(get_linked_communication_list(quotation_doc.doctype, quotation_doc.name))
+		quotation_comment_count = frappe.db.count(
+			"Comment",
+			{
+				"reference_doctype": quotation_doc.doctype,
+				"reference_name": quotation_doc.name,
+				"comment_type": "Comment",
+			},
+		)
+		quotation_communication_count = len(
+			get_linked_communication_list(quotation_doc.doctype, quotation_doc.name)
+		)
 		self.assertEqual(quotation_comment_count, 4)
 		self.assertEqual(quotation_communication_count, 4)
 
+
 def make_opportunity_from_lead():
 	new_lead_email_id = "new{}@example.com".format(random_string(5))
 	args = {
@@ -93,56 +105,67 @@
 		"contact_email": new_lead_email_id,
 		"opportunity_type": "Sales",
 		"with_items": 0,
-		"transaction_date": today()
+		"transaction_date": today(),
 	}
 	# new lead should be created against the new.opportunity@example.com
 	opp_doc = frappe.get_doc(args).insert(ignore_permissions=True)
 
 	return opp_doc
 
+
 def make_opportunity(**args):
 	args = frappe._dict(args)
 
-	opp_doc = frappe.get_doc({
-		"doctype": "Opportunity",
-		"company": args.company or "_Test Company",
-		"opportunity_from": args.opportunity_from or "Customer",
-		"opportunity_type": "Sales",
-		"conversion_rate": 1.0,
-		"with_items": args.with_items or 0,
-		"transaction_date": today()
-	})
+	opp_doc = frappe.get_doc(
+		{
+			"doctype": "Opportunity",
+			"company": args.company or "_Test Company",
+			"opportunity_from": args.opportunity_from or "Customer",
+			"opportunity_type": "Sales",
+			"conversion_rate": 1.0,
+			"with_items": args.with_items or 0,
+			"transaction_date": today(),
+		}
+	)
 
-	if opp_doc.opportunity_from == 'Customer':
-		opp_doc.party_name= args.customer or "_Test Customer"
+	if opp_doc.opportunity_from == "Customer":
+		opp_doc.party_name = args.customer or "_Test Customer"
 
-	if opp_doc.opportunity_from == 'Lead':
+	if opp_doc.opportunity_from == "Lead":
 		opp_doc.party_name = args.lead or "_T-Lead-00001"
 
 	if args.with_items:
-		opp_doc.append('items', {
-			"item_code": args.item_code or "_Test Item",
-			"qty": args.qty or 1,
-			"rate": args.rate or 1000,
-			"uom": "_Test UOM"
-		})
+		opp_doc.append(
+			"items",
+			{
+				"item_code": args.item_code or "_Test Item",
+				"qty": args.qty or 1,
+				"rate": args.rate or 1000,
+				"uom": "_Test UOM",
+			},
+		)
 
 	opp_doc.insert()
 	return opp_doc
 
-def create_communication(reference_doctype, reference_name, sender, sent_or_received=None, creation=None):
-	communication = frappe.get_doc({
-		"doctype": "Communication",
-		"communication_type": "Communication",
-		"communication_medium": "Email",
-		"sent_or_received": sent_or_received or "Sent",
-		"email_status": "Open",
-		"subject": "Test Subject",
-		"sender": sender,
-		"content": "Test",
-		"status": "Linked",
-		"reference_doctype": reference_doctype,
-		"creation": creation or now_datetime(),
-		"reference_name": reference_name
-	})
-	communication.save()
\ No newline at end of file
+
+def create_communication(
+	reference_doctype, reference_name, sender, sent_or_received=None, creation=None
+):
+	communication = frappe.get_doc(
+		{
+			"doctype": "Communication",
+			"communication_type": "Communication",
+			"communication_medium": "Email",
+			"sent_or_received": sent_or_received or "Sent",
+			"email_status": "Open",
+			"subject": "Test Subject",
+			"sender": sender,
+			"content": "Test",
+			"status": "Linked",
+			"reference_doctype": reference_doctype,
+			"creation": creation or now_datetime(),
+			"reference_name": reference_name,
+		}
+	)
+	communication.save()
diff --git a/erpnext/crm/doctype/prospect/prospect.py b/erpnext/crm/doctype/prospect/prospect.py
index cc4c1d3..39436f5 100644
--- a/erpnext/crm/doctype/prospect/prospect.py
+++ b/erpnext/crm/doctype/prospect/prospect.py
@@ -24,13 +24,15 @@
 
 	def after_insert(self):
 		if frappe.db.get_single_value("CRM Settings", "carry_forward_communication_and_comments"):
-			for row in self.get('prospect_lead'):
+			for row in self.get("prospect_lead"):
 				copy_comments("Lead", row.lead, self)
 				add_link_in_communication("Lead", row.lead, self)
 
 	def update_lead_details(self):
-		for row in self.get('prospect_lead'):
-			lead = frappe.get_value('Lead', row.lead, ['lead_name', 'status', 'email_id', 'mobile_no'], as_dict=True)
+		for row in self.get("prospect_lead"):
+			lead = frappe.get_value(
+				"Lead", row.lead, ["lead_name", "status", "email_id", "mobile_no"], as_dict=True
+			)
 			row.lead_name = lead.lead_name
 			row.status = lead.status
 			row.email = lead.email_id
@@ -38,39 +40,45 @@
 
 	def link_with_lead_contact_and_address(self):
 		for row in self.prospect_lead:
-			links = frappe.get_all('Dynamic Link', filters={'link_doctype': 'Lead', 'link_name': row.lead}, fields=['parent', 'parenttype'])
+			links = frappe.get_all(
+				"Dynamic Link",
+				filters={"link_doctype": "Lead", "link_name": row.lead},
+				fields=["parent", "parenttype"],
+			)
 			for link in links:
-				linked_doc = frappe.get_doc(link['parenttype'], link['parent'])
+				linked_doc = frappe.get_doc(link["parenttype"], link["parent"])
 				exists = False
 
-				for d in linked_doc.get('links'):
+				for d in linked_doc.get("links"):
 					if d.link_doctype == self.doctype and d.link_name == self.name:
 						exists = True
 
 				if not exists:
-					linked_doc.append('links', {
-						'link_doctype': self.doctype,
-						'link_name': self.name
-					})
+					linked_doc.append("links", {"link_doctype": self.doctype, "link_name": self.name})
 					linked_doc.save(ignore_permissions=True)
 
 	def unlink_dynamic_links(self):
-		links = frappe.get_all('Dynamic Link', filters={'link_doctype': self.doctype, 'link_name': self.name}, fields=['parent', 'parenttype'])
+		links = frappe.get_all(
+			"Dynamic Link",
+			filters={"link_doctype": self.doctype, "link_name": self.name},
+			fields=["parent", "parenttype"],
+		)
 
 		for link in links:
-			linked_doc = frappe.get_doc(link['parenttype'], link['parent'])
+			linked_doc = frappe.get_doc(link["parenttype"], link["parent"])
 
-			if len(linked_doc.get('links')) == 1:
+			if len(linked_doc.get("links")) == 1:
 				linked_doc.delete(ignore_permissions=True)
 			else:
 				to_remove = None
-				for d in linked_doc.get('links'):
+				for d in linked_doc.get("links"):
 					if d.link_doctype == self.doctype and d.link_name == self.name:
 						to_remove = d
 				if to_remove:
 					linked_doc.remove(to_remove)
 					linked_doc.save(ignore_permissions=True)
 
+
 @frappe.whitelist()
 def make_customer(source_name, target_doc=None):
 	def set_missing_values(source, target):
@@ -78,18 +86,23 @@
 		target.company_name = source.name
 		target.customer_group = source.customer_group or frappe.db.get_default("Customer Group")
 
-	doclist = get_mapped_doc("Prospect", source_name,
-		{"Prospect": {
-			"doctype": "Customer",
-			"field_map": {
-				"company_name": "customer_name",
-				"currency": "default_currency",
-				"fax": "fax"
+	doclist = get_mapped_doc(
+		"Prospect",
+		source_name,
+		{
+			"Prospect": {
+				"doctype": "Customer",
+				"field_map": {"company_name": "customer_name", "currency": "default_currency", "fax": "fax"},
 			}
-		}}, target_doc, set_missing_values, ignore_permissions=False)
+		},
+		target_doc,
+		set_missing_values,
+		ignore_permissions=False,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_opportunity(source_name, target_doc=None):
 	def set_missing_values(source, target):
@@ -97,12 +110,20 @@
 		target.customer_name = source.company_name
 		target.customer_group = source.customer_group or frappe.db.get_default("Customer Group")
 
-	doclist = get_mapped_doc("Prospect", source_name,
-		{"Prospect": {
-			"doctype": "Opportunity",
-			"field_map": {
-				"name": "party_name",
+	doclist = get_mapped_doc(
+		"Prospect",
+		source_name,
+		{
+			"Prospect": {
+				"doctype": "Opportunity",
+				"field_map": {
+					"name": "party_name",
+				},
 			}
-		}}, target_doc, set_missing_values, ignore_permissions=False)
+		},
+		target_doc,
+		set_missing_values,
+		ignore_permissions=False,
+	)
 
 	return doclist
diff --git a/erpnext/crm/doctype/prospect/test_prospect.py b/erpnext/crm/doctype/prospect/test_prospect.py
index fa44e20..ddd7b93 100644
--- a/erpnext/crm/doctype/prospect/test_prospect.py
+++ b/erpnext/crm/doctype/prospect/test_prospect.py
@@ -14,43 +14,45 @@
 	def test_add_lead_to_prospect_and_address_linking(self):
 		lead_doc = make_lead()
 		address_doc = make_address(address_title=lead_doc.name)
-		address_doc.append('links', {
-				"link_doctype": lead_doc.doctype,
-				"link_name": lead_doc.name
-			})
+		address_doc.append("links", {"link_doctype": lead_doc.doctype, "link_name": lead_doc.name})
 		address_doc.save()
 		prospect_doc = make_prospect()
 		add_lead_to_prospect(lead_doc.name, prospect_doc.name)
 		prospect_doc.reload()
 		lead_exists_in_prosoect = False
-		for rec in prospect_doc.get('prospect_lead'):
+		for rec in prospect_doc.get("prospect_lead"):
 			if rec.lead == lead_doc.name:
 				lead_exists_in_prosoect = True
 		self.assertEqual(lead_exists_in_prosoect, True)
 		address_doc.reload()
-		self.assertEqual(address_doc.has_link('Prospect', prospect_doc.name), True)
+		self.assertEqual(address_doc.has_link("Prospect", prospect_doc.name), True)
 
 
 def make_prospect(**args):
 	args = frappe._dict(args)
 
-	prospect_doc = frappe.get_doc({
-		"doctype": "Prospect",
-		"company_name": args.company_name or "_Test Company {}".format(random_string(3)),
-	}).insert()
+	prospect_doc = frappe.get_doc(
+		{
+			"doctype": "Prospect",
+			"company_name": args.company_name or "_Test Company {}".format(random_string(3)),
+		}
+	).insert()
 
 	return prospect_doc
 
+
 def make_address(**args):
 	args = frappe._dict(args)
 
-	address_doc = frappe.get_doc({
-		"doctype": "Address",
-		"address_title": args.address_title or "Address Title",
-		"address_type": args.address_type or "Billing",
-		"city": args.city or "Mumbai",
-		"address_line1": args.address_line1 or "Vidya Vihar West",
-		"country": args.country or "India"
-	}).insert()
+	address_doc = frappe.get_doc(
+		{
+			"doctype": "Address",
+			"address_title": args.address_title or "Address Title",
+			"address_type": args.address_type or "Billing",
+			"city": args.city or "Mumbai",
+			"address_line1": args.address_line1 or "Vidya Vihar West",
+			"country": args.country or "India",
+		}
+	).insert()
 
 	return address_doc
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.py b/erpnext/crm/doctype/social_media_post/social_media_post.py
index 3f63c1d..2fd003e 100644
--- a/erpnext/crm/doctype/social_media_post/social_media_post.py
+++ b/erpnext/crm/doctype/social_media_post/social_media_post.py
@@ -11,7 +11,7 @@
 
 class SocialMediaPost(Document):
 	def validate(self):
-		if (not self.twitter and not self.linkedin):
+		if not self.twitter and not self.linkedin:
 			frappe.throw(_("Select atleast one Social Media Platform to Share on."))
 
 		if self.scheduled_time:
@@ -29,7 +29,7 @@
 		super(SocialMediaPost, self).submit()
 
 	def on_cancel(self):
-		self.db_set('post_status', 'Cancelled')
+		self.db_set("post_status", "Cancelled")
 
 	@frappe.whitelist()
 	def delete_post(self):
@@ -41,17 +41,17 @@
 			linkedin = frappe.get_doc("LinkedIn Settings")
 			linkedin.delete_post(self.linkedin_post_id)
 
-		self.db_set('post_status', 'Deleted')
+		self.db_set("post_status", "Deleted")
 
 	@frappe.whitelist()
 	def get_post(self):
 		response = {}
 		if self.linkedin and self.linkedin_post_id:
 			linkedin = frappe.get_doc("LinkedIn Settings")
-			response['linkedin'] = linkedin.get_post(self.linkedin_post_id)
+			response["linkedin"] = linkedin.get_post(self.linkedin_post_id)
 		if self.twitter and self.twitter_post_id:
 			twitter = frappe.get_doc("Twitter Settings")
-			response['twitter'] = twitter.get_tweet(self.twitter_post_id)
+			response["twitter"] = twitter.get_tweet(self.twitter_post_id)
 
 		return response
 
@@ -65,7 +65,7 @@
 			if self.linkedin and not self.linkedin_post_id:
 				linkedin = frappe.get_doc("LinkedIn Settings")
 				linkedin_post = linkedin.post(self.linkedin_post, self.title, self.image)
-				self.db_set("linkedin_post_id", linkedin_post.headers['X-RestLi-Id'])
+				self.db_set("linkedin_post_id", linkedin_post.headers["X-RestLi-Id"])
 			self.db_set("post_status", "Posted")
 
 		except Exception:
@@ -73,13 +73,18 @@
 			title = _("Error while POSTING {0}").format(self.name)
 			frappe.log_error(message=frappe.get_traceback(), title=title)
 
+
 def process_scheduled_social_media_posts():
-	posts = frappe.get_list("Social Media Post", filters={"post_status": "Scheduled", "docstatus":1}, fields= ["name", "scheduled_time"])
+	posts = frappe.get_list(
+		"Social Media Post",
+		filters={"post_status": "Scheduled", "docstatus": 1},
+		fields=["name", "scheduled_time"],
+	)
 	start = frappe.utils.now_datetime()
 	end = start + datetime.timedelta(minutes=10)
 	for post in posts:
 		if post.scheduled_time:
 			post_time = frappe.utils.get_datetime(post.scheduled_time)
 			if post_time > start and post_time <= end:
-				sm_post = frappe.get_doc('Social Media Post', post.name)
+				sm_post = frappe.get_doc("Social Media Post", post.name)
 				sm_post.post()
diff --git a/erpnext/crm/doctype/twitter_settings/twitter_settings.py b/erpnext/crm/doctype/twitter_settings/twitter_settings.py
index be7d914..42874dd 100644
--- a/erpnext/crm/doctype/twitter_settings/twitter_settings.py
+++ b/erpnext/crm/doctype/twitter_settings/twitter_settings.py
@@ -16,22 +16,26 @@
 class TwitterSettings(Document):
 	@frappe.whitelist()
 	def get_authorize_url(self):
-		callback_url = "{0}/api/method/erpnext.crm.doctype.twitter_settings.twitter_settings.callback?".format(frappe.utils.get_url())
-		auth = tweepy.OAuthHandler(self.consumer_key, self.get_password(fieldname="consumer_secret"), callback_url)
+		callback_url = (
+			"{0}/api/method/erpnext.crm.doctype.twitter_settings.twitter_settings.callback?".format(
+				frappe.utils.get_url()
+			)
+		)
+		auth = tweepy.OAuthHandler(
+			self.consumer_key, self.get_password(fieldname="consumer_secret"), callback_url
+		)
 		try:
 			redirect_url = auth.get_authorization_url()
 			return redirect_url
 		except tweepy.TweepError as e:
 			frappe.msgprint(_("Error! Failed to get request token."))
-			frappe.throw(_('Invalid {0} or {1}').format(frappe.bold("Consumer Key"), frappe.bold("Consumer Secret Key")))
-
+			frappe.throw(
+				_("Invalid {0} or {1}").format(frappe.bold("Consumer Key"), frappe.bold("Consumer Secret Key"))
+			)
 
 	def get_access_token(self, oauth_token, oauth_verifier):
 		auth = tweepy.OAuthHandler(self.consumer_key, self.get_password(fieldname="consumer_secret"))
-		auth.request_token = {
-			'oauth_token' : oauth_token,
-			'oauth_token_secret' : oauth_verifier
-		}
+		auth.request_token = {"oauth_token": oauth_token, "oauth_token_secret": oauth_verifier}
 
 		try:
 			auth.get_access_token(oauth_verifier)
@@ -39,21 +43,25 @@
 			self.access_token_secret = auth.access_token_secret
 			api = self.get_api()
 			user = api.me()
-			profile_pic = (user._json["profile_image_url"]).replace("_normal","")
+			profile_pic = (user._json["profile_image_url"]).replace("_normal", "")
 
-			frappe.db.set_value(self.doctype, self.name, {
-				"access_token" : auth.access_token,
-				"access_token_secret" : auth.access_token_secret,
-				"account_name" : user._json["screen_name"],
-				"profile_pic" : profile_pic,
-				"session_status" : "Active"
-			})
+			frappe.db.set_value(
+				self.doctype,
+				self.name,
+				{
+					"access_token": auth.access_token,
+					"access_token_secret": auth.access_token_secret,
+					"account_name": user._json["screen_name"],
+					"profile_pic": profile_pic,
+					"session_status": "Active",
+				},
+			)
 
 			frappe.local.response["type"] = "redirect"
-			frappe.local.response["location"] = get_url_to_form("Twitter Settings","Twitter Settings")
+			frappe.local.response["location"] = get_url_to_form("Twitter Settings", "Twitter Settings")
 		except TweepError as e:
 			frappe.msgprint(_("Error! Failed to get access token."))
-			frappe.throw(_('Invalid Consumer Key or Consumer Secret Key'))
+			frappe.throw(_("Invalid Consumer Key or Consumer Secret Key"))
 
 	def get_api(self):
 		# authentication of consumer key and secret
@@ -82,9 +90,9 @@
 		api = self.get_api()
 		try:
 			if media_id:
-				response = api.update_status(status = text, media_ids = [media_id])
+				response = api.update_status(status=text, media_ids=[media_id])
 			else:
-				response = api.update_status(status = text)
+				response = api.update_status(status=text)
 
 			return response
 
@@ -113,15 +121,18 @@
 		if e.response.status_code == 401:
 			self.db_set("session_status", "Expired")
 			frappe.db.commit()
-		frappe.throw(content["message"],title=_("Twitter Error {0} : {1}").format(e.response.status_code, e.response.reason))
+		frappe.throw(
+			content["message"],
+			title=_("Twitter Error {0} : {1}").format(e.response.status_code, e.response.reason),
+		)
 
 
 @frappe.whitelist(allow_guest=True)
-def callback(oauth_token = None, oauth_verifier = None):
+def callback(oauth_token=None, oauth_verifier=None):
 	if oauth_token and oauth_verifier:
 		twitter_settings = frappe.get_single("Twitter Settings")
-		twitter_settings.get_access_token(oauth_token,oauth_verifier)
+		twitter_settings.get_access_token(oauth_token, oauth_verifier)
 		frappe.db.commit()
 	else:
 		frappe.local.response["type"] = "redirect"
-		frappe.local.response["location"] = get_url_to_form("Twitter Settings","Twitter Settings")
+		frappe.local.response["location"] = get_url_to_form("Twitter Settings", "Twitter Settings")
diff --git a/erpnext/crm/doctype/utils.py b/erpnext/crm/doctype/utils.py
index 9b56170..6bcfcb7 100644
--- a/erpnext/crm/doctype/utils.py
+++ b/erpnext/crm/doctype/utils.py
@@ -4,16 +4,17 @@
 @frappe.whitelist()
 def get_last_interaction(contact=None, lead=None):
 
-	if not contact and not lead: return
+	if not contact and not lead:
+		return
 
 	last_communication = None
 	last_issue = None
 	if contact:
-		query_condition = ''
+		query_condition = ""
 		values = []
-		contact = frappe.get_doc('Contact', contact)
+		contact = frappe.get_doc("Contact", contact)
 		for link in contact.links:
-			if link.link_doctype == 'Customer':
+			if link.link_doctype == "Customer":
 				last_issue = get_last_issue_from_customer(link.link_name)
 			query_condition += "(`reference_doctype`=%s AND `reference_name`=%s) OR"
 			values += [link.link_doctype, link.link_name]
@@ -21,65 +22,82 @@
 		if query_condition:
 			# remove extra appended 'OR'
 			query_condition = query_condition[:-2]
-			last_communication = frappe.db.sql("""
+			last_communication = frappe.db.sql(
+				"""
 				SELECT `name`, `content`
 				FROM `tabCommunication`
 				WHERE `sent_or_received`='Received'
 				AND ({})
 				ORDER BY `modified`
 				LIMIT 1
-			""".format(query_condition), values, as_dict=1)  # nosec
+			""".format(
+					query_condition
+				),
+				values,
+				as_dict=1,
+			)  # nosec
 
 	if lead:
-		last_communication = frappe.get_all('Communication', filters={
-			'reference_doctype': 'Lead',
-			'reference_name': lead,
-			'sent_or_received': 'Received'
-		}, fields=['name', 'content'], order_by='`creation` DESC', limit=1)
+		last_communication = frappe.get_all(
+			"Communication",
+			filters={"reference_doctype": "Lead", "reference_name": lead, "sent_or_received": "Received"},
+			fields=["name", "content"],
+			order_by="`creation` DESC",
+			limit=1,
+		)
 
 	last_communication = last_communication[0] if last_communication else None
 
-	return {
-		'last_communication': last_communication,
-		'last_issue': last_issue
-	}
+	return {"last_communication": last_communication, "last_issue": last_issue}
+
 
 def get_last_issue_from_customer(customer_name):
-	issues = frappe.get_all('Issue', {
-		'customer': customer_name
-	}, ['name', 'subject', 'customer'], order_by='`creation` DESC', limit=1)
+	issues = frappe.get_all(
+		"Issue",
+		{"customer": customer_name},
+		["name", "subject", "customer"],
+		order_by="`creation` DESC",
+		limit=1,
+	)
 
 	return issues[0] if issues else None
 
 
 def get_scheduled_employees_for_popup(communication_medium):
-	if not communication_medium: return []
+	if not communication_medium:
+		return []
 
 	now_time = frappe.utils.nowtime()
 	weekday = frappe.utils.get_weekday()
 
-	available_employee_groups = frappe.get_all("Communication Medium Timeslot", filters={
-		'day_of_week': weekday,
-		'parent': communication_medium,
-		'from_time': ['<=', now_time],
-		'to_time': ['>=', now_time],
-	}, fields=['employee_group'])
+	available_employee_groups = frappe.get_all(
+		"Communication Medium Timeslot",
+		filters={
+			"day_of_week": weekday,
+			"parent": communication_medium,
+			"from_time": ["<=", now_time],
+			"to_time": [">=", now_time],
+		},
+		fields=["employee_group"],
+	)
 
 	available_employee_groups = tuple([emp.employee_group for emp in available_employee_groups])
 
-	employees = frappe.get_all('Employee Group Table', filters={
-		'parent': ['in', available_employee_groups]
-	}, fields=['user_id'])
+	employees = frappe.get_all(
+		"Employee Group Table", filters={"parent": ["in", available_employee_groups]}, fields=["user_id"]
+	)
 
 	employee_emails = set([employee.user_id for employee in employees])
 
 	return employee_emails
 
+
 def strip_number(number):
-	if not number: return
+	if not number:
+		return
 	# strip + and 0 from the start of the number for proper number comparisions
 	# eg. +7888383332 should match with 7888383332
 	# eg. 07888383332 should match with 7888383332
-	number = number.lstrip('+')
-	number = number.lstrip('0')
+	number = number.lstrip("+")
+	number = number.lstrip("0")
 	return number
diff --git a/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py b/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py
index 6f3e311..be7f5ca 100644
--- a/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py
+++ b/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py
@@ -9,77 +9,40 @@
 
 def execute(filters=None):
 	columns, data = [], []
-	columns=get_columns("Campaign Name")
-	data=get_lead_data(filters or {}, "Campaign Name")
+	columns = get_columns("Campaign Name")
+	data = get_lead_data(filters or {}, "Campaign Name")
 	return columns, data
 
+
 def get_columns(based_on):
 	return [
-		{
-			"fieldname": frappe.scrub(based_on),
-			"label": _(based_on),
-			"fieldtype": "Data",
-			"width": 150
-		},
-		{
-			"fieldname": "lead_count",
-			"label": _("Lead Count"),
-			"fieldtype": "Int",
-			"width": 80
-		},
-		{
-			"fieldname": "opp_count",
-			"label": _("Opp Count"),
-			"fieldtype": "Int",
-			"width": 80
-		},
-		{
-			"fieldname": "quot_count",
-			"label": _("Quot Count"),
-			"fieldtype": "Int",
-			"width": 80
-		},
-		{
-			"fieldname": "order_count",
-			"label": _("Order Count"),
-			"fieldtype": "Int",
-			"width": 100
-		},
-		{
-			"fieldname": "order_value",
-			"label": _("Order Value"),
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"fieldname": "opp_lead",
-			"label": _("Opp/Lead %"),
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"fieldname": "quot_lead",
-			"label": _("Quot/Lead %"),
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"fieldname": "order_quot",
-			"label": _("Order/Quot %"),
-			"fieldtype": "Float",
-			"width": 100
-		}
+		{"fieldname": frappe.scrub(based_on), "label": _(based_on), "fieldtype": "Data", "width": 150},
+		{"fieldname": "lead_count", "label": _("Lead Count"), "fieldtype": "Int", "width": 80},
+		{"fieldname": "opp_count", "label": _("Opp Count"), "fieldtype": "Int", "width": 80},
+		{"fieldname": "quot_count", "label": _("Quot Count"), "fieldtype": "Int", "width": 80},
+		{"fieldname": "order_count", "label": _("Order Count"), "fieldtype": "Int", "width": 100},
+		{"fieldname": "order_value", "label": _("Order Value"), "fieldtype": "Float", "width": 100},
+		{"fieldname": "opp_lead", "label": _("Opp/Lead %"), "fieldtype": "Float", "width": 100},
+		{"fieldname": "quot_lead", "label": _("Quot/Lead %"), "fieldtype": "Float", "width": 100},
+		{"fieldname": "order_quot", "label": _("Order/Quot %"), "fieldtype": "Float", "width": 100},
 	]
 
+
 def get_lead_data(filters, based_on):
 	based_on_field = frappe.scrub(based_on)
 	conditions = get_filter_conditions(filters)
 
-	lead_details = frappe.db.sql("""
+	lead_details = frappe.db.sql(
+		"""
 		select {based_on_field}, name
 		from `tabLead`
 		where {based_on_field} is not null and {based_on_field} != '' {conditions}
-	""".format(based_on_field=based_on_field, conditions=conditions), filters, as_dict=1)
+	""".format(
+			based_on_field=based_on_field, conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	lead_map = frappe._dict()
 	for d in lead_details:
@@ -87,11 +50,8 @@
 
 	data = []
 	for based_on_value, leads in lead_map.items():
-		row = {
-			based_on_field: based_on_value,
-			"lead_count": len(leads)
-		}
-		row["quot_count"]= get_lead_quotation_count(leads)
+		row = {based_on_field: based_on_value, "lead_count": len(leads)}
+		row["quot_count"] = get_lead_quotation_count(leads)
 		row["opp_count"] = get_lead_opp_count(leads)
 		row["order_count"] = get_quotation_ordered_count(leads)
 		row["order_value"] = get_order_amount(leads) or 0
@@ -105,8 +65,9 @@
 
 	return data
 
+
 def get_filter_conditions(filters):
-	conditions=""
+	conditions = ""
 	if filters.from_date:
 		conditions += " and date(creation) >= %(from_date)s"
 	if filters.to_date:
@@ -114,23 +75,45 @@
 
 	return conditions
 
+
 def get_lead_quotation_count(leads):
-	return frappe.db.sql("""select count(name) from `tabQuotation`
-		where quotation_to = 'Lead' and party_name in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0] #nosec
+	return frappe.db.sql(
+		"""select count(name) from `tabQuotation`
+		where quotation_to = 'Lead' and party_name in (%s)"""
+		% ", ".join(["%s"] * len(leads)),
+		tuple(leads),
+	)[0][
+		0
+	]  # nosec
+
 
 def get_lead_opp_count(leads):
-	return frappe.db.sql("""select count(name) from `tabOpportunity`
-	where opportunity_from = 'Lead' and party_name in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0]
+	return frappe.db.sql(
+		"""select count(name) from `tabOpportunity`
+	where opportunity_from = 'Lead' and party_name in (%s)"""
+		% ", ".join(["%s"] * len(leads)),
+		tuple(leads),
+	)[0][0]
+
 
 def get_quotation_ordered_count(leads):
-	return frappe.db.sql("""select count(name)
+	return frappe.db.sql(
+		"""select count(name)
 		from `tabQuotation` where status = 'Ordered' and quotation_to = 'Lead'
-		and party_name in (%s)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0]
+		and party_name in (%s)"""
+		% ", ".join(["%s"] * len(leads)),
+		tuple(leads),
+	)[0][0]
+
 
 def get_order_amount(leads):
-	return frappe.db.sql("""select sum(base_net_amount)
+	return frappe.db.sql(
+		"""select sum(base_net_amount)
 		from `tabSales Order Item`
 		where prevdoc_docname in (
 			select name from `tabQuotation` where status = 'Ordered'
 			and quotation_to = 'Lead' and party_name in (%s)
-		)""" % ', '.join(["%s"]*len(leads)), tuple(leads))[0][0]
+		)"""
+		% ", ".join(["%s"] * len(leads)),
+		tuple(leads),
+	)[0][0]
diff --git a/erpnext/crm/report/first_response_time_for_opportunity/first_response_time_for_opportunity.py b/erpnext/crm/report/first_response_time_for_opportunity/first_response_time_for_opportunity.py
index ed6cefb..9dae1d5 100644
--- a/erpnext/crm/report/first_response_time_for_opportunity/first_response_time_for_opportunity.py
+++ b/erpnext/crm/report/first_response_time_for_opportunity/first_response_time_for_opportunity.py
@@ -7,21 +7,17 @@
 
 def execute(filters=None):
 	columns = [
+		{"fieldname": "creation_date", "label": "Date", "fieldtype": "Date", "width": 300},
 		{
-			'fieldname': 'creation_date',
-			'label': 'Date',
-			'fieldtype': 'Date',
-			'width': 300
-		},
-		{
-			'fieldname': 'first_response_time',
-			'fieldtype': 'Duration',
-			'label': 'First Response Time',
-			'width': 300
+			"fieldname": "first_response_time",
+			"fieldtype": "Duration",
+			"label": "First Response Time",
+			"width": 300,
 		},
 	]
 
-	data = frappe.db.sql('''
+	data = frappe.db.sql(
+		"""
 		SELECT
 			date(creation) as creation_date,
 			avg(first_response_time) as avg_response_time
@@ -31,6 +27,8 @@
 			and first_response_time > 0
 		GROUP BY creation_date
 		ORDER BY creation_date desc
-	''', (filters.from_date, filters.to_date))
+	""",
+		(filters.from_date, filters.to_date),
+	)
 
 	return columns, data
diff --git a/erpnext/crm/report/lead_conversion_time/lead_conversion_time.py b/erpnext/crm/report/lead_conversion_time/lead_conversion_time.py
index 1f43fa0..d7d964d 100644
--- a/erpnext/crm/report/lead_conversion_time/lead_conversion_time.py
+++ b/erpnext/crm/report/lead_conversion_time/lead_conversion_time.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	communication_list = get_communication_details(filters)
 	columns = get_columns()
@@ -19,8 +20,12 @@
 
 	data = []
 	for communication in communication_list:
-		row = [communication.get('customer'), communication.get('interactions'),\
-			communication.get('duration'), communication.get('support_tickets')]
+		row = [
+			communication.get("customer"),
+			communication.get("interactions"),
+			communication.get("duration"),
+			communication.get("support_tickets"),
+		]
 		data.append(row)
 
 	# add the average row
@@ -32,9 +37,17 @@
 		total_interactions += row[1]
 		total_duration += row[2]
 		total_tickets += row[3]
-	data.append(['Average', total_interactions/len(data), total_duration/len(data), total_tickets/len(data)])
+	data.append(
+		[
+			"Average",
+			total_interactions / len(data),
+			total_duration / len(data),
+			total_tickets / len(data),
+		]
+	)
 	return columns, data
 
+
 def get_columns():
 	return [
 		{
@@ -42,36 +55,37 @@
 			"fieldname": "customer",
 			"fieldtype": "Link",
 			"options": "Customer",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("No of Interactions"),
 			"fieldname": "interactions",
 			"fieldtype": "Float",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Duration in Days"),
-			"fieldname": "duration",
-			"fieldtype": "Float",
-			"width": 120
-		},
+		{"label": _("Duration in Days"), "fieldname": "duration", "fieldtype": "Float", "width": 120},
 		{
 			"label": _("Support Tickets"),
 			"fieldname": "support_tickets",
 			"fieldtype": "Float",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
+
 def get_communication_details(filters):
 	communication_count = None
 	communication_list = []
-	opportunities = frappe.db.get_values('Opportunity', {'opportunity_from': 'Lead'},\
-		['name', 'customer_name', 'contact_email'], as_dict=1)
+	opportunities = frappe.db.get_values(
+		"Opportunity",
+		{"opportunity_from": "Lead"},
+		["name", "customer_name", "contact_email"],
+		as_dict=1,
+	)
 
 	for d in opportunities:
-		invoice = frappe.db.sql('''
+		invoice = frappe.db.sql(
+			"""
 				SELECT
 					date(creation)
 				FROM
@@ -81,22 +95,30 @@
 				ORDER BY
 					creation
 				LIMIT 1
-			''', (d.contact_email, filters.from_date, filters.to_date))
+			""",
+			(d.contact_email, filters.from_date, filters.to_date),
+		)
 
-		if not invoice: continue
+		if not invoice:
+			continue
 
-		communication_count = frappe.db.sql('''
+		communication_count = frappe.db.sql(
+			"""
 				SELECT
 					count(*)
 				FROM
 					`tabCommunication`
 				WHERE
 					sender = %s AND date(communication_date) <= %s
-			''', (d.contact_email, invoice))[0][0]
+			""",
+			(d.contact_email, invoice),
+		)[0][0]
 
-		if not communication_count: continue
+		if not communication_count:
+			continue
 
-		first_contact = frappe.db.sql('''
+		first_contact = frappe.db.sql(
+			"""
 				SELECT
 					date(communication_date)
 				FROM
@@ -106,10 +128,19 @@
 				ORDER BY
 					communication_date
 				LIMIT 1
-			''', (d.contact_email))[0][0]
+			""",
+			(d.contact_email),
+		)[0][0]
 
 		duration = flt(date_diff(invoice[0][0], first_contact))
 
-		support_tickets = len(frappe.db.get_all('Issue', {'raised_by': d.contact_email}))
-		communication_list.append({'customer': d.customer_name, 'interactions': communication_count, 'duration': duration, 'support_tickets': support_tickets})
+		support_tickets = len(frappe.db.get_all("Issue", {"raised_by": d.contact_email}))
+		communication_list.append(
+			{
+				"customer": d.customer_name,
+				"interactions": communication_count,
+				"duration": duration,
+				"support_tickets": support_tickets,
+			}
+		)
 	return communication_list
diff --git a/erpnext/crm/report/lead_details/lead_details.py b/erpnext/crm/report/lead_details/lead_details.py
index 09eba7c..8660c73 100644
--- a/erpnext/crm/report/lead_details/lead_details.py
+++ b/erpnext/crm/report/lead_details/lead_details.py
@@ -10,6 +10,7 @@
 	columns, data = get_columns(), get_data(filters)
 	return columns, data
 
+
 def get_columns():
 	columns = [
 		{
@@ -19,101 +20,57 @@
 			"options": "Lead",
 			"width": 150,
 		},
+		{"label": _("Lead Name"), "fieldname": "lead_name", "fieldtype": "Data", "width": 120},
+		{"fieldname": "status", "label": _("Status"), "fieldtype": "Data", "width": 100},
 		{
-			"label": _("Lead Name"),
-			"fieldname": "lead_name",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname":"status",
-			"label": _("Status"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname":"lead_owner",
+			"fieldname": "lead_owner",
 			"label": _("Lead Owner"),
 			"fieldtype": "Link",
 			"options": "User",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Territory"),
 			"fieldname": "territory",
 			"fieldtype": "Link",
 			"options": "Territory",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Source"),
-			"fieldname": "source",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("Email"),
-			"fieldname": "email_id",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("Mobile"),
-			"fieldname": "mobile_no",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("Phone"),
-			"fieldname": "phone",
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"label": _("Source"), "fieldname": "source", "fieldtype": "Data", "width": 120},
+		{"label": _("Email"), "fieldname": "email_id", "fieldtype": "Data", "width": 120},
+		{"label": _("Mobile"), "fieldname": "mobile_no", "fieldtype": "Data", "width": 120},
+		{"label": _("Phone"), "fieldname": "phone", "fieldtype": "Data", "width": 120},
 		{
 			"label": _("Owner"),
 			"fieldname": "owner",
 			"fieldtype": "Link",
 			"options": "user",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Company"),
 			"fieldname": "company",
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 120
+			"width": 120,
 		},
+		{"fieldname": "address", "label": _("Address"), "fieldtype": "Data", "width": 130},
+		{"fieldname": "state", "label": _("State"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "pincode", "label": _("Postal Code"), "fieldtype": "Data", "width": 90},
 		{
-			"fieldname":"address",
-			"label": _("Address"),
-			"fieldtype": "Data",
-			"width": 130
-		},
-		{
-			"fieldname":"state",
-			"label": _("State"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname":"pincode",
-			"label": _("Postal Code"),
-			"fieldtype": "Data",
-			"width": 90
-		},
-		{
-			"fieldname":"country",
+			"fieldname": "country",
 			"label": _("Country"),
 			"fieldtype": "Link",
 			"options": "Country",
-			"width": 100
+			"width": 100,
 		},
-
 	]
 	return columns
 
+
 def get_data(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			`tabLead`.name,
 			`tabLead`.lead_name,
@@ -144,9 +101,15 @@
 			AND `tabLead`.creation BETWEEN %(from_date)s AND %(to_date)s
 			{conditions}
 		ORDER BY
-			`tabLead`.creation asc """.format(conditions=get_conditions(filters)), filters, as_dict=1)
+			`tabLead`.creation asc """.format(
+			conditions=get_conditions(filters)
+		),
+		filters,
+		as_dict=1,
+	)
 
-def get_conditions(filters) :
+
+def get_conditions(filters):
 	conditions = []
 
 	if filters.get("territory"):
diff --git a/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py b/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py
index 2932211..996b1b4 100644
--- a/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py
+++ b/erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.py
@@ -9,10 +9,11 @@
 
 def execute(filters=None):
 	columns, data = [], []
-	columns=get_columns()
-	data=get_lead_data(filters, "Lead Owner")
+	columns = get_columns()
+	data = get_lead_data(filters, "Lead Owner")
 	return columns, data
 
+
 def get_columns():
 	return [
 		{
@@ -20,54 +21,14 @@
 			"label": _("Lead Owner"),
 			"fieldtype": "Link",
 			"options": "User",
-			"width": "130"
+			"width": "130",
 		},
-		{
-			"fieldname": "lead_count",
-			"label": _("Lead Count"),
-			"fieldtype": "Int",
-			"width": "80"
-		},
-		{
-			"fieldname": "opp_count",
-			"label": _("Opp Count"),
-			"fieldtype": "Int",
-			"width": "80"
-		},
-		{
-			"fieldname": "quot_count",
-			"label": _("Quot Count"),
-			"fieldtype": "Int",
-			"width": "80"
-		},
-		{
-			"fieldname": "order_count",
-			"label": _("Order Count"),
-			"fieldtype": "Int",
-			"width": "100"
-		},
-		{
-			"fieldname": "order_value",
-			"label": _("Order Value"),
-			"fieldtype": "Float",
-			"width": "100"
-		},
-		{
-			"fieldname": "opp_lead",
-			"label": _("Opp/Lead %"),
-			"fieldtype": "Float",
-			"width": "100"
-		},
-		{
-			"fieldname": "quot_lead",
-			"label": _("Quot/Lead %"),
-			"fieldtype": "Float",
-			"width": "100"
-		},
-		{
-			"fieldname": "order_quot",
-			"label": _("Order/Quot %"),
-			"fieldtype": "Float",
-			"width": "100"
-		}
+		{"fieldname": "lead_count", "label": _("Lead Count"), "fieldtype": "Int", "width": "80"},
+		{"fieldname": "opp_count", "label": _("Opp Count"), "fieldtype": "Int", "width": "80"},
+		{"fieldname": "quot_count", "label": _("Quot Count"), "fieldtype": "Int", "width": "80"},
+		{"fieldname": "order_count", "label": _("Order Count"), "fieldtype": "Int", "width": "100"},
+		{"fieldname": "order_value", "label": _("Order Value"), "fieldtype": "Float", "width": "100"},
+		{"fieldname": "opp_lead", "label": _("Opp/Lead %"), "fieldtype": "Float", "width": "100"},
+		{"fieldname": "quot_lead", "label": _("Quot/Lead %"), "fieldtype": "Float", "width": "100"},
+		{"fieldname": "order_quot", "label": _("Order/Quot %"), "fieldtype": "Float", "width": "100"},
 	]
diff --git a/erpnext/crm/report/lost_opportunity/lost_opportunity.py b/erpnext/crm/report/lost_opportunity/lost_opportunity.py
index 60d4be8..a57b44b 100644
--- a/erpnext/crm/report/lost_opportunity/lost_opportunity.py
+++ b/erpnext/crm/report/lost_opportunity/lost_opportunity.py
@@ -10,6 +10,7 @@
 	columns, data = get_columns(), get_data(filters)
 	return columns, data
 
+
 def get_columns():
 	columns = [
 		{
@@ -24,59 +25,56 @@
 			"fieldname": "opportunity_from",
 			"fieldtype": "Link",
 			"options": "DocType",
-			"width": 130
+			"width": 130,
 		},
 		{
 			"label": _("Party"),
-			"fieldname":"party_name",
+			"fieldname": "party_name",
 			"fieldtype": "Dynamic Link",
 			"options": "opportunity_from",
-			"width": 160
+			"width": 160,
 		},
 		{
 			"label": _("Customer/Lead Name"),
-			"fieldname":"customer_name",
+			"fieldname": "customer_name",
 			"fieldtype": "Data",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Opportunity Type"),
 			"fieldname": "opportunity_type",
 			"fieldtype": "Data",
-			"width": 130
+			"width": 130,
 		},
-		{
-			"label": _("Lost Reasons"),
-			"fieldname": "lost_reason",
-			"fieldtype": "Data",
-			"width": 220
-		},
+		{"label": _("Lost Reasons"), "fieldname": "lost_reason", "fieldtype": "Data", "width": 220},
 		{
 			"label": _("Sales Stage"),
 			"fieldname": "sales_stage",
 			"fieldtype": "Link",
 			"options": "Sales Stage",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Territory"),
 			"fieldname": "territory",
 			"fieldtype": "Link",
 			"options": "Territory",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Next Contact By"),
 			"fieldname": "contact_by",
 			"fieldtype": "Link",
 			"options": "User",
-			"width": 150
-		}
+			"width": 150,
+		},
 	]
 	return columns
 
+
 def get_data(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			`tabOpportunity`.name,
 			`tabOpportunity`.opportunity_from,
@@ -97,7 +95,12 @@
 		GROUP BY
 			`tabOpportunity`.name
 		ORDER BY
-			`tabOpportunity`.creation asc  """.format(conditions=get_conditions(filters), join=get_join(filters)), filters, as_dict=1)
+			`tabOpportunity`.creation asc  """.format(
+			conditions=get_conditions(filters), join=get_join(filters)
+		),
+		filters,
+		as_dict=1,
+	)
 
 
 def get_conditions(filters):
@@ -117,6 +120,7 @@
 
 	return " ".join(conditions) if conditions else ""
 
+
 def get_join(filters):
 	join = """LEFT JOIN `tabOpportunity Lost Reason Detail`
 			ON `tabOpportunity Lost Reason Detail`.parenttype = 'Opportunity' and
@@ -127,6 +131,8 @@
 			ON `tabOpportunity Lost Reason Detail`.parenttype = 'Opportunity' and
 			`tabOpportunity Lost Reason Detail`.parent = `tabOpportunity`.name and
 			`tabOpportunity Lost Reason Detail`.lost_reason = '{0}'
-			""".format(filters.get("lost_reason"))
+			""".format(
+			filters.get("lost_reason")
+		)
 
 	return join
diff --git a/erpnext/crm/report/opportunity_summary_by_sales_stage/opportunity_summary_by_sales_stage.py b/erpnext/crm/report/opportunity_summary_by_sales_stage/opportunity_summary_by_sales_stage.py
index f53b5bd..77e6ae2 100644
--- a/erpnext/crm/report/opportunity_summary_by_sales_stage/opportunity_summary_by_sales_stage.py
+++ b/erpnext/crm/report/opportunity_summary_by_sales_stage/opportunity_summary_by_sales_stage.py
@@ -13,8 +13,9 @@
 def execute(filters=None):
 	return OpportunitySummaryBySalesStage(filters).run()
 
+
 class OpportunitySummaryBySalesStage(object):
-	def __init__(self,filters=None):
+	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
 
 	def run(self):
@@ -26,98 +27,94 @@
 	def get_columns(self):
 		self.columns = []
 
-		if self.filters.get('based_on') == 'Opportunity Owner':
-			self.columns.append({
-				'label': _('Opportunity Owner'),
-				'fieldname': 'opportunity_owner',
-				'width': 200
-			})
+		if self.filters.get("based_on") == "Opportunity Owner":
+			self.columns.append(
+				{"label": _("Opportunity Owner"), "fieldname": "opportunity_owner", "width": 200}
+			)
 
-		if self.filters.get('based_on') == 'Source':
-			self.columns.append({
-				'label': _('Source'),
-				'fieldname': 'source',
-				'fieldtype': 'Link',
-				'options': 'Lead Source',
-				'width': 200
-			})
+		if self.filters.get("based_on") == "Source":
+			self.columns.append(
+				{
+					"label": _("Source"),
+					"fieldname": "source",
+					"fieldtype": "Link",
+					"options": "Lead Source",
+					"width": 200,
+				}
+			)
 
-		if self.filters.get('based_on') == 'Opportunity Type':
-			self.columns.append({
-				'label': _('Opportunity Type'),
-				'fieldname': 'opportunity_type',
-				'width': 200
-			})
+		if self.filters.get("based_on") == "Opportunity Type":
+			self.columns.append(
+				{"label": _("Opportunity Type"), "fieldname": "opportunity_type", "width": 200}
+			)
 
 		self.set_sales_stage_columns()
 
 	def set_sales_stage_columns(self):
-		self.sales_stage_list = frappe.db.get_list('Sales Stage', pluck='name')
+		self.sales_stage_list = frappe.db.get_list("Sales Stage", pluck="name")
 
 		for sales_stage in self.sales_stage_list:
-			if self.filters.get('data_based_on') == 'Number':
-				self.columns.append({
-					'label': _(sales_stage),
-					'fieldname': sales_stage,
-					'fieldtype': 'Int',
-					'width': 150
-				})
+			if self.filters.get("data_based_on") == "Number":
+				self.columns.append(
+					{"label": _(sales_stage), "fieldname": sales_stage, "fieldtype": "Int", "width": 150}
+				)
 
-			elif self.filters.get('data_based_on') == 'Amount':
-				self.columns.append({
-					'label': _(sales_stage),
-					'fieldname': sales_stage,
-					'fieldtype': 'Currency',
-					'width': 150
-				})
+			elif self.filters.get("data_based_on") == "Amount":
+				self.columns.append(
+					{"label": _(sales_stage), "fieldname": sales_stage, "fieldtype": "Currency", "width": 150}
+				)
 
 	def get_data(self):
 		self.data = []
 
 		based_on = {
-			'Opportunity Owner': '_assign',
-			'Source': 'source',
-			'Opportunity Type': 'opportunity_type'
-		}[self.filters.get('based_on')]
+			"Opportunity Owner": "_assign",
+			"Source": "source",
+			"Opportunity Type": "opportunity_type",
+		}[self.filters.get("based_on")]
 
 		data_based_on = {
-			'Number': 'count(name) as count',
-			'Amount': 'opportunity_amount as amount',
-		}[self.filters.get('data_based_on')]
+			"Number": "count(name) as count",
+			"Amount": "opportunity_amount as amount",
+		}[self.filters.get("data_based_on")]
 
 		self.get_data_query(based_on, data_based_on)
 
 		self.get_rows()
 
 	def get_data_query(self, based_on, data_based_on):
-		if self.filters.get('data_based_on') == 'Number':
-			group_by = '{},{}'.format('sales_stage', based_on)
-			self.query_result = frappe.db.get_list('Opportunity',
+		if self.filters.get("data_based_on") == "Number":
+			group_by = "{},{}".format("sales_stage", based_on)
+			self.query_result = frappe.db.get_list(
+				"Opportunity",
 				filters=self.get_conditions(),
-				fields=['sales_stage', data_based_on, based_on],
-				group_by=group_by
+				fields=["sales_stage", data_based_on, based_on],
+				group_by=group_by,
 			)
 
-		elif self.filters.get('data_based_on') == 'Amount':
-			self.query_result = frappe.db.get_list('Opportunity',
+		elif self.filters.get("data_based_on") == "Amount":
+			self.query_result = frappe.db.get_list(
+				"Opportunity",
 				filters=self.get_conditions(),
-				fields=['sales_stage', based_on, data_based_on, 'currency']
+				fields=["sales_stage", based_on, data_based_on, "currency"],
 			)
 
 			self.convert_to_base_currency()
 
 			dataframe = pandas.DataFrame.from_records(self.query_result)
-			dataframe.replace(to_replace=[None], value='Not Assigned', inplace=True)
-			result = dataframe.groupby(['sales_stage', based_on], as_index=False)['amount'].sum()
+			dataframe.replace(to_replace=[None], value="Not Assigned", inplace=True)
+			result = dataframe.groupby(["sales_stage", based_on], as_index=False)["amount"].sum()
 
 			self.grouped_data = []
 
-			for i in range(len(result['amount'])):
-				self.grouped_data.append({
-					'sales_stage': result['sales_stage'][i],
-					based_on : result[based_on][i],
-					'amount': result['amount'][i]
-				})
+			for i in range(len(result["amount"])):
+				self.grouped_data.append(
+					{
+						"sales_stage": result["sales_stage"][i],
+						based_on: result[based_on][i],
+						"amount": result["amount"][i],
+					}
+				)
 
 			self.query_result = self.grouped_data
 
@@ -125,17 +122,17 @@
 		self.data = []
 		self.get_formatted_data()
 
-		for based_on,data in self.formatted_data.items():
-			row_based_on={
-				'Opportunity Owner': 'opportunity_owner',
-				'Source': 'source',
-				'Opportunity Type': 'opportunity_type'
-			}[self.filters.get('based_on')]
+		for based_on, data in self.formatted_data.items():
+			row_based_on = {
+				"Opportunity Owner": "opportunity_owner",
+				"Source": "source",
+				"Opportunity Type": "opportunity_type",
+			}[self.filters.get("based_on")]
 
 			row = {row_based_on: based_on}
 
 			for d in self.query_result:
-				sales_stage = d.get('sales_stage')
+				sales_stage = d.get("sales_stage")
 				row[sales_stage] = data.get(sales_stage)
 
 			self.data.append(row)
@@ -144,24 +141,21 @@
 		self.formatted_data = frappe._dict()
 
 		for d in self.query_result:
-			data_based_on ={
-				'Number': 'count',
-				'Amount': 'amount'
-			}[self.filters.get('data_based_on')]
+			data_based_on = {"Number": "count", "Amount": "amount"}[self.filters.get("data_based_on")]
 
-			based_on ={
-				'Opportunity Owner': '_assign',
-				'Source': 'source',
-				'Opportunity Type': 'opportunity_type'
-			}[self.filters.get('based_on')]
+			based_on = {
+				"Opportunity Owner": "_assign",
+				"Source": "source",
+				"Opportunity Type": "opportunity_type",
+			}[self.filters.get("based_on")]
 
-			if self.filters.get('based_on') == 'Opportunity Owner':
-				if d.get(based_on) == '[]' or d.get(based_on) is None or d.get(based_on) == 'Not Assigned':
-					assignments = ['Not Assigned']
+			if self.filters.get("based_on") == "Opportunity Owner":
+				if d.get(based_on) == "[]" or d.get(based_on) is None or d.get(based_on) == "Not Assigned":
+					assignments = ["Not Assigned"]
 				else:
 					assignments = json.loads(d.get(based_on))
 
-				sales_stage = d.get('sales_stage')
+				sales_stage = d.get("sales_stage")
 				count = d.get(data_based_on)
 
 				if assignments:
@@ -173,7 +167,7 @@
 						self.set_formatted_data_based_on_sales_stage(assigned_to, sales_stage, count)
 			else:
 				value = d.get(based_on)
-				sales_stage = d.get('sales_stage')
+				sales_stage = d.get("sales_stage")
 				count = d.get(data_based_on)
 				self.set_formatted_data_based_on_sales_stage(value, sales_stage, count)
 
@@ -184,20 +178,22 @@
 	def get_conditions(self):
 		filters = []
 
-		if self.filters.get('company'):
-			filters.append({'company': self.filters.get('company')})
+		if self.filters.get("company"):
+			filters.append({"company": self.filters.get("company")})
 
-		if self.filters.get('opportunity_type'):
-			filters.append({'opportunity_type': self.filters.get('opportunity_type')})
+		if self.filters.get("opportunity_type"):
+			filters.append({"opportunity_type": self.filters.get("opportunity_type")})
 
-		if self.filters.get('opportunity_source'):
-			filters.append({'source': self.filters.get('opportunity_source')})
+		if self.filters.get("opportunity_source"):
+			filters.append({"source": self.filters.get("opportunity_source")})
 
-		if self.filters.get('status'):
-			filters.append({'status': ('in',self.filters.get('status'))})
+		if self.filters.get("status"):
+			filters.append({"status": ("in", self.filters.get("status"))})
 
-		if self.filters.get('from_date') and self.filters.get('to_date'):
-			filters.append(['transaction_date', 'between', [self.filters.get('from_date'), self.filters.get('to_date')]])
+		if self.filters.get("from_date") and self.filters.get("to_date"):
+			filters.append(
+				["transaction_date", "between", [self.filters.get("from_date"), self.filters.get("to_date")]]
+			)
 
 		return filters
 
@@ -209,45 +205,36 @@
 		for sales_stage in self.sales_stage_list:
 			labels.append(sales_stage)
 
-		options = {
-			'Number': 'count',
-			'Amount': 'amount'
-		}[self.filters.get('data_based_on')]
+		options = {"Number": "count", "Amount": "amount"}[self.filters.get("data_based_on")]
 
 		for data in self.query_result:
 			for count in range(len(values)):
-				if data['sales_stage'] == labels[count]:
+				if data["sales_stage"] == labels[count]:
 					values[count] = values[count] + data[options]
 
-		datasets.append({'name':options, 'values':values})
+		datasets.append({"name": options, "values": values})
 
-		self.chart = {
-			'data':{
-				'labels': labels,
-				'datasets': datasets
-			},
-			'type':'line'
-		}
+		self.chart = {"data": {"labels": labels, "datasets": datasets}, "type": "line"}
 
-	def currency_conversion(self,from_currency,to_currency):
+	def currency_conversion(self, from_currency, to_currency):
 		cacheobj = frappe.cache()
 
 		if cacheobj.get(from_currency):
-			return flt(str(cacheobj.get(from_currency),'UTF-8'))
+			return flt(str(cacheobj.get(from_currency), "UTF-8"))
 
 		else:
-			value = get_exchange_rate(from_currency,to_currency)
-			cacheobj.set(from_currency,value)
-			return flt(str(cacheobj.get(from_currency),'UTF-8'))
+			value = get_exchange_rate(from_currency, to_currency)
+			cacheobj.set(from_currency, value)
+			return flt(str(cacheobj.get(from_currency), "UTF-8"))
 
 	def get_default_currency(self):
-		company = self.filters.get('company')
-		return frappe.db.get_value('Company', company, 'default_currency')
+		company = self.filters.get("company")
+		return frappe.db.get_value("Company", company, "default_currency")
 
 	def convert_to_base_currency(self):
 		default_currency = self.get_default_currency()
 		for data in self.query_result:
-			if data.get('currency') != default_currency:
-				opportunity_currency = data.get('currency')
-				value = self.currency_conversion(opportunity_currency,default_currency)
-				data['amount'] = data['amount'] * value
+			if data.get("currency") != default_currency:
+				opportunity_currency = data.get("currency")
+				value = self.currency_conversion(opportunity_currency, default_currency)
+				data["amount"] = data["amount"] * value
diff --git a/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py b/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py
index 13859d9..ffc612d 100644
--- a/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py
+++ b/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py
@@ -27,68 +27,44 @@
 		self.check_all_filters()
 
 	def check_for_opportunity_owner(self):
-		filters = {
-			'based_on': "Opportunity Owner",
-			'data_based_on': "Number",
-			'company': "Best Test"
-		}
+		filters = {"based_on": "Opportunity Owner", "data_based_on": "Number", "company": "Best Test"}
 
 		report = execute(filters)
 
-		expected_data = [{
-			'opportunity_owner': "Not Assigned",
-			'Prospecting': 1
-		}]
+		expected_data = [{"opportunity_owner": "Not Assigned", "Prospecting": 1}]
 
 		self.assertEqual(expected_data, report[1])
 
 	def check_for_source(self):
-		filters = {
-			'based_on': "Source",
-			'data_based_on': "Number",
-			'company': "Best Test"
-		}
+		filters = {"based_on": "Source", "data_based_on": "Number", "company": "Best Test"}
 
 		report = execute(filters)
 
-		expected_data = [{
-			'source': 'Cold Calling',
-			'Prospecting': 1
-		}]
+		expected_data = [{"source": "Cold Calling", "Prospecting": 1}]
 
 		self.assertEqual(expected_data, report[1])
 
 	def check_for_opportunity_type(self):
-		filters = {
-			'based_on': "Opportunity Type",
-			'data_based_on': "Number",
-			'company': "Best Test"
-		}
+		filters = {"based_on": "Opportunity Type", "data_based_on": "Number", "company": "Best Test"}
 
 		report = execute(filters)
 
-		expected_data = [{
-			'opportunity_type': 'Sales',
-			'Prospecting': 1
-		}]
+		expected_data = [{"opportunity_type": "Sales", "Prospecting": 1}]
 
 		self.assertEqual(expected_data, report[1])
 
 	def check_all_filters(self):
 		filters = {
-			'based_on': "Opportunity Type",
-			'data_based_on': "Number",
-			'company': "Best Test",
-			'opportunity_source': "Cold Calling",
-			'opportunity_type': "Sales",
-			'status': ["Open"]
+			"based_on": "Opportunity Type",
+			"data_based_on": "Number",
+			"company": "Best Test",
+			"opportunity_source": "Cold Calling",
+			"opportunity_type": "Sales",
+			"status": ["Open"],
 		}
 
 		report = execute(filters)
 
-		expected_data = [{
-			'opportunity_type': 'Sales',
-			'Prospecting': 1
-		}]
+		expected_data = [{"opportunity_type": "Sales", "Prospecting": 1}]
 
-		self.assertEqual(expected_data, report[1])
\ No newline at end of file
+		self.assertEqual(expected_data, report[1])
diff --git a/erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py b/erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py
index 41cb442..50c42ef 100644
--- a/erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py
+++ b/erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py
@@ -15,62 +15,58 @@
 
 	return columns, data
 
+
 def set_defaut_value_for_filters(filters):
-	if not filters.get('no_of_interaction'): filters["no_of_interaction"] = 1
-	if not filters.get('lead_age'): filters["lead_age"] = 60
+	if not filters.get("no_of_interaction"):
+		filters["no_of_interaction"] = 1
+	if not filters.get("lead_age"):
+		filters["lead_age"] = 60
+
 
 def get_columns():
-	columns = [{
-			"label": _("Lead"),
-			"fieldname": "lead",
-			"fieldtype": "Link",
-			"options": "Lead",
-			"width": 130
-		},
-		{
-			"label": _("Name"),
-			"fieldname": "name",
-			"width": 120
-		},
-		{
-			"label": _("Organization"),
-			"fieldname": "organization",
-			"width": 120
-		},
+	columns = [
+		{"label": _("Lead"), "fieldname": "lead", "fieldtype": "Link", "options": "Lead", "width": 130},
+		{"label": _("Name"), "fieldname": "name", "width": 120},
+		{"label": _("Organization"), "fieldname": "organization", "width": 120},
 		{
 			"label": _("Reference Document Type"),
 			"fieldname": "reference_document_type",
 			"fieldtype": "Link",
 			"options": "Doctype",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Reference Name"),
 			"fieldname": "reference_name",
 			"fieldtype": "Dynamic Link",
 			"options": "reference_document_type",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Last Communication"),
 			"fieldname": "last_communication",
 			"fieldtype": "Data",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Last Communication Date"),
 			"fieldname": "last_communication_date",
 			"fieldtype": "Date",
-			"width": 100
-		}]
+			"width": 100,
+		},
+	]
 	return columns
 
+
 def get_data(filters):
 	lead_details = []
 	lead_filters = get_lead_filters(filters)
 
-	for lead in frappe.get_all('Lead', fields = ['name', 'lead_name', 'company_name'], filters=lead_filters):
-		data = frappe.db.sql("""
+	for lead in frappe.get_all(
+		"Lead", fields=["name", "lead_name", "company_name"], filters=lead_filters
+	):
+		data = frappe.db.sql(
+			"""
 			select
 				`tabCommunication`.reference_doctype, `tabCommunication`.reference_name,
 				`tabCommunication`.content, `tabCommunication`.communication_date
@@ -90,7 +86,8 @@
 				`tabCommunication`.sent_or_received = 'Received'
 			order by
 				ref_document.lead, `tabCommunication`.creation desc limit %(limit)s""",
-			{'lead': lead.name, 'limit': filters.get('no_of_interaction')})
+			{"lead": lead.name, "limit": filters.get("no_of_interaction")},
+		)
 
 		for lead_info in data:
 			lead_data = [lead.name, lead.lead_name, lead.company_name] + list(lead_info)
@@ -98,13 +95,15 @@
 
 	return lead_details
 
+
 def get_lead_filters(filters):
 	lead_creation_date = get_creation_date_based_on_lead_age(filters)
 	lead_filters = [["status", "!=", "Converted"], ["creation", ">", lead_creation_date]]
 
-	if filters.get('lead'):
-		lead_filters.append(["name", "=", filters.get('lead')])
+	if filters.get("lead"):
+		lead_filters.append(["name", "=", filters.get("lead")])
 	return lead_filters
 
+
 def get_creation_date_based_on_lead_age(filters):
-	return add_days(now(), (filters.get('lead_age') * -1))
+	return add_days(now(), (filters.get("lead_age") * -1))
diff --git a/erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py b/erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py
index 1c7846b..b0c174b 100644
--- a/erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py
+++ b/erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py
@@ -16,6 +16,7 @@
 def execute(filters=None):
 	return SalesPipelineAnalytics(filters).run()
 
+
 class SalesPipelineAnalytics(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
@@ -34,113 +35,94 @@
 		self.set_pipeline_based_on_column()
 
 	def set_range_columns(self):
-		based_on = {
-			'Number': 'Int',
-			'Amount': 'Currency'
-		}[self.filters.get('based_on')]
+		based_on = {"Number": "Int", "Amount": "Currency"}[self.filters.get("based_on")]
 
-		if self.filters.get('range') == 'Monthly':
+		if self.filters.get("range") == "Monthly":
 			month_list = self.get_month_list()
 
 			for month in month_list:
-				self.columns.append({
-					'fieldname': month,
-					'fieldtype': based_on,
-					'label': month,
-					'width': 200
-				})
+				self.columns.append({"fieldname": month, "fieldtype": based_on, "label": month, "width": 200})
 
-		elif self.filters.get('range') == 'Quarterly':
+		elif self.filters.get("range") == "Quarterly":
 			for quarter in range(1, 5):
-				self.columns.append({
-					'fieldname': f'Q{quarter}',
-					'fieldtype': based_on,
-					'label': f'Q{quarter}',
-					'width': 200
-				})
+				self.columns.append(
+					{"fieldname": f"Q{quarter}", "fieldtype": based_on, "label": f"Q{quarter}", "width": 200}
+				)
 
 	def set_pipeline_based_on_column(self):
-		if self.filters.get('pipeline_by') == 'Owner':
-			self.columns.insert(0, {
-				'fieldname': 'opportunity_owner',
-				'label': _('Opportunity Owner'),
-				'width': 200
-			})
+		if self.filters.get("pipeline_by") == "Owner":
+			self.columns.insert(
+				0, {"fieldname": "opportunity_owner", "label": _("Opportunity Owner"), "width": 200}
+			)
 
-		elif self.filters.get('pipeline_by') == 'Sales Stage':
-			self.columns.insert(0, {
-				'fieldname': 'sales_stage',
-				'label': _('Sales Stage'),
-				'width': 200
-			})
+		elif self.filters.get("pipeline_by") == "Sales Stage":
+			self.columns.insert(0, {"fieldname": "sales_stage", "label": _("Sales Stage"), "width": 200})
 
 	def get_fields(self):
-		self.based_on ={
-			'Owner': '_assign as opportunity_owner',
-			'Sales Stage': 'sales_stage'
-		}[self.filters.get('pipeline_by')]
+		self.based_on = {"Owner": "_assign as opportunity_owner", "Sales Stage": "sales_stage"}[
+			self.filters.get("pipeline_by")
+		]
 
-		self.data_based_on ={
-			'Number': 'count(name) as count',
-			'Amount': 'opportunity_amount as amount'
-		}[self.filters.get('based_on')]
+		self.data_based_on = {
+			"Number": "count(name) as count",
+			"Amount": "opportunity_amount as amount",
+		}[self.filters.get("based_on")]
 
-		self.group_by_based_on = {
-			'Owner': '_assign',
-			'Sales Stage': 'sales_stage'
-		}[self.filters.get('pipeline_by')]
+		self.group_by_based_on = {"Owner": "_assign", "Sales Stage": "sales_stage"}[
+			self.filters.get("pipeline_by")
+		]
 
 		self.group_by_period = {
-			'Monthly': 'month(expected_closing)',
-			'Quarterly': 'QUARTER(expected_closing)'
-		}[self.filters.get('range')]
+			"Monthly": "month(expected_closing)",
+			"Quarterly": "QUARTER(expected_closing)",
+		}[self.filters.get("range")]
 
-		self.pipeline_by = {
-			'Owner': 'opportunity_owner',
-			'Sales Stage': 'sales_stage'
-		}[self.filters.get('pipeline_by')]
+		self.pipeline_by = {"Owner": "opportunity_owner", "Sales Stage": "sales_stage"}[
+			self.filters.get("pipeline_by")
+		]
 
 		self.duration = {
-			'Monthly': 'monthname(expected_closing) as month',
-			'Quarterly': 'QUARTER(expected_closing) as quarter'
-		}[self.filters.get('range')]
+			"Monthly": "monthname(expected_closing) as month",
+			"Quarterly": "QUARTER(expected_closing) as quarter",
+		}[self.filters.get("range")]
 
-		self.period_by = {
-			'Monthly': 'month',
-			'Quarterly': 'quarter'
-		}[self.filters.get('range')]
+		self.period_by = {"Monthly": "month", "Quarterly": "quarter"}[self.filters.get("range")]
 
 	def get_data(self):
 		self.get_fields()
 
-		if self.filters.get('based_on') == 'Number':
-			self.query_result = frappe.db.get_list('Opportunity',
+		if self.filters.get("based_on") == "Number":
+			self.query_result = frappe.db.get_list(
+				"Opportunity",
 				filters=self.get_conditions(),
 				fields=[self.based_on, self.data_based_on, self.duration],
-				group_by='{},{}'.format(self.group_by_based_on, self.group_by_period),
-				order_by=self.group_by_period
+				group_by="{},{}".format(self.group_by_based_on, self.group_by_period),
+				order_by=self.group_by_period,
 			)
 
-		if self.filters.get('based_on') == 'Amount':
-			self.query_result = frappe.db.get_list('Opportunity',
+		if self.filters.get("based_on") == "Amount":
+			self.query_result = frappe.db.get_list(
+				"Opportunity",
 				filters=self.get_conditions(),
-				fields=[self.based_on, self.data_based_on, self.duration, 'currency']
+				fields=[self.based_on, self.data_based_on, self.duration, "currency"],
 			)
 
 			self.convert_to_base_currency()
 
 			dataframe = pandas.DataFrame.from_records(self.query_result)
-			dataframe.replace(to_replace=[None], value='Not Assigned', inplace=True)
-			result = dataframe.groupby([self.pipeline_by, self.period_by], as_index=False)['amount'].sum()
+			dataframe.replace(to_replace=[None], value="Not Assigned", inplace=True)
+			result = dataframe.groupby([self.pipeline_by, self.period_by], as_index=False)["amount"].sum()
 
 			self.grouped_data = []
 
-			for i in range(len(result['amount'])):
-				self.grouped_data.append({
-					self.pipeline_by : result[self.pipeline_by][i],
-					self.period_by : result[self.period_by][i],
-					'amount': result['amount'][i]
-				})
+			for i in range(len(result["amount"])):
+				self.grouped_data.append(
+					{
+						self.pipeline_by: result[self.pipeline_by][i],
+						self.period_by: result[self.period_by][i],
+						"amount": result["amount"][i],
+					}
+				)
 
 			self.query_result = self.grouped_data
 
@@ -150,21 +132,22 @@
 	def get_conditions(self):
 		conditions = []
 
-		if self.filters.get('opportunity_source'):
-			conditions.append({'source': self.filters.get('opportunity_source')})
+		if self.filters.get("opportunity_source"):
+			conditions.append({"source": self.filters.get("opportunity_source")})
 
-		if self.filters.get('opportunity_type'):
-			conditions.append({'opportunity_type': self.filters.get('opportunity_type')})
+		if self.filters.get("opportunity_type"):
+			conditions.append({"opportunity_type": self.filters.get("opportunity_type")})
 
-		if self.filters.get('status'):
-			conditions.append({'status': self.filters.get('status')})
+		if self.filters.get("status"):
+			conditions.append({"status": self.filters.get("status")})
 
-		if self.filters.get('company'):
-			conditions.append({'company': self.filters.get('company')})
+		if self.filters.get("company"):
+			conditions.append({"company": self.filters.get("company")})
 
-		if self.filters.get('from_date') and self.filters.get('to_date'):
-			conditions.append(['expected_closing', 'between',
-				[self.filters.get('from_date'), self.filters.get('to_date')]])
+		if self.filters.get("from_date") and self.filters.get("to_date"):
+			conditions.append(
+				["expected_closing", "between", [self.filters.get("from_date"), self.filters.get("to_date")]]
+			)
 
 		return conditions
 
@@ -175,49 +158,36 @@
 		self.append_to_dataset(datasets)
 
 		for column in self.columns:
-			if column['fieldname'] != 'opportunity_owner' and column['fieldname'] != 'sales_stage':
-				labels.append(column['fieldname'])
+			if column["fieldname"] != "opportunity_owner" and column["fieldname"] != "sales_stage":
+				labels.append(column["fieldname"])
 
-		self.chart = {
-			'data':{
-				'labels': labels,
-				'datasets': datasets
-			},
-			'type':'line'
-		}
+		self.chart = {"data": {"labels": labels, "datasets": datasets}, "type": "line"}
 
 		return self.chart
 
 	def get_periodic_data(self):
 		self.periodic_data = frappe._dict()
 
-		based_on = {
-			'Number': 'count',
-			'Amount': 'amount'
-		}[self.filters.get('based_on')]
+		based_on = {"Number": "count", "Amount": "amount"}[self.filters.get("based_on")]
 
-		pipeline_by = {
-			'Owner': 'opportunity_owner',
-			'Sales Stage': 'sales_stage'
-		}[self.filters.get('pipeline_by')]
+		pipeline_by = {"Owner": "opportunity_owner", "Sales Stage": "sales_stage"}[
+			self.filters.get("pipeline_by")
+		]
 
-		frequency = {
-			'Monthly': 'month',
-			'Quarterly': 'quarter'
-		}[self.filters.get('range')]
+		frequency = {"Monthly": "month", "Quarterly": "quarter"}[self.filters.get("range")]
 
 		for info in self.query_result:
-			if self.filters.get('range') == 'Monthly':
+			if self.filters.get("range") == "Monthly":
 				period = info.get(frequency)
-			if self.filters.get('range') == 'Quarterly':
+			if self.filters.get("range") == "Quarterly":
 				period = f'Q{cint(info.get("quarter"))}'
 
 			value = info.get(pipeline_by)
 			count_or_amount = info.get(based_on)
 
-			if self.filters.get('pipeline_by') == 'Owner':
-				if value == 'Not Assigned' or value == '[]' or value is None:
-					assigned_to = ['Not Assigned']
+			if self.filters.get("pipeline_by") == "Owner":
+				if value == "Not Assigned" or value == "[]" or value is None:
+					assigned_to = ["Not Assigned"]
 				else:
 					assigned_to = json.loads(value)
 				self.check_for_assigned_to(period, value, count_or_amount, assigned_to, info)
@@ -228,9 +198,9 @@
 	def set_formatted_data(self, period, value, count_or_amount, assigned_to):
 		if assigned_to:
 			if len(assigned_to) > 1:
-				if self.filters.get('assigned_to'):
+				if self.filters.get("assigned_to"):
 					for user in assigned_to:
-						if self.filters.get('assigned_to') == user:
+						if self.filters.get("assigned_to") == user:
 							value = user
 							self.periodic_data.setdefault(value, frappe._dict()).setdefault(period, 0)
 							self.periodic_data[value][period] += count_or_amount
@@ -249,40 +219,34 @@
 			self.periodic_data[value][period] += count_or_amount
 
 	def check_for_assigned_to(self, period, value, count_or_amount, assigned_to, info):
-		if self.filters.get('assigned_to'):
-			for data in json.loads(info.get('opportunity_owner')):
-				if data == self.filters.get('assigned_to'):
+		if self.filters.get("assigned_to"):
+			for data in json.loads(info.get("opportunity_owner")):
+				if data == self.filters.get("assigned_to"):
 					self.set_formatted_data(period, data, count_or_amount, assigned_to)
 		else:
 			self.set_formatted_data(period, value, count_or_amount, assigned_to)
 
 	def get_month_list(self):
-		month_list= []
+		month_list = []
 		current_date = date.today()
 		month_number = date.today().month
 
-		for month in range(month_number,13):
-			month_list.append(current_date.strftime('%B'))
+		for month in range(month_number, 13):
+			month_list.append(current_date.strftime("%B"))
 			current_date = current_date + relativedelta(months=1)
 
 		return month_list
 
 	def append_to_dataset(self, datasets):
-		range_by = {
-			'Monthly': 'month',
-			'Quarterly': 'quarter'
-		}[self.filters.get('range')]
+		range_by = {"Monthly": "month", "Quarterly": "quarter"}[self.filters.get("range")]
 
-		based_on = {
-			'Amount': 'amount',
-			'Number': 'count'
-		}[self.filters.get('based_on')]
+		based_on = {"Amount": "amount", "Number": "count"}[self.filters.get("based_on")]
 
-		if self.filters.get('range') == 'Quarterly':
-			frequency_list = [1,2,3,4]
+		if self.filters.get("range") == "Quarterly":
+			frequency_list = [1, 2, 3, 4]
 			count = [0] * 4
 
-		if self.filters.get('range') == 'Monthly':
+		if self.filters.get("range") == "Monthly":
 			frequency_list = self.get_month_list()
 			count = [0] * 12
 
@@ -290,43 +254,43 @@
 			for i in range(len(frequency_list)):
 				if info[range_by] == frequency_list[i]:
 					count[i] = count[i] + info[based_on]
-		datasets.append({'name': based_on, 'values': count})
+		datasets.append({"name": based_on, "values": count})
 
 	def append_data(self, pipeline_by, period_by):
 		self.data = []
-		for pipeline,period_data in self.periodic_data.items():
-			row = {pipeline_by : pipeline}
+		for pipeline, period_data in self.periodic_data.items():
+			row = {pipeline_by: pipeline}
 			for info in self.query_result:
-				if self.filters.get('range') == 'Monthly':
+				if self.filters.get("range") == "Monthly":
 					period = info.get(period_by)
 
-				if self.filters.get('range') == 'Quarterly':
-					period = f'Q{cint(info.get(period_by))}'
+				if self.filters.get("range") == "Quarterly":
+					period = f"Q{cint(info.get(period_by))}"
 
-				count = period_data.get(period,0.0)
+				count = period_data.get(period, 0.0)
 				row[period] = count
 
 			self.data.append(row)
 
 	def get_default_currency(self):
-		company = self.filters.get('company')
-		return frappe.db.get_value('Company',company,['default_currency'])
+		company = self.filters.get("company")
+		return frappe.db.get_value("Company", company, ["default_currency"])
 
 	def get_currency_rate(self, from_currency, to_currency):
 		cacheobj = frappe.cache()
 
 		if cacheobj.get(from_currency):
-			return flt(str(cacheobj.get(from_currency),'UTF-8'))
+			return flt(str(cacheobj.get(from_currency), "UTF-8"))
 
 		else:
 			value = get_exchange_rate(from_currency, to_currency)
 			cacheobj.set(from_currency, value)
-			return flt(str(cacheobj.get(from_currency),'UTF-8'))
+			return flt(str(cacheobj.get(from_currency), "UTF-8"))
 
 	def convert_to_base_currency(self):
 		default_currency = self.get_default_currency()
 		for data in self.query_result:
-			if data.get('currency') != default_currency:
-				opportunity_currency = data.get('currency')
-				value = self.get_currency_rate(opportunity_currency,default_currency)
-				data['amount'] = data['amount'] * value
+			if data.get("currency") != default_currency:
+				opportunity_currency = data.get("currency")
+				value = self.get_currency_rate(opportunity_currency, default_currency)
+				data["amount"] = data["amount"] * value
diff --git a/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py b/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py
index 24c3839..02d82b6 100644
--- a/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py
+++ b/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py
@@ -22,217 +22,175 @@
 
 	def check_for_monthly_and_number(self):
 		filters = {
-			'pipeline_by':"Owner",
-			'range':"Monthly",
-			'based_on':"Number",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Owner",
+			"range": "Monthly",
+			"based_on": "Number",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'opportunity_owner':'Not Assigned',
-				'August':1
-			}
-		]
+		expected_data = [{"opportunity_owner": "Not Assigned", "August": 1}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 		filters = {
-			'pipeline_by':"Sales Stage",
-			'range':"Monthly",
-			'based_on':"Number",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Sales Stage",
+			"range": "Monthly",
+			"based_on": "Number",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'sales_stage':'Prospecting',
-				'August':1
-			}
-		]
+		expected_data = [{"sales_stage": "Prospecting", "August": 1}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 	def check_for_monthly_and_amount(self):
 		filters = {
-			'pipeline_by':"Owner",
-			'range':"Monthly",
-			'based_on':"Amount",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Owner",
+			"range": "Monthly",
+			"based_on": "Amount",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'opportunity_owner':'Not Assigned',
-				'August':150000
-			}
-		]
+		expected_data = [{"opportunity_owner": "Not Assigned", "August": 150000}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 		filters = {
-			'pipeline_by':"Sales Stage",
-			'range':"Monthly",
-			'based_on':"Amount",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Sales Stage",
+			"range": "Monthly",
+			"based_on": "Amount",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'sales_stage':'Prospecting',
-				'August':150000
-			}
-		]
+		expected_data = [{"sales_stage": "Prospecting", "August": 150000}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 	def check_for_quarterly_and_number(self):
 		filters = {
-			'pipeline_by':"Owner",
-			'range':"Quarterly",
-			'based_on':"Number",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Owner",
+			"range": "Quarterly",
+			"based_on": "Number",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'opportunity_owner':'Not Assigned',
-				'Q3':1
-			}
-		]
+		expected_data = [{"opportunity_owner": "Not Assigned", "Q3": 1}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 		filters = {
-			'pipeline_by':"Sales Stage",
-			'range':"Quarterly",
-			'based_on':"Number",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Sales Stage",
+			"range": "Quarterly",
+			"based_on": "Number",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'sales_stage':'Prospecting',
-				'Q3':1
-			}
-		]
+		expected_data = [{"sales_stage": "Prospecting", "Q3": 1}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 	def check_for_quarterly_and_amount(self):
 		filters = {
-			'pipeline_by':"Owner",
-			'range':"Quarterly",
-			'based_on':"Amount",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Owner",
+			"range": "Quarterly",
+			"based_on": "Amount",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'opportunity_owner':'Not Assigned',
-				'Q3':150000
-			}
-		]
+		expected_data = [{"opportunity_owner": "Not Assigned", "Q3": 150000}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 		filters = {
-			'pipeline_by':"Sales Stage",
-			'range':"Quarterly",
-			'based_on':"Amount",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test"
+			"pipeline_by": "Sales Stage",
+			"range": "Quarterly",
+			"based_on": "Amount",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'sales_stage':'Prospecting',
-				'Q3':150000
-			}
-		]
+		expected_data = [{"sales_stage": "Prospecting", "Q3": 150000}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
 
 	def check_for_all_filters(self):
 		filters = {
-			'pipeline_by':"Owner",
-			'range':"Monthly",
-			'based_on':"Number",
-			'status':"Open",
-			'opportunity_type':"Sales",
-			'company':"Best Test",
-			'opportunity_source':'Cold Calling',
-			'from_date': '2021-08-01',
-			'to_date':'2021-08-31'
+			"pipeline_by": "Owner",
+			"range": "Monthly",
+			"based_on": "Number",
+			"status": "Open",
+			"opportunity_type": "Sales",
+			"company": "Best Test",
+			"opportunity_source": "Cold Calling",
+			"from_date": "2021-08-01",
+			"to_date": "2021-08-31",
 		}
 
 		report = execute(filters)
 
-		expected_data = [
-			{
-				'opportunity_owner':'Not Assigned',
-				'August': 1
-			}
-		]
+		expected_data = [{"opportunity_owner": "Not Assigned", "August": 1}]
 
-		self.assertEqual(expected_data,report[1])
+		self.assertEqual(expected_data, report[1])
+
 
 def create_company():
-	doc = frappe.db.exists('Company','Best Test')
+	doc = frappe.db.exists("Company", "Best Test")
 	if not doc:
-		doc = frappe.new_doc('Company')
-		doc.company_name = 'Best Test'
+		doc = frappe.new_doc("Company")
+		doc.company_name = "Best Test"
 		doc.default_currency = "INR"
 		doc.insert()
 
+
 def create_customer():
-	doc = frappe.db.exists("Customer","_Test NC")
+	doc = frappe.db.exists("Customer", "_Test NC")
 	if not doc:
 		doc = frappe.new_doc("Customer")
-		doc.customer_name = '_Test NC'
+		doc.customer_name = "_Test NC"
 		doc.insert()
 
+
 def create_opportunity():
-	doc = frappe.db.exists({"doctype":"Opportunity","party_name":"_Test NC"})
+	doc = frappe.db.exists({"doctype": "Opportunity", "party_name": "_Test NC"})
 	if not doc:
 		doc = frappe.new_doc("Opportunity")
 		doc.opportunity_from = "Customer"
-		customer_name = frappe.db.get_value("Customer",{"customer_name":'_Test NC'},['customer_name'])
+		customer_name = frappe.db.get_value("Customer", {"customer_name": "_Test NC"}, ["customer_name"])
 		doc.party_name = customer_name
 		doc.opportunity_amount = 150000
 		doc.source = "Cold Calling"
 		doc.currency = "INR"
 		doc.expected_closing = "2021-08-31"
-		doc.company = 'Best Test'
-		doc.insert()
\ No newline at end of file
+		doc.company = "Best Test"
+		doc.insert()
diff --git a/erpnext/crm/utils.py b/erpnext/crm/utils.py
index a4576a2..5783b2c 100644
--- a/erpnext/crm/utils.py
+++ b/erpnext/crm/utils.py
@@ -9,12 +9,16 @@
 
 			if len(contact.phone_nos) > 1:
 				# get the default phone number
-				primary_phones = [phone_doc.phone for phone_doc in contact.phone_nos if phone_doc.is_primary_phone]
+				primary_phones = [
+					phone_doc.phone for phone_doc in contact.phone_nos if phone_doc.is_primary_phone
+				]
 				if primary_phones:
 					phone = primary_phones[0]
 
 				# get the default mobile number
-				primary_mobile_nos = [phone_doc.phone for phone_doc in contact.phone_nos if phone_doc.is_primary_mobile_no]
+				primary_mobile_nos = [
+					phone_doc.phone for phone_doc in contact.phone_nos if phone_doc.is_primary_mobile_no
+				]
 				if primary_mobile_nos:
 					mobile_no = primary_mobile_nos[0]
 
@@ -22,15 +26,21 @@
 			lead.db_set("phone", phone)
 			lead.db_set("mobile_no", mobile_no)
 
+
 def copy_comments(doctype, docname, doc):
-	comments = frappe.db.get_values("Comment", filters={"reference_doctype": doctype, "reference_name": docname, "comment_type": "Comment"}, fieldname="*")
+	comments = frappe.db.get_values(
+		"Comment",
+		filters={"reference_doctype": doctype, "reference_name": docname, "comment_type": "Comment"},
+		fieldname="*",
+	)
 	for comment in comments:
-		comment = frappe.get_doc(comment.update({"doctype":"Comment"}))
+		comment = frappe.get_doc(comment.update({"doctype": "Comment"}))
 		comment.name = None
 		comment.reference_doctype = doc.doctype
 		comment.reference_name = doc.name
 		comment.insert()
 
+
 def add_link_in_communication(doctype, docname, doc):
 	communication_list = get_linked_communication_list(doctype, docname)
 
@@ -38,13 +48,15 @@
 		communication_doc = frappe.get_doc("Communication", communication)
 		communication_doc.add_link(doc.doctype, doc.name, autosave=True)
 
+
 def get_linked_communication_list(doctype, docname):
-	communications = frappe.get_all("Communication", filters={"reference_doctype": doctype, "reference_name": docname}, pluck='name')
-	communication_links = frappe.get_all('Communication Link',
-		{
-			"link_doctype": doctype,
-			"link_name": docname,
-			"parent": ("not in", communications)
-		}, pluck="parent")
+	communications = frappe.get_all(
+		"Communication", filters={"reference_doctype": doctype, "reference_name": docname}, pluck="name"
+	)
+	communication_links = frappe.get_all(
+		"Communication Link",
+		{"link_doctype": doctype, "link_name": docname, "parent": ("not in", communications)},
+		pluck="parent",
+	)
 
 	return communications + communication_links
diff --git a/erpnext/domains/distribution.py b/erpnext/domains/distribution.py
index 020ab3b..5953c4e 100644
--- a/erpnext/domains/distribution.py
+++ b/erpnext/domains/distribution.py
@@ -1,18 +1,16 @@
 data = {
-	'desktop_icons': [
-		'Item',
-		'Customer',
-		'Supplier',
-		'Lead',
-		'Sales Order',
-		'Purchase Order',
-		'Task',
-		'Sales Invoice',
-		'CRM',
-		'ToDo'
+	"desktop_icons": [
+		"Item",
+		"Customer",
+		"Supplier",
+		"Lead",
+		"Sales Order",
+		"Purchase Order",
+		"Task",
+		"Sales Invoice",
+		"CRM",
+		"ToDo",
 	],
-	'set_value': [
-		['Stock Settings', None, 'show_barcode_field', 1]
-	],
-	'default_portal_role': 'Customer'
+	"set_value": [["Stock Settings", None, "show_barcode_field", 1]],
+	"default_portal_role": "Customer",
 }
diff --git a/erpnext/domains/education.py b/erpnext/domains/education.py
index 11ea9b4..23b8258 100644
--- a/erpnext/domains/education.py
+++ b/erpnext/domains/education.py
@@ -1,27 +1,19 @@
 data = {
-	'desktop_icons': [
-		'Student',
-		'Program',
-		'Course',
-		'Student Group',
-		'Instructor',
-		'Fees',
-		'Task',
-		'ToDo',
-		'Education',
-		'Student Attendance Tool',
-		'Student Applicant'
+	"desktop_icons": [
+		"Student",
+		"Program",
+		"Course",
+		"Student Group",
+		"Instructor",
+		"Fees",
+		"Task",
+		"ToDo",
+		"Education",
+		"Student Attendance Tool",
+		"Student Applicant",
 	],
-	'default_portal_role': 'Student',
-	'restricted_roles': [
-		'Student',
-		'Instructor',
-		'Academics User',
-		'Education Manager'
-	],
-	'modules': [
-		'Education'
-	],
-	'on_setup': 'erpnext.education.setup.setup_education'
-
+	"default_portal_role": "Student",
+	"restricted_roles": ["Student", "Instructor", "Academics User", "Education Manager"],
+	"modules": ["Education"],
+	"on_setup": "erpnext.education.setup.setup_education",
 }
diff --git a/erpnext/domains/manufacturing.py b/erpnext/domains/manufacturing.py
index 96ce194..08ed3cf 100644
--- a/erpnext/domains/manufacturing.py
+++ b/erpnext/domains/manufacturing.py
@@ -1,22 +1,25 @@
 data = {
-	'desktop_icons': [
-		'Item',
-		'BOM',
-		'Customer',
-		'Supplier',
-		'Sales Order',
-		'Purchase Order',
-		'Work Order',
-		'Task',
-		'Accounts',
-		'HR',
-		'ToDo'
-	 ],
-	'properties': [
-		{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'collapsible_depends_on', 'value': 'is_stock_item'},
+	"desktop_icons": [
+		"Item",
+		"BOM",
+		"Customer",
+		"Supplier",
+		"Sales Order",
+		"Purchase Order",
+		"Work Order",
+		"Task",
+		"Accounts",
+		"HR",
+		"ToDo",
 	],
-	'set_value': [
-		['Stock Settings', None, 'show_barcode_field', 1]
+	"properties": [
+		{
+			"doctype": "Item",
+			"fieldname": "manufacturing",
+			"property": "collapsible_depends_on",
+			"value": "is_stock_item",
+		},
 	],
-	'default_portal_role': 'Customer'
+	"set_value": [["Stock Settings", None, "show_barcode_field", 1]],
+	"default_portal_role": "Customer",
 }
diff --git a/erpnext/domains/retail.py b/erpnext/domains/retail.py
index 07b2e27..8ea85f1 100644
--- a/erpnext/domains/retail.py
+++ b/erpnext/domains/retail.py
@@ -1,16 +1,14 @@
 data = {
-	'desktop_icons': [
-		'POS',
-		'Item',
-		'Customer',
-		'Sales Invoice',
-		'Purchase Order',
-		'Accounts',
-		'Task',
-		'ToDo'
+	"desktop_icons": [
+		"POS",
+		"Item",
+		"Customer",
+		"Sales Invoice",
+		"Purchase Order",
+		"Accounts",
+		"Task",
+		"ToDo",
 	],
-	'set_value': [
-		['Stock Settings', None, 'show_barcode_field', 1]
-	],
-	'default_portal_role': 'Customer'
+	"set_value": [["Stock Settings", None, "show_barcode_field", 1]],
+	"default_portal_role": "Customer",
 }
diff --git a/erpnext/domains/services.py b/erpnext/domains/services.py
index 6035afb..8595c69 100644
--- a/erpnext/domains/services.py
+++ b/erpnext/domains/services.py
@@ -1,19 +1,17 @@
 data = {
-	'desktop_icons': [
-		'Project',
-		'Timesheet',
-		'Customer',
-		'Sales Order',
-		'Sales Invoice',
-		'CRM',
-		'Task',
-		'Expense Claim',
-		'Employee',
-		'HR',
-		'ToDo'
+	"desktop_icons": [
+		"Project",
+		"Timesheet",
+		"Customer",
+		"Sales Order",
+		"Sales Invoice",
+		"CRM",
+		"Task",
+		"Expense Claim",
+		"Employee",
+		"HR",
+		"ToDo",
 	],
-	'set_value': [
-		['Stock Settings', None, 'show_barcode_field', 0]
-	],
-	'default_portal_role': 'Customer'
+	"set_value": [["Stock Settings", None, "show_barcode_field", 0]],
+	"default_portal_role": "Customer",
 }
diff --git a/erpnext/e_commerce/api.py b/erpnext/e_commerce/api.py
index 84554ae..179829c 100644
--- a/erpnext/e_commerce/api.py
+++ b/erpnext/e_commerce/api.py
@@ -15,16 +15,16 @@
 @frappe.whitelist(allow_guest=True)
 def get_product_filter_data(query_args=None):
 	"""
-		Returns filtered products and discount filters.
-		:param query_args (dict): contains filters to get products list
+	Returns filtered products and discount filters.
+	:param query_args (dict): contains filters to get products list
 
-		Query Args filters:
-		search (str): Search Term.
-		field_filters (dict): Keys include item_group, brand, etc.
-		attribute_filters(dict): Keys include Color, Size, etc.
-		start (int): Offset items by
-		item_group (str): Valid Item Group
-		from_filters (bool): Set as True to jump to page 1
+	Query Args filters:
+	search (str): Search Term.
+	field_filters (dict): Keys include item_group, brand, etc.
+	attribute_filters(dict): Keys include Color, Size, etc.
+	start (int): Offset items by
+	item_group (str): Valid Item Group
+	from_filters (bool): Set as True to jump to page 1
 	"""
 	if isinstance(query_args, str):
 		query_args = json.loads(query_args)
@@ -53,11 +53,7 @@
 	engine = ProductQuery()
 	try:
 		result = engine.query(
-			attribute_filters,
-			field_filters,
-			search_term=search,
-			start=start,
-			item_group=item_group
+			attribute_filters, field_filters, search_term=search, start=start, item_group=item_group
 		)
 	except Exception:
 		traceback = frappe.get_traceback()
@@ -77,9 +73,10 @@
 		"filters": filters,
 		"settings": engine.settings,
 		"sub_categories": sub_categories,
-		"items_count": result["items_count"]
+		"items_count": result["items_count"],
 	}
 
+
 @frappe.whitelist(allow_guest=True)
 def get_guest_redirect_on_action():
-	return frappe.db.get_single_value("E Commerce Settings", "redirect_on_action")
\ No newline at end of file
+	return frappe.db.get_single_value("E Commerce Settings", "redirect_on_action")
diff --git a/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.py b/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.py
index dd7b114..b5cd067 100644
--- a/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.py
+++ b/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.py
@@ -14,7 +14,9 @@
 )
 
 
-class ShoppingCartSetupError(frappe.ValidationError): pass
+class ShoppingCartSetupError(frappe.ValidationError):
+	pass
+
 
 class ECommerceSettings(Document):
 	def onload(self):
@@ -37,11 +39,17 @@
 			return
 
 		item_meta = frappe.get_meta("Item")
-		valid_fields = [df.fieldname for df in item_meta.fields if df.fieldtype in ["Link", "Table MultiSelect"]]
+		valid_fields = [
+			df.fieldname for df in item_meta.fields if df.fieldtype in ["Link", "Table MultiSelect"]
+		]
 
 		for f in self.filter_fields:
 			if f.fieldname not in valid_fields:
-				frappe.throw(_("Filter Fields Row #{0}: Fieldname <b>{1}</b> must be of type 'Link' or 'Table MultiSelect'").format(f.idx, f.fieldname))
+				frappe.throw(
+					_(
+						"Filter Fields Row #{0}: Fieldname <b>{1}</b> must be of type 'Link' or 'Table MultiSelect'"
+					).format(f.idx, f.fieldname)
+				)
 
 	def validate_attribute_filters(self):
 		if not (self.enable_attribute_filters and self.filter_attributes):
@@ -58,8 +66,8 @@
 		if not self.search_index_fields:
 			return
 
-		fields = self.search_index_fields.replace(' ', '')
-		fields = unique(fields.strip(',').split(',')) # Remove extra ',' and remove duplicates
+		fields = self.search_index_fields.replace(" ", "")
+		fields = unique(fields.strip(",").split(","))  # Remove extra ',' and remove duplicates
 
 		# All fields should be indexable
 		allowed_indexable_fields = get_indexable_web_fields()
@@ -70,18 +78,22 @@
 			invalid_fields = comma_and(invalid_fields)
 
 			if num_invalid_fields > 1:
-				frappe.throw(_("{0} are not valid options for Search Index Field.").format(frappe.bold(invalid_fields)))
+				frappe.throw(
+					_("{0} are not valid options for Search Index Field.").format(frappe.bold(invalid_fields))
+				)
 			else:
-				frappe.throw(_("{0} is not a valid option for Search Index Field.").format(frappe.bold(invalid_fields)))
+				frappe.throw(
+					_("{0} is not a valid option for Search Index Field.").format(frappe.bold(invalid_fields))
+				)
 
-		self.search_index_fields = ','.join(fields)
+		self.search_index_fields = ",".join(fields)
 
 	def validate_price_list_exchange_rate(self):
 		"Check if exchange rate exists for Price List currency (to Company's currency)."
 		from erpnext.setup.utils import get_exchange_rate
 
 		if not self.enabled or not self.company or not self.price_list:
-			return # this function is also called from hooks, check values again
+			return  # this function is also called from hooks, check values again
 
 		company_currency = frappe.get_cached_value("Company", self.company, "default_currency")
 		price_list_currency = frappe.db.get_value("Price List", self.price_list, "currency")
@@ -105,12 +117,13 @@
 				frappe.throw(_(msg), title=_("Missing"), exc=ShoppingCartSetupError)
 
 	def validate_tax_rule(self):
-		if not frappe.db.get_value("Tax Rule", {"use_for_shopping_cart" : 1}, "name"):
+		if not frappe.db.get_value("Tax Rule", {"use_for_shopping_cart": 1}, "name"):
 			frappe.throw(frappe._("Set Tax Rule for shopping cart"), ShoppingCartSetupError)
 
 	def get_tax_master(self, billing_territory):
-		tax_master = self.get_name_from_territory(billing_territory, "sales_taxes_and_charges_masters",
-			"sales_taxes_and_charges_master")
+		tax_master = self.get_name_from_territory(
+			billing_territory, "sales_taxes_and_charges_masters", "sales_taxes_and_charges_master"
+		)
 		return tax_master and tax_master[0] or None
 
 	def get_shipping_rules(self, shipping_territory):
@@ -127,25 +140,33 @@
 			if not (new_fields == old_fields):
 				create_website_items_index()
 
+
 def validate_cart_settings(doc=None, method=None):
 	frappe.get_doc("E Commerce Settings", "E Commerce Settings").run_method("validate")
 
+
 def get_shopping_cart_settings():
 	if not getattr(frappe.local, "shopping_cart_settings", None):
-		frappe.local.shopping_cart_settings = frappe.get_doc("E Commerce Settings", "E Commerce Settings")
+		frappe.local.shopping_cart_settings = frappe.get_doc(
+			"E Commerce Settings", "E Commerce Settings"
+		)
 
 	return frappe.local.shopping_cart_settings
 
+
 @frappe.whitelist(allow_guest=True)
 def is_cart_enabled():
 	return get_shopping_cart_settings().enabled
 
+
 def show_quantity_in_website():
 	return get_shopping_cart_settings().show_quantity_in_website
 
+
 def check_shopping_cart_enabled():
 	if not get_shopping_cart_settings().enabled:
 		frappe.throw(_("You need to enable Shopping Cart"), ShoppingCartSetupError)
 
+
 def show_attachments():
 	return get_shopping_cart_settings().show_attachments
diff --git a/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py b/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py
index 86cef30..c4c958b 100644
--- a/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py
+++ b/erpnext/e_commerce/doctype/e_commerce_settings/test_e_commerce_settings.py
@@ -15,8 +15,7 @@
 		frappe.db.sql("""delete from `tabSingles` where doctype="Shipping Cart Settings" """)
 
 	def get_cart_settings(self):
-		return frappe.get_doc({"doctype": "E Commerce Settings",
-			"company": "_Test Company"})
+		return frappe.get_doc({"doctype": "E Commerce Settings", "company": "_Test Company"})
 
 	# NOTE: Exchangrate API has all enabled currencies that ERPNext supports.
 	# We aren't checking just currency exchange record anymore
@@ -41,7 +40,7 @@
 
 	def test_tax_rule_validation(self):
 		frappe.db.sql("update `tabTax Rule` set use_for_shopping_cart = 0")
-		frappe.db.commit() # nosemgrep
+		frappe.db.commit()  # nosemgrep
 
 		cart_settings = self.get_cart_settings()
 		cart_settings.enabled = 1
@@ -50,6 +49,7 @@
 
 		frappe.db.sql("update `tabTax Rule` set use_for_shopping_cart = 1")
 
+
 def setup_e_commerce_settings(values_dict):
 	"Accepts a dict of values that updates E Commerce Settings."
 	if not values_dict:
@@ -59,4 +59,5 @@
 	doc.update(values_dict)
 	doc.save()
 
+
 test_dependencies = ["Tax Rule"]
diff --git a/erpnext/e_commerce/doctype/item_review/item_review.py b/erpnext/e_commerce/doctype/item_review/item_review.py
index 966ec35..3e540e3 100644
--- a/erpnext/e_commerce/doctype/item_review/item_review.py
+++ b/erpnext/e_commerce/doctype/item_review/item_review.py
@@ -18,6 +18,7 @@
 class UnverifiedReviewer(frappe.ValidationError):
 	pass
 
+
 class ItemReview(Document):
 	def after_insert(self):
 		# regenerate cache on review creation
@@ -54,12 +55,13 @@
 
 	return data
 
+
 def get_queried_reviews(web_item, start=0, end=10, data=None):
 	"""
-		Query Website Item wise reviews and cache if needed.
-		Cache stores only first page of reviews i.e. 10 reviews maximum.
-		Returns:
-			dict: Containing reviews, average ratings, % of reviews per rating and total reviews.
+	Query Website Item wise reviews and cache if needed.
+	Cache stores only first page of reviews i.e. 10 reviews maximum.
+	Returns:
+	        dict: Containing reviews, average ratings, % of reviews per rating and total reviews.
 	"""
 	if not data:
 		data = frappe._dict()
@@ -69,13 +71,13 @@
 		filters={"website_item": web_item},
 		fields=["*"],
 		limit_start=start,
-		limit_page_length=end
+		limit_page_length=end,
 	)
 
 	rating_data = frappe.db.get_all(
 		"Item Review",
 		filters={"website_item": web_item},
-		fields=["avg(rating) as average, count(*) as total"]
+		fields=["avg(rating) as average, count(*) as total"],
 	)[0]
 
 	data.average_rating = flt(rating_data.average, 1)
@@ -83,11 +85,9 @@
 
 	# get % of reviews per rating
 	reviews_per_rating = []
-	for i in range(1,6):
+	for i in range(1, 6):
 		count = frappe.db.get_all(
-			"Item Review",
-			filters={"website_item": web_item, "rating": i},
-			fields=["count(*) as count"]
+			"Item Review", filters={"website_item": web_item, "rating": i}, fields=["count(*) as count"]
 		)[0].count
 
 		percent = flt((count / rating_data.total or 1) * 100, 0) if count else 0
@@ -98,40 +98,45 @@
 
 	return data
 
+
 def set_reviews_in_cache(web_item, reviews_dict):
 	frappe.cache().hset("item_reviews", web_item, reviews_dict)
 
+
 @frappe.whitelist()
 def add_item_review(web_item, title, rating, comment=None):
-	""" Add an Item Review by a user if non-existent. """
+	"""Add an Item Review by a user if non-existent."""
 	if frappe.session.user == "Guest":
 		# guest user should not reach here ideally in the case they do via an API, throw error
 		frappe.throw(_("You are not verified to write a review yet."), exc=UnverifiedReviewer)
 
 	if not frappe.db.exists("Item Review", {"user": frappe.session.user, "website_item": web_item}):
-		doc = frappe.get_doc({
-			"doctype": "Item Review",
-			"user": frappe.session.user,
-			"customer": get_customer(),
-			"website_item": web_item,
-			"item": frappe.db.get_value("Website Item", web_item, "item_code"),
-			"review_title": title,
-			"rating": rating,
-			"comment": comment
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Item Review",
+				"user": frappe.session.user,
+				"customer": get_customer(),
+				"website_item": web_item,
+				"item": frappe.db.get_value("Website Item", web_item, "item_code"),
+				"review_title": title,
+				"rating": rating,
+				"comment": comment,
+			}
+		)
 		doc.published_on = datetime.today().strftime("%d %B %Y")
 		doc.insert()
 
+
 def get_customer(silent=False):
 	"""
-		silent: Return customer if exists else return nothing. Dont throw error.
+	silent: Return customer if exists else return nothing. Dont throw error.
 	"""
 	user = frappe.session.user
 	contact_name = get_contact_name(user)
 	customer = None
 
 	if contact_name:
-		contact = frappe.get_doc('Contact', contact_name)
+		contact = frappe.get_doc("Contact", contact_name)
 		for link in contact.links:
 			if link.link_doctype == "Customer":
 				customer = link.link_name
@@ -143,5 +148,6 @@
 		return None
 	else:
 		# should not reach here unless via an API
-		frappe.throw(_("You are not a verified customer yet. Please contact us to proceed."),
-			exc=UnverifiedReviewer)
+		frappe.throw(
+			_("You are not a verified customer yet. Please contact us to proceed."), exc=UnverifiedReviewer
+		)
diff --git a/erpnext/e_commerce/doctype/website_item/test_website_item.py b/erpnext/e_commerce/doctype/website_item/test_website_item.py
index b39e4df..828c655 100644
--- a/erpnext/e_commerce/doctype/website_item/test_website_item.py
+++ b/erpnext/e_commerce/doctype/website_item/test_website_item.py
@@ -19,17 +19,23 @@
 from erpnext.stock.doctype.item.test_item import make_item
 
 WEBITEM_DESK_TESTS = ("test_website_item_desk_item_sync", "test_publish_variant_and_template")
-WEBITEM_PRICE_TESTS = ('test_website_item_price_for_logged_in_user', 'test_website_item_price_for_guest_user')
+WEBITEM_PRICE_TESTS = (
+	"test_website_item_price_for_logged_in_user",
+	"test_website_item_price_for_guest_user",
+)
+
 
 class TestWebsiteItem(unittest.TestCase):
 	@classmethod
 	def setUpClass(cls):
-		setup_e_commerce_settings({
-			"company": "_Test Company",
-			"enabled": 1,
-			"default_customer_group": "_Test Customer Group",
-			"price_list": "_Test Price List India"
-		})
+		setup_e_commerce_settings(
+			{
+				"company": "_Test Company",
+				"enabled": 1,
+				"default_customer_group": "_Test Customer Group",
+				"price_list": "_Test Price List India",
+			}
+		)
 
 	@classmethod
 	def tearDownClass(cls):
@@ -37,40 +43,42 @@
 
 	def setUp(self):
 		if self._testMethodName in WEBITEM_DESK_TESTS:
-			make_item("Test Web Item", {
-				"has_variant": 1,
-				"variant_based_on": "Item Attribute",
-				"attributes": [
-					{
-						"attribute": "Test Size"
-					}
-				]
-			})
+			make_item(
+				"Test Web Item",
+				{
+					"has_variant": 1,
+					"variant_based_on": "Item Attribute",
+					"attributes": [{"attribute": "Test Size"}],
+				},
+			)
 		elif self._testMethodName in WEBITEM_PRICE_TESTS:
-			create_user_and_customer_if_not_exists("test_contact_customer@example.com", "_Test Contact For _Test Customer")
+			create_user_and_customer_if_not_exists(
+				"test_contact_customer@example.com", "_Test Contact For _Test Customer"
+			)
 			create_regular_web_item()
 			make_web_item_price(item_code="Test Mobile Phone")
 
 			# Note: When testing web item pricing rule logged-in user pricing rule must differ from guest pricing rule or test will falsely pass.
-			#	  This is because make_web_pricing_rule creates a pricing rule "selling": 1, without specifying "applicable_for". Therefor,
-			#	  when testing for logged-in user the test will get the previous pricing rule because "selling" is still true.
+			# 	  This is because make_web_pricing_rule creates a pricing rule "selling": 1, without specifying "applicable_for". Therefor,
+			# 	  when testing for logged-in user the test will get the previous pricing rule because "selling" is still true.
 			#
 			#     I've attempted to mitigate this by setting applicable_for=Customer, and customer=Guest however, this only results in PermissionError failing the test.
 			make_web_pricing_rule(
-				title="Test Pricing Rule for Test Mobile Phone",
-				item_code="Test Mobile Phone",
-				selling=1)
+				title="Test Pricing Rule for Test Mobile Phone", item_code="Test Mobile Phone", selling=1
+			)
 			make_web_pricing_rule(
 				title="Test Pricing Rule for Test Mobile Phone (Customer)",
 				item_code="Test Mobile Phone",
 				selling=1,
 				discount_percentage="25",
 				applicable_for="Customer",
-				customer="_Test Customer")
+				customer="_Test Customer",
+			)
 
 	def test_index_creation(self):
 		"Check if index is getting created in db."
 		from erpnext.e_commerce.doctype.website_item.website_item import on_doctype_update
+
 		on_doctype_update()
 
 		indices = frappe.db.sql("show index from `tabWebsite Item`", as_dict=1)
@@ -84,7 +92,7 @@
 	def test_website_item_desk_item_sync(self):
 		"Check creation/updation/deletion of Website Item and its impact on Item master."
 		web_item = None
-		item = make_item("Test Web Item") # will return item if exists
+		item = make_item("Test Web Item")  # will return item if exists
 		try:
 			web_item = make_website_item(item, save=False)
 			web_item.save()
@@ -97,7 +105,7 @@
 
 		item.reload()
 		self.assertEqual(web_item.published, 1)
-		self.assertEqual(item.published_in_website, 1) # check if item was back updated
+		self.assertEqual(item.published_in_website, 1)  # check if item was back updated
 		self.assertEqual(web_item.item_group, item.item_group)
 
 		# check if changing item data changes it in website item
@@ -170,9 +178,12 @@
 		from erpnext.setup.doctype.item_group.item_group import get_parent_item_groups
 
 		item_code = "Test Breadcrumb Item"
-		item = make_item(item_code, {
-			"item_group": "_Test Item Group B - 1",
-		})
+		item = make_item(
+			item_code,
+			{
+				"item_group": "_Test Item Group B - 1",
+			},
+		)
 
 		if not frappe.db.exists("Website Item", {"item_code": item_code}):
 			web_item = make_website_item(item, save=False)
@@ -187,7 +198,7 @@
 
 		self.assertEqual(breadcrumbs[0]["name"], "Home")
 		self.assertEqual(breadcrumbs[1]["name"], "Shop by Category")
-		self.assertEqual(breadcrumbs[2]["name"], "_Test Item Group B") # parent item group
+		self.assertEqual(breadcrumbs[2]["name"], "_Test Item Group B")  # parent item group
 		self.assertEqual(breadcrumbs[3]["name"], "_Test Item Group B - 1")
 
 		# tear down
@@ -236,10 +247,7 @@
 		item_code = "Test Mobile Phone"
 
 		# show price for guest user in e commerce settings
-		setup_e_commerce_settings({
-			"show_price": 1,
-			"hide_price_for_guest": 0
-		})
+		setup_e_commerce_settings({"show_price": 1, "hide_price_for_guest": 0})
 
 		# price and pricing rule added via setUp
 
@@ -270,11 +278,11 @@
 
 	def test_website_item_stock_when_out_of_stock(self):
 		"""
-			Check if stock details are fetched correctly for empty inventory when:
-			1) Showing stock availability enabled:
-				- Warehouse unset
-				- Warehouse set
-			2) Showing stock availability disabled
+		Check if stock details are fetched correctly for empty inventory when:
+		1) Showing stock availability enabled:
+		        - Warehouse unset
+		        - Warehouse set
+		2) Showing stock availability disabled
 		"""
 		item_code = "Test Mobile Phone"
 		create_regular_web_item()
@@ -288,7 +296,9 @@
 		self.assertFalse(bool(data.product_info["stock_qty"]))
 
 		# set warehouse
-		frappe.db.set_value("Website Item", {"item_code": item_code}, "website_warehouse", "_Test Warehouse - _TC")
+		frappe.db.set_value(
+			"Website Item", {"item_code": item_code}, "website_warehouse", "_Test Warehouse - _TC"
+		)
 
 		# check if stock details are fetched and item not in stock with warehouse set
 		data = get_product_info_for_website(item_code, skip_quotation_creation=True)
@@ -310,11 +320,11 @@
 
 	def test_website_item_stock_when_in_stock(self):
 		"""
-			Check if stock details are fetched correctly for available inventory when:
-			1) Showing stock availability enabled:
-				- Warehouse set
-				- Warehouse unset
-			2) Showing stock availability disabled
+		Check if stock details are fetched correctly for available inventory when:
+		1) Showing stock availability enabled:
+		        - Warehouse set
+		        - Warehouse unset
+		2) Showing stock availability disabled
 		"""
 		from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
 
@@ -324,10 +334,14 @@
 		frappe.local.shopping_cart_settings = None
 
 		# set warehouse
-		frappe.db.set_value("Website Item", {"item_code": item_code}, "website_warehouse", "_Test Warehouse - _TC")
+		frappe.db.set_value(
+			"Website Item", {"item_code": item_code}, "website_warehouse", "_Test Warehouse - _TC"
+		)
 
 		# stock up item
-		stock_entry = make_stock_entry(item_code=item_code, target="_Test Warehouse - _TC", qty=2, rate=100)
+		stock_entry = make_stock_entry(
+			item_code=item_code, target="_Test Warehouse - _TC", qty=2, rate=100
+		)
 
 		# check if stock details are fetched and item is in stock with warehouse set
 		data = get_product_info_for_website(item_code, skip_quotation_creation=True)
@@ -362,10 +376,7 @@
 		item_code = "Test Mobile Phone"
 		web_item = create_regular_web_item(item_code)
 
-		setup_e_commerce_settings({
-			"enable_recommendations": 1,
-			"show_price": 1
-		})
+		setup_e_commerce_settings({"enable_recommendations": 1, "show_price": 1})
 
 		# create recommended web item and price for it
 		recommended_web_item = create_regular_web_item("Test Mobile Phone 1")
@@ -383,7 +394,7 @@
 		self.assertEqual(len(recommended_items), 1)
 		recomm_item = recommended_items[0]
 		self.assertEqual(recomm_item.get("website_item_name"), "Test Mobile Phone 1")
-		self.assertTrue(bool(recomm_item.get("price_info"))) # price fetched
+		self.assertTrue(bool(recomm_item.get("price_info")))  # price fetched
 
 		price_info = recomm_item.get("price_info")
 		self.assertEqual(price_info.get("price_list_rate"), 1000)
@@ -397,7 +408,7 @@
 		recommended_items = web_item.get_recommended_items(e_commerce_settings)
 
 		self.assertEqual(len(recommended_items), 1)
-		self.assertFalse(bool(recommended_items[0].get("price_info"))) # price not fetched
+		self.assertFalse(bool(recommended_items[0].get("price_info")))  # price not fetched
 
 		# tear down
 		web_item.delete()
@@ -410,11 +421,9 @@
 		web_item = create_regular_web_item(item_code)
 
 		# price visible to guests
-		setup_e_commerce_settings({
-			"enable_recommendations": 1,
-			"show_price": 1,
-			"hide_price_for_guest": 0
-		})
+		setup_e_commerce_settings(
+			{"enable_recommendations": 1, "show_price": 1, "hide_price_for_guest": 0}
+		)
 
 		# create recommended web item and price for it
 		recommended_web_item = create_regular_web_item("Test Mobile Phone 1")
@@ -432,7 +441,7 @@
 
 		# test results if show price is enabled
 		self.assertEqual(len(recommended_items), 1)
-		self.assertTrue(bool(recommended_items[0].get("price_info"))) # price fetched
+		self.assertTrue(bool(recommended_items[0].get("price_info")))  # price fetched
 
 		# price hidden from guests
 		frappe.set_user("Administrator")
@@ -445,7 +454,7 @@
 
 		# test results if show price is enabled
 		self.assertEqual(len(recommended_items), 1)
-		self.assertFalse(bool(recommended_items[0].get("price_info"))) # price fetched
+		self.assertFalse(bool(recommended_items[0].get("price_info")))  # price fetched
 
 		# tear down
 		frappe.set_user("Administrator")
@@ -453,6 +462,7 @@
 		recommended_web_item.delete()
 		frappe.get_cached_doc("Item", "Test Mobile Phone 1").delete()
 
+
 def create_regular_web_item(item_code=None, item_args=None, web_args=None):
 	"Create Regular Item and Website Item."
 	item_code = item_code or "Test Mobile Phone"
@@ -468,47 +478,51 @@
 
 	return web_item
 
+
 def make_web_item_price(**kwargs):
 	item_code = kwargs.get("item_code")
 	if not item_code:
 		return
 
 	if not frappe.db.exists("Item Price", {"item_code": item_code}):
-		item_price = frappe.get_doc({
-			"doctype": "Item Price",
-			"item_code": item_code,
-			"price_list": kwargs.get("price_list") or "_Test Price List India",
-			"price_list_rate": kwargs.get("price_list_rate") or 1000
-		})
+		item_price = frappe.get_doc(
+			{
+				"doctype": "Item Price",
+				"item_code": item_code,
+				"price_list": kwargs.get("price_list") or "_Test Price List India",
+				"price_list_rate": kwargs.get("price_list_rate") or 1000,
+			}
+		)
 		item_price.insert()
 	else:
 		item_price = frappe.get_cached_doc("Item Price", {"item_code": item_code})
 
 	return item_price
 
+
 def make_web_pricing_rule(**kwargs):
 	title = kwargs.get("title")
 	if not title:
 		return
 
 	if not frappe.db.exists("Pricing Rule", title):
-		pricing_rule = frappe.get_doc({
-			"doctype": "Pricing Rule",
-			"title": title,
-			"apply_on": kwargs.get("apply_on") or "Item Code",
-			"items": [{
-				"item_code": kwargs.get("item_code")
-			}],
-			"selling": kwargs.get("selling") or 0,
-			"buying": kwargs.get("buying") or 0,
-			"rate_or_discount": kwargs.get("rate_or_discount") or "Discount Percentage",
-			"discount_percentage": kwargs.get("discount_percentage") or 10,
-			"company": kwargs.get("company") or "_Test Company",
-			"currency": kwargs.get("currency") or "INR",
-			"for_price_list": kwargs.get("price_list") or "_Test Price List India",
-			"applicable_for": kwargs.get("applicable_for") or "",
-			"customer": kwargs.get("customer") or "",
-		})
+		pricing_rule = frappe.get_doc(
+			{
+				"doctype": "Pricing Rule",
+				"title": title,
+				"apply_on": kwargs.get("apply_on") or "Item Code",
+				"items": [{"item_code": kwargs.get("item_code")}],
+				"selling": kwargs.get("selling") or 0,
+				"buying": kwargs.get("buying") or 0,
+				"rate_or_discount": kwargs.get("rate_or_discount") or "Discount Percentage",
+				"discount_percentage": kwargs.get("discount_percentage") or 10,
+				"company": kwargs.get("company") or "_Test Company",
+				"currency": kwargs.get("currency") or "INR",
+				"for_price_list": kwargs.get("price_list") or "_Test Price List India",
+				"applicable_for": kwargs.get("applicable_for") or "",
+				"customer": kwargs.get("customer") or "",
+			}
+		)
 		pricing_rule.insert()
 	else:
 		pricing_rule = frappe.get_doc("Pricing Rule", {"title": title})
@@ -516,23 +530,26 @@
 	return pricing_rule
 
 
-def create_user_and_customer_if_not_exists(email, first_name = None):
+def create_user_and_customer_if_not_exists(email, first_name=None):
 	if frappe.db.exists("User", email):
 		return
 
-	frappe.get_doc({
-		"doctype": "User",
-		"user_type": "Website User",
-		"email": email,
-		"send_welcome_email": 0,
-		"first_name": first_name or email.split("@")[0]
-	}).insert(ignore_permissions=True)
+	frappe.get_doc(
+		{
+			"doctype": "User",
+			"user_type": "Website User",
+			"email": email,
+			"send_welcome_email": 0,
+			"first_name": first_name or email.split("@")[0],
+		}
+	).insert(ignore_permissions=True)
 
 	contact = frappe.get_last_doc("Contact", filters={"email_id": email})
-	link = contact.append('links', {})
+	link = contact.append("links", {})
 	link.link_doctype = "Customer"
 	link.link_name = "_Test Customer"
 	link.link_title = "_Test Customer"
 	contact.save()
 
+
 test_dependencies = ["Price List", "Item Price", "Customer", "Contact", "Item"]
diff --git a/erpnext/e_commerce/doctype/website_item/website_item.py b/erpnext/e_commerce/doctype/website_item/website_item.py
index 62f7f49..02ec3bf 100644
--- a/erpnext/e_commerce/doctype/website_item/website_item.py
+++ b/erpnext/e_commerce/doctype/website_item/website_item.py
@@ -29,7 +29,7 @@
 		page_title_field="web_item_name",
 		condition_field="published",
 		template="templates/generators/item/item.html",
-		no_cache=1
+		no_cache=1,
 	)
 
 	def autoname(self):
@@ -88,14 +88,17 @@
 
 	def publish_unpublish_desk_item(self, publish=True):
 		if frappe.db.get_value("Item", self.item_code, "published_in_website") and publish:
-			return # if already published don't publish again
+			return  # if already published don't publish again
 		frappe.db.set_value("Item", self.item_code, "published_in_website", publish)
 
 	def make_route(self):
 		"""Called from set_route in WebsiteGenerator."""
 		if not self.route:
-			return cstr(frappe.db.get_value('Item Group', self.item_group,
-					'route')) + '/' + self.scrub((self.item_name if self.item_name else self.item_code) + '-' + random_string(5))
+			return (
+				cstr(frappe.db.get_value("Item Group", self.item_group, "route"))
+				+ "/"
+				+ self.scrub((self.item_name if self.item_name else self.item_code) + "-" + random_string(5))
+			)
 
 	def update_template_item(self):
 		"""Publish Template Item if Variant is published."""
@@ -124,12 +127,10 @@
 		# find if website image url exists as public
 		file_doc = frappe.get_all(
 			"File",
-			filters={
-				"file_url": self.website_image
-			},
+			filters={"file_url": self.website_image},
 			fields=["name", "is_private"],
 			order_by="is_private asc",
-			limit_page_length=1
+			limit_page_length=1,
 		)
 
 		if file_doc:
@@ -137,7 +138,11 @@
 
 		if not file_doc:
 			if not auto_set_website_image:
-				frappe.msgprint(_("Website Image {0} attached to Item {1} cannot be found").format(self.website_image, self.name))
+				frappe.msgprint(
+					_("Website Image {0} attached to Item {1} cannot be found").format(
+						self.website_image, self.name
+					)
+				)
 
 			self.website_image = None
 
@@ -154,18 +159,23 @@
 
 		import requests.exceptions
 
-		if not self.is_new() and self.website_image != frappe.db.get_value(self.doctype, self.name, "website_image"):
+		if not self.is_new() and self.website_image != frappe.db.get_value(
+			self.doctype, self.name, "website_image"
+		):
 			self.thumbnail = None
 
 		if self.website_image and not self.thumbnail:
 			file_doc = None
 
 			try:
-				file_doc = frappe.get_doc("File", {
-					"file_url": self.website_image,
-					"attached_to_doctype": "Website Item",
-					"attached_to_name": self.name
-				})
+				file_doc = frappe.get_doc(
+					"File",
+					{
+						"file_url": self.website_image,
+						"attached_to_doctype": "Website Item",
+						"attached_to_name": self.name,
+					},
+				)
 			except frappe.DoesNotExistError:
 				pass
 				# cleanup
@@ -177,18 +187,21 @@
 
 			except requests.exceptions.SSLError:
 				frappe.msgprint(
-					_("Warning: Invalid SSL certificate on attachment {0}").format(self.website_image))
+					_("Warning: Invalid SSL certificate on attachment {0}").format(self.website_image)
+				)
 				self.website_image = None
 
 			# for CSV import
 			if self.website_image and not file_doc:
 				try:
-					file_doc = frappe.get_doc({
-						"doctype": "File",
-						"file_url": self.website_image,
-						"attached_to_doctype": "Website Item",
-						"attached_to_name": self.name
-					}).save()
+					file_doc = frappe.get_doc(
+						{
+							"doctype": "File",
+							"file_url": self.website_image,
+							"attached_to_doctype": "Website Item",
+							"attached_to_name": self.name,
+						}
+					).save()
 
 				except IOError:
 					self.website_image = None
@@ -204,11 +217,11 @@
 		context.search_link = "/search"
 		context.body_class = "product-page"
 
-		context.parents = get_parent_item_groups(self.item_group, from_item=True) # breadcumbs
+		context.parents = get_parent_item_groups(self.item_group, from_item=True)  # breadcumbs
 		self.attributes = frappe.get_all(
 			"Item Variant Attribute",
 			fields=["attribute", "attribute_value"],
-			filters={"parent": self.item_code}
+			filters={"parent": self.item_code},
 		)
 
 		if self.slideshow:
@@ -227,7 +240,9 @@
 			context.reviews = context.reviews[:4]
 
 		context.wished = False
-		if frappe.db.exists("Wishlist Item", {"item_code": self.item_code, "parent": frappe.session.user}):
+		if frappe.db.exists(
+			"Wishlist Item", {"item_code": self.item_code, "parent": frappe.session.user}
+		):
 			context.wished = True
 
 		context.user_is_customer = check_if_user_is_customer()
@@ -243,11 +258,12 @@
 			variant.attributes = frappe.get_all(
 				"Item Variant Attribute",
 				filters={"parent": variant.name},
-				fields=["attribute", "attribute_value as value"])
+				fields=["attribute", "attribute_value as value"],
+			)
 
 			# make an attribute-value map for easier access in templates
 			variant.attribute_map = frappe._dict(
-				{attr.attribute : attr.value for attr in variant.attributes}
+				{attr.attribute: attr.value for attr in variant.attributes}
 			)
 
 			for attr in variant.attributes:
@@ -267,9 +283,12 @@
 					values.append(val)
 			else:
 				# get list of values defined (for sequence)
-				for attr_value in frappe.db.get_all("Item Attribute Value",
+				for attr_value in frappe.db.get_all(
+					"Item Attribute Value",
 					fields=["attribute_value"],
-					filters={"parent": attr.attribute}, order_by="idx asc"):
+					filters={"parent": attr.attribute},
+					order_by="idx asc",
+				):
 
 					if attr_value.attribute_value in attribute_values_available.get(attr.attribute, []):
 						values.append(attr_value.attribute_value)
@@ -279,10 +298,10 @@
 
 		safe_description = frappe.utils.to_markdown(self.description)
 
-		context.metatags.url = frappe.utils.get_url() + '/' + context.route
+		context.metatags.url = frappe.utils.get_url() + "/" + context.route
 
 		if context.website_image:
-			if context.website_image.startswith('http'):
+			if context.website_image.startswith("http"):
 				url = context.website_image
 			else:
 				url = frappe.utils.get_url() + context.website_image
@@ -292,24 +311,28 @@
 
 		context.metatags.title = self.web_item_name or self.item_name or self.item_code
 
-		context.metatags['og:type'] = 'product'
-		context.metatags['og:site_name'] = 'ERPNext'
+		context.metatags["og:type"] = "product"
+		context.metatags["og:site_name"] = "ERPNext"
 
 	def set_shopping_cart_data(self, context):
 		from erpnext.e_commerce.shopping_cart.product_info import get_product_info_for_website
-		context.shopping_cart = get_product_info_for_website(self.item_code, skip_quotation_creation=True)
+
+		context.shopping_cart = get_product_info_for_website(
+			self.item_code, skip_quotation_creation=True
+		)
 
 	def copy_specification_from_item_group(self):
 		self.set("website_specifications", [])
 		if self.item_group:
-			for label, desc in frappe.db.get_values("Item Website Specification",
-				{"parent": self.item_group}, ["label", "description"]):
+			for label, desc in frappe.db.get_values(
+				"Item Website Specification", {"parent": self.item_group}, ["label", "description"]
+			):
 				row = self.append("website_specifications")
 				row.label = label
 				row.description = desc
 
 	def get_product_details_section(self, context):
-		""" Get section with tabs or website specifications. """
+		"""Get section with tabs or website specifications."""
 		context.show_tabs = self.show_tabbed_section
 		if self.show_tabbed_section and (self.tabs or self.website_specifications):
 			context.tabs = self.get_tabs()
@@ -321,10 +344,8 @@
 		tab_values["tab_1_title"] = "Product Details"
 		tab_values["tab_1_content"] = frappe.render_template(
 			"templates/generators/item/item_specifications.html",
-			{
-				"website_specifications": self.website_specifications,
-				"show_tabs": self.show_tabbed_section
-			})
+			{"website_specifications": self.website_specifications, "show_tabs": self.show_tabbed_section},
+		)
 
 		for row in self.tabs:
 			tab_values[f"tab_{row.idx + 1}_title"] = _(row.label)
@@ -338,15 +359,11 @@
 
 		query = (
 			frappe.qb.from_(ri)
-			.join(wi).on(ri.item_code == wi.item_code)
-			.select(
-				ri.item_code, ri.route,
-				ri.website_item_name,
-				ri.website_item_thumbnail
-			).where(
-				(ri.parent == self.name)
-				& (wi.published == 1)
-			).orderby(ri.idx)
+			.join(wi)
+			.on(ri.item_code == wi.item_code)
+			.select(ri.item_code, ri.route, ri.website_item_name, ri.website_item_thumbnail)
+			.where((ri.parent == self.name) & (wi.published == 1))
+			.orderby(ri.idx)
 		)
 		items = query.run(as_dict=True)
 
@@ -360,22 +377,24 @@
 			selling_price_list = _set_price_list(settings, None)
 			for item in items:
 				item.price_info = get_price(
-					item.item_code,
-					selling_price_list,
-					settings.default_customer_group,
-					settings.company
+					item.item_code, selling_price_list, settings.default_customer_group, settings.company
 				)
 
 		return items
 
+
 def invalidate_cache_for_web_item(doc):
 	"""Invalidate Website Item Group cache and rebuild ItemVariantsCacheManager."""
 	from erpnext.stock.doctype.item.item import invalidate_item_variants_cache_for_website
 
 	invalidate_cache_for(doc, doc.item_group)
 
-	website_item_groups = list(set((doc.get("old_website_item_groups") or [])
-		+ [d.item_group for d in doc.get({"doctype": "Website Item Group"}) if d.item_group]))
+	website_item_groups = list(
+		set(
+			(doc.get("old_website_item_groups") or [])
+			+ [d.item_group for d in doc.get({"doctype": "Website Item Group"}) if d.item_group]
+		)
+	)
 
 	for item_group in website_item_groups:
 		invalidate_cache_for(doc, item_group)
@@ -385,6 +404,7 @@
 
 	invalidate_item_variants_cache_for_website(doc)
 
+
 def on_doctype_update():
 	# since route is a Text column, it needs a length for indexing
 	frappe.db.add_index("Website Item", ["route(500)"])
@@ -392,6 +412,7 @@
 	frappe.db.add_index("Website Item", ["item_group"])
 	frappe.db.add_index("Website Item", ["brand"])
 
+
 def check_if_user_is_customer(user=None):
 	from frappe.contacts.doctype.contact.contact import get_contact_name
 
@@ -402,7 +423,7 @@
 	customer = None
 
 	if contact_name:
-		contact = frappe.get_doc('Contact', contact_name)
+		contact = frappe.get_doc("Contact", contact_name)
 		for link in contact.links:
 			if link.link_doctype == "Customer":
 				customer = link.link_name
@@ -410,6 +431,7 @@
 
 	return True if customer else False
 
+
 @frappe.whitelist()
 def make_website_item(doc, save=True):
 	if not doc:
@@ -425,8 +447,17 @@
 	website_item = frappe.new_doc("Website Item")
 	website_item.web_item_name = doc.get("item_name")
 
-	fields_to_map = ["item_code", "item_name", "item_group", "stock_uom", "brand", "image",
-		"has_variants", "variant_of", "description"]
+	fields_to_map = [
+		"item_code",
+		"item_name",
+		"item_group",
+		"stock_uom",
+		"brand",
+		"image",
+		"has_variants",
+		"variant_of",
+		"description",
+	]
 	for field in fields_to_map:
 		website_item.update({field: doc.get(field)})
 
@@ -438,4 +469,4 @@
 	# Add to search cache
 	insert_item_to_index(website_item)
 
-	return [website_item.name, website_item.web_item_name]
\ No newline at end of file
+	return [website_item.name, website_item.web_item_name]
diff --git a/erpnext/e_commerce/doctype/website_offer/website_offer.py b/erpnext/e_commerce/doctype/website_offer/website_offer.py
index d73c132..8c92f75 100644
--- a/erpnext/e_commerce/doctype/website_offer/website_offer.py
+++ b/erpnext/e_commerce/doctype/website_offer/website_offer.py
@@ -9,6 +9,7 @@
 class WebsiteOffer(Document):
 	pass
 
+
 @frappe.whitelist(allow_guest=True)
 def get_offer_details(offer_id):
-	return frappe.db.get_value('Website Offer', {'name': offer_id}, ['offer_details'])
+	return frappe.db.get_value("Website Offer", {"name": offer_id}, ["offer_details"])
diff --git a/erpnext/e_commerce/doctype/wishlist/test_wishlist.py b/erpnext/e_commerce/doctype/wishlist/test_wishlist.py
index 504bb65..9d27126 100644
--- a/erpnext/e_commerce/doctype/wishlist/test_wishlist.py
+++ b/erpnext/e_commerce/doctype/wishlist/test_wishlist.py
@@ -34,14 +34,16 @@
 
 		# check if wishlist was created and item was added
 		self.assertTrue(frappe.db.exists("Wishlist", {"user": frappe.session.user}))
-		self.assertTrue(frappe.db.exists("Wishlist Item", {"item_code": "Test Phone Series X", "parent": frappe.session.user}))
+		self.assertTrue(
+			frappe.db.exists(
+				"Wishlist Item", {"item_code": "Test Phone Series X", "parent": frappe.session.user}
+			)
+		)
 
 		# add second item to wishlist
 		add_to_wishlist("Test Phone Series Y")
 		wishlist_length = frappe.db.get_value(
-			"Wishlist Item",
-			{"parent": frappe.session.user},
-			"count(*)"
+			"Wishlist Item", {"parent": frappe.session.user}, "count(*)"
 		)
 		self.assertEqual(wishlist_length, 2)
 
@@ -49,9 +51,7 @@
 		remove_from_wishlist("Test Phone Series Y")
 
 		wishlist_length = frappe.db.get_value(
-			"Wishlist Item",
-			{"parent": frappe.session.user},
-			"count(*)"
+			"Wishlist Item", {"parent": frappe.session.user}, "count(*)"
 		)
 		self.assertIsNone(frappe.db.exists("Wishlist Item", {"parent": frappe.session.user}))
 		self.assertEqual(wishlist_length, 0)
@@ -74,29 +74,44 @@
 
 		# check wishlist and its content for users
 		self.assertTrue(frappe.db.exists("Wishlist", {"user": test_user.name}))
-		self.assertTrue(frappe.db.exists("Wishlist Item",
-			{"item_code": "Test Phone Series X", "parent": test_user.name}))
+		self.assertTrue(
+			frappe.db.exists(
+				"Wishlist Item", {"item_code": "Test Phone Series X", "parent": test_user.name}
+			)
+		)
 
 		self.assertTrue(frappe.db.exists("Wishlist", {"user": test_user_1.name}))
-		self.assertTrue(frappe.db.exists("Wishlist Item",
-			{"item_code": "Test Phone Series X", "parent": test_user_1.name}))
+		self.assertTrue(
+			frappe.db.exists(
+				"Wishlist Item", {"item_code": "Test Phone Series X", "parent": test_user_1.name}
+			)
+		)
 
 		# remove item for second user
 		remove_from_wishlist("Test Phone Series X")
 
 		# make sure item was removed for second user and not first
-		self.assertFalse(frappe.db.exists("Wishlist Item",
-			{"item_code": "Test Phone Series X", "parent": test_user_1.name}))
-		self.assertTrue(frappe.db.exists("Wishlist Item",
-			{"item_code": "Test Phone Series X", "parent": test_user.name}))
+		self.assertFalse(
+			frappe.db.exists(
+				"Wishlist Item", {"item_code": "Test Phone Series X", "parent": test_user_1.name}
+			)
+		)
+		self.assertTrue(
+			frappe.db.exists(
+				"Wishlist Item", {"item_code": "Test Phone Series X", "parent": test_user.name}
+			)
+		)
 
 		# remove item for first user
 		frappe.set_user(test_user.name)
 		remove_from_wishlist("Test Phone Series X")
-		self.assertFalse(frappe.db.exists("Wishlist Item",
-			{"item_code": "Test Phone Series X", "parent": test_user.name}))
+		self.assertFalse(
+			frappe.db.exists(
+				"Wishlist Item", {"item_code": "Test Phone Series X", "parent": test_user.name}
+			)
+		)
 
 		# tear down
 		frappe.set_user("Administrator")
 		frappe.get_doc("Wishlist", {"user": test_user.name}).delete()
-		frappe.get_doc("Wishlist", {"user": test_user_1.name}).delete()
\ No newline at end of file
+		frappe.get_doc("Wishlist", {"user": test_user_1.name}).delete()
diff --git a/erpnext/e_commerce/doctype/wishlist/wishlist.py b/erpnext/e_commerce/doctype/wishlist/wishlist.py
index 50e3d3a..5d6ab41 100644
--- a/erpnext/e_commerce/doctype/wishlist/wishlist.py
+++ b/erpnext/e_commerce/doctype/wishlist/wishlist.py
@@ -9,6 +9,7 @@
 class Wishlist(Document):
 	pass
 
+
 @frappe.whitelist()
 def add_to_wishlist(item_code):
 	"""Insert Item into wishlist."""
@@ -20,7 +21,8 @@
 		"Website Item",
 		{"item_code": item_code},
 		["image", "website_warehouse", "name", "web_item_name", "item_name", "item_group", "route"],
-		as_dict=1)
+		as_dict=1,
+	)
 
 	wished_item_dict = {
 		"item_code": item_code,
@@ -30,7 +32,7 @@
 		"web_item_name": web_item_data.get("web_item_name"),
 		"image": web_item_data.get("image"),
 		"warehouse": web_item_data.get("website_warehouse"),
-		"route": web_item_data.get("route")
+		"route": web_item_data.get("route"),
 	}
 
 	if not frappe.db.exists("Wishlist", frappe.session.user):
@@ -41,28 +43,20 @@
 		wishlist.save(ignore_permissions=True)
 	else:
 		wishlist = frappe.get_doc("Wishlist", frappe.session.user)
-		item = wishlist.append('items', wished_item_dict)
+		item = wishlist.append("items", wished_item_dict)
 		item.db_insert()
 
 	if hasattr(frappe.local, "cookie_manager"):
 		frappe.local.cookie_manager.set_cookie("wish_count", str(len(wishlist.items)))
 
+
 @frappe.whitelist()
 def remove_from_wishlist(item_code):
 	if frappe.db.exists("Wishlist Item", {"item_code": item_code, "parent": frappe.session.user}):
-		frappe.db.delete(
-			"Wishlist Item",
-			{
-				"item_code": item_code,
-				"parent": frappe.session.user
-			}
-		)
-		frappe.db.commit() # nosemgrep
+		frappe.db.delete("Wishlist Item", {"item_code": item_code, "parent": frappe.session.user})
+		frappe.db.commit()  # nosemgrep
 
-		wishlist_items = frappe.db.get_values(
-			"Wishlist Item",
-			filters={"parent": frappe.session.user}
-		)
+		wishlist_items = frappe.db.get_values("Wishlist Item", filters={"parent": frappe.session.user})
 
 		if hasattr(frappe.local, "cookie_manager"):
-			frappe.local.cookie_manager.set_cookie("wish_count", str(len(wishlist_items)))
\ No newline at end of file
+			frappe.local.cookie_manager.set_cookie("wish_count", str(len(wishlist_items)))
diff --git a/erpnext/e_commerce/legacy_search.py b/erpnext/e_commerce/legacy_search.py
index 752c33e..ef8e86d 100644
--- a/erpnext/e_commerce/legacy_search.py
+++ b/erpnext/e_commerce/legacy_search.py
@@ -9,8 +9,9 @@
 # TODO: Make obsolete
 INDEX_NAME = "products"
 
+
 class ProductSearch(FullTextSearch):
-	""" Wrapper for WebsiteSearch """
+	"""Wrapper for WebsiteSearch"""
 
 	def get_schema(self):
 		return Schema(
@@ -29,7 +30,7 @@
 		in www/ and routes from published documents
 
 		Returns:
-			self (object): FullTextSearch Instance
+		        self (object): FullTextSearch Instance
 		"""
 		items = get_all_published_items()
 		documents = [self.get_document_to_index(item) for item in items]
@@ -69,12 +70,12 @@
 		"""Search from the current index
 
 		Args:
-			text (str): String to search for
-			scope (str, optional): Scope to limit the search. Defaults to None.
-			limit (int, optional): Limit number of search results. Defaults to 20.
+		        text (str): String to search for
+		        scope (str, optional): Scope to limit the search. Defaults to None.
+		        limit (int, optional): Limit number of search results. Defaults to 20.
 
 		Returns:
-			[List(_dict)]: Search results
+		        [List(_dict)]: Search results
 		"""
 		ix = self.get_index()
 
@@ -111,17 +112,23 @@
 			keyword_highlights=keyword_highlights,
 		)
 
+
 def get_all_published_items():
-	return frappe.get_all("Website Item", filters={"variant_of": "", "published": 1}, pluck="item_code")
+	return frappe.get_all(
+		"Website Item", filters={"variant_of": "", "published": 1}, pluck="item_code"
+	)
+
 
 def update_index_for_path(path):
 	search = ProductSearch(INDEX_NAME)
 	return search.update_index_by_name(path)
 
+
 def remove_document_from_index(path):
 	search = ProductSearch(INDEX_NAME)
 	return search.remove_document_from_index(path)
 
+
 def build_index_for_all_routes():
 	search = ProductSearch(INDEX_NAME)
 	return search.build()
diff --git a/erpnext/e_commerce/product_data_engine/filters.py b/erpnext/e_commerce/product_data_engine/filters.py
index 89d4ffd..feb89c1 100644
--- a/erpnext/e_commerce/product_data_engine/filters.py
+++ b/erpnext/e_commerce/product_data_engine/filters.py
@@ -20,10 +20,10 @@
 			return
 
 		fields, filter_data = [], []
-		filter_fields = [row.fieldname for row in self.doc.filter_fields] # fields in settings
+		filter_fields = [row.fieldname for row in self.doc.filter_fields]  # fields in settings
 
 		# filter valid field filters i.e. those that exist in Item
-		item_meta = frappe.get_meta('Item', cached=True)
+		item_meta = frappe.get_meta("Item", cached=True)
 		fields = [item_meta.get_field(field) for field in filter_fields if item_meta.has_field(field)]
 
 		for df in fields:
@@ -36,15 +36,19 @@
 					if include_child:
 						include_groups = get_child_groups_for_website(self.item_group, include_self=True)
 						include_groups = [x.name for x in include_groups]
-						item_or_filters.extend([
-							["item_group", "in", include_groups],
-							["Website Item Group", "item_group", "=", self.item_group] # consider website item groups
-						])
+						item_or_filters.extend(
+							[
+								["item_group", "in", include_groups],
+								["Website Item Group", "item_group", "=", self.item_group],  # consider website item groups
+							]
+						)
 					else:
-						item_or_filters.extend([
-							["item_group", "=", self.item_group],
-							["Website Item Group", "item_group", "=", self.item_group] # consider website item groups
-						])
+						item_or_filters.extend(
+							[
+								["item_group", "=", self.item_group],
+								["Website Item Group", "item_group", "=", self.item_group],  # consider website item groups
+							]
+						)
 
 				# Get link field values attached to published items
 				item_values = frappe.get_all(
@@ -53,10 +57,10 @@
 					filters=item_filters,
 					or_filters=item_or_filters,
 					distinct="True",
-					pluck=df.fieldname
+					pluck=df.fieldname,
 				)
 
-				values = list(set(item_values) & link_doctype_values) # intersection of both
+				values = list(set(item_values) & link_doctype_values)  # intersection of both
 			else:
 				# table multiselect
 				values = list(link_doctype_values)
@@ -72,10 +76,10 @@
 
 	def get_filtered_link_doctype_records(self, field):
 		"""
-			Get valid link doctype records depending on filters.
-			Apply enable/disable/show_in_website filter.
-			Returns:
-				set: A set containing valid record names
+		Get valid link doctype records depending on filters.
+		Apply enable/disable/show_in_website filter.
+		Returns:
+		        set: A set containing valid record names
 		"""
 		link_doctype = field.get_link_doctype()
 		meta = frappe.get_meta(link_doctype, cached=True) if link_doctype else None
@@ -91,12 +95,12 @@
 		if not meta:
 			return filters
 
-		if meta.has_field('enabled'):
-			filters['enabled'] = 1
-		if meta.has_field('disabled'):
-			filters['disabled'] = 0
-		if meta.has_field('show_in_website'):
-			filters['show_in_website'] = 1
+		if meta.has_field("enabled"):
+			filters["enabled"] = 1
+		if meta.has_field("disabled"):
+			filters["disabled"] = 0
+		if meta.has_field("show_in_website"):
+			filters["show_in_website"] = 1
 
 		return filters
 
@@ -111,12 +115,9 @@
 
 		result = frappe.get_all(
 			"Item Variant Attribute",
-			filters={
-				"attribute": ["in", attributes],
-				"attribute_value": ["is", "set"]
-			},
+			filters={"attribute": ["in", attributes], "attribute_value": ["is", "set"]},
 			fields=["attribute", "attribute_value"],
-			distinct=True
+			distinct=True,
 		)
 
 		attribute_value_map = {}
@@ -136,11 +137,13 @@
 		# [25, 60] rounded min max
 		min_range_absolute, max_range_absolute = floor(min_discount), floor(max_discount)
 
-		min_range = int(min_discount - (min_range_absolute % 10)) # 20
-		max_range = int(max_discount - (max_range_absolute % 10)) # 60
+		min_range = int(min_discount - (min_range_absolute % 10))  # 20
+		max_range = int(max_discount - (max_range_absolute % 10))  # 60
 
-		min_range = (min_range + 10) if min_range != min_range_absolute else min_range # 30 (upper limit of 25.89 in range of 10)
-		max_range = (max_range + 10) if max_range != max_range_absolute else max_range # 60
+		min_range = (
+			(min_range + 10) if min_range != min_range_absolute else min_range
+		)  # 30 (upper limit of 25.89 in range of 10)
+		max_range = (max_range + 10) if max_range != max_range_absolute else max_range  # 60
 
 		for discount in range(min_range, (max_range + 1), 10):
 			label = f"{discount}% and below"
diff --git a/erpnext/e_commerce/product_data_engine/query.py b/erpnext/e_commerce/product_data_engine/query.py
index 5c92e3d..5a75382 100644
--- a/erpnext/e_commerce/product_data_engine/query.py
+++ b/erpnext/e_commerce/product_data_engine/query.py
@@ -13,12 +13,13 @@
 	"""Query engine for product listing
 
 	Attributes:
-		fields (list): Fields to fetch in query
-		conditions (string): Conditions for query building
-		or_conditions (string): Search conditions
-		page_length (Int): Length of page for the query
-		settings (Document): E Commerce Settings DocType
+	        fields (list): Fields to fetch in query
+	        conditions (string): Conditions for query building
+	        or_conditions (string): Search conditions
+	        page_length (Int): Length of page for the query
+	        settings (Document): E Commerce Settings DocType
 	"""
+
 	def __init__(self):
 		self.settings = frappe.get_doc("E Commerce Settings")
 		self.page_length = self.settings.products_per_page or 20
@@ -26,21 +27,33 @@
 		self.or_filters = []
 		self.filters = [["published", "=", 1]]
 		self.fields = [
-			"web_item_name", "name", "item_name", "item_code", "website_image",
-			"variant_of", "has_variants", "item_group", "image", "web_long_description",
-			"short_description", "route", "website_warehouse", "ranking", "on_backorder"
+			"web_item_name",
+			"name",
+			"item_name",
+			"item_code",
+			"website_image",
+			"variant_of",
+			"has_variants",
+			"item_group",
+			"image",
+			"web_long_description",
+			"short_description",
+			"route",
+			"website_warehouse",
+			"ranking",
+			"on_backorder",
 		]
 
 	def query(self, attributes=None, fields=None, search_term=None, start=0, item_group=None):
 		"""
 		Args:
-			attributes (dict, optional): Item Attribute filters
-			fields (dict, optional): Field level filters
-			search_term (str, optional): Search term to lookup
-			start (int, optional): Page start
+		        attributes (dict, optional): Item Attribute filters
+		        fields (dict, optional): Field level filters
+		        search_term (str, optional): Search term to lookup
+		        start (int, optional): Page start
 
 		Returns:
-			dict: Dict containing items, item count & discount range
+		        dict: Dict containing items, item count & discount range
 		"""
 		# track if discounts included in field filters
 		self.filter_with_discount = bool(fields.get("discount"))
@@ -75,11 +88,7 @@
 
 		result = self.filter_results_by_discount(fields, result)
 
-		return {
-			"items": result,
-			"items_count": count,
-			"discounts": discounts
-		}
+		return {"items": result, "items_count": count, "discounts": discounts}
 
 	def query_items(self, start=0):
 		"""Build a query to fetch Website Items based on field filters."""
@@ -91,8 +100,9 @@
 			filters=self.filters,
 			or_filters=self.or_filters,
 			limit_page_length=184467440737095516,
-			limit_start=start, # get all items from this offset for total count ahead
-			order_by="ranking desc")
+			limit_start=start,  # get all items from this offset for total count ahead
+			order_by="ranking desc",
+		)
 		count = len(count_items)
 
 		# If discounts included, return all rows.
@@ -108,7 +118,8 @@
 			or_filters=self.or_filters,
 			limit_page_length=page_length,
 			limit_start=start,
-			order_by="ranking desc")
+			order_by="ranking desc",
+		)
 
 		return items, count
 
@@ -127,8 +138,9 @@
 				filters=[
 					["published_in_website", "=", 1],
 					["Item Variant Attribute", "attribute", "=", attribute],
-					["Item Variant Attribute", "attribute_value", "in", values]
-				])
+					["Item Variant Attribute", "attribute_value", "in", values],
+				],
+			)
 			item_codes.append({x.item_code for x in item_code_list})
 
 		if item_codes:
@@ -143,21 +155,21 @@
 		"""Build filters for field values
 
 		Args:
-			filters (dict): Filters
+		        filters (dict): Filters
 		"""
 		for field, values in filters.items():
 			if not values or field == "discount":
 				continue
 
 			# handle multiselect fields in filter addition
-			meta = frappe.get_meta('Website Item', cached=True)
+			meta = frappe.get_meta("Website Item", cached=True)
 			df = meta.get_field(field)
-			if df.fieldtype == 'Table MultiSelect':
+			if df.fieldtype == "Table MultiSelect":
 				child_doctype = df.options
 				child_meta = frappe.get_meta(child_doctype, cached=True)
 				fields = child_meta.get("fields")
 				if fields:
-					self.filters.append([child_doctype, fields[0].fieldname, 'IN', values])
+					self.filters.append([child_doctype, fields[0].fieldname, "IN", values])
 			elif isinstance(values, list):
 				# If value is a list use `IN` query
 				self.filters.append([field, "in", values])
@@ -168,6 +180,7 @@
 	def build_item_group_filters(self, item_group):
 		"Add filters for Item group page and include Website Item Groups."
 		from erpnext.setup.doctype.item_group.item_group import get_child_groups_for_website
+
 		item_group_filters = []
 
 		item_group_filters.append(["Website Item", "item_group", "=", item_group])
@@ -188,10 +201,10 @@
 		"""Query search term in specified fields
 
 		Args:
-			search_term (str): Search candidate
+		        search_term (str): Search candidate
 		"""
 		# Default fields to search from
-		default_fields = {'item_code', 'item_name', 'web_long_description', 'item_group'}
+		default_fields = {"item_code", "item_name", "web_long_description", "item_group"}
 
 		# Get meta search fields
 		meta = frappe.get_meta("Website Item")
@@ -199,22 +212,24 @@
 
 		# Join the meta fields and default fields set
 		search_fields = default_fields.union(meta_fields)
-		if frappe.db.count('Website Item', cache=True) > 50000:
-			search_fields.discard('web_long_description')
+		if frappe.db.count("Website Item", cache=True) > 50000:
+			search_fields.discard("web_long_description")
 
 		# Build or filters for query
-		search = '%{}%'.format(search_term)
+		search = "%{}%".format(search_term)
 		for field in search_fields:
 			self.or_filters.append([field, "like", search])
 
 	def add_display_details(self, result, discount_list, cart_items):
 		"""Add price and availability details in result."""
 		for item in result:
-			product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get('product_info')
+			product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get(
+				"product_info"
+			)
 
-			if product_info and product_info['price']:
+			if product_info and product_info["price"]:
 				# update/mutate item and discount_list objects
-				self.get_price_discount_info(item, product_info['price'], discount_list)
+				self.get_price_discount_info(item, product_info["price"], discount_list)
 
 			if self.settings.show_stock_availability:
 				self.get_stock_availability(item)
@@ -222,7 +237,9 @@
 			item.in_cart = item.item_code in cart_items
 
 			item.wished = False
-			if frappe.db.exists("Wishlist Item", {"item_code": item.item_code, "parent": frappe.session.user}):
+			if frappe.db.exists(
+				"Wishlist Item", {"item_code": item.item_code, "parent": frappe.session.user}
+			):
 				item.wished = True
 
 		return result, discount_list
@@ -233,13 +250,14 @@
 		for field in fields:
 			item[field] = price_object.get(field)
 
-		if price_object.get('discount_percent'):
+		if price_object.get("discount_percent"):
 			item.discount_percent = flt(price_object.discount_percent)
 			discount_list.append(price_object.discount_percent)
 
 		if item.formatted_mrp:
-			item.discount = price_object.get('formatted_discount_percent') or \
-				price_object.get('formatted_discount_rate')
+			item.discount = price_object.get("formatted_discount_percent") or price_object.get(
+				"formatted_discount_rate"
+			)
 
 	def get_stock_availability(self, item):
 		"""Modify item object and add stock details."""
@@ -259,24 +277,29 @@
 		elif warehouse:
 			# stock item and has warehouse
 			actual_qty = frappe.db.get_value(
-				"Bin",
-				{"item_code": item.item_code,"warehouse": item.get("website_warehouse")},
-				"actual_qty")
+				"Bin", {"item_code": item.item_code, "warehouse": item.get("website_warehouse")}, "actual_qty"
+			)
 			item.in_stock = bool(flt(actual_qty))
 
 	def get_cart_items(self):
 		customer = get_customer(silent=True)
 		if customer:
-			quotation = frappe.get_all("Quotation", fields=["name"], filters=
-				{"party_name": customer, "contact_email": frappe.session.user, "order_type": "Shopping Cart", "docstatus": 0},
-				order_by="modified desc", limit_page_length=1)
+			quotation = frappe.get_all(
+				"Quotation",
+				fields=["name"],
+				filters={
+					"party_name": customer,
+					"contact_email": frappe.session.user,
+					"order_type": "Shopping Cart",
+					"docstatus": 0,
+				},
+				order_by="modified desc",
+				limit_page_length=1,
+			)
 			if quotation:
 				items = frappe.get_all(
-					"Quotation Item",
-					fields=["item_code"],
-					filters={
-						"parent": quotation[0].get("name")
-					})
+					"Quotation Item", fields=["item_code"], filters={"parent": quotation[0].get("name")}
+				)
 				items = [row.item_code for row in items]
 				return items
 
@@ -285,11 +308,15 @@
 	def filter_results_by_discount(self, fields, result):
 		if fields and fields.get("discount"):
 			discount_percent = frappe.utils.flt(fields["discount"][0])
-			result = [row for row in result if row.get("discount_percent") and row.discount_percent <= discount_percent]
+			result = [
+				row
+				for row in result
+				if row.get("discount_percent") and row.discount_percent <= discount_percent
+			]
 
 		if self.filter_with_discount:
 			# no limit was added to results while querying
 			# slice results manually
-			result[:self.page_length]
+			result[: self.page_length]
 
 		return result
diff --git a/erpnext/e_commerce/product_data_engine/test_item_group_product_data_engine.py b/erpnext/e_commerce/product_data_engine/test_item_group_product_data_engine.py
index 6549ba6..45bc20e 100644
--- a/erpnext/e_commerce/product_data_engine/test_item_group_product_data_engine.py
+++ b/erpnext/e_commerce/product_data_engine/test_item_group_product_data_engine.py
@@ -10,6 +10,7 @@
 
 test_dependencies = ["Item", "Item Group"]
 
+
 class TestItemGroupProductDataEngine(unittest.TestCase):
 	"Test Products & Sub-Category Querying for Product Listing on Item Group Page."
 
@@ -19,7 +20,7 @@
 			("Test Mobile B", "_Test Item Group B"),
 			("Test Mobile C", "_Test Item Group B - 1"),
 			("Test Mobile D", "_Test Item Group B - 1"),
-			("Test Mobile E", "_Test Item Group B - 2")
+			("Test Mobile E", "_Test Item Group B - 2"),
 		]
 		for item in item_codes:
 			item_code = item[0]
@@ -35,12 +36,14 @@
 
 	def test_product_listing_in_item_group(self):
 		"Test if only products belonging to the Item Group are fetched."
-		result = get_product_filter_data(query_args={
-			"field_filters": {},
-			"attribute_filters": {},
-			"start": 0,
-			"item_group": "_Test Item Group B"
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {},
+				"attribute_filters": {},
+				"start": 0,
+				"item_group": "_Test Item Group B",
+			}
+		)
 
 		items = result.get("items")
 		item_codes = [item.get("item_code") for item in items]
@@ -54,48 +57,52 @@
 		website_item = frappe.get_doc("Website Item", {"item_code": "Test Mobile E"})
 
 		# show item belonging to '_Test Item Group B - 2' in '_Test Item Group B - 1' as well
-		website_item.append("website_item_groups", {
-			"item_group": "_Test Item Group B - 1"
-		})
+		website_item.append("website_item_groups", {"item_group": "_Test Item Group B - 1"})
 		website_item.save()
 
-		result = get_product_filter_data(query_args={
-			"field_filters": {},
-			"attribute_filters": {},
-			"start": 0,
-			"item_group": "_Test Item Group B - 1"
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {},
+				"attribute_filters": {},
+				"start": 0,
+				"item_group": "_Test Item Group B - 1",
+			}
+		)
 
 		items = result.get("items")
 		item_codes = [item.get("item_code") for item in items]
 
 		self.assertEqual(len(items), 3)
-		self.assertIn("Test Mobile E", item_codes) # visible in other item groups
+		self.assertIn("Test Mobile E", item_codes)  # visible in other item groups
 		self.assertIn("Test Mobile C", item_codes)
 		self.assertIn("Test Mobile D", item_codes)
 
-		result = get_product_filter_data(query_args={
-			"field_filters": {},
-			"attribute_filters": {},
-			"start": 0,
-			"item_group": "_Test Item Group B - 2"
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {},
+				"attribute_filters": {},
+				"start": 0,
+				"item_group": "_Test Item Group B - 2",
+			}
+		)
 
 		items = result.get("items")
 
 		self.assertEqual(len(items), 1)
-		self.assertEqual(items[0].get("item_code"), "Test Mobile E") # visible in own item group
+		self.assertEqual(items[0].get("item_code"), "Test Mobile E")  # visible in own item group
 
 	def test_item_group_with_sub_groups(self):
 		"Test Valid Sub Item Groups in Item Group Page."
 		frappe.db.set_value("Item Group", "_Test Item Group B - 2", "show_in_website", 0)
 
-		result = get_product_filter_data(query_args={
-			"field_filters": {},
-			"attribute_filters": {},
-			"start": 0,
-			"item_group": "_Test Item Group B"
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {},
+				"attribute_filters": {},
+				"start": 0,
+				"item_group": "_Test Item Group B",
+			}
+		)
 
 		self.assertTrue(bool(result.get("sub_categories")))
 
@@ -104,12 +111,14 @@
 		self.assertIn("_Test Item Group B - 1", child_groups)
 
 		frappe.db.set_value("Item Group", "_Test Item Group B - 2", "show_in_website", 1)
-		result = get_product_filter_data(query_args={
-			"field_filters": {},
-			"attribute_filters": {},
-			"start": 0,
-			"item_group": "_Test Item Group B"
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {},
+				"attribute_filters": {},
+				"start": 0,
+				"item_group": "_Test Item Group B",
+			}
+		)
 		child_groups = [d.name for d in result.get("sub_categories")]
 
 		# check if child group is fetched if shown in website
@@ -120,19 +129,20 @@
 		"""
 		Test if 'include_descendants' pulls Items belonging to descendant Item Groups (Level 2 & 3).
 		> _Test Item Group B [Level 1]
-			> _Test Item Group B - 1 [Level 2]
-				> _Test Item Group B - 1 - 1 [Level 3]
+		        > _Test Item Group B - 1 [Level 2]
+		                > _Test Item Group B - 1 - 1 [Level 3]
 		"""
-		frappe.get_doc({ # create Level 3 nested child group
-			"doctype": "Item Group",
-			"is_group": 1,
-			"item_group_name": "_Test Item Group B - 1 - 1",
-			"parent_item_group": "_Test Item Group B - 1"
-		}).insert()
+		frappe.get_doc(
+			{  # create Level 3 nested child group
+				"doctype": "Item Group",
+				"is_group": 1,
+				"item_group_name": "_Test Item Group B - 1 - 1",
+				"parent_item_group": "_Test Item Group B - 1",
+			}
+		).insert()
 
-		create_regular_web_item( # create an item belonging to level 3 item group
-			"Test Mobile F",
-			item_args={"item_group": "_Test Item Group B - 1 - 1"}
+		create_regular_web_item(  # create an item belonging to level 3 item group
+			"Test Mobile F", item_args={"item_group": "_Test Item Group B - 1 - 1"}
 		)
 
 		frappe.db.set_value("Item Group", "_Test Item Group B - 1 - 1", "show_in_website", 1)
@@ -140,12 +150,14 @@
 		# enable 'include descendants' in Level 1
 		frappe.db.set_value("Item Group", "_Test Item Group B", "include_descendants", 1)
 
-		result = get_product_filter_data(query_args={
-			"field_filters": {},
-			"attribute_filters": {},
-			"start": 0,
-			"item_group": "_Test Item Group B"
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {},
+				"attribute_filters": {},
+				"start": 0,
+				"item_group": "_Test Item Group B",
+			}
+		)
 
 		items = result.get("items")
 		item_codes = [item.get("item_code") for item in items]
@@ -155,4 +167,4 @@
 		self.assertIn("Test Mobile A", item_codes)
 		self.assertIn("Test Mobile C", item_codes)
 		self.assertIn("Test Mobile E", item_codes)
-		self.assertIn("Test Mobile F", item_codes)
\ No newline at end of file
+		self.assertIn("Test Mobile F", item_codes)
diff --git a/erpnext/e_commerce/product_data_engine/test_product_data_engine.py b/erpnext/e_commerce/product_data_engine/test_product_data_engine.py
index 9ec336d..ab958d1 100644
--- a/erpnext/e_commerce/product_data_engine/test_product_data_engine.py
+++ b/erpnext/e_commerce/product_data_engine/test_product_data_engine.py
@@ -14,19 +14,20 @@
 
 test_dependencies = ["Item", "Item Group"]
 
+
 class TestProductDataEngine(unittest.TestCase):
 	"Test Products Querying and Filters for Product Listing."
 
 	@classmethod
 	def setUpClass(cls):
 		item_codes = [
-			("Test 11I Laptop", "Products"), # rank 1
-			("Test 12I Laptop", "Products"), # rank 2
-			("Test 13I Laptop", "Products"), # rank 3
-			("Test 14I Laptop", "Raw Material"), # rank 4
-			("Test 15I Laptop", "Raw Material"), # rank 5
-			("Test 16I Laptop", "Raw Material"), # rank 6
-			("Test 17I Laptop", "Products") # rank 7
+			("Test 11I Laptop", "Products"),  # rank 1
+			("Test 12I Laptop", "Products"),  # rank 2
+			("Test 13I Laptop", "Products"),  # rank 3
+			("Test 14I Laptop", "Raw Material"),  # rank 4
+			("Test 15I Laptop", "Raw Material"),  # rank 5
+			("Test 16I Laptop", "Raw Material"),  # rank 6
+			("Test 17I Laptop", "Products"),  # rank 7
 		]
 		for index, item in enumerate(item_codes, start=1):
 			item_code = item[0]
@@ -35,17 +36,19 @@
 			if not frappe.db.exists("Website Item", {"item_code": item_code}):
 				create_regular_web_item(item_code, item_args=item_args, web_args=web_args)
 
-		setup_e_commerce_settings({
-			"products_per_page": 4,
-			"enable_field_filters": 1,
-			"filter_fields": [{"fieldname": "item_group"}],
-			"enable_attribute_filters": 1,
-			"filter_attributes": [{"attribute": "Test Size"}],
-			"company": "_Test Company",
-			"enabled": 1,
-			"default_customer_group": "_Test Customer Group",
-			"price_list": "_Test Price List India"
-		})
+		setup_e_commerce_settings(
+			{
+				"products_per_page": 4,
+				"enable_field_filters": 1,
+				"filter_fields": [{"fieldname": "item_group"}],
+				"enable_attribute_filters": 1,
+				"filter_attributes": [{"attribute": "Test Size"}],
+				"company": "_Test Company",
+				"enabled": 1,
+				"default_customer_group": "_Test Customer Group",
+				"price_list": "_Test Price List India",
+			}
+		)
 		frappe.local.shopping_cart_settings = None
 
 	@classmethod
@@ -55,13 +58,7 @@
 	def test_product_list_ordering_and_paging(self):
 		"Test if website items appear by ranking on different pages."
 		engine = ProductQuery()
-		result = engine.query(
-			attributes={},
-			fields={},
-			search_term=None,
-			start=0,
-			item_group=None
-		)
+		result = engine.query(attributes={}, fields={}, search_term=None, start=0, item_group=None)
 		items = result.get("items")
 
 		self.assertIsNotNone(items)
@@ -75,13 +72,7 @@
 		self.assertEqual(items[3].get("item_code"), "Test 14I Laptop")
 
 		# check next page
-		result = engine.query(
-			attributes={},
-			fields={},
-			search_term=None,
-			start=4,
-			item_group=None
-		)
+		result = engine.query(attributes={}, fields={}, search_term=None, start=4, item_group=None)
 		items = result.get("items")
 
 		# check if items appear as per ranking set in setUpClass on next page
@@ -101,13 +92,7 @@
 		frappe.db.set_value("Website Item", {"item_code": item_code}, "ranking", 10)
 
 		engine = ProductQuery()
-		result = engine.query(
-			attributes={},
-			fields={},
-			search_term=None,
-			start=0,
-			item_group=None
-		)
+		result = engine.query(attributes={}, fields={}, search_term=None, start=0, item_group=None)
 		items = result.get("items")
 
 		# check if item is the first item on the first page
@@ -152,11 +137,7 @@
 
 		engine = ProductQuery()
 		result = engine.query(
-			attributes={},
-			fields=field_filters,
-			search_term=None,
-			start=0,
-			item_group=None
+			attributes={}, fields=field_filters, search_term=None, start=0, item_group=None
 		)
 		items = result.get("items")
 
@@ -188,11 +169,7 @@
 		attribute_filters = {"Test Size": ["Large"]}
 		engine = ProductQuery()
 		result = engine.query(
-			attributes=attribute_filters,
-			fields={},
-			search_term=None,
-			start=0,
-			item_group=None
+			attributes=attribute_filters, fields={}, search_term=None, start=0, item_group=None
 		)
 		items = result.get("items")
 
@@ -209,24 +186,13 @@
 
 		item_code = "Test 12I Laptop"
 		make_web_item_price(item_code=item_code)
-		make_web_pricing_rule(
-			title=f"Test Pricing Rule for {item_code}",
-			item_code=item_code,
-			selling=1
-		)
+		make_web_pricing_rule(title=f"Test Pricing Rule for {item_code}", item_code=item_code, selling=1)
 
 		setup_e_commerce_settings({"show_price": 1})
 		frappe.local.shopping_cart_settings = None
 
-
 		engine = ProductQuery()
-		result = engine.query(
-			attributes={},
-			fields={},
-			search_term=None,
-			start=4,
-			item_group=None
-		)
+		result = engine.query(attributes={}, fields={}, search_term=None, start=4, item_group=None)
 		self.assertTrue(bool(result.get("discounts")))
 
 		filter_engine = ProductFiltersBuilder()
@@ -247,16 +213,16 @@
 
 		make_web_item_price(item_code="Test 12I Laptop")
 		make_web_pricing_rule(
-			title="Test Pricing Rule for Test 12I Laptop", # 10% discount
+			title="Test Pricing Rule for Test 12I Laptop",  # 10% discount
 			item_code="Test 12I Laptop",
-			selling=1
+			selling=1,
 		)
 		make_web_item_price(item_code="Test 13I Laptop")
 		make_web_pricing_rule(
-			title="Test Pricing Rule for Test 13I Laptop", # 15% discount
+			title="Test Pricing Rule for Test 13I Laptop",  # 15% discount
 			item_code="Test 13I Laptop",
 			discount_percentage=15,
-			selling=1
+			selling=1,
 		)
 
 		setup_e_commerce_settings({"show_price": 1})
@@ -264,11 +230,7 @@
 
 		engine = ProductQuery()
 		result = engine.query(
-			attributes={},
-			fields=field_filters,
-			search_term=None,
-			start=0,
-			item_group=None
+			attributes={}, fields=field_filters, search_term=None, start=0, item_group=None
 		)
 		items = result.get("items")
 
@@ -282,15 +244,13 @@
 
 		create_variant_web_item()
 
-		result = get_product_filter_data(query_args={
-			"field_filters": {
-				"item_group": "Products"
-			},
-			"attribute_filters": {
-				"Test Size": ["Large"]
-			},
-			"start": 0
-		})
+		result = get_product_filter_data(
+			query_args={
+				"field_filters": {"item_group": "Products"},
+				"attribute_filters": {"Test Size": ["Large"]},
+				"start": 0,
+			}
+		)
 
 		items = result.get("items")
 
@@ -301,20 +261,13 @@
 		"Test if variants are hideen on hiding variants in settings."
 		create_variant_web_item()
 
-		setup_e_commerce_settings({
-			"enable_attribute_filters": 0,
-			"hide_variants": 1
-		})
+		setup_e_commerce_settings({"enable_attribute_filters": 0, "hide_variants": 1})
 		frappe.local.shopping_cart_settings = None
 
 		attribute_filters = {"Test Size": ["Large"]}
 		engine = ProductQuery()
 		result = engine.query(
-			attributes=attribute_filters,
-			fields={},
-			search_term=None,
-			start=0,
-			item_group=None
+			attributes=attribute_filters, fields={}, search_term=None, start=0, item_group=None
 		)
 		items = result.get("items")
 
@@ -322,10 +275,8 @@
 		self.assertEqual(len(items), 0)
 
 		# tear down
-		setup_e_commerce_settings({
-			"enable_attribute_filters": 1,
-			"hide_variants": 0
-		})
+		setup_e_commerce_settings({"enable_attribute_filters": 1, "hide_variants": 0})
+
 
 def create_variant_web_item():
 	"Create Variant and Template Website Items."
@@ -333,18 +284,17 @@
 	from erpnext.e_commerce.doctype.website_item.website_item import make_website_item
 	from erpnext.stock.doctype.item.test_item import make_item
 
-	make_item("Test Web Item", {
-		"has_variant": 1,
-		"variant_based_on": "Item Attribute",
-		"attributes": [
-			{
-				"attribute": "Test Size"
-			}
-		]
-	})
+	make_item(
+		"Test Web Item",
+		{
+			"has_variant": 1,
+			"variant_based_on": "Item Attribute",
+			"attributes": [{"attribute": "Test Size"}],
+		},
+	)
 	if not frappe.db.exists("Item", "Test Web Item-L"):
 		variant = create_variant("Test Web Item", {"Test Size": "Large"})
 		variant.save()
 
 	if not frappe.db.exists("Website Item", {"variant_of": "Test Web Item"}):
-		make_website_item(variant, save=True)
\ No newline at end of file
+		make_website_item(variant, save=True)
diff --git a/erpnext/e_commerce/redisearch_utils.py b/erpnext/e_commerce/redisearch_utils.py
index 59c7f32..82829bf 100644
--- a/erpnext/e_commerce/redisearch_utils.py
+++ b/erpnext/e_commerce/redisearch_utils.py
@@ -5,24 +5,27 @@
 from frappe.utils.redis_wrapper import RedisWrapper
 from redisearch import AutoCompleter, Client, IndexDefinition, Suggestion, TagField, TextField
 
-WEBSITE_ITEM_INDEX = 'website_items_index'
-WEBSITE_ITEM_KEY_PREFIX = 'website_item:'
-WEBSITE_ITEM_NAME_AUTOCOMPLETE = 'website_items_name_dict'
-WEBSITE_ITEM_CATEGORY_AUTOCOMPLETE = 'website_items_category_dict'
+WEBSITE_ITEM_INDEX = "website_items_index"
+WEBSITE_ITEM_KEY_PREFIX = "website_item:"
+WEBSITE_ITEM_NAME_AUTOCOMPLETE = "website_items_name_dict"
+WEBSITE_ITEM_CATEGORY_AUTOCOMPLETE = "website_items_category_dict"
+
 
 def get_indexable_web_fields():
 	"Return valid fields from Website Item that can be searched for."
 	web_item_meta = frappe.get_meta("Website Item", cached=True)
 	valid_fields = filter(
 		lambda df: df.fieldtype in ("Link", "Table MultiSelect", "Data", "Small Text", "Text Editor"),
-		web_item_meta.fields)
+		web_item_meta.fields,
+	)
 
 	return [df.fieldname for df in valid_fields]
 
+
 def is_search_module_loaded():
 	try:
 		cache = frappe.cache()
-		out = cache.execute_command('MODULE LIST')
+		out = cache.execute_command("MODULE LIST")
 
 		parsed_output = " ".join(
 			(" ".join([s.decode() for s in o if not isinstance(s, int)]) for o in out)
@@ -31,8 +34,10 @@
 	except Exception:
 		return False
 
+
 def if_redisearch_loaded(function):
 	"Decorator to check if Redisearch is loaded."
+
 	def wrapper(*args, **kwargs):
 		if is_search_module_loaded():
 			func = function(*args, **kwargs)
@@ -41,8 +46,10 @@
 
 	return wrapper
 
+
 def make_key(key):
-	return "{0}|{1}".format(frappe.conf.db_name, key).encode('utf-8')
+	return "{0}|{1}".format(frappe.conf.db_name, key).encode("utf-8")
+
 
 @if_redisearch_loaded
 def create_website_items_index():
@@ -60,14 +67,11 @@
 	idx_def = IndexDefinition([make_key(WEBSITE_ITEM_KEY_PREFIX)])
 
 	# Based on e-commerce settings
-	idx_fields = frappe.db.get_single_value(
-		'E Commerce Settings',
-		'search_index_fields'
-	)
-	idx_fields = idx_fields.split(',') if idx_fields else []
+	idx_fields = frappe.db.get_single_value("E Commerce Settings", "search_index_fields")
+	idx_fields = idx_fields.split(",") if idx_fields else []
 
-	if 'web_item_name' in idx_fields:
-		idx_fields.remove('web_item_name')
+	if "web_item_name" in idx_fields:
+		idx_fields.remove("web_item_name")
 
 	idx_fields = list(map(to_search_field, idx_fields))
 
@@ -79,12 +83,14 @@
 	reindex_all_web_items()
 	define_autocomplete_dictionary()
 
+
 def to_search_field(field):
 	if field == "tags":
 		return TagField("tags", separator=",")
 
 	return TextField(field)
 
+
 @if_redisearch_loaded
 def insert_item_to_index(website_item_doc):
 	# Insert item to index
@@ -97,26 +103,30 @@
 
 	insert_to_name_ac(website_item_doc.web_item_name, website_item_doc.name)
 
+
 @if_redisearch_loaded
 def insert_to_name_ac(web_name, doc_name):
 	ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=frappe.cache())
 	ac.add_suggestions(Suggestion(web_name, payload=doc_name))
 
+
 def create_web_item_map(website_item_doc):
 	fields_to_index = get_fields_indexed()
 	web_item = {}
 
 	for f in fields_to_index:
-		web_item[f] = website_item_doc.get(f) or ''
+		web_item[f] = website_item_doc.get(f) or ""
 
 	return web_item
 
+
 @if_redisearch_loaded
 def update_index_for_item(website_item_doc):
 	# Reinsert to Cache
 	insert_item_to_index(website_item_doc)
 	define_autocomplete_dictionary()
 
+
 @if_redisearch_loaded
 def delete_item_from_index(website_item_doc):
 	cache = frappe.cache()
@@ -130,26 +140,27 @@
 	delete_from_ac_dict(website_item_doc)
 	return True
 
+
 @if_redisearch_loaded
 def delete_from_ac_dict(website_item_doc):
-	'''Removes this items's name from autocomplete dictionary'''
+	"""Removes this items's name from autocomplete dictionary"""
 	cache = frappe.cache()
 	name_ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=cache)
 	name_ac.delete(website_item_doc.web_item_name)
 
+
 @if_redisearch_loaded
 def define_autocomplete_dictionary():
 	"""Creates an autocomplete search dictionary for `name`.
-		Also creats autocomplete dictionary for `categories` if
-		checked in E Commerce Settings"""
+	Also creats autocomplete dictionary for `categories` if
+	checked in E Commerce Settings"""
 
 	cache = frappe.cache()
 	name_ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=cache)
 	cat_ac = AutoCompleter(make_key(WEBSITE_ITEM_CATEGORY_AUTOCOMPLETE), conn=cache)
 
 	ac_categories = frappe.db.get_single_value(
-		'E Commerce Settings',
-		'show_categories_in_search_autocomplete'
+		"E Commerce Settings", "show_categories_in_search_autocomplete"
 	)
 
 	# Delete both autocomplete dicts
@@ -160,9 +171,7 @@
 		return False
 
 	items = frappe.get_all(
-		'Website Item',
-		fields=['web_item_name', 'item_group'],
-		filters={"published": 1}
+		"Website Item", fields=["web_item_name", "item_group"], filters={"published": 1}
 	)
 
 	for item in items:
@@ -172,13 +181,10 @@
 
 	return True
 
+
 @if_redisearch_loaded
 def reindex_all_web_items():
-	items = frappe.get_all(
-		'Website Item',
-		fields=get_fields_indexed(),
-		filters={"published": True}
-	)
+	items = frappe.get_all("Website Item", fields=get_fields_indexed(), filters={"published": True})
 
 	cache = frappe.cache()
 	for item in items:
@@ -188,22 +194,22 @@
 		for k, v in web_item.items():
 			super(RedisWrapper, cache).hset(key, k, v)
 
+
 def get_cache_key(name):
 	name = frappe.scrub(name)
 	return f"{WEBSITE_ITEM_KEY_PREFIX}{name}"
 
-def get_fields_indexed():
-	fields_to_index = frappe.db.get_single_value(
-		'E Commerce Settings',
-		'search_index_fields'
-	)
-	fields_to_index = fields_to_index.split(',') if fields_to_index else []
 
-	mandatory_fields = ['name', 'web_item_name', 'route', 'thumbnail', 'ranking']
+def get_fields_indexed():
+	fields_to_index = frappe.db.get_single_value("E Commerce Settings", "search_index_fields")
+	fields_to_index = fields_to_index.split(",") if fields_to_index else []
+
+	mandatory_fields = ["name", "web_item_name", "route", "thumbnail", "ranking"]
 	fields_to_index = fields_to_index + mandatory_fields
 
 	return fields_to_index
 
+
 # TODO: Remove later
 # # Figure out a way to run this at startup
 define_autocomplete_dictionary()
diff --git a/erpnext/e_commerce/shopping_cart/cart.py b/erpnext/e_commerce/shopping_cart/cart.py
index 0f3f69d..4c82393 100644
--- a/erpnext/e_commerce/shopping_cart/cart.py
+++ b/erpnext/e_commerce/shopping_cart/cart.py
@@ -19,6 +19,7 @@
 class WebsitePriceListMissingError(frappe.ValidationError):
 	pass
 
+
 def set_cart_count(quotation=None):
 	if cint(frappe.db.get_singles_value("E Commerce Settings", "enabled")):
 		if not quotation:
@@ -28,6 +29,7 @@
 		if hasattr(frappe.local, "cookie_manager"):
 			frappe.local.cookie_manager.set_cookie("cart_count", cart_count)
 
+
 @frappe.whitelist()
 def get_cart_quotation(doc=None):
 	party = get_party()
@@ -47,38 +49,46 @@
 		"shipping_addresses": get_shipping_addresses(party),
 		"billing_addresses": get_billing_addresses(party),
 		"shipping_rules": get_applicable_shipping_rules(party),
-		"cart_settings": frappe.get_cached_doc("E Commerce Settings")
+		"cart_settings": frappe.get_cached_doc("E Commerce Settings"),
 	}
 
+
 @frappe.whitelist()
 def get_shipping_addresses(party=None):
 	if not party:
 		party = get_party()
 	addresses = get_address_docs(party=party)
-	return [{"name": address.name, "title": address.address_title, "display": address.display}
-		for address in addresses if address.address_type == "Shipping"
+	return [
+		{"name": address.name, "title": address.address_title, "display": address.display}
+		for address in addresses
+		if address.address_type == "Shipping"
 	]
 
+
 @frappe.whitelist()
 def get_billing_addresses(party=None):
 	if not party:
 		party = get_party()
 	addresses = get_address_docs(party=party)
-	return [{"name": address.name, "title": address.address_title, "display": address.display}
-		for address in addresses if address.address_type == "Billing"
+	return [
+		{"name": address.name, "title": address.address_title, "display": address.display}
+		for address in addresses
+		if address.address_type == "Billing"
 	]
 
+
 @frappe.whitelist()
 def place_order():
 	quotation = _get_cart_quotation()
-	cart_settings = frappe.db.get_value("E Commerce Settings", None,
-		["company", "allow_items_not_in_stock"], as_dict=1)
+	cart_settings = frappe.db.get_value(
+		"E Commerce Settings", None, ["company", "allow_items_not_in_stock"], as_dict=1
+	)
 	quotation.company = cart_settings.company
 
 	quotation.flags.ignore_permissions = True
 	quotation.submit()
 
-	if quotation.quotation_to == 'Lead' and quotation.party_name:
+	if quotation.quotation_to == "Lead" and quotation.party_name:
 		# company used to create customer accounts
 		frappe.defaults.set_user_default("company", quotation.company)
 
@@ -86,17 +96,14 @@
 		frappe.throw(_("Set Shipping Address or Billing Address"))
 
 	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
+
 	sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
 	sales_order.payment_schedule = []
 
 	if not cint(cart_settings.allow_items_not_in_stock):
 		for item in sales_order.get("items"):
 			item.warehouse = frappe.db.get_value(
-				"Website Item",
-				{
-					"item_code": item.item_code
-				},
-				"website_warehouse"
+				"Website Item", {"item_code": item.item_code}, "website_warehouse"
 			)
 			is_stock_item = frappe.db.get_value("Item", item.item_code, "is_stock_item")
 
@@ -116,6 +123,7 @@
 
 	return sales_order.name
 
+
 @frappe.whitelist()
 def request_for_quotation():
 	quotation = _get_cart_quotation()
@@ -127,6 +135,7 @@
 		quotation.submit()
 	return quotation.name
 
+
 @frappe.whitelist()
 def update_cart(item_code, qty, additional_notes=None, with_items=False):
 	quotation = _get_cart_quotation()
@@ -143,12 +152,15 @@
 	else:
 		quotation_items = quotation.get("items", {"item_code": item_code})
 		if not quotation_items:
-			quotation.append("items", {
-				"doctype": "Quotation Item",
-				"item_code": item_code,
-				"qty": qty,
-				"additional_notes": additional_notes
-			})
+			quotation.append(
+				"items",
+				{
+					"doctype": "Quotation Item",
+					"item_code": item_code,
+					"qty": qty,
+					"additional_notes": additional_notes,
+				},
+			)
 		else:
 			quotation_items[0].qty = qty
 			quotation_items[0].additional_notes = additional_notes
@@ -168,73 +180,75 @@
 	if cint(with_items):
 		context = get_cart_quotation(quotation)
 		return {
-			"items": frappe.render_template("templates/includes/cart/cart_items.html",
-				context),
-			"total": frappe.render_template("templates/includes/cart/cart_items_total.html",
-				context),
-			"taxes_and_totals": frappe.render_template("templates/includes/cart/cart_payment_summary.html",
-				context)
+			"items": frappe.render_template("templates/includes/cart/cart_items.html", context),
+			"total": frappe.render_template("templates/includes/cart/cart_items_total.html", context),
+			"taxes_and_totals": frappe.render_template(
+				"templates/includes/cart/cart_payment_summary.html", context
+			),
 		}
 	else:
-		return {
-			'name': quotation.name
-		}
+		return {"name": quotation.name}
+
 
 @frappe.whitelist()
 def get_shopping_cart_menu(context=None):
 	if not context:
 		context = get_cart_quotation()
 
-	return frappe.render_template('templates/includes/cart/cart_dropdown.html', context)
+	return frappe.render_template("templates/includes/cart/cart_dropdown.html", context)
 
 
 @frappe.whitelist()
 def add_new_address(doc):
 	doc = frappe.parse_json(doc)
-	doc.update({
-		'doctype': 'Address'
-	})
+	doc.update({"doctype": "Address"})
 	address = frappe.get_doc(doc)
 	address.save(ignore_permissions=True)
 
 	return address
 
+
 @frappe.whitelist(allow_guest=True)
 def create_lead_for_item_inquiry(lead, subject, message):
 	lead = frappe.parse_json(lead)
-	lead_doc = frappe.new_doc('Lead')
+	lead_doc = frappe.new_doc("Lead")
 	for fieldname in ("lead_name", "company_name", "email_id", "phone"):
 		lead_doc.set(fieldname, lead.get(fieldname))
 
-	lead_doc.set('lead_owner', '')
+	lead_doc.set("lead_owner", "")
 
-	if not frappe.db.exists('Lead Source', 'Product Inquiry'):
-		frappe.get_doc({
-			'doctype': 'Lead Source',
-			'source_name' : 'Product Inquiry'
-		}).insert(ignore_permissions=True)
+	if not frappe.db.exists("Lead Source", "Product Inquiry"):
+		frappe.get_doc({"doctype": "Lead Source", "source_name": "Product Inquiry"}).insert(
+			ignore_permissions=True
+		)
 
-	lead_doc.set('source', 'Product Inquiry')
+	lead_doc.set("source", "Product Inquiry")
 
 	try:
 		lead_doc.save(ignore_permissions=True)
 	except frappe.exceptions.DuplicateEntryError:
 		frappe.clear_messages()
-		lead_doc = frappe.get_doc('Lead', {'email_id': lead['email_id']})
+		lead_doc = frappe.get_doc("Lead", {"email_id": lead["email_id"]})
 
-	lead_doc.add_comment('Comment', text='''
+	lead_doc.add_comment(
+		"Comment",
+		text="""
 		<div>
 			<h5>{subject}</h5>
 			<p>{message}</p>
 		</div>
-	'''.format(subject=subject, message=message))
+	""".format(
+			subject=subject, message=message
+		),
+	)
 
 	return lead_doc
 
 
 @frappe.whitelist()
 def get_terms_and_conditions(terms_name):
-	return frappe.db.get_value('Terms and Conditions', terms_name, 'terms')
+	return frappe.db.get_value("Terms and Conditions", terms_name, "terms")
+
 
 @frappe.whitelist()
 def update_cart_address(address_type, address_name):
@@ -251,31 +265,35 @@
 		quotation.shipping_address_name = address_name
 		quotation.shipping_address = address_display
 		quotation.customer_address = quotation.customer_address or address_name
-		address_doc = next((doc for doc in get_shipping_addresses() if doc["name"] == address_name), None)
+		address_doc = next(
+			(doc for doc in get_shipping_addresses() if doc["name"] == address_name), None
+		)
 	apply_cart_settings(quotation=quotation)
 
 	quotation.flags.ignore_permissions = True
 	quotation.save()
 
 	context = get_cart_quotation(quotation)
-	context['address'] = address_doc
+	context["address"] = address_doc
 
 	return {
-		"taxes": frappe.render_template("templates/includes/order/order_taxes.html",
-			context),
-		"address": frappe.render_template("templates/includes/cart/address_card.html",
-			context)
+		"taxes": frappe.render_template("templates/includes/order/order_taxes.html", context),
+		"address": frappe.render_template("templates/includes/cart/address_card.html", context),
 	}
 
+
 def guess_territory():
 	territory = None
 	geoip_country = frappe.session.get("session_country")
 	if geoip_country:
 		territory = frappe.db.get_value("Territory", geoip_country)
 
-	return territory or \
-		frappe.db.get_value("E Commerce Settings", None, "territory") or \
-			get_root_of("Territory")
+	return (
+		territory
+		or frappe.db.get_value("E Commerce Settings", None, "territory")
+		or get_root_of("Territory")
+	)
+
 
 def decorate_quotation_doc(doc):
 	for d in doc.get("items", []):
@@ -288,50 +306,56 @@
 				"Item",
 				filters={"item_code": item_code},
 				fieldname=["variant_of", "item_name", "image"],
-				as_dict=True
+				as_dict=True,
 			)[0]
 			item_code = variant_data.variant_of
 			fields = fields[1:]
 			d.web_item_name = variant_data.item_name
 
-			if variant_data.image: # get image from variant or template web item
+			if variant_data.image:  # get image from variant or template web item
 				d.thumbnail = variant_data.image
 				fields = fields[2:]
 
-		d.update(frappe.db.get_value(
-			"Website Item",
-			{"item_code": item_code},
-			fields,
-			as_dict=True)
-		)
+		d.update(frappe.db.get_value("Website Item", {"item_code": item_code}, fields, as_dict=True))
 
 	return doc
 
 
 def _get_cart_quotation(party=None):
-	'''Return the open Quotation of type "Shopping Cart" or make a new one'''
+	"""Return the open Quotation of type "Shopping Cart" or make a new one"""
 	if not party:
 		party = get_party()
 
-	quotation = frappe.get_all("Quotation", fields=["name"], filters=
-		{"party_name": party.name, "contact_email": frappe.session.user, "order_type": "Shopping Cart", "docstatus": 0},
-		order_by="modified desc", limit_page_length=1)
+	quotation = frappe.get_all(
+		"Quotation",
+		fields=["name"],
+		filters={
+			"party_name": party.name,
+			"contact_email": frappe.session.user,
+			"order_type": "Shopping Cart",
+			"docstatus": 0,
+		},
+		order_by="modified desc",
+		limit_page_length=1,
+	)
 
 	if quotation:
 		qdoc = frappe.get_doc("Quotation", quotation[0].name)
 	else:
 		company = frappe.db.get_value("E Commerce Settings", None, ["company"])
-		qdoc = frappe.get_doc({
-			"doctype": "Quotation",
-			"naming_series": get_shopping_cart_settings().quotation_series or "QTN-CART-",
-			"quotation_to": party.doctype,
-			"company": company,
-			"order_type": "Shopping Cart",
-			"status": "Draft",
-			"docstatus": 0,
-			"__islocal": 1,
-			"party_name": party.name
-		})
+		qdoc = frappe.get_doc(
+			{
+				"doctype": "Quotation",
+				"naming_series": get_shopping_cart_settings().quotation_series or "QTN-CART-",
+				"quotation_to": party.doctype,
+				"company": company,
+				"order_type": "Shopping Cart",
+				"status": "Draft",
+				"docstatus": 0,
+				"__islocal": 1,
+				"party_name": party.name,
+			}
+		)
 
 		qdoc.contact_person = frappe.db.get_value("Contact", {"email_id": frappe.session.user})
 		qdoc.contact_email = frappe.session.user
@@ -342,6 +366,7 @@
 
 	return qdoc
 
+
 def update_party(fullname, company_name=None, mobile_no=None, phone=None):
 	party = get_party()
 
@@ -369,6 +394,7 @@
 		qdoc.flags.ignore_permissions = True
 		qdoc.save()
 
+
 def apply_cart_settings(party=None, quotation=None):
 	if not party:
 		party = get_party()
@@ -385,14 +411,16 @@
 
 	_apply_shipping_rule(party, quotation, cart_settings)
 
+
 def set_price_list_and_rate(quotation, cart_settings):
 	"""set price list based on billing territory"""
 
 	_set_price_list(cart_settings, quotation)
 
 	# reset values
-	quotation.price_list_currency = quotation.currency = \
-		quotation.plc_conversion_rate = quotation.conversion_rate = None
+	quotation.price_list_currency = (
+		quotation.currency
+	) = quotation.plc_conversion_rate = quotation.conversion_rate = None
 	for item in quotation.get("items"):
 		item.price_list_rate = item.discount_percentage = item.rate = item.amount = None
 
@@ -403,9 +431,11 @@
 		# set it in cookies for using in product page
 		frappe.local.cookie_manager.set_cookie("selling_price_list", quotation.selling_price_list)
 
+
 def _set_price_list(cart_settings, quotation=None):
 	"""Set price list based on customer or shopping cart default"""
 	from erpnext.accounts.party import get_default_price_list
+
 	party_name = quotation.get("party_name") if quotation else get_party().get("name")
 	selling_price_list = None
 
@@ -422,23 +452,33 @@
 
 	return selling_price_list
 
+
 def set_taxes(quotation, cart_settings):
 	"""set taxes based on billing territory"""
 	from erpnext.accounts.party import set_taxes
 
 	customer_group = frappe.db.get_value("Customer", quotation.party_name, "customer_group")
 
-	quotation.taxes_and_charges = set_taxes(quotation.party_name, "Customer",
-		quotation.transaction_date, quotation.company, customer_group=customer_group, supplier_group=None,
-		tax_category=quotation.tax_category, billing_address=quotation.customer_address,
-		shipping_address=quotation.shipping_address_name, use_for_shopping_cart=1)
-#
-# 	# clear table
+	quotation.taxes_and_charges = set_taxes(
+		quotation.party_name,
+		"Customer",
+		quotation.transaction_date,
+		quotation.company,
+		customer_group=customer_group,
+		supplier_group=None,
+		tax_category=quotation.tax_category,
+		billing_address=quotation.customer_address,
+		shipping_address=quotation.shipping_address_name,
+		use_for_shopping_cart=1,
+	)
+	#
+	# 	# clear table
 	quotation.set("taxes", [])
-#
-# 	# append taxes
+	#
+	# 	# append taxes
 	quotation.append_taxes_from_master()
 
+
 def get_party(user=None):
 	if not user:
 		user = frappe.session.user
@@ -447,14 +487,14 @@
 	party = None
 
 	if contact_name:
-		contact = frappe.get_doc('Contact', contact_name)
+		contact = frappe.get_doc("Contact", contact_name)
 		if contact.links:
 			party_doctype = contact.links[0].link_doctype
 			party = contact.links[0].link_name
 
 	cart_settings = frappe.get_doc("E Commerce Settings")
 
-	debtors_account = ''
+	debtors_account = ""
 
 	if cart_settings.enable_checkout:
 		debtors_account = get_debtors_account(cart_settings)
@@ -468,57 +508,62 @@
 			raise frappe.Redirect
 		customer = frappe.new_doc("Customer")
 		fullname = get_fullname(user)
-		customer.update({
-			"customer_name": fullname,
-			"customer_type": "Individual",
-			"customer_group": get_shopping_cart_settings().default_customer_group,
-			"territory": get_root_of("Territory")
-		})
+		customer.update(
+			{
+				"customer_name": fullname,
+				"customer_type": "Individual",
+				"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
-				}]
-			})
+			customer.update({"accounts": [{"company": cart_settings.company, "account": debtors_account}]})
 
 		customer.flags.ignore_mandatory = True
 		customer.insert(ignore_permissions=True)
 
 		contact = frappe.new_doc("Contact")
-		contact.update({
-			"first_name": fullname,
-			"email_ids": [{"email_id": user, "is_primary": 1}]
-		})
-		contact.append('links', dict(link_doctype='Customer', link_name=customer.name))
+		contact.update({"first_name": fullname, "email_ids": [{"email_id": user, "is_primary": 1}]})
+		contact.append("links", dict(link_doctype="Customer", link_name=customer.name))
 		contact.flags.ignore_mandatory = True
 		contact.insert(ignore_permissions=True)
 
 		return customer
 
+
 def get_debtors_account(cart_settings):
 	if not cart_settings.payment_gateway_account:
 		frappe.throw(_("Payment Gateway Account not set"), _("Mandatory"))
 
-	payment_gateway_account_currency = \
-		frappe.get_doc("Payment Gateway Account", cart_settings.payment_gateway_account).currency
+	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_name = get_account_name("Receivable", "Asset", is_group=0,\
-		account_currency=payment_gateway_account_currency, company=cart_settings.company)
+	debtors_account_name = get_account_name(
+		"Receivable",
+		"Asset",
+		is_group=0,
+		account_currency=payment_gateway_account_currency,
+		company=cart_settings.company,
+	)
 
 	if not debtors_account_name:
-		debtors_account = frappe.get_doc({
-			"doctype": "Account",
-			"account_type": "Receivable",
-			"root_type": "Asset",
-			"is_group": 0,
-			"parent_account": get_account_name(root_type="Asset", is_group=1, company=cart_settings.company),
-			"account_name": account_name,
-			"currency": payment_gateway_account_currency
-		}).insert(ignore_permissions=True)
+		debtors_account = frappe.get_doc(
+			{
+				"doctype": "Account",
+				"account_type": "Receivable",
+				"root_type": "Asset",
+				"is_group": 0,
+				"parent_account": get_account_name(
+					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.name
 
@@ -526,26 +571,31 @@
 		return debtors_account_name
 
 
-def get_address_docs(doctype=None, txt=None, filters=None, limit_start=0, limit_page_length=20,
-	party=None):
+def get_address_docs(
+	doctype=None, txt=None, filters=None, limit_start=0, limit_page_length=20, party=None
+):
 	if not party:
 		party = get_party()
 
 	if not party:
 		return []
 
-	address_names = frappe.db.get_all('Dynamic Link', fields=('parent'),
-		filters=dict(parenttype='Address', link_doctype=party.doctype, link_name=party.name))
+	address_names = frappe.db.get_all(
+		"Dynamic Link",
+		fields=("parent"),
+		filters=dict(parenttype="Address", link_doctype=party.doctype, link_name=party.name),
+	)
 
 	out = []
 
 	for a in address_names:
-		address = frappe.get_doc('Address', a.parent)
+		address = frappe.get_doc("Address", a.parent)
 		address.display = get_address_display(address.as_dict())
 		out.append(address)
 
 	return out
 
+
 @frappe.whitelist()
 def apply_shipping_rule(shipping_rule):
 	quotation = _get_cart_quotation()
@@ -559,6 +609,7 @@
 
 	return get_cart_quotation(quotation)
 
+
 def _apply_shipping_rule(party=None, quotation=None, cart_settings=None):
 	if not quotation.shipping_rule:
 		shipping_rules = get_shipping_rules(quotation, cart_settings)
@@ -573,6 +624,7 @@
 		quotation.run_method("apply_shipping_rule")
 		quotation.run_method("calculate_taxes_and_totals")
 
+
 def get_applicable_shipping_rules(party=None, quotation=None):
 	shipping_rules = get_shipping_rules(quotation)
 
@@ -581,6 +633,7 @@
 		# we need this in sorted order as per the position of the rule in the settings page
 		return [[rule, rule] for rule in shipping_rules]
 
+
 def get_shipping_rules(quotation=None, cart_settings=None):
 	if not quotation:
 		quotation = _get_cart_quotation()
@@ -593,26 +646,24 @@
 			sr = frappe.qb.DocType("Shipping Rule")
 			query = (
 				frappe.qb.from_(sr_country)
-				.join(sr).on(sr.name == sr_country.parent)
+				.join(sr)
+				.on(sr.name == sr_country.parent)
 				.select(sr.name)
 				.distinct()
-				.where(
-					(sr_country.country == country)
-					& (sr.disabled != 1)
-				)
+				.where((sr_country.country == country) & (sr.disabled != 1))
 			)
 			result = query.run(as_list=True)
 			shipping_rules = [x[0] for x in result]
 
 	return shipping_rules
 
+
 def get_address_territory(address_name):
 	"""Tries to match city, state and country of address to existing territory"""
 	territory = None
 
 	if address_name:
-		address_fields = frappe.db.get_value("Address", address_name,
-			["city", "state", "country"])
+		address_fields = frappe.db.get_value("Address", address_name, ["city", "state", "country"])
 		for value in address_fields:
 			territory = frappe.db.get_value("Territory", value)
 			if territory:
@@ -620,9 +671,11 @@
 
 	return territory
 
+
 def show_terms(doc):
 	return doc.tc_name
 
+
 @frappe.whitelist(allow_guest=True)
 def apply_coupon_code(applied_code, applied_referral_sales_partner):
 	quotation = True
@@ -630,13 +683,14 @@
 	if not applied_code:
 		frappe.throw(_("Please enter a coupon code"))
 
-	coupon_list = frappe.get_all('Coupon Code', filters={'coupon_code': applied_code})
+	coupon_list = frappe.get_all("Coupon Code", filters={"coupon_code": applied_code})
 	if not coupon_list:
 		frappe.throw(_("Please enter a valid coupon code"))
 
 	coupon_name = coupon_list[0].name
 
 	from erpnext.accounts.doctype.pricing_rule.utils import validate_coupon_code
+
 	validate_coupon_code(coupon_name)
 	quotation = _get_cart_quotation()
 	quotation.coupon_code = coupon_name
@@ -644,7 +698,9 @@
 	quotation.save()
 
 	if applied_referral_sales_partner:
-		sales_partner_list = frappe.get_all('Sales Partner', filters={'referral_code': applied_referral_sales_partner})
+		sales_partner_list = frappe.get_all(
+			"Sales Partner", filters={"referral_code": applied_referral_sales_partner}
+		)
 		if sales_partner_list:
 			sales_partner_name = sales_partner_list[0].name
 			quotation.referral_sales_partner = sales_partner_name
diff --git a/erpnext/e_commerce/shopping_cart/product_info.py b/erpnext/e_commerce/shopping_cart/product_info.py
index 595fed0..0248ca7 100644
--- a/erpnext/e_commerce/shopping_cart/product_info.py
+++ b/erpnext/e_commerce/shopping_cart/product_info.py
@@ -22,16 +22,17 @@
 	cart_settings = get_shopping_cart_settings()
 	if not cart_settings.enabled:
 		# return settings even if cart is disabled
-		return frappe._dict({
-			"product_info": {},
-			"cart_settings": cart_settings
-		})
+		return frappe._dict({"product_info": {}, "cart_settings": cart_settings})
 
 	cart_quotation = frappe._dict()
 	if not skip_quotation_creation:
 		cart_quotation = _get_cart_quotation()
 
-	selling_price_list = cart_quotation.get("selling_price_list") if cart_quotation else _set_price_list(cart_settings, None)
+	selling_price_list = (
+		cart_quotation.get("selling_price_list")
+		if cart_quotation
+		else _set_price_list(cart_settings, None)
+	)
 
 	price = {}
 	if cart_settings.show_price:
@@ -40,10 +41,7 @@
 		# If not logged in, check if price is hidden for guest.
 		if not is_guest or not cart_settings.hide_price_for_guest:
 			price = get_price(
-				item_code,
-				selling_price_list,
-				cart_settings.default_customer_group,
-				cart_settings.company
+				item_code, selling_price_list, cart_settings.default_customer_group, cart_settings.company
 			)
 
 	stock_status = None
@@ -59,7 +57,7 @@
 		"price": price,
 		"qty": 0,
 		"uom": frappe.db.get_value("Item", item_code, "stock_uom"),
-		"sales_uom": frappe.db.get_value("Item", item_code, "sales_uom")
+		"sales_uom": frappe.db.get_value("Item", item_code, "sales_uom"),
 	}
 
 	if stock_status:
@@ -67,7 +65,11 @@
 			product_info["on_backorder"] = True
 		else:
 			product_info["stock_qty"] = stock_status.stock_qty
-			product_info["in_stock"] = stock_status.in_stock if stock_status.is_stock_item else get_non_stock_item_status(item_code, "website_warehouse")
+			product_info["in_stock"] = (
+				stock_status.in_stock
+				if stock_status.is_stock_item
+				else get_non_stock_item_status(item_code, "website_warehouse")
+			)
 			product_info["show_stock_qty"] = show_quantity_in_website()
 
 	if product_info["price"]:
@@ -76,14 +78,14 @@
 			if item:
 				product_info["qty"] = item[0].qty
 
-	return frappe._dict({
-		"product_info": product_info,
-		"cart_settings": cart_settings
-	})
+	return frappe._dict({"product_info": product_info, "cart_settings": cart_settings})
+
 
 def set_product_info_for_website(item):
 	"""set product price uom for website"""
-	product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get("product_info")
+	product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get(
+		"product_info"
+	)
 
 	if product_info:
 		item.update(product_info)
diff --git a/erpnext/e_commerce/shopping_cart/test_shopping_cart.py b/erpnext/e_commerce/shopping_cart/test_shopping_cart.py
index 4a3787a..437ebea 100644
--- a/erpnext/e_commerce/shopping_cart/test_shopping_cart.py
+++ b/erpnext/e_commerce/shopping_cart/test_shopping_cart.py
@@ -22,18 +22,19 @@
 
 class TestShoppingCart(unittest.TestCase):
 	"""
-		Note:
-		Shopping Cart == Quotation
+	Note:
+	Shopping Cart == Quotation
 	"""
+
 	def setUp(self):
 		frappe.set_user("Administrator")
 		create_test_contact_and_address()
 		self.enable_shopping_cart()
 		if not frappe.db.exists("Website Item", {"item_code": "_Test Item"}):
-			make_website_item(frappe.get_cached_doc("Item",  "_Test Item"))
+			make_website_item(frappe.get_cached_doc("Item", "_Test Item"))
 
 		if not frappe.db.exists("Website Item", {"item_code": "_Test Item 2"}):
-			make_website_item(frappe.get_cached_doc("Item",  "_Test Item 2"))
+			make_website_item(frappe.get_cached_doc("Item", "_Test Item 2"))
 
 	def tearDown(self):
 		frappe.db.rollback()
@@ -50,8 +51,10 @@
 		# test if lead is created and quotation with new lead is fetched
 		quotation = _get_cart_quotation()
 		self.assertEqual(quotation.quotation_to, "Customer")
-		self.assertEqual(quotation.contact_person,
-			frappe.db.get_value("Contact", dict(email_id="test_cart_user@example.com")))
+		self.assertEqual(
+			quotation.contact_person,
+			frappe.db.get_value("Contact", dict(email_id="test_cart_user@example.com")),
+		)
 		self.assertEqual(quotation.contact_email, frappe.session.user)
 
 		return quotation
@@ -65,7 +68,9 @@
 			self.assertEqual(quotation.contact_email, frappe.session.user)
 			return quotation
 
-		self.login_as_customer("test_contact_two_customer@example.com", "_Test Contact 2 For _Test Customer")
+		self.login_as_customer(
+			"test_contact_two_customer@example.com", "_Test Contact 2 For _Test Customer"
+		)
 		validate_quotation()
 
 		self.login_as_customer()
@@ -131,46 +136,55 @@
 
 		from erpnext.accounts.party import set_taxes
 
-		tax_rule_master = set_taxes(quotation.party_name, "Customer",
-			quotation.transaction_date, quotation.company, customer_group=None, supplier_group=None,
-			tax_category=quotation.tax_category, billing_address=quotation.customer_address,
-			shipping_address=quotation.shipping_address_name, use_for_shopping_cart=1)
+		tax_rule_master = set_taxes(
+			quotation.party_name,
+			"Customer",
+			quotation.transaction_date,
+			quotation.company,
+			customer_group=None,
+			supplier_group=None,
+			tax_category=quotation.tax_category,
+			billing_address=quotation.customer_address,
+			shipping_address=quotation.shipping_address_name,
+			use_for_shopping_cart=1,
+		)
 
 		self.assertEqual(quotation.taxes_and_charges, tax_rule_master)
 		self.assertEqual(quotation.total_taxes_and_charges, 1000.0)
 
 		self.remove_test_quotation(quotation)
 
-	@change_settings("E Commerce Settings",{
-		"company": "_Test Company",
-		"enabled": 1,
-		"default_customer_group": "_Test Customer Group",
-		"price_list": "_Test Price List India",
-		"show_price": 1
-	})
+	@change_settings(
+		"E Commerce Settings",
+		{
+			"company": "_Test Company",
+			"enabled": 1,
+			"default_customer_group": "_Test Customer Group",
+			"price_list": "_Test Price List India",
+			"show_price": 1,
+		},
+	)
 	def test_add_item_variant_without_web_item_to_cart(self):
 		"Test adding Variants having no Website Items in cart via Template Web Item."
 		from erpnext.controllers.item_variant import create_variant
 		from erpnext.e_commerce.doctype.website_item.website_item import make_website_item
 		from erpnext.stock.doctype.item.test_item import make_item
 
-		template_item = make_item("Test-Tshirt-Temp", {
-			"has_variant": 1,
-			"variant_based_on": "Item Attribute",
-			"attributes": [
-				{"attribute": "Test Size"},
-				{"attribute": "Test Colour"}
-			]
-		})
-		variant = create_variant("Test-Tshirt-Temp", {
-			"Test Size": "Small", "Test Colour": "Red"
-		})
+		template_item = make_item(
+			"Test-Tshirt-Temp",
+			{
+				"has_variant": 1,
+				"variant_based_on": "Item Attribute",
+				"attributes": [{"attribute": "Test Size"}, {"attribute": "Test Colour"}],
+			},
+		)
+		variant = create_variant("Test-Tshirt-Temp", {"Test Size": "Small", "Test Colour": "Red"})
 		variant.save()
-		make_website_item(template_item) # publish template not variant
+		make_website_item(template_item)  # publish template not variant
 
 		update_cart("Test-Tshirt-Temp-S-R", 1)
 
-		cart = get_cart_quotation() # test if cart page gets data without errors
+		cart = get_cart_quotation()  # test if cart page gets data without errors
 		doc = cart.get("doc")
 
 		self.assertEqual(doc.get("items")[0].item_name, "Test-Tshirt-Temp-S-R")
@@ -178,16 +192,14 @@
 		# test if items are rendered without error
 		frappe.render_template("templates/includes/cart/cart_items.html", cart)
 
-	@change_settings("E Commerce Settings",{
-		"save_quotations_as_draft": 1
-	})
+	@change_settings("E Commerce Settings", {"save_quotations_as_draft": 1})
 	def test_cart_without_checkout_and_draft_quotation(self):
 		"Test impact of 'save_quotations_as_draft' checkbox."
 		frappe.local.shopping_cart_settings = None
 
 		# add item to cart
 		update_cart("_Test Item", 1)
-		quote_name = request_for_quotation() # Request for Quote
+		quote_name = request_for_quotation()  # Request for Quote
 		quote_doctstatus = cint(frappe.db.get_value("Quotation", quote_name, "docstatus"))
 
 		self.assertEqual(quote_doctstatus, 0)
@@ -195,7 +207,7 @@
 		frappe.db.set_value("E Commerce Settings", None, "save_quotations_as_draft", 0)
 		frappe.local.shopping_cart_settings = None
 		update_cart("_Test Item", 1)
-		quote_name = request_for_quotation() # Request for Quote
+		quote_name = request_for_quotation()  # Request for Quote
 		quote_doctstatus = cint(frappe.db.get_value("Quotation", quote_name, "docstatus"))
 
 		self.assertEqual(quote_doctstatus, 1)
@@ -219,16 +231,13 @@
 			"contact_email": frappe.session.user,
 			"selling_price_list": "_Test Price List Rest of the World",
 			"currency": "USD",
-			"taxes_and_charges" : "_Test Tax 1 - _TC",
-			"conversion_rate":1,
-			"transaction_date" : nowdate(),
-			"valid_till" : add_months(nowdate(), 1),
-			"items": [{
-				"item_code": "_Test Item",
-				"qty": 1
-			}],
+			"taxes_and_charges": "_Test Tax 1 - _TC",
+			"conversion_rate": 1,
+			"transaction_date": nowdate(),
+			"valid_till": add_months(nowdate(), 1),
+			"items": [{"item_code": "_Test Item", "qty": 1}],
 			"taxes": frappe.get_doc("Sales Taxes and Charges Template", "_Test Tax 1 - _TC").taxes,
-			"company": "_Test Company"
+			"company": "_Test Company",
 		}
 
 		quotation.update(values)
@@ -245,29 +254,36 @@
 	def enable_shopping_cart(self):
 		settings = frappe.get_doc("E Commerce Settings", "E Commerce Settings")
 
-		settings.update({
-			"enabled": 1,
-			"company": "_Test Company",
-			"default_customer_group": "_Test Customer Group",
-			"quotation_series": "_T-Quotation-",
-			"price_list": "_Test Price List India"
-		})
+		settings.update(
+			{
+				"enabled": 1,
+				"company": "_Test Company",
+				"default_customer_group": "_Test Customer Group",
+				"quotation_series": "_T-Quotation-",
+				"price_list": "_Test Price List India",
+			}
+		)
 
 		# insert item price
-		if not frappe.db.get_value("Item Price", {"price_list":  "_Test Price List India",
-			"item_code": "_Test Item"}):
-			frappe.get_doc({
-				"doctype": "Item Price",
-				"price_list": "_Test Price List India",
-				"item_code": "_Test Item",
-				"price_list_rate": 10
-			}).insert()
-			frappe.get_doc({
-				"doctype": "Item Price",
-				"price_list": "_Test Price List India",
-				"item_code": "_Test Item 2",
-				"price_list_rate": 20
-			}).insert()
+		if not frappe.db.get_value(
+			"Item Price", {"price_list": "_Test Price List India", "item_code": "_Test Item"}
+		):
+			frappe.get_doc(
+				{
+					"doctype": "Item Price",
+					"price_list": "_Test Price List India",
+					"item_code": "_Test Item",
+					"price_list_rate": 10,
+				}
+			).insert()
+			frappe.get_doc(
+				{
+					"doctype": "Item Price",
+					"price_list": "_Test Price List India",
+					"item_code": "_Test Item 2",
+					"price_list_rate": 20,
+				}
+			).insert()
 
 		settings.save()
 		frappe.local.shopping_cart_settings = None
@@ -282,31 +298,49 @@
 		self.create_user_if_not_exists("test_cart_user@example.com")
 		frappe.set_user("test_cart_user@example.com")
 
-	def login_as_customer(self, email="test_contact_customer@example.com", name="_Test Contact For _Test Customer"):
+	def login_as_customer(
+		self, email="test_contact_customer@example.com", name="_Test Contact For _Test Customer"
+	):
 		self.create_user_if_not_exists(email, name)
 		frappe.set_user(email)
 
 	def clear_existing_quotations(self):
-		quotations = frappe.get_all("Quotation", filters={
-			"party_name": get_party().name,
-			"order_type": "Shopping Cart",
-			"docstatus": 0
-		}, order_by="modified desc", pluck="name")
+		quotations = frappe.get_all(
+			"Quotation",
+			filters={"party_name": get_party().name, "order_type": "Shopping Cart", "docstatus": 0},
+			order_by="modified desc",
+			pluck="name",
+		)
 
 		for quotation in quotations:
 			frappe.delete_doc("Quotation", quotation, ignore_permissions=True, force=True)
 
-	def create_user_if_not_exists(self, email, first_name = None):
+	def create_user_if_not_exists(self, email, first_name=None):
 		if frappe.db.exists("User", email):
 			return
 
-		frappe.get_doc({
-			"doctype": "User",
-			"user_type": "Website User",
-			"email": email,
-			"send_welcome_email": 0,
-			"first_name": first_name or email.split("@")[0]
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "User",
+				"user_type": "Website User",
+				"email": email,
+				"send_welcome_email": 0,
+				"first_name": first_name or email.split("@")[0],
+			}
+		).insert(ignore_permissions=True)
 
-test_dependencies = ["Sales Taxes and Charges Template", "Price List", "Item Price", "Shipping Rule", "Currency Exchange",
-	"Customer Group", "Lead", "Customer", "Contact", "Address", "Item", "Tax Rule"]
+
+test_dependencies = [
+	"Sales Taxes and Charges Template",
+	"Price List",
+	"Item Price",
+	"Shipping Rule",
+	"Currency Exchange",
+	"Customer Group",
+	"Lead",
+	"Customer",
+	"Contact",
+	"Address",
+	"Item",
+	"Tax Rule",
+]
diff --git a/erpnext/e_commerce/shopping_cart/utils.py b/erpnext/e_commerce/shopping_cart/utils.py
index e9745a4..3d48c28 100644
--- a/erpnext/e_commerce/shopping_cart/utils.py
+++ b/erpnext/e_commerce/shopping_cart/utils.py
@@ -6,12 +6,15 @@
 
 
 def show_cart_count():
-	if (is_cart_enabled() and
-		frappe.db.get_value("User", frappe.session.user, "user_type") == "Website User"):
+	if (
+		is_cart_enabled()
+		and frappe.db.get_value("User", frappe.session.user, "user_type") == "Website User"
+	):
 		return True
 
 	return False
 
+
 def set_cart_count(login_manager):
 	# since this is run only on hooks login event
 	# make sure user is already a customer
@@ -28,21 +31,24 @@
 		# cart count is calculated from this quotation's items
 		set_cart_count()
 
+
 def clear_cart_count(login_manager):
 	if show_cart_count():
 		frappe.local.cookie_manager.delete_cookie("cart_count")
 
+
 def update_website_context(context):
 	cart_enabled = is_cart_enabled()
 	context["shopping_cart_enabled"] = cart_enabled
 
+
 def is_customer():
 	if frappe.session.user and frappe.session.user != "Guest":
 		contact_name = frappe.get_value("Contact", {"email_id": frappe.session.user})
 		if contact_name:
-			contact = frappe.get_doc('Contact', contact_name)
+			contact = frappe.get_doc("Contact", contact_name)
 			for link in contact.links:
-				if link.link_doctype == 'Customer':
+				if link.link_doctype == "Customer":
 					return True
 
 		return False
diff --git a/erpnext/e_commerce/variant_selector/item_variants_cache.py b/erpnext/e_commerce/variant_selector/item_variants_cache.py
index 3107c01..f8439d5 100644
--- a/erpnext/e_commerce/variant_selector/item_variants_cache.py
+++ b/erpnext/e_commerce/variant_selector/item_variants_cache.py
@@ -6,63 +6,60 @@
 		self.item_code = item_code
 
 	def get_item_variants_data(self):
-		val = frappe.cache().hget('item_variants_data', self.item_code)
+		val = frappe.cache().hget("item_variants_data", self.item_code)
 
 		if not val:
 			self.build_cache()
 
-		return frappe.cache().hget('item_variants_data', self.item_code)
-
+		return frappe.cache().hget("item_variants_data", self.item_code)
 
 	def get_attribute_value_item_map(self):
-		val = frappe.cache().hget('attribute_value_item_map', self.item_code)
+		val = frappe.cache().hget("attribute_value_item_map", self.item_code)
 
 		if not val:
 			self.build_cache()
 
-		return frappe.cache().hget('attribute_value_item_map', self.item_code)
-
+		return frappe.cache().hget("attribute_value_item_map", self.item_code)
 
 	def get_item_attribute_value_map(self):
-		val = frappe.cache().hget('item_attribute_value_map', self.item_code)
+		val = frappe.cache().hget("item_attribute_value_map", self.item_code)
 
 		if not val:
 			self.build_cache()
 
-		return frappe.cache().hget('item_attribute_value_map', self.item_code)
-
+		return frappe.cache().hget("item_attribute_value_map", self.item_code)
 
 	def get_optional_attributes(self):
-		val = frappe.cache().hget('optional_attributes', self.item_code)
+		val = frappe.cache().hget("optional_attributes", self.item_code)
 
 		if not val:
 			self.build_cache()
 
-		return frappe.cache().hget('optional_attributes', self.item_code)
+		return frappe.cache().hget("optional_attributes", self.item_code)
 
 	def get_ordered_attribute_values(self):
-		val = frappe.cache().get_value('ordered_attribute_values_map')
-		if val: return val
+		val = frappe.cache().get_value("ordered_attribute_values_map")
+		if val:
+			return val
 
-		all_attribute_values = frappe.get_all('Item Attribute Value',
-			['attribute_value', 'idx', 'parent'], order_by='idx asc')
+		all_attribute_values = frappe.get_all(
+			"Item Attribute Value", ["attribute_value", "idx", "parent"], order_by="idx asc"
+		)
 
 		ordered_attribute_values_map = frappe._dict({})
 		for d in all_attribute_values:
 			ordered_attribute_values_map.setdefault(d.parent, []).append(d.attribute_value)
 
-		frappe.cache().set_value('ordered_attribute_values_map', ordered_attribute_values_map)
+		frappe.cache().set_value("ordered_attribute_values_map", ordered_attribute_values_map)
 		return ordered_attribute_values_map
 
 	def build_cache(self):
 		parent_item_code = self.item_code
 
 		attributes = [
-			a.attribute for a in frappe.get_all(
-				'Item Variant Attribute',
-				{'parent': parent_item_code},
-				['attribute'],
-				order_by='idx asc'
+			a.attribute
+			for a in frappe.get_all(
+				"Item Variant Attribute", {"parent": parent_item_code}, ["attribute"], order_by="idx asc"
 			)
 		]
 
@@ -71,13 +68,11 @@
 		item = frappe.qb.DocType("Item")
 		query = (
 			frappe.qb.from_(iva)
-			.join(item).on(item.name == iva.parent)
-			.select(
-				iva.parent, iva.attribute, iva.attribute_value
-			).where(
-				(iva.variant_of == parent_item_code)
-				& (item.disabled == 0)
-			).orderby(iva.name)
+			.join(item)
+			.on(item.name == iva.parent)
+			.select(iva.parent, iva.attribute, iva.attribute_value)
+			.where((iva.variant_of == parent_item_code) & (item.disabled == 0))
+			.orderby(iva.name)
 		)
 		item_variants_data = query.run()
 
@@ -97,13 +92,18 @@
 				if attribute not in attr_dict:
 					optional_attributes.add(attribute)
 
-		frappe.cache().hset('attribute_value_item_map', parent_item_code, attribute_value_item_map)
-		frappe.cache().hset('item_attribute_value_map', parent_item_code, item_attribute_value_map)
-		frappe.cache().hset('item_variants_data', parent_item_code, item_variants_data)
-		frappe.cache().hset('optional_attributes', parent_item_code, optional_attributes)
+		frappe.cache().hset("attribute_value_item_map", parent_item_code, attribute_value_item_map)
+		frappe.cache().hset("item_attribute_value_map", parent_item_code, item_attribute_value_map)
+		frappe.cache().hset("item_variants_data", parent_item_code, item_variants_data)
+		frappe.cache().hset("optional_attributes", parent_item_code, optional_attributes)
 
 	def clear_cache(self):
-		keys = ['attribute_value_item_map', 'item_attribute_value_map', 'item_variants_data', 'optional_attributes']
+		keys = [
+			"attribute_value_item_map",
+			"item_attribute_value_map",
+			"item_variants_data",
+			"optional_attributes",
+		]
 
 		for key in keys:
 			frappe.cache().hdel(key, self.item_code)
@@ -114,15 +114,17 @@
 
 
 def build_cache(item_code):
-	frappe.cache().hset('item_cache_build_in_progress', item_code, 1)
+	frappe.cache().hset("item_cache_build_in_progress", item_code, 1)
 	i = ItemVariantsCacheManager(item_code)
 	i.build_cache()
-	frappe.cache().hset('item_cache_build_in_progress', item_code, 0)
+	frappe.cache().hset("item_cache_build_in_progress", item_code, 0)
+
 
 def enqueue_build_cache(item_code):
-	if frappe.cache().hget('item_cache_build_in_progress', item_code):
+	if frappe.cache().hget("item_cache_build_in_progress", item_code):
 		return
 	frappe.enqueue(
 		"erpnext.e_commerce.variant_selector.item_variants_cache.build_cache",
-		item_code=item_code, queue='long'
+		item_code=item_code,
+		queue="long",
 	)
diff --git a/erpnext/e_commerce/variant_selector/test_variant_selector.py b/erpnext/e_commerce/variant_selector/test_variant_selector.py
index 3eb75cb..8eb497c 100644
--- a/erpnext/e_commerce/variant_selector/test_variant_selector.py
+++ b/erpnext/e_commerce/variant_selector/test_variant_selector.py
@@ -11,41 +11,43 @@
 
 test_dependencies = ["Item"]
 
-class TestVariantSelector(FrappeTestCase):
 
+class TestVariantSelector(FrappeTestCase):
 	@classmethod
 	def setUpClass(cls):
 		super().setUpClass()
-		template_item = make_item("Test-Tshirt-Temp", {
-			"has_variant": 1,
-			"variant_based_on": "Item Attribute",
-			"attributes": [
-				{"attribute": "Test Size"},
-				{"attribute": "Test Colour"}
-			]
-		})
+		template_item = make_item(
+			"Test-Tshirt-Temp",
+			{
+				"has_variant": 1,
+				"variant_based_on": "Item Attribute",
+				"attributes": [{"attribute": "Test Size"}, {"attribute": "Test Colour"}],
+			},
+		)
 
 		# create L-R, L-G, M-R, M-G and S-R
-		for size in ("Large", "Medium",):
-			for colour in ("Red", "Green",):
-				variant = create_variant("Test-Tshirt-Temp", {
-					"Test Size": size, "Test Colour": colour
-				})
+		for size in (
+			"Large",
+			"Medium",
+		):
+			for colour in (
+				"Red",
+				"Green",
+			):
+				variant = create_variant("Test-Tshirt-Temp", {"Test Size": size, "Test Colour": colour})
 				variant.save()
 
-		variant = create_variant("Test-Tshirt-Temp", {
-			"Test Size": "Small", "Test Colour": "Red"
-		})
+		variant = create_variant("Test-Tshirt-Temp", {"Test Size": "Small", "Test Colour": "Red"})
 		variant.save()
 
-		make_website_item(template_item) # publish template not variants
+		make_website_item(template_item)  # publish template not variants
 
 	def test_item_attributes(self):
 		"""
-			Test if the right attributes are fetched in the popup.
-			(Attributes must only come from active items)
+		Test if the right attributes are fetched in the popup.
+		(Attributes must only come from active items)
 
-			Attribute selection must not be linked to Website Items.
+		Attribute selection must not be linked to Website Items.
 		"""
 		from erpnext.e_commerce.variant_selector.utils import get_attributes_and_values
 
@@ -53,14 +55,14 @@
 
 		self.assertEqual(attr_data[0]["attribute"], "Test Size")
 		self.assertEqual(attr_data[1]["attribute"], "Test Colour")
-		self.assertEqual(len(attr_data[0]["values"]), 3) # ['Small', 'Medium', 'Large']
-		self.assertEqual(len(attr_data[1]["values"]), 2) # ['Red', 'Green']
+		self.assertEqual(len(attr_data[0]["values"]), 3)  # ['Small', 'Medium', 'Large']
+		self.assertEqual(len(attr_data[1]["values"]), 2)  # ['Red', 'Green']
 
 		# disable small red tshirt, now there are no small tshirts.
 		# but there are some red tshirts
 		small_variant = frappe.get_doc("Item", "Test-Tshirt-Temp-S-R")
 		small_variant.disabled = 1
-		small_variant.save() # trigger cache rebuild
+		small_variant.save()  # trigger cache rebuild
 
 		attr_data = get_attributes_and_values("Test-Tshirt-Temp")
 
@@ -73,14 +75,16 @@
 
 	def test_next_item_variant_values(self):
 		"""
-			Test if on selecting an attribute value, the next possible values
-			are filtered accordingly.
-			Values that dont apply should not be fetched.
-			E.g.
-			There is a ** Small-Red ** Tshirt. No other colour in this size.
-			On selecting ** Small **, only ** Red ** should be selectable next.
+		Test if on selecting an attribute value, the next possible values
+		are filtered accordingly.
+		Values that dont apply should not be fetched.
+		E.g.
+		There is a ** Small-Red ** Tshirt. No other colour in this size.
+		On selecting ** Small **, only ** Red ** should be selectable next.
 		"""
-		next_values = get_next_attribute_and_values("Test-Tshirt-Temp", selected_attributes={"Test Size": "Small"})
+		next_values = get_next_attribute_and_values(
+			"Test-Tshirt-Temp", selected_attributes={"Test Size": "Small"}
+		)
 		next_colours = next_values["valid_options_for_attributes"]["Test Colour"]
 		filtered_items = next_values["filtered_items"]
 
@@ -91,30 +95,31 @@
 
 	def test_exact_match_with_price(self):
 		"""
-			Test price fetching and matching of variant without Website Item
+		Test price fetching and matching of variant without Website Item
 		"""
 		from erpnext.e_commerce.doctype.website_item.test_website_item import make_web_item_price
 
 		frappe.set_user("Administrator")
-		setup_e_commerce_settings({
-			"company": "_Test Company",
-			"enabled": 1,
-			"default_customer_group": "_Test Customer Group",
-			"price_list": "_Test Price List India",
-			"show_price": 1
-		})
+		setup_e_commerce_settings(
+			{
+				"company": "_Test Company",
+				"enabled": 1,
+				"default_customer_group": "_Test Customer Group",
+				"price_list": "_Test Price List India",
+				"show_price": 1,
+			}
+		)
 
 		make_web_item_price(item_code="Test-Tshirt-Temp-S-R", price_list_rate=100)
 
-		frappe.local.shopping_cart_settings = None # clear cached settings values
+		frappe.local.shopping_cart_settings = None  # clear cached settings values
 		next_values = get_next_attribute_and_values(
-			"Test-Tshirt-Temp",
-			selected_attributes={"Test Size": "Small", "Test Colour": "Red"}
+			"Test-Tshirt-Temp", selected_attributes={"Test Size": "Small", "Test Colour": "Red"}
 		)
 		print(">>>>", next_values)
 		price_info = next_values["product_info"]["price"]
 
-		self.assertEqual(next_values["exact_match"][0],"Test-Tshirt-Temp-S-R")
-		self.assertEqual(next_values["exact_match"][0],"Test-Tshirt-Temp-S-R")
+		self.assertEqual(next_values["exact_match"][0], "Test-Tshirt-Temp-S-R")
+		self.assertEqual(next_values["exact_match"][0], "Test-Tshirt-Temp-S-R")
 		self.assertEqual(price_info["price_list_rate"], 100.0)
 		self.assertEqual(price_info["formatted_price_sales_uom"], "₹ 100.00")
diff --git a/erpnext/e_commerce/variant_selector/utils.py b/erpnext/e_commerce/variant_selector/utils.py
index 3380273..df62c23 100644
--- a/erpnext/e_commerce/variant_selector/utils.py
+++ b/erpnext/e_commerce/variant_selector/utils.py
@@ -24,18 +24,18 @@
 		wheres = []
 		query_values = []
 		for attribute_value in attribute_values:
-			wheres.append('( attribute = %s and attribute_value = %s )')
+			wheres.append("( attribute = %s and attribute_value = %s )")
 			query_values += [attribute, attribute_value]
 
-		attribute_query = ' or '.join(wheres)
+		attribute_query = " or ".join(wheres)
 
 		if template_item_code:
-			variant_of_query = 'AND t2.variant_of = %s'
+			variant_of_query = "AND t2.variant_of = %s"
 			query_values.append(template_item_code)
 		else:
-			variant_of_query = ''
+			variant_of_query = ""
 
-		query = '''
+		query = """
 			SELECT
 				t1.parent
 			FROM
@@ -58,20 +58,23 @@
 				t1.parent
 			ORDER BY
 				NULL
-		'''.format(attribute_query=attribute_query, variant_of_query=variant_of_query)
+		""".format(
+			attribute_query=attribute_query, variant_of_query=variant_of_query
+		)
 
-		item_codes = set([r[0] for r in frappe.db.sql(query, query_values)]) # nosemgrep
+		item_codes = set([r[0] for r in frappe.db.sql(query, query_values)])  # nosemgrep
 		items.append(item_codes)
 
 	res = list(set.intersection(*items))
 
 	return res
 
+
 @frappe.whitelist(allow_guest=True)
 def get_attributes_and_values(item_code):
-	'''Build a list of attributes and their possible values.
+	"""Build a list of attributes and their possible values.
 	This will ignore the values upon selection of which there cannot exist one item.
-	'''
+	"""
 	item_cache = ItemVariantsCacheManager(item_code)
 	item_variants_data = item_cache.get_item_variants_data()
 
@@ -83,8 +86,9 @@
 		if attribute in attribute_list:
 			valid_options.setdefault(attribute, set()).add(attribute_value)
 
-	item_attribute_values = frappe.db.get_all('Item Attribute Value',
-		['parent', 'attribute_value', 'idx'], order_by='parent asc, idx asc')
+	item_attribute_values = frappe.db.get_all(
+		"Item Attribute Value", ["parent", "attribute_value", "idx"], order_by="parent asc, idx asc"
+	)
 	ordered_attribute_value_map = frappe._dict()
 	for iv in item_attribute_values:
 		ordered_attribute_value_map.setdefault(iv.parent, []).append(iv.attribute_value)
@@ -93,18 +97,18 @@
 	for attr in attributes:
 		valid_attribute_values = valid_options.get(attr.attribute, [])
 		ordered_values = ordered_attribute_value_map.get(attr.attribute, [])
-		attr['values'] = [v for v in ordered_values if v in valid_attribute_values]
+		attr["values"] = [v for v in ordered_values if v in valid_attribute_values]
 
 	return attributes
 
 
 @frappe.whitelist(allow_guest=True)
 def get_next_attribute_and_values(item_code, selected_attributes):
-	'''Find the count of Items that match the selected attributes.
+	"""Find the count of Items that match the selected attributes.
 	Also, find the attribute values that are not applicable for further searching.
 	If less than equal to 10 items are found, return item_codes of those items.
 	If one item is matched exactly, return item_code of that item.
-	'''
+	"""
 	selected_attributes = frappe.parse_json(selected_attributes)
 
 	item_cache = ItemVariantsCacheManager(item_code)
@@ -133,7 +137,11 @@
 
 	for row in item_variants_data:
 		item_code, attribute, attribute_value = row
-		if item_code in filtered_items and attribute not in selected_attributes and attribute in attribute_list:
+		if (
+			item_code in filtered_items
+			and attribute not in selected_attributes
+			and attribute in attribute_list
+		):
 			valid_options_for_attributes[attribute].add(attribute_value)
 
 	optional_attributes = item_cache.get_optional_attributes()
@@ -159,12 +167,12 @@
 		product_info = None
 
 	return {
-		'next_attribute': next_attribute,
-		'valid_options_for_attributes': valid_options_for_attributes,
-		'filtered_items_count': filtered_items_count,
-		'filtered_items': filtered_items if filtered_items_count < 10 else [],
-		'exact_match': exact_match,
-		'product_info': product_info
+		"next_attribute": next_attribute,
+		"valid_options_for_attributes": valid_options_for_attributes,
+		"filtered_items_count": filtered_items_count,
+		"filtered_items": filtered_items if filtered_items_count < 10 else [],
+		"exact_match": exact_match,
+		"product_info": product_info,
 	}
 
 
@@ -179,16 +187,16 @@
 
 	return set.intersection(*items)
 
+
 # utilities
 
+
 def get_item_attributes(item_code):
-	attributes = frappe.db.get_all('Item Variant Attribute',
-		fields=['attribute'],
-		filters={
-			'parenttype': 'Item',
-			'parent': item_code
-		},
-		order_by='idx asc'
+	attributes = frappe.db.get_all(
+		"Item Variant Attribute",
+		fields=["attribute"],
+		filters={"parenttype": "Item", "parent": item_code},
+		order_by="idx asc",
 	)
 
 	optional_attributes = ItemVariantsCacheManager(item_code).get_optional_attributes()
@@ -199,6 +207,7 @@
 
 	return attributes
 
+
 def get_item_variant_price_dict(item_code, cart_settings):
 	if cart_settings.enabled and cart_settings.show_price:
 		is_guest = frappe.session.user == "Guest"
@@ -207,12 +216,8 @@
 		if not is_guest or not cart_settings.hide_price_for_guest:
 			price_list = _set_price_list(cart_settings, None)
 			price = get_price(
-				item_code,
-				price_list,
-				cart_settings.default_customer_group,
-				cart_settings.company
+				item_code, price_list, cart_settings.default_customer_group, cart_settings.company
 			)
 			return {"price": price}
 
 	return None
-
diff --git a/erpnext/education/__init__.py b/erpnext/education/__init__.py
index 56c2b29..f6f84b3 100644
--- a/erpnext/education/__init__.py
+++ b/erpnext/education/__init__.py
@@ -2,10 +2,16 @@
 from frappe import _
 
 
-class StudentNotInGroupError(frappe.ValidationError): pass
+class StudentNotInGroupError(frappe.ValidationError):
+	pass
+
 
 def validate_student_belongs_to_group(student, student_group):
-	groups = frappe.db.get_all('Student Group Student', ['parent'], dict(student = student, active=1))
+	groups = frappe.db.get_all("Student Group Student", ["parent"], dict(student=student, active=1))
 	if not student_group in [d.parent for d in groups]:
-		frappe.throw(_('Student {0} does not belong to group {1}').format(frappe.bold(student), frappe.bold(student_group)),
-			StudentNotInGroupError)
+		frappe.throw(
+			_("Student {0} does not belong to group {1}").format(
+				frappe.bold(student), frappe.bold(student_group)
+			),
+			StudentNotInGroupError,
+		)
diff --git a/erpnext/education/api.py b/erpnext/education/api.py
index 636b948..8fd1725 100644
--- a/erpnext/education/api.py
+++ b/erpnext/education/api.py
@@ -12,11 +12,12 @@
 
 
 def get_course(program):
-	'''Return list of courses for a particular program
+	"""Return list of courses for a particular program
 	:param program: Program
-	'''
-	courses = frappe.db.sql('''select course, course_name from `tabProgram Course` where parent=%s''',
-			(program), as_dict=1)
+	"""
+	courses = frappe.db.sql(
+		"""select course, course_name from `tabProgram Course` where parent=%s""", (program), as_dict=1
+	)
 	return courses
 
 
@@ -26,24 +27,24 @@
 
 	:param source_name: Student Applicant.
 	"""
-	frappe.publish_realtime('enroll_student_progress', {"progress": [1, 4]}, user=frappe.session.user)
-	student = get_mapped_doc("Student Applicant", source_name,
-		{"Student Applicant": {
-			"doctype": "Student",
-			"field_map": {
-				"name": "student_applicant"
-			}
-		}}, ignore_permissions=True)
+	frappe.publish_realtime("enroll_student_progress", {"progress": [1, 4]}, user=frappe.session.user)
+	student = get_mapped_doc(
+		"Student Applicant",
+		source_name,
+		{"Student Applicant": {"doctype": "Student", "field_map": {"name": "student_applicant"}}},
+		ignore_permissions=True,
+	)
 	student.save()
 
-	student_applicant = frappe.db.get_value("Student Applicant", source_name,
-		["student_category", "program"], as_dict=True)
+	student_applicant = frappe.db.get_value(
+		"Student Applicant", source_name, ["student_category", "program"], as_dict=True
+	)
 	program_enrollment = frappe.new_doc("Program Enrollment")
 	program_enrollment.student = student.name
 	program_enrollment.student_category = student_applicant.student_category
 	program_enrollment.student_name = student.title
 	program_enrollment.program = student_applicant.program
-	frappe.publish_realtime('enroll_student_progress', {"progress": [2, 4]}, user=frappe.session.user)
+	frappe.publish_realtime("enroll_student_progress", {"progress": [2, 4]}, user=frappe.session.user)
 	return program_enrollment
 
 
@@ -58,11 +59,15 @@
 	if course_schedule:
 		return frappe.get_list("Student Attendance", filters={"course_schedule": course_schedule})
 	else:
-		return frappe.get_list("Student Attendance", filters={"student_group": student_group, "date": date})
+		return frappe.get_list(
+			"Student Attendance", filters={"student_group": student_group, "date": date}
+		)
 
 
 @frappe.whitelist()
-def mark_attendance(students_present, students_absent, course_schedule=None, student_group=None, date=None):
+def mark_attendance(
+	students_present, students_absent, course_schedule=None, student_group=None, date=None
+):
 	"""Creates Multiple Attendance Records.
 
 	:param students_present: Students Present JSON.
@@ -73,26 +78,36 @@
 	"""
 
 	if student_group:
-		academic_year = frappe.db.get_value('Student Group', student_group, 'academic_year')
+		academic_year = frappe.db.get_value("Student Group", student_group, "academic_year")
 		if academic_year:
-			year_start_date, year_end_date = frappe.db.get_value('Academic Year', academic_year, ['year_start_date', 'year_end_date'])
+			year_start_date, year_end_date = frappe.db.get_value(
+				"Academic Year", academic_year, ["year_start_date", "year_end_date"]
+			)
 			if getdate(date) < getdate(year_start_date) or getdate(date) > getdate(year_end_date):
-				frappe.throw(_('Attendance cannot be marked outside of Academic Year {0}').format(academic_year))
+				frappe.throw(
+					_("Attendance cannot be marked outside of Academic Year {0}").format(academic_year)
+				)
 
 	present = json.loads(students_present)
 	absent = json.loads(students_absent)
 
 	for d in present:
-		make_attendance_records(d["student"], d["student_name"], "Present", course_schedule, student_group, date)
+		make_attendance_records(
+			d["student"], d["student_name"], "Present", course_schedule, student_group, date
+		)
 
 	for d in absent:
-		make_attendance_records(d["student"], d["student_name"], "Absent", course_schedule, student_group, date)
+		make_attendance_records(
+			d["student"], d["student_name"], "Absent", course_schedule, student_group, date
+		)
 
 	frappe.db.commit()
 	frappe.msgprint(_("Attendance has been marked successfully."))
 
 
-def make_attendance_records(student, student_name, status, course_schedule=None, student_group=None, date=None):
+def make_attendance_records(
+	student, student_name, status, course_schedule=None, student_group=None, date=None
+):
 	"""Creates/Update Attendance Record.
 
 	:param student: Student.
@@ -100,13 +115,15 @@
 	:param course_schedule: Course Schedule.
 	:param status: Status (Present/Absent)
 	"""
-	student_attendance = frappe.get_doc({
-		"doctype": "Student Attendance",
-		"student": student,
-		"course_schedule": course_schedule,
-		"student_group": student_group,
-		"date": date
-	})
+	student_attendance = frappe.get_doc(
+		{
+			"doctype": "Student Attendance",
+			"student": student,
+			"course_schedule": course_schedule,
+			"student_group": student_group,
+			"date": date,
+		}
+	)
 	if not student_attendance:
 		student_attendance = frappe.new_doc("Student Attendance")
 	student_attendance.student = student
@@ -125,8 +142,7 @@
 
 	:param student: Student.
 	"""
-	guardians = frappe.get_all("Student Guardian", fields=["guardian"] ,
-		filters={"parent": student})
+	guardians = frappe.get_all("Student Guardian", fields=["guardian"], filters={"parent": student})
 	return guardians
 
 
@@ -137,11 +153,19 @@
 	:param student_group: Student Group.
 	"""
 	if include_inactive:
-		students = frappe.get_all("Student Group Student", fields=["student", "student_name"] ,
-			filters={"parent": student_group}, order_by= "group_roll_number")
+		students = frappe.get_all(
+			"Student Group Student",
+			fields=["student", "student_name"],
+			filters={"parent": student_group},
+			order_by="group_roll_number",
+		)
 	else:
-		students = frappe.get_all("Student Group Student", fields=["student", "student_name"] ,
-			filters={"parent": student_group, "active": 1}, order_by= "group_roll_number")
+		students = frappe.get_all(
+			"Student Group Student",
+			fields=["student", "student_name"],
+			filters={"parent": student_group, "active": 1},
+			order_by="group_roll_number",
+		)
 	return students
 
 
@@ -152,8 +176,9 @@
 	:param program: Program.
 	:param academic_term: Academic Term.
 	"""
-	fee_structure = frappe.db.get_values("Fee Structure", {"program": program,
-		"academic_term": academic_term}, 'name', as_dict=True)
+	fee_structure = frappe.db.get_values(
+		"Fee Structure", {"program": program, "academic_term": academic_term}, "name", as_dict=True
+	)
 	return fee_structure[0].name if fee_structure else None
 
 
@@ -164,7 +189,12 @@
 	:param fee_structure: Fee Structure.
 	"""
 	if fee_structure:
-		fs = frappe.get_all("Fee Component", fields=["fees_category", "description", "amount"] , filters={"parent": fee_structure}, order_by= "idx")
+		fs = frappe.get_all(
+			"Fee Component",
+			fields=["fees_category", "description", "amount"],
+			filters={"parent": fee_structure},
+			order_by="idx",
+		)
 		return fs
 
 
@@ -175,8 +205,12 @@
 	:param program: Program.
 	:param student_category: Student Category
 	"""
-	fs = frappe.get_all("Program Fee", fields=["academic_term", "fee_structure", "due_date", "amount"] ,
-		filters={"parent": program, "student_category": student_category }, order_by= "idx")
+	fs = frappe.get_all(
+		"Program Fee",
+		fields=["academic_term", "fee_structure", "due_date", "amount"],
+		filters={"parent": program, "student_category": student_category},
+		order_by="idx",
+	)
 	return fs
 
 
@@ -198,18 +232,23 @@
 	:param filters: Filters (JSON).
 	"""
 	from frappe.desk.calendar import get_event_conditions
+
 	conditions = get_event_conditions("Course Schedule", filters)
 
-	data = frappe.db.sql("""select name, course, color,
+	data = frappe.db.sql(
+		"""select name, course, color,
 			timestamp(schedule_date, from_time) as from_time,
 			timestamp(schedule_date, to_time) as to_time,
 			room, student_group, 0 as 'allDay'
 		from `tabCourse Schedule`
 		where ( schedule_date between %(start)s and %(end)s )
-		{conditions}""".format(conditions=conditions), {
-			"start": start,
-			"end": end
-			}, as_dict=True, update={"allDay": 0})
+		{conditions}""".format(
+			conditions=conditions
+		),
+		{"start": start, "end": end},
+		as_dict=True,
+		update={"allDay": 0},
+	)
 
 	return data
 
@@ -220,8 +259,12 @@
 
 	:param Course: Course
 	"""
-	return frappe.get_all("Course Assessment Criteria",
-		fields=["assessment_criteria", "weightage"], filters={"parent": course}, order_by= "idx")
+	return frappe.get_all(
+		"Course Assessment Criteria",
+		fields=["assessment_criteria", "weightage"],
+		filters={"parent": course},
+		order_by="idx",
+	)
 
 
 @frappe.whitelist()
@@ -233,17 +276,14 @@
 			student_result = {}
 			for d in result.details:
 				student_result.update({d.assessment_criteria: [cstr(d.score), d.grade]})
-			student_result.update({
-				"total_score": [cstr(result.total_score), result.grade],
-				"comment": result.comment
-			})
-			student.update({
-				"assessment_details": student_result,
-				"docstatus": result.docstatus,
-				"name": result.name
-			})
+			student_result.update(
+				{"total_score": [cstr(result.total_score), result.grade], "comment": result.comment}
+			)
+			student.update(
+				{"assessment_details": student_result, "docstatus": result.docstatus, "name": result.name}
+			)
 		else:
-			student.update({'assessment_details': None})
+			student.update({"assessment_details": None})
 	return student_list
 
 
@@ -253,8 +293,12 @@
 
 	:param Assessment Plan: Assessment Plan
 	"""
-	return frappe.get_all("Assessment Plan Criteria",
-		fields=["assessment_criteria", "maximum_score", "docstatus"], filters={"parent": assessment_plan}, order_by= "idx")
+	return frappe.get_all(
+		"Assessment Plan Criteria",
+		fields=["assessment_criteria", "maximum_score", "docstatus"],
+		filters={"parent": assessment_plan},
+		order_by="idx",
+	)
 
 
 @frappe.whitelist()
@@ -264,8 +308,10 @@
 	:param Student: Student
 	:param Assessment Plan: Assessment Plan
 	"""
-	results = frappe.get_all("Assessment Result", filters={"student": student,
-		"assessment_plan": assessment_plan, "docstatus": ("!=", 2)})
+	results = frappe.get_all(
+		"Assessment Result",
+		filters={"student": student, "assessment_plan": assessment_plan, "docstatus": ("!=", 2)},
+	)
 	if results:
 		return frappe.get_doc("Assessment Result", results[0])
 	else:
@@ -280,11 +326,13 @@
 	:param Percentage: Score Percentage Percentage
 	"""
 	grading_scale_intervals = {}
-	if not hasattr(frappe.local, 'grading_scale'):
-		grading_scale = frappe.get_all("Grading Scale Interval", fields=["grade_code", "threshold"], filters={"parent": grading_scale})
+	if not hasattr(frappe.local, "grading_scale"):
+		grading_scale = frappe.get_all(
+			"Grading Scale Interval", fields=["grade_code", "threshold"], filters={"parent": grading_scale}
+		)
 		frappe.local.grading_scale = grading_scale
 	for d in frappe.local.grading_scale:
-		grading_scale_intervals.update({d.threshold:d.grade_code})
+		grading_scale_intervals.update({d.threshold: d.grade_code})
 	intervals = sorted(grading_scale_intervals.keys(), key=float, reverse=True)
 	for interval in intervals:
 		if flt(percentage) >= interval:
@@ -297,21 +345,22 @@
 
 @frappe.whitelist()
 def mark_assessment_result(assessment_plan, scores):
-	student_score = json.loads(scores);
+	student_score = json.loads(scores)
 	assessment_details = []
 	for criteria in student_score.get("assessment_details"):
-		assessment_details.append({
-			"assessment_criteria": criteria,
-			"score": flt(student_score["assessment_details"][criteria])
-		})
+		assessment_details.append(
+			{"assessment_criteria": criteria, "score": flt(student_score["assessment_details"][criteria])}
+		)
 	assessment_result = get_assessment_result_doc(student_score["student"], assessment_plan)
-	assessment_result.update({
-		"student": student_score.get("student"),
-		"assessment_plan": assessment_plan,
-		"comment": student_score.get("comment"),
-		"total_score":student_score.get("total_score"),
-		"details": assessment_details
-	})
+	assessment_result.update(
+		{
+			"student": student_score.get("student"),
+			"assessment_plan": assessment_plan,
+			"comment": student_score.get("comment"),
+			"total_score": student_score.get("total_score"),
+			"details": assessment_details,
+		}
+	)
 	assessment_result.save()
 	details = {}
 	for d in assessment_result.details:
@@ -321,7 +370,7 @@
 		"student": assessment_result.student,
 		"total_score": assessment_result.total_score,
 		"grade": assessment_result.grade,
-		"details": details
+		"details": details,
 	}
 	return assessment_result_dict
 
@@ -332,15 +381,17 @@
 	student_list = get_student_group_students(student_group)
 	for i, student in enumerate(student_list):
 		doc = get_result(student.student, assessment_plan)
-		if doc and doc.docstatus==0:
+		if doc and doc.docstatus == 0:
 			total_result += 1
 			doc.submit()
 	return total_result
 
 
 def get_assessment_result_doc(student, assessment_plan):
-	assessment_result = frappe.get_all("Assessment Result", filters={"student": student,
-			"assessment_plan": assessment_plan, "docstatus": ("!=", 2)})
+	assessment_result = frappe.get_all(
+		"Assessment Result",
+		filters={"student": student, "assessment_plan": assessment_plan, "docstatus": ("!=", 2)},
+	)
 	if assessment_result:
 		doc = frappe.get_doc("Assessment Result", assessment_result[0])
 		if doc.docstatus == 0:
@@ -369,10 +420,12 @@
 				email_list.append(email)
 	add_subscribers(name, email_list)
 
+
 @frappe.whitelist()
 def get_current_enrollment(student, academic_year=None):
 	current_academic_year = academic_year or frappe.defaults.get_defaults().academic_year
-	program_enrollment_list = frappe.db.sql('''
+	program_enrollment_list = frappe.db.sql(
+		"""
 		select
 			name as program_enrollment, student_name, program, student_batch_name as student_batch,
 			student_category, academic_term, academic_year
@@ -380,7 +433,10 @@
 			`tabProgram Enrollment`
 		where
 			student = %s and academic_year = %s
-		order by creation''', (student, current_academic_year), as_dict=1)
+		order by creation""",
+		(student, current_academic_year),
+		as_dict=1,
+	)
 
 	if program_enrollment_list:
 		return program_enrollment_list[0]
diff --git a/erpnext/education/doctype/academic_term/academic_term.py b/erpnext/education/doctype/academic_term/academic_term.py
index 93861ca..b44fe99 100644
--- a/erpnext/education/doctype/academic_term/academic_term.py
+++ b/erpnext/education/doctype/academic_term/academic_term.py
@@ -9,32 +9,62 @@
 
 
 class AcademicTerm(Document):
-    def autoname(self):
-        self.name = self.academic_year + " ({})".format(self.term_name) if self.term_name else ""
+	def autoname(self):
+		self.name = self.academic_year + " ({})".format(self.term_name) if self.term_name else ""
 
-    def validate(self):
-        #Check if entry with same academic_year and the term_name already exists
-        validate_duplication(self)
-        self.title = self.academic_year + " ({})".format(self.term_name) if self.term_name else ""
+	def validate(self):
+		# Check if entry with same academic_year and the term_name already exists
+		validate_duplication(self)
+		self.title = self.academic_year + " ({})".format(self.term_name) if self.term_name else ""
 
-        #Check that start of academic year is earlier than end of academic year
-        if self.term_start_date and self.term_end_date \
-				and getdate(self.term_start_date) > getdate(self.term_end_date):
-            frappe.throw(_("The Term End Date cannot be earlier than the Term Start Date. Please correct the dates and try again."))
+		# Check that start of academic year is earlier than end of academic year
+		if (
+			self.term_start_date
+			and self.term_end_date
+			and getdate(self.term_start_date) > getdate(self.term_end_date)
+		):
+			frappe.throw(
+				_(
+					"The Term End Date cannot be earlier than the Term Start Date. Please correct the dates and try again."
+				)
+			)
 
-        # Check that the start of the term is not before the start of the academic year
+		# Check that the start of the term is not before the start of the academic year
 		# and end of term is not after the end of the academic year"""
 
-        year = frappe.get_doc("Academic Year",self.academic_year)
-        if self.term_start_date and getdate(year.year_start_date) and (getdate(self.term_start_date) < getdate(year.year_start_date)):
-            frappe.throw(_("The Term Start Date cannot be earlier than the Year Start Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again.").format(self.academic_year))
+		year = frappe.get_doc("Academic Year", self.academic_year)
+		if (
+			self.term_start_date
+			and getdate(year.year_start_date)
+			and (getdate(self.term_start_date) < getdate(year.year_start_date))
+		):
+			frappe.throw(
+				_(
+					"The Term Start Date cannot be earlier than the Year Start Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again."
+				).format(self.academic_year)
+			)
 
-        if self.term_end_date and getdate(year.year_end_date) and (getdate(self.term_end_date) > getdate(year.year_end_date)):
-            frappe.throw(_("The Term End Date cannot be later than the Year End Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again.").format(self.academic_year))
+		if (
+			self.term_end_date
+			and getdate(year.year_end_date)
+			and (getdate(self.term_end_date) > getdate(year.year_end_date))
+		):
+			frappe.throw(
+				_(
+					"The Term End Date cannot be later than the Year End Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again."
+				).format(self.academic_year)
+			)
 
 
 def validate_duplication(self):
-    term = frappe.db.sql("""select name from `tabAcademic Term` where academic_year= %s and term_name= %s
-    and docstatus<2 and name != %s""", (self.academic_year, self.term_name, self.name))
-    if term:
-        frappe.throw(_("An academic term with this 'Academic Year' {0} and 'Term Name' {1} already exists. Please modify these entries and try again.").format(self.academic_year,self.term_name))
+	term = frappe.db.sql(
+		"""select name from `tabAcademic Term` where academic_year= %s and term_name= %s
+    and docstatus<2 and name != %s""",
+		(self.academic_year, self.term_name, self.name),
+	)
+	if term:
+		frappe.throw(
+			_(
+				"An academic term with this 'Academic Year' {0} and 'Term Name' {1} already exists. Please modify these entries and try again."
+			).format(self.academic_year, self.term_name)
+		)
diff --git a/erpnext/education/doctype/academic_term/academic_term_dashboard.py b/erpnext/education/doctype/academic_term/academic_term_dashboard.py
index c686b09..348c04d 100644
--- a/erpnext/education/doctype/academic_term/academic_term_dashboard.py
+++ b/erpnext/education/doctype/academic_term/academic_term_dashboard.py
@@ -3,23 +3,11 @@
 
 def get_data():
 	return {
-		'fieldname': 'academic_term',
-		'transactions': [
-			{
-				'label': _('Student'),
-				'items': ['Student Applicant', 'Student Group', 'Student Log']
-			},
-			{
-				'label': _('Fee'),
-				'items': ['Fees', 'Fee Schedule', 'Fee Structure']
-			},
-			{
-				'label': _('Program'),
-				'items': ['Program Enrollment']
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			}
-		]
+		"fieldname": "academic_term",
+		"transactions": [
+			{"label": _("Student"), "items": ["Student Applicant", "Student Group", "Student Log"]},
+			{"label": _("Fee"), "items": ["Fees", "Fee Schedule", "Fee Structure"]},
+			{"label": _("Program"), "items": ["Program Enrollment"]},
+			{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
+		],
 	}
diff --git a/erpnext/education/doctype/academic_term/test_academic_term.py b/erpnext/education/doctype/academic_term/test_academic_term.py
index 0e39fb0..b4516b3 100644
--- a/erpnext/education/doctype/academic_term/test_academic_term.py
+++ b/erpnext/education/doctype/academic_term/test_academic_term.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Academic Term')
 
+
 class TestAcademicTerm(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/academic_year/academic_year.py b/erpnext/education/doctype/academic_year/academic_year.py
index e2010fb..2a0438b 100644
--- a/erpnext/education/doctype/academic_year/academic_year.py
+++ b/erpnext/education/doctype/academic_year/academic_year.py
@@ -8,7 +8,11 @@
 
 
 class AcademicYear(Document):
-    def validate(self):
-        #Check that start of academic year is earlier than end of academic year
-        if self.year_start_date and self.year_end_date and self.year_start_date > self.year_end_date:
-            frappe.throw(_("The Year End Date cannot be earlier than the Year Start Date. Please correct the dates and try again."))
+	def validate(self):
+		# Check that start of academic year is earlier than end of academic year
+		if self.year_start_date and self.year_end_date and self.year_start_date > self.year_end_date:
+			frappe.throw(
+				_(
+					"The Year End Date cannot be earlier than the Year Start Date. Please correct the dates and try again."
+				)
+			)
diff --git a/erpnext/education/doctype/academic_year/academic_year_dashboard.py b/erpnext/education/doctype/academic_year/academic_year_dashboard.py
index ede2411..c69c970 100644
--- a/erpnext/education/doctype/academic_year/academic_year_dashboard.py
+++ b/erpnext/education/doctype/academic_year/academic_year_dashboard.py
@@ -3,23 +3,14 @@
 
 def get_data():
 	return {
-		'fieldname': 'academic_year',
-		'transactions': [
+		"fieldname": "academic_year",
+		"transactions": [
 			{
-				'label': _('Student'),
-				'items': ['Student Admission', 'Student Applicant', 'Student Group', 'Student Log']
+				"label": _("Student"),
+				"items": ["Student Admission", "Student Applicant", "Student Group", "Student Log"],
 			},
-			{
-				'label': _('Fee'),
-				'items': ['Fees', 'Fee Schedule', 'Fee Structure']
-			},
-			{
-				'label': _('Academic Term and Program'),
-				'items': ['Academic Term', 'Program Enrollment']
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			}
-		]
+			{"label": _("Fee"), "items": ["Fees", "Fee Schedule", "Fee Structure"]},
+			{"label": _("Academic Term and Program"), "items": ["Academic Term", "Program Enrollment"]},
+			{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
+		],
 	}
diff --git a/erpnext/education/doctype/academic_year/test_academic_year.py b/erpnext/education/doctype/academic_year/test_academic_year.py
index 6d33fe6..e51cd0e 100644
--- a/erpnext/education/doctype/academic_year/test_academic_year.py
+++ b/erpnext/education/doctype/academic_year/test_academic_year.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Academic Year')
 
+
 class TestAcademicYear(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/article/article.py b/erpnext/education/doctype/article/article.py
index 8f1a2e3..12b6618 100644
--- a/erpnext/education/doctype/article/article.py
+++ b/erpnext/education/doctype/article/article.py
@@ -10,11 +10,12 @@
 	def get_article(self):
 		pass
 
+
 @frappe.whitelist()
 def get_topics_without_article(article):
 	data = []
-	for entry in frappe.db.get_all('Topic'):
-		topic = frappe.get_doc('Topic', entry.name)
+	for entry in frappe.db.get_all("Topic"):
+		topic = frappe.get_doc("Topic", entry.name)
 		topic_contents = [tc.content for tc in topic.topic_content]
 		if not topic_contents or article not in topic_contents:
 			data.append(topic.name)
diff --git a/erpnext/education/doctype/assessment_criteria/assessment_criteria.py b/erpnext/education/doctype/assessment_criteria/assessment_criteria.py
index 58448ea..ef9692a 100644
--- a/erpnext/education/doctype/assessment_criteria/assessment_criteria.py
+++ b/erpnext/education/doctype/assessment_criteria/assessment_criteria.py
@@ -8,6 +8,7 @@
 
 STD_CRITERIA = ["total", "total score", "total grade", "maximum score", "score", "grade"]
 
+
 class AssessmentCriteria(Document):
 	def validate(self):
 		if self.assessment_criteria.lower() in STD_CRITERIA:
diff --git a/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py
index 40ba0e7..90ff575 100644
--- a/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py
+++ b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Assessment Criteria')
 
+
 class TestAssessmentCriteria(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py
index ccf82ba..b52aef8 100644
--- a/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py
+++ b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Assessment Criteria Group')
 
+
 class TestAssessmentCriteriaGroup(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py b/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py
index 9568091..7c75100 100644
--- a/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py
+++ b/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py
@@ -6,11 +6,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'assessment_group',
-		'transactions': [
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			}
-		]
+		"fieldname": "assessment_group",
+		"transactions": [{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]}],
 	}
diff --git a/erpnext/education/doctype/assessment_group/test_assessment_group.py b/erpnext/education/doctype/assessment_group/test_assessment_group.py
index 6e840aa..6f05caa 100644
--- a/erpnext/education/doctype/assessment_group/test_assessment_group.py
+++ b/erpnext/education/doctype/assessment_group/test_assessment_group.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Assessment Group')
 
+
 class TestAssessmentGroup(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/assessment_plan/assessment_plan.py b/erpnext/education/doctype/assessment_plan/assessment_plan.py
index 82a28de..e1265b4 100644
--- a/erpnext/education/doctype/assessment_plan/assessment_plan.py
+++ b/erpnext/education/doctype/assessment_plan/assessment_plan.py
@@ -18,14 +18,14 @@
 
 		from erpnext.education.utils import validate_overlap_for
 
-		#Validate overlapping course schedules.
+		# Validate overlapping course schedules.
 		if self.student_group:
 			validate_overlap_for(self, "Course Schedule", "student_group")
 
 		validate_overlap_for(self, "Course Schedule", "instructor")
 		validate_overlap_for(self, "Course Schedule", "room")
 
-		#validate overlapping assessment schedules.
+		# validate overlapping assessment schedules.
 		if self.student_group:
 			validate_overlap_for(self, "Assessment Plan", "student_group")
 
@@ -37,14 +37,24 @@
 		for d in self.assessment_criteria:
 			max_score += d.maximum_score
 		if self.maximum_assessment_score != max_score:
-			frappe.throw(_("Sum of Scores of Assessment Criteria needs to be {0}.").format(self.maximum_assessment_score))
+			frappe.throw(
+				_("Sum of Scores of Assessment Criteria needs to be {0}.").format(
+					self.maximum_assessment_score
+				)
+			)
 
 	def validate_assessment_criteria(self):
-		assessment_criteria_list = frappe.db.sql_list(''' select apc.assessment_criteria
+		assessment_criteria_list = frappe.db.sql_list(
+			""" select apc.assessment_criteria
 			from `tabAssessment Plan` ap , `tabAssessment Plan Criteria` apc
 			where ap.name = apc.parent and ap.course=%s and ap.student_group=%s and ap.assessment_group=%s
-			and ap.name != %s and ap.docstatus=1''', (self.course, self.student_group, self.assessment_group, self.name))
+			and ap.name != %s and ap.docstatus=1""",
+			(self.course, self.student_group, self.assessment_group, self.name),
+		)
 		for d in self.assessment_criteria:
 			if d.assessment_criteria in assessment_criteria_list:
-				frappe.throw(_("You have already assessed for the assessment criteria {}.")
-					.format(frappe.bold(d.assessment_criteria)))
+				frappe.throw(
+					_("You have already assessed for the assessment criteria {}.").format(
+						frappe.bold(d.assessment_criteria)
+					)
+				)
diff --git a/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py b/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py
index 31b9509..f9c583a 100644
--- a/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py
+++ b/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py
@@ -6,17 +6,7 @@
 
 def get_data():
 	return {
-		'fieldname': 'assessment_plan',
-		'transactions': [
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Result']
-			}
-		],
-		'reports': [
-			{
-				'label': _('Report'),
-				'items': ['Assessment Plan Status']
-			}
-		]
+		"fieldname": "assessment_plan",
+		"transactions": [{"label": _("Assessment"), "items": ["Assessment Result"]}],
+		"reports": [{"label": _("Report"), "items": ["Assessment Plan Status"]}],
 	}
diff --git a/erpnext/education/doctype/assessment_plan/test_assessment_plan.py b/erpnext/education/doctype/assessment_plan/test_assessment_plan.py
index 9f55a78..e294c50 100644
--- a/erpnext/education/doctype/assessment_plan/test_assessment_plan.py
+++ b/erpnext/education/doctype/assessment_plan/test_assessment_plan.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Assessment Plan')
 
+
 class TestAssessmentPlan(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/assessment_result/assessment_result.py b/erpnext/education/doctype/assessment_result/assessment_result.py
index 8278b9e..1d485c1 100644
--- a/erpnext/education/doctype/assessment_result/assessment_result.py
+++ b/erpnext/education/doctype/assessment_result/assessment_result.py
@@ -33,12 +33,23 @@
 	def validate_grade(self):
 		self.total_score = 0.0
 		for d in self.details:
-			d.grade = get_grade(self.grading_scale, (flt(d.score)/d.maximum_score)*100)
+			d.grade = get_grade(self.grading_scale, (flt(d.score) / d.maximum_score) * 100)
 			self.total_score += d.score
-		self.grade = get_grade(self.grading_scale, (self.total_score/self.maximum_score)*100)
+		self.grade = get_grade(self.grading_scale, (self.total_score / self.maximum_score) * 100)
 
 	def validate_duplicate(self):
-		assessment_result = frappe.get_list("Assessment Result", filters={"name": ("not in", [self.name]),
-			"student":self.student, "assessment_plan":self.assessment_plan, "docstatus":("!=", 2)})
+		assessment_result = frappe.get_list(
+			"Assessment Result",
+			filters={
+				"name": ("not in", [self.name]),
+				"student": self.student,
+				"assessment_plan": self.assessment_plan,
+				"docstatus": ("!=", 2),
+			},
+		)
 		if assessment_result:
-			frappe.throw(_("Assessment Result record {0} already exists.").format(getlink("Assessment Result",assessment_result[0].name)))
+			frappe.throw(
+				_("Assessment Result record {0} already exists.").format(
+					getlink("Assessment Result", assessment_result[0].name)
+				)
+			)
diff --git a/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py b/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py
index 3b07417..5501f92 100644
--- a/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py
+++ b/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py
@@ -6,10 +6,7 @@
 
 def get_data():
 	return {
-		'reports': [
-			{
-				'label': _('Reports'),
-				'items': ['Final Assessment Grades', 'Course wise Assessment Report']
-			}
+		"reports": [
+			{"label": _("Reports"), "items": ["Final Assessment Grades", "Course wise Assessment Report"]}
 		]
 	}
diff --git a/erpnext/education/doctype/assessment_result/test_assessment_result.py b/erpnext/education/doctype/assessment_result/test_assessment_result.py
index c0872df..4872f48 100644
--- a/erpnext/education/doctype/assessment_result/test_assessment_result.py
+++ b/erpnext/education/doctype/assessment_result/test_assessment_result.py
@@ -7,6 +7,7 @@
 
 # test_records = frappe.get_test_records('Assessment Result')
 
+
 class TestAssessmentResult(unittest.TestCase):
 	def test_grade(self):
 		grade = get_grade("_Test Grading Scale", 80)
diff --git a/erpnext/education/doctype/course/course.py b/erpnext/education/doctype/course/course.py
index 2d4f282..baf72e8 100644
--- a/erpnext/education/doctype/course/course.py
+++ b/erpnext/education/doctype/course/course.py
@@ -19,12 +19,12 @@
 			for criteria in self.assessment_criteria:
 				total_weightage += criteria.weightage or 0
 			if total_weightage != 100:
-				frappe.throw(_('Total Weightage of all Assessment Criteria must be 100%'))
+				frappe.throw(_("Total Weightage of all Assessment Criteria must be 100%"))
 
 	def get_topics(self):
-		topic_data= []
+		topic_data = []
 		for topic in self.topics:
-			topic_doc = frappe.get_doc('Topic', topic.topic)
+			topic_doc = frappe.get_doc("Topic", topic.topic)
 			if topic_doc.topic_content:
 				topic_data.append(topic_doc)
 		return topic_data
@@ -34,23 +34,25 @@
 def add_course_to_programs(course, programs, mandatory=False):
 	programs = json.loads(programs)
 	for entry in programs:
-		program = frappe.get_doc('Program', entry)
-		program.append('courses', {
-			'course': course,
-			'course_name': course,
-			'mandatory': mandatory
-		})
+		program = frappe.get_doc("Program", entry)
+		program.append("courses", {"course": course, "course_name": course, "mandatory": mandatory})
 		program.flags.ignore_mandatory = True
 		program.save()
 	frappe.db.commit()
-	frappe.msgprint(_('Course {0} has been added to all the selected programs successfully.').format(frappe.bold(course)),
-		title=_('Programs updated'), indicator='green')
+	frappe.msgprint(
+		_("Course {0} has been added to all the selected programs successfully.").format(
+			frappe.bold(course)
+		),
+		title=_("Programs updated"),
+		indicator="green",
+	)
+
 
 @frappe.whitelist()
 def get_programs_without_course(course):
 	data = []
-	for entry in frappe.db.get_all('Program'):
-		program = frappe.get_doc('Program', entry.name)
+	for entry in frappe.db.get_all("Program"):
+		program = frappe.get_doc("Program", entry.name)
 		courses = [c.course for c in program.courses]
 		if not courses or course not in courses:
 			data.append(program.name)
diff --git a/erpnext/education/doctype/course/course_dashboard.py b/erpnext/education/doctype/course/course_dashboard.py
index 276830f..6ba4475 100644
--- a/erpnext/education/doctype/course/course_dashboard.py
+++ b/erpnext/education/doctype/course/course_dashboard.py
@@ -6,19 +6,13 @@
 
 def get_data():
 	return {
-		'fieldname': 'course',
-		'transactions': [
+		"fieldname": "course",
+		"transactions": [
 			{
-				'label': _('Program and Course'),
-				'items': ['Program', 'Course Enrollment', 'Course Schedule']
+				"label": _("Program and Course"),
+				"items": ["Program", "Course Enrollment", "Course Schedule"],
 			},
-			{
-				'label': _('Student'),
-				'items': ['Student Group']
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			},
-		]
+			{"label": _("Student"), "items": ["Student Group"]},
+			{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
+		],
 	}
diff --git a/erpnext/education/doctype/course/test_course.py b/erpnext/education/doctype/course/test_course.py
index 6381cdb..caddefe 100644
--- a/erpnext/education/doctype/course/test_course.py
+++ b/erpnext/education/doctype/course/test_course.py
@@ -9,10 +9,11 @@
 
 # test_records = frappe.get_test_records('Course')
 
+
 class TestCourse(unittest.TestCase):
 	def setUp(self):
-		make_topic_and_linked_content("_Test Topic 1", [{"type":"Article", "name": "_Test Article 1"}])
-		make_topic_and_linked_content("_Test Topic 2", [{"type":"Article", "name": "_Test Article 2"}])
+		make_topic_and_linked_content("_Test Topic 1", [{"type": "Article", "name": "_Test Article 1"}])
+		make_topic_and_linked_content("_Test Topic 2", [{"type": "Article", "name": "_Test Article 2"}])
 		make_course_and_linked_topic("_Test Course 1", ["_Test Topic 1", "_Test Topic 2"])
 
 	def test_get_topics(self):
@@ -22,17 +23,15 @@
 		self.assertEqual(topics[1].name, "_Test Topic 2")
 		frappe.db.rollback()
 
+
 def make_course(name):
 	try:
 		course = frappe.get_doc("Course", name)
 	except frappe.DoesNotExistError:
-		course = frappe.get_doc({
-			"doctype": "Course",
-			"course_name": name,
-			"course_code": name
-		}).insert()
+		course = frappe.get_doc({"doctype": "Course", "course_name": name, "course_code": name}).insert()
 	return course.name
 
+
 def make_course_and_linked_topic(course_name, topic_name_list):
 	try:
 		course = frappe.get_doc("Course", course_name)
diff --git a/erpnext/education/doctype/course_activity/course_activity.py b/erpnext/education/doctype/course_activity/course_activity.py
index c1d8242..784260d 100644
--- a/erpnext/education/doctype/course_activity/course_activity.py
+++ b/erpnext/education/doctype/course_activity/course_activity.py
@@ -11,7 +11,6 @@
 	def validate(self):
 		self.check_if_enrolled()
 
-
 	def check_if_enrolled(self):
 		if frappe.db.exists("Course Enrollment", self.enrollment):
 			return True
diff --git a/erpnext/education/doctype/course_activity/test_course_activity.py b/erpnext/education/doctype/course_activity/test_course_activity.py
index 9514ff1..677b60a 100644
--- a/erpnext/education/doctype/course_activity/test_course_activity.py
+++ b/erpnext/education/doctype/course_activity/test_course_activity.py
@@ -9,16 +9,22 @@
 class TestCourseActivity(unittest.TestCase):
 	pass
 
+
 def make_course_activity(enrollment, content_type, content):
-	activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment, 'content_type': content_type, 'content': content})
+	activity = frappe.get_all(
+		"Course Activity",
+		filters={"enrollment": enrollment, "content_type": content_type, "content": content},
+	)
 	try:
-		activity = frappe.get_doc("Course Activity", activity[0]['name'])
+		activity = frappe.get_doc("Course Activity", activity[0]["name"])
 	except (IndexError, frappe.DoesNotExistError):
-		activity = frappe.get_doc({
-			"doctype": "Course Activity",
-			"enrollment": enrollment,
-			"content_type": content_type,
-			"content": content,
-			"activity_date": frappe.utils.datetime.datetime.now()
-		}).insert()
+		activity = frappe.get_doc(
+			{
+				"doctype": "Course Activity",
+				"enrollment": enrollment,
+				"content_type": content_type,
+				"content": content,
+				"activity_date": frappe.utils.datetime.datetime.now(),
+			}
+		).insert()
 	return activity
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.py b/erpnext/education/doctype/course_enrollment/course_enrollment.py
index 7921284..18639b1 100644
--- a/erpnext/education/doctype/course_enrollment/course_enrollment.py
+++ b/erpnext/education/doctype/course_enrollment/course_enrollment.py
@@ -18,77 +18,94 @@
 		"""
 		Returns Progress of given student for a particular course enrollment
 
-			:param self: Course Enrollment Object
-			:param student: Student Object
+		        :param self: Course Enrollment Object
+		        :param student: Student Object
 		"""
-		course = frappe.get_doc('Course', self.course)
+		course = frappe.get_doc("Course", self.course)
 		topics = course.get_topics()
 		progress = []
 		for topic in topics:
 			progress.append(student.get_topic_progress(self.name, topic))
 		if progress:
-			return reduce(lambda x,y: x+y, progress) # Flatten out the List
+			return reduce(lambda x, y: x + y, progress)  # Flatten out the List
 		else:
 			return []
 
 	def validate_duplication(self):
-		enrollment = frappe.db.exists("Course Enrollment", {
-			"student": self.student,
-			"course": self.course,
-			"program_enrollment": self.program_enrollment,
-			"name": ("!=", self.name)
-		})
+		enrollment = frappe.db.exists(
+			"Course Enrollment",
+			{
+				"student": self.student,
+				"course": self.course,
+				"program_enrollment": self.program_enrollment,
+				"name": ("!=", self.name),
+			},
+		)
 		if enrollment:
-			frappe.throw(_("Student is already enrolled via Course Enrollment {0}").format(
-				get_link_to_form("Course Enrollment", enrollment)), title=_('Duplicate Entry'))
+			frappe.throw(
+				_("Student is already enrolled via Course Enrollment {0}").format(
+					get_link_to_form("Course Enrollment", enrollment)
+				),
+				title=_("Duplicate Entry"),
+			)
 
 	def add_quiz_activity(self, quiz_name, quiz_response, answers, score, status, time_taken):
-		result = {k: ('Correct' if v else 'Wrong') for k,v in answers.items()}
+		result = {k: ("Correct" if v else "Wrong") for k, v in answers.items()}
 		result_data = []
 		for key in answers:
 			item = {}
-			item['question'] = key
-			item['quiz_result'] = result[key]
+			item["question"] = key
+			item["quiz_result"] = result[key]
 			try:
 				if not quiz_response[key]:
-					item['selected_option'] = "Unattempted"
+					item["selected_option"] = "Unattempted"
 				elif isinstance(quiz_response[key], list):
-					item['selected_option'] = ', '.join(frappe.get_value('Options', res, 'option') for res in quiz_response[key])
+					item["selected_option"] = ", ".join(
+						frappe.get_value("Options", res, "option") for res in quiz_response[key]
+					)
 				else:
-					item['selected_option'] = frappe.get_value('Options', quiz_response[key], 'option')
+					item["selected_option"] = frappe.get_value("Options", quiz_response[key], "option")
 			except KeyError:
-				item['selected_option'] = "Unattempted"
+				item["selected_option"] = "Unattempted"
 			result_data.append(item)
 
-		quiz_activity = frappe.get_doc({
-			"doctype": "Quiz Activity",
-			"enrollment": self.name,
-			"quiz": quiz_name,
-			"activity_date": frappe.utils.datetime.datetime.now(),
-			"result": result_data,
-			"score": score,
-			"status": status,
-			"time_taken": time_taken
-			}).insert(ignore_permissions = True)
+		quiz_activity = frappe.get_doc(
+			{
+				"doctype": "Quiz Activity",
+				"enrollment": self.name,
+				"quiz": quiz_name,
+				"activity_date": frappe.utils.datetime.datetime.now(),
+				"result": result_data,
+				"score": score,
+				"status": status,
+				"time_taken": time_taken,
+			}
+		).insert(ignore_permissions=True)
 
 	def add_activity(self, content_type, content):
 		activity = check_activity_exists(self.name, content_type, content)
 		if activity:
 			return activity
 		else:
-			activity = frappe.get_doc({
-				"doctype": "Course Activity",
-				"enrollment": self.name,
-				"content_type": content_type,
-				"content": content,
-				"activity_date": frappe.utils.datetime.datetime.now()
-			})
+			activity = frappe.get_doc(
+				{
+					"doctype": "Course Activity",
+					"enrollment": self.name,
+					"content_type": content_type,
+					"content": content,
+					"activity_date": frappe.utils.datetime.datetime.now(),
+				}
+			)
 
 			activity.insert(ignore_permissions=True)
 			return activity.name
 
+
 def check_activity_exists(enrollment, content_type, content):
-	activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment, 'content_type': content_type, 'content': content})
+	activity = frappe.get_all(
+		"Course Activity",
+		filters={"enrollment": enrollment, "content_type": content_type, "content": content},
+	)
 	if activity:
 		return activity[0].name
 	else:
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py b/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py
index 14a7a8f..31a90fd 100644
--- a/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py
+++ b/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py
@@ -6,11 +6,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'enrollment',
-		'transactions': [
-			{
-				'label': _('Activity'),
-				'items': ['Course Activity', 'Quiz Activity']
-			}
-		]
+		"fieldname": "enrollment",
+		"transactions": [{"label": _("Activity"), "items": ["Course Activity", "Quiz Activity"]}],
 	}
diff --git a/erpnext/education/doctype/course_enrollment/test_course_enrollment.py b/erpnext/education/doctype/course_enrollment/test_course_enrollment.py
index e74d510..6862e05 100644
--- a/erpnext/education/doctype/course_enrollment/test_course_enrollment.py
+++ b/erpnext/education/doctype/course_enrollment/test_course_enrollment.py
@@ -13,19 +13,37 @@
 class TestCourseEnrollment(unittest.TestCase):
 	def setUp(self):
 		setup_program()
-		student = create_student({"first_name": "_Test First", "last_name": "_Test Last", "email": "_test_student_1@example.com"})
+		student = create_student(
+			{"first_name": "_Test First", "last_name": "_Test Last", "email": "_test_student_1@example.com"}
+		)
 		program_enrollment = student.enroll_in_program("_Test Program")
-		course_enrollment = frappe.db.get_value("Course Enrollment",
-			{"course": "_Test Course 1", "student": student.name, "program_enrollment": program_enrollment.name}, 'name')
+		course_enrollment = frappe.db.get_value(
+			"Course Enrollment",
+			{
+				"course": "_Test Course 1",
+				"student": student.name,
+				"program_enrollment": program_enrollment.name,
+			},
+			"name",
+		)
 		make_course_activity(course_enrollment, "Article", "_Test Article 1-1")
 
 	def test_get_progress(self):
 		student = get_student("_test_student_1@example.com")
-		program_enrollment_name = frappe.get_list("Program Enrollment", filters={"student": student.name, "Program": "_Test Program"})[0].name
-		course_enrollment_name = frappe.get_list("Course Enrollment", filters={"student": student.name, "course": "_Test Course 1", "program_enrollment": program_enrollment_name})[0].name
+		program_enrollment_name = frappe.get_list(
+			"Program Enrollment", filters={"student": student.name, "Program": "_Test Program"}
+		)[0].name
+		course_enrollment_name = frappe.get_list(
+			"Course Enrollment",
+			filters={
+				"student": student.name,
+				"course": "_Test Course 1",
+				"program_enrollment": program_enrollment_name,
+			},
+		)[0].name
 		course_enrollment = frappe.get_doc("Course Enrollment", course_enrollment_name)
 		progress = course_enrollment.get_progress(student)
-		finished = {'content': '_Test Article 1-1', 'content_type': 'Article', 'is_complete': True}
+		finished = {"content": "_Test Article 1-1", "content_type": "Article", "is_complete": True}
 		self.assertTrue(finished in progress)
 		frappe.db.rollback()
 
diff --git a/erpnext/education/doctype/course_schedule/course_schedule.py b/erpnext/education/doctype/course_schedule/course_schedule.py
index 615d2c4..d2b31f4 100644
--- a/erpnext/education/doctype/course_schedule/course_schedule.py
+++ b/erpnext/education/doctype/course_schedule/course_schedule.py
@@ -20,10 +20,14 @@
 
 	def set_title(self):
 		"""Set document Title"""
-		self.title = self.course + " by " + (self.instructor_name if self.instructor_name else self.instructor)
+		self.title = (
+			self.course + " by " + (self.instructor_name if self.instructor_name else self.instructor)
+		)
 
 	def validate_course(self):
-		group_based_on, course = frappe.db.get_value("Student Group", self.student_group, ["group_based_on", "course"])
+		group_based_on, course = frappe.db.get_value(
+			"Student Group", self.student_group, ["group_based_on", "course"]
+		)
 		if group_based_on == "Course":
 			self.course = course
 
@@ -35,7 +39,7 @@
 		"""Handles specicfic case to update schedule date in calendar """
 		if isinstance(self.from_time, str):
 			try:
-				datetime_obj = datetime.strptime(self.from_time, '%Y-%m-%d %H:%M:%S')
+				datetime_obj = datetime.strptime(self.from_time, "%Y-%m-%d %H:%M:%S")
 				self.schedule_date = datetime_obj
 			except ValueError:
 				pass
@@ -45,16 +49,16 @@
 
 		from erpnext.education.utils import validate_overlap_for
 
-		#Validate overlapping course schedules.
+		# Validate overlapping course schedules.
 		if self.student_group:
 			validate_overlap_for(self, "Course Schedule", "student_group")
 
 		validate_overlap_for(self, "Course Schedule", "instructor")
 		validate_overlap_for(self, "Course Schedule", "room")
 
-		#validate overlapping assessment schedules.
+		# validate overlapping assessment schedules.
 		if self.student_group:
 			validate_overlap_for(self, "Assessment Plan", "student_group")
 
 		validate_overlap_for(self, "Assessment Plan", "room")
-		validate_overlap_for(self, "Assessment Plan", "supervisor", self.instructor)
\ No newline at end of file
+		validate_overlap_for(self, "Assessment Plan", "supervisor", self.instructor)
diff --git a/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py b/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py
index 256e40b..76a3f04 100644
--- a/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py
+++ b/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py
@@ -6,11 +6,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'course_schedule',
-		'transactions': [
-			{
-				'label': _('Attendance'),
-				'items': ['Student Attendance']
-			}
-		]
+		"fieldname": "course_schedule",
+		"transactions": [{"label": _("Attendance"), "items": ["Student Attendance"]}],
 	}
diff --git a/erpnext/education/doctype/course_schedule/test_course_schedule.py b/erpnext/education/doctype/course_schedule/test_course_schedule.py
index 56149af..ac09464 100644
--- a/erpnext/education/doctype/course_schedule/test_course_schedule.py
+++ b/erpnext/education/doctype/course_schedule/test_course_schedule.py
@@ -12,52 +12,76 @@
 
 # test_records = frappe.get_test_records('Course Schedule')
 
+
 class TestCourseSchedule(unittest.TestCase):
 	def test_student_group_conflict(self):
-		cs1 = make_course_schedule_test_record(simulate= True)
+		cs1 = make_course_schedule_test_record(simulate=True)
 
-		cs2 = make_course_schedule_test_record(schedule_date=cs1.schedule_date, from_time= cs1.from_time,
-			to_time= cs1.to_time, instructor="_Test Instructor 2", room=frappe.get_all("Room")[1].name, do_not_save= 1)
+		cs2 = make_course_schedule_test_record(
+			schedule_date=cs1.schedule_date,
+			from_time=cs1.from_time,
+			to_time=cs1.to_time,
+			instructor="_Test Instructor 2",
+			room=frappe.get_all("Room")[1].name,
+			do_not_save=1,
+		)
 		self.assertRaises(OverlapError, cs2.save)
 
 	def test_instructor_conflict(self):
-		cs1 = make_course_schedule_test_record(simulate= True)
+		cs1 = make_course_schedule_test_record(simulate=True)
 
-		cs2 = make_course_schedule_test_record(from_time= cs1.from_time, to_time= cs1.to_time,
-			student_group="Course-TC101-2014-2015 (_Test Academic Term)", room=frappe.get_all("Room")[1].name, do_not_save= 1)
+		cs2 = make_course_schedule_test_record(
+			from_time=cs1.from_time,
+			to_time=cs1.to_time,
+			student_group="Course-TC101-2014-2015 (_Test Academic Term)",
+			room=frappe.get_all("Room")[1].name,
+			do_not_save=1,
+		)
 		self.assertRaises(OverlapError, cs2.save)
 
 	def test_room_conflict(self):
-		cs1 = make_course_schedule_test_record(simulate= True)
+		cs1 = make_course_schedule_test_record(simulate=True)
 
-		cs2 = make_course_schedule_test_record(from_time= cs1.from_time, to_time= cs1.to_time,
-			student_group="Course-TC101-2014-2015 (_Test Academic Term)", instructor="_Test Instructor 2", do_not_save= 1)
+		cs2 = make_course_schedule_test_record(
+			from_time=cs1.from_time,
+			to_time=cs1.to_time,
+			student_group="Course-TC101-2014-2015 (_Test Academic Term)",
+			instructor="_Test Instructor 2",
+			do_not_save=1,
+		)
 		self.assertRaises(OverlapError, cs2.save)
 
 	def test_no_conflict(self):
-		cs1 = make_course_schedule_test_record(simulate= True)
+		cs1 = make_course_schedule_test_record(simulate=True)
 
-		make_course_schedule_test_record(from_time= cs1.from_time, to_time= cs1.to_time,
-			student_group="Course-TC102-2014-2015 (_Test Academic Term)", instructor="_Test Instructor 2", room=frappe.get_all("Room")[1].name)
+		make_course_schedule_test_record(
+			from_time=cs1.from_time,
+			to_time=cs1.to_time,
+			student_group="Course-TC102-2014-2015 (_Test Academic Term)",
+			instructor="_Test Instructor 2",
+			room=frappe.get_all("Room")[1].name,
+		)
 
 	def test_update_schedule_date(self):
-		doc = make_course_schedule_test_record(schedule_date= add_to_date(today(), days=1))
+		doc = make_course_schedule_test_record(schedule_date=add_to_date(today(), days=1))
 		doc.schedule_date = add_to_date(doc.schedule_date, days=1)
 		doc.save()
 
+
 def make_course_schedule_test_record(**args):
 	args = frappe._dict(args)
 
 	course_schedule = frappe.new_doc("Course Schedule")
-	course_schedule.student_group = args.student_group or "Course-TC101-2014-2015 (_Test Academic Term)"
+	course_schedule.student_group = (
+		args.student_group or "Course-TC101-2014-2015 (_Test Academic Term)"
+	)
 	course_schedule.course = args.course or "TC101"
 	course_schedule.instructor = args.instructor or "_Test Instructor"
 	course_schedule.room = args.room or frappe.get_all("Room")[0].name
 
 	course_schedule.schedule_date = args.schedule_date or today()
 	course_schedule.from_time = args.from_time or to_timedelta("01:00:00")
-	course_schedule.to_time = args.to_time or course_schedule.from_time + datetime.timedelta(hours= 1)
-
+	course_schedule.to_time = args.to_time or course_schedule.from_time + datetime.timedelta(hours=1)
 
 	if not args.do_not_save:
 		if args.simulate:
@@ -67,7 +91,7 @@
 					break
 				except OverlapError:
 					course_schedule.from_time = course_schedule.from_time + datetime.timedelta(minutes=10)
-					course_schedule.to_time = course_schedule.from_time + datetime.timedelta(hours= 1)
+					course_schedule.to_time = course_schedule.from_time + datetime.timedelta(hours=1)
 		else:
 			course_schedule.save()
 
diff --git a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py
index a309e46..4db6f98 100644
--- a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py
+++ b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py
@@ -13,7 +13,6 @@
 
 
 class CourseSchedulingTool(Document):
-
 	@frappe.whitelist()
 	def schedule_course(self):
 		"""Creates course schedules as per specified parameters"""
@@ -25,28 +24,27 @@
 
 		self.validate_mandatory()
 		self.validate_date()
-		self.instructor_name = frappe.db.get_value(
-			"Instructor", self.instructor, "instructor_name")
+		self.instructor_name = frappe.db.get_value("Instructor", self.instructor, "instructor_name")
 
 		group_based_on, course = frappe.db.get_value(
-			"Student Group", self.student_group, ["group_based_on", "course"])
+			"Student Group", self.student_group, ["group_based_on", "course"]
+		)
 
 		if group_based_on == "Course":
 			self.course = course
 
 		if self.reschedule:
-			rescheduled, reschedule_errors = self.delete_course_schedule(
-				rescheduled, reschedule_errors)
+			rescheduled, reschedule_errors = self.delete_course_schedule(rescheduled, reschedule_errors)
 
 		date = self.course_start_date
 		while date < self.course_end_date:
 			if self.day == calendar.day_name[getdate(date).weekday()]:
 				course_schedule = self.make_course_schedule(date)
 				try:
-					print('pass')
+					print("pass")
 					course_schedule.save()
 				except OverlapError:
-					print('fail')
+					print("fail")
 					course_schedules_errors.append(date)
 				else:
 					course_schedules.append(course_schedule)
@@ -59,36 +57,43 @@
 			course_schedules=course_schedules,
 			course_schedules_errors=course_schedules_errors,
 			rescheduled=rescheduled,
-			reschedule_errors=reschedule_errors
+			reschedule_errors=reschedule_errors,
 		)
 
 	def validate_mandatory(self):
 		"""Validates all mandatory fields"""
 
-		fields = ['course', 'room', 'instructor', 'from_time',
-				  'to_time', 'course_start_date', 'course_end_date', 'day']
+		fields = [
+			"course",
+			"room",
+			"instructor",
+			"from_time",
+			"to_time",
+			"course_start_date",
+			"course_end_date",
+			"day",
+		]
 		for d in fields:
 			if not self.get(d):
-				frappe.throw(_("{0} is mandatory").format(
-					self.meta.get_label(d)))
+				frappe.throw(_("{0} is mandatory").format(self.meta.get_label(d)))
 
 	def validate_date(self):
 		"""Validates if Course Start Date is greater than Course End Date"""
 		if self.course_start_date > self.course_end_date:
-			frappe.throw(
-				_("Course Start Date cannot be greater than Course End Date."))
+			frappe.throw(_("Course Start Date cannot be greater than Course End Date."))
 
 	def delete_course_schedule(self, rescheduled, reschedule_errors):
 		"""Delete all course schedule within the Date range and specified filters"""
 
-		schedules = frappe.get_list("Course Schedule",
+		schedules = frappe.get_list(
+			"Course Schedule",
 			fields=["name", "schedule_date"],
 			filters=[
 				["student_group", "=", self.student_group],
 				["course", "=", self.course],
 				["schedule_date", ">=", self.course_start_date],
-				["schedule_date", "<=", self.course_end_date]
-			]
+				["schedule_date", "<=", self.course_end_date],
+			],
 		)
 
 		for d in schedules:
diff --git a/erpnext/education/doctype/education_settings/education_settings.py b/erpnext/education/doctype/education_settings/education_settings.py
index 13123be..cde5089 100644
--- a/erpnext/education/doctype/education_settings/education_settings.py
+++ b/erpnext/education/doctype/education_settings/education_settings.py
@@ -11,7 +11,7 @@
 	"academic_year": "current_academic_year",
 	"academic_term": "current_academic_term",
 	"validate_batch": "validate_batch",
-	"validate_course": "validate_course"
+	"validate_course": "validate_course",
 }
 
 
@@ -19,7 +19,7 @@
 	def on_update(self):
 		"""update defaults"""
 		for key in education_keydict:
-			frappe.db.set_default(key, self.get(education_keydict[key], ''))
+			frappe.db.set_default(key, self.get(education_keydict[key], ""))
 
 		# clear cache
 		frappe.clear_cache()
@@ -29,10 +29,16 @@
 
 	def validate(self):
 		from frappe.custom.doctype.property_setter.property_setter import make_property_setter
-		if self.get('instructor_created_by')=='Naming Series':
-			make_property_setter('Instructor', "naming_series", "hidden", 0, "Check", validate_fields_for_doctype=False)
+
+		if self.get("instructor_created_by") == "Naming Series":
+			make_property_setter(
+				"Instructor", "naming_series", "hidden", 0, "Check", validate_fields_for_doctype=False
+			)
 		else:
-			make_property_setter('Instructor', "naming_series", "hidden", 1, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				"Instructor", "naming_series", "hidden", 1, "Check", validate_fields_for_doctype=False
+			)
+
 
 def update_website_context(context):
 	context["lms_enabled"] = frappe.get_doc("Education Settings").enable_lms
diff --git a/erpnext/education/doctype/fee_category/test_fee_category.py b/erpnext/education/doctype/fee_category/test_fee_category.py
index 9e74c7d..93565a9 100644
--- a/erpnext/education/doctype/fee_category/test_fee_category.py
+++ b/erpnext/education/doctype/fee_category/test_fee_category.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Fee Category')
 
+
 class TestFeeCategory(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.py b/erpnext/education/doctype/fee_schedule/fee_schedule.py
index a122fe8..9ae5582 100644
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.py
+++ b/erpnext/education/doctype/fee_schedule/fee_schedule.py
@@ -15,17 +15,20 @@
 class FeeSchedule(Document):
 	def onload(self):
 		info = self.get_dashboard_info()
-		self.set_onload('dashboard_info', info)
+		self.set_onload("dashboard_info", info)
 
 	def get_dashboard_info(self):
 		info = {
 			"total_paid": 0,
 			"total_unpaid": 0,
-			"currency": erpnext.get_company_currency(self.company)
+			"currency": erpnext.get_company_currency(self.company),
 		}
 
-		fees_amount = frappe.db.sql("""select sum(grand_total), sum(outstanding_amount) from tabFees
-			where fee_schedule=%s and docstatus=1""", (self.name))
+		fees_amount = frappe.db.sql(
+			"""select sum(grand_total), sum(outstanding_amount) from tabFees
+			where fee_schedule=%s and docstatus=1""",
+			(self.name),
+		)
 
 		if fees_amount:
 			info["total_paid"] = flt(fees_amount[0][0]) - flt(fees_amount[0][1])
@@ -40,33 +43,42 @@
 		no_of_students = 0
 		for d in self.student_groups:
 			# if not d.total_students:
-			d.total_students = get_total_students(d.student_group, self.academic_year,
-				self.academic_term, self.student_category)
+			d.total_students = get_total_students(
+				d.student_group, self.academic_year, self.academic_term, self.student_category
+			)
 			no_of_students += cint(d.total_students)
 
 			# validate the program of fee structure and student groups
 			student_group_program = frappe.db.get_value("Student Group", d.student_group, "program")
 			if self.program and student_group_program and self.program != student_group_program:
-				frappe.msgprint(_("Program in the Fee Structure and Student Group {0} are different.")
-					.format(d.student_group))
-		self.grand_total = no_of_students*self.total_amount
+				frappe.msgprint(
+					_("Program in the Fee Structure and Student Group {0} are different.").format(d.student_group)
+				)
+		self.grand_total = no_of_students * self.total_amount
 		self.grand_total_in_words = money_in_words(self.grand_total)
 
 	@frappe.whitelist()
 	def create_fees(self):
 		self.db_set("fee_creation_status", "In Process")
-		frappe.publish_realtime("fee_schedule_progress",
-			{"progress": "0", "reload": 1}, user=frappe.session.user)
+		frappe.publish_realtime(
+			"fee_schedule_progress", {"progress": "0", "reload": 1}, user=frappe.session.user
+		)
 
 		total_records = sum([int(d.total_students) for d in self.student_groups])
 		if total_records > 10:
-			frappe.msgprint(_('''Fee records will be created in the background.
-				In case of any error the error message will be updated in the Schedule.'''))
-			enqueue(generate_fee, queue='default', timeout=6000, event='generate_fee',
-				fee_schedule=self.name)
+			frappe.msgprint(
+				_(
+					"""Fee records will be created in the background.
+				In case of any error the error message will be updated in the Schedule."""
+				)
+			)
+			enqueue(
+				generate_fee, queue="default", timeout=6000, event="generate_fee", fee_schedule=self.name
+			)
 		else:
 			generate_fee(self.name)
 
+
 def generate_fee(fee_schedule):
 	doc = frappe.get_doc("Fee Schedule", fee_schedule)
 	error = False
@@ -77,17 +89,16 @@
 		frappe.throw(_("Please setup Students under Student Groups"))
 
 	for d in doc.student_groups:
-		students = get_students(d.student_group, doc.academic_year, doc.academic_term, doc.student_category)
+		students = get_students(
+			d.student_group, doc.academic_year, doc.academic_term, doc.student_category
+		)
 		for student in students:
 			try:
-				fees_doc = get_mapped_doc("Fee Schedule", fee_schedule,	{
-					"Fee Schedule": {
-						"doctype": "Fees",
-						"field_map": {
-							"name": "Fee Schedule"
-						}
-					}
-				})
+				fees_doc = get_mapped_doc(
+					"Fee Schedule",
+					fee_schedule,
+					{"Fee Schedule": {"doctype": "Fees", "field_map": {"name": "Fee Schedule"}}},
+				)
 				fees_doc.posting_date = doc.posting_date
 				fees_doc.student = student.student
 				fees_doc.student_name = student.student_name
@@ -97,7 +108,11 @@
 				fees_doc.save()
 				fees_doc.submit()
 				created_records += 1
-				frappe.publish_realtime("fee_schedule_progress", {"progress": str(int(created_records * 100/total_records))}, user=frappe.session.user)
+				frappe.publish_realtime(
+					"fee_schedule_progress",
+					{"progress": str(int(created_records * 100 / total_records))},
+					user=frappe.session.user,
+				)
 
 			except Exception as e:
 				error = True
@@ -112,8 +127,9 @@
 		frappe.db.set_value("Fee Schedule", fee_schedule, "fee_creation_status", "Successful")
 		frappe.db.set_value("Fee Schedule", fee_schedule, "error_log", None)
 
-	frappe.publish_realtime("fee_schedule_progress",
-		{"progress": "100", "reload": 1}, user=frappe.session.user)
+	frappe.publish_realtime(
+		"fee_schedule_progress", {"progress": "100", "reload": 1}, user=frappe.session.user
+	)
 
 
 def get_students(student_group, academic_year, academic_term=None, student_category=None):
@@ -123,14 +139,20 @@
 	if academic_term:
 		conditions = " and pe.academic_term={}".format(frappe.db.escape(academic_term))
 
-	students = frappe.db.sql("""
+	students = frappe.db.sql(
+		"""
 		select pe.student, pe.student_name, pe.program, pe.student_batch_name
 		from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe
 		where
 			pe.student = sgs.student and pe.academic_year = %s
 			and sgs.parent = %s and sgs.active = 1
 			{conditions}
-		""".format(conditions=conditions), (academic_year, student_group), as_dict=1)
+		""".format(
+			conditions=conditions
+		),
+		(academic_year, student_group),
+		as_dict=1,
+	)
 	return students
 
 
@@ -141,9 +163,11 @@
 
 
 @frappe.whitelist()
-def get_fee_structure(source_name,target_doc=None):
-	fee_request = get_mapped_doc("Fee Structure", source_name,
-		{"Fee Structure": {
-			"doctype": "Fee Schedule"
-		}}, ignore_permissions=True)
+def get_fee_structure(source_name, target_doc=None):
+	fee_request = get_mapped_doc(
+		"Fee Structure",
+		source_name,
+		{"Fee Structure": {"doctype": "Fee Schedule"}},
+		ignore_permissions=True,
+	)
 	return fee_request
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py b/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py
index f5d1dee..4b99d27 100644
--- a/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py
+++ b/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py
@@ -3,11 +3,4 @@
 
 
 def get_data():
-	return {
-		'fieldname': 'fee_schedule',
-		'transactions': [
-			{
-				'items': ['Fees']
-			}
-		]
-	}
+	return {"fieldname": "fee_schedule", "transactions": [{"items": ["Fees"]}]}
diff --git a/erpnext/education/doctype/fee_structure/fee_structure.py b/erpnext/education/doctype/fee_structure/fee_structure.py
index 9090a6b..f1b7bb7 100644
--- a/erpnext/education/doctype/fee_structure/fee_structure.py
+++ b/erpnext/education/doctype/fee_structure/fee_structure.py
@@ -20,14 +20,17 @@
 
 @frappe.whitelist()
 def make_fee_schedule(source_name, target_doc=None):
-	return get_mapped_doc("Fee Structure", source_name,	{
-		"Fee Structure": {
-			"doctype": "Fee Schedule",
-			"validation": {
-				"docstatus": ["=", 1],
-			}
+	return get_mapped_doc(
+		"Fee Structure",
+		source_name,
+		{
+			"Fee Structure": {
+				"doctype": "Fee Schedule",
+				"validation": {
+					"docstatus": ["=", 1],
+				},
+			},
+			"Fee Component": {"doctype": "Fee Component"},
 		},
-		"Fee Component": {
-			"doctype": "Fee Component"
-		}
-	}, target_doc)
+		target_doc,
+	)
diff --git a/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py b/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py
index 27ce06b..0ae3032 100644
--- a/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py
+++ b/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py
@@ -6,11 +6,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'fee_structure',
-		'transactions': [
-			{
-                'label': _('Fee'),
-				'items': ['Fees', 'Fee Schedule']
-			}
-		]
+		"fieldname": "fee_structure",
+		"transactions": [{"label": _("Fee"), "items": ["Fees", "Fee Schedule"]}],
 	}
diff --git a/erpnext/education/doctype/fee_structure/test_fee_structure.py b/erpnext/education/doctype/fee_structure/test_fee_structure.py
index 61381a6..ebe0fea 100644
--- a/erpnext/education/doctype/fee_structure/test_fee_structure.py
+++ b/erpnext/education/doctype/fee_structure/test_fee_structure.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Fee Structure')
 
+
 class TestFeeStructure(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/fees/fees.py b/erpnext/education/doctype/fees/fees.py
index 41d428d..be608bf 100644
--- a/erpnext/education/doctype/fees/fees.py
+++ b/erpnext/education/doctype/fees/fees.py
@@ -33,9 +33,11 @@
 		if not self.currency:
 			self.currency = erpnext.get_company_currency(self.company)
 		if not (self.receivable_account and self.income_account and self.cost_center):
-			accounts_details = frappe.get_all("Company",
+			accounts_details = frappe.get_all(
+				"Company",
 				fields=["default_receivable_account", "default_income_account", "cost_center"],
-				filters={"name": self.company})[0]
+				filters={"name": self.company},
+			)[0]
 		if not self.receivable_account:
 			self.receivable_account = accounts_details.default_receivable_account
 		if not self.income_account:
@@ -46,12 +48,15 @@
 			self.student_email = self.get_student_emails()
 
 	def get_student_emails(self):
-		student_emails = frappe.db.sql_list("""
+		student_emails = frappe.db.sql_list(
+			"""
 			select g.email_address
 			from `tabGuardian` g, `tabStudent Guardian` sg
 			where g.name = sg.guardian and sg.parent = %s and sg.parenttype = 'Student'
 			and ifnull(g.email_address, '')!=''
-		""", self.student)
+		""",
+			self.student,
+		)
 
 		student_email_id = frappe.db.get_value("Student", self.student, "student_email_id")
 		if student_email_id:
@@ -61,7 +66,6 @@
 		else:
 			return None
 
-
 	def calculate_total(self):
 		"""Calculates total amount."""
 		self.grand_total = 0
@@ -75,61 +79,84 @@
 		self.make_gl_entries()
 
 		if self.send_payment_request and self.student_email:
-			pr = make_payment_request(party_type="Student", party=self.student, dt="Fees",
-					dn=self.name, recipient_id=self.student_email,
-					submit_doc=True, use_dummy_message=True)
+			pr = make_payment_request(
+				party_type="Student",
+				party=self.student,
+				dt="Fees",
+				dn=self.name,
+				recipient_id=self.student_email,
+				submit_doc=True,
+				use_dummy_message=True,
+			)
 			frappe.msgprint(_("Payment request {0} created").format(getlink("Payment Request", pr.name)))
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 		make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
 		# frappe.db.set(self, 'status', 'Cancelled')
 
-
 	def make_gl_entries(self):
 		if not self.grand_total:
 			return
-		student_gl_entries =  self.get_gl_dict({
-			"account": self.receivable_account,
-			"party_type": "Student",
-			"party": self.student,
-			"against": self.income_account,
-			"debit": self.grand_total,
-			"debit_in_account_currency": self.grand_total,
-			"against_voucher": self.name,
-			"against_voucher_type": self.doctype
-		}, item=self)
+		student_gl_entries = self.get_gl_dict(
+			{
+				"account": self.receivable_account,
+				"party_type": "Student",
+				"party": self.student,
+				"against": self.income_account,
+				"debit": self.grand_total,
+				"debit_in_account_currency": self.grand_total,
+				"against_voucher": self.name,
+				"against_voucher_type": self.doctype,
+			},
+			item=self,
+		)
 
-		fee_gl_entry = self.get_gl_dict({
-			"account": self.income_account,
-			"against": self.student,
-			"credit": self.grand_total,
-			"credit_in_account_currency": self.grand_total,
-			"cost_center": self.cost_center
-		}, item=self)
+		fee_gl_entry = self.get_gl_dict(
+			{
+				"account": self.income_account,
+				"against": self.student,
+				"credit": self.grand_total,
+				"credit_in_account_currency": self.grand_total,
+				"cost_center": self.cost_center,
+			},
+			item=self,
+		)
 
 		from erpnext.accounts.general_ledger import make_gl_entries
-		make_gl_entries([student_gl_entries, fee_gl_entry], cancel=(self.docstatus == 2),
-			update_outstanding="Yes", merge_entries=False)
+
+		make_gl_entries(
+			[student_gl_entries, fee_gl_entry],
+			cancel=(self.docstatus == 2),
+			update_outstanding="Yes",
+			merge_entries=False,
+		)
+
 
 def get_fee_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"):
 	user = frappe.session.user
 	student = frappe.db.sql("select name from `tabStudent` where student_email_id= %s", user)
 	if student:
-		return frappe. db.sql('''
+		return frappe.db.sql(
+			"""
 			select name, program, due_date, grand_total - outstanding_amount as paid_amount,
 			outstanding_amount, grand_total, currency
 			from `tabFees`
 			where student= %s and docstatus=1
-			order by due_date asc limit {0} , {1}'''
-			.format(limit_start, limit_page_length), student, as_dict = True)
+			order by due_date asc limit {0} , {1}""".format(
+				limit_start, limit_page_length
+			),
+			student,
+			as_dict=True,
+		)
+
 
 def get_list_context(context=None):
 	return {
 		"show_sidebar": True,
 		"show_search": True,
-		'no_breadcrumbs': True,
+		"no_breadcrumbs": True,
 		"title": _("Fees"),
 		"get_list": get_fee_list,
-		"row_template": "templates/includes/fee/fee_row.html"
+		"row_template": "templates/includes/fee/fee_row.html",
 	}
diff --git a/erpnext/education/doctype/fees/test_fees.py b/erpnext/education/doctype/fees/test_fees.py
index 72f1d11..f0f7e67 100644
--- a/erpnext/education/doctype/fees/test_fees.py
+++ b/erpnext/education/doctype/fees/test_fees.py
@@ -9,12 +9,15 @@
 
 from erpnext.education.doctype.program.test_program import make_program_and_linked_courses
 
-test_dependencies = ['Company']
-class TestFees(unittest.TestCase):
+test_dependencies = ["Company"]
 
+
+class TestFees(unittest.TestCase):
 	def test_fees(self):
 		student = get_random("Student")
-		program = make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
+		program = make_program_and_linked_courses(
+			"_Test Program 1", ["_Test Course 1", "_Test Course 2"]
+		)
 		fee = frappe.new_doc("Fees")
 		fee.posting_date = nowdate()
 		fee.due_date = nowdate()
@@ -25,22 +28,24 @@
 		fee.company = "_Test Company"
 		fee.program = program.name
 
-		fee.extend("components", [
-			{
-				"fees_category": "Tuition Fee",
-				"amount": 40000
-			},
-			{
-				"fees_category": "Transportation Fee",
-				"amount": 10000
-			}])
+		fee.extend(
+			"components",
+			[
+				{"fees_category": "Tuition Fee", "amount": 40000},
+				{"fees_category": "Transportation Fee", "amount": 10000},
+			],
+		)
 		fee.save()
 		fee.submit()
 
-		gl_entries = frappe.db.sql("""
+		gl_entries = frappe.db.sql(
+			"""
 			select account, posting_date, party_type, party, cost_center, fiscal_year, voucher_type,
 			voucher_no, against_voucher_type, against_voucher, cost_center, company, credit, debit
-			from `tabGL Entry` where voucher_type=%s and voucher_no=%s""", ("Fees", fee.name), as_dict=True)
+			from `tabGL Entry` where voucher_type=%s and voucher_no=%s""",
+			("Fees", fee.name),
+			as_dict=True,
+		)
 
 		if gl_entries[0].account == "_Test Receivable - _TC":
 			self.assertEqual(gl_entries[0].debit, 50000)
diff --git a/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py b/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py
index b8ae8b0..6995666 100644
--- a/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py
+++ b/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py
@@ -3,18 +3,10 @@
 
 def get_data():
 	return {
-		'fieldname': 'grading_scale',
-		'non_standard_fieldnames': {
-			'Course': 'default_grading_scale'
-		},
-		'transactions': [
-			{
-				'label': _('Course'),
-				'items': ['Course']
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			}
-		]
+		"fieldname": "grading_scale",
+		"non_standard_fieldnames": {"Course": "default_grading_scale"},
+		"transactions": [
+			{"label": _("Course"), "items": ["Course"]},
+			{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
+		],
 	}
diff --git a/erpnext/education/doctype/grading_scale/test_grading_scale.py b/erpnext/education/doctype/grading_scale/test_grading_scale.py
index 3ebefda..09a092c 100644
--- a/erpnext/education/doctype/grading_scale/test_grading_scale.py
+++ b/erpnext/education/doctype/grading_scale/test_grading_scale.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Grading Scale')
 
+
 class TestGradingScale(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/guardian/guardian.py b/erpnext/education/doctype/guardian/guardian.py
index aae651b..a456e08 100644
--- a/erpnext/education/doctype/guardian/guardian.py
+++ b/erpnext/education/doctype/guardian/guardian.py
@@ -19,12 +19,15 @@
 	def load_students(self):
 		"""Load `students` from the database"""
 		self.students = []
-		students = frappe.get_all("Student Guardian", filters={"guardian":self.name}, fields=["parent"])
+		students = frappe.get_all("Student Guardian", filters={"guardian": self.name}, fields=["parent"])
 		for student in students:
-			self.append("students", {
-				"student":student.parent,
-				"student_name": frappe.db.get_value("Student", student.parent, "title")
-			})
+			self.append(
+				"students",
+				{
+					"student": student.parent,
+					"student_name": frappe.db.get_value("Student", student.parent, "title"),
+				},
+			)
 
 	def validate(self):
 		self.students = []
@@ -36,17 +39,19 @@
 	if not guardian_doc.email_address:
 		frappe.throw(_("Please set Email Address"))
 	else:
-		guardian_as_user = frappe.get_value('User', dict(email=guardian_doc.email_address))
+		guardian_as_user = frappe.get_value("User", dict(email=guardian_doc.email_address))
 		if guardian_as_user:
 			frappe.msgprint(_("User {0} already exists").format(getlink("User", guardian_as_user)))
 			return guardian_as_user
 		else:
-			user = frappe.get_doc({
-				"doctype": "User",
-				"first_name": guardian_doc.guardian_name,
-				"email": guardian_doc.email_address,
-				"user_type": "Website User",
-				"send_welcome_email": 1
-			}).insert(ignore_permissions = True)
+			user = frappe.get_doc(
+				{
+					"doctype": "User",
+					"first_name": guardian_doc.guardian_name,
+					"email": guardian_doc.email_address,
+					"user_type": "Website User",
+					"send_welcome_email": 1,
+				}
+			).insert(ignore_permissions=True)
 			frappe.msgprint(_("User {0} created").format(getlink("User", user.name)))
 			return user.name
diff --git a/erpnext/education/doctype/guardian/test_guardian.py b/erpnext/education/doctype/guardian/test_guardian.py
index f474ed5..de3638c 100644
--- a/erpnext/education/doctype/guardian/test_guardian.py
+++ b/erpnext/education/doctype/guardian/test_guardian.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Guardian')
 
+
 class TestGuardian(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/instructor/instructor.py b/erpnext/education/doctype/instructor/instructor.py
index 0076240..24e0607 100644
--- a/erpnext/education/doctype/instructor/instructor.py
+++ b/erpnext/education/doctype/instructor/instructor.py
@@ -14,30 +14,37 @@
 		if not naming_method:
 			frappe.throw(_("Please setup Instructor Naming System in Education > Education Settings"))
 		else:
-			if naming_method == 'Naming Series':
+			if naming_method == "Naming Series":
 				set_name_by_naming_series(self)
-			elif naming_method == 'Employee Number':
+			elif naming_method == "Employee Number":
 				if not self.employee:
 					frappe.throw(_("Please select Employee"))
 				self.name = self.employee
-			elif naming_method == 'Full Name':
+			elif naming_method == "Full Name":
 				self.name = self.instructor_name
 
 	def validate(self):
 		self.validate_duplicate_employee()
 
 	def validate_duplicate_employee(self):
-		if self.employee and frappe.db.get_value("Instructor", {'employee': self.employee, 'name': ['!=', self.name]}, 'name'):
+		if self.employee and frappe.db.get_value(
+			"Instructor", {"employee": self.employee, "name": ["!=", self.name]}, "name"
+		):
 			frappe.throw(_("Employee ID is linked with another instructor"))
 
+
 def get_timeline_data(doctype, name):
 	"""Return timeline for course schedule"""
-	return dict(frappe.db.sql(
-		"""
+	return dict(
+		frappe.db.sql(
+			"""
 			SELECT unix_timestamp(`schedule_date`), count(*)
 			FROM `tabCourse Schedule`
 			WHERE
 				instructor=%s and
 				`schedule_date` > date_sub(curdate(), interval 1 year)
 			GROUP BY schedule_date
-		""", name))
+		""",
+			name,
+		)
+	)
diff --git a/erpnext/education/doctype/instructor/instructor_dashboard.py b/erpnext/education/doctype/instructor/instructor_dashboard.py
index eae67ac..ead10ca 100644
--- a/erpnext/education/doctype/instructor/instructor_dashboard.py
+++ b/erpnext/education/doctype/instructor/instructor_dashboard.py
@@ -6,20 +6,12 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on the course schedules of this Instructor'),
-		'fieldname': 'instructor',
-		'non_standard_fieldnames': {
-			'Assessment Plan': 'supervisor'
-		},
-		'transactions': [
-			{
-				'label': _('Course and Assessment'),
-				'items': ['Course Schedule', 'Assessment Plan']
-			},
-			{
-				'label': _('Students'),
-				'items': ['Student Group']
-			}
-		]
+		"heatmap": True,
+		"heatmap_message": _("This is based on the course schedules of this Instructor"),
+		"fieldname": "instructor",
+		"non_standard_fieldnames": {"Assessment Plan": "supervisor"},
+		"transactions": [
+			{"label": _("Course and Assessment"), "items": ["Course Schedule", "Assessment Plan"]},
+			{"label": _("Students"), "items": ["Student Group"]},
+		],
 	}
diff --git a/erpnext/education/doctype/instructor/test_instructor.py b/erpnext/education/doctype/instructor/test_instructor.py
index 4eab37a..ee1e81d 100644
--- a/erpnext/education/doctype/instructor/test_instructor.py
+++ b/erpnext/education/doctype/instructor/test_instructor.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Instructor')
 
+
 class TestInstructor(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/program/program.py b/erpnext/education/doctype/program/program.py
index a9ce644..5250f8c 100644
--- a/erpnext/education/doctype/program/program.py
+++ b/erpnext/education/doctype/program/program.py
@@ -7,8 +7,9 @@
 
 
 class Program(Document):
-
 	def get_course_list(self):
 		program_course_list = self.courses
-		course_list = [frappe.get_doc("Course", program_course.course) for program_course in program_course_list]
+		course_list = [
+			frappe.get_doc("Course", program_course.course) for program_course in program_course_list
+		]
 		return course_list
diff --git a/erpnext/education/doctype/program/program_dashboard.py b/erpnext/education/doctype/program/program_dashboard.py
index 6696076..2182061 100644
--- a/erpnext/education/doctype/program/program_dashboard.py
+++ b/erpnext/education/doctype/program/program_dashboard.py
@@ -3,23 +3,11 @@
 
 def get_data():
 	return {
-		'fieldname': 'program',
-		'transactions': [
-			{
-				'label': _('Admission and Enrollment'),
-				'items': ['Student Applicant', 'Program Enrollment']
-			},
-			{
-				'label': _('Student Activity'),
-				'items': ['Student Group', 'Student Log']
-			},
-			{
-				'label': _('Fee'),
-				'items': ['Fees','Fee Structure', 'Fee Schedule']
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			}
-		]
+		"fieldname": "program",
+		"transactions": [
+			{"label": _("Admission and Enrollment"), "items": ["Student Applicant", "Program Enrollment"]},
+			{"label": _("Student Activity"), "items": ["Student Group", "Student Log"]},
+			{"label": _("Fee"), "items": ["Fees", "Fee Structure", "Fee Schedule"]},
+			{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
+		],
 	}
diff --git a/erpnext/education/doctype/program/test_program.py b/erpnext/education/doctype/program/test_program.py
index cb8926b..c3dbad2 100644
--- a/erpnext/education/doctype/program/test_program.py
+++ b/erpnext/education/doctype/program/test_program.py
@@ -11,32 +11,30 @@
 test_data = {
 	"program_name": "_Test Program",
 	"description": "_Test Program",
-	"course": [{
-		"course_name": "_Test Course 1",
-		"topic": [{
-				"topic_name": "_Test Topic 1-1",
-				"content": [{
-					"type": "Article",
-					"name": "_Test Article 1-1"
-				}, {
-					"type": "Article",
-					"name": "_Test Article 1-2"
-				}]
-			},
-			{
-				"topic_name": "_Test Topic 1-2",
-				"content": [{
-					"type": "Article",
-					"name": "_Test Article 1-3"
-				}, {
-					"type": "Article",
-					"name": "_Test Article 1-4"
-				}]
-			}
-		]
-	}]
+	"course": [
+		{
+			"course_name": "_Test Course 1",
+			"topic": [
+				{
+					"topic_name": "_Test Topic 1-1",
+					"content": [
+						{"type": "Article", "name": "_Test Article 1-1"},
+						{"type": "Article", "name": "_Test Article 1-2"},
+					],
+				},
+				{
+					"topic_name": "_Test Topic 1-2",
+					"content": [
+						{"type": "Article", "name": "_Test Article 1-3"},
+						{"type": "Article", "name": "_Test Article 1-4"},
+					],
+				},
+			],
+		}
+	],
 }
 
+
 class TestProgram(unittest.TestCase):
 	def setUp(self):
 		make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
@@ -53,17 +51,21 @@
 			for entry in frappe.get_all(dt):
 				frappe.delete_doc(dt, entry.program)
 
+
 def make_program(name):
-	program = frappe.get_doc({
-		"doctype": "Program",
-		"program_name": name,
-		"program_code": name,
-		"description": "_test description",
-		"is_published": True,
-		"is_featured": True,
-	}).insert()
+	program = frappe.get_doc(
+		{
+			"doctype": "Program",
+			"program_name": name,
+			"program_code": name,
+			"description": "_test description",
+			"is_published": True,
+			"is_featured": True,
+		}
+	).insert()
 	return program.name
 
+
 def make_program_and_linked_courses(program_name, course_name_list):
 	try:
 		program = frappe.get_doc("Program", program_name)
@@ -76,15 +78,19 @@
 	program.save()
 	return program
 
+
 def setup_program():
-	topic_list = [course['topic'] for course in test_data['course']]
+	topic_list = [course["topic"] for course in test_data["course"]]
 	for topic in topic_list[0]:
-		make_topic_and_linked_content(topic['topic_name'], topic['content'])
+		make_topic_and_linked_content(topic["topic_name"], topic["content"])
 
-	all_courses_list = [{'course': course['course_name'], 'topic': [topic['topic_name'] for topic in course['topic']]} for course in test_data['course']] # returns [{'course': 'Applied Math', 'topic': ['Trignometry', 'Geometry']}]
+	all_courses_list = [
+		{"course": course["course_name"], "topic": [topic["topic_name"] for topic in course["topic"]]}
+		for course in test_data["course"]
+	]  # returns [{'course': 'Applied Math', 'topic': ['Trignometry', 'Geometry']}]
 	for course in all_courses_list:
-		make_course_and_linked_topic(course['course'], course['topic'])
+		make_course_and_linked_topic(course["course"], course["topic"])
 
-	course_list = [course['course_name'] for course in test_data['course']]
-	program = make_program_and_linked_courses(test_data['program_name'], course_list)
+	course_list = [course["course_name"] for course in test_data["course"]]
+	program = make_program_and_linked_courses(test_data["program_name"], course_list)
 	return program
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
index 4d0f3a9..69d281b 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py
@@ -27,45 +27,64 @@
 		self.create_course_enrollments()
 
 	def validate_academic_year(self):
-		start_date, end_date = frappe.db.get_value("Academic Year", self.academic_year, ["year_start_date", "year_end_date"])
+		start_date, end_date = frappe.db.get_value(
+			"Academic Year", self.academic_year, ["year_start_date", "year_end_date"]
+		)
 		if self.enrollment_date:
 			if start_date and getdate(self.enrollment_date) < getdate(start_date):
-				frappe.throw(_("Enrollment Date cannot be before the Start Date of the Academic Year {0}").format(
-					get_link_to_form("Academic Year", self.academic_year)))
+				frappe.throw(
+					_("Enrollment Date cannot be before the Start Date of the Academic Year {0}").format(
+						get_link_to_form("Academic Year", self.academic_year)
+					)
+				)
 
 			if end_date and getdate(self.enrollment_date) > getdate(end_date):
-				frappe.throw(_("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
-					get_link_to_form("Academic Year", self.academic_year)))
+				frappe.throw(
+					_("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
+						get_link_to_form("Academic Year", self.academic_year)
+					)
+				)
 
 	def validate_academic_term(self):
-		start_date, end_date = frappe.db.get_value("Academic Term", self.academic_term, ["term_start_date", "term_end_date"])
+		start_date, end_date = frappe.db.get_value(
+			"Academic Term", self.academic_term, ["term_start_date", "term_end_date"]
+		)
 		if self.enrollment_date:
 			if start_date and getdate(self.enrollment_date) < getdate(start_date):
-				frappe.throw(_("Enrollment Date cannot be before the Start Date of the Academic Term {0}").format(
-					get_link_to_form("Academic Term", self.academic_term)))
+				frappe.throw(
+					_("Enrollment Date cannot be before the Start Date of the Academic Term {0}").format(
+						get_link_to_form("Academic Term", self.academic_term)
+					)
+				)
 
 			if end_date and getdate(self.enrollment_date) > getdate(end_date):
-				frappe.throw(_("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
-					get_link_to_form("Academic Term", self.academic_term)))
+				frappe.throw(
+					_("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
+						get_link_to_form("Academic Term", self.academic_term)
+					)
+				)
 
 	def validate_duplication(self):
-		enrollment = frappe.get_all("Program Enrollment", filters={
-			"student": self.student,
-			"program": self.program,
-			"academic_year": self.academic_year,
-			"academic_term": self.academic_term,
-			"docstatus": ("<", 2),
-			"name": ("!=", self.name)
-		})
+		enrollment = frappe.get_all(
+			"Program Enrollment",
+			filters={
+				"student": self.student,
+				"program": self.program,
+				"academic_year": self.academic_year,
+				"academic_term": self.academic_term,
+				"docstatus": ("<", 2),
+				"name": ("!=", self.name),
+			},
+		)
 		if enrollment:
 			frappe.throw(_("Student is already enrolled."))
 
 	def update_student_joining_date(self):
-		table = frappe.qb.DocType('Program Enrollment')
+		table = frappe.qb.DocType("Program Enrollment")
 		date = (
 			frappe.qb.from_(table)
-				.select(Min(table.enrollment_date).as_('enrollment_date'))
-				.where(table.student == self.student)
+			.select(Min(table.enrollment_date).as_("enrollment_date"))
+			.where(table.student == self.student)
 		).run(as_dict=True)
 
 		if date:
@@ -73,45 +92,59 @@
 
 	def make_fee_records(self):
 		from erpnext.education.api import get_fee_components
+
 		fee_list = []
 		for d in self.fees:
 			fee_components = get_fee_components(d.fee_structure)
 			if fee_components:
 				fees = frappe.new_doc("Fees")
-				fees.update({
-					"student": self.student,
-					"academic_year": self.academic_year,
-					"academic_term": d.academic_term,
-					"fee_structure": d.fee_structure,
-					"program": self.program,
-					"due_date": d.due_date,
-					"student_name": self.student_name,
-					"program_enrollment": self.name,
-					"components": fee_components
-				})
+				fees.update(
+					{
+						"student": self.student,
+						"academic_year": self.academic_year,
+						"academic_term": d.academic_term,
+						"fee_structure": d.fee_structure,
+						"program": self.program,
+						"due_date": d.due_date,
+						"student_name": self.student_name,
+						"program_enrollment": self.name,
+						"components": fee_components,
+					}
+				)
 
 				fees.save()
 				fees.submit()
 				fee_list.append(fees.name)
 		if fee_list:
-			fee_list = ["""<a href="/app/Form/Fees/%s" target="_blank">%s</a>""" % \
-				(fee, fee) for fee in fee_list]
+			fee_list = [
+				"""<a href="/app/Form/Fees/%s" target="_blank">%s</a>""" % (fee, fee) for fee in fee_list
+			]
 			msgprint(_("Fee Records Created - {0}").format(comma_and(fee_list)))
 
-
 	@frappe.whitelist()
 	def get_courses(self):
-		return frappe.db.sql('''select course from `tabProgram Course` where parent = %s and required = 1''', (self.program), as_dict=1)
+		return frappe.db.sql(
+			"""select course from `tabProgram Course` where parent = %s and required = 1""",
+			(self.program),
+			as_dict=1,
+		)
 
 	def create_course_enrollments(self):
 		student = frappe.get_doc("Student", self.student)
 		course_list = [course.course for course in self.courses]
 		for course_name in course_list:
-			student.enroll_in_course(course_name=course_name, program_enrollment=self.name, enrollment_date=self.enrollment_date)
+			student.enroll_in_course(
+				course_name=course_name, program_enrollment=self.name, enrollment_date=self.enrollment_date
+			)
 
 	def get_all_course_enrollments(self):
-		course_enrollment_names = frappe.get_list("Course Enrollment", filters={'program_enrollment': self.name})
-		return [frappe.get_doc('Course Enrollment', course_enrollment.name) for course_enrollment in course_enrollment_names]
+		course_enrollment_names = frappe.get_list(
+			"Course Enrollment", filters={"program_enrollment": self.name}
+		)
+		return [
+			frappe.get_doc("Course Enrollment", course_enrollment.name)
+			for course_enrollment in course_enrollment_names
+		]
 
 	def get_quiz_progress(self):
 		student = frappe.get_doc("Student", self.student)
@@ -120,8 +153,8 @@
 		for course_enrollment in self.get_all_course_enrollments():
 			course_progress = course_enrollment.get_progress(student)
 			for progress_item in course_progress:
-				if progress_item['content_type'] == "Quiz":
-					progress_item['course'] = course_enrollment.course
+				if progress_item["content_type"] == "Quiz":
+					progress_item["course"] = course_enrollment.course
 					progress_list.append(progress_item)
 		if not progress_list:
 			return None
@@ -130,27 +163,27 @@
 		quiz_progress.program = self.program
 		return quiz_progress
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_program_courses(doctype, txt, searchfield, start, page_len, filters):
-	if not filters.get('program'):
+	if not filters.get("program"):
 		frappe.msgprint(_("Please select a Program first."))
 		return []
 
-	return frappe.db.sql("""select course, course_name from `tabProgram Course`
+	return frappe.db.sql(
+		"""select course, course_name from `tabProgram Course`
 		where  parent = %(program)s and course like %(txt)s {match_cond}
 		order by
 			if(locate(%(_txt)s, course), locate(%(_txt)s, course), 99999),
 			idx desc,
 			`tabProgram Course`.course asc
 		limit {start}, {page_len}""".format(
-			match_cond=get_match_cond(doctype),
-			start=start,
-			page_len=page_len), {
-				"txt": "%{0}%".format(txt),
-				"_txt": txt.replace('%', ''),
-				"program": filters['program']
-			})
+			match_cond=get_match_cond(doctype), start=start, page_len=page_len
+		),
+		{"txt": "%{0}%".format(txt), "_txt": txt.replace("%", ""), "program": filters["program"]},
+	)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
@@ -161,14 +194,19 @@
 	if not filters.get("academic_year"):
 		filters["academic_year"] = frappe.defaults.get_defaults().academic_year
 
-	enrolled_students = frappe.get_list("Program Enrollment", filters={
-		"academic_term": filters.get('academic_term'),
-		"academic_year": filters.get('academic_year')
-	}, fields=["student"])
+	enrolled_students = frappe.get_list(
+		"Program Enrollment",
+		filters={
+			"academic_term": filters.get("academic_term"),
+			"academic_year": filters.get("academic_year"),
+		},
+		fields=["student"],
+	)
 
 	students = [d.student for d in enrolled_students] if enrolled_students else [""]
 
-	return frappe.db.sql("""select
+	return frappe.db.sql(
+		"""select
 			name, title from tabStudent
 		where
 			name not in (%s)
@@ -176,8 +214,7 @@
 			`%s` LIKE %s
 		order by
 			idx desc, name
-		limit %s, %s"""%(
-			", ".join(['%s']*len(students)), searchfield, "%s", "%s", "%s"),
-			tuple(students + ["%%%s%%" % txt, start, page_len]
-		)
+		limit %s, %s"""
+		% (", ".join(["%s"] * len(students)), searchfield, "%s", "%s", "%s"),
+		tuple(students + ["%%%s%%" % txt, start, page_len]),
 	)
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py b/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py
index 14ed95d..c308961 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py
@@ -3,17 +3,7 @@
 
 def get_data():
 	return {
-		'fieldname': 'program_enrollment',
-		'transactions': [
-			{
-				'label': _('Course and Fee'),
-				'items': ['Course Enrollment', 'Fees']
-			}
-		],
-		'reports': [
-			{
-				'label': _('Report'),
-				'items': ['Student and Guardian Contact Details']
-			}
-		]
+		"fieldname": "program_enrollment",
+		"transactions": [{"label": _("Course and Fee"), "items": ["Course Enrollment", "Fees"]}],
+		"reports": [{"label": _("Report"), "items": ["Student and Guardian Contact Details"]}],
 	}
diff --git a/erpnext/education/doctype/program_enrollment/test_program_enrollment.py b/erpnext/education/doctype/program_enrollment/test_program_enrollment.py
index dda2465..4d43175 100644
--- a/erpnext/education/doctype/program_enrollment/test_program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/test_program_enrollment.py
@@ -10,9 +10,14 @@
 
 
 class TestProgramEnrollment(unittest.TestCase):
-
 	def setUp(self):
-		create_student({"first_name": "_Test Name", "last_name": "_Test Last Name", "email": "_test_student@example.com"})
+		create_student(
+			{
+				"first_name": "_Test Name",
+				"last_name": "_Test Last Name",
+				"email": "_test_student@example.com",
+			}
+		)
 		make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
 
 	def test_create_course_enrollments(self):
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
index 7ffa077..9e72876 100644
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
+++ b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
@@ -12,7 +12,7 @@
 
 class ProgramEnrollmentTool(Document):
 	def onload(self):
-		academic_term_reqd = cint(frappe.db.get_single_value('Education Settings', 'academic_term_reqd'))
+		academic_term_reqd = cint(frappe.db.get_single_value("Education Settings", "academic_term_reqd"))
 		self.set_onload("academic_term_reqd", academic_term_reqd)
 
 	@frappe.whitelist()
@@ -25,22 +25,36 @@
 		elif not self.academic_year:
 			frappe.throw(_("Mandatory field - Academic Year"))
 		else:
-			condition = 'and academic_term=%(academic_term)s' if self.academic_term else " "
+			condition = "and academic_term=%(academic_term)s" if self.academic_term else " "
 			if self.get_students_from == "Student Applicant":
-				students = frappe.db.sql('''select name as student_applicant, title as student_name from `tabStudent Applicant`
-					where application_status="Approved" and program=%(program)s and academic_year=%(academic_year)s {0}'''
-					.format(condition), self.as_dict(), as_dict=1)
+				students = frappe.db.sql(
+					"""select name as student_applicant, title as student_name from `tabStudent Applicant`
+					where application_status="Approved" and program=%(program)s and academic_year=%(academic_year)s {0}""".format(
+						condition
+					),
+					self.as_dict(),
+					as_dict=1,
+				)
 			elif self.get_students_from == "Program Enrollment":
-				condition2 = 'and student_batch_name=%(student_batch)s' if self.student_batch else " "
-				students = frappe.db.sql('''select student, student_name, student_batch_name, student_category from `tabProgram Enrollment`
-					where program=%(program)s and academic_year=%(academic_year)s {0} {1} and docstatus != 2'''
-					.format(condition, condition2), self.as_dict(), as_dict=1)
+				condition2 = "and student_batch_name=%(student_batch)s" if self.student_batch else " "
+				students = frappe.db.sql(
+					"""select student, student_name, student_batch_name, student_category from `tabProgram Enrollment`
+					where program=%(program)s and academic_year=%(academic_year)s {0} {1} and docstatus != 2""".format(
+						condition, condition2
+					),
+					self.as_dict(),
+					as_dict=1,
+				)
 
 				student_list = [d.student for d in students]
 				if student_list:
-					inactive_students = frappe.db.sql('''
-						select name as student, title as student_name from `tabStudent` where name in (%s) and enabled = 0''' %
-						', '.join(['%s']*len(student_list)), tuple(student_list), as_dict=1)
+					inactive_students = frappe.db.sql(
+						"""
+						select name as student, title as student_name from `tabStudent` where name in (%s) and enabled = 0"""
+						% ", ".join(["%s"] * len(student_list)),
+						tuple(student_list),
+						as_dict=1,
+					)
 
 					for student in students:
 						if student.student in [d.student for d in inactive_students]:
@@ -55,7 +69,9 @@
 	def enroll_students(self):
 		total = len(self.students)
 		for i, stud in enumerate(self.students):
-			frappe.publish_realtime("program_enrollment_tool", dict(progress=[i+1, total]), user=frappe.session.user)
+			frappe.publish_realtime(
+				"program_enrollment_tool", dict(progress=[i + 1, total]), user=frappe.session.user
+			)
 			if stud.student:
 				prog_enrollment = frappe.new_doc("Program Enrollment")
 				prog_enrollment.student = stud.student
@@ -64,12 +80,16 @@
 				prog_enrollment.program = self.new_program
 				prog_enrollment.academic_year = self.new_academic_year
 				prog_enrollment.academic_term = self.new_academic_term
-				prog_enrollment.student_batch_name = stud.student_batch_name if stud.student_batch_name else self.new_student_batch
+				prog_enrollment.student_batch_name = (
+					stud.student_batch_name if stud.student_batch_name else self.new_student_batch
+				)
 				prog_enrollment.save()
 			elif stud.student_applicant:
 				prog_enrollment = enroll_student(stud.student_applicant)
 				prog_enrollment.academic_year = self.academic_year
 				prog_enrollment.academic_term = self.academic_term
-				prog_enrollment.student_batch_name = stud.student_batch_name if stud.student_batch_name else self.new_student_batch
+				prog_enrollment.student_batch_name = (
+					stud.student_batch_name if stud.student_batch_name else self.new_student_batch
+				)
 				prog_enrollment.save()
 		frappe.msgprint(_("{0} Students have been enrolled").format(total))
diff --git a/erpnext/education/doctype/question/question.py b/erpnext/education/doctype/question/question.py
index aa6cf9f..99910b3 100644
--- a/erpnext/education/doctype/question/question.py
+++ b/erpnext/education/doctype/question/question.py
@@ -8,7 +8,6 @@
 
 
 class Question(Document):
-
 	def validate(self):
 		self.check_at_least_one_option()
 		self.check_minimum_one_correct_answer()
diff --git a/erpnext/education/doctype/quiz/quiz.py b/erpnext/education/doctype/quiz/quiz.py
index 9ad7252d..7a9cdf3 100644
--- a/erpnext/education/doctype/quiz/quiz.py
+++ b/erpnext/education/doctype/quiz/quiz.py
@@ -13,11 +13,14 @@
 			frappe.throw(_("Passing Score value should be between 0 and 100"))
 
 	def allowed_attempt(self, enrollment, quiz_name):
-		if self.max_attempts ==  0:
+		if self.max_attempts == 0:
 			return True
 
 		try:
-			if len(frappe.get_all("Quiz Activity", {'enrollment': enrollment.name, 'quiz': quiz_name})) >= self.max_attempts:
+			if (
+				len(frappe.get_all("Quiz Activity", {"enrollment": enrollment.name, "quiz": quiz_name}))
+				>= self.max_attempts
+			):
 				frappe.msgprint(_("Maximum attempts for this quiz reached!"))
 				return False
 			else:
@@ -25,30 +28,29 @@
 		except Exception as e:
 			return False
 
-
 	def evaluate(self, response_dict, quiz_name):
-		questions = [frappe.get_doc('Question', question.question_link) for question in self.question]
-		answers = {q.name:q.get_answer() for q in questions}
+		questions = [frappe.get_doc("Question", question.question_link) for question in self.question]
+		answers = {q.name: q.get_answer() for q in questions}
 		result = {}
 		for key in answers:
 			try:
 				if isinstance(response_dict[key], list):
 					is_correct = compare_list_elementwise(response_dict[key], answers[key])
 				else:
-					is_correct = (response_dict[key] == answers[key])
+					is_correct = response_dict[key] == answers[key]
 			except Exception as e:
 				is_correct = False
 			result[key] = is_correct
-		score = (sum(result.values()) * 100 ) / len(answers)
+		score = (sum(result.values()) * 100) / len(answers)
 		if score >= self.passing_score:
 			status = "Pass"
 		else:
 			status = "Fail"
 		return result, score, status
 
-
 	def get_questions(self):
-		return [frappe.get_doc('Question', question.question_link) for question in self.question]
+		return [frappe.get_doc("Question", question.question_link) for question in self.question]
+
 
 def compare_list_elementwise(*args):
 	try:
@@ -59,11 +61,12 @@
 	except TypeError:
 		frappe.throw(_("Compare List function takes on list arguments"))
 
+
 @frappe.whitelist()
 def get_topics_without_quiz(quiz):
 	data = []
-	for entry in frappe.db.get_all('Topic'):
-		topic = frappe.get_doc('Topic', entry.name)
+	for entry in frappe.db.get_all("Topic"):
+		topic = frappe.get_doc("Topic", entry.name)
 		topic_contents = [tc.content for tc in topic.topic_content]
 		if not topic_contents or quiz not in topic_contents:
 			data.append(topic.name)
diff --git a/erpnext/education/doctype/room/room_dashboard.py b/erpnext/education/doctype/room/room_dashboard.py
index b710722..dfc295c 100644
--- a/erpnext/education/doctype/room/room_dashboard.py
+++ b/erpnext/education/doctype/room/room_dashboard.py
@@ -6,15 +6,9 @@
 
 def get_data():
 	return {
-		'fieldname': 'room',
-		'transactions': [
-			{
-				'label': _('Course'),
-				'items': ['Course Schedule']
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan']
-			}
-		]
+		"fieldname": "room",
+		"transactions": [
+			{"label": _("Course"), "items": ["Course Schedule"]},
+			{"label": _("Assessment"), "items": ["Assessment Plan"]},
+		],
 	}
diff --git a/erpnext/education/doctype/room/test_room.py b/erpnext/education/doctype/room/test_room.py
index 68c97c7..ea0baf2 100644
--- a/erpnext/education/doctype/room/test_room.py
+++ b/erpnext/education/doctype/room/test_room.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Room')
 
+
 class TestRoom(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student/student.py b/erpnext/education/doctype/student/student.py
index 44a3277..712d742 100644
--- a/erpnext/education/doctype/student/student.py
+++ b/erpnext/education/doctype/student/student.py
@@ -26,7 +26,9 @@
 	def validate_dates(self):
 		for sibling in self.siblings:
 			if sibling.date_of_birth and getdate(sibling.date_of_birth) > getdate():
-				frappe.throw(_("Row {0}:Sibling Date of Birth cannot be greater than today.").format(sibling.idx))
+				frappe.throw(
+					_("Row {0}:Sibling Date of Birth cannot be greater than today.").format(sibling.idx)
+				)
 
 		if self.date_of_birth and getdate(self.date_of_birth) >= getdate(today()):
 			frappe.throw(_("Date of Birth cannot be greater than today."))
@@ -34,7 +36,11 @@
 		if self.date_of_birth and getdate(self.date_of_birth) >= getdate(self.joining_date):
 			frappe.throw(_("Date of Birth cannot be greater than Joining Date."))
 
-		if self.joining_date and self.date_of_leaving and getdate(self.joining_date) > getdate(self.date_of_leaving):
+		if (
+			self.joining_date
+			and self.date_of_leaving
+			and getdate(self.joining_date) > getdate(self.date_of_leaving)
+		):
 			frappe.throw(_("Joining Date can not be greater than Leaving Date"))
 
 	def update_student_name_in_linked_doctype(self):
@@ -43,36 +49,54 @@
 			meta = frappe.get_meta(d)
 			if not meta.issingle:
 				if "student_name" in [f.fieldname for f in meta.fields]:
-					frappe.db.sql("""UPDATE `tab{0}` set student_name = %s where {1} = %s"""
-						.format(d, linked_doctypes[d]["fieldname"][0]),(self.title, self.name))
+					frappe.db.sql(
+						"""UPDATE `tab{0}` set student_name = %s where {1} = %s""".format(
+							d, linked_doctypes[d]["fieldname"][0]
+						),
+						(self.title, self.name),
+					)
 
-				if "child_doctype" in linked_doctypes[d].keys() and "student_name" in \
-					[f.fieldname for f in frappe.get_meta(linked_doctypes[d]["child_doctype"]).fields]:
-					frappe.db.sql("""UPDATE `tab{0}` set student_name = %s where {1} = %s"""
-						.format(linked_doctypes[d]["child_doctype"], linked_doctypes[d]["fieldname"][0]),(self.title, self.name))
+				if "child_doctype" in linked_doctypes[d].keys() and "student_name" in [
+					f.fieldname for f in frappe.get_meta(linked_doctypes[d]["child_doctype"]).fields
+				]:
+					frappe.db.sql(
+						"""UPDATE `tab{0}` set student_name = %s where {1} = %s""".format(
+							linked_doctypes[d]["child_doctype"], linked_doctypes[d]["fieldname"][0]
+						),
+						(self.title, self.name),
+					)
 
 	def check_unique(self):
 		"""Validates if the Student Applicant is Unique"""
-		student = frappe.db.sql("select name from `tabStudent` where student_applicant=%s and name!=%s", (self.student_applicant, self.name))
+		student = frappe.db.sql(
+			"select name from `tabStudent` where student_applicant=%s and name!=%s",
+			(self.student_applicant, self.name),
+		)
 		if student:
-			frappe.throw(_("Student {0} exist against student applicant {1}").format(student[0][0], self.student_applicant))
+			frappe.throw(
+				_("Student {0} exist against student applicant {1}").format(
+					student[0][0], self.student_applicant
+				)
+			)
 
 	def after_insert(self):
-		if not frappe.get_single('Education Settings').get('user_creation_skip'):
+		if not frappe.get_single("Education Settings").get("user_creation_skip"):
 			self.create_student_user()
 
 	def create_student_user(self):
 		"""Create a website user for student creation if not already exists"""
 		if not frappe.db.exists("User", self.student_email_id):
-			student_user = frappe.get_doc({
-				'doctype':'User',
-				'first_name': self.first_name,
-				'last_name': self.last_name,
-				'email': self.student_email_id,
-				'gender': self.gender,
-				'send_welcome_email': 1,
-				'user_type': 'Website User'
-				})
+			student_user = frappe.get_doc(
+				{
+					"doctype": "User",
+					"first_name": self.first_name,
+					"last_name": self.last_name,
+					"email": self.student_email_id,
+					"gender": self.gender,
+					"send_welcome_email": 1,
+					"user_type": "Website User",
+				}
+			)
 			student_user.flags.ignore_permissions = True
 			student_user.add_roles("Student")
 			student_user.save()
@@ -80,57 +104,77 @@
 	def update_applicant_status(self):
 		"""Updates Student Applicant status to Admitted"""
 		if self.student_applicant:
-			frappe.db.set_value("Student Applicant", self.student_applicant, "application_status", "Admitted")
+			frappe.db.set_value(
+				"Student Applicant", self.student_applicant, "application_status", "Admitted"
+			)
 
 	def get_all_course_enrollments(self):
 		"""Returns a list of course enrollments linked with the current student"""
-		course_enrollments = frappe.get_all("Course Enrollment", filters={"student": self.name}, fields=['course', 'name'])
+		course_enrollments = frappe.get_all(
+			"Course Enrollment", filters={"student": self.name}, fields=["course", "name"]
+		)
 		if not course_enrollments:
 			return None
 		else:
-			enrollments = {item['course']:item['name'] for item in course_enrollments}
+			enrollments = {item["course"]: item["name"] for item in course_enrollments}
 			return enrollments
 
 	def get_program_enrollments(self):
 		"""Returns a list of course enrollments linked with the current student"""
-		program_enrollments = frappe.get_all("Program Enrollment", filters={"student": self.name}, fields=['program'])
+		program_enrollments = frappe.get_all(
+			"Program Enrollment", filters={"student": self.name}, fields=["program"]
+		)
 		if not program_enrollments:
 			return None
 		else:
-			enrollments = [item['program'] for item in program_enrollments]
+			enrollments = [item["program"] for item in program_enrollments]
 			return enrollments
 
 	def get_topic_progress(self, course_enrollment_name, topic):
 		"""
 		Get Progress Dictionary of a student for a particular topic
-			:param self: Student Object
-			:param course_enrollment_name: Name of the Course Enrollment
-			:param topic: Topic DocType Object
+		        :param self: Student Object
+		        :param course_enrollment_name: Name of the Course Enrollment
+		        :param topic: Topic DocType Object
 		"""
 		contents = topic.get_contents()
 		progress = []
 		if contents:
 			for content in contents:
-				if content.doctype in ('Article', 'Video'):
+				if content.doctype in ("Article", "Video"):
 					status = check_content_completion(content.name, content.doctype, course_enrollment_name)
-					progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status})
-				elif content.doctype == 'Quiz':
+					progress.append(
+						{"content": content.name, "content_type": content.doctype, "is_complete": status}
+					)
+				elif content.doctype == "Quiz":
 					status, score, result, time_taken = check_quiz_completion(content, course_enrollment_name)
-					progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status, 'score': score, 'result': result})
+					progress.append(
+						{
+							"content": content.name,
+							"content_type": content.doctype,
+							"is_complete": status,
+							"score": score,
+							"result": result,
+						}
+					)
 		return progress
 
 	def enroll_in_program(self, program_name):
 		try:
-			enrollment = frappe.get_doc({
+			enrollment = frappe.get_doc(
+				{
 					"doctype": "Program Enrollment",
 					"student": self.name,
 					"academic_year": frappe.get_last_doc("Academic Year").name,
 					"program": program_name,
-					"enrollment_date": frappe.utils.datetime.datetime.now()
-				})
+					"enrollment_date": frappe.utils.datetime.datetime.now(),
+				}
+			)
 			enrollment.save(ignore_permissions=True)
 		except frappe.exceptions.ValidationError:
-			enrollment_name = frappe.get_list("Program Enrollment", filters={"student": self.name, "Program": program_name})[0].name
+			enrollment_name = frappe.get_list(
+				"Program Enrollment", filters={"student": self.name, "Program": program_name}
+			)[0].name
 			return frappe.get_doc("Program Enrollment", enrollment_name)
 		else:
 			enrollment.submit()
@@ -140,25 +184,40 @@
 		if enrollment_date is None:
 			enrollment_date = frappe.utils.datetime.datetime.now()
 		try:
-			enrollment = frappe.get_doc({
+			enrollment = frappe.get_doc(
+				{
 					"doctype": "Course Enrollment",
 					"student": self.name,
 					"course": course_name,
 					"program_enrollment": program_enrollment,
-					"enrollment_date": enrollment_date
-				})
+					"enrollment_date": enrollment_date,
+				}
+			)
 			enrollment.save(ignore_permissions=True)
 		except frappe.exceptions.ValidationError:
-			enrollment_name = frappe.get_list("Course Enrollment", filters={"student": self.name, "course": course_name, "program_enrollment": program_enrollment})[0].name
+			enrollment_name = frappe.get_list(
+				"Course Enrollment",
+				filters={
+					"student": self.name,
+					"course": course_name,
+					"program_enrollment": program_enrollment,
+				},
+			)[0].name
 			return frappe.get_doc("Course Enrollment", enrollment_name)
 		else:
 			return enrollment
 
+
 def get_timeline_data(doctype, name):
-	'''Return timeline for attendance'''
-	return dict(frappe.db.sql('''select unix_timestamp(`date`), count(*)
+	"""Return timeline for attendance"""
+	return dict(
+		frappe.db.sql(
+			"""select unix_timestamp(`date`), count(*)
 		from `tabStudent Attendance` where
 			student=%s
 			and `date` > date_sub(curdate(), interval 1 year)
 			and docstatus = 1 and status = 'Present'
-			group by date''', name))
+			group by date""",
+			name,
+		)
+	)
diff --git a/erpnext/education/doctype/student/student_dashboard.py b/erpnext/education/doctype/student/student_dashboard.py
index 3ae772d..bcc8521 100644
--- a/erpnext/education/doctype/student/student_dashboard.py
+++ b/erpnext/education/doctype/student/student_dashboard.py
@@ -3,36 +3,22 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on the attendance of this Student'),
-		'fieldname': 'student',
-		'non_standard_fieldnames': {
-			'Bank Account': 'party'
-		},
-		'transactions': [
+		"heatmap": True,
+		"heatmap_message": _("This is based on the attendance of this Student"),
+		"fieldname": "student",
+		"non_standard_fieldnames": {"Bank Account": "party"},
+		"transactions": [
+			{"label": _("Admission"), "items": ["Program Enrollment", "Course Enrollment"]},
 			{
-				'label': _('Admission'),
-				'items': ['Program Enrollment', 'Course Enrollment']
+				"label": _("Student Activity"),
+				"items": [
+					"Student Log",
+					"Student Group",
+				],
 			},
-			{
-				'label': _('Student Activity'),
-				'items': ['Student Log', 'Student Group', ]
-			},
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Result']
-			},
-			{
-				'label': _('Student LMS Activity'),
-				'items': ['Course Activity', 'Quiz Activity' ]
-			},
-			{
-				'label': _('Attendance'),
-				'items': ['Student Attendance', 'Student Leave Application']
-			},
-			{
-				'label': _('Fee'),
-				'items': ['Fees', 'Bank Account']
-			}
-		]
+			{"label": _("Assessment"), "items": ["Assessment Result"]},
+			{"label": _("Student LMS Activity"), "items": ["Course Activity", "Quiz Activity"]},
+			{"label": _("Attendance"), "items": ["Student Attendance", "Student Leave Application"]},
+			{"label": _("Fee"), "items": ["Fees", "Bank Account"]},
+		],
 	}
diff --git a/erpnext/education/doctype/student/test_student.py b/erpnext/education/doctype/student/test_student.py
index 0a85708..89449b0 100644
--- a/erpnext/education/doctype/student/test_student.py
+++ b/erpnext/education/doctype/student/test_student.py
@@ -7,10 +7,18 @@
 
 from erpnext.education.doctype.program.test_program import make_program_and_linked_courses
 
-test_records = frappe.get_test_records('Student')
+test_records = frappe.get_test_records("Student")
+
+
 class TestStudent(unittest.TestCase):
 	def setUp(self):
-		create_student({"first_name": "_Test Name", "last_name": "_Test Last Name", "email": "_test_student@example.com"})
+		create_student(
+			{
+				"first_name": "_Test Name",
+				"last_name": "_Test Last Name",
+				"email": "_test_student@example.com",
+			}
+		)
 		make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
 
 	def test_create_student_user(self):
@@ -20,9 +28,11 @@
 	def test_enroll_in_program(self):
 		student = get_student("_test_student@example.com")
 		enrollment = student.enroll_in_program("_Test Program 1")
-		test_enrollment = frappe.get_all("Program Enrollment", filters={"student": student.name, "Program": "_Test Program 1"})
+		test_enrollment = frappe.get_all(
+			"Program Enrollment", filters={"student": student.name, "Program": "_Test Program 1"}
+		)
 		self.assertTrue(len(test_enrollment))
-		self.assertEqual(test_enrollment[0]['name'], enrollment.name)
+		self.assertEqual(test_enrollment[0]["name"], enrollment.name)
 		frappe.db.rollback()
 
 	def test_get_program_enrollments(self):
@@ -51,16 +61,19 @@
 
 
 def create_student(student_dict):
-	student = get_student(student_dict['email'])
+	student = get_student(student_dict["email"])
 	if not student:
-		student = frappe.get_doc({
-			"doctype": "Student",
-			"first_name": student_dict['first_name'],
-			"last_name": student_dict['last_name'],
-			"student_email_id": student_dict['email']
-		}).insert()
+		student = frappe.get_doc(
+			{
+				"doctype": "Student",
+				"first_name": student_dict["first_name"],
+				"last_name": student_dict["last_name"],
+				"student_email_id": student_dict["email"],
+			}
+		).insert()
 	return student
 
+
 def get_student(email):
 	try:
 		student_id = frappe.get_all("Student", {"student_email_id": email}, ["name"])[0].name
diff --git a/erpnext/education/doctype/student_admission/student_admission.py b/erpnext/education/doctype/student_admission/student_admission.py
index b1fd780..6c775f0df 100644
--- a/erpnext/education/doctype/student_admission/student_admission.py
+++ b/erpnext/education/doctype/student_admission/student_admission.py
@@ -15,7 +15,7 @@
 		self.name = self.title
 
 	def validate(self):
-		if not self.route:		#pylint: disable=E0203
+		if not self.route:  # pylint: disable=E0203
 			self.route = "admissions/" + "-".join(self.title.split(" "))
 
 		if self.enable_admission_application and not self.program_details:
@@ -25,22 +25,35 @@
 		context.no_cache = 1
 		context.show_sidebar = True
 		context.title = self.title
-		context.parents = [{'name': 'admissions', 'title': _('All Student Admissions'), 'route': 'admissions' }]
+		context.parents = [
+			{"name": "admissions", "title": _("All Student Admissions"), "route": "admissions"}
+		]
 
 	def get_title(self):
 		return _("Admissions for {0}").format(self.academic_year)
 
 
 def get_list_context(context=None):
-	context.update({
-		"show_sidebar": True,
-		"title": _("Student Admissions"),
-		"get_list": get_admission_list,
-		"row_template": "education/doctype/student_admission/templates/student_admission_row.html",
-	})
+	context.update(
+		{
+			"show_sidebar": True,
+			"title": _("Student Admissions"),
+			"get_list": get_admission_list,
+			"row_template": "education/doctype/student_admission/templates/student_admission_row.html",
+		}
+	)
 
-def get_admission_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"):
-	return frappe.db.sql('''select name, title, academic_year, modified, admission_start_date, route,
+
+def get_admission_list(
+	doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"
+):
+	return frappe.db.sql(
+		"""select name, title, academic_year, modified, admission_start_date, route,
 		admission_end_date from `tabStudent Admission` where published=1 and admission_end_date >= %s
 		order by admission_end_date asc limit {0}, {1}
-		'''.format(limit_start, limit_page_length), [nowdate()], as_dict=1)
+		""".format(
+			limit_start, limit_page_length
+		),
+		[nowdate()],
+		as_dict=1,
+	)
diff --git a/erpnext/education/doctype/student_admission/test_student_admission.py b/erpnext/education/doctype/student_admission/test_student_admission.py
index 03867e2..82c720a 100644
--- a/erpnext/education/doctype/student_admission/test_student_admission.py
+++ b/erpnext/education/doctype/student_admission/test_student_admission.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Admission')
 
+
 class TestStudentAdmission(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_applicant/student_applicant.py b/erpnext/education/doctype/student_applicant/student_applicant.py
index 5dae9f6..f04ebb0 100644
--- a/erpnext/education/doctype/student_applicant/student_applicant.py
+++ b/erpnext/education/doctype/student_applicant/student_applicant.py
@@ -11,6 +11,7 @@
 class StudentApplicant(Document):
 	def autoname(self):
 		from frappe.model.naming import set_name_by_naming_series
+
 		if self.student_admission:
 			naming_series = None
 			if self.program:
@@ -40,37 +41,52 @@
 			frappe.throw(_("Date of Birth cannot be greater than today."))
 
 	def on_update_after_submit(self):
-		student = frappe.get_list("Student",  filters= {"student_applicant": self.name})
+		student = frappe.get_list("Student", filters={"student_applicant": self.name})
 		if student:
-			frappe.throw(_("Cannot change status as student {0} is linked with student application {1}").format(student[0].name, self.name))
+			frappe.throw(
+				_("Cannot change status as student {0} is linked with student application {1}").format(
+					student[0].name, self.name
+				)
+			)
 
 	def on_submit(self):
 		if self.paid and not self.student_admission:
-			frappe.throw(_("Please select Student Admission which is mandatory for the paid student applicant"))
+			frappe.throw(
+				_("Please select Student Admission which is mandatory for the paid student applicant")
+			)
 
 	def validation_from_student_admission(self):
 
 		student_admission = get_student_admission_data(self.student_admission, self.program)
 
-		if student_admission and student_admission.min_age and \
-			date_diff(nowdate(), add_years(getdate(self.date_of_birth), student_admission.min_age)) < 0:
-				frappe.throw(_("Not eligible for the admission in this program as per Date Of Birth"))
+		if (
+			student_admission
+			and student_admission.min_age
+			and date_diff(nowdate(), add_years(getdate(self.date_of_birth), student_admission.min_age)) < 0
+		):
+			frappe.throw(_("Not eligible for the admission in this program as per Date Of Birth"))
 
-		if student_admission and student_admission.max_age and \
-			date_diff(nowdate(), add_years(getdate(self.date_of_birth), student_admission.max_age)) > 0:
-				frappe.throw(_("Not eligible for the admission in this program as per Date Of Birth"))
-
+		if (
+			student_admission
+			and student_admission.max_age
+			and date_diff(nowdate(), add_years(getdate(self.date_of_birth), student_admission.max_age)) > 0
+		):
+			frappe.throw(_("Not eligible for the admission in this program as per Date Of Birth"))
 
 	def on_payment_authorized(self, *args, **kwargs):
-		self.db_set('paid', 1)
+		self.db_set("paid", 1)
 
 
 def get_student_admission_data(student_admission, program):
 
-	student_admission = frappe.db.sql("""select sa.admission_start_date, sa.admission_end_date,
+	student_admission = frappe.db.sql(
+		"""select sa.admission_start_date, sa.admission_end_date,
 		sap.program, sap.min_age, sap.max_age, sap.applicant_naming_series
 		from `tabStudent Admission` sa, `tabStudent Admission Program` sap
-		where sa.name = sap.parent and sa.name = %s and sap.program = %s""", (student_admission, program), as_dict=1)
+		where sa.name = sap.parent and sa.name = %s and sap.program = %s""",
+		(student_admission, program),
+		as_dict=1,
+	)
 
 	if student_admission:
 		return student_admission[0]
diff --git a/erpnext/education/doctype/student_applicant/test_student_applicant.py b/erpnext/education/doctype/student_applicant/test_student_applicant.py
index ba2e9c1..bd0e360 100644
--- a/erpnext/education/doctype/student_applicant/test_student_applicant.py
+++ b/erpnext/education/doctype/student_applicant/test_student_applicant.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Applicant')
 
+
 class TestStudentApplicant(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_attendance/student_attendance.py b/erpnext/education/doctype/student_attendance/student_attendance.py
index db0fd37..20f8fb7 100644
--- a/erpnext/education/doctype/student_attendance/student_attendance.py
+++ b/erpnext/education/doctype/student_attendance/student_attendance.py
@@ -24,76 +24,109 @@
 
 	def set_date(self):
 		if self.course_schedule:
-			self.date = frappe.db.get_value('Course Schedule', self.course_schedule, 'schedule_date')
+			self.date = frappe.db.get_value("Course Schedule", self.course_schedule, "schedule_date")
 
 	def validate_mandatory(self):
 		if not (self.student_group or self.course_schedule):
-			frappe.throw(_('{0} or {1} is mandatory').format(frappe.bold('Student Group'),
-				frappe.bold('Course Schedule')), title=_('Mandatory Fields'))
+			frappe.throw(
+				_("{0} or {1} is mandatory").format(
+					frappe.bold("Student Group"), frappe.bold("Course Schedule")
+				),
+				title=_("Mandatory Fields"),
+			)
 
 	def validate_date(self):
 		if not self.leave_application and getdate(self.date) > getdate():
-			frappe.throw(_('Attendance cannot be marked for future dates.'))
+			frappe.throw(_("Attendance cannot be marked for future dates."))
 
 		if self.student_group:
-			academic_year = frappe.db.get_value('Student Group', self.student_group, 'academic_year')
+			academic_year = frappe.db.get_value("Student Group", self.student_group, "academic_year")
 			if academic_year:
-				year_start_date, year_end_date = frappe.db.get_value('Academic Year', academic_year, ['year_start_date', 'year_end_date'])
+				year_start_date, year_end_date = frappe.db.get_value(
+					"Academic Year", academic_year, ["year_start_date", "year_end_date"]
+				)
 				if year_start_date and year_end_date:
-					if getdate(self.date) < getdate(year_start_date) or getdate(self.date) > getdate(year_end_date):
-						frappe.throw(_('Attendance cannot be marked outside of Academic Year {0}').format(academic_year))
+					if getdate(self.date) < getdate(year_start_date) or getdate(self.date) > getdate(
+						year_end_date
+					):
+						frappe.throw(
+							_("Attendance cannot be marked outside of Academic Year {0}").format(academic_year)
+						)
 
 	def set_student_group(self):
 		if self.course_schedule:
-			self.student_group = frappe.db.get_value('Course Schedule', self.course_schedule, 'student_group')
+			self.student_group = frappe.db.get_value(
+				"Course Schedule", self.course_schedule, "student_group"
+			)
 
 	def validate_student(self):
 		if self.course_schedule:
-			student_group = frappe.db.get_value('Course Schedule', self.course_schedule, 'student_group')
+			student_group = frappe.db.get_value("Course Schedule", self.course_schedule, "student_group")
 		else:
 			student_group = self.student_group
 		student_group_students = [d.student for d in get_student_group_students(student_group)]
 		if student_group and self.student not in student_group_students:
-			student_group_doc = get_link_to_form('Student Group', student_group)
-			frappe.throw(_('Student {0}: {1} does not belong to Student Group {2}').format(
-				frappe.bold(self.student), self.student_name, frappe.bold(student_group_doc)))
+			student_group_doc = get_link_to_form("Student Group", student_group)
+			frappe.throw(
+				_("Student {0}: {1} does not belong to Student Group {2}").format(
+					frappe.bold(self.student), self.student_name, frappe.bold(student_group_doc)
+				)
+			)
 
 	def validate_duplication(self):
 		"""Check if the Attendance Record is Unique"""
 		attendance_record = None
 		if self.course_schedule:
-			attendance_record = frappe.db.exists('Student Attendance', {
-				'student': self.student,
-				'course_schedule': self.course_schedule,
-				'docstatus': ('!=', 2),
-				'name': ('!=', self.name)
-			})
+			attendance_record = frappe.db.exists(
+				"Student Attendance",
+				{
+					"student": self.student,
+					"course_schedule": self.course_schedule,
+					"docstatus": ("!=", 2),
+					"name": ("!=", self.name),
+				},
+			)
 		else:
-			attendance_record = frappe.db.exists('Student Attendance', {
-				'student': self.student,
-				'student_group': self.student_group,
-				'date': self.date,
-				'docstatus': ('!=', 2),
-				'name': ('!=', self.name),
-				'course_schedule': ''
-			})
+			attendance_record = frappe.db.exists(
+				"Student Attendance",
+				{
+					"student": self.student,
+					"student_group": self.student_group,
+					"date": self.date,
+					"docstatus": ("!=", 2),
+					"name": ("!=", self.name),
+					"course_schedule": "",
+				},
+			)
 
 		if attendance_record:
-			record = get_link_to_form('Student Attendance', attendance_record)
-			frappe.throw(_('Student Attendance record {0} already exists against the Student {1}')
-				.format(record, frappe.bold(self.student)), title=_('Duplicate Entry'))
+			record = get_link_to_form("Student Attendance", attendance_record)
+			frappe.throw(
+				_("Student Attendance record {0} already exists against the Student {1}").format(
+					record, frappe.bold(self.student)
+				),
+				title=_("Duplicate Entry"),
+			)
 
 	def validate_is_holiday(self):
 		holiday_list = get_holiday_list()
 		if is_holiday(holiday_list, self.date):
-			frappe.throw(_('Attendance cannot be marked for {0} as it is a holiday.').format(
-				frappe.bold(formatdate(self.date))))
+			frappe.throw(
+				_("Attendance cannot be marked for {0} as it is a holiday.").format(
+					frappe.bold(formatdate(self.date))
+				)
+			)
+
 
 def get_holiday_list(company=None):
 	if not company:
-		company = get_default_company() or frappe.get_all('Company')[0].name
+		company = get_default_company() or frappe.get_all("Company")[0].name
 
-	holiday_list = frappe.get_cached_value('Company', company,  'default_holiday_list')
+	holiday_list = frappe.get_cached_value("Company", company, "default_holiday_list")
 	if not holiday_list:
-		frappe.throw(_('Please set a default Holiday List for Company {0}').format(frappe.bold(get_default_company())))
+		frappe.throw(
+			_("Please set a default Holiday List for Company {0}").format(
+				frappe.bold(get_default_company())
+			)
+		)
 	return holiday_list
diff --git a/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py b/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py
index 6758452..34132af 100644
--- a/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py
+++ b/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py
@@ -3,10 +3,10 @@
 
 def get_data():
 	return {
-		'reports': [
+		"reports": [
 			{
-				'label': _('Reports'),
-				'items': ['Student Monthly Attendance Sheet', 'Student Batch-Wise Attendance']
+				"label": _("Reports"),
+				"items": ["Student Monthly Attendance Sheet", "Student Batch-Wise Attendance"],
 			}
 		]
 	}
diff --git a/erpnext/education/doctype/student_attendance/test_student_attendance.py b/erpnext/education/doctype/student_attendance/test_student_attendance.py
index 6a43e30..e5b1841 100644
--- a/erpnext/education/doctype/student_attendance/test_student_attendance.py
+++ b/erpnext/education/doctype/student_attendance/test_student_attendance.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Attendance')
 
+
 class TestStudentAttendance(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py
index 92bb20c..c626a0f 100644
--- a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py
+++ b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py
@@ -9,6 +9,7 @@
 class StudentAttendanceTool(Document):
 	pass
 
+
 @frappe.whitelist()
 def get_student_attendance_records(based_on, date=None, student_group=None, course_schedule=None):
 	student_list = []
@@ -17,33 +18,39 @@
 	if based_on == "Course Schedule":
 		student_group = frappe.db.get_value("Course Schedule", course_schedule, "student_group")
 		if student_group:
-			student_list = frappe.get_all("Student Group Student", fields=["student", "student_name", "group_roll_number"],
-			filters={"parent": student_group, "active": 1}, order_by= "group_roll_number")
+			student_list = frappe.get_all(
+				"Student Group Student",
+				fields=["student", "student_name", "group_roll_number"],
+				filters={"parent": student_group, "active": 1},
+				order_by="group_roll_number",
+			)
 
 	if not student_list:
-		student_list = frappe.get_all("Student Group Student", fields=["student", "student_name", "group_roll_number"],
-			filters={"parent": student_group, "active": 1}, order_by= "group_roll_number")
+		student_list = frappe.get_all(
+			"Student Group Student",
+			fields=["student", "student_name", "group_roll_number"],
+			filters={"parent": student_group, "active": 1},
+			order_by="group_roll_number",
+		)
 
 	StudentAttendance = frappe.qb.DocType("Student Attendance")
 
 	if course_schedule:
 		student_attendance_list = (
 			frappe.qb.from_(StudentAttendance)
-				.select(StudentAttendance.student, StudentAttendance.status)
-				.where(
-					(StudentAttendance.course_schedule == course_schedule)
-				)
-			).run(as_dict=True)
+			.select(StudentAttendance.student, StudentAttendance.status)
+			.where((StudentAttendance.course_schedule == course_schedule))
+		).run(as_dict=True)
 	else:
 		student_attendance_list = (
 			frappe.qb.from_(StudentAttendance)
-				.select(StudentAttendance.student, StudentAttendance.status)
-				.where(
-					(StudentAttendance.student_group == student_group)
-					& (StudentAttendance.date == date)
-					& ((StudentAttendance.course_schedule == "") | (StudentAttendance.course_schedule.isnull()))
-				)
-			).run(as_dict=True)
+			.select(StudentAttendance.student, StudentAttendance.status)
+			.where(
+				(StudentAttendance.student_group == student_group)
+				& (StudentAttendance.date == date)
+				& ((StudentAttendance.course_schedule == "") | (StudentAttendance.course_schedule.isnull()))
+			)
+		).run(as_dict=True)
 
 	for attendance in student_attendance_list:
 		for student in student_list:
diff --git a/erpnext/education/doctype/student_batch_name/test_student_batch_name.py b/erpnext/education/doctype/student_batch_name/test_student_batch_name.py
index ad9b545..bf9639b 100644
--- a/erpnext/education/doctype/student_batch_name/test_student_batch_name.py
+++ b/erpnext/education/doctype/student_batch_name/test_student_batch_name.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Batch Name')
 
+
 class TestStudentBatchName(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_category/student_category_dashboard.py b/erpnext/education/doctype/student_category/student_category_dashboard.py
index ebb639e..d7a332c 100644
--- a/erpnext/education/doctype/student_category/student_category_dashboard.py
+++ b/erpnext/education/doctype/student_category/student_category_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'student_category',
-		'transactions': [
-			{
-				'label': _('Fee'),
-				'items': ['Fee Structure', 'Fee Schedule', 'Fees']
-			}
-		]
+		"fieldname": "student_category",
+		"transactions": [{"label": _("Fee"), "items": ["Fee Structure", "Fee Schedule", "Fees"]}],
 	}
diff --git a/erpnext/education/doctype/student_category/test_student_category.py b/erpnext/education/doctype/student_category/test_student_category.py
index 76469ff..5671e9f 100644
--- a/erpnext/education/doctype/student_category/test_student_category.py
+++ b/erpnext/education/doctype/student_category/test_student_category.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Category')
 
+
 class TestStudentCategory(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_group/student_group.py b/erpnext/education/doctype/student_group/student_group.py
index ceae036..a94489b 100644
--- a/erpnext/education/doctype/student_group/student_group.py
+++ b/erpnext/education/doctype/student_group/student_group.py
@@ -30,22 +30,45 @@
 		if cint(self.max_strength) < 0:
 			frappe.throw(_("""Max strength cannot be less than zero."""))
 		if self.max_strength and len(self.students) > self.max_strength:
-			frappe.throw(_("""Cannot enroll more than {0} students for this student group.""").format(self.max_strength))
+			frappe.throw(
+				_("""Cannot enroll more than {0} students for this student group.""").format(self.max_strength)
+			)
 
 	def validate_students(self):
-		program_enrollment = get_program_enrollment(self.academic_year, self.academic_term, self.program, self.batch, self.student_category, self.course)
+		program_enrollment = get_program_enrollment(
+			self.academic_year,
+			self.academic_term,
+			self.program,
+			self.batch,
+			self.student_category,
+			self.course,
+		)
 		students = [d.student for d in program_enrollment] if program_enrollment else []
 		for d in self.students:
 			if not frappe.db.get_value("Student", d.student, "enabled") and d.active and not self.disabled:
 				frappe.throw(_("{0} - {1} is inactive student").format(d.group_roll_number, d.student_name))
 
-			if (self.group_based_on == "Batch") and cint(frappe.defaults.get_defaults().validate_batch)\
-				and d.student not in students:
-				frappe.throw(_("{0} - {1} is not enrolled in the Batch {2}").format(d.group_roll_number, d.student_name, self.batch))
+			if (
+				(self.group_based_on == "Batch")
+				and cint(frappe.defaults.get_defaults().validate_batch)
+				and d.student not in students
+			):
+				frappe.throw(
+					_("{0} - {1} is not enrolled in the Batch {2}").format(
+						d.group_roll_number, d.student_name, self.batch
+					)
+				)
 
-			if (self.group_based_on == "Course") and cint(frappe.defaults.get_defaults().validate_course)\
-				and (d.student not in students):
-				frappe.throw(_("{0} - {1} is not enrolled in the Course {2}").format(d.group_roll_number, d.student_name, self.course))
+			if (
+				(self.group_based_on == "Course")
+				and cint(frappe.defaults.get_defaults().validate_course)
+				and (d.student not in students)
+			):
+				frappe.throw(
+					_("{0} - {1} is not enrolled in the Course {2}").format(
+						d.group_roll_number, d.student_name, self.course
+					)
+				)
 
 	def validate_and_set_child_table_fields(self):
 		roll_numbers = [d.group_roll_number for d in self.students if d.group_roll_number]
@@ -62,9 +85,20 @@
 			else:
 				roll_no_list.append(d.group_roll_number)
 
+
 @frappe.whitelist()
-def get_students(academic_year, group_based_on, academic_term=None, program=None, batch=None, student_category=None, course=None):
-	enrolled_students = get_program_enrollment(academic_year, academic_term, program, batch, student_category, course)
+def get_students(
+	academic_year,
+	group_based_on,
+	academic_term=None,
+	program=None,
+	batch=None,
+	student_category=None,
+	course=None,
+):
+	enrolled_students = get_program_enrollment(
+		academic_year, academic_term, program, batch, student_category, course
+	)
 
 	if enrolled_students:
 		student_list = []
@@ -79,7 +113,10 @@
 		frappe.msgprint(_("No students found"))
 		return []
 
-def get_program_enrollment(academic_year, academic_term=None, program=None, batch=None, student_category=None, course=None):
+
+def get_program_enrollment(
+	academic_year, academic_term=None, program=None, batch=None, student_category=None, course=None
+):
 
 	condition1 = " "
 	condition2 = " "
@@ -95,7 +132,8 @@
 		condition1 += " and pe.name = pec.parent and pec.course = %(course)s"
 		condition2 = ", `tabProgram Enrollment Course` pec"
 
-	return frappe.db.sql('''
+	return frappe.db.sql(
+		"""
 		select
 			pe.student, pe.student_name
 		from
@@ -104,28 +142,59 @@
 			pe.academic_year = %(academic_year)s  {condition1}
 		order by
 			pe.student_name asc
-		'''.format(condition1=condition1, condition2=condition2),
-                ({"academic_year": academic_year, "academic_term":academic_term, "program": program, "batch": batch, "student_category": student_category, "course": course}), as_dict=1)
+		""".format(
+			condition1=condition1, condition2=condition2
+		),
+		(
+			{
+				"academic_year": academic_year,
+				"academic_term": academic_term,
+				"program": program,
+				"batch": batch,
+				"student_category": student_category,
+				"course": course,
+			}
+		),
+		as_dict=1,
+	)
 
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def fetch_students(doctype, txt, searchfield, start, page_len, filters):
 	if filters.get("group_based_on") != "Activity":
-		enrolled_students = get_program_enrollment(filters.get('academic_year'), filters.get('academic_term'),
-			filters.get('program'), filters.get('batch'), filters.get('student_category'))
-		student_group_student = frappe.db.sql_list('''select student from `tabStudent Group Student` where parent=%s''',
-			(filters.get('student_group')))
-		students = ([d.student for d in enrolled_students if d.student not in student_group_student]
-			if enrolled_students else [""]) or [""]
-		return frappe.db.sql("""select name, title from tabStudent
+		enrolled_students = get_program_enrollment(
+			filters.get("academic_year"),
+			filters.get("academic_term"),
+			filters.get("program"),
+			filters.get("batch"),
+			filters.get("student_category"),
+		)
+		student_group_student = frappe.db.sql_list(
+			"""select student from `tabStudent Group Student` where parent=%s""",
+			(filters.get("student_group")),
+		)
+		students = (
+			[d.student for d in enrolled_students if d.student not in student_group_student]
+			if enrolled_students
+			else [""]
+		) or [""]
+		return frappe.db.sql(
+			"""select name, title from tabStudent
 			where name in ({0}) and (`{1}` LIKE %s or title LIKE %s)
 			order by idx desc, name
-			limit %s, %s""".format(", ".join(['%s']*len(students)), searchfield),
-			tuple(students + ["%%%s%%" % txt, "%%%s%%" % txt, start, page_len]))
+			limit %s, %s""".format(
+				", ".join(["%s"] * len(students)), searchfield
+			),
+			tuple(students + ["%%%s%%" % txt, "%%%s%%" % txt, start, page_len]),
+		)
 	else:
-		return frappe.db.sql("""select name, title from tabStudent
+		return frappe.db.sql(
+			"""select name, title from tabStudent
 			where `{0}` LIKE %s or title LIKE %s
 			order by idx desc, name
-			limit %s, %s""".format(searchfield),
-			tuple(["%%%s%%" % txt, "%%%s%%" % txt, start, page_len]))
+			limit %s, %s""".format(
+				searchfield
+			),
+			tuple(["%%%s%%" % txt, "%%%s%%" % txt, start, page_len]),
+		)
diff --git a/erpnext/education/doctype/student_group/student_group_dashboard.py b/erpnext/education/doctype/student_group/student_group_dashboard.py
index d5b9302..094b5a0 100644
--- a/erpnext/education/doctype/student_group/student_group_dashboard.py
+++ b/erpnext/education/doctype/student_group/student_group_dashboard.py
@@ -6,15 +6,9 @@
 
 def get_data():
 	return {
-		'fieldname': 'student_group',
-		'transactions': [
-			{
-				'label': _('Assessment'),
-				'items': ['Assessment Plan', 'Assessment Result']
-			},
-			{
-				'label': _('Course'),
-				'items': ['Course Schedule']
-			}
-		]
+		"fieldname": "student_group",
+		"transactions": [
+			{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
+			{"label": _("Course"), "items": ["Course Schedule"]},
+		],
 	}
diff --git a/erpnext/education/doctype/student_group/test_student_group.py b/erpnext/education/doctype/student_group/test_student_group.py
index 807c632..84b4930 100644
--- a/erpnext/education/doctype/student_group/test_student_group.py
+++ b/erpnext/education/doctype/student_group/test_student_group.py
@@ -9,19 +9,22 @@
 
 
 def get_random_group():
-	doc = frappe.get_doc({
-		"doctype": "Student Group",
-		"student_group_name": "_Test Student Group-" + frappe.generate_hash(length=5),
-		"group_based_on": "Activity"
-	}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Student Group",
+			"student_group_name": "_Test Student Group-" + frappe.generate_hash(length=5),
+			"group_based_on": "Activity",
+		}
+	).insert()
 
-	student_list = frappe.get_all('Student', limit=5)
+	student_list = frappe.get_all("Student", limit=5)
 
-	doc.extend("students", [{"student":d.name, "active": 1} for d in student_list])
+	doc.extend("students", [{"student": d.name, "active": 1} for d in student_list])
 	doc.save()
 
 	return doc
 
+
 class TestStudentGroup(unittest.TestCase):
 	def test_student_roll_no(self):
 		doc = get_random_group()
@@ -36,8 +39,12 @@
 		doc.students = doc.students[:-1]
 		doc.save()
 
-		self.assertRaises(erpnext.education.StudentNotInGroupError,
-			erpnext.education.validate_student_belongs_to_group, last_student, doc.name)
+		self.assertRaises(
+			erpnext.education.StudentNotInGroupError,
+			erpnext.education.validate_student_belongs_to_group,
+			last_student,
+			doc.name,
+		)
 
 		# safe, don't throw validation
 		erpnext.education.validate_student_belongs_to_group(doc.students[0].student, doc.name)
diff --git a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py
index 8fbfcec..0fb2550 100644
--- a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py
+++ b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py
@@ -14,32 +14,49 @@
 	def get_courses(self):
 		group_list = []
 
-		batches = frappe.db.sql('''select name as batch from `tabStudent Batch Name`''', as_dict=1)
+		batches = frappe.db.sql("""select name as batch from `tabStudent Batch Name`""", as_dict=1)
 		for batch in batches:
-			group_list.append({"group_based_on":"Batch", "batch":batch.batch})
+			group_list.append({"group_based_on": "Batch", "batch": batch.batch})
 
-		courses = frappe.db.sql('''select course, course_name from `tabProgram Course` where parent=%s''',
-			(self.program), as_dict=1)
+		courses = frappe.db.sql(
+			"""select course, course_name from `tabProgram Course` where parent=%s""",
+			(self.program),
+			as_dict=1,
+		)
 		if self.separate_groups:
 			from itertools import product
-			course_list = product(courses,batches)
+
+			course_list = product(courses, batches)
 			for course in course_list:
 				temp_dict = {}
-				temp_dict.update({"group_based_on":"Course"})
+				temp_dict.update({"group_based_on": "Course"})
 				temp_dict.update(course[0])
 				temp_dict.update(course[1])
 				group_list.append(temp_dict)
 		else:
 			for course in courses:
-				course.update({"group_based_on":"Course"})
+				course.update({"group_based_on": "Course"})
 				group_list.append(course)
 
 		for group in group_list:
 			if group.get("group_based_on") == "Batch":
-				student_group_name = self.program + "/" + group.get("batch") + "/" + (self.academic_term if self.academic_term else self.academic_year)
+				student_group_name = (
+					self.program
+					+ "/"
+					+ group.get("batch")
+					+ "/"
+					+ (self.academic_term if self.academic_term else self.academic_year)
+				)
 				group.update({"student_group_name": student_group_name})
 			elif group.get("group_based_on") == "Course":
-				student_group_name = group.get("course") + "/" + self.program + ("/" + group.get("batch") if group.get("batch") else "") + "/" + (self.academic_term if self.academic_term else self.academic_year)
+				student_group_name = (
+					group.get("course")
+					+ "/"
+					+ self.program
+					+ ("/" + group.get("batch") if group.get("batch") else "")
+					+ "/"
+					+ (self.academic_term if self.academic_term else self.academic_year)
+				)
 				group.update({"student_group_name": student_group_name})
 
 		return group_list
@@ -60,7 +77,9 @@
 			if d.group_based_on == "Batch" and not d.batch:
 				frappe.throw(_("""Batch is mandatory in row {0}""".format(d.idx)))
 
-			frappe.publish_realtime('student_group_creation_progress', {"progress": [d.idx, l]}, user=frappe.session.user)
+			frappe.publish_realtime(
+				"student_group_creation_progress", {"progress": [d.idx, l]}, user=frappe.session.user
+			)
 
 			student_group = frappe.new_doc("Student Group")
 			student_group.student_group_name = d.student_group_name
@@ -71,10 +90,12 @@
 			student_group.max_strength = d.max_strength
 			student_group.academic_term = self.academic_term
 			student_group.academic_year = self.academic_year
-			student_list = get_students(self.academic_year, d.group_based_on, self.academic_term, self.program, d.batch, d.course)
+			student_list = get_students(
+				self.academic_year, d.group_based_on, self.academic_term, self.program, d.batch, d.course
+			)
 
 			for student in student_list:
-				student_group.append('students', student)
+				student_group.append("students", student)
 			student_group.save()
 
 		frappe.msgprint(_("{0} Student Groups created.").format(l))
diff --git a/erpnext/education/doctype/student_language/test_student_language.py b/erpnext/education/doctype/student_language/test_student_language.py
index 718896c..d1a8b6d 100644
--- a/erpnext/education/doctype/student_language/test_student_language.py
+++ b/erpnext/education/doctype/student_language/test_student_language.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Language')
 
+
 class TestStudentLanguage(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application.py b/erpnext/education/doctype/student_leave_application/student_leave_application.py
index b1eda9a..c3645cf 100644
--- a/erpnext/education/doctype/student_leave_application/student_leave_application.py
+++ b/erpnext/education/doctype/student_leave_application/student_leave_application.py
@@ -17,7 +17,7 @@
 	def validate(self):
 		self.validate_holiday_list()
 		self.validate_duplicate()
-		self.validate_from_to_dates('from_date', 'to_date')
+		self.validate_from_to_dates("from_date", "to_date")
 
 	def on_submit(self):
 		self.update_attendance()
@@ -26,23 +26,31 @@
 		self.cancel_attendance()
 
 	def validate_duplicate(self):
-		data = frappe.db.sql("""select name from `tabStudent Leave Application`
+		data = frappe.db.sql(
+			"""select name from `tabStudent Leave Application`
 			where
 				((%(from_date)s > from_date and %(from_date)s < to_date) or
 				(%(to_date)s > from_date and %(to_date)s < to_date) or
 				(%(from_date)s <= from_date and %(to_date)s >= to_date)) and
 				name != %(name)s and student = %(student)s and docstatus < 2
-		""", {
-			'from_date': self.from_date,
-			'to_date': self.to_date,
-			'student': self.student,
-			'name': self.name
-		}, as_dict=1)
+		""",
+			{
+				"from_date": self.from_date,
+				"to_date": self.to_date,
+				"student": self.student,
+				"name": self.name,
+			},
+			as_dict=1,
+		)
 
 		if data:
-			link = get_link_to_form('Student Leave Application', data[0].name)
-			frappe.throw(_('Leave application {0} already exists against the student {1}')
-				.format(link, frappe.bold(self.student)), title=_('Duplicate Entry'))
+			link = get_link_to_form("Student Leave Application", data[0].name)
+			frappe.throw(
+				_("Leave application {0} already exists against the student {1}").format(
+					link, frappe.bold(self.student)
+				),
+				title=_("Duplicate Entry"),
+			)
 
 	def validate_holiday_list(self):
 		holiday_list = get_holiday_list()
@@ -52,33 +60,31 @@
 		holiday_list = get_holiday_list()
 
 		for dt in daterange(getdate(self.from_date), getdate(self.to_date)):
-			date = dt.strftime('%Y-%m-%d')
+			date = dt.strftime("%Y-%m-%d")
 
 			if is_holiday(holiday_list, date):
 				continue
 
-			attendance = frappe.db.exists('Student Attendance', {
-				'student': self.student,
-				'date': date,
-				'docstatus': ('!=', 2)
-			})
+			attendance = frappe.db.exists(
+				"Student Attendance", {"student": self.student, "date": date, "docstatus": ("!=", 2)}
+			)
 
-			status = 'Present' if self.mark_as_present else 'Absent'
+			status = "Present" if self.mark_as_present else "Absent"
 			if attendance:
 				# update existing attendance record
 				values = dict()
-				values['status'] = status
-				values['leave_application'] = self.name
-				frappe.db.set_value('Student Attendance', attendance, values)
+				values["status"] = status
+				values["leave_application"] = self.name
+				frappe.db.set_value("Student Attendance", attendance, values)
 			else:
 				# make a new attendance record
-				doc = frappe.new_doc('Student Attendance')
+				doc = frappe.new_doc("Student Attendance")
 				doc.student = self.student
 				doc.student_name = self.student_name
 				doc.date = date
 				doc.leave_application = self.name
 				doc.status = status
-				if self.attendance_based_on == 'Student Group':
+				if self.attendance_based_on == "Student Group":
 					doc.student_group = self.student_group
 				else:
 					doc.course_schedule = self.course_schedule
@@ -87,34 +93,42 @@
 
 	def cancel_attendance(self):
 		if self.docstatus == 2:
-			attendance = frappe.db.sql("""
+			attendance = frappe.db.sql(
+				"""
 				SELECT name
 				FROM `tabStudent Attendance`
 				WHERE
 					student = %s and
 					(date between %s and %s) and
 					docstatus < 2
-			""", (self.student, self.from_date, self.to_date), as_dict=1)
+			""",
+				(self.student, self.from_date, self.to_date),
+				as_dict=1,
+			)
 
 			for name in attendance:
-				frappe.db.set_value('Student Attendance', name, 'docstatus', 2)
+				frappe.db.set_value("Student Attendance", name, "docstatus", 2)
 
 
 def daterange(start_date, end_date):
-	for n in range(int ((end_date - start_date).days)+1):
+	for n in range(int((end_date - start_date).days) + 1):
 		yield start_date + timedelta(n)
 
+
 def get_number_of_leave_days(from_date, to_date, holiday_list):
 	number_of_days = date_diff(to_date, from_date) + 1
 
-	holidays = frappe.db.sql("""
+	holidays = frappe.db.sql(
+		"""
 		SELECT
 			COUNT(DISTINCT holiday_date)
 		FROM `tabHoliday` h1,`tabHoliday List` h2
 		WHERE
 			h1.parent = h2.name and
 			h1.holiday_date between %s and %s and
-			h2.name = %s""", (from_date, to_date, holiday_list))[0][0]
+			h2.name = %s""",
+		(from_date, to_date, holiday_list),
+	)[0][0]
 
 	number_of_days = flt(number_of_days) - flt(holidays)
 
diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py b/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py
index d01790d..8819c3b 100644
--- a/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py
+++ b/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname': 'leave_application',
-		'transactions': [
-			{
-				'items': ['Student Attendance']
-			}
-		]
-	}
+	return {"fieldname": "leave_application", "transactions": [{"items": ["Student Attendance"]}]}
diff --git a/erpnext/education/doctype/student_leave_application/test_student_leave_application.py b/erpnext/education/doctype/student_leave_application/test_student_leave_application.py
index 92e82c5..7146fc2 100644
--- a/erpnext/education/doctype/student_leave_application/test_student_leave_application.py
+++ b/erpnext/education/doctype/student_leave_application/test_student_leave_application.py
@@ -18,36 +18,44 @@
 
 	def test_attendance_record_creation(self):
 		leave_application = create_leave_application()
-		attendance_record = frappe.db.exists('Student Attendance', {'leave_application': leave_application.name, 'status': 'Absent'})
+		attendance_record = frappe.db.exists(
+			"Student Attendance", {"leave_application": leave_application.name, "status": "Absent"}
+		)
 		self.assertTrue(attendance_record)
 
 		# mark as present
 		date = add_days(getdate(), -1)
 		leave_application = create_leave_application(date, date, 1)
-		attendance_record = frappe.db.exists('Student Attendance', {'leave_application': leave_application.name, 'status': 'Present'})
+		attendance_record = frappe.db.exists(
+			"Student Attendance", {"leave_application": leave_application.name, "status": "Present"}
+		)
 		self.assertTrue(attendance_record)
 
 	def test_attendance_record_updated(self):
 		attendance = create_student_attendance()
 		create_leave_application()
-		self.assertEqual(frappe.db.get_value('Student Attendance', attendance.name, 'status'), 'Absent')
+		self.assertEqual(frappe.db.get_value("Student Attendance", attendance.name, "status"), "Absent")
 
 	def test_attendance_record_cancellation(self):
 		leave_application = create_leave_application()
 		leave_application.cancel()
-		attendance_status = frappe.db.get_value('Student Attendance', {'leave_application': leave_application.name}, 'docstatus')
+		attendance_status = frappe.db.get_value(
+			"Student Attendance", {"leave_application": leave_application.name}, "docstatus"
+		)
 		self.assertTrue(attendance_status, 2)
 
 	def test_holiday(self):
 		today = getdate()
-		leave_application = create_leave_application(from_date=today, to_date= add_days(today, 1), submit=0)
+		leave_application = create_leave_application(
+			from_date=today, to_date=add_days(today, 1), submit=0
+		)
 
 		# holiday list validation
-		company = get_default_company() or frappe.get_all('Company')[0].name
-		frappe.db.set_value('Company', company, 'default_holiday_list', '')
+		company = get_default_company() or frappe.get_all("Company")[0].name
+		frappe.db.set_value("Company", company, "default_holiday_list", "")
 		self.assertRaises(frappe.ValidationError, leave_application.save)
 
-		frappe.db.set_value('Company', company, 'default_holiday_list', 'Test Holiday List for Student')
+		frappe.db.set_value("Company", company, "default_holiday_list", "Test Holiday List for Student")
 		leave_application.save()
 
 		leave_application.reload()
@@ -55,19 +63,23 @@
 
 		# check no attendance record created for a holiday
 		leave_application.submit()
-		self.assertIsNone(frappe.db.exists('Student Attendance', {'leave_application': leave_application.name, 'date': add_days(today, 1)}))
+		self.assertIsNone(
+			frappe.db.exists(
+				"Student Attendance", {"leave_application": leave_application.name, "date": add_days(today, 1)}
+			)
+		)
 
 	def tearDown(self):
-		company = get_default_company() or frappe.get_all('Company')[0].name
-		frappe.db.set_value('Company', company, 'default_holiday_list', '_Test Holiday List')
+		company = get_default_company() or frappe.get_all("Company")[0].name
+		frappe.db.set_value("Company", company, "default_holiday_list", "_Test Holiday List")
 
 
 def create_leave_application(from_date=None, to_date=None, mark_as_present=0, submit=1):
 	student = get_student()
 
-	leave_application = frappe.new_doc('Student Leave Application')
+	leave_application = frappe.new_doc("Student Leave Application")
 	leave_application.student = student.name
-	leave_application.attendance_based_on = 'Student Group'
+	leave_application.attendance_based_on = "Student Group"
 	leave_application.student_group = get_random_group().name
 	leave_application.from_date = from_date if from_date else getdate()
 	leave_application.to_date = from_date if from_date else getdate()
@@ -79,38 +91,41 @@
 
 	return leave_application
 
+
 def create_student_attendance(date=None, status=None):
 	student = get_student()
-	attendance = frappe.get_doc({
-		'doctype': 'Student Attendance',
-		'student': student.name,
-		'status': status if status else 'Present',
-		'date': date if date else getdate(),
-		'student_group': get_random_group().name
-	}).insert()
+	attendance = frappe.get_doc(
+		{
+			"doctype": "Student Attendance",
+			"student": student.name,
+			"status": status if status else "Present",
+			"date": date if date else getdate(),
+			"student_group": get_random_group().name,
+		}
+	).insert()
 	return attendance
 
+
 def get_student():
-	return create_student(dict(
-		email='test_student@gmail.com',
-		first_name='Test',
-		last_name='Student'
-	))
+	return create_student(
+		dict(email="test_student@gmail.com", first_name="Test", last_name="Student")
+	)
+
 
 def create_holiday_list():
-	holiday_list = 'Test Holiday List for Student'
+	holiday_list = "Test Holiday List for Student"
 	today = getdate()
-	if not frappe.db.exists('Holiday List', holiday_list):
-		frappe.get_doc(dict(
-			doctype = 'Holiday List',
-			holiday_list_name = holiday_list,
-			from_date = add_months(today, -6),
-			to_date = add_months(today, 6),
-			holidays = [
-				dict(holiday_date=add_days(today, 1), description = 'Test')
-			]
-		)).insert()
+	if not frappe.db.exists("Holiday List", holiday_list):
+		frappe.get_doc(
+			dict(
+				doctype="Holiday List",
+				holiday_list_name=holiday_list,
+				from_date=add_months(today, -6),
+				to_date=add_months(today, 6),
+				holidays=[dict(holiday_date=add_days(today, 1), description="Test")],
+			)
+		).insert()
 
-	company = get_default_company() or frappe.get_all('Company')[0].name
-	frappe.db.set_value('Company', company, 'default_holiday_list', holiday_list)
+	company = get_default_company() or frappe.get_all("Company")[0].name
+	frappe.db.set_value("Company", company, "default_holiday_list", holiday_list)
 	return holiday_list
diff --git a/erpnext/education/doctype/student_log/test_student_log.py b/erpnext/education/doctype/student_log/test_student_log.py
index 91fdb3c..fef1ab5 100644
--- a/erpnext/education/doctype/student_log/test_student_log.py
+++ b/erpnext/education/doctype/student_log/test_student_log.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Student Log')
 
+
 class TestStudentLog(unittest.TestCase):
 	pass
diff --git a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py b/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py
index 43802ab..ae3c140 100644
--- a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py
+++ b/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py
@@ -24,14 +24,19 @@
 	doc = frappe._dict(json.loads(doc))
 	doc.students = [doc.student]
 	if not (doc.student_name and doc.student_batch):
-		program_enrollment = frappe.get_all("Program Enrollment", fields=["student_batch_name", "student_name"],
-			filters={"student": doc.student, "docstatus": ('!=', 2), "academic_year": doc.academic_year})
+		program_enrollment = frappe.get_all(
+			"Program Enrollment",
+			fields=["student_batch_name", "student_name"],
+			filters={"student": doc.student, "docstatus": ("!=", 2), "academic_year": doc.academic_year},
+		)
 		if program_enrollment:
 			doc.batch = program_enrollment[0].student_batch_name
 			doc.student_name = program_enrollment[0].student_name
 
 	# get the assessment result of the selected student
-	values = get_formatted_result(doc, get_course=True, get_all_assessment_groups=doc.include_all_assessment)
+	values = get_formatted_result(
+		doc, get_course=True, get_all_assessment_groups=doc.include_all_assessment
+	)
 	assessment_result = values.get("assessment_result").get(doc.student)
 	courses = values.get("course_dict")
 	course_criteria = get_courses_criteria(courses)
@@ -45,23 +50,32 @@
 	# get the attendance of the student for that peroid of time.
 	doc.attendance = get_attendance_count(doc.students[0], doc.academic_year, doc.academic_term)
 
-	template = "erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.html"
+	template = (
+		"erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.html"
+	)
 	base_template_path = "frappe/www/printview.html"
 
 	from frappe.www.printview import get_letter_head
-	letterhead = get_letter_head(frappe._dict({"letter_head": doc.letterhead}), not doc.add_letterhead)
 
-	html = frappe.render_template(template,
+	letterhead = get_letter_head(
+		frappe._dict({"letter_head": doc.letterhead}), not doc.add_letterhead
+	)
+
+	html = frappe.render_template(
+		template,
 		{
 			"doc": doc,
 			"assessment_result": assessment_result,
 			"courses": courses,
 			"assessment_groups": assessment_groups,
 			"course_criteria": course_criteria,
-			"letterhead": letterhead and letterhead.get('content', None),
-			"add_letterhead": doc.add_letterhead if doc.add_letterhead else 0
-		})
-	final_template = frappe.render_template(base_template_path, {"body": html, "title": "Report Card"})
+			"letterhead": letterhead and letterhead.get("content", None),
+			"add_letterhead": doc.add_letterhead if doc.add_letterhead else 0,
+		},
+	)
+	final_template = frappe.render_template(
+		base_template_path, {"body": html, "title": "Report Card"}
+	)
 
 	frappe.response.filename = "Report Card " + doc.students[0] + ".pdf"
 	frappe.response.filecontent = get_pdf(final_template)
@@ -71,21 +85,33 @@
 def get_courses_criteria(courses):
 	course_criteria = frappe._dict()
 	for course in courses:
-		course_criteria[course] = [d.assessment_criteria for d in frappe.get_all("Course Assessment Criteria",
-			fields=["assessment_criteria"], filters={"parent": course})]
+		course_criteria[course] = [
+			d.assessment_criteria
+			for d in frappe.get_all(
+				"Course Assessment Criteria", fields=["assessment_criteria"], filters={"parent": course}
+			)
+		]
 	return course_criteria
 
 
 def get_attendance_count(student, academic_year, academic_term=None):
 	if academic_year:
-		from_date, to_date = frappe.db.get_value("Academic Year", academic_year, ["year_start_date", "year_end_date"])
+		from_date, to_date = frappe.db.get_value(
+			"Academic Year", academic_year, ["year_start_date", "year_end_date"]
+		)
 	elif academic_term:
-		from_date, to_date = frappe.db.get_value("Academic Term", academic_term, ["term_start_date", "term_end_date"])
+		from_date, to_date = frappe.db.get_value(
+			"Academic Term", academic_term, ["term_start_date", "term_end_date"]
+		)
 	if from_date and to_date:
-		attendance = dict(frappe.db.sql('''select status, count(student) as no_of_days
+		attendance = dict(
+			frappe.db.sql(
+				"""select status, count(student) as no_of_days
 			from `tabStudent Attendance` where student = %s and docstatus = 1
-			and date between %s and %s group by status''',
-			(student, from_date, to_date)))
+			and date between %s and %s group by status""",
+				(student, from_date, to_date),
+			)
+		)
 		if "Absent" not in attendance.keys():
 			attendance["Absent"] = 0
 		if "Present" not in attendance.keys():
diff --git a/erpnext/education/doctype/topic/test_topic.py b/erpnext/education/doctype/topic/test_topic.py
index d1d664b..c11204a 100644
--- a/erpnext/education/doctype/topic/test_topic.py
+++ b/erpnext/education/doctype/topic/test_topic.py
@@ -8,7 +8,7 @@
 
 class TestTopic(unittest.TestCase):
 	def setUp(self):
-		make_topic_and_linked_content("_Test Topic 1", [{"type":"Article", "name": "_Test Article 1"}])
+		make_topic_and_linked_content("_Test Topic 1", [{"type": "Article", "name": "_Test Article 1"}])
 
 	def test_get_contents(self):
 		topic = frappe.get_doc("Topic", "_Test Topic 1")
@@ -17,24 +17,28 @@
 		self.assertEqual(contents[0].name, "_Test Article 1")
 		frappe.db.rollback()
 
+
 def make_topic(name):
 	try:
 		topic = frappe.get_doc("Topic", name)
 	except frappe.DoesNotExistError:
-		topic = frappe.get_doc({
-			"doctype": "Topic",
-			"topic_name": name,
-			"topic_code": name,
-		}).insert()
+		topic = frappe.get_doc(
+			{
+				"doctype": "Topic",
+				"topic_name": name,
+				"topic_code": name,
+			}
+		).insert()
 	return topic.name
 
+
 def make_topic_and_linked_content(topic_name, content_dict_list):
 	try:
 		topic = frappe.get_doc("Topic", topic_name)
 	except frappe.DoesNotExistError:
 		make_topic(topic_name)
 		topic = frappe.get_doc("Topic", topic_name)
-	content_list = [make_content(content['type'], content['name']) for content in content_dict_list]
+	content_list = [make_content(content["type"], content["name"]) for content in content_dict_list]
 	for content in content_list:
 		topic.append("topic_content", {"content": content.title, "content_type": content.doctype})
 	topic.save()
diff --git a/erpnext/education/doctype/topic/topic.py b/erpnext/education/doctype/topic/topic.py
index 146f574..6dd9655 100644
--- a/erpnext/education/doctype/topic/topic.py
+++ b/erpnext/education/doctype/topic/topic.py
@@ -13,48 +13,64 @@
 	def get_contents(self):
 		try:
 			topic_content_list = self.topic_content
-			content_data = [frappe.get_doc(topic_content.content_type, topic_content.content) for topic_content in topic_content_list]
+			content_data = [
+				frappe.get_doc(topic_content.content_type, topic_content.content)
+				for topic_content in topic_content_list
+			]
 		except Exception as e:
 			frappe.log_error(frappe.get_traceback())
 			return None
 		return content_data
 
+
 @frappe.whitelist()
 def get_courses_without_topic(topic):
 	data = []
-	for entry in frappe.db.get_all('Course'):
-		course = frappe.get_doc('Course', entry.name)
+	for entry in frappe.db.get_all("Course"):
+		course = frappe.get_doc("Course", entry.name)
 		topics = [t.topic for t in course.topics]
 		if not topics or topic not in topics:
 			data.append(course.name)
 	return data
 
+
 @frappe.whitelist()
 def add_topic_to_courses(topic, courses, mandatory=False):
 	courses = json.loads(courses)
 	for entry in courses:
-		course = frappe.get_doc('Course', entry)
-		course.append('topics', {
-			'topic': topic,
-			'topic_name': topic
-		})
+		course = frappe.get_doc("Course", entry)
+		course.append("topics", {"topic": topic, "topic_name": topic})
 		course.flags.ignore_mandatory = True
 		course.save()
 	frappe.db.commit()
-	frappe.msgprint(_('Topic {0} has been added to all the selected courses successfully.').format(frappe.bold(topic)),
-		title=_('Courses updated'), indicator='green')
+	frappe.msgprint(
+		_("Topic {0} has been added to all the selected courses successfully.").format(
+			frappe.bold(topic)
+		),
+		title=_("Courses updated"),
+		indicator="green",
+	)
+
 
 @frappe.whitelist()
 def add_content_to_topics(content_type, content, topics):
 	topics = json.loads(topics)
 	for entry in topics:
-		topic = frappe.get_doc('Topic', entry)
-		topic.append('topic_content', {
-			'content_type': content_type,
-			'content': content,
-		})
+		topic = frappe.get_doc("Topic", entry)
+		topic.append(
+			"topic_content",
+			{
+				"content_type": content_type,
+				"content": content,
+			},
+		)
 		topic.flags.ignore_mandatory = True
 		topic.save()
 	frappe.db.commit()
-	frappe.msgprint(_('{0} {1} has been added to all the selected topics successfully.').format(content_type, frappe.bold(content)),
-		title=_('Topics updated'), indicator='green')
+	frappe.msgprint(
+		_("{0} {1} has been added to all the selected topics successfully.").format(
+			content_type, frappe.bold(content)
+		),
+		title=_("Topics updated"),
+		indicator="green",
+	)
diff --git a/erpnext/education/report/absent_student_report/absent_student_report.py b/erpnext/education/report/absent_student_report/absent_student_report.py
index c274d33..ac27f71 100644
--- a/erpnext/education/report/absent_student_report/absent_student_report.py
+++ b/erpnext/education/report/absent_student_report/absent_student_report.py
@@ -11,7 +11,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if not filters.get("date"):
 		msgprint(_("Please select date"), raise_exception=1)
@@ -21,8 +22,11 @@
 
 	holiday_list = get_holiday_list()
 	if is_holiday(holiday_list, filters.get("date")):
-		msgprint(_("No attendance has been marked for {0} as it is a Holiday").format(frappe.bold(formatdate(filters.get("date")))))
-
+		msgprint(
+			_("No attendance has been marked for {0} as it is a Holiday").format(
+				frappe.bold(formatdate(filters.get("date")))
+			)
+		)
 
 	absent_students = get_absent_students(date)
 	leave_applicants = get_leave_applications(date)
@@ -34,17 +38,19 @@
 	for student in absent_students:
 		if not student.student in leave_applicants:
 			row = [student.student, student.student_name, student.student_group]
-			stud_details = frappe.db.get_value("Student", student.student, ['student_email_id', 'student_mobile_number'], as_dict=True)
+			stud_details = frappe.db.get_value(
+				"Student", student.student, ["student_email_id", "student_mobile_number"], as_dict=True
+			)
 
 			if stud_details.student_email_id:
-				row+=[stud_details.student_email_id]
+				row += [stud_details.student_email_id]
 			else:
-				row+= [""]
+				row += [""]
 
 			if stud_details.student_mobile_number:
-				row+=[stud_details.student_mobile_number]
+				row += [stud_details.student_mobile_number]
 			else:
-				row+= [""]
+				row += [""]
 			if transportation_details.get(student.student):
 				row += transportation_details.get(student.student)
 
@@ -52,6 +58,7 @@
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		_("Student") + ":Link/Student:90",
@@ -64,34 +71,45 @@
 	]
 	return columns
 
+
 def get_absent_students(date):
-	absent_students = frappe.db.sql("""
+	absent_students = frappe.db.sql(
+		"""
 		SELECT student, student_name, student_group
 		FROM `tabStudent Attendance`
 		WHERE
 			status='Absent' and docstatus=1 and date = %s
 		ORDER BY
 			student_group, student_name""",
-	date, as_dict=1)
+		date,
+		as_dict=1,
+	)
 	return absent_students
 
+
 def get_leave_applications(date):
 	leave_applicants = []
-	leave_applications = frappe.db.sql("""
+	leave_applications = frappe.db.sql(
+		"""
 		SELECT student
 		FROM
 			`tabStudent Leave Application`
 		WHERE
 			docstatus = 1 and mark_as_present = 1 and
 			from_date <= %s and to_date >= %s
-	""", (date, date))
+	""",
+		(date, date),
+	)
 	for student in leave_applications:
 		leave_applicants.append(student[0])
 
 	return leave_applicants
 
+
 def get_transportation_details(date, student_list):
-	academic_year = frappe.get_all("Academic Year", filters=[["year_start_date", "<=", date],["year_end_date", ">=", date]])
+	academic_year = frappe.get_all(
+		"Academic Year", filters=[["year_start_date", "<=", date], ["year_end_date", ">=", date]]
+	)
 	if academic_year:
 		academic_year = academic_year[0].name
 	elif frappe.defaults.get_defaults().academic_year:
@@ -99,8 +117,15 @@
 	else:
 		return {}
 
-	transportation_details = frappe.get_all("Program Enrollment", fields=["student", "mode_of_transportation", "vehicle_no"],
-		filters={"student": ("in", student_list), "academic_year": academic_year, "docstatus": ("not in", ["2"])})
+	transportation_details = frappe.get_all(
+		"Program Enrollment",
+		fields=["student", "mode_of_transportation", "vehicle_no"],
+		filters={
+			"student": ("in", student_list),
+			"academic_year": academic_year,
+			"docstatus": ("not in", ["2"]),
+		},
+	)
 	transportation_map = {}
 	for d in transportation_details:
 		transportation_map[d.student] = [d.mode_of_transportation, d.vehicle_no]
diff --git a/erpnext/education/report/assessment_plan_status/assessment_plan_status.py b/erpnext/education/report/assessment_plan_status/assessment_plan_status.py
index 86f2451..7cf5b30 100644
--- a/erpnext/education/report/assessment_plan_status/assessment_plan_status.py
+++ b/erpnext/education/report/assessment_plan_status/assessment_plan_status.py
@@ -13,6 +13,7 @@
 	1: "submitted",
 }
 
+
 def execute(filters=None):
 	columns, data = [], []
 
@@ -32,13 +33,14 @@
 	# [total, saved, submitted, remaining]
 	chart_data = [0, 0, 0, 0]
 
-	condition = ''
+	condition = ""
 	if args["assessment_group"]:
 		condition += "and assessment_group = %(assessment_group)s"
 	if args["schedule_date"]:
 		condition += "and schedule_date <= %(schedule_date)s"
 
-	assessment_plan = frappe.db.sql('''
+	assessment_plan = frappe.db.sql(
+		"""
 			SELECT
 				ap.name as assessment_plan,
 				ap.assessment_name,
@@ -52,24 +54,33 @@
 				ap.docstatus = 1 {condition}
 			ORDER BY
 				ap.modified desc
-		'''.format(condition=condition), (args), as_dict=1)
+		""".format(
+			condition=condition
+		),
+		(args),
+		as_dict=1,
+	)
 
-	assessment_plan_list = [d.assessment_plan for d in assessment_plan] if assessment_plan else ['']
+	assessment_plan_list = [d.assessment_plan for d in assessment_plan] if assessment_plan else [""]
 	assessment_result = get_assessment_result(assessment_plan_list)
 
 	for d in assessment_plan:
 
 		assessment_plan_details = assessment_result.get(d.assessment_plan)
-		assessment_plan_details = frappe._dict() if not assessment_plan_details else \
-			frappe._dict(assessment_plan_details)
+		assessment_plan_details = (
+			frappe._dict() if not assessment_plan_details else frappe._dict(assessment_plan_details)
+		)
 		if "saved" not in assessment_plan_details:
 			assessment_plan_details.update({"saved": 0})
 		if "submitted" not in assessment_plan_details:
 			assessment_plan_details.update({"submitted": 0})
 
 		# remaining students whose marks not entered
-		remaining_students = cint(d.student_group_strength) - cint(assessment_plan_details.saved) -\
-			cint(assessment_plan_details.submitted)
+		remaining_students = (
+			cint(d.student_group_strength)
+			- cint(assessment_plan_details.saved)
+			- cint(assessment_plan_details.submitted)
+		)
 		assessment_plan_details.update({"remaining": remaining_students})
 		d.update(assessment_plan_details)
 
@@ -86,7 +97,8 @@
 def get_assessment_result(assessment_plan_list):
 	assessment_result_dict = frappe._dict()
 
-	assessment_result = frappe.db.sql('''
+	assessment_result = frappe.db.sql(
+		"""
 		SELECT
 			assessment_plan, docstatus, count(*) as count
 		FROM
@@ -97,13 +109,17 @@
 			assessment_plan, docstatus
 		ORDER BY
 			assessment_plan
-	''' %', '.join(['%s']*len(assessment_plan_list)), tuple(assessment_plan_list), as_dict=1)
+	"""
+		% ", ".join(["%s"] * len(assessment_plan_list)),
+		tuple(assessment_plan_list),
+		as_dict=1,
+	)
 
 	for key, group in groupby(assessment_result, lambda ap: ap["assessment_plan"]):
 		tmp = {}
 		for d in group:
-			if d.docstatus in [0,1]:
-				tmp.update({DOCSTATUS[d.docstatus]:d.count})
+			if d.docstatus in [0, 1]:
+				tmp.update({DOCSTATUS[d.docstatus]: d.count})
 		assessment_result_dict[key] = tmp
 
 	return assessment_result_dict
@@ -111,70 +127,61 @@
 
 def get_chart(chart_data):
 	return {
-		"data": {
-			"labels": ["Saved", "Submitted", "Remaining"],
-			"datasets": [{
-				"values": chart_data
-			}]
-		},
-		"type": 'percentage',
+		"data": {"labels": ["Saved", "Submitted", "Remaining"], "datasets": [{"values": chart_data}]},
+		"type": "percentage",
 	}
 
 
 def get_column():
-	return [{
-		"fieldname": "assessment_plan",
-		"label": _("Assessment Plan"),
-		"fieldtype": "Link",
-		"options": "Assessment Plan",
-		"width": 120
-	},
-	{
-		"fieldname": "assessment_name",
-		"label": _("Assessment Plan Name"),
-		"fieldtype": "Data",
-		"options": "",
-		"width": 200
-	},
-	{
-		"fieldname": "schedule_date",
-		"label": _("Schedule Date"),
-		"fieldtype": "Date",
-		"options": "",
-		"width": 100
-	},
-	{
-		"fieldname": "student_group",
-		"label": _("Student Group"),
-		"fieldtype": "Link",
-		"options": "Student Group",
-		"width": 200
-	},
-	{
-		"fieldname": "student_group_strength",
-		"label": _("Total Student"),
-		"fieldtype": "Data",
-		"options": "",
-		"width": 100
-	},
-	{
-		"fieldname": "submitted",
-		"label": _("Submitted"),
-		"fieldtype": "Data",
-		"options": "",
-		"width": 100
-	},
-	{
-		"fieldname": "saved",
-		"label": _("Saved"),
-		"fieldtype": "Data",
-		"options": "",
-		"width": 100
-	},
-	{
-		"fieldname": "remaining",
-		"label": _("Remaining"),
-		"fieldtype": "Data",
-		"options": "",
-		"width": 100
-	}]
+	return [
+		{
+			"fieldname": "assessment_plan",
+			"label": _("Assessment Plan"),
+			"fieldtype": "Link",
+			"options": "Assessment Plan",
+			"width": 120,
+		},
+		{
+			"fieldname": "assessment_name",
+			"label": _("Assessment Plan Name"),
+			"fieldtype": "Data",
+			"options": "",
+			"width": 200,
+		},
+		{
+			"fieldname": "schedule_date",
+			"label": _("Schedule Date"),
+			"fieldtype": "Date",
+			"options": "",
+			"width": 100,
+		},
+		{
+			"fieldname": "student_group",
+			"label": _("Student Group"),
+			"fieldtype": "Link",
+			"options": "Student Group",
+			"width": 200,
+		},
+		{
+			"fieldname": "student_group_strength",
+			"label": _("Total Student"),
+			"fieldtype": "Data",
+			"options": "",
+			"width": 100,
+		},
+		{
+			"fieldname": "submitted",
+			"label": _("Submitted"),
+			"fieldtype": "Data",
+			"options": "",
+			"width": 100,
+		},
+		{"fieldname": "saved", "label": _("Saved"), "fieldtype": "Data", "options": "", "width": 100},
+		{
+			"fieldname": "remaining",
+			"label": _("Remaining"),
+			"fieldtype": "Data",
+			"options": "",
+			"width": 100,
+		},
+	]
diff --git a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py
index 38eef68..0930882 100644
--- a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py
+++ b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py
@@ -37,8 +37,12 @@
 		for criteria in assessment_criteria_dict:
 			scrub_criteria = frappe.scrub(criteria)
 			if criteria in result_dict[student][args.course][args.assessment_group]:
-				student_row[scrub_criteria] = result_dict[student][args.course][args.assessment_group][criteria]["grade"]
-				student_row[scrub_criteria + "_score"] = result_dict[student][args.course][args.assessment_group][criteria]["score"]
+				student_row[scrub_criteria] = result_dict[student][args.course][args.assessment_group][
+					criteria
+				]["grade"]
+				student_row[scrub_criteria + "_score"] = result_dict[student][args.course][
+					args.assessment_group
+				][criteria]["score"]
 
 				# create the list of possible grades
 				if student_row[scrub_criteria] not in grades:
@@ -51,7 +55,7 @@
 					grade_wise_analysis[criteria][student_row[scrub_criteria]] += 1
 			else:
 				student_row[frappe.scrub(criteria)] = ""
-				student_row[frappe.scrub(criteria)+ "_score"] = ""
+				student_row[frappe.scrub(criteria) + "_score"] = ""
 		data.append(student_row)
 
 	assessment_criteria_list = [d for d in assessment_criteria_dict]
@@ -61,7 +65,9 @@
 	return columns, data, None, chart
 
 
-def get_formatted_result(args, get_assessment_criteria=False, get_course=False, get_all_assessment_groups=False):
+def get_formatted_result(
+	args, get_assessment_criteria=False, get_course=False, get_all_assessment_groups=False
+):
 	cond, cond1, cond2, cond3, cond4 = " ", " ", " ", " ", " "
 	args_list = [args.academic_year]
 
@@ -80,14 +86,15 @@
 	create_total_dict = False
 
 	assessment_groups = get_child_assessment_groups(args.assessment_group)
-	cond3 = " and ar.assessment_group in (%s)"%(', '.join(['%s']*len(assessment_groups)))
+	cond3 = " and ar.assessment_group in (%s)" % (", ".join(["%s"] * len(assessment_groups)))
 	args_list += assessment_groups
 
 	if args.students:
-		cond4 = " and ar.student in (%s)"%(', '.join(['%s']*len(args.students)))
+		cond4 = " and ar.student in (%s)" % (", ".join(["%s"] * len(args.students)))
 		args_list += args.students
 
-	assessment_result = frappe.db.sql('''
+	assessment_result = frappe.db.sql(
+		"""
 		SELECT
 			ar.student, ar.student_name, ar.academic_year, ar.academic_term, ar.program, ar.course,
 			ar.assessment_plan, ar.grading_scale, ar.assessment_group, ar.student_group,
@@ -97,8 +104,12 @@
 		WHERE
 			ar.name=ard.parent and ar.docstatus=1 and ar.academic_year=%s {0} {1} {2} {3} {4}
 		ORDER BY
-			ard.assessment_criteria'''.format(cond, cond1, cond2, cond3, cond4),
-		tuple(args_list), as_dict=1)
+			ard.assessment_criteria""".format(
+			cond, cond1, cond2, cond3, cond4
+		),
+		tuple(args_list),
+		as_dict=1,
+	)
 
 	# create the nested dictionary structure as given below:
 	# <variable_name>.<student_name>.<course>.<assessment_group>.<assessment_criteria>.<grade/score/max_score>
@@ -114,21 +125,48 @@
 
 	# add the score for a given score and recalculate the grades
 	def add_score_and_recalculate_grade(result, assessment_group, assessment_criteria):
-		formatted_assessment_result[result.student][result.course][assessment_group]\
-			[assessment_criteria]["maximum_score"] += result.maximum_score
-		formatted_assessment_result[result.student][result.course][assessment_group]\
-			[assessment_criteria]["score"] += result.score
-		tmp_grade = get_grade(result.grading_scale, ((formatted_assessment_result[result.student][result.course]
-			[assessment_group][assessment_criteria]["score"])/(formatted_assessment_result[result.student]
-			[result.course][assessment_group][assessment_criteria]["maximum_score"]))*100)
-		formatted_assessment_result[result.student][result.course][assessment_group]\
-			[assessment_criteria]["grade"] = tmp_grade
+		formatted_assessment_result[result.student][result.course][assessment_group][
+			assessment_criteria
+		]["maximum_score"] += result.maximum_score
+		formatted_assessment_result[result.student][result.course][assessment_group][
+			assessment_criteria
+		]["score"] += result.score
+		tmp_grade = get_grade(
+			result.grading_scale,
+			(
+				(
+					formatted_assessment_result[result.student][result.course][assessment_group][
+						assessment_criteria
+					]["score"]
+				)
+				/ (
+					formatted_assessment_result[result.student][result.course][assessment_group][
+						assessment_criteria
+					]["maximum_score"]
+				)
+			)
+			* 100,
+		)
+		formatted_assessment_result[result.student][result.course][assessment_group][
+			assessment_criteria
+		]["grade"] = tmp_grade
 
 	# create the assessment criteria "Final Grade" with the sum of all the scores of the assessment criteria in a given assessment group
 	def add_total_score(result, assessment_group):
-		if "Final Grade" not in formatted_assessment_result[result.student][result.course][assessment_group]:
-			formatted_assessment_result[result.student][result.course][assessment_group]["Final Grade"] = frappe._dict({
-				"assessment_criteria": "Final Grade", "maximum_score": result.maximum_score, "score": result.score, "grade": result.grade})
+		if (
+			"Final Grade"
+			not in formatted_assessment_result[result.student][result.course][assessment_group]
+		):
+			formatted_assessment_result[result.student][result.course][assessment_group][
+				"Final Grade"
+			] = frappe._dict(
+				{
+					"assessment_criteria": "Final Grade",
+					"maximum_score": result.maximum_score,
+					"score": result.score,
+					"grade": result.grade,
+				}
+			)
 		else:
 			add_score_and_recalculate_grade(result, assessment_group, "Final Grade")
 
@@ -136,8 +174,14 @@
 		if result.student not in student_details:
 			student_details[result.student] = result.student_name
 
-		assessment_criteria_details = frappe._dict({"assessment_criteria": result.assessment_criteria,
-			"maximum_score": result.maximum_score, "score": result.score, "grade": result.grade})
+		assessment_criteria_details = frappe._dict(
+			{
+				"assessment_criteria": result.assessment_criteria,
+				"maximum_score": result.maximum_score,
+				"score": result.score,
+				"grade": result.grade,
+			}
+		)
 
 		if not formatted_assessment_result[result.student]:
 			formatted_assessment_result[result.student] = defaultdict(dict)
@@ -145,32 +189,46 @@
 			formatted_assessment_result[result.student][result.course] = defaultdict(dict)
 
 		if not create_total_dict:
-			formatted_assessment_result[result.student][result.course][result.assessment_group]\
-				[result.assessment_criteria] = assessment_criteria_details
+			formatted_assessment_result[result.student][result.course][result.assessment_group][
+				result.assessment_criteria
+			] = assessment_criteria_details
 			add_total_score(result, result.assessment_group)
 
 		# create the total of all the assessment groups criteria-wise
 		elif create_total_dict:
 			if get_all_assessment_groups:
-				formatted_assessment_result[result.student][result.course][result.assessment_group]\
-					[result.assessment_criteria] = assessment_criteria_details
+				formatted_assessment_result[result.student][result.course][result.assessment_group][
+					result.assessment_criteria
+				] = assessment_criteria_details
 			if not formatted_assessment_result[result.student][result.course][args.assessment_group]:
-				formatted_assessment_result[result.student][result.course][args.assessment_group] = defaultdict(dict)
-				formatted_assessment_result[result.student][result.course][args.assessment_group]\
-					[result.assessment_criteria] = assessment_criteria_details
-			elif result.assessment_criteria not in formatted_assessment_result[result.student][result.course][args.assessment_group]:
-				formatted_assessment_result[result.student][result.course][args.assessment_group]\
-					[result.assessment_criteria] = assessment_criteria_details
-			elif result.assessment_criteria in formatted_assessment_result[result.student][result.course][args.assessment_group]:
+				formatted_assessment_result[result.student][result.course][
+					args.assessment_group
+				] = defaultdict(dict)
+				formatted_assessment_result[result.student][result.course][args.assessment_group][
+					result.assessment_criteria
+				] = assessment_criteria_details
+			elif (
+				result.assessment_criteria
+				not in formatted_assessment_result[result.student][result.course][args.assessment_group]
+			):
+				formatted_assessment_result[result.student][result.course][args.assessment_group][
+					result.assessment_criteria
+				] = assessment_criteria_details
+			elif (
+				result.assessment_criteria
+				in formatted_assessment_result[result.student][result.course][args.assessment_group]
+			):
 				add_score_and_recalculate_grade(result, args.assessment_group, result.assessment_criteria)
 
 			add_total_score(result, args.assessment_group)
 
-		total_maximum_score = formatted_assessment_result[result.student][result.course][args.assessment_group]\
-			["Final Grade"]["maximum_score"]
+		total_maximum_score = formatted_assessment_result[result.student][result.course][
+			args.assessment_group
+		]["Final Grade"]["maximum_score"]
 		if get_assessment_criteria:
-			assessment_criteria_dict[result.assessment_criteria] = formatted_assessment_result[result.student][result.course]\
-				[args.assessment_group][result.assessment_criteria]["maximum_score"]
+			assessment_criteria_dict[result.assessment_criteria] = formatted_assessment_result[
+				result.student
+			][result.course][args.assessment_group][result.assessment_criteria]["maximum_score"]
 		if get_course:
 			course_dict[result.course] = total_maximum_score
 
@@ -181,37 +239,31 @@
 		"student_details": student_details,
 		"assessment_result": formatted_assessment_result,
 		"assessment_criteria": assessment_criteria_dict,
-		"course_dict": course_dict
+		"course_dict": course_dict,
 	}
 
 
 def get_column(assessment_criteria):
-	columns = [{
-		"fieldname": "student",
-		"label": _("Student ID"),
-		"fieldtype": "Link",
-		"options": "Student",
-		"width": 90
-	},
-	{
-		"fieldname": "student_name",
-		"label": _("Student Name"),
-		"fieldtype": "Data",
-		"width": 160
-	}]
+	columns = [
+		{
+			"fieldname": "student",
+			"label": _("Student ID"),
+			"fieldtype": "Link",
+			"options": "Student",
+			"width": 90,
+		},
+		{"fieldname": "student_name", "label": _("Student Name"), "fieldtype": "Data", "width": 160},
+	]
 	for d in assessment_criteria:
-		columns.append({
-			"fieldname": frappe.scrub(d),
-			"label": d,
-			"fieldtype": "Data",
-			"width": 110
-		})
-		columns.append({
-			"fieldname": frappe.scrub(d) +"_score",
-			"label": "Score(" + str(int(assessment_criteria[d])) + ")",
-			"fieldtype": "Float",
-			"width": 100
-		})
+		columns.append({"fieldname": frappe.scrub(d), "label": d, "fieldtype": "Data", "width": 110})
+		columns.append(
+			{
+				"fieldname": frappe.scrub(d) + "_score",
+				"label": "Score(" + str(int(assessment_criteria[d])) + ")",
+				"fieldtype": "Float",
+				"width": 100,
+			}
+		)
 
 	return columns
 
@@ -221,7 +273,7 @@
 	datasets = []
 
 	for grade in grades:
-		tmp = frappe._dict({"name": grade, "values":[]})
+		tmp = frappe._dict({"name": grade, "values": []})
 		for criteria in criteria_list:
 			if grade in kounter[criteria]:
 				tmp["values"].append(kounter[criteria][grade])
@@ -230,11 +282,8 @@
 		datasets.append(tmp)
 
 	return {
-		"data": {
-			"labels": criteria_list,
-			"datasets": datasets
-		},
-		"type": 'bar',
+		"data": {"labels": criteria_list, "datasets": datasets},
+		"type": "bar",
 	}
 
 
@@ -243,8 +292,12 @@
 	group_type = frappe.get_value("Assessment Group", assessment_group, "is_group")
 	if group_type:
 		from frappe.desk.treeview import get_children
-		assessment_groups = [d.get("value") for d in get_children("Assessment Group",
-			assessment_group) if d.get("value") and not d.get("expandable")]
+
+		assessment_groups = [
+			d.get("value")
+			for d in get_children("Assessment Group", assessment_group)
+			if d.get("value") and not d.get("expandable")
+		]
 	else:
 		assessment_groups = [assessment_group]
 	return assessment_groups
diff --git a/erpnext/education/report/final_assessment_grades/final_assessment_grades.py b/erpnext/education/report/final_assessment_grades/final_assessment_grades.py
index b042867..8d5acc6 100644
--- a/erpnext/education/report/final_assessment_grades/final_assessment_grades.py
+++ b/erpnext/education/report/final_assessment_grades/final_assessment_grades.py
@@ -22,7 +22,9 @@
 	assessment_group = args["assessment_group"] = filters.get("assessment_group")
 
 	student_group = filters.get("student_group")
-	args.students = frappe.db.sql_list("select student from `tabStudent Group Student` where parent=%s", (student_group))
+	args.students = frappe.db.sql_list(
+		"select student from `tabStudent Group Student` where parent=%s", (student_group)
+	)
 
 	values = get_formatted_result(args, get_course=True)
 	student_details = values.get("student_details")
@@ -37,8 +39,12 @@
 			for course in course_dict:
 				scrub_course = frappe.scrub(course)
 				if assessment_group in assessment_result[student][course]:
-					student_row["grade_" + scrub_course] = assessment_result[student][course][assessment_group]["Total Score"]["grade"]
-					student_row["score_" + scrub_course] = assessment_result[student][course][assessment_group]["Total Score"]["score"]
+					student_row["grade_" + scrub_course] = assessment_result[student][course][assessment_group][
+						"Total Score"
+					]["grade"]
+					student_row["score_" + scrub_course] = assessment_result[student][course][assessment_group][
+						"Total Score"
+					]["score"]
 
 					# create the list of possible grades
 					if student_row["grade_" + scrub_course] not in grades:
@@ -59,31 +65,32 @@
 
 
 def get_column(course_dict):
-	columns = [{
-		"fieldname": "student",
-		"label": _("Student ID"),
-		"fieldtype": "Link",
-		"options": "Student",
-		"width": 90
-	},
-	{
-		"fieldname": "student_name",
-		"label": _("Student Name"),
-		"fieldtype": "Data",
-		"width": 160
-	}]
+	columns = [
+		{
+			"fieldname": "student",
+			"label": _("Student ID"),
+			"fieldtype": "Link",
+			"options": "Student",
+			"width": 90,
+		},
+		{"fieldname": "student_name", "label": _("Student Name"), "fieldtype": "Data", "width": 160},
+	]
 	for course in course_dict:
-		columns.append({
-			"fieldname": "grade_" + frappe.scrub(course),
-			"label": course,
-			"fieldtype": "Data",
-			"width": 110
-		})
-		columns.append({
-			"fieldname": "score_" + frappe.scrub(course),
-			"label": "Score(" + str(course_dict[course]) + ")",
-			"fieldtype": "Float",
-			"width": 100
-		})
+		columns.append(
+			{
+				"fieldname": "grade_" + frappe.scrub(course),
+				"label": course,
+				"fieldtype": "Data",
+				"width": 110,
+			}
+		)
+		columns.append(
+			{
+				"fieldname": "score_" + frappe.scrub(course),
+				"label": "Score(" + str(course_dict[course]) + ")",
+				"fieldtype": "Float",
+				"width": 100,
+			}
+		)
 
 	return columns
diff --git a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py b/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py
index 0599dad..e5591f9 100644
--- a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py
+++ b/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py
@@ -16,33 +16,29 @@
 
 	return columns, data, None, chart
 
+
 def get_columns(filters=None):
 	return [
 		{
-			'label': _('Program'),
-			'fieldname': 'program',
-			'fieldtype': 'Link',
-			'options': 'Program',
-			'width': 300
+			"label": _("Program"),
+			"fieldname": "program",
+			"fieldtype": "Link",
+			"options": "Program",
+			"width": 300,
 		},
 		{
-			'label': _('Fees Collected'),
-			'fieldname': 'fees_collected',
-			'fieldtype': 'Currency',
-			'width': 200
+			"label": _("Fees Collected"),
+			"fieldname": "fees_collected",
+			"fieldtype": "Currency",
+			"width": 200,
 		},
 		{
-			'label': _('Outstanding Amount'),
-			'fieldname': 'outstanding_amount',
-			'fieldtype': 'Currency',
-			'width': 200
+			"label": _("Outstanding Amount"),
+			"fieldname": "outstanding_amount",
+			"fieldtype": "Currency",
+			"width": 200,
 		},
-		{
-			'label': _('Grand Total'),
-			'fieldname': 'grand_total',
-			'fieldtype': 'Currency',
-			'width': 200
-		}
+		{"label": _("Grand Total"), "fieldname": "grand_total", "fieldtype": "Currency", "width": 200},
 	]
 
 
@@ -71,24 +67,32 @@
 				GROUP BY program
 			) AS FeesCollected
 			ORDER BY FeesCollected.paid_amount DESC
-		""" % (conditions)
-	, as_dict=1)
+		"""
+		% (conditions),
+		as_dict=1,
+	)
 
 	for entry in fee_details:
-		data.append({
-			'program': entry.program,
-			'fees_collected': entry.paid_amount,
-			'outstanding_amount': entry.outstanding_amount,
-			'grand_total': entry.grand_total
-		})
+		data.append(
+			{
+				"program": entry.program,
+				"fees_collected": entry.paid_amount,
+				"outstanding_amount": entry.outstanding_amount,
+				"grand_total": entry.grand_total,
+			}
+		)
 
 	return data
 
-def get_filter_conditions(filters):
-	conditions = ''
 
-	if filters.get('from_date') and filters.get('to_date'):
-		conditions += " and posting_date BETWEEN '%s' and '%s'" % (filters.get('from_date'), filters.get('to_date'))
+def get_filter_conditions(filters):
+	conditions = ""
+
+	if filters.get("from_date") and filters.get("to_date"):
+		conditions += " and posting_date BETWEEN '%s' and '%s'" % (
+			filters.get("from_date"),
+			filters.get("to_date"),
+		)
 
 	return conditions
 
@@ -102,23 +106,17 @@
 	outstanding_amount = []
 
 	for entry in data:
-		labels.append(entry.get('program'))
-		fees_collected.append(entry.get('fees_collected'))
-		outstanding_amount.append(entry.get('outstanding_amount'))
+		labels.append(entry.get("program"))
+		fees_collected.append(entry.get("fees_collected"))
+		outstanding_amount.append(entry.get("outstanding_amount"))
 
 	return {
-		'data': {
-			'labels': labels,
-			'datasets': [
-				{
-					'name': _('Fees Collected'),
-					'values': fees_collected
-				},
-				{
-					'name': _('Outstanding Amt'),
-					'values': outstanding_amount
-				}
-			]
+		"data": {
+			"labels": labels,
+			"datasets": [
+				{"name": _("Fees Collected"), "values": fees_collected},
+				{"name": _("Outstanding Amt"), "values": outstanding_amount},
+			],
 		},
-		'type': 'bar'
+		"type": "bar",
 	}
diff --git a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
index 7097b80..6f871d7 100644
--- a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
+++ b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
@@ -15,12 +15,19 @@
 
 	columns = get_columns()
 
-	program_enrollments = frappe.get_list("Program Enrollment", fields=["student", "student_name"],
-		filters={"academic_year": academic_year, "program": program, "student_batch_name": student_batch_name})
+	program_enrollments = frappe.get_list(
+		"Program Enrollment",
+		fields=["student", "student_name"],
+		filters={
+			"academic_year": academic_year,
+			"program": program,
+			"student_batch_name": student_batch_name,
+		},
+	)
 
 	student_list = [d.student for d in program_enrollments]
 	if not student_list:
-		return  columns, []
+		return columns, []
 
 	group_roll_no_map = get_student_roll_no(academic_year, program, student_batch_name)
 	student_map = get_student_details(student_list)
@@ -28,8 +35,14 @@
 
 	for d in program_enrollments:
 		student_details = student_map.get(d.student)
-		row = [group_roll_no_map.get(d.student), d.student, d.student_name, student_details.get("student_mobile_number"),\
-				student_details.get("student_email_id"), student_details.get("address")]
+		row = [
+			group_roll_no_map.get(d.student),
+			d.student,
+			d.student_name,
+			student_details.get("student_mobile_number"),
+			student_details.get("student_email_id"),
+			student_details.get("address"),
+		]
 
 		student_guardians = guardian_map.get(d.student)
 
@@ -63,32 +76,56 @@
 	]
 	return columns
 
+
 def get_student_details(student_list):
 	student_map = frappe._dict()
-	student_details = frappe.db.sql('''
-		select name, student_mobile_number, student_email_id, address_line_1, address_line_2, city, state from `tabStudent` where name in (%s)''' %
-		', '.join(['%s']*len(student_list)), tuple(student_list), as_dict=1)
+	student_details = frappe.db.sql(
+		"""
+		select name, student_mobile_number, student_email_id, address_line_1, address_line_2, city, state from `tabStudent` where name in (%s)"""
+		% ", ".join(["%s"] * len(student_list)),
+		tuple(student_list),
+		as_dict=1,
+	)
 	for s in student_details:
 		student = frappe._dict()
 		student["student_mobile_number"] = s.student_mobile_number
 		student["student_email_id"] = s.student_email_id
-		student["address"] = ', '.join([d for d in [s.address_line_1, s.address_line_2, s.city, s.state] if d])
+		student["address"] = ", ".join(
+			[d for d in [s.address_line_1, s.address_line_2, s.city, s.state] if d]
+		)
 		student_map[s.name] = student
 	return student_map
 
+
 def get_guardian_map(student_list):
 	guardian_map = frappe._dict()
-	guardian_details = frappe.db.sql('''
-		select  parent, guardian, guardian_name, relation  from `tabStudent Guardian` where parent in (%s)''' %
-		', '.join(['%s']*len(student_list)), tuple(student_list), as_dict=1)
+	guardian_details = frappe.db.sql(
+		"""
+		select  parent, guardian, guardian_name, relation  from `tabStudent Guardian` where parent in (%s)"""
+		% ", ".join(["%s"] * len(student_list)),
+		tuple(student_list),
+		as_dict=1,
+	)
 
-	guardian_list = list(set([g.guardian for g in guardian_details])) or ['']
+	guardian_list = list(set([g.guardian for g in guardian_details])) or [""]
 
-	guardian_mobile_no = dict(frappe.db.sql("""select name, mobile_number from `tabGuardian`
-			where name in (%s)""" % ", ".join(['%s']*len(guardian_list)), tuple(guardian_list)))
+	guardian_mobile_no = dict(
+		frappe.db.sql(
+			"""select name, mobile_number from `tabGuardian`
+			where name in (%s)"""
+			% ", ".join(["%s"] * len(guardian_list)),
+			tuple(guardian_list),
+		)
+	)
 
-	guardian_email_id = dict(frappe.db.sql("""select name, email_address from `tabGuardian`
-			where name in (%s)""" % ", ".join(['%s']*len(guardian_list)), tuple(guardian_list)))
+	guardian_email_id = dict(
+		frappe.db.sql(
+			"""select name, email_address from `tabGuardian`
+			where name in (%s)"""
+			% ", ".join(["%s"] * len(guardian_list)),
+			tuple(guardian_list),
+		)
+	)
 
 	for guardian in guardian_details:
 		guardian["mobile_number"] = guardian_mobile_no.get(guardian.guardian)
@@ -97,11 +134,18 @@
 
 	return guardian_map
 
+
 def get_student_roll_no(academic_year, program, batch):
-	student_group = frappe.get_all("Student Group",
-		filters={"academic_year":academic_year, "program":program, "batch":batch, "disabled": 0})
+	student_group = frappe.get_all(
+		"Student Group",
+		filters={"academic_year": academic_year, "program": program, "batch": batch, "disabled": 0},
+	)
 	if student_group:
-		roll_no_dict = dict(frappe.db.sql('''select student, group_roll_number from `tabStudent Group Student` where parent=%s''',
-			(student_group[0].name)))
+		roll_no_dict = dict(
+			frappe.db.sql(
+				"""select student, group_roll_number from `tabStudent Group Student` where parent=%s""",
+				(student_group[0].name),
+			)
+		)
 		return roll_no_dict
 	return {}
diff --git a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py
index 52055dc..282f5c9 100644
--- a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py
+++ b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py
@@ -11,14 +11,19 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if not filters.get("date"):
 		msgprint(_("Please select date"), raise_exception=1)
 
 	holiday_list = get_holiday_list()
 	if is_holiday(holiday_list, filters.get("date")):
-		msgprint(_("No attendance has been marked for {0} as it is a Holiday").format(frappe.bold(formatdate(filters.get("date")))))
+		msgprint(
+			_("No attendance has been marked for {0} as it is a Holiday").format(
+				frappe.bold(formatdate(filters.get("date")))
+			)
+		)
 
 	columns = get_columns(filters)
 
@@ -33,40 +38,54 @@
 		student_attendance = get_student_attendance(student_group.name, filters.get("date"))
 		if student_attendance:
 			for attendance in student_attendance:
-				if attendance.status== "Present":
+				if attendance.status == "Present":
 					present_students = attendance.count
-				elif attendance.status== "Absent":
+				elif attendance.status == "Absent":
 					absent_students = attendance.count
 
 		unmarked_students = student_group_strength - (present_students + absent_students)
-		row+= [student_group_strength, present_students, absent_students, unmarked_students]
+		row += [student_group_strength, present_students, absent_students, unmarked_students]
 		data.append(row)
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		_("Student Group") + ":Link/Student Group:250",
 		_("Student Group Strength") + "::170",
 		_("Present") + "::90",
 		_("Absent") + "::90",
-		_("Not Marked") + "::90"
+		_("Not Marked") + "::90",
 	]
 	return columns
 
+
 def get_active_student_group():
-	active_student_groups = frappe.db.sql("""select name from `tabStudent Group` where group_based_on = "Batch"
-		and academic_year=%s order by name""", (frappe.defaults.get_defaults().academic_year), as_dict=1)
+	active_student_groups = frappe.db.sql(
+		"""select name from `tabStudent Group` where group_based_on = "Batch"
+		and academic_year=%s order by name""",
+		(frappe.defaults.get_defaults().academic_year),
+		as_dict=1,
+	)
 	return active_student_groups
 
+
 def get_student_group_strength(student_group):
-	student_group_strength = frappe.db.sql("""select count(*) from `tabStudent Group Student`
-		where parent = %s and active=1""", student_group)[0][0]
+	student_group_strength = frappe.db.sql(
+		"""select count(*) from `tabStudent Group Student`
+		where parent = %s and active=1""",
+		student_group,
+	)[0][0]
 	return student_group_strength
 
+
 def get_student_attendance(student_group, date):
-	student_attendance = frappe.db.sql("""select count(*) as count, status from `tabStudent Attendance` where
+	student_attendance = frappe.db.sql(
+		"""select count(*) as count, status from `tabStudent Attendance` where
 				student_group= %s and date= %s and docstatus = 1 and
 				(course_schedule is Null or course_schedule='') group by status""",
-				(student_group, date), as_dict=1)
+		(student_group, date),
+		as_dict=1,
+	)
 	return student_attendance
diff --git a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
index 1166a75..9312e2b 100644
--- a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
+++ b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
@@ -12,13 +12,14 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
-	from_date = get_first_day(filters["month"] + '-' + filters["year"])
-	to_date = get_last_day(filters["month"] + '-' + filters["year"])
-	total_days_in_month = date_diff(to_date, from_date) +1
+	from_date = get_first_day(filters["month"] + "-" + filters["year"])
+	to_date = get_last_day(filters["month"] + "-" + filters["year"])
+	total_days_in_month = date_diff(to_date, from_date) + 1
 	columns = get_columns(total_days_in_month)
-	students = get_student_group_students(filters.get("student_group"),1)
+	students = get_student_group_students(filters.get("student_group"), 1)
 	students_list = get_students_list(students)
 	att_map = get_attendance_list(from_date, to_date, filters.get("student_group"), students_list)
 	data = []
@@ -30,7 +31,7 @@
 		total_p = total_a = 0.0
 
 		for day in range(total_days_in_month):
-			status="None"
+			status = "None"
 
 			if att_map.get(stud.student):
 				status = att_map.get(stud.student).get(date, "None")
@@ -39,7 +40,7 @@
 			else:
 				status = "None"
 
-			status_map = {"Present": "P", "Absent": "A", "None": "", "Inactive":"-", "Holiday":"H"}
+			status_map = {"Present": "P", "Absent": "A", "None": "", "Inactive": "-", "Holiday": "H"}
 			row.append(status_map[status])
 
 			if status == "Present":
@@ -52,33 +53,43 @@
 		data.append(row)
 	return columns, data
 
+
 def get_columns(days_in_month):
-	columns = [ _("Student") + ":Link/Student:90", _("Student Name") + "::150"]
+	columns = [_("Student") + ":Link/Student:90", _("Student Name") + "::150"]
 	for day in range(days_in_month):
-		columns.append(cstr(day+1) +"::20")
+		columns.append(cstr(day + 1) + "::20")
 	columns += [_("Total Present") + ":Int:95", _("Total Absent") + ":Int:90"]
 	return columns
 
+
 def get_students_list(students):
 	student_list = []
 	for stud in students:
 		student_list.append(stud.student)
 	return student_list
 
+
 def get_attendance_list(from_date, to_date, student_group, students_list):
-	attendance_list = frappe.db.sql('''select student, date, status
+	attendance_list = frappe.db.sql(
+		"""select student, date, status
 		from `tabStudent Attendance` where student_group = %s
 		and docstatus = 1
 		and date between %s and %s
-		order by student, date''',
-		(student_group, from_date, to_date), as_dict=1)
+		order by student, date""",
+		(student_group, from_date, to_date),
+		as_dict=1,
+	)
 
 	att_map = {}
-	students_with_leave_application = get_students_with_leave_application(from_date, to_date, students_list)
+	students_with_leave_application = get_students_with_leave_application(
+		from_date, to_date, students_list
+	)
 	for d in attendance_list:
 		att_map.setdefault(d.student, frappe._dict()).setdefault(d.date, "")
 
-		if students_with_leave_application.get(d.date) and d.student in students_with_leave_application.get(d.date):
+		if students_with_leave_application.get(
+			d.date
+		) and d.student in students_with_leave_application.get(d.date):
 			att_map[d.student][d.date] = "Present"
 		else:
 			att_map[d.student][d.date] = d.status
@@ -87,9 +98,12 @@
 
 	return att_map
 
+
 def get_students_with_leave_application(from_date, to_date, students_list):
-	if not students_list: return
-	leave_applications = frappe.db.sql("""
+	if not students_list:
+		return
+	leave_applications = frappe.db.sql(
+		"""
 		select student, from_date, to_date
 		from `tabStudent Leave Application`
 		where
@@ -100,29 +114,34 @@
 				or to_date between %(from_date)s and %(to_date)s
 				or (%(from_date)s between from_date and to_date and %(to_date)s between from_date and to_date)
 			)
-		""", {
-			"students": students_list,
-			"from_date": from_date,
-			"to_date": to_date
-		}, as_dict=True)
-	students_with_leaves= {}
+		""",
+		{"students": students_list, "from_date": from_date, "to_date": to_date},
+		as_dict=True,
+	)
+	students_with_leaves = {}
 	for application in leave_applications:
 		for date in daterange(application.from_date, application.to_date):
 			students_with_leaves.setdefault(date, []).append(application.student)
 
 	return students_with_leaves
 
+
 def daterange(d1, d2):
 	import datetime
+
 	return (d1 + datetime.timedelta(days=i) for i in range((d2 - d1).days + 1))
 
+
 @frappe.whitelist()
 def get_attendance_years():
-	year_list = frappe.db.sql_list('''select distinct YEAR(date) from `tabStudent Attendance` ORDER BY YEAR(date) DESC''')
+	year_list = frappe.db.sql_list(
+		"""select distinct YEAR(date) from `tabStudent Attendance` ORDER BY YEAR(date) DESC"""
+	)
 	if not year_list:
 		year_list = [getdate().year]
 	return "\n".join(str(year) for year in year_list)
 
+
 def mark_holidays(att_map, from_date, to_date, students_list):
 	holiday_list = get_holiday_list()
 	holidays = get_holidays(holiday_list)
diff --git a/erpnext/education/setup.py b/erpnext/education/setup.py
index 663f1ca..2b82da5 100644
--- a/erpnext/education/setup.py
+++ b/erpnext/education/setup.py
@@ -21,12 +21,13 @@
 			doc.insert(ignore_permissions=True)
 		except frappe.DuplicateEntryError as e:
 			# pass DuplicateEntryError and continue
-			if e.args and e.args[0]==doc.doctype and e.args[1]==doc.name:
+			if e.args and e.args[0] == doc.doctype and e.args[1] == doc.name:
 				# make sure DuplicateEntryError is for the exact same doc and not a related doc
 				pass
 			else:
 				raise
 
+
 def create_academic_sessions():
 	data = [
 		{"doctype": "Academic Year", "academic_year_name": "2015-16"},
@@ -36,10 +37,11 @@
 		{"doctype": "Academic Term", "academic_year": "2016-17", "term_name": "Semester 1"},
 		{"doctype": "Academic Term", "academic_year": "2016-17", "term_name": "Semester 2"},
 		{"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 1"},
-		{"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 2"}
+		{"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 2"},
 	]
 	insert_record(data)
 
+
 def disable_desk_access_for_student_role():
 	try:
 		student_role = frappe.get_doc("Role", "Student")
@@ -50,11 +52,9 @@
 	student_role.desk_access = 0
 	student_role.save()
 
+
 def create_student_role():
-	student_role = frappe.get_doc({
-		"doctype": "Role",
-		"role_name": "Student",
-		"desk_access": 0,
-		"restrict_to_domain": "Education"
-	})
+	student_role = frappe.get_doc(
+		{"doctype": "Role", "role_name": "Student", "desk_access": 0, "restrict_to_domain": "Education"}
+	)
 	student_role.insert()
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index a7a15d1..e6eb1c9 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -4,7 +4,9 @@
 from frappe import _
 
 
-class OverlapError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
+
 
 def validate_overlap_for(doc, doctype, fieldname, value=None):
 	"""Checks overlap for specified field.
@@ -14,8 +16,16 @@
 
 	existing = get_overlap_for(doc, doctype, fieldname, value)
 	if existing:
-		frappe.throw(_("This {0} conflicts with {1} for {2} {3}").format(doc.doctype, existing.name,
-			doc.meta.get_label(fieldname) if not value else fieldname , value or doc.get(fieldname)), OverlapError)
+		frappe.throw(
+			_("This {0} conflicts with {1} for {2} {3}").format(
+				doc.doctype,
+				existing.name,
+				doc.meta.get_label(fieldname) if not value else fieldname,
+				value or doc.get(fieldname),
+			),
+			OverlapError,
+		)
+
 
 def get_overlap_for(doc, doctype, fieldname, value=None):
 	"""Returns overlaping document for specified field.
@@ -23,45 +33,54 @@
 	:param fieldname: Checks Overlap for this field
 	"""
 
-	existing = frappe.db.sql("""select name, from_time, to_time from `tab{0}`
+	existing = frappe.db.sql(
+		"""select name, from_time, to_time from `tab{0}`
 		where `{1}`=%(val)s and schedule_date = %(schedule_date)s and
 		(
 			(from_time > %(from_time)s and from_time < %(to_time)s) or
 			(to_time > %(from_time)s and to_time < %(to_time)s) or
 			(%(from_time)s > from_time and %(from_time)s < to_time) or
 			(%(from_time)s = from_time and %(to_time)s = to_time))
-		and name!=%(name)s and docstatus!=2""".format(doctype, fieldname),
+		and name!=%(name)s and docstatus!=2""".format(
+			doctype, fieldname
+		),
 		{
 			"schedule_date": doc.schedule_date,
 			"val": value or doc.get(fieldname),
 			"from_time": doc.from_time,
 			"to_time": doc.to_time,
-			"name": doc.name or "No Name"
-		}, as_dict=True)
+			"name": doc.name or "No Name",
+		},
+		as_dict=True,
+	)
 
 	return existing[0] if existing else None
 
 
 def validate_duplicate_student(students):
-	unique_students= []
+	unique_students = []
 	for stud in students:
 		if stud.student in unique_students:
-			frappe.throw(_("Student {0} - {1} appears Multiple times in row {2} & {3}")
-				.format(stud.student, stud.student_name, unique_students.index(stud.student)+1, stud.idx))
+			frappe.throw(
+				_("Student {0} - {1} appears Multiple times in row {2} & {3}").format(
+					stud.student, stud.student_name, unique_students.index(stud.student) + 1, stud.idx
+				)
+			)
 		else:
 			unique_students.append(stud.student)
 
 		return None
 
+
 # LMS Utils
 def get_current_student():
 	"""Returns current student from frappe.session.user
 
 	Returns:
-		object: Student Document
+	        object: Student Document
 	"""
 	email = frappe.session.user
-	if email in ('Administrator', 'Guest'):
+	if email in ("Administrator", "Guest"):
 		return None
 	try:
 		student_id = frappe.get_all("Student", {"student_email_id": email}, ["name"])[0].name
@@ -69,74 +88,86 @@
 	except (IndexError, frappe.DoesNotExistError):
 		return None
 
+
 def get_portal_programs():
 	"""Returns a list of all program to be displayed on the portal
 	Programs are returned based on the following logic
-		is_published and (student_is_enrolled or student_can_self_enroll)
+	        is_published and (student_is_enrolled or student_can_self_enroll)
 
 	Returns:
-		list of dictionary: List of all programs and to be displayed on the portal along with access rights
+	        list of dictionary: List of all programs and to be displayed on the portal along with access rights
 	"""
 	published_programs = frappe.get_all("Program", filters={"is_published": True})
 	if not published_programs:
 		return None
 
 	program_list = [frappe.get_doc("Program", program) for program in published_programs]
-	portal_programs = [{'program': program, 'has_access': allowed_program_access(program.name)} for program in program_list if allowed_program_access(program.name) or program.allow_self_enroll]
+	portal_programs = [
+		{"program": program, "has_access": allowed_program_access(program.name)}
+		for program in program_list
+		if allowed_program_access(program.name) or program.allow_self_enroll
+	]
 
 	return portal_programs
 
+
 def allowed_program_access(program, student=None):
 	"""Returns enrollment status for current student
 
 	Args:
-		program (string): Name of the program
-		student (object): instance of Student document
+	        program (string): Name of the program
+	        student (object): instance of Student document
 
 	Returns:
-		bool: Is current user enrolled or not
+	        bool: Is current user enrolled or not
 	"""
 	if has_super_access():
 		return True
 	if not student:
 		student = get_current_student()
-	if student and get_enrollment('program', program, student.name):
+	if student and get_enrollment("program", program, student.name):
 		return True
 	else:
 		return False
 
+
 def get_enrollment(master, document, student):
 	"""Gets enrollment for course or program
 
 	Args:
-		master (string): can either be program or course
-		document (string): program or course name
-		student (string): Student ID
+	        master (string): can either be program or course
+	        document (string): program or course name
+	        student (string): Student ID
 
 	Returns:
-		string: Enrollment Name if exists else returns empty string
+	        string: Enrollment Name if exists else returns empty string
 	"""
-	if master == 'program':
-		enrollments = frappe.get_all("Program Enrollment", filters={'student':student, 'program': document, 'docstatus': 1})
-	if master == 'course':
-		enrollments = frappe.get_all("Course Enrollment", filters={'student':student, 'course': document})
+	if master == "program":
+		enrollments = frappe.get_all(
+			"Program Enrollment", filters={"student": student, "program": document, "docstatus": 1}
+		)
+	if master == "course":
+		enrollments = frappe.get_all(
+			"Course Enrollment", filters={"student": student, "course": document}
+		)
 
 	if enrollments:
 		return enrollments[0].name
 	else:
 		return None
 
+
 @frappe.whitelist()
 def enroll_in_program(program_name, student=None):
 	"""Enroll student in program
 
 	Args:
-		program_name (string): Name of the program to be enrolled into
-		student (string, optional): name of student who has to be enrolled, if not
-			provided, a student will be created from the current user
+	        program_name (string): Name of the program to be enrolled into
+	        student (string, optional): name of student who has to be enrolled, if not
+	                provided, a student will be created from the current user
 
 	Returns:
-		string: name of the program enrollment document
+	        string: name of the program enrollment document
 	"""
 	if has_super_access():
 		return
@@ -145,7 +176,7 @@
 		student = frappe.get_doc("Student", student)
 	else:
 		# Check if self enrollment in allowed
-		program = frappe.get_doc('Program', program_name)
+		program = frappe.get_doc("Program", program_name)
 		if not program.allow_self_enroll:
 			return frappe.throw(_("You are not allowed to enroll for this course"))
 
@@ -154,12 +185,12 @@
 			student = create_student_from_current_user()
 
 	# Check if student is already enrolled in program
-	enrollment = get_enrollment('program', program_name, student.name)
+	enrollment = get_enrollment("program", program_name, student.name)
 	if enrollment:
 		return enrollment
 
 	# Check if self enrollment in allowed
-	program = frappe.get_doc('Program', program_name)
+	program = frappe.get_doc("Program", program_name)
 	if not program.allow_self_enroll:
 		return frappe.throw(_("You are not allowed to enroll for this course"))
 
@@ -167,15 +198,19 @@
 	program_enrollment = student.enroll_in_program(program_name)
 	return program_enrollment.name
 
+
 def has_super_access():
 	"""Check if user has a role that allows full access to LMS
 
 	Returns:
-		bool: true if user has access to all lms content
+	        bool: true if user has access to all lms content
 	"""
-	current_user = frappe.get_doc('User', frappe.session.user)
+	current_user = frappe.get_doc("User", frappe.session.user)
 	roles = set([role.role for role in current_user.roles])
-	return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'})
+	return bool(
+		roles & {"Administrator", "Instructor", "Education Manager", "System Manager", "Academic User"}
+	)
+
 
 @frappe.whitelist()
 def add_activity(course, content_type, content, program):
@@ -184,14 +219,17 @@
 
 	student = get_current_student()
 	if not student:
-		return frappe.throw(_("Student with email {0} does not exist").format(frappe.session.user), frappe.DoesNotExistError)
+		return frappe.throw(
+			_("Student with email {0} does not exist").format(frappe.session.user), frappe.DoesNotExistError
+		)
 
 	enrollment = get_or_create_course_enrollment(course, program)
-	if content_type == 'Quiz':
+	if content_type == "Quiz":
 		return
 	else:
 		return enrollment.add_activity(content_type, content)
 
+
 @frappe.whitelist()
 def evaluate_quiz(quiz_response, quiz_name, course, program, time_taken):
 	import json
@@ -203,16 +241,17 @@
 	result, score, status = quiz.evaluate(quiz_response, quiz_name)
 
 	if has_super_access():
-		return {'result': result, 'score': score, 'status': status}
+		return {"result": result, "score": score, "status": status}
 
 	if student:
 		enrollment = get_or_create_course_enrollment(course, program)
 		if quiz.allowed_attempt(enrollment, quiz_name):
 			enrollment.add_quiz_activity(quiz_name, quiz_response, result, score, status, time_taken)
-			return {'result': result, 'score': score, 'status': status}
+			return {"result": result, "score": score, "status": status}
 		else:
 			return None
 
+
 @frappe.whitelist()
 def get_quiz(quiz_name, course):
 	try:
@@ -222,37 +261,40 @@
 		frappe.throw(_("Quiz {0} does not exist").format(quiz_name), frappe.DoesNotExistError)
 		return None
 
-	questions = [{
-		'name': question.name,
-		'question': question.question,
-		'type': question.question_type,
-		'options': [{'name': option.name, 'option': option.option}
-					for option in question.options],
-		} for question in questions]
+	questions = [
+		{
+			"name": question.name,
+			"question": question.question,
+			"type": question.question_type,
+			"options": [{"name": option.name, "option": option.option} for option in question.options],
+		}
+		for question in questions
+	]
 
 	if has_super_access():
 		return {
-			'questions': questions,
-			'activity': None,
-			'is_time_bound': quiz.is_time_bound,
-			'duration': quiz.duration
+			"questions": questions,
+			"activity": None,
+			"is_time_bound": quiz.is_time_bound,
+			"duration": quiz.duration,
 		}
 
 	student = get_current_student()
 	course_enrollment = get_enrollment("course", course, student.name)
 	status, score, result, time_taken = check_quiz_completion(quiz, course_enrollment)
 	return {
-		'questions': questions,
-		'activity': {'is_complete': status, 'score': score, 'result': result, 'time_taken': time_taken},
-		'is_time_bound': quiz.is_time_bound,
-		'duration': quiz.duration
+		"questions": questions,
+		"activity": {"is_complete": status, "score": score, "result": result, "time_taken": time_taken},
+		"is_time_bound": quiz.is_time_bound,
+		"duration": quiz.duration,
 	}
 
+
 def get_topic_progress(topic, course_name, program):
 	"""
 	Return the porgress of a course in a program as well as the content to continue from.
-		:param topic_name:
-		:param course_name:
+	        :param topic_name:
+	        :param course_name:
 	"""
 	student = get_current_student()
 	if not student:
@@ -261,19 +303,20 @@
 	progress = student.get_topic_progress(course_enrollment.name, topic)
 	if not progress:
 		return None
-	count = sum([activity['is_complete'] for activity in progress])
+	count = sum([activity["is_complete"] for activity in progress])
 	if count == 0:
-		return {'completed': False, 'started': False}
+		return {"completed": False, "started": False}
 	elif count == len(progress):
-		return {'completed': True, 'started': True}
+		return {"completed": True, "started": True}
 	elif count < len(progress):
-		return {'completed': False, 'started': True}
+		return {"completed": False, "started": True}
+
 
 def get_course_progress(course, program):
 	"""
 	Return the porgress of a course in a program as well as the content to continue from.
-		:param topic_name:
-		:param course_name:
+	        :param topic_name:
+	        :param course_name:
 	"""
 	course_progress = []
 	for course_topic in course.topics:
@@ -282,19 +325,20 @@
 		if progress:
 			course_progress.append(progress)
 	if course_progress:
-		number_of_completed_topics = sum([activity['completed'] for activity in course_progress])
+		number_of_completed_topics = sum([activity["completed"] for activity in course_progress])
 		total_topics = len(course_progress)
 		if total_topics == 1:
 			return course_progress[0]
 		if number_of_completed_topics == 0:
-			return {'completed': False, 'started': False}
+			return {"completed": False, "started": False}
 		if number_of_completed_topics == total_topics:
-			return {'completed': True, 'started': True}
+			return {"completed": True, "started": True}
 		if number_of_completed_topics < total_topics:
-			return {'completed': False, 'started': True}
+			return {"completed": False, "started": True}
 
 	return None
 
+
 def get_program_progress(program):
 	program_progress = []
 	if not program.courses:
@@ -303,8 +347,8 @@
 		course = frappe.get_doc("Course", program_course.course)
 		progress = get_course_progress(course, program.name)
 		if progress:
-			progress['name'] = course.name
-			progress['course'] = course.course_name
+			progress["name"] = course.name
+			progress["course"] = course.course_name
 			program_progress.append(progress)
 
 	if program_progress:
@@ -312,81 +356,94 @@
 
 	return None
 
+
 def get_program_completion(program):
-	topics = frappe.db.sql("""select `tabCourse Topic`.topic, `tabCourse Topic`.parent
+	topics = frappe.db.sql(
+		"""select `tabCourse Topic`.topic, `tabCourse Topic`.parent
 	from `tabCourse Topic`,
 		 `tabProgram Course`
 	where `tabCourse Topic`.parent = `tabProgram Course`.course
-			and `tabProgram Course`.parent = %s""", program.name)
+			and `tabProgram Course`.parent = %s""",
+		program.name,
+	)
 
 	progress = []
 	for topic in topics:
-		topic_doc = frappe.get_doc('Topic', topic[0])
+		topic_doc = frappe.get_doc("Topic", topic[0])
 		topic_progress = get_topic_progress(topic_doc, topic[1], program.name)
 		if topic_progress:
 			progress.append(topic_progress)
 
 	if progress:
-		number_of_completed_topics = sum([activity['completed'] for activity in progress if activity])
+		number_of_completed_topics = sum([activity["completed"] for activity in progress if activity])
 		total_topics = len(progress)
 		try:
-			return int((float(number_of_completed_topics)/total_topics)*100)
+			return int((float(number_of_completed_topics) / total_topics) * 100)
 		except ZeroDivisionError:
 			return 0
 
 	return 0
 
+
 def create_student_from_current_user():
 	user = frappe.get_doc("User", frappe.session.user)
 
-	student = frappe.get_doc({
-		"doctype": "Student",
-		"first_name": user.first_name,
-		"last_name": user.last_name,
-		"student_email_id": user.email,
-		"user": frappe.session.user
-		})
+	student = frappe.get_doc(
+		{
+			"doctype": "Student",
+			"first_name": user.first_name,
+			"last_name": user.last_name,
+			"student_email_id": user.email,
+			"user": frappe.session.user,
+		}
+	)
 
 	student.save(ignore_permissions=True)
 	return student
 
+
 def get_or_create_course_enrollment(course, program):
 	student = get_current_student()
 	course_enrollment = get_enrollment("course", course, student.name)
 	if not course_enrollment:
-		program_enrollment = get_enrollment('program', program.name, student.name)
+		program_enrollment = get_enrollment("program", program.name, student.name)
 		if not program_enrollment:
 			frappe.throw(_("You are not enrolled in program {0}").format(program))
 			return
-		return student.enroll_in_course(course_name=course, program_enrollment=get_enrollment('program', program.name, student.name))
+		return student.enroll_in_course(
+			course_name=course, program_enrollment=get_enrollment("program", program.name, student.name)
+		)
 	else:
-		return frappe.get_doc('Course Enrollment', course_enrollment)
+		return frappe.get_doc("Course Enrollment", course_enrollment)
+
 
 def check_content_completion(content_name, content_type, enrollment_name):
-	activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
+	activity = frappe.get_all(
+		"Course Activity",
+		filters={"enrollment": enrollment_name, "content_type": content_type, "content": content_name},
+	)
 	if activity:
 		return True
 	else:
 		return False
 
+
 def check_quiz_completion(quiz, enrollment_name):
-	attempts = frappe.get_all("Quiz Activity",
-		filters={
-			'enrollment': enrollment_name,
-			'quiz': quiz.name
-		},
-		fields=["name", "activity_date", "score", "status", "time_taken"]
+	attempts = frappe.get_all(
+		"Quiz Activity",
+		filters={"enrollment": enrollment_name, "quiz": quiz.name},
+		fields=["name", "activity_date", "score", "status", "time_taken"],
 	)
 	status = False if quiz.max_attempts == 0 else bool(len(attempts) >= quiz.max_attempts)
 	score = None
 	result = None
 	time_taken = None
 	if attempts:
-		if quiz.grading_basis == 'Last Highest Score':
-			attempts = sorted(attempts, key = lambda i: int(i.score), reverse=True)
-		score = attempts[0]['score']
-		result = attempts[0]['status']
-		time_taken = attempts[0]['time_taken']
-		if result == 'Pass':
+		if quiz.grading_basis == "Last Highest Score":
+			attempts = sorted(attempts, key=lambda i: int(i.score), reverse=True)
+		score = attempts[0]["score"]
+		result = attempts[0]["status"]
+		time_taken = attempts[0]["time_taken"]
+		if result == "Pass":
 			status = True
 	return status, score, result, time_taken
diff --git a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
index 9409485..46a4d3c 100644
--- a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
+++ b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
@@ -12,26 +12,30 @@
 	woocommerce_settings = frappe.get_doc("Woocommerce Settings")
 	sig = base64.b64encode(
 		hmac.new(
-			woocommerce_settings.secret.encode('utf8'),
-			frappe.request.data,
-			hashlib.sha256
+			woocommerce_settings.secret.encode("utf8"), frappe.request.data, hashlib.sha256
 		).digest()
 	)
 
-	if frappe.request.data and \
-		not sig == frappe.get_request_header("X-Wc-Webhook-Signature", "").encode():
-			frappe.throw(_("Unverified Webhook Data"))
+	if (
+		frappe.request.data
+		and not sig == frappe.get_request_header("X-Wc-Webhook-Signature", "").encode()
+	):
+		frappe.throw(_("Unverified Webhook Data"))
 	frappe.set_user(woocommerce_settings.creation_user)
 
+
 @frappe.whitelist(allow_guest=True)
 def order(*args, **kwargs):
 	try:
 		_order(*args, **kwargs)
 	except Exception:
-		error_message = frappe.get_traceback()+"\n\n Request Data: \n"+json.loads(frappe.request.data).__str__()
+		error_message = (
+			frappe.get_traceback() + "\n\n Request Data: \n" + json.loads(frappe.request.data).__str__()
+		)
 		frappe.log_error(error_message, "WooCommerce Error")
 		raise
 
+
 def _order(*args, **kwargs):
 	woocommerce_settings = frappe.get_doc("Woocommerce Settings")
 	if frappe.flags.woocomm_test_order_data:
@@ -43,7 +47,7 @@
 		try:
 			order = json.loads(frappe.request.data)
 		except ValueError:
-			#woocommerce returns 'webhook_id=value' for the first request which is not JSON
+			# woocommerce returns 'webhook_id=value' for the first request which is not JSON
 			order = frappe.request.data
 		event = frappe.get_request_header("X-Wc-Webhook-Event")
 
@@ -51,7 +55,7 @@
 		return "success"
 
 	if event == "created":
-		sys_lang = frappe.get_single("System Settings").language or 'en'
+		sys_lang = frappe.get_single("System Settings").language or "en"
 		raw_billing_data = order.get("billing")
 		raw_shipping_data = order.get("shipping")
 		customer_name = raw_billing_data.get("first_name") + " " + raw_billing_data.get("last_name")
@@ -59,6 +63,7 @@
 		link_items(order.get("line_items"), woocommerce_settings, sys_lang)
 		create_sales_order(order, woocommerce_settings, customer_name, sys_lang)
 
+
 def link_customer_and_address(raw_billing_data, raw_shipping_data, customer_name):
 	customer_woo_com_email = raw_billing_data.get("email")
 	customer_exists = frappe.get_value("Customer", {"woocommerce_email": customer_woo_com_email})
@@ -77,9 +82,14 @@
 
 	if customer_exists:
 		frappe.rename_doc("Customer", old_name, customer_name)
-		for address_type in ("Billing", "Shipping",):
+		for address_type in (
+			"Billing",
+			"Shipping",
+		):
 			try:
-				address = frappe.get_doc("Address", {"woocommerce_email": customer_woo_com_email, "address_type": address_type})
+				address = frappe.get_doc(
+					"Address", {"woocommerce_email": customer_woo_com_email, "address_type": address_type}
+				)
 				rename_address(address, customer)
 			except (
 				frappe.DoesNotExistError,
@@ -92,6 +102,7 @@
 		create_address(raw_shipping_data, customer, "Shipping")
 		create_contact(raw_billing_data, customer)
 
+
 def create_contact(data, customer):
 	email = data.get("email", None)
 	phone = data.get("phone", None)
@@ -111,14 +122,12 @@
 	if email:
 		contact.add_email(email, is_primary=1)
 
-	contact.append("links", {
-		"link_doctype": "Customer",
-		"link_name": customer.name
-	})
+	contact.append("links", {"link_doctype": "Customer", "link_name": customer.name})
 
 	contact.flags.ignore_mandatory = True
 	contact.save()
 
+
 def create_address(raw_data, customer, address_type):
 	address = frappe.new_doc("Address")
 
@@ -132,14 +141,12 @@
 	address.pincode = raw_data.get("postcode")
 	address.phone = raw_data.get("phone")
 	address.email_id = customer.woocommerce_email
-	address.append("links", {
-		"link_doctype": "Customer",
-		"link_name": customer.name
-	})
+	address.append("links", {"link_doctype": "Customer", "link_name": customer.name})
 
 	address.flags.ignore_mandatory = True
 	address.save()
 
+
 def rename_address(address, customer):
 	old_address_title = address.name
 	new_address_title = customer.name + "-" + address.address_type
@@ -148,12 +155,13 @@
 
 	frappe.rename_doc("Address", old_address_title, new_address_title)
 
+
 def link_items(items_list, woocommerce_settings, sys_lang):
 	for item_data in items_list:
 		item_woo_com_id = cstr(item_data.get("product_id"))
 
-		if not frappe.db.get_value("Item", {"woocommerce_id": item_woo_com_id}, 'name'):
-			#Create Item
+		if not frappe.db.get_value("Item", {"woocommerce_id": item_woo_com_id}, "name"):
+			# Create Item
 			item = frappe.new_doc("Item")
 			item.item_code = _("woocommerce - {0}", sys_lang).format(item_woo_com_id)
 			item.stock_uom = woocommerce_settings.uom or _("Nos", sys_lang)
@@ -164,6 +172,7 @@
 			item.flags.ignore_mandatory = True
 			item.save()
 
+
 def create_sales_order(order, woocommerce_settings, customer_name, sys_lang):
 	new_sales_order = frappe.new_doc("Sales Order")
 	new_sales_order.customer = customer_name
@@ -185,12 +194,12 @@
 
 	frappe.db.commit()
 
+
 def set_items_in_sales_order(new_sales_order, woocommerce_settings, order, sys_lang):
-	company_abbr = frappe.db.get_value('Company', woocommerce_settings.company, 'abbr')
+	company_abbr = frappe.db.get_value("Company", woocommerce_settings.company, "abbr")
 
 	default_warehouse = _("Stores - {0}", sys_lang).format(company_abbr)
-	if not frappe.db.exists("Warehouse", default_warehouse) \
-		and not woocommerce_settings.warehouse:
+	if not frappe.db.exists("Warehouse", default_warehouse) and not woocommerce_settings.warehouse:
 		frappe.throw(_("Please set Warehouse in Woocommerce Settings"))
 
 	for item in order.get("line_items"):
@@ -199,28 +208,44 @@
 
 		ordered_items_tax = item.get("total_tax")
 
-		new_sales_order.append("items", {
-			"item_code": found_item.name,
-			"item_name": found_item.item_name,
-			"description": found_item.item_name,
-			"delivery_date": new_sales_order.delivery_date,
-			"uom": woocommerce_settings.uom or _("Nos", sys_lang),
-			"qty": item.get("quantity"),
-			"rate": item.get("price"),
-			"warehouse": woocommerce_settings.warehouse or default_warehouse
-		})
+		new_sales_order.append(
+			"items",
+			{
+				"item_code": found_item.name,
+				"item_name": found_item.item_name,
+				"description": found_item.item_name,
+				"delivery_date": new_sales_order.delivery_date,
+				"uom": woocommerce_settings.uom or _("Nos", sys_lang),
+				"qty": item.get("quantity"),
+				"rate": item.get("price"),
+				"warehouse": woocommerce_settings.warehouse or default_warehouse,
+			},
+		)
 
-		add_tax_details(new_sales_order, ordered_items_tax, "Ordered Item tax", woocommerce_settings.tax_account)
+		add_tax_details(
+			new_sales_order, ordered_items_tax, "Ordered Item tax", woocommerce_settings.tax_account
+		)
 
 	# shipping_details = order.get("shipping_lines") # used for detailed order
 
-	add_tax_details(new_sales_order, order.get("shipping_tax"), "Shipping Tax", woocommerce_settings.f_n_f_account)
-	add_tax_details(new_sales_order, order.get("shipping_total"), "Shipping Total", woocommerce_settings.f_n_f_account)
+	add_tax_details(
+		new_sales_order, order.get("shipping_tax"), "Shipping Tax", woocommerce_settings.f_n_f_account
+	)
+	add_tax_details(
+		new_sales_order,
+		order.get("shipping_total"),
+		"Shipping Total",
+		woocommerce_settings.f_n_f_account,
+	)
+
 
 def add_tax_details(sales_order, price, desc, tax_account_head):
-	sales_order.append("taxes", {
-		"charge_type":"Actual",
-		"account_head": tax_account_head,
-		"tax_amount": price,
-		"description": desc
-	})
+	sales_order.append(
+		"taxes",
+		{
+			"charge_type": "Actual",
+			"account_head": tax_account_head,
+			"tax_amount": price,
+			"description": desc,
+		},
+	)
diff --git a/erpnext/erpnext_integrations/data_migration_mapping/issue_to_task/__init__.py b/erpnext/erpnext_integrations/data_migration_mapping/issue_to_task/__init__.py
index 1d0dfa5..616ecfb 100644
--- a/erpnext/erpnext_integrations/data_migration_mapping/issue_to_task/__init__.py
+++ b/erpnext/erpnext_integrations/data_migration_mapping/issue_to_task/__init__.py
@@ -3,10 +3,10 @@
 
 def pre_process(issue):
 
-	project = frappe.db.get_value('Project', filters={'project_name': issue.milestone})
+	project = frappe.db.get_value("Project", filters={"project_name": issue.milestone})
 	return {
-		'title': issue.title,
-		'body': frappe.utils.md_to_html(issue.body or ''),
-		'state': issue.state.title(),
-		'project': project or ''
+		"title": issue.title,
+		"body": frappe.utils.md_to_html(issue.body or ""),
+		"state": issue.state.title(),
+		"project": project or "",
 	}
diff --git a/erpnext/erpnext_integrations/data_migration_mapping/milestone_to_project/__init__.py b/erpnext/erpnext_integrations/data_migration_mapping/milestone_to_project/__init__.py
index 212f81b..d44fc04 100644
--- a/erpnext/erpnext_integrations/data_migration_mapping/milestone_to_project/__init__.py
+++ b/erpnext/erpnext_integrations/data_migration_mapping/milestone_to_project/__init__.py
@@ -1,6 +1,6 @@
 def pre_process(milestone):
 	return {
-		'title': milestone.title,
-		'description': milestone.description,
-		'state': milestone.state.title()
+		"title": milestone.title,
+		"description": milestone.description,
+		"state": milestone.state.title(),
 	}
diff --git a/erpnext/erpnext_integrations/doctype/exotel_settings/exotel_settings.py b/erpnext/erpnext_integrations/doctype/exotel_settings/exotel_settings.py
index e84093c..4879cb5 100644
--- a/erpnext/erpnext_integrations/doctype/exotel_settings/exotel_settings.py
+++ b/erpnext/erpnext_integrations/doctype/exotel_settings/exotel_settings.py
@@ -14,7 +14,9 @@
 
 	def verify_credentials(self):
 		if self.enabled:
-			response = requests.get('https://api.exotel.com/v1/Accounts/{sid}'
-				.format(sid = self.account_sid), auth=(self.api_key, self.api_token))
+			response = requests.get(
+				"https://api.exotel.com/v1/Accounts/{sid}".format(sid=self.account_sid),
+				auth=(self.api_key, self.api_token),
+			)
 			if response.status_code != 200:
 				frappe.throw(_("Invalid credentials"))
diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py b/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py
index bb62c39..65be599 100644
--- a/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py
+++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py
@@ -23,12 +23,15 @@
 		set_status(event)
 
 	return 200
+
+
 def set_status(event):
 	resource_type = event.get("resource_type", {})
 
 	if resource_type == "mandates":
 		set_mandate_status(event)
 
+
 def set_mandate_status(event):
 	mandates = []
 	if isinstance(event["links"], (list,)):
@@ -37,7 +40,12 @@
 	else:
 		mandates.append(event["links"]["mandate"])
 
-	if event["action"] == "pending_customer_approval" or event["action"] == "pending_submission" or event["action"] == "submitted" or event["action"] == "active":
+	if (
+		event["action"] == "pending_customer_approval"
+		or event["action"] == "pending_submission"
+		or event["action"] == "submitted"
+		or event["action"] == "active"
+	):
 		disabled = 0
 	else:
 		disabled = 1
@@ -45,6 +53,7 @@
 	for mandate in mandates:
 		frappe.db.set_value("GoCardless Mandate", mandate, "disabled", disabled)
 
+
 def authenticate_signature(r):
 	"""Returns True if the received signature matches the generated signature"""
 	received_signature = frappe.get_request_header("Webhook-Signature")
@@ -59,13 +68,22 @@
 
 	return False
 
+
 def get_webhook_keys():
 	def _get_webhook_keys():
-		webhook_keys = [d.webhooks_secret for d in frappe.get_all("GoCardless Settings", fields=["webhooks_secret"],) if d.webhooks_secret]
+		webhook_keys = [
+			d.webhooks_secret
+			for d in frappe.get_all(
+				"GoCardless Settings",
+				fields=["webhooks_secret"],
+			)
+			if d.webhooks_secret
+		]
 
 		return webhook_keys
 
 	return frappe.cache().get_value("gocardless_webhooks_secret", _get_webhook_keys)
 
+
 def clear_cache():
 	frappe.cache().delete_value("gocardless_webhooks_secret")
diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py
index f02f76e..e1972ae 100644
--- a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py
+++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py
@@ -22,32 +22,35 @@
 		self.environment = self.get_environment()
 		try:
 			self.client = gocardless_pro.Client(
-				access_token=self.access_token,
-				environment=self.environment
-				)
+				access_token=self.access_token, environment=self.environment
+			)
 			return self.client
 		except Exception as e:
 			frappe.throw(e)
 
 	def on_update(self):
-		create_payment_gateway('GoCardless-' + self.gateway_name, settings='GoCardLess Settings', controller=self.gateway_name)
-		call_hook_method('payment_gateway_enabled', gateway='GoCardless-' + self.gateway_name)
+		create_payment_gateway(
+			"GoCardless-" + self.gateway_name, settings="GoCardLess Settings", controller=self.gateway_name
+		)
+		call_hook_method("payment_gateway_enabled", gateway="GoCardless-" + self.gateway_name)
 
 	def on_payment_request_submission(self, data):
 		if data.reference_doctype != "Fees":
-			customer_data = frappe.db.get_value(data.reference_doctype, data.reference_name, ["company", "customer_name"], as_dict=1)
+			customer_data = frappe.db.get_value(
+				data.reference_doctype, data.reference_name, ["company", "customer_name"], as_dict=1
+			)
 
 		data = {
-					"amount": flt(data.grand_total, data.precision("grand_total")),
-					"title": customer_data.company.encode("utf-8"),
-					"description": data.subject.encode("utf-8"),
-					"reference_doctype": data.doctype,
-					"reference_docname": data.name,
-					"payer_email": data.email_to or frappe.session.user,
-					"payer_name": customer_data.customer_name,
-					"order_id": data.name,
-					"currency": data.currency
-				}
+			"amount": flt(data.grand_total, data.precision("grand_total")),
+			"title": customer_data.company.encode("utf-8"),
+			"description": data.subject.encode("utf-8"),
+			"reference_doctype": data.doctype,
+			"reference_docname": data.name,
+			"payer_email": data.email_to or frappe.session.user,
+			"payer_name": customer_data.customer_name,
+			"order_id": data.name,
+			"currency": data.currency,
+		}
 
 		valid_mandate = self.check_mandate_validity(data)
 		if valid_mandate is not None:
@@ -60,12 +63,19 @@
 
 	def check_mandate_validity(self, data):
 
-		if frappe.db.exists("GoCardless Mandate", dict(customer=data.get('payer_name'), disabled=0)):
-			registered_mandate = frappe.db.get_value("GoCardless Mandate", dict(customer=data.get('payer_name'), disabled=0), 'mandate')
+		if frappe.db.exists("GoCardless Mandate", dict(customer=data.get("payer_name"), disabled=0)):
+			registered_mandate = frappe.db.get_value(
+				"GoCardless Mandate", dict(customer=data.get("payer_name"), disabled=0), "mandate"
+			)
 			self.initialize_client()
 			mandate = self.client.mandates.get(registered_mandate)
 
-			if mandate.status=="pending_customer_approval" or mandate.status=="pending_submission" or mandate.status=="submitted" or mandate.status=="active":
+			if (
+				mandate.status == "pending_customer_approval"
+				or mandate.status == "pending_submission"
+				or mandate.status == "submitted"
+				or mandate.status == "active"
+			):
 				return {"mandate": registered_mandate}
 			else:
 				return None
@@ -74,13 +84,17 @@
 
 	def get_environment(self):
 		if self.use_sandbox:
-			return 'sandbox'
+			return "sandbox"
 		else:
-			return 'live'
+			return "live"
 
 	def validate_transaction_currency(self, currency):
 		if currency not in self.supported_currencies:
-			frappe.throw(_("Please select another payment method. Go Cardless does not support transactions in currency '{0}'").format(currency))
+			frappe.throw(
+				_(
+					"Please select another payment method. Go Cardless does not support transactions in currency '{0}'"
+				).format(currency)
+			)
 
 	def get_payment_url(self, **kwargs):
 		return get_url("./integrations/gocardless_checkout?{0}".format(urlencode(kwargs)))
@@ -94,63 +108,85 @@
 
 		except Exception:
 			frappe.log_error(frappe.get_traceback())
-			return{
-				"redirect_to": frappe.redirect_to_message(_('Server Error'), _("There seems to be an issue with the server's GoCardless configuration. Don't worry, in case of failure, the amount will get refunded to your account.")),
-				"status": 401
+			return {
+				"redirect_to": frappe.redirect_to_message(
+					_("Server Error"),
+					_(
+						"There seems to be an issue with the server's GoCardless configuration. Don't worry, in case of failure, the amount will get refunded to your account."
+					),
+				),
+				"status": 401,
 			}
 
 	def create_charge_on_gocardless(self):
-		redirect_to = self.data.get('redirect_to') or None
-		redirect_message = self.data.get('redirect_message') or None
+		redirect_to = self.data.get("redirect_to") or None
+		redirect_message = self.data.get("redirect_message") or None
 
-		reference_doc = frappe.get_doc(self.data.get('reference_doctype'), self.data.get('reference_docname'))
+		reference_doc = frappe.get_doc(
+			self.data.get("reference_doctype"), self.data.get("reference_docname")
+		)
 		self.initialize_client()
 
 		try:
 			payment = self.client.payments.create(
 				params={
-					"amount" : cint(reference_doc.grand_total * 100),
-					"currency" : reference_doc.currency,
-					"links" : {
-						"mandate": self.data.get('mandate')
-					},
+					"amount": cint(reference_doc.grand_total * 100),
+					"currency": reference_doc.currency,
+					"links": {"mandate": self.data.get("mandate")},
 					"metadata": {
-					  "reference_doctype": reference_doc.doctype,
-					  "reference_document": reference_doc.name
-					}
-				}, headers={
-					'Idempotency-Key' : self.data.get('reference_docname'),
-			})
+						"reference_doctype": reference_doc.doctype,
+						"reference_document": reference_doc.name,
+					},
+				},
+				headers={
+					"Idempotency-Key": self.data.get("reference_docname"),
+				},
+			)
 
-			if payment.status=="pending_submission" or payment.status=="pending_customer_approval" or payment.status=="submitted":
-				self.integration_request.db_set('status', 'Authorized', update_modified=False)
+			if (
+				payment.status == "pending_submission"
+				or payment.status == "pending_customer_approval"
+				or payment.status == "submitted"
+			):
+				self.integration_request.db_set("status", "Authorized", update_modified=False)
 				self.flags.status_changed_to = "Completed"
-				self.integration_request.db_set('output', payment.status, update_modified=False)
+				self.integration_request.db_set("output", payment.status, update_modified=False)
 
-			elif payment.status=="confirmed" or payment.status=="paid_out":
-				self.integration_request.db_set('status', 'Completed', update_modified=False)
+			elif payment.status == "confirmed" or payment.status == "paid_out":
+				self.integration_request.db_set("status", "Completed", update_modified=False)
 				self.flags.status_changed_to = "Completed"
-				self.integration_request.db_set('output', payment.status, update_modified=False)
+				self.integration_request.db_set("output", payment.status, update_modified=False)
 
-			elif payment.status=="cancelled" or payment.status=="customer_approval_denied" or payment.status=="charged_back":
-				self.integration_request.db_set('status', 'Cancelled', update_modified=False)
-				frappe.log_error(_("Payment Cancelled. Please check your GoCardless Account for more details"), "GoCardless Payment Error")
-				self.integration_request.db_set('error', payment.status, update_modified=False)
+			elif (
+				payment.status == "cancelled"
+				or payment.status == "customer_approval_denied"
+				or payment.status == "charged_back"
+			):
+				self.integration_request.db_set("status", "Cancelled", update_modified=False)
+				frappe.log_error(
+					_("Payment Cancelled. Please check your GoCardless Account for more details"),
+					"GoCardless Payment Error",
+				)
+				self.integration_request.db_set("error", payment.status, update_modified=False)
 			else:
-				self.integration_request.db_set('status', 'Failed', update_modified=False)
-				frappe.log_error(_("Payment Failed. Please check your GoCardless Account for more details"), "GoCardless Payment Error")
-				self.integration_request.db_set('error', payment.status, update_modified=False)
+				self.integration_request.db_set("status", "Failed", update_modified=False)
+				frappe.log_error(
+					_("Payment Failed. Please check your GoCardless Account for more details"),
+					"GoCardless Payment Error",
+				)
+				self.integration_request.db_set("error", payment.status, update_modified=False)
 
 		except Exception as e:
 			frappe.log_error(e, "GoCardless Payment Error")
 
 		if self.flags.status_changed_to == "Completed":
-			status = 'Completed'
-			if 'reference_doctype' in self.data and 'reference_docname' in self.data:
+			status = "Completed"
+			if "reference_doctype" in self.data and "reference_docname" in self.data:
 				custom_redirect_to = None
 				try:
-					custom_redirect_to = frappe.get_doc(self.data.get('reference_doctype'),
-						self.data.get('reference_docname')).run_method("on_payment_authorized", self.flags.status_changed_to)
+					custom_redirect_to = frappe.get_doc(
+						self.data.get("reference_doctype"), self.data.get("reference_docname")
+					).run_method("on_payment_authorized", self.flags.status_changed_to)
 				except Exception:
 					frappe.log_error(frappe.get_traceback())
 
@@ -159,24 +195,25 @@
 
 			redirect_url = redirect_to
 		else:
-			status = 'Error'
-			redirect_url = 'payment-failed'
+			status = "Error"
+			redirect_url = "payment-failed"
 
 			if redirect_message:
-				redirect_url += '&' + urlencode({'redirect_message': redirect_message})
+				redirect_url += "&" + urlencode({"redirect_message": redirect_message})
 
 			redirect_url = get_url(redirect_url)
 
-		return {
-			"redirect_to": redirect_url,
-			"status": status
-			}
+		return {"redirect_to": redirect_url, "status": status}
+
 
 def get_gateway_controller(doc):
 	payment_request = frappe.get_doc("Payment Request", doc)
-	gateway_controller = frappe.db.get_value("Payment Gateway", payment_request.payment_gateway, "gateway_controller")
+	gateway_controller = frappe.db.get_value(
+		"Payment Gateway", payment_request.payment_gateway, "gateway_controller"
+	)
 	return gateway_controller
 
+
 def gocardless_initialization(doc):
 	gateway_controller = get_gateway_controller(doc)
 	settings = frappe.get_doc("GoCardless Settings", gateway_controller)
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_connector.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_connector.py
index 6d46a1c..a577e7f 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_connector.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_connector.py
@@ -5,9 +5,15 @@
 from requests.auth import HTTPBasicAuth
 
 
-class MpesaConnector():
-	def __init__(self, env="sandbox", app_key=None, app_secret=None, sandbox_url="https://sandbox.safaricom.co.ke",
-		live_url="https://api.safaricom.co.ke"):
+class MpesaConnector:
+	def __init__(
+		self,
+		env="sandbox",
+		app_key=None,
+		app_secret=None,
+		sandbox_url="https://sandbox.safaricom.co.ke",
+		live_url="https://api.safaricom.co.ke",
+	):
 		"""Setup configuration for Mpesa connector and generate new access token."""
 		self.env = env
 		self.app_key = app_key
@@ -23,36 +29,41 @@
 		This method is used to fetch the access token required by Mpesa.
 
 		Returns:
-			access_token (str): This token is to be used with the Bearer header for further API calls to Mpesa.
+		        access_token (str): This token is to be used with the Bearer header for further API calls to Mpesa.
 		"""
 		authenticate_uri = "/oauth/v1/generate?grant_type=client_credentials"
 		authenticate_url = "{0}{1}".format(self.base_url, authenticate_uri)
-		r = requests.get(
-			authenticate_url,
-			auth=HTTPBasicAuth(self.app_key, self.app_secret)
-		)
-		self.authentication_token = r.json()['access_token']
-		return r.json()['access_token']
+		r = requests.get(authenticate_url, auth=HTTPBasicAuth(self.app_key, self.app_secret))
+		self.authentication_token = r.json()["access_token"]
+		return r.json()["access_token"]
 
-	def get_balance(self, initiator=None, security_credential=None, party_a=None, identifier_type=None,
-					remarks=None, queue_timeout_url=None,result_url=None):
+	def get_balance(
+		self,
+		initiator=None,
+		security_credential=None,
+		party_a=None,
+		identifier_type=None,
+		remarks=None,
+		queue_timeout_url=None,
+		result_url=None,
+	):
 		"""
 		This method uses Mpesa's Account Balance API to to enquire the balance on a M-Pesa BuyGoods (Till Number).
 
 		Args:
-			initiator (str): Username used to authenticate the transaction.
-			security_credential (str): Generate from developer portal.
-			command_id (str): AccountBalance.
-			party_a (int): Till number being queried.
-			identifier_type (int): Type of organization receiving the transaction. (MSISDN/Till Number/Organization short code)
-			remarks (str): Comments that are sent along with the transaction(maximum 100 characters).
-			queue_timeout_url (str): The url that handles information of timed out transactions.
-			result_url (str): The url that receives results from M-Pesa api call.
+		        initiator (str): Username used to authenticate the transaction.
+		        security_credential (str): Generate from developer portal.
+		        command_id (str): AccountBalance.
+		        party_a (int): Till number being queried.
+		        identifier_type (int): Type of organization receiving the transaction. (MSISDN/Till Number/Organization short code)
+		        remarks (str): Comments that are sent along with the transaction(maximum 100 characters).
+		        queue_timeout_url (str): The url that handles information of timed out transactions.
+		        result_url (str): The url that receives results from M-Pesa api call.
 
 		Returns:
-			OriginatorConverstionID (str): The unique request ID for tracking a transaction.
-			ConversationID (str): The unique request ID returned by mpesa for each request made
-			ResponseDescription (str): Response Description message
+		        OriginatorConverstionID (str): The unique request ID for tracking a transaction.
+		        ConversationID (str): The unique request ID returned by mpesa for each request made
+		        ResponseDescription (str): Response Description message
 		"""
 
 		payload = {
@@ -63,43 +74,56 @@
 			"IdentifierType": identifier_type,
 			"Remarks": remarks,
 			"QueueTimeOutURL": queue_timeout_url,
-			"ResultURL": result_url
+			"ResultURL": result_url,
 		}
-		headers = {'Authorization': 'Bearer {0}'.format(self.authentication_token), 'Content-Type': "application/json"}
+		headers = {
+			"Authorization": "Bearer {0}".format(self.authentication_token),
+			"Content-Type": "application/json",
+		}
 		saf_url = "{0}{1}".format(self.base_url, "/mpesa/accountbalance/v1/query")
 		r = requests.post(saf_url, headers=headers, json=payload)
 		return r.json()
 
-	def stk_push(self, business_shortcode=None, passcode=None, amount=None, callback_url=None, reference_code=None,
-				 phone_number=None, description=None):
+	def stk_push(
+		self,
+		business_shortcode=None,
+		passcode=None,
+		amount=None,
+		callback_url=None,
+		reference_code=None,
+		phone_number=None,
+		description=None,
+	):
 		"""
 		This method uses Mpesa's Express API to initiate online payment on behalf of a customer.
 
 		Args:
-			business_shortcode (int): The short code of the organization.
-			passcode (str): Get from developer portal
-			amount (int): The amount being transacted
-			callback_url (str): A CallBack URL is a valid secure URL that is used to receive notifications from M-Pesa API.
-			reference_code(str): Account Reference: This is an Alpha-Numeric parameter that is defined by your system as an Identifier of the transaction for CustomerPayBillOnline transaction type.
-			phone_number(int): The Mobile Number to receive the STK Pin Prompt.
-			description(str): This is any additional information/comment that can be sent along with the request from your system. MAX 13 characters
+		        business_shortcode (int): The short code of the organization.
+		        passcode (str): Get from developer portal
+		        amount (int): The amount being transacted
+		        callback_url (str): A CallBack URL is a valid secure URL that is used to receive notifications from M-Pesa API.
+		        reference_code(str): Account Reference: This is an Alpha-Numeric parameter that is defined by your system as an Identifier of the transaction for CustomerPayBillOnline transaction type.
+		        phone_number(int): The Mobile Number to receive the STK Pin Prompt.
+		        description(str): This is any additional information/comment that can be sent along with the request from your system. MAX 13 characters
 
 		Success Response:
-			CustomerMessage(str): Messages that customers can understand.
-			CheckoutRequestID(str): This is a global unique identifier of the processed checkout transaction request.
-			ResponseDescription(str): Describes Success or failure
-			MerchantRequestID(str): This is a global unique Identifier for any submitted payment request.
-			ResponseCode(int): 0 means success all others are error codes. e.g.404.001.03
+		        CustomerMessage(str): Messages that customers can understand.
+		        CheckoutRequestID(str): This is a global unique identifier of the processed checkout transaction request.
+		        ResponseDescription(str): Describes Success or failure
+		        MerchantRequestID(str): This is a global unique Identifier for any submitted payment request.
+		        ResponseCode(int): 0 means success all others are error codes. e.g.404.001.03
 
 		Error Reponse:
-			requestId(str): This is a unique requestID for the payment request
-			errorCode(str): This is a predefined code that indicates the reason for request failure.
-			errorMessage(str): This is a predefined code that indicates the reason for request failure.
+		        requestId(str): This is a unique requestID for the payment request
+		        errorCode(str): This is a predefined code that indicates the reason for request failure.
+		        errorMessage(str): This is a predefined code that indicates the reason for request failure.
 		"""
 
-		time = str(datetime.datetime.now()).split(".")[0].replace("-", "").replace(" ", "").replace(":", "")
+		time = (
+			str(datetime.datetime.now()).split(".")[0].replace("-", "").replace(" ", "").replace(":", "")
+		)
 		password = "{0}{1}{2}".format(str(business_shortcode), str(passcode), time)
-		encoded = base64.b64encode(bytes(password, encoding='utf8'))
+		encoded = base64.b64encode(bytes(password, encoding="utf8"))
 		payload = {
 			"BusinessShortCode": business_shortcode,
 			"Password": encoded.decode("utf-8"),
@@ -111,9 +135,14 @@
 			"CallBackURL": callback_url,
 			"AccountReference": reference_code,
 			"TransactionDesc": description,
-			"TransactionType": "CustomerPayBillOnline" if self.env == "sandbox" else "CustomerBuyGoodsOnline"
+			"TransactionType": "CustomerPayBillOnline"
+			if self.env == "sandbox"
+			else "CustomerBuyGoodsOnline",
 		}
-		headers = {'Authorization': 'Bearer {0}'.format(self.authentication_token), 'Content-Type': "application/json"}
+		headers = {
+			"Authorization": "Bearer {0}".format(self.authentication_token),
+			"Content-Type": "application/json",
+		}
 
 		saf_url = "{0}{1}".format(self.base_url, "/mpesa/stkpush/v1/processrequest")
 		r = requests.post(saf_url, headers=headers, json=payload)
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py
index 368139b..c92edc5 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_custom_fields.py
@@ -11,21 +11,22 @@
 				"label": "Request for Payment",
 				"fieldtype": "Button",
 				"hidden": 1,
-				"insert_after": "contact_email"
+				"insert_after": "contact_email",
 			},
 			{
 				"fieldname": "mpesa_receipt_number",
 				"label": "Mpesa Receipt Number",
 				"fieldtype": "Data",
 				"read_only": 1,
-				"insert_after": "company"
-			}
+				"insert_after": "company",
+			},
 		]
 	}
 	if not frappe.get_meta("POS Invoice").has_field("request_for_payment"):
 		create_custom_fields(pos_field)
 
-	record_dict = [{
+	record_dict = [
+		{
 			"doctype": "POS Field",
 			"fieldname": "contact_mobile",
 			"label": "Mobile No",
@@ -33,7 +34,7 @@
 			"options": "Phone",
 			"parenttype": "POS Settings",
 			"parent": "POS Settings",
-			"parentfield": "invoice_fields"
+			"parentfield": "invoice_fields",
 		},
 		{
 			"doctype": "POS Field",
@@ -42,11 +43,12 @@
 			"fieldtype": "Button",
 			"parenttype": "POS Settings",
 			"parent": "POS Settings",
-			"parentfield": "invoice_fields"
-		}
+			"parentfield": "invoice_fields",
+		},
 	]
 	create_pos_settings(record_dict)
 
+
 def create_pos_settings(record_dict):
 	for record in record_dict:
 		if frappe.db.exists("POS Field", {"fieldname": record.get("fieldname")}):
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py
index e7b4a30..78a598c 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py
@@ -2,7 +2,6 @@
 # For license information, please see license.txt
 
 
-
 from json import dumps, loads
 
 import frappe
@@ -23,16 +22,26 @@
 
 	def validate_transaction_currency(self, currency):
 		if currency not in self.supported_currencies:
-			frappe.throw(_("Please select another payment method. Mpesa does not support transactions in currency '{0}'").format(currency))
+			frappe.throw(
+				_(
+					"Please select another payment method. Mpesa does not support transactions in currency '{0}'"
+				).format(currency)
+			)
 
 	def on_update(self):
 		create_custom_pos_fields()
-		create_payment_gateway('Mpesa-' + self.payment_gateway_name, settings='Mpesa Settings', controller=self.payment_gateway_name)
-		call_hook_method('payment_gateway_enabled', gateway='Mpesa-' + self.payment_gateway_name, payment_channel="Phone")
+		create_payment_gateway(
+			"Mpesa-" + self.payment_gateway_name,
+			settings="Mpesa Settings",
+			controller=self.payment_gateway_name,
+		)
+		call_hook_method(
+			"payment_gateway_enabled", gateway="Mpesa-" + self.payment_gateway_name, payment_channel="Phone"
+		)
 
 		# required to fetch the bank account details from the payment gateway account
 		frappe.db.commit()
-		create_mode_of_payment('Mpesa-' + self.payment_gateway_name, payment_type="Phone")
+		create_mode_of_payment("Mpesa-" + self.payment_gateway_name, payment_type="Phone")
 
 	def request_for_payment(self, **kwargs):
 		args = frappe._dict(kwargs)
@@ -44,6 +53,7 @@
 				from erpnext.erpnext_integrations.doctype.mpesa_settings.test_mpesa_settings import (
 					get_payment_request_response_payload,
 				)
+
 				response = frappe._dict(get_payment_request_response_payload(amount))
 			else:
 				response = frappe._dict(generate_stk_push(**args))
@@ -55,11 +65,15 @@
 		if request_amount > self.transaction_limit:
 			# make multiple requests
 			request_amounts = []
-			requests_to_be_made = frappe.utils.ceil(request_amount / self.transaction_limit) # 480/150 = ceil(3.2) = 4
+			requests_to_be_made = frappe.utils.ceil(
+				request_amount / self.transaction_limit
+			)  # 480/150 = ceil(3.2) = 4
 			for i in range(requests_to_be_made):
 				amount = self.transaction_limit
 				if i == requests_to_be_made - 1:
-					amount = request_amount - (self.transaction_limit * i) # for 4th request, 480 - (150 * 3) = 30
+					amount = request_amount - (
+						self.transaction_limit * i
+					)  # for 4th request, 480 - (150 * 3) = 30
 				request_amounts.append(amount)
 		else:
 			request_amounts = [request_amount]
@@ -69,15 +83,14 @@
 	@frappe.whitelist()
 	def get_account_balance_info(self):
 		payload = dict(
-			reference_doctype="Mpesa Settings",
-			reference_docname=self.name,
-			doc_details=vars(self)
+			reference_doctype="Mpesa Settings", reference_docname=self.name, doc_details=vars(self)
 		)
 
 		if frappe.flags.in_test:
 			from erpnext.erpnext_integrations.doctype.mpesa_settings.test_mpesa_settings import (
 				get_test_account_balance_response,
 			)
+
 			response = frappe._dict(get_test_account_balance_response())
 		else:
 			response = frappe._dict(get_account_balance(payload))
@@ -95,46 +108,62 @@
 			req_name = getattr(response, global_id)
 			error = None
 
-		if not frappe.db.exists('Integration Request', req_name):
+		if not frappe.db.exists("Integration Request", req_name):
 			create_request_log(request_dict, "Host", "Mpesa", req_name, error)
 
 		if error:
 			frappe.throw(_(getattr(response, "errorMessage")), title=_("Transaction Error"))
 
+
 def generate_stk_push(**kwargs):
 	"""Generate stk push by making a API call to the stk push API."""
 	args = frappe._dict(kwargs)
 	try:
-		callback_url = get_request_site_address(True) + "/api/method/erpnext.erpnext_integrations.doctype.mpesa_settings.mpesa_settings.verify_transaction"
+		callback_url = (
+			get_request_site_address(True)
+			+ "/api/method/erpnext.erpnext_integrations.doctype.mpesa_settings.mpesa_settings.verify_transaction"
+		)
 
 		mpesa_settings = frappe.get_doc("Mpesa Settings", args.payment_gateway[6:])
 		env = "production" if not mpesa_settings.sandbox else "sandbox"
 		# for sandbox, business shortcode is same as till number
-		business_shortcode = mpesa_settings.business_shortcode if env == "production" else mpesa_settings.till_number
+		business_shortcode = (
+			mpesa_settings.business_shortcode if env == "production" else mpesa_settings.till_number
+		)
 
-		connector = MpesaConnector(env=env,
+		connector = MpesaConnector(
+			env=env,
 			app_key=mpesa_settings.consumer_key,
-			app_secret=mpesa_settings.get_password("consumer_secret"))
+			app_secret=mpesa_settings.get_password("consumer_secret"),
+		)
 
 		mobile_number = sanitize_mobile_number(args.sender)
 
 		response = connector.stk_push(
-			business_shortcode=business_shortcode, amount=args.request_amount,
+			business_shortcode=business_shortcode,
+			amount=args.request_amount,
 			passcode=mpesa_settings.get_password("online_passkey"),
-			callback_url=callback_url, reference_code=mpesa_settings.till_number,
-			phone_number=mobile_number, description="POS Payment"
+			callback_url=callback_url,
+			reference_code=mpesa_settings.till_number,
+			phone_number=mobile_number,
+			description="POS Payment",
 		)
 
 		return response
 
 	except Exception:
 		frappe.log_error(title=_("Mpesa Express Transaction Error"))
-		frappe.throw(_("Issue detected with Mpesa configuration, check the error logs for more details"), title=_("Mpesa Express Error"))
+		frappe.throw(
+			_("Issue detected with Mpesa configuration, check the error logs for more details"),
+			title=_("Mpesa Express Error"),
+		)
+
 
 def sanitize_mobile_number(number):
 	"""Add country code and strip leading zeroes from the phone number."""
 	return "254" + str(number).lstrip("0")
 
+
 @frappe.whitelist(allow_guest=True)
 def verify_transaction(**kwargs):
 	"""Verify the transaction result received via callback from stk."""
@@ -146,28 +175,28 @@
 
 	integration_request = frappe.get_doc("Integration Request", checkout_id)
 	transaction_data = frappe._dict(loads(integration_request.data))
-	total_paid = 0 # for multiple integration request made against a pos invoice
-	success = False # for reporting successfull callback to point of sale ui
+	total_paid = 0  # for multiple integration request made against a pos invoice
+	success = False  # for reporting successfull callback to point of sale ui
 
-	if transaction_response['ResultCode'] == 0:
+	if transaction_response["ResultCode"] == 0:
 		if integration_request.reference_doctype and integration_request.reference_docname:
 			try:
 				item_response = transaction_response["CallbackMetadata"]["Item"]
 				amount = fetch_param_value(item_response, "Amount", "Name")
 				mpesa_receipt = fetch_param_value(item_response, "MpesaReceiptNumber", "Name")
-				pr = frappe.get_doc(integration_request.reference_doctype, integration_request.reference_docname)
+				pr = frappe.get_doc(
+					integration_request.reference_doctype, integration_request.reference_docname
+				)
 
 				mpesa_receipts, completed_payments = get_completed_integration_requests_info(
-					integration_request.reference_doctype,
-					integration_request.reference_docname,
-					checkout_id
+					integration_request.reference_doctype, integration_request.reference_docname, checkout_id
 				)
 
 				total_paid = amount + sum(completed_payments)
-				mpesa_receipts = ', '.join(mpesa_receipts + [mpesa_receipt])
+				mpesa_receipts = ", ".join(mpesa_receipts + [mpesa_receipt])
 
 				if total_paid >= pr.grand_total:
-					pr.run_method("on_payment_authorized", 'Completed')
+					pr.run_method("on_payment_authorized", "Completed")
 					success = True
 
 				frappe.db.set_value("POS Invoice", pr.reference_name, "mpesa_receipt_number", mpesa_receipts)
@@ -180,24 +209,31 @@
 		integration_request.handle_failure(transaction_response)
 
 	frappe.publish_realtime(
-		event='process_phone_payment',
+		event="process_phone_payment",
 		doctype="POS Invoice",
 		docname=transaction_data.payment_reference,
 		user=integration_request.owner,
 		message={
-			'amount': total_paid,
-			'success': success,
-			'failure_message': transaction_response["ResultDesc"] if transaction_response['ResultCode'] != 0 else ''
+			"amount": total_paid,
+			"success": success,
+			"failure_message": transaction_response["ResultDesc"]
+			if transaction_response["ResultCode"] != 0
+			else "",
 		},
 	)
 
+
 def get_completed_integration_requests_info(reference_doctype, reference_docname, checkout_id):
-	output_of_other_completed_requests = frappe.get_all("Integration Request", filters={
-		'name': ['!=', checkout_id],
-		'reference_doctype': reference_doctype,
-		'reference_docname': reference_docname,
-		'status': 'Completed'
-	}, pluck="output")
+	output_of_other_completed_requests = frappe.get_all(
+		"Integration Request",
+		filters={
+			"name": ["!=", checkout_id],
+			"reference_doctype": reference_doctype,
+			"reference_docname": reference_docname,
+			"status": "Completed",
+		},
+		pluck="output",
+	)
 
 	mpesa_receipts, completed_payments = [], []
 
@@ -211,23 +247,38 @@
 
 	return mpesa_receipts, completed_payments
 
+
 def get_account_balance(request_payload):
 	"""Call account balance API to send the request to the Mpesa Servers."""
 	try:
 		mpesa_settings = frappe.get_doc("Mpesa Settings", request_payload.get("reference_docname"))
 		env = "production" if not mpesa_settings.sandbox else "sandbox"
-		connector = MpesaConnector(env=env,
+		connector = MpesaConnector(
+			env=env,
 			app_key=mpesa_settings.consumer_key,
-			app_secret=mpesa_settings.get_password("consumer_secret"))
+			app_secret=mpesa_settings.get_password("consumer_secret"),
+		)
 
-		callback_url = get_request_site_address(True) + "/api/method/erpnext.erpnext_integrations.doctype.mpesa_settings.mpesa_settings.process_balance_info"
+		callback_url = (
+			get_request_site_address(True)
+			+ "/api/method/erpnext.erpnext_integrations.doctype.mpesa_settings.mpesa_settings.process_balance_info"
+		)
 
-		response = connector.get_balance(mpesa_settings.initiator_name, mpesa_settings.security_credential, mpesa_settings.till_number, 4, mpesa_settings.name, callback_url, callback_url)
+		response = connector.get_balance(
+			mpesa_settings.initiator_name,
+			mpesa_settings.security_credential,
+			mpesa_settings.till_number,
+			4,
+			mpesa_settings.name,
+			callback_url,
+			callback_url,
+		)
 		return response
 	except Exception:
 		frappe.log_error(title=_("Account Balance Processing Error"))
 		frappe.throw(_("Please check your configuration and try again"), title=_("Error"))
 
+
 @frappe.whitelist(allow_guest=True)
 def process_balance_info(**kwargs):
 	"""Process and store account balance information received via callback from the account balance API call."""
@@ -255,35 +306,43 @@
 			ref_doc.db_set("account_balance", balance_info)
 
 			request.handle_success(account_balance_response)
-			frappe.publish_realtime("refresh_mpesa_dashboard", doctype="Mpesa Settings",
-				docname=transaction_data.reference_docname, user=transaction_data.owner)
+			frappe.publish_realtime(
+				"refresh_mpesa_dashboard",
+				doctype="Mpesa Settings",
+				docname=transaction_data.reference_docname,
+				user=transaction_data.owner,
+			)
 		except Exception:
 			request.handle_failure(account_balance_response)
-			frappe.log_error(title=_("Mpesa Account Balance Processing Error"), message=account_balance_response)
+			frappe.log_error(
+				title=_("Mpesa Account Balance Processing Error"), message=account_balance_response
+			)
 	else:
 		request.handle_failure(account_balance_response)
 
+
 def format_string_to_json(balance_info):
 	"""
 	Format string to json.
 
 	e.g: '''Working Account|KES|481000.00|481000.00|0.00|0.00'''
 	=> {'Working Account': {'current_balance': '481000.00',
-		'available_balance': '481000.00',
-		'reserved_balance': '0.00',
-		'uncleared_balance': '0.00'}}
+	        'available_balance': '481000.00',
+	        'reserved_balance': '0.00',
+	        'uncleared_balance': '0.00'}}
 	"""
 	balance_dict = frappe._dict()
 	for account_info in balance_info.split("&"):
-		account_info = account_info.split('|')
+		account_info = account_info.split("|")
 		balance_dict[account_info[0]] = dict(
 			current_balance=fmt_money(account_info[2], currency="KES"),
 			available_balance=fmt_money(account_info[3], currency="KES"),
 			reserved_balance=fmt_money(account_info[4], currency="KES"),
-			uncleared_balance=fmt_money(account_info[5], currency="KES")
+			uncleared_balance=fmt_money(account_info[5], currency="KES"),
 		)
 	return dumps(balance_dict)
 
+
 def fetch_param_value(response, key, key_field):
 	"""Fetch the specified key from list of dictionary. Key is identified via the key field."""
 	for param in response:
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py
index 3945afa..17e332c 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py
@@ -22,12 +22,12 @@
 		create_mpesa_settings(payment_gateway_name="Payment")
 
 	def tearDown(self):
-		frappe.db.sql('delete from `tabMpesa Settings`')
+		frappe.db.sql("delete from `tabMpesa Settings`")
 		frappe.db.sql('delete from `tabIntegration Request` where integration_request_service = "Mpesa"')
 
 	def test_creation_of_payment_gateway(self):
-		mode_of_payment = create_mode_of_payment('Mpesa-_Test', payment_type="Phone")
-		self.assertTrue(frappe.db.exists("Payment Gateway Account", {'payment_gateway': "Mpesa-_Test"}))
+		mode_of_payment = create_mode_of_payment("Mpesa-_Test", payment_type="Phone")
+		self.assertTrue(frappe.db.exists("Payment Gateway Account", {"payment_gateway": "Mpesa-_Test"}))
 		self.assertTrue(mode_of_payment.name)
 		self.assertEqual(mode_of_payment.type, "Phone")
 
@@ -45,24 +45,33 @@
 
 		# test formatting of account balance received as string to json with appropriate currency symbol
 		mpesa_doc.reload()
-		self.assertEqual(mpesa_doc.account_balance, dumps({
-			"Working Account": {
-				"current_balance": "Sh 481,000.00",
-				"available_balance": "Sh 481,000.00",
-				"reserved_balance": "Sh 0.00",
-				"uncleared_balance": "Sh 0.00"
-			}
-		}))
+		self.assertEqual(
+			mpesa_doc.account_balance,
+			dumps(
+				{
+					"Working Account": {
+						"current_balance": "Sh 481,000.00",
+						"available_balance": "Sh 481,000.00",
+						"reserved_balance": "Sh 0.00",
+						"uncleared_balance": "Sh 0.00",
+					}
+				}
+			),
+		)
 
 		integration_request.delete()
 
 	def test_processing_of_callback_payload(self):
-		mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
+		mpesa_account = frappe.db.get_value(
+			"Payment Gateway Account", {"payment_gateway": "Mpesa-Payment"}, "payment_account"
+		)
 		frappe.db.set_value("Account", mpesa_account, "account_currency", "KES")
 		frappe.db.set_value("Customer", "_Test Customer", "default_currency", "KES")
 
 		pos_invoice = create_pos_invoice(do_not_submit=1)
-		pos_invoice.append("payments", {'mode_of_payment': 'Mpesa-Payment', 'account': mpesa_account, 'amount': 500})
+		pos_invoice.append(
+			"payments", {"mode_of_payment": "Mpesa-Payment", "account": mpesa_account, "amount": 500}
+		)
 		pos_invoice.contact_mobile = "093456543894"
 		pos_invoice.currency = "KES"
 		pos_invoice.save()
@@ -72,12 +81,18 @@
 		self.assertEqual(pr.payment_gateway, "Mpesa-Payment")
 
 		# submitting payment request creates integration requests with random id
-		integration_req_ids = frappe.get_all("Integration Request", filters={
-			'reference_doctype': pr.doctype,
-			'reference_docname': pr.name,
-		}, pluck="name")
+		integration_req_ids = frappe.get_all(
+			"Integration Request",
+			filters={
+				"reference_doctype": pr.doctype,
+				"reference_docname": pr.name,
+			},
+			pluck="name",
+		)
 
-		callback_response = get_payment_callback_payload(Amount=500, CheckoutRequestID=integration_req_ids[0])
+		callback_response = get_payment_callback_payload(
+			Amount=500, CheckoutRequestID=integration_req_ids[0]
+		)
 		verify_transaction(**callback_response)
 		# test creation of integration request
 		integration_request = frappe.get_doc("Integration Request", integration_req_ids[0])
@@ -99,13 +114,17 @@
 		pos_invoice.delete()
 
 	def test_processing_of_multiple_callback_payload(self):
-		mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
+		mpesa_account = frappe.db.get_value(
+			"Payment Gateway Account", {"payment_gateway": "Mpesa-Payment"}, "payment_account"
+		)
 		frappe.db.set_value("Account", mpesa_account, "account_currency", "KES")
 		frappe.db.set_value("Mpesa Settings", "Payment", "transaction_limit", "500")
 		frappe.db.set_value("Customer", "_Test Customer", "default_currency", "KES")
 
 		pos_invoice = create_pos_invoice(do_not_submit=1)
-		pos_invoice.append("payments", {'mode_of_payment': 'Mpesa-Payment', 'account': mpesa_account, 'amount': 1000})
+		pos_invoice.append(
+			"payments", {"mode_of_payment": "Mpesa-Payment", "account": mpesa_account, "amount": 1000}
+		)
 		pos_invoice.contact_mobile = "093456543894"
 		pos_invoice.currency = "KES"
 		pos_invoice.save()
@@ -115,10 +134,14 @@
 		self.assertEqual(pr.payment_gateway, "Mpesa-Payment")
 
 		# submitting payment request creates integration requests with random id
-		integration_req_ids = frappe.get_all("Integration Request", filters={
-			'reference_doctype': pr.doctype,
-			'reference_docname': pr.name,
-		}, pluck="name")
+		integration_req_ids = frappe.get_all(
+			"Integration Request",
+			filters={
+				"reference_doctype": pr.doctype,
+				"reference_docname": pr.name,
+			},
+			pluck="name",
+		)
 
 		# create random receipt nos and send it as response to callback handler
 		mpesa_receipt_numbers = [frappe.utils.random_string(5) for d in integration_req_ids]
@@ -128,7 +151,7 @@
 			callback_response = get_payment_callback_payload(
 				Amount=500,
 				CheckoutRequestID=integration_req_ids[i],
-				MpesaReceiptNumber=mpesa_receipt_numbers[i]
+				MpesaReceiptNumber=mpesa_receipt_numbers[i],
 			)
 			# handle response manually
 			verify_transaction(**callback_response)
@@ -139,7 +162,7 @@
 
 		# check receipt number once all the integration requests are completed
 		pos_invoice.reload()
-		self.assertEqual(pos_invoice.mpesa_receipt_number, ', '.join(mpesa_receipt_numbers))
+		self.assertEqual(pos_invoice.mpesa_receipt_number, ", ".join(mpesa_receipt_numbers))
 
 		frappe.db.set_value("Customer", "_Test Customer", "default_currency", "")
 		[d.delete() for d in integration_requests]
@@ -149,13 +172,17 @@
 		pos_invoice.delete()
 
 	def test_processing_of_only_one_succes_callback_payload(self):
-		mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
+		mpesa_account = frappe.db.get_value(
+			"Payment Gateway Account", {"payment_gateway": "Mpesa-Payment"}, "payment_account"
+		)
 		frappe.db.set_value("Account", mpesa_account, "account_currency", "KES")
 		frappe.db.set_value("Mpesa Settings", "Payment", "transaction_limit", "500")
 		frappe.db.set_value("Customer", "_Test Customer", "default_currency", "KES")
 
 		pos_invoice = create_pos_invoice(do_not_submit=1)
-		pos_invoice.append("payments", {'mode_of_payment': 'Mpesa-Payment', 'account': mpesa_account, 'amount': 1000})
+		pos_invoice.append(
+			"payments", {"mode_of_payment": "Mpesa-Payment", "account": mpesa_account, "amount": 1000}
+		)
 		pos_invoice.contact_mobile = "093456543894"
 		pos_invoice.currency = "KES"
 		pos_invoice.save()
@@ -165,10 +192,14 @@
 		self.assertEqual(pr.payment_gateway, "Mpesa-Payment")
 
 		# submitting payment request creates integration requests with random id
-		integration_req_ids = frappe.get_all("Integration Request", filters={
-			'reference_doctype': pr.doctype,
-			'reference_docname': pr.name,
-		}, pluck="name")
+		integration_req_ids = frappe.get_all(
+			"Integration Request",
+			filters={
+				"reference_doctype": pr.doctype,
+				"reference_docname": pr.name,
+			},
+			pluck="name",
+		)
 
 		# create random receipt nos and send it as response to callback handler
 		mpesa_receipt_numbers = [frappe.utils.random_string(5) for d in integration_req_ids]
@@ -176,7 +207,7 @@
 		callback_response = get_payment_callback_payload(
 			Amount=500,
 			CheckoutRequestID=integration_req_ids[0],
-			MpesaReceiptNumber=mpesa_receipt_numbers[0]
+			MpesaReceiptNumber=mpesa_receipt_numbers[0],
 		)
 		# handle response manually
 		verify_transaction(**callback_response)
@@ -188,11 +219,15 @@
 		# second integration request fails
 		# now retrying payment request should make only one integration request again
 		pr = pos_invoice.create_payment_request()
-		new_integration_req_ids = frappe.get_all("Integration Request", filters={
-			'reference_doctype': pr.doctype,
-			'reference_docname': pr.name,
-			'name': ['not in', integration_req_ids]
-		}, pluck="name")
+		new_integration_req_ids = frappe.get_all(
+			"Integration Request",
+			filters={
+				"reference_doctype": pr.doctype,
+				"reference_docname": pr.name,
+				"name": ["not in", integration_req_ids],
+			},
+			pluck="name",
+		)
 
 		self.assertEqual(len(new_integration_req_ids), 1)
 
@@ -203,94 +238,56 @@
 		pr.delete()
 		pos_invoice.delete()
 
+
 def create_mpesa_settings(payment_gateway_name="Express"):
 	if frappe.db.exists("Mpesa Settings", payment_gateway_name):
 		return frappe.get_doc("Mpesa Settings", payment_gateway_name)
 
-	doc = frappe.get_doc(dict( #nosec
-		doctype="Mpesa Settings",
-		sandbox=1,
-		payment_gateway_name=payment_gateway_name,
-		consumer_key="5sMu9LVI1oS3oBGPJfh3JyvLHwZOdTKn",
-		consumer_secret="VI1oS3oBGPJfh3JyvLHw",
-		online_passkey="LVI1oS3oBGPJfh3JyvLHwZOd",
-		till_number="174379"
-	))
+	doc = frappe.get_doc(
+		dict(  # nosec
+			doctype="Mpesa Settings",
+			sandbox=1,
+			payment_gateway_name=payment_gateway_name,
+			consumer_key="5sMu9LVI1oS3oBGPJfh3JyvLHwZOdTKn",
+			consumer_secret="VI1oS3oBGPJfh3JyvLHw",
+			online_passkey="LVI1oS3oBGPJfh3JyvLHwZOd",
+			till_number="174379",
+		)
+	)
 
 	doc.insert(ignore_permissions=True)
 	return doc
 
+
 def get_test_account_balance_response():
 	"""Response received after calling the account balance API."""
 	return {
-		"ResultType":0,
-		"ResultCode":0,
-		"ResultDesc":"The service request has been accepted successfully.",
-		"OriginatorConversationID":"10816-694520-2",
-		"ConversationID":"AG_20200927_00007cdb1f9fb6494315",
-		"TransactionID":"LGR0000000",
-		"ResultParameters":{
-		"ResultParameter":[
-			{
-			"Key":"ReceiptNo",
-			"Value":"LGR919G2AV"
-			},
-			{
-			"Key":"Conversation ID",
-			"Value":"AG_20170727_00004492b1b6d0078fbe"
-			},
-			{
-			"Key":"FinalisedTime",
-			"Value":20170727101415
-			},
-			{
-			"Key":"Amount",
-			"Value":10
-			},
-			{
-			"Key":"TransactionStatus",
-			"Value":"Completed"
-			},
-			{
-			"Key":"ReasonType",
-			"Value":"Salary Payment via API"
-			},
-			{
-			"Key":"TransactionReason"
-			},
-			{
-			"Key":"DebitPartyCharges",
-			"Value":"Fee For B2C Payment|KES|33.00"
-			},
-			{
-			"Key":"DebitAccountType",
-			"Value":"Utility Account"
-			},
-			{
-			"Key":"InitiatedTime",
-			"Value":20170727101415
-			},
-			{
-			"Key":"Originator Conversation ID",
-			"Value":"19455-773836-1"
-			},
-			{
-			"Key":"CreditPartyName",
-			"Value":"254708374149 - John Doe"
-			},
-			{
-			"Key":"DebitPartyName",
-			"Value":"600134 - Safaricom157"
-			}
-		]
-	},
-	"ReferenceData":{
-	"ReferenceItem":{
-		"Key":"Occasion",
-		"Value":"aaaa"
+		"ResultType": 0,
+		"ResultCode": 0,
+		"ResultDesc": "The service request has been accepted successfully.",
+		"OriginatorConversationID": "10816-694520-2",
+		"ConversationID": "AG_20200927_00007cdb1f9fb6494315",
+		"TransactionID": "LGR0000000",
+		"ResultParameters": {
+			"ResultParameter": [
+				{"Key": "ReceiptNo", "Value": "LGR919G2AV"},
+				{"Key": "Conversation ID", "Value": "AG_20170727_00004492b1b6d0078fbe"},
+				{"Key": "FinalisedTime", "Value": 20170727101415},
+				{"Key": "Amount", "Value": 10},
+				{"Key": "TransactionStatus", "Value": "Completed"},
+				{"Key": "ReasonType", "Value": "Salary Payment via API"},
+				{"Key": "TransactionReason"},
+				{"Key": "DebitPartyCharges", "Value": "Fee For B2C Payment|KES|33.00"},
+				{"Key": "DebitAccountType", "Value": "Utility Account"},
+				{"Key": "InitiatedTime", "Value": 20170727101415},
+				{"Key": "Originator Conversation ID", "Value": "19455-773836-1"},
+				{"Key": "CreditPartyName", "Value": "254708374149 - John Doe"},
+				{"Key": "DebitPartyName", "Value": "600134 - Safaricom157"},
+			]
+		},
+		"ReferenceData": {"ReferenceItem": {"Key": "Occasion", "Value": "aaaa"}},
 	}
-	}
-		}
+
 
 def get_payment_request_response_payload(Amount=500):
 	"""Response received after successfully calling the stk push process request API."""
@@ -304,40 +301,44 @@
 		"ResultDesc": "The service request is processed successfully.",
 		"CallbackMetadata": {
 			"Item": [
-				{ "Name": "Amount", "Value": Amount },
-				{ "Name": "MpesaReceiptNumber", "Value": "LGR7OWQX0R" },
-				{ "Name": "TransactionDate", "Value": 20201006113336 },
-				{ "Name": "PhoneNumber", "Value": 254723575670 }
+				{"Name": "Amount", "Value": Amount},
+				{"Name": "MpesaReceiptNumber", "Value": "LGR7OWQX0R"},
+				{"Name": "TransactionDate", "Value": 20201006113336},
+				{"Name": "PhoneNumber", "Value": 254723575670},
 			]
-		}
+		},
 	}
 
-def get_payment_callback_payload(Amount=500, CheckoutRequestID="ws_CO_061020201133231972", MpesaReceiptNumber="LGR7OWQX0R"):
+
+def get_payment_callback_payload(
+	Amount=500, CheckoutRequestID="ws_CO_061020201133231972", MpesaReceiptNumber="LGR7OWQX0R"
+):
 	"""Response received from the server as callback after calling the stkpush process request API."""
 	return {
-		"Body":{
-			"stkCallback":{
-				"MerchantRequestID":"19465-780693-1",
-				"CheckoutRequestID":CheckoutRequestID,
-				"ResultCode":0,
-				"ResultDesc":"The service request is processed successfully.",
-				"CallbackMetadata":{
-					"Item":[
-						{ "Name":"Amount", "Value":Amount },
-						{ "Name":"MpesaReceiptNumber", "Value":MpesaReceiptNumber },
-						{ "Name":"Balance" },
-						{ "Name":"TransactionDate", "Value":20170727154800 },
-						{ "Name":"PhoneNumber", "Value":254721566839 }
+		"Body": {
+			"stkCallback": {
+				"MerchantRequestID": "19465-780693-1",
+				"CheckoutRequestID": CheckoutRequestID,
+				"ResultCode": 0,
+				"ResultDesc": "The service request is processed successfully.",
+				"CallbackMetadata": {
+					"Item": [
+						{"Name": "Amount", "Value": Amount},
+						{"Name": "MpesaReceiptNumber", "Value": MpesaReceiptNumber},
+						{"Name": "Balance"},
+						{"Name": "TransactionDate", "Value": 20170727154800},
+						{"Name": "PhoneNumber", "Value": 254721566839},
 					]
-				}
+				},
 			}
 		}
 	}
 
+
 def get_account_balance_callback_payload():
 	"""Response received from the server as callback after calling the account balance API."""
 	return {
-		"Result":{
+		"Result": {
 			"ResultType": 0,
 			"ResultCode": 0,
 			"ResultDesc": "The service request is processed successfully.",
@@ -346,18 +347,15 @@
 			"TransactionID": "OIR0000000",
 			"ResultParameters": {
 				"ResultParameter": [
-					{
-						"Key": "AccountBalance",
-						"Value": "Working Account|KES|481000.00|481000.00|0.00|0.00"
-					},
-					{ "Key": "BOCompletedTime", "Value": 20200927234123 }
+					{"Key": "AccountBalance", "Value": "Working Account|KES|481000.00|481000.00|0.00|0.00"},
+					{"Key": "BOCompletedTime", "Value": 20200927234123},
 				]
 			},
 			"ReferenceData": {
 				"ReferenceItem": {
 					"Key": "QueueTimeoutURL",
-					"Value": "https://internalsandbox.safaricom.co.ke/mpesa/abresults/v1/submit"
+					"Value": "https://internalsandbox.safaricom.co.ke/mpesa/abresults/v1/submit",
 				}
-			}
+			},
 		}
 	}
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
index 0b552f9..625dd31 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
@@ -8,7 +8,7 @@
 from plaid.errors import APIError, InvalidRequestError, ItemError
 
 
-class PlaidConnector():
+class PlaidConnector:
 	def __init__(self, access_token=None):
 		self.access_token = access_token
 		self.settings = frappe.get_single("Plaid Settings")
@@ -18,7 +18,7 @@
 			client_id=self.settings.plaid_client_id,
 			secret=self.settings.get_password("plaid_secret"),
 			environment=self.settings.plaid_env,
-			api_version="2020-09-14"
+			api_version="2020-09-14",
 		)
 
 	def get_access_token(self, public_token):
@@ -29,25 +29,29 @@
 		return access_token
 
 	def get_token_request(self, update_mode=False):
-		country_codes = ["US", "CA", "FR", "IE", "NL", "ES", "GB"] if self.settings.enable_european_access else ["US", "CA"]
+		country_codes = (
+			["US", "CA", "FR", "IE", "NL", "ES", "GB"]
+			if self.settings.enable_european_access
+			else ["US", "CA"]
+		)
 		args = {
 			"client_name": self.client_name,
 			# only allow Plaid-supported languages and countries (LAST: Sep-19-2020)
 			"language": frappe.local.lang if frappe.local.lang in ["en", "fr", "es", "nl"] else "en",
 			"country_codes": country_codes,
-			"user": {
-				"client_user_id": frappe.generate_hash(frappe.session.user, length=32)
-			}
+			"user": {"client_user_id": frappe.generate_hash(frappe.session.user, length=32)},
 		}
 
 		if update_mode:
 			args["access_token"] = self.access_token
 		else:
-			args.update({
-				"client_id": self.settings.plaid_client_id,
-				"secret": self.settings.plaid_secret,
-				"products": self.products,
-			})
+			args.update(
+				{
+					"client_id": self.settings.plaid_client_id,
+					"secret": self.settings.plaid_secret,
+					"products": self.products,
+				}
+			)
 
 		return args
 
@@ -82,11 +86,7 @@
 
 	def get_transactions(self, start_date, end_date, account_id=None):
 		self.auth()
-		kwargs = dict(
-			access_token=self.access_token,
-			start_date=start_date,
-			end_date=end_date
-		)
+		kwargs = dict(access_token=self.access_token, start_date=start_date, end_date=end_date)
 		if account_id:
 			kwargs.update(dict(account_ids=[account_id]))
 
@@ -94,7 +94,9 @@
 			response = self.client.Transactions.get(**kwargs)
 			transactions = response["transactions"]
 			while len(transactions) < response["total_transactions"]:
-				response = self.client.Transactions.get(self.access_token, start_date=start_date, end_date=end_date, offset=len(transactions))
+				response = self.client.Transactions.get(
+					self.access_token, start_date=start_date, end_date=end_date, offset=len(transactions)
+				)
 				transactions.extend(response["transactions"])
 			return transactions
 		except ItemError as e:
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
index 7e6f146..ce65f6c 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
@@ -29,7 +29,7 @@
 		return {
 			"plaid_env": plaid_settings.plaid_env,
 			"link_token": plaid_settings.get_link_token(),
-			"client_name": frappe.local.site
+			"client_name": frappe.local.site,
 		}
 
 	return "disabled"
@@ -45,14 +45,16 @@
 
 	if not frappe.db.exists("Bank", response["institution"]["name"]):
 		try:
-			bank = frappe.get_doc({
-				"doctype": "Bank",
-				"bank_name": response["institution"]["name"],
-				"plaid_access_token": access_token
-			})
+			bank = frappe.get_doc(
+				{
+					"doctype": "Bank",
+					"bank_name": response["institution"]["name"],
+					"plaid_access_token": access_token,
+				}
+			)
 			bank.insert()
 		except Exception:
-			frappe.log_error(frappe.get_traceback(), title=_('Plaid Link Error'))
+			frappe.log_error(frappe.get_traceback(), title=_("Plaid Link Error"))
 	else:
 		bank = frappe.get_doc("Bank", response["institution"]["name"])
 		bank.plaid_access_token = access_token
@@ -89,65 +91,71 @@
 
 		if not existing_bank_account:
 			try:
-				new_account = frappe.get_doc({
-					"doctype": "Bank Account",
-					"bank": bank["bank_name"],
-					"account": default_gl_account.account,
-					"account_name": account["name"],
-					"account_type": account.get("type", ""),
-					"account_subtype": account.get("subtype", ""),
-					"mask": account.get("mask", ""),
-					"integration_id": account["id"],
-					"is_company_account": 1,
-					"company": company
-				})
+				new_account = frappe.get_doc(
+					{
+						"doctype": "Bank Account",
+						"bank": bank["bank_name"],
+						"account": default_gl_account.account,
+						"account_name": account["name"],
+						"account_type": account.get("type", ""),
+						"account_subtype": account.get("subtype", ""),
+						"mask": account.get("mask", ""),
+						"integration_id": account["id"],
+						"is_company_account": 1,
+						"company": company,
+					}
+				)
 				new_account.insert()
 
 				result.append(new_account.name)
 			except frappe.UniqueValidationError:
-				frappe.msgprint(_("Bank account {0} already exists and could not be created again").format(account["name"]))
+				frappe.msgprint(
+					_("Bank account {0} already exists and could not be created again").format(account["name"])
+				)
 			except Exception:
 				frappe.log_error(frappe.get_traceback(), title=_("Plaid Link Error"))
-				frappe.throw(_("There was an error creating Bank Account while linking with Plaid."),
-					title=_("Plaid Link Failed"))
+				frappe.throw(
+					_("There was an error creating Bank Account while linking with Plaid."),
+					title=_("Plaid Link Failed"),
+				)
 
 		else:
 			try:
-				existing_account = frappe.get_doc('Bank Account', existing_bank_account)
-				existing_account.update({
-					"bank": bank["bank_name"],
-					"account_name": account["name"],
-					"account_type": account.get("type", ""),
-					"account_subtype": account.get("subtype", ""),
-					"mask": account.get("mask", ""),
-					"integration_id": account["id"]
-				})
+				existing_account = frappe.get_doc("Bank Account", existing_bank_account)
+				existing_account.update(
+					{
+						"bank": bank["bank_name"],
+						"account_name": account["name"],
+						"account_type": account.get("type", ""),
+						"account_subtype": account.get("subtype", ""),
+						"mask": account.get("mask", ""),
+						"integration_id": account["id"],
+					}
+				)
 				existing_account.save()
 				result.append(existing_bank_account)
 			except Exception:
 				frappe.log_error(frappe.get_traceback(), title=_("Plaid Link Error"))
-				frappe.throw(_("There was an error updating Bank Account {} while linking with Plaid.").format(
-					existing_bank_account), title=_("Plaid Link Failed"))
+				frappe.throw(
+					_("There was an error updating Bank Account {} while linking with Plaid.").format(
+						existing_bank_account
+					),
+					title=_("Plaid Link Failed"),
+				)
 
 	return result
 
 
 def add_account_type(account_type):
 	try:
-		frappe.get_doc({
-			"doctype": "Bank Account Type",
-			"account_type": account_type
-		}).insert()
+		frappe.get_doc({"doctype": "Bank Account Type", "account_type": account_type}).insert()
 	except Exception:
 		frappe.throw(frappe.get_traceback())
 
 
 def add_account_subtype(account_subtype):
 	try:
-		frappe.get_doc({
-			"doctype": "Bank Account Subtype",
-			"account_subtype": account_subtype
-		}).insert()
+		frappe.get_doc({"doctype": "Bank Account Subtype", "account_subtype": account_subtype}).insert()
 	except Exception:
 		frappe.throw(frappe.get_traceback())
 
@@ -164,19 +172,26 @@
 	end_date = formatdate(today(), "YYYY-MM-dd")
 
 	try:
-		transactions = get_transactions(bank=bank, bank_account=bank_account, start_date=start_date, end_date=end_date)
+		transactions = get_transactions(
+			bank=bank, bank_account=bank_account, start_date=start_date, end_date=end_date
+		)
 
 		result = []
 		for transaction in reversed(transactions):
 			result += new_bank_transaction(transaction)
 
 		if result:
-			last_transaction_date = frappe.db.get_value('Bank Transaction', result.pop(), 'date')
+			last_transaction_date = frappe.db.get_value("Bank Transaction", result.pop(), "date")
 
-			frappe.logger().info("Plaid added {} new Bank Transactions from '{}' between {} and {}".format(
-				len(result), bank_account, start_date, end_date))
+			frappe.logger().info(
+				"Plaid added {} new Bank Transactions from '{}' between {} and {}".format(
+					len(result), bank_account, start_date, end_date
+				)
+			)
 
-			frappe.db.set_value("Bank Account", bank_account, "last_integration_date", last_transaction_date)
+			frappe.db.set_value(
+				"Bank Account", bank_account, "last_integration_date", last_transaction_date
+			)
 	except Exception:
 		frappe.log_error(frappe.get_traceback(), _("Plaid transactions sync error"))
 
@@ -185,7 +200,9 @@
 	access_token = None
 
 	if bank_account:
-		related_bank = frappe.db.get_values("Bank Account", bank_account, ["bank", "integration_id"], as_dict=True)
+		related_bank = frappe.db.get_values(
+			"Bank Account", bank_account, ["bank", "integration_id"], as_dict=True
+		)
 		access_token = frappe.db.get_value("Bank", related_bank[0].bank, "plaid_access_token")
 		account_id = related_bank[0].integration_id
 	else:
@@ -196,7 +213,9 @@
 
 	transactions = []
 	try:
-		transactions = plaid.get_transactions(start_date=start_date, end_date=end_date, account_id=account_id)
+		transactions = plaid.get_transactions(
+			start_date=start_date, end_date=end_date, account_id=account_id
+		)
 	except ItemError as e:
 		if e.code == "ITEM_LOGIN_REQUIRED":
 			msg = _("There was an error syncing transactions.") + " "
@@ -229,18 +248,20 @@
 
 	if not frappe.db.exists("Bank Transaction", dict(transaction_id=transaction["transaction_id"])):
 		try:
-			new_transaction = frappe.get_doc({
-				"doctype": "Bank Transaction",
-				"date": getdate(transaction["date"]),
-				"status": status,
-				"bank_account": bank_account,
-				"deposit": debit,
-				"withdrawal": credit,
-				"currency": transaction["iso_currency_code"],
-				"transaction_id": transaction["transaction_id"],
-				"reference_number": transaction["payment_meta"]["reference_number"],
-				"description": transaction["name"]
-			})
+			new_transaction = frappe.get_doc(
+				{
+					"doctype": "Bank Transaction",
+					"date": getdate(transaction["date"]),
+					"status": status,
+					"bank_account": bank_account,
+					"deposit": debit,
+					"withdrawal": credit,
+					"currency": transaction["iso_currency_code"],
+					"transaction_id": transaction["transaction_id"],
+					"reference_number": transaction["payment_meta"]["reference_number"],
+					"description": transaction["name"],
+				}
+			)
 			new_transaction.insert()
 			new_transaction.submit()
 
@@ -250,7 +271,7 @@
 			result.append(new_transaction.name)
 
 		except Exception:
-			frappe.throw(title=_('Bank transaction creation error'))
+			frappe.throw(title=_("Bank transaction creation error"))
 
 	return result
 
@@ -260,19 +281,21 @@
 	if settings.enabled == 1 and settings.automatic_sync == 1:
 		enqueue_synchronization()
 
+
 @frappe.whitelist()
 def enqueue_synchronization():
-	plaid_accounts = frappe.get_all("Bank Account",
-		filters={"integration_id": ["!=", ""]},
-		fields=["name", "bank"])
+	plaid_accounts = frappe.get_all(
+		"Bank Account", filters={"integration_id": ["!=", ""]}, fields=["name", "bank"]
+	)
 
 	for plaid_account in plaid_accounts:
 		frappe.enqueue(
 			"erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.sync_transactions",
 			bank=plaid_account.bank,
-			bank_account=plaid_account.name
+			bank_account=plaid_account.name,
 		)
 
+
 @frappe.whitelist()
 def get_link_token_for_update(access_token):
 	plaid = PlaidConnector(access_token)
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py
index 535d7fa..e8dc3e2 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py
@@ -45,111 +45,110 @@
 
 	def test_default_bank_account(self):
 		if not frappe.db.exists("Bank", "Citi"):
-			frappe.get_doc({
-				"doctype": "Bank",
-				"bank_name": "Citi"
-			}).insert()
+			frappe.get_doc({"doctype": "Bank", "bank_name": "Citi"}).insert()
 
 		bank_accounts = {
-			'account': {
-				'subtype': 'checking',
-				'mask': '0000',
-				'type': 'depository',
-				'id': '6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK',
-				'name': 'Plaid Checking'
+			"account": {
+				"subtype": "checking",
+				"mask": "0000",
+				"type": "depository",
+				"id": "6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK",
+				"name": "Plaid Checking",
 			},
-			'account_id': '6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK',
-			'link_session_id': 'db673d75-61aa-442a-864f-9b3f174f3725',
-			'accounts': [{
-				'type': 'depository',
-				'subtype': 'checking',
-				'mask': '0000',
-				'id': '6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK',
-				'name': 'Plaid Checking'
-			}],
-			'institution': {
-				'institution_id': 'ins_6',
-				'name': 'Citi'
-			}
+			"account_id": "6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK",
+			"link_session_id": "db673d75-61aa-442a-864f-9b3f174f3725",
+			"accounts": [
+				{
+					"type": "depository",
+					"subtype": "checking",
+					"mask": "0000",
+					"id": "6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK",
+					"name": "Plaid Checking",
+				}
+			],
+			"institution": {"institution_id": "ins_6", "name": "Citi"},
 		}
 
 		bank = json.dumps(frappe.get_doc("Bank", "Citi").as_dict(), default=json_handler)
-		company = frappe.db.get_single_value('Global Defaults', 'default_company')
+		company = frappe.db.get_single_value("Global Defaults", "default_company")
 		frappe.db.set_value("Company", company, "default_bank_account", None)
 
-		self.assertRaises(frappe.ValidationError, add_bank_accounts, response=bank_accounts, bank=bank, company=company)
+		self.assertRaises(
+			frappe.ValidationError, add_bank_accounts, response=bank_accounts, bank=bank, company=company
+		)
 
 	def test_new_transaction(self):
 		if not frappe.db.exists("Bank", "Citi"):
-			frappe.get_doc({
-				"doctype": "Bank",
-				"bank_name": "Citi"
-			}).insert()
+			frappe.get_doc({"doctype": "Bank", "bank_name": "Citi"}).insert()
 
 		bank_accounts = {
-			'account': {
-				'subtype': 'checking',
-				'mask': '0000',
-				'type': 'depository',
-				'id': '6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK',
-				'name': 'Plaid Checking'
+			"account": {
+				"subtype": "checking",
+				"mask": "0000",
+				"type": "depository",
+				"id": "6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK",
+				"name": "Plaid Checking",
 			},
-			'account_id': '6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK',
-			'link_session_id': 'db673d75-61aa-442a-864f-9b3f174f3725',
-			'accounts': [{
-				'type': 'depository',
-				'subtype': 'checking',
-				'mask': '0000',
-				'id': '6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK',
-				'name': 'Plaid Checking'
-			}],
-			'institution': {
-				'institution_id': 'ins_6',
-				'name': 'Citi'
-			}
+			"account_id": "6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK",
+			"link_session_id": "db673d75-61aa-442a-864f-9b3f174f3725",
+			"accounts": [
+				{
+					"type": "depository",
+					"subtype": "checking",
+					"mask": "0000",
+					"id": "6GbM6RRQgdfy3lAqGz4JUnpmR948WZFg8DjQK",
+					"name": "Plaid Checking",
+				}
+			],
+			"institution": {"institution_id": "ins_6", "name": "Citi"},
 		}
 
 		bank = json.dumps(frappe.get_doc("Bank", "Citi").as_dict(), default=json_handler)
-		company = frappe.db.get_single_value('Global Defaults', 'default_company')
+		company = frappe.db.get_single_value("Global Defaults", "default_company")
 
 		if frappe.db.get_value("Company", company, "default_bank_account") is None:
-			frappe.db.set_value("Company", company, "default_bank_account", get_default_bank_cash_account(company, "Cash").get("account"))
+			frappe.db.set_value(
+				"Company",
+				company,
+				"default_bank_account",
+				get_default_bank_cash_account(company, "Cash").get("account"),
+			)
 
 		add_bank_accounts(bank_accounts, bank, company)
 
 		transactions = {
-			'account_owner': None,
-			'category': ['Food and Drink', 'Restaurants'],
-			'account_id': 'b4Jkp1LJDZiPgojpr1ansXJrj5Q6w9fVmv6ov',
-			'pending_transaction_id': None,
-			'transaction_id': 'x374xPa7DvUewqlR5mjNIeGK8r8rl3Sn647LM',
-			'unofficial_currency_code': None,
-			'name': 'INTRST PYMNT',
-			'transaction_type': 'place',
-			'amount': -4.22,
-			'location': {
-				'city': None,
-				'zip': None,
-				'store_number': None,
-				'lon': None,
-				'state': None,
-				'address': None,
-				'lat': None
+			"account_owner": None,
+			"category": ["Food and Drink", "Restaurants"],
+			"account_id": "b4Jkp1LJDZiPgojpr1ansXJrj5Q6w9fVmv6ov",
+			"pending_transaction_id": None,
+			"transaction_id": "x374xPa7DvUewqlR5mjNIeGK8r8rl3Sn647LM",
+			"unofficial_currency_code": None,
+			"name": "INTRST PYMNT",
+			"transaction_type": "place",
+			"amount": -4.22,
+			"location": {
+				"city": None,
+				"zip": None,
+				"store_number": None,
+				"lon": None,
+				"state": None,
+				"address": None,
+				"lat": None,
 			},
-			'payment_meta': {
-				'reference_number': None,
-				'payer': None,
-				'payment_method': None,
-				'reason': None,
-				'payee': None,
-				'ppd_id': None,
-				'payment_processor': None,
-				'by_order_of': None
+			"payment_meta": {
+				"reference_number": None,
+				"payer": None,
+				"payment_method": None,
+				"reason": None,
+				"payee": None,
+				"ppd_id": None,
+				"payment_processor": None,
+				"by_order_of": None,
 			},
-			'date': '2017-12-22',
-			'category_id': '13005000',
-			'pending': False,
-			'iso_currency_code': 'USD'
+			"date": "2017-12-22",
+			"category_id": "13005000",
+			"pending": False,
+			"iso_currency_code": "USD",
 		}
 
 		new_bank_transaction(transactions)
diff --git a/erpnext/erpnext_integrations/doctype/quickbooks_migrator/quickbooks_migrator.py b/erpnext/erpnext_integrations/doctype/quickbooks_migrator/quickbooks_migrator.py
index 5de5682..b93c5c4 100644
--- a/erpnext/erpnext_integrations/doctype/quickbooks_migrator/quickbooks_migrator.py
+++ b/erpnext/erpnext_integrations/doctype/quickbooks_migrator/quickbooks_migrator.py
@@ -37,30 +37,27 @@
 	def __init__(self, *args, **kwargs):
 		super(QuickBooksMigrator, self).__init__(*args, **kwargs)
 		self.oauth = OAuth2Session(
-			client_id=self.client_id,
-			redirect_uri=self.redirect_url,
-			scope=self.scope
+			client_id=self.client_id, redirect_uri=self.redirect_url, scope=self.scope
 		)
 		if not self.authorization_url and self.authorization_endpoint:
 			self.authorization_url = self.oauth.authorization_url(self.authorization_endpoint)[0]
 
-
 	def on_update(self):
 		if self.company:
 			# We need a Cost Center corresponding to the selected erpnext Company
-			self.default_cost_center = frappe.db.get_value('Company', self.company, 'cost_center')
-			company_warehouses = frappe.get_all('Warehouse', filters={"company": self.company, "is_group": 0})
+			self.default_cost_center = frappe.db.get_value("Company", self.company, "cost_center")
+			company_warehouses = frappe.get_all(
+				"Warehouse", filters={"company": self.company, "is_group": 0}
+			)
 			if company_warehouses:
 				self.default_warehouse = company_warehouses[0].name
 		if self.authorization_endpoint:
 			self.authorization_url = self.oauth.authorization_url(self.authorization_endpoint)[0]
 
-
 	@frappe.whitelist()
 	def migrate(self):
 		frappe.enqueue_doc("QuickBooks Migrator", "QuickBooks Migrator", "_migrate", queue="long")
 
-
 	def _migrate(self):
 		try:
 			self.set_indicator("In Progress")
@@ -86,18 +83,33 @@
 			# Following entities are directly available from API
 			# Invoice can be an exception sometimes though (as explained above).
 			entities_for_normal_transform = [
-				"Customer", "Item", "Vendor",
+				"Customer",
+				"Item",
+				"Vendor",
 				"Preferences",
-				"JournalEntry", "Purchase", "Deposit",
-				"Invoice", "CreditMemo", "SalesReceipt", "RefundReceipt",
-				"Bill", "VendorCredit",
-				"Payment", "BillPayment",
+				"JournalEntry",
+				"Purchase",
+				"Deposit",
+				"Invoice",
+				"CreditMemo",
+				"SalesReceipt",
+				"RefundReceipt",
+				"Bill",
+				"VendorCredit",
+				"Payment",
+				"BillPayment",
 			]
 			for entity in entities_for_normal_transform:
 				self._migrate_entries(entity)
 
 			# Following entries are not available directly from API, Need to be regenrated from GeneralLedger Report
-			entities_for_gl_transform = ["Advance Payment", "Tax Payment", "Sales Tax Payment", "Purchase Tax Payment", "Inventory Qty Adjust"]
+			entities_for_gl_transform = [
+				"Advance Payment",
+				"Tax Payment",
+				"Sales Tax Payment",
+				"Purchase Tax Payment",
+				"Inventory Qty Adjust",
+			]
 			for entity in entities_for_gl_transform:
 				self._migrate_entries_from_gl(entity)
 			self.set_indicator("Complete")
@@ -107,33 +119,37 @@
 
 		frappe.db.commit()
 
-
 	def get_tokens(self):
 		token = self.oauth.fetch_token(
-			token_url=self.token_endpoint,
-			client_secret=self.client_secret,
-			code=self.code
+			token_url=self.token_endpoint, client_secret=self.client_secret, code=self.code
 		)
 		self.access_token = token["access_token"]
 		self.refresh_token = token["refresh_token"]
 		self.save()
 
-
 	def _refresh_tokens(self):
 		token = self.oauth.refresh_token(
 			token_url=self.token_endpoint,
 			client_id=self.client_id,
 			refresh_token=self.refresh_token,
 			client_secret=self.client_secret,
-			code=self.code
+			code=self.code,
 		)
 		self.access_token = token["access_token"]
 		self.refresh_token = token["refresh_token"]
 		self.save()
 
-
 	def _make_custom_fields(self):
-		doctypes_for_quickbooks_id_field = ["Account", "Customer", "Address", "Item", "Supplier", "Sales Invoice", "Journal Entry", "Purchase Invoice"]
+		doctypes_for_quickbooks_id_field = [
+			"Account",
+			"Customer",
+			"Address",
+			"Item",
+			"Supplier",
+			"Sales Invoice",
+			"Journal Entry",
+			"Purchase Invoice",
+		]
 		for doctype in doctypes_for_quickbooks_id_field:
 			self._make_custom_quickbooks_id_field(doctype)
 
@@ -143,53 +159,60 @@
 
 		frappe.db.commit()
 
-
 	def _make_custom_quickbooks_id_field(self, doctype):
 		if not frappe.get_meta(doctype).has_field("quickbooks_id"):
-			frappe.get_doc({
-				"doctype": "Custom Field",
-				"label": "QuickBooks ID",
-				"dt": doctype,
-				"fieldname": "quickbooks_id",
-				"fieldtype": "Data",
-			}).insert()
-
+			frappe.get_doc(
+				{
+					"doctype": "Custom Field",
+					"label": "QuickBooks ID",
+					"dt": doctype,
+					"fieldname": "quickbooks_id",
+					"fieldtype": "Data",
+				}
+			).insert()
 
 	def _make_custom_company_field(self, doctype):
 		if not frappe.get_meta(doctype).has_field("company"):
-			frappe.get_doc({
-				"doctype": "Custom Field",
-				"label": "Company",
-				"dt": doctype,
-				"fieldname": "company",
-				"fieldtype": "Link",
-				"options": "Company",
-			}).insert()
-
+			frappe.get_doc(
+				{
+					"doctype": "Custom Field",
+					"label": "Company",
+					"dt": doctype,
+					"fieldname": "company",
+					"fieldtype": "Link",
+					"options": "Company",
+				}
+			).insert()
 
 	def _migrate_accounts(self):
 		self._make_root_accounts()
 		for entity in ["Account", "TaxRate", "TaxCode"]:
 			self._migrate_entries(entity)
 
-
 	def _make_root_accounts(self):
 		roots = ["Asset", "Equity", "Expense", "Liability", "Income"]
 		for root in roots:
 			try:
-				if not frappe.db.exists({"doctype": "Account", "name": encode_company_abbr("{} - QB".format(root), self.company), "company": self.company}):
-					frappe.get_doc({
+				if not frappe.db.exists(
+					{
 						"doctype": "Account",
-						"account_name": "{} - QB".format(root),
-						"root_type": root,
-						"is_group": "1",
+						"name": encode_company_abbr("{} - QB".format(root), self.company),
 						"company": self.company,
-					}).insert(ignore_mandatory=True)
+					}
+				):
+					frappe.get_doc(
+						{
+							"doctype": "Account",
+							"account_name": "{} - QB".format(root),
+							"root_type": root,
+							"is_group": "1",
+							"company": self.company,
+						}
+					).insert(ignore_mandatory=True)
 			except Exception as e:
 				self._log_error(e, root)
 		frappe.db.commit()
 
-
 	def _migrate_entries(self, entity):
 		try:
 			query_uri = "{}/company/{}/query".format(
@@ -198,22 +221,19 @@
 			)
 			max_result_count = 1000
 			# Count number of entries
-			response = self._get(query_uri,
-				params={
-					"query": """SELECT COUNT(*) FROM {}""".format(entity)
-				}
-			)
+			response = self._get(query_uri, params={"query": """SELECT COUNT(*) FROM {}""".format(entity)})
 			entry_count = response.json()["QueryResponse"]["totalCount"]
 
 			# fetch pages and accumulate
 			entries = []
 			for start_position in range(1, entry_count + 1, max_result_count):
-				response = self._get(query_uri,
+				response = self._get(
+					query_uri,
 					params={
 						"query": """SELECT * FROM {} STARTPOSITION {} MAXRESULTS {}""".format(
 							entity, start_position, max_result_count
 						)
-					}
+					},
 				)
 				entries.extend(response.json()["QueryResponse"][entity])
 			entries = self._preprocess_entries(entity, entries)
@@ -221,16 +241,18 @@
 		except Exception as e:
 			self._log_error(e, response.text)
 
-
 	def _fetch_general_ledger(self):
 		try:
-			query_uri = "{}/company/{}/reports/GeneralLedger".format(self.api_endpoint, self.quickbooks_company_id)
-			response = self._get(query_uri,
+			query_uri = "{}/company/{}/reports/GeneralLedger".format(
+				self.api_endpoint, self.quickbooks_company_id
+			)
+			response = self._get(
+				query_uri,
 				params={
 					"columns": ",".join(["tx_date", "txn_type", "credit_amt", "debt_amt"]),
 					"date_macro": "All",
 					"minorversion": 3,
-				}
+				},
 			)
 			self.gl_entries = {}
 			for section in response.json()["Rows"]["Row"]:
@@ -250,7 +272,6 @@
 		except Exception as e:
 			self._log_error(e, response.text)
 
-
 	def _create_fiscal_years(self):
 		try:
 			# Assumes that exactly one fiscal year has been created so far
@@ -258,10 +279,12 @@
 			from itertools import chain
 
 			from frappe.utils.data import add_years, getdate
-			smallest_ledger_entry_date = getdate(min(entry["date"] for entry in chain(*self.gl_entries.values()) if entry["date"]))
-			oldest_fiscal_year = frappe.get_all("Fiscal Year",
-				fields=["year_start_date", "year_end_date"],
-				order_by="year_start_date"
+
+			smallest_ledger_entry_date = getdate(
+				min(entry["date"] for entry in chain(*self.gl_entries.values()) if entry["date"])
+			)
+			oldest_fiscal_year = frappe.get_all(
+				"Fiscal Year", fields=["year_start_date", "year_end_date"], order_by="year_start_date"
 			)[0]
 			# Keep on creating fiscal years
 			# until smallest_ledger_entry_date is no longer smaller than the oldest fiscal year's start date
@@ -272,7 +295,9 @@
 				if new_fiscal_year.year_start_date.year == new_fiscal_year.year_end_date.year:
 					new_fiscal_year.year = new_fiscal_year.year_start_date.year
 				else:
-					new_fiscal_year.year = "{}-{}".format(new_fiscal_year.year_start_date.year, new_fiscal_year.year_end_date.year)
+					new_fiscal_year.year = "{}-{}".format(
+						new_fiscal_year.year_start_date.year, new_fiscal_year.year_end_date.year
+					)
 				new_fiscal_year.save()
 				oldest_fiscal_year = new_fiscal_year
 
@@ -280,40 +305,30 @@
 		except Exception as e:
 			self._log_error(e)
 
-
 	def _migrate_entries_from_gl(self, entity):
 		if entity in self.general_ledger:
 			self._save_entries(entity, self.general_ledger[entity].values())
 
-
 	def _save_entries(self, entity, entries):
 		entity_method_map = {
 			"Account": self._save_account,
 			"TaxRate": self._save_tax_rate,
 			"TaxCode": self._save_tax_code,
-
 			"Preferences": self._save_preference,
-
 			"Customer": self._save_customer,
 			"Item": self._save_item,
 			"Vendor": self._save_vendor,
-
 			"Invoice": self._save_invoice,
 			"CreditMemo": self._save_credit_memo,
 			"SalesReceipt": self._save_sales_receipt,
 			"RefundReceipt": self._save_refund_receipt,
-
 			"JournalEntry": self._save_journal_entry,
-
 			"Bill": self._save_bill,
 			"VendorCredit": self._save_vendor_credit,
-
 			"Payment": self._save_payment,
 			"BillPayment": self._save_bill_payment,
-
 			"Purchase": self._save_purchase,
 			"Deposit": self._save_deposit,
-
 			"Advance Payment": self._save_advance_payment,
 			"Tax Payment": self._save_tax_payment,
 			"Sales Tax Payment": self._save_tax_payment,
@@ -322,11 +337,17 @@
 		}
 		total = len(entries)
 		for index, entry in enumerate(entries, start=1):
-			self._publish({"event": "progress", "message": _("Saving {0}").format(entity), "count": index, "total": total})
+			self._publish(
+				{
+					"event": "progress",
+					"message": _("Saving {0}").format(entity),
+					"count": index,
+					"total": total,
+				}
+			)
 			entity_method_map[entity](entry)
 		frappe.db.commit()
 
-
 	def _preprocess_entries(self, entity, entries):
 		entity_method_map = {
 			"Account": self._preprocess_accounts,
@@ -338,7 +359,6 @@
 			entries = preprocessor(entries)
 		return entries
 
-
 	def _get_gl_entries_from_section(self, section, account=None):
 		if "Header" in section:
 			if "id" in section["Header"]["ColData"][0]:
@@ -359,19 +379,20 @@
 		for row in section["Rows"]["Row"]:
 			if row["type"] == "Data":
 				data = row["ColData"]
-				entries.append({
-					"account": account,
-					"date": data[0]["value"],
-					"type": data[1]["value"],
-					"id": data[1].get("id"),
-					"credit": frappe.utils.flt(data[2]["value"]),
-					"debit": frappe.utils.flt(data[3]["value"]),
-				})
+				entries.append(
+					{
+						"account": account,
+						"date": data[0]["value"],
+						"type": data[1]["value"],
+						"id": data[1].get("id"),
+						"credit": frappe.utils.flt(data[2]["value"]),
+						"debit": frappe.utils.flt(data[3]["value"]),
+					}
+				)
 			if row["type"] == "Section":
 				self._get_gl_entries_from_section(row, account)
 		self.gl_entries.setdefault(account, []).extend(entries)
 
-
 	def _preprocess_accounts(self, accounts):
 		self.accounts = {account["Name"]: account for account in accounts}
 		for account in accounts:
@@ -381,7 +402,6 @@
 				account["is_group"] = 0
 		return sorted(accounts, key=lambda account: int(account["Id"]))
 
-
 	def _save_account(self, account):
 		mapping = {
 			"Bank": "Asset",
@@ -389,24 +409,22 @@
 			"Fixed Asset": "Asset",
 			"Other Asset": "Asset",
 			"Accounts Receivable": "Asset",
-
 			"Equity": "Equity",
-
 			"Expense": "Expense",
 			"Other Expense": "Expense",
 			"Cost of Goods Sold": "Expense",
-
 			"Accounts Payable": "Liability",
 			"Credit Card": "Liability",
 			"Long Term Liability": "Liability",
 			"Other Current Liability": "Liability",
-
 			"Income": "Income",
 			"Other Income": "Income",
 		}
 		# Map Quickbooks Account Types to ERPNext root_accunts and and root_type
 		try:
-			if not frappe.db.exists({"doctype": "Account", "quickbooks_id": account["Id"], "company": self.company}):
+			if not frappe.db.exists(
+				{"doctype": "Account", "quickbooks_id": account["Id"], "company": self.company}
+			):
 				is_child = account["SubAccount"]
 				is_group = account["is_group"]
 				# Create Two Accounts for every Group Account
@@ -416,103 +434,125 @@
 					account_id = account["Id"]
 
 				if is_child:
-					parent_account = self._get_account_name_by_id("Group - {}".format(account["ParentRef"]["value"]))
+					parent_account = self._get_account_name_by_id(
+						"Group - {}".format(account["ParentRef"]["value"])
+					)
 				else:
-					parent_account = encode_company_abbr("{} - QB".format(mapping[account["AccountType"]]), self.company)
+					parent_account = encode_company_abbr(
+						"{} - QB".format(mapping[account["AccountType"]]), self.company
+					)
 
-				frappe.get_doc({
-					"doctype": "Account",
-					"quickbooks_id": account_id,
-					"account_name": self._get_unique_account_name(account["Name"]),
-					"root_type": mapping[account["AccountType"]],
-					"account_type": self._get_account_type(account),
-					"account_currency": account["CurrencyRef"]["value"],
-					"parent_account": parent_account,
-					"is_group": is_group,
-					"company": self.company,
-				}).insert()
-
-				if is_group:
-					# Create a Leaf account corresponding to the group account
-					frappe.get_doc({
+				frappe.get_doc(
+					{
 						"doctype": "Account",
-						"quickbooks_id": account["Id"],
+						"quickbooks_id": account_id,
 						"account_name": self._get_unique_account_name(account["Name"]),
 						"root_type": mapping[account["AccountType"]],
 						"account_type": self._get_account_type(account),
 						"account_currency": account["CurrencyRef"]["value"],
-						"parent_account": self._get_account_name_by_id(account_id),
-						"is_group": 0,
+						"parent_account": parent_account,
+						"is_group": is_group,
 						"company": self.company,
-					}).insert()
+					}
+				).insert()
+
+				if is_group:
+					# Create a Leaf account corresponding to the group account
+					frappe.get_doc(
+						{
+							"doctype": "Account",
+							"quickbooks_id": account["Id"],
+							"account_name": self._get_unique_account_name(account["Name"]),
+							"root_type": mapping[account["AccountType"]],
+							"account_type": self._get_account_type(account),
+							"account_currency": account["CurrencyRef"]["value"],
+							"parent_account": self._get_account_name_by_id(account_id),
+							"is_group": 0,
+							"company": self.company,
+						}
+					).insert()
 				if account.get("AccountSubType") == "UndepositedFunds":
 					self.undeposited_funds_account = self._get_account_name_by_id(account["Id"])
 					self.save()
 		except Exception as e:
 			self._log_error(e, account)
 
-
 	def _get_account_type(self, account):
 		account_subtype_mapping = {"UndepositedFunds": "Cash"}
 		account_type = account_subtype_mapping.get(account.get("AccountSubType"))
 		if account_type is None:
-			account_type_mapping = {"Accounts Payable": "Payable", "Accounts Receivable": "Receivable", "Bank": "Bank", "Credit Card": "Bank"}
+			account_type_mapping = {
+				"Accounts Payable": "Payable",
+				"Accounts Receivable": "Receivable",
+				"Bank": "Bank",
+				"Credit Card": "Bank",
+			}
 			account_type = account_type_mapping.get(account["AccountType"])
 		return account_type
 
-
 	def _preprocess_tax_rates(self, tax_rates):
 		self.tax_rates = {tax_rate["Id"]: tax_rate for tax_rate in tax_rates}
 		return tax_rates
 
-
 	def _save_tax_rate(self, tax_rate):
 		try:
-			if not frappe.db.exists({"doctype": "Account", "quickbooks_id": "TaxRate - {}".format(tax_rate["Id"]), "company": self.company}):
-				frappe.get_doc({
+			if not frappe.db.exists(
+				{
 					"doctype": "Account",
 					"quickbooks_id": "TaxRate - {}".format(tax_rate["Id"]),
-					"account_name": "{} - QB".format(tax_rate["Name"]),
-					"root_type": "Liability",
-					"parent_account": encode_company_abbr("{} - QB".format("Liability"), self.company),
-					"is_group": "0",
 					"company": self.company,
-				}).insert()
+				}
+			):
+				frappe.get_doc(
+					{
+						"doctype": "Account",
+						"quickbooks_id": "TaxRate - {}".format(tax_rate["Id"]),
+						"account_name": "{} - QB".format(tax_rate["Name"]),
+						"root_type": "Liability",
+						"parent_account": encode_company_abbr("{} - QB".format("Liability"), self.company),
+						"is_group": "0",
+						"company": self.company,
+					}
+				).insert()
 		except Exception as e:
 			self._log_error(e, tax_rate)
 
-
 	def _preprocess_tax_codes(self, tax_codes):
 		self.tax_codes = {tax_code["Id"]: tax_code for tax_code in tax_codes}
 		return tax_codes
 
-
 	def _save_tax_code(self, tax_code):
 		pass
 
-
 	def _save_customer(self, customer):
 		try:
-			if not frappe.db.exists({"doctype": "Customer", "quickbooks_id": customer["Id"], "company": self.company}):
+			if not frappe.db.exists(
+				{"doctype": "Customer", "quickbooks_id": customer["Id"], "company": self.company}
+			):
 				try:
-					receivable_account = frappe.get_all("Account", filters={
-						"account_type": "Receivable",
-						"account_currency": customer["CurrencyRef"]["value"],
-						"company": self.company,
-					})[0]["name"]
+					receivable_account = frappe.get_all(
+						"Account",
+						filters={
+							"account_type": "Receivable",
+							"account_currency": customer["CurrencyRef"]["value"],
+							"company": self.company,
+						},
+					)[0]["name"]
 				except Exception:
 					receivable_account = None
-				erpcustomer = frappe.get_doc({
-					"doctype": "Customer",
-					"quickbooks_id": customer["Id"],
-					"customer_name": encode_company_abbr(customer["DisplayName"], self.company),
-					"customer_type": "Individual",
-					"customer_group": "Commercial",
-					"default_currency": customer["CurrencyRef"]["value"],
-					"accounts": [{"company": self.company, "account": receivable_account}],
-					"territory": "All Territories",
-					"company": self.company,
-				}).insert()
+				erpcustomer = frappe.get_doc(
+					{
+						"doctype": "Customer",
+						"quickbooks_id": customer["Id"],
+						"customer_name": encode_company_abbr(customer["DisplayName"], self.company),
+						"customer_type": "Individual",
+						"customer_group": "Commercial",
+						"default_currency": customer["CurrencyRef"]["value"],
+						"accounts": [{"company": self.company, "account": receivable_account}],
+						"territory": "All Territories",
+						"company": self.company,
+					}
+				).insert()
 				if "BillAddr" in customer:
 					self._create_address(erpcustomer, "Customer", customer["BillAddr"], "Billing")
 				if "ShipAddr" in customer:
@@ -520,10 +560,11 @@
 		except Exception as e:
 			self._log_error(e, customer)
 
-
 	def _save_item(self, item):
 		try:
-			if not frappe.db.exists({"doctype": "Item", "quickbooks_id": item["Id"], "company": self.company}):
+			if not frappe.db.exists(
+				{"doctype": "Item", "quickbooks_id": item["Id"], "company": self.company}
+			):
 				if item["Type"] in ("Service", "Inventory"):
 					item_dict = {
 						"doctype": "Item",
@@ -533,7 +574,7 @@
 						"is_stock_item": 0,
 						"item_group": "All Item Groups",
 						"company": self.company,
-						"item_defaults": [{"company": self.company, "default_warehouse": self.default_warehouse}]
+						"item_defaults": [{"company": self.company, "default_warehouse": self.default_warehouse}],
 					}
 					if "ExpenseAccountRef" in item:
 						expense_account = self._get_account_name_by_id(item["ExpenseAccountRef"]["value"])
@@ -545,21 +586,23 @@
 		except Exception as e:
 			self._log_error(e, item)
 
-
 	def _allow_fraction_in_unit(self):
 		frappe.db.set_value("UOM", "Unit", "must_be_whole_number", 0)
 
-
 	def _save_vendor(self, vendor):
 		try:
-			if not frappe.db.exists({"doctype": "Supplier", "quickbooks_id": vendor["Id"], "company": self.company}):
-				erpsupplier = frappe.get_doc({
-					"doctype": "Supplier",
-					"quickbooks_id": vendor["Id"],
-					"supplier_name": encode_company_abbr(vendor["DisplayName"], self.company),
-					"supplier_group": "All Supplier Groups",
-					"company": self.company,
-				}).insert()
+			if not frappe.db.exists(
+				{"doctype": "Supplier", "quickbooks_id": vendor["Id"], "company": self.company}
+			):
+				erpsupplier = frappe.get_doc(
+					{
+						"doctype": "Supplier",
+						"quickbooks_id": vendor["Id"],
+						"supplier_name": encode_company_abbr(vendor["DisplayName"], self.company),
+						"supplier_group": "All Supplier Groups",
+						"company": self.company,
+					}
+				).insert()
 				if "BillAddr" in vendor:
 					self._create_address(erpsupplier, "Supplier", vendor["BillAddr"], "Billing")
 				if "ShipAddr" in vendor:
@@ -567,7 +610,6 @@
 		except Exception as e:
 			self._log_error(e)
 
-
 	def _save_preference(self, preference):
 		try:
 			if preference["SalesFormsPrefs"]["AllowShipping"]:
@@ -577,7 +619,6 @@
 		except Exception as e:
 			self._log_error(e, preference)
 
-
 	def _save_invoice(self, invoice):
 		# Invoice can be Linked with Another Transactions
 		# If any of these transactions is a "StatementCharge" or "ReimburseCharge" then in the UI
@@ -585,59 +626,56 @@
 		# Also as of now there is no way of fetching the corresponding transaction from api
 		# We in order to correctly reflect account balance make an equivalent Journal Entry
 		quickbooks_id = "Invoice - {}".format(invoice["Id"])
-		if any(linked["TxnType"] in ("StatementCharge", "ReimburseCharge") for linked in invoice["LinkedTxn"]):
+		if any(
+			linked["TxnType"] in ("StatementCharge", "ReimburseCharge") for linked in invoice["LinkedTxn"]
+		):
 			self._save_invoice_as_journal_entry(invoice, quickbooks_id)
 		else:
 			self._save_sales_invoice(invoice, quickbooks_id)
 
-
 	def _save_credit_memo(self, credit_memo):
 		# Credit Memo is equivalent to a return Sales Invoice
 		quickbooks_id = "Credit Memo - {}".format(credit_memo["Id"])
 		self._save_sales_invoice(credit_memo, quickbooks_id, is_return=True)
 
-
 	def _save_sales_receipt(self, sales_receipt):
 		# Sales Receipt is equivalent to a POS Sales Invoice
 		quickbooks_id = "Sales Receipt - {}".format(sales_receipt["Id"])
 		self._save_sales_invoice(sales_receipt, quickbooks_id, is_pos=True)
 
-
 	def _save_refund_receipt(self, refund_receipt):
 		# Refund Receipt is equivalent to a return POS Sales Invoice
 		quickbooks_id = "Refund Receipt - {}".format(refund_receipt["Id"])
 		self._save_sales_invoice(refund_receipt, quickbooks_id, is_return=True, is_pos=True)
 
-
 	def _save_sales_invoice(self, invoice, quickbooks_id, is_return=False, is_pos=False):
 		try:
-			if not frappe.db.exists({"doctype": "Sales Invoice", "quickbooks_id": quickbooks_id, "company": self.company}):
+			if not frappe.db.exists(
+				{"doctype": "Sales Invoice", "quickbooks_id": quickbooks_id, "company": self.company}
+			):
 				invoice_dict = {
 					"doctype": "Sales Invoice",
 					"quickbooks_id": quickbooks_id,
-
 					# Quickbooks uses ISO 4217 Code
 					# of course this gonna come back to bite me
 					"currency": invoice["CurrencyRef"]["value"],
-
 					# Exchange Rate is provided if multicurrency is enabled
 					# It is not provided if multicurrency is not enabled
 					"conversion_rate": invoice.get("ExchangeRate", 1),
 					"posting_date": invoice["TxnDate"],
-
 					# QuickBooks doesn't make Due Date a mandatory field this is a hack
 					"due_date": invoice.get("DueDate", invoice["TxnDate"]),
-					"customer": frappe.get_all("Customer",
+					"customer": frappe.get_all(
+						"Customer",
 						filters={
 							"quickbooks_id": invoice["CustomerRef"]["value"],
 							"company": self.company,
-						})[0]["name"],
+						},
+					)[0]["name"],
 					"items": self._get_si_items(invoice, is_return=is_return),
 					"taxes": self._get_taxes(invoice),
-
 					# Do not change posting_date upon submission
 					"set_posting_time": 1,
-
 					# QuickBooks doesn't round total
 					"disable_rounded_total": 1,
 					"is_return": is_return,
@@ -659,7 +697,6 @@
 		except Exception as e:
 			self._log_error(e, [invoice, invoice_dict, json.loads(invoice_doc.as_json())])
 
-
 	def _get_si_items(self, invoice, is_return=False):
 		items = []
 		for line in invoice["Line"]:
@@ -672,48 +709,56 @@
 					else:
 						tax_code = "NON"
 				if line["SalesItemLineDetail"]["ItemRef"]["value"] != "SHIPPING_ITEM_ID":
-					item = frappe.db.get_all("Item",
+					item = frappe.db.get_all(
+						"Item",
 						filters={
 							"quickbooks_id": line["SalesItemLineDetail"]["ItemRef"]["value"],
 							"company": self.company,
 						},
-						fields=["name", "stock_uom"]
+						fields=["name", "stock_uom"],
 					)[0]
-					items.append({
-						"item_code": item["name"],
-						"conversion_factor": 1,
-						"uom": item["stock_uom"],
-						"description": line.get("Description", line["SalesItemLineDetail"]["ItemRef"]["name"]),
-						"qty": line["SalesItemLineDetail"]["Qty"],
-						"price_list_rate": line["SalesItemLineDetail"]["UnitPrice"],
-						"cost_center": self.default_cost_center,
-						"warehouse": self.default_warehouse,
-						"item_tax_rate": json.dumps(self._get_item_taxes(tax_code))
-					})
+					items.append(
+						{
+							"item_code": item["name"],
+							"conversion_factor": 1,
+							"uom": item["stock_uom"],
+							"description": line.get("Description", line["SalesItemLineDetail"]["ItemRef"]["name"]),
+							"qty": line["SalesItemLineDetail"]["Qty"],
+							"price_list_rate": line["SalesItemLineDetail"]["UnitPrice"],
+							"cost_center": self.default_cost_center,
+							"warehouse": self.default_warehouse,
+							"item_tax_rate": json.dumps(self._get_item_taxes(tax_code)),
+						}
+					)
 				else:
-					items.append({
-						"item_name": "Shipping",
-						"conversion_factor": 1,
-						"expense_account": self._get_account_name_by_id("TaxRate - {}".format(line["SalesItemLineDetail"]["TaxCodeRef"]["value"])),
-						"uom": "Unit",
-						"description": "Shipping",
-						"income_account": self.default_shipping_account,
-						"qty": 1,
-						"price_list_rate": line["Amount"],
-						"cost_center": self.default_cost_center,
-						"warehouse": self.default_warehouse,
-						"item_tax_rate": json.dumps(self._get_item_taxes(tax_code))
-					})
+					items.append(
+						{
+							"item_name": "Shipping",
+							"conversion_factor": 1,
+							"expense_account": self._get_account_name_by_id(
+								"TaxRate - {}".format(line["SalesItemLineDetail"]["TaxCodeRef"]["value"])
+							),
+							"uom": "Unit",
+							"description": "Shipping",
+							"income_account": self.default_shipping_account,
+							"qty": 1,
+							"price_list_rate": line["Amount"],
+							"cost_center": self.default_cost_center,
+							"warehouse": self.default_warehouse,
+							"item_tax_rate": json.dumps(self._get_item_taxes(tax_code)),
+						}
+					)
 				if is_return:
 					items[-1]["qty"] *= -1
 			elif line["DetailType"] == "DescriptionOnly":
-				items[-1].update({
-					"margin_type": "Percentage",
-					"margin_rate_or_amount": int(line["Description"].split("%")[0]),
-				})
+				items[-1].update(
+					{
+						"margin_type": "Percentage",
+						"margin_rate_or_amount": int(line["Description"].split("%")[0]),
+					}
+				)
 		return items
 
-
 	def _get_item_taxes(self, tax_code):
 		tax_rates = self.tax_rates
 		item_taxes = {}
@@ -723,30 +768,31 @@
 				if rate_list_type in tax_code:
 					for tax_rate_detail in tax_code[rate_list_type]["TaxRateDetail"]:
 						if tax_rate_detail["TaxTypeApplicable"] == "TaxOnAmount":
-							tax_head = self._get_account_name_by_id("TaxRate - {}".format(tax_rate_detail["TaxRateRef"]["value"]))
+							tax_head = self._get_account_name_by_id(
+								"TaxRate - {}".format(tax_rate_detail["TaxRateRef"]["value"])
+							)
 							tax_rate = tax_rates[tax_rate_detail["TaxRateRef"]["value"]]
 							item_taxes[tax_head] = tax_rate["RateValue"]
 		return item_taxes
 
-
 	def _get_invoice_payments(self, invoice, is_return=False, is_pos=False):
 		if is_pos:
 			amount = invoice["TotalAmt"]
 			if is_return:
 				amount = -amount
-			return [{
-				"mode_of_payment": "Cash",
-				"account": self._get_account_name_by_id(invoice["DepositToAccountRef"]["value"]),
-				"amount": amount,
-			}]
-
+			return [
+				{
+					"mode_of_payment": "Cash",
+					"account": self._get_account_name_by_id(invoice["DepositToAccountRef"]["value"]),
+					"amount": amount,
+				}
+			]
 
 	def _get_discount(self, lines):
 		for line in lines:
 			if line["DetailType"] == "DiscountLineDetail" and "Amount" in line["DiscountLineDetail"]:
 				return line
 
-
 	def _save_invoice_as_journal_entry(self, invoice, quickbooks_id):
 		try:
 			accounts = []
@@ -758,8 +804,9 @@
 					account_line["credit_in_account_currency"] = line["credit"]
 				if frappe.db.get_value("Account", line["account"], "account_type") == "Receivable":
 					account_line["party_type"] = "Customer"
-					account_line["party"] = frappe.get_all("Customer",
-						filters={"quickbooks_id": invoice["CustomerRef"]["value"], "company": self.company}
+					account_line["party"] = frappe.get_all(
+						"Customer",
+						filters={"quickbooks_id": invoice["CustomerRef"]["value"], "company": self.company},
 					)[0]["name"]
 
 				accounts.append(account_line)
@@ -769,7 +816,6 @@
 		except Exception as e:
 			self._log_error(e, [invoice, accounts])
 
-
 	def _save_journal_entry(self, journal_entry):
 		# JournalEntry is equivalent to a Journal Entry
 
@@ -782,13 +828,17 @@
 			accounts = []
 			for line in lines:
 				if line["DetailType"] == "JournalEntryLineDetail":
-					account_name = self._get_account_name_by_id(line["JournalEntryLineDetail"]["AccountRef"]["value"])
+					account_name = self._get_account_name_by_id(
+						line["JournalEntryLineDetail"]["AccountRef"]["value"]
+					)
 					posting_type = line["JournalEntryLineDetail"]["PostingType"]
-					accounts.append({
-						"account": account_name,
-						posting_type_field_mapping[posting_type]: line["Amount"],
-						"cost_center": self.default_cost_center,
-					})
+					accounts.append(
+						{
+							"account": account_name,
+							posting_type_field_mapping[posting_type]: line["Amount"],
+							"cost_center": self.default_cost_center,
+						}
+					)
 			return accounts
 
 		quickbooks_id = "Journal Entry - {}".format(journal_entry["Id"])
@@ -796,39 +846,41 @@
 		posting_date = journal_entry["TxnDate"]
 		self.__save_journal_entry(quickbooks_id, accounts, posting_date)
 
-
 	def __save_journal_entry(self, quickbooks_id, accounts, posting_date):
 		try:
-			if not frappe.db.exists({"doctype": "Journal Entry", "quickbooks_id": quickbooks_id, "company": self.company}):
-				je = frappe.get_doc({
-					"doctype": "Journal Entry",
-					"quickbooks_id": quickbooks_id,
-					"company": self.company,
-					"posting_date": posting_date,
-					"accounts": accounts,
-					"multi_currency": 1,
-				})
+			if not frappe.db.exists(
+				{"doctype": "Journal Entry", "quickbooks_id": quickbooks_id, "company": self.company}
+			):
+				je = frappe.get_doc(
+					{
+						"doctype": "Journal Entry",
+						"quickbooks_id": quickbooks_id,
+						"company": self.company,
+						"posting_date": posting_date,
+						"accounts": accounts,
+						"multi_currency": 1,
+					}
+				)
 				je.insert()
 				je.submit()
 		except Exception as e:
 			self._log_error(e, [accounts, json.loads(je.as_json())])
 
-
 	def _save_bill(self, bill):
 		# Bill is equivalent to a Purchase Invoice
 		quickbooks_id = "Bill - {}".format(bill["Id"])
 		self.__save_purchase_invoice(bill, quickbooks_id)
 
-
 	def _save_vendor_credit(self, vendor_credit):
 		# Vendor Credit is equivalent to a return Purchase Invoice
 		quickbooks_id = "Vendor Credit - {}".format(vendor_credit["Id"])
 		self.__save_purchase_invoice(vendor_credit, quickbooks_id, is_return=True)
 
-
 	def __save_purchase_invoice(self, invoice, quickbooks_id, is_return=False):
 		try:
-			if not frappe.db.exists({"doctype": "Purchase Invoice", "quickbooks_id": quickbooks_id, "company": self.company}):
+			if not frappe.db.exists(
+				{"doctype": "Purchase Invoice", "quickbooks_id": quickbooks_id, "company": self.company}
+			):
 				credit_to_account = self._get_account_name_by_id(invoice["APAccountRef"]["value"])
 				invoice_dict = {
 					"doctype": "Purchase Invoice",
@@ -838,11 +890,13 @@
 					"posting_date": invoice["TxnDate"],
 					"due_date": invoice.get("DueDate", invoice["TxnDate"]),
 					"credit_to": credit_to_account,
-					"supplier": frappe.get_all("Supplier",
+					"supplier": frappe.get_all(
+						"Supplier",
 						filters={
 							"quickbooks_id": invoice["VendorRef"]["value"],
 							"company": self.company,
-						})[0]["name"],
+						},
+					)[0]["name"],
 					"items": self._get_pi_items(invoice, is_return=is_return),
 					"taxes": self._get_taxes(invoice),
 					"set_posting_time": 1,
@@ -857,7 +911,6 @@
 		except Exception as e:
 			self._log_error(e, [invoice, invoice_dict, json.loads(invoice_doc.as_json())])
 
-
 	def _get_pi_items(self, purchase_invoice, is_return=False):
 		items = []
 		for line in purchase_invoice["Line"]:
@@ -869,24 +922,29 @@
 						tax_code = purchase_invoice["TxnTaxDetail"]["TxnTaxCodeRef"]["value"]
 					else:
 						tax_code = "NON"
-				item = frappe.db.get_all("Item",
+				item = frappe.db.get_all(
+					"Item",
 					filters={
 						"quickbooks_id": line["ItemBasedExpenseLineDetail"]["ItemRef"]["value"],
-						"company": self.company
+						"company": self.company,
 					},
-					fields=["name", "stock_uom"]
+					fields=["name", "stock_uom"],
 				)[0]
-				items.append({
-					"item_code": item["name"],
-					"conversion_factor": 1,
-					"uom": item["stock_uom"],
-					"description": line.get("Description", line["ItemBasedExpenseLineDetail"]["ItemRef"]["name"]),
-					"qty": line["ItemBasedExpenseLineDetail"]["Qty"],
-					"price_list_rate": line["ItemBasedExpenseLineDetail"]["UnitPrice"],
-					"warehouse": self.default_warehouse,
-					"cost_center": self.default_cost_center,
-					"item_tax_rate": json.dumps(self._get_item_taxes(tax_code)),
-				})
+				items.append(
+					{
+						"item_code": item["name"],
+						"conversion_factor": 1,
+						"uom": item["stock_uom"],
+						"description": line.get(
+							"Description", line["ItemBasedExpenseLineDetail"]["ItemRef"]["name"]
+						),
+						"qty": line["ItemBasedExpenseLineDetail"]["Qty"],
+						"price_list_rate": line["ItemBasedExpenseLineDetail"]["UnitPrice"],
+						"warehouse": self.default_warehouse,
+						"cost_center": self.default_cost_center,
+						"item_tax_rate": json.dumps(self._get_item_taxes(tax_code)),
+					}
+				)
 			elif line["DetailType"] == "AccountBasedExpenseLineDetail":
 				if line["AccountBasedExpenseLineDetail"]["TaxCodeRef"]["value"] != "TAX":
 					tax_code = line["AccountBasedExpenseLineDetail"]["TaxCodeRef"]["value"]
@@ -895,23 +953,30 @@
 						tax_code = purchase_invoice["TxnTaxDetail"]["TxnTaxCodeRef"]["value"]
 					else:
 						tax_code = "NON"
-				items.append({
-					"item_name": line.get("Description", line["AccountBasedExpenseLineDetail"]["AccountRef"]["name"]),
-					"conversion_factor": 1,
-					"expense_account": self._get_account_name_by_id(line["AccountBasedExpenseLineDetail"]["AccountRef"]["value"]),
-					"uom": "Unit",
-					"description": line.get("Description", line["AccountBasedExpenseLineDetail"]["AccountRef"]["name"]),
-					"qty": 1,
-					"price_list_rate": line["Amount"],
-					"warehouse": self.default_warehouse,
-					"cost_center": self.default_cost_center,
-					"item_tax_rate": json.dumps(self._get_item_taxes(tax_code)),
-				})
+				items.append(
+					{
+						"item_name": line.get(
+							"Description", line["AccountBasedExpenseLineDetail"]["AccountRef"]["name"]
+						),
+						"conversion_factor": 1,
+						"expense_account": self._get_account_name_by_id(
+							line["AccountBasedExpenseLineDetail"]["AccountRef"]["value"]
+						),
+						"uom": "Unit",
+						"description": line.get(
+							"Description", line["AccountBasedExpenseLineDetail"]["AccountRef"]["name"]
+						),
+						"qty": 1,
+						"price_list_rate": line["Amount"],
+						"warehouse": self.default_warehouse,
+						"cost_center": self.default_cost_center,
+						"item_tax_rate": json.dumps(self._get_item_taxes(tax_code)),
+					}
+				)
 			if is_return:
 				items[-1]["qty"] *= -1
 		return items
 
-
 	def _save_payment(self, payment):
 		try:
 			quickbooks_id = "Payment - {}".format(payment["Id"])
@@ -928,8 +993,11 @@
 				if linked_transaction["TxnType"] == "Invoice":
 					si_quickbooks_id = "Invoice - {}".format(linked_transaction["TxnId"])
 					# Invoice could have been saved as a Sales Invoice or a Journal Entry
-					if frappe.db.exists({"doctype": "Sales Invoice", "quickbooks_id": si_quickbooks_id, "company": self.company}):
-						sales_invoice = frappe.get_all("Sales Invoice",
+					if frappe.db.exists(
+						{"doctype": "Sales Invoice", "quickbooks_id": si_quickbooks_id, "company": self.company}
+					):
+						sales_invoice = frappe.get_all(
+							"Sales Invoice",
 							filters={
 								"quickbooks_id": si_quickbooks_id,
 								"company": self.company,
@@ -941,43 +1009,51 @@
 						party = sales_invoice["customer"]
 						party_account = sales_invoice["debit_to"]
 
-					if frappe.db.exists({"doctype": "Journal Entry", "quickbooks_id": si_quickbooks_id, "company": self.company}):
-						journal_entry = frappe.get_doc("Journal Entry",
+					if frappe.db.exists(
+						{"doctype": "Journal Entry", "quickbooks_id": si_quickbooks_id, "company": self.company}
+					):
+						journal_entry = frappe.get_doc(
+							"Journal Entry",
 							{
 								"quickbooks_id": si_quickbooks_id,
 								"company": self.company,
-							}
+							},
 						)
 						# Invoice saved as a Journal Entry must have party and party_type set on line containing Receivable Account
-						customer_account_line = list(filter(lambda acc: acc.party_type == "Customer", journal_entry.accounts))[0]
+						customer_account_line = list(
+							filter(lambda acc: acc.party_type == "Customer", journal_entry.accounts)
+						)[0]
 
 						reference_type = "Journal Entry"
 						reference_name = journal_entry.name
 						party = customer_account_line.party
 						party_account = customer_account_line.account
 
-					accounts.append({
-						"party_type": "Customer",
-						"party": party,
-						"reference_type": reference_type,
-						"reference_name": reference_name,
-						"account": party_account,
-						"credit_in_account_currency": line["Amount"],
-						"cost_center": self.default_cost_center,
-					})
+					accounts.append(
+						{
+							"party_type": "Customer",
+							"party": party,
+							"reference_type": reference_type,
+							"reference_name": reference_name,
+							"account": party_account,
+							"credit_in_account_currency": line["Amount"],
+							"cost_center": self.default_cost_center,
+						}
+					)
 
 			deposit_account = self._get_account_name_by_id(payment["DepositToAccountRef"]["value"])
-			accounts.append({
-				"account": deposit_account,
-				"debit_in_account_currency": payment["TotalAmt"],
-				"cost_center": self.default_cost_center,
-			})
+			accounts.append(
+				{
+					"account": deposit_account,
+					"debit_in_account_currency": payment["TotalAmt"],
+					"cost_center": self.default_cost_center,
+				}
+			)
 			posting_date = payment["TxnDate"]
 			self.__save_journal_entry(quickbooks_id, accounts, posting_date)
 		except Exception as e:
 			self._log_error(e, [payment, accounts])
 
-
 	def _save_bill_payment(self, bill_payment):
 		try:
 			quickbooks_id = "BillPayment - {}".format(bill_payment["Id"])
@@ -987,8 +1063,11 @@
 				linked_transaction = line["LinkedTxn"][0]
 				if linked_transaction["TxnType"] == "Bill":
 					pi_quickbooks_id = "Bill - {}".format(linked_transaction["TxnId"])
-					if frappe.db.exists({"doctype": "Purchase Invoice", "quickbooks_id": pi_quickbooks_id, "company": self.company}):
-						purchase_invoice = frappe.get_all("Purchase Invoice",
+					if frappe.db.exists(
+						{"doctype": "Purchase Invoice", "quickbooks_id": pi_quickbooks_id, "company": self.company}
+					):
+						purchase_invoice = frappe.get_all(
+							"Purchase Invoice",
 							filters={
 								"quickbooks_id": pi_quickbooks_id,
 								"company": self.company,
@@ -999,15 +1078,17 @@
 						reference_name = purchase_invoice["name"]
 						party = purchase_invoice["supplier"]
 						party_account = purchase_invoice["credit_to"]
-					accounts.append({
-						"party_type": "Supplier",
-						"party": party,
-						"reference_type": reference_type,
-						"reference_name": reference_name,
-						"account": party_account,
-						"debit_in_account_currency": line["Amount"],
-						"cost_center": self.default_cost_center,
-					})
+					accounts.append(
+						{
+							"party_type": "Supplier",
+							"party": party,
+							"reference_type": reference_type,
+							"reference_name": reference_name,
+							"account": party_account,
+							"debit_in_account_currency": line["Amount"],
+							"cost_center": self.default_cost_center,
+						}
+					)
 
 			if bill_payment["PayType"] == "Check":
 				bank_account_id = bill_payment["CheckPayment"]["BankAccountRef"]["value"]
@@ -1015,49 +1096,68 @@
 				bank_account_id = bill_payment["CreditCardPayment"]["CCAccountRef"]["value"]
 
 			bank_account = self._get_account_name_by_id(bank_account_id)
-			accounts.append({
-				"account": bank_account,
-				"credit_in_account_currency": bill_payment["TotalAmt"],
-				"cost_center": self.default_cost_center,
-			})
+			accounts.append(
+				{
+					"account": bank_account,
+					"credit_in_account_currency": bill_payment["TotalAmt"],
+					"cost_center": self.default_cost_center,
+				}
+			)
 			posting_date = bill_payment["TxnDate"]
 			self.__save_journal_entry(quickbooks_id, accounts, posting_date)
 		except Exception as e:
 			self._log_error(e, [bill_payment, accounts])
 
-
 	def _save_purchase(self, purchase):
 		try:
 			quickbooks_id = "Purchase - {}".format(purchase["Id"])
 			# Credit Bank Account
-			accounts = [{
-				"account": self._get_account_name_by_id(purchase["AccountRef"]["value"]),
-				"credit_in_account_currency": purchase["TotalAmt"],
-				"cost_center": self.default_cost_center,
-			}]
+			accounts = [
+				{
+					"account": self._get_account_name_by_id(purchase["AccountRef"]["value"]),
+					"credit_in_account_currency": purchase["TotalAmt"],
+					"cost_center": self.default_cost_center,
+				}
+			]
 
 			# Debit Mentioned Accounts
 			for line in purchase["Line"]:
 				if line["DetailType"] == "AccountBasedExpenseLineDetail":
-					account = self._get_account_name_by_id(line["AccountBasedExpenseLineDetail"]["AccountRef"]["value"])
+					account = self._get_account_name_by_id(
+						line["AccountBasedExpenseLineDetail"]["AccountRef"]["value"]
+					)
 				elif line["DetailType"] == "ItemBasedExpenseLineDetail":
-					account = frappe.get_doc("Item",
-						{"quickbooks_id": line["ItemBasedExpenseLineDetail"]["ItemRef"]["value"], "company": self.company}
-					).item_defaults[0].expense_account
-				accounts.append({
-					"account": account,
-					"debit_in_account_currency": line["Amount"],
-					"cost_center": self.default_cost_center,
-				})
+					account = (
+						frappe.get_doc(
+							"Item",
+							{
+								"quickbooks_id": line["ItemBasedExpenseLineDetail"]["ItemRef"]["value"],
+								"company": self.company,
+							},
+						)
+						.item_defaults[0]
+						.expense_account
+					)
+				accounts.append(
+					{
+						"account": account,
+						"debit_in_account_currency": line["Amount"],
+						"cost_center": self.default_cost_center,
+					}
+				)
 
 			# Debit Tax Accounts
 			if "TxnTaxDetail" in purchase:
 				for line in purchase["TxnTaxDetail"]["TaxLine"]:
-					accounts.append({
-						"account": self._get_account_name_by_id("TaxRate - {}".format(line["TaxLineDetail"]["TaxRateRef"]["value"])),
-						"debit_in_account_currency": line["Amount"],
-						"cost_center": self.default_cost_center,
-					})
+					accounts.append(
+						{
+							"account": self._get_account_name_by_id(
+								"TaxRate - {}".format(line["TaxLineDetail"]["TaxRateRef"]["value"])
+							),
+							"debit_in_account_currency": line["Amount"],
+							"cost_center": self.default_cost_center,
+						}
+					)
 
 			# If purchase["Credit"] is set to be True then it represents a refund
 			if purchase.get("Credit"):
@@ -1074,61 +1174,64 @@
 		except Exception as e:
 			self._log_error(e, [purchase, accounts])
 
-
 	def _save_deposit(self, deposit):
 		try:
 			quickbooks_id = "Deposit - {}".format(deposit["Id"])
 			# Debit Bank Account
-			accounts = [{
-				"account": self._get_account_name_by_id(deposit["DepositToAccountRef"]["value"]),
-				"debit_in_account_currency": deposit["TotalAmt"],
-				"cost_center": self.default_cost_center,
-			}]
+			accounts = [
+				{
+					"account": self._get_account_name_by_id(deposit["DepositToAccountRef"]["value"]),
+					"debit_in_account_currency": deposit["TotalAmt"],
+					"cost_center": self.default_cost_center,
+				}
+			]
 
 			# Credit Mentioned Accounts
 			for line in deposit["Line"]:
 				if "LinkedTxn" in line:
-					accounts.append({
-						"account": self.undeposited_funds_account,
-						"credit_in_account_currency": line["Amount"],
-						"cost_center": self.default_cost_center,
-					})
+					accounts.append(
+						{
+							"account": self.undeposited_funds_account,
+							"credit_in_account_currency": line["Amount"],
+							"cost_center": self.default_cost_center,
+						}
+					)
 				else:
-					accounts.append({
-						"account": self._get_account_name_by_id(line["DepositLineDetail"]["AccountRef"]["value"]),
-						"credit_in_account_currency": line["Amount"],
-						"cost_center": self.default_cost_center,
-					})
+					accounts.append(
+						{
+							"account": self._get_account_name_by_id(line["DepositLineDetail"]["AccountRef"]["value"]),
+							"credit_in_account_currency": line["Amount"],
+							"cost_center": self.default_cost_center,
+						}
+					)
 
 			# Debit Cashback if mentioned
 			if "CashBack" in deposit:
-				accounts.append({
-					"account": self._get_account_name_by_id(deposit["CashBack"]["AccountRef"]["value"]),
-					"debit_in_account_currency": deposit["CashBack"]["Amount"],
-					"cost_center": self.default_cost_center,
-				})
+				accounts.append(
+					{
+						"account": self._get_account_name_by_id(deposit["CashBack"]["AccountRef"]["value"]),
+						"debit_in_account_currency": deposit["CashBack"]["Amount"],
+						"cost_center": self.default_cost_center,
+					}
+				)
 
 			posting_date = deposit["TxnDate"]
 			self.__save_journal_entry(quickbooks_id, accounts, posting_date)
 		except Exception as e:
 			self._log_error(e, [deposit, accounts])
 
-
 	def _save_advance_payment(self, advance_payment):
 		quickbooks_id = "Advance Payment - {}".format(advance_payment["id"])
 		self.__save_ledger_entry_as_je(advance_payment, quickbooks_id)
 
-
 	def _save_tax_payment(self, tax_payment):
 		quickbooks_id = "Tax Payment - {}".format(tax_payment["id"])
 		self.__save_ledger_entry_as_je(tax_payment, quickbooks_id)
 
-
 	def _save_inventory_qty_adjust(self, inventory_qty_adjust):
 		quickbooks_id = "Inventory Qty Adjust - {}".format(inventory_qty_adjust["id"])
 		self.__save_ledger_entry_as_je(inventory_qty_adjust, quickbooks_id)
 
-
 	def __save_ledger_entry_as_je(self, ledger_entry, quickbooks_id):
 		try:
 			accounts = []
@@ -1145,7 +1248,6 @@
 		except Exception as e:
 			self._log_error(e, ledger_entry)
 
-
 	def _get_taxes(self, entry):
 		taxes = []
 		if "TxnTaxDetail" not in entry or "TaxLine" not in entry["TxnTaxDetail"]:
@@ -1155,27 +1257,30 @@
 			account_head = self._get_account_name_by_id("TaxRate - {}".format(tax_rate))
 			tax_type_applicable = self._get_tax_type(tax_rate)
 			if tax_type_applicable == "TaxOnAmount":
-				taxes.append({
-					"charge_type": "On Net Total",
-					"account_head": account_head,
-					"description": account_head,
-					"cost_center": self.default_cost_center,
-					"rate": 0,
-				})
+				taxes.append(
+					{
+						"charge_type": "On Net Total",
+						"account_head": account_head,
+						"description": account_head,
+						"cost_center": self.default_cost_center,
+						"rate": 0,
+					}
+				)
 			else:
 				parent_tax_rate = self._get_parent_tax_rate(tax_rate)
 				parent_row_id = self._get_parent_row_id(parent_tax_rate, taxes)
-				taxes.append({
-					"charge_type": "On Previous Row Amount",
-					"row_id": parent_row_id,
-					"account_head": account_head,
-					"description": account_head,
-					"cost_center": self.default_cost_center,
-					"rate": line["TaxLineDetail"]["TaxPercent"],
-				})
+				taxes.append(
+					{
+						"charge_type": "On Previous Row Amount",
+						"row_id": parent_row_id,
+						"account_head": account_head,
+						"description": account_head,
+						"cost_center": self.default_cost_center,
+						"rate": line["TaxLineDetail"]["TaxPercent"],
+					}
+				)
 		return taxes
 
-
 	def _get_tax_type(self, tax_rate):
 		for tax_code in self.tax_codes.values():
 			for rate_list_type in ("SalesTaxRateList", "PurchaseTaxRateList"):
@@ -1184,7 +1289,6 @@
 						if tax_rate_detail["TaxRateRef"]["value"] == tax_rate:
 							return tax_rate_detail["TaxTypeApplicable"]
 
-
 	def _get_parent_tax_rate(self, tax_rate):
 		parent = None
 		for tax_code in self.tax_codes.values():
@@ -1198,34 +1302,33 @@
 							if tax_rate_detail["TaxOrder"] == parent:
 								return tax_rate_detail["TaxRateRef"]["value"]
 
-
 	def _get_parent_row_id(self, tax_rate, taxes):
 		tax_account = self._get_account_name_by_id("TaxRate - {}".format(tax_rate))
 		for index, tax in enumerate(taxes):
 			if tax["account_head"] == tax_account:
 				return index + 1
 
-
 	def _create_address(self, entity, doctype, address, address_type):
 		try:
 			if not frappe.db.exists({"doctype": "Address", "quickbooks_id": address["Id"]}):
-				frappe.get_doc({
-					"doctype": "Address",
-					"quickbooks_address_id": address["Id"],
-					"address_title": entity.name,
-					"address_type": address_type,
-					"address_line1": address["Line1"],
-					"city": address["City"],
-					"links": [{"link_doctype": doctype, "link_name": entity.name}]
-				}).insert()
+				frappe.get_doc(
+					{
+						"doctype": "Address",
+						"quickbooks_address_id": address["Id"],
+						"address_title": entity.name,
+						"address_type": address_type,
+						"address_line1": address["Line1"],
+						"city": address["City"],
+						"links": [{"link_doctype": doctype, "link_name": entity.name}],
+					}
+				).insert()
 		except Exception as e:
 			self._log_error(e, address)
 
-
 	def _get(self, *args, **kwargs):
 		kwargs["headers"] = {
 			"Accept": "application/json",
-			"Authorization": "Bearer {}".format(self.access_token)
+			"Authorization": "Bearer {}".format(self.access_token),
 		}
 		response = requests.get(*args, **kwargs)
 		# HTTP Status code 401 here means that the access_token is expired
@@ -1236,43 +1339,41 @@
 			response = self._get(*args, **kwargs)
 		return response
 
-
 	def _get_account_name_by_id(self, quickbooks_id):
-		return frappe.get_all("Account", filters={"quickbooks_id": quickbooks_id, "company": self.company})[0]["name"]
-
+		return frappe.get_all(
+			"Account", filters={"quickbooks_id": quickbooks_id, "company": self.company}
+		)[0]["name"]
 
 	def _publish(self, *args, **kwargs):
 		frappe.publish_realtime("quickbooks_progress_update", *args, **kwargs)
 
-
 	def _get_unique_account_name(self, quickbooks_name, number=0):
 		if number:
 			quickbooks_account_name = "{} - {} - QB".format(quickbooks_name, number)
 		else:
 			quickbooks_account_name = "{} - QB".format(quickbooks_name)
 		company_encoded_account_name = encode_company_abbr(quickbooks_account_name, self.company)
-		if frappe.db.exists({"doctype": "Account", "name": company_encoded_account_name, "company": self.company}):
+		if frappe.db.exists(
+			{"doctype": "Account", "name": company_encoded_account_name, "company": self.company}
+		):
 			unique_account_name = self._get_unique_account_name(quickbooks_name, number + 1)
 		else:
 			unique_account_name = quickbooks_account_name
 		return unique_account_name
 
-
 	def _log_error(self, execption, data=""):
-		frappe.log_error(title="QuickBooks Migration Error",
-			message="\n".join([
-				"Data",
-				json.dumps(data,
-					sort_keys=True,
-					indent=4,
-					separators=(',', ': ')
-				),
-				"Exception",
-				traceback.format_exc()
-			])
+		frappe.log_error(
+			title="QuickBooks Migration Error",
+			message="\n".join(
+				[
+					"Data",
+					json.dumps(data, sort_keys=True, indent=4, separators=(",", ": ")),
+					"Exception",
+					traceback.format_exc(),
+				]
+			),
 		)
 
-
 	def set_indicator(self, status):
 		self.status = status
 		self.save()
diff --git a/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py b/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
index 26bd19f..7d676e4 100644
--- a/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
+++ b/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
@@ -36,6 +36,7 @@
 
 	return doc
 
+
 class TallyMigration(Document):
 	def validate(self):
 		failed_import_log = json.loads(self.failed_import_log)
@@ -73,14 +74,16 @@
 
 	def dump_processed_data(self, data):
 		for key, value in data.items():
-			f = frappe.get_doc({
-				"doctype": "File",
-				"file_name":  key + ".json",
-				"attached_to_doctype": self.doctype,
-				"attached_to_name": self.name,
-				"content": json.dumps(value),
-				"is_private": True
-			})
+			f = frappe.get_doc(
+				{
+					"doctype": "File",
+					"file_name": key + ".json",
+					"attached_to_doctype": self.doctype,
+					"attached_to_name": self.name,
+					"content": json.dumps(value),
+					"is_private": True,
+				}
+			)
 			try:
 				f.insert(ignore_if_duplicate=True)
 			except frappe.DuplicateEntryError:
@@ -88,8 +91,12 @@
 			setattr(self, key, f.file_url)
 
 	def set_account_defaults(self):
-		self.default_cost_center, self.default_round_off_account = frappe.db.get_value("Company", self.erpnext_company, ["cost_center", "round_off_account"])
-		self.default_warehouse = frappe.db.get_value("Stock Settings", "Stock Settings", "default_warehouse")
+		self.default_cost_center, self.default_round_off_account = frappe.db.get_value(
+			"Company", self.erpnext_company, ["cost_center", "round_off_account"]
+		)
+		self.default_warehouse = frappe.db.get_value(
+			"Stock Settings", "Stock Settings", "default_warehouse"
+		)
 
 	def _process_master_data(self):
 		def get_company_name(collection):
@@ -100,18 +107,24 @@
 				"Application of Funds (Assets)": "Asset",
 				"Expenses": "Expense",
 				"Income": "Income",
-				"Source of Funds (Liabilities)": "Liability"
+				"Source of Funds (Liabilities)": "Liability",
 			}
 			roots = set(root_type_map.keys())
-			accounts = list(get_groups(collection.find_all("GROUP"))) + list(get_ledgers(collection.find_all("LEDGER")))
+			accounts = list(get_groups(collection.find_all("GROUP"))) + list(
+				get_ledgers(collection.find_all("LEDGER"))
+			)
 			children, parents = get_children_and_parent_dict(accounts)
-			group_set =  [acc[1] for acc in accounts if acc[2]]
+			group_set = [acc[1] for acc in accounts if acc[2]]
 			children, customers, suppliers = remove_parties(parents, children, group_set)
 
 			try:
 				coa = traverse({}, children, roots, roots, group_set)
 			except RecursionError:
-				self.log(_("Error occured while parsing Chart of Accounts: Please make sure that no two accounts have the same name"))
+				self.log(
+					_(
+						"Error occured while parsing Chart of Accounts: Please make sure that no two accounts have the same name"
+					)
+				)
 
 			for account in coa:
 				coa[account]["root_type"] = root_type_map[account]
@@ -185,42 +198,48 @@
 				links = []
 				if account.NAME.string.strip() in customers:
 					party_type = "Customer"
-					parties.append({
-						"doctype": party_type,
-						"customer_name": account.NAME.string.strip(),
-						"tax_id": account.INCOMETAXNUMBER.string.strip() if account.INCOMETAXNUMBER else None,
-						"customer_group": "All Customer Groups",
-						"territory": "All Territories",
-						"customer_type": "Individual",
-					})
+					parties.append(
+						{
+							"doctype": party_type,
+							"customer_name": account.NAME.string.strip(),
+							"tax_id": account.INCOMETAXNUMBER.string.strip() if account.INCOMETAXNUMBER else None,
+							"customer_group": "All Customer Groups",
+							"territory": "All Territories",
+							"customer_type": "Individual",
+						}
+					)
 					links.append({"link_doctype": party_type, "link_name": account["NAME"]})
 
 				if account.NAME.string.strip() in suppliers:
 					party_type = "Supplier"
-					parties.append({
-						"doctype": party_type,
-						"supplier_name": account.NAME.string.strip(),
-						"pan": account.INCOMETAXNUMBER.string.strip() if account.INCOMETAXNUMBER else None,
-						"supplier_group": "All Supplier Groups",
-						"supplier_type": "Individual",
-					})
+					parties.append(
+						{
+							"doctype": party_type,
+							"supplier_name": account.NAME.string.strip(),
+							"pan": account.INCOMETAXNUMBER.string.strip() if account.INCOMETAXNUMBER else None,
+							"supplier_group": "All Supplier Groups",
+							"supplier_type": "Individual",
+						}
+					)
 					links.append({"link_doctype": party_type, "link_name": account["NAME"]})
 
 				if party_type:
 					address = "\n".join([a.string.strip() for a in account.find_all("ADDRESS")])
-					addresses.append({
-						"doctype": "Address",
-						"address_line1": address[:140].strip(),
-						"address_line2": address[140:].strip(),
-						"country": account.COUNTRYNAME.string.strip() if account.COUNTRYNAME else None,
-						"state": account.LEDSTATENAME.string.strip() if account.LEDSTATENAME else None,
-						"gst_state": account.LEDSTATENAME.string.strip() if account.LEDSTATENAME else None,
-						"pin_code": account.PINCODE.string.strip() if account.PINCODE else None,
-						"mobile": account.LEDGERPHONE.string.strip() if account.LEDGERPHONE else None,
-						"phone": account.LEDGERPHONE.string.strip() if account.LEDGERPHONE else None,
-						"gstin": account.PARTYGSTIN.string.strip() if account.PARTYGSTIN else None,
-						"links": links
-					})
+					addresses.append(
+						{
+							"doctype": "Address",
+							"address_line1": address[:140].strip(),
+							"address_line2": address[140:].strip(),
+							"country": account.COUNTRYNAME.string.strip() if account.COUNTRYNAME else None,
+							"state": account.LEDSTATENAME.string.strip() if account.LEDSTATENAME else None,
+							"gst_state": account.LEDSTATENAME.string.strip() if account.LEDSTATENAME else None,
+							"pin_code": account.PINCODE.string.strip() if account.PINCODE else None,
+							"mobile": account.LEDGERPHONE.string.strip() if account.LEDGERPHONE else None,
+							"phone": account.LEDGERPHONE.string.strip() if account.LEDGERPHONE else None,
+							"gstin": account.PARTYGSTIN.string.strip() if account.PARTYGSTIN else None,
+							"links": links,
+						}
+					)
 			return parties, addresses
 
 		def get_stock_items_uoms(collection):
@@ -231,14 +250,16 @@
 			items = []
 			for item in collection.find_all("STOCKITEM"):
 				stock_uom = item.BASEUNITS.string.strip() if item.BASEUNITS else self.default_uom
-				items.append({
-					"doctype": "Item",
-					"item_code" : item.NAME.string.strip(),
-					"stock_uom": stock_uom.strip(),
-					"is_stock_item": 0,
-					"item_group": "All Item Groups",
-					"item_defaults": [{"company": self.erpnext_company}]
-				})
+				items.append(
+					{
+						"doctype": "Item",
+						"item_code": item.NAME.string.strip(),
+						"stock_uom": stock_uom.strip(),
+						"is_stock_item": 0,
+						"item_group": "All Item Groups",
+						"item_defaults": [{"company": self.erpnext_company}],
+					}
+				)
 
 			return items, uoms
 
@@ -257,7 +278,13 @@
 
 			self.publish("Process Master Data", _("Processing Items and UOMs"), 4, 5)
 			items, uoms = get_stock_items_uoms(collection)
-			data = {"chart_of_accounts": chart_of_accounts, "parties": parties, "addresses": addresses, "items": items, "uoms": uoms}
+			data = {
+				"chart_of_accounts": chart_of_accounts,
+				"parties": parties,
+				"addresses": addresses,
+				"items": items,
+				"uoms": uoms,
+			}
 
 			self.publish("Process Master Data", _("Done"), 5, 5)
 			self.dump_processed_data(data)
@@ -272,7 +299,10 @@
 			self.set_status()
 
 	def publish(self, title, message, count, total):
-		frappe.publish_realtime("tally_migration_progress_update", {"title": title, "message": message, "count": count, "total": total})
+		frappe.publish_realtime(
+			"tally_migration_progress_update",
+			{"title": title, "message": message, "count": count, "total": total},
+		)
 
 	def _import_master_data(self):
 		def create_company_and_coa(coa_file_url):
@@ -280,12 +310,14 @@
 			frappe.local.flags.ignore_chart_of_accounts = True
 
 			try:
-				company = frappe.get_doc({
-					"doctype": "Company",
-					"company_name": self.erpnext_company,
-					"default_currency": "INR",
-					"enable_perpetual_inventory": 0,
-				}).insert()
+				company = frappe.get_doc(
+					{
+						"doctype": "Company",
+						"company_name": self.erpnext_company,
+						"default_currency": "INR",
+						"enable_perpetual_inventory": 0,
+					}
+				).insert()
 			except frappe.DuplicateEntryError:
 				company = frappe.get_doc("Company", self.erpnext_company)
 				unset_existing_data(self.erpnext_company)
@@ -358,8 +390,16 @@
 			for voucher in collection.find_all("VOUCHER"):
 				if voucher.ISCANCELLED.string.strip() == "Yes":
 					continue
-				inventory_entries = voucher.find_all("INVENTORYENTRIES.LIST") + voucher.find_all("ALLINVENTORYENTRIES.LIST") + voucher.find_all("INVENTORYENTRIESIN.LIST") + voucher.find_all("INVENTORYENTRIESOUT.LIST")
-				if voucher.VOUCHERTYPENAME.string.strip() not in ["Journal", "Receipt", "Payment", "Contra"] and inventory_entries:
+				inventory_entries = (
+					voucher.find_all("INVENTORYENTRIES.LIST")
+					+ voucher.find_all("ALLINVENTORYENTRIES.LIST")
+					+ voucher.find_all("INVENTORYENTRIESIN.LIST")
+					+ voucher.find_all("INVENTORYENTRIESOUT.LIST")
+				)
+				if (
+					voucher.VOUCHERTYPENAME.string.strip() not in ["Journal", "Receipt", "Payment", "Contra"]
+					and inventory_entries
+				):
 					function = voucher_to_invoice
 				else:
 					function = voucher_to_journal_entry
@@ -375,9 +415,14 @@
 
 		def voucher_to_journal_entry(voucher):
 			accounts = []
-			ledger_entries = voucher.find_all("ALLLEDGERENTRIES.LIST") + voucher.find_all("LEDGERENTRIES.LIST")
+			ledger_entries = voucher.find_all("ALLLEDGERENTRIES.LIST") + voucher.find_all(
+				"LEDGERENTRIES.LIST"
+			)
 			for entry in ledger_entries:
-				account = {"account": encode_company_abbr(entry.LEDGERNAME.string.strip(), self.erpnext_company), "cost_center": self.default_cost_center}
+				account = {
+					"account": encode_company_abbr(entry.LEDGERNAME.string.strip(), self.erpnext_company),
+					"cost_center": self.default_cost_center,
+				}
 				if entry.ISPARTYLEDGER.string.strip() == "Yes":
 					party_details = get_party(entry.LEDGERNAME.string.strip())
 					if party_details:
@@ -438,7 +483,12 @@
 			return invoice
 
 		def get_voucher_items(voucher, doctype):
-			inventory_entries = voucher.find_all("INVENTORYENTRIES.LIST") + voucher.find_all("ALLINVENTORYENTRIES.LIST") + voucher.find_all("INVENTORYENTRIESIN.LIST") + voucher.find_all("INVENTORYENTRIESOUT.LIST")
+			inventory_entries = (
+				voucher.find_all("INVENTORYENTRIES.LIST")
+				+ voucher.find_all("ALLINVENTORYENTRIES.LIST")
+				+ voucher.find_all("INVENTORYENTRIESIN.LIST")
+				+ voucher.find_all("INVENTORYENTRIESOUT.LIST")
+			)
 			if doctype == "Sales Invoice":
 				account_field = "income_account"
 			elif doctype == "Purchase Invoice":
@@ -446,32 +496,41 @@
 			items = []
 			for entry in inventory_entries:
 				qty, uom = entry.ACTUALQTY.string.strip().split()
-				items.append({
-					"item_code": entry.STOCKITEMNAME.string.strip(),
-					"description": entry.STOCKITEMNAME.string.strip(),
-					"qty": qty.strip(),
-					"uom": uom.strip(),
-					"conversion_factor": 1,
-					"price_list_rate": entry.RATE.string.strip().split("/")[0],
-					"cost_center": self.default_cost_center,
-					"warehouse": self.default_warehouse,
-					account_field: encode_company_abbr(entry.find_all("ACCOUNTINGALLOCATIONS.LIST")[0].LEDGERNAME.string.strip(), self.erpnext_company),
-				})
+				items.append(
+					{
+						"item_code": entry.STOCKITEMNAME.string.strip(),
+						"description": entry.STOCKITEMNAME.string.strip(),
+						"qty": qty.strip(),
+						"uom": uom.strip(),
+						"conversion_factor": 1,
+						"price_list_rate": entry.RATE.string.strip().split("/")[0],
+						"cost_center": self.default_cost_center,
+						"warehouse": self.default_warehouse,
+						account_field: encode_company_abbr(
+							entry.find_all("ACCOUNTINGALLOCATIONS.LIST")[0].LEDGERNAME.string.strip(),
+							self.erpnext_company,
+						),
+					}
+				)
 			return items
 
 		def get_voucher_taxes(voucher):
-			ledger_entries = voucher.find_all("ALLLEDGERENTRIES.LIST") + voucher.find_all("LEDGERENTRIES.LIST")
+			ledger_entries = voucher.find_all("ALLLEDGERENTRIES.LIST") + voucher.find_all(
+				"LEDGERENTRIES.LIST"
+			)
 			taxes = []
 			for entry in ledger_entries:
 				if entry.ISPARTYLEDGER.string.strip() == "No":
 					tax_account = encode_company_abbr(entry.LEDGERNAME.string.strip(), self.erpnext_company)
-					taxes.append({
-						"charge_type": "Actual",
-						"account_head": tax_account,
-						"description": tax_account,
-						"tax_amount": entry.AMOUNT.string.strip(),
-						"cost_center": self.default_cost_center,
-					})
+					taxes.append(
+						{
+							"charge_type": "Actual",
+							"account_head": tax_account,
+							"description": tax_account,
+							"tax_amount": entry.AMOUNT.string.strip(),
+							"cost_center": self.default_cost_center,
+						}
+					)
 			return taxes
 
 		def get_party(party):
@@ -502,8 +561,11 @@
 	def _import_day_book_data(self):
 		def create_fiscal_years(vouchers):
 			from frappe.utils.data import add_years, getdate
+
 			earliest_date = getdate(min(voucher["posting_date"] for voucher in vouchers))
-			oldest_year = frappe.get_all("Fiscal Year", fields=["year_start_date", "year_end_date"], order_by="year_start_date")[0]
+			oldest_year = frappe.get_all(
+				"Fiscal Year", fields=["year_start_date", "year_end_date"], order_by="year_start_date"
+			)[0]
 			while earliest_date < oldest_year.year_start_date:
 				new_year = frappe.get_doc({"doctype": "Fiscal Year"})
 				new_year.year_start_date = add_years(oldest_year.year_start_date, -1)
@@ -520,32 +582,46 @@
 				"fieldtype": "Data",
 				"fieldname": "tally_guid",
 				"read_only": 1,
-				"label": "Tally GUID"
+				"label": "Tally GUID",
 			}
 			tally_voucher_no_df = {
 				"fieldtype": "Data",
 				"fieldname": "tally_voucher_no",
 				"read_only": 1,
-				"label": "Tally Voucher Number"
+				"label": "Tally Voucher Number",
 			}
 			for df in [tally_guid_df, tally_voucher_no_df]:
 				for doctype in doctypes:
 					create_custom_field(doctype, df)
 
 		def create_price_list():
-			frappe.get_doc({
-				"doctype": "Price List",
-				"price_list_name": "Tally Price List",
-				"selling": 1,
-				"buying": 1,
-				"enabled": 1,
-				"currency": "INR"
-			}).insert()
+			frappe.get_doc(
+				{
+					"doctype": "Price List",
+					"price_list_name": "Tally Price List",
+					"selling": 1,
+					"buying": 1,
+					"enabled": 1,
+					"currency": "INR",
+				}
+			).insert()
 
 		try:
-			frappe.db.set_value("Account", encode_company_abbr(self.tally_creditors_account, self.erpnext_company), "account_type", "Payable")
-			frappe.db.set_value("Account", encode_company_abbr(self.tally_debtors_account, self.erpnext_company), "account_type", "Receivable")
-			frappe.db.set_value("Company", self.erpnext_company, "round_off_account", self.default_round_off_account)
+			frappe.db.set_value(
+				"Account",
+				encode_company_abbr(self.tally_creditors_account, self.erpnext_company),
+				"account_type",
+				"Payable",
+			)
+			frappe.db.set_value(
+				"Account",
+				encode_company_abbr(self.tally_debtors_account, self.erpnext_company),
+				"account_type",
+				"Receivable",
+			)
+			frappe.db.set_value(
+				"Company", self.erpnext_company, "round_off_account", self.default_round_off_account
+			)
 
 			vouchers_file = frappe.get_doc("File", {"file_url": self.vouchers})
 			vouchers = json.loads(vouchers_file.get_content())
@@ -560,7 +636,16 @@
 			for index in range(0, total, VOUCHER_CHUNK_SIZE):
 				if index + VOUCHER_CHUNK_SIZE >= total:
 					is_last = True
-				frappe.enqueue_doc(self.doctype, self.name, "_import_vouchers", queue="long", timeout=3600, start=index+1, total=total, is_last=is_last)
+				frappe.enqueue_doc(
+					self.doctype,
+					self.name,
+					"_import_vouchers",
+					queue="long",
+					timeout=3600,
+					start=index + 1,
+					total=total,
+					is_last=is_last,
+				)
 
 		except Exception:
 			self.log()
@@ -572,7 +657,7 @@
 		frappe.flags.in_migrate = True
 		vouchers_file = frappe.get_doc("File", {"file_url": self.vouchers})
 		vouchers = json.loads(vouchers_file.get_content())
-		chunk = vouchers[start: start + VOUCHER_CHUNK_SIZE]
+		chunk = vouchers[start : start + VOUCHER_CHUNK_SIZE]
 
 		for index, voucher in enumerate(chunk, start=start):
 			try:
@@ -617,17 +702,22 @@
 			if sys.exc_info()[1].__class__ != frappe.DuplicateEntryError:
 				failed_import_log = json.loads(self.failed_import_log)
 				doc = data.as_dict()
-				failed_import_log.append({
-					"doc": doc,
-					"exc": traceback.format_exc()
-				})
-				self.failed_import_log = json.dumps(failed_import_log, separators=(',', ':'))
+				failed_import_log.append({"doc": doc, "exc": traceback.format_exc()})
+				self.failed_import_log = json.dumps(failed_import_log, separators=(",", ":"))
 				self.save()
 				frappe.db.commit()
 
 		else:
 			data = data or self.status
-			message = "\n".join(["Data:", json.dumps(data, default=str, indent=4), "--" * 50, "\nException:", traceback.format_exc()])
+			message = "\n".join(
+				[
+					"Data:",
+					json.dumps(data, default=str, indent=4),
+					"--" * 50,
+					"\nException:",
+					traceback.format_exc(),
+				]
+			)
 			return frappe.log_error(title="Tally Migration Error", message=message)
 
 	def set_status(self, status=""):
diff --git a/erpnext/erpnext_integrations/doctype/taxjar_settings/taxjar_settings.py b/erpnext/erpnext_integrations/doctype/taxjar_settings/taxjar_settings.py
index d4bbe88..2148863 100644
--- a/erpnext/erpnext_integrations/doctype/taxjar_settings/taxjar_settings.py
+++ b/erpnext/erpnext_integrations/doctype/taxjar_settings/taxjar_settings.py
@@ -14,27 +14,31 @@
 
 
 class TaxJarSettings(Document):
-
 	def on_update(self):
 		TAXJAR_CREATE_TRANSACTIONS = self.taxjar_create_transactions
 		TAXJAR_CALCULATE_TAX = self.taxjar_calculate_tax
 		TAXJAR_SANDBOX_MODE = self.is_sandbox
 
-		fields_already_exist = frappe.db.exists('Custom Field', {'dt': ('in', ['Item','Sales Invoice Item']), 'fieldname':'product_tax_category'})
-		fields_hidden = frappe.get_value('Custom Field', {'dt': ('in', ['Sales Invoice Item'])}, 'hidden')
+		fields_already_exist = frappe.db.exists(
+			"Custom Field",
+			{"dt": ("in", ["Item", "Sales Invoice Item"]), "fieldname": "product_tax_category"},
+		)
+		fields_hidden = frappe.get_value(
+			"Custom Field", {"dt": ("in", ["Sales Invoice Item"])}, "hidden"
+		)
 
-		if (TAXJAR_CREATE_TRANSACTIONS or TAXJAR_CALCULATE_TAX or TAXJAR_SANDBOX_MODE):
+		if TAXJAR_CREATE_TRANSACTIONS or TAXJAR_CALCULATE_TAX or TAXJAR_SANDBOX_MODE:
 			if not fields_already_exist:
 				add_product_tax_categories()
 				make_custom_fields()
 				add_permissions()
-				frappe.enqueue('erpnext.regional.united_states.setup.add_product_tax_categories', now=False)
+				frappe.enqueue("erpnext.regional.united_states.setup.add_product_tax_categories", now=False)
 
 			elif fields_already_exist and fields_hidden:
-				toggle_tax_category_fields(hidden='0')
+				toggle_tax_category_fields(hidden="0")
 
 		elif fields_already_exist:
-			toggle_tax_category_fields(hidden='1')
+			toggle_tax_category_fields(hidden="1")
 
 	def validate(self):
 		self.calculate_taxes_validation_for_create_transactions()
@@ -46,54 +50,97 @@
 
 		new_nexus_list = [frappe._dict(address) for address in nexus]
 
-		self.set('nexus', [])
-		self.set('nexus', new_nexus_list)
+		self.set("nexus", [])
+		self.set("nexus", new_nexus_list)
 		self.save()
 
 	def calculate_taxes_validation_for_create_transactions(self):
 		if not self.taxjar_calculate_tax and (self.taxjar_create_transactions or self.is_sandbox):
-			frappe.throw(frappe._('Before enabling <b>Create Transaction</b> or <b>Sandbox Mode</b>, you need to check the <b>Enable Tax Calculation</b> box'))
+			frappe.throw(
+				frappe._(
+					"Before enabling <b>Create Transaction</b> or <b>Sandbox Mode</b>, you need to check the <b>Enable Tax Calculation</b> box"
+				)
+			)
 
 
 def toggle_tax_category_fields(hidden):
-	frappe.set_value('Custom Field', {'dt':'Sales Invoice Item', 'fieldname':'product_tax_category'}, 'hidden', hidden)
-	frappe.set_value('Custom Field', {'dt':'Item', 'fieldname':'product_tax_category'}, 'hidden', hidden)
+	frappe.set_value(
+		"Custom Field",
+		{"dt": "Sales Invoice Item", "fieldname": "product_tax_category"},
+		"hidden",
+		hidden,
+	)
+	frappe.set_value(
+		"Custom Field", {"dt": "Item", "fieldname": "product_tax_category"}, "hidden", hidden
+	)
 
 
 def add_product_tax_categories():
-	with open(os.path.join(os.path.dirname(__file__), 'product_tax_category_data.json'), 'r') as f:
+	with open(os.path.join(os.path.dirname(__file__), "product_tax_category_data.json"), "r") as f:
 		tax_categories = json.loads(f.read())
-	create_tax_categories(tax_categories['categories'])
+	create_tax_categories(tax_categories["categories"])
+
 
 def create_tax_categories(data):
 	for d in data:
-		if not frappe.db.exists('Product Tax Category',{'product_tax_code':d.get('product_tax_code')}):
-			tax_category = frappe.new_doc('Product Tax Category')
+		if not frappe.db.exists("Product Tax Category", {"product_tax_code": d.get("product_tax_code")}):
+			tax_category = frappe.new_doc("Product Tax Category")
 			tax_category.description = d.get("description")
 			tax_category.product_tax_code = d.get("product_tax_code")
 			tax_category.category_name = d.get("name")
 			tax_category.db_insert()
 
+
 def make_custom_fields(update=True):
 	custom_fields = {
-		'Sales Invoice Item': [
-			dict(fieldname='product_tax_category', fieldtype='Link', insert_after='description', options='Product Tax Category',
-				label='Product Tax Category', fetch_from='item_code.product_tax_category'),
-			dict(fieldname='tax_collectable', fieldtype='Currency', insert_after='net_amount',
-				label='Tax Collectable', read_only=1, options='currency'),
-			dict(fieldname='taxable_amount', fieldtype='Currency', insert_after='tax_collectable',
-				label='Taxable Amount', read_only=1, options='currency')
+		"Sales Invoice Item": [
+			dict(
+				fieldname="product_tax_category",
+				fieldtype="Link",
+				insert_after="description",
+				options="Product Tax Category",
+				label="Product Tax Category",
+				fetch_from="item_code.product_tax_category",
+			),
+			dict(
+				fieldname="tax_collectable",
+				fieldtype="Currency",
+				insert_after="net_amount",
+				label="Tax Collectable",
+				read_only=1,
+				options="currency",
+			),
+			dict(
+				fieldname="taxable_amount",
+				fieldtype="Currency",
+				insert_after="tax_collectable",
+				label="Taxable Amount",
+				read_only=1,
+				options="currency",
+			),
 		],
-		'Item': [
-			dict(fieldname='product_tax_category', fieldtype='Link', insert_after='item_group', options='Product Tax Category',
-				label='Product Tax Category')
-		]
+		"Item": [
+			dict(
+				fieldname="product_tax_category",
+				fieldtype="Link",
+				insert_after="item_group",
+				options="Product Tax Category",
+				label="Product Tax Category",
+			)
+		],
 	}
 	create_custom_fields(custom_fields, update=update)
 
+
 def add_permissions():
 	doctype = "Product Tax Category"
-	for role in ('Accounts Manager', 'Accounts User', 'System Manager','Item Manager', 'Stock Manager'):
+	for role in (
+		"Accounts Manager",
+		"Accounts User",
+		"System Manager",
+		"Item Manager",
+		"Stock Manager",
+	):
 		add_permission(doctype, role, 0)
-		update_permission_property(doctype, role, 0, 'write', 1)
-		update_permission_property(doctype, role, 0, 'create', 1)
+		update_permission_property(doctype, role, 0, "write", 1)
+		update_permission_property(doctype, role, 0, "create", 1)
diff --git a/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py b/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py
index 309d2cb..2e18776 100644
--- a/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py
+++ b/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py
@@ -22,11 +22,23 @@
 			custom_fields = {}
 			# create
 			for doctype in ["Customer", "Sales Order", "Item", "Address"]:
-				df = dict(fieldname='woocommerce_id', label='Woocommerce ID', fieldtype='Data', read_only=1, print_hide=1)
+				df = dict(
+					fieldname="woocommerce_id",
+					label="Woocommerce ID",
+					fieldtype="Data",
+					read_only=1,
+					print_hide=1,
+				)
 				create_custom_field(doctype, df)
 
 			for doctype in ["Customer", "Address"]:
-				df = dict(fieldname='woocommerce_email', label='Woocommerce Email', fieldtype='Data', read_only=1, print_hide=1)
+				df = dict(
+					fieldname="woocommerce_email",
+					label="Woocommerce Email",
+					fieldtype="Data",
+					read_only=1,
+					print_hide=1,
+				)
 				create_custom_field(doctype, df)
 
 			if not frappe.get_value("Item Group", {"name": _("WooCommerce Products")}):
@@ -58,21 +70,21 @@
 			# for CI Test to work
 			url = "http://localhost:8000"
 
-		server_url = '{uri.scheme}://{uri.netloc}'.format(
-			uri=urlparse(url)
-		)
+		server_url = "{uri.scheme}://{uri.netloc}".format(uri=urlparse(url))
 
 		delivery_url = server_url + endpoint
 		self.endpoint = delivery_url
 
+
 @frappe.whitelist()
 def generate_secret():
 	woocommerce_settings = frappe.get_doc("Woocommerce Settings")
 	woocommerce_settings.secret = frappe.generate_hash()
 	woocommerce_settings.save()
 
+
 @frappe.whitelist()
 def get_series():
 	return {
-		"sales_order_series" : frappe.get_meta("Sales Order").get_options("naming_series") or "SO-WOO-",
+		"sales_order_series": frappe.get_meta("Sales Order").get_options("naming_series") or "SO-WOO-",
 	}
diff --git a/erpnext/erpnext_integrations/exotel_integration.py b/erpnext/erpnext_integrations/exotel_integration.py
index 167fcb7..1f5df67 100644
--- a/erpnext/erpnext_integrations/exotel_integration.py
+++ b/erpnext/erpnext_integrations/exotel_integration.py
@@ -6,15 +6,17 @@
 # api/method/erpnext.erpnext_integrations.exotel_integration.handle_end_call
 # api/method/erpnext.erpnext_integrations.exotel_integration.handle_missed_call
 
+
 @frappe.whitelist(allow_guest=True)
 def handle_incoming_call(**kwargs):
 	try:
 		exotel_settings = get_exotel_settings()
-		if not exotel_settings.enabled: return
+		if not exotel_settings.enabled:
+			return
 
 		call_payload = kwargs
-		status = call_payload.get('Status')
-		if status == 'free':
+		status = call_payload.get("Status")
+		if status == "free":
 			return
 
 		call_log = get_call_log(call_payload)
@@ -24,87 +26,100 @@
 			update_call_log(call_payload, call_log=call_log)
 	except Exception as e:
 		frappe.db.rollback()
-		frappe.log_error(title=_('Error in Exotel incoming call'))
+		frappe.log_error(title=_("Error in Exotel incoming call"))
 		frappe.db.commit()
 
+
 @frappe.whitelist(allow_guest=True)
 def handle_end_call(**kwargs):
-	update_call_log(kwargs, 'Completed')
+	update_call_log(kwargs, "Completed")
+
 
 @frappe.whitelist(allow_guest=True)
 def handle_missed_call(**kwargs):
-	update_call_log(kwargs, 'Missed')
+	update_call_log(kwargs, "Missed")
 
-def update_call_log(call_payload, status='Ringing', call_log=None):
+
+def update_call_log(call_payload, status="Ringing", call_log=None):
 	call_log = call_log or get_call_log(call_payload)
 	if call_log:
 		call_log.status = status
-		call_log.to = call_payload.get('DialWhomNumber')
-		call_log.duration = call_payload.get('DialCallDuration') or 0
-		call_log.recording_url = call_payload.get('RecordingUrl')
+		call_log.to = call_payload.get("DialWhomNumber")
+		call_log.duration = call_payload.get("DialCallDuration") or 0
+		call_log.recording_url = call_payload.get("RecordingUrl")
 		call_log.save(ignore_permissions=True)
 		frappe.db.commit()
 		return call_log
 
+
 def get_call_log(call_payload):
-	call_log = frappe.get_all('Call Log', {
-		'id': call_payload.get('CallSid'),
-	}, limit=1)
+	call_log = frappe.get_all(
+		"Call Log",
+		{
+			"id": call_payload.get("CallSid"),
+		},
+		limit=1,
+	)
 
 	if call_log:
-		return frappe.get_doc('Call Log', call_log[0].name)
+		return frappe.get_doc("Call Log", call_log[0].name)
+
 
 def create_call_log(call_payload):
-	call_log = frappe.new_doc('Call Log')
-	call_log.id = call_payload.get('CallSid')
-	call_log.to = call_payload.get('DialWhomNumber')
-	call_log.medium = call_payload.get('To')
-	call_log.status = 'Ringing'
-	setattr(call_log, 'from', call_payload.get('CallFrom'))
+	call_log = frappe.new_doc("Call Log")
+	call_log.id = call_payload.get("CallSid")
+	call_log.to = call_payload.get("DialWhomNumber")
+	call_log.medium = call_payload.get("To")
+	call_log.status = "Ringing"
+	setattr(call_log, "from", call_payload.get("CallFrom"))
 	call_log.save(ignore_permissions=True)
 	frappe.db.commit()
 	return call_log
 
+
 @frappe.whitelist()
 def get_call_status(call_id):
-	endpoint = get_exotel_endpoint('Calls/{call_id}.json'.format(call_id=call_id))
+	endpoint = get_exotel_endpoint("Calls/{call_id}.json".format(call_id=call_id))
 	response = requests.get(endpoint)
-	status = response.json().get('Call', {}).get('Status')
+	status = response.json().get("Call", {}).get("Status")
 	return status
 
+
 @frappe.whitelist()
 def make_a_call(from_number, to_number, caller_id):
-	endpoint = get_exotel_endpoint('Calls/connect.json?details=true')
-	response = requests.post(endpoint, data={
-		'From': from_number,
-		'To': to_number,
-		'CallerId': caller_id
-	})
+	endpoint = get_exotel_endpoint("Calls/connect.json?details=true")
+	response = requests.post(
+		endpoint, data={"From": from_number, "To": to_number, "CallerId": caller_id}
+	)
 
 	return response.json()
 
+
 def get_exotel_settings():
-	return frappe.get_single('Exotel Settings')
+	return frappe.get_single("Exotel Settings")
+
 
 def whitelist_numbers(numbers, caller_id):
-	endpoint = get_exotel_endpoint('CustomerWhitelist')
-	response = requests.post(endpoint, data={
-		'VirtualNumber': caller_id,
-		'Number': numbers,
-	})
+	endpoint = get_exotel_endpoint("CustomerWhitelist")
+	response = requests.post(
+		endpoint,
+		data={
+			"VirtualNumber": caller_id,
+			"Number": numbers,
+		},
+	)
 
 	return response
 
+
 def get_all_exophones():
-	endpoint = get_exotel_endpoint('IncomingPhoneNumbers')
+	endpoint = get_exotel_endpoint("IncomingPhoneNumbers")
 	response = requests.post(endpoint)
 	return response
 
+
 def get_exotel_endpoint(action):
 	settings = get_exotel_settings()
-	return 'https://{api_key}:{api_token}@api.exotel.com/v1/Accounts/{sid}/{action}'.format(
-		api_key=settings.api_key,
-		api_token=settings.api_token,
-		sid=settings.account_sid,
-		action=action
+	return "https://{api_key}:{api_token}@api.exotel.com/v1/Accounts/{sid}/{action}".format(
+		api_key=settings.api_key, api_token=settings.api_token, sid=settings.account_sid, action=action
 	)
diff --git a/erpnext/erpnext_integrations/stripe_integration.py b/erpnext/erpnext_integrations/stripe_integration.py
index 502cb5f..b12adc1 100644
--- a/erpnext/erpnext_integrations/stripe_integration.py
+++ b/erpnext/erpnext_integrations/stripe_integration.py
@@ -16,17 +16,21 @@
 
 	try:
 		stripe_settings.integration_request = create_request_log(stripe_settings.data, "Host", "Stripe")
-		stripe_settings.payment_plans = frappe.get_doc("Payment Request", stripe_settings.data.reference_docname).subscription_plans
+		stripe_settings.payment_plans = frappe.get_doc(
+			"Payment Request", stripe_settings.data.reference_docname
+		).subscription_plans
 		return create_subscription_on_stripe(stripe_settings)
 
 	except Exception:
 		frappe.log_error(frappe.get_traceback())
-		return{
+		return {
 			"redirect_to": frappe.redirect_to_message(
-				_('Server Error'),
-				_("It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account.")
+				_("Server Error"),
+				_(
+					"It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account."
+				),
 			),
-			"status": 401
+			"status": 401,
 		}
 
 
@@ -40,20 +44,20 @@
 		customer = stripe.Customer.create(
 			source=stripe_settings.data.stripe_token_id,
 			description=stripe_settings.data.payer_name,
-			email=stripe_settings.data.payer_email
+			email=stripe_settings.data.payer_email,
 		)
 
 		subscription = stripe.Subscription.create(customer=customer, items=items)
 
 		if subscription.status == "active":
-			stripe_settings.integration_request.db_set('status', 'Completed', update_modified=False)
+			stripe_settings.integration_request.db_set("status", "Completed", update_modified=False)
 			stripe_settings.flags.status_changed_to = "Completed"
 
 		else:
-			stripe_settings.integration_request.db_set('status', 'Failed', update_modified=False)
-			frappe.log_error('Subscription N°: ' + subscription.id, 'Stripe Payment not completed')
+			stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
+			frappe.log_error("Subscription N°: " + subscription.id, "Stripe Payment not completed")
 	except Exception:
-		stripe_settings.integration_request.db_set('status', 'Failed', update_modified=False)
+		stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
 		frappe.log_error(frappe.get_traceback())
 
 	return stripe_settings.finalize_request()
diff --git a/erpnext/erpnext_integrations/taxjar_integration.py b/erpnext/erpnext_integrations/taxjar_integration.py
index 14c86d5..b8893aa 100644
--- a/erpnext/erpnext_integrations/taxjar_integration.py
+++ b/erpnext/erpnext_integrations/taxjar_integration.py
@@ -8,14 +8,92 @@
 
 from erpnext import get_default_company, get_region
 
-SUPPORTED_COUNTRY_CODES = ["AT", "AU", "BE", "BG", "CA", "CY", "CZ", "DE", "DK", "EE", "ES", "FI",
-	"FR", "GB", "GR", "HR", "HU", "IE", "IT", "LT", "LU", "LV", "MT", "NL", "PL", "PT", "RO",
-	"SE", "SI", "SK", "US"]
-SUPPORTED_STATE_CODES = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA', 'HI', 'ID', 'IL',
-	'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE',
-	'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD',
-	'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']
-
+SUPPORTED_COUNTRY_CODES = [
+	"AT",
+	"AU",
+	"BE",
+	"BG",
+	"CA",
+	"CY",
+	"CZ",
+	"DE",
+	"DK",
+	"EE",
+	"ES",
+	"FI",
+	"FR",
+	"GB",
+	"GR",
+	"HR",
+	"HU",
+	"IE",
+	"IT",
+	"LT",
+	"LU",
+	"LV",
+	"MT",
+	"NL",
+	"PL",
+	"PT",
+	"RO",
+	"SE",
+	"SI",
+	"SK",
+	"US",
+]
+SUPPORTED_STATE_CODES = [
+	"AL",
+	"AK",
+	"AZ",
+	"AR",
+	"CA",
+	"CO",
+	"CT",
+	"DE",
+	"DC",
+	"FL",
+	"GA",
+	"HI",
+	"ID",
+	"IL",
+	"IN",
+	"IA",
+	"KS",
+	"KY",
+	"LA",
+	"ME",
+	"MD",
+	"MA",
+	"MI",
+	"MN",
+	"MS",
+	"MO",
+	"MT",
+	"NE",
+	"NV",
+	"NH",
+	"NJ",
+	"NM",
+	"NY",
+	"NC",
+	"ND",
+	"OH",
+	"OK",
+	"OR",
+	"PA",
+	"RI",
+	"SC",
+	"SD",
+	"TN",
+	"TX",
+	"UT",
+	"VT",
+	"VA",
+	"WA",
+	"WV",
+	"WI",
+	"WY",
+]
 
 
 def get_client():
@@ -30,14 +108,14 @@
 
 	if api_key and api_url:
 		client = taxjar.Client(api_key=api_key, api_url=api_url)
-		client.set_api_config('headers', {
-				'x-api-version': '2022-01-24'
-			})
+		client.set_api_config("headers", {"x-api-version": "2022-01-24"})
 		return client
 
 
 def create_transaction(doc, method):
-	TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value("TaxJar Settings", "taxjar_create_transactions")
+	TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value(
+		"TaxJar Settings", "taxjar_create_transactions"
+	)
 
 	"""Create an order transaction in TaxJar"""
 
@@ -60,10 +138,10 @@
 	if not tax_dict:
 		return
 
-	tax_dict['transaction_id'] = doc.name
-	tax_dict['transaction_date'] = frappe.utils.today()
-	tax_dict['sales_tax'] = sales_tax
-	tax_dict['amount'] = doc.total + tax_dict['shipping']
+	tax_dict["transaction_id"] = doc.name
+	tax_dict["transaction_date"] = frappe.utils.today()
+	tax_dict["sales_tax"] = sales_tax
+	tax_dict["amount"] = doc.total + tax_dict["shipping"]
 
 	try:
 		if doc.is_return:
@@ -78,7 +156,9 @@
 
 def delete_transaction(doc, method):
 	"""Delete an existing TaxJar order transaction"""
-	TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value("TaxJar Settings", "taxjar_create_transactions")
+	TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value(
+		"TaxJar Settings", "taxjar_create_transactions"
+	)
 
 	if not TAXJAR_CREATE_TRANSACTIONS:
 		return
@@ -109,10 +189,10 @@
 	line_items = [get_line_item_dict(item, doc.docstatus) for item in doc.items]
 
 	if from_shipping_state not in SUPPORTED_STATE_CODES:
-		from_shipping_state = get_state_code(from_address, 'Company')
+		from_shipping_state = get_state_code(from_address, "Company")
 
 	if to_shipping_state not in SUPPORTED_STATE_CODES:
-		to_shipping_state = get_state_code(to_address, 'Shipping')
+		to_shipping_state = get_state_code(to_address, "Shipping")
 
 	tax_dict = {
 		"from_country": from_country_code,
@@ -128,10 +208,11 @@
 		"shipping": shipping,
 		"amount": doc.net_total,
 		"plugin": "erpnext",
-		"line_items": line_items
+		"line_items": line_items,
 	}
 	return tax_dict
 
+
 def get_state_code(address, location):
 	if address is not None:
 		state_code = get_iso_3166_2_state_code(address)
@@ -142,21 +223,21 @@
 
 	return state_code
 
+
 def get_line_item_dict(item, docstatus):
 	tax_dict = dict(
-		id = item.get('idx'),
-		quantity = item.get('qty'),
-		unit_price = item.get('rate'),
-		product_tax_code = item.get('product_tax_category')
+		id=item.get("idx"),
+		quantity=item.get("qty"),
+		unit_price=item.get("rate"),
+		product_tax_code=item.get("product_tax_category"),
 	)
 
 	if docstatus == 1:
-		tax_dict.update({
-			'sales_tax':item.get('tax_collectable')
-		})
+		tax_dict.update({"sales_tax": item.get("tax_collectable")})
 
 	return tax_dict
 
+
 def set_sales_tax(doc, method):
 	TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
 	TAXJAR_CALCULATE_TAX = frappe.db.get_single_value("TaxJar Settings", "taxjar_calculate_tax")
@@ -164,7 +245,7 @@
 	if not TAXJAR_CALCULATE_TAX:
 		return
 
-	if get_region(doc.company) != 'United States':
+	if get_region(doc.company) != "United States":
 		return
 
 	if not doc.items:
@@ -197,22 +278,26 @@
 					doc.run_method("calculate_taxes_and_totals")
 					break
 			else:
-				doc.append("taxes", {
-					"charge_type": "Actual",
-					"description": "Sales Tax",
-					"account_head": TAX_ACCOUNT_HEAD,
-					"tax_amount": tax_data.amount_to_collect
-				})
+				doc.append(
+					"taxes",
+					{
+						"charge_type": "Actual",
+						"description": "Sales Tax",
+						"account_head": TAX_ACCOUNT_HEAD,
+						"tax_amount": tax_data.amount_to_collect,
+					},
+				)
 			# Assigning values to tax_collectable and taxable_amount fields in sales item table
 			for item in tax_data.breakdown.line_items:
-				doc.get('items')[cint(item.id)-1].tax_collectable = item.tax_collectable
-				doc.get('items')[cint(item.id)-1].taxable_amount = item.taxable_amount
+				doc.get("items")[cint(item.id) - 1].tax_collectable = item.tax_collectable
+				doc.get("items")[cint(item.id) - 1].taxable_amount = item.taxable_amount
 
 			doc.run_method("calculate_taxes_and_totals")
 
+
 def check_for_nexus(doc, tax_dict):
 	TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
-	if not frappe.db.get_value('TaxJar Nexus', {'region_code': tax_dict["to_state"]}):
+	if not frappe.db.get_value("TaxJar Nexus", {"region_code": tax_dict["to_state"]}):
 		for item in doc.get("items"):
 			item.tax_collectable = flt(0)
 			item.taxable_amount = flt(0)
@@ -222,13 +307,17 @@
 				doc.taxes.remove(tax)
 		return
 
+
 def check_sales_tax_exemption(doc):
 	# if the party is exempt from sales tax, then set all tax account heads to zero
 	TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
 
-	sales_tax_exempted = hasattr(doc, "exempt_from_sales_tax") and doc.exempt_from_sales_tax \
-		or frappe.db.has_column("Customer", "exempt_from_sales_tax") \
+	sales_tax_exempted = (
+		hasattr(doc, "exempt_from_sales_tax")
+		and doc.exempt_from_sales_tax
+		or frappe.db.has_column("Customer", "exempt_from_sales_tax")
 		and frappe.db.get_value("Customer", doc.customer, "exempt_from_sales_tax")
+	)
 
 	if sales_tax_exempted:
 		for tax in doc.taxes:
@@ -240,6 +329,7 @@
 	else:
 		return False
 
+
 def validate_tax_request(tax_dict):
 	"""Return the sales tax that should be collected for a given order."""
 
@@ -283,9 +373,12 @@
 
 def get_iso_3166_2_state_code(address):
 	import pycountry
+
 	country_code = frappe.db.get_value("Country", address.get("country"), "code")
 
-	error_message = _("""{0} is not a valid state! Check for typos or enter the ISO code for your state.""").format(address.get("state"))
+	error_message = _(
+		"""{0} is not a valid state! Check for typos or enter the ISO code for your state."""
+	).format(address.get("state"))
 	state = address.get("state").upper().strip()
 
 	# The max length for ISO state codes is 3, excluding the country code
@@ -306,7 +399,7 @@
 		except LookupError:
 			frappe.throw(_(error_message))
 		else:
-			return lookup_state.code.split('-')[1]
+			return lookup_state.code.split("-")[1]
 
 
 def sanitize_error_response(response):
@@ -317,7 +410,7 @@
 		"to zip": "Zipcode",
 		"to city": "City",
 		"to state": "State",
-		"to country": "Country"
+		"to country": "Country",
 	}
 
 	for k, v in sanitized_responses.items():
diff --git a/erpnext/erpnext_integrations/utils.py b/erpnext/erpnext_integrations/utils.py
index 30d3948..981486e 100644
--- a/erpnext/erpnext_integrations/utils.py
+++ b/erpnext/erpnext_integrations/utils.py
@@ -9,28 +9,24 @@
 from erpnext import get_default_company
 
 
-def validate_webhooks_request(doctype,  hmac_key, secret_key='secret'):
+def validate_webhooks_request(doctype, hmac_key, secret_key="secret"):
 	def innerfn(fn):
 		settings = frappe.get_doc(doctype)
 
 		if frappe.request and settings and settings.get(secret_key) and not frappe.flags.in_test:
 			sig = base64.b64encode(
-				hmac.new(
-					settings.get(secret_key).encode('utf8'),
-					frappe.request.data,
-					hashlib.sha256
-				).digest()
+				hmac.new(settings.get(secret_key).encode("utf8"), frappe.request.data, hashlib.sha256).digest()
 			)
 
-			if frappe.request.data and \
-				not sig == bytes(frappe.get_request_header(hmac_key).encode()):
-					frappe.throw(_("Unverified Webhook Data"))
+			if frappe.request.data and not sig == bytes(frappe.get_request_header(hmac_key).encode()):
+				frappe.throw(_("Unverified Webhook Data"))
 			frappe.set_user(settings.modified_by)
 
 		return fn
 
 	return innerfn
 
+
 def get_webhook_address(connector_name, method, exclude_uri=False, force_https=False):
 	endpoint = "erpnext.erpnext_integrations.connectors.{0}.{1}".format(connector_name, method)
 
@@ -50,34 +46,40 @@
 
 	return server_url
 
+
 def create_mode_of_payment(gateway, payment_type="General"):
-	payment_gateway_account = frappe.db.get_value("Payment Gateway Account", {
-			"payment_gateway": gateway
-		}, ['payment_account'])
+	payment_gateway_account = frappe.db.get_value(
+		"Payment Gateway Account", {"payment_gateway": gateway}, ["payment_account"]
+	)
 
 	mode_of_payment = frappe.db.exists("Mode of Payment", gateway)
 	if not mode_of_payment and payment_gateway_account:
-		mode_of_payment = frappe.get_doc({
-			"doctype": "Mode of Payment",
-			"mode_of_payment": gateway,
-			"enabled": 1,
-			"type": payment_type,
-			"accounts": [{
-				"doctype": "Mode of Payment Account",
-				"company": get_default_company(),
-				"default_account": payment_gateway_account
-			}]
-		})
+		mode_of_payment = frappe.get_doc(
+			{
+				"doctype": "Mode of Payment",
+				"mode_of_payment": gateway,
+				"enabled": 1,
+				"type": payment_type,
+				"accounts": [
+					{
+						"doctype": "Mode of Payment Account",
+						"company": get_default_company(),
+						"default_account": payment_gateway_account,
+					}
+				],
+			}
+		)
 		mode_of_payment.insert(ignore_permissions=True)
 
 		return mode_of_payment
 	elif mode_of_payment:
 		return frappe.get_doc("Mode of Payment", mode_of_payment)
 
+
 def get_tracking_url(carrier, tracking_number):
 	# Return the formatted Tracking URL.
-	tracking_url = ''
-	url_reference = frappe.get_value('Parcel Service', carrier, 'url_reference')
+	tracking_url = ""
+	url_reference = frappe.get_value("Parcel Service", carrier, "url_reference")
 	if url_reference:
-		tracking_url = frappe.render_template(url_reference, {'tracking_number': tracking_number})
+		tracking_url = frappe.render_template(url_reference, {"tracking_number": tracking_number})
 	return tracking_url
diff --git a/erpnext/exceptions.py b/erpnext/exceptions.py
index 8d6f13a..86c29d4 100644
--- a/erpnext/exceptions.py
+++ b/erpnext/exceptions.py
@@ -2,9 +2,25 @@
 
 
 # accounts
-class PartyFrozen(frappe.ValidationError): pass
-class InvalidAccountCurrency(frappe.ValidationError): pass
-class InvalidCurrency(frappe.ValidationError): pass
-class PartyDisabled(frappe.ValidationError):pass
-class InvalidAccountDimensionError(frappe.ValidationError): pass
-class MandatoryAccountDimensionError(frappe.ValidationError): pass
+class PartyFrozen(frappe.ValidationError):
+	pass
+
+
+class InvalidAccountCurrency(frappe.ValidationError):
+	pass
+
+
+class InvalidCurrency(frappe.ValidationError):
+	pass
+
+
+class PartyDisabled(frappe.ValidationError):
+	pass
+
+
+class InvalidAccountDimensionError(frappe.ValidationError):
+	pass
+
+
+class MandatoryAccountDimensionError(frappe.ValidationError):
+	pass
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index f8c4288..a2b1c41 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -12,7 +12,7 @@
 app_logo_url = "/assets/erpnext/images/erpnext-logo.svg"
 
 
-develop_version = '13.x.x-develop'
+develop_version = "13.x.x-develop"
 
 app_include_js = "erpnext.bundle.js"
 app_include_css = "erpnext.bundle.css"
@@ -25,12 +25,10 @@
 	"Communication": "public/js/communication.js",
 	"Event": "public/js/event.js",
 	"Newsletter": "public/js/newsletter.js",
-	"Contact": "public/js/contact.js"
+	"Contact": "public/js/contact.js",
 }
 
-override_doctype_class = {
-	'Address': 'erpnext.accounts.custom.address.ERPNextAddress'
-}
+override_doctype_class = {"Address": "erpnext.accounts.custom.address.ERPNextAddress"}
 
 welcome_email = "erpnext.setup.utils.welcome_email"
 
@@ -51,137 +49,232 @@
 
 on_session_creation = [
 	"erpnext.portal.utils.create_customer_or_supplier",
-	"erpnext.e_commerce.shopping_cart.utils.set_cart_count"
+	"erpnext.e_commerce.shopping_cart.utils.set_cart_count",
 ]
 on_logout = "erpnext.e_commerce.shopping_cart.utils.clear_cart_count"
 
-treeviews = ['Account', 'Cost Center', 'Warehouse', 'Item Group', 'Customer Group', 'Sales Person', 'Territory', 'Assessment Group', 'Department']
+treeviews = [
+	"Account",
+	"Cost Center",
+	"Warehouse",
+	"Item Group",
+	"Customer Group",
+	"Sales Person",
+	"Territory",
+	"Assessment Group",
+	"Department",
+]
 
 # website
-update_website_context = ["erpnext.e_commerce.shopping_cart.utils.update_website_context", "erpnext.education.doctype.education_settings.education_settings.update_website_context"]
+update_website_context = [
+	"erpnext.e_commerce.shopping_cart.utils.update_website_context",
+	"erpnext.education.doctype.education_settings.education_settings.update_website_context",
+]
 my_account_context = "erpnext.e_commerce.shopping_cart.utils.update_my_account_context"
 webform_list_context = "erpnext.controllers.website_list_for_contact.get_webform_list_context"
 
-calendars = ["Task", "Work Order", "Leave Application", "Sales Order", "Holiday List", "Course Schedule"]
+calendars = [
+	"Task",
+	"Work Order",
+	"Leave Application",
+	"Sales Order",
+	"Holiday List",
+	"Course Schedule",
+]
 
 domains = {
-	'Distribution': 'erpnext.domains.distribution',
-	'Education': 'erpnext.domains.education',
-	'Manufacturing': 'erpnext.domains.manufacturing',
-	'Retail': 'erpnext.domains.retail',
-	'Services': 'erpnext.domains.services',
+	"Distribution": "erpnext.domains.distribution",
+	"Education": "erpnext.domains.education",
+	"Manufacturing": "erpnext.domains.manufacturing",
+	"Retail": "erpnext.domains.retail",
+	"Services": "erpnext.domains.services",
 }
 
-website_generators = ["Item Group", "Website Item", "BOM", "Sales Partner",
-	"Job Opening", "Student Admission"]
+website_generators = [
+	"Item Group",
+	"Website Item",
+	"BOM",
+	"Sales Partner",
+	"Job Opening",
+	"Student Admission",
+]
 
 website_context = {
 	"favicon": "/assets/erpnext/images/erpnext-favicon.svg",
-	"splash_image": "/assets/erpnext/images/erpnext-logo.svg"
+	"splash_image": "/assets/erpnext/images/erpnext-logo.svg",
 }
 
 website_route_rules = [
 	{"from_route": "/orders", "to_route": "Sales Order"},
-	{"from_route": "/orders/<path:name>", "to_route": "order",
-		"defaults": {
-			"doctype": "Sales Order",
-			"parents": [{"label": _("Orders"), "route": "orders"}]
-		}
+	{
+		"from_route": "/orders/<path:name>",
+		"to_route": "order",
+		"defaults": {"doctype": "Sales Order", "parents": [{"label": _("Orders"), "route": "orders"}]},
 	},
 	{"from_route": "/invoices", "to_route": "Sales Invoice"},
-	{"from_route": "/invoices/<path:name>", "to_route": "order",
+	{
+		"from_route": "/invoices/<path:name>",
+		"to_route": "order",
 		"defaults": {
 			"doctype": "Sales Invoice",
-			"parents": [{"label": _("Invoices"), "route": "invoices"}]
-		}
+			"parents": [{"label": _("Invoices"), "route": "invoices"}],
+		},
 	},
 	{"from_route": "/supplier-quotations", "to_route": "Supplier Quotation"},
-	{"from_route": "/supplier-quotations/<path:name>", "to_route": "order",
+	{
+		"from_route": "/supplier-quotations/<path:name>",
+		"to_route": "order",
 		"defaults": {
 			"doctype": "Supplier Quotation",
-			"parents": [{"label": _("Supplier Quotation"), "route": "supplier-quotations"}]
-		}
+			"parents": [{"label": _("Supplier Quotation"), "route": "supplier-quotations"}],
+		},
 	},
 	{"from_route": "/purchase-orders", "to_route": "Purchase Order"},
-	{"from_route": "/purchase-orders/<path:name>", "to_route": "order",
+	{
+		"from_route": "/purchase-orders/<path:name>",
+		"to_route": "order",
 		"defaults": {
 			"doctype": "Purchase Order",
-			"parents": [{"label": _("Purchase Order"), "route": "purchase-orders"}]
-		}
+			"parents": [{"label": _("Purchase Order"), "route": "purchase-orders"}],
+		},
 	},
 	{"from_route": "/purchase-invoices", "to_route": "Purchase Invoice"},
-	{"from_route": "/purchase-invoices/<path:name>", "to_route": "order",
+	{
+		"from_route": "/purchase-invoices/<path:name>",
+		"to_route": "order",
 		"defaults": {
 			"doctype": "Purchase Invoice",
-			"parents": [{"label": _("Purchase Invoice"), "route": "purchase-invoices"}]
-		}
+			"parents": [{"label": _("Purchase Invoice"), "route": "purchase-invoices"}],
+		},
 	},
 	{"from_route": "/quotations", "to_route": "Quotation"},
-	{"from_route": "/quotations/<path:name>", "to_route": "order",
+	{
+		"from_route": "/quotations/<path:name>",
+		"to_route": "order",
 		"defaults": {
 			"doctype": "Quotation",
-			"parents": [{"label": _("Quotations"), "route": "quotations"}]
-		}
+			"parents": [{"label": _("Quotations"), "route": "quotations"}],
+		},
 	},
 	{"from_route": "/shipments", "to_route": "Delivery Note"},
-	{"from_route": "/shipments/<path:name>", "to_route": "order",
+	{
+		"from_route": "/shipments/<path:name>",
+		"to_route": "order",
 		"defaults": {
 			"doctype": "Delivery Note",
-			"parents": [{"label": _("Shipments"), "route": "shipments"}]
-		}
+			"parents": [{"label": _("Shipments"), "route": "shipments"}],
+		},
 	},
 	{"from_route": "/rfq", "to_route": "Request for Quotation"},
-	{"from_route": "/rfq/<path:name>", "to_route": "rfq",
+	{
+		"from_route": "/rfq/<path:name>",
+		"to_route": "rfq",
 		"defaults": {
 			"doctype": "Request for Quotation",
-			"parents": [{"label": _("Request for Quotation"), "route": "rfq"}]
-		}
+			"parents": [{"label": _("Request for Quotation"), "route": "rfq"}],
+		},
 	},
 	{"from_route": "/addresses", "to_route": "Address"},
-	{"from_route": "/addresses/<path:name>", "to_route": "addresses",
-		"defaults": {
-			"doctype": "Address",
-			"parents": [{"label": _("Addresses"), "route": "addresses"}]
-		}
+	{
+		"from_route": "/addresses/<path:name>",
+		"to_route": "addresses",
+		"defaults": {"doctype": "Address", "parents": [{"label": _("Addresses"), "route": "addresses"}]},
 	},
 	{"from_route": "/jobs", "to_route": "Job Opening"},
 	{"from_route": "/admissions", "to_route": "Student Admission"},
 	{"from_route": "/boms", "to_route": "BOM"},
 	{"from_route": "/timesheets", "to_route": "Timesheet"},
 	{"from_route": "/material-requests", "to_route": "Material Request"},
-	{"from_route": "/material-requests/<path:name>", "to_route": "material_request_info",
+	{
+		"from_route": "/material-requests/<path:name>",
+		"to_route": "material_request_info",
 		"defaults": {
 			"doctype": "Material Request",
-			"parents": [{"label": _("Material Request"), "route": "material-requests"}]
-		}
+			"parents": [{"label": _("Material Request"), "route": "material-requests"}],
+		},
 	},
-	{"from_route": "/project", "to_route": "Project"}
+	{"from_route": "/project", "to_route": "Project"},
 ]
 
 standard_portal_menu_items = [
 	{"title": _("Projects"), "route": "/project", "reference_doctype": "Project"},
-	{"title": _("Request for Quotations"), "route": "/rfq", "reference_doctype": "Request for Quotation", "role": "Supplier"},
-	{"title": _("Supplier Quotation"), "route": "/supplier-quotations", "reference_doctype": "Supplier Quotation", "role": "Supplier"},
-	{"title": _("Purchase Orders"), "route": "/purchase-orders", "reference_doctype": "Purchase Order", "role": "Supplier"},
-	{"title": _("Purchase Invoices"), "route": "/purchase-invoices", "reference_doctype": "Purchase Invoice", "role": "Supplier"},
-	{"title": _("Quotations"), "route": "/quotations", "reference_doctype": "Quotation", "role":"Customer"},
-	{"title": _("Orders"), "route": "/orders", "reference_doctype": "Sales Order", "role":"Customer"},
-	{"title": _("Invoices"), "route": "/invoices", "reference_doctype": "Sales Invoice", "role":"Customer"},
-	{"title": _("Shipments"), "route": "/shipments", "reference_doctype": "Delivery Note", "role":"Customer"},
-	{"title": _("Issues"), "route": "/issues", "reference_doctype": "Issue", "role":"Customer"},
+	{
+		"title": _("Request for Quotations"),
+		"route": "/rfq",
+		"reference_doctype": "Request for Quotation",
+		"role": "Supplier",
+	},
+	{
+		"title": _("Supplier Quotation"),
+		"route": "/supplier-quotations",
+		"reference_doctype": "Supplier Quotation",
+		"role": "Supplier",
+	},
+	{
+		"title": _("Purchase Orders"),
+		"route": "/purchase-orders",
+		"reference_doctype": "Purchase Order",
+		"role": "Supplier",
+	},
+	{
+		"title": _("Purchase Invoices"),
+		"route": "/purchase-invoices",
+		"reference_doctype": "Purchase Invoice",
+		"role": "Supplier",
+	},
+	{
+		"title": _("Quotations"),
+		"route": "/quotations",
+		"reference_doctype": "Quotation",
+		"role": "Customer",
+	},
+	{
+		"title": _("Orders"),
+		"route": "/orders",
+		"reference_doctype": "Sales Order",
+		"role": "Customer",
+	},
+	{
+		"title": _("Invoices"),
+		"route": "/invoices",
+		"reference_doctype": "Sales Invoice",
+		"role": "Customer",
+	},
+	{
+		"title": _("Shipments"),
+		"route": "/shipments",
+		"reference_doctype": "Delivery Note",
+		"role": "Customer",
+	},
+	{"title": _("Issues"), "route": "/issues", "reference_doctype": "Issue", "role": "Customer"},
 	{"title": _("Addresses"), "route": "/addresses", "reference_doctype": "Address"},
-	{"title": _("Timesheets"), "route": "/timesheets", "reference_doctype": "Timesheet", "role":"Customer"},
-	{"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role":"Student"},
+	{
+		"title": _("Timesheets"),
+		"route": "/timesheets",
+		"reference_doctype": "Timesheet",
+		"role": "Customer",
+	},
+	{"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role": "Student"},
 	{"title": _("Newsletter"), "route": "/newsletters", "reference_doctype": "Newsletter"},
-	{"title": _("Admission"), "route": "/admissions", "reference_doctype": "Student Admission", "role": "Student"},
-	{"title": _("Material Request"), "route": "/material-requests", "reference_doctype": "Material Request", "role": "Customer"},
+	{
+		"title": _("Admission"),
+		"route": "/admissions",
+		"reference_doctype": "Student Admission",
+		"role": "Student",
+	},
+	{
+		"title": _("Material Request"),
+		"route": "/material-requests",
+		"reference_doctype": "Material Request",
+		"role": "Customer",
+	},
 	{"title": _("Appointment Booking"), "route": "/book_appointment"},
 ]
 
 default_roles = [
-	{'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id'},
-	{'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id'},
-	{'role': 'Student', 'doctype':'Student', 'email_field': 'student_email_id'},
+	{"role": "Customer", "doctype": "Contact", "email_field": "email_id"},
+	{"role": "Supplier", "doctype": "Contact", "email_field": "email_id"},
+	{"role": "Student", "doctype": "Student", "email_field": "student_email_id"},
 ]
 
 sounds = [
@@ -189,9 +282,7 @@
 	{"name": "call-disconnect", "src": "/assets/erpnext/sounds/call-disconnect.mp3", "volume": 0.2},
 ]
 
-has_upload_permission = {
-	"Employee": "erpnext.hr.doctype.employee.employee.has_upload_permission"
-}
+has_upload_permission = {"Employee": "erpnext.hr.doctype.employee.employee.has_upload_permission"}
 
 has_website_permission = {
 	"Sales Order": "erpnext.controllers.website_list_for_contact.has_website_permission",
@@ -220,98 +311,105 @@
 	},
 	"Stock Entry": {
 		"on_submit": "erpnext.stock.doctype.material_request.material_request.update_completed_and_requested_qty",
-		"on_cancel": "erpnext.stock.doctype.material_request.material_request.update_completed_and_requested_qty"
+		"on_cancel": "erpnext.stock.doctype.material_request.material_request.update_completed_and_requested_qty",
 	},
 	"User": {
 		"after_insert": "frappe.contacts.doctype.contact.contact.update_contact",
 		"validate": "erpnext.hr.doctype.employee.employee.validate_employee_role",
-		"on_update": ["erpnext.hr.doctype.employee.employee.update_user_permissions",
-			"erpnext.portal.utils.set_default_role"]
+		"on_update": [
+			"erpnext.hr.doctype.employee.employee.update_user_permissions",
+			"erpnext.portal.utils.set_default_role",
+		],
 	},
 	"Communication": {
 		"on_update": [
 			"erpnext.support.doctype.service_level_agreement.service_level_agreement.on_communication_update",
-			"erpnext.support.doctype.issue.issue.set_first_response_time"
+			"erpnext.support.doctype.issue.issue.set_first_response_time",
 		]
 	},
 	"Sales Taxes and Charges Template": {
 		"on_update": "erpnext.e_commerce.doctype.e_commerce_settings.e_commerce_settings.validate_cart_settings"
 	},
-	"Tax Category": {
-		"validate": "erpnext.regional.india.utils.validate_tax_category"
-	},
+	"Tax Category": {"validate": "erpnext.regional.india.utils.validate_tax_category"},
 	"Sales Invoice": {
 		"on_submit": [
 			"erpnext.regional.create_transaction_log",
 			"erpnext.regional.italy.utils.sales_invoice_on_submit",
 			"erpnext.regional.saudi_arabia.utils.create_qr_code",
-			"erpnext.erpnext_integrations.taxjar_integration.create_transaction"
+			"erpnext.erpnext_integrations.taxjar_integration.create_transaction",
 		],
 		"on_cancel": [
 			"erpnext.regional.italy.utils.sales_invoice_on_cancel",
 			"erpnext.erpnext_integrations.taxjar_integration.delete_transaction",
-			"erpnext.regional.saudi_arabia.utils.delete_qr_code_file"
+			"erpnext.regional.saudi_arabia.utils.delete_qr_code_file",
 		],
 		"on_trash": "erpnext.regional.check_deletion_permission",
 		"validate": [
 			"erpnext.regional.india.utils.validate_document_name",
-			"erpnext.regional.india.utils.update_taxable_values"
-		]
+			"erpnext.regional.india.utils.update_taxable_values",
+		],
 	},
-	"POS Invoice": {
-		"on_submit": ["erpnext.regional.saudi_arabia.utils.create_qr_code"]
-	},
+	"POS Invoice": {"on_submit": ["erpnext.regional.saudi_arabia.utils.create_qr_code"]},
 	"Purchase Invoice": {
 		"validate": [
 			"erpnext.regional.india.utils.validate_reverse_charge_transaction",
 			"erpnext.regional.india.utils.update_itc_availed_fields",
 			"erpnext.regional.united_arab_emirates.utils.update_grand_total_for_rcm",
 			"erpnext.regional.united_arab_emirates.utils.validate_returns",
-			"erpnext.regional.india.utils.update_taxable_values"
+			"erpnext.regional.india.utils.update_taxable_values",
 		]
 	},
 	"Payment Entry": {
 		"validate": "erpnext.regional.india.utils.update_place_of_supply",
-		"on_submit": ["erpnext.regional.create_transaction_log", "erpnext.accounts.doctype.payment_request.payment_request.update_payment_req_status", "erpnext.accounts.doctype.dunning.dunning.resolve_dunning"],
-		"on_trash": "erpnext.regional.check_deletion_permission"
+		"on_submit": [
+			"erpnext.regional.create_transaction_log",
+			"erpnext.accounts.doctype.payment_request.payment_request.update_payment_req_status",
+			"erpnext.accounts.doctype.dunning.dunning.resolve_dunning",
+		],
+		"on_trash": "erpnext.regional.check_deletion_permission",
 	},
-	'Address': {
-		'validate': [
-			'erpnext.regional.india.utils.validate_gstin_for_india',
-			'erpnext.regional.italy.utils.set_state_code',
-			'erpnext.regional.india.utils.update_gst_category',
+	"Address": {
+		"validate": [
+			"erpnext.regional.india.utils.validate_gstin_for_india",
+			"erpnext.regional.italy.utils.set_state_code",
+			"erpnext.regional.india.utils.update_gst_category",
 		],
 	},
-	'Supplier': {
-		'validate': 'erpnext.regional.india.utils.validate_pan_for_india'
-	},
-	('Sales Invoice', 'Sales Order', 'Delivery Note', 'Purchase Invoice', 'Purchase Order', 'Purchase Receipt'): {
-		'validate': ['erpnext.regional.india.utils.set_place_of_supply']
-	},
+	"Supplier": {"validate": "erpnext.regional.india.utils.validate_pan_for_india"},
+	(
+		"Sales Invoice",
+		"Sales Order",
+		"Delivery Note",
+		"Purchase Invoice",
+		"Purchase Order",
+		"Purchase Receipt",
+	): {"validate": ["erpnext.regional.india.utils.set_place_of_supply"]},
 	"Contact": {
 		"on_trash": "erpnext.support.doctype.issue.issue.update_issue",
 		"after_insert": "erpnext.telephony.doctype.call_log.call_log.link_existing_conversations",
-		"validate": ["erpnext.crm.utils.update_lead_phone_numbers"]
+		"validate": ["erpnext.crm.utils.update_lead_phone_numbers"],
 	},
 	"Email Unsubscribe": {
 		"after_insert": "erpnext.crm.doctype.email_campaign.email_campaign.unsubscribe_recipient"
 	},
-	('Quotation', 'Sales Order', 'Sales Invoice'): {
-		'validate': ["erpnext.erpnext_integrations.taxjar_integration.set_sales_tax"]
+	("Quotation", "Sales Order", "Sales Invoice"): {
+		"validate": ["erpnext.erpnext_integrations.taxjar_integration.set_sales_tax"]
 	},
 	"Company": {
-		"on_trash": ["erpnext.regional.india.utils.delete_gst_settings_for_company",
-			"erpnext.regional.saudi_arabia.utils.delete_vat_settings_for_company"]
+		"on_trash": [
+			"erpnext.regional.india.utils.delete_gst_settings_for_company",
+			"erpnext.regional.saudi_arabia.utils.delete_vat_settings_for_company",
+		]
 	},
 	"Integration Request": {
 		"validate": "erpnext.accounts.doctype.payment_request.payment_request.validate_payment"
-	}
+	},
 }
 
 # On cancel event Payment Entry will be exempted and all linked submittable doctype will get cancelled.
 # to maintain data integrity we exempted payment entry. it will un-link when sales invoice get cancelled.
 # if payment entry not in auto cancel exempted doctypes it will cancel payment entry.
-auto_cancel_exempted_doctypes= [
+auto_cancel_exempted_doctypes = [
 	"Payment Entry",
 ]
 
@@ -326,20 +424,20 @@
 	"all": [
 		"erpnext.projects.doctype.project.project.project_status_update_reminder",
 		"erpnext.hr.doctype.interview.interview.send_interview_reminder",
-		"erpnext.crm.doctype.social_media_post.social_media_post.process_scheduled_social_media_posts"
+		"erpnext.crm.doctype.social_media_post.social_media_post.process_scheduled_social_media_posts",
 	],
 	"hourly": [
-		'erpnext.hr.doctype.daily_work_summary_group.daily_work_summary_group.trigger_emails',
+		"erpnext.hr.doctype.daily_work_summary_group.daily_work_summary_group.trigger_emails",
 		"erpnext.accounts.doctype.subscription.subscription.process_all",
 		"erpnext.accounts.doctype.gl_entry.gl_entry.rename_gle_sle_docs",
 		"erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.automatic_synchronization",
 		"erpnext.projects.doctype.project.project.hourly_reminder",
 		"erpnext.projects.doctype.project.project.collect_project_status",
-		"erpnext.hr.doctype.shift_type.shift_type.process_auto_attendance_for_all_shifts"
+		"erpnext.hr.doctype.shift_type.shift_type.process_auto_attendance_for_all_shifts",
 	],
 	"hourly_long": [
 		"erpnext.stock.doctype.repost_item_valuation.repost_item_valuation.repost_entries",
-		"erpnext.bulk_transaction.doctype.bulk_transaction_log.bulk_transaction_log.retry_failing_transaction"
+		"erpnext.bulk_transaction.doctype.bulk_transaction_log.bulk_transaction_log.retry_failing_transaction",
 	],
 	"daily": [
 		"erpnext.stock.reorder_item.reorder_item",
@@ -367,7 +465,7 @@
 		"erpnext.selling.doctype.quotation.quotation.set_expired_status",
 		"erpnext.buying.doctype.supplier_quotation.supplier_quotation.set_expired_status",
 		"erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of_accounts.send_auto_email",
-		"erpnext.hr.doctype.interview.interview.send_daily_feedback_reminder"
+		"erpnext.hr.doctype.interview.interview.send_daily_feedback_reminder",
 	],
 	"daily_long": [
 		"erpnext.setup.doctype.email_digest.email_digest.send",
@@ -377,18 +475,14 @@
 		"erpnext.hr.utils.allocate_earned_leaves",
 		"erpnext.loan_management.doctype.process_loan_security_shortfall.process_loan_security_shortfall.create_process_loan_security_shortfall",
 		"erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual.process_loan_interest_accrual_for_term_loans",
-		"erpnext.crm.doctype.lead.lead.daily_open_lead"
+		"erpnext.crm.doctype.lead.lead.daily_open_lead",
 	],
-	"weekly": [
-		"erpnext.hr.doctype.employee.employee_reminders.send_reminders_in_advance_weekly"
-	],
-	"monthly": [
-		"erpnext.hr.doctype.employee.employee_reminders.send_reminders_in_advance_monthly"
-	],
+	"weekly": ["erpnext.hr.doctype.employee.employee_reminders.send_reminders_in_advance_weekly"],
+	"monthly": ["erpnext.hr.doctype.employee.employee_reminders.send_reminders_in_advance_monthly"],
 	"monthly_long": [
 		"erpnext.accounts.deferred_revenue.process_deferred_accounting",
-		"erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual.process_loan_interest_accrual_for_demand_loans"
-	]
+		"erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual.process_loan_interest_accrual_for_demand_loans",
+	],
 }
 
 email_brand_image = "assets/erpnext/images/erpnext-logo.jpg"
@@ -407,63 +501,96 @@
 }
 
 bot_parsers = [
-	'erpnext.utilities.bot.FindItemBot',
+	"erpnext.utilities.bot.FindItemBot",
 ]
 
-get_site_info = 'erpnext.utilities.get_site_info'
+get_site_info = "erpnext.utilities.get_site_info"
 
 payment_gateway_enabled = "erpnext.accounts.utils.create_payment_gateway_account"
 
 communication_doctypes = ["Customer", "Supplier"]
 
-accounting_dimension_doctypes = ["GL Entry", "Sales Invoice", "Purchase Invoice", "Payment Entry", "Asset",
-	"Expense Claim", "Expense Claim Detail", "Expense Taxes and Charges", "Stock Entry", "Budget", "Payroll Entry", "Delivery Note",
-	"Sales Invoice Item", "Purchase Invoice Item", "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item",
-	"Purchase Receipt Item", "Stock Entry Detail", "Payment Entry Deduction", "Sales Taxes and Charges", "Purchase Taxes and Charges", "Shipping Rule",
-	"Landed Cost Item", "Asset Value Adjustment", "Loyalty Program", "Fee Schedule", "Fee Structure", "Stock Reconciliation",
-	"Travel Request", "Fees", "POS Profile", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item", "Subscription",
-	"Subscription Plan", "POS Invoice", "POS Invoice Item"
+accounting_dimension_doctypes = [
+	"GL Entry",
+	"Sales Invoice",
+	"Purchase Invoice",
+	"Payment Entry",
+	"Asset",
+	"Expense Claim",
+	"Expense Claim Detail",
+	"Expense Taxes and Charges",
+	"Stock Entry",
+	"Budget",
+	"Payroll Entry",
+	"Delivery Note",
+	"Sales Invoice Item",
+	"Purchase Invoice Item",
+	"Purchase Order Item",
+	"Journal Entry Account",
+	"Material Request Item",
+	"Delivery Note Item",
+	"Purchase Receipt Item",
+	"Stock Entry Detail",
+	"Payment Entry Deduction",
+	"Sales Taxes and Charges",
+	"Purchase Taxes and Charges",
+	"Shipping Rule",
+	"Landed Cost Item",
+	"Asset Value Adjustment",
+	"Loyalty Program",
+	"Fee Schedule",
+	"Fee Structure",
+	"Stock Reconciliation",
+	"Travel Request",
+	"Fees",
+	"POS Profile",
+	"Opening Invoice Creation Tool",
+	"Opening Invoice Creation Tool Item",
+	"Subscription",
+	"Subscription Plan",
+	"POS Invoice",
+	"POS Invoice Item",
 ]
 
 regional_overrides = {
-	'France': {
-		'erpnext.tests.test_regional.test_method': 'erpnext.regional.france.utils.test_method'
+	"France": {
+		"erpnext.tests.test_regional.test_method": "erpnext.regional.france.utils.test_method"
 	},
-	'India': {
-		'erpnext.tests.test_regional.test_method': 'erpnext.regional.india.utils.test_method',
-		'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_header': 'erpnext.regional.india.utils.get_itemised_tax_breakup_header',
-		'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_data': 'erpnext.regional.india.utils.get_itemised_tax_breakup_data',
-		'erpnext.accounts.party.get_regional_address_details': 'erpnext.regional.india.utils.get_regional_address_details',
-		'erpnext.controllers.taxes_and_totals.get_regional_round_off_accounts': 'erpnext.regional.india.utils.get_regional_round_off_accounts',
-		'erpnext.hr.utils.calculate_annual_eligible_hra_exemption': 'erpnext.regional.india.utils.calculate_annual_eligible_hra_exemption',
-		'erpnext.hr.utils.calculate_hra_exemption_for_period': 'erpnext.regional.india.utils.calculate_hra_exemption_for_period',
-		'erpnext.controllers.accounts_controller.validate_einvoice_fields': 'erpnext.regional.india.e_invoice.utils.validate_einvoice_fields',
-		'erpnext.assets.doctype.asset.asset.get_depreciation_amount': 'erpnext.regional.india.utils.get_depreciation_amount',
-		'erpnext.stock.doctype.item.item.set_item_tax_from_hsn_code': 'erpnext.regional.india.utils.set_item_tax_from_hsn_code'
+	"India": {
+		"erpnext.tests.test_regional.test_method": "erpnext.regional.india.utils.test_method",
+		"erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_header": "erpnext.regional.india.utils.get_itemised_tax_breakup_header",
+		"erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_data": "erpnext.regional.india.utils.get_itemised_tax_breakup_data",
+		"erpnext.accounts.party.get_regional_address_details": "erpnext.regional.india.utils.get_regional_address_details",
+		"erpnext.controllers.taxes_and_totals.get_regional_round_off_accounts": "erpnext.regional.india.utils.get_regional_round_off_accounts",
+		"erpnext.hr.utils.calculate_annual_eligible_hra_exemption": "erpnext.regional.india.utils.calculate_annual_eligible_hra_exemption",
+		"erpnext.hr.utils.calculate_hra_exemption_for_period": "erpnext.regional.india.utils.calculate_hra_exemption_for_period",
+		"erpnext.controllers.accounts_controller.validate_einvoice_fields": "erpnext.regional.india.e_invoice.utils.validate_einvoice_fields",
+		"erpnext.assets.doctype.asset.asset.get_depreciation_amount": "erpnext.regional.india.utils.get_depreciation_amount",
+		"erpnext.stock.doctype.item.item.set_item_tax_from_hsn_code": "erpnext.regional.india.utils.set_item_tax_from_hsn_code",
 	},
-	'United Arab Emirates': {
-		'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.united_arab_emirates.utils.update_itemised_tax_data',
-		'erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_regional_gl_entries': 'erpnext.regional.united_arab_emirates.utils.make_regional_gl_entries',
+	"United Arab Emirates": {
+		"erpnext.controllers.taxes_and_totals.update_itemised_tax_data": "erpnext.regional.united_arab_emirates.utils.update_itemised_tax_data",
+		"erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_regional_gl_entries": "erpnext.regional.united_arab_emirates.utils.make_regional_gl_entries",
 	},
-	'Saudi Arabia': {
-		'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.united_arab_emirates.utils.update_itemised_tax_data'
+	"Saudi Arabia": {
+		"erpnext.controllers.taxes_and_totals.update_itemised_tax_data": "erpnext.regional.united_arab_emirates.utils.update_itemised_tax_data"
 	},
-	'Italy': {
-		'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.italy.utils.update_itemised_tax_data',
-		'erpnext.controllers.accounts_controller.validate_regional': 'erpnext.regional.italy.utils.sales_invoice_validate',
-	}
+	"Italy": {
+		"erpnext.controllers.taxes_and_totals.update_itemised_tax_data": "erpnext.regional.italy.utils.update_itemised_tax_data",
+		"erpnext.controllers.accounts_controller.validate_regional": "erpnext.regional.italy.utils.sales_invoice_validate",
+	},
 }
 user_privacy_documents = [
 	{
-		'doctype': 'Lead',
-		'match_field': 'email_id',
-		'personal_fields': ['phone', 'mobile_no', 'fax', 'website', 'lead_name'],
+		"doctype": "Lead",
+		"match_field": "email_id",
+		"personal_fields": ["phone", "mobile_no", "fax", "website", "lead_name"],
 	},
 	{
-		'doctype': 'Opportunity',
-		'match_field': 'contact_email',
-		'personal_fields': ['contact_mobile', 'contact_display', 'customer_name'],
-	}
+		"doctype": "Opportunity",
+		"match_field": "contact_email",
+		"personal_fields": ["contact_mobile", "contact_display", "customer_name"],
+	},
 ]
 
 # ERPNext doctypes for Global Search
@@ -519,49 +646,49 @@
 		{"doctype": "Warranty Claim", "index": 47},
 	],
 	"Education": [
-		{'doctype': 'Article', 'index': 1},
-		{'doctype': 'Video', 'index': 2},
-		{'doctype': 'Topic', 'index': 3},
-		{'doctype': 'Course', 'index': 4},
-		{'doctype': 'Program', 'index': 5},
-		{'doctype': 'Quiz', 'index': 6},
-		{'doctype': 'Question', 'index': 7},
-		{'doctype': 'Fee Schedule', 'index': 8},
-		{'doctype': 'Fee Structure', 'index': 9},
-		{'doctype': 'Fees', 'index': 10},
-		{'doctype': 'Student Group', 'index': 11},
-		{'doctype': 'Student', 'index': 12},
-		{'doctype': 'Instructor', 'index': 13},
-		{'doctype': 'Course Activity', 'index': 14},
-		{'doctype': 'Quiz Activity', 'index': 15},
-		{'doctype': 'Course Enrollment', 'index': 16},
-		{'doctype': 'Program Enrollment', 'index': 17},
-		{'doctype': 'Student Language', 'index': 18},
-		{'doctype': 'Student Applicant', 'index': 19},
-		{'doctype': 'Assessment Result', 'index': 20},
-		{'doctype': 'Assessment Plan', 'index': 21},
-		{'doctype': 'Grading Scale', 'index': 22},
-		{'doctype': 'Guardian', 'index': 23},
-		{'doctype': 'Student Leave Application', 'index': 24},
-		{'doctype': 'Student Log', 'index': 25},
-		{'doctype': 'Room', 'index': 26},
-		{'doctype': 'Course Schedule', 'index': 27},
-		{'doctype': 'Student Attendance', 'index': 28},
-		{'doctype': 'Announcement', 'index': 29},
-		{'doctype': 'Student Category', 'index': 30},
-		{'doctype': 'Assessment Group', 'index': 31},
-		{'doctype': 'Student Batch Name', 'index': 32},
-		{'doctype': 'Assessment Criteria', 'index': 33},
-		{'doctype': 'Academic Year', 'index': 34},
-		{'doctype': 'Academic Term', 'index': 35},
-		{'doctype': 'School House', 'index': 36},
-		{'doctype': 'Student Admission', 'index': 37},
-		{'doctype': 'Fee Category', 'index': 38},
-		{'doctype': 'Assessment Code', 'index': 39},
-		{'doctype': 'Discussion', 'index': 40},
+		{"doctype": "Article", "index": 1},
+		{"doctype": "Video", "index": 2},
+		{"doctype": "Topic", "index": 3},
+		{"doctype": "Course", "index": 4},
+		{"doctype": "Program", "index": 5},
+		{"doctype": "Quiz", "index": 6},
+		{"doctype": "Question", "index": 7},
+		{"doctype": "Fee Schedule", "index": 8},
+		{"doctype": "Fee Structure", "index": 9},
+		{"doctype": "Fees", "index": 10},
+		{"doctype": "Student Group", "index": 11},
+		{"doctype": "Student", "index": 12},
+		{"doctype": "Instructor", "index": 13},
+		{"doctype": "Course Activity", "index": 14},
+		{"doctype": "Quiz Activity", "index": 15},
+		{"doctype": "Course Enrollment", "index": 16},
+		{"doctype": "Program Enrollment", "index": 17},
+		{"doctype": "Student Language", "index": 18},
+		{"doctype": "Student Applicant", "index": 19},
+		{"doctype": "Assessment Result", "index": 20},
+		{"doctype": "Assessment Plan", "index": 21},
+		{"doctype": "Grading Scale", "index": 22},
+		{"doctype": "Guardian", "index": 23},
+		{"doctype": "Student Leave Application", "index": 24},
+		{"doctype": "Student Log", "index": 25},
+		{"doctype": "Room", "index": 26},
+		{"doctype": "Course Schedule", "index": 27},
+		{"doctype": "Student Attendance", "index": 28},
+		{"doctype": "Announcement", "index": 29},
+		{"doctype": "Student Category", "index": 30},
+		{"doctype": "Assessment Group", "index": 31},
+		{"doctype": "Student Batch Name", "index": 32},
+		{"doctype": "Assessment Criteria", "index": 33},
+		{"doctype": "Academic Year", "index": 34},
+		{"doctype": "Academic Term", "index": 35},
+		{"doctype": "School House", "index": 36},
+		{"doctype": "Student Admission", "index": 37},
+		{"doctype": "Fee Category", "index": 38},
+		{"doctype": "Assessment Code", "index": 39},
+		{"doctype": "Discussion", "index": 40},
 	],
 }
 
 additional_timeline_content = {
-	'*': ['erpnext.telephony.doctype.call_log.call_log.get_linked_call_logs']
+	"*": ["erpnext.telephony.doctype.call_log.call_log.get_linked_call_logs"]
 }
diff --git a/erpnext/hr/doctype/appointment_letter/appointment_letter.py b/erpnext/hr/doctype/appointment_letter/appointment_letter.py
index 71327bf..a58589a 100644
--- a/erpnext/hr/doctype/appointment_letter/appointment_letter.py
+++ b/erpnext/hr/doctype/appointment_letter/appointment_letter.py
@@ -9,18 +9,21 @@
 class AppointmentLetter(Document):
 	pass
 
+
 @frappe.whitelist()
 def get_appointment_letter_details(template):
 	body = []
-	intro = frappe.get_list('Appointment Letter Template',
-		fields=['introduction', 'closing_notes'],
-		filters={'name': template}
+	intro = frappe.get_list(
+		"Appointment Letter Template",
+		fields=["introduction", "closing_notes"],
+		filters={"name": template},
 	)[0]
-	content = frappe.get_all('Appointment Letter content',
-		fields=['title', 'description'],
-		filters={'parent': template},
-		order_by='idx'
+	content = frappe.get_all(
+		"Appointment Letter content",
+		fields=["title", "description"],
+		filters={"parent": template},
+		order_by="idx",
 	)
 	body.append(intro)
-	body.append({'description': content})
+	body.append({"description": content})
 	return body
diff --git a/erpnext/hr/doctype/appraisal/appraisal.py b/erpnext/hr/doctype/appraisal/appraisal.py
index 83273f8..382c643 100644
--- a/erpnext/hr/doctype/appraisal/appraisal.py
+++ b/erpnext/hr/doctype/appraisal/appraisal.py
@@ -34,46 +34,61 @@
 			frappe.throw(_("End Date can not be less than Start Date"))
 
 	def validate_existing_appraisal(self):
-		chk = frappe.db.sql("""select name from `tabAppraisal` where employee=%s
+		chk = frappe.db.sql(
+			"""select name from `tabAppraisal` where employee=%s
 			and (status='Submitted' or status='Completed')
 			and ((start_date>=%s and start_date<=%s)
 			or (end_date>=%s and end_date<=%s))""",
-			(self.employee,self.start_date,self.end_date,self.start_date,self.end_date))
+			(self.employee, self.start_date, self.end_date, self.start_date, self.end_date),
+		)
 		if chk:
-			frappe.throw(_("Appraisal {0} created for Employee {1} in the given date range").format(chk[0][0], self.employee_name))
+			frappe.throw(
+				_("Appraisal {0} created for Employee {1} in the given date range").format(
+					chk[0][0], self.employee_name
+				)
+			)
 
 	def calculate_total(self):
-		total, total_w  = 0, 0
-		for d in self.get('goals'):
+		total, total_w = 0, 0
+		for d in self.get("goals"):
 			if d.score:
 				d.score_earned = flt(d.score) * flt(d.per_weightage) / 100
 				total = total + d.score_earned
 			total_w += flt(d.per_weightage)
 
 		if int(total_w) != 100:
-			frappe.throw(_("Total weightage assigned should be 100%.<br>It is {0}").format(str(total_w) + "%"))
+			frappe.throw(
+				_("Total weightage assigned should be 100%.<br>It is {0}").format(str(total_w) + "%")
+			)
 
-		if frappe.db.get_value("Employee", self.employee, "user_id") != \
-				frappe.session.user and total == 0:
+		if (
+			frappe.db.get_value("Employee", self.employee, "user_id") != frappe.session.user and total == 0
+		):
 			frappe.throw(_("Total cannot be zero"))
 
 		self.total_score = total
 
 	def on_submit(self):
-		frappe.db.set(self, 'status', 'Submitted')
+		frappe.db.set(self, "status", "Submitted")
 
 	def on_cancel(self):
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
+
 
 @frappe.whitelist()
 def fetch_appraisal_template(source_name, target_doc=None):
-	target_doc = get_mapped_doc("Appraisal Template", source_name, {
-		"Appraisal Template": {
-			"doctype": "Appraisal",
+	target_doc = get_mapped_doc(
+		"Appraisal Template",
+		source_name,
+		{
+			"Appraisal Template": {
+				"doctype": "Appraisal",
+			},
+			"Appraisal Template Goal": {
+				"doctype": "Appraisal Goal",
+			},
 		},
-		"Appraisal Template Goal": {
-			"doctype": "Appraisal Goal",
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return target_doc
diff --git a/erpnext/hr/doctype/appraisal/test_appraisal.py b/erpnext/hr/doctype/appraisal/test_appraisal.py
index 90c30ef..13a39f3 100644
--- a/erpnext/hr/doctype/appraisal/test_appraisal.py
+++ b/erpnext/hr/doctype/appraisal/test_appraisal.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Appraisal')
 
+
 class TestAppraisal(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/appraisal_template/appraisal_template_dashboard.py b/erpnext/hr/doctype/appraisal_template/appraisal_template_dashboard.py
index 116a3f9..476de4f 100644
--- a/erpnext/hr/doctype/appraisal_template/appraisal_template_dashboard.py
+++ b/erpnext/hr/doctype/appraisal_template/appraisal_template_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'kra_template',
-        'transactions': [
-            {
-                'items': ['Appraisal']
-            },
-        ],
-    }
+	return {
+		"fieldname": "kra_template",
+		"transactions": [
+			{"items": ["Appraisal"]},
+		],
+	}
diff --git a/erpnext/hr/doctype/appraisal_template/test_appraisal_template.py b/erpnext/hr/doctype/appraisal_template/test_appraisal_template.py
index d0e81a7..560e992 100644
--- a/erpnext/hr/doctype/appraisal_template/test_appraisal_template.py
+++ b/erpnext/hr/doctype/appraisal_template/test_appraisal_template.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Appraisal Template')
 
+
 class TestAppraisalTemplate(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/attendance/attendance.py b/erpnext/hr/doctype/attendance/attendance.py
index b1e373e..7f4bd83 100644
--- a/erpnext/hr/doctype/attendance/attendance.py
+++ b/erpnext/hr/doctype/attendance/attendance.py
@@ -13,6 +13,7 @@
 class Attendance(Document):
 	def validate(self):
 		from erpnext.controllers.status_updater import validate_status
+
 		validate_status(self.status, ["Present", "Absent", "On Leave", "Half Day", "Work From Home"])
 		validate_active_employee(self.employee)
 		self.validate_attendance_date()
@@ -24,62 +25,84 @@
 		date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining")
 
 		# leaves can be marked for future dates
-		if self.status != 'On Leave' and not self.leave_application and getdate(self.attendance_date) > getdate(nowdate()):
+		if (
+			self.status != "On Leave"
+			and not self.leave_application
+			and getdate(self.attendance_date) > getdate(nowdate())
+		):
 			frappe.throw(_("Attendance can not be marked for future dates"))
 		elif date_of_joining and getdate(self.attendance_date) < getdate(date_of_joining):
 			frappe.throw(_("Attendance date can not be less than employee's joining date"))
 
 	def validate_duplicate_record(self):
-		res = frappe.db.sql("""
+		res = frappe.db.sql(
+			"""
 			select name from `tabAttendance`
 			where employee = %s
 				and attendance_date = %s
 				and name != %s
 				and docstatus != 2
-		""", (self.employee, getdate(self.attendance_date), self.name))
+		""",
+			(self.employee, getdate(self.attendance_date), self.name),
+		)
 		if res:
-			frappe.throw(_("Attendance for employee {0} is already marked for the date {1}").format(
-				frappe.bold(self.employee), frappe.bold(self.attendance_date)))
+			frappe.throw(
+				_("Attendance for employee {0} is already marked for the date {1}").format(
+					frappe.bold(self.employee), frappe.bold(self.attendance_date)
+				)
+			)
 
 	def validate_employee_status(self):
 		if frappe.db.get_value("Employee", self.employee, "status") == "Inactive":
 			frappe.throw(_("Cannot mark attendance for an Inactive employee {0}").format(self.employee))
 
 	def check_leave_record(self):
-		leave_record = frappe.db.sql("""
+		leave_record = frappe.db.sql(
+			"""
 			select leave_type, half_day, half_day_date
 			from `tabLeave Application`
 			where employee = %s
 				and %s between from_date and to_date
 				and status = 'Approved'
 				and docstatus = 1
-		""", (self.employee, self.attendance_date), as_dict=True)
+		""",
+			(self.employee, self.attendance_date),
+			as_dict=True,
+		)
 		if leave_record:
 			for d in leave_record:
 				self.leave_type = d.leave_type
 				if d.half_day_date == getdate(self.attendance_date):
-					self.status = 'Half Day'
-					frappe.msgprint(_("Employee {0} on Half day on {1}")
-						.format(self.employee, formatdate(self.attendance_date)))
+					self.status = "Half Day"
+					frappe.msgprint(
+						_("Employee {0} on Half day on {1}").format(self.employee, formatdate(self.attendance_date))
+					)
 				else:
-					self.status = 'On Leave'
-					frappe.msgprint(_("Employee {0} is on Leave on {1}")
-						.format(self.employee, formatdate(self.attendance_date)))
+					self.status = "On Leave"
+					frappe.msgprint(
+						_("Employee {0} is on Leave on {1}").format(self.employee, formatdate(self.attendance_date))
+					)
 
 		if self.status in ("On Leave", "Half Day"):
 			if not leave_record:
-				frappe.msgprint(_("No leave record found for employee {0} on {1}")
-					.format(self.employee, formatdate(self.attendance_date)), alert=1)
+				frappe.msgprint(
+					_("No leave record found for employee {0} on {1}").format(
+						self.employee, formatdate(self.attendance_date)
+					),
+					alert=1,
+				)
 		elif self.leave_type:
 			self.leave_type = None
 			self.leave_application = None
 
 	def validate_employee(self):
-		emp = frappe.db.sql("select name from `tabEmployee` where name = %s and status = 'Active'",
-		 	self.employee)
+		emp = frappe.db.sql(
+			"select name from `tabEmployee` where name = %s and status = 'Active'", self.employee
+		)
 		if not emp:
 			frappe.throw(_("Employee {0} is not active or does not exist").format(self.employee))
 
+
 @frappe.whitelist()
 def get_events(start, end, filters=None):
 	events = []
@@ -90,10 +113,12 @@
 		return events
 
 	from frappe.desk.reportview import get_filters_cond
+
 	conditions = get_filters_cond("Attendance", filters, [])
 	add_attendance(events, start, end, conditions=conditions)
 	return events
 
+
 def add_attendance(events, start, end, conditions=None):
 	query = """select name, attendance_date, status
 		from `tabAttendance` where
@@ -102,81 +127,97 @@
 	if conditions:
 		query += conditions
 
-	for d in frappe.db.sql(query, {"from_date":start, "to_date":end}, as_dict=True):
+	for d in frappe.db.sql(query, {"from_date": start, "to_date": end}, as_dict=True):
 		e = {
 			"name": d.name,
 			"doctype": "Attendance",
 			"start": d.attendance_date,
 			"end": d.attendance_date,
 			"title": cstr(d.status),
-			"docstatus": d.docstatus
+			"docstatus": d.docstatus,
 		}
 		if e not in events:
 			events.append(e)
 
-def mark_attendance(employee, attendance_date, status, shift=None, leave_type=None, ignore_validate=False):
-	if not frappe.db.exists('Attendance', {'employee':employee, 'attendance_date':attendance_date, 'docstatus':('!=', '2')}):
-		company = frappe.db.get_value('Employee', employee, 'company')
-		attendance = frappe.get_doc({
-			'doctype': 'Attendance',
-			'employee': employee,
-			'attendance_date': attendance_date,
-			'status': status,
-			'company': company,
-			'shift': shift,
-			'leave_type': leave_type
-		})
+
+def mark_attendance(
+	employee, attendance_date, status, shift=None, leave_type=None, ignore_validate=False
+):
+	if not frappe.db.exists(
+		"Attendance",
+		{"employee": employee, "attendance_date": attendance_date, "docstatus": ("!=", "2")},
+	):
+		company = frappe.db.get_value("Employee", employee, "company")
+		attendance = frappe.get_doc(
+			{
+				"doctype": "Attendance",
+				"employee": employee,
+				"attendance_date": attendance_date,
+				"status": status,
+				"company": company,
+				"shift": shift,
+				"leave_type": leave_type,
+			}
+		)
 		attendance.flags.ignore_validate = ignore_validate
 		attendance.insert()
 		attendance.submit()
 		return attendance.name
 
+
 @frappe.whitelist()
 def mark_bulk_attendance(data):
 	import json
+
 	if isinstance(data, str):
 		data = json.loads(data)
 	data = frappe._dict(data)
-	company = frappe.get_value('Employee', data.employee, 'company')
+	company = frappe.get_value("Employee", data.employee, "company")
 	if not data.unmarked_days:
 		frappe.throw(_("Please select a date."))
 		return
 
 	for date in data.unmarked_days:
 		doc_dict = {
-			'doctype': 'Attendance',
-			'employee': data.employee,
-			'attendance_date': get_datetime(date),
-			'status': data.status,
-			'company': company,
+			"doctype": "Attendance",
+			"employee": data.employee,
+			"attendance_date": get_datetime(date),
+			"status": data.status,
+			"company": company,
 		}
 		attendance = frappe.get_doc(doc_dict).insert()
 		attendance.submit()
 
 
 def get_month_map():
-	return frappe._dict({
-		"January": 1,
-		"February": 2,
-		"March": 3,
-		"April": 4,
-		"May": 5,
-		"June": 6,
-		"July": 7,
-		"August": 8,
-		"September": 9,
-		"October": 10,
-		"November": 11,
-		"December": 12
-		})
+	return frappe._dict(
+		{
+			"January": 1,
+			"February": 2,
+			"March": 3,
+			"April": 4,
+			"May": 5,
+			"June": 6,
+			"July": 7,
+			"August": 8,
+			"September": 9,
+			"October": 10,
+			"November": 11,
+			"December": 12,
+		}
+	)
+
 
 @frappe.whitelist()
 def get_unmarked_days(employee, month, exclude_holidays=0):
 	import calendar
+
 	month_map = get_month_map()
 	today = get_datetime()
 
-	joining_date, relieving_date = frappe.get_cached_value("Employee", employee, ["date_of_joining", "relieving_date"])
+	joining_date, relieving_date = frappe.get_cached_value(
+		"Employee", employee, ["date_of_joining", "relieving_date"]
+	)
 	start_day = 1
 	end_day = calendar.monthrange(today.year, month_map[month])[1] + 1
 
@@ -186,15 +227,21 @@
 	if relieving_date and relieving_date.month == month_map[month]:
 		end_day = relieving_date.day + 1
 
-	dates_of_month = ['{}-{}-{}'.format(today.year, month_map[month], r) for r in range(start_day, end_day)]
+	dates_of_month = [
+		"{}-{}-{}".format(today.year, month_map[month], r) for r in range(start_day, end_day)
+	]
 	month_start, month_end = dates_of_month[0], dates_of_month[-1]
 
-	records = frappe.get_all("Attendance", fields=['attendance_date', 'employee'], filters=[
-		["attendance_date", ">=", month_start],
-		["attendance_date", "<=", month_end],
-		["employee", "=", employee],
-		["docstatus", "!=", 2]
-	])
+	records = frappe.get_all(
+		"Attendance",
+		fields=["attendance_date", "employee"],
+		filters=[
+			["attendance_date", ">=", month_start],
+			["attendance_date", "<=", month_end],
+			["employee", "=", employee],
+			["docstatus", "!=", 2],
+		],
+	)
 
 	marked_days = [get_datetime(record.attendance_date) for record in records]
 	if cint(exclude_holidays):
diff --git a/erpnext/hr/doctype/attendance/attendance_dashboard.py b/erpnext/hr/doctype/attendance/attendance_dashboard.py
index 4bb36a0..abed78f 100644
--- a/erpnext/hr/doctype/attendance/attendance_dashboard.py
+++ b/erpnext/hr/doctype/attendance/attendance_dashboard.py
@@ -1,10 +1,2 @@
 def get_data():
-	return {
-		'fieldname': 'attendance',
-		'transactions': [
-			{
-				'label': '',
-				'items': ['Employee Checkin']
-			}
-		]
-	}
+	return {"fieldname": "attendance", "transactions": [{"label": "", "items": ["Employee Checkin"]}]}
diff --git a/erpnext/hr/doctype/attendance/test_attendance.py b/erpnext/hr/doctype/attendance/test_attendance.py
index 585059f..058bc93 100644
--- a/erpnext/hr/doctype/attendance/test_attendance.py
+++ b/erpnext/hr/doctype/attendance/test_attendance.py
@@ -13,7 +13,8 @@
 from erpnext.hr.doctype.employee.test_employee import make_employee
 from erpnext.hr.doctype.leave_application.test_leave_application import get_first_sunday
 
-test_records = frappe.get_test_records('Attendance')
+test_records = frappe.get_test_records("Attendance")
+
 
 class TestAttendance(FrappeTestCase):
 	def setUp(self):
@@ -26,9 +27,11 @@
 	def test_mark_absent(self):
 		employee = make_employee("test_mark_absent@example.com")
 		date = nowdate()
-		frappe.db.delete('Attendance', {'employee':employee, 'attendance_date':date})
-		attendance = mark_attendance(employee, date, 'Absent')
-		fetch_attendance = frappe.get_value('Attendance', {'employee':employee, 'attendance_date':date, 'status':'Absent'})
+		frappe.db.delete("Attendance", {"employee": employee, "attendance_date": date})
+		attendance = mark_attendance(employee, date, "Absent")
+		fetch_attendance = frappe.get_value(
+			"Attendance", {"employee": employee, "attendance_date": date, "status": "Absent"}
+		)
 		self.assertEqual(attendance, fetch_attendance)
 
 	def test_unmarked_days(self):
@@ -36,12 +39,14 @@
 		previous_month = now.month - 1
 		first_day = now.replace(day=1).replace(month=previous_month).date()
 
-		employee = make_employee('test_unmarked_days@example.com', date_of_joining=add_days(first_day, -1))
-		frappe.db.delete('Attendance', {'employee': employee})
-		frappe.db.set_value('Employee', employee, 'holiday_list', self.holiday_list)
+		employee = make_employee(
+			"test_unmarked_days@example.com", date_of_joining=add_days(first_day, -1)
+		)
+		frappe.db.delete("Attendance", {"employee": employee})
+		frappe.db.set_value("Employee", employee, "holiday_list", self.holiday_list)
 
 		first_sunday = get_first_sunday(self.holiday_list, for_date=first_day)
-		mark_attendance(employee, first_day, 'Present')
+		mark_attendance(employee, first_day, "Present")
 		month_name = get_month_name(first_day)
 
 		unmarked_days = get_unmarked_days(employee, month_name)
@@ -59,13 +64,15 @@
 		previous_month = now.month - 1
 		first_day = now.replace(day=1).replace(month=previous_month).date()
 
-		employee = make_employee('test_unmarked_days@example.com', date_of_joining=add_days(first_day, -1))
-		frappe.db.delete('Attendance', {'employee': employee})
+		employee = make_employee(
+			"test_unmarked_days@example.com", date_of_joining=add_days(first_day, -1)
+		)
+		frappe.db.delete("Attendance", {"employee": employee})
 
-		frappe.db.set_value('Employee', employee, 'holiday_list', self.holiday_list)
+		frappe.db.set_value("Employee", employee, "holiday_list", self.holiday_list)
 
 		first_sunday = get_first_sunday(self.holiday_list, for_date=first_day)
-		mark_attendance(employee, first_day, 'Present')
+		mark_attendance(employee, first_day, "Present")
 		month_name = get_month_name(first_day)
 
 		unmarked_days = get_unmarked_days(employee, month_name, exclude_holidays=True)
@@ -85,14 +92,15 @@
 
 		doj = add_days(first_day, 1)
 		relieving_date = add_days(first_day, 5)
-		employee = make_employee('test_unmarked_days_as_per_doj@example.com', date_of_joining=doj,
-			relieving_date=relieving_date)
-		frappe.db.delete('Attendance', {'employee': employee})
+		employee = make_employee(
+			"test_unmarked_days_as_per_doj@example.com", date_of_joining=doj, relieving_date=relieving_date
+		)
+		frappe.db.delete("Attendance", {"employee": employee})
 
-		frappe.db.set_value('Employee', employee, 'holiday_list', self.holiday_list)
+		frappe.db.set_value("Employee", employee, "holiday_list", self.holiday_list)
 
 		attendance_date = add_days(first_day, 2)
-		mark_attendance(employee, attendance_date, 'Present')
+		mark_attendance(employee, attendance_date, "Present")
 		month_name = get_month_name(first_day)
 
 		unmarked_days = get_unmarked_days(employee, month_name)
diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.py b/erpnext/hr/doctype/attendance_request/attendance_request.py
index 8fbe7c7..78652f6 100644
--- a/erpnext/hr/doctype/attendance_request/attendance_request.py
+++ b/erpnext/hr/doctype/attendance_request/attendance_request.py
@@ -16,17 +16,19 @@
 		validate_active_employee(self.employee)
 		validate_dates(self, self.from_date, self.to_date)
 		if self.half_day:
-			if not getdate(self.from_date)<=getdate(self.half_day_date)<=getdate(self.to_date):
+			if not getdate(self.from_date) <= getdate(self.half_day_date) <= getdate(self.to_date):
 				frappe.throw(_("Half day date should be in between from date and to date"))
 
 	def on_submit(self):
 		self.create_attendance()
 
 	def on_cancel(self):
-		attendance_list = frappe.get_list("Attendance", {'employee': self.employee, 'attendance_request': self.name})
+		attendance_list = frappe.get_list(
+			"Attendance", {"employee": self.employee, "attendance_request": self.name}
+		)
 		if attendance_list:
 			for attendance in attendance_list:
-				attendance_obj = frappe.get_doc("Attendance", attendance['name'])
+				attendance_obj = frappe.get_doc("Attendance", attendance["name"])
 				attendance_obj.cancel()
 
 	def create_attendance(self):
@@ -53,15 +55,24 @@
 	def validate_if_attendance_not_applicable(self, attendance_date):
 		# Check if attendance_date is a Holiday
 		if is_holiday(self.employee, attendance_date):
-			frappe.msgprint(_("Attendance not submitted for {0} as it is a Holiday.").format(attendance_date), alert=1)
+			frappe.msgprint(
+				_("Attendance not submitted for {0} as it is a Holiday.").format(attendance_date), alert=1
+			)
 			return True
 
 		# Check if employee on Leave
-		leave_record = frappe.db.sql("""select half_day from `tabLeave Application`
+		leave_record = frappe.db.sql(
+			"""select half_day from `tabLeave Application`
 			where employee = %s and %s between from_date and to_date
-			and docstatus = 1""", (self.employee, attendance_date), as_dict=True)
+			and docstatus = 1""",
+			(self.employee, attendance_date),
+			as_dict=True,
+		)
 		if leave_record:
-			frappe.msgprint(_("Attendance not submitted for {0} as {1} on leave.").format(attendance_date, self.employee), alert=1)
+			frappe.msgprint(
+				_("Attendance not submitted for {0} as {1} on leave.").format(attendance_date, self.employee),
+				alert=1,
+			)
 			return True
 
 		return False
diff --git a/erpnext/hr/doctype/attendance_request/attendance_request_dashboard.py b/erpnext/hr/doctype/attendance_request/attendance_request_dashboard.py
index 9197057..059725c 100644
--- a/erpnext/hr/doctype/attendance_request/attendance_request_dashboard.py
+++ b/erpnext/hr/doctype/attendance_request/attendance_request_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname':  'attendance_request',
-		'transactions': [
-			{
-				'items': ['Attendance']
-			}
-		]
-	}
+	return {"fieldname": "attendance_request", "transactions": [{"items": ["Attendance"]}]}
diff --git a/erpnext/hr/doctype/attendance_request/test_attendance_request.py b/erpnext/hr/doctype/attendance_request/test_attendance_request.py
index 3f0442c..ee436f5 100644
--- a/erpnext/hr/doctype/attendance_request/test_attendance_request.py
+++ b/erpnext/hr/doctype/attendance_request/test_attendance_request.py
@@ -9,6 +9,7 @@
 
 test_dependencies = ["Employee"]
 
+
 class TestAttendanceRequest(unittest.TestCase):
 	def setUp(self):
 		for doctype in ["Attendance Request", "Attendance"]:
@@ -34,10 +35,10 @@
 			"Attendance",
 			filters={
 				"attendance_request": attendance_request.name,
-				"attendance_date": date(date.today().year, 1, 1)
+				"attendance_date": date(date.today().year, 1, 1),
 			},
 			fieldname=["status", "docstatus"],
-			as_dict=True
+			as_dict=True,
 		)
 		self.assertEqual(attendance.status, "Present")
 		self.assertEqual(attendance.docstatus, 1)
@@ -51,9 +52,9 @@
 			"Attendance",
 			filters={
 				"attendance_request": attendance_request.name,
-				"attendance_date": date(date.today().year, 1, 1)
+				"attendance_date": date(date.today().year, 1, 1),
 			},
-			fieldname="docstatus"
+			fieldname="docstatus",
 		)
 		self.assertEqual(attendance_docstatus, 2)
 
@@ -74,11 +75,11 @@
 			"Attendance",
 			filters={
 				"attendance_request": attendance_request.name,
-				"attendance_date": date(date.today().year, 1, 1)
+				"attendance_date": date(date.today().year, 1, 1),
 			},
-			fieldname="status"
+			fieldname="status",
 		)
-		self.assertEqual(attendance_status, 'Work From Home')
+		self.assertEqual(attendance_status, "Work From Home")
 
 		attendance_request.cancel()
 
@@ -88,11 +89,12 @@
 			"Attendance",
 			filters={
 				"attendance_request": attendance_request.name,
-				"attendance_date": date(date.today().year, 1, 1)
+				"attendance_date": date(date.today().year, 1, 1),
 			},
-			fieldname="docstatus"
+			fieldname="docstatus",
 		)
 		self.assertEqual(attendance_docstatus, 2)
 
+
 def get_employee():
 	return frappe.get_doc("Employee", "_T-Employee-00001")
diff --git a/erpnext/hr/doctype/branch/test_branch.py b/erpnext/hr/doctype/branch/test_branch.py
index e84c6e4..c14d4aa 100644
--- a/erpnext/hr/doctype/branch/test_branch.py
+++ b/erpnext/hr/doctype/branch/test_branch.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Branch')
+test_records = frappe.get_test_records("Branch")
diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
index 7d60515..d233226 100644
--- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
+++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
@@ -18,14 +18,15 @@
 
 
 class CompensatoryLeaveRequest(Document):
-
 	def validate(self):
 		validate_active_employee(self.employee)
 		validate_dates(self, self.work_from_date, self.work_end_date)
 		if self.half_day:
 			if not self.half_day_date:
 				frappe.throw(_("Half Day Date is mandatory"))
-			if not getdate(self.work_from_date)<=getdate(self.half_day_date)<=getdate(self.work_end_date):
+			if (
+				not getdate(self.work_from_date) <= getdate(self.half_day_date) <= getdate(self.work_end_date)
+			):
 				frappe.throw(_("Half Day Date should be in between Work From Date and Work End Date"))
 		validate_overlap(self, self.work_from_date, self.work_end_date)
 		self.validate_holidays()
@@ -34,13 +35,16 @@
 			frappe.throw(_("Leave Type is madatory"))
 
 	def validate_attendance(self):
-		attendance = frappe.get_all('Attendance',
+		attendance = frappe.get_all(
+			"Attendance",
 			filters={
-				'attendance_date': ['between', (self.work_from_date, self.work_end_date)],
-				'status': 'Present',
-				'docstatus': 1,
-				'employee': self.employee
-			}, fields=['attendance_date', 'status'])
+				"attendance_date": ["between", (self.work_from_date, self.work_end_date)],
+				"status": "Present",
+				"docstatus": 1,
+				"employee": self.employee,
+			},
+			fields=["attendance_date", "status"],
+		)
 
 		if len(attendance) < date_diff(self.work_end_date, self.work_from_date) + 1:
 			frappe.throw(_("You are not present all day(s) between compensatory leave request days"))
@@ -49,7 +53,9 @@
 		holidays = get_holiday_dates_for_employee(self.employee, self.work_from_date, self.work_end_date)
 		if len(holidays) < date_diff(self.work_end_date, self.work_from_date) + 1:
 			if date_diff(self.work_end_date, self.work_from_date):
-				msg = _("The days between {0} to {1} are not valid holidays.").format(frappe.bold(format_date(self.work_from_date)), frappe.bold(format_date(self.work_end_date)))
+				msg = _("The days between {0} to {1} are not valid holidays.").format(
+					frappe.bold(format_date(self.work_from_date)), frappe.bold(format_date(self.work_end_date))
+				)
 			else:
 				msg = _("{0} is not a holiday.").format(frappe.bold(format_date(self.work_from_date)))
 
@@ -70,13 +76,19 @@
 				leave_allocation.db_set("total_leaves_allocated", leave_allocation.total_leaves_allocated)
 
 				# generate additional ledger entry for the new compensatory leaves off
-				create_additional_leave_ledger_entry(leave_allocation, date_difference, add_days(self.work_end_date, 1))
+				create_additional_leave_ledger_entry(
+					leave_allocation, date_difference, add_days(self.work_end_date, 1)
+				)
 
 			else:
 				leave_allocation = self.create_leave_allocation(leave_period, date_difference)
 			self.db_set("leave_allocation", leave_allocation.name)
 		else:
-			frappe.throw(_("There is no leave period in between {0} and {1}").format(format_date(self.work_from_date), format_date(self.work_end_date)))
+			frappe.throw(
+				_("There is no leave period in between {0} and {1}").format(
+					format_date(self.work_from_date), format_date(self.work_end_date)
+				)
+			)
 
 	def on_cancel(self):
 		if self.leave_allocation:
@@ -93,10 +105,13 @@
 				leave_allocation.db_set("total_leaves_allocated", leave_allocation.total_leaves_allocated)
 
 				# create reverse entry on cancelation
-				create_additional_leave_ledger_entry(leave_allocation, date_difference * -1, add_days(self.work_end_date, 1))
+				create_additional_leave_ledger_entry(
+					leave_allocation, date_difference * -1, add_days(self.work_end_date, 1)
+				)
 
 	def get_existing_allocation_for_period(self, leave_period):
-		leave_allocation = frappe.db.sql("""
+		leave_allocation = frappe.db.sql(
+			"""
 			select name
 			from `tabLeave Allocation`
 			where employee=%(employee)s and leave_type=%(leave_type)s
@@ -104,12 +119,15 @@
 				and (from_date between %(from_date)s and %(to_date)s
 					or to_date between %(from_date)s and %(to_date)s
 					or (from_date < %(from_date)s and to_date > %(to_date)s))
-		""", {
-			"from_date": leave_period[0].from_date,
-			"to_date": leave_period[0].to_date,
-			"employee": self.employee,
-			"leave_type": self.leave_type
-		}, as_dict=1)
+		""",
+			{
+				"from_date": leave_period[0].from_date,
+				"to_date": leave_period[0].to_date,
+				"employee": self.employee,
+				"leave_type": self.leave_type,
+			},
+			as_dict=1,
+		)
 
 		if leave_allocation:
 			return frappe.get_doc("Leave Allocation", leave_allocation[0].name)
@@ -118,18 +136,20 @@
 
 	def create_leave_allocation(self, leave_period, date_difference):
 		is_carry_forward = frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward")
-		allocation = frappe.get_doc(dict(
-			doctype="Leave Allocation",
-			employee=self.employee,
-			employee_name=self.employee_name,
-			leave_type=self.leave_type,
-			from_date=add_days(self.work_end_date, 1),
-			to_date=leave_period[0].to_date,
-			carry_forward=cint(is_carry_forward),
-			new_leaves_allocated=date_difference,
-			total_leaves_allocated=date_difference,
-			description=self.reason
-		))
+		allocation = frappe.get_doc(
+			dict(
+				doctype="Leave Allocation",
+				employee=self.employee,
+				employee_name=self.employee_name,
+				leave_type=self.leave_type,
+				from_date=add_days(self.work_end_date, 1),
+				to_date=leave_period[0].to_date,
+				carry_forward=cint(is_carry_forward),
+				new_leaves_allocated=date_difference,
+				total_leaves_allocated=date_difference,
+				description=self.reason,
+			)
+		)
 		allocation.insert(ignore_permissions=True)
 		allocation.submit()
 		return allocation
diff --git a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py
index 5e51879..7bbec29 100644
--- a/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py
+++ b/erpnext/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py
@@ -12,12 +12,17 @@
 
 test_dependencies = ["Employee"]
 
+
 class TestCompensatoryLeaveRequest(unittest.TestCase):
 	def setUp(self):
-		frappe.db.sql(''' delete from `tabCompensatory Leave Request`''')
-		frappe.db.sql(''' delete from `tabLeave Ledger Entry`''')
-		frappe.db.sql(''' delete from `tabLeave Allocation`''')
-		frappe.db.sql(''' delete from `tabAttendance` where attendance_date in {0} '''.format((today(), add_days(today(), -1)))) #nosec
+		frappe.db.sql(""" delete from `tabCompensatory Leave Request`""")
+		frappe.db.sql(""" delete from `tabLeave Ledger Entry`""")
+		frappe.db.sql(""" delete from `tabLeave Allocation`""")
+		frappe.db.sql(
+			""" delete from `tabAttendance` where attendance_date in {0} """.format(
+				(today(), add_days(today(), -1))
+			)
+		)  # nosec
 		create_leave_period(add_months(today(), -3), add_months(today(), 3), "_Test Company")
 		create_holiday_list()
 
@@ -26,7 +31,7 @@
 		employee.save()
 
 	def test_leave_balance_on_submit(self):
-		''' check creation of leave allocation on submission of compensatory leave request '''
+		"""check creation of leave allocation on submission of compensatory leave request"""
 		employee = get_employee()
 		mark_attendance(employee)
 		compensatory_leave_request = get_compensatory_leave_request(employee.name)
@@ -34,18 +39,27 @@
 		before = get_leave_balance_on(employee.name, compensatory_leave_request.leave_type, today())
 		compensatory_leave_request.submit()
 
-		self.assertEqual(get_leave_balance_on(employee.name, compensatory_leave_request.leave_type, add_days(today(), 1)), before + 1)
+		self.assertEqual(
+			get_leave_balance_on(
+				employee.name, compensatory_leave_request.leave_type, add_days(today(), 1)
+			),
+			before + 1,
+		)
 
 	def test_leave_allocation_update_on_submit(self):
 		employee = get_employee()
 		mark_attendance(employee, date=add_days(today(), -1))
-		compensatory_leave_request = get_compensatory_leave_request(employee.name, leave_date=add_days(today(), -1))
+		compensatory_leave_request = get_compensatory_leave_request(
+			employee.name, leave_date=add_days(today(), -1)
+		)
 		compensatory_leave_request.submit()
 
 		# leave allocation creation on submit
-		leaves_allocated = frappe.db.get_value('Leave Allocation', {
-				'name': compensatory_leave_request.leave_allocation
-			}, ['total_leaves_allocated'])
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"name": compensatory_leave_request.leave_allocation},
+			["total_leaves_allocated"],
+		)
 		self.assertEqual(leaves_allocated, 1)
 
 		mark_attendance(employee)
@@ -53,20 +67,22 @@
 		compensatory_leave_request.submit()
 
 		# leave allocation updates on submission of second compensatory leave request
-		leaves_allocated = frappe.db.get_value('Leave Allocation', {
-				'name': compensatory_leave_request.leave_allocation
-			}, ['total_leaves_allocated'])
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"name": compensatory_leave_request.leave_allocation},
+			["total_leaves_allocated"],
+		)
 		self.assertEqual(leaves_allocated, 2)
 
 	def test_creation_of_leave_ledger_entry_on_submit(self):
-		''' check creation of leave ledger entry on submission of leave request '''
+		"""check creation of leave ledger entry on submission of leave request"""
 		employee = get_employee()
 		mark_attendance(employee)
 		compensatory_leave_request = get_compensatory_leave_request(employee.name)
 		compensatory_leave_request.submit()
 
 		filters = dict(transaction_name=compensatory_leave_request.leave_allocation)
-		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=filters)
+		leave_ledger_entry = frappe.get_all("Leave Ledger Entry", fields="*", filters=filters)
 
 		self.assertEqual(len(leave_ledger_entry), 1)
 		self.assertEqual(leave_ledger_entry[0].employee, compensatory_leave_request.employee)
@@ -75,60 +91,67 @@
 
 		# check reverse leave ledger entry on cancellation
 		compensatory_leave_request.cancel()
-		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=filters, order_by = 'creation desc')
+		leave_ledger_entry = frappe.get_all(
+			"Leave Ledger Entry", fields="*", filters=filters, order_by="creation desc"
+		)
 
 		self.assertEqual(len(leave_ledger_entry), 2)
 		self.assertEqual(leave_ledger_entry[0].employee, compensatory_leave_request.employee)
 		self.assertEqual(leave_ledger_entry[0].leave_type, compensatory_leave_request.leave_type)
 		self.assertEqual(leave_ledger_entry[0].leaves, -1)
 
+
 def get_compensatory_leave_request(employee, leave_date=today()):
-	prev_comp_leave_req = frappe.db.get_value('Compensatory Leave Request',
-		dict(leave_type='Compensatory Off',
+	prev_comp_leave_req = frappe.db.get_value(
+		"Compensatory Leave Request",
+		dict(
+			leave_type="Compensatory Off",
 			work_from_date=leave_date,
 			work_end_date=leave_date,
-			employee=employee), 'name')
-	if prev_comp_leave_req:
-		return frappe.get_doc('Compensatory Leave Request', prev_comp_leave_req)
-
-	return frappe.get_doc(dict(
-			doctype='Compensatory Leave Request',
 			employee=employee,
-			leave_type='Compensatory Off',
+		),
+		"name",
+	)
+	if prev_comp_leave_req:
+		return frappe.get_doc("Compensatory Leave Request", prev_comp_leave_req)
+
+	return frappe.get_doc(
+		dict(
+			doctype="Compensatory Leave Request",
+			employee=employee,
+			leave_type="Compensatory Off",
 			work_from_date=leave_date,
 			work_end_date=leave_date,
-			reason='test'
-		)).insert()
+			reason="test",
+		)
+	).insert()
 
-def mark_attendance(employee, date=today(), status='Present'):
-	if not frappe.db.exists(dict(doctype='Attendance', employee=employee.name, attendance_date=date, status='Present')):
-		attendance = frappe.get_doc({
-				"doctype": "Attendance",
-				"employee": employee.name,
-				"attendance_date": date,
-				"status": status
-		})
+
+def mark_attendance(employee, date=today(), status="Present"):
+	if not frappe.db.exists(
+		dict(doctype="Attendance", employee=employee.name, attendance_date=date, status="Present")
+	):
+		attendance = frappe.get_doc(
+			{"doctype": "Attendance", "employee": employee.name, "attendance_date": date, "status": status}
+		)
 		attendance.save()
 		attendance.submit()
 
+
 def create_holiday_list():
 	if frappe.db.exists("Holiday List", "_Test Compensatory Leave"):
 		return
 
-	holiday_list = frappe.get_doc({
-		"doctype": "Holiday List",
-		"from_date": add_months(today(), -3),
-		"to_date": add_months(today(), 3),
-		"holidays": [
-			{
-				"description": "Test Holiday",
-				"holiday_date": today()
-			},
-			{
-				"description": "Test Holiday 1",
-				"holiday_date": add_days(today(), -1)
-			}
-		],
-		"holiday_list_name": "_Test Compensatory Leave"
-	})
+	holiday_list = frappe.get_doc(
+		{
+			"doctype": "Holiday List",
+			"from_date": add_months(today(), -3),
+			"to_date": add_months(today(), 3),
+			"holidays": [
+				{"description": "Test Holiday", "holiday_date": today()},
+				{"description": "Test Holiday 1", "holiday_date": add_days(today(), -1)},
+			],
+			"holiday_list_name": "_Test Compensatory Leave",
+		}
+	)
 	holiday_list.save()
diff --git a/erpnext/hr/doctype/daily_work_summary/daily_work_summary.py b/erpnext/hr/doctype/daily_work_summary/daily_work_summary.py
index fe11c47..bcb0161 100644
--- a/erpnext/hr/doctype/daily_work_summary/daily_work_summary.py
+++ b/erpnext/hr/doctype/daily_work_summary/daily_work_summary.py
@@ -11,53 +11,59 @@
 
 class DailyWorkSummary(Document):
 	def send_mails(self, dws_group, emails):
-		'''Send emails to get daily work summary to all users \
-			in selected daily work summary group'''
-		incoming_email_account = frappe.db.get_value('Email Account',
-			dict(enable_incoming=1, default_incoming=1),
-				'email_id')
+		"""Send emails to get daily work summary to all users \
+			in selected daily work summary group"""
+		incoming_email_account = frappe.db.get_value(
+			"Email Account", dict(enable_incoming=1, default_incoming=1), "email_id"
+		)
 
-		self.db_set('email_sent_to', '\n'.join(emails))
-		frappe.sendmail(recipients=emails,
+		self.db_set("email_sent_to", "\n".join(emails))
+		frappe.sendmail(
+			recipients=emails,
 			message=dws_group.message,
 			subject=dws_group.subject,
 			reference_doctype=self.doctype,
 			reference_name=self.name,
-			reply_to=incoming_email_account)
+			reply_to=incoming_email_account,
+		)
 
 	def send_summary(self):
-		'''Send summary of all replies. Called at midnight'''
+		"""Send summary of all replies. Called at midnight"""
 		args = self.get_message_details()
 		emails = get_user_emails_from_group(self.daily_work_summary_group)
-		frappe.sendmail(recipients=emails,
-			template='daily_work_summary',
+		frappe.sendmail(
+			recipients=emails,
+			template="daily_work_summary",
 			args=args,
 			subject=_(self.daily_work_summary_group),
 			reference_doctype=self.doctype,
-			reference_name=self.name)
+			reference_name=self.name,
+		)
 
-		self.db_set('status', 'Sent')
+		self.db_set("status", "Sent")
 
 	def get_message_details(self):
-		'''Return args for template'''
-		dws_group = frappe.get_doc('Daily Work Summary Group',
-			self.daily_work_summary_group)
+		"""Return args for template"""
+		dws_group = frappe.get_doc("Daily Work Summary Group", self.daily_work_summary_group)
 
-		replies = frappe.get_all('Communication',
-			fields=['content', 'text_content', 'sender'],
-			filters=dict(reference_doctype=self.doctype,
+		replies = frappe.get_all(
+			"Communication",
+			fields=["content", "text_content", "sender"],
+			filters=dict(
+				reference_doctype=self.doctype,
 				reference_name=self.name,
-				communication_type='Communication',
-				sent_or_received='Received'),
-			order_by='creation asc')
+				communication_type="Communication",
+				sent_or_received="Received",
+			),
+			order_by="creation asc",
+		)
 
 		did_not_reply = self.email_sent_to.split()
 
 		for d in replies:
-			user = frappe.db.get_values("User",
-				{"email": d.sender},
-				["full_name", "user_image"],
-				as_dict=True)
+			user = frappe.db.get_values(
+				"User", {"email": d.sender}, ["full_name", "user_image"], as_dict=True
+			)
 
 			d.sender_name = user[0].full_name if user else d.sender
 			d.image = user[0].image if user and user[0].image else None
@@ -66,17 +72,13 @@
 			# make thumbnail image
 			try:
 				if original_image:
-					file_name = frappe.get_list('File',
-						{'file_url': original_image})
+					file_name = frappe.get_list("File", {"file_url": original_image})
 
 					if file_name:
 						file_name = file_name[0].name
-						file_doc = frappe.get_doc('File', file_name)
+						file_doc = frappe.get_doc("File", file_name)
 						thumbnail_image = file_doc.make_thumbnail(
-							set_as_thumbnail=False,
-							width=100,
-							height=100,
-							crop=True
+							set_as_thumbnail=False, width=100, height=100, crop=True
 						)
 						d.image = thumbnail_image
 			except Exception:
@@ -85,34 +87,33 @@
 			if d.sender in did_not_reply:
 				did_not_reply.remove(d.sender)
 			if d.text_content:
-				d.content = frappe.utils.md_to_html(
-					EmailReplyParser.parse_reply(d.text_content)
-				)
+				d.content = frappe.utils.md_to_html(EmailReplyParser.parse_reply(d.text_content))
 
-		did_not_reply = [(frappe.db.get_value("User", {"email": email}, "full_name") or email)
-			for email in did_not_reply]
+		did_not_reply = [
+			(frappe.db.get_value("User", {"email": email}, "full_name") or email) for email in did_not_reply
+		]
 
-		return dict(replies=replies,
+		return dict(
+			replies=replies,
 			original_message=dws_group.message,
-			title=_('Work Summary for {0}').format(
-				global_date_format(self.creation)
-			),
-			did_not_reply=', '.join(did_not_reply) or '',
-			did_not_reply_title=_('No replies from'))
+			title=_("Work Summary for {0}").format(global_date_format(self.creation)),
+			did_not_reply=", ".join(did_not_reply) or "",
+			did_not_reply_title=_("No replies from"),
+		)
 
 
 def get_user_emails_from_group(group):
-	'''Returns list of email of enabled users from the given group
+	"""Returns list of email of enabled users from the given group
 
-	:param group: Daily Work Summary Group `name`'''
+	:param group: Daily Work Summary Group `name`"""
 	group_doc = group
 	if isinstance(group_doc, str):
-		group_doc = frappe.get_doc('Daily Work Summary Group', group)
+		group_doc = frappe.get_doc("Daily Work Summary Group", group)
 
 	emails = get_users_email(group_doc)
 
 	return emails
 
+
 def get_users_email(doc):
-	return [d.email for d in doc.users
-		if frappe.db.get_value("User", d.user, "enabled")]
+	return [d.email for d in doc.users if frappe.db.get_value("User", d.user, "enabled")]
diff --git a/erpnext/hr/doctype/daily_work_summary/test_daily_work_summary.py b/erpnext/hr/doctype/daily_work_summary/test_daily_work_summary.py
index 5edfb31..7034365 100644
--- a/erpnext/hr/doctype/daily_work_summary/test_daily_work_summary.py
+++ b/erpnext/hr/doctype/daily_work_summary/test_daily_work_summary.py
@@ -9,82 +9,96 @@
 
 # test_records = frappe.get_test_records('Daily Work Summary')
 
+
 class TestDailyWorkSummary(unittest.TestCase):
 	def test_email_trigger(self):
 		self.setup_and_prepare_test()
 		for d in self.users:
 			# check that email is sent to users
 			if d.message:
-				self.assertTrue(d.email in [d.recipient for d in self.emails
-					if self.groups.subject in d.message])
+				self.assertTrue(
+					d.email in [d.recipient for d in self.emails if self.groups.subject in d.message]
+				)
 
 	def test_email_trigger_failed(self):
-		hour = '00:00'
-		if frappe.utils.nowtime().split(':')[0] == '00':
-			hour = '01:00'
+		hour = "00:00"
+		if frappe.utils.nowtime().split(":")[0] == "00":
+			hour = "01:00"
 
 		self.setup_and_prepare_test(hour)
 
 		for d in self.users:
 			# check that email is not sent to users
-			self.assertFalse(d.email in [d.recipient for d in self.emails
-				if self.groups.subject in d.message])
+			self.assertFalse(
+				d.email in [d.recipient for d in self.emails if self.groups.subject in d.message]
+			)
 
 	def test_incoming(self):
 		# get test mail with message-id as in-reply-to
 		self.setup_and_prepare_test()
 		with open(os.path.join(os.path.dirname(__file__), "test_data", "test-reply.raw"), "r") as f:
-			if not self.emails: return
-			test_mails = [f.read().replace('{{ sender }}',
-			self.users[-1].email).replace('{{ message_id }}',
-			self.emails[-1].message_id)]
+			if not self.emails:
+				return
+			test_mails = [
+				f.read()
+				.replace("{{ sender }}", self.users[-1].email)
+				.replace("{{ message_id }}", self.emails[-1].message_id)
+			]
 
 		# pull the mail
 		email_account = frappe.get_doc("Email Account", "_Test Email Account 1")
-		email_account.db_set('enable_incoming', 1)
+		email_account.db_set("enable_incoming", 1)
 		email_account.receive(test_mails=test_mails)
 
-		daily_work_summary = frappe.get_doc('Daily Work Summary',
-			frappe.get_all('Daily Work Summary')[0].name)
+		daily_work_summary = frappe.get_doc(
+			"Daily Work Summary", frappe.get_all("Daily Work Summary")[0].name
+		)
 
 		args = daily_work_summary.get_message_details()
 
-		self.assertTrue('I built Daily Work Summary!' in args.get('replies')[0].content)
+		self.assertTrue("I built Daily Work Summary!" in args.get("replies")[0].content)
 
 	def setup_and_prepare_test(self, hour=None):
-		frappe.db.sql('delete from `tabDaily Work Summary`')
-		frappe.db.sql('delete from `tabEmail Queue`')
-		frappe.db.sql('delete from `tabEmail Queue Recipient`')
-		frappe.db.sql('delete from `tabCommunication`')
-		frappe.db.sql('delete from `tabDaily Work Summary Group`')
+		frappe.db.sql("delete from `tabDaily Work Summary`")
+		frappe.db.sql("delete from `tabEmail Queue`")
+		frappe.db.sql("delete from `tabEmail Queue Recipient`")
+		frappe.db.sql("delete from `tabCommunication`")
+		frappe.db.sql("delete from `tabDaily Work Summary Group`")
 
-		self.users = frappe.get_all('User',
-			fields=['email'],
-			filters=dict(email=('!=', 'test@example.com')))
+		self.users = frappe.get_all(
+			"User", fields=["email"], filters=dict(email=("!=", "test@example.com"))
+		)
 		self.setup_groups(hour)
 
 		from erpnext.hr.doctype.daily_work_summary_group.daily_work_summary_group import trigger_emails
+
 		trigger_emails()
 
 		# check if emails are created
 
-		self.emails = frappe.db.sql("""select r.recipient, q.message, q.message_id \
+		self.emails = frappe.db.sql(
+			"""select r.recipient, q.message, q.message_id \
 			from `tabEmail Queue` as q, `tabEmail Queue Recipient` as r \
-			where q.name = r.parent""", as_dict=1)
-
+			where q.name = r.parent""",
+			as_dict=1,
+		)
 
 	def setup_groups(self, hour=None):
 		# setup email to trigger at this hour
 		if not hour:
-			hour = frappe.utils.nowtime().split(':')[0]
-			hour = hour+':00'
+			hour = frappe.utils.nowtime().split(":")[0]
+			hour = hour + ":00"
 
-		groups = frappe.get_doc(dict(doctype="Daily Work Summary Group",
-			name="Daily Work Summary",
-			users=self.users,
-			send_emails_at=hour,
-			subject="this is a subject for testing summary emails",
-			message='this is a message for testing summary emails'))
+		groups = frappe.get_doc(
+			dict(
+				doctype="Daily Work Summary Group",
+				name="Daily Work Summary",
+				users=self.users,
+				send_emails_at=hour,
+				subject="this is a subject for testing summary emails",
+				message="this is a message for testing summary emails",
+			)
+		)
 		groups.insert()
 
 		self.groups = groups
diff --git a/erpnext/hr/doctype/daily_work_summary_group/daily_work_summary_group.py b/erpnext/hr/doctype/daily_work_summary_group/daily_work_summary_group.py
index ed98168..4342f1c 100644
--- a/erpnext/hr/doctype/daily_work_summary_group/daily_work_summary_group.py
+++ b/erpnext/hr/doctype/daily_work_summary_group/daily_work_summary_group.py
@@ -15,37 +15,41 @@
 	def validate(self):
 		if self.users:
 			if not frappe.flags.in_test and not is_incoming_account_enabled():
-				frappe.throw(_('Please enable default incoming account before creating Daily Work Summary Group'))
+				frappe.throw(
+					_("Please enable default incoming account before creating Daily Work Summary Group")
+				)
 
 
 def trigger_emails():
-	'''Send emails to Employees at the given hour asking
-			them what did they work on today'''
+	"""Send emails to Employees at the given hour asking
+	them what did they work on today"""
 	groups = frappe.get_all("Daily Work Summary Group")
 	for d in groups:
 		group_doc = frappe.get_doc("Daily Work Summary Group", d)
-		if (is_current_hour(group_doc.send_emails_at)
+		if (
+			is_current_hour(group_doc.send_emails_at)
 			and not is_holiday(group_doc.holiday_list)
-			and group_doc.enabled):
+			and group_doc.enabled
+		):
 			emails = get_user_emails_from_group(group_doc)
 			# find emails relating to a company
 			if emails:
 				daily_work_summary = frappe.get_doc(
-					dict(doctype='Daily Work Summary', daily_work_summary_group=group_doc.name)
+					dict(doctype="Daily Work Summary", daily_work_summary_group=group_doc.name)
 				).insert()
 				daily_work_summary.send_mails(group_doc, emails)
 
 
 def is_current_hour(hour):
-	return frappe.utils.nowtime().split(':')[0] == hour.split(':')[0]
+	return frappe.utils.nowtime().split(":")[0] == hour.split(":")[0]
 
 
 def send_summary():
-	'''Send summary to everyone'''
-	for d in frappe.get_all('Daily Work Summary', dict(status='Open')):
-		daily_work_summary = frappe.get_doc('Daily Work Summary', d.name)
+	"""Send summary to everyone"""
+	for d in frappe.get_all("Daily Work Summary", dict(status="Open")):
+		daily_work_summary = frappe.get_doc("Daily Work Summary", d.name)
 		daily_work_summary.send_summary()
 
 
 def is_incoming_account_enabled():
-	return frappe.db.get_value('Email Account', dict(enable_incoming=1, default_incoming=1))
+	return frappe.db.get_value("Email Account", dict(enable_incoming=1, default_incoming=1))
diff --git a/erpnext/hr/doctype/department/department.py b/erpnext/hr/doctype/department/department.py
index 71300c4..159fa02 100644
--- a/erpnext/hr/doctype/department/department.py
+++ b/erpnext/hr/doctype/department/department.py
@@ -9,7 +9,7 @@
 
 
 class Department(NestedSet):
-	nsm_parent_field = 'parent_department'
+	nsm_parent_field = "parent_department"
 
 	def autoname(self):
 		root = get_root_of("Department")
@@ -26,7 +26,7 @@
 
 	def before_rename(self, old, new, merge=False):
 		# renaming consistency with abbreviation
-		if not frappe.get_cached_value('Company',  self.company,  'abbr') in new:
+		if not frappe.get_cached_value("Company", self.company, "abbr") in new:
 			new = get_abbreviated_name(new, self.company)
 
 		return new
@@ -39,17 +39,20 @@
 		super(Department, self).on_trash()
 		delete_events(self.doctype, self.name)
 
+
 def on_doctype_update():
 	frappe.db.add_index("Department", ["lft", "rgt"])
 
+
 def get_abbreviated_name(name, company):
-	abbr = frappe.get_cached_value('Company',  company,  'abbr')
-	new_name = '{0} - {1}'.format(name, abbr)
+	abbr = frappe.get_cached_value("Company", company, "abbr")
+	new_name = "{0} - {1}".format(name, abbr)
 	return new_name
 
+
 @frappe.whitelist()
 def get_children(doctype, parent=None, company=None, is_root=False):
-	condition = ''
+	condition = ""
 	var_dict = {
 		"name": get_root_of("Department"),
 		"parent": parent,
@@ -62,18 +65,26 @@
 	else:
 		condition = "parent_department = %(parent)s"
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			name as value,
 			is_group as expandable
 		from `tab{doctype}`
 		where
 			{condition}
-		order by name""".format(doctype=doctype, condition=condition), var_dict, as_dict=1)
+		order by name""".format(
+			doctype=doctype, condition=condition
+		),
+		var_dict,
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def add_node():
 	from frappe.desk.treeview import make_tree_args
+
 	args = frappe.form_dict
 	args = make_tree_args(**args)
 
diff --git a/erpnext/hr/doctype/department/test_department.py b/erpnext/hr/doctype/department/test_department.py
index 95bf663..b8c043f 100644
--- a/erpnext/hr/doctype/department/test_department.py
+++ b/erpnext/hr/doctype/department/test_department.py
@@ -6,20 +6,26 @@
 import frappe
 
 test_ignore = ["Leave Block List"]
+
+
 class TestDepartment(unittest.TestCase):
-    def test_remove_department_data(self):
-        doc = create_department("Test Department")
-        frappe.delete_doc('Department', doc.name)
+	def test_remove_department_data(self):
+		doc = create_department("Test Department")
+		frappe.delete_doc("Department", doc.name)
+
 
 def create_department(department_name, parent_department=None):
-    doc = frappe.get_doc({
-        'doctype': 'Department',
-        'is_group': 0,
-        'parent_department': parent_department,
-        'department_name': department_name,
-        'company': frappe.defaults.get_defaults().company
-    }).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Department",
+			"is_group": 0,
+			"parent_department": parent_department,
+			"department_name": department_name,
+			"company": frappe.defaults.get_defaults().company,
+		}
+	).insert()
 
-    return doc
+	return doc
 
-test_records = frappe.get_test_records('Department')
+
+test_records = frappe.get_test_records("Department")
diff --git a/erpnext/hr/doctype/department_approver/department_approver.py b/erpnext/hr/doctype/department_approver/department_approver.py
index 375ae7c..d849900 100644
--- a/erpnext/hr/doctype/department_approver/department_approver.py
+++ b/erpnext/hr/doctype/department_approver/department_approver.py
@@ -10,6 +10,7 @@
 class DepartmentApprover(Document):
 	pass
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_approvers(doctype, txt, searchfield, start, page_len, filters):
@@ -20,25 +21,44 @@
 	approvers = []
 	department_details = {}
 	department_list = []
-	employee = frappe.get_value("Employee", filters.get("employee"), ["employee_name","department", "leave_approver", "expense_approver", "shift_request_approver"], as_dict=True)
+	employee = frappe.get_value(
+		"Employee",
+		filters.get("employee"),
+		["employee_name", "department", "leave_approver", "expense_approver", "shift_request_approver"],
+		as_dict=True,
+	)
 
 	employee_department = filters.get("department") or employee.department
 	if employee_department:
-		department_details = frappe.db.get_value("Department", {"name": employee_department}, ["lft", "rgt"], as_dict=True)
+		department_details = frappe.db.get_value(
+			"Department", {"name": employee_department}, ["lft", "rgt"], as_dict=True
+		)
 	if department_details:
-		department_list = frappe.db.sql("""select name from `tabDepartment` where lft <= %s
+		department_list = frappe.db.sql(
+			"""select name from `tabDepartment` where lft <= %s
 			and rgt >= %s
 			and disabled=0
-			order by lft desc""", (department_details.lft, department_details.rgt), as_list=True)
+			order by lft desc""",
+			(department_details.lft, department_details.rgt),
+			as_list=True,
+		)
 
 	if filters.get("doctype") == "Leave Application" and employee.leave_approver:
-		approvers.append(frappe.db.get_value("User", employee.leave_approver, ['name', 'first_name', 'last_name']))
+		approvers.append(
+			frappe.db.get_value("User", employee.leave_approver, ["name", "first_name", "last_name"])
+		)
 
 	if filters.get("doctype") == "Expense Claim" and employee.expense_approver:
-		approvers.append(frappe.db.get_value("User", employee.expense_approver, ['name', 'first_name', 'last_name']))
+		approvers.append(
+			frappe.db.get_value("User", employee.expense_approver, ["name", "first_name", "last_name"])
+		)
 
 	if filters.get("doctype") == "Shift Request" and employee.shift_request_approver:
-		approvers.append(frappe.db.get_value("User", employee.shift_request_approver, ['name', 'first_name', 'last_name']))
+		approvers.append(
+			frappe.db.get_value(
+				"User", employee.shift_request_approver, ["name", "first_name", "last_name"]
+			)
+		)
 
 	if filters.get("doctype") == "Leave Application":
 		parentfield = "leave_approvers"
@@ -51,15 +71,21 @@
 		field_name = "Shift Request Approver"
 	if department_list:
 		for d in department_list:
-			approvers += frappe.db.sql("""select user.name, user.first_name, user.last_name from
+			approvers += frappe.db.sql(
+				"""select user.name, user.first_name, user.last_name from
 				tabUser user, `tabDepartment Approver` approver where
 				approver.parent = %s
 				and user.name like %s
 				and approver.parentfield = %s
-				and approver.approver=user.name""",(d, "%" + txt + "%", parentfield), as_list=True)
+				and approver.approver=user.name""",
+				(d, "%" + txt + "%", parentfield),
+				as_list=True,
+			)
 
 	if len(approvers) == 0:
-		error_msg = _("Please set {0} for the Employee: {1}").format(field_name, frappe.bold(employee.employee_name))
+		error_msg = _("Please set {0} for the Employee: {1}").format(
+			field_name, frappe.bold(employee.employee_name)
+		)
 		if department_list:
 			error_msg += _(" or for Department: {0}").format(frappe.bold(employee_department))
 		frappe.throw(error_msg, title=_(field_name + " Missing"))
diff --git a/erpnext/hr/doctype/designation/test_designation.py b/erpnext/hr/doctype/designation/test_designation.py
index f2d6d36..0840d13 100644
--- a/erpnext/hr/doctype/designation/test_designation.py
+++ b/erpnext/hr/doctype/designation/test_designation.py
@@ -5,15 +5,18 @@
 
 # test_records = frappe.get_test_records('Designation')
 
-def create_designation(**args):
-    args = frappe._dict(args)
-    if frappe.db.exists("Designation", args.designation_name or "_Test designation"):
-        return frappe.get_doc("Designation", args.designation_name or "_Test designation")
 
-    designation = frappe.get_doc({
-        "doctype": "Designation",
-        "designation_name": args.designation_name or "_Test designation",
-        "description": args.description or "_Test description"
-    })
-    designation.save()
-    return designation
+def create_designation(**args):
+	args = frappe._dict(args)
+	if frappe.db.exists("Designation", args.designation_name or "_Test designation"):
+		return frappe.get_doc("Designation", args.designation_name or "_Test designation")
+
+	designation = frappe.get_doc(
+		{
+			"doctype": "Designation",
+			"designation_name": args.designation_name or "_Test designation",
+			"description": args.description or "_Test description",
+		}
+	)
+	designation.save()
+	return designation
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index 6e52eb9..d6a911d 100755
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -18,22 +18,25 @@
 
 class EmployeeUserDisabledError(frappe.ValidationError):
 	pass
+
+
 class InactiveEmployeeStatusError(frappe.ValidationError):
 	pass
 
+
 class Employee(NestedSet):
-	nsm_parent_field = 'reports_to'
+	nsm_parent_field = "reports_to"
 
 	def autoname(self):
 		naming_method = frappe.db.get_value("HR Settings", None, "emp_created_by")
 		if not naming_method:
 			throw(_("Please setup Employee Naming System in Human Resource > HR Settings"))
 		else:
-			if naming_method == 'Naming Series':
+			if naming_method == "Naming Series":
 				set_name_by_naming_series(self)
-			elif naming_method == 'Employee Number':
+			elif naming_method == "Employee Number":
 				self.name = self.employee_number
-			elif naming_method == 'Full Name':
+			elif naming_method == "Full Name":
 				self.set_employee_name()
 				self.name = self.employee_name
 
@@ -41,6 +44,7 @@
 
 	def validate(self):
 		from erpnext.controllers.status_updater import validate_status
+
 		validate_status(self.status, ["Active", "Inactive", "Suspended", "Left"])
 
 		self.employee = self.name
@@ -58,25 +62,25 @@
 		else:
 			existing_user_id = frappe.db.get_value("Employee", self.name, "user_id")
 			if existing_user_id:
-				remove_user_permission(
-					"Employee", self.name, existing_user_id)
+				remove_user_permission("Employee", self.name, existing_user_id)
 
 	def after_rename(self, old, new, merge):
 		self.db_set("employee", new)
 
 	def set_employee_name(self):
-		self.employee_name = ' '.join(filter(lambda x: x, [self.first_name, self.middle_name, self.last_name]))
+		self.employee_name = " ".join(
+			filter(lambda x: x, [self.first_name, self.middle_name, self.last_name])
+		)
 
 	def validate_user_details(self):
 		if self.user_id:
-			data = frappe.db.get_value('User',
-				self.user_id, ['enabled', 'user_image'], as_dict=1)
+			data = frappe.db.get_value("User", self.user_id, ["enabled", "user_image"], as_dict=1)
 
 			if not data:
 				self.user_id = None
 				return
 
-			if data.get("user_image") and self.image == '':
+			if data.get("user_image") and self.image == "":
 				self.image = data.get("user_image")
 			self.validate_for_enabled_user_id(data.get("enabled", 0))
 			self.validate_duplicate_user_id()
@@ -93,14 +97,14 @@
 		self.update_approver_role()
 
 	def update_user_permissions(self):
-		if not self.create_user_permission: return
-		if not has_permission('User Permission', ptype='write', raise_exception=False): return
+		if not self.create_user_permission:
+			return
+		if not has_permission("User Permission", ptype="write", raise_exception=False):
+			return
 
-		employee_user_permission_exists = frappe.db.exists('User Permission', {
-			'allow': 'Employee',
-			'for_value': self.name,
-			'user': self.user_id
-		})
+		employee_user_permission_exists = frappe.db.exists(
+			"User Permission", {"allow": "Employee", "for_value": self.name, "user": self.user_id}
+		)
 
 		if employee_user_permission_exists:
 			return
@@ -137,12 +141,14 @@
 			if not user.user_image:
 				user.user_image = self.image
 				try:
-					frappe.get_doc({
-						"doctype": "File",
-						"file_url": self.image,
-						"attached_to_doctype": "User",
-						"attached_to_name": self.user_id
-					}).insert(ignore_if_duplicate=True)
+					frappe.get_doc(
+						{
+							"doctype": "File",
+							"file_url": self.image,
+							"attached_to_doctype": "User",
+							"attached_to_name": self.user_id,
+						}
+					).insert(ignore_if_duplicate=True)
 				except frappe.DuplicateEntryError:
 					# already exists
 					pass
@@ -164,16 +170,32 @@
 		if self.date_of_birth and getdate(self.date_of_birth) > getdate(today()):
 			throw(_("Date of Birth cannot be greater than today."))
 
-		if self.date_of_birth and self.date_of_joining and getdate(self.date_of_birth) >= getdate(self.date_of_joining):
+		if (
+			self.date_of_birth
+			and self.date_of_joining
+			and getdate(self.date_of_birth) >= getdate(self.date_of_joining)
+		):
 			throw(_("Date of Joining must be greater than Date of Birth"))
 
-		elif self.date_of_retirement and self.date_of_joining and (getdate(self.date_of_retirement) <= getdate(self.date_of_joining)):
+		elif (
+			self.date_of_retirement
+			and self.date_of_joining
+			and (getdate(self.date_of_retirement) <= getdate(self.date_of_joining))
+		):
 			throw(_("Date Of Retirement must be greater than Date of Joining"))
 
-		elif self.relieving_date and self.date_of_joining and (getdate(self.relieving_date) < getdate(self.date_of_joining)):
+		elif (
+			self.relieving_date
+			and self.date_of_joining
+			and (getdate(self.relieving_date) < getdate(self.date_of_joining))
+		):
 			throw(_("Relieving Date must be greater than or equal to Date of Joining"))
 
-		elif self.contract_end_date and self.date_of_joining and (getdate(self.contract_end_date) <= getdate(self.date_of_joining)):
+		elif (
+			self.contract_end_date
+			and self.date_of_joining
+			and (getdate(self.contract_end_date) <= getdate(self.date_of_joining))
+		):
 			throw(_("Contract End Date must be greater than Date of Joining"))
 
 	def validate_email(self):
@@ -189,14 +211,20 @@
 			self.prefered_email = preferred_email
 
 	def validate_status(self):
-		if self.status == 'Left':
-			reports_to = frappe.db.get_all('Employee',
-				filters={'reports_to': self.name, 'status': "Active"},
-				fields=['name','employee_name']
+		if self.status == "Left":
+			reports_to = frappe.db.get_all(
+				"Employee",
+				filters={"reports_to": self.name, "status": "Active"},
+				fields=["name", "employee_name"],
 			)
 			if reports_to:
-				link_to_employees = [frappe.utils.get_link_to_form('Employee', employee.name, label=employee.employee_name) for employee in reports_to]
-				message = _("The following employees are currently still reporting to {0}:").format(frappe.bold(self.employee_name))
+				link_to_employees = [
+					frappe.utils.get_link_to_form("Employee", employee.name, label=employee.employee_name)
+					for employee in reports_to
+				]
+				message = _("The following employees are currently still reporting to {0}:").format(
+					frappe.bold(self.employee_name)
+				)
 				message += "<br><br><ul><li>" + "</li><li>".join(link_to_employees)
 				message += "</li></ul><br>"
 				message += _("Please make sure the employees above report to another Active employee.")
@@ -205,7 +233,7 @@
 				throw(_("Please enter relieving date."))
 
 	def validate_for_enabled_user_id(self, enabled):
-		if not self.status == 'Active':
+		if not self.status == "Active":
 			return
 
 		if enabled is None:
@@ -214,11 +242,16 @@
 			frappe.throw(_("User {0} is disabled").format(self.user_id), EmployeeUserDisabledError)
 
 	def validate_duplicate_user_id(self):
-		employee = frappe.db.sql_list("""select name from `tabEmployee` where
-			user_id=%s and status='Active' and name!=%s""", (self.user_id, self.name))
+		employee = frappe.db.sql_list(
+			"""select name from `tabEmployee` where
+			user_id=%s and status='Active' and name!=%s""",
+			(self.user_id, self.name),
+		)
 		if employee:
-			throw(_("User {0} is already assigned to Employee {1}").format(
-				self.user_id, employee[0]), frappe.DuplicateEntryError)
+			throw(
+				_("User {0} is already assigned to Employee {1}").format(self.user_id, employee[0]),
+				frappe.DuplicateEntryError,
+			)
 
 	def validate_reports_to(self):
 		if self.reports_to == self.name:
@@ -227,17 +260,25 @@
 	def on_trash(self):
 		self.update_nsm_model()
 		delete_events(self.doctype, self.name)
-		if frappe.db.exists("Employee Transfer", {'new_employee_id': self.name, 'docstatus': 1}):
-			emp_transfer = frappe.get_doc("Employee Transfer", {'new_employee_id': self.name, 'docstatus': 1})
-			emp_transfer.db_set("new_employee_id", '')
+		if frappe.db.exists("Employee Transfer", {"new_employee_id": self.name, "docstatus": 1}):
+			emp_transfer = frappe.get_doc(
+				"Employee Transfer", {"new_employee_id": self.name, "docstatus": 1}
+			)
+			emp_transfer.db_set("new_employee_id", "")
 
 	def validate_preferred_email(self):
 		if self.prefered_contact_email and not self.get(scrub(self.prefered_contact_email)):
 			frappe.msgprint(_("Please enter {0}").format(self.prefered_contact_email))
 
 	def validate_onboarding_process(self):
-		employee_onboarding = frappe.get_all("Employee Onboarding",
-			filters={"job_applicant": self.job_applicant, "docstatus": 1, "boarding_status": ("!=", "Completed")})
+		employee_onboarding = frappe.get_all(
+			"Employee Onboarding",
+			filters={
+				"job_applicant": self.job_applicant,
+				"docstatus": 1,
+				"boarding_status": ("!=", "Completed"),
+			},
+		)
 		if employee_onboarding:
 			doc = frappe.get_doc("Employee Onboarding", employee_onboarding[0].name)
 			doc.validate_employee_creation()
@@ -245,20 +286,26 @@
 
 	def reset_employee_emails_cache(self):
 		prev_doc = self.get_doc_before_save() or {}
-		cell_number = cstr(self.get('cell_number'))
-		prev_number = cstr(prev_doc.get('cell_number'))
-		if (cell_number != prev_number or
-			self.get('user_id') != prev_doc.get('user_id')):
-			frappe.cache().hdel('employees_with_number', cell_number)
-			frappe.cache().hdel('employees_with_number', prev_number)
+		cell_number = cstr(self.get("cell_number"))
+		prev_number = cstr(prev_doc.get("cell_number"))
+		if cell_number != prev_number or self.get("user_id") != prev_doc.get("user_id"):
+			frappe.cache().hdel("employees_with_number", cell_number)
+			frappe.cache().hdel("employees_with_number", prev_number)
+
 
 def get_timeline_data(doctype, name):
-	'''Return timeline for attendance'''
-	return dict(frappe.db.sql('''select unix_timestamp(attendance_date), count(*)
+	"""Return timeline for attendance"""
+	return dict(
+		frappe.db.sql(
+			"""select unix_timestamp(attendance_date), count(*)
 		from `tabAttendance` where employee=%s
 			and attendance_date > date_sub(curdate(), interval 1 year)
 			and status in ('Present', 'Half Day')
-			group by attendance_date''', name))
+			group by attendance_date""",
+			name,
+		)
+	)
+
 
 @frappe.whitelist()
 def get_retirement_date(date_of_birth=None):
@@ -266,14 +313,15 @@
 	if date_of_birth:
 		try:
 			retirement_age = int(frappe.db.get_single_value("HR Settings", "retirement_age") or 60)
-			dt = add_years(getdate(date_of_birth),retirement_age)
-			ret = {'date_of_retirement': dt.strftime('%Y-%m-%d')}
+			dt = add_years(getdate(date_of_birth), retirement_age)
+			ret = {"date_of_retirement": dt.strftime("%Y-%m-%d")}
 		except ValueError:
 			# invalid date
 			ret = {}
 
 	return ret
 
+
 def validate_employee_role(doc, method):
 	# called via User hook
 	if "Employee" in [d.role for d in doc.get("roles")]:
@@ -281,39 +329,52 @@
 			frappe.msgprint(_("Please set User ID field in an Employee record to set Employee Role"))
 			doc.get("roles").remove(doc.get("roles", {"role": "Employee"})[0])
 
+
 def update_user_permissions(doc, method):
 	# called via User hook
 	if "Employee" in [d.role for d in doc.get("roles")]:
-		if not has_permission('User Permission', ptype='write', raise_exception=False): return
+		if not has_permission("User Permission", ptype="write", raise_exception=False):
+			return
 		employee = frappe.get_doc("Employee", {"user_id": doc.name})
 		employee.update_user_permissions()
 
+
 def get_employee_email(employee_doc):
-	return employee_doc.get("user_id") or employee_doc.get("personal_email") or employee_doc.get("company_email")
+	return (
+		employee_doc.get("user_id")
+		or employee_doc.get("personal_email")
+		or employee_doc.get("company_email")
+	)
+
 
 def get_holiday_list_for_employee(employee, raise_exception=True):
 	if employee:
 		holiday_list, company = frappe.db.get_value("Employee", employee, ["holiday_list", "company"])
 	else:
-		holiday_list=''
-		company=frappe.db.get_value("Global Defaults", None, "default_company")
+		holiday_list = ""
+		company = frappe.db.get_value("Global Defaults", None, "default_company")
 
 	if not holiday_list:
-		holiday_list = frappe.get_cached_value('Company',  company,  "default_holiday_list")
+		holiday_list = frappe.get_cached_value("Company", company, "default_holiday_list")
 
 	if not holiday_list and raise_exception:
-		frappe.throw(_('Please set a default Holiday List for Employee {0} or Company {1}').format(employee, company))
+		frappe.throw(
+			_("Please set a default Holiday List for Employee {0} or Company {1}").format(employee, company)
+		)
 
 	return holiday_list
 
-def is_holiday(employee, date=None, raise_exception=True, only_non_weekly=False, with_description=False):
-	'''
+
+def is_holiday(
+	employee, date=None, raise_exception=True, only_non_weekly=False, with_description=False
+):
+	"""
 	Returns True if given Employee has an holiday on the given date
-		:param employee: Employee `name`
-		:param date: Date to check. Will check for today if None
-		:param raise_exception: Raise an exception if no holiday list found, default is True
-		:param only_non_weekly: Check only non-weekly holidays, default is False
-	'''
+	        :param employee: Employee `name`
+	        :param date: Date to check. Will check for today if None
+	        :param raise_exception: Raise an exception if no holiday list found, default is True
+	        :param only_non_weekly: Check only non-weekly holidays, default is False
+	"""
 
 	holiday_list = get_holiday_list_for_employee(employee, raise_exception)
 	if not date:
@@ -322,34 +383,28 @@
 	if not holiday_list:
 		return False
 
-	filters = {
-		'parent': holiday_list,
-		'holiday_date': date
-	}
+	filters = {"parent": holiday_list, "holiday_date": date}
 	if only_non_weekly:
-		filters['weekly_off'] = False
+		filters["weekly_off"] = False
 
-	holidays = frappe.get_all(
-		'Holiday',
-		fields=['description'],
-		filters=filters,
-		pluck='description'
-	)
+	holidays = frappe.get_all("Holiday", fields=["description"], filters=filters, pluck="description")
 
 	if with_description:
 		return len(holidays) > 0, holidays
 
 	return len(holidays) > 0
 
+
 @frappe.whitelist()
-def deactivate_sales_person(status = None, employee = None):
+def deactivate_sales_person(status=None, employee=None):
 	if status == "Left":
 		sales_person = frappe.db.get_value("Sales Person", {"Employee": employee})
 		if sales_person:
 			frappe.db.set_value("Sales Person", sales_person, "enabled", 0)
 
+
 @frappe.whitelist()
-def create_user(employee, user = None, email=None):
+def create_user(employee, user=None, email=None):
 	emp = frappe.get_doc("Employee", employee)
 
 	employee_name = emp.employee_name.split(" ")
@@ -367,93 +422,98 @@
 		emp.prefered_email = email
 
 	user = frappe.new_doc("User")
-	user.update({
-		"name": emp.employee_name,
-		"email": emp.prefered_email,
-		"enabled": 1,
-		"first_name": first_name,
-		"middle_name": middle_name,
-		"last_name": last_name,
-		"gender": emp.gender,
-		"birth_date": emp.date_of_birth,
-		"phone": emp.cell_number,
-		"bio": emp.bio
-	})
+	user.update(
+		{
+			"name": emp.employee_name,
+			"email": emp.prefered_email,
+			"enabled": 1,
+			"first_name": first_name,
+			"middle_name": middle_name,
+			"last_name": last_name,
+			"gender": emp.gender,
+			"birth_date": emp.date_of_birth,
+			"phone": emp.cell_number,
+			"bio": emp.bio,
+		}
+	)
 	user.insert()
 	return user.name
 
+
 def get_all_employee_emails(company):
-	'''Returns list of employee emails either based on user_id or company_email'''
-	employee_list = frappe.get_all('Employee',
-		fields=['name','employee_name'],
-		filters={
-			'status': 'Active',
-			'company': company
-		}
+	"""Returns list of employee emails either based on user_id or company_email"""
+	employee_list = frappe.get_all(
+		"Employee", fields=["name", "employee_name"], filters={"status": "Active", "company": company}
 	)
 	employee_emails = []
 	for employee in employee_list:
 		if not employee:
 			continue
-		user, company_email, personal_email = frappe.db.get_value('Employee',
-			employee, ['user_id', 'company_email', 'personal_email'])
+		user, company_email, personal_email = frappe.db.get_value(
+			"Employee", employee, ["user_id", "company_email", "personal_email"]
+		)
 		email = user or company_email or personal_email
 		if email:
 			employee_emails.append(email)
 	return employee_emails
 
+
 def get_employee_emails(employee_list):
-	'''Returns list of employee emails either based on user_id or company_email'''
+	"""Returns list of employee emails either based on user_id or company_email"""
 	employee_emails = []
 	for employee in employee_list:
 		if not employee:
 			continue
-		user, company_email, personal_email = frappe.db.get_value('Employee', employee,
-											['user_id', 'company_email', 'personal_email'])
+		user, company_email, personal_email = frappe.db.get_value(
+			"Employee", employee, ["user_id", "company_email", "personal_email"]
+		)
 		email = user or company_email or personal_email
 		if email:
 			employee_emails.append(email)
 	return employee_emails
 
+
 @frappe.whitelist()
 def get_children(doctype, parent=None, company=None, is_root=False, is_tree=False):
 
-	filters = [['status', '=', 'Active']]
-	if company and company != 'All Companies':
-		filters.append(['company', '=', company])
+	filters = [["status", "=", "Active"]]
+	if company and company != "All Companies":
+		filters.append(["company", "=", company])
 
-	fields = ['name as value', 'employee_name as title']
+	fields = ["name as value", "employee_name as title"]
 
 	if is_root:
-		parent = ''
-	if parent and company and parent!=company:
-		filters.append(['reports_to', '=', parent])
+		parent = ""
+	if parent and company and parent != company:
+		filters.append(["reports_to", "=", parent])
 	else:
-		filters.append(['reports_to', '=', ''])
+		filters.append(["reports_to", "=", ""])
 
-	employees = frappe.get_list(doctype, fields=fields,
-		filters=filters, order_by='name')
+	employees = frappe.get_list(doctype, fields=fields, filters=filters, order_by="name")
 
 	for employee in employees:
-		is_expandable = frappe.get_all(doctype, filters=[
-			['reports_to', '=', employee.get('value')]
-		])
+		is_expandable = frappe.get_all(doctype, filters=[["reports_to", "=", employee.get("value")]])
 		employee.expandable = 1 if is_expandable else 0
 
 	return employees
 
+
 def on_doctype_update():
 	frappe.db.add_index("Employee", ["lft", "rgt"])
 
-def has_user_permission_for_employee(user_name, employee_name):
-	return frappe.db.exists({
-		'doctype': 'User Permission',
-		'user': user_name,
-		'allow': 'Employee',
-		'for_value': employee_name
-	})
 
-def has_upload_permission(doc, ptype='read', user=None):
+def has_user_permission_for_employee(user_name, employee_name):
+	return frappe.db.exists(
+		{
+			"doctype": "User Permission",
+			"user": user_name,
+			"allow": "Employee",
+			"for_value": employee_name,
+		}
+	)
+
+
+def has_upload_permission(doc, ptype="read", user=None):
 	if not user:
 		user = frappe.session.user
 	if get_doc_permissions(doc, user=user, ptype=ptype).get(ptype):
diff --git a/erpnext/hr/doctype/employee/employee_dashboard.py b/erpnext/hr/doctype/employee/employee_dashboard.py
index fb62b04..da89a1d 100644
--- a/erpnext/hr/doctype/employee/employee_dashboard.py
+++ b/erpnext/hr/doctype/employee/employee_dashboard.py
@@ -3,53 +3,48 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on the attendance of this Employee'),
-		'fieldname': 'employee',
-		'non_standard_fieldnames': {
-			'Bank Account': 'party',
-			'Employee Grievance': 'raised_by'
-		},
-		'transactions': [
+		"heatmap": True,
+		"heatmap_message": _("This is based on the attendance of this Employee"),
+		"fieldname": "employee",
+		"non_standard_fieldnames": {"Bank Account": "party", "Employee Grievance": "raised_by"},
+		"transactions": [
+			{"label": _("Attendance"), "items": ["Attendance", "Attendance Request", "Employee Checkin"]},
 			{
-				'label': _('Attendance'),
-				'items': ['Attendance', 'Attendance Request', 'Employee Checkin']
+				"label": _("Leave"),
+				"items": ["Leave Application", "Leave Allocation", "Leave Policy Assignment"],
 			},
 			{
-				'label': _('Leave'),
-				'items': ['Leave Application', 'Leave Allocation', 'Leave Policy Assignment']
+				"label": _("Lifecycle"),
+				"items": [
+					"Employee Onboarding",
+					"Employee Transfer",
+					"Employee Promotion",
+					"Employee Grievance",
+				],
 			},
 			{
-				'label': _('Lifecycle'),
-				'items': ['Employee Onboarding', 'Employee Transfer', 'Employee Promotion', 'Employee Grievance']
+				"label": _("Exit"),
+				"items": ["Employee Separation", "Exit Interview", "Full and Final Statement"],
+			},
+			{"label": _("Shift"), "items": ["Shift Request", "Shift Assignment"]},
+			{"label": _("Expense"), "items": ["Expense Claim", "Travel Request", "Employee Advance"]},
+			{"label": _("Benefit"), "items": ["Employee Benefit Application", "Employee Benefit Claim"]},
+			{
+				"label": _("Payroll"),
+				"items": [
+					"Salary Structure Assignment",
+					"Salary Slip",
+					"Additional Salary",
+					"Timesheet",
+					"Employee Incentive",
+					"Retention Bonus",
+					"Bank Account",
+				],
 			},
 			{
-				'label': _('Exit'),
-				'items': ['Employee Separation', 'Exit Interview', 'Full and Final Statement']
+				"label": _("Training"),
+				"items": ["Training Event", "Training Result", "Training Feedback", "Employee Skill Map"],
 			},
-			{
-				'label': _('Shift'),
-				'items': ['Shift Request', 'Shift Assignment']
-			},
-			{
-				'label': _('Expense'),
-				'items': ['Expense Claim', 'Travel Request', 'Employee Advance']
-			},
-			{
-				'label': _('Benefit'),
-				'items': ['Employee Benefit Application', 'Employee Benefit Claim']
-			},
-			{
-				'label': _('Payroll'),
-				'items': ['Salary Structure Assignment', 'Salary Slip', 'Additional Salary', 'Timesheet','Employee Incentive', 'Retention Bonus', 'Bank Account']
-			},
-			{
-				'label': _('Training'),
-				'items': ['Training Event', 'Training Result', 'Training Feedback', 'Employee Skill Map']
-			},
-			{
-				'label': _('Evaluation'),
-				'items': ['Appraisal']
-			},
-		]
+			{"label": _("Evaluation"), "items": ["Appraisal"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/employee/employee_reminders.py b/erpnext/hr/doctype/employee/employee_reminders.py
index 0bb6637..1829bc4 100644
--- a/erpnext/hr/doctype/employee/employee_reminders.py
+++ b/erpnext/hr/doctype/employee/employee_reminders.py
@@ -44,13 +44,10 @@
 	else:
 		return
 
-	employees = frappe.db.get_all('Employee', filters={'status': 'Active'}, pluck='name')
+	employees = frappe.db.get_all("Employee", filters={"status": "Active"}, pluck="name")
 	for employee in employees:
 		holidays = get_holidays_for_employee(
-			employee,
-			start_date, end_date,
-			only_non_weekly=True,
-			raise_exception=False
+			employee, start_date, end_date, only_non_weekly=True, raise_exception=False
 		)
 
 		send_holidays_reminder_in_advance(employee, holidays)
@@ -60,7 +57,7 @@
 	if not holidays:
 		return
 
-	employee_doc = frappe.get_doc('Employee', employee)
+	employee_doc = frappe.get_doc("Employee", employee)
 	employee_email = get_employee_email(employee_doc)
 	frequency = frappe.db.get_single_value("HR Settings", "frequency")
 
@@ -70,15 +67,18 @@
 		subject=_("Upcoming Holidays Reminder"),
 		template="holiday_reminder",
 		args=dict(
-			reminder_text=_("Hey {}! This email is to remind you about the upcoming holidays.").format(employee_doc.get('first_name')),
+			reminder_text=_("Hey {}! This email is to remind you about the upcoming holidays.").format(
+				employee_doc.get("first_name")
+			),
 			message=_("Below is the list of upcoming holidays for you:"),
 			advance_holiday_reminder=True,
 			holidays=holidays,
-			frequency=frequency[:-2]
+			frequency=frequency[:-2],
 		),
-		header=email_header
+		header=email_header,
 	)
 
+
 # ------------------
 # BIRTHDAY REMINDERS
 # ------------------
@@ -109,10 +109,10 @@
 
 def get_birthday_reminder_text_and_message(birthday_persons):
 	if len(birthday_persons) == 1:
-		birthday_person_text = birthday_persons[0]['name']
+		birthday_person_text = birthday_persons[0]["name"]
 	else:
 		# converts ["Jim", "Rim", "Dim"] to Jim, Rim & Dim
-		person_names = [d['name'] for d in birthday_persons]
+		person_names = [d["name"] for d in birthday_persons]
 		birthday_person_text = comma_sep(person_names, frappe._("{0} & {1}"), False)
 
 	reminder_text = _("Today is {0}'s birthday 🎉").format(birthday_person_text)
@@ -133,7 +133,7 @@
 			birthday_persons=birthday_persons,
 			message=message,
 		),
-		header=_("Birthday Reminder 🎂")
+		header=_("Birthday Reminder 🎂"),
 	)
 
 
@@ -150,15 +150,16 @@
 	from collections import defaultdict
 
 	# Set column based on event type
-	if event_type == 'birthday':
-		condition_column = 'date_of_birth'
-	elif event_type == 'work_anniversary':
-		condition_column = 'date_of_joining'
+	if event_type == "birthday":
+		condition_column = "date_of_birth"
+	elif event_type == "work_anniversary":
+		condition_column = "date_of_joining"
 	else:
 		return
 
-	employees_born_today = frappe.db.multisql({
-		"mariadb": f"""
+	employees_born_today = frappe.db.multisql(
+		{
+			"mariadb": f"""
 			SELECT `personal_email`, `company`, `company_email`, `user_id`, `employee_name` AS 'name', `image`, `date_of_joining`
 			FROM `tabEmployee`
 			WHERE
@@ -170,7 +171,7 @@
 			AND
 				`status` = 'Active'
 		""",
-		"postgres": f"""
+			"postgres": f"""
 			SELECT "personal_email", "company", "company_email", "user_id", "employee_name" AS 'name', "image"
 			FROM "tabEmployee"
 			WHERE
@@ -182,12 +183,15 @@
 			AND
 				"status" = 'Active'
 		""",
-	}, dict(today=today(), condition_column=condition_column), as_dict=1)
+		},
+		dict(today=today(), condition_column=condition_column),
+		as_dict=1,
+	)
 
 	grouped_employees = defaultdict(lambda: [])
 
 	for employee_doc in employees_born_today:
-		grouped_employees[employee_doc.get('company')].append(employee_doc)
+		grouped_employees[employee_doc.get("company")].append(employee_doc)
 
 	return grouped_employees
 
@@ -222,19 +226,19 @@
 
 def get_work_anniversary_reminder_text_and_message(anniversary_persons):
 	if len(anniversary_persons) == 1:
-		anniversary_person = anniversary_persons[0]['name']
+		anniversary_person = anniversary_persons[0]["name"]
 		persons_name = anniversary_person
 		# Number of years completed at the company
-		completed_years = getdate().year - anniversary_persons[0]['date_of_joining'].year
+		completed_years = getdate().year - anniversary_persons[0]["date_of_joining"].year
 		anniversary_person += f" completed {completed_years} year(s)"
 	else:
 		person_names_with_years = []
 		names = []
 		for person in anniversary_persons:
-			person_text = person['name']
+			person_text = person["name"]
 			names.append(person_text)
 			# Number of years completed at the company
-			completed_years = getdate().year - person['date_of_joining'].year
+			completed_years = getdate().year - person["date_of_joining"].year
 			person_text += f" completed {completed_years} year(s)"
 			person_names_with_years.append(person_text)
 
@@ -260,5 +264,5 @@
 			anniversary_persons=anniversary_persons,
 			message=message,
 		),
-		header=_("Work Anniversary Reminder")
+		header=_("Work Anniversary Reminder"),
 	)
diff --git a/erpnext/hr/doctype/employee/test_employee.py b/erpnext/hr/doctype/employee/test_employee.py
index 67cbea6..50894b6 100644
--- a/erpnext/hr/doctype/employee/test_employee.py
+++ b/erpnext/hr/doctype/employee/test_employee.py
@@ -9,7 +9,8 @@
 import erpnext
 from erpnext.hr.doctype.employee.employee import InactiveEmployeeStatusError
 
-test_records = frappe.get_test_records('Employee')
+test_records = frappe.get_test_records("Employee")
+
 
 class TestEmployee(unittest.TestCase):
 	def test_employee_status_left(self):
@@ -21,7 +22,7 @@
 		employee2_doc.reports_to = employee1_doc.name
 		employee2_doc.save()
 		employee1_doc.reload()
-		employee1_doc.status = 'Left'
+		employee1_doc.status = "Left"
 		self.assertRaises(InactiveEmployeeStatusError, employee1_doc.save)
 
 	def test_employee_status_inactive(self):
@@ -36,11 +37,19 @@
 		employee_doc.reload()
 
 		make_holiday_list()
-		frappe.db.set_value("Company", employee_doc.company, "default_holiday_list", "Salary Slip Test Holiday List")
+		frappe.db.set_value(
+			"Company", employee_doc.company, "default_holiday_list", "Salary Slip Test Holiday List"
+		)
 
-		frappe.db.sql("""delete from `tabSalary Structure` where name='Test Inactive Employee Salary Slip'""")
-		salary_structure = make_salary_structure("Test Inactive Employee Salary Slip", "Monthly",
-			employee=employee_doc.name, company=employee_doc.company)
+		frappe.db.sql(
+			"""delete from `tabSalary Structure` where name='Test Inactive Employee Salary Slip'"""
+		)
+		salary_structure = make_salary_structure(
+			"Test Inactive Employee Salary Slip",
+			"Monthly",
+			employee=employee_doc.name,
+			company=employee_doc.company,
+		)
 		salary_slip = make_salary_slip(salary_structure.name, employee=employee_doc.name)
 
 		self.assertRaises(InactiveEmployeeStatusError, salary_slip.save)
@@ -48,38 +57,43 @@
 	def tearDown(self):
 		frappe.db.rollback()
 
+
 def make_employee(user, company=None, **kwargs):
 	if not frappe.db.get_value("User", user):
-		frappe.get_doc({
-			"doctype": "User",
-			"email": user,
-			"first_name": user,
-			"new_password": "password",
-			"send_welcome_email": 0,
-			"roles": [{"doctype": "Has Role", "role": "Employee"}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "User",
+				"email": user,
+				"first_name": user,
+				"new_password": "password",
+				"send_welcome_email": 0,
+				"roles": [{"doctype": "Has Role", "role": "Employee"}],
+			}
+		).insert()
 
 	if not frappe.db.get_value("Employee", {"user_id": user}):
-		employee = frappe.get_doc({
-			"doctype": "Employee",
-			"naming_series": "EMP-",
-			"first_name": user,
-			"company": company or erpnext.get_default_company(),
-			"user_id": user,
-			"date_of_birth": "1990-05-08",
-			"date_of_joining": "2013-01-01",
-			"department": frappe.get_all("Department", fields="name")[0].name,
-			"gender": "Female",
-			"company_email": user,
-			"prefered_contact_email": "Company Email",
-			"prefered_email": user,
-			"status": "Active",
-			"employment_type": "Intern"
-		})
+		employee = frappe.get_doc(
+			{
+				"doctype": "Employee",
+				"naming_series": "EMP-",
+				"first_name": user,
+				"company": company or erpnext.get_default_company(),
+				"user_id": user,
+				"date_of_birth": "1990-05-08",
+				"date_of_joining": "2013-01-01",
+				"department": frappe.get_all("Department", fields="name")[0].name,
+				"gender": "Female",
+				"company_email": user,
+				"prefered_contact_email": "Company Email",
+				"prefered_email": user,
+				"status": "Active",
+				"employment_type": "Intern",
+			}
+		)
 		if kwargs:
 			employee.update(kwargs)
 		employee.insert()
 		return employee.name
 	else:
-		frappe.db.set_value("Employee", {"employee_name":user}, "status", "Active")
-		return frappe.get_value("Employee", {"employee_name":user}, "name")
+		frappe.db.set_value("Employee", {"employee_name": user}, "status", "Active")
+		return frappe.get_value("Employee", {"employee_name": user}, "name")
diff --git a/erpnext/hr/doctype/employee/test_employee_reminders.py b/erpnext/hr/doctype/employee/test_employee_reminders.py
index a4097ab..9bde77c 100644
--- a/erpnext/hr/doctype/employee/test_employee_reminders.py
+++ b/erpnext/hr/doctype/employee/test_employee_reminders.py
@@ -21,23 +21,22 @@
 		# Create a test holiday list
 		test_holiday_dates = cls.get_test_holiday_dates()
 		test_holiday_list = make_holiday_list(
-			'TestHolidayRemindersList',
+			"TestHolidayRemindersList",
 			holiday_dates=[
-				{'holiday_date': test_holiday_dates[0], 'description': 'test holiday1'},
-				{'holiday_date': test_holiday_dates[1], 'description': 'test holiday2'},
-				{'holiday_date': test_holiday_dates[2], 'description': 'test holiday3', 'weekly_off': 1},
-				{'holiday_date': test_holiday_dates[3], 'description': 'test holiday4'},
-				{'holiday_date': test_holiday_dates[4], 'description': 'test holiday5'},
-				{'holiday_date': test_holiday_dates[5], 'description': 'test holiday6'},
+				{"holiday_date": test_holiday_dates[0], "description": "test holiday1"},
+				{"holiday_date": test_holiday_dates[1], "description": "test holiday2"},
+				{"holiday_date": test_holiday_dates[2], "description": "test holiday3", "weekly_off": 1},
+				{"holiday_date": test_holiday_dates[3], "description": "test holiday4"},
+				{"holiday_date": test_holiday_dates[4], "description": "test holiday5"},
+				{"holiday_date": test_holiday_dates[5], "description": "test holiday6"},
 			],
-			from_date=getdate()-timedelta(days=10),
-			to_date=getdate()+timedelta(weeks=5)
+			from_date=getdate() - timedelta(days=10),
+			to_date=getdate() + timedelta(weeks=5),
 		)
 
 		# Create a test employee
 		test_employee = frappe.get_doc(
-			'Employee',
-			make_employee('test@gopher.io', company="_Test Company")
+			"Employee", make_employee("test@gopher.io", company="_Test Company")
 		)
 
 		# Attach the holiday list to employee
@@ -49,16 +48,16 @@
 		cls.test_holiday_dates = test_holiday_dates
 
 		# Employee without holidays in this month/week
-		test_employee_2 = make_employee('test@empwithoutholiday.io', company="_Test Company")
-		test_employee_2 = frappe.get_doc('Employee', test_employee_2)
+		test_employee_2 = make_employee("test@empwithoutholiday.io", company="_Test Company")
+		test_employee_2 = frappe.get_doc("Employee", test_employee_2)
 
 		test_holiday_list = make_holiday_list(
-			'TestHolidayRemindersList2',
+			"TestHolidayRemindersList2",
 			holiday_dates=[
-				{'holiday_date': add_months(getdate(), 1), 'description': 'test holiday1'},
+				{"holiday_date": add_months(getdate(), 1), "description": "test holiday1"},
 			],
 			from_date=add_months(getdate(), -2),
-			to_date=add_months(getdate(), 2)
+			to_date=add_months(getdate(), 2),
 		)
 		test_employee_2.holiday_list = test_holiday_list.name
 		test_employee_2.save()
@@ -71,11 +70,11 @@
 		today_date = getdate()
 		return [
 			today_date,
-			today_date-timedelta(days=4),
-			today_date-timedelta(days=3),
-			today_date+timedelta(days=1),
-			today_date+timedelta(days=3),
-			today_date+timedelta(weeks=3)
+			today_date - timedelta(days=4),
+			today_date - timedelta(days=3),
+			today_date + timedelta(days=1),
+			today_date + timedelta(days=3),
+			today_date + timedelta(weeks=3),
 		]
 
 	def setUp(self):
@@ -88,19 +87,23 @@
 
 		self.assertTrue(is_holiday(self.test_employee.name))
 		self.assertTrue(is_holiday(self.test_employee.name, date=self.test_holiday_dates[1]))
-		self.assertFalse(is_holiday(self.test_employee.name, date=getdate()-timedelta(days=1)))
+		self.assertFalse(is_holiday(self.test_employee.name, date=getdate() - timedelta(days=1)))
 
 		# Test weekly_off holidays
 		self.assertTrue(is_holiday(self.test_employee.name, date=self.test_holiday_dates[2]))
-		self.assertFalse(is_holiday(self.test_employee.name, date=self.test_holiday_dates[2], only_non_weekly=True))
+		self.assertFalse(
+			is_holiday(self.test_employee.name, date=self.test_holiday_dates[2], only_non_weekly=True)
+		)
 
 		# Test with descriptions
 		has_holiday, descriptions = is_holiday(self.test_employee.name, with_description=True)
 		self.assertTrue(has_holiday)
-		self.assertTrue('test holiday1' in descriptions)
+		self.assertTrue("test holiday1" in descriptions)
 
 	def test_birthday_reminders(self):
-		employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
+		employee = frappe.get_doc(
+			"Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0]
+		)
 		employee.date_of_birth = "1992" + frappe.utils.nowdate()[4:]
 		employee.company_email = "test@example.com"
 		employee.company = "_Test Company"
@@ -124,7 +127,8 @@
 		self.assertTrue("Subject: Birthday Reminder" in email_queue[0].message)
 
 	def test_work_anniversary_reminders(self):
-		make_employee("test_work_anniversary@gmail.com",
+		make_employee(
+			"test_work_anniversary@gmail.com",
 			date_of_joining="1998" + frappe.utils.nowdate()[4:],
 			company="_Test Company",
 		)
@@ -134,7 +138,7 @@
 			send_work_anniversary_reminders,
 		)
 
-		employees_having_work_anniversary = get_employees_having_an_event_today('work_anniversary')
+		employees_having_work_anniversary = get_employees_having_an_event_today("work_anniversary")
 		employees = employees_having_work_anniversary.get("_Test Company") or []
 		user_ids = []
 		for entry in employees:
@@ -152,14 +156,15 @@
 		self.assertTrue("Subject: Work Anniversary Reminder" in email_queue[0].message)
 
 	def test_work_anniversary_reminder_not_sent_for_0_years(self):
-		make_employee("test_work_anniversary_2@gmail.com",
+		make_employee(
+			"test_work_anniversary_2@gmail.com",
 			date_of_joining=getdate(),
 			company="_Test Company",
 		)
 
 		from erpnext.hr.doctype.employee.employee_reminders import get_employees_having_an_event_today
 
-		employees_having_work_anniversary = get_employees_having_an_event_today('work_anniversary')
+		employees_having_work_anniversary = get_employees_having_an_event_today("work_anniversary")
 		employees = employees_having_work_anniversary.get("_Test Company") or []
 		user_ids = []
 		for entry in employees:
@@ -168,20 +173,18 @@
 		self.assertTrue("test_work_anniversary_2@gmail.com" not in user_ids)
 
 	def test_send_holidays_reminder_in_advance(self):
-		setup_hr_settings('Weekly')
+		setup_hr_settings("Weekly")
 
 		holidays = get_holidays_for_employee(
-					self.test_employee.get('name'),
-					getdate(), getdate() + timedelta(days=3),
-					only_non_weekly=True,
-					raise_exception=False
-				)
-
-		send_holidays_reminder_in_advance(
-			self.test_employee.get('name'),
-			holidays
+			self.test_employee.get("name"),
+			getdate(),
+			getdate() + timedelta(days=3),
+			only_non_weekly=True,
+			raise_exception=False,
 		)
 
+		send_holidays_reminder_in_advance(self.test_employee.get("name"), holidays)
+
 		email_queue = frappe.db.sql("""select * from `tabEmail Queue`""", as_dict=True)
 		self.assertEqual(len(email_queue), 1)
 		self.assertTrue("Holidays this Week." in email_queue[0].message)
@@ -189,67 +192,69 @@
 	def test_advance_holiday_reminders_monthly(self):
 		from erpnext.hr.doctype.employee.employee_reminders import send_reminders_in_advance_monthly
 
-		setup_hr_settings('Monthly')
+		setup_hr_settings("Monthly")
 
 		# disable emp 2, set same holiday list
-		frappe.db.set_value('Employee', self.test_employee_2.name, {
-			'status': 'Left',
-			'holiday_list': self.test_employee.holiday_list
-		})
+		frappe.db.set_value(
+			"Employee",
+			self.test_employee_2.name,
+			{"status": "Left", "holiday_list": self.test_employee.holiday_list},
+		)
 
 		send_reminders_in_advance_monthly()
 		email_queue = frappe.db.sql("""select * from `tabEmail Queue`""", as_dict=True)
 		self.assertTrue(len(email_queue) > 0)
 
 		# even though emp 2 has holiday, non-active employees should not be recipients
-		recipients = frappe.db.get_all('Email Queue Recipient', pluck='recipient')
+		recipients = frappe.db.get_all("Email Queue Recipient", pluck="recipient")
 		self.assertTrue(self.test_employee_2.user_id not in recipients)
 
 		# teardown: enable emp 2
-		frappe.db.set_value('Employee', self.test_employee_2.name, {
-			'status': 'Active',
-			'holiday_list': self.holiday_list_2.name
-		})
+		frappe.db.set_value(
+			"Employee",
+			self.test_employee_2.name,
+			{"status": "Active", "holiday_list": self.holiday_list_2.name},
+		)
 
 	def test_advance_holiday_reminders_weekly(self):
 		from erpnext.hr.doctype.employee.employee_reminders import send_reminders_in_advance_weekly
 
-		setup_hr_settings('Weekly')
+		setup_hr_settings("Weekly")
 
 		# disable emp 2, set same holiday list
-		frappe.db.set_value('Employee', self.test_employee_2.name, {
-			'status': 'Left',
-			'holiday_list': self.test_employee.holiday_list
-		})
+		frappe.db.set_value(
+			"Employee",
+			self.test_employee_2.name,
+			{"status": "Left", "holiday_list": self.test_employee.holiday_list},
+		)
 
 		send_reminders_in_advance_weekly()
 		email_queue = frappe.db.sql("""select * from `tabEmail Queue`""", as_dict=True)
 		self.assertTrue(len(email_queue) > 0)
 
 		# even though emp 2 has holiday, non-active employees should not be recipients
-		recipients = frappe.db.get_all('Email Queue Recipient', pluck='recipient')
+		recipients = frappe.db.get_all("Email Queue Recipient", pluck="recipient")
 		self.assertTrue(self.test_employee_2.user_id not in recipients)
 
 		# teardown: enable emp 2
-		frappe.db.set_value('Employee', self.test_employee_2.name, {
-			'status': 'Active',
-			'holiday_list': self.holiday_list_2.name
-		})
+		frappe.db.set_value(
+			"Employee",
+			self.test_employee_2.name,
+			{"status": "Active", "holiday_list": self.holiday_list_2.name},
+		)
 
 	def test_reminder_not_sent_if_no_holdays(self):
-		setup_hr_settings('Monthly')
+		setup_hr_settings("Monthly")
 
 		# reminder not sent if there are no holidays
 		holidays = get_holidays_for_employee(
-			self.test_employee_2.get('name'),
-			getdate(), getdate() + timedelta(days=3),
+			self.test_employee_2.get("name"),
+			getdate(),
+			getdate() + timedelta(days=3),
 			only_non_weekly=True,
-			raise_exception=False
+			raise_exception=False,
 		)
-		send_holidays_reminder_in_advance(
-			self.test_employee_2.get('name'),
-			holidays
-		)
+		send_holidays_reminder_in_advance(self.test_employee_2.get("name"), holidays)
 		email_queue = frappe.db.sql("""select * from `tabEmail Queue`""", as_dict=True)
 		self.assertEqual(len(email_queue), 0)
 
@@ -259,5 +264,5 @@
 	hr_settings = frappe.get_doc("HR Settings", "HR Settings")
 	hr_settings.send_holiday_reminders = 1
 	set_proceed_with_frequency_change()
-	hr_settings.frequency = frequency or 'Weekly'
-	hr_settings.save()
\ No newline at end of file
+	hr_settings.frequency = frequency or "Weekly"
+	hr_settings.save()
diff --git a/erpnext/hr/doctype/employee_advance/employee_advance.py b/erpnext/hr/doctype/employee_advance/employee_advance.py
index 79d389d..c1876b1 100644
--- a/erpnext/hr/doctype/employee_advance/employee_advance.py
+++ b/erpnext/hr/doctype/employee_advance/employee_advance.py
@@ -16,17 +16,19 @@
 class EmployeeAdvanceOverPayment(frappe.ValidationError):
 	pass
 
+
 class EmployeeAdvance(Document):
 	def onload(self):
-		self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings',
-			'make_payment_via_journal_entry')
+		self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value(
+			"Accounts Settings", "make_payment_via_journal_entry"
+		)
 
 	def validate(self):
 		validate_active_employee(self.employee)
 		self.set_status()
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry')
+		self.ignore_linked_doctypes = "GL Entry"
 		self.set_status(update=True)
 
 	def set_status(self, update=False):
@@ -37,13 +39,23 @@
 		if self.docstatus == 0:
 			status = "Draft"
 		elif self.docstatus == 1:
-			if flt(self.claimed_amount) > 0 and flt(self.claimed_amount, precision) == flt(self.paid_amount, precision):
+			if flt(self.claimed_amount) > 0 and flt(self.claimed_amount, precision) == flt(
+				self.paid_amount, precision
+			):
 				status = "Claimed"
-			elif flt(self.return_amount) > 0 and flt(self.return_amount, precision) == flt(self.paid_amount, precision):
+			elif flt(self.return_amount) > 0 and flt(self.return_amount, precision) == flt(
+				self.paid_amount, precision
+			):
 				status = "Returned"
-			elif flt(self.claimed_amount) > 0 and (flt(self.return_amount) > 0) and total_amount == flt(self.paid_amount, precision):
+			elif (
+				flt(self.claimed_amount) > 0
+				and (flt(self.return_amount) > 0)
+				and total_amount == flt(self.paid_amount, precision)
+			):
 				status = "Partly Claimed and Returned"
-			elif flt(self.paid_amount) > 0 and flt(self.advance_amount, precision) == flt(self.paid_amount, precision):
+			elif flt(self.paid_amount) > 0 and flt(self.advance_amount, precision) == flt(
+				self.paid_amount, precision
+			):
 				status = "Paid"
 			else:
 				status = "Unpaid"
@@ -60,30 +72,30 @@
 
 		paid_amount = (
 			frappe.qb.from_(gle)
-				.select(Sum(gle.debit).as_("paid_amount"))
-				.where(
-					(gle.against_voucher_type == 'Employee Advance')
-					& (gle.against_voucher == self.name)
-					& (gle.party_type == 'Employee')
-					& (gle.party == self.employee)
-					& (gle.docstatus == 1)
-					& (gle.is_cancelled == 0)
-				)
-			).run(as_dict=True)[0].paid_amount or 0
+			.select(Sum(gle.debit).as_("paid_amount"))
+			.where(
+				(gle.against_voucher_type == "Employee Advance")
+				& (gle.against_voucher == self.name)
+				& (gle.party_type == "Employee")
+				& (gle.party == self.employee)
+				& (gle.docstatus == 1)
+				& (gle.is_cancelled == 0)
+			)
+		).run(as_dict=True)[0].paid_amount or 0
 
 		return_amount = (
 			frappe.qb.from_(gle)
-				.select(Sum(gle.credit).as_("return_amount"))
-				.where(
-					(gle.against_voucher_type == 'Employee Advance')
-					& (gle.voucher_type != 'Expense Claim')
-					& (gle.against_voucher == self.name)
-					& (gle.party_type == 'Employee')
-					& (gle.party == self.employee)
-					& (gle.docstatus == 1)
-					& (gle.is_cancelled == 0)
-				)
-			).run(as_dict=True)[0].return_amount or 0
+			.select(Sum(gle.credit).as_("return_amount"))
+			.where(
+				(gle.against_voucher_type == "Employee Advance")
+				& (gle.voucher_type != "Expense Claim")
+				& (gle.against_voucher == self.name)
+				& (gle.party_type == "Employee")
+				& (gle.party == self.employee)
+				& (gle.docstatus == 1)
+				& (gle.is_cancelled == 0)
+			)
+		).run(as_dict=True)[0].return_amount or 0
 
 		if paid_amount != 0:
 			paid_amount = flt(paid_amount) / flt(self.exchange_rate)
@@ -91,8 +103,10 @@
 			return_amount = flt(return_amount) / flt(self.exchange_rate)
 
 		if flt(paid_amount) > self.advance_amount:
-			frappe.throw(_("Row {0}# Paid Amount cannot be greater than requested advance amount"),
-				EmployeeAdvanceOverPayment)
+			frappe.throw(
+				_("Row {0}# Paid Amount cannot be greater than requested advance amount"),
+				EmployeeAdvanceOverPayment,
+			)
 
 		if flt(return_amount) > self.paid_amount - self.claimed_amount:
 			frappe.throw(_("Return amount cannot be greater unclaimed amount"))
@@ -102,7 +116,9 @@
 		self.set_status(update=True)
 
 	def update_claimed_amount(self):
-		claimed_amount = frappe.db.sql("""
+		claimed_amount = (
+			frappe.db.sql(
+				"""
 			SELECT sum(ifnull(allocated_amount, 0))
 			FROM `tabExpense Claim Advance` eca, `tabExpense Claim` ec
 			WHERE
@@ -111,7 +127,11 @@
 				AND ec.name = eca.parent
 				AND ec.docstatus=1
 				AND eca.allocated_amount > 0
-		""", self.name)[0][0] or 0
+		""",
+				self.name,
+			)[0][0]
+			or 0
+		)
 
 		frappe.db.set_value("Employee Advance", self.name, "claimed_amount", flt(claimed_amount))
 		self.reload()
@@ -120,56 +140,69 @@
 
 @frappe.whitelist()
 def get_pending_amount(employee, posting_date):
-	employee_due_amount = frappe.get_all("Employee Advance", \
-		filters = {"employee":employee, "docstatus":1, "posting_date":("<=", posting_date)}, \
-		fields = ["advance_amount", "paid_amount"])
+	employee_due_amount = frappe.get_all(
+		"Employee Advance",
+		filters={"employee": employee, "docstatus": 1, "posting_date": ("<=", posting_date)},
+		fields=["advance_amount", "paid_amount"],
+	)
 	return sum([(emp.advance_amount - emp.paid_amount) for emp in employee_due_amount])
 
+
 @frappe.whitelist()
 def make_bank_entry(dt, dn):
 	doc = frappe.get_doc(dt, dn)
-	payment_account = get_default_bank_cash_account(doc.company, account_type="Cash",
-		mode_of_payment=doc.mode_of_payment)
+	payment_account = get_default_bank_cash_account(
+		doc.company, account_type="Cash", mode_of_payment=doc.mode_of_payment
+	)
 	if not payment_account:
 		frappe.throw(_("Please set a Default Cash Account in Company defaults"))
 
-	advance_account_currency = frappe.db.get_value('Account', doc.advance_account, 'account_currency')
+	advance_account_currency = frappe.db.get_value("Account", doc.advance_account, "account_currency")
 
-	advance_amount, advance_exchange_rate = get_advance_amount_advance_exchange_rate(advance_account_currency,doc )
+	advance_amount, advance_exchange_rate = get_advance_amount_advance_exchange_rate(
+		advance_account_currency, doc
+	)
 
 	paying_amount, paying_exchange_rate = get_paying_amount_paying_exchange_rate(payment_account, doc)
 
 	je = frappe.new_doc("Journal Entry")
 	je.posting_date = nowdate()
-	je.voucher_type = 'Bank Entry'
+	je.voucher_type = "Bank Entry"
 	je.company = doc.company
-	je.remark = 'Payment against Employee Advance: ' + dn + '\n' + doc.purpose
+	je.remark = "Payment against Employee Advance: " + dn + "\n" + doc.purpose
 	je.multi_currency = 1 if advance_account_currency != payment_account.account_currency else 0
 
-	je.append("accounts", {
-		"account": doc.advance_account,
-		"account_currency": advance_account_currency,
-		"exchange_rate": flt(advance_exchange_rate),
-		"debit_in_account_currency": flt(advance_amount),
-		"reference_type": "Employee Advance",
-		"reference_name": doc.name,
-		"party_type": "Employee",
-		"cost_center": erpnext.get_default_cost_center(doc.company),
-		"party": doc.employee,
-		"is_advance": "Yes"
-	})
+	je.append(
+		"accounts",
+		{
+			"account": doc.advance_account,
+			"account_currency": advance_account_currency,
+			"exchange_rate": flt(advance_exchange_rate),
+			"debit_in_account_currency": flt(advance_amount),
+			"reference_type": "Employee Advance",
+			"reference_name": doc.name,
+			"party_type": "Employee",
+			"cost_center": erpnext.get_default_cost_center(doc.company),
+			"party": doc.employee,
+			"is_advance": "Yes",
+		},
+	)
 
-	je.append("accounts", {
-		"account": payment_account.account,
-		"cost_center": erpnext.get_default_cost_center(doc.company),
-		"credit_in_account_currency": flt(paying_amount),
-		"account_currency": payment_account.account_currency,
-		"account_type": payment_account.account_type,
-		"exchange_rate": flt(paying_exchange_rate)
-	})
+	je.append(
+		"accounts",
+		{
+			"account": payment_account.account,
+			"cost_center": erpnext.get_default_cost_center(doc.company),
+			"credit_in_account_currency": flt(paying_amount),
+			"account_currency": payment_account.account_currency,
+			"account_type": payment_account.account_type,
+			"exchange_rate": flt(paying_exchange_rate),
+		},
+	)
 
 	return je.as_dict()
 
+
 def get_advance_amount_advance_exchange_rate(advance_account_currency, doc):
 	if advance_account_currency != doc.currency:
 		advance_amount = flt(doc.advance_amount) * flt(doc.exchange_rate)
@@ -180,6 +213,7 @@
 
 	return advance_amount, advance_exchange_rate
 
+
 def get_paying_amount_paying_exchange_rate(payment_account, doc):
 	if payment_account.account_currency != doc.currency:
 		paying_amount = flt(doc.advance_amount) * flt(doc.exchange_rate)
@@ -190,6 +224,7 @@
 
 	return paying_amount, paying_exchange_rate
 
+
 @frappe.whitelist()
 def create_return_through_additional_salary(doc):
 	import json
@@ -197,7 +232,7 @@
 	if isinstance(doc, str):
 		doc = frappe._dict(json.loads(doc))
 
-	additional_salary = frappe.new_doc('Additional Salary')
+	additional_salary = frappe.new_doc("Additional Salary")
 	additional_salary.employee = doc.employee
 	additional_salary.currency = doc.currency
 	additional_salary.amount = doc.paid_amount - doc.claimed_amount
@@ -207,56 +242,81 @@
 
 	return additional_salary
 
+
 @frappe.whitelist()
-def make_return_entry(employee, company, employee_advance_name, return_amount,  advance_account, currency, exchange_rate, mode_of_payment=None):
-	bank_cash_account = get_default_bank_cash_account(company, account_type='Cash', mode_of_payment = mode_of_payment)
+def make_return_entry(
+	employee,
+	company,
+	employee_advance_name,
+	return_amount,
+	advance_account,
+	currency,
+	exchange_rate,
+	mode_of_payment=None,
+):
+	bank_cash_account = get_default_bank_cash_account(
+		company, account_type="Cash", mode_of_payment=mode_of_payment
+	)
 	if not bank_cash_account:
 		frappe.throw(_("Please set a Default Cash Account in Company defaults"))
 
-	advance_account_currency = frappe.db.get_value('Account', advance_account, 'account_currency')
+	advance_account_currency = frappe.db.get_value("Account", advance_account, "account_currency")
 
-	je = frappe.new_doc('Journal Entry')
+	je = frappe.new_doc("Journal Entry")
 	je.posting_date = nowdate()
 	je.voucher_type = get_voucher_type(mode_of_payment)
 	je.company = company
-	je.remark = 'Return against Employee Advance: ' + employee_advance_name
+	je.remark = "Return against Employee Advance: " + employee_advance_name
 	je.multi_currency = 1 if advance_account_currency != bank_cash_account.account_currency else 0
 
-	advance_account_amount = flt(return_amount) if advance_account_currency==currency \
+	advance_account_amount = (
+		flt(return_amount)
+		if advance_account_currency == currency
 		else flt(return_amount) * flt(exchange_rate)
+	)
 
-	je.append('accounts', {
-		'account': advance_account,
-		'credit_in_account_currency': advance_account_amount,
-		'account_currency': advance_account_currency,
-		'exchange_rate': flt(exchange_rate) if advance_account_currency == currency else 1,
-		'reference_type': 'Employee Advance',
-		'reference_name': employee_advance_name,
-		'party_type': 'Employee',
-		'party': employee,
-		'is_advance': 'Yes',
-		'cost_center': erpnext.get_default_cost_center(company)
-	})
+	je.append(
+		"accounts",
+		{
+			"account": advance_account,
+			"credit_in_account_currency": advance_account_amount,
+			"account_currency": advance_account_currency,
+			"exchange_rate": flt(exchange_rate) if advance_account_currency == currency else 1,
+			"reference_type": "Employee Advance",
+			"reference_name": employee_advance_name,
+			"party_type": "Employee",
+			"party": employee,
+			"is_advance": "Yes",
+			"cost_center": erpnext.get_default_cost_center(company),
+		},
+	)
 
-	bank_amount = flt(return_amount) if bank_cash_account.account_currency==currency \
+	bank_amount = (
+		flt(return_amount)
+		if bank_cash_account.account_currency == currency
 		else flt(return_amount) * flt(exchange_rate)
+	)
 
-	je.append("accounts", {
-		"account": bank_cash_account.account,
-		"debit_in_account_currency": bank_amount,
-		"account_currency": bank_cash_account.account_currency,
-		"account_type": bank_cash_account.account_type,
-		"exchange_rate": flt(exchange_rate) if bank_cash_account.account_currency == currency else 1,
-		"cost_center": erpnext.get_default_cost_center(company)
-	})
+	je.append(
+		"accounts",
+		{
+			"account": bank_cash_account.account,
+			"debit_in_account_currency": bank_amount,
+			"account_currency": bank_cash_account.account_currency,
+			"account_type": bank_cash_account.account_type,
+			"exchange_rate": flt(exchange_rate) if bank_cash_account.account_currency == currency else 1,
+			"cost_center": erpnext.get_default_cost_center(company),
+		},
+	)
 
 	return je.as_dict()
 
+
 def get_voucher_type(mode_of_payment=None):
 	voucher_type = "Cash Entry"
 
 	if mode_of_payment:
-		mode_of_payment_type = frappe.get_cached_value('Mode of Payment', mode_of_payment, 'type')
+		mode_of_payment_type = frappe.get_cached_value("Mode of Payment", mode_of_payment, "type")
 		if mode_of_payment_type == "Bank":
 			voucher_type = "Bank Entry"
 
diff --git a/erpnext/hr/doctype/employee_advance/employee_advance_dashboard.py b/erpnext/hr/doctype/employee_advance/employee_advance_dashboard.py
index 9450258..73fac51 100644
--- a/erpnext/hr/doctype/employee_advance/employee_advance_dashboard.py
+++ b/erpnext/hr/doctype/employee_advance/employee_advance_dashboard.py
@@ -1,16 +1,9 @@
 def get_data():
 	return {
-		'fieldname': 'employee_advance',
-		'non_standard_fieldnames': {
-			'Payment Entry': 'reference_name',
-			'Journal Entry': 'reference_name'
+		"fieldname": "employee_advance",
+		"non_standard_fieldnames": {
+			"Payment Entry": "reference_name",
+			"Journal Entry": "reference_name",
 		},
-		'transactions': [
-			{
-				'items': ['Expense Claim']
-			},
-			{
-				'items': ['Payment Entry', 'Journal Entry']
-			}
-		]
+		"transactions": [{"items": ["Expense Claim"]}, {"items": ["Payment Entry", "Journal Entry"]}],
 	}
diff --git a/erpnext/hr/doctype/employee_advance/test_employee_advance.py b/erpnext/hr/doctype/employee_advance/test_employee_advance.py
index e3c1487..44d68c9 100644
--- a/erpnext/hr/doctype/employee_advance/test_employee_advance.py
+++ b/erpnext/hr/doctype/employee_advance/test_employee_advance.py
@@ -68,7 +68,9 @@
 	def test_claimed_status(self):
 		# CLAIMED Status check, full amount claimed
 		payable_account = get_payable_account("_Test Company")
-		claim = make_expense_claim(payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True)
+		claim = make_expense_claim(
+			payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True
+		)
 
 		advance = make_employee_advance(claim.employee)
 		pe = make_payment_entry(advance)
@@ -95,7 +97,9 @@
 
 	def test_partly_claimed_and_returned_status(self):
 		payable_account = get_payable_account("_Test Company")
-		claim = make_expense_claim(payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True)
+		claim = make_expense_claim(
+			payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True
+		)
 
 		advance = make_employee_advance(claim.employee)
 		pe = make_payment_entry(advance)
@@ -103,7 +107,9 @@
 
 		# PARTLY CLAIMED AND RETURNED status check
 		# 500 Claimed, 500 Returned
-		claim = make_expense_claim(payable_account, 500, 500, "_Test Company", "Travel Expenses - _TC", do_not_submit=True)
+		claim = make_expense_claim(
+			payable_account, 500, 500, "_Test Company", "Travel Expenses - _TC", do_not_submit=True
+		)
 
 		advance = make_employee_advance(claim.employee)
 		pe = make_payment_entry(advance)
@@ -125,7 +131,7 @@
 			advance_account=advance.advance_account,
 			mode_of_payment=advance.mode_of_payment,
 			currency=advance.currency,
-			exchange_rate=advance.exchange_rate
+			exchange_rate=advance.exchange_rate,
 		)
 
 		entry = frappe.get_doc(entry)
@@ -160,7 +166,9 @@
 
 		args = {"type": "Deduction"}
 		create_salary_component("Advance Salary - Deduction", **args)
-		make_salary_structure("Test Additional Salary for Advance Return", "Monthly", employee=employee_name)
+		make_salary_structure(
+			"Test Additional Salary for Advance Return", "Monthly", employee=employee_name
+		)
 
 		# additional salary for 700 first
 		advance.reload()
@@ -204,10 +212,11 @@
 
 	return journal_entry
 
+
 def make_employee_advance(employee_name, args=None):
 	doc = frappe.new_doc("Employee Advance")
 	doc.employee = employee_name
-	doc.company  = "_Test company"
+	doc.company = "_Test company"
 	doc.purpose = "For site visit"
 	doc.currency = erpnext.get_company_currency("_Test company")
 	doc.exchange_rate = 1
@@ -233,13 +242,16 @@
 		else:
 			allocated_amount = flt(entry.paid_amount) - flt(entry.claimed_amount)
 
-		claim.append("advances", {
-			"employee_advance": entry.name,
-			"posting_date": entry.posting_date,
-			"advance_account": entry.advance_account,
-			"advance_paid": entry.paid_amount,
-			"unclaimed_amount": allocated_amount,
-			"allocated_amount": allocated_amount
-		})
+		claim.append(
+			"advances",
+			{
+				"employee_advance": entry.name,
+				"posting_date": entry.posting_date,
+				"advance_account": entry.advance_account,
+				"advance_paid": entry.paid_amount,
+				"unclaimed_amount": allocated_amount,
+				"allocated_amount": allocated_amount,
+			},
+		)
 
-	return claim
\ No newline at end of file
+	return claim
diff --git a/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py b/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py
index af2ca50..43665cc 100644
--- a/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py
+++ b/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.py
@@ -14,32 +14,31 @@
 
 
 @frappe.whitelist()
-def get_employees(date, department = None, branch = None, company = None):
+def get_employees(date, department=None, branch=None, company=None):
 	attendance_not_marked = []
 	attendance_marked = []
 	filters = {"status": "Active", "date_of_joining": ["<=", date]}
 
-	for field, value in {'department': department,
-		'branch': branch, 'company': company}.items():
+	for field, value in {"department": department, "branch": branch, "company": company}.items():
 		if value:
 			filters[field] = value
 
-	employee_list = frappe.get_list("Employee", fields=["employee", "employee_name"], filters=filters, order_by="employee_name")
+	employee_list = frappe.get_list(
+		"Employee", fields=["employee", "employee_name"], filters=filters, order_by="employee_name"
+	)
 	marked_employee = {}
-	for emp in frappe.get_list("Attendance", fields=["employee", "status"],
-							   filters={"attendance_date": date}):
-		marked_employee[emp['employee']] = emp['status']
+	for emp in frappe.get_list(
+		"Attendance", fields=["employee", "status"], filters={"attendance_date": date}
+	):
+		marked_employee[emp["employee"]] = emp["status"]
 
 	for employee in employee_list:
-		employee['status'] = marked_employee.get(employee['employee'])
-		if employee['employee'] not in marked_employee:
+		employee["status"] = marked_employee.get(employee["employee"])
+		if employee["employee"] not in marked_employee:
 			attendance_not_marked.append(employee)
 		else:
 			attendance_marked.append(employee)
-	return {
-		"marked": attendance_marked,
-		"unmarked": attendance_not_marked
-	}
+	return {"marked": attendance_marked, "unmarked": attendance_not_marked}
 
 
 @frappe.whitelist()
@@ -53,16 +52,18 @@
 		else:
 			leave_type = None
 
-		company = frappe.db.get_value("Employee", employee['employee'], "Company", cache=True)
+		company = frappe.db.get_value("Employee", employee["employee"], "Company", cache=True)
 
-		attendance=frappe.get_doc(dict(
-			doctype='Attendance',
-			employee=employee.get('employee'),
-			employee_name=employee.get('employee_name'),
-			attendance_date=getdate(date),
-			status=status,
-			leave_type=leave_type,
-			company=company
-		))
+		attendance = frappe.get_doc(
+			dict(
+				doctype="Attendance",
+				employee=employee.get("employee"),
+				employee_name=employee.get("employee_name"),
+				attendance_date=getdate(date),
+				status=status,
+				leave_type=leave_type,
+				company=company,
+			)
+		)
 		attendance.insert()
-		attendance.submit()
\ No newline at end of file
+		attendance.submit()
diff --git a/erpnext/hr/doctype/employee_checkin/employee_checkin.py b/erpnext/hr/doctype/employee_checkin/employee_checkin.py
index c1d4ac7..87f48b7 100644
--- a/erpnext/hr/doctype/employee_checkin/employee_checkin.py
+++ b/erpnext/hr/doctype/employee_checkin/employee_checkin.py
@@ -20,20 +20,31 @@
 		self.fetch_shift()
 
 	def validate_duplicate_log(self):
-		doc = frappe.db.exists('Employee Checkin', {
-			'employee': self.employee,
-			'time': self.time,
-			'name': ['!=', self.name]})
+		doc = frappe.db.exists(
+			"Employee Checkin", {"employee": self.employee, "time": self.time, "name": ["!=", self.name]}
+		)
 		if doc:
-			doc_link = frappe.get_desk_link('Employee Checkin', doc)
-			frappe.throw(_('This employee already has a log with the same timestamp.{0}')
-				.format("<Br>" + doc_link))
+			doc_link = frappe.get_desk_link("Employee Checkin", doc)
+			frappe.throw(
+				_("This employee already has a log with the same timestamp.{0}").format("<Br>" + doc_link)
+			)
 
 	def fetch_shift(self):
-		shift_actual_timings = get_actual_start_end_datetime_of_shift(self.employee, get_datetime(self.time), True)
+		shift_actual_timings = get_actual_start_end_datetime_of_shift(
+			self.employee, get_datetime(self.time), True
+		)
 		if shift_actual_timings[0] and shift_actual_timings[1]:
-			if shift_actual_timings[2].shift_type.determine_check_in_and_check_out == 'Strictly based on Log Type in Employee Checkin' and not self.log_type and not self.skip_auto_attendance:
-				frappe.throw(_('Log Type is required for check-ins falling in the shift: {0}.').format(shift_actual_timings[2].shift_type.name))
+			if (
+				shift_actual_timings[2].shift_type.determine_check_in_and_check_out
+				== "Strictly based on Log Type in Employee Checkin"
+				and not self.log_type
+				and not self.skip_auto_attendance
+			):
+				frappe.throw(
+					_("Log Type is required for check-ins falling in the shift: {0}.").format(
+						shift_actual_timings[2].shift_type.name
+					)
+				)
 			if not self.attendance:
 				self.shift = shift_actual_timings[2].shift_type.name
 				self.shift_actual_start = shift_actual_timings[0]
@@ -43,8 +54,16 @@
 		else:
 			self.shift = None
 
+
 @frappe.whitelist()
-def add_log_based_on_employee_field(employee_field_value, timestamp, device_id=None, log_type=None, skip_auto_attendance=0, employee_fieldname='attendance_device_id'):
+def add_log_based_on_employee_field(
+	employee_field_value,
+	timestamp,
+	device_id=None,
+	log_type=None,
+	skip_auto_attendance=0,
+	employee_fieldname="attendance_device_id",
+):
 	"""Finds the relevant Employee using the employee field value and creates a Employee Checkin.
 
 	:param employee_field_value: The value to look for in employee field.
@@ -58,11 +77,20 @@
 	if not employee_field_value or not timestamp:
 		frappe.throw(_("'employee_field_value' and 'timestamp' are required."))
 
-	employee = frappe.db.get_values("Employee", {employee_fieldname: employee_field_value}, ["name", "employee_name", employee_fieldname], as_dict=True)
+	employee = frappe.db.get_values(
+		"Employee",
+		{employee_fieldname: employee_field_value},
+		["name", "employee_name", employee_fieldname],
+		as_dict=True,
+	)
 	if employee:
 		employee = employee[0]
 	else:
-		frappe.throw(_("No Employee found for the given employee field value. '{}': {}").format(employee_fieldname,employee_field_value))
+		frappe.throw(
+			_("No Employee found for the given employee field value. '{}': {}").format(
+				employee_fieldname, employee_field_value
+			)
+		)
 
 	doc = frappe.new_doc("Employee Checkin")
 	doc.employee = employee.name
@@ -70,13 +98,24 @@
 	doc.time = timestamp
 	doc.device_id = device_id
 	doc.log_type = log_type
-	if cint(skip_auto_attendance) == 1: doc.skip_auto_attendance = '1'
+	if cint(skip_auto_attendance) == 1:
+		doc.skip_auto_attendance = "1"
 	doc.insert()
 
 	return doc
 
 
-def mark_attendance_and_link_log(logs, attendance_status, attendance_date, working_hours=None, late_entry=False, early_exit=False, in_time=None, out_time=None, shift=None):
+def mark_attendance_and_link_log(
+	logs,
+	attendance_status,
+	attendance_date,
+	working_hours=None,
+	late_entry=False,
+	early_exit=False,
+	in_time=None,
+	out_time=None,
+	shift=None,
+):
 	"""Creates an attendance and links the attendance to the Employee Checkin.
 	Note: If attendance is already present for the given date, the logs are marked as skipped and no exception is thrown.
 
@@ -87,40 +126,52 @@
 	"""
 	log_names = [x.name for x in logs]
 	employee = logs[0].employee
-	if attendance_status == 'Skip':
-		frappe.db.sql("""update `tabEmployee Checkin`
+	if attendance_status == "Skip":
+		frappe.db.sql(
+			"""update `tabEmployee Checkin`
 			set skip_auto_attendance = %s
-			where name in %s""", ('1', log_names))
+			where name in %s""",
+			("1", log_names),
+		)
 		return None
-	elif attendance_status in ('Present', 'Absent', 'Half Day'):
-		employee_doc = frappe.get_doc('Employee', employee)
-		if not frappe.db.exists('Attendance', {'employee':employee, 'attendance_date':attendance_date, 'docstatus':('!=', '2')}):
+	elif attendance_status in ("Present", "Absent", "Half Day"):
+		employee_doc = frappe.get_doc("Employee", employee)
+		if not frappe.db.exists(
+			"Attendance",
+			{"employee": employee, "attendance_date": attendance_date, "docstatus": ("!=", "2")},
+		):
 			doc_dict = {
-				'doctype': 'Attendance',
-				'employee': employee,
-				'attendance_date': attendance_date,
-				'status': attendance_status,
-				'working_hours': working_hours,
-				'company': employee_doc.company,
-				'shift': shift,
-				'late_entry': late_entry,
-				'early_exit': early_exit,
-				'in_time': in_time,
-				'out_time': out_time
+				"doctype": "Attendance",
+				"employee": employee,
+				"attendance_date": attendance_date,
+				"status": attendance_status,
+				"working_hours": working_hours,
+				"company": employee_doc.company,
+				"shift": shift,
+				"late_entry": late_entry,
+				"early_exit": early_exit,
+				"in_time": in_time,
+				"out_time": out_time,
 			}
 			attendance = frappe.get_doc(doc_dict).insert()
 			attendance.submit()
-			frappe.db.sql("""update `tabEmployee Checkin`
+			frappe.db.sql(
+				"""update `tabEmployee Checkin`
 				set attendance = %s
-				where name in %s""", (attendance.name, log_names))
+				where name in %s""",
+				(attendance.name, log_names),
+			)
 			return attendance
 		else:
-			frappe.db.sql("""update `tabEmployee Checkin`
+			frappe.db.sql(
+				"""update `tabEmployee Checkin`
 				set skip_auto_attendance = %s
-				where name in %s""", ('1', log_names))
+				where name in %s""",
+				("1", log_names),
+			)
 			return None
 	else:
-		frappe.throw(_('{} is an invalid Attendance Status.').format(attendance_status))
+		frappe.throw(_("{} is an invalid Attendance Status.").format(attendance_status))
 
 
 def calculate_working_hours(logs, check_in_out_type, working_hours_calc_type):
@@ -133,29 +184,35 @@
 	"""
 	total_hours = 0
 	in_time = out_time = None
-	if check_in_out_type == 'Alternating entries as IN and OUT during the same shift':
+	if check_in_out_type == "Alternating entries as IN and OUT during the same shift":
 		in_time = logs[0].time
 		if len(logs) >= 2:
 			out_time = logs[-1].time
-		if working_hours_calc_type == 'First Check-in and Last Check-out':
+		if working_hours_calc_type == "First Check-in and Last Check-out":
 			# assumption in this case: First log always taken as IN, Last log always taken as OUT
 			total_hours = time_diff_in_hours(in_time, logs[-1].time)
-		elif working_hours_calc_type == 'Every Valid Check-in and Check-out':
+		elif working_hours_calc_type == "Every Valid Check-in and Check-out":
 			logs = logs[:]
 			while len(logs) >= 2:
 				total_hours += time_diff_in_hours(logs[0].time, logs[1].time)
 				del logs[:2]
 
-	elif check_in_out_type == 'Strictly based on Log Type in Employee Checkin':
-		if working_hours_calc_type == 'First Check-in and Last Check-out':
-			first_in_log_index = find_index_in_dict(logs, 'log_type', 'IN')
-			first_in_log = logs[first_in_log_index] if first_in_log_index or first_in_log_index == 0 else None
-			last_out_log_index = find_index_in_dict(reversed(logs), 'log_type', 'OUT')
-			last_out_log = logs[len(logs)-1-last_out_log_index] if last_out_log_index or last_out_log_index == 0 else None
+	elif check_in_out_type == "Strictly based on Log Type in Employee Checkin":
+		if working_hours_calc_type == "First Check-in and Last Check-out":
+			first_in_log_index = find_index_in_dict(logs, "log_type", "IN")
+			first_in_log = (
+				logs[first_in_log_index] if first_in_log_index or first_in_log_index == 0 else None
+			)
+			last_out_log_index = find_index_in_dict(reversed(logs), "log_type", "OUT")
+			last_out_log = (
+				logs[len(logs) - 1 - last_out_log_index]
+				if last_out_log_index or last_out_log_index == 0
+				else None
+			)
 			if first_in_log and last_out_log:
 				in_time, out_time = first_in_log.time, last_out_log.time
 				total_hours = time_diff_in_hours(in_time, out_time)
-		elif working_hours_calc_type == 'Every Valid Check-in and Check-out':
+		elif working_hours_calc_type == "Every Valid Check-in and Check-out":
 			in_log = out_log = None
 			for log in logs:
 				if in_log and out_log:
@@ -165,16 +222,18 @@
 					total_hours += time_diff_in_hours(in_log.time, out_log.time)
 					in_log = out_log = None
 				if not in_log:
-					in_log = log if log.log_type == 'IN'  else None
+					in_log = log if log.log_type == "IN" else None
 				elif not out_log:
-					out_log = log if log.log_type == 'OUT'  else None
+					out_log = log if log.log_type == "OUT" else None
 			if in_log and out_log:
 				out_time = out_log.time
 				total_hours += time_diff_in_hours(in_log.time, out_log.time)
 	return total_hours, in_time, out_time
 
+
 def time_diff_in_hours(start, end):
-	return round((end-start).total_seconds() / 3600, 1)
+	return round((end - start).total_seconds() / 3600, 1)
+
 
 def find_index_in_dict(dict_list, key, value):
 	return next((index for (index, d) in enumerate(dict_list) if d[key] == value), None)
diff --git a/erpnext/hr/doctype/employee_checkin/test_employee_checkin.py b/erpnext/hr/doctype/employee_checkin/test_employee_checkin.py
index 254bf9e..97f76b0 100644
--- a/erpnext/hr/doctype/employee_checkin/test_employee_checkin.py
+++ b/erpnext/hr/doctype/employee_checkin/test_employee_checkin.py
@@ -19,85 +19,108 @@
 	def test_add_log_based_on_employee_field(self):
 		employee = make_employee("test_add_log_based_on_employee_field@example.com")
 		employee = frappe.get_doc("Employee", employee)
-		employee.attendance_device_id = '3344'
+		employee.attendance_device_id = "3344"
 		employee.save()
 
 		time_now = now_datetime().__str__()[:-7]
-		employee_checkin = add_log_based_on_employee_field('3344', time_now, 'mumbai_first_floor', 'IN')
+		employee_checkin = add_log_based_on_employee_field("3344", time_now, "mumbai_first_floor", "IN")
 		self.assertEqual(employee_checkin.employee, employee.name)
 		self.assertEqual(employee_checkin.time, time_now)
-		self.assertEqual(employee_checkin.device_id, 'mumbai_first_floor')
-		self.assertEqual(employee_checkin.log_type, 'IN')
+		self.assertEqual(employee_checkin.device_id, "mumbai_first_floor")
+		self.assertEqual(employee_checkin.log_type, "IN")
 
 	def test_mark_attendance_and_link_log(self):
 		employee = make_employee("test_mark_attendance_and_link_log@example.com")
 		logs = make_n_checkins(employee, 3)
-		mark_attendance_and_link_log(logs, 'Skip', nowdate())
+		mark_attendance_and_link_log(logs, "Skip", nowdate())
 		log_names = [log.name for log in logs]
-		logs_count = frappe.db.count('Employee Checkin', {'name':['in', log_names], 'skip_auto_attendance':1})
+		logs_count = frappe.db.count(
+			"Employee Checkin", {"name": ["in", log_names], "skip_auto_attendance": 1}
+		)
 		self.assertEqual(logs_count, 3)
 
 		logs = make_n_checkins(employee, 4, 2)
 		now_date = nowdate()
-		frappe.db.delete('Attendance', {'employee':employee})
-		attendance = mark_attendance_and_link_log(logs, 'Present', now_date, 8.2)
+		frappe.db.delete("Attendance", {"employee": employee})
+		attendance = mark_attendance_and_link_log(logs, "Present", now_date, 8.2)
 		log_names = [log.name for log in logs]
-		logs_count = frappe.db.count('Employee Checkin', {'name':['in', log_names], 'attendance':attendance.name})
+		logs_count = frappe.db.count(
+			"Employee Checkin", {"name": ["in", log_names], "attendance": attendance.name}
+		)
 		self.assertEqual(logs_count, 4)
-		attendance_count = frappe.db.count('Attendance', {'status':'Present', 'working_hours':8.2,
-			'employee':employee, 'attendance_date':now_date})
+		attendance_count = frappe.db.count(
+			"Attendance",
+			{"status": "Present", "working_hours": 8.2, "employee": employee, "attendance_date": now_date},
+		)
 		self.assertEqual(attendance_count, 1)
 
 	def test_calculate_working_hours(self):
-		check_in_out_type = ['Alternating entries as IN and OUT during the same shift',
-			'Strictly based on Log Type in Employee Checkin']
-		working_hours_calc_type = ['First Check-in and Last Check-out',
-			'Every Valid Check-in and Check-out']
+		check_in_out_type = [
+			"Alternating entries as IN and OUT during the same shift",
+			"Strictly based on Log Type in Employee Checkin",
+		]
+		working_hours_calc_type = [
+			"First Check-in and Last Check-out",
+			"Every Valid Check-in and Check-out",
+		]
 		logs_type_1 = [
-			{'time':now_datetime()-timedelta(minutes=390)},
-			{'time':now_datetime()-timedelta(minutes=300)},
-			{'time':now_datetime()-timedelta(minutes=270)},
-			{'time':now_datetime()-timedelta(minutes=90)},
-			{'time':now_datetime()-timedelta(minutes=0)}
-			]
+			{"time": now_datetime() - timedelta(minutes=390)},
+			{"time": now_datetime() - timedelta(minutes=300)},
+			{"time": now_datetime() - timedelta(minutes=270)},
+			{"time": now_datetime() - timedelta(minutes=90)},
+			{"time": now_datetime() - timedelta(minutes=0)},
+		]
 		logs_type_2 = [
-			{'time':now_datetime()-timedelta(minutes=390),'log_type':'OUT'},
-			{'time':now_datetime()-timedelta(minutes=360),'log_type':'IN'},
-			{'time':now_datetime()-timedelta(minutes=300),'log_type':'OUT'},
-			{'time':now_datetime()-timedelta(minutes=290),'log_type':'IN'},
-			{'time':now_datetime()-timedelta(minutes=260),'log_type':'OUT'},
-			{'time':now_datetime()-timedelta(minutes=240),'log_type':'IN'},
-			{'time':now_datetime()-timedelta(minutes=150),'log_type':'IN'},
-			{'time':now_datetime()-timedelta(minutes=60),'log_type':'OUT'}
-			]
+			{"time": now_datetime() - timedelta(minutes=390), "log_type": "OUT"},
+			{"time": now_datetime() - timedelta(minutes=360), "log_type": "IN"},
+			{"time": now_datetime() - timedelta(minutes=300), "log_type": "OUT"},
+			{"time": now_datetime() - timedelta(minutes=290), "log_type": "IN"},
+			{"time": now_datetime() - timedelta(minutes=260), "log_type": "OUT"},
+			{"time": now_datetime() - timedelta(minutes=240), "log_type": "IN"},
+			{"time": now_datetime() - timedelta(minutes=150), "log_type": "IN"},
+			{"time": now_datetime() - timedelta(minutes=60), "log_type": "OUT"},
+		]
 		logs_type_1 = [frappe._dict(x) for x in logs_type_1]
 		logs_type_2 = [frappe._dict(x) for x in logs_type_2]
 
-		working_hours = calculate_working_hours(logs_type_1,check_in_out_type[0],working_hours_calc_type[0])
+		working_hours = calculate_working_hours(
+			logs_type_1, check_in_out_type[0], working_hours_calc_type[0]
+		)
 		self.assertEqual(working_hours, (6.5, logs_type_1[0].time, logs_type_1[-1].time))
 
-		working_hours = calculate_working_hours(logs_type_1,check_in_out_type[0],working_hours_calc_type[1])
+		working_hours = calculate_working_hours(
+			logs_type_1, check_in_out_type[0], working_hours_calc_type[1]
+		)
 		self.assertEqual(working_hours, (4.5, logs_type_1[0].time, logs_type_1[-1].time))
 
-		working_hours = calculate_working_hours(logs_type_2,check_in_out_type[1],working_hours_calc_type[0])
+		working_hours = calculate_working_hours(
+			logs_type_2, check_in_out_type[1], working_hours_calc_type[0]
+		)
 		self.assertEqual(working_hours, (5, logs_type_2[1].time, logs_type_2[-1].time))
 
-		working_hours = calculate_working_hours(logs_type_2,check_in_out_type[1],working_hours_calc_type[1])
+		working_hours = calculate_working_hours(
+			logs_type_2, check_in_out_type[1], working_hours_calc_type[1]
+		)
 		self.assertEqual(working_hours, (4.5, logs_type_2[1].time, logs_type_2[-1].time))
 
+
 def make_n_checkins(employee, n, hours_to_reverse=1):
-	logs = [make_checkin(employee, now_datetime() - timedelta(hours=hours_to_reverse, minutes=n+1))]
-	for i in range(n-1):
-		logs.append(make_checkin(employee, now_datetime() - timedelta(hours=hours_to_reverse, minutes=n-i)))
+	logs = [make_checkin(employee, now_datetime() - timedelta(hours=hours_to_reverse, minutes=n + 1))]
+	for i in range(n - 1):
+		logs.append(
+			make_checkin(employee, now_datetime() - timedelta(hours=hours_to_reverse, minutes=n - i))
+		)
 	return logs
 
 
 def make_checkin(employee, time=now_datetime()):
-	log = frappe.get_doc({
-		"doctype": "Employee Checkin",
-		"employee" : employee,
-		"time" : time,
-		"device_id" : "device1",
-		"log_type" : "IN"
-		}).insert()
+	log = frappe.get_doc(
+		{
+			"doctype": "Employee Checkin",
+			"employee": employee,
+			"time": time,
+			"device_id": "device1",
+			"log_type": "IN",
+		}
+	).insert()
 	return log
diff --git a/erpnext/hr/doctype/employee_grade/employee_grade_dashboard.py b/erpnext/hr/doctype/employee_grade/employee_grade_dashboard.py
index 6825dae..efc68ce 100644
--- a/erpnext/hr/doctype/employee_grade/employee_grade_dashboard.py
+++ b/erpnext/hr/doctype/employee_grade/employee_grade_dashboard.py
@@ -1,11 +1,9 @@
 def get_data():
 	return {
-		'transactions': [
+		"transactions": [
 			{
-				'items': ['Employee', 'Leave Period'],
+				"items": ["Employee", "Leave Period"],
 			},
-			{
-				'items': ['Employee Onboarding Template', 'Employee Separation Template']
-			}
+			{"items": ["Employee Onboarding Template", "Employee Separation Template"]},
 		]
 	}
diff --git a/erpnext/hr/doctype/employee_grievance/employee_grievance.py b/erpnext/hr/doctype/employee_grievance/employee_grievance.py
index fd9a33b..45de79f 100644
--- a/erpnext/hr/doctype/employee_grievance/employee_grievance.py
+++ b/erpnext/hr/doctype/employee_grievance/employee_grievance.py
@@ -9,7 +9,8 @@
 class EmployeeGrievance(Document):
 	def on_submit(self):
 		if self.status not in ["Invalid", "Resolved"]:
-			frappe.throw(_("Only Employee Grievance with status {0} or {1} can be submitted").format(
-				bold("Invalid"),
-				bold("Resolved"))
+			frappe.throw(
+				_("Only Employee Grievance with status {0} or {1} can be submitted").format(
+					bold("Invalid"), bold("Resolved")
+				)
 			)
diff --git a/erpnext/hr/doctype/employee_grievance/test_employee_grievance.py b/erpnext/hr/doctype/employee_grievance/test_employee_grievance.py
index e2d0002..910d882 100644
--- a/erpnext/hr/doctype/employee_grievance/test_employee_grievance.py
+++ b/erpnext/hr/doctype/employee_grievance/test_employee_grievance.py
@@ -13,6 +13,7 @@
 	def test_create_employee_grievance(self):
 		create_employee_grievance()
 
+
 def create_employee_grievance():
 	grievance_type = create_grievance_type()
 	emp_1 = make_employee("test_emp_grievance_@example.com", company="_Test Company")
@@ -27,10 +28,10 @@
 	grievance.grievance_against = emp_2
 	grievance.description = "test descrip"
 
-	#set cause
+	# set cause
 	grievance.cause_of_grievance = "test cause"
 
-	#resolution details
+	# resolution details
 	grievance.resolution_date = today()
 	grievance.resolution_detail = "test resolution detail"
 	grievance.resolved_by = "test_emp_grievance_@example.com"
diff --git a/erpnext/hr/doctype/employee_group/test_employee_group.py b/erpnext/hr/doctype/employee_group/test_employee_group.py
index a87f400..3922f54 100644
--- a/erpnext/hr/doctype/employee_group/test_employee_group.py
+++ b/erpnext/hr/doctype/employee_group/test_employee_group.py
@@ -11,17 +11,16 @@
 class TestEmployeeGroup(unittest.TestCase):
 	pass
 
+
 def make_employee_group():
 	employee = make_employee("testemployee@example.com")
-	employee_group = frappe.get_doc({
-		"doctype": "Employee Group",
-		"employee_group_name": "_Test Employee Group",
-		"employee_list": [
-			{
-				"employee": employee
-			}
-		]
-	})
+	employee_group = frappe.get_doc(
+		{
+			"doctype": "Employee Group",
+			"employee_group_name": "_Test Employee Group",
+			"employee_list": [{"employee": employee}],
+		}
+	)
 	employee_group_exist = frappe.db.exists("Employee Group", "_Test Employee Group")
 	if not employee_group_exist:
 		employee_group.insert()
@@ -29,6 +28,7 @@
 	else:
 		return employee_group_exist
 
+
 def get_employee_group():
 	employee_group = frappe.db.exists("Employee Group", "_Test Employee Group")
 	return employee_group
diff --git a/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py
index a0939a8..059f83a 100644
--- a/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py
+++ b/erpnext/hr/doctype/employee_onboarding/employee_onboarding.py
@@ -9,7 +9,9 @@
 from erpnext.controllers.employee_boarding_controller import EmployeeBoardingController
 
 
-class IncompleteTaskError(frappe.ValidationError): pass
+class IncompleteTaskError(frappe.ValidationError):
+	pass
+
 
 class EmployeeOnboarding(EmployeeBoardingController):
 	def validate(self):
@@ -19,12 +21,18 @@
 
 	def set_employee(self):
 		if not self.employee:
-			self.employee = frappe.db.get_value('Employee', {'job_applicant': self.job_applicant}, 'name')
+			self.employee = frappe.db.get_value("Employee", {"job_applicant": self.job_applicant}, "name")
 
 	def validate_duplicate_employee_onboarding(self):
-		emp_onboarding = frappe.db.exists("Employee Onboarding", {"job_applicant": self.job_applicant, "docstatus": ("!=", 2)})
+		emp_onboarding = frappe.db.exists(
+			"Employee Onboarding", {"job_applicant": self.job_applicant, "docstatus": ("!=", 2)}
+		)
 		if emp_onboarding and emp_onboarding != self.name:
-			frappe.throw(_("Employee Onboarding: {0} already exists for Job Applicant: {1}").format(frappe.bold(emp_onboarding), frappe.bold(self.job_applicant)))
+			frappe.throw(
+				_("Employee Onboarding: {0} already exists for Job Applicant: {1}").format(
+					frappe.bold(emp_onboarding), frappe.bold(self.job_applicant)
+				)
+			)
 
 	def validate_employee_creation(self):
 		if self.docstatus != 1:
@@ -36,7 +44,10 @@
 				else:
 					task_status = frappe.db.get_value("Task", activity.task, "status")
 					if task_status not in ["Completed", "Cancelled"]:
-						frappe.throw(_("All the mandatory tasks for employee creation are not completed yet."), IncompleteTaskError)
+						frappe.throw(
+							_("All the mandatory tasks for employee creation are not completed yet."),
+							IncompleteTaskError,
+						)
 
 	def on_submit(self):
 		super(EmployeeOnboarding, self).on_submit()
@@ -47,19 +58,29 @@
 	def on_cancel(self):
 		super(EmployeeOnboarding, self).on_cancel()
 
+
 @frappe.whitelist()
 def make_employee(source_name, target_doc=None):
 	doc = frappe.get_doc("Employee Onboarding", source_name)
 	doc.validate_employee_creation()
+
 	def set_missing_values(source, target):
 		target.personal_email = frappe.db.get_value("Job Applicant", source.job_applicant, "email_id")
 		target.status = "Active"
-	doc = get_mapped_doc("Employee Onboarding", source_name, {
+
+	doc = get_mapped_doc(
+		"Employee Onboarding",
+		source_name,
+		{
 			"Employee Onboarding": {
 				"doctype": "Employee",
 				"field_map": {
 					"first_name": "employee_name",
 					"employee_grade": "grade",
-				}}
-		}, target_doc, set_missing_values)
+				},
+			}
+		},
+		target_doc,
+		set_missing_values,
+	)
 	return doc
diff --git a/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py b/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py
index 0fb821d..9d91e4b 100644
--- a/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py
+++ b/erpnext/hr/doctype/employee_onboarding/test_employee_onboarding.py
@@ -16,8 +16,8 @@
 
 class TestEmployeeOnboarding(unittest.TestCase):
 	def setUp(self):
-		if frappe.db.exists('Employee Onboarding', {'employee_name': 'Test Researcher'}):
-			frappe.delete_doc('Employee Onboarding', {'employee_name': 'Test Researcher'})
+		if frappe.db.exists("Employee Onboarding", {"employee_name": "Test Researcher"}):
+			frappe.delete_doc("Employee Onboarding", {"employee_name": "Test Researcher"})
 
 		project = "Employee Onboarding : test@researcher.com"
 		frappe.db.sql("delete from tabProject where name=%s", project)
@@ -26,100 +26,109 @@
 	def test_employee_onboarding_incomplete_task(self):
 		onboarding = create_employee_onboarding()
 
-		project_name = frappe.db.get_value('Project', onboarding.project, 'project_name')
-		self.assertEqual(project_name, 'Employee Onboarding : test@researcher.com')
+		project_name = frappe.db.get_value("Project", onboarding.project, "project_name")
+		self.assertEqual(project_name, "Employee Onboarding : test@researcher.com")
 
 		# don't allow making employee if onboarding is not complete
 		self.assertRaises(IncompleteTaskError, make_employee, onboarding.name)
 
 		# boarding status
-		self.assertEqual(onboarding.boarding_status, 'Pending')
+		self.assertEqual(onboarding.boarding_status, "Pending")
 
 		# start and end dates
-		start_date, end_date = frappe.db.get_value('Task', onboarding.activities[0].task, ['exp_start_date', 'exp_end_date'])
+		start_date, end_date = frappe.db.get_value(
+			"Task", onboarding.activities[0].task, ["exp_start_date", "exp_end_date"]
+		)
 		self.assertEqual(getdate(start_date), getdate(onboarding.boarding_begins_on))
 		self.assertEqual(getdate(end_date), add_days(start_date, onboarding.activities[0].duration))
 
-		start_date, end_date = frappe.db.get_value('Task', onboarding.activities[1].task, ['exp_start_date', 'exp_end_date'])
-		self.assertEqual(getdate(start_date), add_days(onboarding.boarding_begins_on, onboarding.activities[0].duration))
+		start_date, end_date = frappe.db.get_value(
+			"Task", onboarding.activities[1].task, ["exp_start_date", "exp_end_date"]
+		)
+		self.assertEqual(
+			getdate(start_date), add_days(onboarding.boarding_begins_on, onboarding.activities[0].duration)
+		)
 		self.assertEqual(getdate(end_date), add_days(start_date, onboarding.activities[1].duration))
 
 		# complete the task
-		project = frappe.get_doc('Project', onboarding.project)
-		for task in frappe.get_all('Task', dict(project=project.name)):
-			task = frappe.get_doc('Task', task.name)
-			task.status = 'Completed'
+		project = frappe.get_doc("Project", onboarding.project)
+		for task in frappe.get_all("Task", dict(project=project.name)):
+			task = frappe.get_doc("Task", task.name)
+			task.status = "Completed"
 			task.save()
 
 		# boarding status
 		onboarding.reload()
-		self.assertEqual(onboarding.boarding_status, 'Completed')
+		self.assertEqual(onboarding.boarding_status, "Completed")
 
 		# make employee
 		onboarding.reload()
 		employee = make_employee(onboarding.name)
 		employee.first_name = employee.employee_name
 		employee.date_of_joining = getdate()
-		employee.date_of_birth = '1990-05-08'
-		employee.gender = 'Female'
+		employee.date_of_birth = "1990-05-08"
+		employee.gender = "Female"
 		employee.insert()
-		self.assertEqual(employee.employee_name, 'Test Researcher')
+		self.assertEqual(employee.employee_name, "Test Researcher")
 
 	def tearDown(self):
 		frappe.db.rollback()
 
 
 def get_job_applicant():
-	if frappe.db.exists('Job Applicant', 'test@researcher.com'):
-		return frappe.get_doc('Job Applicant', 'test@researcher.com')
-	applicant = frappe.new_doc('Job Applicant')
-	applicant.applicant_name = 'Test Researcher'
-	applicant.email_id = 'test@researcher.com'
-	applicant.designation = 'Researcher'
-	applicant.status = 'Open'
-	applicant.cover_letter = 'I am a great Researcher.'
+	if frappe.db.exists("Job Applicant", "test@researcher.com"):
+		return frappe.get_doc("Job Applicant", "test@researcher.com")
+	applicant = frappe.new_doc("Job Applicant")
+	applicant.applicant_name = "Test Researcher"
+	applicant.email_id = "test@researcher.com"
+	applicant.designation = "Researcher"
+	applicant.status = "Open"
+	applicant.cover_letter = "I am a great Researcher."
 	applicant.insert()
 	return applicant
 
+
 def get_job_offer(applicant_name):
-	job_offer = frappe.db.exists('Job Offer', {'job_applicant': applicant_name})
+	job_offer = frappe.db.exists("Job Offer", {"job_applicant": applicant_name})
 	if job_offer:
-		return frappe.get_doc('Job Offer', job_offer)
+		return frappe.get_doc("Job Offer", job_offer)
 
 	job_offer = create_job_offer(job_applicant=applicant_name)
 	job_offer.submit()
 	return job_offer
 
+
 def create_employee_onboarding():
 	applicant = get_job_applicant()
 	job_offer = get_job_offer(applicant.name)
 
-	holiday_list = make_holiday_list('_Test Employee Boarding')
-	holiday_list = frappe.get_doc('Holiday List', holiday_list)
+	holiday_list = make_holiday_list("_Test Employee Boarding")
+	holiday_list = frappe.get_doc("Holiday List", holiday_list)
 	holiday_list.holidays = []
 	holiday_list.save()
 
-	onboarding = frappe.new_doc('Employee Onboarding')
+	onboarding = frappe.new_doc("Employee Onboarding")
 	onboarding.job_applicant = applicant.name
 	onboarding.job_offer = job_offer.name
 	onboarding.date_of_joining = onboarding.boarding_begins_on = getdate()
-	onboarding.company = '_Test Company'
+	onboarding.company = "_Test Company"
 	onboarding.holiday_list = holiday_list.name
-	onboarding.designation = 'Researcher'
-	onboarding.append('activities', {
-		'activity_name': 'Assign ID Card',
-		'role': 'HR User',
-		'required_for_employee_creation': 1,
-		'begin_on': 0,
-		'duration': 1
-	})
-	onboarding.append('activities', {
-		'activity_name': 'Assign a laptop',
-		'role': 'HR User',
-		'begin_on': 1,
-		'duration': 1
-	})
-	onboarding.status = 'Pending'
+	onboarding.designation = "Researcher"
+	onboarding.append(
+		"activities",
+		{
+			"activity_name": "Assign ID Card",
+			"role": "HR User",
+			"required_for_employee_creation": 1,
+			"begin_on": 0,
+			"duration": 1,
+		},
+	)
+	onboarding.append(
+		"activities",
+		{"activity_name": "Assign a laptop", "role": "HR User", "begin_on": 1, "duration": 1},
+	)
+	onboarding.status = "Pending"
 	onboarding.insert()
 	onboarding.submit()
 
diff --git a/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template_dashboard.py b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template_dashboard.py
index 3b846a0..93237ee 100644
--- a/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template_dashboard.py
+++ b/erpnext/hr/doctype/employee_onboarding_template/employee_onboarding_template_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'employee_onboarding_template',
-        'transactions': [
-            {
-                'items': ['Employee Onboarding']
-            },
-        ],
-    }
+	return {
+		"fieldname": "employee_onboarding_template",
+		"transactions": [
+			{"items": ["Employee Onboarding"]},
+		],
+	}
diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.py b/erpnext/hr/doctype/employee_promotion/employee_promotion.py
index cf6156e..d77c1dd 100644
--- a/erpnext/hr/doctype/employee_promotion/employee_promotion.py
+++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.py
@@ -16,12 +16,16 @@
 
 	def before_submit(self):
 		if getdate(self.promotion_date) > getdate():
-			frappe.throw(_("Employee Promotion cannot be submitted before Promotion Date"),
-				frappe.DocstatusTransitionError)
+			frappe.throw(
+				_("Employee Promotion cannot be submitted before Promotion Date"),
+				frappe.DocstatusTransitionError,
+			)
 
 	def on_submit(self):
 		employee = frappe.get_doc("Employee", self.employee)
-		employee = update_employee_work_history(employee, self.promotion_details, date=self.promotion_date)
+		employee = update_employee_work_history(
+			employee, self.promotion_details, date=self.promotion_date
+		)
 		employee.save()
 
 	def on_cancel(self):
diff --git a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py
index fc9d195..06825ec 100644
--- a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py
+++ b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py
@@ -15,18 +15,20 @@
 		frappe.db.sql("""delete from `tabEmployee Promotion`""")
 
 	def test_submit_before_promotion_date(self):
-		promotion_obj = frappe.get_doc({
-			"doctype": "Employee Promotion",
-			"employee": self.employee,
-			"promotion_details" :[
-				{
-				"property": "Designation",
-				"current": "Software Developer",
-				"new": "Project Manager",
-				"fieldname": "designation"
-				}
-			]
-		})
+		promotion_obj = frappe.get_doc(
+			{
+				"doctype": "Employee Promotion",
+				"employee": self.employee,
+				"promotion_details": [
+					{
+						"property": "Designation",
+						"current": "Software Developer",
+						"new": "Project Manager",
+						"fieldname": "designation",
+					}
+				],
+			}
+		)
 		promotion_obj.promotion_date = add_days(getdate(), 1)
 		promotion_obj.save()
 		self.assertRaises(frappe.DocstatusTransitionError, promotion_obj.submit)
diff --git a/erpnext/hr/doctype/employee_referral/employee_referral.py b/erpnext/hr/doctype/employee_referral/employee_referral.py
index eaa42c7..47cbfbc 100644
--- a/erpnext/hr/doctype/employee_referral/employee_referral.py
+++ b/erpnext/hr/doctype/employee_referral/employee_referral.py
@@ -30,7 +30,7 @@
 @frappe.whitelist()
 def create_job_applicant(source_name, target_doc=None):
 	emp_ref = frappe.get_doc("Employee Referral", source_name)
-	#just for Api call if some set status apart from default Status
+	# just for Api call if some set status apart from default Status
 	status = emp_ref.status
 	if emp_ref.status in ["Pending", "In process"]:
 		status = "Open"
@@ -47,9 +47,13 @@
 	job_applicant.resume_link = emp_ref.resume_link
 	job_applicant.save()
 
-	frappe.msgprint(_("Job Applicant {0} created successfully.").format(
-		get_link_to_form("Job Applicant", job_applicant.name)),
-		title=_("Success"), indicator="green")
+	frappe.msgprint(
+		_("Job Applicant {0} created successfully.").format(
+			get_link_to_form("Job Applicant", job_applicant.name)
+		),
+		title=_("Success"),
+		indicator="green",
+	)
 
 	emp_ref.db_set("status", "In Process")
 
@@ -60,7 +64,6 @@
 def create_additional_salary(doc):
 	import json
 
-
 	if isinstance(doc, str):
 		doc = frappe._dict(json.loads(doc))
 
diff --git a/erpnext/hr/doctype/employee_referral/employee_referral_dashboard.py b/erpnext/hr/doctype/employee_referral/employee_referral_dashboard.py
index 07c2402..4d683fb 100644
--- a/erpnext/hr/doctype/employee_referral/employee_referral_dashboard.py
+++ b/erpnext/hr/doctype/employee_referral/employee_referral_dashboard.py
@@ -1,13 +1,8 @@
 def get_data():
 	return {
-		'fieldname': 'employee_referral',
-		'non_standard_fieldnames': {
-			'Additional Salary': 'ref_docname'
-		},
-		'transactions': [
-			{
-				'items': ['Job Applicant', 'Additional Salary']
-			},
-
-		]
+		"fieldname": "employee_referral",
+		"non_standard_fieldnames": {"Additional Salary": "ref_docname"},
+		"transactions": [
+			{"items": ["Job Applicant", "Additional Salary"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/employee_referral/test_employee_referral.py b/erpnext/hr/doctype/employee_referral/test_employee_referral.py
index 529e355..475a935 100644
--- a/erpnext/hr/doctype/employee_referral/test_employee_referral.py
+++ b/erpnext/hr/doctype/employee_referral/test_employee_referral.py
@@ -15,7 +15,6 @@
 
 
 class TestEmployeeReferral(unittest.TestCase):
-
 	def setUp(self):
 		frappe.db.sql("DELETE FROM `tabJob Applicant`")
 		frappe.db.sql("DELETE FROM `tabEmployee Referral`")
@@ -23,13 +22,12 @@
 	def test_workflow_and_status_sync(self):
 		emp_ref = create_employee_referral()
 
-		#Check Initial status
+		# Check Initial status
 		self.assertTrue(emp_ref.status, "Pending")
 
 		job_applicant = create_job_applicant(emp_ref.name)
 
-
-		#Check status sync
+		# Check status sync
 		emp_ref.reload()
 		self.assertTrue(emp_ref.status, "In Process")
 
@@ -47,7 +45,6 @@
 		emp_ref.reload()
 		self.assertTrue(emp_ref.status, "Accepted")
 
-
 		# Check for Referral reference in additional salary
 
 		add_sal = create_additional_salary(emp_ref)
diff --git a/erpnext/hr/doctype/employee_separation/test_employee_separation.py b/erpnext/hr/doctype/employee_separation/test_employee_separation.py
index f83c1e5..df31d09 100644
--- a/erpnext/hr/doctype/employee_separation/test_employee_separation.py
+++ b/erpnext/hr/doctype/employee_separation/test_employee_separation.py
@@ -6,44 +6,43 @@
 import frappe
 from frappe.utils import getdate
 
-test_dependencies = ['Employee Onboarding']
+test_dependencies = ["Employee Onboarding"]
+
 
 class TestEmployeeSeparation(unittest.TestCase):
 	def test_employee_separation(self):
 		separation = create_employee_separation()
 
 		self.assertEqual(separation.docstatus, 1)
-		self.assertEqual(separation.boarding_status, 'Pending')
+		self.assertEqual(separation.boarding_status, "Pending")
 
-		project = frappe.get_doc('Project', separation.project)
-		project.percent_complete_method = 'Manual'
-		project.status = 'Completed'
+		project = frappe.get_doc("Project", separation.project)
+		project.percent_complete_method = "Manual"
+		project.status = "Completed"
 		project.save()
 
 		separation.reload()
-		self.assertEqual(separation.boarding_status, 'Completed')
+		self.assertEqual(separation.boarding_status, "Completed")
 
 		separation.cancel()
-		self.assertEqual(separation.project, '')
+		self.assertEqual(separation.project, "")
 
 	def tearDown(self):
-		for entry in frappe.get_all('Employee Separation'):
-			doc = frappe.get_doc('Employee Separation', entry.name)
+		for entry in frappe.get_all("Employee Separation"):
+			doc = frappe.get_doc("Employee Separation", entry.name)
 			if doc.docstatus == 1:
 				doc.cancel()
 			doc.delete()
 
+
 def create_employee_separation():
-	employee = frappe.db.get_value('Employee', {'status': 'Active', 'company': '_Test Company'})
-	separation = frappe.new_doc('Employee Separation')
+	employee = frappe.db.get_value("Employee", {"status": "Active", "company": "_Test Company"})
+	separation = frappe.new_doc("Employee Separation")
 	separation.employee = employee
 	separation.boarding_begins_on = getdate()
-	separation.company = '_Test Company'
-	separation.append('activities', {
-		'activity_name': 'Deactivate Employee',
-		'role': 'HR User'
-	})
-	separation.boarding_status = 'Pending'
+	separation.company = "_Test Company"
+	separation.append("activities", {"activity_name": "Deactivate Employee", "role": "HR User"})
+	separation.boarding_status = "Pending"
 	separation.insert()
 	separation.submit()
 	return separation
diff --git a/erpnext/hr/doctype/employee_separation_template/employee_separation_template_dashboard.py b/erpnext/hr/doctype/employee_separation_template/employee_separation_template_dashboard.py
index 6e2a83e..3ffd8dd 100644
--- a/erpnext/hr/doctype/employee_separation_template/employee_separation_template_dashboard.py
+++ b/erpnext/hr/doctype/employee_separation_template/employee_separation_template_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'employee_separation_template',
-        'transactions': [
-            {
-                'items': ['Employee Separation']
-            },
-        ],
-    }
+	return {
+		"fieldname": "employee_separation_template",
+		"transactions": [
+			{"items": ["Employee Separation"]},
+		],
+	}
diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.py b/erpnext/hr/doctype/employee_transfer/employee_transfer.py
index f927d41..6dbefe5 100644
--- a/erpnext/hr/doctype/employee_transfer/employee_transfer.py
+++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.py
@@ -13,8 +13,10 @@
 class EmployeeTransfer(Document):
 	def before_submit(self):
 		if getdate(self.transfer_date) > getdate():
-			frappe.throw(_("Employee Transfer cannot be submitted before Transfer Date"),
-				frappe.DocstatusTransitionError)
+			frappe.throw(
+				_("Employee Transfer cannot be submitted before Transfer Date"),
+				frappe.DocstatusTransitionError,
+			)
 
 	def on_submit(self):
 		employee = frappe.get_doc("Employee", self.employee)
@@ -22,22 +24,26 @@
 			new_employee = frappe.copy_doc(employee)
 			new_employee.name = None
 			new_employee.employee_number = None
-			new_employee = update_employee_work_history(new_employee, self.transfer_details, date=self.transfer_date)
+			new_employee = update_employee_work_history(
+				new_employee, self.transfer_details, date=self.transfer_date
+			)
 			if self.new_company and self.company != self.new_company:
 				new_employee.internal_work_history = []
 				new_employee.date_of_joining = self.transfer_date
 				new_employee.company = self.new_company
-			#move user_id to new employee before insert
+			# move user_id to new employee before insert
 			if employee.user_id and not self.validate_user_in_details():
 				new_employee.user_id = employee.user_id
 				employee.db_set("user_id", "")
 			new_employee.insert()
 			self.db_set("new_employee_id", new_employee.name)
-			#relieve the old employee
+			# relieve the old employee
 			employee.db_set("relieving_date", self.transfer_date)
 			employee.db_set("status", "Left")
 		else:
-			employee = update_employee_work_history(employee, self.transfer_details, date=self.transfer_date)
+			employee = update_employee_work_history(
+				employee, self.transfer_details, date=self.transfer_date
+			)
 			if self.new_company and self.company != self.new_company:
 				employee.company = self.new_company
 				employee.date_of_joining = self.transfer_date
@@ -47,14 +53,18 @@
 		employee = frappe.get_doc("Employee", self.employee)
 		if self.create_new_employee_id:
 			if self.new_employee_id:
-				frappe.throw(_("Please delete the Employee {0} to cancel this document").format(
-					"<a href='/app/Form/Employee/{0}'>{0}</a>".format(self.new_employee_id)
-				))
-			#mark the employee as active
+				frappe.throw(
+					_("Please delete the Employee {0} to cancel this document").format(
+						"<a href='/app/Form/Employee/{0}'>{0}</a>".format(self.new_employee_id)
+					)
+				)
+			# mark the employee as active
 			employee.status = "Active"
-			employee.relieving_date = ''
+			employee.relieving_date = ""
 		else:
-			employee = update_employee_work_history(employee, self.transfer_details, date=self.transfer_date, cancel=True)
+			employee = update_employee_work_history(
+				employee, self.transfer_details, date=self.transfer_date, cancel=True
+			)
 		if self.new_company != self.company:
 			employee.company = self.company
 		employee.save()
diff --git a/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py
index 64eee40..37a190a 100644
--- a/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py
+++ b/erpnext/hr/doctype/employee_transfer/test_employee_transfer.py
@@ -19,18 +19,20 @@
 	def test_submit_before_transfer_date(self):
 		make_employee("employee2@transfers.com")
 
-		transfer_obj = frappe.get_doc({
-			"doctype": "Employee Transfer",
-			"employee": frappe.get_value("Employee", {"user_id":"employee2@transfers.com"}, "name"),
-			"transfer_details" :[
-				{
-				"property": "Designation",
-				"current": "Software Developer",
-				"new": "Project Manager",
-				"fieldname": "designation"
-				}
-			]
-		})
+		transfer_obj = frappe.get_doc(
+			{
+				"doctype": "Employee Transfer",
+				"employee": frappe.get_value("Employee", {"user_id": "employee2@transfers.com"}, "name"),
+				"transfer_details": [
+					{
+						"property": "Designation",
+						"current": "Software Developer",
+						"new": "Project Manager",
+						"fieldname": "designation",
+					}
+				],
+			}
+		)
 		transfer_obj.transfer_date = add_days(getdate(), 1)
 		transfer_obj.save()
 		self.assertRaises(frappe.DocstatusTransitionError, transfer_obj.submit)
@@ -42,32 +44,35 @@
 	def test_new_employee_creation(self):
 		make_employee("employee3@transfers.com")
 
-		transfer = frappe.get_doc({
-			"doctype": "Employee Transfer",
-			"employee": frappe.get_value("Employee", {"user_id":"employee3@transfers.com"}, "name"),
-			"create_new_employee_id": 1,
-			"transfer_date": getdate(),
-			"transfer_details" :[
-				{
-				"property": "Designation",
-				"current": "Software Developer",
-				"new": "Project Manager",
-				"fieldname": "designation"
-				}
-			]
-		}).insert()
+		transfer = frappe.get_doc(
+			{
+				"doctype": "Employee Transfer",
+				"employee": frappe.get_value("Employee", {"user_id": "employee3@transfers.com"}, "name"),
+				"create_new_employee_id": 1,
+				"transfer_date": getdate(),
+				"transfer_details": [
+					{
+						"property": "Designation",
+						"current": "Software Developer",
+						"new": "Project Manager",
+						"fieldname": "designation",
+					}
+				],
+			}
+		).insert()
 		transfer.submit()
 		self.assertTrue(transfer.new_employee_id)
 		self.assertEqual(frappe.get_value("Employee", transfer.new_employee_id, "status"), "Active")
 		self.assertEqual(frappe.get_value("Employee", transfer.employee, "status"), "Left")
 
 	def test_employee_history(self):
-		employee = make_employee("employee4@transfers.com",
+		employee = make_employee(
+			"employee4@transfers.com",
 			company="Test Company",
 			date_of_birth=getdate("30-09-1980"),
 			date_of_joining=getdate("01-10-2021"),
 			department="Accounts - TC",
-			designation="Accountant"
+			designation="Accountant",
 		)
 		transfer = create_employee_transfer(employee)
 
@@ -94,36 +99,40 @@
 
 def create_company():
 	if not frappe.db.exists("Company", "Test Company"):
-		frappe.get_doc({
-			"doctype": "Company",
-			"company_name": "Test Company",
-			"default_currency": "INR",
-			"country": "India"
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": "Test Company",
+				"default_currency": "INR",
+				"country": "India",
+			}
+		).insert()
 
 
 def create_employee_transfer(employee):
-	doc = frappe.get_doc({
-		"doctype": "Employee Transfer",
-		"employee": employee,
-		"transfer_date": getdate(),
-		"transfer_details": [
-			{
-				"property": "Designation",
-				"current": "Accountant",
-				"new": "Manager",
-				"fieldname": "designation"
-			},
-			{
-				"property": "Department",
-				"current": "Accounts - TC",
-				"new": "Management - TC",
-				"fieldname": "department"
-			}
-		]
-	})
+	doc = frappe.get_doc(
+		{
+			"doctype": "Employee Transfer",
+			"employee": employee,
+			"transfer_date": getdate(),
+			"transfer_details": [
+				{
+					"property": "Designation",
+					"current": "Accountant",
+					"new": "Manager",
+					"fieldname": "designation",
+				},
+				{
+					"property": "Department",
+					"current": "Accounts - TC",
+					"new": "Management - TC",
+					"fieldname": "department",
+				},
+			],
+		}
+	)
 
 	doc.save()
 	doc.submit()
 
-	return doc
\ No newline at end of file
+	return doc
diff --git a/erpnext/hr/doctype/employment_type/test_employment_type.py b/erpnext/hr/doctype/employment_type/test_employment_type.py
index c43f963..fdf6965 100644
--- a/erpnext/hr/doctype/employment_type/test_employment_type.py
+++ b/erpnext/hr/doctype/employment_type/test_employment_type.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Employment Type')
+test_records = frappe.get_test_records("Employment Type")
diff --git a/erpnext/hr/doctype/exit_interview/exit_interview.py b/erpnext/hr/doctype/exit_interview/exit_interview.py
index 59fb2fd..8317310 100644
--- a/erpnext/hr/doctype/exit_interview/exit_interview.py
+++ b/erpnext/hr/doctype/exit_interview/exit_interview.py
@@ -16,41 +16,45 @@
 		self.set_employee_email()
 
 	def validate_relieving_date(self):
-		if not frappe.db.get_value('Employee', self.employee, 'relieving_date'):
-			frappe.throw(_('Please set the relieving date for employee {0}').format(
-				get_link_to_form('Employee', self.employee)),
-				title=_('Relieving Date Missing'))
+		if not frappe.db.get_value("Employee", self.employee, "relieving_date"):
+			frappe.throw(
+				_("Please set the relieving date for employee {0}").format(
+					get_link_to_form("Employee", self.employee)
+				),
+				title=_("Relieving Date Missing"),
+			)
 
 	def validate_duplicate_interview(self):
-		doc = frappe.db.exists('Exit Interview', {
-			'employee': self.employee,
-			'name': ('!=', self.name),
-			'docstatus': ('!=', 2)
-		})
+		doc = frappe.db.exists(
+			"Exit Interview", {"employee": self.employee, "name": ("!=", self.name), "docstatus": ("!=", 2)}
+		)
 		if doc:
-			frappe.throw(_('Exit Interview {0} already exists for Employee: {1}').format(
-				get_link_to_form('Exit Interview', doc), frappe.bold(self.employee)),
-				frappe.DuplicateEntryError)
+			frappe.throw(
+				_("Exit Interview {0} already exists for Employee: {1}").format(
+					get_link_to_form("Exit Interview", doc), frappe.bold(self.employee)
+				),
+				frappe.DuplicateEntryError,
+			)
 
 	def set_employee_email(self):
-		employee = frappe.get_doc('Employee', self.employee)
+		employee = frappe.get_doc("Employee", self.employee)
 		self.email = get_employee_email(employee)
 
 	def on_submit(self):
-		if self.status != 'Completed':
-			frappe.throw(_('Only Completed documents can be submitted'))
+		if self.status != "Completed":
+			frappe.throw(_("Only Completed documents can be submitted"))
 
 		self.update_interview_date_in_employee()
 
 	def on_cancel(self):
 		self.update_interview_date_in_employee()
-		self.db_set('status', 'Cancelled')
+		self.db_set("status", "Cancelled")
 
 	def update_interview_date_in_employee(self):
 		if self.docstatus == 1:
-			frappe.db.set_value('Employee', self.employee, 'held_on', self.date)
+			frappe.db.set_value("Employee", self.employee, "held_on", self.date)
 		elif self.docstatus == 2:
-			frappe.db.set_value('Employee', self.employee, 'held_on', None)
+			frappe.db.set_value("Employee", self.employee, "held_on", None)
 
 
 @frappe.whitelist()
@@ -62,17 +66,19 @@
 	email_failure = []
 
 	for exit_interview in interviews:
-		interview = frappe.get_doc('Exit Interview', exit_interview.get('name'))
-		if interview.get('questionnaire_email_sent'):
+		interview = frappe.get_doc("Exit Interview", exit_interview.get("name"))
+		if interview.get("questionnaire_email_sent"):
 			continue
 
-		employee = frappe.get_doc('Employee', interview.employee)
+		employee = frappe.get_doc("Employee", interview.employee)
 		email = get_employee_email(employee)
 
 		context = interview.as_dict()
 		context.update(employee.as_dict())
-		template_name = frappe.db.get_single_value('HR Settings', 'exit_questionnaire_notification_template')
-		template = frappe.get_doc('Email Template', template_name)
+		template_name = frappe.db.get_single_value(
+			"HR Settings", "exit_questionnaire_notification_template"
+		)
+		template = frappe.get_doc("Email Template", template_name)
 
 		if email:
 			frappe.sendmail(
@@ -80,13 +86,13 @@
 				subject=template.subject,
 				message=frappe.render_template(template.response, context),
 				reference_doctype=interview.doctype,
-				reference_name=interview.name
+				reference_name=interview.name,
 			)
-			interview.db_set('questionnaire_email_sent', True)
+			interview.db_set("questionnaire_email_sent", True)
 			interview.notify_update()
 			email_success.append(email)
 		else:
-			email_failure.append(get_link_to_form('Employee', employee.name))
+			email_failure.append(get_link_to_form("Employee", employee.name))
 
 	show_email_summary(email_success, email_failure)
 
@@ -98,34 +104,43 @@
 		interviews = json.loads(interviews)
 
 	if not len(interviews):
-		frappe.throw(_('Atleast one interview has to be selected.'))
+		frappe.throw(_("Atleast one interview has to be selected."))
 
 	return interviews
 
 
 def validate_questionnaire_settings():
-	settings = frappe.db.get_value('HR Settings', 'HR Settings',
-		['exit_questionnaire_web_form', 'exit_questionnaire_notification_template'], as_dict=True)
+	settings = frappe.db.get_value(
+		"HR Settings",
+		"HR Settings",
+		["exit_questionnaire_web_form", "exit_questionnaire_notification_template"],
+		as_dict=True,
+	)
 
-	if not settings.exit_questionnaire_web_form or not settings.exit_questionnaire_notification_template:
+	if (
+		not settings.exit_questionnaire_web_form or not settings.exit_questionnaire_notification_template
+	):
 		frappe.throw(
-			_('Please set {0} and {1} in {2}.').format(
-				frappe.bold('Exit Questionnaire Web Form'),
-				frappe.bold('Notification Template'),
-				get_link_to_form('HR Settings', 'HR Settings')),
-			title=_('Settings Missing')
+			_("Please set {0} and {1} in {2}.").format(
+				frappe.bold("Exit Questionnaire Web Form"),
+				frappe.bold("Notification Template"),
+				get_link_to_form("HR Settings", "HR Settings"),
+			),
+			title=_("Settings Missing"),
 		)
 
 
 def show_email_summary(email_success, email_failure):
-	message = ''
+	message = ""
 	if email_success:
-		message += _('{0}: {1}').format(
-			frappe.bold('Sent Successfully'), ', '.join(email_success))
+		message += _("{0}: {1}").format(frappe.bold("Sent Successfully"), ", ".join(email_success))
 	if message and email_failure:
-		message += '<br><br>'
+		message += "<br><br>"
 	if email_failure:
-		message += _('{0} due to missing email information for employee(s): {1}').format(
-			frappe.bold('Sending Failed'), ', '.join(email_failure))
+		message += _("{0} due to missing email information for employee(s): {1}").format(
+			frappe.bold("Sending Failed"), ", ".join(email_failure)
+		)
 
-	frappe.msgprint(message, title=_('Exit Questionnaire'), indicator='blue', is_minimizable=True, wide=True)
+	frappe.msgprint(
+		message, title=_("Exit Questionnaire"), indicator="blue", is_minimizable=True, wide=True
+	)
diff --git a/erpnext/hr/doctype/exit_interview/test_exit_interview.py b/erpnext/hr/doctype/exit_interview/test_exit_interview.py
index 8e076ed..9c2c644 100644
--- a/erpnext/hr/doctype/exit_interview/test_exit_interview.py
+++ b/erpnext/hr/doctype/exit_interview/test_exit_interview.py
@@ -16,84 +16,88 @@
 
 class TestExitInterview(unittest.TestCase):
 	def setUp(self):
-		frappe.db.sql('delete from `tabExit Interview`')
+		frappe.db.sql("delete from `tabExit Interview`")
 
 	def test_duplicate_interview(self):
-		employee = make_employee('employeeexitint1@example.com')
-		frappe.db.set_value('Employee', employee, 'relieving_date', getdate())
+		employee = make_employee("employeeexitint1@example.com")
+		frappe.db.set_value("Employee", employee, "relieving_date", getdate())
 		interview = create_exit_interview(employee)
 
 		doc = frappe.copy_doc(interview)
 		self.assertRaises(frappe.DuplicateEntryError, doc.save)
 
 	def test_relieving_date_validation(self):
-		employee = make_employee('employeeexitint2@example.com')
+		employee = make_employee("employeeexitint2@example.com")
 		# unset relieving date
-		frappe.db.set_value('Employee', employee, 'relieving_date', None)
+		frappe.db.set_value("Employee", employee, "relieving_date", None)
 
 		interview = create_exit_interview(employee, save=False)
 		self.assertRaises(frappe.ValidationError, interview.save)
 
 		# set relieving date
-		frappe.db.set_value('Employee', employee, 'relieving_date', getdate())
+		frappe.db.set_value("Employee", employee, "relieving_date", getdate())
 		interview = create_exit_interview(employee)
 		self.assertTrue(interview.name)
 
 	def test_interview_date_updated_in_employee_master(self):
-		employee = make_employee('employeeexit3@example.com')
-		frappe.db.set_value('Employee', employee, 'relieving_date', getdate())
+		employee = make_employee("employeeexit3@example.com")
+		frappe.db.set_value("Employee", employee, "relieving_date", getdate())
 
 		interview = create_exit_interview(employee)
-		interview.status = 'Completed'
-		interview.employee_status = 'Exit Confirmed'
+		interview.status = "Completed"
+		interview.employee_status = "Exit Confirmed"
 
 		# exit interview date updated on submit
 		interview.submit()
-		self.assertEqual(frappe.db.get_value('Employee', employee, 'held_on'), interview.date)
+		self.assertEqual(frappe.db.get_value("Employee", employee, "held_on"), interview.date)
 
 		# exit interview reset on cancel
 		interview.reload()
 		interview.cancel()
-		self.assertEqual(frappe.db.get_value('Employee', employee, 'held_on'), None)
+		self.assertEqual(frappe.db.get_value("Employee", employee, "held_on"), None)
 
 	def test_send_exit_questionnaire(self):
 		create_custom_doctype()
 		create_webform()
 		template = create_notification_template()
 
-		webform = frappe.db.get_all('Web Form', limit=1)
-		frappe.db.set_value('HR Settings', 'HR Settings', {
-			'exit_questionnaire_web_form': webform[0].name,
-			'exit_questionnaire_notification_template': template
-		})
+		webform = frappe.db.get_all("Web Form", limit=1)
+		frappe.db.set_value(
+			"HR Settings",
+			"HR Settings",
+			{
+				"exit_questionnaire_web_form": webform[0].name,
+				"exit_questionnaire_notification_template": template,
+			},
+		)
 
-		employee = make_employee('employeeexit3@example.com')
-		frappe.db.set_value('Employee', employee, 'relieving_date', getdate())
+		employee = make_employee("employeeexit3@example.com")
+		frappe.db.set_value("Employee", employee, "relieving_date", getdate())
 
 		interview = create_exit_interview(employee)
 		send_exit_questionnaire([interview])
 
-		email_queue = frappe.db.get_all('Email Queue', ['name', 'message'], limit=1)
-		self.assertTrue('Subject: Exit Questionnaire Notification' in email_queue[0].message)
+		email_queue = frappe.db.get_all("Email Queue", ["name", "message"], limit=1)
+		self.assertTrue("Subject: Exit Questionnaire Notification" in email_queue[0].message)
 
 	def tearDown(self):
 		frappe.db.rollback()
 
 
 def create_exit_interview(employee, save=True):
-	interviewer = create_user('test_exit_interviewer@example.com')
+	interviewer = create_user("test_exit_interviewer@example.com")
 
-	doc = frappe.get_doc({
-		'doctype': 'Exit Interview',
-		'employee': employee,
-		'company': '_Test Company',
-		'status': 'Pending',
-		'date': getdate(),
-		'interviewers': [{
-			'interviewer': interviewer.name
-		}],
-		'interview_summary': 'Test'
-	})
+	doc = frappe.get_doc(
+		{
+			"doctype": "Exit Interview",
+			"employee": employee,
+			"company": "_Test Company",
+			"status": "Pending",
+			"date": getdate(),
+			"interviewers": [{"interviewer": interviewer.name}],
+			"interview_summary": "Test",
+		}
+	)
 
 	if save:
 		return doc.insert()
@@ -101,18 +105,22 @@
 
 
 def create_notification_template():
-	template = frappe.db.exists('Email Template', _('Exit Questionnaire Notification'))
+	template = frappe.db.exists("Email Template", _("Exit Questionnaire Notification"))
 	if not template:
-		base_path = frappe.get_app_path('erpnext', 'hr', 'doctype')
-		response = frappe.read_file(os.path.join(base_path, 'exit_interview/exit_questionnaire_notification_template.html'))
+		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
+		response = frappe.read_file(
+			os.path.join(base_path, "exit_interview/exit_questionnaire_notification_template.html")
+		)
 
-		template = frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _('Exit Questionnaire Notification'),
-			'response': response,
-			'subject': _('Exit Questionnaire Notification'),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		template = frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Exit Questionnaire Notification"),
+				"response": response,
+				"subject": _("Exit Questionnaire Notification"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 		template = template.name
 
-	return template
\ No newline at end of file
+	return template
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py
index 12a3112..89d86c1 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.py
@@ -13,13 +13,19 @@
 from erpnext.hr.utils import set_employee_name, share_doc_with_approver, validate_active_employee
 
 
-class InvalidExpenseApproverError(frappe.ValidationError): pass
-class ExpenseApproverIdentityError(frappe.ValidationError): pass
+class InvalidExpenseApproverError(frappe.ValidationError):
+	pass
+
+
+class ExpenseApproverIdentityError(frappe.ValidationError):
+	pass
+
 
 class ExpenseClaim(AccountsController):
 	def onload(self):
-		self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings',
-			'make_payment_via_journal_entry')
+		self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value(
+			"Accounts Settings", "make_payment_via_journal_entry"
+		)
 
 	def validate(self):
 		validate_active_employee(self.employee)
@@ -36,29 +42,35 @@
 			self.project = frappe.db.get_value("Task", self.task, "project")
 
 	def set_status(self, update=False):
-		status = {
-			"0": "Draft",
-			"1": "Submitted",
-			"2": "Cancelled"
-		}[cstr(self.docstatus or 0)]
+		status = {"0": "Draft", "1": "Submitted", "2": "Cancelled"}[cstr(self.docstatus or 0)]
 
 		precision = self.precision("grand_total")
 
 		if (
 			# set as paid
 			self.is_paid
-			or (flt(self.total_sanctioned_amount > 0) and (
-				# grand total is reimbursed
-				(self.docstatus == 1 and flt(self.grand_total, precision) == flt(self.total_amount_reimbursed, precision))
-				# grand total (to be paid) is 0 since linked advances already cover the claimed amount
-				or (flt(self.grand_total, precision) == 0)
-			))
+			or (
+				flt(self.total_sanctioned_amount > 0)
+				and (
+					# grand total is reimbursed
+					(
+						self.docstatus == 1
+						and flt(self.grand_total, precision) == flt(self.total_amount_reimbursed, precision)
+					)
+					# grand total (to be paid) is 0 since linked advances already cover the claimed amount
+					or (flt(self.grand_total, precision) == 0)
+				)
+			)
 		) and self.approval_status == "Approved":
 			status = "Paid"
-		elif flt(self.total_sanctioned_amount) > 0 and self.docstatus == 1 and self.approval_status == 'Approved':
+		elif (
+			flt(self.total_sanctioned_amount) > 0
+			and self.docstatus == 1
+			and self.approval_status == "Approved"
+		):
 			status = "Unpaid"
-		elif self.docstatus == 1 and self.approval_status == 'Rejected':
-			status = 'Rejected'
+		elif self.docstatus == 1 and self.approval_status == "Rejected":
+			status = "Rejected"
 
 		if update:
 			self.db_set("status", status)
@@ -70,14 +82,16 @@
 
 	def set_payable_account(self):
 		if not self.payable_account and not self.is_paid:
-			self.payable_account = frappe.get_cached_value('Company', self.company, 'default_expense_claim_payable_account')
+			self.payable_account = frappe.get_cached_value(
+				"Company", self.company, "default_expense_claim_payable_account"
+			)
 
 	def set_cost_center(self):
 		if not self.cost_center:
-			self.cost_center = frappe.get_cached_value('Company', self.company, 'cost_center')
+			self.cost_center = frappe.get_cached_value("Company", self.company, "cost_center")
 
 	def on_submit(self):
-		if self.approval_status=="Draft":
+		if self.approval_status == "Draft":
 			frappe.throw(_("""Approval Status must be 'Approved' or 'Rejected'"""))
 
 		self.update_task_and_project()
@@ -91,7 +105,7 @@
 
 	def on_cancel(self):
 		self.update_task_and_project()
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 		if self.payable_account:
 			self.make_gl_entries(cancel=True)
 
@@ -122,43 +136,51 @@
 		# payable entry
 		if self.grand_total:
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": self.payable_account,
-					"credit": self.grand_total,
-					"credit_in_account_currency": self.grand_total,
-					"against": ",".join([d.default_account for d in self.expenses]),
-					"party_type": "Employee",
-					"party": self.employee,
-					"against_voucher_type": self.doctype,
-					"against_voucher": self.name,
-					"cost_center": self.cost_center
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.payable_account,
+						"credit": self.grand_total,
+						"credit_in_account_currency": self.grand_total,
+						"against": ",".join([d.default_account for d in self.expenses]),
+						"party_type": "Employee",
+						"party": self.employee,
+						"against_voucher_type": self.doctype,
+						"against_voucher": self.name,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
 			)
 
 		# expense entries
 		for data in self.expenses:
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": data.default_account,
-					"debit": data.sanctioned_amount,
-					"debit_in_account_currency": data.sanctioned_amount,
-					"against": self.employee,
-					"cost_center": data.cost_center or self.cost_center
-				}, item=data)
+				self.get_gl_dict(
+					{
+						"account": data.default_account,
+						"debit": data.sanctioned_amount,
+						"debit_in_account_currency": data.sanctioned_amount,
+						"against": self.employee,
+						"cost_center": data.cost_center or self.cost_center,
+					},
+					item=data,
+				)
 			)
 
 		for data in self.advances:
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": data.advance_account,
-					"credit": data.allocated_amount,
-					"credit_in_account_currency": data.allocated_amount,
-					"against": ",".join([d.default_account for d in self.expenses]),
-					"party_type": "Employee",
-					"party": self.employee,
-					"against_voucher_type": "Employee Advance",
-					"against_voucher": data.employee_advance
-				})
+				self.get_gl_dict(
+					{
+						"account": data.advance_account,
+						"credit": data.allocated_amount,
+						"credit_in_account_currency": data.allocated_amount,
+						"against": ",".join([d.default_account for d in self.expenses]),
+						"party_type": "Employee",
+						"party": self.employee,
+						"against_voucher_type": "Employee Advance",
+						"against_voucher": data.employee_advance,
+					}
+				)
 			)
 
 		self.add_tax_gl_entries(gl_entry)
@@ -167,25 +189,31 @@
 			# payment entry
 			payment_account = get_bank_cash_account(self.mode_of_payment, self.company).get("account")
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": payment_account,
-					"credit": self.grand_total,
-					"credit_in_account_currency": self.grand_total,
-					"against": self.employee
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": payment_account,
+						"credit": self.grand_total,
+						"credit_in_account_currency": self.grand_total,
+						"against": self.employee,
+					},
+					item=self,
+				)
 			)
 
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": self.payable_account,
-					"party_type": "Employee",
-					"party": self.employee,
-					"against": payment_account,
-					"debit": self.grand_total,
-					"debit_in_account_currency": self.grand_total,
-					"against_voucher": self.name,
-					"against_voucher_type": self.doctype,
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.payable_account,
+						"party_type": "Employee",
+						"party": self.employee,
+						"against": payment_account,
+						"debit": self.grand_total,
+						"debit_in_account_currency": self.grand_total,
+						"against_voucher": self.name,
+						"against_voucher_type": self.doctype,
+					},
+					item=self,
+				)
 			)
 
 		return gl_entry
@@ -194,22 +222,28 @@
 		# tax table gl entries
 		for tax in self.get("taxes"):
 			gl_entries.append(
-				self.get_gl_dict({
-					"account": tax.account_head,
-					"debit": tax.tax_amount,
-					"debit_in_account_currency": tax.tax_amount,
-					"against": self.employee,
-					"cost_center": self.cost_center,
-					"against_voucher_type": self.doctype,
-					"against_voucher": self.name
-				}, item=tax)
+				self.get_gl_dict(
+					{
+						"account": tax.account_head,
+						"debit": tax.tax_amount,
+						"debit_in_account_currency": tax.tax_amount,
+						"against": self.employee,
+						"cost_center": self.cost_center,
+						"against_voucher_type": self.doctype,
+						"against_voucher": self.name,
+					},
+					item=tax,
+				)
 			)
 
 	def validate_account_details(self):
 		for data in self.expenses:
 			if not data.cost_center:
-				frappe.throw(_("Row {0}: {1} is required in the expenses table to book an expense claim.")
-					.format(data.idx, frappe.bold("Cost Center")))
+				frappe.throw(
+					_("Row {0}: {1} is required in the expenses table to book an expense claim.").format(
+						data.idx, frappe.bold("Cost Center")
+					)
+				)
 
 		if self.is_paid:
 			if not self.mode_of_payment:
@@ -218,8 +252,8 @@
 	def calculate_total_amount(self):
 		self.total_claimed_amount = 0
 		self.total_sanctioned_amount = 0
-		for d in self.get('expenses'):
-			if self.approval_status == 'Rejected':
+		for d in self.get("expenses"):
+			if self.approval_status == "Rejected":
 				d.sanctioned_amount = 0.0
 
 			self.total_claimed_amount += flt(d.amount)
@@ -230,12 +264,16 @@
 		self.total_taxes_and_charges = 0
 		for tax in self.taxes:
 			if tax.rate:
-				tax.tax_amount = flt(self.total_sanctioned_amount) * flt(tax.rate/100)
+				tax.tax_amount = flt(self.total_sanctioned_amount) * flt(tax.rate / 100)
 
 			tax.total = flt(tax.tax_amount) + flt(self.total_sanctioned_amount)
 			self.total_taxes_and_charges += flt(tax.tax_amount)
 
-		self.grand_total = flt(self.total_sanctioned_amount) + flt(self.total_taxes_and_charges) - flt(self.total_advance_amount)
+		self.grand_total = (
+			flt(self.total_sanctioned_amount)
+			+ flt(self.total_taxes_and_charges)
+			- flt(self.total_advance_amount)
+		)
 
 	def update_task(self):
 		task = frappe.get_doc("Task", self.task)
@@ -245,16 +283,23 @@
 	def validate_advances(self):
 		self.total_advance_amount = 0
 		for d in self.get("advances"):
-			ref_doc = frappe.db.get_value("Employee Advance", d.employee_advance,
-				["posting_date", "paid_amount", "claimed_amount", "advance_account"], as_dict=1)
+			ref_doc = frappe.db.get_value(
+				"Employee Advance",
+				d.employee_advance,
+				["posting_date", "paid_amount", "claimed_amount", "advance_account"],
+				as_dict=1,
+			)
 			d.posting_date = ref_doc.posting_date
 			d.advance_account = ref_doc.advance_account
 			d.advance_paid = ref_doc.paid_amount
 			d.unclaimed_amount = flt(ref_doc.paid_amount) - flt(ref_doc.claimed_amount)
 
 			if d.allocated_amount and flt(d.allocated_amount) > flt(d.unclaimed_amount):
-				frappe.throw(_("Row {0}# Allocated amount {1} cannot be greater than unclaimed amount {2}")
-					.format(d.idx, d.allocated_amount, d.unclaimed_amount))
+				frappe.throw(
+					_("Row {0}# Allocated amount {1} cannot be greater than unclaimed amount {2}").format(
+						d.idx, d.allocated_amount, d.unclaimed_amount
+					)
+				)
 
 			self.total_advance_amount += flt(d.allocated_amount)
 
@@ -263,27 +308,36 @@
 			if flt(self.total_advance_amount, precision) > flt(self.total_claimed_amount, precision):
 				frappe.throw(_("Total advance amount cannot be greater than total claimed amount"))
 
-			if self.total_sanctioned_amount \
-					and flt(self.total_advance_amount, precision) > flt(self.total_sanctioned_amount, precision):
+			if self.total_sanctioned_amount and flt(self.total_advance_amount, precision) > flt(
+				self.total_sanctioned_amount, precision
+			):
 				frappe.throw(_("Total advance amount cannot be greater than total sanctioned amount"))
 
 	def validate_sanctioned_amount(self):
-		for d in self.get('expenses'):
+		for d in self.get("expenses"):
 			if flt(d.sanctioned_amount) > flt(d.amount):
-				frappe.throw(_("Sanctioned Amount cannot be greater than Claim Amount in Row {0}.").format(d.idx))
+				frappe.throw(
+					_("Sanctioned Amount cannot be greater than Claim Amount in Row {0}.").format(d.idx)
+				)
 
 	def set_expense_account(self, validate=False):
 		for expense in self.expenses:
 			if not expense.default_account or not validate:
-				expense.default_account = get_expense_claim_account(expense.expense_type, self.company)["account"]
+				expense.default_account = get_expense_claim_account(expense.expense_type, self.company)[
+					"account"
+				]
+
 
 def update_reimbursed_amount(doc, amount):
 
 	doc.total_amount_reimbursed += amount
-	frappe.db.set_value("Expense Claim", doc.name , "total_amount_reimbursed", doc.total_amount_reimbursed)
+	frappe.db.set_value(
+		"Expense Claim", doc.name, "total_amount_reimbursed", doc.total_amount_reimbursed
+	)
 
 	doc.set_status()
-	frappe.db.set_value("Expense Claim", doc.name , "status", doc.status)
+	frappe.db.set_value("Expense Claim", doc.name, "status", doc.status)
+
 
 @frappe.whitelist()
 def make_bank_entry(dt, dn):
@@ -294,69 +348,80 @@
 	if not default_bank_cash_account:
 		default_bank_cash_account = get_default_bank_cash_account(expense_claim.company, "Cash")
 
-	payable_amount = flt(expense_claim.total_sanctioned_amount) \
-		- flt(expense_claim.total_amount_reimbursed) - flt(expense_claim.total_advance_amount)
+	payable_amount = (
+		flt(expense_claim.total_sanctioned_amount)
+		- flt(expense_claim.total_amount_reimbursed)
+		- flt(expense_claim.total_advance_amount)
+	)
 
 	je = frappe.new_doc("Journal Entry")
-	je.voucher_type = 'Bank Entry'
+	je.voucher_type = "Bank Entry"
 	je.company = expense_claim.company
-	je.remark = 'Payment against Expense Claim: ' + dn
+	je.remark = "Payment against Expense Claim: " + dn
 
-	je.append("accounts", {
-		"account": expense_claim.payable_account,
-		"debit_in_account_currency": payable_amount,
-		"reference_type": "Expense Claim",
-		"party_type": "Employee",
-		"party": expense_claim.employee,
-		"cost_center": erpnext.get_default_cost_center(expense_claim.company),
-		"reference_name": expense_claim.name
-	})
+	je.append(
+		"accounts",
+		{
+			"account": expense_claim.payable_account,
+			"debit_in_account_currency": payable_amount,
+			"reference_type": "Expense Claim",
+			"party_type": "Employee",
+			"party": expense_claim.employee,
+			"cost_center": erpnext.get_default_cost_center(expense_claim.company),
+			"reference_name": expense_claim.name,
+		},
+	)
 
-	je.append("accounts", {
-		"account": default_bank_cash_account.account,
-		"credit_in_account_currency": payable_amount,
-		"reference_type": "Expense Claim",
-		"reference_name": expense_claim.name,
-		"balance": default_bank_cash_account.balance,
-		"account_currency": default_bank_cash_account.account_currency,
-		"cost_center": erpnext.get_default_cost_center(expense_claim.company),
-		"account_type": default_bank_cash_account.account_type
-	})
+	je.append(
+		"accounts",
+		{
+			"account": default_bank_cash_account.account,
+			"credit_in_account_currency": payable_amount,
+			"reference_type": "Expense Claim",
+			"reference_name": expense_claim.name,
+			"balance": default_bank_cash_account.balance,
+			"account_currency": default_bank_cash_account.account_currency,
+			"cost_center": erpnext.get_default_cost_center(expense_claim.company),
+			"account_type": default_bank_cash_account.account_type,
+		},
+	)
 
 	return je.as_dict()
 
+
 @frappe.whitelist()
 def get_expense_claim_account_and_cost_center(expense_claim_type, company):
 	data = get_expense_claim_account(expense_claim_type, company)
 	cost_center = erpnext.get_default_cost_center(company)
 
-	return {
-		"account": data.get("account"),
-		"cost_center": cost_center
-	}
+	return {"account": data.get("account"), "cost_center": cost_center}
+
 
 @frappe.whitelist()
 def get_expense_claim_account(expense_claim_type, company):
-	account = frappe.db.get_value("Expense Claim Account",
-		{"parent": expense_claim_type, "company": company}, "default_account")
+	account = frappe.db.get_value(
+		"Expense Claim Account", {"parent": expense_claim_type, "company": company}, "default_account"
+	)
 	if not account:
-		frappe.throw(_("Set the default account for the {0} {1}")
-			.format(frappe.bold("Expense Claim Type"), get_link_to_form("Expense Claim Type", expense_claim_type)))
+		frappe.throw(
+			_("Set the default account for the {0} {1}").format(
+				frappe.bold("Expense Claim Type"), get_link_to_form("Expense Claim Type", expense_claim_type)
+			)
+		)
 
-	return {
-		"account": account
-	}
+	return {"account": account}
+
 
 @frappe.whitelist()
 def get_advances(employee, advance_id=None):
 	advance = frappe.qb.DocType("Employee Advance")
 
-	query = (
-		frappe.qb.from_(advance)
-		.select(
-			advance.name, advance.posting_date, advance.paid_amount,
-			advance.claimed_amount, advance.advance_account
-		)
+	query = frappe.qb.from_(advance).select(
+		advance.name,
+		advance.posting_date,
+		advance.paid_amount,
+		advance.claimed_amount,
+		advance.advance_account,
 	)
 
 	if not advance_id:
@@ -374,25 +439,26 @@
 
 @frappe.whitelist()
 def get_expense_claim(
-	employee_name, company, employee_advance_name, posting_date, paid_amount, claimed_amount):
-	default_payable_account = frappe.get_cached_value('Company',  company,  "default_payable_account")
-	default_cost_center = frappe.get_cached_value('Company',  company,  'cost_center')
+	employee_name, company, employee_advance_name, posting_date, paid_amount, claimed_amount
+):
+	default_payable_account = frappe.get_cached_value("Company", company, "default_payable_account")
+	default_cost_center = frappe.get_cached_value("Company", company, "cost_center")
 
-	expense_claim = frappe.new_doc('Expense Claim')
+	expense_claim = frappe.new_doc("Expense Claim")
 	expense_claim.company = company
 	expense_claim.employee = employee_name
 	expense_claim.payable_account = default_payable_account
 	expense_claim.cost_center = default_cost_center
 	expense_claim.is_paid = 1 if flt(paid_amount) else 0
 	expense_claim.append(
-		'advances',
+		"advances",
 		{
-			'employee_advance': employee_advance_name,
-			'posting_date': posting_date,
-			'advance_paid': flt(paid_amount),
-			'unclaimed_amount': flt(paid_amount) - flt(claimed_amount),
-			'allocated_amount': flt(paid_amount) - flt(claimed_amount)
-		}
+			"employee_advance": employee_advance_name,
+			"posting_date": posting_date,
+			"advance_paid": flt(paid_amount),
+			"unclaimed_amount": flt(paid_amount) - flt(claimed_amount),
+			"allocated_amount": flt(paid_amount) - flt(claimed_amount),
+		},
 	)
 
 	return expense_claim
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim_dashboard.py b/erpnext/hr/doctype/expense_claim/expense_claim_dashboard.py
index 7539c71..8b1acc6 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim_dashboard.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim_dashboard.py
@@ -3,18 +3,10 @@
 
 def get_data():
 	return {
-        'fieldname': 'reference_name',
-		'internal_links': {
-			'Employee Advance': ['advances', 'employee_advance']
-		},
-		'transactions': [
-			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Journal Entry']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Employee Advance']
-			},
-		]
+		"fieldname": "reference_name",
+		"internal_links": {"Employee Advance": ["advances", "employee_advance"]},
+		"transactions": [
+			{"label": _("Payment"), "items": ["Payment Entry", "Journal Entry"]},
+			{"label": _("Reference"), "items": ["Employee Advance"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/expense_claim/test_expense_claim.py b/erpnext/hr/doctype/expense_claim/test_expense_claim.py
index 1244cc4..9b3d53a 100644
--- a/erpnext/hr/doctype/expense_claim/test_expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/test_expense_claim.py
@@ -10,8 +10,8 @@
 from erpnext.hr.doctype.employee.test_employee import make_employee
 from erpnext.hr.doctype.expense_claim.expense_claim import make_bank_entry
 
-test_dependencies = ['Employee']
-company_name = '_Test Company 3'
+test_dependencies = ["Employee"]
+company_name = "_Test Company 3"
 
 
 class TestExpenseClaim(unittest.TestCase):
@@ -23,28 +23,26 @@
 		frappe.db.sql("""delete from `tabProject`""")
 		frappe.db.sql("update `tabExpense Claim` set project = '', task = ''")
 
-		project = frappe.get_doc({
-			"project_name": "_Test Project 1",
-			"doctype": "Project"
-		})
+		project = frappe.get_doc({"project_name": "_Test Project 1", "doctype": "Project"})
 		project.save()
 
-		task = frappe.get_doc(dict(
-			doctype = 'Task',
-			subject = '_Test Project Task 1',
-			status = 'Open',
-			project = project.name
-		)).insert()
+		task = frappe.get_doc(
+			dict(doctype="Task", subject="_Test Project Task 1", status="Open", project=project.name)
+		).insert()
 
 		task_name = task.name
 		payable_account = get_payable_account(company_name)
 
-		make_expense_claim(payable_account, 300, 200, company_name, "Travel Expenses - _TC3", project.name, task_name)
+		make_expense_claim(
+			payable_account, 300, 200, company_name, "Travel Expenses - _TC3", project.name, task_name
+		)
 
 		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 200)
 		self.assertEqual(frappe.db.get_value("Project", project.name, "total_expense_claim"), 200)
 
-		expense_claim2 = make_expense_claim(payable_account, 600, 500, company_name, "Travel Expenses - _TC3", project.name, task_name)
+		expense_claim2 = make_expense_claim(
+			payable_account, 600, 500, company_name, "Travel Expenses - _TC3", project.name, task_name
+		)
 
 		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 700)
 		self.assertEqual(frappe.db.get_value("Project", project.name, "total_expense_claim"), 700)
@@ -56,7 +54,9 @@
 
 	def test_expense_claim_status(self):
 		payable_account = get_payable_account(company_name)
-		expense_claim = make_expense_claim(payable_account, 300, 200, company_name, "Travel Expenses - _TC3")
+		expense_claim = make_expense_claim(
+			payable_account, 300, 200, company_name, "Travel Expenses - _TC3"
+		)
 
 		je_dict = make_bank_entry("Expense Claim", expense_claim.name)
 		je = frappe.get_doc(je_dict)
@@ -78,7 +78,9 @@
 		self.assertEqual(claim.status, "Submitted")
 
 		# no gl entries created
-		gl_entry = frappe.get_all('GL Entry', {'voucher_type': 'Expense Claim', 'voucher_no': claim.name})
+		gl_entry = frappe.get_all(
+			"GL Entry", {"voucher_type": "Expense Claim", "voucher_no": claim.name}
+		)
 		self.assertEqual(len(gl_entry), 0)
 
 	def test_expense_claim_against_fully_paid_advances(self):
@@ -91,7 +93,9 @@
 		frappe.db.delete("Employee Advance")
 
 		payable_account = get_payable_account("_Test Company")
-		claim = make_expense_claim(payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True)
+		claim = make_expense_claim(
+			payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True
+		)
 
 		advance = make_employee_advance(claim.employee)
 		pe = make_payment_entry(advance)
@@ -117,10 +121,12 @@
 		frappe.db.delete("Employee Advance")
 
 		payable_account = get_payable_account("_Test Company")
-		claim = make_expense_claim(payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True)
+		claim = make_expense_claim(
+			payable_account, 1000, 1000, "_Test Company", "Travel Expenses - _TC", do_not_submit=True
+		)
 
 		# link advance for partial amount
-		advance = make_employee_advance(claim.employee, {'advance_amount': 500})
+		advance = make_employee_advance(claim.employee, {"advance_amount": 500})
 		pe = make_advance_payment(advance)
 		pe.submit()
 
@@ -141,21 +147,35 @@
 	def test_expense_claim_gl_entry(self):
 		payable_account = get_payable_account(company_name)
 		taxes = generate_taxes()
-		expense_claim = make_expense_claim(payable_account, 300, 200, company_name, "Travel Expenses - _TC3",
-			do_not_submit=True, taxes=taxes)
+		expense_claim = make_expense_claim(
+			payable_account,
+			300,
+			200,
+			company_name,
+			"Travel Expenses - _TC3",
+			do_not_submit=True,
+			taxes=taxes,
+		)
 		expense_claim.submit()
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Expense Claim' and voucher_no=%s
-			order by account asc""", expense_claim.name, as_dict=1)
+			order by account asc""",
+			expense_claim.name,
+			as_dict=1,
+		)
 
 		self.assertTrue(gl_entries)
 
-		expected_values = dict((d[0], d) for d in [
-			['Output Tax CGST - _TC3',18.0, 0.0],
-			[payable_account, 0.0, 218.0],
-			["Travel Expenses - _TC3", 200.0, 0.0]
-		])
+		expected_values = dict(
+			(d[0], d)
+			for d in [
+				["Output Tax CGST - _TC3", 18.0, 0.0],
+				[payable_account, 0.0, 218.0],
+				["Travel Expenses - _TC3", 200.0, 0.0],
+			]
+		)
 
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.account)
@@ -164,20 +184,30 @@
 
 	def test_rejected_expense_claim(self):
 		payable_account = get_payable_account(company_name)
-		expense_claim = frappe.get_doc({
-			"doctype": "Expense Claim",
-			"employee": "_T-Employee-00001",
-			"payable_account": payable_account,
-			"approval_status": "Rejected",
-			"expenses":
-				[{"expense_type": "Travel", "default_account": "Travel Expenses - _TC3", "amount": 300, "sanctioned_amount": 200}]
-		})
+		expense_claim = frappe.get_doc(
+			{
+				"doctype": "Expense Claim",
+				"employee": "_T-Employee-00001",
+				"payable_account": payable_account,
+				"approval_status": "Rejected",
+				"expenses": [
+					{
+						"expense_type": "Travel",
+						"default_account": "Travel Expenses - _TC3",
+						"amount": 300,
+						"sanctioned_amount": 200,
+					}
+				],
+			}
+		)
 		expense_claim.submit()
 
-		self.assertEqual(expense_claim.status, 'Rejected')
+		self.assertEqual(expense_claim.status, "Rejected")
 		self.assertEqual(expense_claim.total_sanctioned_amount, 0.0)
 
-		gl_entry = frappe.get_all('GL Entry', {'voucher_type': 'Expense Claim', 'voucher_no': expense_claim.name})
+		gl_entry = frappe.get_all(
+			"GL Entry", {"voucher_type": "Expense Claim", "voucher_no": expense_claim.name}
+		)
 		self.assertEqual(len(gl_entry), 0)
 
 	def test_expense_approver_perms(self):
@@ -186,7 +216,9 @@
 
 		# check doc shared
 		payable_account = get_payable_account("_Test Company")
-		expense_claim = make_expense_claim(payable_account, 300, 200, "_Test Company", "Travel Expenses - _TC", do_not_submit=True)
+		expense_claim = make_expense_claim(
+			payable_account, 300, 200, "_Test Company", "Travel Expenses - _TC", do_not_submit=True
+		)
 		expense_claim.expense_approver = user
 		expense_claim.save()
 		self.assertTrue(expense_claim.name in frappe.share.get_shared("Expense Claim", user))
@@ -210,51 +242,76 @@
 	def test_multiple_payment_entries_against_expense(self):
 		# Creating expense claim
 		payable_account = get_payable_account("_Test Company")
-		expense_claim = make_expense_claim(payable_account, 5500, 5500, "_Test Company", "Travel Expenses - _TC")
+		expense_claim = make_expense_claim(
+			payable_account, 5500, 5500, "_Test Company", "Travel Expenses - _TC"
+		)
 		expense_claim.save()
 		expense_claim.submit()
 
 		# Payment entry 1: paying 500
-		make_payment_entry(expense_claim, payable_account,500)
-		outstanding_amount, total_amount_reimbursed = get_outstanding_and_total_reimbursed_amounts(expense_claim)
+		make_payment_entry(expense_claim, payable_account, 500)
+		outstanding_amount, total_amount_reimbursed = get_outstanding_and_total_reimbursed_amounts(
+			expense_claim
+		)
 		self.assertEqual(outstanding_amount, 5000)
 		self.assertEqual(total_amount_reimbursed, 500)
 
 		# Payment entry 1: paying 2000
-		make_payment_entry(expense_claim, payable_account,2000)
-		outstanding_amount, total_amount_reimbursed = get_outstanding_and_total_reimbursed_amounts(expense_claim)
+		make_payment_entry(expense_claim, payable_account, 2000)
+		outstanding_amount, total_amount_reimbursed = get_outstanding_and_total_reimbursed_amounts(
+			expense_claim
+		)
 		self.assertEqual(outstanding_amount, 3000)
 		self.assertEqual(total_amount_reimbursed, 2500)
 
 		# Payment entry 1: paying 3000
-		make_payment_entry(expense_claim, payable_account,3000)
-		outstanding_amount, total_amount_reimbursed = get_outstanding_and_total_reimbursed_amounts(expense_claim)
+		make_payment_entry(expense_claim, payable_account, 3000)
+		outstanding_amount, total_amount_reimbursed = get_outstanding_and_total_reimbursed_amounts(
+			expense_claim
+		)
 		self.assertEqual(outstanding_amount, 0)
 		self.assertEqual(total_amount_reimbursed, 5500)
 
 
 def get_payable_account(company):
-	return frappe.get_cached_value('Company', company, 'default_payable_account')
+	return frappe.get_cached_value("Company", company, "default_payable_account")
+
 
 def generate_taxes():
-	parent_account = frappe.db.get_value('Account',
-		{'company': company_name, 'is_group':1, 'account_type': 'Tax'},
-		'name')
-	account = create_account(company=company_name, account_name="Output Tax CGST", account_type="Tax", parent_account=parent_account)
-	return {'taxes':[{
-		"account_head": account,
-		"rate": 9,
-		"description": "CGST",
-		"tax_amount": 10,
-		"total": 210
-	}]}
+	parent_account = frappe.db.get_value(
+		"Account", {"company": company_name, "is_group": 1, "account_type": "Tax"}, "name"
+	)
+	account = create_account(
+		company=company_name,
+		account_name="Output Tax CGST",
+		account_type="Tax",
+		parent_account=parent_account,
+	)
+	return {
+		"taxes": [
+			{"account_head": account, "rate": 9, "description": "CGST", "tax_amount": 10, "total": 210}
+		]
+	}
 
-def make_expense_claim(payable_account, amount, sanctioned_amount, company, account, project=None, task_name=None, do_not_submit=False, taxes=None):
+
+def make_expense_claim(
+	payable_account,
+	amount,
+	sanctioned_amount,
+	company,
+	account,
+	project=None,
+	task_name=None,
+	do_not_submit=False,
+	taxes=None,
+):
 	employee = frappe.db.get_value("Employee", {"status": "Active"})
 	if not employee:
 		employee = make_employee("test_employee@expense_claim.com", company=company)
 
-	currency, cost_center = frappe.db.get_value('Company', company, ['default_currency', 'cost_center'])
+	currency, cost_center = frappe.db.get_value(
+		"Company", company, ["default_currency", "cost_center"]
+	)
 	expense_claim = {
 		"doctype": "Expense Claim",
 		"employee": employee,
@@ -262,14 +319,16 @@
 		"approval_status": "Approved",
 		"company": company,
 		"currency": currency,
-		"expenses": [{
-			"expense_type": "Travel",
-			"default_account": account,
-			"currency": currency,
-			"amount": amount,
-			"sanctioned_amount": sanctioned_amount,
-			"cost_center": cost_center
-		}]
+		"expenses": [
+			{
+				"expense_type": "Travel",
+				"default_account": account,
+				"currency": currency,
+				"amount": amount,
+				"sanctioned_amount": sanctioned_amount,
+				"cost_center": cost_center,
+			}
+		],
 	}
 	if taxes:
 		expense_claim.update(taxes)
@@ -286,17 +345,24 @@
 	expense_claim.submit()
 	return expense_claim
 
-def get_outstanding_and_total_reimbursed_amounts(expense_claim):
-	outstanding_amount = flt(frappe.db.get_value("Expense Claim", expense_claim.name, "total_sanctioned_amount")) - \
-			flt(frappe.db.get_value("Expense Claim", expense_claim.name, "total_amount_reimbursed"))
-	total_amount_reimbursed = flt(frappe.db.get_value("Expense Claim", expense_claim.name, "total_amount_reimbursed"))
 
-	return outstanding_amount,total_amount_reimbursed
+def get_outstanding_and_total_reimbursed_amounts(expense_claim):
+	outstanding_amount = flt(
+		frappe.db.get_value("Expense Claim", expense_claim.name, "total_sanctioned_amount")
+	) - flt(frappe.db.get_value("Expense Claim", expense_claim.name, "total_amount_reimbursed"))
+	total_amount_reimbursed = flt(
+		frappe.db.get_value("Expense Claim", expense_claim.name, "total_amount_reimbursed")
+	)
+
+	return outstanding_amount, total_amount_reimbursed
+
 
 def make_payment_entry(expense_claim, payable_account, amt):
 	from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
 
-	pe = get_payment_entry("Expense Claim", expense_claim.name, bank_account="_Test Bank USD - _TC", bank_amount=amt)
+	pe = get_payment_entry(
+		"Expense Claim", expense_claim.name, bank_account="_Test Bank USD - _TC", bank_amount=amt
+	)
 	pe.reference_no = "1"
 	pe.reference_date = nowdate()
 	pe.source_exchange_rate = 1
diff --git a/erpnext/hr/doctype/expense_claim_type/expense_claim_type.py b/erpnext/hr/doctype/expense_claim_type/expense_claim_type.py
index 570b2c1..6d29f7d 100644
--- a/erpnext/hr/doctype/expense_claim_type/expense_claim_type.py
+++ b/erpnext/hr/doctype/expense_claim_type/expense_claim_type.py
@@ -18,12 +18,13 @@
 		for entry in self.accounts:
 			accounts_list.append(entry.company)
 
-		if len(accounts_list)!= len(set(accounts_list)):
+		if len(accounts_list) != len(set(accounts_list)):
 			frappe.throw(_("Same Company is entered more than once"))
 
 	def validate_accounts(self):
 		for entry in self.accounts:
 			"""Error when Company of Ledger account doesn't match with Company Selected"""
 			if frappe.db.get_value("Account", entry.default_account, "company") != entry.company:
-				frappe.throw(_("Account {0} does not match with Company {1}"
-					).format(entry.default_account, entry.company))
+				frappe.throw(
+					_("Account {0} does not match with Company {1}").format(entry.default_account, entry.company)
+				)
diff --git a/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.py b/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.py
index a2403b6..62348e2 100644
--- a/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.py
+++ b/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Expense Claim Type')
 
+
 class TestExpenseClaimType(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/full_and_final_statement/full_and_final_statement.py b/erpnext/hr/doctype/full_and_final_statement/full_and_final_statement.py
index f539537..8137a0d 100644
--- a/erpnext/hr/doctype/full_and_final_statement/full_and_final_statement.py
+++ b/erpnext/hr/doctype/full_and_final_statement/full_and_final_statement.py
@@ -39,16 +39,20 @@
 				for data in self.get_assets_movement():
 					self.append("assets_allocated", data)
 		else:
-			frappe.throw(_("Set Relieving Date for Employee: {0}").format(get_link_to_form("Employee", self.employee)))
+			frappe.throw(
+				_("Set Relieving Date for Employee: {0}").format(get_link_to_form("Employee", self.employee))
+			)
 
 	def create_component_row(self, components, component_type):
 		for component in components:
-			self.append(component_type, {
-				"status": "Unsettled",
-				"reference_document_type": component if component != "Bonus" else "Additional Salary",
-				"component": component
-			})
-
+			self.append(
+				component_type,
+				{
+					"status": "Unsettled",
+					"reference_document_type": component if component != "Bonus" else "Additional Salary",
+					"component": component,
+				},
+			)
 
 	def get_payable_component(self):
 		return [
@@ -66,13 +70,11 @@
 		]
 
 	def get_assets_movement(self):
-		asset_movements = frappe.get_all("Asset Movement Item",
-			filters = {"docstatus": 1},
-			fields = ["asset", "from_employee", "to_employee", "parent", "asset_name"],
-			or_filters = {
-				"from_employee": self.employee,
-				"to_employee": self.employee
-			}
+		asset_movements = frappe.get_all(
+			"Asset Movement Item",
+			filters={"docstatus": 1},
+			fields=["asset", "from_employee", "to_employee", "parent", "asset_name"],
+			or_filters={"from_employee": self.employee, "to_employee": self.employee},
 		)
 
 		data = []
@@ -90,12 +92,14 @@
 			inwards_counts = [movement.asset for movement in inward_movements].count(movement.asset)
 
 			if inwards_counts > outwards_count:
-				data.append({
-					"reference": movement.parent,
-					"asset_name": movement.asset_name,
-					"date": frappe.db.get_value("Asset Movement", movement.parent, "transaction_date"),
-					"status": "Owned"
-				})
+				data.append(
+					{
+						"reference": movement.parent,
+						"asset_name": movement.asset_name,
+						"date": frappe.db.get_value("Asset Movement", movement.parent, "transaction_date"),
+						"status": "Owned",
+					}
+				)
 		return data
 
 	@frappe.whitelist()
@@ -112,7 +116,7 @@
 			if data.amount > 0 and not data.paid_via_salary_slip:
 				account_dict = {
 					"account": data.account,
-					"debit_in_account_currency": flt(data.amount, precision)
+					"debit_in_account_currency": flt(data.amount, precision),
 				}
 				if data.reference_document_type == "Expense Claim":
 					account_dict["party_type"] = "Employee"
@@ -124,7 +128,7 @@
 			if data.amount > 0:
 				account_dict = {
 					"account": data.account,
-					"credit_in_account_currency": flt(data.amount, precision)
+					"credit_in_account_currency": flt(data.amount, precision),
 				}
 				if data.reference_document_type == "Employee Advance":
 					account_dict["party_type"] = "Employee"
@@ -132,46 +136,67 @@
 
 				jv.append("accounts", account_dict)
 
-		jv.append("accounts", {
-			"credit_in_account_currency": difference if difference > 0 else 0,
-			"debit_in_account_currency": -(difference) if difference < 0 else 0,
-			"reference_type": self.doctype,
-			"reference_name": self.name
-		})
+		jv.append(
+			"accounts",
+			{
+				"credit_in_account_currency": difference if difference > 0 else 0,
+				"debit_in_account_currency": -(difference) if difference < 0 else 0,
+				"reference_type": self.doctype,
+				"reference_name": self.name,
+			},
+		)
 		return jv
 
+
 @frappe.whitelist()
 def get_account_and_amount(ref_doctype, ref_document):
 	if not ref_doctype or not ref_document:
 		return None
 
 	if ref_doctype == "Salary Slip":
-		salary_details = frappe.db.get_value("Salary Slip", ref_document, ["payroll_entry", "net_pay"], as_dict=1)
+		salary_details = frappe.db.get_value(
+			"Salary Slip", ref_document, ["payroll_entry", "net_pay"], as_dict=1
+		)
 		amount = salary_details.net_pay
-		payable_account = frappe.db.get_value("Payroll Entry", salary_details.payroll_entry, "payroll_payable_account") if salary_details.payroll_entry else None
+		payable_account = (
+			frappe.db.get_value("Payroll Entry", salary_details.payroll_entry, "payroll_payable_account")
+			if salary_details.payroll_entry
+			else None
+		)
 		return [payable_account, amount]
 
 	if ref_doctype == "Gratuity":
-		payable_account, amount = frappe.db.get_value("Gratuity", ref_document, ["payable_account", "amount"])
+		payable_account, amount = frappe.db.get_value(
+			"Gratuity", ref_document, ["payable_account", "amount"]
+		)
 		return [payable_account, amount]
 
 	if ref_doctype == "Expense Claim":
-		details = frappe.db.get_value("Expense Claim", ref_document,
-			["payable_account", "grand_total", "total_amount_reimbursed", "total_advance_amount"], as_dict=True)
+		details = frappe.db.get_value(
+			"Expense Claim",
+			ref_document,
+			["payable_account", "grand_total", "total_amount_reimbursed", "total_advance_amount"],
+			as_dict=True,
+		)
 		payable_account = details.payable_account
 		amount = details.grand_total - (details.total_amount_reimbursed + details.total_advance_amount)
 		return [payable_account, amount]
 
 	if ref_doctype == "Loan":
-		details = frappe.db.get_value("Loan", ref_document,
-			["payment_account", "total_payment", "total_amount_paid"], as_dict=1)
+		details = frappe.db.get_value(
+			"Loan", ref_document, ["payment_account", "total_payment", "total_amount_paid"], as_dict=1
+		)
 		payment_account = details.payment_account
 		amount = details.total_payment - details.total_amount_paid
 		return [payment_account, amount]
 
 	if ref_doctype == "Employee Advance":
-		details = frappe.db.get_value("Employee Advance", ref_document,
-			["advance_account","paid_amount", "claimed_amount", "return_amount"], as_dict = 1)
+		details = frappe.db.get_value(
+			"Employee Advance",
+			ref_document,
+			["advance_account", "paid_amount", "claimed_amount", "return_amount"],
+			as_dict=1,
+		)
 		payment_account = details.advance_account
 		amount = details.paid_amount - (details.claimed_amount + details.return_amount)
 		return [payment_account, amount]
diff --git a/erpnext/hr/doctype/full_and_final_statement/test_full_and_final_statement.py b/erpnext/hr/doctype/full_and_final_statement/test_full_and_final_statement.py
index f6c1d15..8c6723f 100644
--- a/erpnext/hr/doctype/full_and_final_statement/test_full_and_final_statement.py
+++ b/erpnext/hr/doctype/full_and_final_statement/test_full_and_final_statement.py
@@ -12,7 +12,6 @@
 
 
 class TestFullandFinalStatement(unittest.TestCase):
-
 	def setUp(self):
 		create_asset_data()
 
@@ -27,18 +26,26 @@
 		frappe.db.set_value("Employee", employee, "relieving_date", add_days(today(), 30))
 		fnf = create_full_and_final_statement(employee)
 
-		payables_bootstraped_component = ["Salary Slip", "Gratuity",
-			"Expense Claim", "Bonus", "Leave Encashment"]
+		payables_bootstraped_component = [
+			"Salary Slip",
+			"Gratuity",
+			"Expense Claim",
+			"Bonus",
+			"Leave Encashment",
+		]
 
 		receivable_bootstraped_component = ["Loan", "Employee Advance"]
 
-		#checking payable s and receivables bootstraped value
+		# checking payable s and receivables bootstraped value
 		self.assertEqual([payable.component for payable in fnf.payables], payables_bootstraped_component)
-		self.assertEqual([receivable.component for receivable in fnf.receivables], receivable_bootstraped_component)
+		self.assertEqual(
+			[receivable.component for receivable in fnf.receivables], receivable_bootstraped_component
+		)
 
-		#checking allocated asset
+		# checking allocated asset
 		self.assertIn(movement, [asset.reference for asset in fnf.assets_allocated])
 
+
 def create_full_and_final_statement(employee):
 	fnf = frappe.new_doc("Full and Final Statement")
 	fnf.employee = employee
@@ -46,6 +53,7 @@
 	fnf.save()
 	return fnf
 
+
 def create_asset_movement(employee):
 	asset_name = create_asset()
 	movement = frappe.new_doc("Asset Movement")
@@ -53,18 +61,17 @@
 	movement.purpose = "Issue"
 	movement.transaction_date = today()
 
-	movement.append("assets", {
-		"asset": asset_name,
-		"to_employee": employee
-	})
+	movement.append("assets", {"asset": asset_name, "to_employee": employee})
 
 	movement.save()
 	movement.submit()
 	return movement.name
 
+
 def create_asset():
-	pr = make_purchase_receipt(item_code="Macbook Pro",
-			qty=1, rate=100000.0, location="Test Location")
+	pr = make_purchase_receipt(
+		item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"
+	)
 
 	asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
 	asset = frappe.get_doc("Asset", asset_name)
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py
index a8c8c16..fad827a 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.py
@@ -10,7 +10,9 @@
 from frappe.utils import cint, formatdate, getdate, today
 
 
-class OverlapError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
+
 
 class HolidayList(Document):
 	def validate(self):
@@ -21,9 +23,14 @@
 	def get_weekly_off_dates(self):
 		self.validate_values()
 		date_list = self.get_weekly_off_date_list(self.from_date, self.to_date)
-		last_idx = max([cint(d.idx) for d in self.get("holidays")] or [0,])
+		last_idx = max(
+			[cint(d.idx) for d in self.get("holidays")]
+			or [
+				0,
+			]
+		)
 		for i, d in enumerate(date_list):
-			ch = self.append('holidays', {})
+			ch = self.append("holidays", {})
 			ch.description = _(self.weekly_off)
 			ch.holiday_date = d
 			ch.weekly_off = 1
@@ -33,14 +40,17 @@
 		if not self.weekly_off:
 			throw(_("Please select weekly off day"))
 
-
 	def validate_days(self):
 		if getdate(self.from_date) > getdate(self.to_date):
 			throw(_("To Date cannot be before From Date"))
 
 		for day in self.get("holidays"):
 			if not (getdate(self.from_date) <= getdate(day.holiday_date) <= getdate(self.to_date)):
-				frappe.throw(_("The holiday on {0} is not between From Date and To Date").format(formatdate(day.holiday_date)))
+				frappe.throw(
+					_("The holiday on {0} is not between From Date and To Date").format(
+						formatdate(day.holiday_date)
+					)
+				)
 
 	def get_weekly_off_date_list(self, start_date, end_date):
 		start_date, end_date = getdate(start_date), getdate(end_date)
@@ -66,7 +76,8 @@
 
 	@frappe.whitelist()
 	def clear_table(self):
-		self.set('holidays', [])
+		self.set("holidays", [])
+
 
 @frappe.whitelist()
 def get_events(start, end, filters=None):
@@ -82,23 +93,28 @@
 		filters = []
 
 	if start:
-		filters.append(['Holiday', 'holiday_date', '>', getdate(start)])
+		filters.append(["Holiday", "holiday_date", ">", getdate(start)])
 	if end:
-		filters.append(['Holiday', 'holiday_date', '<', getdate(end)])
+		filters.append(["Holiday", "holiday_date", "<", getdate(end)])
 
-	return frappe.get_list('Holiday List',
-		fields=['name', '`tabHoliday`.holiday_date', '`tabHoliday`.description', '`tabHoliday List`.color'],
-		filters = filters,
-		update={"allDay": 1})
+	return frappe.get_list(
+		"Holiday List",
+		fields=[
+			"name",
+			"`tabHoliday`.holiday_date",
+			"`tabHoliday`.description",
+			"`tabHoliday List`.color",
+		],
+		filters=filters,
+		update={"allDay": 1},
+	)
 
 
 def is_holiday(holiday_list, date=None):
-	"""Returns true if the given date is a holiday in the given holiday list
-	"""
+	"""Returns true if the given date is a holiday in the given holiday list"""
 	if date is None:
 		date = today()
 	if holiday_list:
-		return bool(frappe.get_all('Holiday List',
-			dict(name=holiday_list, holiday_date=date)))
+		return bool(frappe.get_all("Holiday List", dict(name=holiday_list, holiday_date=date)))
 	else:
 		return False
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list_dashboard.py b/erpnext/hr/doctype/holiday_list/holiday_list_dashboard.py
index 4a540ce..0cbf094 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list_dashboard.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list_dashboard.py
@@ -1,19 +1,15 @@
 def get_data():
 	return {
-		'fieldname': 'holiday_list',
-		'non_standard_fieldnames': {
-			'Company': 'default_holiday_list',
-			'Leave Period': 'optional_holiday_list'
+		"fieldname": "holiday_list",
+		"non_standard_fieldnames": {
+			"Company": "default_holiday_list",
+			"Leave Period": "optional_holiday_list",
 		},
-		'transactions': [
+		"transactions": [
 			{
-				'items': ['Company', 'Employee', 'Workstation'],
+				"items": ["Company", "Employee", "Workstation"],
 			},
-			{
-				'items': ['Leave Period', 'Shift Type']
-			},
-			{
-				'items': ['Service Level', 'Service Level Agreement']
-			}
-		]
+			{"items": ["Leave Period", "Shift Type"]},
+			{"items": ["Service Level", "Service Level Agreement"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/holiday_list/test_holiday_list.py b/erpnext/hr/doctype/holiday_list/test_holiday_list.py
index aed901a..d32cfe8 100644
--- a/erpnext/hr/doctype/holiday_list/test_holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/test_holiday_list.py
@@ -12,24 +12,31 @@
 class TestHolidayList(unittest.TestCase):
 	def test_holiday_list(self):
 		today_date = getdate()
-		test_holiday_dates = [today_date-timedelta(days=5), today_date-timedelta(days=4)]
-		holiday_list = make_holiday_list("test_holiday_list",
+		test_holiday_dates = [today_date - timedelta(days=5), today_date - timedelta(days=4)]
+		holiday_list = make_holiday_list(
+			"test_holiday_list",
 			holiday_dates=[
-				{'holiday_date': test_holiday_dates[0], 'description': 'test holiday'},
-				{'holiday_date': test_holiday_dates[1], 'description': 'test holiday2'}
-			])
-		fetched_holiday_list = frappe.get_value('Holiday List', holiday_list.name)
+				{"holiday_date": test_holiday_dates[0], "description": "test holiday"},
+				{"holiday_date": test_holiday_dates[1], "description": "test holiday2"},
+			],
+		)
+		fetched_holiday_list = frappe.get_value("Holiday List", holiday_list.name)
 		self.assertEqual(holiday_list.name, fetched_holiday_list)
 
-def make_holiday_list(name, from_date=getdate()-timedelta(days=10), to_date=getdate(), holiday_dates=None):
+
+def make_holiday_list(
+	name, from_date=getdate() - timedelta(days=10), to_date=getdate(), holiday_dates=None
+):
 	frappe.delete_doc_if_exists("Holiday List", name, force=1)
-	doc = frappe.get_doc({
-		"doctype": "Holiday List",
-		"holiday_list_name": name,
-		"from_date" : from_date,
-		"to_date" : to_date,
-		"holidays" : holiday_dates
-		}).insert()
+	doc = frappe.get_doc(
+		{
+			"doctype": "Holiday List",
+			"holiday_list_name": name,
+			"from_date": from_date,
+			"to_date": to_date,
+			"holidays": holiday_dates,
+		}
+	).insert()
 	return doc
 
 
@@ -39,7 +46,7 @@
 	Context manager for setting holiday list in tests
 	"""
 	try:
-		company = frappe.get_doc('Company', company_name)
+		company = frappe.get_doc("Company", company_name)
 		previous_holiday_list = company.default_holiday_list
 
 		company.default_holiday_list = holiday_list
@@ -49,6 +56,6 @@
 
 	finally:
 		# restore holiday list setup
-		company = frappe.get_doc('Company', company_name)
+		company = frappe.get_doc("Company", company_name)
 		company.default_holiday_list = previous_holiday_list
 		company.save()
diff --git a/erpnext/hr/doctype/hr_settings/hr_settings.py b/erpnext/hr/doctype/hr_settings/hr_settings.py
index c295bcb..72a49e2 100644
--- a/erpnext/hr/doctype/hr_settings/hr_settings.py
+++ b/erpnext/hr/doctype/hr_settings/hr_settings.py
@@ -10,6 +10,7 @@
 # Wether to proceed with frequency change
 PROCEED_WITH_FREQUENCY_CHANGE = False
 
+
 class HRSettings(Document):
 	def validate(self):
 		self.set_naming_series()
@@ -22,21 +23,24 @@
 
 	def set_naming_series(self):
 		from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series
-		set_by_naming_series("Employee", "employee_number",
-			self.get("emp_created_by")=="Naming Series", hide_name_field=True)
+
+		set_by_naming_series(
+			"Employee",
+			"employee_number",
+			self.get("emp_created_by") == "Naming Series",
+			hide_name_field=True,
+		)
 
 	def validate_frequency_change(self):
 		weekly_job, monthly_job = None, None
 
 		try:
 			weekly_job = frappe.get_doc(
-				'Scheduled Job Type',
-				'employee_reminders.send_reminders_in_advance_weekly'
+				"Scheduled Job Type", "employee_reminders.send_reminders_in_advance_weekly"
 			)
 
 			monthly_job = frappe.get_doc(
-				'Scheduled Job Type',
-				'employee_reminders.send_reminders_in_advance_monthly'
+				"Scheduled Job Type", "employee_reminders.send_reminders_in_advance_monthly"
 			)
 		except frappe.DoesNotExistError:
 			return
@@ -62,17 +66,20 @@
 		from_date = frappe.bold(format_date(from_date))
 		to_date = frappe.bold(format_date(to_date))
 		frappe.msgprint(
-			msg=frappe._('Employees will miss holiday reminders from {} until {}. <br> Do you want to proceed with this change?').format(from_date, to_date),
-			title='Confirm change in Frequency',
+			msg=frappe._(
+				"Employees will miss holiday reminders from {} until {}. <br> Do you want to proceed with this change?"
+			).format(from_date, to_date),
+			title="Confirm change in Frequency",
 			primary_action={
-				'label': frappe._('Yes, Proceed'),
-				'client_action': 'erpnext.proceed_save_with_reminders_frequency_change'
+				"label": frappe._("Yes, Proceed"),
+				"client_action": "erpnext.proceed_save_with_reminders_frequency_change",
 			},
-			raise_exception=frappe.ValidationError
+			raise_exception=frappe.ValidationError,
 		)
 
+
 @frappe.whitelist()
 def set_proceed_with_frequency_change():
-	'''Enables proceed with frequency change'''
+	"""Enables proceed with frequency change"""
 	global PROCEED_WITH_FREQUENCY_CHANGE
 	PROCEED_WITH_FREQUENCY_CHANGE = True
diff --git a/erpnext/hr/doctype/interest/test_interest.py b/erpnext/hr/doctype/interest/test_interest.py
index d4ecd9b..eacb57f 100644
--- a/erpnext/hr/doctype/interest/test_interest.py
+++ b/erpnext/hr/doctype/interest/test_interest.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Interest')
 
+
 class TestInterest(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/interview/interview.py b/erpnext/hr/doctype/interview/interview.py
index a3b111c..a6e9af2 100644
--- a/erpnext/hr/doctype/interview/interview.py
+++ b/erpnext/hr/doctype/interview/interview.py
@@ -13,6 +13,7 @@
 class DuplicateInterviewRoundError(frappe.ValidationError):
 	pass
 
+
 class Interview(Document):
 	def validate(self):
 		self.validate_duplicate_interview()
@@ -21,37 +22,47 @@
 		self.set_average_rating()
 
 	def on_submit(self):
-		if self.status not in ['Cleared', 'Rejected']:
-			frappe.throw(_('Only Interviews with Cleared or Rejected status can be submitted.'), title=_('Not Allowed'))
+		if self.status not in ["Cleared", "Rejected"]:
+			frappe.throw(
+				_("Only Interviews with Cleared or Rejected status can be submitted."), title=_("Not Allowed")
+			)
 
 	def validate_duplicate_interview(self):
-		duplicate_interview = frappe.db.exists('Interview', {
-				'job_applicant': self.job_applicant,
-				'interview_round': self.interview_round,
-				'docstatus': 1
-			}
+		duplicate_interview = frappe.db.exists(
+			"Interview",
+			{"job_applicant": self.job_applicant, "interview_round": self.interview_round, "docstatus": 1},
 		)
 
 		if duplicate_interview:
-			frappe.throw(_('Job Applicants are not allowed to appear twice for the same Interview round. Interview {0} already scheduled for Job Applicant {1}').format(
-				frappe.bold(get_link_to_form('Interview', duplicate_interview)),
-				frappe.bold(self.job_applicant)
-			))
+			frappe.throw(
+				_(
+					"Job Applicants are not allowed to appear twice for the same Interview round. Interview {0} already scheduled for Job Applicant {1}"
+				).format(
+					frappe.bold(get_link_to_form("Interview", duplicate_interview)),
+					frappe.bold(self.job_applicant),
+				)
+			)
 
 	def validate_designation(self):
-		applicant_designation = frappe.db.get_value('Job Applicant', self.job_applicant, 'designation')
-		if self.designation :
+		applicant_designation = frappe.db.get_value("Job Applicant", self.job_applicant, "designation")
+		if self.designation:
 			if self.designation != applicant_designation:
-				frappe.throw(_('Interview Round {0} is only for Designation {1}. Job Applicant has applied for the role {2}').format(
-					self.interview_round, frappe.bold(self.designation), applicant_designation),
-					exc=DuplicateInterviewRoundError)
+				frappe.throw(
+					_(
+						"Interview Round {0} is only for Designation {1}. Job Applicant has applied for the role {2}"
+					).format(
+						self.interview_round, frappe.bold(self.designation), applicant_designation
+					),
+					exc=DuplicateInterviewRoundError,
+				)
 		else:
 			self.designation = applicant_designation
 
 	def validate_overlap(self):
-		interviewers = [entry.interviewer for entry in self.interview_details] or ['']
+		interviewers = [entry.interviewer for entry in self.interview_details] or [""]
 
-		overlaps = frappe.db.sql("""
+		overlaps = frappe.db.sql(
+			"""
 			SELECT interview.name
 			FROM `tabInterview` as interview
 			INNER JOIN `tabInterview Detail` as detail
@@ -61,12 +72,25 @@
 				((from_time < %s and to_time > %s) or
 				(from_time > %s and to_time < %s) or
 				(from_time = %s))
-			""", (self.scheduled_on, self.name, self.job_applicant, interviewers,
-			self.from_time, self.to_time, self.from_time, self.to_time, self.from_time))
+			""",
+			(
+				self.scheduled_on,
+				self.name,
+				self.job_applicant,
+				interviewers,
+				self.from_time,
+				self.to_time,
+				self.from_time,
+				self.to_time,
+				self.from_time,
+			),
+		)
 
 		if overlaps:
-			overlapping_details = _('Interview overlaps with {0}').format(get_link_to_form('Interview', overlaps[0][0]))
-			frappe.throw(overlapping_details, title=_('Overlap'))
+			overlapping_details = _("Interview overlaps with {0}").format(
+				get_link_to_form("Interview", overlaps[0][0])
+			)
+			frappe.throw(overlapping_details, title=_("Overlap"))
 
 	def set_average_rating(self):
 		total_rating = 0
@@ -74,7 +98,9 @@
 			if entry.average_rating:
 				total_rating += entry.average_rating
 
-		self.average_rating = flt(total_rating / len(self.interview_details) if len(self.interview_details) else 0)
+		self.average_rating = flt(
+			total_rating / len(self.interview_details) if len(self.interview_details) else 0
+		)
 
 	@frappe.whitelist()
 	def reschedule_interview(self, scheduled_on, from_time, to_time):
@@ -82,137 +108,155 @@
 		from_time = self.from_time
 		to_time = self.to_time
 
-		self.db_set({
-			'scheduled_on': scheduled_on,
-			'from_time': from_time,
-			'to_time': to_time
-		})
+		self.db_set({"scheduled_on": scheduled_on, "from_time": from_time, "to_time": to_time})
 		self.notify_update()
 
 		recipients = get_recipients(self.name)
 
 		try:
 			frappe.sendmail(
-				recipients= recipients,
-				subject=_('Interview: {0} Rescheduled').format(self.name),
-				message=_('Your Interview session is rescheduled from {0} {1} - {2} to {3} {4} - {5}').format(
-					original_date, from_time, to_time, self.scheduled_on, self.from_time, self.to_time),
+				recipients=recipients,
+				subject=_("Interview: {0} Rescheduled").format(self.name),
+				message=_("Your Interview session is rescheduled from {0} {1} - {2} to {3} {4} - {5}").format(
+					original_date, from_time, to_time, self.scheduled_on, self.from_time, self.to_time
+				),
 				reference_doctype=self.doctype,
-				reference_name=self.name
+				reference_name=self.name,
 			)
 		except Exception:
-			frappe.msgprint(_('Failed to send the Interview Reschedule notification. Please configure your email account.'))
+			frappe.msgprint(
+				_("Failed to send the Interview Reschedule notification. Please configure your email account.")
+			)
 
-		frappe.msgprint(_('Interview Rescheduled successfully'), indicator='green')
+		frappe.msgprint(_("Interview Rescheduled successfully"), indicator="green")
 
 
 def get_recipients(name, for_feedback=0):
-	interview = frappe.get_doc('Interview', name)
+	interview = frappe.get_doc("Interview", name)
 
 	if for_feedback:
 		recipients = [d.interviewer for d in interview.interview_details if not d.interview_feedback]
 	else:
 		recipients = [d.interviewer for d in interview.interview_details]
-		recipients.append(frappe.db.get_value('Job Applicant', interview.job_applicant, 'email_id'))
+		recipients.append(frappe.db.get_value("Job Applicant", interview.job_applicant, "email_id"))
 
 	return recipients
 
 
 @frappe.whitelist()
 def get_interviewers(interview_round):
-	return frappe.get_all('Interviewer', filters={'parent': interview_round}, fields=['user as interviewer'])
+	return frappe.get_all(
+		"Interviewer", filters={"parent": interview_round}, fields=["user as interviewer"]
+	)
 
 
 def send_interview_reminder():
-	reminder_settings = frappe.db.get_value('HR Settings', 'HR Settings',
-		['send_interview_reminder', 'interview_reminder_template'], as_dict=True)
+	reminder_settings = frappe.db.get_value(
+		"HR Settings",
+		"HR Settings",
+		["send_interview_reminder", "interview_reminder_template"],
+		as_dict=True,
+	)
 
 	if not reminder_settings.send_interview_reminder:
 		return
 
-	remind_before = cstr(frappe.db.get_single_value('HR Settings', 'remind_before')) or '01:00:00'
-	remind_before = datetime.datetime.strptime(remind_before, '%H:%M:%S')
+	remind_before = cstr(frappe.db.get_single_value("HR Settings", "remind_before")) or "01:00:00"
+	remind_before = datetime.datetime.strptime(remind_before, "%H:%M:%S")
 	reminder_date_time = datetime.datetime.now() + datetime.timedelta(
-		hours=remind_before.hour, minutes=remind_before.minute, seconds=remind_before.second)
+		hours=remind_before.hour, minutes=remind_before.minute, seconds=remind_before.second
+	)
 
-	interviews = frappe.get_all('Interview', filters={
-		'scheduled_on': ['between', (datetime.datetime.now(), reminder_date_time)],
-		'status': 'Pending',
-		'reminded': 0,
-		'docstatus': ['!=', 2]
-	})
+	interviews = frappe.get_all(
+		"Interview",
+		filters={
+			"scheduled_on": ["between", (datetime.datetime.now(), reminder_date_time)],
+			"status": "Pending",
+			"reminded": 0,
+			"docstatus": ["!=", 2],
+		},
+	)
 
-	interview_template = frappe.get_doc('Email Template', reminder_settings.interview_reminder_template)
+	interview_template = frappe.get_doc(
+		"Email Template", reminder_settings.interview_reminder_template
+	)
 
 	for d in interviews:
-		doc = frappe.get_doc('Interview', d.name)
+		doc = frappe.get_doc("Interview", d.name)
 		context = doc.as_dict()
 		message = frappe.render_template(interview_template.response, context)
 		recipients = get_recipients(doc.name)
 
 		frappe.sendmail(
-			recipients= recipients,
+			recipients=recipients,
 			subject=interview_template.subject,
 			message=message,
 			reference_doctype=doc.doctype,
-			reference_name=doc.name
+			reference_name=doc.name,
 		)
 
-		doc.db_set('reminded', 1)
+		doc.db_set("reminded", 1)
 
 
 def send_daily_feedback_reminder():
-	reminder_settings = frappe.db.get_value('HR Settings', 'HR Settings',
-		['send_interview_feedback_reminder', 'feedback_reminder_notification_template'], as_dict=True)
+	reminder_settings = frappe.db.get_value(
+		"HR Settings",
+		"HR Settings",
+		["send_interview_feedback_reminder", "feedback_reminder_notification_template"],
+		as_dict=True,
+	)
 
 	if not reminder_settings.send_interview_feedback_reminder:
 		return
 
-	interview_feedback_template = frappe.get_doc('Email Template', reminder_settings.feedback_reminder_notification_template)
-	interviews = frappe.get_all('Interview', filters={'status': ['in', ['Under Review', 'Pending']], 'docstatus': ['!=', 2]})
+	interview_feedback_template = frappe.get_doc(
+		"Email Template", reminder_settings.feedback_reminder_notification_template
+	)
+	interviews = frappe.get_all(
+		"Interview", filters={"status": ["in", ["Under Review", "Pending"]], "docstatus": ["!=", 2]}
+	)
 
 	for entry in interviews:
 		recipients = get_recipients(entry.name, for_feedback=1)
 
-		doc = frappe.get_doc('Interview', entry.name)
+		doc = frappe.get_doc("Interview", entry.name)
 		context = doc.as_dict()
 
 		message = frappe.render_template(interview_feedback_template.response, context)
 
 		if len(recipients):
 			frappe.sendmail(
-				recipients= recipients,
+				recipients=recipients,
 				subject=interview_feedback_template.subject,
 				message=message,
-				reference_doctype='Interview',
-				reference_name=entry.name
+				reference_doctype="Interview",
+				reference_name=entry.name,
 			)
 
 
 @frappe.whitelist()
 def get_expected_skill_set(interview_round):
-	return frappe.get_all('Expected Skill Set', filters ={'parent': interview_round}, fields=['skill'])
+	return frappe.get_all("Expected Skill Set", filters={"parent": interview_round}, fields=["skill"])
 
 
 @frappe.whitelist()
 def create_interview_feedback(data, interview_name, interviewer, job_applicant):
 	import json
 
-
 	if isinstance(data, str):
 		data = frappe._dict(json.loads(data))
 
 	if frappe.session.user != interviewer:
-		frappe.throw(_('Only Interviewer Are allowed to submit Interview Feedback'))
+		frappe.throw(_("Only Interviewer Are allowed to submit Interview Feedback"))
 
-	interview_feedback = frappe.new_doc('Interview Feedback')
+	interview_feedback = frappe.new_doc("Interview Feedback")
 	interview_feedback.interview = interview_name
 	interview_feedback.interviewer = interviewer
 	interview_feedback.job_applicant = job_applicant
 
 	for d in data.skill_set:
 		d = frappe._dict(d)
-		interview_feedback.append('skill_assessment', {'skill': d.skill, 'rating': d.rating})
+		interview_feedback.append("skill_assessment", {"skill": d.skill, "rating": d.rating})
 
 	interview_feedback.feedback = data.feedback
 	interview_feedback.result = data.result
@@ -220,24 +264,33 @@
 	interview_feedback.save()
 	interview_feedback.submit()
 
-	frappe.msgprint(_('Interview Feedback {0} submitted successfully').format(
-		get_link_to_form('Interview Feedback', interview_feedback.name)))
+	frappe.msgprint(
+		_("Interview Feedback {0} submitted successfully").format(
+			get_link_to_form("Interview Feedback", interview_feedback.name)
+		)
+	)
 
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_interviewer_list(doctype, txt, searchfield, start, page_len, filters):
 	filters = [
-		['Has Role', 'parent', 'like', '%{}%'.format(txt)],
-		['Has Role', 'role', '=', 'interviewer'],
-		['Has Role', 'parenttype', '=', 'User']
+		["Has Role", "parent", "like", "%{}%".format(txt)],
+		["Has Role", "role", "=", "interviewer"],
+		["Has Role", "parenttype", "=", "User"],
 	]
 
 	if filters and isinstance(filters, list):
 		filters.extend(filters)
 
-	return frappe.get_all('Has Role', limit_start=start, limit_page_length=page_len,
-		filters=filters, fields = ['parent'], as_list=1)
+	return frappe.get_all(
+		"Has Role",
+		limit_start=start,
+		limit_page_length=page_len,
+		filters=filters,
+		fields=["parent"],
+		as_list=1,
+	)
 
 
 @frappe.whitelist()
@@ -256,12 +309,13 @@
 		"Pending": "#fff4f0",
 		"Under Review": "#d3e8fc",
 		"Cleared": "#eaf5ed",
-		"Rejected": "#fce7e7"
+		"Rejected": "#fce7e7",
 	}
 
-	conditions = get_event_conditions('Interview', filters)
+	conditions = get_event_conditions("Interview", filters)
 
-	interviews = frappe.db.sql("""
+	interviews = frappe.db.sql(
+		"""
 			SELECT DISTINCT
 				`tabInterview`.name, `tabInterview`.job_applicant, `tabInterview`.interview_round,
 				`tabInterview`.scheduled_on, `tabInterview`.status, `tabInterview`.from_time as from_time,
@@ -272,10 +326,13 @@
 				(`tabInterview`.scheduled_on between %(start)s and %(end)s)
 				and docstatus != 2
 				{conditions}
-			""".format(conditions=conditions), {
-				"start": start,
-				"end": end
-			}, as_dict=True, update={"allDay": 0})
+			""".format(
+			conditions=conditions
+		),
+		{"start": start, "end": end},
+		as_dict=True,
+		update={"allDay": 0},
+	)
 
 	for d in interviews:
 		subject_data = []
@@ -286,11 +343,11 @@
 
 		color = event_color.get(d.status)
 		interview_data = {
-			'from': get_datetime('%s %s' % (d.scheduled_on, d.from_time or '00:00:00')),
-			'to': get_datetime('%s %s' % (d.scheduled_on, d.to_time or '00:00:00')),
-			'name': d.name,
-			'subject': '\n'.join(subject_data),
-			'color': color if color else "#89bcde"
+			"from": get_datetime("%s %s" % (d.scheduled_on, d.from_time or "00:00:00")),
+			"to": get_datetime("%s %s" % (d.scheduled_on, d.to_time or "00:00:00")),
+			"name": d.name,
+			"subject": "\n".join(subject_data),
+			"color": color if color else "#89bcde",
 		}
 
 		events.append(interview_data)
diff --git a/erpnext/hr/doctype/interview/test_interview.py b/erpnext/hr/doctype/interview/test_interview.py
index fdb11af..ae8493a 100644
--- a/erpnext/hr/doctype/interview/test_interview.py
+++ b/erpnext/hr/doctype/interview/test_interview.py
@@ -19,23 +19,30 @@
 class TestInterview(unittest.TestCase):
 	def test_validations_for_designation(self):
 		job_applicant = create_job_applicant()
-		interview = create_interview_and_dependencies(job_applicant.name, designation='_Test_Sales_manager', save=0)
+		interview = create_interview_and_dependencies(
+			job_applicant.name, designation="_Test_Sales_manager", save=0
+		)
 		self.assertRaises(DuplicateInterviewRoundError, interview.save)
 
 	def test_notification_on_rescheduling(self):
 		job_applicant = create_job_applicant()
-		interview = create_interview_and_dependencies(job_applicant.name, scheduled_on=add_days(getdate(), -4))
+		interview = create_interview_and_dependencies(
+			job_applicant.name, scheduled_on=add_days(getdate(), -4)
+		)
 
 		previous_scheduled_date = interview.scheduled_on
 		frappe.db.sql("DELETE FROM `tabEmail Queue`")
 
-		interview.reschedule_interview(add_days(getdate(previous_scheduled_date), 2),
-			from_time=nowtime(), to_time=nowtime())
+		interview.reschedule_interview(
+			add_days(getdate(previous_scheduled_date), 2), from_time=nowtime(), to_time=nowtime()
+		)
 		interview.reload()
 
 		self.assertEqual(interview.scheduled_on, add_days(getdate(previous_scheduled_date), 2))
 
-		notification = frappe.get_all("Email Queue", filters={"message": ("like", "%Your Interview session is rescheduled from%")})
+		notification = frappe.get_all(
+			"Email Queue", filters={"message": ("like", "%Your Interview session is rescheduled from%")}
+		)
 		self.assertIsNotNone(notification)
 
 	def test_notification_for_scheduling(self):
@@ -76,29 +83,33 @@
 		interview = create_interview_and_dependencies(job_applicant.name)
 
 		details = get_interview_details(job_applicant.name)
-		self.assertEqual(details.get('stars'), 5)
-		self.assertEqual(details.get('interviews').get(interview.name), {
-			'name': interview.name,
-			'interview_round': interview.interview_round,
-			'expected_average_rating': interview.expected_average_rating * 5,
-			'average_rating': interview.average_rating * 5,
-			'status': 'Pending'
-		})
+		self.assertEqual(details.get("stars"), 5)
+		self.assertEqual(
+			details.get("interviews").get(interview.name),
+			{
+				"name": interview.name,
+				"interview_round": interview.interview_round,
+				"expected_average_rating": interview.expected_average_rating * 5,
+				"average_rating": interview.average_rating * 5,
+				"status": "Pending",
+			},
+		)
 
 	def tearDown(self):
 		frappe.db.rollback()
 
 
-def create_interview_and_dependencies(job_applicant, scheduled_on=None, from_time=None, to_time=None, designation=None, save=1):
+def create_interview_and_dependencies(
+	job_applicant, scheduled_on=None, from_time=None, to_time=None, designation=None, save=1
+):
 	if designation:
-		designation=create_designation(designation_name = "_Test_Sales_manager").name
+		designation = create_designation(designation_name="_Test_Sales_manager").name
 
 	interviewer_1 = create_user("test_interviewer1@example.com", "Interviewer")
 	interviewer_2 = create_user("test_interviewer2@example.com", "Interviewer")
 
 	interview_round = create_interview_round(
-		"Technical Round", ["Python", "JS"],
-		designation=designation, save=True
+		"Technical Round", ["Python", "JS"], designation=designation, save=True
 	)
 
 	interview = frappe.new_doc("Interview")
@@ -116,6 +127,7 @@
 
 	return interview
 
+
 def create_interview_round(name, skill_set, interviewers=[], designation=None, save=True):
 	create_skill_set(skill_set)
 	interview_round = frappe.new_doc("Interview Round")
@@ -130,15 +142,14 @@
 		interview_round.append("expected_skill_set", {"skill": skill})
 
 	for interviewer in interviewers:
-		interview_round.append("interviewer", {
-			"user": interviewer
-		})
+		interview_round.append("interviewer", {"user": interviewer})
 
 	if save:
 		interview_round.save()
 
 	return interview_round
 
+
 def create_skill_set(skill_set):
 	for skill in skill_set:
 		if not frappe.db.exists("Skill", skill):
@@ -146,6 +157,7 @@
 			doc.skill_name = skill
 			doc.save()
 
+
 def create_interview_type(name="test_interview_type"):
 	if frappe.db.exists("Interview Type", name):
 		return frappe.get_doc("Interview Type", name).name
@@ -157,32 +169,41 @@
 
 		return doc.name
 
+
 def setup_reminder_settings():
-	if not frappe.db.exists('Email Template', _('Interview Reminder')):
-		base_path = frappe.get_app_path('erpnext', 'hr', 'doctype')
-		response = frappe.read_file(os.path.join(base_path, 'interview/interview_reminder_notification_template.html'))
+	if not frappe.db.exists("Email Template", _("Interview Reminder")):
+		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
+		response = frappe.read_file(
+			os.path.join(base_path, "interview/interview_reminder_notification_template.html")
+		)
 
-		frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _('Interview Reminder'),
-			'response': response,
-			'subject': _('Interview Reminder'),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Interview Reminder"),
+				"response": response,
+				"subject": _("Interview Reminder"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 
-	if not frappe.db.exists('Email Template', _('Interview Feedback Reminder')):
-		base_path = frappe.get_app_path('erpnext', 'hr', 'doctype')
-		response = frappe.read_file(os.path.join(base_path, 'interview/interview_feedback_reminder_template.html'))
+	if not frappe.db.exists("Email Template", _("Interview Feedback Reminder")):
+		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
+		response = frappe.read_file(
+			os.path.join(base_path, "interview/interview_feedback_reminder_template.html")
+		)
 
-		frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _('Interview Feedback Reminder'),
-			'response': response,
-			'subject': _('Interview Feedback Reminder'),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Interview Feedback Reminder"),
+				"response": response,
+				"subject": _("Interview Feedback Reminder"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 
-	hr_settings = frappe.get_doc('HR Settings')
-	hr_settings.interview_reminder_template = _('Interview Reminder')
-	hr_settings.feedback_reminder_notification_template = _('Interview Feedback Reminder')
+	hr_settings = frappe.get_doc("HR Settings")
+	hr_settings.interview_reminder_template = _("Interview Reminder")
+	hr_settings.feedback_reminder_notification_template = _("Interview Feedback Reminder")
 	hr_settings.save()
diff --git a/erpnext/hr/doctype/interview_feedback/interview_feedback.py b/erpnext/hr/doctype/interview_feedback/interview_feedback.py
index 2ff00c1..5bb498f 100644
--- a/erpnext/hr/doctype/interview_feedback/interview_feedback.py
+++ b/erpnext/hr/doctype/interview_feedback/interview_feedback.py
@@ -24,28 +24,36 @@
 	def validate_interviewer(self):
 		applicable_interviewers = get_applicable_interviewers(self.interview)
 		if self.interviewer not in applicable_interviewers:
-			frappe.throw(_('{0} is not allowed to submit Interview Feedback for the Interview: {1}').format(
-				frappe.bold(self.interviewer), frappe.bold(self.interview)))
+			frappe.throw(
+				_("{0} is not allowed to submit Interview Feedback for the Interview: {1}").format(
+					frappe.bold(self.interviewer), frappe.bold(self.interview)
+				)
+			)
 
 	def validate_interview_date(self):
-		scheduled_date = frappe.db.get_value('Interview', self.interview, 'scheduled_on')
+		scheduled_date = frappe.db.get_value("Interview", self.interview, "scheduled_on")
 
 		if getdate() < getdate(scheduled_date) and self.docstatus == 1:
-			frappe.throw(_('{0} submission before {1} is not allowed').format(
-				frappe.bold('Interview Feedback'),
-				frappe.bold('Interview Scheduled Date')
-			))
+			frappe.throw(
+				_("{0} submission before {1} is not allowed").format(
+					frappe.bold("Interview Feedback"), frappe.bold("Interview Scheduled Date")
+				)
+			)
 
 	def validate_duplicate(self):
-		duplicate_feedback = frappe.db.exists('Interview Feedback', {
-			'interviewer': self.interviewer,
-			'interview': self.interview,
-			'docstatus': 1
-		})
+		duplicate_feedback = frappe.db.exists(
+			"Interview Feedback",
+			{"interviewer": self.interviewer, "interview": self.interview, "docstatus": 1},
+		)
 
 		if duplicate_feedback:
-			frappe.throw(_('Feedback already submitted for the Interview {0}. Please cancel the previous Interview Feedback {1} to continue.').format(
-				self.interview, get_link_to_form('Interview Feedback', duplicate_feedback)))
+			frappe.throw(
+				_(
+					"Feedback already submitted for the Interview {0}. Please cancel the previous Interview Feedback {1} to continue."
+				).format(
+					self.interview, get_link_to_form("Interview Feedback", duplicate_feedback)
+				)
+			)
 
 	def calculate_average_rating(self):
 		total_rating = 0
@@ -53,10 +61,12 @@
 			if d.rating:
 				total_rating += d.rating
 
-		self.average_rating = flt(total_rating / len(self.skill_assessment) if len(self.skill_assessment) else 0)
+		self.average_rating = flt(
+			total_rating / len(self.skill_assessment) if len(self.skill_assessment) else 0
+		)
 
 	def update_interview_details(self):
-		doc = frappe.get_doc('Interview', self.interview)
+		doc = frappe.get_doc("Interview", self.interview)
 
 		if self.docstatus == 2:
 			for entry in doc.interview_details:
@@ -77,5 +87,5 @@
 
 @frappe.whitelist()
 def get_applicable_interviewers(interview):
-	data = frappe.get_all('Interview Detail', filters={'parent': interview}, fields=['interviewer'])
+	data = frappe.get_all("Interview Detail", filters={"parent": interview}, fields=["interviewer"])
 	return [d.interviewer for d in data]
diff --git a/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py b/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py
index 19c4642..63d4775 100644
--- a/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py
+++ b/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py
@@ -17,14 +17,16 @@
 	def test_validation_for_skill_set(self):
 		frappe.set_user("Administrator")
 		job_applicant = create_job_applicant()
-		interview = create_interview_and_dependencies(job_applicant.name, scheduled_on=add_days(getdate(), -1))
+		interview = create_interview_and_dependencies(
+			job_applicant.name, scheduled_on=add_days(getdate(), -1)
+		)
 		skill_ratings = get_skills_rating(interview.interview_round)
 
 		interviewer = interview.interview_details[0].interviewer
-		create_skill_set(['Leadership'])
+		create_skill_set(["Leadership"])
 
 		interview_feedback = create_interview_feedback(interview.name, interviewer, skill_ratings)
-		interview_feedback.append("skill_assessment", {"skill": 'Leadership', 'rating': 0.8})
+		interview_feedback.append("skill_assessment", {"skill": "Leadership", "rating": 0.8})
 		frappe.set_user(interviewer)
 
 		self.assertRaises(frappe.ValidationError, interview_feedback.save)
@@ -33,7 +35,9 @@
 
 	def test_average_ratings_on_feedback_submission_and_cancellation(self):
 		job_applicant = create_job_applicant()
-		interview = create_interview_and_dependencies(job_applicant.name, scheduled_on=add_days(getdate(), -1))
+		interview = create_interview_and_dependencies(
+			job_applicant.name, scheduled_on=add_days(getdate(), -1)
+		)
 		skill_ratings = get_skills_rating(interview.interview_round)
 
 		# For First Interviewer Feedback
@@ -48,20 +52,26 @@
 			if d.rating:
 				total_rating += d.rating
 
-		avg_rating = flt(total_rating / len(feedback_1.skill_assessment) if len(feedback_1.skill_assessment) else 0)
+		avg_rating = flt(
+			total_rating / len(feedback_1.skill_assessment) if len(feedback_1.skill_assessment) else 0
+		)
 
 		self.assertEqual(flt(avg_rating, 2), flt(feedback_1.average_rating, 2))
 
-		avg_on_interview_detail = frappe.db.get_value('Interview Detail', {
-			'parent': feedback_1.interview,
-			'interviewer': feedback_1.interviewer,
-			'interview_feedback': feedback_1.name
-		}, 'average_rating')
+		avg_on_interview_detail = frappe.db.get_value(
+			"Interview Detail",
+			{
+				"parent": feedback_1.interview,
+				"interviewer": feedback_1.interviewer,
+				"interview_feedback": feedback_1.name,
+			},
+			"average_rating",
+		)
 
 		# 1. average should be reflected in Interview Detail.
 		self.assertEqual(flt(avg_on_interview_detail, 2), flt(feedback_1.average_rating, 2))
 
-		'''For Second Interviewer Feedback'''
+		"""For Second Interviewer Feedback"""
 		interviewer = interview.interview_details[1].interviewer
 		frappe.set_user(interviewer)
 
@@ -95,7 +105,9 @@
 def get_skills_rating(interview_round):
 	import random
 
-	skills = frappe.get_all("Expected Skill Set", filters={"parent": interview_round}, fields = ["skill"])
+	skills = frappe.get_all(
+		"Expected Skill Set", filters={"parent": interview_round}, fields=["skill"]
+	)
 	for d in skills:
 		d["rating"] = random.random()
 	return skills
diff --git a/erpnext/hr/doctype/interview_round/interview_round.py b/erpnext/hr/doctype/interview_round/interview_round.py
index 0f442c3..83dbf0e 100644
--- a/erpnext/hr/doctype/interview_round/interview_round.py
+++ b/erpnext/hr/doctype/interview_round/interview_round.py
@@ -11,6 +11,7 @@
 class InterviewRound(Document):
 	pass
 
+
 @frappe.whitelist()
 def create_interview(doc):
 	if isinstance(doc, str):
@@ -24,10 +25,5 @@
 	if doc.interviewers:
 		interview.interview_details = []
 		for data in doc.interviewers:
-			interview.append("interview_details", {
-				"interviewer": data.user
-			})
+			interview.append("interview_details", {"interviewer": data.user})
 	return interview
-
-
-
diff --git a/erpnext/hr/doctype/interview_round/test_interview_round.py b/erpnext/hr/doctype/interview_round/test_interview_round.py
index dcec941..9568165 100644
--- a/erpnext/hr/doctype/interview_round/test_interview_round.py
+++ b/erpnext/hr/doctype/interview_round/test_interview_round.py
@@ -8,4 +8,3 @@
 
 class TestInterviewRound(unittest.TestCase):
 	pass
-
diff --git a/erpnext/hr/doctype/job_applicant/job_applicant.py b/erpnext/hr/doctype/job_applicant/job_applicant.py
index ccc21ce..5b0a4ca 100644
--- a/erpnext/hr/doctype/job_applicant/job_applicant.py
+++ b/erpnext/hr/doctype/job_applicant/job_applicant.py
@@ -13,7 +13,9 @@
 from erpnext.hr.doctype.interview.interview import get_interviewers
 
 
-class DuplicationError(frappe.ValidationError): pass
+class DuplicationError(frappe.ValidationError):
+	pass
+
 
 class JobApplicant(Document):
 	def onload(self):
@@ -36,8 +38,8 @@
 			self.set_status_for_employee_referral()
 
 		if not self.applicant_name and self.email_id:
-			guess = self.email_id.split('@')[0]
-			self.applicant_name = ' '.join([p.capitalize() for p in guess.split('.')])
+			guess = self.email_id.split("@")[0]
+			self.applicant_name = " ".join([p.capitalize() for p in guess.split(".")])
 
 	def set_status_for_employee_referral(self):
 		emp_ref = frappe.get_doc("Employee Referral", self.employee_referral)
@@ -46,11 +48,11 @@
 		elif self.status in ["Accepted", "Rejected"]:
 			emp_ref.db_set("status", self.status)
 
+
 @frappe.whitelist()
 def create_interview(doc, interview_round):
 	import json
 
-
 	if isinstance(doc, str):
 		doc = json.loads(doc)
 		doc = frappe.get_doc(doc)
@@ -58,7 +60,11 @@
 	round_designation = frappe.db.get_value("Interview Round", interview_round, "designation")
 
 	if round_designation and doc.designation and round_designation != doc.designation:
-		frappe.throw(_("Interview Round {0} is only applicable for the Designation {1}").format(interview_round, round_designation))
+		frappe.throw(
+			_("Interview Round {0} is only applicable for the Designation {1}").format(
+				interview_round, round_designation
+			)
+		)
 
 	interview = frappe.new_doc("Interview")
 	interview.interview_round = interview_round
@@ -69,23 +75,25 @@
 	interviewer_detail = get_interviewers(interview_round)
 
 	for d in interviewer_detail:
-		interview.append("interview_details", {
-			"interviewer": d.interviewer
-		})
+		interview.append("interview_details", {"interviewer": d.interviewer})
 	return interview
 
+
 @frappe.whitelist()
 def get_interview_details(job_applicant):
-	interview_details = frappe.db.get_all("Interview",
-		filters={"job_applicant":job_applicant, "docstatus": ["!=", 2]},
-		fields=["name", "interview_round", "expected_average_rating", "average_rating", "status"]
+	interview_details = frappe.db.get_all(
+		"Interview",
+		filters={"job_applicant": job_applicant, "docstatus": ["!=", 2]},
+		fields=["name", "interview_round", "expected_average_rating", "average_rating", "status"],
 	)
 	interview_detail_map = {}
 	meta = frappe.get_meta("Interview")
 	number_of_stars = meta.get_options("expected_average_rating") or 5
 
 	for detail in interview_details:
-		detail.expected_average_rating = detail.expected_average_rating * number_of_stars if detail.expected_average_rating else 0
+		detail.expected_average_rating = (
+			detail.expected_average_rating * number_of_stars if detail.expected_average_rating else 0
+		)
 		detail.average_rating = detail.average_rating * number_of_stars if detail.average_rating else 0
 
 		interview_detail_map[detail.name] = detail
diff --git a/erpnext/hr/doctype/job_applicant/job_applicant_dashboard.py b/erpnext/hr/doctype/job_applicant/job_applicant_dashboard.py
index 56331ac..14b944a 100644
--- a/erpnext/hr/doctype/job_applicant/job_applicant_dashboard.py
+++ b/erpnext/hr/doctype/job_applicant/job_applicant_dashboard.py
@@ -1,15 +1,9 @@
 def get_data():
 	return {
-		'fieldname': 'job_applicant',
-		'transactions': [
-			{
-				'items': ['Employee', 'Employee Onboarding']
-			},
-			{
-				'items': ['Job Offer', 'Appointment Letter']
-			},
-			{
-				'items': ['Interview']
-			}
+		"fieldname": "job_applicant",
+		"transactions": [
+			{"items": ["Employee", "Employee Onboarding"]},
+			{"items": ["Job Offer", "Appointment Letter"]},
+			{"items": ["Interview"]},
 		],
 	}
diff --git a/erpnext/hr/doctype/job_applicant/test_job_applicant.py b/erpnext/hr/doctype/job_applicant/test_job_applicant.py
index bf16220..99d1161 100644
--- a/erpnext/hr/doctype/job_applicant/test_job_applicant.py
+++ b/erpnext/hr/doctype/job_applicant/test_job_applicant.py
@@ -10,21 +10,25 @@
 
 class TestJobApplicant(unittest.TestCase):
 	def test_job_applicant_naming(self):
-		applicant = frappe.get_doc({
-			"doctype": "Job Applicant",
-			"status": "Open",
-			"applicant_name": "_Test Applicant",
-			"email_id": "job_applicant_naming@example.com"
-		}).insert()
-		self.assertEqual(applicant.name, 'job_applicant_naming@example.com')
+		applicant = frappe.get_doc(
+			{
+				"doctype": "Job Applicant",
+				"status": "Open",
+				"applicant_name": "_Test Applicant",
+				"email_id": "job_applicant_naming@example.com",
+			}
+		).insert()
+		self.assertEqual(applicant.name, "job_applicant_naming@example.com")
 
-		applicant = frappe.get_doc({
-			"doctype": "Job Applicant",
-			"status": "Open",
-			"applicant_name": "_Test Applicant",
-			"email_id": "job_applicant_naming@example.com"
-		}).insert()
-		self.assertEqual(applicant.name, 'job_applicant_naming@example.com-1')
+		applicant = frappe.get_doc(
+			{
+				"doctype": "Job Applicant",
+				"status": "Open",
+				"applicant_name": "_Test Applicant",
+				"email_id": "job_applicant_naming@example.com",
+			}
+		).insert()
+		self.assertEqual(applicant.name, "job_applicant_naming@example.com-1")
 
 	def tearDown(self):
 		frappe.db.rollback()
@@ -41,11 +45,13 @@
 	if frappe.db.exists("Job Applicant", filters):
 		return frappe.get_doc("Job Applicant", filters)
 
-	job_applicant = frappe.get_doc({
-		"doctype": "Job Applicant",
-		"status": args.status or "Open",
-		"designation":  create_designation().name
-	})
+	job_applicant = frappe.get_doc(
+		{
+			"doctype": "Job Applicant",
+			"status": args.status or "Open",
+			"designation": create_designation().name,
+		}
+	)
 
 	job_applicant.update(filters)
 	job_applicant.save()
diff --git a/erpnext/hr/doctype/job_offer/job_offer.py b/erpnext/hr/doctype/job_offer/job_offer.py
index 072fc73..b46930a 100644
--- a/erpnext/hr/doctype/job_offer/job_offer.py
+++ b/erpnext/hr/doctype/job_offer/job_offer.py
@@ -17,9 +17,15 @@
 
 	def validate(self):
 		self.validate_vacancies()
-		job_offer = frappe.db.exists("Job Offer",{"job_applicant": self.job_applicant, "docstatus": ["!=", 2]})
+		job_offer = frappe.db.exists(
+			"Job Offer", {"job_applicant": self.job_applicant, "docstatus": ["!=", 2]}
+		)
 		if job_offer and job_offer != self.name:
-			frappe.throw(_("Job Offer: {0} is already for Job Applicant: {1}").format(frappe.bold(job_offer), frappe.bold(self.job_applicant)))
+			frappe.throw(
+				_("Job Offer: {0} is already for Job Applicant: {1}").format(
+					frappe.bold(job_offer), frappe.bold(self.job_applicant)
+				)
+			)
 
 	def validate_vacancies(self):
 		staffing_plan = get_staffing_plan_detail(self.designation, self.company, self.offer_date)
@@ -27,7 +33,7 @@
 		if staffing_plan and check_vacancies:
 			job_offers = self.get_job_offer(staffing_plan.from_date, staffing_plan.to_date)
 			if not staffing_plan.get("vacancies") or cint(staffing_plan.vacancies) - len(job_offers) <= 0:
-				error_variable = 'for ' + frappe.bold(self.designation)
+				error_variable = "for " + frappe.bold(self.designation)
 				if staffing_plan.get("parent"):
 					error_variable = frappe.bold(get_link_to_form("Staffing Plan", staffing_plan.parent))
 
@@ -37,20 +43,27 @@
 		update_job_applicant(self.status, self.job_applicant)
 
 	def get_job_offer(self, from_date, to_date):
-		''' Returns job offer created during a time period '''
-		return frappe.get_all("Job Offer", filters={
-				"offer_date": ['between', (from_date, to_date)],
+		"""Returns job offer created during a time period"""
+		return frappe.get_all(
+			"Job Offer",
+			filters={
+				"offer_date": ["between", (from_date, to_date)],
 				"designation": self.designation,
 				"company": self.company,
-				"docstatus": 1
-			}, fields=['name'])
+				"docstatus": 1,
+			},
+			fields=["name"],
+		)
+
 
 def update_job_applicant(status, job_applicant):
 	if status in ("Accepted", "Rejected"):
 		frappe.set_value("Job Applicant", job_applicant, "status", status)
 
+
 def get_staffing_plan_detail(designation, company, offer_date):
-	detail = frappe.db.sql("""
+	detail = frappe.db.sql(
+		"""
 		SELECT DISTINCT spd.parent,
 			sp.from_date as from_date,
 			sp.to_date as to_date,
@@ -64,21 +77,31 @@
 			AND sp.company=%s
 			AND spd.parent = sp.name
 			AND %s between sp.from_date and sp.to_date
-	""", (designation, company, offer_date), as_dict=1)
+	""",
+		(designation, company, offer_date),
+		as_dict=1,
+	)
 
 	return frappe._dict(detail[0]) if (detail and detail[0].parent) else None
 
+
 @frappe.whitelist()
 def make_employee(source_name, target_doc=None):
 	def set_missing_values(source, target):
-		target.personal_email, target.first_name = frappe.db.get_value("Job Applicant", \
-			source.job_applicant, ["email_id", "applicant_name"])
-	doc = get_mapped_doc("Job Offer", source_name, {
+		target.personal_email, target.first_name = frappe.db.get_value(
+			"Job Applicant", source.job_applicant, ["email_id", "applicant_name"]
+		)
+
+	doc = get_mapped_doc(
+		"Job Offer",
+		source_name,
+		{
 			"Job Offer": {
 				"doctype": "Employee",
-				"field_map": {
-					"applicant_name": "employee_name",
-					"offer_date": "scheduled_confirmation_date"
-				}}
-		}, target_doc, set_missing_values)
+				"field_map": {"applicant_name": "employee_name", "offer_date": "scheduled_confirmation_date"},
+			}
+		},
+		target_doc,
+		set_missing_values,
+	)
 	return doc
diff --git a/erpnext/hr/doctype/job_offer/test_job_offer.py b/erpnext/hr/doctype/job_offer/test_job_offer.py
index d94e03c..7d8ef11 100644
--- a/erpnext/hr/doctype/job_offer/test_job_offer.py
+++ b/erpnext/hr/doctype/job_offer/test_job_offer.py
@@ -12,17 +12,19 @@
 
 # test_records = frappe.get_test_records('Job Offer')
 
+
 class TestJobOffer(unittest.TestCase):
 	def test_job_offer_creation_against_vacancies(self):
 		frappe.db.set_value("HR Settings", None, "check_vacancies", 1)
 		job_applicant = create_job_applicant(email_id="test_job_offer@example.com")
 		job_offer = create_job_offer(job_applicant=job_applicant.name, designation="UX Designer")
 
-		create_staffing_plan(name='Test No Vacancies', staffing_details=[{
-			"designation": "UX Designer",
-			"vacancies": 0,
-			"estimated_cost_per_position": 5000
-		}])
+		create_staffing_plan(
+			name="Test No Vacancies",
+			staffing_details=[
+				{"designation": "UX Designer", "vacancies": 0, "estimated_cost_per_position": 5000}
+			],
+		)
 		self.assertRaises(frappe.ValidationError, job_offer.submit)
 
 		# test creation of job offer when vacancies are not present
@@ -49,6 +51,7 @@
 	def tearDown(self):
 		frappe.db.sql("DELETE FROM `tabJob Offer` WHERE 1")
 
+
 def create_job_offer(**args):
 	args = frappe._dict(args)
 	if not args.job_applicant:
@@ -57,32 +60,34 @@
 	if not frappe.db.exists("Designation", args.designation):
 		designation = create_designation(designation_name=args.designation)
 
-	job_offer = frappe.get_doc({
-		"doctype": "Job Offer",
-		"job_applicant": args.job_applicant or job_applicant.name,
-		"offer_date": args.offer_date or nowdate(),
-		"designation": args.designation or "Researcher",
-		"status": args.status or "Accepted"
-	})
+	job_offer = frappe.get_doc(
+		{
+			"doctype": "Job Offer",
+			"job_applicant": args.job_applicant or job_applicant.name,
+			"offer_date": args.offer_date or nowdate(),
+			"designation": args.designation or "Researcher",
+			"status": args.status or "Accepted",
+		}
+	)
 	return job_offer
 
+
 def create_staffing_plan(**args):
 	args = frappe._dict(args)
 	make_company()
 	frappe.db.set_value("Company", "_Test Company", "is_group", 1)
 	if frappe.db.exists("Staffing Plan", args.name or "Test"):
 		return
-	staffing_plan = frappe.get_doc({
-		"doctype": "Staffing Plan",
-		"name": args.name or "Test",
-		"from_date": args.from_date or nowdate(),
-		"to_date": args.to_date or add_days(nowdate(), 10),
-		"staffing_details": args.staffing_details or [{
-			"designation": "Researcher",
-			"vacancies": 1,
-			"estimated_cost_per_position": 50000
-		}]
-	})
+	staffing_plan = frappe.get_doc(
+		{
+			"doctype": "Staffing Plan",
+			"name": args.name or "Test",
+			"from_date": args.from_date or nowdate(),
+			"to_date": args.to_date or add_days(nowdate(), 10),
+			"staffing_details": args.staffing_details
+			or [{"designation": "Researcher", "vacancies": 1, "estimated_cost_per_position": 50000}],
+		}
+	)
 	staffing_plan.insert()
 	staffing_plan.submit()
 	return staffing_plan
diff --git a/erpnext/hr/doctype/job_opening/job_opening.py b/erpnext/hr/doctype/job_opening/job_opening.py
index d53daf1..c71407d 100644
--- a/erpnext/hr/doctype/job_opening/job_opening.py
+++ b/erpnext/hr/doctype/job_opening/job_opening.py
@@ -16,67 +16,78 @@
 
 class JobOpening(WebsiteGenerator):
 	website = frappe._dict(
-		template = "templates/generators/job_opening.html",
-		condition_field = "publish",
-		page_title_field = "job_title",
+		template="templates/generators/job_opening.html",
+		condition_field="publish",
+		page_title_field="job_title",
 	)
 
 	def validate(self):
 		if not self.route:
-			self.route = frappe.scrub(self.job_title).replace('_', '-')
+			self.route = frappe.scrub(self.job_title).replace("_", "-")
 		self.validate_current_vacancies()
 
 	def validate_current_vacancies(self):
 		if not self.staffing_plan:
-			staffing_plan = get_active_staffing_plan_details(self.company,
-				self.designation)
+			staffing_plan = get_active_staffing_plan_details(self.company, self.designation)
 			if staffing_plan:
 				self.staffing_plan = staffing_plan[0].name
 				self.planned_vacancies = staffing_plan[0].vacancies
 		elif not self.planned_vacancies:
-			planned_vacancies = frappe.db.sql("""
+			planned_vacancies = frappe.db.sql(
+				"""
 				select vacancies from `tabStaffing Plan Detail`
-				where parent=%s and designation=%s""", (self.staffing_plan, self.designation))
+				where parent=%s and designation=%s""",
+				(self.staffing_plan, self.designation),
+			)
 			self.planned_vacancies = planned_vacancies[0][0] if planned_vacancies else None
 
 		if self.staffing_plan and self.planned_vacancies:
 			staffing_plan_company = frappe.db.get_value("Staffing Plan", self.staffing_plan, "company")
-			lft, rgt = frappe.get_cached_value('Company',  staffing_plan_company,  ["lft", "rgt"])
+			lft, rgt = frappe.get_cached_value("Company", staffing_plan_company, ["lft", "rgt"])
 
 			designation_counts = get_designation_counts(self.designation, self.company)
-			current_count = designation_counts['employee_count'] + designation_counts['job_openings']
+			current_count = designation_counts["employee_count"] + designation_counts["job_openings"]
 
 			if self.planned_vacancies <= current_count:
-				frappe.throw(_("Job Openings for designation {0} already open or hiring completed as per Staffing Plan {1}").format(
-					self.designation, self.staffing_plan))
+				frappe.throw(
+					_(
+						"Job Openings for designation {0} already open or hiring completed as per Staffing Plan {1}"
+					).format(self.designation, self.staffing_plan)
+				)
 
 	def get_context(self, context):
-		context.parents = [{'route': 'jobs', 'title': _('All Jobs') }]
+		context.parents = [{"route": "jobs", "title": _("All Jobs")}]
+
 
 def get_list_context(context):
 	context.title = _("Jobs")
-	context.introduction = _('Current Job Openings')
+	context.introduction = _("Current Job Openings")
 	context.get_list = get_job_openings
 
-def get_job_openings(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None):
-	fields = ['name', 'status', 'job_title', 'description', 'publish_salary_range',
-				'lower_range', 'upper_range', 'currency', 'job_application_route']
+
+def get_job_openings(
+	doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None
+):
+	fields = [
+		"name",
+		"status",
+		"job_title",
+		"description",
+		"publish_salary_range",
+		"lower_range",
+		"upper_range",
+		"currency",
+		"job_application_route",
+	]
 
 	filters = filters or {}
-	filters.update({
-		'status': 'Open'
-	})
+	filters.update({"status": "Open"})
 
 	if txt:
-		filters.update({
-			'job_title': ['like', '%{0}%'.format(txt)],
-			'description': ['like', '%{0}%'.format(txt)]
-		})
+		filters.update(
+			{"job_title": ["like", "%{0}%".format(txt)], "description": ["like", "%{0}%".format(txt)]}
+		)
 
-	return frappe.get_all(doctype,
-		filters,
-		fields,
-		start=limit_start,
-		page_length=limit_page_length,
-		order_by=order_by
+	return frappe.get_all(
+		doctype, filters, fields, start=limit_start, page_length=limit_page_length, order_by=order_by
 	)
diff --git a/erpnext/hr/doctype/job_opening/job_opening_dashboard.py b/erpnext/hr/doctype/job_opening/job_opening_dashboard.py
index 67600dc..a309328 100644
--- a/erpnext/hr/doctype/job_opening/job_opening_dashboard.py
+++ b/erpnext/hr/doctype/job_opening/job_opening_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
-     return {
-        'fieldname': 'job_title',
-        'transactions': [
-            {
-                'items': ['Job Applicant']
-            }
-        ],
-    }
+	return {
+		"fieldname": "job_title",
+		"transactions": [{"items": ["Job Applicant"]}],
+	}
diff --git a/erpnext/hr/doctype/job_opening/test_job_opening.py b/erpnext/hr/doctype/job_opening/test_job_opening.py
index a1c3a1d..a72a6eb 100644
--- a/erpnext/hr/doctype/job_opening/test_job_opening.py
+++ b/erpnext/hr/doctype/job_opening/test_job_opening.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Job Opening')
 
+
 class TestJobOpening(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index 232118f..98408af 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -15,11 +15,25 @@
 from erpnext.hr.utils import get_leave_period, set_employee_name
 
 
-class OverlapError(frappe.ValidationError): pass
-class BackDatedAllocationError(frappe.ValidationError): pass
-class OverAllocationError(frappe.ValidationError): pass
-class LessAllocationError(frappe.ValidationError): pass
-class ValueMultiplierError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
+
+
+class BackDatedAllocationError(frappe.ValidationError):
+	pass
+
+
+class OverAllocationError(frappe.ValidationError):
+	pass
+
+
+class LessAllocationError(frappe.ValidationError):
+	pass
+
+
+class ValueMultiplierError(frappe.ValidationError):
+	pass
+
 
 class LeaveAllocation(Document):
 	def validate(self):
@@ -35,16 +49,22 @@
 	def validate_leave_allocation_days(self):
 		company = frappe.db.get_value("Employee", self.employee, "company")
 		leave_period = get_leave_period(self.from_date, self.to_date, company)
-		max_leaves_allowed = flt(frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed"))
+		max_leaves_allowed = flt(
+			frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed")
+		)
 		if max_leaves_allowed > 0:
 			leave_allocated = 0
 			if leave_period:
-				leave_allocated = get_leave_allocation_for_period(self.employee, self.leave_type,
-					leave_period[0].from_date, leave_period[0].to_date)
+				leave_allocated = get_leave_allocation_for_period(
+					self.employee, self.leave_type, leave_period[0].from_date, leave_period[0].to_date
+				)
 			leave_allocated += flt(self.new_leaves_allocated)
 			if leave_allocated > max_leaves_allowed:
-				frappe.throw(_("Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period")
-					.format(self.leave_type, self.employee))
+				frappe.throw(
+					_(
+						"Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period"
+					).format(self.leave_type, self.employee)
+				)
 
 	def on_submit(self):
 		self.create_leave_ledger_entry()
@@ -69,20 +89,22 @@
 				"leaves": leaves_to_be_added,
 				"from_date": self.from_date,
 				"to_date": self.to_date,
-				"is_carry_forward": 0
+				"is_carry_forward": 0,
 			}
 			create_leave_ledger_entry(self, args, True)
 
 	def get_existing_leave_count(self):
-		ledger_entries = frappe.get_all("Leave Ledger Entry",
-								filters={
-									"transaction_type": "Leave Allocation",
-									"transaction_name": self.name,
-									"employee": self.employee,
-									"company": self.company,
-									"leave_type": self.leave_type
-								},
-								pluck="leaves")
+		ledger_entries = frappe.get_all(
+			"Leave Ledger Entry",
+			filters={
+				"transaction_type": "Leave Allocation",
+				"transaction_name": self.name,
+				"employee": self.employee,
+				"company": self.company,
+				"leave_type": self.leave_type,
+			},
+			pluck="leaves",
+		)
 		total_existing_leaves = 0
 		for entry in ledger_entries:
 			total_existing_leaves += entry
@@ -90,21 +112,33 @@
 		return total_existing_leaves
 
 	def validate_against_leave_applications(self):
-		leaves_taken = get_approved_leaves_for_period(self.employee, self.leave_type,
-			self.from_date, self.to_date)
+		leaves_taken = get_approved_leaves_for_period(
+			self.employee, self.leave_type, self.from_date, self.to_date
+		)
 		if flt(leaves_taken) > flt(self.total_leaves_allocated):
 			if frappe.db.get_value("Leave Type", self.leave_type, "allow_negative"):
-				frappe.msgprint(_("Note: Total allocated leaves {0} shouldn't be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken))
+				frappe.msgprint(
+					_(
+						"Note: Total allocated leaves {0} shouldn't be less than already approved leaves {1} for the period"
+					).format(self.total_leaves_allocated, leaves_taken)
+				)
 			else:
-				frappe.throw(_("Total allocated leaves {0} cannot be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken), LessAllocationError)
+				frappe.throw(
+					_(
+						"Total allocated leaves {0} cannot be less than already approved leaves {1} for the period"
+					).format(self.total_leaves_allocated, leaves_taken),
+					LessAllocationError,
+				)
 
 	def update_leave_policy_assignments_when_no_allocations_left(self):
-		allocations = frappe.db.get_list("Leave Allocation", filters = {
-			"docstatus": 1,
-			"leave_policy_assignment": self.leave_policy_assignment
-		})
+		allocations = frappe.db.get_list(
+			"Leave Allocation",
+			filters={"docstatus": 1, "leave_policy_assignment": self.leave_policy_assignment},
+		)
 		if len(allocations) == 0:
-			frappe.db.set_value("Leave Policy Assignment", self.leave_policy_assignment ,"leaves_allocated", 0)
+			frappe.db.set_value(
+				"Leave Policy Assignment", self.leave_policy_assignment, "leaves_allocated", 0
+			)
 
 	def validate_period(self):
 		if date_diff(self.to_date, self.from_date) <= 0:
@@ -112,10 +146,13 @@
 
 	def validate_lwp(self):
 		if frappe.db.get_value("Leave Type", self.leave_type, "is_lwp"):
-			frappe.throw(_("Leave Type {0} cannot be allocated since it is leave without pay").format(self.leave_type))
+			frappe.throw(
+				_("Leave Type {0} cannot be allocated since it is leave without pay").format(self.leave_type)
+			)
 
 	def validate_allocation_overlap(self):
-		leave_allocation = frappe.db.sql("""
+		leave_allocation = frappe.db.sql(
+			"""
 			SELECT
 				name
 			FROM `tabLeave Allocation`
@@ -123,29 +160,44 @@
 				employee=%s AND leave_type=%s
 				AND name <> %s AND docstatus=1
 				AND to_date >= %s AND from_date <= %s""",
-			(self.employee, self.leave_type, self.name, self.from_date, self.to_date))
+			(self.employee, self.leave_type, self.name, self.from_date, self.to_date),
+		)
 
 		if leave_allocation:
-			frappe.msgprint(_("{0} already allocated for Employee {1} for period {2} to {3}")
-				.format(self.leave_type, self.employee, formatdate(self.from_date), formatdate(self.to_date)))
+			frappe.msgprint(
+				_("{0} already allocated for Employee {1} for period {2} to {3}").format(
+					self.leave_type, self.employee, formatdate(self.from_date), formatdate(self.to_date)
+				)
+			)
 
-			frappe.throw(_('Reference') + ': <a href="/app/Form/Leave Allocation/{0}">{0}</a>'
-				.format(leave_allocation[0][0]), OverlapError)
+			frappe.throw(
+				_("Reference")
+				+ ': <a href="/app/Form/Leave Allocation/{0}">{0}</a>'.format(leave_allocation[0][0]),
+				OverlapError,
+			)
 
 	def validate_back_dated_allocation(self):
-		future_allocation = frappe.db.sql("""select name, from_date from `tabLeave Allocation`
+		future_allocation = frappe.db.sql(
+			"""select name, from_date from `tabLeave Allocation`
 			where employee=%s and leave_type=%s and docstatus=1 and from_date > %s
-			and carry_forward=1""", (self.employee, self.leave_type, self.to_date), as_dict=1)
+			and carry_forward=1""",
+			(self.employee, self.leave_type, self.to_date),
+			as_dict=1,
+		)
 
 		if future_allocation:
-			frappe.throw(_("Leave cannot be allocated before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}")
-				.format(formatdate(future_allocation[0].from_date), future_allocation[0].name),
-					BackDatedAllocationError)
+			frappe.throw(
+				_(
+					"Leave cannot be allocated before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}"
+				).format(formatdate(future_allocation[0].from_date), future_allocation[0].name),
+				BackDatedAllocationError,
+			)
 
 	@frappe.whitelist()
 	def set_total_leaves_allocated(self):
-		self.unused_leaves = get_carry_forwarded_leaves(self.employee,
-			self.leave_type, self.from_date, self.carry_forward)
+		self.unused_leaves = get_carry_forwarded_leaves(
+			self.employee, self.leave_type, self.from_date, self.carry_forward
+		)
 
 		self.total_leaves_allocated = flt(self.unused_leaves) + flt(self.new_leaves_allocated)
 
@@ -154,11 +206,14 @@
 		if self.carry_forward:
 			self.set_carry_forwarded_leaves_in_previous_allocation()
 
-		if not self.total_leaves_allocated \
-			and not frappe.db.get_value("Leave Type", self.leave_type, "is_earned_leave") \
-			and not frappe.db.get_value("Leave Type", self.leave_type, "is_compensatory"):
-				frappe.throw(_("Total leaves allocated is mandatory for Leave Type {0}")
-					.format(self.leave_type))
+		if (
+			not self.total_leaves_allocated
+			and not frappe.db.get_value("Leave Type", self.leave_type, "is_earned_leave")
+			and not frappe.db.get_value("Leave Type", self.leave_type, "is_compensatory")
+		):
+			frappe.throw(
+				_("Total leaves allocated is mandatory for Leave Type {0}").format(self.leave_type)
+			)
 
 	def limit_carry_forward_based_on_max_allowed_leaves(self):
 		max_leaves_allowed = frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed")
@@ -167,13 +222,17 @@
 			self.unused_leaves = max_leaves_allowed - flt(self.new_leaves_allocated)
 
 	def set_carry_forwarded_leaves_in_previous_allocation(self, on_cancel=False):
-		''' Set carry forwarded leaves in previous allocation '''
+		"""Set carry forwarded leaves in previous allocation"""
 		previous_allocation = get_previous_allocation(self.from_date, self.leave_type, self.employee)
 		if on_cancel:
 			self.unused_leaves = 0.0
 		if previous_allocation:
-			frappe.db.set_value("Leave Allocation", previous_allocation.name,
-				'carry_forwarded_leaves_count', self.unused_leaves)
+			frappe.db.set_value(
+				"Leave Allocation",
+				previous_allocation.name,
+				"carry_forwarded_leaves_count",
+				self.unused_leaves,
+			)
 
 	def validate_total_leaves_allocated(self):
 		# Adding a day to include To Date in the difference
@@ -183,13 +242,15 @@
 
 	def create_leave_ledger_entry(self, submit=True):
 		if self.unused_leaves:
-			expiry_days = frappe.db.get_value("Leave Type", self.leave_type, "expire_carry_forwarded_leaves_after_days")
+			expiry_days = frappe.db.get_value(
+				"Leave Type", self.leave_type, "expire_carry_forwarded_leaves_after_days"
+			)
 			end_date = add_days(self.from_date, expiry_days - 1) if expiry_days else self.to_date
 			args = dict(
 				leaves=self.unused_leaves,
 				from_date=self.from_date,
-				to_date= min(getdate(end_date), getdate(self.to_date)),
-				is_carry_forward=1
+				to_date=min(getdate(end_date), getdate(self.to_date)),
+				is_carry_forward=1,
 			)
 			create_leave_ledger_entry(self, args, submit)
 
@@ -197,25 +258,31 @@
 			leaves=self.new_leaves_allocated,
 			from_date=self.from_date,
 			to_date=self.to_date,
-			is_carry_forward=0
+			is_carry_forward=0,
 		)
 		create_leave_ledger_entry(self, args, submit)
 
+
 def get_previous_allocation(from_date, leave_type, employee):
-	''' Returns document properties of previous allocation '''
-	return frappe.db.get_value("Leave Allocation",
+	"""Returns document properties of previous allocation"""
+	return frappe.db.get_value(
+		"Leave Allocation",
 		filters={
-			'to_date': ("<", from_date),
-			'leave_type': leave_type,
-			'employee': employee,
-			'docstatus': 1
+			"to_date": ("<", from_date),
+			"leave_type": leave_type,
+			"employee": employee,
+			"docstatus": 1,
 		},
-		order_by='to_date DESC',
-		fieldname=['name', 'from_date', 'to_date', 'employee', 'leave_type'], as_dict=1)
+		order_by="to_date DESC",
+		fieldname=["name", "from_date", "to_date", "employee", "leave_type"],
+		as_dict=1,
+	)
+
 
 def get_leave_allocation_for_period(employee, leave_type, from_date, to_date):
 	leave_allocated = 0
-	leave_allocations = frappe.db.sql("""
+	leave_allocations = frappe.db.sql(
+		"""
 		select employee, leave_type, from_date, to_date, total_leaves_allocated
 		from `tabLeave Allocation`
 		where employee=%(employee)s and leave_type=%(leave_type)s
@@ -223,12 +290,10 @@
 			and (from_date between %(from_date)s and %(to_date)s
 				or to_date between %(from_date)s and %(to_date)s
 				or (from_date < %(from_date)s and to_date > %(to_date)s))
-	""", {
-		"from_date": from_date,
-		"to_date": to_date,
-		"employee": employee,
-		"leave_type": leave_type
-	}, as_dict=1)
+	""",
+		{"from_date": from_date, "to_date": to_date, "employee": employee, "leave_type": leave_type},
+		as_dict=1,
+	)
 
 	if leave_allocations:
 		for leave_alloc in leave_allocations:
@@ -236,35 +301,42 @@
 
 	return leave_allocated
 
+
 @frappe.whitelist()
 def get_carry_forwarded_leaves(employee, leave_type, date, carry_forward=None):
-	''' Returns carry forwarded leaves for the given employee '''
+	"""Returns carry forwarded leaves for the given employee"""
 	unused_leaves = 0.0
 	previous_allocation = get_previous_allocation(date, leave_type, employee)
 	if carry_forward and previous_allocation:
 		validate_carry_forward(leave_type)
-		unused_leaves = get_unused_leaves(employee, leave_type,
-			previous_allocation.from_date, previous_allocation.to_date)
+		unused_leaves = get_unused_leaves(
+			employee, leave_type, previous_allocation.from_date, previous_allocation.to_date
+		)
 		if unused_leaves:
-			max_carry_forwarded_leaves = frappe.db.get_value("Leave Type",
-				leave_type, "maximum_carry_forwarded_leaves")
+			max_carry_forwarded_leaves = frappe.db.get_value(
+				"Leave Type", leave_type, "maximum_carry_forwarded_leaves"
+			)
 			if max_carry_forwarded_leaves and unused_leaves > flt(max_carry_forwarded_leaves):
 				unused_leaves = flt(max_carry_forwarded_leaves)
 
 	return unused_leaves
 
+
 def get_unused_leaves(employee, leave_type, from_date, to_date):
-	''' Returns unused leaves between the given period while skipping leave allocation expiry '''
-	leaves = frappe.get_all("Leave Ledger Entry", filters={
-		'employee': employee,
-		'leave_type': leave_type,
-		'from_date': ('>=', from_date),
-		'to_date': ('<=', to_date)
-		}, or_filters={
-			'is_expired': 0,
-			'is_carry_forward': 1
-		}, fields=['sum(leaves) as leaves'])
-	return flt(leaves[0]['leaves'])
+	"""Returns unused leaves between the given period while skipping leave allocation expiry"""
+	leaves = frappe.get_all(
+		"Leave Ledger Entry",
+		filters={
+			"employee": employee,
+			"leave_type": leave_type,
+			"from_date": (">=", from_date),
+			"to_date": ("<=", to_date),
+		},
+		or_filters={"is_expired": 0, "is_carry_forward": 1},
+		fields=["sum(leaves) as leaves"],
+	)
+	return flt(leaves[0]["leaves"])
+
 
 def validate_carry_forward(leave_type):
 	if not frappe.db.get_value("Leave Type", leave_type, "is_carry_forward"):
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation_dashboard.py b/erpnext/hr/doctype/leave_allocation/leave_allocation_dashboard.py
index 631beef..96e81db 100644
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation_dashboard.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation_dashboard.py
@@ -1,17 +1,6 @@
 def get_data():
-     return {
-        'fieldname': 'leave_allocation',
-        'transactions': [
-            {
-                'items': ['Compensatory Leave Request']
-            },
-            {
-                'items': ['Leave Encashment']
-            }
-        ],
-        'reports': [
-			{
-				'items': ['Employee Leave Balance']
-			}
-		]
-    }
+	return {
+		"fieldname": "leave_allocation",
+		"transactions": [{"items": ["Compensatory Leave Request"]}, {"items": ["Leave Encashment"]}],
+		"reports": [{"items": ["Employee Leave Balance"]}],
+	}
diff --git a/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py b/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py
index 1fe9139..a53d4a8 100644
--- a/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/test_leave_allocation.py
@@ -31,7 +31,7 @@
 				"from_date": getdate("2015-10-01"),
 				"to_date": getdate("2015-10-31"),
 				"new_leaves_allocated": 5,
-				"docstatus": 1
+				"docstatus": 1,
 			},
 			{
 				"doctype": "Leave Allocation",
@@ -41,39 +41,43 @@
 				"leave_type": "_Test Leave Type",
 				"from_date": getdate("2015-09-01"),
 				"to_date": getdate("2015-11-30"),
-				"new_leaves_allocated": 5
-			}
+				"new_leaves_allocated": 5,
+			},
 		]
 
 		frappe.get_doc(leaves[0]).save()
 		self.assertRaises(frappe.ValidationError, frappe.get_doc(leaves[1]).save)
 
 	def test_invalid_period(self):
-		doc = frappe.get_doc({
-			"doctype": "Leave Allocation",
-			"__islocal": 1,
-			"employee": self.employee.name,
-			"employee_name": self.employee.employee_name,
-			"leave_type": "_Test Leave Type",
-			"from_date": getdate("2015-09-30"),
-			"to_date": getdate("2015-09-1"),
-			"new_leaves_allocated": 5
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Leave Allocation",
+				"__islocal": 1,
+				"employee": self.employee.name,
+				"employee_name": self.employee.employee_name,
+				"leave_type": "_Test Leave Type",
+				"from_date": getdate("2015-09-30"),
+				"to_date": getdate("2015-09-1"),
+				"new_leaves_allocated": 5,
+			}
+		)
 
 		# invalid period
 		self.assertRaises(frappe.ValidationError, doc.save)
 
 	def test_allocated_leave_days_over_period(self):
-		doc = frappe.get_doc({
-			"doctype": "Leave Allocation",
-			"__islocal": 1,
-			"employee": self.employee.name,
-			"employee_name": self.employee.employee_name,
-			"leave_type": "_Test Leave Type",
-			"from_date": getdate("2015-09-1"),
-			"to_date": getdate("2015-09-30"),
-			"new_leaves_allocated": 35
-		})
+		doc = frappe.get_doc(
+			{
+				"doctype": "Leave Allocation",
+				"__islocal": 1,
+				"employee": self.employee.name,
+				"employee_name": self.employee.employee_name,
+				"leave_type": "_Test Leave Type",
+				"from_date": getdate("2015-09-1"),
+				"to_date": getdate("2015-09-30"),
+				"new_leaves_allocated": 35,
+			}
+		)
 
 		# allocated leave more than period
 		self.assertRaises(frappe.ValidationError, doc.save)
@@ -91,7 +95,8 @@
 			leave_type="_Test_CF_leave",
 			from_date=add_months(nowdate(), -12),
 			to_date=add_months(nowdate(), -1),
-			carry_forward=0)
+			carry_forward=0,
+		)
 		leave_allocation.submit()
 
 		# carry forwarded leaves considering maximum_carry_forwarded_leaves
@@ -100,7 +105,8 @@
 			employee=self.employee.name,
 			employee_name=self.employee.employee_name,
 			leave_type="_Test_CF_leave",
-			carry_forward=1)
+			carry_forward=1,
+		)
 		leave_allocation_1.submit()
 
 		self.assertEqual(leave_allocation_1.unused_leaves, 10)
@@ -114,7 +120,8 @@
 			employee_name=self.employee.employee_name,
 			leave_type="_Test_CF_leave",
 			carry_forward=1,
-			new_leaves_allocated=25)
+			new_leaves_allocated=25,
+		)
 		leave_allocation_2.submit()
 
 		self.assertEqual(leave_allocation_2.unused_leaves, 5)
@@ -123,7 +130,8 @@
 		leave_type = create_leave_type(
 			leave_type_name="_Test_CF_leave_expiry",
 			is_carry_forward=1,
-			expire_carry_forwarded_leaves_after_days=90)
+			expire_carry_forwarded_leaves_after_days=90,
+		)
 		leave_type.save()
 
 		# initial leave allocation
@@ -133,7 +141,8 @@
 			leave_type="_Test_CF_leave_expiry",
 			from_date=add_months(nowdate(), -24),
 			to_date=add_months(nowdate(), -12),
-			carry_forward=0)
+			carry_forward=0,
+		)
 		leave_allocation.submit()
 
 		leave_allocation = create_leave_allocation(
@@ -142,7 +151,8 @@
 			leave_type="_Test_CF_leave_expiry",
 			from_date=add_days(nowdate(), -90),
 			to_date=add_days(nowdate(), 100),
-			carry_forward=1)
+			carry_forward=1,
+		)
 		leave_allocation.submit()
 
 		# expires all the carry forwarded leaves after 90 days
@@ -155,19 +165,21 @@
 			leave_type="_Test_CF_leave_expiry",
 			carry_forward=1,
 			from_date=add_months(nowdate(), 6),
-			to_date=add_months(nowdate(), 12))
+			to_date=add_months(nowdate(), 12),
+		)
 		leave_allocation_1.submit()
 
 		self.assertEqual(leave_allocation_1.unused_leaves, leave_allocation.new_leaves_allocated)
 
 	def test_creation_of_leave_ledger_entry_on_submit(self):
 		leave_allocation = create_leave_allocation(
-			employee=self.employee.name,
-			employee_name=self.employee.employee_name
+			employee=self.employee.name, employee_name=self.employee.employee_name
 		)
 		leave_allocation.submit()
 
-		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=dict(transaction_name=leave_allocation.name))
+		leave_ledger_entry = frappe.get_all(
+			"Leave Ledger Entry", fields="*", filters=dict(transaction_name=leave_allocation.name)
+		)
 
 		self.assertEqual(len(leave_ledger_entry), 1)
 		self.assertEqual(leave_ledger_entry[0].employee, leave_allocation.employee)
@@ -176,12 +188,13 @@
 
 		# check if leave ledger entry is deleted on cancellation
 		leave_allocation.cancel()
-		self.assertFalse(frappe.db.exists("Leave Ledger Entry", {'transaction_name':leave_allocation.name}))
+		self.assertFalse(
+			frappe.db.exists("Leave Ledger Entry", {"transaction_name": leave_allocation.name})
+		)
 
 	def test_leave_addition_after_submit(self):
 		leave_allocation = create_leave_allocation(
-			employee=self.employee.name,
-			employee_name=self.employee.employee_name
+			employee=self.employee.name, employee_name=self.employee.employee_name
 		)
 		leave_allocation.submit()
 		self.assertTrue(leave_allocation.total_leaves_allocated, 15)
@@ -191,8 +204,7 @@
 
 	def test_leave_subtraction_after_submit(self):
 		leave_allocation = create_leave_allocation(
-			employee=self.employee.name,
-			employee_name=self.employee.employee_name
+			employee=self.employee.name, employee_name=self.employee.employee_name
 		)
 		leave_allocation.submit()
 		self.assertTrue(leave_allocation.total_leaves_allocated, 15)
@@ -204,26 +216,29 @@
 		from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list
 
 		make_holiday_list()
-		frappe.db.set_value("Company", self.employee.company, "default_holiday_list", "Salary Slip Test Holiday List")
+		frappe.db.set_value(
+			"Company", self.employee.company, "default_holiday_list", "Salary Slip Test Holiday List"
+		)
 
 		leave_allocation = create_leave_allocation(
-			employee=self.employee.name,
-			employee_name=self.employee.employee_name
+			employee=self.employee.name, employee_name=self.employee.employee_name
 		)
 		leave_allocation.submit()
 		self.assertTrue(leave_allocation.total_leaves_allocated, 15)
 
-		leave_application = frappe.get_doc({
-			"doctype": 'Leave Application',
-			"employee": self.employee.name,
-			"leave_type": "_Test Leave Type",
-			"from_date": add_months(nowdate(), 2),
-			"to_date": add_months(add_days(nowdate(), 10), 2),
-			"company": self.employee.company,
-			"docstatus": 1,
-			"status": "Approved",
-			"leave_approver": 'test@example.com'
-		})
+		leave_application = frappe.get_doc(
+			{
+				"doctype": "Leave Application",
+				"employee": self.employee.name,
+				"leave_type": "_Test Leave Type",
+				"from_date": add_months(nowdate(), 2),
+				"to_date": add_months(add_days(nowdate(), 10), 2),
+				"company": self.employee.company,
+				"docstatus": 1,
+				"status": "Approved",
+				"leave_approver": "test@example.com",
+			}
+		)
 		leave_application.submit()
 		leave_application.reload()
 
@@ -232,22 +247,26 @@
 		leave_allocation.total_leaves_allocated = leave_application.total_leave_days - 1
 		self.assertRaises(frappe.ValidationError, leave_allocation.submit)
 
+
 def create_leave_allocation(**args):
 	args = frappe._dict(args)
 
 	emp_id = make_employee("test_emp_leave_allocation@salary.com")
 	employee = frappe.get_doc("Employee", emp_id)
 
-	return frappe.get_doc({
-		"doctype": "Leave Allocation",
-		"__islocal": 1,
-		"employee": args.employee or employee.name,
-		"employee_name": args.employee_name or employee.employee_name,
-		"leave_type": args.leave_type or "_Test Leave Type",
-		"from_date": args.from_date or nowdate(),
-		"new_leaves_allocated": args.new_leaves_allocated or 15,
-		"carry_forward": args.carry_forward or 0,
-		"to_date": args.to_date or add_months(nowdate(), 12)
-	})
+	return frappe.get_doc(
+		{
+			"doctype": "Leave Allocation",
+			"__islocal": 1,
+			"employee": args.employee or employee.name,
+			"employee_name": args.employee_name or employee.employee_name,
+			"leave_type": args.leave_type or "_Test Leave Type",
+			"from_date": args.from_date or nowdate(),
+			"new_leaves_allocated": args.new_leaves_allocated or 15,
+			"carry_forward": args.carry_forward or 0,
+			"to_date": args.to_date or add_months(nowdate(), 12),
+		}
+	)
+
 
 test_dependencies = ["Employee", "Leave Type"]
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 2987c1e..18c69f7 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -32,15 +32,30 @@
 )
 
 
-class LeaveDayBlockedError(frappe.ValidationError): pass
-class OverlapError(frappe.ValidationError): pass
-class AttendanceAlreadyMarkedError(frappe.ValidationError): pass
-class NotAnOptionalHoliday(frappe.ValidationError): pass
+class LeaveDayBlockedError(frappe.ValidationError):
+	pass
+
+
+class OverlapError(frappe.ValidationError):
+	pass
+
+
+class AttendanceAlreadyMarkedError(frappe.ValidationError):
+	pass
+
+
+class NotAnOptionalHoliday(frappe.ValidationError):
+	pass
+
+
 class InsufficientLeaveBalanceError(frappe.ValidationError):
 	pass
+
+
 class LeaveAcrossAllocationsError(frappe.ValidationError):
 	pass
 
+
 from frappe.model.document import Document
 
 
@@ -60,7 +75,7 @@
 		self.validate_salary_processed_days()
 		self.validate_attendance()
 		self.set_half_day_date()
-		if frappe.db.get_value("Leave Type", self.leave_type, 'is_optional_leave'):
+		if frappe.db.get_value("Leave Type", self.leave_type, "is_optional_leave"):
 			self.validate_optional_leave()
 		self.validate_applicable_after()
 
@@ -74,7 +89,9 @@
 
 	def on_submit(self):
 		if self.status == "Open":
-			frappe.throw(_("Only Leave Applications with status 'Approved' and 'Rejected' can be submitted"))
+			frappe.throw(
+				_("Only Leave Applications with status 'Approved' and 'Rejected' can be submitted")
+			)
 
 		self.validate_back_dated_application()
 		self.update_attendance()
@@ -101,7 +118,9 @@
 			leave_type = frappe.get_doc("Leave Type", self.leave_type)
 			if leave_type.applicable_after > 0:
 				date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining")
-				leave_days = get_approved_leaves_for_period(self.employee, False, date_of_joining, self.from_date)
+				leave_days = get_approved_leaves_for_period(
+					self.employee, False, date_of_joining, self.from_date
+				)
 				number_of_days = date_diff(getdate(self.from_date), date_of_joining)
 				if number_of_days >= 0:
 					holidays = 0
@@ -109,29 +128,48 @@
 						holidays = get_holidays(self.employee, date_of_joining, self.from_date)
 					number_of_days = number_of_days - leave_days - holidays
 					if number_of_days < leave_type.applicable_after:
-						frappe.throw(_("{0} applicable after {1} working days").format(self.leave_type, leave_type.applicable_after))
+						frappe.throw(
+							_("{0} applicable after {1} working days").format(
+								self.leave_type, leave_type.applicable_after
+							)
+						)
 
 	def validate_dates(self):
 		if frappe.db.get_single_value("HR Settings", "restrict_backdated_leave_application"):
 			if self.from_date and getdate(self.from_date) < getdate():
-				allowed_role = frappe.db.get_single_value("HR Settings", "role_allowed_to_create_backdated_leave_application")
+				allowed_role = frappe.db.get_single_value(
+					"HR Settings", "role_allowed_to_create_backdated_leave_application"
+				)
 				user = frappe.get_doc("User", frappe.session.user)
 				user_roles = [d.role for d in user.roles]
 				if not allowed_role:
-					frappe.throw(_("Backdated Leave Application is restricted. Please set the {} in {}").format(
-						frappe.bold("Role Allowed to Create Backdated Leave Application"), get_link_to_form("HR Settings", "HR Settings")))
+					frappe.throw(
+						_("Backdated Leave Application is restricted. Please set the {} in {}").format(
+							frappe.bold("Role Allowed to Create Backdated Leave Application"),
+							get_link_to_form("HR Settings", "HR Settings"),
+						)
+					)
 
-				if (allowed_role and allowed_role not in user_roles):
-					frappe.throw(_("Only users with the {0} role can create backdated leave applications").format(allowed_role))
+				if allowed_role and allowed_role not in user_roles:
+					frappe.throw(
+						_("Only users with the {0} role can create backdated leave applications").format(
+							allowed_role
+						)
+					)
 
 		if self.from_date and self.to_date and (getdate(self.to_date) < getdate(self.from_date)):
 			frappe.throw(_("To date cannot be before from date"))
 
-		if self.half_day and self.half_day_date \
-			and (getdate(self.half_day_date) < getdate(self.from_date)
-			or getdate(self.half_day_date) > getdate(self.to_date)):
+		if (
+			self.half_day
+			and self.half_day_date
+			and (
+				getdate(self.half_day_date) < getdate(self.from_date)
+				or getdate(self.half_day_date) > getdate(self.to_date)
+			)
+		):
 
-				frappe.throw(_("Half Day Date should be between From Date and To Date"))
+			frappe.throw(_("Half Day Date should be between From Date and To Date"))
 
 		if not is_lwp(self.leave_type):
 			self.validate_dates_across_allocation()
@@ -146,10 +184,14 @@
 		if not (alloc_on_from_date or alloc_on_to_date):
 			frappe.throw(_("Application period cannot be outside leave allocation period"))
 		elif self.is_separate_ledger_entry_required(alloc_on_from_date, alloc_on_to_date):
-			frappe.throw(_("Application period cannot be across two allocation records"), exc=LeaveAcrossAllocationsError)
+			frappe.throw(
+				_("Application period cannot be across two allocation records"),
+				exc=LeaveAcrossAllocationsError,
+			)
 
 	def get_allocation_based_on_application_dates(self) -> Tuple[Dict, Dict]:
 		"""Returns allocation name, from and to dates for application dates"""
+
 		def _get_leave_allocation_record(date):
 			LeaveAllocation = frappe.qb.DocType("Leave Allocation")
 			allocation = (
@@ -171,13 +213,20 @@
 		return allocation_based_on_from_date, allocation_based_on_to_date
 
 	def validate_back_dated_application(self):
-		future_allocation = frappe.db.sql("""select name, from_date from `tabLeave Allocation`
+		future_allocation = frappe.db.sql(
+			"""select name, from_date from `tabLeave Allocation`
 			where employee=%s and leave_type=%s and docstatus=1 and from_date > %s
-			and carry_forward=1""", (self.employee, self.leave_type, self.to_date), as_dict=1)
+			and carry_forward=1""",
+			(self.employee, self.leave_type, self.to_date),
+			as_dict=1,
+		)
 
 		if future_allocation:
-			frappe.throw(_("Leave cannot be applied/cancelled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}")
-				.format(formatdate(future_allocation[0].from_date), future_allocation[0].name))
+			frappe.throw(
+				_(
+					"Leave cannot be applied/cancelled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}"
+				).format(formatdate(future_allocation[0].from_date), future_allocation[0].name)
+			)
 
 	def update_attendance(self):
 		if self.status != "Approved":
@@ -189,8 +238,9 @@
 
 		for dt in daterange(getdate(self.from_date), getdate(self.to_date)):
 			date = dt.strftime("%Y-%m-%d")
-			attendance_name = frappe.db.exists("Attendance", dict(employee = self.employee,
-				attendance_date = date, docstatus = ('!=', 2)))
+			attendance_name = frappe.db.exists(
+				"Attendance", dict(employee=self.employee, attendance_date=date, docstatus=("!=", 2))
+			)
 
 			# don't mark attendance for holidays
 			# if leave type does not include holidays within leaves as leaves
@@ -207,17 +257,17 @@
 			self.create_or_update_attendance(attendance_name, date)
 
 	def create_or_update_attendance(self, attendance_name, date):
-		status = "Half Day" if self.half_day_date and getdate(date) == getdate(self.half_day_date) else "On Leave"
+		status = (
+			"Half Day"
+			if self.half_day_date and getdate(date) == getdate(self.half_day_date)
+			else "On Leave"
+		)
 
 		if attendance_name:
 			# update existing attendance, change absent to on leave
-			doc = frappe.get_doc('Attendance', attendance_name)
+			doc = frappe.get_doc("Attendance", attendance_name)
 			if doc.status != status:
-				doc.db_set({
-					'status': status,
-					'leave_type': self.leave_type,
-					'leave_application': self.name
-				})
+				doc.db_set({"status": status, "leave_type": self.leave_type, "leave_application": self.name})
 		else:
 			# make new attendance and submit it
 			doc = frappe.new_doc("Attendance")
@@ -234,8 +284,12 @@
 
 	def cancel_attendance(self):
 		if self.docstatus == 2:
-			attendance = frappe.db.sql("""select name from `tabAttendance` where employee = %s\
-				and (attendance_date between %s and %s) and docstatus < 2 and status in ('On Leave', 'Half Day')""",(self.employee, self.from_date, self.to_date), as_dict=1)
+			attendance = frappe.db.sql(
+				"""select name from `tabAttendance` where employee = %s\
+				and (attendance_date between %s and %s) and docstatus < 2 and status in ('On Leave', 'Half Day')""",
+				(self.employee, self.from_date, self.to_date),
+				as_dict=1,
+			)
 			for name in attendance:
 				frappe.db.set_value("Attendance", name, "docstatus", 2)
 
@@ -243,21 +297,29 @@
 		if not frappe.db.get_value("Leave Type", self.leave_type, "is_lwp"):
 			return
 
-		last_processed_pay_slip = frappe.db.sql("""
+		last_processed_pay_slip = frappe.db.sql(
+			"""
 			select start_date, end_date from `tabSalary Slip`
 			where docstatus = 1 and employee = %s
 			and ((%s between start_date and end_date) or (%s between start_date and end_date))
 			order by modified desc limit 1
-		""",(self.employee, self.to_date, self.from_date))
+		""",
+			(self.employee, self.to_date, self.from_date),
+		)
 
 		if last_processed_pay_slip:
-			frappe.throw(_("Salary already processed for period between {0} and {1}, Leave application period cannot be between this date range.").format(formatdate(last_processed_pay_slip[0][0]),
-				formatdate(last_processed_pay_slip[0][1])))
-
+			frappe.throw(
+				_(
+					"Salary already processed for period between {0} and {1}, Leave application period cannot be between this date range."
+				).format(
+					formatdate(last_processed_pay_slip[0][0]), formatdate(last_processed_pay_slip[0][1])
+				)
+			)
 
 	def show_block_day_warning(self):
-		block_dates = get_applicable_block_dates(self.from_date, self.to_date,
-			self.employee, self.company, all_lists=True)
+		block_dates = get_applicable_block_dates(
+			self.from_date, self.to_date, self.employee, self.company, all_lists=True
+		)
 
 		if block_dates:
 			frappe.msgprint(_("Warning: Leave application contains following block dates") + ":")
@@ -265,27 +327,41 @@
 				frappe.msgprint(formatdate(d.block_date) + ": " + d.reason)
 
 	def validate_block_days(self):
-		block_dates = get_applicable_block_dates(self.from_date, self.to_date,
-			self.employee, self.company)
+		block_dates = get_applicable_block_dates(
+			self.from_date, self.to_date, self.employee, self.company
+		)
 
 		if block_dates and self.status == "Approved":
 			frappe.throw(_("You are not authorized to approve leaves on Block Dates"), LeaveDayBlockedError)
 
 	def validate_balance_leaves(self):
 		if self.from_date and self.to_date:
-			self.total_leave_days = get_number_of_leave_days(self.employee, self.leave_type,
-				self.from_date, self.to_date, self.half_day, self.half_day_date)
+			self.total_leave_days = get_number_of_leave_days(
+				self.employee, self.leave_type, self.from_date, self.to_date, self.half_day, self.half_day_date
+			)
 
 			if self.total_leave_days <= 0:
-				frappe.throw(_("The day(s) on which you are applying for leave are holidays. You need not apply for leave."))
+				frappe.throw(
+					_(
+						"The day(s) on which you are applying for leave are holidays. You need not apply for leave."
+					)
+				)
 
 			if not is_lwp(self.leave_type):
-				leave_balance = get_leave_balance_on(self.employee, self.leave_type, self.from_date, self.to_date,
-					consider_all_leaves_in_the_allocation_period=True, for_consumption=True)
+				leave_balance = get_leave_balance_on(
+					self.employee,
+					self.leave_type,
+					self.from_date,
+					self.to_date,
+					consider_all_leaves_in_the_allocation_period=True,
+					for_consumption=True,
+				)
 				self.leave_balance = leave_balance.get("leave_balance")
 				leave_balance_for_consumption = leave_balance.get("leave_balance_for_consumption")
 
-				if self.status != "Rejected" and (leave_balance_for_consumption < self.total_leave_days or not leave_balance_for_consumption):
+				if self.status != "Rejected" and (
+					leave_balance_for_consumption < self.total_leave_days or not leave_balance_for_consumption
+				):
 					self.show_insufficient_balance_message(leave_balance_for_consumption)
 
 	def show_insufficient_balance_message(self, leave_balance_for_consumption: float) -> None:
@@ -293,39 +369,57 @@
 
 		if frappe.db.get_value("Leave Type", self.leave_type, "allow_negative"):
 			if leave_balance_for_consumption != self.leave_balance:
-				msg = _("Warning: Insufficient leave balance for Leave Type {0} in this allocation.").format(frappe.bold(self.leave_type))
+				msg = _("Warning: Insufficient leave balance for Leave Type {0} in this allocation.").format(
+					frappe.bold(self.leave_type)
+				)
 				msg += "<br><br>"
-				msg += _("Actual balances aren't available because the leave application spans over different leave allocations. You can still apply for leaves which would be compensated during the next allocation.")
+				msg += _(
+					"Actual balances aren't available because the leave application spans over different leave allocations. You can still apply for leaves which would be compensated during the next allocation."
+				)
 			else:
-				msg = _("Warning: Insufficient leave balance for Leave Type {0}.").format(frappe.bold(self.leave_type))
+				msg = _("Warning: Insufficient leave balance for Leave Type {0}.").format(
+					frappe.bold(self.leave_type)
+				)
 
 			frappe.msgprint(msg, title=_("Warning"), indicator="orange")
 		else:
-			frappe.throw(_("Insufficient leave balance for Leave Type {0}").format(frappe.bold(self.leave_type)),
-				exc=InsufficientLeaveBalanceError, title=_("Insufficient Balance"))
+			frappe.throw(
+				_("Insufficient leave balance for Leave Type {0}").format(frappe.bold(self.leave_type)),
+				exc=InsufficientLeaveBalanceError,
+				title=_("Insufficient Balance"),
+			)
 
 	def validate_leave_overlap(self):
 		if not self.name:
 			# hack! if name is null, it could cause problems with !=
 			self.name = "New Leave Application"
 
-		for d in frappe.db.sql("""
+		for d in frappe.db.sql(
+			"""
 			select
 				name, leave_type, posting_date, from_date, to_date, total_leave_days, half_day_date
 			from `tabLeave Application`
 			where employee = %(employee)s and docstatus < 2 and status in ("Open", "Approved")
 			and to_date >= %(from_date)s and from_date <= %(to_date)s
-			and name != %(name)s""", {
+			and name != %(name)s""",
+			{
 				"employee": self.employee,
 				"from_date": self.from_date,
 				"to_date": self.to_date,
-				"name": self.name
-			}, as_dict = 1):
+				"name": self.name,
+			},
+			as_dict=1,
+		):
 
-			if cint(self.half_day)==1 and getdate(self.half_day_date) == getdate(d.half_day_date) and (
-				flt(self.total_leave_days)==0.5
-				or getdate(self.from_date) == getdate(d.to_date)
-				or getdate(self.to_date) == getdate(d.from_date)):
+			if (
+				cint(self.half_day) == 1
+				and getdate(self.half_day_date) == getdate(d.half_day_date)
+				and (
+					flt(self.total_leave_days) == 0.5
+					or getdate(self.from_date) == getdate(d.to_date)
+					or getdate(self.to_date) == getdate(d.from_date)
+				)
+			):
 
 				total_leaves_on_half_day = self.get_total_leaves_on_half_day()
 				if total_leaves_on_half_day >= 1:
@@ -335,22 +429,22 @@
 
 	def throw_overlap_error(self, d):
 		form_link = get_link_to_form("Leave Application", d.name)
-		msg = _("Employee {0} has already applied for {1} between {2} and {3} : {4}").format(self.employee,
-			d['leave_type'], formatdate(d['from_date']), formatdate(d['to_date']), form_link)
+		msg = _("Employee {0} has already applied for {1} between {2} and {3} : {4}").format(
+			self.employee, d["leave_type"], formatdate(d["from_date"]), formatdate(d["to_date"]), form_link
+		)
 		frappe.throw(msg, OverlapError)
 
 	def get_total_leaves_on_half_day(self):
-		leave_count_on_half_day_date = frappe.db.sql("""select count(name) from `tabLeave Application`
+		leave_count_on_half_day_date = frappe.db.sql(
+			"""select count(name) from `tabLeave Application`
 			where employee = %(employee)s
 			and docstatus < 2
 			and status in ("Open", "Approved")
 			and half_day = 1
 			and half_day_date = %(half_day_date)s
-			and name != %(name)s""", {
-				"employee": self.employee,
-				"half_day_date": self.half_day_date,
-				"name": self.name
-			})[0][0]
+			and name != %(name)s""",
+			{"employee": self.employee, "half_day_date": self.half_day_date, "name": self.name},
+		)[0][0]
 
 		return leave_count_on_half_day_date * 0.5
 
@@ -360,24 +454,36 @@
 			frappe.throw(_("Leave of type {0} cannot be longer than {1}").format(self.leave_type, max_days))
 
 	def validate_attendance(self):
-		attendance = frappe.db.sql("""select name from `tabAttendance` where employee = %s and (attendance_date between %s and %s)
+		attendance = frappe.db.sql(
+			"""select name from `tabAttendance` where employee = %s and (attendance_date between %s and %s)
 					and status = "Present" and docstatus = 1""",
-			(self.employee, self.from_date, self.to_date))
+			(self.employee, self.from_date, self.to_date),
+		)
 		if attendance:
-			frappe.throw(_("Attendance for employee {0} is already marked for this day").format(self.employee),
-				AttendanceAlreadyMarkedError)
+			frappe.throw(
+				_("Attendance for employee {0} is already marked for this day").format(self.employee),
+				AttendanceAlreadyMarkedError,
+			)
 
 	def validate_optional_leave(self):
 		leave_period = get_leave_period(self.from_date, self.to_date, self.company)
 		if not leave_period:
 			frappe.throw(_("Cannot find active Leave Period"))
-		optional_holiday_list = frappe.db.get_value("Leave Period", leave_period[0]["name"], "optional_holiday_list")
+		optional_holiday_list = frappe.db.get_value(
+			"Leave Period", leave_period[0]["name"], "optional_holiday_list"
+		)
 		if not optional_holiday_list:
-			frappe.throw(_("Optional Holiday List not set for leave period {0}").format(leave_period[0]["name"]))
+			frappe.throw(
+				_("Optional Holiday List not set for leave period {0}").format(leave_period[0]["name"])
+			)
 		day = getdate(self.from_date)
 		while day <= getdate(self.to_date):
-			if not frappe.db.exists({"doctype": "Holiday", "parent": optional_holiday_list, "holiday_date": day}):
-				frappe.throw(_("{0} is not in Optional Holiday List").format(formatdate(day)), NotAnOptionalHoliday)
+			if not frappe.db.exists(
+				{"doctype": "Holiday", "parent": optional_holiday_list, "holiday_date": day}
+			):
+				frappe.throw(
+					_("{0} is not in Optional Holiday List").format(formatdate(day)), NotAnOptionalHoliday
+				)
 			day = add_days(day, 1)
 
 	def set_half_day_date(self):
@@ -392,44 +498,50 @@
 		if not employee.user_id:
 			return
 
-		parent_doc = frappe.get_doc('Leave Application', self.name)
+		parent_doc = frappe.get_doc("Leave Application", self.name)
 		args = parent_doc.as_dict()
 
-		template = frappe.db.get_single_value('HR Settings', 'leave_status_notification_template')
+		template = frappe.db.get_single_value("HR Settings", "leave_status_notification_template")
 		if not template:
 			frappe.msgprint(_("Please set default template for Leave Status Notification in HR Settings."))
 			return
 		email_template = frappe.get_doc("Email Template", template)
 		message = frappe.render_template(email_template.response, args)
 
-		self.notify({
-			# for post in messages
-			"message": message,
-			"message_to": employee.user_id,
-			# for email
-			"subject": email_template.subject,
-			"notify": "employee"
-		})
+		self.notify(
+			{
+				# for post in messages
+				"message": message,
+				"message_to": employee.user_id,
+				# for email
+				"subject": email_template.subject,
+				"notify": "employee",
+			}
+		)
 
 	def notify_leave_approver(self):
 		if self.leave_approver:
-			parent_doc = frappe.get_doc('Leave Application', self.name)
+			parent_doc = frappe.get_doc("Leave Application", self.name)
 			args = parent_doc.as_dict()
 
-			template = frappe.db.get_single_value('HR Settings', 'leave_approval_notification_template')
+			template = frappe.db.get_single_value("HR Settings", "leave_approval_notification_template")
 			if not template:
-				frappe.msgprint(_("Please set default template for Leave Approval Notification in HR Settings."))
+				frappe.msgprint(
+					_("Please set default template for Leave Approval Notification in HR Settings.")
+				)
 				return
 			email_template = frappe.get_doc("Email Template", template)
 			message = frappe.render_template(email_template.response, args)
 
-			self.notify({
-				# for post in messages
-				"message": message,
-				"message_to": self.leave_approver,
-				# for email
-				"subject": email_template.subject
-			})
+			self.notify(
+				{
+					# for post in messages
+					"message": message,
+					"message_to": self.leave_approver,
+					# for email
+					"subject": email_template.subject,
+				}
+			)
 
 	def notify(self, args):
 		args = frappe._dict(args)
@@ -438,29 +550,30 @@
 			contact = args.message_to
 			if not isinstance(contact, list):
 				if not args.notify == "employee":
-					contact = frappe.get_doc('User', contact).email or contact
+					contact = frappe.get_doc("User", contact).email or contact
 
-			sender      	    = dict()
-			sender['email']     = frappe.get_doc('User', frappe.session.user).email
-			sender['full_name'] = get_fullname(sender['email'])
+			sender = dict()
+			sender["email"] = frappe.get_doc("User", frappe.session.user).email
+			sender["full_name"] = get_fullname(sender["email"])
 
 			try:
 				frappe.sendmail(
-					recipients = contact,
-					sender = sender['email'],
-					subject = args.subject,
-					message = args.message,
+					recipients=contact,
+					sender=sender["email"],
+					subject=args.subject,
+					message=args.message,
 				)
 				frappe.msgprint(_("Email sent to {0}").format(contact))
 			except frappe.OutgoingEmailError:
 				pass
 
 	def create_leave_ledger_entry(self, submit=True):
-		if self.status != 'Approved' and submit:
+		if self.status != "Approved" and submit:
 			return
 
-		expiry_date = get_allocation_expiry_for_cf_leaves(self.employee, self.leave_type,
-			self.to_date, self.from_date)
+		expiry_date = get_allocation_expiry_for_cf_leaves(
+			self.employee, self.leave_type, self.to_date, self.from_date
+		)
 		lwp = frappe.db.get_value("Leave Type", self.leave_type, "is_lwp")
 
 		if expiry_date:
@@ -478,24 +591,42 @@
 					from_date=self.from_date,
 					to_date=self.to_date,
 					is_lwp=lwp,
-					holiday_list=get_holiday_list_for_employee(self.employee, raise_exception=raise_exception) or ''
+					holiday_list=get_holiday_list_for_employee(self.employee, raise_exception=raise_exception)
+					or "",
 				)
 				create_leave_ledger_entry(self, args, submit)
 
-	def is_separate_ledger_entry_required(self, alloc_on_from_date: Optional[Dict] = None, alloc_on_to_date: Optional[Dict] = None) -> bool:
+	def is_separate_ledger_entry_required(
+		self, alloc_on_from_date: Optional[Dict] = None, alloc_on_to_date: Optional[Dict] = None
+	) -> bool:
 		"""Checks if application dates fall in separate allocations"""
-		if ((alloc_on_from_date and not alloc_on_to_date)
+		if (
+			(alloc_on_from_date and not alloc_on_to_date)
 			or (not alloc_on_from_date and alloc_on_to_date)
-			or (alloc_on_from_date and alloc_on_to_date and alloc_on_from_date.name != alloc_on_to_date.name)):
+			or (
+				alloc_on_from_date and alloc_on_to_date and alloc_on_from_date.name != alloc_on_to_date.name
+			)
+		):
 			return True
 		return False
 
 	def create_separate_ledger_entries(self, alloc_on_from_date, alloc_on_to_date, submit, lwp):
 		"""Creates separate ledger entries for application period falling into separate allocations"""
 		# for creating separate ledger entries existing allocation periods should be consecutive
-		if submit and alloc_on_from_date and alloc_on_to_date and add_days(alloc_on_from_date.to_date, 1) != alloc_on_to_date.from_date:
-			frappe.throw(_("Leave Application period cannot be across two non-consecutive leave allocations {0} and {1}.").format(
-				get_link_to_form("Leave Allocation", alloc_on_from_date.name), get_link_to_form("Leave Allocation", alloc_on_to_date)))
+		if (
+			submit
+			and alloc_on_from_date
+			and alloc_on_to_date
+			and add_days(alloc_on_from_date.to_date, 1) != alloc_on_to_date.from_date
+		):
+			frappe.throw(
+				_(
+					"Leave Application period cannot be across two non-consecutive leave allocations {0} and {1}."
+				).format(
+					get_link_to_form("Leave Allocation", alloc_on_from_date.name),
+					get_link_to_form("Leave Allocation", alloc_on_to_date),
+				)
+			)
 
 		raise_exception = False if frappe.flags.in_patch else True
 
@@ -506,38 +637,48 @@
 			first_alloc_end = add_days(alloc_on_to_date.from_date, -1)
 			second_alloc_start = alloc_on_to_date.from_date
 
-		leaves_in_first_alloc = get_number_of_leave_days(self.employee, self.leave_type,
-			self.from_date, first_alloc_end, self.half_day, self.half_day_date)
-		leaves_in_second_alloc = get_number_of_leave_days(self.employee, self.leave_type,
-			second_alloc_start, self.to_date, self.half_day, self.half_day_date)
+		leaves_in_first_alloc = get_number_of_leave_days(
+			self.employee,
+			self.leave_type,
+			self.from_date,
+			first_alloc_end,
+			self.half_day,
+			self.half_day_date,
+		)
+		leaves_in_second_alloc = get_number_of_leave_days(
+			self.employee,
+			self.leave_type,
+			second_alloc_start,
+			self.to_date,
+			self.half_day,
+			self.half_day_date,
+		)
 
 		args = dict(
 			is_lwp=lwp,
-			holiday_list=get_holiday_list_for_employee(self.employee, raise_exception=raise_exception) or ''
+			holiday_list=get_holiday_list_for_employee(self.employee, raise_exception=raise_exception)
+			or "",
 		)
 
 		if leaves_in_first_alloc:
-			args.update(dict(
-				from_date=self.from_date,
-				to_date=first_alloc_end,
-				leaves=leaves_in_first_alloc * -1
-			))
+			args.update(
+				dict(from_date=self.from_date, to_date=first_alloc_end, leaves=leaves_in_first_alloc * -1)
+			)
 			create_leave_ledger_entry(self, args, submit)
 
 		if leaves_in_second_alloc:
-			args.update(dict(
-				from_date=second_alloc_start,
-				to_date=self.to_date,
-				leaves=leaves_in_second_alloc * -1
-			))
+			args.update(
+				dict(from_date=second_alloc_start, to_date=self.to_date, leaves=leaves_in_second_alloc * -1)
+			)
 			create_leave_ledger_entry(self, args, submit)
 
 	def create_ledger_entry_for_intermediate_allocation_expiry(self, expiry_date, submit, lwp):
 		"""Splits leave application into two ledger entries to consider expiry of allocation"""
 		raise_exception = False if frappe.flags.in_patch else True
 
-		leaves = get_number_of_leave_days(self.employee, self.leave_type,
-			self.from_date, expiry_date, self.half_day, self.half_day_date)
+		leaves = get_number_of_leave_days(
+			self.employee, self.leave_type, self.from_date, expiry_date, self.half_day, self.half_day_date
+		)
 
 		if leaves:
 			args = dict(
@@ -545,41 +686,51 @@
 				to_date=expiry_date,
 				leaves=leaves * -1,
 				is_lwp=lwp,
-				holiday_list=get_holiday_list_for_employee(self.employee, raise_exception=raise_exception) or ''
+				holiday_list=get_holiday_list_for_employee(self.employee, raise_exception=raise_exception)
+				or "",
 			)
 			create_leave_ledger_entry(self, args, submit)
 
 		if getdate(expiry_date) != getdate(self.to_date):
 			start_date = add_days(expiry_date, 1)
-			leaves = get_number_of_leave_days(self.employee, self.leave_type,
-				start_date, self.to_date, self.half_day, self.half_day_date)
+			leaves = get_number_of_leave_days(
+				self.employee, self.leave_type, start_date, self.to_date, self.half_day, self.half_day_date
+			)
 
 			if leaves:
-				args.update(dict(
-					from_date=start_date,
-					to_date=self.to_date,
-					leaves=leaves * -1
-				))
+				args.update(dict(from_date=start_date, to_date=self.to_date, leaves=leaves * -1))
 				create_leave_ledger_entry(self, args, submit)
 
 
-def get_allocation_expiry_for_cf_leaves(employee: str, leave_type: str, to_date: str, from_date: str) -> str:
-	''' Returns expiry of carry forward allocation in leave ledger entry '''
-	expiry =  frappe.get_all("Leave Ledger Entry",
+def get_allocation_expiry_for_cf_leaves(
+	employee: str, leave_type: str, to_date: str, from_date: str
+) -> str:
+	"""Returns expiry of carry forward allocation in leave ledger entry"""
+	expiry = frappe.get_all(
+		"Leave Ledger Entry",
 		filters={
-			'employee': employee,
-			'leave_type': leave_type,
-			'is_carry_forward': 1,
-			'transaction_type': 'Leave Allocation',
-			'to_date': ['between', (from_date, to_date)],
-			'docstatus': 1
-		},fields=['to_date'])
-	return expiry[0]['to_date'] if expiry else ''
+			"employee": employee,
+			"leave_type": leave_type,
+			"is_carry_forward": 1,
+			"transaction_type": "Leave Allocation",
+			"to_date": ["between", (from_date, to_date)],
+			"docstatus": 1,
+		},
+		fields=["to_date"],
+	)
+	return expiry[0]["to_date"] if expiry else ""
 
 
 @frappe.whitelist()
-def get_number_of_leave_days(employee: str, leave_type: str, from_date: str, to_date: str, half_day: Optional[int] = None,
-	half_day_date: Optional[str] = None, holiday_list: Optional[str] = None) -> float:
+def get_number_of_leave_days(
+	employee: str,
+	leave_type: str,
+	from_date: str,
+	to_date: str,
+	half_day: Optional[int] = None,
+	half_day_date: Optional[str] = None,
+	holiday_list: Optional[str] = None,
+) -> float:
 	"""Returns number of leave days between 2 dates after considering half day and holidays
 	(Based on the include_holiday setting in Leave Type)"""
 	number_of_days = 0
@@ -587,14 +738,16 @@
 		if from_date == to_date:
 			number_of_days = 0.5
 		elif half_day_date and half_day_date <= to_date:
-			number_of_days = date_diff(to_date, from_date) + .5
+			number_of_days = date_diff(to_date, from_date) + 0.5
 		else:
 			number_of_days = date_diff(to_date, from_date) + 1
 	else:
 		number_of_days = date_diff(to_date, from_date) + 1
 
 	if not frappe.db.get_value("Leave Type", leave_type, "include_holiday"):
-		number_of_days = flt(number_of_days) - flt(get_holidays(employee, from_date, to_date, holiday_list=holiday_list))
+		number_of_days = flt(number_of_days) - flt(
+			get_holidays(employee, from_date, to_date, holiday_list=holiday_list)
+		)
 	return number_of_days
 
 
@@ -605,54 +758,71 @@
 	for d in allocation_records:
 		allocation = allocation_records.get(d, frappe._dict())
 
-		total_allocated_leaves = frappe.db.get_value('Leave Allocation', {
-			'from_date': ('<=', date),
-			'to_date': ('>=', date),
-			'employee': employee,
-			'leave_type': allocation.leave_type,
-			'docstatus': 1
-		}, 'SUM(total_leaves_allocated)') or 0
+		total_allocated_leaves = (
+			frappe.db.get_value(
+				"Leave Allocation",
+				{
+					"from_date": ("<=", date),
+					"to_date": (">=", date),
+					"employee": employee,
+					"leave_type": allocation.leave_type,
+					"docstatus": 1,
+				},
+				"SUM(total_leaves_allocated)",
+			)
+			or 0
+		)
 
-		remaining_leaves = get_leave_balance_on(employee, d, date, to_date = allocation.to_date,
-			consider_all_leaves_in_the_allocation_period=True)
+		remaining_leaves = get_leave_balance_on(
+			employee, d, date, to_date=allocation.to_date, consider_all_leaves_in_the_allocation_period=True
+		)
 
 		end_date = allocation.to_date
 		leaves_taken = get_leaves_for_period(employee, d, allocation.from_date, end_date) * -1
-		leaves_pending = get_leaves_pending_approval_for_period(employee, d, allocation.from_date, end_date)
+		leaves_pending = get_leaves_pending_approval_for_period(
+			employee, d, allocation.from_date, end_date
+		)
 
 		leave_allocation[d] = {
 			"total_leaves": total_allocated_leaves,
 			"expired_leaves": total_allocated_leaves - (remaining_leaves + leaves_taken),
 			"leaves_taken": leaves_taken,
 			"leaves_pending_approval": leaves_pending,
-			"remaining_leaves": remaining_leaves}
+			"remaining_leaves": remaining_leaves,
+		}
 
-	#is used in set query
+	# is used in set query
 	lwp = frappe.get_list("Leave Type", filters={"is_lwp": 1}, pluck="name")
 
 	return {
 		"leave_allocation": leave_allocation,
 		"leave_approver": get_leave_approver(employee),
-		"lwps": lwp
+		"lwps": lwp,
 	}
 
 
 @frappe.whitelist()
-def get_leave_balance_on(employee: str, leave_type: str, date: str, to_date: str = None,
-	consider_all_leaves_in_the_allocation_period: bool = False, for_consumption: bool = False):
-	'''
-		Returns leave balance till date
-		:param employee: employee name
-		:param leave_type: leave type
-		:param date: date to check balance on
-		:param to_date: future date to check for allocation expiry
-		:param consider_all_leaves_in_the_allocation_period: consider all leaves taken till the allocation end date
-		:param for_consumption: flag to check if leave balance is required for consumption or display
-			eg: employee has leave balance = 10 but allocation is expiring in 1 day so employee can only consume 1 leave
-			in this case leave_balance = 10 but leave_balance_for_consumption = 1
-			if True, returns a dict eg: {'leave_balance': 10, 'leave_balance_for_consumption': 1}
-			else, returns leave_balance (in this case 10)
-	'''
+def get_leave_balance_on(
+	employee: str,
+	leave_type: str,
+	date: str,
+	to_date: str = None,
+	consider_all_leaves_in_the_allocation_period: bool = False,
+	for_consumption: bool = False,
+):
+	"""
+	Returns leave balance till date
+	:param employee: employee name
+	:param leave_type: leave type
+	:param date: date to check balance on
+	:param to_date: future date to check for allocation expiry
+	:param consider_all_leaves_in_the_allocation_period: consider all leaves taken till the allocation end date
+	:param for_consumption: flag to check if leave balance is required for consumption or display
+	        eg: employee has leave balance = 10 but allocation is expiring in 1 day so employee can only consume 1 leave
+	        in this case leave_balance = 10 but leave_balance_for_consumption = 1
+	        if True, returns a dict eg: {'leave_balance': 10, 'leave_balance_for_consumption': 1}
+	        else, returns leave_balance (in this case 10)
+	"""
 
 	if not to_date:
 		to_date = nowdate()
@@ -670,17 +840,21 @@
 	if for_consumption:
 		return remaining_leaves
 	else:
-		return remaining_leaves.get('leave_balance')
+		return remaining_leaves.get("leave_balance")
 
 
 def get_leave_allocation_records(employee, date, leave_type=None):
 	"""Returns the total allocated leaves and carry forwarded leaves based on ledger entries"""
 	Ledger = frappe.qb.DocType("Leave Ledger Entry")
 
-	cf_leave_case = frappe.qb.terms.Case().when(Ledger.is_carry_forward == "1", Ledger.leaves).else_(0)
+	cf_leave_case = (
+		frappe.qb.terms.Case().when(Ledger.is_carry_forward == "1", Ledger.leaves).else_(0)
+	)
 	sum_cf_leaves = Sum(cf_leave_case).as_("cf_leaves")
 
-	new_leaves_case = frappe.qb.terms.Case().when(Ledger.is_carry_forward == "0", Ledger.leaves).else_(0)
+	new_leaves_case = (
+		frappe.qb.terms.Case().when(Ledger.is_carry_forward == "0", Ledger.leaves).else_(0)
+	)
 	sum_new_leaves = Sum(new_leaves_case).as_("new_leaves")
 
 	query = (
@@ -690,8 +864,9 @@
 			sum_new_leaves,
 			Min(Ledger.from_date).as_("from_date"),
 			Max(Ledger.to_date).as_("to_date"),
-			Ledger.leave_type
-		).where(
+			Ledger.leave_type,
+		)
+		.where(
 			(Ledger.from_date <= date)
 			& (Ledger.to_date >= date)
 			& (Ledger.docstatus == 1)
@@ -710,46 +885,57 @@
 
 	allocated_leaves = frappe._dict()
 	for d in allocation_details:
-		allocated_leaves.setdefault(d.leave_type, frappe._dict({
-			"from_date": d.from_date,
-			"to_date": d.to_date,
-			"total_leaves_allocated": flt(d.cf_leaves) + flt(d.new_leaves),
-			"unused_leaves": d.cf_leaves,
-			"new_leaves_allocated": d.new_leaves,
-			"leave_type": d.leave_type
-		}))
+		allocated_leaves.setdefault(
+			d.leave_type,
+			frappe._dict(
+				{
+					"from_date": d.from_date,
+					"to_date": d.to_date,
+					"total_leaves_allocated": flt(d.cf_leaves) + flt(d.new_leaves),
+					"unused_leaves": d.cf_leaves,
+					"new_leaves_allocated": d.new_leaves,
+					"leave_type": d.leave_type,
+				}
+			),
+		)
 	return allocated_leaves
 
 
-def get_leaves_pending_approval_for_period(employee: str, leave_type: str, from_date: str, to_date: str) -> float:
-	''' Returns leaves that are pending for approval '''
-	leaves = frappe.get_all("Leave Application",
-		filters={
-			"employee": employee,
-			"leave_type": leave_type,
-			"status": "Open"
-		},
+def get_leaves_pending_approval_for_period(
+	employee: str, leave_type: str, from_date: str, to_date: str
+) -> float:
+	"""Returns leaves that are pending for approval"""
+	leaves = frappe.get_all(
+		"Leave Application",
+		filters={"employee": employee, "leave_type": leave_type, "status": "Open"},
 		or_filters={
 			"from_date": ["between", (from_date, to_date)],
-			"to_date": ["between", (from_date, to_date)]
-		}, fields=['SUM(total_leave_days) as leaves'])[0]
-	return leaves['leaves'] if leaves['leaves'] else 0.0
+			"to_date": ["between", (from_date, to_date)],
+		},
+		fields=["SUM(total_leave_days) as leaves"],
+	)[0]
+	return leaves["leaves"] if leaves["leaves"] else 0.0
 
 
-def get_remaining_leaves(allocation: Dict, leaves_taken: float, date: str, cf_expiry: str) -> Dict[str, float]:
-	'''Returns a dict of leave_balance and leave_balance_for_consumption
+def get_remaining_leaves(
+	allocation: Dict, leaves_taken: float, date: str, cf_expiry: str
+) -> Dict[str, float]:
+	"""Returns a dict of leave_balance and leave_balance_for_consumption
 	leave_balance returns the available leave balance
 	leave_balance_for_consumption returns the minimum leaves remaining after comparing with remaining days for allocation expiry
-	'''
+	"""
+
 	def _get_remaining_leaves(remaining_leaves, end_date):
-		''' Returns minimum leaves remaining after comparing with remaining days for allocation expiry '''
+		"""Returns minimum leaves remaining after comparing with remaining days for allocation expiry"""
 		if remaining_leaves > 0:
 			remaining_days = date_diff(end_date, date) + 1
 			remaining_leaves = min(remaining_days, remaining_leaves)
 
 		return remaining_leaves
 
-	leave_balance = leave_balance_for_consumption = flt(allocation.total_leaves_allocated) + flt(leaves_taken)
+	leave_balance = leave_balance_for_consumption = flt(allocation.total_leaves_allocated) + flt(
+		leaves_taken
+	)
 
 	# balance for carry forwarded leaves
 	if cf_expiry and allocation.unused_leaves:
@@ -763,21 +949,29 @@
 	return frappe._dict(leave_balance=leave_balance, leave_balance_for_consumption=remaining_leaves)
 
 
-def get_leaves_for_period(employee: str, leave_type: str, from_date: str, to_date: str, skip_expired_leaves: bool = True) -> float:
+def get_leaves_for_period(
+	employee: str, leave_type: str, from_date: str, to_date: str, skip_expired_leaves: bool = True
+) -> float:
 	leave_entries = get_leave_entries(employee, leave_type, from_date, to_date)
 	leave_days = 0
 
 	for leave_entry in leave_entries:
-		inclusive_period = leave_entry.from_date >= getdate(from_date) and leave_entry.to_date <= getdate(to_date)
+		inclusive_period = leave_entry.from_date >= getdate(
+			from_date
+		) and leave_entry.to_date <= getdate(to_date)
 
-		if inclusive_period and leave_entry.transaction_type == 'Leave Encashment':
+		if inclusive_period and leave_entry.transaction_type == "Leave Encashment":
 			leave_days += leave_entry.leaves
 
-		elif inclusive_period and leave_entry.transaction_type == 'Leave Allocation' and leave_entry.is_expired \
-			and not skip_expired_leaves:
+		elif (
+			inclusive_period
+			and leave_entry.transaction_type == "Leave Allocation"
+			and leave_entry.is_expired
+			and not skip_expired_leaves
+		):
 			leave_days += leave_entry.leaves
 
-		elif leave_entry.transaction_type == 'Leave Application':
+		elif leave_entry.transaction_type == "Leave Application":
 			if leave_entry.from_date < getdate(from_date):
 				leave_entry.from_date = from_date
 			if leave_entry.to_date > getdate(to_date):
@@ -788,18 +982,30 @@
 			# fetch half day date for leaves with half days
 			if leave_entry.leaves % 1:
 				half_day = 1
-				half_day_date = frappe.db.get_value('Leave Application',
-					{'name': leave_entry.transaction_name}, ['half_day_date'])
+				half_day_date = frappe.db.get_value(
+					"Leave Application", {"name": leave_entry.transaction_name}, ["half_day_date"]
+				)
 
-			leave_days += get_number_of_leave_days(employee, leave_type,
-				leave_entry.from_date, leave_entry.to_date, half_day, half_day_date, holiday_list=leave_entry.holiday_list) * -1
+			leave_days += (
+				get_number_of_leave_days(
+					employee,
+					leave_type,
+					leave_entry.from_date,
+					leave_entry.to_date,
+					half_day,
+					half_day_date,
+					holiday_list=leave_entry.holiday_list,
+				)
+				* -1
+			)
 
 	return leave_days
 
 
 def get_leave_entries(employee, leave_type, from_date, to_date):
-	''' Returns leave entries between from_date and to_date. '''
-	return frappe.db.sql("""
+	"""Returns leave entries between from_date and to_date."""
+	return frappe.db.sql(
+		"""
 		SELECT
 			employee, leave_type, from_date, to_date, leaves, transaction_name, transaction_type, holiday_list,
 			is_carry_forward, is_expired
@@ -811,26 +1017,28 @@
 			AND (from_date between %(from_date)s AND %(to_date)s
 				OR to_date between %(from_date)s AND %(to_date)s
 				OR (from_date < %(from_date)s AND to_date > %(to_date)s))
-	""", {
-		"from_date": from_date,
-		"to_date": to_date,
-		"employee": employee,
-		"leave_type": leave_type
-	}, as_dict=1)
+	""",
+		{"from_date": from_date, "to_date": to_date, "employee": employee, "leave_type": leave_type},
+		as_dict=1,
+	)
 
 
 @frappe.whitelist()
-def get_holidays(employee, from_date, to_date, holiday_list = None):
-	'''get holidays between two dates for the given employee'''
+def get_holidays(employee, from_date, to_date, holiday_list=None):
+	"""get holidays between two dates for the given employee"""
 	if not holiday_list:
 		holiday_list = get_holiday_list_for_employee(employee)
 
-	holidays = frappe.db.sql("""select count(distinct holiday_date) from `tabHoliday` h1, `tabHoliday List` h2
+	holidays = frappe.db.sql(
+		"""select count(distinct holiday_date) from `tabHoliday` h1, `tabHoliday List` h2
 		where h1.parent = h2.name and h1.holiday_date between %s and %s
-		and h2.name = %s""", (from_date, to_date, holiday_list))[0][0]
+		and h2.name = %s""",
+		(from_date, to_date, holiday_list),
+	)[0][0]
 
 	return holidays
 
+
 def is_lwp(leave_type):
 	lwp = frappe.db.sql("select is_lwp from `tabLeave Type` where name = %s", leave_type)
 	return lwp and cint(lwp[0][0]) or 0
@@ -839,18 +1047,17 @@
 @frappe.whitelist()
 def get_events(start, end, filters=None):
 	from frappe.desk.reportview import get_filters_cond
+
 	events = []
 
-	employee = frappe.db.get_value("Employee",
-		filters={"user_id": frappe.session.user},
-		fieldname=["name", "company"],
-		as_dict=True
+	employee = frappe.db.get_value(
+		"Employee", filters={"user_id": frappe.session.user}, fieldname=["name", "company"], as_dict=True
 	)
 
 	if employee:
 		employee, company = employee.name, employee.company
 	else:
-		employee = ''
+		employee = ""
 		company = frappe.db.get_value("Global Defaults", None, "default_company")
 
 	conditions = get_filters_cond("Leave Application", filters, [])
@@ -872,18 +1079,24 @@
 		return
 
 	# department leaves
-	department_employees = frappe.db.sql_list("""select name from tabEmployee where department=%s
-		and company=%s""", (department, company))
+	department_employees = frappe.db.sql_list(
+		"""select name from tabEmployee where department=%s
+		and company=%s""",
+		(department, company),
+	)
 
-	filter_conditions = " and employee in (\"%s\")" % '", "'.join(department_employees)
+	filter_conditions = ' and employee in ("%s")' % '", "'.join(department_employees)
 	add_leaves(events, start, end, filter_conditions=filter_conditions)
 
 
 def add_leaves(events, start, end, filter_conditions=None):
 	from frappe.desk.reportview import build_match_conditions
+
 	conditions = []
 
-	if not cint(frappe.db.get_value("HR Settings", None, "show_leaves_of_all_department_members_in_calendar")):
+	if not cint(
+		frappe.db.get_value("HR Settings", None, "show_leaves_of_all_department_members_in_calendar")
+	):
 		match_conditions = build_match_conditions("Leave Application")
 
 		if match_conditions:
@@ -908,12 +1121,12 @@
 	"""
 
 	if conditions:
-		query += ' AND ' + ' AND '.join(conditions)
+		query += " AND " + " AND ".join(conditions)
 
 	if filter_conditions:
 		query += filter_conditions
 
-	for d in frappe.db.sql(query, {"start":start, "end": end}, as_dict=True):
+	for d in frappe.db.sql(query, {"start": start, "end": end}, as_dict=True):
 		e = {
 			"name": d.name,
 			"doctype": "Leave Application",
@@ -922,7 +1135,9 @@
 			"docstatus": d.docstatus,
 			"color": d.color,
 			"all_day": int(not d.half_day),
-			"title": cstr(d.employee_name) + f' ({cstr(d.leave_type)})' + (' ' + _('(Half Day)') if d.half_day else ''),
+			"title": cstr(d.employee_name)
+			+ f" ({cstr(d.leave_type)})"
+			+ (" " + _("(Half Day)") if d.half_day else ""),
 		}
 		if e not in events:
 			events.append(e)
@@ -936,14 +1151,16 @@
 	block_dates = get_applicable_block_dates(start, end, employee, company, all_lists=True)
 
 	for block_date in block_dates:
-		events.append({
-			"doctype": "Leave Block List Date",
-			"from_date": block_date.block_date,
-			"to_date": block_date.block_date,
-			"title": _("Leave Blocked") + ": " + block_date.reason,
-			"name": "_" + str(cnt),
-		})
-		cnt+=1
+		events.append(
+			{
+				"doctype": "Leave Block List Date",
+				"from_date": block_date.block_date,
+				"to_date": block_date.block_date,
+				"title": _("Leave Blocked") + ": " + block_date.reason,
+				"name": "_" + str(cnt),
+			}
+		)
+		cnt += 1
 
 
 def add_holidays(events, start, end, employee, company):
@@ -951,27 +1168,34 @@
 	if not applicable_holiday_list:
 		return
 
-	for holiday in frappe.db.sql("""select name, holiday_date, description
+	for holiday in frappe.db.sql(
+		"""select name, holiday_date, description
 		from `tabHoliday` where parent=%s and holiday_date between %s and %s""",
-		(applicable_holiday_list, start, end), as_dict=True):
-			events.append({
+		(applicable_holiday_list, start, end),
+		as_dict=True,
+	):
+		events.append(
+			{
 				"doctype": "Holiday",
 				"from_date": holiday.holiday_date,
-				"to_date":  holiday.holiday_date,
+				"to_date": holiday.holiday_date,
 				"title": _("Holiday") + ": " + cstr(holiday.description),
-				"name": holiday.name
-			})
+				"name": holiday.name,
+			}
+		)
 
 
 @frappe.whitelist()
 def get_mandatory_approval(doctype):
 	mandatory = ""
 	if doctype == "Leave Application":
-		mandatory = frappe.db.get_single_value('HR Settings',
-				'leave_approver_mandatory_in_leave_application')
+		mandatory = frappe.db.get_single_value(
+			"HR Settings", "leave_approver_mandatory_in_leave_application"
+		)
 	else:
-		mandatory = frappe.db.get_single_value('HR Settings',
-				'expense_approver_mandatory_in_expense_claim')
+		mandatory = frappe.db.get_single_value(
+			"HR Settings", "expense_approver_mandatory_in_expense_claim"
+		)
 
 	return mandatory
 
@@ -989,12 +1213,11 @@
 	if leave_type:
 		query += "and leave_type=%(leave_type)s"
 
-	leave_applications = frappe.db.sql(query,{
-		"from_date": from_date,
-		"to_date": to_date,
-		"employee": employee,
-		"leave_type": leave_type
-	}, as_dict=1)
+	leave_applications = frappe.db.sql(
+		query,
+		{"from_date": from_date, "to_date": to_date, "employee": employee, "leave_type": leave_type},
+		as_dict=1,
+	)
 
 	leave_days = 0
 	for leave_app in leave_applications:
@@ -1006,19 +1229,24 @@
 			if leave_app.to_date > getdate(to_date):
 				leave_app.to_date = to_date
 
-			leave_days += get_number_of_leave_days(employee, leave_type,
-				leave_app.from_date, leave_app.to_date)
+			leave_days += get_number_of_leave_days(
+				employee, leave_type, leave_app.from_date, leave_app.to_date
+			)
 
 	return leave_days
 
 
 @frappe.whitelist()
 def get_leave_approver(employee):
-	leave_approver, department = frappe.db.get_value("Employee",
-		employee, ["leave_approver", "department"])
+	leave_approver, department = frappe.db.get_value(
+		"Employee", employee, ["leave_approver", "department"]
+	)
 
 	if not leave_approver and department:
-		leave_approver = frappe.db.get_value('Department Approver', {'parent': department,
-			'parentfield': 'leave_approvers', 'idx': 1}, 'approver')
+		leave_approver = frappe.db.get_value(
+			"Department Approver",
+			{"parent": department, "parentfield": "leave_approvers", "idx": 1},
+			"approver",
+		)
 
 	return leave_approver
diff --git a/erpnext/hr/doctype/leave_application/leave_application_dashboard.py b/erpnext/hr/doctype/leave_application/leave_application_dashboard.py
index 8b0b98d..ee5cbe9 100644
--- a/erpnext/hr/doctype/leave_application/leave_application_dashboard.py
+++ b/erpnext/hr/doctype/leave_application/leave_application_dashboard.py
@@ -3,16 +3,7 @@
 
 def get_data():
 	return {
-		'fieldname': 'leave_application',
-		'transactions': [
-			{
-				'items': ['Attendance']
-			}
-		],
-        'reports': [
-			{
-                'label': _('Reports'),
-				'items': ['Employee Leave Balance']
-			}
-		]
-    }
+		"fieldname": "leave_application",
+		"transactions": [{"items": ["Attendance"]}],
+		"reports": [{"label": _("Reports"), "items": ["Employee Leave Balance"]}],
+	}
diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py
index 3a30990..f33d0af 100644
--- a/erpnext/hr/doctype/leave_application/test_leave_application.py
+++ b/erpnext/hr/doctype/leave_application/test_leave_application.py
@@ -49,7 +49,7 @@
 		"description": "_Test Reason",
 		"leave_type": "_Test Leave Type",
 		"posting_date": "2013-01-02",
-		"to_date": "2013-05-05"
+		"to_date": "2013-05-05",
 	},
 	{
 		"company": "_Test Company",
@@ -59,7 +59,7 @@
 		"description": "_Test Reason",
 		"leave_type": "_Test Leave Type",
 		"posting_date": "2013-01-02",
-		"to_date": "2013-05-05"
+		"to_date": "2013-05-05",
 	},
 	{
 		"company": "_Test Company",
@@ -69,8 +69,8 @@
 		"description": "_Test Reason",
 		"leave_type": "_Test Leave Type LWP",
 		"posting_date": "2013-01-02",
-		"to_date": "2013-01-15"
-	}
+		"to_date": "2013-01-15",
+	},
 ]
 
 
@@ -90,19 +90,19 @@
 		self.holiday_list = make_holiday_list(from_date=from_date, to_date=to_date)
 
 		if not frappe.db.exists("Leave Type", "_Test Leave Type"):
-			frappe.get_doc(dict(
-				leave_type_name="_Test Leave Type",
-				doctype="Leave Type",
-				include_holiday=True
-			)).insert()
+			frappe.get_doc(
+				dict(leave_type_name="_Test Leave Type", doctype="Leave Type", include_holiday=True)
+			).insert()
 
 	def tearDown(self):
 		frappe.db.rollback()
 		frappe.set_user("Administrator")
 
 	def _clear_roles(self):
-		frappe.db.sql("""delete from `tabHas Role` where parent in
-			("test@example.com", "test1@example.com", "test2@example.com")""")
+		frappe.db.sql(
+			"""delete from `tabHas Role` where parent in
+			("test@example.com", "test1@example.com", "test2@example.com")"""
+		)
 
 	def _clear_applications(self):
 		frappe.db.sql("""delete from `tabLeave Application`""")
@@ -113,91 +113,100 @@
 		application.to_date = "2013-01-05"
 		return application
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_validate_application_across_allocations(self):
 		# Test validation for application dates when negative balance is disabled
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Validation", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name="Test Leave Validation",
-			doctype="Leave Type",
-			allow_negative=False
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(leave_type_name="Test Leave Validation", doctype="Leave Type", allow_negative=False)
+		).insert()
 
 		employee = get_employee()
 		date = getdate()
 		first_sunday = get_first_sunday(self.holiday_list, for_date=get_year_start(date))
 
-		leave_application = frappe.get_doc(dict(
-			doctype='Leave Application',
-			employee=employee.name,
-			leave_type=leave_type.name,
-			from_date=add_days(first_sunday, 1),
-			to_date=add_days(first_sunday, 4),
-			company="_Test Company",
-			status="Approved",
-			leave_approver = 'test@example.com'
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				from_date=add_days(first_sunday, 1),
+				to_date=add_days(first_sunday, 4),
+				company="_Test Company",
+				status="Approved",
+				leave_approver="test@example.com",
+			)
+		)
 		# Application period cannot be outside leave allocation period
 		self.assertRaises(frappe.ValidationError, leave_application.insert)
 
-		make_allocation_record(leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date))
+		make_allocation_record(
+			leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date)
+		)
 
-		leave_application = frappe.get_doc(dict(
-			doctype='Leave Application',
-			employee=employee.name,
-			leave_type=leave_type.name,
-			from_date=add_days(first_sunday, -10),
-			to_date=add_days(first_sunday, 1),
-			company="_Test Company",
-			status="Approved",
-			leave_approver = 'test@example.com'
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				from_date=add_days(first_sunday, -10),
+				to_date=add_days(first_sunday, 1),
+				company="_Test Company",
+				status="Approved",
+				leave_approver="test@example.com",
+			)
+		)
 
 		# Application period cannot be across two allocation records
 		self.assertRaises(LeaveAcrossAllocationsError, leave_application.insert)
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_insufficient_leave_balance_validation(self):
 		# CASE 1: Validation when allow negative is disabled
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Validation", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name="Test Leave Validation",
-			doctype="Leave Type",
-			allow_negative=False
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(leave_type_name="Test Leave Validation", doctype="Leave Type", allow_negative=False)
+		).insert()
 
 		employee = get_employee()
 		date = getdate()
 		first_sunday = get_first_sunday(self.holiday_list, for_date=get_year_start(date))
 
 		# allocate 2 leaves, apply for more
-		make_allocation_record(leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date), leaves=2)
-		leave_application = frappe.get_doc(dict(
-			doctype='Leave Application',
-			employee=employee.name,
+		make_allocation_record(
 			leave_type=leave_type.name,
-			from_date=add_days(first_sunday, 1),
-			to_date=add_days(first_sunday, 3),
-			company="_Test Company",
-			status="Approved",
-			leave_approver = 'test@example.com'
-		))
+			from_date=get_year_start(date),
+			to_date=get_year_ending(date),
+			leaves=2,
+		)
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				from_date=add_days(first_sunday, 1),
+				to_date=add_days(first_sunday, 3),
+				company="_Test Company",
+				status="Approved",
+				leave_approver="test@example.com",
+			)
+		)
 		self.assertRaises(InsufficientLeaveBalanceError, leave_application.insert)
 
 		# CASE 2: Allows creating application with a warning message when allow negative is enabled
 		frappe.db.set_value("Leave Type", "Test Leave Validation", "allow_negative", True)
-		make_leave_application(employee.name, add_days(first_sunday, 1), add_days(first_sunday, 3), leave_type.name)
+		make_leave_application(
+			employee.name, add_days(first_sunday, 1), add_days(first_sunday, 3), leave_type.name
+		)
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_separate_leave_ledger_entry_for_boundary_applications(self):
 		# When application falls in 2 different allocations and Allow Negative is enabled
 		# creates separate leave ledger entries
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Validation", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name="Test Leave Validation",
-			doctype="Leave Type",
-			allow_negative=True
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(leave_type_name="Test Leave Validation", doctype="Leave Type", allow_negative=True)
+		).insert()
 
 		employee = get_employee()
 		date = getdate()
@@ -208,13 +217,17 @@
 		# application across allocations
 
 		# CASE 1: from date has no allocation, to date has an allocation / both dates have allocation
-		application = make_leave_application(employee.name, add_days(year_start, -10), add_days(year_start, 3), leave_type.name)
+		application = make_leave_application(
+			employee.name, add_days(year_start, -10), add_days(year_start, 3), leave_type.name
+		)
 
 		# 2 separate leave ledger entries
-		ledgers = frappe.db.get_all("Leave Ledger Entry", {
-			"transaction_type": "Leave Application",
-			"transaction_name": application.name
-		}, ["leaves", "from_date", "to_date"], order_by="from_date")
+		ledgers = frappe.db.get_all(
+			"Leave Ledger Entry",
+			{"transaction_type": "Leave Application", "transaction_name": application.name},
+			["leaves", "from_date", "to_date"],
+			order_by="from_date",
+		)
 		self.assertEqual(len(ledgers), 2)
 
 		self.assertEqual(ledgers[0].from_date, application.from_date)
@@ -224,13 +237,17 @@
 		self.assertEqual(ledgers[1].to_date, application.to_date)
 
 		# CASE 2: from date has an allocation, to date has no allocation
-		application = make_leave_application(employee.name, add_days(year_end, -3), add_days(year_end, 5), leave_type.name)
+		application = make_leave_application(
+			employee.name, add_days(year_end, -3), add_days(year_end, 5), leave_type.name
+		)
 
 		# 2 separate leave ledger entries
-		ledgers = frappe.db.get_all("Leave Ledger Entry", {
-			"transaction_type": "Leave Application",
-			"transaction_name": application.name
-		}, ["leaves", "from_date", "to_date"], order_by="from_date")
+		ledgers = frappe.db.get_all(
+			"Leave Ledger Entry",
+			{"transaction_type": "Leave Application", "transaction_name": application.name},
+			["leaves", "from_date", "to_date"],
+			order_by="from_date",
+		)
 		self.assertEqual(len(ledgers), 2)
 
 		self.assertEqual(ledgers[0].from_date, application.from_date)
@@ -240,74 +257,77 @@
 		self.assertEqual(ledgers[1].to_date, application.to_date)
 
 	def test_overwrite_attendance(self):
-		'''check attendance is automatically created on leave approval'''
+		"""check attendance is automatically created on leave approval"""
 		make_allocation_record()
 		application = self.get_application(_test_records[0])
-		application.status = 'Approved'
-		application.from_date = '2018-01-01'
-		application.to_date = '2018-01-03'
+		application.status = "Approved"
+		application.from_date = "2018-01-01"
+		application.to_date = "2018-01-03"
 		application.insert()
 		application.submit()
 
-		attendance = frappe.get_all('Attendance', ['name', 'status', 'attendance_date'],
-			dict(attendance_date=('between', ['2018-01-01', '2018-01-03']), docstatus=("!=", 2)))
+		attendance = frappe.get_all(
+			"Attendance",
+			["name", "status", "attendance_date"],
+			dict(attendance_date=("between", ["2018-01-01", "2018-01-03"]), docstatus=("!=", 2)),
+		)
 
 		# attendance created for all 3 days
 		self.assertEqual(len(attendance), 3)
 
 		# all on leave
-		self.assertTrue(all([d.status == 'On Leave' for d in attendance]))
+		self.assertTrue(all([d.status == "On Leave" for d in attendance]))
 
 		# dates
 		dates = [d.attendance_date for d in attendance]
-		for d in ('2018-01-01', '2018-01-02', '2018-01-03'):
+		for d in ("2018-01-01", "2018-01-02", "2018-01-03"):
 			self.assertTrue(getdate(d) in dates)
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_attendance_for_include_holidays(self):
 		# Case 1: leave type with 'Include holidays within leaves as leaves' enabled
 		frappe.delete_doc_if_exists("Leave Type", "Test Include Holidays", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name="Test Include Holidays",
-			doctype="Leave Type",
-			include_holiday=True
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(leave_type_name="Test Include Holidays", doctype="Leave Type", include_holiday=True)
+		).insert()
 
 		date = getdate()
-		make_allocation_record(leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date))
+		make_allocation_record(
+			leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date)
+		)
 
 		employee = get_employee()
 		first_sunday = get_first_sunday(self.holiday_list)
 
-		leave_application = make_leave_application(employee.name, first_sunday, add_days(first_sunday, 3), leave_type.name)
+		leave_application = make_leave_application(
+			employee.name, first_sunday, add_days(first_sunday, 3), leave_type.name
+		)
 		leave_application.reload()
 		self.assertEqual(leave_application.total_leave_days, 4)
-		self.assertEqual(frappe.db.count('Attendance', {'leave_application': leave_application.name}), 4)
+		self.assertEqual(frappe.db.count("Attendance", {"leave_application": leave_application.name}), 4)
 
 		leave_application.cancel()
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_attendance_update_for_exclude_holidays(self):
 		# Case 2: leave type with 'Include holidays within leaves as leaves' disabled
 		frappe.delete_doc_if_exists("Leave Type", "Test Do Not Include Holidays", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name="Test Do Not Include Holidays",
-			doctype="Leave Type",
-			include_holiday=False
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(
+				leave_type_name="Test Do Not Include Holidays", doctype="Leave Type", include_holiday=False
+			)
+		).insert()
 
 		date = getdate()
-		make_allocation_record(leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date))
+		make_allocation_record(
+			leave_type=leave_type.name, from_date=get_year_start(date), to_date=get_year_ending(date)
+		)
 
 		employee = get_employee()
 		first_sunday = get_first_sunday(self.holiday_list)
 
 		# already marked attendance on a holiday should be deleted in this case
-		config = {
-			"doctype": "Attendance",
-			"employee": employee.name,
-			"status": "Present"
-		}
+		config = {"doctype": "Attendance", "employee": employee.name, "status": "Present"}
 		attendance_on_holiday = frappe.get_doc(config)
 		attendance_on_holiday.attendance_date = first_sunday
 		attendance_on_holiday.flags.ignore_validate = True
@@ -319,7 +339,9 @@
 		attendance.flags.ignore_validate = True
 		attendance.save()
 
-		leave_application = make_leave_application(employee.name, first_sunday, add_days(first_sunday, 3), leave_type.name, employee.company)
+		leave_application = make_leave_application(
+			employee.name, first_sunday, add_days(first_sunday, 3), leave_type.name, employee.company
+		)
 		leave_application.reload()
 
 		# holiday should be excluded while marking attendance
@@ -336,11 +358,13 @@
 		self._clear_roles()
 
 		from frappe.utils.user import add_role
+
 		add_role("test@example.com", "HR User")
 		clear_user_permissions_for_doctype("Employee")
 
-		frappe.db.set_value("Department", "_Test Department - _TC",
-			"leave_block_list", "_Test Leave Block List")
+		frappe.db.set_value(
+			"Department", "_Test Department - _TC", "leave_block_list", "_Test Leave Block List"
+		)
 
 		make_allocation_record()
 
@@ -363,6 +387,7 @@
 		self._clear_applications()
 
 		from frappe.utils.user import add_role
+
 		add_role("test@example.com", "Employee")
 		frappe.set_user("test@example.com")
 
@@ -379,6 +404,7 @@
 		self._clear_applications()
 
 		from frappe.utils.user import add_role
+
 		add_role("test@example.com", "Employee")
 		frappe.set_user("test@example.com")
 
@@ -412,6 +438,7 @@
 		self._clear_applications()
 
 		from frappe.utils.user import add_role
+
 		add_role("test@example.com", "Employee")
 
 		frappe.set_user("test@example.com")
@@ -434,6 +461,7 @@
 		self._clear_applications()
 
 		from frappe.utils.user import add_role
+
 		add_role("test@example.com", "Employee")
 
 		frappe.set_user("test@example.com")
@@ -463,49 +491,49 @@
 		application.half_day_date = "2013-01-05"
 		application.insert()
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_optional_leave(self):
 		leave_period = get_leave_period()
 		today = nowdate()
-		holiday_list = 'Test Holiday List for Optional Holiday'
+		holiday_list = "Test Holiday List for Optional Holiday"
 		employee = get_employee()
 
 		first_sunday = get_first_sunday(self.holiday_list)
 		optional_leave_date = add_days(first_sunday, 1)
 
-		if not frappe.db.exists('Holiday List', holiday_list):
-			frappe.get_doc(dict(
-				doctype = 'Holiday List',
-				holiday_list_name = holiday_list,
-				from_date = add_months(today, -6),
-				to_date = add_months(today, 6),
-				holidays = [
-					dict(holiday_date = optional_leave_date, description = 'Test')
-				]
-			)).insert()
+		if not frappe.db.exists("Holiday List", holiday_list):
+			frappe.get_doc(
+				dict(
+					doctype="Holiday List",
+					holiday_list_name=holiday_list,
+					from_date=add_months(today, -6),
+					to_date=add_months(today, 6),
+					holidays=[dict(holiday_date=optional_leave_date, description="Test")],
+				)
+			).insert()
 
-		frappe.db.set_value('Leave Period', leave_period.name, 'optional_holiday_list', holiday_list)
-		leave_type = 'Test Optional Type'
-		if not frappe.db.exists('Leave Type', leave_type):
-			frappe.get_doc(dict(
-				leave_type_name = leave_type,
-				doctype = 'Leave Type',
-				is_optional_leave = 1
-			)).insert()
+		frappe.db.set_value("Leave Period", leave_period.name, "optional_holiday_list", holiday_list)
+		leave_type = "Test Optional Type"
+		if not frappe.db.exists("Leave Type", leave_type):
+			frappe.get_doc(
+				dict(leave_type_name=leave_type, doctype="Leave Type", is_optional_leave=1)
+			).insert()
 
 		allocate_leaves(employee, leave_period, leave_type, 10)
 
 		date = add_days(first_sunday, 2)
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			company = '_Test Company',
-			description = "_Test Reason",
-			leave_type = leave_type,
-			from_date = date,
-			to_date = date,
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				company="_Test Company",
+				description="_Test Reason",
+				leave_type=leave_type,
+				from_date=date,
+				to_date=date,
+			)
+		)
 
 		# can only apply on optional holidays
 		self.assertRaises(NotAnOptionalHoliday, leave_application.insert)
@@ -523,118 +551,125 @@
 		employee = get_employee()
 		leave_period = get_leave_period()
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Type", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name = 'Test Leave Type',
-			doctype = 'Leave Type',
-			max_leaves_allowed = 5
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(leave_type_name="Test Leave Type", doctype="Leave Type", max_leaves_allowed=5)
+		).insert()
 
 		date = add_days(nowdate(), -7)
 
 		allocate_leaves(employee, leave_period, leave_type.name, 5)
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type.name,
-			description = "_Test Reason",
-			from_date = date,
-			to_date = add_days(date, 2),
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				description="_Test Reason",
+				from_date=date,
+				to_date=add_days(date, 2),
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 		leave_application.submit()
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type.name,
-			description = "_Test Reason",
-			from_date = add_days(date, 4),
-			to_date = add_days(date, 8),
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				description="_Test Reason",
+				from_date=add_days(date, 4),
+				to_date=add_days(date, 8),
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 		self.assertRaises(frappe.ValidationError, leave_application.insert)
 
 	def test_applicable_after(self):
 		employee = get_employee()
 		leave_period = get_leave_period()
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Type", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name = 'Test Leave Type',
-			doctype = 'Leave Type',
-			applicable_after = 15
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(leave_type_name="Test Leave Type", doctype="Leave Type", applicable_after=15)
+		).insert()
 		date = add_days(nowdate(), -7)
-		frappe.db.set_value('Employee', employee.name, "date_of_joining", date)
+		frappe.db.set_value("Employee", employee.name, "date_of_joining", date)
 		allocate_leaves(employee, leave_period, leave_type.name, 10)
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type.name,
-			description = "_Test Reason",
-			from_date = date,
-			to_date = add_days(date, 4),
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				description="_Test Reason",
+				from_date=date,
+				to_date=add_days(date, 4),
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 
 		self.assertRaises(frappe.ValidationError, leave_application.insert)
 
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Type 1", force=1)
-		leave_type_1 = frappe.get_doc(dict(
-			leave_type_name = 'Test Leave Type 1',
-			doctype = 'Leave Type'
-		)).insert()
+		leave_type_1 = frappe.get_doc(
+			dict(leave_type_name="Test Leave Type 1", doctype="Leave Type")
+		).insert()
 
 		allocate_leaves(employee, leave_period, leave_type_1.name, 10)
 
-		leave_application = frappe.get_doc(dict(
-		doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type_1.name,
-			description = "_Test Reason",
-			from_date = date,
-			to_date = add_days(date, 4),
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type_1.name,
+				description="_Test Reason",
+				from_date=date,
+				to_date=add_days(date, 4),
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 
 		self.assertTrue(leave_application.insert())
-		frappe.db.set_value('Employee', employee.name, "date_of_joining", "2010-01-01")
+		frappe.db.set_value("Employee", employee.name, "date_of_joining", "2010-01-01")
 
 	def test_max_continuous_leaves(self):
 		employee = get_employee()
 		leave_period = get_leave_period()
 		frappe.delete_doc_if_exists("Leave Type", "Test Leave Type", force=1)
-		leave_type = frappe.get_doc(dict(
-			leave_type_name = 'Test Leave Type',
-			doctype = 'Leave Type',
-			max_leaves_allowed = 15,
-			max_continuous_days_allowed = 3
-		)).insert()
+		leave_type = frappe.get_doc(
+			dict(
+				leave_type_name="Test Leave Type",
+				doctype="Leave Type",
+				max_leaves_allowed=15,
+				max_continuous_days_allowed=3,
+			)
+		).insert()
 
 		date = add_days(nowdate(), -7)
 
 		allocate_leaves(employee, leave_period, leave_type.name, 10)
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type.name,
-			description = "_Test Reason",
-			from_date = date,
-			to_date = add_days(date, 4),
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				description="_Test Reason",
+				from_date=date,
+				to_date=add_days(date, 4),
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 
 		self.assertRaises(frappe.ValidationError, leave_application.insert)
 
@@ -643,60 +678,70 @@
 		leave_type = create_leave_type(
 			leave_type_name="_Test_CF_leave_expiry",
 			is_carry_forward=1,
-			expire_carry_forwarded_leaves_after_days=90)
+			expire_carry_forwarded_leaves_after_days=90,
+		)
 		leave_type.insert()
 
 		create_carry_forwarded_allocation(employee, leave_type)
-		details = get_leave_balance_on(employee.name, leave_type.name, nowdate(), add_days(nowdate(), 8), for_consumption=True)
+		details = get_leave_balance_on(
+			employee.name, leave_type.name, nowdate(), add_days(nowdate(), 8), for_consumption=True
+		)
 
 		self.assertEqual(details.leave_balance_for_consumption, 21)
 		self.assertEqual(details.leave_balance, 30)
 
 	def test_earned_leaves_creation(self):
 
-		frappe.db.sql('''delete from `tabLeave Period`''')
-		frappe.db.sql('''delete from `tabLeave Policy Assignment`''')
-		frappe.db.sql('''delete from `tabLeave Allocation`''')
-		frappe.db.sql('''delete from `tabLeave Ledger Entry`''')
+		frappe.db.sql("""delete from `tabLeave Period`""")
+		frappe.db.sql("""delete from `tabLeave Policy Assignment`""")
+		frappe.db.sql("""delete from `tabLeave Allocation`""")
+		frappe.db.sql("""delete from `tabLeave Ledger Entry`""")
 
 		leave_period = get_leave_period()
 		employee = get_employee()
-		leave_type = 'Test Earned Leave Type'
-		frappe.delete_doc_if_exists("Leave Type", 'Test Earned Leave Type', force=1)
-		frappe.get_doc(dict(
-			leave_type_name = leave_type,
-			doctype = 'Leave Type',
-			is_earned_leave = 1,
-			earned_leave_frequency = 'Monthly',
-			rounding = 0.5,
-			max_leaves_allowed = 6
-		)).insert()
+		leave_type = "Test Earned Leave Type"
+		frappe.delete_doc_if_exists("Leave Type", "Test Earned Leave Type", force=1)
+		frappe.get_doc(
+			dict(
+				leave_type_name=leave_type,
+				doctype="Leave Type",
+				is_earned_leave=1,
+				earned_leave_frequency="Monthly",
+				rounding=0.5,
+				max_leaves_allowed=6,
+			)
+		).insert()
 
-		leave_policy = frappe.get_doc({
-			"doctype": "Leave Policy",
-			"title": "Test Leave Policy",
-			"leave_policy_details": [{"leave_type": leave_type, "annual_allocation": 6}]
-		}).insert()
+		leave_policy = frappe.get_doc(
+			{
+				"doctype": "Leave Policy",
+				"title": "Test Leave Policy",
+				"leave_policy_details": [{"leave_type": leave_type, "annual_allocation": 6}],
+			}
+		).insert()
 
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
 
-		leave_policy_assignments = create_assignment_for_multiple_employees([employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[employee.name], frappe._dict(data)
+		)
 
 		from erpnext.hr.utils import allocate_earned_leaves
+
 		i = 0
-		while(i<14):
+		while i < 14:
 			allocate_earned_leaves(ignore_duplicates=True)
 			i += 1
 		self.assertEqual(get_leave_balance_on(employee.name, leave_type, nowdate()), 6)
 
 		# validate earned leaves creation without maximum leaves
-		frappe.db.set_value('Leave Type', leave_type, 'max_leaves_allowed', 0)
+		frappe.db.set_value("Leave Type", leave_type, "max_leaves_allowed", 0)
 		i = 0
-		while(i<6):
+		while i < 6:
 			allocate_earned_leaves(ignore_duplicates=True)
 			i += 1
 		self.assertEqual(get_leave_balance_on(employee.name, leave_type, nowdate()), 9)
@@ -705,34 +750,35 @@
 	def test_current_leave_on_submit(self):
 		employee = get_employee()
 
-		leave_type = 'Sick Leave'
-		if not frappe.db.exists('Leave Type', leave_type):
-			frappe.get_doc(dict(
-				leave_type_name=leave_type,
-				doctype='Leave Type'
-			)).insert()
+		leave_type = "Sick Leave"
+		if not frappe.db.exists("Leave Type", leave_type):
+			frappe.get_doc(dict(leave_type_name=leave_type, doctype="Leave Type")).insert()
 
-		allocation = frappe.get_doc(dict(
-			doctype = 'Leave Allocation',
-			employee = employee.name,
-			leave_type = leave_type,
-			from_date = '2018-10-01',
-			to_date = '2018-10-10',
-			new_leaves_allocated = 1
-		))
+		allocation = frappe.get_doc(
+			dict(
+				doctype="Leave Allocation",
+				employee=employee.name,
+				leave_type=leave_type,
+				from_date="2018-10-01",
+				to_date="2018-10-10",
+				new_leaves_allocated=1,
+			)
+		)
 		allocation.insert(ignore_permissions=True)
 		allocation.submit()
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type,
-			description = "_Test Reason",
-			from_date = '2018-10-02',
-			to_date = '2018-10-02',
-			company = '_Test Company',
-			status = 'Approved',
-			leave_approver = 'test@example.com'
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type,
+				description="_Test Reason",
+				from_date="2018-10-02",
+				to_date="2018-10-02",
+				company="_Test Company",
+				status="Approved",
+				leave_approver="test@example.com",
+			)
+		)
 		self.assertTrue(leave_application.insert())
 		leave_application.submit()
 		self.assertEqual(leave_application.docstatus, 1)
@@ -740,26 +786,31 @@
 	def test_creation_of_leave_ledger_entry_on_submit(self):
 		employee = get_employee()
 
-		leave_type = create_leave_type(leave_type_name = 'Test Leave Type 1')
+		leave_type = create_leave_type(leave_type_name="Test Leave Type 1")
 		leave_type.save()
 
-		leave_allocation = create_leave_allocation(employee=employee.name, employee_name=employee.employee_name,
-			leave_type=leave_type.name)
+		leave_allocation = create_leave_allocation(
+			employee=employee.name, employee_name=employee.employee_name, leave_type=leave_type.name
+		)
 		leave_allocation.submit()
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type.name,
-			from_date = add_days(nowdate(), 1),
-			to_date = add_days(nowdate(), 4),
-			description = "_Test Reason",
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				from_date=add_days(nowdate(), 1),
+				to_date=add_days(nowdate(), 4),
+				description="_Test Reason",
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 		leave_application.submit()
-		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=dict(transaction_name=leave_application.name))
+		leave_ledger_entry = frappe.get_all(
+			"Leave Ledger Entry", fields="*", filters=dict(transaction_name=leave_application.name)
+		)
 
 		self.assertEqual(leave_ledger_entry[0].employee, leave_application.employee)
 		self.assertEqual(leave_ledger_entry[0].leave_type, leave_application.leave_type)
@@ -767,32 +818,39 @@
 
 		# check if leave ledger entry is deleted on cancellation
 		leave_application.cancel()
-		self.assertFalse(frappe.db.exists("Leave Ledger Entry", {'transaction_name':leave_application.name}))
+		self.assertFalse(
+			frappe.db.exists("Leave Ledger Entry", {"transaction_name": leave_application.name})
+		)
 
 	def test_ledger_entry_creation_on_intermediate_allocation_expiry(self):
 		employee = get_employee()
 		leave_type = create_leave_type(
 			leave_type_name="_Test_CF_leave_expiry",
 			is_carry_forward=1,
-			expire_carry_forwarded_leaves_after_days=90)
+			expire_carry_forwarded_leaves_after_days=90,
+		)
 		leave_type.submit()
 
 		create_carry_forwarded_allocation(employee, leave_type)
 
-		leave_application = frappe.get_doc(dict(
-			doctype = 'Leave Application',
-			employee = employee.name,
-			leave_type = leave_type.name,
-			from_date = add_days(nowdate(), -3),
-			to_date = add_days(nowdate(), 7),
-			description = "_Test Reason",
-			company = "_Test Company",
-			docstatus = 1,
-			status = "Approved"
-		))
+		leave_application = frappe.get_doc(
+			dict(
+				doctype="Leave Application",
+				employee=employee.name,
+				leave_type=leave_type.name,
+				from_date=add_days(nowdate(), -3),
+				to_date=add_days(nowdate(), 7),
+				description="_Test Reason",
+				company="_Test Company",
+				docstatus=1,
+				status="Approved",
+			)
+		)
 		leave_application.submit()
 
-		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', '*', filters=dict(transaction_name=leave_application.name))
+		leave_ledger_entry = frappe.get_all(
+			"Leave Ledger Entry", "*", filters=dict(transaction_name=leave_application.name)
+		)
 
 		self.assertEqual(len(leave_ledger_entry), 2)
 		self.assertEqual(leave_ledger_entry[0].employee, leave_application.employee)
@@ -806,12 +864,18 @@
 		leave_type = create_leave_type(
 			leave_type_name="_Test_CF_leave_expiry",
 			is_carry_forward=1,
-			expire_carry_forwarded_leaves_after_days=90)
+			expire_carry_forwarded_leaves_after_days=90,
+		)
 		leave_type.submit()
 
 		create_carry_forwarded_allocation(employee, leave_type)
 
-		self.assertEqual(get_leave_balance_on(employee.name, leave_type.name, add_days(nowdate(), -85), add_days(nowdate(), -84)), 0)
+		self.assertEqual(
+			get_leave_balance_on(
+				employee.name, leave_type.name, add_days(nowdate(), -85), add_days(nowdate(), -84)
+			),
+			0,
+		)
 
 	def test_leave_approver_perms(self):
 		employee = get_employee()
@@ -827,8 +891,8 @@
 		make_allocation_record(employee.name)
 
 		application = self.get_application(_test_records[0])
-		application.from_date = '2018-01-01'
-		application.to_date = '2018-01-03'
+		application.from_date = "2018-01-01"
+		application.to_date = "2018-01-03"
 		application.leave_approver = user
 		application.insert()
 		self.assertTrue(application.name in frappe.share.get_shared("Leave Application", user))
@@ -854,7 +918,7 @@
 		employee.leave_approver = ""
 		employee.save()
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_get_leave_details_for_dashboard(self):
 		employee = get_employee()
 		date = getdate()
@@ -862,34 +926,44 @@
 		year_end = getdate(get_year_ending(date))
 
 		# ALLOCATION = 30
-		allocation = make_allocation_record(employee=employee.name, from_date=year_start, to_date=year_end)
+		allocation = make_allocation_record(
+			employee=employee.name, from_date=year_start, to_date=year_end
+		)
 
 		# USED LEAVES = 4
 		first_sunday = get_first_sunday(self.holiday_list)
-		leave_application = make_leave_application(employee.name, add_days(first_sunday, 1), add_days(first_sunday, 4), '_Test Leave Type')
+		leave_application = make_leave_application(
+			employee.name, add_days(first_sunday, 1), add_days(first_sunday, 4), "_Test Leave Type"
+		)
 		leave_application.reload()
 
 		# LEAVES PENDING APPROVAL = 1
-		leave_application = make_leave_application(employee.name, add_days(first_sunday, 5), add_days(first_sunday, 5),
-			'_Test Leave Type', submit=False)
-		leave_application.status = 'Open'
+		leave_application = make_leave_application(
+			employee.name,
+			add_days(first_sunday, 5),
+			add_days(first_sunday, 5),
+			"_Test Leave Type",
+			submit=False,
+		)
+		leave_application.status = "Open"
 		leave_application.save()
 
 		details = get_leave_details(employee.name, allocation.from_date)
-		leave_allocation = details['leave_allocation']['_Test Leave Type']
-		self.assertEqual(leave_allocation['total_leaves'], 30)
-		self.assertEqual(leave_allocation['leaves_taken'], 4)
-		self.assertEqual(leave_allocation['expired_leaves'], 0)
-		self.assertEqual(leave_allocation['leaves_pending_approval'], 1)
-		self.assertEqual(leave_allocation['remaining_leaves'], 26)
+		leave_allocation = details["leave_allocation"]["_Test Leave Type"]
+		self.assertEqual(leave_allocation["total_leaves"], 30)
+		self.assertEqual(leave_allocation["leaves_taken"], 4)
+		self.assertEqual(leave_allocation["expired_leaves"], 0)
+		self.assertEqual(leave_allocation["leaves_pending_approval"], 1)
+		self.assertEqual(leave_allocation["remaining_leaves"], 26)
 
-	@set_holiday_list('Salary Slip Test Holiday List', '_Test Company')
+	@set_holiday_list("Salary Slip Test Holiday List", "_Test Company")
 	def test_get_leave_allocation_records(self):
 		employee = get_employee()
 		leave_type = create_leave_type(
 			leave_type_name="_Test_CF_leave_expiry",
 			is_carry_forward=1,
-			expire_carry_forwarded_leaves_after_days=90)
+			expire_carry_forwarded_leaves_after_days=90,
+		)
 		leave_type.insert()
 
 		leave_alloc = create_carry_forwarded_allocation(employee, leave_type)
@@ -900,86 +974,99 @@
 			"total_leaves_allocated": 30.0,
 			"unused_leaves": 15.0,
 			"new_leaves_allocated": 15.0,
-			"leave_type": leave_type.name
+			"leave_type": leave_type.name,
 		}
 		self.assertEqual(details.get(leave_type.name), expected_data)
 
 
 def create_carry_forwarded_allocation(employee, leave_type):
-		# initial leave allocation
-		leave_allocation = create_leave_allocation(
-			leave_type="_Test_CF_leave_expiry",
-			employee=employee.name,
-			employee_name=employee.employee_name,
-			from_date=add_months(nowdate(), -24),
-			to_date=add_months(nowdate(), -12),
-			carry_forward=0)
-		leave_allocation.submit()
+	# initial leave allocation
+	leave_allocation = create_leave_allocation(
+		leave_type="_Test_CF_leave_expiry",
+		employee=employee.name,
+		employee_name=employee.employee_name,
+		from_date=add_months(nowdate(), -24),
+		to_date=add_months(nowdate(), -12),
+		carry_forward=0,
+	)
+	leave_allocation.submit()
 
-		leave_allocation = create_leave_allocation(
-			leave_type="_Test_CF_leave_expiry",
-			employee=employee.name,
-			employee_name=employee.employee_name,
-			from_date=add_days(nowdate(), -84),
-			to_date=add_days(nowdate(), 100),
-			carry_forward=1)
-		leave_allocation.submit()
+	leave_allocation = create_leave_allocation(
+		leave_type="_Test_CF_leave_expiry",
+		employee=employee.name,
+		employee_name=employee.employee_name,
+		from_date=add_days(nowdate(), -84),
+		to_date=add_days(nowdate(), 100),
+		carry_forward=1,
+	)
+	leave_allocation.submit()
 
-		return leave_allocation
+	return leave_allocation
 
-def make_allocation_record(employee=None, leave_type=None, from_date=None, to_date=None, carry_forward=False, leaves=None):
-	allocation = frappe.get_doc({
-		"doctype": "Leave Allocation",
-		"employee": employee or "_T-Employee-00001",
-		"leave_type": leave_type or "_Test Leave Type",
-		"from_date": from_date or "2013-01-01",
-		"to_date": to_date or "2019-12-31",
-		"new_leaves_allocated": leaves or 30,
-		"carry_forward": carry_forward
-	})
+
+def make_allocation_record(
+	employee=None, leave_type=None, from_date=None, to_date=None, carry_forward=False, leaves=None
+):
+	allocation = frappe.get_doc(
+		{
+			"doctype": "Leave Allocation",
+			"employee": employee or "_T-Employee-00001",
+			"leave_type": leave_type or "_Test Leave Type",
+			"from_date": from_date or "2013-01-01",
+			"to_date": to_date or "2019-12-31",
+			"new_leaves_allocated": leaves or 30,
+			"carry_forward": carry_forward,
+		}
+	)
 
 	allocation.insert(ignore_permissions=True)
 	allocation.submit()
 
 	return allocation
 
+
 def get_employee():
 	return frappe.get_doc("Employee", "_T-Employee-00001")
 
+
 def set_leave_approver():
 	employee = get_employee()
 	dept_doc = frappe.get_doc("Department", employee.department)
-	dept_doc.append('leave_approvers', {
-		'approver': 'test@example.com'
-	})
+	dept_doc.append("leave_approvers", {"approver": "test@example.com"})
 	dept_doc.save(ignore_permissions=True)
 
+
 def get_leave_period():
 	leave_period_name = frappe.db.get_value("Leave Period", {"company": "_Test Company"})
 	if leave_period_name:
 		return frappe.get_doc("Leave Period", leave_period_name)
 	else:
-		return frappe.get_doc(dict(
-				name = 'Test Leave Period',
-				doctype = 'Leave Period',
-				from_date = add_months(nowdate(), -6),
-				to_date = add_months(nowdate(), 6),
-				company = "_Test Company",
-				is_active = 1
-			)).insert()
+		return frappe.get_doc(
+			dict(
+				name="Test Leave Period",
+				doctype="Leave Period",
+				from_date=add_months(nowdate(), -6),
+				to_date=add_months(nowdate(), 6),
+				company="_Test Company",
+				is_active=1,
+			)
+		).insert()
+
 
 def allocate_leaves(employee, leave_period, leave_type, new_leaves_allocated, eligible_leaves=0):
-	allocate_leave = frappe.get_doc({
-		"doctype": "Leave Allocation",
-		"__islocal": 1,
-		"employee": employee.name,
-		"employee_name": employee.employee_name,
-		"leave_type": leave_type,
-		"from_date": leave_period.from_date,
-		"to_date": leave_period.to_date,
-		"new_leaves_allocated": new_leaves_allocated,
-		"docstatus": 1
-	}).insert()
+	allocate_leave = frappe.get_doc(
+		{
+			"doctype": "Leave Allocation",
+			"__islocal": 1,
+			"employee": employee.name,
+			"employee_name": employee.employee_name,
+			"leave_type": leave_type,
+			"from_date": leave_period.from_date,
+			"to_date": leave_period.to_date,
+			"new_leaves_allocated": new_leaves_allocated,
+			"docstatus": 1,
+		}
+	).insert()
 
 	allocate_leave.submit()
 
@@ -988,11 +1075,14 @@
 	date = for_date or getdate()
 	month_start_date = get_first_day(date)
 	month_end_date = get_last_day(date)
-	first_sunday = frappe.db.sql("""
+	first_sunday = frappe.db.sql(
+		"""
 		select holiday_date from `tabHoliday`
 		where parent = %s
 			and holiday_date between %s and %s
 		order by holiday_date
-	""", (holiday_list, month_start_date, month_end_date))[0][0]
+	""",
+		(holiday_list, month_start_date, month_end_date),
+	)[0][0]
 
 	return first_sunday
diff --git a/erpnext/hr/doctype/leave_block_list/leave_block_list.py b/erpnext/hr/doctype/leave_block_list/leave_block_list.py
index d6b77f9..a57ba84 100644
--- a/erpnext/hr/doctype/leave_block_list/leave_block_list.py
+++ b/erpnext/hr/doctype/leave_block_list/leave_block_list.py
@@ -10,7 +10,6 @@
 
 
 class LeaveBlockList(Document):
-
 	def validate(self):
 		dates = []
 		for d in self.get("leave_block_list_dates"):
@@ -20,23 +19,29 @@
 				frappe.msgprint(_("Date is repeated") + ":" + d.block_date, raise_exception=1)
 			dates.append(d.block_date)
 
+
 @frappe.whitelist()
-def get_applicable_block_dates(from_date, to_date, employee=None,
-	company=None, all_lists=False):
+def get_applicable_block_dates(from_date, to_date, employee=None, company=None, all_lists=False):
 	block_dates = []
 	for block_list in get_applicable_block_lists(employee, company, all_lists):
-		block_dates.extend(frappe.db.sql("""select block_date, reason
+		block_dates.extend(
+			frappe.db.sql(
+				"""select block_date, reason
 			from `tabLeave Block List Date` where parent=%s
-			and block_date between %s and %s""", (block_list, from_date, to_date),
-			as_dict=1))
+			and block_date between %s and %s""",
+				(block_list, from_date, to_date),
+				as_dict=1,
+			)
+		)
 
 	return block_dates
 
+
 def get_applicable_block_lists(employee=None, company=None, all_lists=False):
 	block_lists = []
 
 	if not employee:
-		employee = frappe.db.get_value("Employee", {"user_id":frappe.session.user})
+		employee = frappe.db.get_value("Employee", {"user_id": frappe.session.user})
 		if not employee:
 			return []
 
@@ -49,18 +54,25 @@
 				block_lists.append(block_list)
 
 	# per department
-	department = frappe.db.get_value("Employee",employee, "department")
+	department = frappe.db.get_value("Employee", employee, "department")
 	if department:
 		block_list = frappe.db.get_value("Department", department, "leave_block_list")
 		add_block_list(block_list)
 
 	# global
-	for block_list in frappe.db.sql_list("""select name from `tabLeave Block List`
-		where applies_to_all_departments=1 and company=%s""", company):
+	for block_list in frappe.db.sql_list(
+		"""select name from `tabLeave Block List`
+		where applies_to_all_departments=1 and company=%s""",
+		company,
+	):
 		add_block_list(block_list)
 
 	return list(set(block_lists))
 
+
 def is_user_in_allow_list(block_list):
-	return frappe.session.user in frappe.db.sql_list("""select allow_user
-		from `tabLeave Block List Allow` where parent=%s""", block_list)
+	return frappe.session.user in frappe.db.sql_list(
+		"""select allow_user
+		from `tabLeave Block List Allow` where parent=%s""",
+		block_list,
+	)
diff --git a/erpnext/hr/doctype/leave_block_list/leave_block_list_dashboard.py b/erpnext/hr/doctype/leave_block_list/leave_block_list_dashboard.py
index 7cca62e..afeb5de 100644
--- a/erpnext/hr/doctype/leave_block_list/leave_block_list_dashboard.py
+++ b/erpnext/hr/doctype/leave_block_list/leave_block_list_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname':  'leave_block_list',
-		'transactions': [
-			{
-				'items': ['Department']
-			}
-		]
-	}
+	return {"fieldname": "leave_block_list", "transactions": [{"items": ["Department"]}]}
diff --git a/erpnext/hr/doctype/leave_block_list/test_leave_block_list.py b/erpnext/hr/doctype/leave_block_list/test_leave_block_list.py
index afbabb6..be85a35 100644
--- a/erpnext/hr/doctype/leave_block_list/test_leave_block_list.py
+++ b/erpnext/hr/doctype/leave_block_list/test_leave_block_list.py
@@ -15,24 +15,36 @@
 
 	def test_get_applicable_block_dates(self):
 		frappe.set_user("test@example.com")
-		frappe.db.set_value("Department", "_Test Department - _TC", "leave_block_list",
-			"_Test Leave Block List")
-		self.assertTrue(getdate("2013-01-02") in
-			[d.block_date for d in get_applicable_block_dates("2013-01-01", "2013-01-03")])
+		frappe.db.set_value(
+			"Department", "_Test Department - _TC", "leave_block_list", "_Test Leave Block List"
+		)
+		self.assertTrue(
+			getdate("2013-01-02")
+			in [d.block_date for d in get_applicable_block_dates("2013-01-01", "2013-01-03")]
+		)
 
 	def test_get_applicable_block_dates_for_allowed_user(self):
 		frappe.set_user("test1@example.com")
-		frappe.db.set_value("Department", "_Test Department 1 - _TC", "leave_block_list",
-			"_Test Leave Block List")
-		self.assertEqual([], [d.block_date for d in get_applicable_block_dates("2013-01-01", "2013-01-03")])
+		frappe.db.set_value(
+			"Department", "_Test Department 1 - _TC", "leave_block_list", "_Test Leave Block List"
+		)
+		self.assertEqual(
+			[], [d.block_date for d in get_applicable_block_dates("2013-01-01", "2013-01-03")]
+		)
 
 	def test_get_applicable_block_dates_all_lists(self):
 		frappe.set_user("test1@example.com")
-		frappe.db.set_value("Department", "_Test Department 1 - _TC", "leave_block_list",
-			"_Test Leave Block List")
-		self.assertTrue(getdate("2013-01-02") in
-			[d.block_date for d in get_applicable_block_dates("2013-01-01", "2013-01-03", all_lists=True)])
+		frappe.db.set_value(
+			"Department", "_Test Department 1 - _TC", "leave_block_list", "_Test Leave Block List"
+		)
+		self.assertTrue(
+			getdate("2013-01-02")
+			in [
+				d.block_date for d in get_applicable_block_dates("2013-01-01", "2013-01-03", all_lists=True)
+			]
+		)
+
 
 test_dependencies = ["Employee"]
 
-test_records = frappe.get_test_records('Leave Block List')
+test_records = frappe.get_test_records("Leave Block List")
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
index 19f97b8..c57f8ae 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
@@ -18,8 +18,12 @@
 
 		condition_str = " and " + " and ".join(conditions) if len(conditions) else ""
 
-		e = frappe.db.sql("select name from tabEmployee where status='Active' {condition}"
-			.format(condition=condition_str), tuple(values))
+		e = frappe.db.sql(
+			"select name from tabEmployee where status='Active' {condition}".format(
+				condition=condition_str
+			),
+			tuple(values),
+		)
 
 		return e
 
@@ -27,7 +31,7 @@
 		for f in ["from_date", "to_date", "leave_type", "no_of_days"]:
 			if not self.get(f):
 				frappe.throw(_("{0} is required").format(self.meta.get_label(f)))
-		self.validate_from_to_dates('from_date', 'to_date')
+		self.validate_from_to_dates("from_date", "to_date")
 
 	@frappe.whitelist()
 	def allocate_leave(self):
@@ -39,10 +43,10 @@
 
 		for d in self.get_employees():
 			try:
-				la = frappe.new_doc('Leave Allocation')
+				la = frappe.new_doc("Leave Allocation")
 				la.set("__islocal", 1)
 				la.employee = cstr(d[0])
-				la.employee_name = frappe.db.get_value('Employee',cstr(d[0]),'employee_name')
+				la.employee_name = frappe.db.get_value("Employee", cstr(d[0]), "employee_name")
 				la.leave_type = self.leave_type
 				la.from_date = self.from_date
 				la.to_date = self.to_date
diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.py b/erpnext/hr/doctype/leave_encashment/leave_encashment.py
index 8ef0e36..0f655e3 100644
--- a/erpnext/hr/doctype/leave_encashment/leave_encashment.py
+++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.py
@@ -26,9 +26,12 @@
 			self.encashment_date = getdate(nowdate())
 
 	def validate_salary_structure(self):
-		if not frappe.db.exists('Salary Structure Assignment', {'employee': self.employee}):
-			frappe.throw(_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(self.employee))
-
+		if not frappe.db.exists("Salary Structure Assignment", {"employee": self.employee}):
+			frappe.throw(
+				_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(
+					self.employee
+				)
+			)
 
 	def before_submit(self):
 		if self.encashment_amount <= 0:
@@ -36,7 +39,7 @@
 
 	def on_submit(self):
 		if not self.leave_allocation:
-			self.leave_allocation = self.get_leave_allocation().get('name')
+			self.leave_allocation = self.get_leave_allocation().get("name")
 		additional_salary = frappe.new_doc("Additional Salary")
 		additional_salary.company = frappe.get_value("Employee", self.employee, "company")
 		additional_salary.employee = self.employee
@@ -52,8 +55,13 @@
 		additional_salary.submit()
 
 		# Set encashed leaves in Allocation
-		frappe.db.set_value("Leave Allocation", self.leave_allocation, "total_leaves_encashed",
-				frappe.db.get_value('Leave Allocation', self.leave_allocation, 'total_leaves_encashed') + self.encashable_days)
+		frappe.db.set_value(
+			"Leave Allocation",
+			self.leave_allocation,
+			"total_leaves_encashed",
+			frappe.db.get_value("Leave Allocation", self.leave_allocation, "total_leaves_encashed")
+			+ self.encashable_days,
+		)
 
 		self.create_leave_ledger_entry()
 
@@ -63,40 +71,69 @@
 			self.db_set("additional_salary", "")
 
 		if self.leave_allocation:
-			frappe.db.set_value("Leave Allocation", self.leave_allocation, "total_leaves_encashed",
-				frappe.db.get_value('Leave Allocation', self.leave_allocation, 'total_leaves_encashed') - self.encashable_days)
+			frappe.db.set_value(
+				"Leave Allocation",
+				self.leave_allocation,
+				"total_leaves_encashed",
+				frappe.db.get_value("Leave Allocation", self.leave_allocation, "total_leaves_encashed")
+				- self.encashable_days,
+			)
 		self.create_leave_ledger_entry(submit=False)
 
 	@frappe.whitelist()
 	def get_leave_details_for_encashment(self):
-		salary_structure = get_assigned_salary_structure(self.employee, self.encashment_date or getdate(nowdate()))
+		salary_structure = get_assigned_salary_structure(
+			self.employee, self.encashment_date or getdate(nowdate())
+		)
 		if not salary_structure:
-			frappe.throw(_("No Salary Structure assigned for Employee {0} on given date {1}").format(self.employee, self.encashment_date))
+			frappe.throw(
+				_("No Salary Structure assigned for Employee {0} on given date {1}").format(
+					self.employee, self.encashment_date
+				)
+			)
 
-		if not frappe.db.get_value("Leave Type", self.leave_type, 'allow_encashment'):
+		if not frappe.db.get_value("Leave Type", self.leave_type, "allow_encashment"):
 			frappe.throw(_("Leave Type {0} is not encashable").format(self.leave_type))
 
 		allocation = self.get_leave_allocation()
 
 		if not allocation:
-			frappe.throw(_("No Leaves Allocated to Employee: {0} for Leave Type: {1}").format(self.employee, self.leave_type))
+			frappe.throw(
+				_("No Leaves Allocated to Employee: {0} for Leave Type: {1}").format(
+					self.employee, self.leave_type
+				)
+			)
 
-		self.leave_balance = allocation.total_leaves_allocated - allocation.carry_forwarded_leaves_count\
+		self.leave_balance = (
+			allocation.total_leaves_allocated
+			- allocation.carry_forwarded_leaves_count
 			- get_unused_leaves(self.employee, self.leave_type, allocation.from_date, self.encashment_date)
+		)
 
-		encashable_days = self.leave_balance - frappe.db.get_value('Leave Type', self.leave_type, 'encashment_threshold_days')
+		encashable_days = self.leave_balance - frappe.db.get_value(
+			"Leave Type", self.leave_type, "encashment_threshold_days"
+		)
 		self.encashable_days = encashable_days if encashable_days > 0 else 0
 
-		per_day_encashment = frappe.db.get_value('Salary Structure', salary_structure , 'leave_encashment_amount_per_day')
-		self.encashment_amount = self.encashable_days * per_day_encashment if per_day_encashment > 0 else 0
+		per_day_encashment = frappe.db.get_value(
+			"Salary Structure", salary_structure, "leave_encashment_amount_per_day"
+		)
+		self.encashment_amount = (
+			self.encashable_days * per_day_encashment if per_day_encashment > 0 else 0
+		)
 
 		self.leave_allocation = allocation.name
 		return True
 
 	def get_leave_allocation(self):
-		leave_allocation = frappe.db.sql("""select name, to_date, total_leaves_allocated, carry_forwarded_leaves_count from `tabLeave Allocation` where '{0}'
+		leave_allocation = frappe.db.sql(
+			"""select name, to_date, total_leaves_allocated, carry_forwarded_leaves_count from `tabLeave Allocation` where '{0}'
 		between from_date and to_date and docstatus=1 and leave_type='{1}'
-		and employee= '{2}'""".format(self.encashment_date or getdate(nowdate()), self.leave_type, self.employee), as_dict=1) #nosec
+		and employee= '{2}'""".format(
+				self.encashment_date or getdate(nowdate()), self.leave_type, self.employee
+			),
+			as_dict=1,
+		)  # nosec
 
 		return leave_allocation[0] if leave_allocation else None
 
@@ -105,7 +142,7 @@
 			leaves=self.encashable_days * -1,
 			from_date=self.encashment_date,
 			to_date=self.encashment_date,
-			is_carry_forward=0
+			is_carry_forward=0,
 		)
 		create_leave_ledger_entry(self, args, submit)
 
@@ -114,27 +151,26 @@
 		if not leave_allocation:
 			return
 
-		to_date = leave_allocation.get('to_date')
+		to_date = leave_allocation.get("to_date")
 		if to_date < getdate(nowdate()):
 			args = frappe._dict(
-				leaves=self.encashable_days,
-				from_date=to_date,
-				to_date=to_date,
-				is_carry_forward=0
+				leaves=self.encashable_days, from_date=to_date, to_date=to_date, is_carry_forward=0
 			)
 			create_leave_ledger_entry(self, args, submit)
 
 
 def create_leave_encashment(leave_allocation):
-	''' Creates leave encashment for the given allocations '''
+	"""Creates leave encashment for the given allocations"""
 	for allocation in leave_allocation:
 		if not get_assigned_salary_structure(allocation.employee, allocation.to_date):
 			continue
-		leave_encashment = frappe.get_doc(dict(
-			doctype="Leave Encashment",
-			leave_period=allocation.leave_period,
-			employee=allocation.employee,
-			leave_type=allocation.leave_type,
-			encashment_date=allocation.to_date
-		))
+		leave_encashment = frappe.get_doc(
+			dict(
+				doctype="Leave Encashment",
+				leave_period=allocation.leave_period,
+				employee=allocation.employee,
+				leave_type=allocation.leave_type,
+				encashment_date=allocation.to_date,
+			)
+		)
 		leave_encashment.insert(ignore_permissions=True)
diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py
index 99a479d..83eb969 100644
--- a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py
+++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py
@@ -16,18 +16,19 @@
 
 test_dependencies = ["Leave Type"]
 
+
 class TestLeaveEncashment(unittest.TestCase):
 	def setUp(self):
-		frappe.db.sql('''delete from `tabLeave Period`''')
-		frappe.db.sql('''delete from `tabLeave Policy Assignment`''')
-		frappe.db.sql('''delete from `tabLeave Allocation`''')
-		frappe.db.sql('''delete from `tabLeave Ledger Entry`''')
-		frappe.db.sql('''delete from `tabAdditional Salary`''')
+		frappe.db.sql("""delete from `tabLeave Period`""")
+		frappe.db.sql("""delete from `tabLeave Policy Assignment`""")
+		frappe.db.sql("""delete from `tabLeave Allocation`""")
+		frappe.db.sql("""delete from `tabLeave Ledger Entry`""")
+		frappe.db.sql("""delete from `tabAdditional Salary`""")
 
 		# create the leave policy
 		leave_policy = create_leave_policy(
-			leave_type="_Test Leave Type Encashment",
-			annual_allocation=10)
+			leave_type="_Test Leave Type Encashment", annual_allocation=10
+		)
 		leave_policy.submit()
 
 		# create employee, salary structure and assignment
@@ -38,28 +39,44 @@
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": self.leave_period.name
+			"leave_period": self.leave_period.name,
 		}
 
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee], frappe._dict(data)
+		)
 
-		salary_structure = make_salary_structure("Salary Structure for Encashment", "Monthly", self.employee,
-			other_details={"leave_encashment_amount_per_day": 50})
+		salary_structure = make_salary_structure(
+			"Salary Structure for Encashment",
+			"Monthly",
+			self.employee,
+			other_details={"leave_encashment_amount_per_day": 50},
+		)
 
 	def tearDown(self):
-		for dt in ["Leave Period", "Leave Allocation", "Leave Ledger Entry", "Additional Salary", "Leave Encashment", "Salary Structure", "Leave Policy"]:
+		for dt in [
+			"Leave Period",
+			"Leave Allocation",
+			"Leave Ledger Entry",
+			"Additional Salary",
+			"Leave Encashment",
+			"Salary Structure",
+			"Leave Policy",
+		]:
 			frappe.db.sql("delete from `tab%s`" % dt)
 
 	def test_leave_balance_value_and_amount(self):
-		frappe.db.sql('''delete from `tabLeave Encashment`''')
-		leave_encashment = frappe.get_doc(dict(
-			doctype='Leave Encashment',
-			employee=self.employee,
-			leave_type="_Test Leave Type Encashment",
-			leave_period=self.leave_period.name,
-			payroll_date=today(),
-			currency="INR"
-		)).insert()
+		frappe.db.sql("""delete from `tabLeave Encashment`""")
+		leave_encashment = frappe.get_doc(
+			dict(
+				doctype="Leave Encashment",
+				employee=self.employee,
+				leave_type="_Test Leave Type Encashment",
+				leave_period=self.leave_period.name,
+				payroll_date=today(),
+				currency="INR",
+			)
+		).insert()
 
 		self.assertEqual(leave_encashment.leave_balance, 10)
 		self.assertEqual(leave_encashment.encashable_days, 5)
@@ -68,23 +85,27 @@
 		leave_encashment.submit()
 
 		# assert links
-		add_sal = frappe.get_all("Additional Salary", filters = {"ref_docname": leave_encashment.name})[0]
+		add_sal = frappe.get_all("Additional Salary", filters={"ref_docname": leave_encashment.name})[0]
 		self.assertTrue(add_sal)
 
 	def test_creation_of_leave_ledger_entry_on_submit(self):
-		frappe.db.sql('''delete from `tabLeave Encashment`''')
-		leave_encashment = frappe.get_doc(dict(
-			doctype='Leave Encashment',
-			employee=self.employee,
-			leave_type="_Test Leave Type Encashment",
-			leave_period=self.leave_period.name,
-			payroll_date=today(),
-			currency="INR"
-		)).insert()
+		frappe.db.sql("""delete from `tabLeave Encashment`""")
+		leave_encashment = frappe.get_doc(
+			dict(
+				doctype="Leave Encashment",
+				employee=self.employee,
+				leave_type="_Test Leave Type Encashment",
+				leave_period=self.leave_period.name,
+				payroll_date=today(),
+				currency="INR",
+			)
+		).insert()
 
 		leave_encashment.submit()
 
-		leave_ledger_entry = frappe.get_all('Leave Ledger Entry', fields='*', filters=dict(transaction_name=leave_encashment.name))
+		leave_ledger_entry = frappe.get_all(
+			"Leave Ledger Entry", fields="*", filters=dict(transaction_name=leave_encashment.name)
+		)
 
 		self.assertEqual(len(leave_ledger_entry), 1)
 		self.assertEqual(leave_ledger_entry[0].employee, leave_encashment.employee)
@@ -93,7 +114,11 @@
 
 		# check if leave ledger entry is deleted on cancellation
 
-		frappe.db.sql("Delete from `tabAdditional Salary` WHERE ref_docname = %s", (leave_encashment.name) )
+		frappe.db.sql(
+			"Delete from `tabAdditional Salary` WHERE ref_docname = %s", (leave_encashment.name)
+		)
 
 		leave_encashment.cancel()
-		self.assertFalse(frappe.db.exists("Leave Ledger Entry", {'transaction_name':leave_encashment.name}))
+		self.assertFalse(
+			frappe.db.exists("Leave Ledger Entry", {"transaction_name": leave_encashment.name})
+		)
diff --git a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
index a5923e0..fed9f77 100644
--- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
+++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
@@ -20,9 +20,11 @@
 		else:
 			frappe.throw(_("Only expired allocation can be cancelled"))
 
+
 def validate_leave_allocation_against_leave_application(ledger):
-	''' Checks that leave allocation has no leave application against it '''
-	leave_application_records = frappe.db.sql_list("""
+	"""Checks that leave allocation has no leave application against it"""
+	leave_application_records = frappe.db.sql_list(
+		"""
 		SELECT transaction_name
 		FROM `tabLeave Ledger Entry`
 		WHERE
@@ -31,15 +33,21 @@
 			AND transaction_type='Leave Application'
 			AND from_date>=%s
 			AND to_date<=%s
-	""", (ledger.employee, ledger.leave_type, ledger.from_date, ledger.to_date))
+	""",
+		(ledger.employee, ledger.leave_type, ledger.from_date, ledger.to_date),
+	)
 
 	if leave_application_records:
-		frappe.throw(_("Leave allocation {0} is linked with the Leave Application {1}").format(
-			ledger.transaction_name, ', '.join(leave_application_records)))
+		frappe.throw(
+			_("Leave allocation {0} is linked with the Leave Application {1}").format(
+				ledger.transaction_name, ", ".join(leave_application_records)
+			)
+		)
+
 
 def create_leave_ledger_entry(ref_doc, args, submit=True):
 	ledger = frappe._dict(
-		doctype='Leave Ledger Entry',
+		doctype="Leave Ledger Entry",
 		employee=ref_doc.employee,
 		employee_name=ref_doc.employee_name,
 		leave_type=ref_doc.leave_type,
@@ -47,7 +55,7 @@
 		transaction_name=ref_doc.name,
 		is_carry_forward=0,
 		is_expired=0,
-		is_lwp=0
+		is_lwp=0,
 	)
 	ledger.update(args)
 
@@ -58,54 +66,69 @@
 	else:
 		delete_ledger_entry(ledger)
 
+
 def delete_ledger_entry(ledger):
-	''' Delete ledger entry on cancel of leave application/allocation/encashment '''
+	"""Delete ledger entry on cancel of leave application/allocation/encashment"""
 	if ledger.transaction_type == "Leave Allocation":
 		validate_leave_allocation_against_leave_application(ledger)
 
 	expired_entry = get_previous_expiry_ledger_entry(ledger)
-	frappe.db.sql("""DELETE
+	frappe.db.sql(
+		"""DELETE
 		FROM `tabLeave Ledger Entry`
 		WHERE
 			`transaction_name`=%s
-			OR `name`=%s""", (ledger.transaction_name, expired_entry))
+			OR `name`=%s""",
+		(ledger.transaction_name, expired_entry),
+	)
+
 
 def get_previous_expiry_ledger_entry(ledger):
-	''' Returns the expiry ledger entry having same creation date as the ledger entry to be cancelled '''
-	creation_date = frappe.db.get_value("Leave Ledger Entry", filters={
-			'transaction_name': ledger.transaction_name,
-			'is_expired': 0,
-			'transaction_type': 'Leave Allocation'
-		}, fieldname=['creation'])
+	"""Returns the expiry ledger entry having same creation date as the ledger entry to be cancelled"""
+	creation_date = frappe.db.get_value(
+		"Leave Ledger Entry",
+		filters={
+			"transaction_name": ledger.transaction_name,
+			"is_expired": 0,
+			"transaction_type": "Leave Allocation",
+		},
+		fieldname=["creation"],
+	)
 
-	creation_date = creation_date.strftime(DATE_FORMAT) if creation_date else ''
+	creation_date = creation_date.strftime(DATE_FORMAT) if creation_date else ""
 
-	return frappe.db.get_value("Leave Ledger Entry", filters={
-		'creation': ('like', creation_date+"%"),
-		'employee': ledger.employee,
-		'leave_type': ledger.leave_type,
-		'is_expired': 1,
-		'docstatus': 1,
-		'is_carry_forward': 0
-	}, fieldname=['name'])
+	return frappe.db.get_value(
+		"Leave Ledger Entry",
+		filters={
+			"creation": ("like", creation_date + "%"),
+			"employee": ledger.employee,
+			"leave_type": ledger.leave_type,
+			"is_expired": 1,
+			"docstatus": 1,
+			"is_carry_forward": 0,
+		},
+		fieldname=["name"],
+	)
+
 
 def process_expired_allocation():
-	''' Check if a carry forwarded allocation has expired and create a expiry ledger entry
-		Case 1: carry forwarded expiry period is set for the leave type,
-			create a separate leave expiry entry against each entry of carry forwarded and non carry forwarded leaves
-		Case 2: leave type has no specific expiry period for carry forwarded leaves
-			and there is no carry forwarded leave allocation, create a single expiry against the remaining leaves.
-	'''
+	"""Check if a carry forwarded allocation has expired and create a expiry ledger entry
+	Case 1: carry forwarded expiry period is set for the leave type,
+	        create a separate leave expiry entry against each entry of carry forwarded and non carry forwarded leaves
+	Case 2: leave type has no specific expiry period for carry forwarded leaves
+	        and there is no carry forwarded leave allocation, create a single expiry against the remaining leaves.
+	"""
 
 	# fetch leave type records that has carry forwarded leaves expiry
-	leave_type_records = frappe.db.get_values("Leave Type", filters={
-			'expire_carry_forwarded_leaves_after_days': (">", 0)
-		}, fieldname=['name'])
+	leave_type_records = frappe.db.get_values(
+		"Leave Type", filters={"expire_carry_forwarded_leaves_after_days": (">", 0)}, fieldname=["name"]
+	)
 
-	leave_type = [record[0] for record in leave_type_records] or ['']
+	leave_type = [record[0] for record in leave_type_records] or [""]
 
 	# fetch non expired leave ledger entry of transaction_type allocation
-	expire_allocation = frappe.db.sql("""
+	expire_allocation = frappe.db.sql(
+		"""
 		SELECT
 			leaves, to_date, employee, leave_type,
 			is_carry_forward, transaction_name as name, transaction_type
@@ -123,32 +146,41 @@
 						OR (is_carry_forward = 0 AND leave_type not in %s)
 			)))
 			AND transaction_type = 'Leave Allocation'
-			AND to_date < %s""", (leave_type, today()), as_dict=1)
+			AND to_date < %s""",
+		(leave_type, today()),
+		as_dict=1,
+	)
 
 	if expire_allocation:
 		create_expiry_ledger_entry(expire_allocation)
 
+
 def create_expiry_ledger_entry(allocations):
-	''' Create ledger entry for expired allocation '''
+	"""Create ledger entry for expired allocation"""
 	for allocation in allocations:
 		if allocation.is_carry_forward:
 			expire_carried_forward_allocation(allocation)
 		else:
 			expire_allocation(allocation)
 
+
 def get_remaining_leaves(allocation):
-	''' Returns remaining leaves from the given allocation '''
-	return frappe.db.get_value("Leave Ledger Entry",
+	"""Returns remaining leaves from the given allocation"""
+	return frappe.db.get_value(
+		"Leave Ledger Entry",
 		filters={
-			'employee': allocation.employee,
-			'leave_type': allocation.leave_type,
-			'to_date': ('<=', allocation.to_date),
-			'docstatus': 1
-		}, fieldname=['SUM(leaves)'])
+			"employee": allocation.employee,
+			"leave_type": allocation.leave_type,
+			"to_date": ("<=", allocation.to_date),
+			"docstatus": 1,
+		},
+		fieldname=["SUM(leaves)"],
+	)
+
 
 @frappe.whitelist()
 def expire_allocation(allocation, expiry_date=None):
-	''' expires non-carry forwarded allocation '''
+	"""expires non-carry forwarded allocation"""
 	leaves = get_remaining_leaves(allocation)
 	expiry_date = expiry_date if expiry_date else allocation.to_date
 
@@ -157,21 +189,28 @@
 		args = dict(
 			leaves=flt(leaves) * -1,
 			transaction_name=allocation.name,
-			transaction_type='Leave Allocation',
+			transaction_type="Leave Allocation",
 			from_date=expiry_date,
 			to_date=expiry_date,
 			is_carry_forward=0,
-			is_expired=1
+			is_expired=1,
 		)
 		create_leave_ledger_entry(allocation, args)
 
 	frappe.db.set_value("Leave Allocation", allocation.name, "expired", 1)
 
+
 def expire_carried_forward_allocation(allocation):
-	''' Expires remaining leaves in the on carried forward allocation '''
+	"""Expires remaining leaves in the on carried forward allocation"""
 	from erpnext.hr.doctype.leave_application.leave_application import get_leaves_for_period
-	leaves_taken = get_leaves_for_period(allocation.employee, allocation.leave_type,
-		allocation.from_date, allocation.to_date, skip_expired_leaves=False)
+
+	leaves_taken = get_leaves_for_period(
+		allocation.employee,
+		allocation.leave_type,
+		allocation.from_date,
+		allocation.to_date,
+		skip_expired_leaves=False,
+	)
 	leaves = flt(allocation.leaves) + flt(leaves_taken)
 
 	# allow expired leaves entry to be created
@@ -183,6 +222,6 @@
 			is_carry_forward=allocation.is_carry_forward,
 			is_expired=1,
 			from_date=allocation.to_date,
-			to_date=allocation.to_date
+			to_date=allocation.to_date,
 		)
 		create_leave_ledger_entry(allocation, args)
diff --git a/erpnext/hr/doctype/leave_period/leave_period.py b/erpnext/hr/doctype/leave_period/leave_period.py
index b1cb688..6e62bb5 100644
--- a/erpnext/hr/doctype/leave_period/leave_period.py
+++ b/erpnext/hr/doctype/leave_period/leave_period.py
@@ -11,7 +11,6 @@
 
 
 class LeavePeriod(Document):
-
 	def validate(self):
 		self.validate_dates()
 		validate_overlap(self, self.from_date, self.to_date, self.company)
diff --git a/erpnext/hr/doctype/leave_period/leave_period_dashboard.py b/erpnext/hr/doctype/leave_period/leave_period_dashboard.py
index 1adae0f..854f988 100644
--- a/erpnext/hr/doctype/leave_period/leave_period_dashboard.py
+++ b/erpnext/hr/doctype/leave_period/leave_period_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'leave_period',
-		'transactions': [
-			{
-				'label': _('Transactions'),
-				'items': ['Leave Allocation']
-			}
-		]
+		"fieldname": "leave_period",
+		"transactions": [{"label": _("Transactions"), "items": ["Leave Allocation"]}],
 	}
diff --git a/erpnext/hr/doctype/leave_period/test_leave_period.py b/erpnext/hr/doctype/leave_period/test_leave_period.py
index 10936dd..0923574 100644
--- a/erpnext/hr/doctype/leave_period/test_leave_period.py
+++ b/erpnext/hr/doctype/leave_period/test_leave_period.py
@@ -9,23 +9,32 @@
 
 test_dependencies = ["Employee", "Leave Type", "Leave Policy"]
 
+
 class TestLeavePeriod(unittest.TestCase):
 	pass
 
+
 def create_leave_period(from_date, to_date, company=None):
-	leave_period = frappe.db.get_value('Leave Period',
-		dict(company=company or erpnext.get_default_company(),
+	leave_period = frappe.db.get_value(
+		"Leave Period",
+		dict(
+			company=company or erpnext.get_default_company(),
 			from_date=from_date,
 			to_date=to_date,
-			is_active=1), 'name')
+			is_active=1,
+		),
+		"name",
+	)
 	if leave_period:
 		return frappe.get_doc("Leave Period", leave_period)
 
-	leave_period = frappe.get_doc({
-		"doctype": "Leave Period",
-		"company": company or erpnext.get_default_company(),
-		"from_date": from_date,
-		"to_date": to_date,
-		"is_active": 1
-	}).insert()
+	leave_period = frappe.get_doc(
+		{
+			"doctype": "Leave Period",
+			"company": company or erpnext.get_default_company(),
+			"from_date": from_date,
+			"to_date": to_date,
+			"is_active": 1,
+		}
+	).insert()
 	return leave_period
diff --git a/erpnext/hr/doctype/leave_policy/leave_policy.py b/erpnext/hr/doctype/leave_policy/leave_policy.py
index 80450d5..33c9493 100644
--- a/erpnext/hr/doctype/leave_policy/leave_policy.py
+++ b/erpnext/hr/doctype/leave_policy/leave_policy.py
@@ -11,6 +11,12 @@
 	def validate(self):
 		if self.leave_policy_details:
 			for lp_detail in self.leave_policy_details:
-				max_leaves_allowed = frappe.db.get_value("Leave Type", lp_detail.leave_type, "max_leaves_allowed")
+				max_leaves_allowed = frappe.db.get_value(
+					"Leave Type", lp_detail.leave_type, "max_leaves_allowed"
+				)
 				if max_leaves_allowed > 0 and lp_detail.annual_allocation > max_leaves_allowed:
-					frappe.throw(_("Maximum leave allowed in the leave type {0} is {1}").format(lp_detail.leave_type, max_leaves_allowed))
+					frappe.throw(
+						_("Maximum leave allowed in the leave type {0} is {1}").format(
+							lp_detail.leave_type, max_leaves_allowed
+						)
+					)
diff --git a/erpnext/hr/doctype/leave_policy/leave_policy_dashboard.py b/erpnext/hr/doctype/leave_policy/leave_policy_dashboard.py
index 73782d6..57ea93e 100644
--- a/erpnext/hr/doctype/leave_policy/leave_policy_dashboard.py
+++ b/erpnext/hr/doctype/leave_policy/leave_policy_dashboard.py
@@ -3,11 +3,8 @@
 
 def get_data():
 	return {
-		'fieldname':  'leave_policy',
-		'transactions': [
-			{
-				'label': _('Leaves'),
-				'items': ['Leave Policy Assignment', 'Leave Allocation']
-			},
-		]
+		"fieldname": "leave_policy",
+		"transactions": [
+			{"label": _("Leaves"), "items": ["Leave Policy Assignment", "Leave Allocation"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/leave_policy/test_leave_policy.py b/erpnext/hr/doctype/leave_policy/test_leave_policy.py
index a4b8af7..33d5508 100644
--- a/erpnext/hr/doctype/leave_policy/test_leave_policy.py
+++ b/erpnext/hr/doctype/leave_policy/test_leave_policy.py
@@ -15,18 +15,25 @@
 			leave_type.max_leaves_allowed = 2
 			leave_type.save()
 
-		leave_policy = create_leave_policy(leave_type=leave_type.name, annual_allocation=leave_type.max_leaves_allowed + 1)
+		leave_policy = create_leave_policy(
+			leave_type=leave_type.name, annual_allocation=leave_type.max_leaves_allowed + 1
+		)
 
 		self.assertRaises(frappe.ValidationError, leave_policy.insert)
 
+
 def create_leave_policy(**args):
-	''' Returns an object of leave policy '''
+	"""Returns an object of leave policy"""
 	args = frappe._dict(args)
-	return frappe.get_doc({
-		"doctype": "Leave Policy",
-		"title": "Test Leave Policy",
-		"leave_policy_details": [{
-			"leave_type": args.leave_type or "_Test Leave Type",
-			"annual_allocation": args.annual_allocation or 10
-		}]
-	})
+	return frappe.get_doc(
+		{
+			"doctype": "Leave Policy",
+			"title": "Test Leave Policy",
+			"leave_policy_details": [
+				{
+					"leave_type": args.leave_type or "_Test Leave Type",
+					"annual_allocation": args.annual_allocation or 10,
+				}
+			],
+		}
+	)
diff --git a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py
index ae5ac7b..2ed86f3 100644
--- a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py
+++ b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py
@@ -22,22 +22,33 @@
 
 	def set_dates(self):
 		if self.assignment_based_on == "Leave Period":
-			self.effective_from, self.effective_to = frappe.db.get_value("Leave Period", self.leave_period, ["from_date", "to_date"])
+			self.effective_from, self.effective_to = frappe.db.get_value(
+				"Leave Period", self.leave_period, ["from_date", "to_date"]
+			)
 		elif self.assignment_based_on == "Joining Date":
 			self.effective_from = frappe.db.get_value("Employee", self.employee, "date_of_joining")
 
 	def validate_policy_assignment_overlap(self):
-		leave_policy_assignments = frappe.get_all("Leave Policy Assignment", filters = {
-			"employee": self.employee,
-			"name": ("!=", self.name),
-			"docstatus": 1,
-			"effective_to": (">=", self.effective_from),
-			"effective_from": ("<=", self.effective_to)
-		})
+		leave_policy_assignments = frappe.get_all(
+			"Leave Policy Assignment",
+			filters={
+				"employee": self.employee,
+				"name": ("!=", self.name),
+				"docstatus": 1,
+				"effective_to": (">=", self.effective_from),
+				"effective_from": ("<=", self.effective_to),
+			},
+		)
 
 		if len(leave_policy_assignments):
-			frappe.throw(_("Leave Policy: {0} already assigned for Employee {1} for period {2} to {3}")
-				.format(bold(self.leave_policy), bold(self.employee), bold(formatdate(self.effective_from)), bold(formatdate(self.effective_to))))
+			frappe.throw(
+				_("Leave Policy: {0} already assigned for Employee {1} for period {2} to {3}").format(
+					bold(self.leave_policy),
+					bold(self.employee),
+					bold(formatdate(self.effective_from)),
+					bold(formatdate(self.effective_to)),
+				)
+			)
 
 	def warn_about_carry_forwarding(self):
 		if not self.carry_forward:
@@ -49,8 +60,9 @@
 		for policy in leave_policy.leave_policy_details:
 			leave_type = leave_types.get(policy.leave_type)
 			if not leave_type.is_carry_forward:
-				msg = _("Leaves for the Leave Type {0} won't be carry-forwarded since carry-forwarding is disabled.").format(
-						frappe.bold(get_link_to_form("Leave Type", leave_type.name)))
+				msg = _(
+					"Leaves for the Leave Type {0} won't be carry-forwarded since carry-forwarding is disabled."
+				).format(frappe.bold(get_link_to_form("Leave Type", leave_type.name)))
 				frappe.msgprint(msg, indicator="orange", alert=True)
 
 	@frappe.whitelist()
@@ -67,41 +79,54 @@
 			for leave_policy_detail in leave_policy.leave_policy_details:
 				if not leave_type_details.get(leave_policy_detail.leave_type).is_lwp:
 					leave_allocation, new_leaves_allocated = self.create_leave_allocation(
-						leave_policy_detail.leave_type, leave_policy_detail.annual_allocation,
-						leave_type_details, date_of_joining
+						leave_policy_detail.leave_type,
+						leave_policy_detail.annual_allocation,
+						leave_type_details,
+						date_of_joining,
 					)
-					leave_allocations[leave_policy_detail.leave_type] = {"name": leave_allocation, "leaves": new_leaves_allocated}
+					leave_allocations[leave_policy_detail.leave_type] = {
+						"name": leave_allocation,
+						"leaves": new_leaves_allocated,
+					}
 			self.db_set("leaves_allocated", 1)
 			return leave_allocations
 
-	def create_leave_allocation(self, leave_type, new_leaves_allocated, leave_type_details, date_of_joining):
+	def create_leave_allocation(
+		self, leave_type, new_leaves_allocated, leave_type_details, date_of_joining
+	):
 		# Creates leave allocation for the given employee in the provided leave period
 		carry_forward = self.carry_forward
 		if self.carry_forward and not leave_type_details.get(leave_type).is_carry_forward:
 			carry_forward = 0
 
-		new_leaves_allocated = self.get_new_leaves(leave_type, new_leaves_allocated,
-			leave_type_details, date_of_joining)
+		new_leaves_allocated = self.get_new_leaves(
+			leave_type, new_leaves_allocated, leave_type_details, date_of_joining
+		)
 
-		allocation = frappe.get_doc(dict(
-			doctype="Leave Allocation",
-			employee=self.employee,
-			leave_type=leave_type,
-			from_date=self.effective_from,
-			to_date=self.effective_to,
-			new_leaves_allocated=new_leaves_allocated,
-			leave_period=self.leave_period if self.assignment_based_on == "Leave Policy" else '',
-			leave_policy_assignment = self.name,
-			leave_policy = self.leave_policy,
-			carry_forward=carry_forward
-			))
-		allocation.save(ignore_permissions = True)
+		allocation = frappe.get_doc(
+			dict(
+				doctype="Leave Allocation",
+				employee=self.employee,
+				leave_type=leave_type,
+				from_date=self.effective_from,
+				to_date=self.effective_to,
+				new_leaves_allocated=new_leaves_allocated,
+				leave_period=self.leave_period if self.assignment_based_on == "Leave Policy" else "",
+				leave_policy_assignment=self.name,
+				leave_policy=self.leave_policy,
+				carry_forward=carry_forward,
+			)
+		)
+		allocation.save(ignore_permissions=True)
 		allocation.submit()
 		return allocation.name, new_leaves_allocated
 
 	def get_new_leaves(self, leave_type, new_leaves_allocated, leave_type_details, date_of_joining):
 		from frappe.model.meta import get_field_precision
-		precision = get_field_precision(frappe.get_meta("Leave Allocation").get_field("new_leaves_allocated"))
+
+		precision = get_field_precision(
+			frappe.get_meta("Leave Allocation").get_field("new_leaves_allocated")
+		)
 
 		# Earned Leaves and Compensatory Leaves are allocated by scheduler, initially allocate 0
 		if leave_type_details.get(leave_type).is_compensatory == 1:
@@ -112,16 +137,22 @@
 				new_leaves_allocated = 0
 			else:
 				# get leaves for past months if assignment is based on Leave Period / Joining Date
-				new_leaves_allocated = self.get_leaves_for_passed_months(leave_type, new_leaves_allocated, leave_type_details, date_of_joining)
+				new_leaves_allocated = self.get_leaves_for_passed_months(
+					leave_type, new_leaves_allocated, leave_type_details, date_of_joining
+				)
 
 		# Calculate leaves at pro-rata basis for employees joining after the beginning of the given leave period
 		elif getdate(date_of_joining) > getdate(self.effective_from):
-			remaining_period = ((date_diff(self.effective_to, date_of_joining) + 1) / (date_diff(self.effective_to, self.effective_from) + 1))
+			remaining_period = (date_diff(self.effective_to, date_of_joining) + 1) / (
+				date_diff(self.effective_to, self.effective_from) + 1
+			)
 			new_leaves_allocated = ceil(new_leaves_allocated * remaining_period)
 
 		return flt(new_leaves_allocated, precision)
 
-	def get_leaves_for_passed_months(self, leave_type, new_leaves_allocated, leave_type_details, date_of_joining):
+	def get_leaves_for_passed_months(
+		self, leave_type, new_leaves_allocated, leave_type_details, date_of_joining
+	):
 		from erpnext.hr.utils import get_monthly_earned_leave
 
 		current_date = frappe.flags.current_date or getdate()
@@ -144,8 +175,11 @@
 			months_passed = add_current_month_if_applicable(months_passed, date_of_joining, based_on_doj)
 
 		if months_passed > 0:
-			monthly_earned_leave = get_monthly_earned_leave(new_leaves_allocated,
-				leave_type_details.get(leave_type).earned_leave_frequency, leave_type_details.get(leave_type).rounding)
+			monthly_earned_leave = get_monthly_earned_leave(
+				new_leaves_allocated,
+				leave_type_details.get(leave_type).earned_leave_frequency,
+				leave_type_details.get(leave_type).rounding,
+			)
 			new_leaves_allocated = monthly_earned_leave * months_passed
 		else:
 			new_leaves_allocated = 0
@@ -174,7 +208,7 @@
 def create_assignment_for_multiple_employees(employees, data):
 
 	if isinstance(employees, str):
-		employees= json.loads(employees)
+		employees = json.loads(employees)
 
 	if isinstance(data, str):
 		data = frappe._dict(json.loads(data))
@@ -201,11 +235,23 @@
 
 	return docs_name
 
+
 def get_leave_type_details():
 	leave_type_details = frappe._dict()
-	leave_types = frappe.get_all("Leave Type",
-		fields=["name", "is_lwp", "is_earned_leave", "is_compensatory", "based_on_date_of_joining",
-			"is_carry_forward", "expire_carry_forwarded_leaves_after_days", "earned_leave_frequency", "rounding"])
+	leave_types = frappe.get_all(
+		"Leave Type",
+		fields=[
+			"name",
+			"is_lwp",
+			"is_earned_leave",
+			"is_compensatory",
+			"based_on_date_of_joining",
+			"is_carry_forward",
+			"expire_carry_forwarded_leaves_after_days",
+			"earned_leave_frequency",
+			"rounding",
+		],
+	)
 	for d in leave_types:
 		leave_type_details.setdefault(d.name, d)
 	return leave_type_details
diff --git a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_dashboard.py b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_dashboard.py
index 4363439..13b39c7 100644
--- a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_dashboard.py
+++ b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_dashboard.py
@@ -3,11 +3,8 @@
 
 def get_data():
 	return {
-		'fieldname':  'leave_policy_assignment',
-		'transactions': [
-			{
-				'label': _('Leaves'),
-				'items': ['Leave Allocation']
-			},
-		]
+		"fieldname": "leave_policy_assignment",
+		"transactions": [
+			{"label": _("Leaves"), "items": ["Leave Allocation"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/erpnext/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py
index 27e4f14..9780828 100644
--- a/erpnext/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py
+++ b/erpnext/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py
@@ -17,9 +17,16 @@
 
 test_dependencies = ["Employee"]
 
+
 class TestLeavePolicyAssignment(unittest.TestCase):
 	def setUp(self):
-		for doctype in ["Leave Period", "Leave Application", "Leave Allocation", "Leave Policy Assignment", "Leave Ledger Entry"]:
+		for doctype in [
+			"Leave Period",
+			"Leave Application",
+			"Leave Allocation",
+			"Leave Policy Assignment",
+			"Leave Ledger Entry",
+		]:
 			frappe.db.delete(doctype)
 
 		employee = get_employee()
@@ -35,16 +42,25 @@
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
-		self.assertEqual(frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "leaves_allocated"), 1)
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
+		self.assertEqual(
+			frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "leaves_allocated"),
+			1,
+		)
 
-		leave_allocation = frappe.get_list("Leave Allocation", filters={
-			"employee": self.employee.name,
-			"leave_policy":leave_policy.name,
-			"leave_policy_assignment": leave_policy_assignments[0],
-			"docstatus": 1})[0]
+		leave_allocation = frappe.get_list(
+			"Leave Allocation",
+			filters={
+				"employee": self.employee.name,
+				"leave_policy": leave_policy.name,
+				"leave_policy_assignment": leave_policy_assignments[0],
+				"docstatus": 1,
+			},
+		)[0]
 		leave_alloc_doc = frappe.get_doc("Leave Allocation", leave_allocation)
 
 		self.assertEqual(leave_alloc_doc.new_leaves_allocated, 10)
@@ -63,68 +79,94 @@
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
 
 		# every leave is allocated no more leave can be granted now
-		self.assertEqual(frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "leaves_allocated"), 1)
-		leave_allocation = frappe.get_list("Leave Allocation", filters={
-			"employee": self.employee.name,
-			"leave_policy":leave_policy.name,
-			"leave_policy_assignment": leave_policy_assignments[0],
-			"docstatus": 1})[0]
+		self.assertEqual(
+			frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "leaves_allocated"),
+			1,
+		)
+		leave_allocation = frappe.get_list(
+			"Leave Allocation",
+			filters={
+				"employee": self.employee.name,
+				"leave_policy": leave_policy.name,
+				"leave_policy_assignment": leave_policy_assignments[0],
+				"docstatus": 1,
+			},
+		)[0]
 
 		leave_alloc_doc = frappe.get_doc("Leave Allocation", leave_allocation)
 		leave_alloc_doc.cancel()
 		leave_alloc_doc.delete()
-		self.assertEqual(frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "leaves_allocated"), 0)
+		self.assertEqual(
+			frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "leaves_allocated"),
+			0,
+		)
 
 	def test_earned_leave_allocation(self):
 		leave_period = create_leave_period("Test Earned Leave Period")
 		leave_type = create_earned_leave_type("Test Earned Leave")
 
-		leave_policy = frappe.get_doc({
-			"doctype": "Leave Policy",
-			"title": "Test Leave Policy",
-			"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 6}]
-		}).submit()
+		leave_policy = frappe.get_doc(
+			{
+				"doctype": "Leave Policy",
+				"title": "Test Leave Policy",
+				"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 6}],
+			}
+		).submit()
 
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
 
 		# second last day of the month
 		# leaves allocated should be 0 since it is an earned leave and allocation happens via scheduler based on set frequency
 		frappe.flags.current_date = add_days(get_last_day(getdate()), -1)
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, "total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 0)
 
 	def test_earned_leave_alloc_for_passed_months_based_on_leave_period(self):
-		leave_period, leave_policy = setup_leave_period_and_policy(get_first_day(add_months(getdate(), -1)))
+		leave_period, leave_policy = setup_leave_period_and_policy(
+			get_first_day(add_months(getdate(), -1))
+		)
 
 		# Case 1: assignment created one month after the leave period, should allocate 1 leave
 		frappe.flags.current_date = get_first_day(getdate())
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, "total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 1)
 
 	def test_earned_leave_alloc_for_passed_months_on_month_end_based_on_leave_period(self):
-		leave_period, leave_policy = setup_leave_period_and_policy(get_first_day(add_months(getdate(), -2)))
+		leave_period, leave_policy = setup_leave_period_and_policy(
+			get_first_day(add_months(getdate(), -2))
+		)
 		# Case 2: assignment created on the last day of the leave period's latter month
 		# should allocate 1 leave for current month even though the month has not ended
 		# since the daily job might have already executed
@@ -133,32 +175,48 @@
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, "total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 3)
 
 		# if the daily job is not completed yet, there is another check present
 		# to ensure leave is not already allocated to avoid duplication
 		from erpnext.hr.utils import allocate_earned_leaves
+
 		allocate_earned_leaves()
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, "total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 3)
 
 	def test_earned_leave_alloc_for_passed_months_with_cf_leaves_based_on_leave_period(self):
 		from erpnext.hr.doctype.leave_allocation.test_leave_allocation import create_leave_allocation
 
-		leave_period, leave_policy = setup_leave_period_and_policy(get_first_day(add_months(getdate(), -2)))
+		leave_period, leave_policy = setup_leave_period_and_policy(
+			get_first_day(add_months(getdate(), -2))
+		)
 		# initial leave allocation = 5
-		leave_allocation = create_leave_allocation(employee=self.employee.name, employee_name=self.employee.employee_name, leave_type="Test Earned Leave",
-			from_date=add_months(getdate(), -12), to_date=add_months(getdate(), -3), new_leaves_allocated=5, carry_forward=0)
+		leave_allocation = create_leave_allocation(
+			employee=self.employee.name,
+			employee_name=self.employee.employee_name,
+			leave_type="Test Earned Leave",
+			from_date=add_months(getdate(), -12),
+			to_date=add_months(getdate(), -3),
+			new_leaves_allocated=5,
+			carry_forward=0,
+		)
 		leave_allocation.submit()
 
 		# Case 3: assignment created on the last day of the leave period's latter month with carry forwarding
@@ -167,14 +225,19 @@
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
 			"leave_period": leave_period.name,
-			"carry_forward": 1
+			"carry_forward": 1,
 		}
 		# carry forwarded leaves = 5, 3 leaves allocated for passed months
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
 
-		details = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, ["total_leaves_allocated", "new_leaves_allocated", "unused_leaves", "name"], as_dict=True)
+		details = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			["total_leaves_allocated", "new_leaves_allocated", "unused_leaves", "name"],
+			as_dict=True,
+		)
 		self.assertEqual(details.new_leaves_allocated, 2)
 		self.assertEqual(details.unused_leaves, 5)
 		self.assertEqual(details.total_leaves_allocated, 7)
@@ -182,20 +245,27 @@
 		# if the daily job is not completed yet, there is another check present
 		# to ensure leave is not already allocated to avoid duplication
 		from erpnext.hr.utils import is_earned_leave_already_allocated
+
 		frappe.flags.current_date = get_last_day(getdate())
 
 		allocation = frappe.get_doc("Leave Allocation", details.name)
 		# 1 leave is still pending to be allocated, irrespective of carry forwarded leaves
-		self.assertFalse(is_earned_leave_already_allocated(allocation, leave_policy.leave_policy_details[0].annual_allocation))
+		self.assertFalse(
+			is_earned_leave_already_allocated(
+				allocation, leave_policy.leave_policy_details[0].annual_allocation
+			)
+		)
 
 	def test_earned_leave_alloc_for_passed_months_based_on_joining_date(self):
 		# tests leave alloc for earned leaves for assignment based on joining date in policy assignment
 		leave_type = create_earned_leave_type("Test Earned Leave")
-		leave_policy = frappe.get_doc({
-			"doctype": "Leave Policy",
-			"title": "Test Leave Policy",
-			"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 12}]
-		}).submit()
+		leave_policy = frappe.get_doc(
+			{
+				"doctype": "Leave Policy",
+				"title": "Test Leave Policy",
+				"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 12}],
+			}
+		).submit()
 
 		# joining date set to 2 months back
 		self.employee.date_of_joining = get_first_day(add_months(getdate(), -2))
@@ -203,29 +273,39 @@
 
 		# assignment created on the last day of the current month
 		frappe.flags.current_date = get_last_day(getdate())
-		data = {
-			"assignment_based_on": "Joining Date",
-			"leave_policy": leave_policy.name
-		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {"leave_policy_assignment": leave_policy_assignments[0]},
-			"total_leaves_allocated")
-		effective_from = frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "effective_from")
+		data = {"assignment_based_on": "Joining Date", "leave_policy": leave_policy.name}
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
+		effective_from = frappe.db.get_value(
+			"Leave Policy Assignment", leave_policy_assignments[0], "effective_from"
+		)
 		self.assertEqual(effective_from, self.employee.date_of_joining)
 		self.assertEqual(leaves_allocated, 3)
 
 		# to ensure leave is not already allocated to avoid duplication
 		from erpnext.hr.utils import allocate_earned_leaves
+
 		frappe.flags.current_date = get_last_day(getdate())
 		allocate_earned_leaves()
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {"leave_policy_assignment": leave_policy_assignments[0]},
-			"total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 3)
 
 	def test_grant_leaves_on_doj_for_earned_leaves_based_on_leave_period(self):
 		# tests leave alloc based on leave period for earned leaves with "based on doj" configuration in leave type
-		leave_period, leave_policy = setup_leave_period_and_policy(get_first_day(add_months(getdate(), -2)), based_on_doj=True)
+		leave_period, leave_policy = setup_leave_period_and_policy(
+			get_first_day(add_months(getdate(), -2)), based_on_doj=True
+		)
 
 		# joining date set to 2 months back
 		self.employee.date_of_joining = get_first_day(add_months(getdate(), -2))
@@ -237,34 +317,43 @@
 		data = {
 			"assignment_based_on": "Leave Period",
 			"leave_policy": leave_policy.name,
-			"leave_period": leave_period.name
+			"leave_period": leave_period.name,
 		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, "total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 3)
 
 		# if the daily job is not completed yet, there is another check present
 		# to ensure leave is not already allocated to avoid duplication
 		from erpnext.hr.utils import allocate_earned_leaves
+
 		frappe.flags.current_date = get_first_day(getdate())
 		allocate_earned_leaves()
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {
-			"leave_policy_assignment": leave_policy_assignments[0]
-		}, "total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 3)
 
 	def test_grant_leaves_on_doj_for_earned_leaves_based_on_joining_date(self):
 		# tests leave alloc based on joining date for earned leaves with "based on doj" configuration in leave type
 		leave_type = create_earned_leave_type("Test Earned Leave", based_on_doj=True)
-		leave_policy = frappe.get_doc({
-			"doctype": "Leave Policy",
-			"title": "Test Leave Policy",
-			"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 12}]
-		}).submit()
+		leave_policy = frappe.get_doc(
+			{
+				"doctype": "Leave Policy",
+				"title": "Test Leave Policy",
+				"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 12}],
+			}
+		).submit()
 
 		# joining date set to 2 months back
 		# leave should be allocated for current month too since this day is same as the joining day
@@ -273,24 +362,32 @@
 
 		# assignment created on the first day of the current month
 		frappe.flags.current_date = get_first_day(getdate())
-		data = {
-			"assignment_based_on": "Joining Date",
-			"leave_policy": leave_policy.name
-		}
-		leave_policy_assignments = create_assignment_for_multiple_employees([self.employee.name], frappe._dict(data))
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {"leave_policy_assignment": leave_policy_assignments[0]},
-			"total_leaves_allocated")
-		effective_from = frappe.db.get_value("Leave Policy Assignment", leave_policy_assignments[0], "effective_from")
+		data = {"assignment_based_on": "Joining Date", "leave_policy": leave_policy.name}
+		leave_policy_assignments = create_assignment_for_multiple_employees(
+			[self.employee.name], frappe._dict(data)
+		)
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
+		effective_from = frappe.db.get_value(
+			"Leave Policy Assignment", leave_policy_assignments[0], "effective_from"
+		)
 		self.assertEqual(effective_from, self.employee.date_of_joining)
 		self.assertEqual(leaves_allocated, 3)
 
 		# to ensure leave is not already allocated to avoid duplication
 		from erpnext.hr.utils import allocate_earned_leaves
+
 		frappe.flags.current_date = get_first_day(getdate())
 		allocate_earned_leaves()
 
-		leaves_allocated = frappe.db.get_value("Leave Allocation", {"leave_policy_assignment": leave_policy_assignments[0]},
-			"total_leaves_allocated")
+		leaves_allocated = frappe.db.get_value(
+			"Leave Allocation",
+			{"leave_policy_assignment": leave_policy_assignments[0]},
+			"total_leaves_allocated",
+		)
 		self.assertEqual(leaves_allocated, 3)
 
 	def tearDown(self):
@@ -302,15 +399,17 @@
 def create_earned_leave_type(leave_type, based_on_doj=False):
 	frappe.delete_doc_if_exists("Leave Type", leave_type, force=1)
 
-	return frappe.get_doc(dict(
-		leave_type_name=leave_type,
-		doctype="Leave Type",
-		is_earned_leave=1,
-		earned_leave_frequency="Monthly",
-		rounding=0.5,
-		is_carry_forward=1,
-		based_on_date_of_joining=based_on_doj
-	)).insert()
+	return frappe.get_doc(
+		dict(
+			leave_type_name=leave_type,
+			doctype="Leave Type",
+			is_earned_leave=1,
+			earned_leave_frequency="Monthly",
+			rounding=0.5,
+			is_carry_forward=1,
+			based_on_date_of_joining=based_on_doj,
+		)
+	).insert()
 
 
 def create_leave_period(name, start_date=None):
@@ -318,24 +417,27 @@
 	if not start_date:
 		start_date = get_first_day(getdate())
 
-	return frappe.get_doc(dict(
-		name=name,
-		doctype="Leave Period",
-		from_date=start_date,
-		to_date=add_months(start_date, 12),
-		company="_Test Company",
-		is_active=1
-	)).insert()
+	return frappe.get_doc(
+		dict(
+			name=name,
+			doctype="Leave Period",
+			from_date=start_date,
+			to_date=add_months(start_date, 12),
+			company="_Test Company",
+			is_active=1,
+		)
+	).insert()
 
 
 def setup_leave_period_and_policy(start_date, based_on_doj=False):
 	leave_type = create_earned_leave_type("Test Earned Leave", based_on_doj)
-	leave_period = create_leave_period("Test Earned Leave Period",
-		start_date=start_date)
-	leave_policy = frappe.get_doc({
-		"doctype": "Leave Policy",
-		"title": "Test Leave Policy",
-		"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 12}]
-	}).insert()
+	leave_period = create_leave_period("Test Earned Leave Period", start_date=start_date)
+	leave_policy = frappe.get_doc(
+		{
+			"doctype": "Leave Policy",
+			"title": "Test Leave Policy",
+			"leave_policy_details": [{"leave_type": leave_type.name, "annual_allocation": 12}],
+		}
+	).insert()
 
-	return leave_period, leave_policy
\ No newline at end of file
+	return leave_period, leave_policy
diff --git a/erpnext/hr/doctype/leave_type/leave_type.py b/erpnext/hr/doctype/leave_type/leave_type.py
index 4b59c2c..82b9bd6 100644
--- a/erpnext/hr/doctype/leave_type/leave_type.py
+++ b/erpnext/hr/doctype/leave_type/leave_type.py
@@ -11,17 +11,23 @@
 class LeaveType(Document):
 	def validate(self):
 		if self.is_lwp:
-			leave_allocation = frappe.get_all("Leave Allocation", filters={
-				'leave_type': self.name,
-				'from_date': ("<=", today()),
-				'to_date': (">=", today())
-			}, fields=['name'])
-			leave_allocation = [l['name'] for l in leave_allocation]
+			leave_allocation = frappe.get_all(
+				"Leave Allocation",
+				filters={"leave_type": self.name, "from_date": ("<=", today()), "to_date": (">=", today())},
+				fields=["name"],
+			)
+			leave_allocation = [l["name"] for l in leave_allocation]
 			if leave_allocation:
-				frappe.throw(_('Leave application is linked with leave allocations {0}. Leave application cannot be set as leave without pay').format(", ".join(leave_allocation))) #nosec
+				frappe.throw(
+					_(
+						"Leave application is linked with leave allocations {0}. Leave application cannot be set as leave without pay"
+					).format(", ".join(leave_allocation))
+				)  # nosec
 
 		if self.is_lwp and self.is_ppl:
 			frappe.throw(_("Leave Type can be either without pay or partial pay"))
 
-		if self.is_ppl and (self.fraction_of_daily_salary_per_leave < 0 or  self.fraction_of_daily_salary_per_leave > 1):
+		if self.is_ppl and (
+			self.fraction_of_daily_salary_per_leave < 0 or self.fraction_of_daily_salary_per_leave > 1
+		):
 			frappe.throw(_("The fraction of Daily Salary per Leave should be between 0 and 1"))
diff --git a/erpnext/hr/doctype/leave_type/leave_type_dashboard.py b/erpnext/hr/doctype/leave_type/leave_type_dashboard.py
index 074d3e4..269a1ec 100644
--- a/erpnext/hr/doctype/leave_type/leave_type_dashboard.py
+++ b/erpnext/hr/doctype/leave_type/leave_type_dashboard.py
@@ -1,12 +1,10 @@
 def get_data():
 	return {
-		'fieldname': 'leave_type',
-		'transactions': [
+		"fieldname": "leave_type",
+		"transactions": [
 			{
-				'items': ['Leave Allocation', 'Leave Application'],
+				"items": ["Leave Allocation", "Leave Application"],
 			},
-			{
-				'items': ['Attendance', 'Leave Encashment']
-			}
-		]
+			{"items": ["Attendance", "Leave Encashment"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/leave_type/test_leave_type.py b/erpnext/hr/doctype/leave_type/test_leave_type.py
index c1b64e9..69f9e12 100644
--- a/erpnext/hr/doctype/leave_type/test_leave_type.py
+++ b/erpnext/hr/doctype/leave_type/test_leave_type.py
@@ -3,27 +3,30 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Leave Type')
+test_records = frappe.get_test_records("Leave Type")
+
 
 def create_leave_type(**args):
-    args = frappe._dict(args)
-    if frappe.db.exists("Leave Type", args.leave_type_name):
-        return frappe.get_doc("Leave Type", args.leave_type_name)
-    leave_type = frappe.get_doc({
-        "doctype": "Leave Type",
-        "leave_type_name": args.leave_type_name or "_Test Leave Type",
-        "include_holiday": args.include_holidays or 1,
-        "allow_encashment": args.allow_encashment or 0,
-        "is_earned_leave": args.is_earned_leave or 0,
-        "is_lwp": args.is_lwp or 0,
-        "is_ppl":args.is_ppl or 0,
-        "is_carry_forward": args.is_carry_forward or 0,
-        "expire_carry_forwarded_leaves_after_days": args.expire_carry_forwarded_leaves_after_days or 0,
-        "encashment_threshold_days": args.encashment_threshold_days or 5,
-        "earning_component": "Leave Encashment"
-    })
+	args = frappe._dict(args)
+	if frappe.db.exists("Leave Type", args.leave_type_name):
+		return frappe.get_doc("Leave Type", args.leave_type_name)
+	leave_type = frappe.get_doc(
+		{
+			"doctype": "Leave Type",
+			"leave_type_name": args.leave_type_name or "_Test Leave Type",
+			"include_holiday": args.include_holidays or 1,
+			"allow_encashment": args.allow_encashment or 0,
+			"is_earned_leave": args.is_earned_leave or 0,
+			"is_lwp": args.is_lwp or 0,
+			"is_ppl": args.is_ppl or 0,
+			"is_carry_forward": args.is_carry_forward or 0,
+			"expire_carry_forwarded_leaves_after_days": args.expire_carry_forwarded_leaves_after_days or 0,
+			"encashment_threshold_days": args.encashment_threshold_days or 5,
+			"earning_component": "Leave Encashment",
+		}
+	)
 
-    if leave_type.is_ppl:
-        leave_type.fraction_of_daily_salary_per_leave = args.fraction_of_daily_salary_per_leave or 0.5
+	if leave_type.is_ppl:
+		leave_type.fraction_of_daily_salary_per_leave = args.fraction_of_daily_salary_per_leave or 0.5
 
-    return leave_type
+	return leave_type
diff --git a/erpnext/hr/doctype/offer_term/test_offer_term.py b/erpnext/hr/doctype/offer_term/test_offer_term.py
index 2e5ed75..2bea7b2 100644
--- a/erpnext/hr/doctype/offer_term/test_offer_term.py
+++ b/erpnext/hr/doctype/offer_term/test_offer_term.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Offer Term')
 
+
 class TestOfferTerm(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/shift_assignment/shift_assignment.py b/erpnext/hr/doctype/shift_assignment/shift_assignment.py
index 5177302..5a12486 100644
--- a/erpnext/hr/doctype/shift_assignment/shift_assignment.py
+++ b/erpnext/hr/doctype/shift_assignment/shift_assignment.py
@@ -20,7 +20,7 @@
 		self.validate_overlapping_dates()
 
 		if self.end_date:
-			self.validate_from_to_dates('start_date', 'end_date')
+			self.validate_from_to_dates("start_date", "end_date")
 
 	def validate_overlapping_dates(self):
 		if not self.name:
@@ -33,7 +33,7 @@
 		"""
 
 		if self.end_date:
-			condition  += """ or
+			condition += """ or
 					%(end_date)s between start_date and end_date
 					or
 					start_date between %(start_date)s and %(end_date)s
@@ -41,7 +41,8 @@
 		else:
 			condition += """ ) """
 
-		assigned_shifts = frappe.db.sql("""
+		assigned_shifts = frappe.db.sql(
+			"""
 			select name, shift_type, start_date ,end_date, docstatus, status
 			from `tabShift Assignment`
 			where
@@ -49,13 +50,18 @@
 				and name != %(name)s
 				and status = "Active"
 				{0}
-		""".format(condition), {
-			"employee": self.employee,
-			"shift_type": self.shift_type,
-			"start_date": self.start_date,
-			"end_date": self.end_date,
-			"name": self.name
-		}, as_dict = 1)
+		""".format(
+				condition
+			),
+			{
+				"employee": self.employee,
+				"shift_type": self.shift_type,
+				"start_date": self.start_date,
+				"end_date": self.end_date,
+				"name": self.name,
+			},
+			as_dict=1,
+		)
 
 		if len(assigned_shifts):
 			self.throw_overlap_error(assigned_shifts[0])
@@ -63,7 +69,9 @@
 	def throw_overlap_error(self, shift_details):
 		shift_details = frappe._dict(shift_details)
 		if shift_details.docstatus == 1 and shift_details.status == "Active":
-			msg = _("Employee {0} already has Active Shift {1}: {2}").format(frappe.bold(self.employee), frappe.bold(self.shift_type), frappe.bold(shift_details.name))
+			msg = _("Employee {0} already has Active Shift {1}: {2}").format(
+				frappe.bold(self.employee), frappe.bold(self.shift_type), frappe.bold(shift_details.name)
+			)
 		if shift_details.start_date:
 			msg += _(" from {0}").format(getdate(self.start_date).strftime("%d-%m-%Y"))
 			title = "Ongoing Shift"
@@ -73,23 +81,27 @@
 		if msg:
 			frappe.throw(msg, title=title)
 
+
 @frappe.whitelist()
 def get_events(start, end, filters=None):
 	events = []
 
-	employee = frappe.db.get_value("Employee", {"user_id": frappe.session.user}, ["name", "company"],
-		as_dict=True)
+	employee = frappe.db.get_value(
+		"Employee", {"user_id": frappe.session.user}, ["name", "company"], as_dict=True
+	)
 	if employee:
 		employee, company = employee.name, employee.company
 	else:
-		employee=''
-		company=frappe.db.get_value("Global Defaults", None, "default_company")
+		employee = ""
+		company = frappe.db.get_value("Global Defaults", None, "default_company")
 
 	from frappe.desk.reportview import get_filters_cond
+
 	conditions = get_filters_cond("Shift Assignment", filters, [])
 	add_assignments(events, start, end, conditions=conditions)
 	return events
 
+
 def add_assignments(events, start, end, conditions=None):
 	query = """select name, start_date, end_date, employee_name,
 		employee, docstatus, shift_type
@@ -101,7 +113,7 @@
 	if conditions:
 		query += conditions
 
-	records = frappe.db.sql(query, {"start_date":start, "end_date":end}, as_dict=True)
+	records = frappe.db.sql(query, {"start_date": start, "end_date": end}, as_dict=True)
 	shift_timing_map = get_shift_type_timing([d.shift_type for d in records])
 
 	for d in records:
@@ -109,27 +121,33 @@
 		daily_event_end = d.end_date if d.end_date else getdate()
 		delta = timedelta(days=1)
 		while daily_event_start <= daily_event_end:
-			start_timing = frappe.utils.get_datetime(daily_event_start)+ shift_timing_map[d.shift_type]['start_time']
-			end_timing = frappe.utils.get_datetime(daily_event_start)+ shift_timing_map[d.shift_type]['end_time']
+			start_timing = (
+				frappe.utils.get_datetime(daily_event_start) + shift_timing_map[d.shift_type]["start_time"]
+			)
+			end_timing = (
+				frappe.utils.get_datetime(daily_event_start) + shift_timing_map[d.shift_type]["end_time"]
+			)
 			daily_event_start += delta
 			e = {
 				"name": d.name,
 				"doctype": "Shift Assignment",
 				"start_date": start_timing,
 				"end_date": end_timing,
-				"title": cstr(d.employee_name) + ": "+ \
-					cstr(d.shift_type),
+				"title": cstr(d.employee_name) + ": " + cstr(d.shift_type),
 				"docstatus": d.docstatus,
-				"allDay": 0
+				"allDay": 0,
 			}
 			if e not in events:
 				events.append(e)
 
 	return events
 
+
 def get_shift_type_timing(shift_types):
 	shift_timing_map = {}
-	data = frappe.get_all("Shift Type", filters = {"name": ("IN", shift_types)}, fields = ['name', 'start_time', 'end_time'])
+	data = frappe.get_all(
+		"Shift Type", filters={"name": ("IN", shift_types)}, fields=["name", "start_time", "end_time"]
+	)
 
 	for d in data:
 		shift_timing_map[d.name] = d
@@ -137,7 +155,9 @@
 	return shift_timing_map
 
 
-def get_employee_shift(employee, for_date=None, consider_default_shift=False, next_shift_direction=None):
+def get_employee_shift(
+	employee, for_date=None, consider_default_shift=False, next_shift_direction=None
+):
 	"""Returns a Shift Type for the given employee on the given date. (excluding the holidays)
 
 	:param employee: Employee for which shift is required.
@@ -147,21 +167,25 @@
 	"""
 	if for_date is None:
 		for_date = nowdate()
-	default_shift = frappe.db.get_value('Employee', employee, 'default_shift')
+	default_shift = frappe.db.get_value("Employee", employee, "default_shift")
 	shift_type_name = None
-	shift_assignment_details = frappe.db.get_value('Shift Assignment', {'employee':employee, 'start_date':('<=', for_date), 'docstatus': '1', 'status': "Active"}, ['shift_type', 'end_date'])
+	shift_assignment_details = frappe.db.get_value(
+		"Shift Assignment",
+		{"employee": employee, "start_date": ("<=", for_date), "docstatus": "1", "status": "Active"},
+		["shift_type", "end_date"],
+	)
 
 	if shift_assignment_details:
 		shift_type_name = shift_assignment_details[0]
 
 		# if end_date present means that shift is over after end_date else it is a ongoing shift.
-		if shift_assignment_details[1] and for_date >= shift_assignment_details[1] :
+		if shift_assignment_details[1] and for_date >= shift_assignment_details[1]:
 			shift_type_name = None
 
 	if not shift_type_name and consider_default_shift:
 		shift_type_name = default_shift
 	if shift_type_name:
-		holiday_list_name = frappe.db.get_value('Shift Type', shift_type_name, 'holiday_list')
+		holiday_list_name = frappe.db.get_value("Shift Type", shift_type_name, "holiday_list")
 		if not holiday_list_name:
 			holiday_list_name = get_holiday_list_for_employee(employee, False)
 		if holiday_list_name and is_holiday(holiday_list_name, for_date):
@@ -170,22 +194,30 @@
 	if not shift_type_name and next_shift_direction:
 		MAX_DAYS = 366
 		if consider_default_shift and default_shift:
-			direction = -1 if next_shift_direction == 'reverse' else +1
+			direction = -1 if next_shift_direction == "reverse" else +1
 			for i in range(MAX_DAYS):
-				date = for_date+timedelta(days=direction*(i+1))
+				date = for_date + timedelta(days=direction * (i + 1))
 				shift_details = get_employee_shift(employee, date, consider_default_shift, None)
 				if shift_details:
 					shift_type_name = shift_details.shift_type.name
 					for_date = date
 					break
 		else:
-			direction = '<' if next_shift_direction == 'reverse' else '>'
-			sort_order = 'desc' if next_shift_direction == 'reverse' else 'asc'
-			dates = frappe.db.get_all('Shift Assignment',
-				['start_date', 'end_date'],
-				{'employee':employee, 'start_date':(direction, for_date), 'docstatus': '1', "status": "Active"},
+			direction = "<" if next_shift_direction == "reverse" else ">"
+			sort_order = "desc" if next_shift_direction == "reverse" else "asc"
+			dates = frappe.db.get_all(
+				"Shift Assignment",
+				["start_date", "end_date"],
+				{
+					"employee": employee,
+					"start_date": (direction, for_date),
+					"docstatus": "1",
+					"status": "Active",
+				},
 				as_list=True,
-				limit=MAX_DAYS, order_by="start_date "+sort_order)
+				limit=MAX_DAYS,
+				order_by="start_date " + sort_order,
+			)
 
 			if dates:
 				for date in dates:
@@ -201,35 +233,57 @@
 
 
 def get_employee_shift_timings(employee, for_timestamp=None, consider_default_shift=False):
-	"""Returns previous shift, current/upcoming shift, next_shift for the given timestamp and employee
-	"""
+	"""Returns previous shift, current/upcoming shift, next_shift for the given timestamp and employee"""
 	if for_timestamp is None:
 		for_timestamp = now_datetime()
 	# write and verify a test case for midnight shift.
 	prev_shift = curr_shift = next_shift = None
-	curr_shift = get_employee_shift(employee, for_timestamp.date(), consider_default_shift, 'forward')
+	curr_shift = get_employee_shift(employee, for_timestamp.date(), consider_default_shift, "forward")
 	if curr_shift:
-		next_shift = get_employee_shift(employee, curr_shift.start_datetime.date()+timedelta(days=1), consider_default_shift, 'forward')
-	prev_shift = get_employee_shift(employee, for_timestamp.date()+timedelta(days=-1), consider_default_shift, 'reverse')
+		next_shift = get_employee_shift(
+			employee,
+			curr_shift.start_datetime.date() + timedelta(days=1),
+			consider_default_shift,
+			"forward",
+		)
+	prev_shift = get_employee_shift(
+		employee, for_timestamp.date() + timedelta(days=-1), consider_default_shift, "reverse"
+	)
 
 	if curr_shift:
 		if prev_shift:
-			curr_shift.actual_start = prev_shift.end_datetime if curr_shift.actual_start < prev_shift.end_datetime else curr_shift.actual_start
-			prev_shift.actual_end = curr_shift.actual_start if prev_shift.actual_end > curr_shift.actual_start else prev_shift.actual_end
+			curr_shift.actual_start = (
+				prev_shift.end_datetime
+				if curr_shift.actual_start < prev_shift.end_datetime
+				else curr_shift.actual_start
+			)
+			prev_shift.actual_end = (
+				curr_shift.actual_start
+				if prev_shift.actual_end > curr_shift.actual_start
+				else prev_shift.actual_end
+			)
 		if next_shift:
-			next_shift.actual_start = curr_shift.end_datetime if next_shift.actual_start < curr_shift.end_datetime else next_shift.actual_start
-			curr_shift.actual_end = next_shift.actual_start if curr_shift.actual_end > next_shift.actual_start else curr_shift.actual_end
+			next_shift.actual_start = (
+				curr_shift.end_datetime
+				if next_shift.actual_start < curr_shift.end_datetime
+				else next_shift.actual_start
+			)
+			curr_shift.actual_end = (
+				next_shift.actual_start
+				if curr_shift.actual_end > next_shift.actual_start
+				else curr_shift.actual_end
+			)
 	return prev_shift, curr_shift, next_shift
 
 
 def get_shift_details(shift_type_name, for_date=None):
 	"""Returns Shift Details which contain some additional information as described below.
 	'shift_details' contains the following keys:
-		'shift_type' - Object of DocType Shift Type,
-		'start_datetime' - Date and Time of shift start on given date,
-		'end_datetime' - Date and Time of shift end on given date,
-		'actual_start' - datetime of shift start after adding 'begin_check_in_before_shift_start_time',
-		'actual_end' - datetime of shift end after adding 'allow_check_out_after_shift_end_time'(None is returned if this is zero)
+	        'shift_type' - Object of DocType Shift Type,
+	        'start_datetime' - Date and Time of shift start on given date,
+	        'end_datetime' - Date and Time of shift end on given date,
+	        'actual_start' - datetime of shift start after adding 'begin_check_in_before_shift_start_time',
+	        'actual_end' - datetime of shift end after adding 'allow_check_out_after_shift_end_time'(None is returned if this is zero)
 
 	:param shift_type_name: shift type name for which shift_details is required.
 	:param for_date: Date on which shift_details are required
@@ -238,30 +292,38 @@
 		return None
 	if not for_date:
 		for_date = nowdate()
-	shift_type = frappe.get_doc('Shift Type', shift_type_name)
+	shift_type = frappe.get_doc("Shift Type", shift_type_name)
 	start_datetime = datetime.combine(for_date, datetime.min.time()) + shift_type.start_time
-	for_date = for_date + timedelta(days=1) if shift_type.start_time > shift_type.end_time else for_date
+	for_date = (
+		for_date + timedelta(days=1) if shift_type.start_time > shift_type.end_time else for_date
+	)
 	end_datetime = datetime.combine(for_date, datetime.min.time()) + shift_type.end_time
-	actual_start = start_datetime - timedelta(minutes=shift_type.begin_check_in_before_shift_start_time)
+	actual_start = start_datetime - timedelta(
+		minutes=shift_type.begin_check_in_before_shift_start_time
+	)
 	actual_end = end_datetime + timedelta(minutes=shift_type.allow_check_out_after_shift_end_time)
 
-	return frappe._dict({
-		'shift_type': shift_type,
-		'start_datetime': start_datetime,
-		'end_datetime': end_datetime,
-		'actual_start': actual_start,
-		'actual_end': actual_end
-	})
+	return frappe._dict(
+		{
+			"shift_type": shift_type,
+			"start_datetime": start_datetime,
+			"end_datetime": end_datetime,
+			"actual_start": actual_start,
+			"actual_end": actual_end,
+		}
+	)
 
 
 def get_actual_start_end_datetime_of_shift(employee, for_datetime, consider_default_shift=False):
 	"""Takes a datetime and returns the 'actual' start datetime and end datetime of the shift in which the timestamp belongs.
-		Here 'actual' means - taking in to account the "begin_check_in_before_shift_start_time" and "allow_check_out_after_shift_end_time".
-		None is returned if the timestamp is outside any actual shift timings.
-		Shift Details is also returned(current/upcoming i.e. if timestamp not in any actual shift then details of next shift returned)
+	Here 'actual' means - taking in to account the "begin_check_in_before_shift_start_time" and "allow_check_out_after_shift_end_time".
+	None is returned if the timestamp is outside any actual shift timings.
+	Shift Details is also returned(current/upcoming i.e. if timestamp not in any actual shift then details of next shift returned)
 	"""
 	actual_shift_start = actual_shift_end = shift_details = None
-	shift_timings_as_per_timestamp = get_employee_shift_timings(employee, for_datetime, consider_default_shift)
+	shift_timings_as_per_timestamp = get_employee_shift_timings(
+		employee, for_datetime, consider_default_shift
+	)
 	timestamp_list = []
 	for shift in shift_timings_as_per_timestamp:
 		if shift:
@@ -273,11 +335,11 @@
 		if timestamp and for_datetime <= timestamp:
 			timestamp_index = index
 			break
-	if timestamp_index and timestamp_index%2 == 1:
-		shift_details = shift_timings_as_per_timestamp[int((timestamp_index-1)/2)]
+	if timestamp_index and timestamp_index % 2 == 1:
+		shift_details = shift_timings_as_per_timestamp[int((timestamp_index - 1) / 2)]
 		actual_shift_start = shift_details.actual_start
 		actual_shift_end = shift_details.actual_end
 	elif timestamp_index:
-		shift_details = shift_timings_as_per_timestamp[int(timestamp_index/2)]
+		shift_details = shift_timings_as_per_timestamp[int(timestamp_index / 2)]
 
 	return actual_shift_start, actual_shift_end, shift_details
diff --git a/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py b/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py
index d490081..4a1ec29 100644
--- a/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py
+++ b/erpnext/hr/doctype/shift_assignment/test_shift_assignment.py
@@ -8,19 +8,21 @@
 
 test_dependencies = ["Shift Type"]
 
-class TestShiftAssignment(unittest.TestCase):
 
+class TestShiftAssignment(unittest.TestCase):
 	def setUp(self):
 		frappe.db.sql("delete from `tabShift Assignment`")
 
 	def test_make_shift_assignment(self):
-		shift_assignment = frappe.get_doc({
-			"doctype": "Shift Assignment",
-			"shift_type": "Day Shift",
-			"company": "_Test Company",
-			"employee": "_T-Employee-00001",
-			"start_date": nowdate()
-		}).insert()
+		shift_assignment = frappe.get_doc(
+			{
+				"doctype": "Shift Assignment",
+				"shift_type": "Day Shift",
+				"company": "_Test Company",
+				"employee": "_T-Employee-00001",
+				"start_date": nowdate(),
+			}
+		).insert()
 		shift_assignment.submit()
 
 		self.assertEqual(shift_assignment.docstatus, 1)
@@ -28,52 +30,59 @@
 	def test_overlapping_for_ongoing_shift(self):
 		# shift should be Ongoing if Only start_date is present and status = Active
 
-		shift_assignment_1 = frappe.get_doc({
-			"doctype": "Shift Assignment",
-			"shift_type": "Day Shift",
-			"company": "_Test Company",
-			"employee": "_T-Employee-00001",
-			"start_date": nowdate(),
-			"status": 'Active'
-		}).insert()
+		shift_assignment_1 = frappe.get_doc(
+			{
+				"doctype": "Shift Assignment",
+				"shift_type": "Day Shift",
+				"company": "_Test Company",
+				"employee": "_T-Employee-00001",
+				"start_date": nowdate(),
+				"status": "Active",
+			}
+		).insert()
 		shift_assignment_1.submit()
 
 		self.assertEqual(shift_assignment_1.docstatus, 1)
 
-		shift_assignment = frappe.get_doc({
-			"doctype": "Shift Assignment",
-			"shift_type": "Day Shift",
-			"company": "_Test Company",
-			"employee": "_T-Employee-00001",
-			"start_date": add_days(nowdate(), 2)
-		})
+		shift_assignment = frappe.get_doc(
+			{
+				"doctype": "Shift Assignment",
+				"shift_type": "Day Shift",
+				"company": "_Test Company",
+				"employee": "_T-Employee-00001",
+				"start_date": add_days(nowdate(), 2),
+			}
+		)
 
 		self.assertRaises(frappe.ValidationError, shift_assignment.save)
 
 	def test_overlapping_for_fixed_period_shift(self):
 		# shift should is for Fixed period if Only start_date and end_date both are present and status = Active
 
-			shift_assignment_1 = frappe.get_doc({
+		shift_assignment_1 = frappe.get_doc(
+			{
 				"doctype": "Shift Assignment",
 				"shift_type": "Day Shift",
 				"company": "_Test Company",
 				"employee": "_T-Employee-00001",
 				"start_date": nowdate(),
 				"end_date": add_days(nowdate(), 30),
-				"status": 'Active'
-			}).insert()
-			shift_assignment_1.submit()
+				"status": "Active",
+			}
+		).insert()
+		shift_assignment_1.submit()
 
-
-			# it should not allowed within period of any shift.
-			shift_assignment_3 = frappe.get_doc({
+		# it should not allowed within period of any shift.
+		shift_assignment_3 = frappe.get_doc(
+			{
 				"doctype": "Shift Assignment",
 				"shift_type": "Day Shift",
 				"company": "_Test Company",
 				"employee": "_T-Employee-00001",
-				"start_date":add_days(nowdate(), 10),
+				"start_date": add_days(nowdate(), 10),
 				"end_date": add_days(nowdate(), 35),
-				"status": 'Active'
-			})
+				"status": "Active",
+			}
+		)
 
-			self.assertRaises(frappe.ValidationError, shift_assignment_3.save)
+		self.assertRaises(frappe.ValidationError, shift_assignment_3.save)
diff --git a/erpnext/hr/doctype/shift_request/shift_request.py b/erpnext/hr/doctype/shift_request/shift_request.py
index d4fcf99..1e3e8ff 100644
--- a/erpnext/hr/doctype/shift_request/shift_request.py
+++ b/erpnext/hr/doctype/shift_request/shift_request.py
@@ -10,7 +10,9 @@
 from erpnext.hr.utils import share_doc_with_approver, validate_active_employee
 
 
-class OverlapError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
+
 
 class ShiftRequest(Document):
 	def validate(self):
@@ -39,24 +41,35 @@
 			assignment_doc.insert()
 			assignment_doc.submit()
 
-			frappe.msgprint(_("Shift Assignment: {0} created for Employee: {1}").format(frappe.bold(assignment_doc.name), frappe.bold(self.employee)))
+			frappe.msgprint(
+				_("Shift Assignment: {0} created for Employee: {1}").format(
+					frappe.bold(assignment_doc.name), frappe.bold(self.employee)
+				)
+			)
 
 	def on_cancel(self):
-		shift_assignment_list = frappe.get_list("Shift Assignment", {'employee': self.employee, 'shift_request': self.name})
+		shift_assignment_list = frappe.get_list(
+			"Shift Assignment", {"employee": self.employee, "shift_request": self.name}
+		)
 		if shift_assignment_list:
 			for shift in shift_assignment_list:
-				shift_assignment_doc = frappe.get_doc("Shift Assignment", shift['name'])
+				shift_assignment_doc = frappe.get_doc("Shift Assignment", shift["name"])
 				shift_assignment_doc.cancel()
 
 	def validate_default_shift(self):
 		default_shift = frappe.get_value("Employee", self.employee, "default_shift")
 		if self.shift_type == default_shift:
-			frappe.throw(_("You can not request for your Default Shift: {0}").format(frappe.bold(self.shift_type)))
+			frappe.throw(
+				_("You can not request for your Default Shift: {0}").format(frappe.bold(self.shift_type))
+			)
 
 	def validate_approver(self):
 		department = frappe.get_value("Employee", self.employee, "department")
 		shift_approver = frappe.get_value("Employee", self.employee, "shift_request_approver")
-		approvers = frappe.db.sql("""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""", (department))
+		approvers = frappe.db.sql(
+			"""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""",
+			(department),
+		)
 		approvers = [approver[0] for approver in approvers]
 		approvers.append(shift_approver)
 		if self.approver not in approvers:
@@ -67,10 +80,11 @@
 			frappe.throw(_("To date cannot be before from date"))
 
 	def validate_shift_request_overlap_dates(self):
-			if not self.name:
-				self.name = "New Shift Request"
+		if not self.name:
+			self.name = "New Shift Request"
 
-			d = frappe.db.sql("""
+		d = frappe.db.sql(
+			"""
 				select
 					name, shift_type, from_date, to_date
 				from `tabShift Request`
@@ -79,20 +93,23 @@
 					and %(from_date)s <= to_date) or
 					( %(to_date)s >= from_date
 					and %(to_date)s <= to_date ))
-				and name != %(name)s""", {
-					"employee": self.employee,
-					"shift_type": self.shift_type,
-					"from_date": self.from_date,
-					"to_date": self.to_date,
-					"name": self.name
-				}, as_dict=1)
+				and name != %(name)s""",
+			{
+				"employee": self.employee,
+				"shift_type": self.shift_type,
+				"from_date": self.from_date,
+				"to_date": self.to_date,
+				"name": self.name,
+			},
+			as_dict=1,
+		)
 
-			for date_overlap in d:
-				if date_overlap ['name']:
-					self.throw_overlap_error(date_overlap)
+		for date_overlap in d:
+			if date_overlap["name"]:
+				self.throw_overlap_error(date_overlap)
 
 	def throw_overlap_error(self, d):
-		msg = _("Employee {0} has already applied for {1} between {2} and {3} : ").format(self.employee,
-			d['shift_type'], formatdate(d['from_date']), formatdate(d['to_date'])) \
-			+ """ <b><a href="/app/Form/Shift Request/{0}">{0}</a></b>""".format(d["name"])
+		msg = _("Employee {0} has already applied for {1} between {2} and {3} : ").format(
+			self.employee, d["shift_type"], formatdate(d["from_date"]), formatdate(d["to_date"])
+		) + """ <b><a href="/app/Form/Shift Request/{0}">{0}</a></b>""".format(d["name"])
 		frappe.throw(msg, OverlapError)
diff --git a/erpnext/hr/doctype/shift_request/shift_request_dashboard.py b/erpnext/hr/doctype/shift_request/shift_request_dashboard.py
index 531c98d..2859b8f 100644
--- a/erpnext/hr/doctype/shift_request/shift_request_dashboard.py
+++ b/erpnext/hr/doctype/shift_request/shift_request_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'shift_request',
-        'transactions': [
-            {
-                'items': ['Shift Assignment']
-            },
-        ],
-    }
+	return {
+		"fieldname": "shift_request",
+		"transactions": [
+			{"items": ["Shift Assignment"]},
+		],
+	}
diff --git a/erpnext/hr/doctype/shift_request/test_shift_request.py b/erpnext/hr/doctype/shift_request/test_shift_request.py
index 3633c9b..b4f5177 100644
--- a/erpnext/hr/doctype/shift_request/test_shift_request.py
+++ b/erpnext/hr/doctype/shift_request/test_shift_request.py
@@ -10,6 +10,7 @@
 
 test_dependencies = ["Shift Type"]
 
+
 class TestShiftRequest(unittest.TestCase):
 	def setUp(self):
 		for doctype in ["Shift Request", "Shift Assignment"]:
@@ -20,9 +21,12 @@
 
 	def test_make_shift_request(self):
 		"Test creation/updation of Shift Assignment from Shift Request."
-		department = frappe.get_value("Employee", "_T-Employee-00001", 'department')
+		department = frappe.get_value("Employee", "_T-Employee-00001", "department")
 		set_shift_approver(department)
-		approver = frappe.db.sql("""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""", (department))[0][0]
+		approver = frappe.db.sql(
+			"""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""",
+			(department),
+		)[0][0]
 
 		shift_request = make_shift_request(approver)
 
@@ -31,7 +35,7 @@
 			"Shift Assignment",
 			filters={"shift_request": shift_request.name},
 			fieldname=["employee", "docstatus"],
-			as_dict=True
+			as_dict=True,
 		)
 		self.assertEqual(shift_request.employee, shift_assignment.employee)
 		self.assertEqual(shift_assignment.docstatus, 1)
@@ -39,9 +43,7 @@
 		shift_request.cancel()
 
 		shift_assignment_docstatus = frappe.db.get_value(
-			"Shift Assignment",
-			filters={"shift_request": shift_request.name},
-			fieldname="docstatus"
+			"Shift Assignment", filters={"shift_request": shift_request.name}, fieldname="docstatus"
 		)
 		self.assertEqual(shift_assignment_docstatus, 2)
 
@@ -62,7 +64,10 @@
 		shift_request.reload()
 		department = frappe.get_value("Employee", "_T-Employee-00001", "department")
 		set_shift_approver(department)
-		department_approver = frappe.db.sql("""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""", (department))[0][0]
+		department_approver = frappe.db.sql(
+			"""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""",
+			(department),
+		)[0][0]
 		shift_request.approver = department_approver
 		shift_request.save()
 		self.assertTrue(shift_request.name not in frappe.share.get_shared("Shift Request", user))
@@ -85,22 +90,25 @@
 
 def set_shift_approver(department):
 	department_doc = frappe.get_doc("Department", department)
-	department_doc.append('shift_request_approver',{'approver': "test1@example.com"})
+	department_doc.append("shift_request_approver", {"approver": "test1@example.com"})
 	department_doc.save()
 	department_doc.reload()
 
+
 def make_shift_request(approver, do_not_submit=0):
-	shift_request = frappe.get_doc({
-		"doctype": "Shift Request",
-		"shift_type": "Day Shift",
-		"company": "_Test Company",
-		"employee": "_T-Employee-00001",
-		"employee_name": "_Test Employee",
-		"from_date": nowdate(),
-		"to_date": add_days(nowdate(), 10),
-		"approver": approver,
-		"status": "Approved"
-	}).insert()
+	shift_request = frappe.get_doc(
+		{
+			"doctype": "Shift Request",
+			"shift_type": "Day Shift",
+			"company": "_Test Company",
+			"employee": "_T-Employee-00001",
+			"employee_name": "_Test Employee",
+			"from_date": nowdate(),
+			"to_date": add_days(nowdate(), 10),
+			"approver": approver,
+			"status": "Approved",
+		}
+	).insert()
 
 	if do_not_submit:
 		return shift_request
diff --git a/erpnext/hr/doctype/shift_type/shift_type.py b/erpnext/hr/doctype/shift_type/shift_type.py
index 562a573..3f5cb22 100644
--- a/erpnext/hr/doctype/shift_type/shift_type.py
+++ b/erpnext/hr/doctype/shift_type/shift_type.py
@@ -24,20 +24,45 @@
 class ShiftType(Document):
 	@frappe.whitelist()
 	def process_auto_attendance(self):
-		if not cint(self.enable_auto_attendance) or not self.process_attendance_after or not self.last_sync_of_checkin:
+		if (
+			not cint(self.enable_auto_attendance)
+			or not self.process_attendance_after
+			or not self.last_sync_of_checkin
+		):
 			return
 		filters = {
-			'skip_auto_attendance':'0',
-			'attendance':('is', 'not set'),
-			'time':('>=', self.process_attendance_after),
-			'shift_actual_end': ('<', self.last_sync_of_checkin),
-			'shift': self.name
+			"skip_auto_attendance": "0",
+			"attendance": ("is", "not set"),
+			"time": (">=", self.process_attendance_after),
+			"shift_actual_end": ("<", self.last_sync_of_checkin),
+			"shift": self.name,
 		}
-		logs = frappe.db.get_list('Employee Checkin', fields="*", filters=filters, order_by="employee,time")
-		for key, group in itertools.groupby(logs, key=lambda x: (x['employee'], x['shift_actual_start'])):
+		logs = frappe.db.get_list(
+			"Employee Checkin", fields="*", filters=filters, order_by="employee,time"
+		)
+		for key, group in itertools.groupby(
+			logs, key=lambda x: (x["employee"], x["shift_actual_start"])
+		):
 			single_shift_logs = list(group)
-			attendance_status, working_hours, late_entry, early_exit, in_time, out_time = self.get_attendance(single_shift_logs)
-			mark_attendance_and_link_log(single_shift_logs, attendance_status, key[1].date(), working_hours, late_entry, early_exit, in_time, out_time, self.name)
+			(
+				attendance_status,
+				working_hours,
+				late_entry,
+				early_exit,
+				in_time,
+				out_time,
+			) = self.get_attendance(single_shift_logs)
+			mark_attendance_and_link_log(
+				single_shift_logs,
+				attendance_status,
+				key[1].date(),
+				working_hours,
+				late_entry,
+				early_exit,
+				in_time,
+				out_time,
+				self.name,
+			)
 		for employee in self.get_assigned_employee(self.process_attendance_after, True):
 			self.mark_absent_for_dates_with_no_attendance(employee)
 
@@ -45,36 +70,66 @@
 		"""Return attendance_status, working_hours, late_entry, early_exit, in_time, out_time
 		for a set of logs belonging to a single shift.
 		Assumtion:
-			1. These logs belongs to an single shift, single employee and is not in a holiday date.
-			2. Logs are in chronological order
+		        1. These logs belongs to an single shift, single employee and is not in a holiday date.
+		        2. Logs are in chronological order
 		"""
 		late_entry = early_exit = False
-		total_working_hours, in_time, out_time = calculate_working_hours(logs, self.determine_check_in_and_check_out, self.working_hours_calculation_based_on)
-		if cint(self.enable_entry_grace_period) and in_time and in_time > logs[0].shift_start + timedelta(minutes=cint(self.late_entry_grace_period)):
+		total_working_hours, in_time, out_time = calculate_working_hours(
+			logs, self.determine_check_in_and_check_out, self.working_hours_calculation_based_on
+		)
+		if (
+			cint(self.enable_entry_grace_period)
+			and in_time
+			and in_time > logs[0].shift_start + timedelta(minutes=cint(self.late_entry_grace_period))
+		):
 			late_entry = True
 
-		if cint(self.enable_exit_grace_period) and out_time and out_time < logs[0].shift_end - timedelta(minutes=cint(self.early_exit_grace_period)):
+		if (
+			cint(self.enable_exit_grace_period)
+			and out_time
+			and out_time < logs[0].shift_end - timedelta(minutes=cint(self.early_exit_grace_period))
+		):
 			early_exit = True
 
-		if self.working_hours_threshold_for_absent and total_working_hours < self.working_hours_threshold_for_absent:
-			return 'Absent', total_working_hours, late_entry, early_exit, in_time, out_time
-		if self.working_hours_threshold_for_half_day and total_working_hours < self.working_hours_threshold_for_half_day:
-			return 'Half Day', total_working_hours, late_entry, early_exit, in_time, out_time
-		return 'Present', total_working_hours, late_entry, early_exit, in_time, out_time
+		if (
+			self.working_hours_threshold_for_absent
+			and total_working_hours < self.working_hours_threshold_for_absent
+		):
+			return "Absent", total_working_hours, late_entry, early_exit, in_time, out_time
+		if (
+			self.working_hours_threshold_for_half_day
+			and total_working_hours < self.working_hours_threshold_for_half_day
+		):
+			return "Half Day", total_working_hours, late_entry, early_exit, in_time, out_time
+		return "Present", total_working_hours, late_entry, early_exit, in_time, out_time
 
 	def mark_absent_for_dates_with_no_attendance(self, employee):
 		"""Marks Absents for the given employee on working days in this shift which have no attendance marked.
 		The Absent is marked starting from 'process_attendance_after' or employee creation date.
 		"""
-		date_of_joining, relieving_date, employee_creation = frappe.db.get_value("Employee", employee, ["date_of_joining", "relieving_date", "creation"])
+		date_of_joining, relieving_date, employee_creation = frappe.db.get_value(
+			"Employee", employee, ["date_of_joining", "relieving_date", "creation"]
+		)
 		if not date_of_joining:
 			date_of_joining = employee_creation.date()
 		start_date = max(getdate(self.process_attendance_after), date_of_joining)
-		actual_shift_datetime = get_actual_start_end_datetime_of_shift(employee, get_datetime(self.last_sync_of_checkin), True)
-		last_shift_time = actual_shift_datetime[0] if actual_shift_datetime[0] else get_datetime(self.last_sync_of_checkin)
-		prev_shift = get_employee_shift(employee, last_shift_time.date()-timedelta(days=1), True, 'reverse')
+		actual_shift_datetime = get_actual_start_end_datetime_of_shift(
+			employee, get_datetime(self.last_sync_of_checkin), True
+		)
+		last_shift_time = (
+			actual_shift_datetime[0]
+			if actual_shift_datetime[0]
+			else get_datetime(self.last_sync_of_checkin)
+		)
+		prev_shift = get_employee_shift(
+			employee, last_shift_time.date() - timedelta(days=1), True, "reverse"
+		)
 		if prev_shift:
-			end_date = min(prev_shift.start_datetime.date(), relieving_date) if relieving_date else prev_shift.start_datetime.date()
+			end_date = (
+				min(prev_shift.start_datetime.date(), relieving_date)
+				if relieving_date
+				else prev_shift.start_datetime.date()
+			)
 		else:
 			return
 		holiday_list_name = self.holiday_list
@@ -84,37 +139,40 @@
 		for date in dates:
 			shift_details = get_employee_shift(employee, date, True)
 			if shift_details and shift_details.shift_type.name == self.name:
-				mark_attendance(employee, date, 'Absent', self.name)
+				mark_attendance(employee, date, "Absent", self.name)
 
 	def get_assigned_employee(self, from_date=None, consider_default_shift=False):
-		filters = {'start_date':('>', from_date), 'shift_type': self.name, 'docstatus': '1'}
+		filters = {"start_date": (">", from_date), "shift_type": self.name, "docstatus": "1"}
 		if not from_date:
 			del filters["start_date"]
 
-		assigned_employees = frappe.get_all('Shift Assignment', 'employee', filters, as_list=True)
+		assigned_employees = frappe.get_all("Shift Assignment", "employee", filters, as_list=True)
 		assigned_employees = [x[0] for x in assigned_employees]
 
 		if consider_default_shift:
-			filters = {'default_shift': self.name, 'status': ['!=', 'Inactive']}
-			default_shift_employees = frappe.get_all('Employee', 'name', filters, as_list=True)
+			filters = {"default_shift": self.name, "status": ["!=", "Inactive"]}
+			default_shift_employees = frappe.get_all("Employee", "name", filters, as_list=True)
 			default_shift_employees = [x[0] for x in default_shift_employees]
-			return list(set(assigned_employees+default_shift_employees))
+			return list(set(assigned_employees + default_shift_employees))
 		return assigned_employees
 
+
 def process_auto_attendance_for_all_shifts():
-	shift_list = frappe.get_all('Shift Type', 'name', {'enable_auto_attendance':'1'}, as_list=True)
+	shift_list = frappe.get_all("Shift Type", "name", {"enable_auto_attendance": "1"}, as_list=True)
 	for shift in shift_list:
-		doc = frappe.get_doc('Shift Type', shift[0])
+		doc = frappe.get_doc("Shift Type", shift[0])
 		doc.process_auto_attendance()
 
-def get_filtered_date_list(employee, start_date, end_date, filter_attendance=True, holiday_list=None):
-	"""Returns a list of dates after removing the dates with attendance and holidays
-	"""
+
+def get_filtered_date_list(
+	employee, start_date, end_date, filter_attendance=True, holiday_list=None
+):
+	"""Returns a list of dates after removing the dates with attendance and holidays"""
 	base_dates_query = """select adddate(%(start_date)s, t2.i*100 + t1.i*10 + t0.i) selected_date from
 		(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 		(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 		(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2"""
-	condition_query = ''
+	condition_query = ""
 	if filter_attendance:
 		condition_query += """ and a.selected_date not in (
 			select attendance_date from `tabAttendance`
@@ -126,10 +184,20 @@
     		parentfield = 'holidays' and parent = %(holiday_list)s
     		and holiday_date between %(start_date)s and %(end_date)s)"""
 
-	dates = frappe.db.sql("""select * from
+	dates = frappe.db.sql(
+		"""select * from
 		({base_dates_query}) as a
 		where a.selected_date <= %(end_date)s {condition_query}
-		""".format(base_dates_query=base_dates_query, condition_query=condition_query),
-		{"employee":employee, "start_date":start_date, "end_date":end_date, "holiday_list":holiday_list}, as_list=True)
+		""".format(
+			base_dates_query=base_dates_query, condition_query=condition_query
+		),
+		{
+			"employee": employee,
+			"start_date": start_date,
+			"end_date": end_date,
+			"holiday_list": holiday_list,
+		},
+		as_list=True,
+	)
 
 	return [getdate(date[0]) for date in dates]
diff --git a/erpnext/hr/doctype/shift_type/shift_type_dashboard.py b/erpnext/hr/doctype/shift_type/shift_type_dashboard.py
index 919da2d..920d8fd 100644
--- a/erpnext/hr/doctype/shift_type/shift_type_dashboard.py
+++ b/erpnext/hr/doctype/shift_type/shift_type_dashboard.py
@@ -1,13 +1,8 @@
 def get_data():
 	return {
-		'fieldname': 'shift',
-		'non_standard_fieldnames': {
-			'Shift Request': 'shift_type',
-			'Shift Assignment': 'shift_type'
-		},
-		'transactions': [
-			{
-				'items': ['Attendance', 'Employee Checkin', 'Shift Request', 'Shift Assignment']
-			}
-		]
+		"fieldname": "shift",
+		"non_standard_fieldnames": {"Shift Request": "shift_type", "Shift Assignment": "shift_type"},
+		"transactions": [
+			{"items": ["Attendance", "Employee Checkin", "Shift Request", "Shift Assignment"]}
+		],
 	}
diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.py b/erpnext/hr/doctype/staffing_plan/staffing_plan.py
index 7b2ea21..93a493c 100644
--- a/erpnext/hr/doctype/staffing_plan/staffing_plan.py
+++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.py
@@ -9,8 +9,13 @@
 from frappe.utils.nestedset import get_descendants_of
 
 
-class SubsidiaryCompanyError(frappe.ValidationError): pass
-class ParentCompanyError(frappe.ValidationError): pass
+class SubsidiaryCompanyError(frappe.ValidationError):
+	pass
+
+
+class ParentCompanyError(frappe.ValidationError):
+	pass
+
 
 class StaffingPlan(Document):
 	def validate(self):
@@ -33,11 +38,11 @@
 		self.total_estimated_budget = 0
 
 		for detail in self.get("staffing_details"):
-			#Set readonly fields
+			# Set readonly fields
 			self.set_number_of_positions(detail)
 			designation_counts = get_designation_counts(detail.designation, self.company)
-			detail.current_count = designation_counts['employee_count']
-			detail.current_openings = designation_counts['job_openings']
+			detail.current_count = designation_counts["employee_count"]
+			detail.current_openings = designation_counts["job_openings"]
 
 			detail.total_estimated_cost = 0
 			if detail.number_of_positions > 0:
@@ -52,80 +57,122 @@
 	def validate_overlap(self, staffing_plan_detail):
 		# Validate if any submitted Staffing Plan exist for any Designations in this plan
 		# and spd.vacancies>0 ?
-		overlap = frappe.db.sql("""select spd.parent
+		overlap = frappe.db.sql(
+			"""select spd.parent
 			from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name
 			where spd.designation=%s and sp.docstatus=1
 			and sp.to_date >= %s and sp.from_date <= %s and sp.company = %s
-		""", (staffing_plan_detail.designation, self.from_date, self.to_date, self.company))
-		if overlap and overlap [0][0]:
-			frappe.throw(_("Staffing Plan {0} already exist for designation {1}")
-				.format(overlap[0][0], staffing_plan_detail.designation))
+		""",
+			(staffing_plan_detail.designation, self.from_date, self.to_date, self.company),
+		)
+		if overlap and overlap[0][0]:
+			frappe.throw(
+				_("Staffing Plan {0} already exist for designation {1}").format(
+					overlap[0][0], staffing_plan_detail.designation
+				)
+			)
 
 	def validate_with_parent_plan(self, staffing_plan_detail):
-		if not frappe.get_cached_value('Company',  self.company,  "parent_company"):
-			return # No parent, nothing to validate
+		if not frappe.get_cached_value("Company", self.company, "parent_company"):
+			return  # No parent, nothing to validate
 
 		# Get staffing plan applicable for the company (Parent Company)
-		parent_plan_details = get_active_staffing_plan_details(self.company, staffing_plan_detail.designation, self.from_date, self.to_date)
+		parent_plan_details = get_active_staffing_plan_details(
+			self.company, staffing_plan_detail.designation, self.from_date, self.to_date
+		)
 		if not parent_plan_details:
-			return #no staffing plan for any parent Company in hierarchy
+			return  # no staffing plan for any parent Company in hierarchy
 
 		# Fetch parent company which owns the staffing plan. NOTE: Parent could be higher up in the hierarchy
 		parent_company = frappe.db.get_value("Staffing Plan", parent_plan_details[0].name, "company")
 		# Parent plan available, validate with parent, siblings as well as children of staffing plan Company
-		if cint(staffing_plan_detail.vacancies) > cint(parent_plan_details[0].vacancies) or \
-			flt(staffing_plan_detail.total_estimated_cost) > flt(parent_plan_details[0].total_estimated_cost):
-			frappe.throw(_("You can only plan for upto {0} vacancies and budget {1} \
-				for {2} as per staffing plan {3} for parent company {4}.").format(
+		if cint(staffing_plan_detail.vacancies) > cint(parent_plan_details[0].vacancies) or flt(
+			staffing_plan_detail.total_estimated_cost
+		) > flt(parent_plan_details[0].total_estimated_cost):
+			frappe.throw(
+				_(
+					"You can only plan for upto {0} vacancies and budget {1} \
+				for {2} as per staffing plan {3} for parent company {4}."
+				).format(
 					cint(parent_plan_details[0].vacancies),
 					parent_plan_details[0].total_estimated_cost,
 					frappe.bold(staffing_plan_detail.designation),
 					parent_plan_details[0].name,
-					parent_company), ParentCompanyError)
+					parent_company,
+				),
+				ParentCompanyError,
+			)
 
-		#Get vacanices already planned for all companies down the hierarchy of Parent Company
-		lft, rgt = frappe.get_cached_value('Company',  parent_company,  ["lft", "rgt"])
-		all_sibling_details = frappe.db.sql("""select sum(spd.vacancies) as vacancies,
+		# Get vacanices already planned for all companies down the hierarchy of Parent Company
+		lft, rgt = frappe.get_cached_value("Company", parent_company, ["lft", "rgt"])
+		all_sibling_details = frappe.db.sql(
+			"""select sum(spd.vacancies) as vacancies,
 			sum(spd.total_estimated_cost) as total_estimated_cost
 			from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name
 			where spd.designation=%s and sp.docstatus=1
 			and sp.to_date >= %s and sp.from_date <=%s
 			and sp.company in (select name from tabCompany where lft > %s and rgt < %s)
-		""", (staffing_plan_detail.designation, self.from_date, self.to_date, lft, rgt), as_dict = 1)[0]
+		""",
+			(staffing_plan_detail.designation, self.from_date, self.to_date, lft, rgt),
+			as_dict=1,
+		)[0]
 
-		if (cint(parent_plan_details[0].vacancies) < \
-			(cint(staffing_plan_detail.vacancies) + cint(all_sibling_details.vacancies))) or \
-			(flt(parent_plan_details[0].total_estimated_cost) < \
-			(flt(staffing_plan_detail.total_estimated_cost) + flt(all_sibling_details.total_estimated_cost))):
-			frappe.throw(_("{0} vacancies and {1} budget for {2} already planned for subsidiary companies of {3}. \
-				You can only plan for upto {4} vacancies and and budget {5} as per staffing plan {6} for parent company {3}.").format(
+		if (
+			cint(parent_plan_details[0].vacancies)
+			< (cint(staffing_plan_detail.vacancies) + cint(all_sibling_details.vacancies))
+		) or (
+			flt(parent_plan_details[0].total_estimated_cost)
+			< (
+				flt(staffing_plan_detail.total_estimated_cost) + flt(all_sibling_details.total_estimated_cost)
+			)
+		):
+			frappe.throw(
+				_(
+					"{0} vacancies and {1} budget for {2} already planned for subsidiary companies of {3}. \
+				You can only plan for upto {4} vacancies and and budget {5} as per staffing plan {6} for parent company {3}."
+				).format(
 					cint(all_sibling_details.vacancies),
 					all_sibling_details.total_estimated_cost,
 					frappe.bold(staffing_plan_detail.designation),
 					parent_company,
 					cint(parent_plan_details[0].vacancies),
 					parent_plan_details[0].total_estimated_cost,
-					parent_plan_details[0].name))
+					parent_plan_details[0].name,
+				)
+			)
 
 	def validate_with_subsidiary_plans(self, staffing_plan_detail):
-		#Valdate this plan with all child company plan
-		children_details = frappe.db.sql("""select sum(spd.vacancies) as vacancies,
+		# Valdate this plan with all child company plan
+		children_details = frappe.db.sql(
+			"""select sum(spd.vacancies) as vacancies,
 			sum(spd.total_estimated_cost) as total_estimated_cost
 			from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name
 			where spd.designation=%s and sp.docstatus=1
 			and sp.to_date >= %s and sp.from_date <=%s
 			and sp.company in (select name from tabCompany where parent_company = %s)
-		""", (staffing_plan_detail.designation, self.from_date, self.to_date, self.company), as_dict = 1)[0]
+		""",
+			(staffing_plan_detail.designation, self.from_date, self.to_date, self.company),
+			as_dict=1,
+		)[0]
 
-		if children_details and \
-			cint(staffing_plan_detail.vacancies) < cint(children_details.vacancies) or \
-			flt(staffing_plan_detail.total_estimated_cost) < flt(children_details.total_estimated_cost):
-			frappe.throw(_("Subsidiary companies have already planned for {1} vacancies at a budget of {2}. \
-				Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies").format(
+		if (
+			children_details
+			and cint(staffing_plan_detail.vacancies) < cint(children_details.vacancies)
+			or flt(staffing_plan_detail.total_estimated_cost) < flt(children_details.total_estimated_cost)
+		):
+			frappe.throw(
+				_(
+					"Subsidiary companies have already planned for {1} vacancies at a budget of {2}. \
+				Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies"
+				).format(
 					self.company,
 					cint(children_details.vacancies),
 					children_details.total_estimated_cost,
-					frappe.bold(staffing_plan_detail.designation)), SubsidiaryCompanyError)
+					frappe.bold(staffing_plan_detail.designation),
+				),
+				SubsidiaryCompanyError,
+			)
+
 
 @frappe.whitelist()
 def get_designation_counts(designation, company):
@@ -133,25 +180,24 @@
 		return False
 
 	employee_counts = {}
-	company_set = get_descendants_of('Company', company)
+	company_set = get_descendants_of("Company", company)
 	company_set.append(company)
 
-	employee_counts["employee_count"] = frappe.db.get_value("Employee",
-		filters={
-			'designation': designation,
-			'status': 'Active',
-			'company': ('in', company_set)
-		}, fieldname=['count(name)'])
+	employee_counts["employee_count"] = frappe.db.get_value(
+		"Employee",
+		filters={"designation": designation, "status": "Active", "company": ("in", company_set)},
+		fieldname=["count(name)"],
+	)
 
-	employee_counts['job_openings'] = frappe.db.get_value("Job Opening",
-		filters={
-			'designation': designation,
-			'status': 'Open',
-			'company': ('in', company_set)
-		}, fieldname=['count(name)'])
+	employee_counts["job_openings"] = frappe.db.get_value(
+		"Job Opening",
+		filters={"designation": designation, "status": "Open", "company": ("in", company_set)},
+		fieldname=["count(name)"],
+	)
 
 	return employee_counts
 
+
 @frappe.whitelist()
 def get_active_staffing_plan_details(company, designation, from_date=None, to_date=None):
 	if from_date is None:
@@ -161,17 +207,22 @@
 	if not company or not designation:
 		frappe.throw(_("Please select Company and Designation"))
 
-	staffing_plan = frappe.db.sql("""
+	staffing_plan = frappe.db.sql(
+		"""
 		select sp.name, spd.vacancies, spd.total_estimated_cost
 		from `tabStaffing Plan Detail` spd join `tabStaffing Plan` sp on spd.parent=sp.name
 		where company=%s and spd.designation=%s and sp.docstatus=1
-		and to_date >= %s and from_date <= %s """, (company, designation, from_date, to_date), as_dict = 1)
+		and to_date >= %s and from_date <= %s """,
+		(company, designation, from_date, to_date),
+		as_dict=1,
+	)
 
 	if not staffing_plan:
-		parent_company = frappe.get_cached_value('Company',  company,  "parent_company")
+		parent_company = frappe.get_cached_value("Company", company, "parent_company")
 		if parent_company:
-			staffing_plan = get_active_staffing_plan_details(parent_company,
-				designation, from_date, to_date)
+			staffing_plan = get_active_staffing_plan_details(
+				parent_company, designation, from_date, to_date
+			)
 
 	# Only a single staffing plan can be active for a designation on given date
 	return staffing_plan if staffing_plan else None
diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan_dashboard.py b/erpnext/hr/doctype/staffing_plan/staffing_plan_dashboard.py
index abde0d5..0f555d9 100644
--- a/erpnext/hr/doctype/staffing_plan/staffing_plan_dashboard.py
+++ b/erpnext/hr/doctype/staffing_plan/staffing_plan_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
-     return {
-        'fieldname': 'staffing_plan',
-        'transactions': [
-            {
-                'items': ['Job Opening']
-            }
-        ],
-    }
+	return {
+		"fieldname": "staffing_plan",
+		"transactions": [{"items": ["Job Opening"]}],
+	}
diff --git a/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py
index 8ff0dbb..a3adbbd 100644
--- a/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py
+++ b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py
@@ -13,6 +13,7 @@
 
 test_dependencies = ["Designation"]
 
+
 class TestStaffingPlan(unittest.TestCase):
 	def test_staffing_plan(self):
 		_set_up()
@@ -24,11 +25,10 @@
 		staffing_plan.name = "Test"
 		staffing_plan.from_date = nowdate()
 		staffing_plan.to_date = add_days(nowdate(), 10)
-		staffing_plan.append("staffing_details", {
-			"designation": "Designer",
-			"vacancies": 6,
-			"estimated_cost_per_position": 50000
-		})
+		staffing_plan.append(
+			"staffing_details",
+			{"designation": "Designer", "vacancies": 6, "estimated_cost_per_position": 50000},
+		)
 		staffing_plan.insert()
 		staffing_plan.submit()
 		self.assertEqual(staffing_plan.total_estimated_budget, 300000.00)
@@ -42,11 +42,10 @@
 		staffing_plan.name = "Test 1"
 		staffing_plan.from_date = nowdate()
 		staffing_plan.to_date = add_days(nowdate(), 10)
-		staffing_plan.append("staffing_details", {
-			"designation": "Designer",
-			"vacancies": 3,
-			"estimated_cost_per_position": 45000
-		})
+		staffing_plan.append(
+			"staffing_details",
+			{"designation": "Designer", "vacancies": 3, "estimated_cost_per_position": 45000},
+		)
 		self.assertRaises(SubsidiaryCompanyError, staffing_plan.insert)
 
 	def test_staffing_plan_parent_company(self):
@@ -58,11 +57,10 @@
 		staffing_plan.name = "Test"
 		staffing_plan.from_date = nowdate()
 		staffing_plan.to_date = add_days(nowdate(), 10)
-		staffing_plan.append("staffing_details", {
-			"designation": "Designer",
-			"vacancies": 7,
-			"estimated_cost_per_position": 50000
-		})
+		staffing_plan.append(
+			"staffing_details",
+			{"designation": "Designer", "vacancies": 7, "estimated_cost_per_position": 50000},
+		)
 		staffing_plan.insert()
 		staffing_plan.submit()
 		self.assertEqual(staffing_plan.total_estimated_budget, 350000.00)
@@ -73,19 +71,20 @@
 		staffing_plan.name = "Test 1"
 		staffing_plan.from_date = nowdate()
 		staffing_plan.to_date = add_days(nowdate(), 10)
-		staffing_plan.append("staffing_details", {
-			"designation": "Designer",
-			"vacancies": 7,
-			"estimated_cost_per_position": 60000
-		})
+		staffing_plan.append(
+			"staffing_details",
+			{"designation": "Designer", "vacancies": 7, "estimated_cost_per_position": 60000},
+		)
 		staffing_plan.insert()
 		self.assertRaises(ParentCompanyError, staffing_plan.submit)
 
+
 def _set_up():
 	for doctype in ["Staffing Plan", "Staffing Plan Detail"]:
 		frappe.db.sql("delete from `tab{doctype}`".format(doctype=doctype))
 	make_company()
 
+
 def make_company():
 	if frappe.db.exists("Company", "_Test Company 10"):
 		return
diff --git a/erpnext/hr/doctype/training_event/test_training_event.py b/erpnext/hr/doctype/training_event/test_training_event.py
index f4329c9..ec7eb74 100644
--- a/erpnext/hr/doctype/training_event/test_training_event.py
+++ b/erpnext/hr/doctype/training_event/test_training_event.py
@@ -14,10 +14,7 @@
 		create_training_program("Basic Training")
 		employee = make_employee("robert_loan@trainig.com")
 		employee2 = make_employee("suzie.tan@trainig.com")
-		self.attendees = [
-			{"employee": employee},
-			{"employee": employee2}
-		]
+		self.attendees = [{"employee": employee}, {"employee": employee2}]
 
 	def test_training_event_status_update(self):
 		training_event = create_training_event(self.attendees)
@@ -43,20 +40,25 @@
 
 def create_training_program(training_program):
 	if not frappe.db.get_value("Training Program", training_program):
-		frappe.get_doc({
-			"doctype": "Training Program",
-			"training_program": training_program,
-			"description": training_program
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Training Program",
+				"training_program": training_program,
+				"description": training_program,
+			}
+		).insert()
+
 
 def create_training_event(attendees):
-	return frappe.get_doc({
-		"doctype": "Training Event",
-		"event_name": "Basic Training Event",
-		"training_program": "Basic Training",
-		"location": "Union Square",
-		"start_time": add_days(today(), 5),
-		"end_time": add_days(today(), 6),
-		"introduction": "Welcome to the Basic Training Event",
-		"employees": attendees
-	}).insert()
+	return frappe.get_doc(
+		{
+			"doctype": "Training Event",
+			"event_name": "Basic Training Event",
+			"training_program": "Basic Training",
+			"location": "Union Square",
+			"start_time": add_days(today(), 5),
+			"end_time": add_days(today(), 6),
+			"introduction": "Welcome to the Basic Training Event",
+			"employees": attendees,
+		}
+	).insert()
diff --git a/erpnext/hr/doctype/training_event/training_event.py b/erpnext/hr/doctype/training_event/training_event.py
index c8c8bbe..59972bb 100644
--- a/erpnext/hr/doctype/training_event/training_event.py
+++ b/erpnext/hr/doctype/training_event/training_event.py
@@ -19,21 +19,20 @@
 		self.set_status_for_attendees()
 
 	def set_employee_emails(self):
-		self.employee_emails = ', '.join(get_employee_emails([d.employee
-			for d in self.employees]))
+		self.employee_emails = ", ".join(get_employee_emails([d.employee for d in self.employees]))
 
 	def validate_period(self):
 		if time_diff_in_seconds(self.end_time, self.start_time) <= 0:
-			frappe.throw(_('End time cannot be before start time'))
+			frappe.throw(_("End time cannot be before start time"))
 
 	def set_status_for_attendees(self):
-		if self.event_status == 'Completed':
+		if self.event_status == "Completed":
 			for employee in self.employees:
-				if employee.attendance == 'Present' and employee.status != 'Feedback Submitted':
-					employee.status = 'Completed'
+				if employee.attendance == "Present" and employee.status != "Feedback Submitted":
+					employee.status = "Completed"
 
-		elif self.event_status == 'Scheduled':
+		elif self.event_status == "Scheduled":
 			for employee in self.employees:
-				employee.status = 'Open'
+				employee.status = "Open"
 
 		self.db_update_all()
diff --git a/erpnext/hr/doctype/training_event/training_event_dashboard.py b/erpnext/hr/doctype/training_event/training_event_dashboard.py
index 141fffc..ca13938 100644
--- a/erpnext/hr/doctype/training_event/training_event_dashboard.py
+++ b/erpnext/hr/doctype/training_event/training_event_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'training_event',
-        'transactions': [
-            {
-                'items': ['Training Result', 'Training Feedback']
-            },
-        ],
-    }
+	return {
+		"fieldname": "training_event",
+		"transactions": [
+			{"items": ["Training Result", "Training Feedback"]},
+		],
+	}
diff --git a/erpnext/hr/doctype/training_feedback/test_training_feedback.py b/erpnext/hr/doctype/training_feedback/test_training_feedback.py
index 58ed623..c787b70 100644
--- a/erpnext/hr/doctype/training_feedback/test_training_feedback.py
+++ b/erpnext/hr/doctype/training_feedback/test_training_feedback.py
@@ -32,10 +32,9 @@
 		self.assertRaises(frappe.ValidationError, feedback.save)
 
 		# cannot record feedback for absent employee
-		employee = frappe.db.get_value("Training Event Employee", {
-			"parent": training_event.name,
-			"employee": self.employee
-		}, "name")
+		employee = frappe.db.get_value(
+			"Training Event Employee", {"parent": training_event.name, "employee": self.employee}, "name"
+		)
 
 		frappe.db.set_value("Training Event Employee", employee, "attendance", "Absent")
 		feedback = create_training_feedback(training_event.name, self.employee)
@@ -52,10 +51,9 @@
 		feedback = create_training_feedback(training_event.name, self.employee)
 		feedback.submit()
 
-		status = frappe.db.get_value("Training Event Employee", {
-			"parent": training_event.name,
-			"employee": self.employee
-		}, "status")
+		status = frappe.db.get_value(
+			"Training Event Employee", {"parent": training_event.name, "employee": self.employee}, "status"
+		)
 
 		self.assertEqual(status, "Feedback Submitted")
 
@@ -64,9 +62,11 @@
 
 
 def create_training_feedback(event, employee):
-	return frappe.get_doc({
-		"doctype": "Training Feedback",
-		"training_event": event,
-		"employee": employee,
-		"feedback": "Test"
-	})
+	return frappe.get_doc(
+		{
+			"doctype": "Training Feedback",
+			"training_event": event,
+			"employee": employee,
+			"feedback": "Test",
+		}
+	)
diff --git a/erpnext/hr/doctype/training_feedback/training_feedback.py b/erpnext/hr/doctype/training_feedback/training_feedback.py
index 1f9ec3b..d5de28e 100644
--- a/erpnext/hr/doctype/training_feedback/training_feedback.py
+++ b/erpnext/hr/doctype/training_feedback/training_feedback.py
@@ -13,32 +13,35 @@
 		if training_event.docstatus != 1:
 			frappe.throw(_("{0} must be submitted").format(_("Training Event")))
 
-		emp_event_details = frappe.db.get_value("Training Event Employee", {
-			"parent": self.training_event,
-			"employee": self.employee
-		}, ["name", "attendance"], as_dict=True)
+		emp_event_details = frappe.db.get_value(
+			"Training Event Employee",
+			{"parent": self.training_event, "employee": self.employee},
+			["name", "attendance"],
+			as_dict=True,
+		)
 
 		if not emp_event_details:
-			frappe.throw(_("Employee {0} not found in Training Event Participants.").format(
-				frappe.bold(self.employee_name)))
+			frappe.throw(
+				_("Employee {0} not found in Training Event Participants.").format(
+					frappe.bold(self.employee_name)
+				)
+			)
 
 		if emp_event_details.attendance == "Absent":
 			frappe.throw(_("Feedback cannot be recorded for an absent Employee."))
 
 	def on_submit(self):
-		employee = frappe.db.get_value("Training Event Employee", {
-			"parent": self.training_event,
-			"employee": self.employee
-		})
+		employee = frappe.db.get_value(
+			"Training Event Employee", {"parent": self.training_event, "employee": self.employee}
+		)
 
 		if employee:
 			frappe.db.set_value("Training Event Employee", employee, "status", "Feedback Submitted")
 
 	def on_cancel(self):
-		employee = frappe.db.get_value("Training Event Employee", {
-			"parent": self.training_event,
-			"employee": self.employee
-		})
+		employee = frappe.db.get_value(
+			"Training Event Employee", {"parent": self.training_event, "employee": self.employee}
+		)
 
 		if employee:
 			frappe.db.set_value("Training Event Employee", employee, "status", "Completed")
diff --git a/erpnext/hr/doctype/training_program/training_program_dashboard.py b/erpnext/hr/doctype/training_program/training_program_dashboard.py
index 374c1e8..1735db1 100644
--- a/erpnext/hr/doctype/training_program/training_program_dashboard.py
+++ b/erpnext/hr/doctype/training_program/training_program_dashboard.py
@@ -3,11 +3,8 @@
 
 def get_data():
 	return {
-		'fieldname': 'training_program',
-		'transactions': [
-			{
-				'label': _('Training Events'),
-				'items': ['Training Event']
-			},
-		]
+		"fieldname": "training_program",
+		"transactions": [
+			{"label": _("Training Events"), "items": ["Training Event"]},
+		],
 	}
diff --git a/erpnext/hr/doctype/training_result/test_training_result.py b/erpnext/hr/doctype/training_result/test_training_result.py
index 1735ff4..136543c 100644
--- a/erpnext/hr/doctype/training_result/test_training_result.py
+++ b/erpnext/hr/doctype/training_result/test_training_result.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Training Result')
 
+
 class TestTrainingResult(unittest.TestCase):
 	pass
diff --git a/erpnext/hr/doctype/training_result/training_result.py b/erpnext/hr/doctype/training_result/training_result.py
index bb5c71e..48a5b2c 100644
--- a/erpnext/hr/doctype/training_result/training_result.py
+++ b/erpnext/hr/doctype/training_result/training_result.py
@@ -13,22 +13,22 @@
 	def validate(self):
 		training_event = frappe.get_doc("Training Event", self.training_event)
 		if training_event.docstatus != 1:
-			frappe.throw(_('{0} must be submitted').format(_('Training Event')))
+			frappe.throw(_("{0} must be submitted").format(_("Training Event")))
 
-		self.employee_emails = ', '.join(get_employee_emails([d.employee
-			for d in self.employees]))
+		self.employee_emails = ", ".join(get_employee_emails([d.employee for d in self.employees]))
 
 	def on_submit(self):
 		training_event = frappe.get_doc("Training Event", self.training_event)
-		training_event.status = 'Completed'
+		training_event.status = "Completed"
 		for e in self.employees:
 			for e1 in training_event.employees:
 				if e1.employee == e.employee:
-					e1.status = 'Completed'
+					e1.status = "Completed"
 					break
 
 		training_event.save()
 
+
 @frappe.whitelist()
 def get_employees(training_event):
 	return frappe.get_doc("Training Event", training_event).employees
diff --git a/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py b/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
index 4c7bd80..537c206 100644
--- a/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
+++ b/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
@@ -10,12 +10,15 @@
 from erpnext.hr.doctype.employee.test_employee import make_employee
 from erpnext.hr.doctype.upload_attendance.upload_attendance import get_data
 
-test_dependencies = ['Holiday List']
+test_dependencies = ["Holiday List"]
+
 
 class TestUploadAttendance(unittest.TestCase):
 	@classmethod
 	def setUpClass(cls):
-		frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", '_Test Holiday List')
+		frappe.db.set_value(
+			"Company", erpnext.get_default_company(), "default_holiday_list", "_Test Holiday List"
+		)
 
 	def test_date_range(self):
 		employee = make_employee("test_employee@company.com")
@@ -27,14 +30,13 @@
 		employee_doc.date_of_joining = date_of_joining
 		employee_doc.relieving_date = relieving_date
 		employee_doc.save()
-		args = {
-			"from_date": from_date,
-			"to_date": to_date
-		}
+		args = {"from_date": from_date, "to_date": to_date}
 		data = get_data(args)
 		filtered_data = []
 		for row in data:
 			if row[1] == employee:
 				filtered_data.append(row)
 		for row in filtered_data:
-			self.assertTrue(getdate(row[3]) >= getdate(date_of_joining) and getdate(row[3]) <= getdate(relieving_date))
+			self.assertTrue(
+				getdate(row[3]) >= getdate(date_of_joining) and getdate(row[3]) <= getdate(relieving_date)
+			)
diff --git a/erpnext/hr/doctype/upload_attendance/upload_attendance.py b/erpnext/hr/doctype/upload_attendance/upload_attendance.py
index 94eb300..a66a481 100644
--- a/erpnext/hr/doctype/upload_attendance/upload_attendance.py
+++ b/erpnext/hr/doctype/upload_attendance/upload_attendance.py
@@ -17,6 +17,7 @@
 class UploadAttendance(Document):
 	pass
 
+
 @frappe.whitelist()
 def get_template():
 	if not frappe.has_permission("Attendance", "create"):
@@ -38,29 +39,37 @@
 		return
 
 	# write out response as a type csv
-	frappe.response['result'] = cstr(w.getvalue())
-	frappe.response['type'] = 'csv'
-	frappe.response['doctype'] = "Attendance"
+	frappe.response["result"] = cstr(w.getvalue())
+	frappe.response["type"] = "csv"
+	frappe.response["doctype"] = "Attendance"
+
 
 def add_header(w):
-	status = ", ".join((frappe.get_meta("Attendance").get_field("status").options or "").strip().split("\n"))
+	status = ", ".join(
+		(frappe.get_meta("Attendance").get_field("status").options or "").strip().split("\n")
+	)
 	w.writerow(["Notes:"])
 	w.writerow(["Please do not change the template headings"])
 	w.writerow(["Status should be one of these values: " + status])
 	w.writerow(["If you are overwriting existing attendance records, 'ID' column mandatory"])
-	w.writerow(["ID", "Employee", "Employee Name", "Date", "Status", "Leave Type",
-		 "Company", "Naming Series"])
+	w.writerow(
+		["ID", "Employee", "Employee Name", "Date", "Status", "Leave Type", "Company", "Naming Series"]
+	)
 	return w
 
+
 def add_data(w, args):
 	data = get_data(args)
 	writedata(w, data)
 	return w
 
+
 def get_data(args):
 	dates = get_dates(args)
 	employees = get_active_employees()
-	holidays = get_holidays_for_employees([employee.name for employee in employees], args["from_date"], args["to_date"])
+	holidays = get_holidays_for_employees(
+		[employee.name for employee in employees], args["from_date"], args["to_date"]
+	)
 	existing_attendance_records = get_existing_attendance_records(args)
 	data = []
 	for date in dates:
@@ -71,27 +80,33 @@
 				if getdate(date) > getdate(employee.relieving_date):
 					continue
 			existing_attendance = {}
-			if existing_attendance_records \
-				and tuple([getdate(date), employee.name]) in existing_attendance_records \
-				and getdate(employee.date_of_joining) <= getdate(date) \
-				and getdate(employee.relieving_date) >= getdate(date):
-					existing_attendance = existing_attendance_records[tuple([getdate(date), employee.name])]
+			if (
+				existing_attendance_records
+				and tuple([getdate(date), employee.name]) in existing_attendance_records
+				and getdate(employee.date_of_joining) <= getdate(date)
+				and getdate(employee.relieving_date) >= getdate(date)
+			):
+				existing_attendance = existing_attendance_records[tuple([getdate(date), employee.name])]
 
 			employee_holiday_list = get_holiday_list_for_employee(employee.name)
 
 			row = [
 				existing_attendance and existing_attendance.name or "",
-				employee.name, employee.employee_name, date,
+				employee.name,
+				employee.employee_name,
+				date,
 				existing_attendance and existing_attendance.status or "",
-				existing_attendance and existing_attendance.leave_type or "", employee.company,
+				existing_attendance and existing_attendance.leave_type or "",
+				employee.company,
 				existing_attendance and existing_attendance.naming_series or get_naming_series(),
 			]
 			if date in holidays[employee_holiday_list]:
-				row[4] =  "Holiday"
+				row[4] = "Holiday"
 			data.append(row)
 
 	return data
 
+
 def get_holidays_for_employees(employees, from_date, to_date):
 	holidays = {}
 	for employee in employees:
@@ -102,30 +117,35 @@
 
 	return holidays
 
+
 def writedata(w, data):
 	for row in data:
 		w.writerow(row)
 
+
 def get_dates(args):
 	"""get list of dates in between from date and to date"""
 	no_of_days = date_diff(add_days(args["to_date"], 1), args["from_date"])
 	dates = [add_days(args["from_date"], i) for i in range(0, no_of_days)]
 	return dates
 
+
 def get_active_employees():
-	employees = frappe.db.get_all('Employee',
-		fields=['name', 'employee_name', 'date_of_joining', 'company', 'relieving_date'],
-		filters={
-			'docstatus': ['<', 2],
-			'status': 'Active'
-		}
+	employees = frappe.db.get_all(
+		"Employee",
+		fields=["name", "employee_name", "date_of_joining", "company", "relieving_date"],
+		filters={"docstatus": ["<", 2], "status": "Active"},
 	)
 	return employees
 
+
 def get_existing_attendance_records(args):
-	attendance = frappe.db.sql("""select name, attendance_date, employee, status, leave_type, naming_series
+	attendance = frappe.db.sql(
+		"""select name, attendance_date, employee, status, leave_type, naming_series
 		from `tabAttendance` where attendance_date between %s and %s and docstatus < 2""",
-		(args["from_date"], args["to_date"]), as_dict=1)
+		(args["from_date"], args["to_date"]),
+		as_dict=1,
+	)
 
 	existing_attendance = {}
 	for att in attendance:
@@ -133,6 +153,7 @@
 
 	return existing_attendance
 
+
 def get_naming_series():
 	series = frappe.get_meta("Attendance").get_field("naming_series").options.strip().split("\n")
 	if not series:
@@ -146,15 +167,16 @@
 		raise frappe.PermissionError
 
 	from frappe.utils.csvutils import read_csv_content
+
 	rows = read_csv_content(frappe.local.uploaded_file)
 	if not rows:
 		frappe.throw(_("Please select a csv file"))
 	frappe.enqueue(import_attendances, rows=rows, now=True if len(rows) < 200 else False)
 
-def import_attendances(rows):
 
+def import_attendances(rows):
 	def remove_holidays(rows):
-		rows = [ row for row in rows if row[4] != "Holiday"]
+		rows = [row for row in rows if row[4] != "Holiday"]
 		return rows
 
 	from frappe.modules import scrub
@@ -172,7 +194,8 @@
 	from frappe.utils.csvutils import check_record, import_doc
 
 	for i, row in enumerate(rows):
-		if not row: continue
+		if not row:
+			continue
 		row_idx = i + 5
 		d = frappe._dict(zip(columns, row))
 
@@ -183,16 +206,12 @@
 		try:
 			check_record(d)
 			ret.append(import_doc(d, "Attendance", 1, row_idx, submit=True))
-			frappe.publish_realtime('import_attendance', dict(
-				progress=i,
-				total=len(rows)
-			))
+			frappe.publish_realtime("import_attendance", dict(progress=i, total=len(rows)))
 		except AttributeError:
 			pass
 		except Exception as e:
 			error = True
-			ret.append('Error for row (#%d) %s : %s' % (row_idx,
-				len(row)>1 and row[1] or "", cstr(e)))
+			ret.append("Error for row (#%d) %s : %s" % (row_idx, len(row) > 1 and row[1] or "", cstr(e)))
 			frappe.errprint(frappe.get_traceback())
 
 	if error:
@@ -200,7 +219,4 @@
 	else:
 		frappe.db.commit()
 
-	frappe.publish_realtime('import_attendance', dict(
-		messages=ret,
-		error=error
-	))
+	frappe.publish_realtime("import_attendance", dict(messages=ret, error=error))
diff --git a/erpnext/hr/doctype/vehicle/test_vehicle.py b/erpnext/hr/doctype/vehicle/test_vehicle.py
index c5ea5a3..97fe651 100644
--- a/erpnext/hr/doctype/vehicle/test_vehicle.py
+++ b/erpnext/hr/doctype/vehicle/test_vehicle.py
@@ -8,18 +8,21 @@
 
 # test_records = frappe.get_test_records('Vehicle')
 
+
 class TestVehicle(unittest.TestCase):
 	def test_make_vehicle(self):
-		vehicle = frappe.get_doc({
-			"doctype": "Vehicle",
-			"license_plate": random_string(10).upper(),
-			"make": "Maruti",
-			"model": "PCM",
-			"last_odometer":5000,
-			"acquisition_date":frappe.utils.nowdate(),
-			"location": "Mumbai",
-			"chassis_no": "1234ABCD",
-			"uom": "Litre",
-			"vehicle_value":frappe.utils.flt(500000)
-		})
+		vehicle = frappe.get_doc(
+			{
+				"doctype": "Vehicle",
+				"license_plate": random_string(10).upper(),
+				"make": "Maruti",
+				"model": "PCM",
+				"last_odometer": 5000,
+				"acquisition_date": frappe.utils.nowdate(),
+				"location": "Mumbai",
+				"chassis_no": "1234ABCD",
+				"uom": "Litre",
+				"vehicle_value": frappe.utils.flt(500000),
+			}
+		)
 		vehicle.insert()
diff --git a/erpnext/hr/doctype/vehicle/vehicle.py b/erpnext/hr/doctype/vehicle/vehicle.py
index 946233b..22c14c3 100644
--- a/erpnext/hr/doctype/vehicle/vehicle.py
+++ b/erpnext/hr/doctype/vehicle/vehicle.py
@@ -15,9 +15,15 @@
 		if getdate(self.carbon_check_date) > getdate():
 			frappe.throw(_("Last carbon check date cannot be a future date"))
 
+
 def get_timeline_data(doctype, name):
-	'''Return timeline for vehicle log'''
-	return dict(frappe.db.sql('''select unix_timestamp(date), count(*)
+	"""Return timeline for vehicle log"""
+	return dict(
+		frappe.db.sql(
+			"""select unix_timestamp(date), count(*)
 	from `tabVehicle Log` where license_plate=%s
 	and date > date_sub(curdate(), interval 1 year)
-	group by date''', name))
+	group by date""",
+			name,
+		)
+	)
diff --git a/erpnext/hr/doctype/vehicle/vehicle_dashboard.py b/erpnext/hr/doctype/vehicle/vehicle_dashboard.py
index f6e5f06..758dfbd 100644
--- a/erpnext/hr/doctype/vehicle/vehicle_dashboard.py
+++ b/erpnext/hr/doctype/vehicle/vehicle_dashboard.py
@@ -3,18 +3,11 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on logs against this Vehicle. See timeline below for details'),
-		'fieldname': 'license_plate',
-		'non_standard_fieldnames':{
-			'Delivery Trip': 'vehicle'
-		},
-		'transactions': [
-			{
-				'items': ['Vehicle Log']
-			},
-			{
-				'items': ['Delivery Trip']
-			}
-		]
+		"heatmap": True,
+		"heatmap_message": _(
+			"This is based on logs against this Vehicle. See timeline below for details"
+		),
+		"fieldname": "license_plate",
+		"non_standard_fieldnames": {"Delivery Trip": "vehicle"},
+		"transactions": [{"items": ["Vehicle Log"]}, {"items": ["Delivery Trip"]}],
 	}
diff --git a/erpnext/hr/doctype/vehicle_log/test_vehicle_log.py b/erpnext/hr/doctype/vehicle_log/test_vehicle_log.py
index abb2887..bb29670 100644
--- a/erpnext/hr/doctype/vehicle_log/test_vehicle_log.py
+++ b/erpnext/hr/doctype/vehicle_log/test_vehicle_log.py
@@ -12,7 +12,9 @@
 
 class TestVehicleLog(unittest.TestCase):
 	def setUp(self):
-		employee_id = frappe.db.sql("""select name from `tabEmployee` where name='testdriver@example.com'""")
+		employee_id = frappe.db.sql(
+			"""select name from `tabEmployee` where name='testdriver@example.com'"""
+		)
 		self.employee_id = employee_id[0][0] if employee_id else None
 
 		if not self.employee_id:
@@ -27,11 +29,11 @@
 	def test_make_vehicle_log_and_syncing_of_odometer_value(self):
 		vehicle_log = make_vehicle_log(self.license_plate, self.employee_id)
 
-		#checking value of vehicle odometer value on submit.
+		# checking value of vehicle odometer value on submit.
 		vehicle = frappe.get_doc("Vehicle", self.license_plate)
 		self.assertEqual(vehicle.last_odometer, vehicle_log.odometer)
 
-		#checking value vehicle odometer on vehicle log cancellation.
+		# checking value vehicle odometer on vehicle log cancellation.
 		last_odometer = vehicle_log.last_odometer
 		current_odometer = vehicle_log.odometer
 		distance_travelled = current_odometer - last_odometer
@@ -48,7 +50,7 @@
 
 		expense_claim = make_expense_claim(vehicle_log.name)
 		fuel_expense = expense_claim.expenses[0].amount
-		self.assertEqual(fuel_expense, 50*500)
+		self.assertEqual(fuel_expense, 50 * 500)
 
 		vehicle_log.cancel()
 		frappe.delete_doc("Expense Claim", expense_claim.name)
@@ -67,8 +69,9 @@
 
 
 def get_vehicle(employee_id):
-	license_plate=random_string(10).upper()
-	vehicle = frappe.get_doc({
+	license_plate = random_string(10).upper()
+	vehicle = frappe.get_doc(
+		{
 			"doctype": "Vehicle",
 			"license_plate": cstr(license_plate),
 			"make": "Maruti",
@@ -79,8 +82,9 @@
 			"location": "Mumbai",
 			"chassis_no": "1234ABCD",
 			"uom": "Litre",
-			"vehicle_value": flt(500000)
-		})
+			"vehicle_value": flt(500000),
+		}
+	)
 	try:
 		vehicle.insert(ignore_if_duplicate=True)
 	except frappe.DuplicateEntryError:
@@ -89,29 +93,37 @@
 
 
 def make_vehicle_log(license_plate, employee_id, with_services=False):
-	vehicle_log = frappe.get_doc({
-		"doctype": "Vehicle Log",
-		"license_plate": cstr(license_plate),
-		"employee": employee_id,
-		"date": nowdate(),
-		"odometer": 5010,
-		"fuel_qty": flt(50),
-		"price": flt(500)
-	})
+	vehicle_log = frappe.get_doc(
+		{
+			"doctype": "Vehicle Log",
+			"license_plate": cstr(license_plate),
+			"employee": employee_id,
+			"date": nowdate(),
+			"odometer": 5010,
+			"fuel_qty": flt(50),
+			"price": flt(500),
+		}
+	)
 
 	if with_services:
-		vehicle_log.append("service_detail", {
-			"service_item": "Oil Change",
-			"type": "Inspection",
-			"frequency": "Mileage",
-			"expense_amount": flt(500)
-		})
-		vehicle_log.append("service_detail", {
-			"service_item": "Wheels",
-			"type": "Change",
-			"frequency": "Half Yearly",
-			"expense_amount": flt(1500)
-		})
+		vehicle_log.append(
+			"service_detail",
+			{
+				"service_item": "Oil Change",
+				"type": "Inspection",
+				"frequency": "Mileage",
+				"expense_amount": flt(500),
+			},
+		)
+		vehicle_log.append(
+			"service_detail",
+			{
+				"service_item": "Wheels",
+				"type": "Change",
+				"frequency": "Half Yearly",
+				"expense_amount": flt(1500),
+			},
+		)
 
 	vehicle_log.save()
 	vehicle_log.submit()
diff --git a/erpnext/hr/doctype/vehicle_log/vehicle_log.py b/erpnext/hr/doctype/vehicle_log/vehicle_log.py
index e414141..2c1d9a4 100644
--- a/erpnext/hr/doctype/vehicle_log/vehicle_log.py
+++ b/erpnext/hr/doctype/vehicle_log/vehicle_log.py
@@ -11,17 +11,24 @@
 class VehicleLog(Document):
 	def validate(self):
 		if flt(self.odometer) < flt(self.last_odometer):
-			frappe.throw(_("Current Odometer Value should be greater than Last Odometer Value {0}").format(self.last_odometer))
+			frappe.throw(
+				_("Current Odometer Value should be greater than Last Odometer Value {0}").format(
+					self.last_odometer
+				)
+			)
 
 	def on_submit(self):
 		frappe.db.set_value("Vehicle", self.license_plate, "last_odometer", self.odometer)
 
 	def on_cancel(self):
 		distance_travelled = self.odometer - self.last_odometer
-		if(distance_travelled > 0):
-			updated_odometer_value = int(frappe.db.get_value("Vehicle", self.license_plate, "last_odometer")) - distance_travelled
+		if distance_travelled > 0:
+			updated_odometer_value = (
+				int(frappe.db.get_value("Vehicle", self.license_plate, "last_odometer")) - distance_travelled
+			)
 			frappe.db.set_value("Vehicle", self.license_plate, "last_odometer", updated_odometer_value)
 
+
 @frappe.whitelist()
 def make_expense_claim(docname):
 	expense_claim = frappe.db.exists("Expense Claim", {"vehicle_log": docname})
@@ -39,9 +46,8 @@
 	exp_claim.employee = vehicle_log.employee
 	exp_claim.vehicle_log = vehicle_log.name
 	exp_claim.remark = _("Expense Claim for Vehicle Log {0}").format(vehicle_log.name)
-	exp_claim.append("expenses", {
-		"expense_date": vehicle_log.date,
-		"description": _("Vehicle Expenses"),
-		"amount": claim_amount
-	})
+	exp_claim.append(
+		"expenses",
+		{"expense_date": vehicle_log.date, "description": _("Vehicle Expenses"), "amount": claim_amount},
+	)
 	return exp_claim.as_dict()
diff --git a/erpnext/hr/page/organizational_chart/organizational_chart.py b/erpnext/hr/page/organizational_chart/organizational_chart.py
index 1e2d758..3674912 100644
--- a/erpnext/hr/page/organizational_chart/organizational_chart.py
+++ b/erpnext/hr/page/organizational_chart/organizational_chart.py
@@ -3,26 +3,27 @@
 
 @frappe.whitelist()
 def get_children(parent=None, company=None, exclude_node=None):
-	filters = [['status', '!=', 'Left']]
-	if company and company != 'All Companies':
-		filters.append(['company', '=', company])
+	filters = [["status", "!=", "Left"]]
+	if company and company != "All Companies":
+		filters.append(["company", "=", company])
 
 	if parent and company and parent != company:
-		filters.append(['reports_to', '=', parent])
+		filters.append(["reports_to", "=", parent])
 	else:
-		filters.append(['reports_to', '=', ''])
+		filters.append(["reports_to", "=", ""])
 
 	if exclude_node:
-		filters.append(['name', '!=', exclude_node])
+		filters.append(["name", "!=", exclude_node])
 
-	employees = frappe.get_list('Employee',
-		fields=['employee_name as name', 'name as id', 'reports_to', 'image', 'designation as title'],
+	employees = frappe.get_list(
+		"Employee",
+		fields=["employee_name as name", "name as id", "reports_to", "image", "designation as title"],
 		filters=filters,
-		order_by='name'
+		order_by="name",
 	)
 
 	for employee in employees:
-		is_expandable = frappe.db.count('Employee', filters={'reports_to': employee.get('id')})
+		is_expandable = frappe.db.count("Employee", filters={"reports_to": employee.get("id")})
 		employee.connections = get_connections(employee.id)
 		employee.expandable = 1 if is_expandable else 0
 
@@ -32,16 +33,12 @@
 def get_connections(employee):
 	num_connections = 0
 
-	nodes_to_expand = frappe.get_list('Employee', filters=[
-			['reports_to', '=', employee]
-		])
+	nodes_to_expand = frappe.get_list("Employee", filters=[["reports_to", "=", employee]])
 	num_connections += len(nodes_to_expand)
 
 	while nodes_to_expand:
 		parent = nodes_to_expand.pop(0)
-		descendants = frappe.get_list('Employee', filters=[
-			['reports_to', '=', parent.name]
-		])
+		descendants = frappe.get_list("Employee", filters=[["reports_to", "=", parent.name]])
 		num_connections += len(descendants)
 		nodes_to_expand.extend(descendants)
 
diff --git a/erpnext/hr/page/team_updates/team_updates.py b/erpnext/hr/page/team_updates/team_updates.py
index 0a4624c..c1fcb73 100644
--- a/erpnext/hr/page/team_updates/team_updates.py
+++ b/erpnext/hr/page/team_updates/team_updates.py
@@ -4,15 +4,20 @@
 
 @frappe.whitelist()
 def get_data(start=0):
-	#frappe.only_for('Employee', 'System Manager')
-	data = frappe.get_all('Communication',
-		fields=('content', 'text_content', 'sender', 'creation'),
-		filters=dict(reference_doctype='Daily Work Summary'),
-		order_by='creation desc', limit=40, start=start)
+	# frappe.only_for('Employee', 'System Manager')
+	data = frappe.get_all(
+		"Communication",
+		fields=("content", "text_content", "sender", "creation"),
+		filters=dict(reference_doctype="Daily Work Summary"),
+		order_by="creation desc",
+		limit=40,
+		start=start,
+	)
 
 	for d in data:
-		d.sender_name = frappe.db.get_value("Employee", {"user_id": d.sender},
-			"employee_name") or d.sender
+		d.sender_name = (
+			frappe.db.get_value("Employee", {"user_id": d.sender}, "employee_name") or d.sender
+		)
 		if d.text_content:
 			d.content = frappe.utils.md_to_html(EmailReplyParser.parse_reply(d.text_content))
 
diff --git a/erpnext/hr/report/daily_work_summary_replies/daily_work_summary_replies.py b/erpnext/hr/report/daily_work_summary_replies/daily_work_summary_replies.py
index 63764bb..d93688a 100644
--- a/erpnext/hr/report/daily_work_summary_replies/daily_work_summary_replies.py
+++ b/erpnext/hr/report/daily_work_summary_replies/daily_work_summary_replies.py
@@ -9,51 +9,53 @@
 
 
 def execute(filters=None):
-	if not filters.group: return [], []
+	if not filters.group:
+		return [], []
 	columns, data = get_columns(), get_data(filters)
 	return columns, data
 
+
 def get_columns(filters=None):
 	columns = [
-		{
-			"label": _("User"),
-			"fieldname": "user",
-			"fieldtype": "Data",
-			"width": 300
-		},
+		{"label": _("User"), "fieldname": "user", "fieldtype": "Data", "width": 300},
 		{
 			"label": _("Replies"),
 			"fieldname": "count",
 			"fieldtype": "data",
 			"width": 100,
-			"align": 'right',
+			"align": "right",
 		},
 		{
 			"label": _("Total"),
 			"fieldname": "total",
 			"fieldtype": "data",
 			"width": 100,
-			"align": 'right',
-		}
+			"align": "right",
+		},
 	]
 	return columns
 
+
 def get_data(filters):
-	daily_summary_emails = frappe.get_all('Daily Work Summary',
-		fields=["name"],
-		filters=[["creation","Between", filters.range]])
-	daily_summary_emails = [d.get('name') for d in daily_summary_emails]
-	replies = frappe.get_all('Communication',
-			fields=['content', 'text_content', 'sender'],
-			filters=[['reference_doctype','=', 'Daily Work Summary'],
-				['reference_name', 'in', daily_summary_emails],
-				['communication_type', '=', 'Communication'],
-				['sent_or_received', '=', 'Received']],
-			order_by='creation asc')
+	daily_summary_emails = frappe.get_all(
+		"Daily Work Summary", fields=["name"], filters=[["creation", "Between", filters.range]]
+	)
+	daily_summary_emails = [d.get("name") for d in daily_summary_emails]
+	replies = frappe.get_all(
+		"Communication",
+		fields=["content", "text_content", "sender"],
+		filters=[
+			["reference_doctype", "=", "Daily Work Summary"],
+			["reference_name", "in", daily_summary_emails],
+			["communication_type", "=", "Communication"],
+			["sent_or_received", "=", "Received"],
+		],
+		order_by="creation asc",
+	)
 	data = []
 	total = len(daily_summary_emails)
 	for user in get_user_emails_from_group(filters.group):
-		user_name = frappe.get_value('User', user, 'full_name')
+		user_name = frappe.get_value("User", user, "full_name")
 		count = len([d for d in replies if d.sender == user])
 		data.append([user_name, count, total])
 	return data
diff --git a/erpnext/hr/report/employee_advance_summary/employee_advance_summary.py b/erpnext/hr/report/employee_advance_summary/employee_advance_summary.py
index 62b83f2..29532f7 100644
--- a/erpnext/hr/report/employee_advance_summary/employee_advance_summary.py
+++ b/erpnext/hr/report/employee_advance_summary/employee_advance_summary.py
@@ -7,7 +7,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	advances_list = get_advances(filters)
 	columns = get_columns()
@@ -18,8 +19,16 @@
 
 	data = []
 	for advance in advances_list:
-		row = [advance.name, advance.employee, advance.company, advance.posting_date,
-		advance.advance_amount, advance.paid_amount,  advance.claimed_amount, advance.status]
+		row = [
+			advance.name,
+			advance.employee,
+			advance.company,
+			advance.posting_date,
+			advance.advance_amount,
+			advance.paid_amount,
+			advance.claimed_amount,
+			advance.status,
+		]
 		data.append(row)
 
 	return columns, data
@@ -32,54 +41,40 @@
 			"fieldname": "title",
 			"fieldtype": "Link",
 			"options": "Employee Advance",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Employee"),
 			"fieldname": "employee",
 			"fieldtype": "Link",
 			"options": "Employee",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Company"),
 			"fieldname": "company",
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 120
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 120},
 		{
 			"label": _("Advance Amount"),
 			"fieldname": "advance_amount",
 			"fieldtype": "Currency",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Paid Amount"),
-			"fieldname": "paid_amount",
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"label": _("Paid Amount"), "fieldname": "paid_amount", "fieldtype": "Currency", "width": 120},
 		{
 			"label": _("Claimed Amount"),
 			"fieldname": "claimed_amount",
 			"fieldtype": "Currency",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Status"),
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"width": 120
-		}
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 120},
 	]
 
+
 def get_conditions(filters):
 	conditions = ""
 
@@ -96,10 +91,15 @@
 
 	return conditions
 
+
 def get_advances(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""select name, employee, paid_amount, status, advance_amount, claimed_amount, company,
+	return frappe.db.sql(
+		"""select name, employee, paid_amount, status, advance_amount, claimed_amount, company,
 		posting_date, purpose
 		from `tabEmployee Advance`
-		where docstatus<2 %s order by posting_date, name desc""" %
-		conditions, filters, as_dict=1)
+		where docstatus<2 %s order by posting_date, name desc"""
+		% conditions,
+		filters,
+		as_dict=1,
+	)
diff --git a/erpnext/hr/report/employee_analytics/employee_analytics.py b/erpnext/hr/report/employee_analytics/employee_analytics.py
index 3a75276..12be156 100644
--- a/erpnext/hr/report/employee_analytics/employee_analytics.py
+++ b/erpnext/hr/report/employee_analytics/employee_analytics.py
@@ -7,10 +7,11 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if not filters["company"]:
-		frappe.throw(_('{0} is mandatory').format(_('Company')))
+		frappe.throw(_("{0} is mandatory").format(_("Company")))
 
 	columns = get_columns()
 	employees = get_employees(filters)
@@ -20,28 +21,41 @@
 		for department in parameters_result:
 			parameters.append(department)
 
-	chart = get_chart_data(parameters,employees, filters)
+	chart = get_chart_data(parameters, employees, filters)
 	return columns, employees, None, chart
 
+
 def get_columns():
 	return [
-		_("Employee") + ":Link/Employee:120", _("Name") + ":Data:200", _("Date of Birth")+ ":Date:100",
-		_("Branch") + ":Link/Branch:120", _("Department") + ":Link/Department:120",
-		_("Designation") + ":Link/Designation:120", _("Gender") + "::100", _("Company") + ":Link/Company:120"
+		_("Employee") + ":Link/Employee:120",
+		_("Name") + ":Data:200",
+		_("Date of Birth") + ":Date:100",
+		_("Branch") + ":Link/Branch:120",
+		_("Department") + ":Link/Department:120",
+		_("Designation") + ":Link/Designation:120",
+		_("Gender") + "::100",
+		_("Company") + ":Link/Company:120",
 	]
 
-def get_conditions(filters):
-	conditions = " and "+filters.get("parameter").lower().replace(" ","_")+" IS NOT NULL "
 
-	if filters.get("company"): conditions += " and company = '%s'" % \
-		filters["company"].replace("'", "\\'")
+def get_conditions(filters):
+	conditions = " and " + filters.get("parameter").lower().replace(" ", "_") + " IS NOT NULL "
+
+	if filters.get("company"):
+		conditions += " and company = '%s'" % filters["company"].replace("'", "\\'")
 	return conditions
 
+
 def get_employees(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""select name, employee_name, date_of_birth,
+	return frappe.db.sql(
+		"""select name, employee_name, date_of_birth,
 	branch, department, designation,
-	gender, company from `tabEmployee` where status = 'Active' %s""" % conditions, as_list=1)
+	gender, company from `tabEmployee` where status = 'Active' %s"""
+		% conditions,
+		as_list=1,
+	)
+
 
 def get_parameters(filters):
 	if filters.get("parameter") == "Grade":
@@ -49,36 +63,37 @@
 	else:
 		parameter = filters.get("parameter")
 
-	return frappe.db.sql("""select name from `tab"""+ parameter +"""` """, as_list=1)
+	return frappe.db.sql("""select name from `tab""" + parameter + """` """, as_list=1)
 
-def get_chart_data(parameters,employees, filters):
+
+def get_chart_data(parameters, employees, filters):
 	if not parameters:
 		parameters = []
 	datasets = []
-	parameter_field_name = filters.get("parameter").lower().replace(" ","_")
+	parameter_field_name = filters.get("parameter").lower().replace(" ", "_")
 	label = []
 	for parameter in parameters:
 		if parameter:
-			total_employee = frappe.db.sql("""select count(*) from
-				`tabEmployee` where """+
-				parameter_field_name + """ = %s and  company = %s""" ,( parameter[0], filters.get("company")), as_list=1)
+			total_employee = frappe.db.sql(
+				"""select count(*) from
+				`tabEmployee` where """
+				+ parameter_field_name
+				+ """ = %s and  company = %s""",
+				(parameter[0], filters.get("company")),
+				as_list=1,
+			)
 			if total_employee[0][0]:
 				label.append(parameter)
 			datasets.append(total_employee[0][0])
 
-	values = [ value for value in datasets if value !=0]
+	values = [value for value in datasets if value != 0]
 
-	total_employee = frappe.db.count('Employee', {'status':'Active'})
+	total_employee = frappe.db.count("Employee", {"status": "Active"})
 	others = total_employee - sum(values)
 
 	label.append(["Not Set"])
 	values.append(others)
 
-	chart = {
-		"data": {
-			'labels': label,
-			'datasets': [{'name': 'Employees','values': values}]
-		}
-	}
+	chart = {"data": {"labels": label, "datasets": [{"name": "Employees", "values": values}]}}
 	chart["type"] = "donut"
 	return chart
diff --git a/erpnext/hr/report/employee_birthday/employee_birthday.py b/erpnext/hr/report/employee_birthday/employee_birthday.py
index cec5a48..a6a13d8 100644
--- a/erpnext/hr/report/employee_birthday/employee_birthday.py
+++ b/erpnext/hr/report/employee_birthday/employee_birthday.py
@@ -7,34 +7,59 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns()
 	data = get_employees(filters)
 
 	return columns, data
 
+
 def get_columns():
 	return [
-		_("Employee") + ":Link/Employee:120", _("Name") + ":Data:200", _("Date of Birth")+ ":Date:100",
-		_("Branch") + ":Link/Branch:120", _("Department") + ":Link/Department:120",
-		_("Designation") + ":Link/Designation:120", _("Gender") + "::60", _("Company") + ":Link/Company:120"
+		_("Employee") + ":Link/Employee:120",
+		_("Name") + ":Data:200",
+		_("Date of Birth") + ":Date:100",
+		_("Branch") + ":Link/Branch:120",
+		_("Department") + ":Link/Department:120",
+		_("Designation") + ":Link/Designation:120",
+		_("Gender") + "::60",
+		_("Company") + ":Link/Company:120",
 	]
 
+
 def get_employees(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""select name, employee_name, date_of_birth,
+	return frappe.db.sql(
+		"""select name, employee_name, date_of_birth,
 	branch, department, designation,
-	gender, company from tabEmployee where status = 'Active' %s""" % conditions, as_list=1)
+	gender, company from tabEmployee where status = 'Active' %s"""
+		% conditions,
+		as_list=1,
+	)
+
 
 def get_conditions(filters):
 	conditions = ""
 	if filters.get("month"):
-		month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov",
-			"Dec"].index(filters["month"]) + 1
+		month = [
+			"Jan",
+			"Feb",
+			"Mar",
+			"Apr",
+			"May",
+			"Jun",
+			"Jul",
+			"Aug",
+			"Sep",
+			"Oct",
+			"Nov",
+			"Dec",
+		].index(filters["month"]) + 1
 		conditions += " and month(date_of_birth) = '%s'" % month
 
-	if filters.get("company"): conditions += " and company = '%s'" % \
-		filters["company"].replace("'", "\\'")
+	if filters.get("company"):
+		conditions += " and company = '%s'" % filters["company"].replace("'", "\\'")
 
 	return conditions
diff --git a/erpnext/hr/report/employee_exits/employee_exits.py b/erpnext/hr/report/employee_exits/employee_exits.py
index bde5a89..9cd9ff0 100644
--- a/erpnext/hr/report/employee_exits/employee_exits.py
+++ b/erpnext/hr/report/employee_exits/employee_exits.py
@@ -15,104 +15,106 @@
 
 	return columns, data, None, chart, report_summary
 
+
 def get_columns():
 	return [
 		{
-			'label': _('Employee'),
-			'fieldname': 'employee',
-			'fieldtype': 'Link',
-			'options': 'Employee',
-			'width': 150
+			"label": _("Employee"),
+			"fieldname": "employee",
+			"fieldtype": "Link",
+			"options": "Employee",
+			"width": 150,
+		},
+		{"label": _("Employee Name"), "fieldname": "employee_name", "fieldtype": "Data", "width": 150},
+		{
+			"label": _("Date of Joining"),
+			"fieldname": "date_of_joining",
+			"fieldtype": "Date",
+			"width": 120,
+		},
+		{"label": _("Relieving Date"), "fieldname": "relieving_date", "fieldtype": "Date", "width": 120},
+		{
+			"label": _("Exit Interview"),
+			"fieldname": "exit_interview",
+			"fieldtype": "Link",
+			"options": "Exit Interview",
+			"width": 150,
 		},
 		{
-			'label': _('Employee Name'),
-			'fieldname': 'employee_name',
-			'fieldtype': 'Data',
-			'width': 150
+			"label": _("Interview Status"),
+			"fieldname": "interview_status",
+			"fieldtype": "Data",
+			"width": 130,
 		},
 		{
-			'label': _('Date of Joining'),
-			'fieldname': 'date_of_joining',
-			'fieldtype': 'Date',
-			'width': 120
+			"label": _("Final Decision"),
+			"fieldname": "employee_status",
+			"fieldtype": "Data",
+			"width": 150,
 		},
 		{
-			'label': _('Relieving Date'),
-			'fieldname': 'relieving_date',
-			'fieldtype': 'Date',
-			'width': 120
+			"label": _("Full and Final Statement"),
+			"fieldname": "full_and_final_statement",
+			"fieldtype": "Link",
+			"options": "Full and Final Statement",
+			"width": 180,
 		},
 		{
-			'label': _('Exit Interview'),
-			'fieldname': 'exit_interview',
-			'fieldtype': 'Link',
-			'options': 'Exit Interview',
-			'width': 150
+			"label": _("Department"),
+			"fieldname": "department",
+			"fieldtype": "Link",
+			"options": "Department",
+			"width": 120,
 		},
 		{
-			'label': _('Interview Status'),
-			'fieldname': 'interview_status',
-			'fieldtype': 'Data',
-			'width': 130
+			"label": _("Designation"),
+			"fieldname": "designation",
+			"fieldtype": "Link",
+			"options": "Designation",
+			"width": 120,
 		},
 		{
-			'label': _('Final Decision'),
-			'fieldname': 'employee_status',
-			'fieldtype': 'Data',
-			'width': 150
+			"label": _("Reports To"),
+			"fieldname": "reports_to",
+			"fieldtype": "Link",
+			"options": "Employee",
+			"width": 120,
 		},
-		{
-			'label': _('Full and Final Statement'),
-			'fieldname': 'full_and_final_statement',
-			'fieldtype': 'Link',
-			'options': 'Full and Final Statement',
-			'width': 180
-		},
-		{
-			'label': _('Department'),
-			'fieldname': 'department',
-			'fieldtype': 'Link',
-			'options': 'Department',
-			'width': 120
-		},
-		{
-			'label': _('Designation'),
-			'fieldname': 'designation',
-			'fieldtype': 'Link',
-			'options': 'Designation',
-			'width': 120
-		},
-		{
-			'label': _('Reports To'),
-			'fieldname': 'reports_to',
-			'fieldtype': 'Link',
-			'options': 'Employee',
-			'width': 120
-		}
 	]
 
+
 def get_data(filters):
-	employee = frappe.qb.DocType('Employee')
-	interview = frappe.qb.DocType('Exit Interview')
-	fnf = frappe.qb.DocType('Full and Final Statement')
+	employee = frappe.qb.DocType("Employee")
+	interview = frappe.qb.DocType("Exit Interview")
+	fnf = frappe.qb.DocType("Full and Final Statement")
 
 	query = (
 		frappe.qb.from_(employee)
-			.left_join(interview).on(interview.employee == employee.name)
-			.left_join(fnf).on(fnf.employee == employee.name)
-			.select(
-				employee.name.as_('employee'), employee.employee_name.as_('employee_name'),
-				employee.date_of_joining.as_('date_of_joining'), employee.relieving_date.as_('relieving_date'),
-				employee.department.as_('department'), employee.designation.as_('designation'),
-				employee.reports_to.as_('reports_to'), interview.name.as_('exit_interview'),
-				interview.status.as_('interview_status'), interview.employee_status.as_('employee_status'),
-				interview.reference_document_name.as_('questionnaire'), fnf.name.as_('full_and_final_statement'))
-			.distinct()
-			.where(
-				((employee.relieving_date.isnotnull()) | (employee.relieving_date != ''))
-				& ((interview.name.isnull()) | ((interview.name.isnotnull()) & (interview.docstatus != 2)))
-				& ((fnf.name.isnull()) | ((fnf.name.isnotnull()) & (fnf.docstatus != 2)))
-			).orderby(employee.relieving_date, order=Order.asc)
+		.left_join(interview)
+		.on(interview.employee == employee.name)
+		.left_join(fnf)
+		.on(fnf.employee == employee.name)
+		.select(
+			employee.name.as_("employee"),
+			employee.employee_name.as_("employee_name"),
+			employee.date_of_joining.as_("date_of_joining"),
+			employee.relieving_date.as_("relieving_date"),
+			employee.department.as_("department"),
+			employee.designation.as_("designation"),
+			employee.reports_to.as_("reports_to"),
+			interview.name.as_("exit_interview"),
+			interview.status.as_("interview_status"),
+			interview.employee_status.as_("employee_status"),
+			interview.reference_document_name.as_("questionnaire"),
+			fnf.name.as_("full_and_final_statement"),
+		)
+		.distinct()
+		.where(
+			((employee.relieving_date.isnotnull()) | (employee.relieving_date != ""))
+			& ((interview.name.isnull()) | ((interview.name.isnotnull()) & (interview.docstatus != 2)))
+			& ((fnf.name.isnull()) | ((fnf.name.isnotnull()) & (fnf.docstatus != 2)))
+		)
+		.orderby(employee.relieving_date, order=Order.asc)
 	)
 
 	query = get_conditions(filters, query, employee, interview, fnf)
@@ -122,44 +124,48 @@
 
 
 def get_conditions(filters, query, employee, interview, fnf):
-	if filters.get('from_date') and filters.get('to_date'):
-		query = query.where(employee.relieving_date[getdate(filters.get('from_date')):getdate(filters.get('to_date'))])
+	if filters.get("from_date") and filters.get("to_date"):
+		query = query.where(
+			employee.relieving_date[getdate(filters.get("from_date")) : getdate(filters.get("to_date"))]
+		)
 
-	elif filters.get('from_date'):
-		query = query.where(employee.relieving_date >= filters.get('from_date'))
+	elif filters.get("from_date"):
+		query = query.where(employee.relieving_date >= filters.get("from_date"))
 
-	elif filters.get('to_date'):
-		query = query.where(employee.relieving_date <= filters.get('to_date'))
+	elif filters.get("to_date"):
+		query = query.where(employee.relieving_date <= filters.get("to_date"))
 
-	if filters.get('company'):
-		query = query.where(employee.company == filters.get('company'))
+	if filters.get("company"):
+		query = query.where(employee.company == filters.get("company"))
 
-	if filters.get('department'):
-		query = query.where(employee.department == filters.get('department'))
+	if filters.get("department"):
+		query = query.where(employee.department == filters.get("department"))
 
-	if filters.get('designation'):
-		query = query.where(employee.designation == filters.get('designation'))
+	if filters.get("designation"):
+		query = query.where(employee.designation == filters.get("designation"))
 
-	if filters.get('employee'):
-		query = query.where(employee.name == filters.get('employee'))
+	if filters.get("employee"):
+		query = query.where(employee.name == filters.get("employee"))
 
-	if filters.get('reports_to'):
-		query = query.where(employee.reports_to == filters.get('reports_to'))
+	if filters.get("reports_to"):
+		query = query.where(employee.reports_to == filters.get("reports_to"))
 
-	if filters.get('interview_status'):
-		query = query.where(interview.status == filters.get('interview_status'))
+	if filters.get("interview_status"):
+		query = query.where(interview.status == filters.get("interview_status"))
 
-	if filters.get('final_decision'):
-		query = query.where(interview.employee_status == filters.get('final_decision'))
+	if filters.get("final_decision"):
+		query = query.where(interview.employee_status == filters.get("final_decision"))
 
-	if filters.get('exit_interview_pending'):
-		query = query.where((interview.name == '') | (interview.name.isnull()))
+	if filters.get("exit_interview_pending"):
+		query = query.where((interview.name == "") | (interview.name.isnull()))
 
-	if filters.get('questionnaire_pending'):
-		query = query.where((interview.reference_document_name == '') | (interview.reference_document_name.isnull()))
+	if filters.get("questionnaire_pending"):
+		query = query.where(
+			(interview.reference_document_name == "") | (interview.reference_document_name.isnull())
+		)
 
-	if filters.get('fnf_pending'):
-		query = query.where((fnf.name == '') | (fnf.name.isnull()))
+	if filters.get("fnf_pending"):
+		query = query.where((fnf.name == "") | (fnf.name.isnull()))
 
 	return query
 
@@ -173,20 +179,20 @@
 	pending = 0
 
 	for entry in data:
-		if entry.employee_status == 'Employee Retained':
+		if entry.employee_status == "Employee Retained":
 			retained += 1
-		elif entry.employee_status == 'Exit Confirmed':
+		elif entry.employee_status == "Exit Confirmed":
 			exit_confirmed += 1
 		else:
 			pending += 1
 
 	chart = {
-		'data': {
-			'labels': [_('Retained'), _('Exit Confirmed'), _('Decision Pending')],
-			'datasets': [{'name': _('Employee Status'), 'values': [retained, exit_confirmed, pending]}]
+		"data": {
+			"labels": [_("Retained"), _("Exit Confirmed"), _("Decision Pending")],
+			"datasets": [{"name": _("Employee Status"), "values": [retained, exit_confirmed, pending]}],
 		},
-		'type': 'donut',
-		'colors': ['green', 'red', 'blue'],
+		"type": "donut",
+		"colors": ["green", "red", "blue"],
 	}
 
 	return chart
@@ -203,28 +209,27 @@
 
 	return [
 		{
-			'value': total_resignations,
-			'label': _('Total Resignations'),
-			'indicator': 'Red' if total_resignations > 0 else 'Green',
-			'datatype': 'Int',
+			"value": total_resignations,
+			"label": _("Total Resignations"),
+			"indicator": "Red" if total_resignations > 0 else "Green",
+			"datatype": "Int",
 		},
 		{
-			'value': interviews_pending,
-			'label': _('Pending Interviews'),
-			'indicator': 'Blue' if interviews_pending > 0 else 'Green',
-			'datatype': 'Int',
+			"value": interviews_pending,
+			"label": _("Pending Interviews"),
+			"indicator": "Blue" if interviews_pending > 0 else "Green",
+			"datatype": "Int",
 		},
 		{
-			'value': fnf_pending,
-			'label': _('Pending FnF'),
-			'indicator': 'Blue' if fnf_pending > 0 else 'Green',
-			'datatype': 'Int',
+			"value": fnf_pending,
+			"label": _("Pending FnF"),
+			"indicator": "Blue" if fnf_pending > 0 else "Green",
+			"datatype": "Int",
 		},
 		{
-			'value': questionnaires_pending,
-			'label': _('Pending Questionnaires'),
-			'indicator': 'Blue' if questionnaires_pending > 0 else 'Green',
-			'datatype': 'Int'
+			"value": questionnaires_pending,
+			"label": _("Pending Questionnaires"),
+			"indicator": "Blue" if questionnaires_pending > 0 else "Green",
+			"datatype": "Int",
 		},
 	]
-
diff --git a/erpnext/hr/report/employee_exits/test_employee_exits.py b/erpnext/hr/report/employee_exits/test_employee_exits.py
index d7e95a6..a9a30de 100644
--- a/erpnext/hr/report/employee_exits/test_employee_exits.py
+++ b/erpnext/hr/report/employee_exits/test_employee_exits.py
@@ -28,33 +28,33 @@
 	@classmethod
 	def create_records(cls):
 		cls.emp1 = make_employee(
-			'employeeexit1@example.com',
-			company='Test Company',
-			date_of_joining=getdate('01-10-2021'),
+			"employeeexit1@example.com",
+			company="Test Company",
+			date_of_joining=getdate("01-10-2021"),
 			relieving_date=add_days(getdate(), 14),
-			designation='Accountant'
+			designation="Accountant",
 		)
 		cls.emp2 = make_employee(
-			'employeeexit2@example.com',
-			company='Test Company',
-			date_of_joining=getdate('01-12-2021'),
+			"employeeexit2@example.com",
+			company="Test Company",
+			date_of_joining=getdate("01-12-2021"),
 			relieving_date=add_days(getdate(), 15),
-			designation='Accountant'
+			designation="Accountant",
 		)
 
 		cls.emp3 = make_employee(
-			'employeeexit3@example.com',
-			company='Test Company',
-			date_of_joining=getdate('02-12-2021'),
+			"employeeexit3@example.com",
+			company="Test Company",
+			date_of_joining=getdate("02-12-2021"),
 			relieving_date=add_days(getdate(), 29),
-			designation='Engineer'
+			designation="Engineer",
 		)
 		cls.emp4 = make_employee(
-			'employeeexit4@example.com',
-			company='Test Company',
-			date_of_joining=getdate('01-12-2021'),
+			"employeeexit4@example.com",
+			company="Test Company",
+			date_of_joining=getdate("01-12-2021"),
 			relieving_date=add_days(getdate(), 30),
-			designation='Engineer'
+			designation="Engineer",
 		)
 
 		# exit interview for 3 employees only
@@ -69,174 +69,177 @@
 		# link questionnaire for a few records
 		# setting employee doctype as reference instead of creating a questionnaire
 		# since this is just for a test
-		frappe.db.set_value('Exit Interview', cls.interview1.name, {
-			'ref_doctype': 'Employee',
-			'reference_document_name': cls.emp1
-		})
+		frappe.db.set_value(
+			"Exit Interview",
+			cls.interview1.name,
+			{"ref_doctype": "Employee", "reference_document_name": cls.emp1},
+		)
 
-		frappe.db.set_value('Exit Interview', cls.interview2.name, {
-			'ref_doctype': 'Employee',
-			'reference_document_name': cls.emp2
-		})
+		frappe.db.set_value(
+			"Exit Interview",
+			cls.interview2.name,
+			{"ref_doctype": "Employee", "reference_document_name": cls.emp2},
+		)
 
-		frappe.db.set_value('Exit Interview', cls.interview3.name, {
-			'ref_doctype': 'Employee',
-			'reference_document_name': cls.emp3
-		})
-
+		frappe.db.set_value(
+			"Exit Interview",
+			cls.interview3.name,
+			{"ref_doctype": "Employee", "reference_document_name": cls.emp3},
+		)
 
 	def test_employee_exits_summary(self):
 		filters = {
-			'company': 'Test Company',
-			'from_date': getdate(),
-			'to_date': add_days(getdate(), 15),
-			'designation': 'Accountant'
+			"company": "Test Company",
+			"from_date": getdate(),
+			"to_date": add_days(getdate(), 15),
+			"designation": "Accountant",
 		}
 
 		report = execute(filters)
 
-		employee1 = frappe.get_doc('Employee', self.emp1)
-		employee2 = frappe.get_doc('Employee', self.emp2)
+		employee1 = frappe.get_doc("Employee", self.emp1)
+		employee2 = frappe.get_doc("Employee", self.emp2)
 		expected_data = [
 			{
-				'employee': employee1.name,
-				'employee_name': employee1.employee_name,
-				'date_of_joining': employee1.date_of_joining,
-				'relieving_date': employee1.relieving_date,
-				'department': employee1.department,
-				'designation': employee1.designation,
-				'reports_to': None,
-				'exit_interview': self.interview1.name,
-				'interview_status': self.interview1.status,
-				'employee_status': '',
-				'questionnaire': employee1.name,
-				'full_and_final_statement': self.fnf1.name
+				"employee": employee1.name,
+				"employee_name": employee1.employee_name,
+				"date_of_joining": employee1.date_of_joining,
+				"relieving_date": employee1.relieving_date,
+				"department": employee1.department,
+				"designation": employee1.designation,
+				"reports_to": None,
+				"exit_interview": self.interview1.name,
+				"interview_status": self.interview1.status,
+				"employee_status": "",
+				"questionnaire": employee1.name,
+				"full_and_final_statement": self.fnf1.name,
 			},
 			{
-				'employee': employee2.name,
-				'employee_name': employee2.employee_name,
-				'date_of_joining': employee2.date_of_joining,
-				'relieving_date': employee2.relieving_date,
-				'department': employee2.department,
-				'designation': employee2.designation,
-				'reports_to': None,
-				'exit_interview': self.interview2.name,
-				'interview_status': self.interview2.status,
-				'employee_status': '',
-				'questionnaire': employee2.name,
-				'full_and_final_statement': self.fnf2.name
-			}
+				"employee": employee2.name,
+				"employee_name": employee2.employee_name,
+				"date_of_joining": employee2.date_of_joining,
+				"relieving_date": employee2.relieving_date,
+				"department": employee2.department,
+				"designation": employee2.designation,
+				"reports_to": None,
+				"exit_interview": self.interview2.name,
+				"interview_status": self.interview2.status,
+				"employee_status": "",
+				"questionnaire": employee2.name,
+				"full_and_final_statement": self.fnf2.name,
+			},
 		]
 
-		self.assertEqual(expected_data, report[1]) # rows
-
+		self.assertEqual(expected_data, report[1])  # rows
 
 	def test_pending_exit_interviews_summary(self):
 		filters = {
-			'company': 'Test Company',
-			'from_date': getdate(),
-			'to_date': add_days(getdate(), 30),
-			'exit_interview_pending': 1
+			"company": "Test Company",
+			"from_date": getdate(),
+			"to_date": add_days(getdate(), 30),
+			"exit_interview_pending": 1,
 		}
 
 		report = execute(filters)
 
-		employee4 = frappe.get_doc('Employee', self.emp4)
-		expected_data = [{
-			'employee': employee4.name,
-			'employee_name': employee4.employee_name,
-			'date_of_joining': employee4.date_of_joining,
-			'relieving_date': employee4.relieving_date,
-			'department': employee4.department,
-			'designation': employee4.designation,
-			'reports_to': None,
-			'exit_interview': None,
-			'interview_status': None,
-			'employee_status': None,
-			'questionnaire': None,
-			'full_and_final_statement': None
-		}]
-
-		self.assertEqual(expected_data, report[1]) # rows
-
-	def test_pending_exit_questionnaire_summary(self):
-		filters = {
-			'company': 'Test Company',
-			'from_date': getdate(),
-			'to_date': add_days(getdate(), 30),
-			'questionnaire_pending': 1
-		}
-
-		report = execute(filters)
-
-		employee4 = frappe.get_doc('Employee', self.emp4)
-		expected_data = [{
-			'employee': employee4.name,
-			'employee_name': employee4.employee_name,
-			'date_of_joining': employee4.date_of_joining,
-			'relieving_date': employee4.relieving_date,
-			'department': employee4.department,
-			'designation': employee4.designation,
-			'reports_to': None,
-			'exit_interview': None,
-			'interview_status': None,
-			'employee_status': None,
-			'questionnaire': None,
-			'full_and_final_statement': None
-		}]
-
-		self.assertEqual(expected_data, report[1]) # rows
-
-
-	def test_pending_fnf_summary(self):
-		filters = {
-			'company': 'Test Company',
-			'fnf_pending': 1
-		}
-
-		report = execute(filters)
-
-		employee3 = frappe.get_doc('Employee', self.emp3)
-		employee4 = frappe.get_doc('Employee', self.emp4)
+		employee4 = frappe.get_doc("Employee", self.emp4)
 		expected_data = [
 			{
-				'employee': employee3.name,
-				'employee_name': employee3.employee_name,
-				'date_of_joining': employee3.date_of_joining,
-				'relieving_date': employee3.relieving_date,
-				'department': employee3.department,
-				'designation': employee3.designation,
-				'reports_to': None,
-				'exit_interview': self.interview3.name,
-				'interview_status': self.interview3.status,
-				'employee_status': '',
-				'questionnaire': employee3.name,
-				'full_and_final_statement': None
-			},
-			{
-				'employee': employee4.name,
-				'employee_name': employee4.employee_name,
-				'date_of_joining': employee4.date_of_joining,
-				'relieving_date': employee4.relieving_date,
-				'department': employee4.department,
-				'designation': employee4.designation,
-				'reports_to': None,
-				'exit_interview': None,
-				'interview_status': None,
-				'employee_status': None,
-				'questionnaire': None,
-				'full_and_final_statement': None
+				"employee": employee4.name,
+				"employee_name": employee4.employee_name,
+				"date_of_joining": employee4.date_of_joining,
+				"relieving_date": employee4.relieving_date,
+				"department": employee4.department,
+				"designation": employee4.designation,
+				"reports_to": None,
+				"exit_interview": None,
+				"interview_status": None,
+				"employee_status": None,
+				"questionnaire": None,
+				"full_and_final_statement": None,
 			}
 		]
 
-		self.assertEqual(expected_data, report[1]) # rows
+		self.assertEqual(expected_data, report[1])  # rows
+
+	def test_pending_exit_questionnaire_summary(self):
+		filters = {
+			"company": "Test Company",
+			"from_date": getdate(),
+			"to_date": add_days(getdate(), 30),
+			"questionnaire_pending": 1,
+		}
+
+		report = execute(filters)
+
+		employee4 = frappe.get_doc("Employee", self.emp4)
+		expected_data = [
+			{
+				"employee": employee4.name,
+				"employee_name": employee4.employee_name,
+				"date_of_joining": employee4.date_of_joining,
+				"relieving_date": employee4.relieving_date,
+				"department": employee4.department,
+				"designation": employee4.designation,
+				"reports_to": None,
+				"exit_interview": None,
+				"interview_status": None,
+				"employee_status": None,
+				"questionnaire": None,
+				"full_and_final_statement": None,
+			}
+		]
+
+		self.assertEqual(expected_data, report[1])  # rows
+
+	def test_pending_fnf_summary(self):
+		filters = {"company": "Test Company", "fnf_pending": 1}
+
+		report = execute(filters)
+
+		employee3 = frappe.get_doc("Employee", self.emp3)
+		employee4 = frappe.get_doc("Employee", self.emp4)
+		expected_data = [
+			{
+				"employee": employee3.name,
+				"employee_name": employee3.employee_name,
+				"date_of_joining": employee3.date_of_joining,
+				"relieving_date": employee3.relieving_date,
+				"department": employee3.department,
+				"designation": employee3.designation,
+				"reports_to": None,
+				"exit_interview": self.interview3.name,
+				"interview_status": self.interview3.status,
+				"employee_status": "",
+				"questionnaire": employee3.name,
+				"full_and_final_statement": None,
+			},
+			{
+				"employee": employee4.name,
+				"employee_name": employee4.employee_name,
+				"date_of_joining": employee4.date_of_joining,
+				"relieving_date": employee4.relieving_date,
+				"department": employee4.department,
+				"designation": employee4.designation,
+				"reports_to": None,
+				"exit_interview": None,
+				"interview_status": None,
+				"employee_status": None,
+				"questionnaire": None,
+				"full_and_final_statement": None,
+			},
+		]
+
+		self.assertEqual(expected_data, report[1])  # rows
 
 
 def create_company():
-	if not frappe.db.exists('Company', 'Test Company'):
-		frappe.get_doc({
-			'doctype': 'Company',
-			'company_name': 'Test Company',
-			'default_currency': 'INR',
-			'country': 'India'
-		}).insert()
\ No newline at end of file
+	if not frappe.db.exists("Company", "Test Company"):
+		frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": "Test Company",
+				"default_currency": "INR",
+				"country": "India",
+			}
+		).insert()
diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
index 66c1d25..ca352f1 100644
--- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
@@ -17,7 +17,8 @@
 
 Filters = frappe._dict
 
-def execute(filters:  Optional[Filters] = None) -> Tuple:
+
+def execute(filters: Optional[Filters] = None) -> Tuple:
 	if filters.to_date <= filters.from_date:
 		frappe.throw(_('"From Date" can not be greater than or equal to "To Date"'))
 
@@ -28,91 +29,105 @@
 
 
 def get_columns() -> List[Dict]:
-	return [{
-		'label': _('Leave Type'),
-		'fieldtype': 'Link',
-		'fieldname': 'leave_type',
-		'width': 200,
-		'options': 'Leave Type'
-	}, {
-		'label': _('Employee'),
-		'fieldtype': 'Link',
-		'fieldname': 'employee',
-		'width': 100,
-		'options': 'Employee'
-	}, {
-		'label': _('Employee Name'),
-		'fieldtype': 'Dynamic Link',
-		'fieldname': 'employee_name',
-		'width': 100,
-		'options': 'employee'
-	}, {
-		'label': _('Opening Balance'),
-		'fieldtype': 'float',
-		'fieldname': 'opening_balance',
-		'width': 150,
-	}, {
-		'label': _('New Leave(s) Allocated'),
-		'fieldtype': 'float',
-		'fieldname': 'leaves_allocated',
-		'width': 200,
-	}, {
-		'label': _('Leave(s) Taken'),
-		'fieldtype': 'float',
-		'fieldname': 'leaves_taken',
-		'width': 150,
-	}, {
-		'label': _('Leave(s) Expired'),
-		'fieldtype': 'float',
-		'fieldname': 'leaves_expired',
-		'width': 150,
-	}, {
-		'label': _('Closing Balance'),
-		'fieldtype': 'float',
-		'fieldname': 'closing_balance',
-		'width': 150,
-	}]
+	return [
+		{
+			"label": _("Leave Type"),
+			"fieldtype": "Link",
+			"fieldname": "leave_type",
+			"width": 200,
+			"options": "Leave Type",
+		},
+		{
+			"label": _("Employee"),
+			"fieldtype": "Link",
+			"fieldname": "employee",
+			"width": 100,
+			"options": "Employee",
+		},
+		{
+			"label": _("Employee Name"),
+			"fieldtype": "Dynamic Link",
+			"fieldname": "employee_name",
+			"width": 100,
+			"options": "employee",
+		},
+		{
+			"label": _("Opening Balance"),
+			"fieldtype": "float",
+			"fieldname": "opening_balance",
+			"width": 150,
+		},
+		{
+			"label": _("New Leave(s) Allocated"),
+			"fieldtype": "float",
+			"fieldname": "leaves_allocated",
+			"width": 200,
+		},
+		{
+			"label": _("Leave(s) Taken"),
+			"fieldtype": "float",
+			"fieldname": "leaves_taken",
+			"width": 150,
+		},
+		{
+			"label": _("Leave(s) Expired"),
+			"fieldtype": "float",
+			"fieldname": "leaves_expired",
+			"width": 150,
+		},
+		{
+			"label": _("Closing Balance"),
+			"fieldtype": "float",
+			"fieldname": "closing_balance",
+			"width": 150,
+		},
+	]
 
 
 def get_data(filters: Filters) -> List:
-	leave_types = frappe.db.get_list('Leave Type', pluck='name', order_by='name')
+	leave_types = frappe.db.get_list("Leave Type", pluck="name", order_by="name")
 	conditions = get_conditions(filters)
 
 	user = frappe.session.user
-	department_approver_map = get_department_leave_approver_map(filters.get('department'))
+	department_approver_map = get_department_leave_approver_map(filters.get("department"))
 
-	active_employees = frappe.get_list('Employee',
+	active_employees = frappe.get_list(
+		"Employee",
 		filters=conditions,
-		fields=['name', 'employee_name', 'department', 'user_id', 'leave_approver'])
+		fields=["name", "employee_name", "department", "user_id", "leave_approver"],
+	)
 
 	data = []
 
 	for leave_type in leave_types:
 		if len(active_employees) > 1:
-			data.append({
-				'leave_type': leave_type
-			})
+			data.append({"leave_type": leave_type})
 		else:
-			row = frappe._dict({
-				'leave_type': leave_type
-			})
+			row = frappe._dict({"leave_type": leave_type})
 
 		for employee in active_employees:
 
-			leave_approvers = department_approver_map.get(employee.department_name, []).append(employee.leave_approver)
+			leave_approvers = department_approver_map.get(employee.department_name, []).append(
+				employee.leave_approver
+			)
 
-			if (leave_approvers and len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) \
-				or ("HR Manager" in frappe.get_roles(user)):
+			if (
+				(leave_approvers and len(leave_approvers) and user in leave_approvers)
+				or (user in ["Administrator", employee.user_id])
+				or ("HR Manager" in frappe.get_roles(user))
+			):
 				if len(active_employees) > 1:
 					row = frappe._dict()
 				row.employee = employee.name
 				row.employee_name = employee.employee_name
 
-				leaves_taken = get_leaves_for_period(employee.name, leave_type,
-					filters.from_date, filters.to_date) * -1
+				leaves_taken = (
+					get_leaves_for_period(employee.name, leave_type, filters.from_date, filters.to_date) * -1
+				)
 
 				new_allocation, expired_leaves, carry_forwarded_leaves = get_allocated_and_expired_leaves(
-					filters.from_date, filters.to_date, employee.name, leave_type)
+					filters.from_date, filters.to_date, employee.name, leave_type
+				)
 				opening = get_opening_balance(employee.name, leave_type, filters, carry_forwarded_leaves)
 
 				row.leaves_allocated = new_allocation
@@ -121,21 +136,27 @@
 				row.leaves_taken = leaves_taken
 
 				# not be shown on the basis of days left it create in user mind for carry_forward leave
-				row.closing_balance = (new_allocation + opening - (row.leaves_expired + leaves_taken))
+				row.closing_balance = new_allocation + opening - (row.leaves_expired + leaves_taken)
 				row.indent = 1
 				data.append(row)
 
 	return data
 
 
-def get_opening_balance(employee: str, leave_type: str, filters: Filters, carry_forwarded_leaves: float) -> float:
+def get_opening_balance(
+	employee: str, leave_type: str, filters: Filters, carry_forwarded_leaves: float
+) -> float:
 	# allocation boundary condition
 	# opening balance is the closing leave balance 1 day before the filter start date
 	opening_balance_date = add_days(filters.from_date, -1)
 	allocation = get_previous_allocation(filters.from_date, leave_type, employee)
 
-	if allocation and allocation.get("to_date") and opening_balance_date and \
-		getdate(allocation.get("to_date")) == getdate(opening_balance_date):
+	if (
+		allocation
+		and allocation.get("to_date")
+		and opening_balance_date
+		and getdate(allocation.get("to_date")) == getdate(opening_balance_date)
+	):
 		# if opening balance date is same as the previous allocation's expiry
 		# then opening balance should only consider carry forwarded leaves
 		opening_balance = carry_forwarded_leaves
@@ -147,39 +168,35 @@
 
 
 def get_conditions(filters: Filters) -> Dict:
-	conditions={
-		'status': 'Active',
+	conditions = {
+		"status": "Active",
 	}
-	if filters.get('employee'):
-		conditions['name'] = filters.get('employee')
+	if filters.get("employee"):
+		conditions["name"] = filters.get("employee")
 
-	if filters.get('company'):
-		conditions['company'] = filters.get('company')
+	if filters.get("company"):
+		conditions["company"] = filters.get("company")
 
-	if filters.get('department'):
-		conditions['department'] = filters.get('department')
+	if filters.get("department"):
+		conditions["department"] = filters.get("department")
 
 	return conditions
 
 
 def get_department_leave_approver_map(department: Optional[str] = None):
 	# get current department and all its child
-	department_list = frappe.get_list('Department',
-		filters={'disabled': 0},
-		or_filters={
-			'name': department,
-			'parent_department': department
-		},
-		pluck='name'
+	department_list = frappe.get_list(
+		"Department",
+		filters={"disabled": 0},
+		or_filters={"name": department, "parent_department": department},
+		pluck="name",
 	)
 	# retrieve approvers list from current department and from its subsequent child departments
-	approver_list = frappe.get_all('Department Approver',
-		filters={
-			'parentfield': 'leave_approvers',
-			'parent': ('in', department_list)
-		},
-		fields=['parent', 'approver'],
-		as_list=True
+	approver_list = frappe.get_all(
+		"Department Approver",
+		filters={"parentfield": "leave_approvers", "parent": ("in", department_list)},
+		fields=["parent", "approver"],
+		as_list=True,
 	)
 
 	approvers = {}
@@ -190,7 +207,9 @@
 	return approvers
 
 
-def get_allocated_and_expired_leaves(from_date: str, to_date: str, employee: str, leave_type: str) -> Tuple[float, float, float]:
+def get_allocated_and_expired_leaves(
+	from_date: str, to_date: str, employee: str, leave_type: str
+) -> Tuple[float, float, float]:
 	new_allocation = 0
 	expired_leaves = 0
 	carry_forwarded_leaves = 0
@@ -207,8 +226,7 @@
 			# leave allocations ending before to_date, reduce leaves taken within that period
 			# since they are already used, they won't expire
 			expired_leaves += record.leaves
-			expired_leaves += get_leaves_for_period(employee, leave_type,
-					record.from_date, record.to_date)
+			expired_leaves += get_leaves_for_period(employee, leave_type, record.from_date, record.to_date)
 
 		if record.from_date >= getdate(from_date):
 			if record.is_carry_forward:
@@ -219,22 +237,31 @@
 	return new_allocation, expired_leaves, carry_forwarded_leaves
 
 
-def get_leave_ledger_entries(from_date: str, to_date: str, employee: str, leave_type: str) -> List[Dict]:
-	ledger = frappe.qb.DocType('Leave Ledger Entry')
+def get_leave_ledger_entries(
+	from_date: str, to_date: str, employee: str, leave_type: str
+) -> List[Dict]:
+	ledger = frappe.qb.DocType("Leave Ledger Entry")
 	records = (
 		frappe.qb.from_(ledger)
 		.select(
-			ledger.employee, ledger.leave_type, ledger.from_date, ledger.to_date,
-			ledger.leaves, ledger.transaction_name, ledger.transaction_type,
-			ledger.is_carry_forward, ledger.is_expired
-		).where(
+			ledger.employee,
+			ledger.leave_type,
+			ledger.from_date,
+			ledger.to_date,
+			ledger.leaves,
+			ledger.transaction_name,
+			ledger.transaction_type,
+			ledger.is_carry_forward,
+			ledger.is_expired,
+		)
+		.where(
 			(ledger.docstatus == 1)
-			& (ledger.transaction_type == 'Leave Allocation')
+			& (ledger.transaction_type == "Leave Allocation")
 			& (ledger.employee == employee)
 			& (ledger.leave_type == leave_type)
 			& (
-				(ledger.from_date[from_date: to_date])
-				| (ledger.to_date[from_date: to_date])
+				(ledger.from_date[from_date:to_date])
+				| (ledger.to_date[from_date:to_date])
 				| ((ledger.from_date < from_date) & (ledger.to_date > to_date))
 			)
 		)
@@ -248,16 +275,13 @@
 	datasets = []
 	employee_data = data
 
-	if data and data[0].get('employee_name'):
+	if data and data[0].get("employee_name"):
 		get_dataset_for_chart(employee_data, datasets, labels)
 
 	chart = {
-		'data': {
-			'labels': labels,
-			'datasets': datasets
-		},
-		'type': 'bar',
-		'colors': ['#456789', '#EE8888', '#7E77BF']
+		"data": {"labels": labels, "datasets": datasets},
+		"type": "bar",
+		"colors": ["#456789", "#EE8888", "#7E77BF"],
 	}
 
 	return chart
@@ -265,18 +289,17 @@
 
 def get_dataset_for_chart(employee_data: List, datasets: List, labels: List) -> List:
 	leaves = []
-	employee_data = sorted(employee_data, key=lambda k: k['employee_name'])
+	employee_data = sorted(employee_data, key=lambda k: k["employee_name"])
 
-	for key, group in groupby(employee_data, lambda x: x['employee_name']):
+	for key, group in groupby(employee_data, lambda x: x["employee_name"]):
 		for grp in group:
 			if grp.closing_balance:
-				leaves.append(frappe._dict({
-					'leave_type': grp.leave_type,
-					'closing_balance': grp.closing_balance
-				}))
+				leaves.append(
+					frappe._dict({"leave_type": grp.leave_type, "closing_balance": grp.closing_balance})
+				)
 
 		if leaves:
 			labels.append(key)
 
 	for leave in leaves:
-		datasets.append({'name': leave.leave_type, 'values': [leave.closing_balance]})
+		datasets.append({"name": leave.leave_type, "values": [leave.closing_balance]})
diff --git a/erpnext/hr/report/employee_leave_balance/test_employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/test_employee_leave_balance.py
index b2ed72c..dc0f4d2 100644
--- a/erpnext/hr/report/employee_leave_balance/test_employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/test_employee_leave_balance.py
@@ -21,141 +21,189 @@
 	make_leave_application,
 )
 
-test_records = frappe.get_test_records('Leave Type')
+test_records = frappe.get_test_records("Leave Type")
+
 
 class TestEmployeeLeaveBalance(unittest.TestCase):
 	def setUp(self):
-		for dt in ['Leave Application', 'Leave Allocation', 'Salary Slip', 'Leave Ledger Entry', 'Leave Type']:
+		for dt in [
+			"Leave Application",
+			"Leave Allocation",
+			"Salary Slip",
+			"Leave Ledger Entry",
+			"Leave Type",
+		]:
 			frappe.db.delete(dt)
 
-		frappe.set_user('Administrator')
+		frappe.set_user("Administrator")
 
-		self.employee_id = make_employee('test_emp_leave_balance@example.com', company='_Test Company')
+		self.employee_id = make_employee("test_emp_leave_balance@example.com", company="_Test Company")
 
 		self.date = getdate()
 		self.year_start = getdate(get_year_start(self.date))
 		self.mid_year = add_months(self.year_start, 6)
 		self.year_end = getdate(get_year_ending(self.date))
 
-		self.holiday_list = make_holiday_list('_Test Emp Balance Holiday List', self.year_start, self.year_end)
+		self.holiday_list = make_holiday_list(
+			"_Test Emp Balance Holiday List", self.year_start, self.year_end
+		)
 
 	def tearDown(self):
 		frappe.db.rollback()
 
-	@set_holiday_list('_Test Emp Balance Holiday List', '_Test Company')
+	@set_holiday_list("_Test Emp Balance Holiday List", "_Test Company")
 	def test_employee_leave_balance(self):
 		frappe.get_doc(test_records[0]).insert()
 
 		# 5 leaves
-		allocation1 = make_allocation_record(employee=self.employee_id, from_date=add_days(self.year_start, -11),
-			to_date=add_days(self.year_start, -1), leaves=5)
+		allocation1 = make_allocation_record(
+			employee=self.employee_id,
+			from_date=add_days(self.year_start, -11),
+			to_date=add_days(self.year_start, -1),
+			leaves=5,
+		)
 		# 30 leaves
-		allocation2 = make_allocation_record(employee=self.employee_id, from_date=self.year_start, to_date=self.year_end)
+		allocation2 = make_allocation_record(
+			employee=self.employee_id, from_date=self.year_start, to_date=self.year_end
+		)
 		# expires 5 leaves
 		process_expired_allocation()
 
 		# 4 days leave
 		first_sunday = get_first_sunday(self.holiday_list, for_date=self.year_start)
-		leave_application = make_leave_application(self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), '_Test Leave Type')
+		leave_application = make_leave_application(
+			self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), "_Test Leave Type"
+		)
 		leave_application.reload()
 
-		filters = frappe._dict({
-			'from_date': allocation1.from_date,
-			'to_date': allocation2.to_date,
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{
+				"from_date": allocation1.from_date,
+				"to_date": allocation2.to_date,
+				"employee": self.employee_id,
+			}
+		)
 
 		report = execute(filters)
 
-		expected_data = [{
-			'leave_type': '_Test Leave Type',
-			'employee': self.employee_id,
-			'employee_name': 'test_emp_leave_balance@example.com',
-			'leaves_allocated': flt(allocation1.new_leaves_allocated + allocation2.new_leaves_allocated),
-			'leaves_expired': flt(allocation1.new_leaves_allocated),
-			'opening_balance': flt(0),
-			'leaves_taken': flt(leave_application.total_leave_days),
-			'closing_balance': flt(allocation2.new_leaves_allocated - leave_application.total_leave_days),
-			'indent': 1
-		}]
+		expected_data = [
+			{
+				"leave_type": "_Test Leave Type",
+				"employee": self.employee_id,
+				"employee_name": "test_emp_leave_balance@example.com",
+				"leaves_allocated": flt(allocation1.new_leaves_allocated + allocation2.new_leaves_allocated),
+				"leaves_expired": flt(allocation1.new_leaves_allocated),
+				"opening_balance": flt(0),
+				"leaves_taken": flt(leave_application.total_leave_days),
+				"closing_balance": flt(allocation2.new_leaves_allocated - leave_application.total_leave_days),
+				"indent": 1,
+			}
+		]
 
 		self.assertEqual(report[1], expected_data)
 
-	@set_holiday_list('_Test Emp Balance Holiday List', '_Test Company')
+	@set_holiday_list("_Test Emp Balance Holiday List", "_Test Company")
 	def test_opening_balance_on_alloc_boundary_dates(self):
 		frappe.get_doc(test_records[0]).insert()
 
 		# 30 leaves allocated
-		allocation1 = make_allocation_record(employee=self.employee_id, from_date=self.year_start, to_date=self.year_end)
+		allocation1 = make_allocation_record(
+			employee=self.employee_id, from_date=self.year_start, to_date=self.year_end
+		)
 		# 4 days leave application in the first allocation
 		first_sunday = get_first_sunday(self.holiday_list, for_date=self.year_start)
-		leave_application = make_leave_application(self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), '_Test Leave Type')
+		leave_application = make_leave_application(
+			self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), "_Test Leave Type"
+		)
 		leave_application.reload()
 
 		# Case 1: opening balance for first alloc boundary
-		filters = frappe._dict({
-			'from_date': self.year_start,
-			'to_date': self.year_end,
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{"from_date": self.year_start, "to_date": self.year_end, "employee": self.employee_id}
+		)
 		report = execute(filters)
 		self.assertEqual(report[1][0].opening_balance, 0)
 
 		# Case 2: opening balance after leave application date
-		filters = frappe._dict({
-			'from_date': add_days(leave_application.to_date, 1),
-			'to_date': self.year_end,
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{
+				"from_date": add_days(leave_application.to_date, 1),
+				"to_date": self.year_end,
+				"employee": self.employee_id,
+			}
+		)
 		report = execute(filters)
-		self.assertEqual(report[1][0].opening_balance, (allocation1.new_leaves_allocated - leave_application.total_leave_days))
+		self.assertEqual(
+			report[1][0].opening_balance,
+			(allocation1.new_leaves_allocated - leave_application.total_leave_days),
+		)
 
 		# Case 3: leave balance shows actual balance and not consumption balance as per remaining days near alloc end date
 		# eg: 3 days left for alloc to end, leave balance should still be 26 and not 3
-		filters = frappe._dict({
-			'from_date': add_days(self.year_end, -3),
-			'to_date': self.year_end,
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{
+				"from_date": add_days(self.year_end, -3),
+				"to_date": self.year_end,
+				"employee": self.employee_id,
+			}
+		)
 		report = execute(filters)
-		self.assertEqual(report[1][0].opening_balance, (allocation1.new_leaves_allocated - leave_application.total_leave_days))
+		self.assertEqual(
+			report[1][0].opening_balance,
+			(allocation1.new_leaves_allocated - leave_application.total_leave_days),
+		)
 
-	@set_holiday_list('_Test Emp Balance Holiday List', '_Test Company')
+	@set_holiday_list("_Test Emp Balance Holiday List", "_Test Company")
 	def test_opening_balance_considers_carry_forwarded_leaves(self):
-		leave_type = create_leave_type(
-			leave_type_name="_Test_CF_leave_expiry",
-			is_carry_forward=1)
+		leave_type = create_leave_type(leave_type_name="_Test_CF_leave_expiry", is_carry_forward=1)
 		leave_type.insert()
 
 		# 30 leaves allocated for first half of the year
-		allocation1 = make_allocation_record(employee=self.employee_id, from_date=self.year_start,
-			to_date=self.mid_year, leave_type=leave_type.name)
+		allocation1 = make_allocation_record(
+			employee=self.employee_id,
+			from_date=self.year_start,
+			to_date=self.mid_year,
+			leave_type=leave_type.name,
+		)
 		# 4 days leave application in the first allocation
 		first_sunday = get_first_sunday(self.holiday_list, for_date=self.year_start)
-		leave_application = make_leave_application(self.employee_id, first_sunday, add_days(first_sunday, 3), leave_type.name)
+		leave_application = make_leave_application(
+			self.employee_id, first_sunday, add_days(first_sunday, 3), leave_type.name
+		)
 		leave_application.reload()
 		# 30 leaves allocated for second half of the year + carry forward leaves (26) from the previous allocation
-		allocation2 = make_allocation_record(employee=self.employee_id, from_date=add_days(self.mid_year, 1), to_date=self.year_end,
-			carry_forward=True, leave_type=leave_type.name)
+		allocation2 = make_allocation_record(
+			employee=self.employee_id,
+			from_date=add_days(self.mid_year, 1),
+			to_date=self.year_end,
+			carry_forward=True,
+			leave_type=leave_type.name,
+		)
 
 		# Case 1: carry forwarded leaves considered in opening balance for second alloc
-		filters = frappe._dict({
-			'from_date': add_days(self.mid_year, 1),
-			'to_date': self.year_end,
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{
+				"from_date": add_days(self.mid_year, 1),
+				"to_date": self.year_end,
+				"employee": self.employee_id,
+			}
+		)
 		report = execute(filters)
 		# available leaves from old alloc
 		opening_balance = allocation1.new_leaves_allocated - leave_application.total_leave_days
 		self.assertEqual(report[1][0].opening_balance, opening_balance)
 
 		# Case 2: opening balance one day after alloc boundary = carry forwarded leaves + new leaves alloc
-		filters = frappe._dict({
-			'from_date': add_days(self.mid_year, 2),
-			'to_date': self.year_end,
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{
+				"from_date": add_days(self.mid_year, 2),
+				"to_date": self.year_end,
+				"employee": self.employee_id,
+			}
+		)
 		report = execute(filters)
 		# available leaves from old alloc
-		opening_balance = allocation2.new_leaves_allocated + (allocation1.new_leaves_allocated - leave_application.total_leave_days)
+		opening_balance = allocation2.new_leaves_allocated + (
+			allocation1.new_leaves_allocated - leave_application.total_leave_days
+		)
 		self.assertEqual(report[1][0].opening_balance, opening_balance)
diff --git a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
index 71c18bb..2a16dc4 100644
--- a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
+++ b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
@@ -19,11 +19,12 @@
 
 	return columns, data
 
+
 def get_columns(leave_types):
 	columns = [
 		_("Employee") + ":Link.Employee:150",
 		_("Employee Name") + "::200",
-		_("Department") +"::150"
+		_("Department") + "::150",
 	]
 
 	for leave_type in leave_types:
@@ -31,6 +32,7 @@
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = {
 		"status": "Active",
@@ -43,15 +45,18 @@
 
 	return conditions
 
+
 def get_data(filters, leave_types):
 	user = frappe.session.user
 	conditions = get_conditions(filters)
 
-	active_employees = frappe.get_list("Employee",
+	active_employees = frappe.get_list(
+		"Employee",
 		filters=conditions,
-		fields=["name", "employee_name", "department", "user_id", "leave_approver"])
+		fields=["name", "employee_name", "department", "user_id", "leave_approver"],
+	)
 
-	department_approver_map = get_department_leave_approver_map(filters.get('department'))
+	department_approver_map = get_department_leave_approver_map(filters.get("department"))
 
 	data = []
 	for employee in active_employees:
@@ -59,14 +64,18 @@
 		if employee.leave_approver:
 			leave_approvers.append(employee.leave_approver)
 
-		if (len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) or ("HR Manager" in frappe.get_roles(user)):
+		if (
+			(len(leave_approvers) and user in leave_approvers)
+			or (user in ["Administrator", employee.user_id])
+			or ("HR Manager" in frappe.get_roles(user))
+		):
 			row = [employee.name, employee.employee_name, employee.department]
 			available_leave = get_leave_details(employee.name, filters.date)
 			for leave_type in leave_types:
 				remaining = 0
 				if leave_type in available_leave["leave_allocation"]:
 					# opening balance
-					remaining = available_leave["leave_allocation"][leave_type]['remaining_leaves']
+					remaining = available_leave["leave_allocation"][leave_type]["remaining_leaves"]
 
 				row += [remaining]
 
diff --git a/erpnext/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py b/erpnext/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py
index 6f16a8d..34b665f 100644
--- a/erpnext/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py
+++ b/erpnext/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py
@@ -20,40 +20,59 @@
 	make_leave_application,
 )
 
-test_records = frappe.get_test_records('Leave Type')
+test_records = frappe.get_test_records("Leave Type")
+
 
 class TestEmployeeLeaveBalance(unittest.TestCase):
 	def setUp(self):
-		for dt in ['Leave Application', 'Leave Allocation', 'Salary Slip', 'Leave Ledger Entry', 'Leave Type']:
+		for dt in [
+			"Leave Application",
+			"Leave Allocation",
+			"Salary Slip",
+			"Leave Ledger Entry",
+			"Leave Type",
+		]:
 			frappe.db.delete(dt)
 
-		frappe.set_user('Administrator')
+		frappe.set_user("Administrator")
 
-		self.employee_id = make_employee('test_emp_leave_balance@example.com', company='_Test Company')
-		self.employee_id = make_employee('test_emp_leave_balance@example.com', company='_Test Company')
+		self.employee_id = make_employee("test_emp_leave_balance@example.com", company="_Test Company")
+		self.employee_id = make_employee("test_emp_leave_balance@example.com", company="_Test Company")
 
 		self.date = getdate()
 		self.year_start = getdate(get_year_start(self.date))
 		self.year_end = getdate(get_year_ending(self.date))
 
-		self.holiday_list = make_holiday_list('_Test Emp Balance Holiday List', self.year_start, self.year_end)
+		self.holiday_list = make_holiday_list(
+			"_Test Emp Balance Holiday List", self.year_start, self.year_end
+		)
 
 	def tearDown(self):
 		frappe.db.rollback()
 
-	@set_holiday_list('_Test Emp Balance Holiday List', '_Test Company')
+	@set_holiday_list("_Test Emp Balance Holiday List", "_Test Company")
 	def test_employee_leave_balance_summary(self):
 		frappe.get_doc(test_records[0]).insert()
 
 		# 5 leaves
-		allocation1 = make_allocation_record(employee=self.employee_id, from_date=add_days(self.year_start, -11),
-			to_date=add_days(self.year_start, -1), leaves=5)
+		allocation1 = make_allocation_record(
+			employee=self.employee_id,
+			from_date=add_days(self.year_start, -11),
+			to_date=add_days(self.year_start, -1),
+			leaves=5,
+		)
 		# 30 leaves
-		allocation2 = make_allocation_record(employee=self.employee_id, from_date=self.year_start, to_date=self.year_end)
+		allocation2 = make_allocation_record(
+			employee=self.employee_id, from_date=self.year_start, to_date=self.year_end
+		)
 
 		# 2 days leave within the first allocation
-		leave_application1 = make_leave_application(self.employee_id, add_days(self.year_start, -11), add_days(self.year_start, -10),
-			'_Test Leave Type')
+		leave_application1 = make_leave_application(
+			self.employee_id,
+			add_days(self.year_start, -11),
+			add_days(self.year_start, -10),
+			"_Test Leave Type",
+		)
 		leave_application1.reload()
 
 		# expires 3 leaves
@@ -61,57 +80,69 @@
 
 		# 4 days leave within the second allocation
 		first_sunday = get_first_sunday(self.holiday_list, for_date=self.year_start)
-		leave_application2 = make_leave_application(self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), '_Test Leave Type')
+		leave_application2 = make_leave_application(
+			self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), "_Test Leave Type"
+		)
 		leave_application2.reload()
 
-		filters = frappe._dict({
-			'date': add_days(leave_application2.to_date, 1),
-			'company': '_Test Company',
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{
+				"date": add_days(leave_application2.to_date, 1),
+				"company": "_Test Company",
+				"employee": self.employee_id,
+			}
+		)
 
 		report = execute(filters)
 
-		expected_data = [[
-			self.employee_id,
-			'test_emp_leave_balance@example.com',
-			frappe.db.get_value('Employee', self.employee_id, 'department'),
-			flt(
-				allocation1.new_leaves_allocated # allocated = 5
-				+ allocation2.new_leaves_allocated # allocated = 30
-				- leave_application1.total_leave_days # leaves taken in the 1st alloc = 2
-				- (allocation1.new_leaves_allocated - leave_application1.total_leave_days) # leaves expired from 1st alloc = 3
-				- leave_application2.total_leave_days # leaves taken in the 2nd alloc = 4
-			)
-		]]
+		expected_data = [
+			[
+				self.employee_id,
+				"test_emp_leave_balance@example.com",
+				frappe.db.get_value("Employee", self.employee_id, "department"),
+				flt(
+					allocation1.new_leaves_allocated  # allocated = 5
+					+ allocation2.new_leaves_allocated  # allocated = 30
+					- leave_application1.total_leave_days  # leaves taken in the 1st alloc = 2
+					- (
+						allocation1.new_leaves_allocated - leave_application1.total_leave_days
+					)  # leaves expired from 1st alloc = 3
+					- leave_application2.total_leave_days  # leaves taken in the 2nd alloc = 4
+				),
+			]
+		]
 
 		self.assertEqual(report[1], expected_data)
 
-	@set_holiday_list('_Test Emp Balance Holiday List', '_Test Company')
+	@set_holiday_list("_Test Emp Balance Holiday List", "_Test Company")
 	def test_get_leave_balance_near_alloc_expiry(self):
 		frappe.get_doc(test_records[0]).insert()
 
 		# 30 leaves allocated
-		allocation = make_allocation_record(employee=self.employee_id, from_date=self.year_start, to_date=self.year_end)
+		allocation = make_allocation_record(
+			employee=self.employee_id, from_date=self.year_start, to_date=self.year_end
+		)
 		# 4 days leave application in the first allocation
 		first_sunday = get_first_sunday(self.holiday_list, for_date=self.year_start)
-		leave_application = make_leave_application(self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), '_Test Leave Type')
+		leave_application = make_leave_application(
+			self.employee_id, add_days(first_sunday, 1), add_days(first_sunday, 4), "_Test Leave Type"
+		)
 		leave_application.reload()
 
 		# Leave balance should show actual balance, and not "consumption balance as per remaining days", near alloc end date
 		# eg: 3 days left for alloc to end, leave balance should still be 26 and not 3
-		filters = frappe._dict({
-			'date': add_days(self.year_end, -3),
-			'company': '_Test Company',
-			'employee': self.employee_id
-		})
+		filters = frappe._dict(
+			{"date": add_days(self.year_end, -3), "company": "_Test Company", "employee": self.employee_id}
+		)
 		report = execute(filters)
 
-		expected_data = [[
-			self.employee_id,
-			'test_emp_leave_balance@example.com',
-			frappe.db.get_value('Employee', self.employee_id, 'department'),
-			flt(allocation.new_leaves_allocated - leave_application.total_leave_days)
-		]]
+		expected_data = [
+			[
+				self.employee_id,
+				"test_emp_leave_balance@example.com",
+				frappe.db.get_value("Employee", self.employee_id, "department"),
+				flt(allocation.new_leaves_allocated - leave_application.total_leave_days),
+			]
+		]
 
 		self.assertEqual(report[1], expected_data)
diff --git a/erpnext/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/erpnext/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py
index 00a4a7c..f13fabf 100644
--- a/erpnext/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py
+++ b/erpnext/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py
@@ -21,16 +21,21 @@
 		_("Name") + ":Data:200",
 		_("Date") + ":Date:100",
 		_("Status") + ":Data:70",
-		_("Holiday") + ":Data:200"
+		_("Holiday") + ":Data:200",
 	]
 
+
 def get_employees(filters):
-	holiday_filter = [["holiday_date", ">=", filters.from_date], ["holiday_date", "<=", filters.to_date]]
+	holiday_filter = [
+		["holiday_date", ">=", filters.from_date],
+		["holiday_date", "<=", filters.to_date],
+	]
 	if filters.holiday_list:
 		holiday_filter.append(["parent", "=", filters.holiday_list])
 
-	holidays = frappe.get_all("Holiday", fields=["holiday_date", "description"],
-				filters=holiday_filter)
+	holidays = frappe.get_all(
+		"Holiday", fields=["holiday_date", "description"], filters=holiday_filter
+	)
 
 	holiday_names = {}
 	holidays_list = []
@@ -39,18 +44,23 @@
 		holidays_list.append(holiday.holiday_date)
 		holiday_names[holiday.holiday_date] = holiday.description
 
-	if(holidays_list):
+	if holidays_list:
 		cond = " attendance_date in %(holidays_list)s"
 
 		if filters.holiday_list:
-			cond += """ and (employee in (select employee from tabEmployee where holiday_list = %(holidays)s))"""
+			cond += (
+				""" and (employee in (select employee from tabEmployee where holiday_list = %(holidays)s))"""
+			)
 
-		employee_list = frappe.db.sql("""select
+		employee_list = frappe.db.sql(
+			"""select
 				employee, employee_name, attendance_date, status
 			from tabAttendance
-			where %s"""% cond.format(', '.join(["%s"] * len(holidays_list))),
-				{'holidays_list':holidays_list,
-				 'holidays':filters.holiday_list}, as_list=True)
+			where %s"""
+			% cond.format(", ".join(["%s"] * len(holidays_list))),
+			{"holidays_list": holidays_list, "holidays": filters.holiday_list},
+			as_list=True,
+		)
 
 		for employee_data in employee_list:
 			employee_data.append(holiday_names[employee_data[2]])
diff --git a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
index 9a993e5..8ea4989 100644
--- a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
+++ b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
@@ -15,21 +15,15 @@
 	"Weekly Off": "<b>WO</b>",
 	"On Leave": "L",
 	"Present": "P",
-	"Work From Home": "WFH"
-	}
+	"Work From Home": "WFH",
+}
 
-day_abbr = [
-	"Mon",
-	"Tue",
-	"Wed",
-	"Thu",
-	"Fri",
-	"Sat",
-	"Sun"
-]
+day_abbr = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
+
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if filters.hide_year_field == 1:
 		filters.year = 2020
@@ -44,14 +38,19 @@
 		emp_map, group_by_parameters = get_employee_details(filters.group_by, filters.company)
 		holiday_list = []
 		for parameter in group_by_parameters:
-			h_list = [emp_map[parameter][d]["holiday_list"] for d in emp_map[parameter] if emp_map[parameter][d]["holiday_list"]]
+			h_list = [
+				emp_map[parameter][d]["holiday_list"]
+				for d in emp_map[parameter]
+				if emp_map[parameter][d]["holiday_list"]
+			]
 			holiday_list += h_list
 	else:
 		emp_map = get_employee_details(filters.group_by, filters.company)
 		holiday_list = [emp_map[d]["holiday_list"] for d in emp_map if emp_map[d]["holiday_list"]]
 
-
-	default_holiday_list = frappe.get_cached_value('Company',  filters.get("company"),  "default_holiday_list")
+	default_holiday_list = frappe.get_cached_value(
+		"Company", filters.get("company"), "default_holiday_list"
+	)
 	holiday_list.append(default_holiday_list)
 	holiday_list = list(set(holiday_list))
 	holiday_map = get_holiday(holiday_list, filters["month"])
@@ -70,20 +69,39 @@
 		for parameter in group_by_parameters:
 			emp_map_set = set([key for key in emp_map[parameter].keys()])
 			att_map_set = set([key for key in att_map.keys()])
-			if (att_map_set & emp_map_set):
-				parameter_row = ["<b>"+ parameter + "</b>"] + ['' for day in range(filters["total_days_in_month"] + 2)]
+			if att_map_set & emp_map_set:
+				parameter_row = ["<b>" + parameter + "</b>"] + [
+					"" for day in range(filters["total_days_in_month"] + 2)
+				]
 				data.append(parameter_row)
-				record, emp_att_data = add_data(emp_map[parameter], att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=leave_types)
+				record, emp_att_data = add_data(
+					emp_map[parameter],
+					att_map,
+					filters,
+					holiday_map,
+					conditions,
+					default_holiday_list,
+					leave_types=leave_types,
+				)
 				emp_att_map.update(emp_att_data)
 				data += record
 	else:
-		record, emp_att_map = add_data(emp_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=leave_types)
+		record, emp_att_map = add_data(
+			emp_map,
+			att_map,
+			filters,
+			holiday_map,
+			conditions,
+			default_holiday_list,
+			leave_types=leave_types,
+		)
 		data += record
 
 	chart_data = get_chart_data(emp_att_map, days)
 
 	return columns, data, None, chart_data
 
+
 def get_chart_data(emp_att_map, days):
 	labels = []
 	datasets = [
@@ -110,24 +128,20 @@
 				if emp_att_map[emp][idx] == "L":
 					total_leave_on_day += 1
 
-
 		datasets[0]["values"].append(total_absent_on_day)
 		datasets[1]["values"].append(total_present_on_day)
 		datasets[2]["values"].append(total_leave_on_day)
 
-
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		}
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}}
 
 	chart["type"] = "line"
 
 	return chart
 
-def add_data(employee_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=None):
+
+def add_data(
+	employee_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=None
+):
 
 	record = []
 	emp_att_map = {}
@@ -141,7 +155,7 @@
 			row += [" "]
 		row += [emp, emp_det.employee_name]
 
-		total_p = total_a = total_l = total_h = total_um= 0.0
+		total_p = total_a = total_l = total_h = total_um = 0.0
 		emp_status_map = []
 		for day in range(filters["total_days_in_month"]):
 			status = None
@@ -152,7 +166,7 @@
 
 				if emp_holiday_list in holiday_map:
 					for idx, ele in enumerate(holiday_map[emp_holiday_list]):
-						if day+1 == holiday_map[emp_holiday_list][idx][0]:
+						if day + 1 == holiday_map[emp_holiday_list][idx][0]:
 							if holiday_map[emp_holiday_list][idx][1]:
 								status = "Weekly Off"
 							else:
@@ -162,7 +176,7 @@
 			abbr = status_map.get(status, "")
 			emp_status_map.append(abbr)
 
-			if  filters.summarized_view:
+			if filters.summarized_view:
 				if status == "Present" or status == "Work From Home":
 					total_p += 1
 				elif status == "Absent":
@@ -189,12 +203,21 @@
 			filters.update({"employee": emp})
 
 		if filters.summarized_view:
-			leave_details = frappe.db.sql("""select leave_type, status, count(*) as count from `tabAttendance`\
-				where leave_type is not NULL %s group by leave_type, status""" % conditions, filters, as_dict=1)
+			leave_details = frappe.db.sql(
+				"""select leave_type, status, count(*) as count from `tabAttendance`\
+				where leave_type is not NULL %s group by leave_type, status"""
+				% conditions,
+				filters,
+				as_dict=1,
+			)
 
-			time_default_counts = frappe.db.sql("""select (select count(*) from `tabAttendance` where \
+			time_default_counts = frappe.db.sql(
+				"""select (select count(*) from `tabAttendance` where \
 				late_entry = 1 %s) as late_entry_count, (select count(*) from tabAttendance where \
-				early_exit = 1 %s) as early_exit_count""" % (conditions, conditions), filters)
+				early_exit = 1 %s) as early_exit_count"""
+				% (conditions, conditions),
+				filters,
+			)
 
 			leaves = {}
 			for d in leave_details:
@@ -211,38 +234,48 @@
 				else:
 					row.append("0.0")
 
-			row.extend([time_default_counts[0][0],time_default_counts[0][1]])
+			row.extend([time_default_counts[0][0], time_default_counts[0][1]])
 		emp_att_map[emp] = emp_status_map
 		record.append(row)
 
 	return record, emp_att_map
 
+
 def get_columns(filters):
 
 	columns = []
 
 	if filters.group_by:
-		columns = [_(filters.group_by)+ ":Link/Branch:120"]
+		columns = [_(filters.group_by) + ":Link/Branch:120"]
 
-	columns += [
-		_("Employee") + ":Link/Employee:120", _("Employee Name") + ":Data/:120"
-	]
+	columns += [_("Employee") + ":Link/Employee:120", _("Employee Name") + ":Data/:120"]
 	days = []
 	for day in range(filters["total_days_in_month"]):
-		date = str(filters.year) + "-" + str(filters.month)+ "-" + str(day+1)
+		date = str(filters.year) + "-" + str(filters.month) + "-" + str(day + 1)
 		day_name = day_abbr[getdate(date).weekday()]
-		days.append(cstr(day+1)+ " " +day_name +"::65")
+		days.append(cstr(day + 1) + " " + day_name + "::65")
 	if not filters.summarized_view:
 		columns += days
 
 	if filters.summarized_view:
-		columns += [_("Total Present") + ":Float:120", _("Total Leaves") + ":Float:120",  _("Total Absent") + ":Float:120", _("Total Holidays") + ":Float:120", _("Unmarked Days")+ ":Float:120"]
+		columns += [
+			_("Total Present") + ":Float:120",
+			_("Total Leaves") + ":Float:120",
+			_("Total Absent") + ":Float:120",
+			_("Total Holidays") + ":Float:120",
+			_("Unmarked Days") + ":Float:120",
+		]
 	return columns, days
 
+
 def get_attendance_list(conditions, filters):
-	attendance_list = frappe.db.sql("""select employee, day(attendance_date) as day_of_month,
-		status from tabAttendance where docstatus = 1 %s order by employee, attendance_date""" %
-		conditions, filters, as_dict=1)
+	attendance_list = frappe.db.sql(
+		"""select employee, day(attendance_date) as day_of_month,
+		status from tabAttendance where docstatus = 1 %s order by employee, attendance_date"""
+		% conditions,
+		filters,
+		as_dict=1,
+	)
 
 	if not attendance_list:
 		msgprint(_("No attendance record found"), alert=True, indicator="orange")
@@ -254,6 +287,7 @@
 
 	return att_map
 
+
 def get_conditions(filters):
 	if not (filters.get("month") and filters.get("year")):
 		msgprint(_("Please select month and year"), raise_exception=1)
@@ -262,29 +296,35 @@
 
 	conditions = " and month(attendance_date) = %(month)s and year(attendance_date) = %(year)s"
 
-	if filters.get("company"): conditions += " and company = %(company)s"
-	if filters.get("employee"): conditions += " and employee = %(employee)s"
+	if filters.get("company"):
+		conditions += " and company = %(company)s"
+	if filters.get("employee"):
+		conditions += " and employee = %(employee)s"
 
 	return conditions, filters
 
+
 def get_employee_details(group_by, company):
 	emp_map = {}
 	query = """select name, employee_name, designation, department, branch, company,
-		holiday_list from `tabEmployee` where company = %s """ % frappe.db.escape(company)
+		holiday_list from `tabEmployee` where company = %s """ % frappe.db.escape(
+		company
+	)
 
 	if group_by:
 		group_by = group_by.lower()
 		query += " order by " + group_by + " ASC"
 
-	employee_details = frappe.db.sql(query , as_dict=1)
+	employee_details = frappe.db.sql(query, as_dict=1)
 
 	group_by_parameters = []
 	if group_by:
 
-		group_by_parameters = list(set(detail.get(group_by, "") for detail in employee_details if detail.get(group_by, "")))
+		group_by_parameters = list(
+			set(detail.get(group_by, "") for detail in employee_details if detail.get(group_by, ""))
+		)
 		for parameter in group_by_parameters:
-				emp_map[parameter] = {}
-
+			emp_map[parameter] = {}
 
 	for d in employee_details:
 		if group_by and len(group_by_parameters):
@@ -299,18 +339,28 @@
 	else:
 		return emp_map, group_by_parameters
 
+
 def get_holiday(holiday_list, month):
 	holiday_map = frappe._dict()
 	for d in holiday_list:
 		if d:
-			holiday_map.setdefault(d, frappe.db.sql('''select day(holiday_date), weekly_off from `tabHoliday`
-				where parent=%s and month(holiday_date)=%s''', (d, month)))
+			holiday_map.setdefault(
+				d,
+				frappe.db.sql(
+					"""select day(holiday_date), weekly_off from `tabHoliday`
+				where parent=%s and month(holiday_date)=%s""",
+					(d, month),
+				),
+			)
 
 	return holiday_map
 
+
 @frappe.whitelist()
 def get_attendance_years():
-	year_list = frappe.db.sql_list("""select distinct YEAR(attendance_date) from tabAttendance ORDER BY YEAR(attendance_date) DESC""")
+	year_list = frappe.db.sql_list(
+		"""select distinct YEAR(attendance_date) from tabAttendance ORDER BY YEAR(attendance_date) DESC"""
+	)
 	if not year_list:
 		year_list = [getdate().year]
 
diff --git a/erpnext/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py b/erpnext/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py
index 952af81..91da08e 100644
--- a/erpnext/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py
+++ b/erpnext/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py
@@ -11,31 +11,33 @@
 class TestMonthlyAttendanceSheet(FrappeTestCase):
 	def setUp(self):
 		self.employee = make_employee("test_employee@example.com")
-		frappe.db.delete('Attendance', {'employee': self.employee})
+		frappe.db.delete("Attendance", {"employee": self.employee})
 
 	def test_monthly_attendance_sheet_report(self):
 		now = now_datetime()
 		previous_month = now.month - 1
 		previous_month_first = now.replace(day=1).replace(month=previous_month).date()
 
-		company = frappe.db.get_value('Employee', self.employee, 'company')
+		company = frappe.db.get_value("Employee", self.employee, "company")
 
 		# mark different attendance status on first 3 days of previous month
-		mark_attendance(self.employee, previous_month_first, 'Absent')
-		mark_attendance(self.employee, previous_month_first + relativedelta(days=1), 'Present')
-		mark_attendance(self.employee, previous_month_first + relativedelta(days=2), 'On Leave')
+		mark_attendance(self.employee, previous_month_first, "Absent")
+		mark_attendance(self.employee, previous_month_first + relativedelta(days=1), "Present")
+		mark_attendance(self.employee, previous_month_first + relativedelta(days=2), "On Leave")
 
-		filters = frappe._dict({
-			'month': previous_month,
-			'year': now.year,
-			'company': company,
-		})
+		filters = frappe._dict(
+			{
+				"month": previous_month,
+				"year": now.year,
+				"company": company,
+			}
+		)
 		report = execute(filters=filters)
 		employees = report[1][0]
-		datasets = report[3]['data']['datasets']
-		absent = datasets[0]['values']
-		present = datasets[1]['values']
-		leaves = datasets[2]['values']
+		datasets = report[3]["data"]["datasets"]
+		absent = datasets[0]["values"]
+		present = datasets[1]["values"]
+		leaves = datasets[2]["values"]
 
 		# ensure correct attendance is reflect on the report
 		self.assertIn(self.employee, employees)
diff --git a/erpnext/hr/report/recruitment_analytics/recruitment_analytics.py b/erpnext/hr/report/recruitment_analytics/recruitment_analytics.py
index 6383a9b..b6caf40 100644
--- a/erpnext/hr/report/recruitment_analytics/recruitment_analytics.py
+++ b/erpnext/hr/report/recruitment_analytics/recruitment_analytics.py
@@ -8,7 +8,8 @@
 
 def execute(filters=None):
 
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 	filters = frappe._dict(filters)
 
 	columns = get_columns()
@@ -25,67 +26,53 @@
 			"fieldtype": "Link",
 			"fieldname": "staffing_plan",
 			"options": "Staffing Plan",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Job Opening"),
 			"fieldtype": "Link",
 			"fieldname": "job_opening",
 			"options": "Job Opening",
-			"width": 105
+			"width": 105,
 		},
 		{
 			"label": _("Job Applicant"),
 			"fieldtype": "Link",
 			"fieldname": "job_applicant",
 			"options": "Job Applicant",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Applicant name"),
-			"fieldtype": "data",
-			"fieldname": "applicant_name",
-			"width": 130
-		},
+		{"label": _("Applicant name"), "fieldtype": "data", "fieldname": "applicant_name", "width": 130},
 		{
 			"label": _("Application Status"),
 			"fieldtype": "Data",
 			"fieldname": "application_status",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Job Offer"),
 			"fieldtype": "Link",
 			"fieldname": "job_offer",
 			"options": "job Offer",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Designation"),
-			"fieldtype": "Data",
-			"fieldname": "designation",
-			"width": 100
-		},
-		{
-			"label": _("Offer Date"),
-			"fieldtype": "date",
-			"fieldname": "offer_date",
-			"width": 100
-		},
+		{"label": _("Designation"), "fieldtype": "Data", "fieldname": "designation", "width": 100},
+		{"label": _("Offer Date"), "fieldtype": "date", "fieldname": "offer_date", "width": 100},
 		{
 			"label": _("Job Offer status"),
 			"fieldtype": "Data",
 			"fieldname": "job_offer_status",
-			"width": 150
-		}
+			"width": 150,
+		},
 	]
 
+
 def get_data(filters):
 	data = []
 	staffing_plan_details = get_staffing_plan(filters)
-	staffing_plan_list  = list(set([details["name"] for details in staffing_plan_details]))
-	sp_jo_map , jo_list = get_job_opening(staffing_plan_list)
-	jo_ja_map , ja_list = get_job_applicant(jo_list)
+	staffing_plan_list = list(set([details["name"] for details in staffing_plan_details]))
+	sp_jo_map, jo_list = get_job_opening(staffing_plan_list)
+	jo_ja_map, ja_list = get_job_applicant(jo_list)
 	ja_joff_map = get_job_offer(ja_list)
 
 	for sp in sp_jo_map.keys():
@@ -100,37 +87,40 @@
 	if sp in sp_jo_map.keys():
 		for jo in sp_jo_map[sp]:
 			row = {
-				"staffing_plan" : sp,
-				"job_opening" : jo["name"],
+				"staffing_plan": sp,
+				"job_opening": jo["name"],
 			}
 			data.append(row)
-			child_row = get_child_row( jo["name"], jo_ja_map, ja_joff_map)
+			child_row = get_child_row(jo["name"], jo_ja_map, ja_joff_map)
 			data += child_row
 	return data
 
+
 def get_child_row(jo, jo_ja_map, ja_joff_map):
 	data = []
 	if jo in jo_ja_map.keys():
 		for ja in jo_ja_map[jo]:
 			row = {
-				"indent":1,
+				"indent": 1,
 				"job_applicant": ja.name,
 				"applicant_name": ja.applicant_name,
 				"application_status": ja.status,
 			}
 			if ja.name in ja_joff_map.keys():
-				jo_detail =ja_joff_map[ja.name][0]
+				jo_detail = ja_joff_map[ja.name][0]
 				row["job_offer"] = jo_detail.name
 				row["job_offer_status"] = jo_detail.status
-				row["offer_date"]= jo_detail.offer_date.strftime("%d-%m-%Y")
+				row["offer_date"] = jo_detail.offer_date.strftime("%d-%m-%Y")
 				row["designation"] = jo_detail.designation
 
 			data.append(row)
 	return data
 
+
 def get_staffing_plan(filters):
 
-	staffing_plan = frappe.db.sql("""
+	staffing_plan = frappe.db.sql(
+		"""
 	select
 		sp.name, sp.department, spd.designation, spd.vacancies, spd.current_count, spd.parent, sp.to_date
 	from
@@ -139,13 +129,20 @@
 			spd.parent = sp.name
 		And
 			sp.to_date > '{0}'
-		""".format(filters.on_date), as_dict = 1)
+		""".format(
+			filters.on_date
+		),
+		as_dict=1,
+	)
 
 	return staffing_plan
 
+
 def get_job_opening(sp_list):
 
-	job_openings = frappe.get_all("Job Opening", filters = [["staffing_plan", "IN", sp_list]], fields =["name", "staffing_plan"])
+	job_openings = frappe.get_all(
+		"Job Opening", filters=[["staffing_plan", "IN", sp_list]], fields=["name", "staffing_plan"]
+	)
 
 	sp_jo_map = {}
 	jo_list = []
@@ -160,12 +157,17 @@
 
 	return sp_jo_map, jo_list
 
+
 def get_job_applicant(jo_list):
 
 	jo_ja_map = {}
-	ja_list =[]
+	ja_list = []
 
-	applicants = frappe.get_all("Job Applicant", filters = [["job_title", "IN", jo_list]], fields =["name", "job_title","applicant_name", 'status'])
+	applicants = frappe.get_all(
+		"Job Applicant",
+		filters=[["job_title", "IN", jo_list]],
+		fields=["name", "job_title", "applicant_name", "status"],
+	)
 
 	for applicant in applicants:
 		if applicant.job_title not in jo_ja_map.keys():
@@ -175,12 +177,17 @@
 
 		ja_list.append(applicant.name)
 
-	return jo_ja_map , ja_list
+	return jo_ja_map, ja_list
+
 
 def get_job_offer(ja_list):
 	ja_joff_map = {}
 
-	offers = frappe.get_all("Job Offer", filters = [["job_applicant", "IN", ja_list]], fields =["name", "job_applicant", "status", 'offer_date', 'designation'])
+	offers = frappe.get_all(
+		"Job Offer",
+		filters=[["job_applicant", "IN", ja_list]],
+		fields=["name", "job_applicant", "status", "offer_date", "designation"],
+	)
 
 	for offer in offers:
 		if offer.job_applicant not in ja_joff_map.keys():
diff --git a/erpnext/hr/report/vehicle_expenses/test_vehicle_expenses.py b/erpnext/hr/report/vehicle_expenses/test_vehicle_expenses.py
index 8672e68..da6dace 100644
--- a/erpnext/hr/report/vehicle_expenses/test_vehicle_expenses.py
+++ b/erpnext/hr/report/vehicle_expenses/test_vehicle_expenses.py
@@ -17,12 +17,14 @@
 class TestVehicleExpenses(unittest.TestCase):
 	@classmethod
 	def setUpClass(self):
-		frappe.db.sql('delete from `tabVehicle Log`')
+		frappe.db.sql("delete from `tabVehicle Log`")
 
-		employee_id = frappe.db.sql('''select name from `tabEmployee` where name="testdriver@example.com"''')
+		employee_id = frappe.db.sql(
+			'''select name from `tabEmployee` where name="testdriver@example.com"'''
+		)
 		self.employee_id = employee_id[0][0] if employee_id else None
 		if not self.employee_id:
-			self.employee_id = make_employee('testdriver@example.com', company='_Test Company')
+			self.employee_id = make_employee("testdriver@example.com", company="_Test Company")
 
 		self.license_plate = get_vehicle(self.employee_id)
 
@@ -31,36 +33,35 @@
 		expense_claim = make_expense_claim(vehicle_log.name)
 
 		# Based on Fiscal Year
-		filters = {
-			'filter_based_on': 'Fiscal Year',
-			'fiscal_year': get_fiscal_year(getdate())[0]
-		}
+		filters = {"filter_based_on": "Fiscal Year", "fiscal_year": get_fiscal_year(getdate())[0]}
 
 		report = execute(filters)
 
-		expected_data = [{
-			'vehicle': self.license_plate,
-			'make': 'Maruti',
-			'model': 'PCM',
-			'location': 'Mumbai',
-			'log_name': vehicle_log.name,
-			'odometer': 5010,
-			'date': getdate(),
-			'fuel_qty': 50.0,
-			'fuel_price': 500.0,
-			'fuel_expense': 25000.0,
-			'service_expense': 2000.0,
-			'employee': self.employee_id
-		}]
+		expected_data = [
+			{
+				"vehicle": self.license_plate,
+				"make": "Maruti",
+				"model": "PCM",
+				"location": "Mumbai",
+				"log_name": vehicle_log.name,
+				"odometer": 5010,
+				"date": getdate(),
+				"fuel_qty": 50.0,
+				"fuel_price": 500.0,
+				"fuel_expense": 25000.0,
+				"service_expense": 2000.0,
+				"employee": self.employee_id,
+			}
+		]
 
 		self.assertEqual(report[1], expected_data)
 
 		# Based on Date Range
 		fiscal_year = get_fiscal_year(getdate(), as_dict=True)
 		filters = {
-			'filter_based_on': 'Date Range',
-			'from_date': fiscal_year.year_start_date,
-			'to_date': fiscal_year.year_end_date
+			"filter_based_on": "Date Range",
+			"from_date": fiscal_year.year_start_date,
+			"to_date": fiscal_year.year_end_date,
 		}
 
 		report = execute(filters)
@@ -68,9 +69,9 @@
 
 		# clean up
 		vehicle_log.cancel()
-		frappe.delete_doc('Expense Claim', expense_claim.name)
-		frappe.delete_doc('Vehicle Log', vehicle_log.name)
+		frappe.delete_doc("Expense Claim", expense_claim.name)
+		frappe.delete_doc("Vehicle Log", vehicle_log.name)
 
 	def tearDown(self):
-		frappe.delete_doc('Vehicle', self.license_plate, force=1)
-		frappe.delete_doc('Employee', self.employee_id, force=1)
+		frappe.delete_doc("Vehicle", self.license_plate, force=1)
+		frappe.delete_doc("Employee", self.employee_id, force=1)
diff --git a/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py b/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
index 17d1e9d..fc5510d 100644
--- a/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
+++ b/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
@@ -18,83 +18,44 @@
 
 	return columns, data, None, chart
 
+
 def get_columns():
 	return [
 		{
-			'fieldname': 'vehicle',
-			'fieldtype': 'Link',
-			'label': _('Vehicle'),
-			'options': 'Vehicle',
-			'width': 150
+			"fieldname": "vehicle",
+			"fieldtype": "Link",
+			"label": _("Vehicle"),
+			"options": "Vehicle",
+			"width": 150,
+		},
+		{"fieldname": "make", "fieldtype": "Data", "label": _("Make"), "width": 100},
+		{"fieldname": "model", "fieldtype": "Data", "label": _("Model"), "width": 80},
+		{"fieldname": "location", "fieldtype": "Data", "label": _("Location"), "width": 100},
+		{
+			"fieldname": "log_name",
+			"fieldtype": "Link",
+			"label": _("Vehicle Log"),
+			"options": "Vehicle Log",
+			"width": 100,
+		},
+		{"fieldname": "odometer", "fieldtype": "Int", "label": _("Odometer Value"), "width": 120},
+		{"fieldname": "date", "fieldtype": "Date", "label": _("Date"), "width": 100},
+		{"fieldname": "fuel_qty", "fieldtype": "Float", "label": _("Fuel Qty"), "width": 80},
+		{"fieldname": "fuel_price", "fieldtype": "Float", "label": _("Fuel Price"), "width": 100},
+		{"fieldname": "fuel_expense", "fieldtype": "Currency", "label": _("Fuel Expense"), "width": 150},
+		{
+			"fieldname": "service_expense",
+			"fieldtype": "Currency",
+			"label": _("Service Expense"),
+			"width": 150,
 		},
 		{
-			'fieldname': 'make',
-			'fieldtype': 'Data',
-			'label': _('Make'),
-			'width': 100
+			"fieldname": "employee",
+			"fieldtype": "Link",
+			"label": _("Employee"),
+			"options": "Employee",
+			"width": 150,
 		},
-		{
-			'fieldname': 'model',
-			'fieldtype': 'Data',
-			'label': _('Model'),
-			'width': 80
-		},
-		{
-			'fieldname': 'location',
-			'fieldtype': 'Data',
-			'label': _('Location'),
-			'width': 100
-		},
-		{
-			'fieldname': 'log_name',
-			'fieldtype': 'Link',
-			'label': _('Vehicle Log'),
-			'options': 'Vehicle Log',
-			'width': 100
-		},
-		{
-			'fieldname': 'odometer',
-			'fieldtype': 'Int',
-			'label': _('Odometer Value'),
-			'width': 120
-		},
-		{
-			'fieldname': 'date',
-			'fieldtype': 'Date',
-			'label': _('Date'),
-			'width': 100
-		},
-		{
-			'fieldname': 'fuel_qty',
-			'fieldtype': 'Float',
-			'label': _('Fuel Qty'),
-			'width': 80
-		},
-		{
-			'fieldname': 'fuel_price',
-			'fieldtype': 'Float',
-			'label': _('Fuel Price'),
-			'width': 100
-		},
-		{
-			'fieldname': 'fuel_expense',
-			'fieldtype': 'Currency',
-			'label': _('Fuel Expense'),
-			'width': 150
-		},
-		{
-			'fieldname': 'service_expense',
-			'fieldtype': 'Currency',
-			'label': _('Service Expense'),
-			'width': 150
-		},
-		{
-			'fieldname': 'employee',
-			'fieldtype': 'Link',
-			'label': _('Employee'),
-			'options': 'Employee',
-			'width': 150
-		}
 	]
 
 
@@ -102,7 +63,8 @@
 	start_date, end_date = get_period_dates(filters)
 	conditions, values = get_conditions(filters)
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		SELECT
 			vhcl.license_plate as vehicle, vhcl.make, vhcl.model,
 			vhcl.location, log.name as log_name, log.odometer,
@@ -116,58 +78,70 @@
 			and log.docstatus = 1
 			and date between %(start_date)s and %(end_date)s
 			{0}
-		ORDER BY date""".format(conditions), values, as_dict=1)
+		ORDER BY date""".format(
+			conditions
+		),
+		values,
+		as_dict=1,
+	)
 
 	for row in data:
-		row['service_expense'] = get_service_expense(row.log_name)
+		row["service_expense"] = get_service_expense(row.log_name)
 
 	return data
 
 
 def get_conditions(filters):
-	conditions = ''
+	conditions = ""
 
 	start_date, end_date = get_period_dates(filters)
-	values = {
-		'start_date': start_date,
-		'end_date': end_date
-	}
+	values = {"start_date": start_date, "end_date": end_date}
 
 	if filters.employee:
-		conditions += ' and log.employee = %(employee)s'
-		values['employee'] = filters.employee
+		conditions += " and log.employee = %(employee)s"
+		values["employee"] = filters.employee
 
 	if filters.vehicle:
-		conditions += ' and vhcl.license_plate = %(vehicle)s'
-		values['vehicle'] = filters.vehicle
+		conditions += " and vhcl.license_plate = %(vehicle)s"
+		values["vehicle"] = filters.vehicle
 
 	return conditions, values
 
 
 def get_period_dates(filters):
-	if filters.filter_based_on == 'Fiscal Year' and filters.fiscal_year:
-		fy = frappe.db.get_value('Fiscal Year', filters.fiscal_year,
-			['year_start_date', 'year_end_date'], as_dict=True)
+	if filters.filter_based_on == "Fiscal Year" and filters.fiscal_year:
+		fy = frappe.db.get_value(
+			"Fiscal Year", filters.fiscal_year, ["year_start_date", "year_end_date"], as_dict=True
+		)
 		return fy.year_start_date, fy.year_end_date
 	else:
 		return filters.from_date, filters.to_date
 
 
 def get_service_expense(logname):
-	expense_amount = frappe.db.sql("""
+	expense_amount = frappe.db.sql(
+		"""
 		SELECT sum(expense_amount)
 		FROM
 			`tabVehicle Log` log, `tabVehicle Service` service
 		WHERE
 			service.parent=log.name and log.name=%s
-	""", logname)
+	""",
+		logname,
+	)
 
 	return flt(expense_amount[0][0]) if expense_amount else 0.0
 
 
 def get_chart_data(data, filters):
-	period_list = get_period_list(filters.fiscal_year, filters.fiscal_year,
-		filters.from_date, filters.to_date, filters.filter_based_on, 'Monthly')
+	period_list = get_period_list(
+		filters.fiscal_year,
+		filters.fiscal_year,
+		filters.from_date,
+		filters.to_date,
+		filters.filter_based_on,
+		"Monthly",
+	)
 
 	fuel_data, service_data = [], []
 
@@ -184,29 +158,20 @@
 		service_data.append([period.key, total_service_exp])
 
 	labels = [period.label for period in period_list]
-	fuel_exp_data= [row[1] for row in fuel_data]
-	service_exp_data= [row[1] for row in service_data]
+	fuel_exp_data = [row[1] for row in fuel_data]
+	service_exp_data = [row[1] for row in service_data]
 
 	datasets = []
 	if fuel_exp_data:
-		datasets.append({
-			'name': _('Fuel Expenses'),
-			'values': fuel_exp_data
-		})
+		datasets.append({"name": _("Fuel Expenses"), "values": fuel_exp_data})
 
 	if service_exp_data:
-		datasets.append({
-			'name': _('Service Expenses'),
-			'values': service_exp_data
-		})
+		datasets.append({"name": _("Service Expenses"), "values": service_exp_data})
 
 	chart = {
-		'data': {
-			'labels': labels,
-			'datasets': datasets
-		},
-		'type': 'line',
-		'fieldtype': 'Currency'
+		"data": {"labels": labels, "datasets": datasets},
+		"type": "line",
+		"fieldtype": "Currency",
 	}
 
 	return chart
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index c174047..fd69a9b 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -23,20 +23,26 @@
 )
 
 
-class DuplicateDeclarationError(frappe.ValidationError): pass
+class DuplicateDeclarationError(frappe.ValidationError):
+	pass
+
 
 def set_employee_name(doc):
 	if doc.employee and not doc.employee_name:
 		doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name")
 
+
 def update_employee_work_history(employee, details, date=None, cancel=False):
 	if not employee.internal_work_history and not cancel:
-		employee.append("internal_work_history", {
-			"branch": employee.branch,
-			"designation": employee.designation,
-			"department": employee.department,
-			"from_date": employee.date_of_joining
-		})
+		employee.append(
+			"internal_work_history",
+			{
+				"branch": employee.branch,
+				"designation": employee.designation,
+				"department": employee.department,
+				"from_date": employee.date_of_joining,
+			},
+		)
 
 	internal_work_history = {}
 	for item in details:
@@ -47,7 +53,7 @@
 		new_data = item.new if not cancel else item.current
 		if fieldtype == "Date" and new_data:
 			new_data = getdate(new_data)
-		elif fieldtype =="Datetime" and new_data:
+		elif fieldtype == "Datetime" and new_data:
 			new_data = get_datetime(new_data)
 		setattr(employee, item.fieldname, new_data)
 		if item.fieldname in ["department", "designation", "branch"]:
@@ -62,6 +68,7 @@
 
 	return employee
 
+
 def delete_employee_work_history(details, employee, date):
 	filters = {}
 	for d in details:
@@ -85,12 +92,25 @@
 def get_employee_fields_label():
 	fields = []
 	for df in frappe.get_meta("Employee").get("fields"):
-		if df.fieldname in ["salutation", "user_id", "employee_number", "employment_type",
-			"holiday_list", "branch", "department", "designation", "grade",
-			"notice_number_of_days", "reports_to", "leave_policy", "company_email"]:
-				fields.append({"value": df.fieldname, "label": df.label})
+		if df.fieldname in [
+			"salutation",
+			"user_id",
+			"employee_number",
+			"employment_type",
+			"holiday_list",
+			"branch",
+			"department",
+			"designation",
+			"grade",
+			"notice_number_of_days",
+			"reports_to",
+			"leave_policy",
+			"company_email",
+		]:
+			fields.append({"value": df.fieldname, "label": df.label})
 	return fields
 
+
 @frappe.whitelist()
 def get_employee_field_property(employee, fieldname):
 	if employee and fieldname:
@@ -101,17 +121,15 @@
 			value = formatdate(value)
 		elif field.fieldtype == "Datetime":
 			value = format_datetime(value)
-		return {
-			"value" : value,
-			"datatype" : field.fieldtype,
-			"label" : field.label,
-			"options" : options
-		}
+		return {"value": value, "datatype": field.fieldtype, "label": field.label, "options": options}
 	else:
 		return False
 
+
 def validate_dates(doc, from_date, to_date):
-	date_of_joining, relieving_date = frappe.db.get_value("Employee", doc.employee, ["date_of_joining", "relieving_date"])
+	date_of_joining, relieving_date = frappe.db.get_value(
+		"Employee", doc.employee, ["date_of_joining", "relieving_date"]
+	)
 	if getdate(from_date) > getdate(to_date):
 		frappe.throw(_("To date can not be less than from date"))
 	elif getdate(from_date) > getdate(nowdate()):
@@ -121,7 +139,8 @@
 	elif relieving_date and getdate(to_date) > getdate(relieving_date):
 		frappe.throw(_("To date can not greater than employee's relieving date"))
 
-def validate_overlap(doc, from_date, to_date, company = None):
+
+def validate_overlap(doc, from_date, to_date, company=None):
 	query = """
 		select name
 		from `tab{0}`
@@ -131,15 +150,19 @@
 
 	if not doc.name:
 		# hack! if name is null, it could cause problems with !=
-		doc.name = "New "+doc.doctype
+		doc.name = "New " + doc.doctype
 
-	overlap_doc = frappe.db.sql(query.format(doc.doctype),{
+	overlap_doc = frappe.db.sql(
+		query.format(doc.doctype),
+		{
 			"employee": doc.get("employee"),
 			"from_date": from_date,
 			"to_date": to_date,
 			"name": doc.name,
-			"company": company
-		}, as_dict = 1)
+			"company": company,
+		},
+		as_dict=1,
+	)
 
 	if overlap_doc:
 		if doc.get("employee"):
@@ -148,6 +171,7 @@
 			exists_for = company
 		throw_overlap_error(doc, exists_for, overlap_doc[0].name, from_date, to_date)
 
+
 def get_doc_condition(doctype):
 	if doctype == "Compensatory Leave Request":
 		return "and employee = %(employee)s and docstatus < 2 \
@@ -159,23 +183,36 @@
 			or to_date between %(from_date)s and %(to_date)s \
 			or (from_date < %(from_date)s and to_date > %(to_date)s))"
 
+
 def throw_overlap_error(doc, exists_for, overlap_doc, from_date, to_date):
-	msg = _("A {0} exists between {1} and {2} (").format(doc.doctype,
-		formatdate(from_date), formatdate(to_date)) \
-		+ """ <b><a href="/app/Form/{0}/{1}">{1}</a></b>""".format(doc.doctype, overlap_doc) \
+	msg = (
+		_("A {0} exists between {1} and {2} (").format(
+			doc.doctype, formatdate(from_date), formatdate(to_date)
+		)
+		+ """ <b><a href="/app/Form/{0}/{1}">{1}</a></b>""".format(doc.doctype, overlap_doc)
 		+ _(") for {0}").format(exists_for)
+	)
 	frappe.throw(msg)
 
+
 def validate_duplicate_exemption_for_payroll_period(doctype, docname, payroll_period, employee):
-	existing_record = frappe.db.exists(doctype, {
-		"payroll_period": payroll_period,
-		"employee": employee,
-		'docstatus': ['<', 2],
-		'name': ['!=', docname]
-	})
+	existing_record = frappe.db.exists(
+		doctype,
+		{
+			"payroll_period": payroll_period,
+			"employee": employee,
+			"docstatus": ["<", 2],
+			"name": ["!=", docname],
+		},
+	)
 	if existing_record:
-		frappe.throw(_("{0} already exists for employee {1} and period {2}")
-			.format(doctype, employee, payroll_period), DuplicateDeclarationError)
+		frappe.throw(
+			_("{0} already exists for employee {1} and period {2}").format(
+				doctype, employee, payroll_period
+			),
+			DuplicateDeclarationError,
+		)
+
 
 def validate_tax_declaration(declarations):
 	subcategories = []
@@ -184,61 +221,79 @@
 			frappe.throw(_("More than one selection for {0} not allowed").format(d.exemption_sub_category))
 		subcategories.append(d.exemption_sub_category)
 
+
 def get_total_exemption_amount(declarations):
 	exemptions = frappe._dict()
 	for d in declarations:
 		exemptions.setdefault(d.exemption_category, frappe._dict())
 		category_max_amount = exemptions.get(d.exemption_category).max_amount
 		if not category_max_amount:
-			category_max_amount = frappe.db.get_value("Employee Tax Exemption Category", d.exemption_category, "max_amount")
+			category_max_amount = frappe.db.get_value(
+				"Employee Tax Exemption Category", d.exemption_category, "max_amount"
+			)
 			exemptions.get(d.exemption_category).max_amount = category_max_amount
-		sub_category_exemption_amount = d.max_amount \
-			if (d.max_amount and flt(d.amount) > flt(d.max_amount)) else d.amount
+		sub_category_exemption_amount = (
+			d.max_amount if (d.max_amount and flt(d.amount) > flt(d.max_amount)) else d.amount
+		)
 
 		exemptions.get(d.exemption_category).setdefault("total_exemption_amount", 0.0)
 		exemptions.get(d.exemption_category).total_exemption_amount += flt(sub_category_exemption_amount)
 
-		if category_max_amount and exemptions.get(d.exemption_category).total_exemption_amount > category_max_amount:
+		if (
+			category_max_amount
+			and exemptions.get(d.exemption_category).total_exemption_amount > category_max_amount
+		):
 			exemptions.get(d.exemption_category).total_exemption_amount = category_max_amount
 
 	total_exemption_amount = sum([flt(d.total_exemption_amount) for d in exemptions.values()])
 	return total_exemption_amount
 
+
 @frappe.whitelist()
 def get_leave_period(from_date, to_date, company):
-	leave_period = frappe.db.sql("""
+	leave_period = frappe.db.sql(
+		"""
 		select name, from_date, to_date
 		from `tabLeave Period`
 		where company=%(company)s and is_active=1
 			and (from_date between %(from_date)s and %(to_date)s
 				or to_date between %(from_date)s and %(to_date)s
 				or (from_date < %(from_date)s and to_date > %(to_date)s))
-	""", {
-		"from_date": from_date,
-		"to_date": to_date,
-		"company": company
-	}, as_dict=1)
+	""",
+		{"from_date": from_date, "to_date": to_date, "company": company},
+		as_dict=1,
+	)
 
 	if leave_period:
 		return leave_period
 
+
 def generate_leave_encashment():
-	''' Generates a draft leave encashment on allocation expiry '''
+	"""Generates a draft leave encashment on allocation expiry"""
 	from erpnext.hr.doctype.leave_encashment.leave_encashment import create_leave_encashment
 
-	if frappe.db.get_single_value('HR Settings', 'auto_leave_encashment'):
-		leave_type = frappe.get_all('Leave Type', filters={'allow_encashment': 1}, fields=['name'])
-		leave_type=[l['name'] for l in leave_type]
+	if frappe.db.get_single_value("HR Settings", "auto_leave_encashment"):
+		leave_type = frappe.get_all("Leave Type", filters={"allow_encashment": 1}, fields=["name"])
+		leave_type = [l["name"] for l in leave_type]
 
-		leave_allocation = frappe.get_all("Leave Allocation", filters={
-			'to_date': add_days(today(), -1),
-			'leave_type': ('in', leave_type)
-		}, fields=['employee', 'leave_period', 'leave_type', 'to_date', 'total_leaves_allocated', 'new_leaves_allocated'])
+		leave_allocation = frappe.get_all(
+			"Leave Allocation",
+			filters={"to_date": add_days(today(), -1), "leave_type": ("in", leave_type)},
+			fields=[
+				"employee",
+				"leave_period",
+				"leave_type",
+				"to_date",
+				"total_leaves_allocated",
+				"new_leaves_allocated",
+			],
+		)
 
 		create_leave_encashment(leave_allocation=leave_allocation)
 
+
 def allocate_earned_leaves(ignore_duplicates=False):
-	'''Allocate earned leaves to Employees'''
+	"""Allocate earned leaves to Employees"""
 	e_leave_types = get_earned_leaves()
 	today = getdate()
 
@@ -251,37 +306,52 @@
 			if not allocation.leave_policy_assignment and not allocation.leave_policy:
 				continue
 
-			leave_policy = allocation.leave_policy if allocation.leave_policy else frappe.db.get_value(
-					"Leave Policy Assignment", allocation.leave_policy_assignment, ["leave_policy"])
+			leave_policy = (
+				allocation.leave_policy
+				if allocation.leave_policy
+				else frappe.db.get_value(
+					"Leave Policy Assignment", allocation.leave_policy_assignment, ["leave_policy"]
+				)
+			)
 
-			annual_allocation = frappe.db.get_value("Leave Policy Detail", filters={
-				'parent': leave_policy,
-				'leave_type': e_leave_type.name
-			}, fieldname=['annual_allocation'])
+			annual_allocation = frappe.db.get_value(
+				"Leave Policy Detail",
+				filters={"parent": leave_policy, "leave_type": e_leave_type.name},
+				fieldname=["annual_allocation"],
+			)
 
-			from_date=allocation.from_date
+			from_date = allocation.from_date
 
 			if e_leave_type.based_on_date_of_joining:
-				from_date  = frappe.db.get_value("Employee", allocation.employee, "date_of_joining")
+				from_date = frappe.db.get_value("Employee", allocation.employee, "date_of_joining")
 
-			if check_effective_date(from_date, today, e_leave_type.earned_leave_frequency, e_leave_type.based_on_date_of_joining):
-				update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, ignore_duplicates)
+			if check_effective_date(
+				from_date, today, e_leave_type.earned_leave_frequency, e_leave_type.based_on_date_of_joining
+			):
+				update_previous_leave_allocation(
+					allocation, annual_allocation, e_leave_type, ignore_duplicates
+				)
 
-def update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, ignore_duplicates=False):
-		earned_leaves = get_monthly_earned_leave(annual_allocation, e_leave_type.earned_leave_frequency, e_leave_type.rounding)
 
-		allocation = frappe.get_doc('Leave Allocation', allocation.name)
-		new_allocation = flt(allocation.total_leaves_allocated) + flt(earned_leaves)
+def update_previous_leave_allocation(
+	allocation, annual_allocation, e_leave_type, ignore_duplicates=False
+):
+	earned_leaves = get_monthly_earned_leave(
+		annual_allocation, e_leave_type.earned_leave_frequency, e_leave_type.rounding
+	)
 
-		if new_allocation > e_leave_type.max_leaves_allowed and e_leave_type.max_leaves_allowed > 0:
-			new_allocation = e_leave_type.max_leaves_allowed
+	allocation = frappe.get_doc("Leave Allocation", allocation.name)
+	new_allocation = flt(allocation.total_leaves_allocated) + flt(earned_leaves)
 
-		if new_allocation != allocation.total_leaves_allocated:
-			today_date = today()
+	if new_allocation > e_leave_type.max_leaves_allowed and e_leave_type.max_leaves_allowed > 0:
+		new_allocation = e_leave_type.max_leaves_allowed
 
-			if ignore_duplicates or not is_earned_leave_already_allocated(allocation, annual_allocation):
-				allocation.db_set("total_leaves_allocated", new_allocation, update_modified=False)
-				create_additional_leave_ledger_entry(allocation, earned_leaves, today_date)
+	if new_allocation != allocation.total_leaves_allocated:
+		today_date = today()
+
+		if ignore_duplicates or not is_earned_leave_already_allocated(allocation, annual_allocation):
+			allocation.db_set("total_leaves_allocated", new_allocation, update_modified=False)
+			create_additional_leave_ledger_entry(allocation, earned_leaves, today_date)
 
 
 def get_monthly_earned_leave(annual_leaves, frequency, rounding):
@@ -309,8 +379,9 @@
 	date_of_joining = frappe.db.get_value("Employee", allocation.employee, "date_of_joining")
 
 	assignment = frappe.get_doc("Leave Policy Assignment", allocation.leave_policy_assignment)
-	leaves_for_passed_months = assignment.get_leaves_for_passed_months(allocation.leave_type,
-		annual_allocation, leave_type_details, date_of_joining)
+	leaves_for_passed_months = assignment.get_leaves_for_passed_months(
+		allocation.leave_type, annual_allocation, leave_type_details, date_of_joining
+	)
 
 	# exclude carry-forwarded leaves while checking for leave allocation for passed months
 	num_allocations = allocation.total_leaves_allocated
@@ -323,26 +394,39 @@
 
 
 def get_leave_allocations(date, leave_type):
-	return frappe.db.sql("""select name, employee, from_date, to_date, leave_policy_assignment, leave_policy
+	return frappe.db.sql(
+		"""select name, employee, from_date, to_date, leave_policy_assignment, leave_policy
 		from `tabLeave Allocation`
 		where
 			%s between from_date and to_date and docstatus=1
 			and leave_type=%s""",
-	(date, leave_type), as_dict=1)
+		(date, leave_type),
+		as_dict=1,
+	)
 
 
 def get_earned_leaves():
-	return frappe.get_all("Leave Type",
-		fields=["name", "max_leaves_allowed", "earned_leave_frequency", "rounding", "based_on_date_of_joining"],
-		filters={'is_earned_leave' : 1})
+	return frappe.get_all(
+		"Leave Type",
+		fields=[
+			"name",
+			"max_leaves_allowed",
+			"earned_leave_frequency",
+			"rounding",
+			"based_on_date_of_joining",
+		],
+		filters={"is_earned_leave": 1},
+	)
+
 
 def create_additional_leave_ledger_entry(allocation, leaves, date):
-	''' Create leave ledger entry for leave types '''
+	"""Create leave ledger entry for leave types"""
 	allocation.new_leaves_allocated = leaves
 	allocation.from_date = date
 	allocation.unused_leaves = 0
 	allocation.create_leave_ledger_entry()
 
+
 def check_effective_date(from_date, to_date, frequency, based_on_date_of_joining):
 	import calendar
 
@@ -351,10 +435,12 @@
 	from_date = get_datetime(from_date)
 	to_date = get_datetime(to_date)
 	rd = relativedelta.relativedelta(to_date, from_date)
-	#last day of month
-	last_day =  calendar.monthrange(to_date.year, to_date.month)[1]
+	# last day of month
+	last_day = calendar.monthrange(to_date.year, to_date.month)[1]
 
-	if (from_date.day == to_date.day and based_on_date_of_joining) or (not based_on_date_of_joining and to_date.day == last_day):
+	if (from_date.day == to_date.day and based_on_date_of_joining) or (
+		not based_on_date_of_joining and to_date.day == last_day
+	):
 		if frequency == "Monthly":
 			return True
 		elif frequency == "Quarterly" and rd.months % 3:
@@ -371,16 +457,21 @@
 
 
 def get_salary_assignment(employee, date):
-	assignment = frappe.db.sql("""
+	assignment = frappe.db.sql(
+		"""
 		select * from `tabSalary Structure Assignment`
 		where employee=%(employee)s
 		and docstatus = 1
-		and %(on_date)s >= from_date order by from_date desc limit 1""", {
-			'employee': employee,
-			'on_date': date,
-		}, as_dict=1)
+		and %(on_date)s >= from_date order by from_date desc limit 1""",
+		{
+			"employee": employee,
+			"on_date": date,
+		},
+		as_dict=1,
+	)
 	return assignment[0] if assignment else None
 
+
 def get_sal_slip_total_benefit_given(employee, payroll_period, component=False):
 	total_given_benefit_amount = 0
 	query = """
@@ -398,17 +489,22 @@
 	if component:
 		query += "and sd.salary_component = %(component)s"
 
-	sum_of_given_benefit = frappe.db.sql(query, {
-		'employee': employee,
-		'start_date': payroll_period.start_date,
-		'end_date': payroll_period.end_date,
-		'component': component
-	}, as_dict=True)
+	sum_of_given_benefit = frappe.db.sql(
+		query,
+		{
+			"employee": employee,
+			"start_date": payroll_period.start_date,
+			"end_date": payroll_period.end_date,
+			"component": component,
+		},
+		as_dict=True,
+	)
 
 	if sum_of_given_benefit and flt(sum_of_given_benefit[0].total_amount) > 0:
 		total_given_benefit_amount = sum_of_given_benefit[0].total_amount
 	return total_given_benefit_amount
 
+
 def get_holiday_dates_for_employee(employee, start_date, end_date):
 	"""return a list of holiday dates for the given employee between start_date and end_date"""
 	# return only date
@@ -417,50 +513,48 @@
 	return [cstr(h.holiday_date) for h in holidays]
 
 
-def get_holidays_for_employee(employee, start_date, end_date, raise_exception=True, only_non_weekly=False):
+def get_holidays_for_employee(
+	employee, start_date, end_date, raise_exception=True, only_non_weekly=False
+):
 	"""Get Holidays for a given employee
 
-		`employee` (str)
-		`start_date` (str or datetime)
-		`end_date` (str or datetime)
-		`raise_exception` (bool)
-		`only_non_weekly` (bool)
+	`employee` (str)
+	`start_date` (str or datetime)
+	`end_date` (str or datetime)
+	`raise_exception` (bool)
+	`only_non_weekly` (bool)
 
-		return: list of dicts with `holiday_date` and `description`
+	return: list of dicts with `holiday_date` and `description`
 	"""
 	holiday_list = get_holiday_list_for_employee(employee, raise_exception=raise_exception)
 
 	if not holiday_list:
 		return []
 
-	filters = {
-		'parent': holiday_list,
-		'holiday_date': ('between', [start_date, end_date])
-	}
+	filters = {"parent": holiday_list, "holiday_date": ("between", [start_date, end_date])}
 
 	if only_non_weekly:
-		filters['weekly_off'] = False
+		filters["weekly_off"] = False
 
-	holidays = frappe.get_all(
-		'Holiday',
-		fields=['description', 'holiday_date'],
-		filters=filters
-	)
+	holidays = frappe.get_all("Holiday", fields=["description", "holiday_date"], filters=filters)
 
 	return holidays
 
+
 @erpnext.allow_regional
 def calculate_annual_eligible_hra_exemption(doc):
 	# Don't delete this method, used for localization
 	# Indian HRA Exemption Calculation
 	return {}
 
+
 @erpnext.allow_regional
 def calculate_hra_exemption_for_period(doc):
 	# Don't delete this method, used for localization
 	# Indian HRA Exemption Calculation
 	return {}
 
+
 def get_previous_claimed_amount(employee, payroll_period, non_pro_rata=False, component=False):
 	total_claimed_amount = 0
 	query = """
@@ -475,24 +569,29 @@
 	if component:
 		query += "and earning_component = %(component)s"
 
-	sum_of_claimed_amount = frappe.db.sql(query, {
-		'employee': employee,
-		'start_date': payroll_period.start_date,
-		'end_date': payroll_period.end_date,
-		'component': component
-	}, as_dict=True)
+	sum_of_claimed_amount = frappe.db.sql(
+		query,
+		{
+			"employee": employee,
+			"start_date": payroll_period.start_date,
+			"end_date": payroll_period.end_date,
+			"component": component,
+		},
+		as_dict=True,
+	)
 	if sum_of_claimed_amount and flt(sum_of_claimed_amount[0].total_amount) > 0:
 		total_claimed_amount = sum_of_claimed_amount[0].total_amount
 	return total_claimed_amount
 
+
 def share_doc_with_approver(doc, user):
 	# if approver does not have permissions, share
 	if not frappe.has_permission(doc=doc, ptype="submit", user=user):
-		frappe.share.add(doc.doctype, doc.name, user, submit=1,
-			flags={"ignore_share_permission": True})
+		frappe.share.add(doc.doctype, doc.name, user, submit=1, flags={"ignore_share_permission": True})
 
-		frappe.msgprint(_("Shared with the user {0} with {1} access").format(
-			user, frappe.bold("submit"), alert=True))
+		frappe.msgprint(
+			_("Shared with the user {0} with {1} access").format(user, frappe.bold("submit"), alert=True)
+		)
 
 	# remove shared doc if approver changes
 	doc_before_save = doc.get_doc_before_save()
@@ -500,14 +599,19 @@
 		approvers = {
 			"Leave Application": "leave_approver",
 			"Expense Claim": "expense_approver",
-			"Shift Request": "approver"
+			"Shift Request": "approver",
 		}
 
 		approver = approvers.get(doc.doctype)
 		if doc_before_save.get(approver) != doc.get(approver):
 			frappe.share.remove(doc.doctype, doc.name, doc_before_save.get(approver))
 
+
 def validate_active_employee(employee):
 	if frappe.db.get_value("Employee", employee, "status") == "Inactive":
-		frappe.throw(_("Transactions cannot be created for an Inactive Employee {0}.").format(
-			get_link_to_form("Employee", employee)), InactiveEmployeeStatusError)
+		frappe.throw(
+			_("Transactions cannot be created for an Inactive Employee {0}.").format(
+				get_link_to_form("Employee", employee)
+			),
+			InactiveEmployeeStatusError,
+		)
diff --git a/erpnext/loan_management/dashboard_chart_source/top_10_pledged_loan_securities/top_10_pledged_loan_securities.py b/erpnext/loan_management/dashboard_chart_source/top_10_pledged_loan_securities/top_10_pledged_loan_securities.py
index 6144d9d..aab3d8c 100644
--- a/erpnext/loan_management/dashboard_chart_source/top_10_pledged_loan_securities/top_10_pledged_loan_securities.py
+++ b/erpnext/loan_management/dashboard_chart_source/top_10_pledged_loan_securities/top_10_pledged_loan_securities.py
@@ -12,10 +12,19 @@
 
 @frappe.whitelist()
 @cache_source
-def get_data(chart_name = None, chart = None, no_cache = None, filters = None, from_date = None,
-	to_date = None, timespan = None, time_interval = None, heatmap_year = None):
+def get_data(
+	chart_name=None,
+	chart=None,
+	no_cache=None,
+	filters=None,
+	from_date=None,
+	to_date=None,
+	timespan=None,
+	time_interval=None,
+	heatmap_year=None,
+):
 	if chart_name:
-		chart = frappe.get_doc('Dashboard Chart', chart_name)
+		chart = frappe.get_doc("Dashboard Chart", chart_name)
 	else:
 		chart = frappe._dict(frappe.parse_json(chart))
 
@@ -29,28 +38,44 @@
 	labels = []
 	values = []
 
-	if filters.get('company'):
+	if filters.get("company"):
 		conditions = "AND company = %(company)s"
 
 	loan_security_details = get_loan_security_details()
 
-	unpledges = frappe._dict(frappe.db.sql("""
+	unpledges = frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT u.loan_security, sum(u.qty) as qty
 		FROM `tabLoan Security Unpledge` up, `tabUnpledge` u
 		WHERE u.parent = up.name
 		AND up.status = 'Approved'
 		{conditions}
 		GROUP BY u.loan_security
-	""".format(conditions=conditions), filters, as_list=1))
+	""".format(
+				conditions=conditions
+			),
+			filters,
+			as_list=1,
+		)
+	)
 
-	pledges = frappe._dict(frappe.db.sql("""
+	pledges = frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT p.loan_security, sum(p.qty) as qty
 		FROM `tabLoan Security Pledge` lp, `tabPledge`p
 		WHERE p.parent = lp.name
 		AND lp.status = 'Pledged'
 		{conditions}
 		GROUP BY p.loan_security
-	""".format(conditions=conditions), filters, as_list=1))
+	""".format(
+				conditions=conditions
+			),
+			filters,
+			as_list=1,
+		)
+	)
 
 	for security, qty in pledges.items():
 		current_pledges.setdefault(security, qty)
@@ -60,19 +85,15 @@
 
 	count = 0
 	for security, qty in sorted_pledges.items():
-		values.append(qty * loan_security_details.get(security, {}).get('latest_price', 0))
+		values.append(qty * loan_security_details.get(security, {}).get("latest_price", 0))
 		labels.append(security)
-		count +=1
+		count += 1
 
 		## Just need top 10 securities
 		if count == 10:
 			break
 
 	return {
-		'labels': labels,
-		'datasets': [{
-			'name': 'Top 10 Securities',
-			'chartType': 'bar',
-			'values': values
-		}]
+		"labels": labels,
+		"datasets": [{"name": "Top 10 Securities", "chartType": "bar", "values": values}],
 	}
diff --git a/erpnext/loan_management/doctype/loan/loan.py b/erpnext/loan_management/doctype/loan/loan.py
index 0fe9947..a0ef1b9 100644
--- a/erpnext/loan_management/doctype/loan/loan.py
+++ b/erpnext/loan_management/doctype/loan/loan.py
@@ -20,7 +20,7 @@
 
 class Loan(AccountsController):
 	def validate(self):
-		if self.applicant_type == 'Employee' and self.repay_from_salary:
+		if self.applicant_type == "Employee" and self.repay_from_salary:
 			validate_employee_currency_with_company_currency(self.applicant, self.company)
 		self.set_loan_amount()
 		self.validate_loan_amount()
@@ -31,34 +31,47 @@
 		self.validate_repay_from_salary()
 
 		if self.is_term_loan:
-			validate_repayment_method(self.repayment_method, self.loan_amount, self.monthly_repayment_amount,
-				self.repayment_periods, self.is_term_loan)
+			validate_repayment_method(
+				self.repayment_method,
+				self.loan_amount,
+				self.monthly_repayment_amount,
+				self.repayment_periods,
+				self.is_term_loan,
+			)
 			self.make_repayment_schedule()
 			self.set_repayment_period()
 
 		self.calculate_totals()
 
 	def validate_accounts(self):
-		for fieldname in ['payment_account', 'loan_account', 'interest_income_account', 'penalty_income_account']:
-			company = frappe.get_value("Account", self.get(fieldname), 'company')
+		for fieldname in [
+			"payment_account",
+			"loan_account",
+			"interest_income_account",
+			"penalty_income_account",
+		]:
+			company = frappe.get_value("Account", self.get(fieldname), "company")
 
 			if company != self.company:
-				frappe.throw(_("Account {0} does not belongs to company {1}").format(frappe.bold(self.get(fieldname)),
-					frappe.bold(self.company)))
+				frappe.throw(
+					_("Account {0} does not belongs to company {1}").format(
+						frappe.bold(self.get(fieldname)), frappe.bold(self.company)
+					)
+				)
 
 	def validate_cost_center(self):
 		if not self.cost_center and self.rate_of_interest != 0:
-			self.cost_center = frappe.db.get_value('Company', self.company, 'cost_center')
+			self.cost_center = frappe.db.get_value("Company", self.company, "cost_center")
 
 		if not self.cost_center:
-			frappe.throw(_('Cost center is mandatory for loans having rate of interest greater than 0'))
+			frappe.throw(_("Cost center is mandatory for loans having rate of interest greater than 0"))
 
 	def on_submit(self):
 		self.link_loan_security_pledge()
 
 	def on_cancel(self):
 		self.unlink_loan_security_pledge()
-		self.ignore_linked_doctypes = ['GL Entry']
+		self.ignore_linked_doctypes = ["GL Entry"]
 
 	def set_missing_fields(self):
 		if not self.company:
@@ -71,15 +84,25 @@
 			self.rate_of_interest = frappe.db.get_value("Loan Type", self.loan_type, "rate_of_interest")
 
 		if self.repayment_method == "Repay Over Number of Periods":
-			self.monthly_repayment_amount = get_monthly_repayment_amount(self.loan_amount, self.rate_of_interest, self.repayment_periods)
+			self.monthly_repayment_amount = get_monthly_repayment_amount(
+				self.loan_amount, self.rate_of_interest, self.repayment_periods
+			)
 
 	def check_sanctioned_amount_limit(self):
-		sanctioned_amount_limit = get_sanctioned_amount_limit(self.applicant_type, self.applicant, self.company)
+		sanctioned_amount_limit = get_sanctioned_amount_limit(
+			self.applicant_type, self.applicant, self.company
+		)
 		if sanctioned_amount_limit:
 			total_loan_amount = get_total_loan_amount(self.applicant_type, self.applicant, self.company)
 
-		if sanctioned_amount_limit and flt(self.loan_amount) + flt(total_loan_amount) > flt(sanctioned_amount_limit):
-			frappe.throw(_("Sanctioned Amount limit crossed for {0} {1}").format(self.applicant_type, frappe.bold(self.applicant)))
+		if sanctioned_amount_limit and flt(self.loan_amount) + flt(total_loan_amount) > flt(
+			sanctioned_amount_limit
+		):
+			frappe.throw(
+				_("Sanctioned Amount limit crossed for {0} {1}").format(
+					self.applicant_type, frappe.bold(self.applicant)
+				)
+			)
 
 	def validate_repay_from_salary(self):
 		if not self.is_term_loan and self.repay_from_salary:
@@ -92,8 +115,8 @@
 		self.repayment_schedule = []
 		payment_date = self.repayment_start_date
 		balance_amount = self.loan_amount
-		while(balance_amount > 0):
-			interest_amount = flt(balance_amount * flt(self.rate_of_interest) / (12*100))
+		while balance_amount > 0:
+			interest_amount = flt(balance_amount * flt(self.rate_of_interest) / (12 * 100))
 			principal_amount = self.monthly_repayment_amount - interest_amount
 			balance_amount = flt(balance_amount + interest_amount - self.monthly_repayment_amount)
 			if balance_amount < 0:
@@ -101,13 +124,16 @@
 				balance_amount = 0.0
 
 			total_payment = principal_amount + interest_amount
-			self.append("repayment_schedule", {
-				"payment_date": payment_date,
-				"principal_amount": principal_amount,
-				"interest_amount": interest_amount,
-				"total_payment": total_payment,
-				"balance_loan_amount": balance_amount
-			})
+			self.append(
+				"repayment_schedule",
+				{
+					"payment_date": payment_date,
+					"principal_amount": principal_amount,
+					"interest_amount": interest_amount,
+					"total_payment": total_payment,
+					"balance_loan_amount": balance_amount,
+				},
+			)
 			next_payment_date = add_single_month(payment_date)
 			payment_date = next_payment_date
 
@@ -125,14 +151,13 @@
 		if self.is_term_loan:
 			for data in self.repayment_schedule:
 				self.total_payment += data.total_payment
-				self.total_interest_payable +=data.interest_amount
+				self.total_interest_payable += data.interest_amount
 		else:
 			self.total_payment = self.loan_amount
 
 	def set_loan_amount(self):
 		if self.loan_application and not self.loan_amount:
-			self.loan_amount = frappe.db.get_value('Loan Application', self.loan_application, 'loan_amount')
-
+			self.loan_amount = frappe.db.get_value("Loan Application", self.loan_application, "loan_amount")
 
 	def validate_loan_amount(self):
 		if self.maximum_loan_amount and self.loan_amount > self.maximum_loan_amount:
@@ -144,30 +169,36 @@
 
 	def link_loan_security_pledge(self):
 		if self.is_secured_loan and self.loan_application:
-			maximum_loan_value = frappe.db.get_value('Loan Security Pledge',
-				{
-					'loan_application': self.loan_application,
-					'status': 'Requested'
-				},
-				'sum(maximum_loan_value)'
+			maximum_loan_value = frappe.db.get_value(
+				"Loan Security Pledge",
+				{"loan_application": self.loan_application, "status": "Requested"},
+				"sum(maximum_loan_value)",
 			)
 
 			if maximum_loan_value:
-				frappe.db.sql("""
+				frappe.db.sql(
+					"""
 					UPDATE `tabLoan Security Pledge`
 					SET loan = %s, pledge_time = %s, status = 'Pledged'
 					WHERE status = 'Requested' and loan_application = %s
-				""", (self.name, now_datetime(), self.loan_application))
+				""",
+					(self.name, now_datetime(), self.loan_application),
+				)
 
-				self.db_set('maximum_loan_amount', maximum_loan_value)
+				self.db_set("maximum_loan_amount", maximum_loan_value)
 
 	def unlink_loan_security_pledge(self):
-		pledges = frappe.get_all('Loan Security Pledge', fields=['name'], filters={'loan': self.name})
+		pledges = frappe.get_all("Loan Security Pledge", fields=["name"], filters={"loan": self.name})
 		pledge_list = [d.name for d in pledges]
 		if pledge_list:
-			frappe.db.sql("""UPDATE `tabLoan Security Pledge` SET
+			frappe.db.sql(
+				"""UPDATE `tabLoan Security Pledge` SET
 				loan = '', status = 'Unpledged'
-				where name in (%s) """ % (', '.join(['%s']*len(pledge_list))), tuple(pledge_list)) #nosec
+				where name in (%s) """
+				% (", ".join(["%s"] * len(pledge_list))),
+				tuple(pledge_list),
+			)  # nosec
+
 
 def update_total_amount_paid(doc):
 	total_amount_paid = 0
@@ -176,24 +207,51 @@
 			total_amount_paid += data.total_payment
 	frappe.db.set_value("Loan", doc.name, "total_amount_paid", total_amount_paid)
 
+
 def get_total_loan_amount(applicant_type, applicant, company):
 	pending_amount = 0
-	loan_details = frappe.db.get_all("Loan",
-		filters={"applicant_type": applicant_type, "company": company, "applicant": applicant, "docstatus": 1,
-			"status": ("!=", "Closed")},
-		fields=["status", "total_payment", "disbursed_amount", "total_interest_payable", "total_principal_paid",
-			"written_off_amount"])
+	loan_details = frappe.db.get_all(
+		"Loan",
+		filters={
+			"applicant_type": applicant_type,
+			"company": company,
+			"applicant": applicant,
+			"docstatus": 1,
+			"status": ("!=", "Closed"),
+		},
+		fields=[
+			"status",
+			"total_payment",
+			"disbursed_amount",
+			"total_interest_payable",
+			"total_principal_paid",
+			"written_off_amount",
+		],
+	)
 
-	interest_amount = flt(frappe.db.get_value("Loan Interest Accrual", {"applicant_type": applicant_type,
-		"company": company, "applicant": applicant, "docstatus": 1}, "sum(interest_amount - paid_interest_amount)"))
+	interest_amount = flt(
+		frappe.db.get_value(
+			"Loan Interest Accrual",
+			{"applicant_type": applicant_type, "company": company, "applicant": applicant, "docstatus": 1},
+			"sum(interest_amount - paid_interest_amount)",
+		)
+	)
 
 	for loan in loan_details:
 		if loan.status in ("Disbursed", "Loan Closure Requested"):
-			pending_amount += flt(loan.total_payment) - flt(loan.total_interest_payable) \
-				- flt(loan.total_principal_paid) - flt(loan.written_off_amount)
+			pending_amount += (
+				flt(loan.total_payment)
+				- flt(loan.total_interest_payable)
+				- flt(loan.total_principal_paid)
+				- flt(loan.written_off_amount)
+			)
 		elif loan.status == "Partially Disbursed":
-			pending_amount += flt(loan.disbursed_amount) - flt(loan.total_interest_payable) \
-				- flt(loan.total_principal_paid) - flt(loan.written_off_amount)
+			pending_amount += (
+				flt(loan.disbursed_amount)
+				- flt(loan.total_interest_payable)
+				- flt(loan.total_principal_paid)
+				- flt(loan.written_off_amount)
+			)
 		elif loan.status == "Sanctioned":
 			pending_amount += flt(loan.total_payment)
 
@@ -201,12 +259,18 @@
 
 	return pending_amount
 
-def get_sanctioned_amount_limit(applicant_type, applicant, company):
-	return frappe.db.get_value('Sanctioned Loan Amount',
-		{'applicant_type': applicant_type, 'company': company, 'applicant': applicant},
-		'sanctioned_amount_limit')
 
-def validate_repayment_method(repayment_method, loan_amount, monthly_repayment_amount, repayment_periods, is_term_loan):
+def get_sanctioned_amount_limit(applicant_type, applicant, company):
+	return frappe.db.get_value(
+		"Sanctioned Loan Amount",
+		{"applicant_type": applicant_type, "company": company, "applicant": applicant},
+		"sanctioned_amount_limit",
+	)
+
+
+def validate_repayment_method(
+	repayment_method, loan_amount, monthly_repayment_amount, repayment_periods, is_term_loan
+):
 
 	if is_term_loan and not repayment_method:
 		frappe.throw(_("Repayment Method is mandatory for term loans"))
@@ -220,27 +284,34 @@
 		if monthly_repayment_amount > loan_amount:
 			frappe.throw(_("Monthly Repayment Amount cannot be greater than Loan Amount"))
 
+
 def get_monthly_repayment_amount(loan_amount, rate_of_interest, repayment_periods):
 	if rate_of_interest:
-		monthly_interest_rate = flt(rate_of_interest) / (12 *100)
-		monthly_repayment_amount = math.ceil((loan_amount * monthly_interest_rate *
-			(1 + monthly_interest_rate)**repayment_periods) \
-			/ ((1 + monthly_interest_rate)**repayment_periods - 1))
+		monthly_interest_rate = flt(rate_of_interest) / (12 * 100)
+		monthly_repayment_amount = math.ceil(
+			(loan_amount * monthly_interest_rate * (1 + monthly_interest_rate) ** repayment_periods)
+			/ ((1 + monthly_interest_rate) ** repayment_periods - 1)
+		)
 	else:
 		monthly_repayment_amount = math.ceil(flt(loan_amount) / repayment_periods)
 	return monthly_repayment_amount
 
+
 @frappe.whitelist()
 def request_loan_closure(loan, posting_date=None):
 	if not posting_date:
 		posting_date = getdate()
 
 	amounts = calculate_amounts(loan, posting_date)
-	pending_amount = amounts['pending_principal_amount'] + amounts['unaccrued_interest'] + \
-		amounts['interest_amount'] + amounts['penalty_amount']
+	pending_amount = (
+		amounts["pending_principal_amount"]
+		+ amounts["unaccrued_interest"]
+		+ amounts["interest_amount"]
+		+ amounts["penalty_amount"]
+	)
 
-	loan_type = frappe.get_value('Loan', loan, 'loan_type')
-	write_off_limit = frappe.get_value('Loan Type', loan_type, 'write_off_amount')
+	loan_type = frappe.get_value("Loan", loan, "loan_type")
+	write_off_limit = frappe.get_value("Loan Type", loan_type, "write_off_amount")
 
 	if pending_amount and abs(pending_amount) < write_off_limit:
 		# Auto create loan write off and update status as loan closure requested
@@ -249,7 +320,8 @@
 	elif pending_amount > 0:
 		frappe.throw(_("Cannot close loan as there is an outstanding of {0}").format(pending_amount))
 
-	frappe.db.set_value('Loan', loan, 'status', 'Loan Closure Requested')
+	frappe.db.set_value("Loan", loan, "status", "Loan Closure Requested")
+
 
 @frappe.whitelist()
 def get_loan_application(loan_application):
@@ -257,10 +329,12 @@
 	if loan:
 		return loan.as_dict()
 
+
 def close_loan(loan, total_amount_paid):
 	frappe.db.set_value("Loan", loan, "total_amount_paid", total_amount_paid)
 	frappe.db.set_value("Loan", loan, "status", "Closed")
 
+
 @frappe.whitelist()
 def make_loan_disbursement(loan, company, applicant_type, applicant, pending_amount=0, as_dict=0):
 	disbursement_entry = frappe.new_doc("Loan Disbursement")
@@ -277,6 +351,7 @@
 	else:
 		return disbursement_entry
 
+
 @frappe.whitelist()
 def make_repayment_entry(loan, applicant_type, applicant, loan_type, company, as_dict=0):
 	repayment_entry = frappe.new_doc("Loan Repayment")
@@ -292,27 +367,28 @@
 	else:
 		return repayment_entry
 
+
 @frappe.whitelist()
 def make_loan_write_off(loan, company=None, posting_date=None, amount=0, as_dict=0):
 	if not company:
-		company = frappe.get_value('Loan', loan, 'company')
+		company = frappe.get_value("Loan", loan, "company")
 
 	if not posting_date:
 		posting_date = getdate()
 
 	amounts = calculate_amounts(loan, posting_date)
-	pending_amount = amounts['pending_principal_amount']
+	pending_amount = amounts["pending_principal_amount"]
 
 	if amount and (amount > pending_amount):
-		frappe.throw(_('Write Off amount cannot be greater than pending loan amount'))
+		frappe.throw(_("Write Off amount cannot be greater than pending loan amount"))
 
 	if not amount:
 		amount = pending_amount
 
 	# get default write off account from company master
-	write_off_account = frappe.get_value('Company', company, 'write_off_account')
+	write_off_account = frappe.get_value("Company", company, "write_off_account")
 
-	write_off = frappe.new_doc('Loan Write Off')
+	write_off = frappe.new_doc("Loan Write Off")
 	write_off.loan = loan
 	write_off.posting_date = posting_date
 	write_off.write_off_account = write_off_account
@@ -324,26 +400,35 @@
 	else:
 		return write_off
 
+
 @frappe.whitelist()
-def unpledge_security(loan=None, loan_security_pledge=None, security_map=None, as_dict=0, save=0, submit=0, approve=0):
+def unpledge_security(
+	loan=None, loan_security_pledge=None, security_map=None, as_dict=0, save=0, submit=0, approve=0
+):
 	# if no security_map is passed it will be considered as full unpledge
 	if security_map and isinstance(security_map, str):
 		security_map = json.loads(security_map)
 
 	if loan:
 		pledge_qty_map = security_map or get_pledged_security_qty(loan)
-		loan_doc = frappe.get_doc('Loan', loan)
-		unpledge_request = create_loan_security_unpledge(pledge_qty_map, loan_doc.name, loan_doc.company,
-			loan_doc.applicant_type, loan_doc.applicant)
+		loan_doc = frappe.get_doc("Loan", loan)
+		unpledge_request = create_loan_security_unpledge(
+			pledge_qty_map, loan_doc.name, loan_doc.company, loan_doc.applicant_type, loan_doc.applicant
+		)
 	# will unpledge qty based on loan security pledge
 	elif loan_security_pledge:
 		security_map = {}
-		pledge_doc = frappe.get_doc('Loan Security Pledge', loan_security_pledge)
+		pledge_doc = frappe.get_doc("Loan Security Pledge", loan_security_pledge)
 		for security in pledge_doc.securities:
 			security_map.setdefault(security.loan_security, security.qty)
 
-		unpledge_request = create_loan_security_unpledge(security_map, pledge_doc.loan,
-			pledge_doc.company, pledge_doc.applicant_type, pledge_doc.applicant)
+		unpledge_request = create_loan_security_unpledge(
+			security_map,
+			pledge_doc.loan,
+			pledge_doc.company,
+			pledge_doc.applicant_type,
+			pledge_doc.applicant,
+		)
 
 	if save:
 		unpledge_request.save()
@@ -353,16 +438,17 @@
 
 	if approve:
 		if unpledge_request.docstatus == 1:
-			unpledge_request.status = 'Approved'
+			unpledge_request.status = "Approved"
 			unpledge_request.save()
 		else:
-			frappe.throw(_('Only submittted unpledge requests can be approved'))
+			frappe.throw(_("Only submittted unpledge requests can be approved"))
 
 	if as_dict:
 		return unpledge_request
 	else:
 		return unpledge_request
 
+
 def create_loan_security_unpledge(unpledge_map, loan, company, applicant_type, applicant):
 	unpledge_request = frappe.new_doc("Loan Security Unpledge")
 	unpledge_request.applicant_type = applicant_type
@@ -372,17 +458,16 @@
 
 	for security, qty in unpledge_map.items():
 		if qty:
-			unpledge_request.append('securities', {
-				"loan_security": security,
-				"qty": qty
-			})
+			unpledge_request.append("securities", {"loan_security": security, "qty": qty})
 
 	return unpledge_request
 
+
 def validate_employee_currency_with_company_currency(applicant, company):
 	from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import (
 		get_employee_currency,
 	)
+
 	if not applicant:
 		frappe.throw(_("Please select Applicant"))
 	if not company:
@@ -390,18 +475,20 @@
 	employee_currency = get_employee_currency(applicant)
 	company_currency = erpnext.get_company_currency(company)
 	if employee_currency != company_currency:
-		frappe.throw(_("Loan cannot be repayed from salary for Employee {0} because salary is processed in currency {1}")
-			.format(applicant, employee_currency))
+		frappe.throw(
+			_(
+				"Loan cannot be repayed from salary for Employee {0} because salary is processed in currency {1}"
+			).format(applicant, employee_currency)
+		)
+
 
 @frappe.whitelist()
 def get_shortfall_applicants():
-	loans = frappe.get_all('Loan Security Shortfall', {'status': 'Pending'}, pluck='loan')
-	applicants = set(frappe.get_all('Loan', {'name': ('in', loans)}, pluck='name'))
+	loans = frappe.get_all("Loan Security Shortfall", {"status": "Pending"}, pluck="loan")
+	applicants = set(frappe.get_all("Loan", {"name": ("in", loans)}, pluck="name"))
 
-	return {
-		"value": len(applicants),
-		"fieldtype": "Int"
-	}
+	return {"value": len(applicants), "fieldtype": "Int"}
+
 
 def add_single_month(date):
 	if getdate(date) == get_last_day(date):
@@ -409,29 +496,46 @@
 	else:
 		return add_months(date, 1)
 
+
 @frappe.whitelist()
 def make_refund_jv(loan, amount=0, reference_number=None, reference_date=None, submit=0):
-	loan_details = frappe.db.get_value('Loan', loan, ['applicant_type', 'applicant',
-		'loan_account', 'payment_account', 'posting_date', 'company', 'name',
-		'total_payment', 'total_principal_paid'], as_dict=1)
+	loan_details = frappe.db.get_value(
+		"Loan",
+		loan,
+		[
+			"applicant_type",
+			"applicant",
+			"loan_account",
+			"payment_account",
+			"posting_date",
+			"company",
+			"name",
+			"total_payment",
+			"total_principal_paid",
+		],
+		as_dict=1,
+	)
 
-	loan_details.doctype = 'Loan'
+	loan_details.doctype = "Loan"
 	loan_details[loan_details.applicant_type.lower()] = loan_details.applicant
 
 	if not amount:
 		amount = flt(loan_details.total_principal_paid - loan_details.total_payment)
 
 		if amount < 0:
-			frappe.throw(_('No excess amount pending for refund'))
+			frappe.throw(_("No excess amount pending for refund"))
 
-	refund_jv = get_payment_entry(loan_details, {
-		"party_type": loan_details.applicant_type,
-		"party_account": loan_details.loan_account,
-		"amount_field_party": 'debit_in_account_currency',
-		"amount_field_bank": 'credit_in_account_currency',
-		"amount": amount,
-		"bank_account": loan_details.payment_account
-	})
+	refund_jv = get_payment_entry(
+		loan_details,
+		{
+			"party_type": loan_details.applicant_type,
+			"party_account": loan_details.loan_account,
+			"amount_field_party": "debit_in_account_currency",
+			"amount_field_bank": "credit_in_account_currency",
+			"amount": amount,
+			"bank_account": loan_details.payment_account,
+		},
+	)
 
 	if reference_number:
 		refund_jv.cheque_no = reference_number
@@ -442,4 +546,4 @@
 	if submit:
 		refund_jv.submit()
 
-	return refund_jv
\ No newline at end of file
+	return refund_jv
diff --git a/erpnext/loan_management/doctype/loan/loan_dashboard.py b/erpnext/loan_management/doctype/loan/loan_dashboard.py
index c8a9e64..971d545 100644
--- a/erpnext/loan_management/doctype/loan/loan_dashboard.py
+++ b/erpnext/loan_management/doctype/loan/loan_dashboard.py
@@ -1,16 +1,19 @@
 def get_data():
 	return {
-		'fieldname': 'loan',
-		'non_standard_fieldnames': {
-			'Loan Disbursement': 'against_loan',
-			'Loan Repayment': 'against_loan',
+		"fieldname": "loan",
+		"non_standard_fieldnames": {
+			"Loan Disbursement": "against_loan",
+			"Loan Repayment": "against_loan",
 		},
-		'transactions': [
+		"transactions": [
+			{"items": ["Loan Security Pledge", "Loan Security Shortfall", "Loan Disbursement"]},
 			{
-				'items': ['Loan Security Pledge', 'Loan Security Shortfall', 'Loan Disbursement']
+				"items": [
+					"Loan Repayment",
+					"Loan Interest Accrual",
+					"Loan Write Off",
+					"Loan Security Unpledge",
+				]
 			},
-			{
-				'items': ['Loan Repayment', 'Loan Interest Accrual', 'Loan Write Off', 'Loan Security Unpledge']
-			}
-		]
+		],
 	}
diff --git a/erpnext/loan_management/doctype/loan/test_loan.py b/erpnext/loan_management/doctype/loan/test_loan.py
index 5ebb2e1..e2b0870 100644
--- a/erpnext/loan_management/doctype/loan/test_loan.py
+++ b/erpnext/loan_management/doctype/loan/test_loan.py
@@ -39,31 +39,69 @@
 class TestLoan(unittest.TestCase):
 	def setUp(self):
 		create_loan_accounts()
-		create_loan_type("Personal Loan", 500000, 8.4,
+		create_loan_type(
+			"Personal Loan",
+			500000,
+			8.4,
 			is_term_loan=1,
-			mode_of_payment='Cash',
-			disbursement_account='Disbursement Account - _TC',
-			payment_account='Payment Account - _TC',
-			loan_account='Loan Account - _TC',
-			interest_income_account='Interest Income Account - _TC',
-			penalty_income_account='Penalty Income Account - _TC')
+			mode_of_payment="Cash",
+			disbursement_account="Disbursement Account - _TC",
+			payment_account="Payment Account - _TC",
+			loan_account="Loan Account - _TC",
+			interest_income_account="Interest Income Account - _TC",
+			penalty_income_account="Penalty Income Account - _TC",
+		)
 
-		create_loan_type("Stock Loan", 2000000, 13.5, 25, 1, 5, 'Cash', 'Disbursement Account - _TC',
-			'Payment Account - _TC', 'Loan Account - _TC', 'Interest Income Account - _TC', 'Penalty Income Account - _TC')
+		create_loan_type(
+			"Stock Loan",
+			2000000,
+			13.5,
+			25,
+			1,
+			5,
+			"Cash",
+			"Disbursement Account - _TC",
+			"Payment Account - _TC",
+			"Loan Account - _TC",
+			"Interest Income Account - _TC",
+			"Penalty Income Account - _TC",
+		)
 
-		create_loan_type("Demand Loan", 2000000, 13.5, 25, 0, 5, 'Cash', 'Disbursement Account - _TC',
-			'Payment Account - _TC', 'Loan Account - _TC', 'Interest Income Account - _TC', 'Penalty Income Account - _TC')
+		create_loan_type(
+			"Demand Loan",
+			2000000,
+			13.5,
+			25,
+			0,
+			5,
+			"Cash",
+			"Disbursement Account - _TC",
+			"Payment Account - _TC",
+			"Loan Account - _TC",
+			"Interest Income Account - _TC",
+			"Penalty Income Account - _TC",
+		)
 
 		create_loan_security_type()
 		create_loan_security()
 
-		create_loan_security_price("Test Security 1", 500, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
-		create_loan_security_price("Test Security 2", 250, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
+		create_loan_security_price(
+			"Test Security 1", 500, "Nos", get_datetime(), get_datetime(add_to_date(nowdate(), hours=24))
+		)
+		create_loan_security_price(
+			"Test Security 2", 250, "Nos", get_datetime(), get_datetime(add_to_date(nowdate(), hours=24))
+		)
 
 		self.applicant1 = make_employee("robert_loan@loan.com")
-		make_salary_structure("Test Salary Structure Loan", "Monthly", employee=self.applicant1, currency='INR', company="_Test Company")
+		make_salary_structure(
+			"Test Salary Structure Loan",
+			"Monthly",
+			employee=self.applicant1,
+			currency="INR",
+			company="_Test Company",
+		)
 		if not frappe.db.exists("Customer", "_Test Loan Customer"):
-			frappe.get_doc(get_customer_dict('_Test Loan Customer')).insert(ignore_permissions=True)
+			frappe.get_doc(get_customer_dict("_Test Loan Customer")).insert(ignore_permissions=True)
 
 		if not frappe.db.exists("Customer", "_Test Loan Customer 1"):
 			frappe.get_doc(get_customer_dict("_Test Loan Customer 1")).insert(ignore_permissions=True)
@@ -74,7 +112,7 @@
 		create_loan(self.applicant1, "Personal Loan", 280000, "Repay Over Number of Periods", 20)
 
 	def test_loan(self):
-		loan = frappe.get_doc("Loan", {"applicant":self.applicant1})
+		loan = frappe.get_doc("Loan", {"applicant": self.applicant1})
 		self.assertEqual(loan.monthly_repayment_amount, 15052)
 		self.assertEqual(flt(loan.total_interest_payable, 0), 21034)
 		self.assertEqual(flt(loan.total_payment, 0), 301034)
@@ -83,7 +121,11 @@
 
 		self.assertEqual(len(schedule), 20)
 
-		for idx, principal_amount, interest_amount, balance_loan_amount in [[3, 13369, 1683, 227080], [19, 14941, 105, 0], [17, 14740, 312, 29785]]:
+		for idx, principal_amount, interest_amount, balance_loan_amount in [
+			[3, 13369, 1683, 227080],
+			[19, 14941, 105, 0],
+			[17, 14740, 312, 29785],
+		]:
 			self.assertEqual(flt(schedule[idx].principal_amount, 0), principal_amount)
 			self.assertEqual(flt(schedule[idx].interest_amount, 0), interest_amount)
 			self.assertEqual(flt(schedule[idx].balance_loan_amount, 0), balance_loan_amount)
@@ -98,30 +140,35 @@
 
 	def test_loan_with_security(self):
 
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00,
-		}]
+		pledge = [
+			{
+				"loan_security": "Test Security 1",
+				"qty": 4000.00,
+			}
+		]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2,
-			'Stock Loan', pledge, "Repay Over Number of Periods", 12)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Stock Loan", pledge, "Repay Over Number of Periods", 12
+		)
 		create_pledge(loan_application)
 
-		loan = create_loan_with_security(self.applicant2, "Stock Loan", "Repay Over Number of Periods",
-			12, loan_application)
+		loan = create_loan_with_security(
+			self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application
+		)
 		self.assertEqual(loan.loan_amount, 1000000)
 
 	def test_loan_disbursement(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Stock Loan', pledge, "Repay Over Number of Periods", 12)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Stock Loan", pledge, "Repay Over Number of Periods", 12
+		)
 
 		create_pledge(loan_application)
 
-		loan = create_loan_with_security(self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application)
+		loan = create_loan_with_security(
+			self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application
+		)
 		self.assertEqual(loan.loan_amount, 1000000)
 
 		loan.submit()
@@ -130,14 +177,16 @@
 		loan_disbursement_entry2 = make_loan_disbursement_entry(loan.name, 500000)
 
 		loan = frappe.get_doc("Loan", loan.name)
-		gl_entries1 = frappe.db.get_all("GL Entry",
+		gl_entries1 = frappe.db.get_all(
+			"GL Entry",
 			fields=["name"],
-			filters = {'voucher_type': 'Loan Disbursement', 'voucher_no': loan_disbursement_entry1.name}
+			filters={"voucher_type": "Loan Disbursement", "voucher_no": loan_disbursement_entry1.name},
 		)
 
-		gl_entries2 = frappe.db.get_all("GL Entry",
+		gl_entries2 = frappe.db.get_all(
+			"GL Entry",
 			fields=["name"],
-			filters = {'voucher_type': 'Loan Disbursement', 'voucher_no': loan_disbursement_entry2.name}
+			filters={"voucher_type": "Loan Disbursement", "voucher_no": loan_disbursement_entry2.name},
 		)
 
 		self.assertEqual(loan.status, "Disbursed")
@@ -151,73 +200,93 @@
 		frappe.db.sql("DELETE FROM `tabLoan Application` where applicant = '_Test Loan Customer 1'")
 		frappe.db.sql("DELETE FROM `tabLoan Security Pledge` where applicant = '_Test Loan Customer 1'")
 
-		if not frappe.db.get_value("Sanctioned Loan Amount", filters={"applicant_type": "Customer",
-			"applicant": "_Test Loan Customer 1", "company": "_Test Company"}):
-			frappe.get_doc({
-				"doctype": "Sanctioned Loan Amount",
+		if not frappe.db.get_value(
+			"Sanctioned Loan Amount",
+			filters={
 				"applicant_type": "Customer",
 				"applicant": "_Test Loan Customer 1",
-				"sanctioned_amount_limit": 1500000,
-				"company": "_Test Company"
-			}).insert(ignore_permissions=True)
+				"company": "_Test Company",
+			},
+		):
+			frappe.get_doc(
+				{
+					"doctype": "Sanctioned Loan Amount",
+					"applicant_type": "Customer",
+					"applicant": "_Test Loan Customer 1",
+					"sanctioned_amount_limit": 1500000,
+					"company": "_Test Company",
+				}
+			).insert(ignore_permissions=True)
 
 		# Make First Loan
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant3, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant3, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
-		loan = create_demand_loan(self.applicant3, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant3, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		# Make second loan greater than the sanctioned amount
-		loan_application = create_loan_application('_Test Company', self.applicant3, 'Demand Loan', pledge,
-			do_not_save=True)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant3, "Demand Loan", pledge, do_not_save=True
+		)
 		self.assertRaises(frappe.ValidationError, loan_application.save)
 
 	def test_regular_loan_repayment(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
-		accrued_interest_amount = flt((loan.loan_amount * loan.rate_of_interest * no_of_days)
-			/ (days_in_year(get_datetime(first_date).year) * 100), 2)
+		accrued_interest_amount = flt(
+			(loan.loan_amount * loan.rate_of_interest * no_of_days)
+			/ (days_in_year(get_datetime(first_date).year) * 100),
+			2,
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
 
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 10), 111119)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant2, add_days(last_date, 10), 111119
+		)
 		repayment_entry.save()
 		repayment_entry.submit()
 
 		penalty_amount = (accrued_interest_amount * 5 * 25) / 100
-		self.assertEqual(flt(repayment_entry.penalty_amount,0), flt(penalty_amount, 0))
+		self.assertEqual(flt(repayment_entry.penalty_amount, 0), flt(penalty_amount, 0))
 
-		amounts = frappe.db.get_all('Loan Interest Accrual', {'loan': loan.name}, ['paid_interest_amount'])
+		amounts = frappe.db.get_all(
+			"Loan Interest Accrual", {"loan": loan.name}, ["paid_interest_amount"]
+		)
 
 		loan.load_from_db()
 
-		total_interest_paid = amounts[0]['paid_interest_amount'] + amounts[1]['paid_interest_amount']
-		self.assertEqual(amounts[1]['paid_interest_amount'], repayment_entry.interest_payable)
-		self.assertEqual(flt(loan.total_principal_paid, 0), flt(repayment_entry.amount_paid -
-			 penalty_amount - total_interest_paid, 0))
+		total_interest_paid = amounts[0]["paid_interest_amount"] + amounts[1]["paid_interest_amount"]
+		self.assertEqual(amounts[1]["paid_interest_amount"], repayment_entry.interest_payable)
+		self.assertEqual(
+			flt(loan.total_principal_paid, 0),
+			flt(repayment_entry.amount_paid - penalty_amount - total_interest_paid, 0),
+		)
 
 		# Check Repayment Entry cancel
 		repayment_entry.load_from_db()
@@ -228,21 +297,22 @@
 		self.assertEqual(loan.total_principal_paid, 0)
 
 	def test_loan_closure(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
@@ -251,20 +321,27 @@
 		# 5 days as well though in grace period
 		no_of_days += 5
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
-			flt(loan.loan_amount + accrued_interest_amount))
+		repayment_entry = create_repayment_entry(
+			loan.name,
+			self.applicant2,
+			add_days(last_date, 5),
+			flt(loan.loan_amount + accrued_interest_amount),
+		)
 
 		repayment_entry.submit()
 
-		amount = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['sum(paid_interest_amount)'])
+		amount = frappe.db.get_value(
+			"Loan Interest Accrual", {"loan": loan.name}, ["sum(paid_interest_amount)"]
+		)
 
-		self.assertEqual(flt(amount, 0),flt(accrued_interest_amount, 0))
+		self.assertEqual(flt(amount, 0), flt(accrued_interest_amount, 0))
 		self.assertEqual(flt(repayment_entry.penalty_amount, 5), 0)
 
 		request_loan_closure(loan.name)
@@ -272,78 +349,101 @@
 		self.assertEqual(loan.status, "Loan Closure Requested")
 
 	def test_loan_repayment_for_term_loan(self):
-		pledges = [{
-			"loan_security": "Test Security 2",
-			"qty": 4000.00
-		},
-		{
-			"loan_security": "Test Security 1",
-			"qty": 2000.00
-		}]
+		pledges = [
+			{"loan_security": "Test Security 2", "qty": 4000.00},
+			{"loan_security": "Test Security 1", "qty": 2000.00},
+		]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Stock Loan', pledges,
-			"Repay Over Number of Periods", 12)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Stock Loan", pledges, "Repay Over Number of Periods", 12
+		)
 		create_pledge(loan_application)
 
-		loan = create_loan_with_security(self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application,
-			posting_date=add_months(nowdate(), -1))
+		loan = create_loan_with_security(
+			self.applicant2,
+			"Stock Loan",
+			"Repay Over Number of Periods",
+			12,
+			loan_application,
+			posting_date=add_months(nowdate(), -1),
+		)
 
 		loan.submit()
 
-		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1))
+		make_loan_disbursement_entry(
+			loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1)
+		)
 
 		process_loan_interest_accrual_for_term_loans(posting_date=nowdate())
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(nowdate(), 5), 89768.75)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant2, add_days(nowdate(), 5), 89768.75
+		)
 
 		repayment_entry.submit()
 
-		amounts = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['paid_interest_amount',
-			'paid_principal_amount'])
+		amounts = frappe.db.get_value(
+			"Loan Interest Accrual", {"loan": loan.name}, ["paid_interest_amount", "paid_principal_amount"]
+		)
 
 		self.assertEqual(amounts[0], 11250.00)
 		self.assertEqual(amounts[1], 78303.00)
 
 	def test_repayment_schedule_update(self):
-		loan = create_loan(self.applicant2, "Personal Loan", 200000, "Repay Over Number of Periods", 4,
-			applicant_type='Customer', repayment_start_date='2021-04-30', posting_date='2021-04-01')
+		loan = create_loan(
+			self.applicant2,
+			"Personal Loan",
+			200000,
+			"Repay Over Number of Periods",
+			4,
+			applicant_type="Customer",
+			repayment_start_date="2021-04-30",
+			posting_date="2021-04-01",
+		)
 
 		loan.submit()
 
-		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date='2021-04-01')
+		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date="2021-04-01")
 
-		process_loan_interest_accrual_for_term_loans(posting_date='2021-05-01')
-		process_loan_interest_accrual_for_term_loans(posting_date='2021-06-01')
+		process_loan_interest_accrual_for_term_loans(posting_date="2021-05-01")
+		process_loan_interest_accrual_for_term_loans(posting_date="2021-06-01")
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, '2021-06-05', 120000)
+		repayment_entry = create_repayment_entry(loan.name, self.applicant2, "2021-06-05", 120000)
 		repayment_entry.submit()
 
 		loan.load_from_db()
 
-		self.assertEqual(flt(loan.get('repayment_schedule')[3].principal_amount, 2), 41369.83)
-		self.assertEqual(flt(loan.get('repayment_schedule')[3].interest_amount, 2), 289.59)
-		self.assertEqual(flt(loan.get('repayment_schedule')[3].total_payment, 2), 41659.41)
-		self.assertEqual(flt(loan.get('repayment_schedule')[3].balance_loan_amount, 2), 0)
+		self.assertEqual(flt(loan.get("repayment_schedule")[3].principal_amount, 2), 41369.83)
+		self.assertEqual(flt(loan.get("repayment_schedule")[3].interest_amount, 2), 289.59)
+		self.assertEqual(flt(loan.get("repayment_schedule")[3].total_payment, 2), 41659.41)
+		self.assertEqual(flt(loan.get("repayment_schedule")[3].balance_loan_amount, 2), 0)
 
 	def test_security_shortfall(self):
-		pledges = [{
-			"loan_security": "Test Security 2",
-			"qty": 8000.00,
-			"haircut": 50,
-		}]
+		pledges = [
+			{
+				"loan_security": "Test Security 2",
+				"qty": 8000.00,
+				"haircut": 50,
+			}
+		]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2,
-			'Stock Loan', pledges, "Repay Over Number of Periods", 12)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Stock Loan", pledges, "Repay Over Number of Periods", 12
+		)
 
 		create_pledge(loan_application)
 
-		loan = create_loan_with_security(self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application)
+		loan = create_loan_with_security(
+			self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application
+		)
 		loan.submit()
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount)
 
-		frappe.db.sql("""UPDATE `tabLoan Security Price` SET loan_security_price = 100
-			where loan_security='Test Security 2'""")
+		frappe.db.sql(
+			"""UPDATE `tabLoan Security Price` SET loan_security_price = 100
+			where loan_security='Test Security 2'"""
+		)
 
 		create_process_loan_security_shortfall()
 		loan_security_shortfall = frappe.get_doc("Loan Security Shortfall", {"loan": loan.name})
@@ -353,8 +453,10 @@
 		self.assertEqual(loan_security_shortfall.security_value, 800000.00)
 		self.assertEqual(loan_security_shortfall.shortfall_amount, 600000.00)
 
-		frappe.db.sql(""" UPDATE `tabLoan Security Price` SET loan_security_price = 250
-			where loan_security='Test Security 2'""")
+		frappe.db.sql(
+			""" UPDATE `tabLoan Security Price` SET loan_security_price = 250
+			where loan_security='Test Security 2'"""
+		)
 
 		create_process_loan_security_shortfall()
 		loan_security_shortfall = frappe.get_doc("Loan Security Shortfall", {"loan": loan.name})
@@ -362,33 +464,40 @@
 		self.assertEqual(loan_security_shortfall.shortfall_amount, 0)
 
 	def test_loan_security_unpledge(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
 		no_of_days += 5
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5), flt(loan.loan_amount + accrued_interest_amount))
+		repayment_entry = create_repayment_entry(
+			loan.name,
+			self.applicant2,
+			add_days(last_date, 5),
+			flt(loan.loan_amount + accrued_interest_amount),
+		)
 		repayment_entry.submit()
 
 		request_loan_closure(loan.name)
@@ -397,98 +506,108 @@
 
 		unpledge_request = unpledge_security(loan=loan.name, save=1)
 		unpledge_request.submit()
-		unpledge_request.status = 'Approved'
+		unpledge_request.status = "Approved"
 		unpledge_request.save()
 		loan.load_from_db()
 
 		pledged_qty = get_pledged_security_qty(loan.name)
 
-		self.assertEqual(loan.status, 'Closed')
+		self.assertEqual(loan.status, "Closed")
 		self.assertEqual(sum(pledged_qty.values()), 0)
 
 		amounts = amounts = calculate_amounts(loan.name, add_days(last_date, 5))
-		self.assertEqual(amounts['pending_principal_amount'], 0)
-		self.assertEqual(amounts['payable_principal_amount'], 0.0)
-		self.assertEqual(amounts['interest_amount'], 0)
+		self.assertEqual(amounts["pending_principal_amount"], 0)
+		self.assertEqual(amounts["payable_principal_amount"], 0.0)
+		self.assertEqual(amounts["interest_amount"], 0)
 
 	def test_partial_loan_security_unpledge(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 2000.00
-		},
-		{
-			"loan_security": "Test Security 2",
-			"qty": 4000.00
-		}]
+		pledge = [
+			{"loan_security": "Test Security 1", "qty": 2000.00},
+			{"loan_security": "Test Security 2", "qty": 4000.00},
+		]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5), 600000)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant2, add_days(last_date, 5), 600000
+		)
 		repayment_entry.submit()
 
-		unpledge_map = {'Test Security 2': 2000}
+		unpledge_map = {"Test Security 2": 2000}
 
-		unpledge_request = unpledge_security(loan=loan.name, security_map = unpledge_map, save=1)
+		unpledge_request = unpledge_security(loan=loan.name, security_map=unpledge_map, save=1)
 		unpledge_request.submit()
-		unpledge_request.status = 'Approved'
+		unpledge_request.status = "Approved"
 		unpledge_request.save()
 		unpledge_request.submit()
 		unpledge_request.load_from_db()
 		self.assertEqual(unpledge_request.docstatus, 1)
 
 	def test_sanctioned_loan_security_unpledge(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		unpledge_map = {'Test Security 1': 4000}
-		unpledge_request = unpledge_security(loan=loan.name, security_map = unpledge_map, save=1)
+		unpledge_map = {"Test Security 1": 4000}
+		unpledge_request = unpledge_security(loan=loan.name, security_map=unpledge_map, save=1)
 		unpledge_request.submit()
-		unpledge_request.status = 'Approved'
+		unpledge_request.status = "Approved"
 		unpledge_request.save()
 		unpledge_request.submit()
 
 	def test_disbursal_check_with_shortfall(self):
-		pledges = [{
-			"loan_security": "Test Security 2",
-			"qty": 8000.00,
-			"haircut": 50,
-		}]
+		pledges = [
+			{
+				"loan_security": "Test Security 2",
+				"qty": 8000.00,
+				"haircut": 50,
+			}
+		]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2,
-			'Stock Loan', pledges, "Repay Over Number of Periods", 12)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Stock Loan", pledges, "Repay Over Number of Periods", 12
+		)
 
 		create_pledge(loan_application)
 
-		loan = create_loan_with_security(self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application)
+		loan = create_loan_with_security(
+			self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application
+		)
 		loan.submit()
 
-		#Disbursing 7,00,000 from the allowed 10,00,000 according to security pledge
+		# Disbursing 7,00,000 from the allowed 10,00,000 according to security pledge
 		make_loan_disbursement_entry(loan.name, 700000)
 
-		frappe.db.sql("""UPDATE `tabLoan Security Price` SET loan_security_price = 100
-			where loan_security='Test Security 2'""")
+		frappe.db.sql(
+			"""UPDATE `tabLoan Security Price` SET loan_security_price = 100
+			where loan_security='Test Security 2'"""
+		)
 
 		create_process_loan_security_shortfall()
 		loan_security_shortfall = frappe.get_doc("Loan Security Shortfall", {"loan": loan.name})
@@ -496,422 +615,505 @@
 
 		self.assertEqual(get_disbursal_amount(loan.name), 0)
 
-		frappe.db.sql(""" UPDATE `tabLoan Security Price` SET loan_security_price = 250
-			where loan_security='Test Security 2'""")
+		frappe.db.sql(
+			""" UPDATE `tabLoan Security Price` SET loan_security_price = 250
+			where loan_security='Test Security 2'"""
+		)
 
 	def test_disbursal_check_without_shortfall(self):
-		pledges = [{
-			"loan_security": "Test Security 2",
-			"qty": 8000.00,
-			"haircut": 50,
-		}]
+		pledges = [
+			{
+				"loan_security": "Test Security 2",
+				"qty": 8000.00,
+				"haircut": 50,
+			}
+		]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2,
-			'Stock Loan', pledges, "Repay Over Number of Periods", 12)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Stock Loan", pledges, "Repay Over Number of Periods", 12
+		)
 
 		create_pledge(loan_application)
 
-		loan = create_loan_with_security(self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application)
+		loan = create_loan_with_security(
+			self.applicant2, "Stock Loan", "Repay Over Number of Periods", 12, loan_application
+		)
 		loan.submit()
 
-		#Disbursing 7,00,000 from the allowed 10,00,000 according to security pledge
+		# Disbursing 7,00,000 from the allowed 10,00,000 according to security pledge
 		make_loan_disbursement_entry(loan.name, 700000)
 
 		self.assertEqual(get_disbursal_amount(loan.name), 300000)
 
 	def test_pending_loan_amount_after_closure_request(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
 		no_of_days += 5
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
 		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5), flt(loan.loan_amount + accrued_interest_amount))
+		repayment_entry = create_repayment_entry(
+			loan.name,
+			self.applicant2,
+			add_days(last_date, 5),
+			flt(loan.loan_amount + accrued_interest_amount),
+		)
 		repayment_entry.submit()
 
-		amounts = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['paid_interest_amount',
-			'paid_principal_amount'])
+		amounts = frappe.db.get_value(
+			"Loan Interest Accrual", {"loan": loan.name}, ["paid_interest_amount", "paid_principal_amount"]
+		)
 
 		request_loan_closure(loan.name)
 		loan.load_from_db()
 		self.assertEqual(loan.status, "Loan Closure Requested")
 
 		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
-		self.assertEqual(amounts['pending_principal_amount'], 0.0)
+		self.assertEqual(amounts["pending_principal_amount"], 0.0)
 
 	def test_partial_unaccrued_interest_payment(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
 		no_of_days += 5.5
 
 		# get partial unaccrued interest amount
-		paid_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		paid_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
 		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
-			paid_amount)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant2, add_days(last_date, 5), paid_amount
+		)
 
 		repayment_entry.submit()
 		repayment_entry.load_from_db()
 
-		partial_accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * 5) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		partial_accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * 5) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
-		interest_amount = flt(amounts['interest_amount'] + partial_accrued_interest_amount, 2)
+		interest_amount = flt(amounts["interest_amount"] + partial_accrued_interest_amount, 2)
 		self.assertEqual(flt(repayment_entry.total_interest_paid, 0), flt(interest_amount, 0))
 
 	def test_penalty(self):
 		loan, amounts = create_loan_scenario_for_penalty(self)
 		# 30 days - grace period
 		penalty_days = 30 - 4
-		penalty_applicable_amount = flt(amounts['interest_amount']/2)
+		penalty_applicable_amount = flt(amounts["interest_amount"] / 2)
 		penalty_amount = flt((((penalty_applicable_amount * 25) / 100) * penalty_days), 2)
-		process = process_loan_interest_accrual_for_demand_loans(posting_date = '2019-11-30')
+		process = process_loan_interest_accrual_for_demand_loans(posting_date="2019-11-30")
 
-		calculated_penalty_amount = frappe.db.get_value('Loan Interest Accrual',
-			{'process_loan_interest_accrual': process, 'loan': loan.name}, 'penalty_amount')
+		calculated_penalty_amount = frappe.db.get_value(
+			"Loan Interest Accrual",
+			{"process_loan_interest_accrual": process, "loan": loan.name},
+			"penalty_amount",
+		)
 
 		self.assertEqual(loan.loan_amount, 1000000)
 		self.assertEqual(calculated_penalty_amount, penalty_amount)
 
 	def test_penalty_repayment(self):
 		loan, dummy = create_loan_scenario_for_penalty(self)
-		amounts = calculate_amounts(loan.name, '2019-11-30 00:00:00')
+		amounts = calculate_amounts(loan.name, "2019-11-30 00:00:00")
 
 		first_penalty = 10000
-		second_penalty = amounts['penalty_amount'] - 10000
+		second_penalty = amounts["penalty_amount"] - 10000
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, '2019-11-30 00:00:00', 10000)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant2, "2019-11-30 00:00:00", 10000
+		)
 		repayment_entry.submit()
 
-		amounts = calculate_amounts(loan.name, '2019-11-30 00:00:01')
-		self.assertEqual(amounts['penalty_amount'], second_penalty)
+		amounts = calculate_amounts(loan.name, "2019-11-30 00:00:01")
+		self.assertEqual(amounts["penalty_amount"], second_penalty)
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, '2019-11-30 00:00:01', second_penalty)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant2, "2019-11-30 00:00:01", second_penalty
+		)
 		repayment_entry.submit()
 
-		amounts = calculate_amounts(loan.name, '2019-11-30 00:00:02')
-		self.assertEqual(amounts['penalty_amount'], 0)
+		amounts = calculate_amounts(loan.name, "2019-11-30 00:00:02")
+		self.assertEqual(amounts["penalty_amount"], 0)
 
 	def test_loan_write_off_limit(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 		no_of_days += 5
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
 		# repay 50 less so that it can be automatically written off
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
-			flt(loan.loan_amount + accrued_interest_amount - 50))
+		repayment_entry = create_repayment_entry(
+			loan.name,
+			self.applicant2,
+			add_days(last_date, 5),
+			flt(loan.loan_amount + accrued_interest_amount - 50),
+		)
 
 		repayment_entry.submit()
 
-		amount = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['sum(paid_interest_amount)'])
+		amount = frappe.db.get_value(
+			"Loan Interest Accrual", {"loan": loan.name}, ["sum(paid_interest_amount)"]
+		)
 
-		self.assertEqual(flt(amount, 0),flt(accrued_interest_amount, 0))
+		self.assertEqual(flt(amount, 0), flt(accrued_interest_amount, 0))
 		self.assertEqual(flt(repayment_entry.penalty_amount, 5), 0)
 
 		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
-		self.assertEqual(flt(amounts['pending_principal_amount'], 0), 50)
+		self.assertEqual(flt(amounts["pending_principal_amount"], 0), 50)
 
 		request_loan_closure(loan.name)
 		loan.load_from_db()
 		self.assertEqual(loan.status, "Loan Closure Requested")
 
 	def test_loan_repayment_against_partially_disbursed_loan(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
-		make_loan_disbursement_entry(loan.name, loan.loan_amount/2, disbursement_date=first_date)
+		make_loan_disbursement_entry(loan.name, loan.loan_amount / 2, disbursement_date=first_date)
 
 		loan.load_from_db()
 
 		self.assertEqual(loan.status, "Partially Disbursed")
-		create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
-			flt(loan.loan_amount/3))
+		create_repayment_entry(
+			loan.name, self.applicant2, add_days(last_date, 5), flt(loan.loan_amount / 3)
+		)
 
 	def test_loan_amount_write_off(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant2, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 		no_of_days += 5
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
 		# repay 100 less so that it can be automatically written off
-		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
-			flt(loan.loan_amount + accrued_interest_amount - 100))
+		repayment_entry = create_repayment_entry(
+			loan.name,
+			self.applicant2,
+			add_days(last_date, 5),
+			flt(loan.loan_amount + accrued_interest_amount - 100),
+		)
 
 		repayment_entry.submit()
 
-		amount = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['sum(paid_interest_amount)'])
+		amount = frappe.db.get_value(
+			"Loan Interest Accrual", {"loan": loan.name}, ["sum(paid_interest_amount)"]
+		)
 
-		self.assertEqual(flt(amount, 0),flt(accrued_interest_amount, 0))
+		self.assertEqual(flt(amount, 0), flt(accrued_interest_amount, 0))
 		self.assertEqual(flt(repayment_entry.penalty_amount, 5), 0)
 
 		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
-		self.assertEqual(flt(amounts['pending_principal_amount'], 0), 100)
+		self.assertEqual(flt(amounts["pending_principal_amount"], 0), 100)
 
-		we = make_loan_write_off(loan.name, amount=amounts['pending_principal_amount'])
+		we = make_loan_write_off(loan.name, amount=amounts["pending_principal_amount"])
 		we.submit()
 
 		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
-		self.assertEqual(flt(amounts['pending_principal_amount'], 0), 0)
+		self.assertEqual(flt(amounts["pending_principal_amount"], 0), 0)
+
 
 def create_loan_scenario_for_penalty(doc):
-	pledge = [{
-		"loan_security": "Test Security 1",
-		"qty": 4000.00
-	}]
+	pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-	loan_application = create_loan_application('_Test Company', doc.applicant2, 'Demand Loan', pledge)
+	loan_application = create_loan_application("_Test Company", doc.applicant2, "Demand Loan", pledge)
 	create_pledge(loan_application)
-	loan = create_demand_loan(doc.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
+	loan = create_demand_loan(
+		doc.applicant2, "Demand Loan", loan_application, posting_date="2019-10-01"
+	)
 	loan.submit()
 
-	first_date = '2019-10-01'
-	last_date = '2019-10-30'
+	first_date = "2019-10-01"
+	last_date = "2019-10-30"
 
 	make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-	process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+	process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 
 	amounts = calculate_amounts(loan.name, add_days(last_date, 1))
-	paid_amount = amounts['interest_amount']/2
+	paid_amount = amounts["interest_amount"] / 2
 
-	repayment_entry = create_repayment_entry(loan.name, doc.applicant2, add_days(last_date, 5),
-		paid_amount)
+	repayment_entry = create_repayment_entry(
+		loan.name, doc.applicant2, add_days(last_date, 5), paid_amount
+	)
 
 	repayment_entry.submit()
 
 	return loan, amounts
 
+
 def create_loan_accounts():
 	if not frappe.db.exists("Account", "Loans and Advances (Assets) - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"account_name": "Loans and Advances (Assets)",
-			"company": "_Test Company",
-			"root_type": "Asset",
-			"report_type": "Balance Sheet",
-			"currency": "INR",
-			"parent_account": "Current Assets - _TC",
-			"account_type": "Bank",
-			"is_group": 1
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"account_name": "Loans and Advances (Assets)",
+				"company": "_Test Company",
+				"root_type": "Asset",
+				"report_type": "Balance Sheet",
+				"currency": "INR",
+				"parent_account": "Current Assets - _TC",
+				"account_type": "Bank",
+				"is_group": 1,
+			}
+		).insert(ignore_permissions=True)
 
 	if not frappe.db.exists("Account", "Loan Account - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"company": "_Test Company",
-			"account_name": "Loan Account",
-			"root_type": "Asset",
-			"report_type": "Balance Sheet",
-			"currency": "INR",
-			"parent_account": "Loans and Advances (Assets) - _TC",
-			"account_type": "Bank",
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": "Loan Account",
+				"root_type": "Asset",
+				"report_type": "Balance Sheet",
+				"currency": "INR",
+				"parent_account": "Loans and Advances (Assets) - _TC",
+				"account_type": "Bank",
+			}
+		).insert(ignore_permissions=True)
 
 	if not frappe.db.exists("Account", "Payment Account - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"company": "_Test Company",
-			"account_name": "Payment Account",
-			"root_type": "Asset",
-			"report_type": "Balance Sheet",
-			"currency": "INR",
-			"parent_account": "Bank Accounts - _TC",
-			"account_type": "Bank",
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": "Payment Account",
+				"root_type": "Asset",
+				"report_type": "Balance Sheet",
+				"currency": "INR",
+				"parent_account": "Bank Accounts - _TC",
+				"account_type": "Bank",
+			}
+		).insert(ignore_permissions=True)
 
 	if not frappe.db.exists("Account", "Disbursement Account - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"company": "_Test Company",
-			"account_name": "Disbursement Account",
-			"root_type": "Asset",
-			"report_type": "Balance Sheet",
-			"currency": "INR",
-			"parent_account": "Bank Accounts - _TC",
-			"account_type": "Bank",
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": "Disbursement Account",
+				"root_type": "Asset",
+				"report_type": "Balance Sheet",
+				"currency": "INR",
+				"parent_account": "Bank Accounts - _TC",
+				"account_type": "Bank",
+			}
+		).insert(ignore_permissions=True)
 
 	if not frappe.db.exists("Account", "Interest Income Account - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"company": "_Test Company",
-			"root_type": "Income",
-			"account_name": "Interest Income Account",
-			"report_type": "Profit and Loss",
-			"currency": "INR",
-			"parent_account": "Direct Income - _TC",
-			"account_type": "Income Account",
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"root_type": "Income",
+				"account_name": "Interest Income Account",
+				"report_type": "Profit and Loss",
+				"currency": "INR",
+				"parent_account": "Direct Income - _TC",
+				"account_type": "Income Account",
+			}
+		).insert(ignore_permissions=True)
 
 	if not frappe.db.exists("Account", "Penalty Income Account - _TC"):
-		frappe.get_doc({
-			"doctype": "Account",
-			"company": "_Test Company",
-			"account_name": "Penalty Income Account",
-			"root_type": "Income",
-			"report_type": "Profit and Loss",
-			"currency": "INR",
-			"parent_account": "Direct Income - _TC",
-			"account_type": "Income Account",
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": "Penalty Income Account",
+				"root_type": "Income",
+				"report_type": "Profit and Loss",
+				"currency": "INR",
+				"parent_account": "Direct Income - _TC",
+				"account_type": "Income Account",
+			}
+		).insert(ignore_permissions=True)
 
-def create_loan_type(loan_name, maximum_loan_amount, rate_of_interest, penalty_interest_rate=None, is_term_loan=None, grace_period_in_days=None,
-	mode_of_payment=None, disbursement_account=None, payment_account=None, loan_account=None, interest_income_account=None, penalty_income_account=None,
-	repayment_method=None, repayment_periods=None):
+
+def create_loan_type(
+	loan_name,
+	maximum_loan_amount,
+	rate_of_interest,
+	penalty_interest_rate=None,
+	is_term_loan=None,
+	grace_period_in_days=None,
+	mode_of_payment=None,
+	disbursement_account=None,
+	payment_account=None,
+	loan_account=None,
+	interest_income_account=None,
+	penalty_income_account=None,
+	repayment_method=None,
+	repayment_periods=None,
+):
 
 	if not frappe.db.exists("Loan Type", loan_name):
-		loan_type = frappe.get_doc({
-			"doctype": "Loan Type",
-			"company": "_Test Company",
-			"loan_name": loan_name,
-			"is_term_loan": is_term_loan,
-			"maximum_loan_amount": maximum_loan_amount,
-			"rate_of_interest": rate_of_interest,
-			"penalty_interest_rate": penalty_interest_rate,
-			"grace_period_in_days": grace_period_in_days,
-			"mode_of_payment": mode_of_payment,
-			"disbursement_account": disbursement_account,
-			"payment_account": payment_account,
-			"loan_account": loan_account,
-			"interest_income_account": interest_income_account,
-			"penalty_income_account": penalty_income_account,
-			"repayment_method": repayment_method,
-			"repayment_periods": repayment_periods,
-			"write_off_amount": 100
-		}).insert()
+		loan_type = frappe.get_doc(
+			{
+				"doctype": "Loan Type",
+				"company": "_Test Company",
+				"loan_name": loan_name,
+				"is_term_loan": is_term_loan,
+				"maximum_loan_amount": maximum_loan_amount,
+				"rate_of_interest": rate_of_interest,
+				"penalty_interest_rate": penalty_interest_rate,
+				"grace_period_in_days": grace_period_in_days,
+				"mode_of_payment": mode_of_payment,
+				"disbursement_account": disbursement_account,
+				"payment_account": payment_account,
+				"loan_account": loan_account,
+				"interest_income_account": interest_income_account,
+				"penalty_income_account": penalty_income_account,
+				"repayment_method": repayment_method,
+				"repayment_periods": repayment_periods,
+				"write_off_amount": 100,
+			}
+		).insert()
 
 		loan_type.submit()
 
+
 def create_loan_security_type():
 	if not frappe.db.exists("Loan Security Type", "Stock"):
-		frappe.get_doc({
-			"doctype": "Loan Security Type",
-			"loan_security_type": "Stock",
-			"unit_of_measure": "Nos",
-			"haircut": 50.00,
-			"loan_to_value_ratio": 50
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Loan Security Type",
+				"loan_security_type": "Stock",
+				"unit_of_measure": "Nos",
+				"haircut": 50.00,
+				"loan_to_value_ratio": 50,
+			}
+		).insert(ignore_permissions=True)
+
 
 def create_loan_security():
 	if not frappe.db.exists("Loan Security", "Test Security 1"):
-		frappe.get_doc({
-			"doctype": "Loan Security",
-			"loan_security_type": "Stock",
-			"loan_security_code": "532779",
-			"loan_security_name": "Test Security 1",
-			"unit_of_measure": "Nos",
-			"haircut": 50.00,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Loan Security",
+				"loan_security_type": "Stock",
+				"loan_security_code": "532779",
+				"loan_security_name": "Test Security 1",
+				"unit_of_measure": "Nos",
+				"haircut": 50.00,
+			}
+		).insert(ignore_permissions=True)
 
 	if not frappe.db.exists("Loan Security", "Test Security 2"):
-		frappe.get_doc({
-			"doctype": "Loan Security",
-			"loan_security_type": "Stock",
-			"loan_security_code": "531335",
-			"loan_security_name": "Test Security 2",
-			"unit_of_measure": "Nos",
-			"haircut": 50.00,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Loan Security",
+				"loan_security_type": "Stock",
+				"loan_security_code": "531335",
+				"loan_security_name": "Test Security 2",
+				"unit_of_measure": "Nos",
+				"haircut": 50.00,
+			}
+		).insert(ignore_permissions=True)
+
 
 def create_loan_security_pledge(applicant, pledges, loan_application=None, loan=None):
 
 	lsp = frappe.new_doc("Loan Security Pledge")
-	lsp.applicant_type = 'Customer'
+	lsp.applicant_type = "Customer"
 	lsp.applicant = applicant
 	lsp.company = "_Test Company"
 	lsp.loan_application = loan_application
@@ -920,64 +1122,82 @@
 		lsp.loan = loan
 
 	for pledge in pledges:
-		lsp.append('securities', {
-			"loan_security": pledge['loan_security'],
-			"qty": pledge['qty']
-		})
+		lsp.append("securities", {"loan_security": pledge["loan_security"], "qty": pledge["qty"]})
 
 	lsp.save()
 	lsp.submit()
 
 	return lsp
 
+
 def make_loan_disbursement_entry(loan, amount, disbursement_date=None):
 
-	loan_disbursement_entry = frappe.get_doc({
-		"doctype": "Loan Disbursement",
-		"against_loan": loan,
-		"disbursement_date": disbursement_date,
-		"company": "_Test Company",
-		"disbursed_amount": amount,
-		"cost_center": 'Main - _TC'
-	}).insert(ignore_permissions=True)
+	loan_disbursement_entry = frappe.get_doc(
+		{
+			"doctype": "Loan Disbursement",
+			"against_loan": loan,
+			"disbursement_date": disbursement_date,
+			"company": "_Test Company",
+			"disbursed_amount": amount,
+			"cost_center": "Main - _TC",
+		}
+	).insert(ignore_permissions=True)
 
 	loan_disbursement_entry.save()
 	loan_disbursement_entry.submit()
 
 	return loan_disbursement_entry
 
+
 def create_loan_security_price(loan_security, loan_security_price, uom, from_date, to_date):
 
-	if not frappe.db.get_value("Loan Security Price",{"loan_security": loan_security,
-		"valid_from": ("<=", from_date), "valid_upto": (">=", to_date)}, 'name'):
+	if not frappe.db.get_value(
+		"Loan Security Price",
+		{"loan_security": loan_security, "valid_from": ("<=", from_date), "valid_upto": (">=", to_date)},
+		"name",
+	):
 
-		lsp = frappe.get_doc({
-			"doctype": "Loan Security Price",
-			"loan_security": loan_security,
-			"loan_security_price": loan_security_price,
-			"uom": uom,
-			"valid_from":from_date,
-			"valid_upto": to_date
-		}).insert(ignore_permissions=True)
+		lsp = frappe.get_doc(
+			{
+				"doctype": "Loan Security Price",
+				"loan_security": loan_security,
+				"loan_security_price": loan_security_price,
+				"uom": uom,
+				"valid_from": from_date,
+				"valid_upto": to_date,
+			}
+		).insert(ignore_permissions=True)
+
 
 def create_repayment_entry(loan, applicant, posting_date, paid_amount):
 
-	lr = frappe.get_doc({
-		"doctype": "Loan Repayment",
-		"against_loan": loan,
-		"company": "_Test Company",
-		"posting_date": posting_date or nowdate(),
-		"applicant": applicant,
-		"amount_paid": paid_amount,
-		"loan_type": "Stock Loan"
-	}).insert(ignore_permissions=True)
+	lr = frappe.get_doc(
+		{
+			"doctype": "Loan Repayment",
+			"against_loan": loan,
+			"company": "_Test Company",
+			"posting_date": posting_date or nowdate(),
+			"applicant": applicant,
+			"amount_paid": paid_amount,
+			"loan_type": "Stock Loan",
+		}
+	).insert(ignore_permissions=True)
 
 	return lr
 
-def create_loan_application(company, applicant, loan_type, proposed_pledges, repayment_method=None,
-	repayment_periods=None, posting_date=None, do_not_save=False):
-	loan_application = frappe.new_doc('Loan Application')
-	loan_application.applicant_type = 'Customer'
+
+def create_loan_application(
+	company,
+	applicant,
+	loan_type,
+	proposed_pledges,
+	repayment_method=None,
+	repayment_periods=None,
+	posting_date=None,
+	do_not_save=False,
+):
+	loan_application = frappe.new_doc("Loan Application")
+	loan_application.applicant_type = "Customer"
 	loan_application.company = company
 	loan_application.applicant = applicant
 	loan_application.loan_type = loan_type
@@ -989,7 +1209,7 @@
 		loan_application.repayment_periods = repayment_periods
 
 	for pledge in proposed_pledges:
-		loan_application.append('proposed_pledges', pledge)
+		loan_application.append("proposed_pledges", pledge)
 
 	if do_not_save:
 		return loan_application
@@ -997,75 +1217,99 @@
 	loan_application.save()
 	loan_application.submit()
 
-	loan_application.status = 'Approved'
+	loan_application.status = "Approved"
 	loan_application.save()
 
 	return loan_application.name
 
 
-def create_loan(applicant, loan_type, loan_amount, repayment_method, repayment_periods,
-	applicant_type=None, repayment_start_date=None, posting_date=None):
+def create_loan(
+	applicant,
+	loan_type,
+	loan_amount,
+	repayment_method,
+	repayment_periods,
+	applicant_type=None,
+	repayment_start_date=None,
+	posting_date=None,
+):
 
-	loan = frappe.get_doc({
-		"doctype": "Loan",
-		"applicant_type": applicant_type or "Employee",
-		"company": "_Test Company",
-		"applicant": applicant,
-		"loan_type": loan_type,
-		"loan_amount": loan_amount,
-		"repayment_method": repayment_method,
-		"repayment_periods": repayment_periods,
-		"repayment_start_date": repayment_start_date or nowdate(),
-		"is_term_loan": 1,
-		"posting_date": posting_date or nowdate()
-	})
+	loan = frappe.get_doc(
+		{
+			"doctype": "Loan",
+			"applicant_type": applicant_type or "Employee",
+			"company": "_Test Company",
+			"applicant": applicant,
+			"loan_type": loan_type,
+			"loan_amount": loan_amount,
+			"repayment_method": repayment_method,
+			"repayment_periods": repayment_periods,
+			"repayment_start_date": repayment_start_date or nowdate(),
+			"is_term_loan": 1,
+			"posting_date": posting_date or nowdate(),
+		}
+	)
 
 	loan.save()
 	return loan
 
-def create_loan_with_security(applicant, loan_type, repayment_method, repayment_periods, loan_application, posting_date=None, repayment_start_date=None):
-	loan = frappe.get_doc({
-		"doctype": "Loan",
-		"company": "_Test Company",
-		"applicant_type": "Customer",
-		"posting_date": posting_date or nowdate(),
-		"loan_application": loan_application,
-		"applicant": applicant,
-		"loan_type": loan_type,
-		"is_term_loan": 1,
-		"is_secured_loan": 1,
-		"repayment_method": repayment_method,
-		"repayment_periods": repayment_periods,
-		"repayment_start_date": repayment_start_date or nowdate(),
-		"mode_of_payment": frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name'),
-		"payment_account": 'Payment Account - _TC',
-		"loan_account": 'Loan Account - _TC',
-		"interest_income_account": 'Interest Income Account - _TC',
-		"penalty_income_account": 'Penalty Income Account - _TC',
-	})
+
+def create_loan_with_security(
+	applicant,
+	loan_type,
+	repayment_method,
+	repayment_periods,
+	loan_application,
+	posting_date=None,
+	repayment_start_date=None,
+):
+	loan = frappe.get_doc(
+		{
+			"doctype": "Loan",
+			"company": "_Test Company",
+			"applicant_type": "Customer",
+			"posting_date": posting_date or nowdate(),
+			"loan_application": loan_application,
+			"applicant": applicant,
+			"loan_type": loan_type,
+			"is_term_loan": 1,
+			"is_secured_loan": 1,
+			"repayment_method": repayment_method,
+			"repayment_periods": repayment_periods,
+			"repayment_start_date": repayment_start_date or nowdate(),
+			"mode_of_payment": frappe.db.get_value("Mode of Payment", {"type": "Cash"}, "name"),
+			"payment_account": "Payment Account - _TC",
+			"loan_account": "Loan Account - _TC",
+			"interest_income_account": "Interest Income Account - _TC",
+			"penalty_income_account": "Penalty Income Account - _TC",
+		}
+	)
 
 	loan.save()
 
 	return loan
 
+
 def create_demand_loan(applicant, loan_type, loan_application, posting_date=None):
 
-	loan = frappe.get_doc({
-		"doctype": "Loan",
-		"company": "_Test Company",
-		"applicant_type": "Customer",
-		"posting_date": posting_date or nowdate(),
-		'loan_application': loan_application,
-		"applicant": applicant,
-		"loan_type": loan_type,
-		"is_term_loan": 0,
-		"is_secured_loan": 1,
-		"mode_of_payment": frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name'),
-		"payment_account": 'Payment Account - _TC',
-		"loan_account": 'Loan Account - _TC',
-		"interest_income_account": 'Interest Income Account - _TC',
-		"penalty_income_account": 'Penalty Income Account - _TC',
-	})
+	loan = frappe.get_doc(
+		{
+			"doctype": "Loan",
+			"company": "_Test Company",
+			"applicant_type": "Customer",
+			"posting_date": posting_date or nowdate(),
+			"loan_application": loan_application,
+			"applicant": applicant,
+			"loan_type": loan_type,
+			"is_term_loan": 0,
+			"is_secured_loan": 1,
+			"mode_of_payment": frappe.db.get_value("Mode of Payment", {"type": "Cash"}, "name"),
+			"payment_account": "Payment Account - _TC",
+			"loan_account": "Loan Account - _TC",
+			"interest_income_account": "Interest Income Account - _TC",
+			"penalty_income_account": "Penalty Income Account - _TC",
+		}
+	)
 
 	loan.save()
 
diff --git a/erpnext/loan_management/doctype/loan_application/loan_application.py b/erpnext/loan_management/doctype/loan_application/loan_application.py
index a8ffcb9..5f040e2 100644
--- a/erpnext/loan_management/doctype/loan_application/loan_application.py
+++ b/erpnext/loan_management/doctype/loan_application/loan_application.py
@@ -29,8 +29,13 @@
 		self.validate_loan_amount()
 
 		if self.is_term_loan:
-			validate_repayment_method(self.repayment_method, self.loan_amount, self.repayment_amount,
-				self.repayment_periods, self.is_term_loan)
+			validate_repayment_method(
+				self.repayment_method,
+				self.loan_amount,
+				self.repayment_amount,
+				self.repayment_periods,
+				self.is_term_loan,
+			)
 
 		self.validate_loan_type()
 
@@ -46,21 +51,35 @@
 		if not self.loan_amount:
 			frappe.throw(_("Loan Amount is mandatory"))
 
-		maximum_loan_limit = frappe.db.get_value('Loan Type', self.loan_type, 'maximum_loan_amount')
+		maximum_loan_limit = frappe.db.get_value("Loan Type", self.loan_type, "maximum_loan_amount")
 		if maximum_loan_limit and self.loan_amount > maximum_loan_limit:
-			frappe.throw(_("Loan Amount cannot exceed Maximum Loan Amount of {0}").format(maximum_loan_limit))
+			frappe.throw(
+				_("Loan Amount cannot exceed Maximum Loan Amount of {0}").format(maximum_loan_limit)
+			)
 
 		if self.maximum_loan_amount and self.loan_amount > self.maximum_loan_amount:
-			frappe.throw(_("Loan Amount exceeds maximum loan amount of {0} as per proposed securities").format(self.maximum_loan_amount))
+			frappe.throw(
+				_("Loan Amount exceeds maximum loan amount of {0} as per proposed securities").format(
+					self.maximum_loan_amount
+				)
+			)
 
 	def check_sanctioned_amount_limit(self):
-		sanctioned_amount_limit = get_sanctioned_amount_limit(self.applicant_type, self.applicant, self.company)
+		sanctioned_amount_limit = get_sanctioned_amount_limit(
+			self.applicant_type, self.applicant, self.company
+		)
 
 		if sanctioned_amount_limit:
 			total_loan_amount = get_total_loan_amount(self.applicant_type, self.applicant, self.company)
 
-		if sanctioned_amount_limit and flt(self.loan_amount) + flt(total_loan_amount) > flt(sanctioned_amount_limit):
-			frappe.throw(_("Sanctioned Amount limit crossed for {0} {1}").format(self.applicant_type, frappe.bold(self.applicant)))
+		if sanctioned_amount_limit and flt(self.loan_amount) + flt(total_loan_amount) > flt(
+			sanctioned_amount_limit
+		):
+			frappe.throw(
+				_("Sanctioned Amount limit crossed for {0} {1}").format(
+					self.applicant_type, frappe.bold(self.applicant)
+				)
+			)
 
 	def set_pledge_amount(self):
 		for proposed_pledge in self.proposed_pledges:
@@ -71,26 +90,31 @@
 			proposed_pledge.loan_security_price = get_loan_security_price(proposed_pledge.loan_security)
 
 			if not proposed_pledge.qty:
-				proposed_pledge.qty = cint(proposed_pledge.amount/proposed_pledge.loan_security_price)
+				proposed_pledge.qty = cint(proposed_pledge.amount / proposed_pledge.loan_security_price)
 
 			proposed_pledge.amount = proposed_pledge.qty * proposed_pledge.loan_security_price
-			proposed_pledge.post_haircut_amount = cint(proposed_pledge.amount - (proposed_pledge.amount * proposed_pledge.haircut/100))
+			proposed_pledge.post_haircut_amount = cint(
+				proposed_pledge.amount - (proposed_pledge.amount * proposed_pledge.haircut / 100)
+			)
 
 	def get_repayment_details(self):
 
 		if self.is_term_loan:
 			if self.repayment_method == "Repay Over Number of Periods":
-				self.repayment_amount = get_monthly_repayment_amount(self.loan_amount, self.rate_of_interest, self.repayment_periods)
+				self.repayment_amount = get_monthly_repayment_amount(
+					self.loan_amount, self.rate_of_interest, self.repayment_periods
+				)
 
 			if self.repayment_method == "Repay Fixed Amount per Period":
-				monthly_interest_rate = flt(self.rate_of_interest) / (12 *100)
+				monthly_interest_rate = flt(self.rate_of_interest) / (12 * 100)
 				if monthly_interest_rate:
-					min_repayment_amount = self.loan_amount*monthly_interest_rate
+					min_repayment_amount = self.loan_amount * monthly_interest_rate
 					if self.repayment_amount - min_repayment_amount <= 0:
-						frappe.throw(_("Repayment Amount must be greater than " \
-							+ str(flt(min_repayment_amount, 2))))
-					self.repayment_periods = math.ceil((math.log(self.repayment_amount) -
-						math.log(self.repayment_amount - min_repayment_amount)) /(math.log(1 + monthly_interest_rate)))
+						frappe.throw(_("Repayment Amount must be greater than " + str(flt(min_repayment_amount, 2))))
+					self.repayment_periods = math.ceil(
+						(math.log(self.repayment_amount) - math.log(self.repayment_amount - min_repayment_amount))
+						/ (math.log(1 + monthly_interest_rate))
+					)
 				else:
 					self.repayment_periods = self.loan_amount / self.repayment_amount
 
@@ -103,8 +127,8 @@
 		self.total_payable_amount = 0
 		self.total_payable_interest = 0
 
-		while(balance_amount > 0):
-			interest_amount = rounded(balance_amount * flt(self.rate_of_interest) / (12*100))
+		while balance_amount > 0:
+			interest_amount = rounded(balance_amount * flt(self.rate_of_interest) / (12 * 100))
 			balance_amount = rounded(balance_amount + interest_amount - self.repayment_amount)
 
 			self.total_payable_interest += interest_amount
@@ -123,12 +147,21 @@
 		if not self.loan_amount and self.is_secured_loan and self.proposed_pledges:
 			self.loan_amount = self.maximum_loan_amount
 
+
 @frappe.whitelist()
 def create_loan(source_name, target_doc=None, submit=0):
 	def update_accounts(source_doc, target_doc, source_parent):
-		account_details = frappe.get_all("Loan Type",
-			fields=["mode_of_payment", "payment_account","loan_account", "interest_income_account", "penalty_income_account"],
-			filters = {'name': source_doc.loan_type})[0]
+		account_details = frappe.get_all(
+			"Loan Type",
+			fields=[
+				"mode_of_payment",
+				"payment_account",
+				"loan_account",
+				"interest_income_account",
+				"penalty_income_account",
+			],
+			filters={"name": source_doc.loan_type},
+		)[0]
 
 		if source_doc.is_secured_loan:
 			target_doc.maximum_loan_amount = 0
@@ -140,22 +173,25 @@
 		target_doc.penalty_income_account = account_details.penalty_income_account
 		target_doc.loan_application = source_name
 
-
-	doclist = get_mapped_doc("Loan Application", source_name, {
-		"Loan Application": {
-			"doctype": "Loan",
-			"validation": {
-				"docstatus": ["=", 1]
-			},
-			"postprocess": update_accounts
-		}
-	}, target_doc)
+	doclist = get_mapped_doc(
+		"Loan Application",
+		source_name,
+		{
+			"Loan Application": {
+				"doctype": "Loan",
+				"validation": {"docstatus": ["=", 1]},
+				"postprocess": update_accounts,
+			}
+		},
+		target_doc,
+	)
 
 	if submit:
 		doclist.submit()
 
 	return doclist
 
+
 @frappe.whitelist()
 def create_pledge(loan_application, loan=None):
 	loan_application_doc = frappe.get_doc("Loan Application", loan_application)
@@ -171,12 +207,15 @@
 
 	for pledge in loan_application_doc.proposed_pledges:
 
-		lsp.append('securities', {
-			"loan_security": pledge.loan_security,
-			"qty": pledge.qty,
-			"loan_security_price": pledge.loan_security_price,
-			"haircut": pledge.haircut
-		})
+		lsp.append(
+			"securities",
+			{
+				"loan_security": pledge.loan_security,
+				"qty": pledge.qty,
+				"loan_security_price": pledge.loan_security_price,
+				"haircut": pledge.haircut,
+			},
+		)
 
 	lsp.save()
 	lsp.submit()
@@ -186,15 +225,14 @@
 
 	return lsp.name
 
-#This is a sandbox method to get the proposed pledges
+
+# This is a sandbox method to get the proposed pledges
 @frappe.whitelist()
 def get_proposed_pledge(securities):
 	if isinstance(securities, str):
 		securities = json.loads(securities)
 
-	proposed_pledges = {
-		'securities': []
-	}
+	proposed_pledges = {"securities": []}
 	maximum_loan_amount = 0
 
 	for security in securities:
@@ -205,15 +243,15 @@
 		security.loan_security_price = get_loan_security_price(security.loan_security)
 
 		if not security.qty:
-			security.qty = cint(security.amount/security.loan_security_price)
+			security.qty = cint(security.amount / security.loan_security_price)
 
 		security.amount = security.qty * security.loan_security_price
-		security.post_haircut_amount = cint(security.amount - (security.amount * security.haircut/100))
+		security.post_haircut_amount = cint(security.amount - (security.amount * security.haircut / 100))
 
 		maximum_loan_amount += security.post_haircut_amount
 
-		proposed_pledges['securities'].append(security)
+		proposed_pledges["securities"].append(security)
 
-	proposed_pledges['maximum_loan_amount'] = maximum_loan_amount
+	proposed_pledges["maximum_loan_amount"] = maximum_loan_amount
 
 	return proposed_pledges
diff --git a/erpnext/loan_management/doctype/loan_application/loan_application_dashboard.py b/erpnext/loan_management/doctype/loan_application/loan_application_dashboard.py
index e8e2a2a..1d90e9b 100644
--- a/erpnext/loan_management/doctype/loan_application/loan_application_dashboard.py
+++ b/erpnext/loan_management/doctype/loan_application/loan_application_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'loan_application',
-        'transactions': [
-            {
-                'items': ['Loan', 'Loan Security Pledge']
-            },
-        ],
-    }
+	return {
+		"fieldname": "loan_application",
+		"transactions": [
+			{"items": ["Loan", "Loan Security Pledge"]},
+		],
+	}
diff --git a/erpnext/loan_management/doctype/loan_application/test_loan_application.py b/erpnext/loan_management/doctype/loan_application/test_loan_application.py
index 640709c..2a4bb88 100644
--- a/erpnext/loan_management/doctype/loan_application/test_loan_application.py
+++ b/erpnext/loan_management/doctype/loan_application/test_loan_application.py
@@ -15,27 +15,45 @@
 class TestLoanApplication(unittest.TestCase):
 	def setUp(self):
 		create_loan_accounts()
-		create_loan_type("Home Loan", 500000, 9.2, 0, 1, 0, 'Cash', 'Disbursement Account - _TC', 'Payment Account - _TC', 'Loan Account - _TC',
-			'Interest Income Account - _TC', 'Penalty Income Account - _TC', 'Repay Over Number of Periods', 18)
+		create_loan_type(
+			"Home Loan",
+			500000,
+			9.2,
+			0,
+			1,
+			0,
+			"Cash",
+			"Disbursement Account - _TC",
+			"Payment Account - _TC",
+			"Loan Account - _TC",
+			"Interest Income Account - _TC",
+			"Penalty Income Account - _TC",
+			"Repay Over Number of Periods",
+			18,
+		)
 		self.applicant = make_employee("kate_loan@loan.com", "_Test Company")
-		make_salary_structure("Test Salary Structure Loan", "Monthly", employee=self.applicant, currency='INR')
+		make_salary_structure(
+			"Test Salary Structure Loan", "Monthly", employee=self.applicant, currency="INR"
+		)
 		self.create_loan_application()
 
 	def create_loan_application(self):
 		loan_application = frappe.new_doc("Loan Application")
-		loan_application.update({
-			"applicant": self.applicant,
-			"loan_type": "Home Loan",
-			"rate_of_interest": 9.2,
-			"loan_amount": 250000,
-			"repayment_method": "Repay Over Number of Periods",
-			"repayment_periods": 18,
-			"company": "_Test Company"
-		})
+		loan_application.update(
+			{
+				"applicant": self.applicant,
+				"loan_type": "Home Loan",
+				"rate_of_interest": 9.2,
+				"loan_amount": 250000,
+				"repayment_method": "Repay Over Number of Periods",
+				"repayment_periods": 18,
+				"company": "_Test Company",
+			}
+		)
 		loan_application.insert()
 
 	def test_loan_totals(self):
-		loan_application = frappe.get_doc("Loan Application", {"applicant":self.applicant})
+		loan_application = frappe.get_doc("Loan Application", {"applicant": self.applicant})
 
 		self.assertEqual(loan_application.total_payable_interest, 18599)
 		self.assertEqual(loan_application.total_payable_amount, 268599)
diff --git a/erpnext/loan_management/doctype/loan_disbursement/loan_disbursement.py b/erpnext/loan_management/doctype/loan_disbursement/loan_disbursement.py
index 54a03b9..10174e5 100644
--- a/erpnext/loan_management/doctype/loan_disbursement/loan_disbursement.py
+++ b/erpnext/loan_management/doctype/loan_disbursement/loan_disbursement.py
@@ -18,7 +18,6 @@
 
 
 class LoanDisbursement(AccountsController):
-
 	def validate(self):
 		self.set_missing_values()
 		self.validate_disbursal_amount()
@@ -30,7 +29,7 @@
 	def on_cancel(self):
 		self.set_status_and_amounts(cancel=1)
 		self.make_gl_entries(cancel=1)
-		self.ignore_linked_doctypes = ['GL Entry']
+		self.ignore_linked_doctypes = ["GL Entry"]
 
 	def set_missing_values(self):
 		if not self.disbursement_date:
@@ -49,21 +48,36 @@
 			frappe.throw(_("Disbursed Amount cannot be greater than {0}").format(possible_disbursal_amount))
 
 	def set_status_and_amounts(self, cancel=0):
-		loan_details = frappe.get_all("Loan",
-			fields = ["loan_amount", "disbursed_amount", "total_payment", "total_principal_paid", "total_interest_payable",
-				"status", "is_term_loan", "is_secured_loan"], filters= { "name": self.against_loan })[0]
+		loan_details = frappe.get_all(
+			"Loan",
+			fields=[
+				"loan_amount",
+				"disbursed_amount",
+				"total_payment",
+				"total_principal_paid",
+				"total_interest_payable",
+				"status",
+				"is_term_loan",
+				"is_secured_loan",
+			],
+			filters={"name": self.against_loan},
+		)[0]
 
 		if cancel:
 			disbursed_amount, status, total_payment = self.get_values_on_cancel(loan_details)
 		else:
 			disbursed_amount, status, total_payment = self.get_values_on_submit(loan_details)
 
-		frappe.db.set_value("Loan", self.against_loan, {
-			"disbursement_date": self.disbursement_date,
-			"disbursed_amount": disbursed_amount,
-			"status": status,
-			"total_payment": total_payment
-		})
+		frappe.db.set_value(
+			"Loan",
+			self.against_loan,
+			{
+				"disbursement_date": self.disbursement_date,
+				"disbursed_amount": disbursed_amount,
+				"status": status,
+				"total_payment": total_payment,
+			},
+		)
 
 	def get_values_on_cancel(self, loan_details):
 		disbursed_amount = loan_details.disbursed_amount - self.disbursed_amount
@@ -91,8 +105,11 @@
 		total_payment = loan_details.total_payment
 
 		if loan_details.status in ("Disbursed", "Partially Disbursed") and not loan_details.is_term_loan:
-			process_loan_interest_accrual_for_demand_loans(posting_date=add_days(self.disbursement_date, -1),
-				loan=self.against_loan, accrual_type="Disbursement")
+			process_loan_interest_accrual_for_demand_loans(
+				posting_date=add_days(self.disbursement_date, -1),
+				loan=self.against_loan,
+				accrual_type="Disbursement",
+			)
 
 		if disbursed_amount > loan_details.loan_amount:
 			topup_amount = disbursed_amount - loan_details.loan_amount
@@ -116,72 +133,96 @@
 		gle_map = []
 
 		gle_map.append(
-			self.get_gl_dict({
-				"account": self.loan_account,
-				"against": self.disbursement_account,
-				"debit": self.disbursed_amount,
-				"debit_in_account_currency": self.disbursed_amount,
-				"against_voucher_type": "Loan",
-				"against_voucher": self.against_loan,
-				"remarks": _("Disbursement against loan:") + self.against_loan,
-				"cost_center": self.cost_center,
-				"party_type": self.applicant_type,
-				"party": self.applicant,
-				"posting_date": self.disbursement_date
-			})
+			self.get_gl_dict(
+				{
+					"account": self.loan_account,
+					"against": self.disbursement_account,
+					"debit": self.disbursed_amount,
+					"debit_in_account_currency": self.disbursed_amount,
+					"against_voucher_type": "Loan",
+					"against_voucher": self.against_loan,
+					"remarks": _("Disbursement against loan:") + self.against_loan,
+					"cost_center": self.cost_center,
+					"party_type": self.applicant_type,
+					"party": self.applicant,
+					"posting_date": self.disbursement_date,
+				}
+			)
 		)
 
 		gle_map.append(
-			self.get_gl_dict({
-				"account": self.disbursement_account,
-				"against": self.loan_account,
-				"credit": self.disbursed_amount,
-				"credit_in_account_currency": self.disbursed_amount,
-				"against_voucher_type": "Loan",
-				"against_voucher": self.against_loan,
-				"remarks": _("Disbursement against loan:") + self.against_loan,
-				"cost_center": self.cost_center,
-				"posting_date": self.disbursement_date
-			})
+			self.get_gl_dict(
+				{
+					"account": self.disbursement_account,
+					"against": self.loan_account,
+					"credit": self.disbursed_amount,
+					"credit_in_account_currency": self.disbursed_amount,
+					"against_voucher_type": "Loan",
+					"against_voucher": self.against_loan,
+					"remarks": _("Disbursement against loan:") + self.against_loan,
+					"cost_center": self.cost_center,
+					"posting_date": self.disbursement_date,
+				}
+			)
 		)
 
 		if gle_map:
 			make_gl_entries(gle_map, cancel=cancel, adv_adj=adv_adj)
 
+
 def get_total_pledged_security_value(loan):
 	update_time = get_datetime()
 
-	loan_security_price_map = frappe._dict(frappe.get_all("Loan Security Price",
-		fields=["loan_security", "loan_security_price"],
-		filters = {
-			"valid_from": ("<=", update_time),
-			"valid_upto": (">=", update_time)
-		}, as_list=1))
+	loan_security_price_map = frappe._dict(
+		frappe.get_all(
+			"Loan Security Price",
+			fields=["loan_security", "loan_security_price"],
+			filters={"valid_from": ("<=", update_time), "valid_upto": (">=", update_time)},
+			as_list=1,
+		)
+	)
 
-	hair_cut_map = frappe._dict(frappe.get_all('Loan Security',
-		fields=["name", "haircut"], as_list=1))
+	hair_cut_map = frappe._dict(
+		frappe.get_all("Loan Security", fields=["name", "haircut"], as_list=1)
+	)
 
 	security_value = 0.0
 	pledged_securities = get_pledged_security_qty(loan)
 
 	for security, qty in pledged_securities.items():
 		after_haircut_percentage = 100 - hair_cut_map.get(security)
-		security_value += (loan_security_price_map.get(security) * qty * after_haircut_percentage)/100
+		security_value += (loan_security_price_map.get(security) * qty * after_haircut_percentage) / 100
 
 	return security_value
 
+
 @frappe.whitelist()
 def get_disbursal_amount(loan, on_current_security_price=0):
 	from erpnext.loan_management.doctype.loan_repayment.loan_repayment import (
 		get_pending_principal_amount,
 	)
 
-	loan_details = frappe.get_value("Loan", loan, ["loan_amount", "disbursed_amount", "total_payment",
-		"total_principal_paid", "total_interest_payable", "status", "is_term_loan", "is_secured_loan",
-		"maximum_loan_amount", "written_off_amount"], as_dict=1)
+	loan_details = frappe.get_value(
+		"Loan",
+		loan,
+		[
+			"loan_amount",
+			"disbursed_amount",
+			"total_payment",
+			"total_principal_paid",
+			"total_interest_payable",
+			"status",
+			"is_term_loan",
+			"is_secured_loan",
+			"maximum_loan_amount",
+			"written_off_amount",
+		],
+		as_dict=1,
+	)
 
-	if loan_details.is_secured_loan and frappe.get_all('Loan Security Shortfall', filters={'loan': loan,
-		'status': 'Pending'}):
+	if loan_details.is_secured_loan and frappe.get_all(
+		"Loan Security Shortfall", filters={"loan": loan, "status": "Pending"}
+	):
 		return 0
 
 	pending_principal_amount = get_pending_principal_amount(loan_details)
@@ -198,10 +239,14 @@
 
 	disbursal_amount = flt(security_value) - flt(pending_principal_amount)
 
-	if loan_details.is_term_loan and (disbursal_amount + loan_details.loan_amount) > loan_details.loan_amount:
+	if (
+		loan_details.is_term_loan
+		and (disbursal_amount + loan_details.loan_amount) > loan_details.loan_amount
+	):
 		disbursal_amount = loan_details.loan_amount - loan_details.disbursed_amount
 
 	return disbursal_amount
 
+
 def get_maximum_amount_as_per_pledged_security(loan):
-	return flt(frappe.db.get_value('Loan Security Pledge', {'loan': loan}, 'sum(maximum_loan_value)'))
+	return flt(frappe.db.get_value("Loan Security Pledge", {"loan": loan}, "sum(maximum_loan_value)"))
diff --git a/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py b/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py
index 10be750..4daa2ed 100644
--- a/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py
+++ b/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py
@@ -40,34 +40,50 @@
 
 
 class TestLoanDisbursement(unittest.TestCase):
-
 	def setUp(self):
 		create_loan_accounts()
 
-		create_loan_type("Demand Loan", 2000000, 13.5, 25, 0, 5, 'Cash', 'Disbursement Account - _TC',
-			'Payment Account - _TC', 'Loan Account - _TC', 'Interest Income Account - _TC', 'Penalty Income Account - _TC')
+		create_loan_type(
+			"Demand Loan",
+			2000000,
+			13.5,
+			25,
+			0,
+			5,
+			"Cash",
+			"Disbursement Account - _TC",
+			"Payment Account - _TC",
+			"Loan Account - _TC",
+			"Interest Income Account - _TC",
+			"Penalty Income Account - _TC",
+		)
 
 		create_loan_security_type()
 		create_loan_security()
 
-		create_loan_security_price("Test Security 1", 500, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
-		create_loan_security_price("Test Security 2", 250, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
+		create_loan_security_price(
+			"Test Security 1", 500, "Nos", get_datetime(), get_datetime(add_to_date(nowdate(), hours=24))
+		)
+		create_loan_security_price(
+			"Test Security 2", 250, "Nos", get_datetime(), get_datetime(add_to_date(nowdate(), hours=24))
+		)
 
 		if not frappe.db.exists("Customer", "_Test Loan Customer"):
-			frappe.get_doc(get_customer_dict('_Test Loan Customer')).insert(ignore_permissions=True)
+			frappe.get_doc(get_customer_dict("_Test Loan Customer")).insert(ignore_permissions=True)
 
-		self.applicant = frappe.db.get_value("Customer", {'name': '_Test Loan Customer'}, 'name')
+		self.applicant = frappe.db.get_value("Customer", {"name": "_Test Loan Customer"}, "name")
 
 	def test_loan_topup(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant, "Demand Loan", loan_application, posting_date=get_first_day(nowdate()))
+		loan = create_demand_loan(
+			self.applicant, "Demand Loan", loan_application, posting_date=get_first_day(nowdate())
+		)
 
 		loan.submit()
 
@@ -76,18 +92,22 @@
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime().year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime().year) * 100
+		)
 
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
 
 		process_loan_interest_accrual_for_demand_loans(posting_date=add_days(last_date, 1))
 
 		# Should not be able to create loan disbursement entry before repayment
-		self.assertRaises(frappe.ValidationError, make_loan_disbursement_entry, loan.name,
-			500000, first_date)
+		self.assertRaises(
+			frappe.ValidationError, make_loan_disbursement_entry, loan.name, 500000, first_date
+		)
 
-		repayment_entry = create_repayment_entry(loan.name, self.applicant, add_days(get_last_day(nowdate()), 5), 611095.89)
+		repayment_entry = create_repayment_entry(
+			loan.name, self.applicant, add_days(get_last_day(nowdate()), 5), 611095.89
+		)
 
 		repayment_entry.submit()
 		loan.reload()
@@ -96,49 +116,48 @@
 		make_loan_disbursement_entry(loan.name, 500000, disbursement_date=add_days(last_date, 16))
 
 		# check for disbursement accrual
-		loan_interest_accrual = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name,
-			'accrual_type': 'Disbursement'})
+		loan_interest_accrual = frappe.db.get_value(
+			"Loan Interest Accrual", {"loan": loan.name, "accrual_type": "Disbursement"}
+		)
 
 		self.assertTrue(loan_interest_accrual)
 
 	def test_loan_topup_with_additional_pledge(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
 
-		loan = create_demand_loan(self.applicant, "Demand Loan", loan_application, posting_date='2019-10-01')
+		loan = create_demand_loan(
+			self.applicant, "Demand Loan", loan_application, posting_date="2019-10-01"
+		)
 		loan.submit()
 
 		self.assertEqual(loan.loan_amount, 1000000)
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		# Disbursed 10,00,000 amount
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
-		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)
+		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
 		amounts = calculate_amounts(loan.name, add_days(last_date, 1))
 
-		previous_interest = amounts['interest_amount']
+		previous_interest = amounts["interest_amount"]
 
-		pledge1 = [{
-			"loan_security": "Test Security 1",
-			"qty": 2000.00
-		}]
+		pledge1 = [{"loan_security": "Test Security 1", "qty": 2000.00}]
 
 		create_loan_security_pledge(self.applicant, pledge1, loan=loan.name)
 
 		# Topup 500000
 		make_loan_disbursement_entry(loan.name, 500000, disbursement_date=add_days(last_date, 1))
-		process_loan_interest_accrual_for_demand_loans(posting_date = add_days(last_date, 15))
+		process_loan_interest_accrual_for_demand_loans(posting_date=add_days(last_date, 15))
 		amounts = calculate_amounts(loan.name, add_days(last_date, 15))
 
-		per_day_interest = get_per_day_interest(1500000, 13.5, '2019-10-30')
+		per_day_interest = get_per_day_interest(1500000, 13.5, "2019-10-30")
 		interest = per_day_interest * 15
 
-		self.assertEqual(amounts['pending_principal_amount'], 1500000)
-		self.assertEqual(amounts['interest_amount'], flt(interest + previous_interest, 2))
+		self.assertEqual(amounts["pending_principal_amount"], 1500000)
+		self.assertEqual(amounts["interest_amount"], flt(interest + previous_interest, 2))
diff --git a/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py b/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py
index f6a3ede..3a4c651 100644
--- a/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py
+++ b/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py
@@ -32,47 +32,53 @@
 			self.update_is_accrued()
 
 		self.make_gl_entries(cancel=1)
-		self.ignore_linked_doctypes = ['GL Entry']
+		self.ignore_linked_doctypes = ["GL Entry"]
 
 	def update_is_accrued(self):
-		frappe.db.set_value('Repayment Schedule', self.repayment_schedule_name, 'is_accrued', 0)
+		frappe.db.set_value("Repayment Schedule", self.repayment_schedule_name, "is_accrued", 0)
 
 	def make_gl_entries(self, cancel=0, adv_adj=0):
 		gle_map = []
 
-		cost_center = frappe.db.get_value('Loan', self.loan, 'cost_center')
+		cost_center = frappe.db.get_value("Loan", self.loan, "cost_center")
 
 		if self.interest_amount:
 			gle_map.append(
-				self.get_gl_dict({
-					"account": self.loan_account,
-					"party_type": self.applicant_type,
-					"party": self.applicant,
-					"against": self.interest_income_account,
-					"debit": self.interest_amount,
-					"debit_in_account_currency": self.interest_amount,
-					"against_voucher_type": "Loan",
-					"against_voucher": self.loan,
-					"remarks": _("Interest accrued from {0} to {1} against loan: {2}").format(
-						self.last_accrual_date, self.posting_date, self.loan),
-					"cost_center": cost_center,
-					"posting_date": self.posting_date
-				})
+				self.get_gl_dict(
+					{
+						"account": self.loan_account,
+						"party_type": self.applicant_type,
+						"party": self.applicant,
+						"against": self.interest_income_account,
+						"debit": self.interest_amount,
+						"debit_in_account_currency": self.interest_amount,
+						"against_voucher_type": "Loan",
+						"against_voucher": self.loan,
+						"remarks": _("Interest accrued from {0} to {1} against loan: {2}").format(
+							self.last_accrual_date, self.posting_date, self.loan
+						),
+						"cost_center": cost_center,
+						"posting_date": self.posting_date,
+					}
+				)
 			)
 
 			gle_map.append(
-				self.get_gl_dict({
-					"account": self.interest_income_account,
-					"against": self.loan_account,
-					"credit": self.interest_amount,
-					"credit_in_account_currency":  self.interest_amount,
-					"against_voucher_type": "Loan",
-					"against_voucher": self.loan,
-					"remarks": ("Interest accrued from {0} to {1} against loan: {2}").format(
-						self.last_accrual_date, self.posting_date, self.loan),
-					"cost_center": cost_center,
-					"posting_date": self.posting_date
-				})
+				self.get_gl_dict(
+					{
+						"account": self.interest_income_account,
+						"against": self.loan_account,
+						"credit": self.interest_amount,
+						"credit_in_account_currency": self.interest_amount,
+						"against_voucher_type": "Loan",
+						"against_voucher": self.loan,
+						"remarks": ("Interest accrued from {0} to {1} against loan: {2}").format(
+							self.last_accrual_date, self.posting_date, self.loan
+						),
+						"cost_center": cost_center,
+						"posting_date": self.posting_date,
+					}
+				)
 			)
 
 		if gle_map:
@@ -82,7 +88,9 @@
 # For Eg: If Loan disbursement date is '01-09-2019' and disbursed amount is 1000000 and
 # rate of interest is 13.5 then first loan interest accural will be on '01-10-2019'
 # which means interest will be accrued for 30 days which should be equal to 11095.89
-def calculate_accrual_amount_for_demand_loans(loan, posting_date, process_loan_interest, accrual_type):
+def calculate_accrual_amount_for_demand_loans(
+	loan, posting_date, process_loan_interest, accrual_type
+):
 	from erpnext.loan_management.doctype.loan_repayment.loan_repayment import (
 		calculate_amounts,
 		get_pending_principal_amount,
@@ -96,51 +104,76 @@
 
 	pending_principal_amount = get_pending_principal_amount(loan)
 
-	interest_per_day = get_per_day_interest(pending_principal_amount, loan.rate_of_interest, posting_date)
+	interest_per_day = get_per_day_interest(
+		pending_principal_amount, loan.rate_of_interest, posting_date
+	)
 	payable_interest = interest_per_day * no_of_days
 
-	pending_amounts = calculate_amounts(loan.name, posting_date, payment_type='Loan Closure')
+	pending_amounts = calculate_amounts(loan.name, posting_date, payment_type="Loan Closure")
 
-	args = frappe._dict({
-		'loan': loan.name,
-		'applicant_type': loan.applicant_type,
-		'applicant': loan.applicant,
-		'interest_income_account': loan.interest_income_account,
-		'loan_account': loan.loan_account,
-		'pending_principal_amount': pending_principal_amount,
-		'interest_amount': payable_interest,
-		'total_pending_interest_amount': pending_amounts['interest_amount'],
-		'penalty_amount': pending_amounts['penalty_amount'],
-		'process_loan_interest': process_loan_interest,
-		'posting_date': posting_date,
-		'accrual_type': accrual_type
-	})
+	args = frappe._dict(
+		{
+			"loan": loan.name,
+			"applicant_type": loan.applicant_type,
+			"applicant": loan.applicant,
+			"interest_income_account": loan.interest_income_account,
+			"loan_account": loan.loan_account,
+			"pending_principal_amount": pending_principal_amount,
+			"interest_amount": payable_interest,
+			"total_pending_interest_amount": pending_amounts["interest_amount"],
+			"penalty_amount": pending_amounts["penalty_amount"],
+			"process_loan_interest": process_loan_interest,
+			"posting_date": posting_date,
+			"accrual_type": accrual_type,
+		}
+	)
 
 	if flt(payable_interest, precision) > 0.0:
 		make_loan_interest_accrual_entry(args)
 
-def make_accrual_interest_entry_for_demand_loans(posting_date, process_loan_interest, open_loans=None, loan_type=None, accrual_type="Regular"):
-	query_filters = {
-		"status": ('in', ['Disbursed', 'Partially Disbursed']),
-		"docstatus": 1
-	}
+
+def make_accrual_interest_entry_for_demand_loans(
+	posting_date, process_loan_interest, open_loans=None, loan_type=None, accrual_type="Regular"
+):
+	query_filters = {"status": ("in", ["Disbursed", "Partially Disbursed"]), "docstatus": 1}
 
 	if loan_type:
-		query_filters.update({
-			"loan_type": loan_type
-		})
+		query_filters.update({"loan_type": loan_type})
 
 	if not open_loans:
-		open_loans = frappe.get_all("Loan",
-			fields=["name", "total_payment", "total_amount_paid", "loan_account", "interest_income_account", "loan_amount",
-				"is_term_loan", "status", "disbursement_date", "disbursed_amount", "applicant_type", "applicant",
-				"rate_of_interest", "total_interest_payable", "written_off_amount", "total_principal_paid", "repayment_start_date"],
-			filters=query_filters)
+		open_loans = frappe.get_all(
+			"Loan",
+			fields=[
+				"name",
+				"total_payment",
+				"total_amount_paid",
+				"loan_account",
+				"interest_income_account",
+				"loan_amount",
+				"is_term_loan",
+				"status",
+				"disbursement_date",
+				"disbursed_amount",
+				"applicant_type",
+				"applicant",
+				"rate_of_interest",
+				"total_interest_payable",
+				"written_off_amount",
+				"total_principal_paid",
+				"repayment_start_date",
+			],
+			filters=query_filters,
+		)
 
 	for loan in open_loans:
-		calculate_accrual_amount_for_demand_loans(loan, posting_date, process_loan_interest, accrual_type)
+		calculate_accrual_amount_for_demand_loans(
+			loan, posting_date, process_loan_interest, accrual_type
+		)
 
-def make_accrual_interest_entry_for_term_loans(posting_date, process_loan_interest, term_loan=None, loan_type=None, accrual_type="Regular"):
+
+def make_accrual_interest_entry_for_term_loans(
+	posting_date, process_loan_interest, term_loan=None, loan_type=None, accrual_type="Regular"
+):
 	curr_date = posting_date or add_days(nowdate(), 1)
 
 	term_loans = get_term_loans(curr_date, term_loan, loan_type)
@@ -149,37 +182,44 @@
 
 	for loan in term_loans:
 		accrued_entries.append(loan.payment_entry)
-		args = frappe._dict({
-			'loan': loan.name,
-			'applicant_type': loan.applicant_type,
-			'applicant': loan.applicant,
-			'interest_income_account': loan.interest_income_account,
-			'loan_account': loan.loan_account,
-			'interest_amount': loan.interest_amount,
-			'payable_principal': loan.principal_amount,
-			'process_loan_interest': process_loan_interest,
-			'repayment_schedule_name': loan.payment_entry,
-			'posting_date': posting_date,
-			'accrual_type': accrual_type
-		})
+		args = frappe._dict(
+			{
+				"loan": loan.name,
+				"applicant_type": loan.applicant_type,
+				"applicant": loan.applicant,
+				"interest_income_account": loan.interest_income_account,
+				"loan_account": loan.loan_account,
+				"interest_amount": loan.interest_amount,
+				"payable_principal": loan.principal_amount,
+				"process_loan_interest": process_loan_interest,
+				"repayment_schedule_name": loan.payment_entry,
+				"posting_date": posting_date,
+				"accrual_type": accrual_type,
+			}
+		)
 
 		make_loan_interest_accrual_entry(args)
 
 	if accrued_entries:
-		frappe.db.sql("""UPDATE `tabRepayment Schedule`
-			SET is_accrued = 1 where name in (%s)""" #nosec
-			% ", ".join(['%s']*len(accrued_entries)), tuple(accrued_entries))
+		frappe.db.sql(
+			"""UPDATE `tabRepayment Schedule`
+			SET is_accrued = 1 where name in (%s)"""  # nosec
+			% ", ".join(["%s"] * len(accrued_entries)),
+			tuple(accrued_entries),
+		)
+
 
 def get_term_loans(date, term_loan=None, loan_type=None):
-	condition = ''
+	condition = ""
 
 	if term_loan:
-		condition +=' AND l.name = %s' % frappe.db.escape(term_loan)
+		condition += " AND l.name = %s" % frappe.db.escape(term_loan)
 
 	if loan_type:
-		condition += ' AND l.loan_type = %s' % frappe.db.escape(loan_type)
+		condition += " AND l.loan_type = %s" % frappe.db.escape(loan_type)
 
-	term_loans = frappe.db.sql("""SELECT l.name, l.total_payment, l.total_amount_paid, l.loan_account,
+	term_loans = frappe.db.sql(
+		"""SELECT l.name, l.total_payment, l.total_amount_paid, l.loan_account,
 			l.interest_income_account, l.is_term_loan, l.disbursement_date, l.applicant_type, l.applicant,
 			l.rate_of_interest, l.total_interest_payable, l.repayment_start_date, rs.name as payment_entry,
 			rs.payment_date, rs.principal_amount, rs.interest_amount, rs.is_accrued , rs.balance_loan_amount
@@ -190,10 +230,16 @@
 			AND rs.payment_date <= %s
 			AND rs.is_accrued=0 {0}
 			AND l.status = 'Disbursed'
-			ORDER BY rs.payment_date""".format(condition), (getdate(date)), as_dict=1)
+			ORDER BY rs.payment_date""".format(
+			condition
+		),
+		(getdate(date)),
+		as_dict=1,
+	)
 
 	return term_loans
 
+
 def make_loan_interest_accrual_entry(args):
 	precision = cint(frappe.db.get_default("currency_precision")) or 2
 
@@ -205,7 +251,9 @@
 	loan_interest_accrual.loan_account = args.loan_account
 	loan_interest_accrual.pending_principal_amount = flt(args.pending_principal_amount, precision)
 	loan_interest_accrual.interest_amount = flt(args.interest_amount, precision)
-	loan_interest_accrual.total_pending_interest_amount = flt(args.total_pending_interest_amount, precision)
+	loan_interest_accrual.total_pending_interest_amount = flt(
+		args.total_pending_interest_amount, precision
+	)
 	loan_interest_accrual.penalty_amount = flt(args.penalty_amount, precision)
 	loan_interest_accrual.posting_date = args.posting_date or nowdate()
 	loan_interest_accrual.process_loan_interest_accrual = args.process_loan_interest
@@ -224,15 +272,20 @@
 
 	return no_of_days
 
+
 def get_last_accrual_date(loan):
-	last_posting_date = frappe.db.sql(""" SELECT MAX(posting_date) from `tabLoan Interest Accrual`
-		WHERE loan = %s and docstatus = 1""", (loan))
+	last_posting_date = frappe.db.sql(
+		""" SELECT MAX(posting_date) from `tabLoan Interest Accrual`
+		WHERE loan = %s and docstatus = 1""",
+		(loan),
+	)
 
 	if last_posting_date[0][0]:
 		# interest for last interest accrual date is already booked, so add 1 day
 		return add_days(last_posting_date[0][0], 1)
 	else:
-		return frappe.db.get_value('Loan', loan, 'disbursement_date')
+		return frappe.db.get_value("Loan", loan, "disbursement_date")
+
 
 def days_in_year(year):
 	days = 365
@@ -242,8 +295,11 @@
 
 	return days
 
+
 def get_per_day_interest(principal_amount, rate_of_interest, posting_date=None):
 	if not posting_date:
 		posting_date = getdate()
 
-	return flt((principal_amount * rate_of_interest) / (days_in_year(get_datetime(posting_date).year) * 100))
+	return flt(
+		(principal_amount * rate_of_interest) / (days_in_year(get_datetime(posting_date).year) * 100)
+	)
diff --git a/erpnext/loan_management/doctype/loan_interest_accrual/test_loan_interest_accrual.py b/erpnext/loan_management/doctype/loan_interest_accrual/test_loan_interest_accrual.py
index e8c7750..fd59393 100644
--- a/erpnext/loan_management/doctype/loan_interest_accrual/test_loan_interest_accrual.py
+++ b/erpnext/loan_management/doctype/loan_interest_accrual/test_loan_interest_accrual.py
@@ -30,78 +30,98 @@
 	def setUp(self):
 		create_loan_accounts()
 
-		create_loan_type("Demand Loan", 2000000, 13.5, 25, 0, 5, 'Cash', 'Disbursement Account - _TC',
-			'Payment Account - _TC', 'Loan Account - _TC', 'Interest Income Account - _TC', 'Penalty Income Account - _TC')
+		create_loan_type(
+			"Demand Loan",
+			2000000,
+			13.5,
+			25,
+			0,
+			5,
+			"Cash",
+			"Disbursement Account - _TC",
+			"Payment Account - _TC",
+			"Loan Account - _TC",
+			"Interest Income Account - _TC",
+			"Penalty Income Account - _TC",
+		)
 
 		create_loan_security_type()
 		create_loan_security()
 
-		create_loan_security_price("Test Security 1", 500, "Nos", get_datetime() , get_datetime(add_to_date(nowdate(), hours=24)))
+		create_loan_security_price(
+			"Test Security 1", 500, "Nos", get_datetime(), get_datetime(add_to_date(nowdate(), hours=24))
+		)
 
 		if not frappe.db.exists("Customer", "_Test Loan Customer"):
-			frappe.get_doc(get_customer_dict('_Test Loan Customer')).insert(ignore_permissions=True)
+			frappe.get_doc(get_customer_dict("_Test Loan Customer")).insert(ignore_permissions=True)
 
-		self.applicant = frappe.db.get_value("Customer", {'name': '_Test Loan Customer'}, 'name')
+		self.applicant = frappe.db.get_value("Customer", {"name": "_Test Loan Customer"}, "name")
 
 	def test_loan_interest_accural(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
-		loan = create_demand_loan(self.applicant, "Demand Loan", loan_application,
-			posting_date=get_first_day(nowdate()))
+		loan = create_demand_loan(
+			self.applicant, "Demand Loan", loan_application, posting_date=get_first_day(nowdate())
+		)
 		loan.submit()
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
 
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
 		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
-		loan_interest_accural = frappe.get_doc("Loan Interest Accrual", {'loan': loan.name})
+		loan_interest_accural = frappe.get_doc("Loan Interest Accrual", {"loan": loan.name})
 
 		self.assertEqual(flt(loan_interest_accural.interest_amount, 0), flt(accrued_interest_amount, 0))
 
 	def test_accumulated_amounts(self):
-		pledge = [{
-			"loan_security": "Test Security 1",
-			"qty": 4000.00
-		}]
+		pledge = [{"loan_security": "Test Security 1", "qty": 4000.00}]
 
-		loan_application = create_loan_application('_Test Company', self.applicant, 'Demand Loan', pledge)
+		loan_application = create_loan_application(
+			"_Test Company", self.applicant, "Demand Loan", pledge
+		)
 		create_pledge(loan_application)
-		loan = create_demand_loan(self.applicant, "Demand Loan", loan_application,
-			posting_date=get_first_day(nowdate()))
+		loan = create_demand_loan(
+			self.applicant, "Demand Loan", loan_application, posting_date=get_first_day(nowdate())
+		)
 		loan.submit()
 
-		first_date = '2019-10-01'
-		last_date = '2019-10-30'
+		first_date = "2019-10-01"
+		last_date = "2019-10-30"
 
 		no_of_days = date_diff(last_date, first_date) + 1
-		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
 		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
-		loan_interest_accrual = frappe.get_doc("Loan Interest Accrual", {'loan': loan.name})
+		loan_interest_accrual = frappe.get_doc("Loan Interest Accrual", {"loan": loan.name})
 
 		self.assertEqual(flt(loan_interest_accrual.interest_amount, 0), flt(accrued_interest_amount, 0))
 
-		next_start_date = '2019-10-31'
-		next_end_date = '2019-11-29'
+		next_start_date = "2019-10-31"
+		next_end_date = "2019-11-29"
 
 		no_of_days = date_diff(next_end_date, next_start_date) + 1
 		process = process_loan_interest_accrual_for_demand_loans(posting_date=next_end_date)
-		new_accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
-			/ (days_in_year(get_datetime(first_date).year) * 100)
+		new_accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) / (
+			days_in_year(get_datetime(first_date).year) * 100
+		)
 
 		total_pending_interest_amount = flt(accrued_interest_amount + new_accrued_interest_amount, 0)
 
-		loan_interest_accrual = frappe.get_doc("Loan Interest Accrual", {'loan': loan.name,
-			'process_loan_interest_accrual': process})
-		self.assertEqual(flt(loan_interest_accrual.total_pending_interest_amount, 0), total_pending_interest_amount)
+		loan_interest_accrual = frappe.get_doc(
+			"Loan Interest Accrual", {"loan": loan.name, "process_loan_interest_accrual": process}
+		)
+		self.assertEqual(
+			flt(loan_interest_accrual.total_pending_interest_amount, 0), total_pending_interest_amount
+		)
diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
index 67c2b1e..8cffe88 100644
--- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
+++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
@@ -22,7 +22,6 @@
 
 
 class LoanRepayment(AccountsController):
-
 	def validate(self):
 		amounts = calculate_amounts(self.against_loan, self.posting_date)
 		self.set_missing_values(amounts)
@@ -42,7 +41,7 @@
 		self.check_future_accruals()
 		self.update_repayment_schedule(cancel=1)
 		self.mark_as_unpaid()
-		self.ignore_linked_doctypes = ['GL Entry']
+		self.ignore_linked_doctypes = ["GL Entry"]
 		self.make_gl_entries(cancel=1)
 
 	def set_missing_values(self, amounts):
@@ -55,32 +54,38 @@
 			self.cost_center = erpnext.get_default_cost_center(self.company)
 
 		if not self.interest_payable:
-			self.interest_payable = flt(amounts['interest_amount'], precision)
+			self.interest_payable = flt(amounts["interest_amount"], precision)
 
 		if not self.penalty_amount:
-			self.penalty_amount = flt(amounts['penalty_amount'], precision)
+			self.penalty_amount = flt(amounts["penalty_amount"], precision)
 
 		if not self.pending_principal_amount:
-			self.pending_principal_amount = flt(amounts['pending_principal_amount'], precision)
+			self.pending_principal_amount = flt(amounts["pending_principal_amount"], precision)
 
 		if not self.payable_principal_amount and self.is_term_loan:
-			self.payable_principal_amount = flt(amounts['payable_principal_amount'], precision)
+			self.payable_principal_amount = flt(amounts["payable_principal_amount"], precision)
 
 		if not self.payable_amount:
-			self.payable_amount = flt(amounts['payable_amount'], precision)
+			self.payable_amount = flt(amounts["payable_amount"], precision)
 
-		shortfall_amount = flt(frappe.db.get_value('Loan Security Shortfall', {'loan': self.against_loan, 'status': 'Pending'},
-			'shortfall_amount'))
+		shortfall_amount = flt(
+			frappe.db.get_value(
+				"Loan Security Shortfall", {"loan": self.against_loan, "status": "Pending"}, "shortfall_amount"
+			)
+		)
 
 		if shortfall_amount:
 			self.shortfall_amount = shortfall_amount
 
-		if amounts.get('due_date'):
-			self.due_date = amounts.get('due_date')
+		if amounts.get("due_date"):
+			self.due_date = amounts.get("due_date")
 
 	def check_future_entries(self):
-		future_repayment_date = frappe.db.get_value("Loan Repayment", {"posting_date": (">", self.posting_date),
-			"docstatus": 1, "against_loan": self.against_loan}, 'posting_date')
+		future_repayment_date = frappe.db.get_value(
+			"Loan Repayment",
+			{"posting_date": (">", self.posting_date), "docstatus": 1, "against_loan": self.against_loan},
+			"posting_date",
+		)
 
 		if future_repayment_date:
 			frappe.throw("Repayment already made till date {0}".format(get_datetime(future_repayment_date)))
@@ -99,106 +104,167 @@
 				last_accrual_date = get_last_accrual_date(self.against_loan)
 
 				# get posting date upto which interest has to be accrued
-				per_day_interest = get_per_day_interest(self.pending_principal_amount,
-					self.rate_of_interest, self.posting_date)
+				per_day_interest = get_per_day_interest(
+					self.pending_principal_amount, self.rate_of_interest, self.posting_date
+				)
 
-				no_of_days = flt(flt(self.total_interest_paid - self.interest_payable,
-					precision)/per_day_interest, 0) - 1
+				no_of_days = (
+					flt(flt(self.total_interest_paid - self.interest_payable, precision) / per_day_interest, 0)
+					- 1
+				)
 
 				posting_date = add_days(last_accrual_date, no_of_days)
 
 				# book excess interest paid
-				process = process_loan_interest_accrual_for_demand_loans(posting_date=posting_date,
-					loan=self.against_loan, accrual_type="Repayment")
+				process = process_loan_interest_accrual_for_demand_loans(
+					posting_date=posting_date, loan=self.against_loan, accrual_type="Repayment"
+				)
 
 				# get loan interest accrual to update paid amount
-				lia = frappe.db.get_value('Loan Interest Accrual', {'process_loan_interest_accrual':
-					process}, ['name', 'interest_amount', 'payable_principal_amount'], as_dict=1)
+				lia = frappe.db.get_value(
+					"Loan Interest Accrual",
+					{"process_loan_interest_accrual": process},
+					["name", "interest_amount", "payable_principal_amount"],
+					as_dict=1,
+				)
 
 				if lia:
-					self.append('repayment_details', {
-						'loan_interest_accrual': lia.name,
-						'paid_interest_amount': flt(self.total_interest_paid - self.interest_payable, precision),
-						'paid_principal_amount': 0.0,
-						'accrual_type': 'Repayment'
-					})
+					self.append(
+						"repayment_details",
+						{
+							"loan_interest_accrual": lia.name,
+							"paid_interest_amount": flt(self.total_interest_paid - self.interest_payable, precision),
+							"paid_principal_amount": 0.0,
+							"accrual_type": "Repayment",
+						},
+					)
 
 	def update_paid_amount(self):
-		loan = frappe.get_value("Loan", self.against_loan, ['total_amount_paid', 'total_principal_paid',
-			'status', 'is_secured_loan', 'total_payment', 'loan_amount', 'disbursed_amount', 'total_interest_payable',
-			'written_off_amount'], as_dict=1)
+		loan = frappe.get_value(
+			"Loan",
+			self.against_loan,
+			[
+				"total_amount_paid",
+				"total_principal_paid",
+				"status",
+				"is_secured_loan",
+				"total_payment",
+				"loan_amount",
+				"disbursed_amount",
+				"total_interest_payable",
+				"written_off_amount",
+			],
+			as_dict=1,
+		)
 
-		loan.update({
-			'total_amount_paid': loan.total_amount_paid + self.amount_paid,
-			'total_principal_paid': loan.total_principal_paid + self.principal_amount_paid
-		})
+		loan.update(
+			{
+				"total_amount_paid": loan.total_amount_paid + self.amount_paid,
+				"total_principal_paid": loan.total_principal_paid + self.principal_amount_paid,
+			}
+		)
 
 		pending_principal_amount = get_pending_principal_amount(loan)
 		if not loan.is_secured_loan and pending_principal_amount <= 0:
-			loan.update({'status': 'Loan Closure Requested'})
+			loan.update({"status": "Loan Closure Requested"})
 
 		for payment in self.repayment_details:
-			frappe.db.sql(""" UPDATE `tabLoan Interest Accrual`
+			frappe.db.sql(
+				""" UPDATE `tabLoan Interest Accrual`
 				SET paid_principal_amount = `paid_principal_amount` + %s,
 					paid_interest_amount = `paid_interest_amount` + %s
 				WHERE name = %s""",
-				(flt(payment.paid_principal_amount), flt(payment.paid_interest_amount), payment.loan_interest_accrual))
+				(
+					flt(payment.paid_principal_amount),
+					flt(payment.paid_interest_amount),
+					payment.loan_interest_accrual,
+				),
+			)
 
-		frappe.db.sql(""" UPDATE `tabLoan`
+		frappe.db.sql(
+			""" UPDATE `tabLoan`
 			SET total_amount_paid = %s, total_principal_paid = %s, status = %s
-			WHERE name = %s """, (loan.total_amount_paid, loan.total_principal_paid, loan.status,
-			self.against_loan))
+			WHERE name = %s """,
+			(loan.total_amount_paid, loan.total_principal_paid, loan.status, self.against_loan),
+		)
 
 		update_shortfall_status(self.against_loan, self.principal_amount_paid)
 
 	def mark_as_unpaid(self):
-		loan = frappe.get_value("Loan", self.against_loan, ['total_amount_paid', 'total_principal_paid',
-			'status', 'is_secured_loan', 'total_payment', 'loan_amount', 'disbursed_amount', 'total_interest_payable',
-			'written_off_amount'], as_dict=1)
+		loan = frappe.get_value(
+			"Loan",
+			self.against_loan,
+			[
+				"total_amount_paid",
+				"total_principal_paid",
+				"status",
+				"is_secured_loan",
+				"total_payment",
+				"loan_amount",
+				"disbursed_amount",
+				"total_interest_payable",
+				"written_off_amount",
+			],
+			as_dict=1,
+		)
 
 		no_of_repayments = len(self.repayment_details)
 
-		loan.update({
-			'total_amount_paid': loan.total_amount_paid - self.amount_paid,
-			'total_principal_paid': loan.total_principal_paid - self.principal_amount_paid
-		})
+		loan.update(
+			{
+				"total_amount_paid": loan.total_amount_paid - self.amount_paid,
+				"total_principal_paid": loan.total_principal_paid - self.principal_amount_paid,
+			}
+		)
 
-		if loan.status == 'Loan Closure Requested':
+		if loan.status == "Loan Closure Requested":
 			if loan.disbursed_amount >= loan.loan_amount:
-				loan['status'] = 'Disbursed'
+				loan["status"] = "Disbursed"
 			else:
-				loan['status'] = 'Partially Disbursed'
+				loan["status"] = "Partially Disbursed"
 
 		for payment in self.repayment_details:
-			frappe.db.sql(""" UPDATE `tabLoan Interest Accrual`
+			frappe.db.sql(
+				""" UPDATE `tabLoan Interest Accrual`
 				SET paid_principal_amount = `paid_principal_amount` - %s,
 					paid_interest_amount = `paid_interest_amount` - %s
 				WHERE name = %s""",
-				(payment.paid_principal_amount, payment.paid_interest_amount, payment.loan_interest_accrual))
+				(payment.paid_principal_amount, payment.paid_interest_amount, payment.loan_interest_accrual),
+			)
 
 			# Cancel repayment interest accrual
 			# checking idx as a preventive measure, repayment accrual will always be the last entry
-			if payment.accrual_type == 'Repayment' and payment.idx == no_of_repayments:
-				lia_doc = frappe.get_doc('Loan Interest Accrual', payment.loan_interest_accrual)
+			if payment.accrual_type == "Repayment" and payment.idx == no_of_repayments:
+				lia_doc = frappe.get_doc("Loan Interest Accrual", payment.loan_interest_accrual)
 				lia_doc.cancel()
 
-		frappe.db.sql(""" UPDATE `tabLoan`
+		frappe.db.sql(
+			""" UPDATE `tabLoan`
 			SET total_amount_paid = %s, total_principal_paid = %s, status = %s
-			WHERE name = %s """, (loan.total_amount_paid, loan.total_principal_paid, loan.status, self.against_loan))
+			WHERE name = %s """,
+			(loan.total_amount_paid, loan.total_principal_paid, loan.status, self.against_loan),
+		)
 
 	def check_future_accruals(self):
-		future_accrual_date = frappe.db.get_value("Loan Interest Accrual", {"posting_date": (">", self.posting_date),
-			"docstatus": 1, "loan": self.against_loan}, 'posting_date')
+		future_accrual_date = frappe.db.get_value(
+			"Loan Interest Accrual",
+			{"posting_date": (">", self.posting_date), "docstatus": 1, "loan": self.against_loan},
+			"posting_date",
+		)
 
 		if future_accrual_date:
-			frappe.throw("Cannot cancel. Interest accruals already processed till {0}".format(get_datetime(future_accrual_date)))
+			frappe.throw(
+				"Cannot cancel. Interest accruals already processed till {0}".format(
+					get_datetime(future_accrual_date)
+				)
+			)
 
 	def update_repayment_schedule(self, cancel=0):
 		if self.is_term_loan and self.principal_amount_paid > self.payable_principal_amount:
 			regenerate_repayment_schedule(self.against_loan, cancel)
 
 	def allocate_amounts(self, repayment_details):
-		self.set('repayment_details', [])
+		self.set("repayment_details", [])
 		self.principal_amount_paid = 0
 		self.total_penalty_paid = 0
 		interest_paid = self.amount_paid
@@ -231,15 +297,15 @@
 		idx = 1
 
 		if interest_paid > 0:
-			for lia, amounts in repayment_details.get('pending_accrual_entries', []).items():
+			for lia, amounts in repayment_details.get("pending_accrual_entries", []).items():
 				interest_amount = 0
-				if amounts['interest_amount'] <= interest_paid:
-					interest_amount = amounts['interest_amount']
+				if amounts["interest_amount"] <= interest_paid:
+					interest_amount = amounts["interest_amount"]
 					self.total_interest_paid += interest_amount
 					interest_paid -= interest_amount
 				elif interest_paid:
-					if interest_paid >= amounts['interest_amount']:
-						interest_amount = amounts['interest_amount']
+					if interest_paid >= amounts["interest_amount"]:
+						interest_amount = amounts["interest_amount"]
 						self.total_interest_paid += interest_amount
 						interest_paid = 0
 					else:
@@ -248,27 +314,32 @@
 						interest_paid = 0
 
 				if interest_amount:
-					self.append('repayment_details', {
-						'loan_interest_accrual': lia,
-						'paid_interest_amount': interest_amount,
-						'paid_principal_amount': 0
-					})
+					self.append(
+						"repayment_details",
+						{
+							"loan_interest_accrual": lia,
+							"paid_interest_amount": interest_amount,
+							"paid_principal_amount": 0,
+						},
+					)
 					updated_entries[lia] = idx
 					idx += 1
 
 		return interest_paid, updated_entries
 
-	def allocate_principal_amount_for_term_loans(self, interest_paid, repayment_details, updated_entries):
+	def allocate_principal_amount_for_term_loans(
+		self, interest_paid, repayment_details, updated_entries
+	):
 		if interest_paid > 0:
-			for lia, amounts in repayment_details.get('pending_accrual_entries', []).items():
+			for lia, amounts in repayment_details.get("pending_accrual_entries", []).items():
 				paid_principal = 0
-				if amounts['payable_principal_amount'] <= interest_paid:
-					paid_principal = amounts['payable_principal_amount']
+				if amounts["payable_principal_amount"] <= interest_paid:
+					paid_principal = amounts["payable_principal_amount"]
 					self.principal_amount_paid += paid_principal
 					interest_paid -= paid_principal
 				elif interest_paid:
-					if interest_paid >= amounts['payable_principal_amount']:
-						paid_principal = amounts['payable_principal_amount']
+					if interest_paid >= amounts["payable_principal_amount"]:
+						paid_principal = amounts["payable_principal_amount"]
 						self.principal_amount_paid += paid_principal
 						interest_paid = 0
 					else:
@@ -278,30 +349,34 @@
 
 				if updated_entries.get(lia):
 					idx = updated_entries.get(lia)
-					self.get('repayment_details')[idx-1].paid_principal_amount += paid_principal
+					self.get("repayment_details")[idx - 1].paid_principal_amount += paid_principal
 				else:
-					self.append('repayment_details', {
-						'loan_interest_accrual': lia,
-						'paid_interest_amount': 0,
-						'paid_principal_amount': paid_principal
-					})
+					self.append(
+						"repayment_details",
+						{
+							"loan_interest_accrual": lia,
+							"paid_interest_amount": 0,
+							"paid_principal_amount": paid_principal,
+						},
+					)
 
 		if interest_paid > 0:
 			self.principal_amount_paid += interest_paid
 
 	def allocate_excess_payment_for_demand_loans(self, interest_paid, repayment_details):
-		if repayment_details['unaccrued_interest'] and interest_paid > 0:
+		if repayment_details["unaccrued_interest"] and interest_paid > 0:
 			# no of days for which to accrue interest
 			# Interest can only be accrued for an entire day and not partial
-			if interest_paid > repayment_details['unaccrued_interest']:
-				interest_paid -= repayment_details['unaccrued_interest']
-				self.total_interest_paid += repayment_details['unaccrued_interest']
+			if interest_paid > repayment_details["unaccrued_interest"]:
+				interest_paid -= repayment_details["unaccrued_interest"]
+				self.total_interest_paid += repayment_details["unaccrued_interest"]
 			else:
 				# get no of days for which interest can be paid
-				per_day_interest = get_per_day_interest(self.pending_principal_amount,
-					self.rate_of_interest, self.posting_date)
+				per_day_interest = get_per_day_interest(
+					self.pending_principal_amount, self.rate_of_interest, self.posting_date
+				)
 
-				no_of_days = cint(interest_paid/per_day_interest)
+				no_of_days = cint(interest_paid / per_day_interest)
 				self.total_interest_paid += no_of_days * per_day_interest
 				interest_paid -= no_of_days * per_day_interest
 
@@ -312,8 +387,9 @@
 		gle_map = []
 
 		if self.shortfall_amount and self.amount_paid > self.shortfall_amount:
-			remarks = _("Shortfall Repayment of {0}.\nRepayment against Loan: {1}").format(self.shortfall_amount,
-				self.against_loan)
+			remarks = _("Shortfall Repayment of {0}.\nRepayment against Loan: {1}").format(
+				self.shortfall_amount, self.against_loan
+			)
 		elif self.shortfall_amount:
 			remarks = _("Shortfall Repayment of {0}").format(self.shortfall_amount)
 		else:
@@ -326,91 +402,113 @@
 
 		if self.total_penalty_paid:
 			gle_map.append(
-				self.get_gl_dict({
-					"account": self.loan_account,
-					"against": payment_account,
-					"debit": self.total_penalty_paid,
-					"debit_in_account_currency": self.total_penalty_paid,
-					"against_voucher_type": "Loan",
-					"against_voucher": self.against_loan,
-					"remarks": _("Penalty against loan:") + self.against_loan,
-					"cost_center": self.cost_center,
-					"party_type": self.applicant_type,
-					"party": self.applicant,
-					"posting_date": getdate(self.posting_date)
-				})
+				self.get_gl_dict(
+					{
+						"account": self.loan_account,
+						"against": payment_account,
+						"debit": self.total_penalty_paid,
+						"debit_in_account_currency": self.total_penalty_paid,
+						"against_voucher_type": "Loan",
+						"against_voucher": self.against_loan,
+						"remarks": _("Penalty against loan:") + self.against_loan,
+						"cost_center": self.cost_center,
+						"party_type": self.applicant_type,
+						"party": self.applicant,
+						"posting_date": getdate(self.posting_date),
+					}
+				)
 			)
 
 			gle_map.append(
-				self.get_gl_dict({
-					"account": self.penalty_income_account,
-					"against": self.loan_account,
-					"credit": self.total_penalty_paid,
-					"credit_in_account_currency": self.total_penalty_paid,
-					"against_voucher_type": "Loan",
-					"against_voucher": self.against_loan,
-					"remarks": _("Penalty against loan:") + self.against_loan,
-					"cost_center": self.cost_center,
-					"posting_date": getdate(self.posting_date)
-				})
+				self.get_gl_dict(
+					{
+						"account": self.penalty_income_account,
+						"against": self.loan_account,
+						"credit": self.total_penalty_paid,
+						"credit_in_account_currency": self.total_penalty_paid,
+						"against_voucher_type": "Loan",
+						"against_voucher": self.against_loan,
+						"remarks": _("Penalty against loan:") + self.against_loan,
+						"cost_center": self.cost_center,
+						"posting_date": getdate(self.posting_date),
+					}
+				)
 			)
 
 		gle_map.append(
-			self.get_gl_dict({
-				"account": payment_account,
-				"against": self.loan_account + ", " + self.penalty_income_account,
-				"debit": self.amount_paid,
-				"debit_in_account_currency": self.amount_paid,
-				"against_voucher_type": "Loan",
-				"against_voucher": self.against_loan,
-				"remarks": remarks,
-				"cost_center": self.cost_center,
-				"posting_date": getdate(self.posting_date),
-				"party_type": self.applicant_type if self.repay_from_salary else '',
-				"party": self.applicant if self.repay_from_salary else ''
-			})
+			self.get_gl_dict(
+				{
+					"account": payment_account,
+					"against": self.loan_account + ", " + self.penalty_income_account,
+					"debit": self.amount_paid,
+					"debit_in_account_currency": self.amount_paid,
+					"against_voucher_type": "Loan",
+					"against_voucher": self.against_loan,
+					"remarks": remarks,
+					"cost_center": self.cost_center,
+					"posting_date": getdate(self.posting_date),
+					"party_type": self.applicant_type if self.repay_from_salary else "",
+					"party": self.applicant if self.repay_from_salary else "",
+				}
+			)
 		)
 
 		gle_map.append(
-			self.get_gl_dict({
-				"account": self.loan_account,
-				"party_type": self.applicant_type,
-				"party": self.applicant,
-				"against": payment_account,
-				"credit": self.amount_paid,
-				"credit_in_account_currency": self.amount_paid,
-				"against_voucher_type": "Loan",
-				"against_voucher": self.against_loan,
-				"remarks": remarks,
-				"cost_center": self.cost_center,
-				"posting_date": getdate(self.posting_date)
-			})
+			self.get_gl_dict(
+				{
+					"account": self.loan_account,
+					"party_type": self.applicant_type,
+					"party": self.applicant,
+					"against": payment_account,
+					"credit": self.amount_paid,
+					"credit_in_account_currency": self.amount_paid,
+					"against_voucher_type": "Loan",
+					"against_voucher": self.against_loan,
+					"remarks": remarks,
+					"cost_center": self.cost_center,
+					"posting_date": getdate(self.posting_date),
+				}
+			)
 		)
 
 		if gle_map:
 			make_gl_entries(gle_map, cancel=cancel, adv_adj=adv_adj, merge_entries=False)
 
-def create_repayment_entry(loan, applicant, company, posting_date, loan_type,
-	payment_type, interest_payable, payable_principal_amount, amount_paid, penalty_amount=None,
-	payroll_payable_account=None):
 
-	lr = frappe.get_doc({
-		"doctype": "Loan Repayment",
-		"against_loan": loan,
-		"payment_type": payment_type,
-		"company": company,
-		"posting_date": posting_date,
-		"applicant": applicant,
-		"penalty_amount": penalty_amount,
-		"interest_payable": interest_payable,
-		"payable_principal_amount": payable_principal_amount,
-		"amount_paid": amount_paid,
-		"loan_type": loan_type,
-		"payroll_payable_account": payroll_payable_account
-	}).insert()
+def create_repayment_entry(
+	loan,
+	applicant,
+	company,
+	posting_date,
+	loan_type,
+	payment_type,
+	interest_payable,
+	payable_principal_amount,
+	amount_paid,
+	penalty_amount=None,
+	payroll_payable_account=None,
+):
+
+	lr = frappe.get_doc(
+		{
+			"doctype": "Loan Repayment",
+			"against_loan": loan,
+			"payment_type": payment_type,
+			"company": company,
+			"posting_date": posting_date,
+			"applicant": applicant,
+			"penalty_amount": penalty_amount,
+			"interest_payable": interest_payable,
+			"payable_principal_amount": payable_principal_amount,
+			"amount_paid": amount_paid,
+			"loan_type": loan_type,
+			"payroll_payable_account": payroll_payable_account,
+		}
+	).insert()
 
 	return lr
 
+
 def get_accrued_interest_entries(against_loan, posting_date=None):
 	if not posting_date:
 		posting_date = getdate()
@@ -430,35 +528,43 @@
 			AND
 				docstatus = 1
 			ORDER BY posting_date
-		""", (against_loan, posting_date), as_dict=1)
+		""",
+		(against_loan, posting_date),
+		as_dict=1,
+	)
 
 	return unpaid_accrued_entries
 
+
 def get_penalty_details(against_loan):
-	penalty_details = frappe.db.sql("""
+	penalty_details = frappe.db.sql(
+		"""
 		SELECT posting_date, (penalty_amount - total_penalty_paid) as pending_penalty_amount
 		FROM `tabLoan Repayment` where posting_date >= (SELECT MAX(posting_date) from `tabLoan Repayment`
 		where against_loan = %s) and docstatus = 1 and against_loan = %s
-	""", (against_loan, against_loan))
+	""",
+		(against_loan, against_loan),
+	)
 
 	if penalty_details:
 		return penalty_details[0][0], flt(penalty_details[0][1])
 	else:
 		return None, 0
 
+
 def regenerate_repayment_schedule(loan, cancel=0):
 	from erpnext.loan_management.doctype.loan.loan import (
 		add_single_month,
 		get_monthly_repayment_amount,
 	)
 
-	loan_doc = frappe.get_doc('Loan', loan)
+	loan_doc = frappe.get_doc("Loan", loan)
 	next_accrual_date = None
 	accrued_entries = 0
 	last_repayment_amount = 0
 	last_balance_amount = 0
 
-	for term in reversed(loan_doc.get('repayment_schedule')):
+	for term in reversed(loan_doc.get("repayment_schedule")):
 		if not term.is_accrued:
 			next_accrual_date = term.payment_date
 			loan_doc.remove(term)
@@ -473,20 +579,23 @@
 
 	balance_amount = get_pending_principal_amount(loan_doc)
 
-	if loan_doc.repayment_method == 'Repay Fixed Amount per Period':
-		monthly_repayment_amount = flt(balance_amount/len(loan_doc.get('repayment_schedule')) - accrued_entries)
+	if loan_doc.repayment_method == "Repay Fixed Amount per Period":
+		monthly_repayment_amount = flt(
+			balance_amount / len(loan_doc.get("repayment_schedule")) - accrued_entries
+		)
 	else:
 		if not cancel:
-			monthly_repayment_amount = get_monthly_repayment_amount(balance_amount,
-				loan_doc.rate_of_interest, loan_doc.repayment_periods - accrued_entries)
+			monthly_repayment_amount = get_monthly_repayment_amount(
+				balance_amount, loan_doc.rate_of_interest, loan_doc.repayment_periods - accrued_entries
+			)
 		else:
 			monthly_repayment_amount = last_repayment_amount
 			balance_amount = last_balance_amount
 
 	payment_date = next_accrual_date
 
-	while(balance_amount > 0):
-		interest_amount = flt(balance_amount * flt(loan_doc.rate_of_interest) / (12*100))
+	while balance_amount > 0:
+		interest_amount = flt(balance_amount * flt(loan_doc.rate_of_interest) / (12 * 100))
 		principal_amount = monthly_repayment_amount - interest_amount
 		balance_amount = flt(balance_amount + interest_amount - monthly_repayment_amount)
 		if balance_amount < 0:
@@ -494,31 +603,45 @@
 			balance_amount = 0.0
 
 		total_payment = principal_amount + interest_amount
-		loan_doc.append("repayment_schedule", {
-			"payment_date": payment_date,
-			"principal_amount": principal_amount,
-			"interest_amount": interest_amount,
-			"total_payment": total_payment,
-			"balance_loan_amount": balance_amount
-		})
+		loan_doc.append(
+			"repayment_schedule",
+			{
+				"payment_date": payment_date,
+				"principal_amount": principal_amount,
+				"interest_amount": interest_amount,
+				"total_payment": total_payment,
+				"balance_loan_amount": balance_amount,
+			},
+		)
 		next_payment_date = add_single_month(payment_date)
 		payment_date = next_payment_date
 
 	loan_doc.save()
 
+
 def get_pending_principal_amount(loan):
-	if loan.status in ('Disbursed', 'Closed') or loan.disbursed_amount >= loan.loan_amount:
-		pending_principal_amount = flt(loan.total_payment) - flt(loan.total_principal_paid) \
-			- flt(loan.total_interest_payable) - flt(loan.written_off_amount)
+	if loan.status in ("Disbursed", "Closed") or loan.disbursed_amount >= loan.loan_amount:
+		pending_principal_amount = (
+			flt(loan.total_payment)
+			- flt(loan.total_principal_paid)
+			- flt(loan.total_interest_payable)
+			- flt(loan.written_off_amount)
+		)
 	else:
-		pending_principal_amount = flt(loan.disbursed_amount) - flt(loan.total_principal_paid) \
-			- flt(loan.total_interest_payable) - flt(loan.written_off_amount)
+		pending_principal_amount = (
+			flt(loan.disbursed_amount)
+			- flt(loan.total_principal_paid)
+			- flt(loan.total_interest_payable)
+			- flt(loan.written_off_amount)
+		)
 
 	return pending_principal_amount
 
+
 # This function returns the amounts that are payable at the time of loan repayment based on posting date
 # So it pulls all the unpaid Loan Interest Accrual Entries and calculates the penalty if applicable
 
+
 def get_amounts(amounts, against_loan, posting_date):
 	precision = cint(frappe.db.get_default("currency_precision")) or 2
 
@@ -532,8 +655,8 @@
 	total_pending_interest = 0
 	penalty_amount = 0
 	payable_principal_amount = 0
-	final_due_date = ''
-	due_date = ''
+	final_due_date = ""
+	due_date = ""
 
 	for entry in accrued_interest_entries:
 		# Loan repayment due date is one day after the loan interest is accrued
@@ -549,16 +672,25 @@
 
 		no_of_late_days = date_diff(posting_date, due_date_after_grace_period) + 1
 
-		if no_of_late_days > 0 and (not against_loan_doc.repay_from_salary) and entry.accrual_type == 'Regular':
-			penalty_amount += (entry.interest_amount * (loan_type_details.penalty_interest_rate / 100) * no_of_late_days)
+		if (
+			no_of_late_days > 0
+			and (not against_loan_doc.repay_from_salary)
+			and entry.accrual_type == "Regular"
+		):
+			penalty_amount += (
+				entry.interest_amount * (loan_type_details.penalty_interest_rate / 100) * no_of_late_days
+			)
 
 		total_pending_interest += entry.interest_amount
 		payable_principal_amount += entry.payable_principal_amount
 
-		pending_accrual_entries.setdefault(entry.name, {
-			'interest_amount': flt(entry.interest_amount, precision),
-			'payable_principal_amount': flt(entry.payable_principal_amount, precision)
-		})
+		pending_accrual_entries.setdefault(
+			entry.name,
+			{
+				"interest_amount": flt(entry.interest_amount, precision),
+				"payable_principal_amount": flt(entry.payable_principal_amount, precision),
+			},
+		)
 
 		if due_date and not final_due_date:
 			final_due_date = add_days(due_date, loan_type_details.grace_period_in_days)
@@ -574,14 +706,18 @@
 
 	if pending_days > 0:
 		principal_amount = flt(pending_principal_amount, precision)
-		per_day_interest = get_per_day_interest(principal_amount, loan_type_details.rate_of_interest, posting_date)
-		unaccrued_interest += (pending_days * per_day_interest)
+		per_day_interest = get_per_day_interest(
+			principal_amount, loan_type_details.rate_of_interest, posting_date
+		)
+		unaccrued_interest += pending_days * per_day_interest
 
 	amounts["pending_principal_amount"] = flt(pending_principal_amount, precision)
 	amounts["payable_principal_amount"] = flt(payable_principal_amount, precision)
 	amounts["interest_amount"] = flt(total_pending_interest, precision)
 	amounts["penalty_amount"] = flt(penalty_amount + pending_penalty_amount, precision)
-	amounts["payable_amount"] = flt(payable_principal_amount + total_pending_interest + penalty_amount, precision)
+	amounts["payable_amount"] = flt(
+		payable_principal_amount + total_pending_interest + penalty_amount, precision
+	)
 	amounts["pending_accrual_entries"] = pending_accrual_entries
 	amounts["unaccrued_interest"] = flt(unaccrued_interest, precision)
 
@@ -590,24 +726,25 @@
 
 	return amounts
 
+
 @frappe.whitelist()
-def calculate_amounts(against_loan, posting_date, payment_type=''):
+def calculate_amounts(against_loan, posting_date, payment_type=""):
 	amounts = {
-		'penalty_amount': 0.0,
-		'interest_amount': 0.0,
-		'pending_principal_amount': 0.0,
-		'payable_principal_amount': 0.0,
-		'payable_amount': 0.0,
-		'unaccrued_interest': 0.0,
-		'due_date': ''
+		"penalty_amount": 0.0,
+		"interest_amount": 0.0,
+		"pending_principal_amount": 0.0,
+		"payable_principal_amount": 0.0,
+		"payable_amount": 0.0,
+		"unaccrued_interest": 0.0,
+		"due_date": "",
 	}
 
 	amounts = get_amounts(amounts, against_loan, posting_date)
 
 	# update values for closure
-	if payment_type == 'Loan Closure':
-		amounts['payable_principal_amount'] = amounts['pending_principal_amount']
-		amounts['interest_amount'] += amounts['unaccrued_interest']
-		amounts['payable_amount'] = amounts['payable_principal_amount'] + amounts['interest_amount']
+	if payment_type == "Loan Closure":
+		amounts["payable_principal_amount"] = amounts["pending_principal_amount"]
+		amounts["interest_amount"] += amounts["unaccrued_interest"]
+		amounts["payable_amount"] = amounts["payable_principal_amount"] + amounts["interest_amount"]
 
 	return amounts
diff --git a/erpnext/loan_management/doctype/loan_security/loan_security_dashboard.py b/erpnext/loan_management/doctype/loan_security/loan_security_dashboard.py
index 964a1ae..1d96885 100644
--- a/erpnext/loan_management/doctype/loan_security/loan_security_dashboard.py
+++ b/erpnext/loan_management/doctype/loan_security/loan_security_dashboard.py
@@ -1,12 +1,8 @@
 def get_data():
 	return {
-		'fieldname': 'loan_security',
-		'transactions': [
-			{
-				'items': ['Loan Application', 'Loan Security Price']
-			},
-			{
-				'items': ['Loan Security Pledge', 'Loan Security Unpledge']
-			}
-		]
+		"fieldname": "loan_security",
+		"transactions": [
+			{"items": ["Loan Application", "Loan Security Price"]},
+			{"items": ["Loan Security Pledge", "Loan Security Unpledge"]},
+		],
 	}
diff --git a/erpnext/loan_management/doctype/loan_security_pledge/loan_security_pledge.py b/erpnext/loan_management/doctype/loan_security_pledge/loan_security_pledge.py
index 7d02645..f0d5954 100644
--- a/erpnext/loan_management/doctype/loan_security_pledge/loan_security_pledge.py
+++ b/erpnext/loan_management/doctype/loan_security_pledge/loan_security_pledge.py
@@ -40,22 +40,28 @@
 			if security.loan_security not in security_list:
 				security_list.append(security.loan_security)
 			else:
-				frappe.throw(_('Loan Security {0} added multiple times').format(frappe.bold(
-					security.loan_security)))
+				frappe.throw(
+					_("Loan Security {0} added multiple times").format(frappe.bold(security.loan_security))
+				)
 
 	def validate_loan_security_type(self):
-		existing_pledge = ''
+		existing_pledge = ""
 
 		if self.loan:
-			existing_pledge = frappe.db.get_value('Loan Security Pledge', {'loan': self.loan, 'docstatus': 1}, ['name'])
+			existing_pledge = frappe.db.get_value(
+				"Loan Security Pledge", {"loan": self.loan, "docstatus": 1}, ["name"]
+			)
 
 		if existing_pledge:
-			loan_security_type = frappe.db.get_value('Pledge', {'parent': existing_pledge}, ['loan_security_type'])
+			loan_security_type = frappe.db.get_value(
+				"Pledge", {"parent": existing_pledge}, ["loan_security_type"]
+			)
 		else:
 			loan_security_type = self.securities[0].loan_security_type
 
-		ltv_ratio_map = frappe._dict(frappe.get_all("Loan Security Type",
-			fields=["name", "loan_to_value_ratio"], as_list=1))
+		ltv_ratio_map = frappe._dict(
+			frappe.get_all("Loan Security Type", fields=["name", "loan_to_value_ratio"], as_list=1)
+		)
 
 		ltv_ratio = ltv_ratio_map.get(loan_security_type)
 
@@ -63,7 +69,6 @@
 			if ltv_ratio_map.get(security.loan_security_type) != ltv_ratio:
 				frappe.throw(_("Loan Securities with different LTV ratio cannot be pledged against one loan"))
 
-
 	def set_pledge_amount(self):
 		total_security_value = 0
 		maximum_loan_value = 0
@@ -77,10 +82,10 @@
 				pledge.loan_security_price = get_loan_security_price(pledge.loan_security)
 
 			if not pledge.qty:
-				pledge.qty = cint(pledge.amount/pledge.loan_security_price)
+				pledge.qty = cint(pledge.amount / pledge.loan_security_price)
 
 			pledge.amount = pledge.qty * pledge.loan_security_price
-			pledge.post_haircut_amount = cint(pledge.amount - (pledge.amount * pledge.haircut/100))
+			pledge.post_haircut_amount = cint(pledge.amount - (pledge.amount * pledge.haircut / 100))
 
 			total_security_value += pledge.amount
 			maximum_loan_value += pledge.post_haircut_amount
@@ -88,12 +93,19 @@
 		self.total_security_value = total_security_value
 		self.maximum_loan_value = maximum_loan_value
 
+
 def update_loan(loan, maximum_value_against_pledge, cancel=0):
-	maximum_loan_value = frappe.db.get_value('Loan', {'name': loan}, ['maximum_loan_amount'])
+	maximum_loan_value = frappe.db.get_value("Loan", {"name": loan}, ["maximum_loan_amount"])
 
 	if cancel:
-		frappe.db.sql(""" UPDATE `tabLoan` SET maximum_loan_amount=%s
-			WHERE name=%s""", (maximum_loan_value - maximum_value_against_pledge, loan))
+		frappe.db.sql(
+			""" UPDATE `tabLoan` SET maximum_loan_amount=%s
+			WHERE name=%s""",
+			(maximum_loan_value - maximum_value_against_pledge, loan),
+		)
 	else:
-		frappe.db.sql(""" UPDATE `tabLoan` SET maximum_loan_amount=%s, is_secured_loan=1
-			WHERE name=%s""", (maximum_loan_value + maximum_value_against_pledge, loan))
+		frappe.db.sql(
+			""" UPDATE `tabLoan` SET maximum_loan_amount=%s, is_secured_loan=1
+			WHERE name=%s""",
+			(maximum_loan_value + maximum_value_against_pledge, loan),
+		)
diff --git a/erpnext/loan_management/doctype/loan_security_price/loan_security_price.py b/erpnext/loan_management/doctype/loan_security_price/loan_security_price.py
index fca9dd6..45c4459 100644
--- a/erpnext/loan_management/doctype/loan_security_price/loan_security_price.py
+++ b/erpnext/loan_management/doctype/loan_security_price/loan_security_price.py
@@ -17,23 +17,37 @@
 		if self.valid_from > self.valid_upto:
 			frappe.throw(_("Valid From Time must be lesser than Valid Upto Time."))
 
-		existing_loan_security = frappe.db.sql(""" SELECT name from `tabLoan Security Price`
+		existing_loan_security = frappe.db.sql(
+			""" SELECT name from `tabLoan Security Price`
 			WHERE loan_security = %s AND name != %s AND (valid_from BETWEEN %s and %s OR valid_upto BETWEEN %s and %s) """,
-			(self.loan_security, self.name, self.valid_from, self.valid_upto, self.valid_from, self.valid_upto))
+			(
+				self.loan_security,
+				self.name,
+				self.valid_from,
+				self.valid_upto,
+				self.valid_from,
+				self.valid_upto,
+			),
+		)
 
 		if existing_loan_security:
 			frappe.throw(_("Loan Security Price overlapping with {0}").format(existing_loan_security[0][0]))
 
+
 @frappe.whitelist()
 def get_loan_security_price(loan_security, valid_time=None):
 	if not valid_time:
 		valid_time = get_datetime()
 
-	loan_security_price = frappe.db.get_value("Loan Security Price", {
-		'loan_security': loan_security,
-		'valid_from': ("<=",valid_time),
-		'valid_upto': (">=", valid_time)
-	}, 'loan_security_price')
+	loan_security_price = frappe.db.get_value(
+		"Loan Security Price",
+		{
+			"loan_security": loan_security,
+			"valid_from": ("<=", valid_time),
+			"valid_upto": (">=", valid_time),
+		},
+		"loan_security_price",
+	)
 
 	if not loan_security_price:
 		frappe.throw(_("No valid Loan Security Price found for {0}").format(frappe.bold(loan_security)))
diff --git a/erpnext/loan_management/doctype/loan_security_shortfall/loan_security_shortfall.py b/erpnext/loan_management/doctype/loan_security_shortfall/loan_security_shortfall.py
index 20e451b..b901e62 100644
--- a/erpnext/loan_management/doctype/loan_security_shortfall/loan_security_shortfall.py
+++ b/erpnext/loan_management/doctype/loan_security_shortfall/loan_security_shortfall.py
@@ -14,27 +14,42 @@
 class LoanSecurityShortfall(Document):
 	pass
 
+
 def update_shortfall_status(loan, security_value, on_cancel=0):
-	loan_security_shortfall = frappe.db.get_value("Loan Security Shortfall",
-		{"loan": loan, "status": "Pending"}, ['name', 'shortfall_amount'], as_dict=1)
+	loan_security_shortfall = frappe.db.get_value(
+		"Loan Security Shortfall",
+		{"loan": loan, "status": "Pending"},
+		["name", "shortfall_amount"],
+		as_dict=1,
+	)
 
 	if not loan_security_shortfall:
 		return
 
 	if security_value >= loan_security_shortfall.shortfall_amount:
-		frappe.db.set_value("Loan Security Shortfall", loan_security_shortfall.name, {
-			"status": "Completed",
-			"shortfall_amount": loan_security_shortfall.shortfall_amount,
-			"shortfall_percentage": 0
-		})
+		frappe.db.set_value(
+			"Loan Security Shortfall",
+			loan_security_shortfall.name,
+			{
+				"status": "Completed",
+				"shortfall_amount": loan_security_shortfall.shortfall_amount,
+				"shortfall_percentage": 0,
+			},
+		)
 	else:
-		frappe.db.set_value("Loan Security Shortfall", loan_security_shortfall.name,
-			"shortfall_amount", loan_security_shortfall.shortfall_amount - security_value)
+		frappe.db.set_value(
+			"Loan Security Shortfall",
+			loan_security_shortfall.name,
+			"shortfall_amount",
+			loan_security_shortfall.shortfall_amount - security_value,
+		)
 
 
 @frappe.whitelist()
 def add_security(loan):
-	loan_details = frappe.db.get_value("Loan", loan, ['applicant', 'company', 'applicant_type'], as_dict=1)
+	loan_details = frappe.db.get_value(
+		"Loan", loan, ["applicant", "company", "applicant_type"], as_dict=1
+	)
 
 	loan_security_pledge = frappe.new_doc("Loan Security Pledge")
 	loan_security_pledge.loan = loan
@@ -44,33 +59,51 @@
 
 	return loan_security_pledge.as_dict()
 
+
 def check_for_ltv_shortfall(process_loan_security_shortfall):
 
 	update_time = get_datetime()
 
-	loan_security_price_map = frappe._dict(frappe.get_all("Loan Security Price",
-		fields=["loan_security", "loan_security_price"],
-		filters = {
-			"valid_from": ("<=", update_time),
-			"valid_upto": (">=", update_time)
-		}, as_list=1))
+	loan_security_price_map = frappe._dict(
+		frappe.get_all(
+			"Loan Security Price",
+			fields=["loan_security", "loan_security_price"],
+			filters={"valid_from": ("<=", update_time), "valid_upto": (">=", update_time)},
+			as_list=1,
+		)
+	)
 
-	loans = frappe.get_all('Loan', fields=['name', 'loan_amount', 'total_principal_paid', 'total_payment',
-		'total_interest_payable', 'disbursed_amount', 'status'],
-		filters={'status': ('in',['Disbursed','Partially Disbursed']), 'is_secured_loan': 1})
+	loans = frappe.get_all(
+		"Loan",
+		fields=[
+			"name",
+			"loan_amount",
+			"total_principal_paid",
+			"total_payment",
+			"total_interest_payable",
+			"disbursed_amount",
+			"status",
+		],
+		filters={"status": ("in", ["Disbursed", "Partially Disbursed"]), "is_secured_loan": 1},
+	)
 
-	loan_shortfall_map = frappe._dict(frappe.get_all("Loan Security Shortfall",
-		fields=["loan", "name"], filters={"status": "Pending"}, as_list=1))
+	loan_shortfall_map = frappe._dict(
+		frappe.get_all(
+			"Loan Security Shortfall", fields=["loan", "name"], filters={"status": "Pending"}, as_list=1
+		)
+	)
 
 	loan_security_map = {}
 
 	for loan in loans:
-		if loan.status == 'Disbursed':
-			outstanding_amount = flt(loan.total_payment) - flt(loan.total_interest_payable) \
-				- flt(loan.total_principal_paid)
+		if loan.status == "Disbursed":
+			outstanding_amount = (
+				flt(loan.total_payment) - flt(loan.total_interest_payable) - flt(loan.total_principal_paid)
+			)
 		else:
-			outstanding_amount = flt(loan.disbursed_amount) - flt(loan.total_interest_payable) \
-				- flt(loan.total_principal_paid)
+			outstanding_amount = (
+				flt(loan.disbursed_amount) - flt(loan.total_interest_payable) - flt(loan.total_principal_paid)
+			)
 
 		pledged_securities = get_pledged_security_qty(loan.name)
 		ltv_ratio = 0.0
@@ -81,21 +114,36 @@
 				ltv_ratio = get_ltv_ratio(security)
 			security_value += flt(loan_security_price_map.get(security)) * flt(qty)
 
-		current_ratio = (outstanding_amount/security_value) * 100 if security_value else 0
+		current_ratio = (outstanding_amount / security_value) * 100 if security_value else 0
 
 		if current_ratio > ltv_ratio:
 			shortfall_amount = outstanding_amount - ((security_value * ltv_ratio) / 100)
-			create_loan_security_shortfall(loan.name, outstanding_amount, security_value, shortfall_amount,
-				current_ratio, process_loan_security_shortfall)
+			create_loan_security_shortfall(
+				loan.name,
+				outstanding_amount,
+				security_value,
+				shortfall_amount,
+				current_ratio,
+				process_loan_security_shortfall,
+			)
 		elif loan_shortfall_map.get(loan.name):
 			shortfall_amount = outstanding_amount - ((security_value * ltv_ratio) / 100)
 			if shortfall_amount <= 0:
 				shortfall = loan_shortfall_map.get(loan.name)
 				update_pending_shortfall(shortfall)
 
-def create_loan_security_shortfall(loan, loan_amount, security_value, shortfall_amount, shortfall_ratio,
-	process_loan_security_shortfall):
-	existing_shortfall = frappe.db.get_value("Loan Security Shortfall", {"loan": loan, "status": "Pending"}, "name")
+
+def create_loan_security_shortfall(
+	loan,
+	loan_amount,
+	security_value,
+	shortfall_amount,
+	shortfall_ratio,
+	process_loan_security_shortfall,
+):
+	existing_shortfall = frappe.db.get_value(
+		"Loan Security Shortfall", {"loan": loan, "status": "Pending"}, "name"
+	)
 
 	if existing_shortfall:
 		ltv_shortfall = frappe.get_doc("Loan Security Shortfall", existing_shortfall)
@@ -111,16 +159,17 @@
 	ltv_shortfall.process_loan_security_shortfall = process_loan_security_shortfall
 	ltv_shortfall.save()
 
+
 def get_ltv_ratio(loan_security):
-	loan_security_type = frappe.db.get_value('Loan Security', loan_security, 'loan_security_type')
-	ltv_ratio = frappe.db.get_value('Loan Security Type', loan_security_type, 'loan_to_value_ratio')
+	loan_security_type = frappe.db.get_value("Loan Security", loan_security, "loan_security_type")
+	ltv_ratio = frappe.db.get_value("Loan Security Type", loan_security_type, "loan_to_value_ratio")
 	return ltv_ratio
 
+
 def update_pending_shortfall(shortfall):
 	# Get all pending loan security shortfall
-	frappe.db.set_value("Loan Security Shortfall", shortfall,
-		{
-			"status": "Completed",
-			"shortfall_amount": 0,
-			"shortfall_percentage": 0
-		})
+	frappe.db.set_value(
+		"Loan Security Shortfall",
+		shortfall,
+		{"status": "Completed", "shortfall_amount": 0, "shortfall_percentage": 0},
+	)
diff --git a/erpnext/loan_management/doctype/loan_security_type/loan_security_type_dashboard.py b/erpnext/loan_management/doctype/loan_security_type/loan_security_type_dashboard.py
index 2a9ceed..8fc4520 100644
--- a/erpnext/loan_management/doctype/loan_security_type/loan_security_type_dashboard.py
+++ b/erpnext/loan_management/doctype/loan_security_type/loan_security_type_dashboard.py
@@ -1,12 +1,8 @@
 def get_data():
 	return {
-		'fieldname': 'loan_security_type',
-		'transactions': [
-			{
-				'items': ['Loan Security', 'Loan Security Price']
-			},
-			{
-				'items': ['Loan Security Pledge', 'Loan Security Unpledge']
-			}
-		]
+		"fieldname": "loan_security_type",
+		"transactions": [
+			{"items": ["Loan Security", "Loan Security Price"]},
+			{"items": ["Loan Security Pledge", "Loan Security Unpledge"]},
+		],
 	}
diff --git a/erpnext/loan_management/doctype/loan_security_unpledge/loan_security_unpledge.py b/erpnext/loan_management/doctype/loan_security_unpledge/loan_security_unpledge.py
index 4567374..0ab7beb 100644
--- a/erpnext/loan_management/doctype/loan_security_unpledge/loan_security_unpledge.py
+++ b/erpnext/loan_management/doctype/loan_security_unpledge/loan_security_unpledge.py
@@ -15,7 +15,7 @@
 
 	def on_cancel(self):
 		self.update_loan_status(cancel=1)
-		self.db_set('status', 'Requested')
+		self.db_set("status", "Requested")
 
 	def validate_duplicate_securities(self):
 		security_list = []
@@ -23,8 +23,11 @@
 			if d.loan_security not in security_list:
 				security_list.append(d.loan_security)
 			else:
-				frappe.throw(_("Row {0}: Loan Security {1} added multiple times").format(
-					d.idx, frappe.bold(d.loan_security)))
+				frappe.throw(
+					_("Row {0}: Loan Security {1} added multiple times").format(
+						d.idx, frappe.bold(d.loan_security)
+					)
+				)
 
 	def validate_unpledge_qty(self):
 		from erpnext.loan_management.doctype.loan_repayment.loan_repayment import (
@@ -36,18 +39,33 @@
 
 		pledge_qty_map = get_pledged_security_qty(self.loan)
 
-		ltv_ratio_map = frappe._dict(frappe.get_all("Loan Security Type",
-			fields=["name", "loan_to_value_ratio"], as_list=1))
+		ltv_ratio_map = frappe._dict(
+			frappe.get_all("Loan Security Type", fields=["name", "loan_to_value_ratio"], as_list=1)
+		)
 
-		loan_security_price_map = frappe._dict(frappe.get_all("Loan Security Price",
-			fields=["loan_security", "loan_security_price"],
-			filters = {
-				"valid_from": ("<=", get_datetime()),
-				"valid_upto": (">=", get_datetime())
-			}, as_list=1))
+		loan_security_price_map = frappe._dict(
+			frappe.get_all(
+				"Loan Security Price",
+				fields=["loan_security", "loan_security_price"],
+				filters={"valid_from": ("<=", get_datetime()), "valid_upto": (">=", get_datetime())},
+				as_list=1,
+			)
+		)
 
-		loan_details = frappe.get_value("Loan", self.loan, ['total_payment', 'total_principal_paid', 'loan_amount',
-			'total_interest_payable', 'written_off_amount', 'disbursed_amount', 'status'], as_dict=1)
+		loan_details = frappe.get_value(
+			"Loan",
+			self.loan,
+			[
+				"total_payment",
+				"total_principal_paid",
+				"loan_amount",
+				"total_interest_payable",
+				"written_off_amount",
+				"disbursed_amount",
+				"status",
+			],
+			as_dict=1,
+		)
 
 		pending_principal_amount = get_pending_principal_amount(loan_details)
 
@@ -58,8 +76,13 @@
 		for security in self.securities:
 			pledged_qty = pledge_qty_map.get(security.loan_security, 0)
 			if security.qty > pledged_qty:
-				msg = _("Row {0}: {1} {2} of {3} is pledged against Loan {4}.").format(security.idx, pledged_qty, security.uom,
-					frappe.bold(security.loan_security), frappe.bold(self.loan))
+				msg = _("Row {0}: {1} {2} of {3} is pledged against Loan {4}.").format(
+					security.idx,
+					pledged_qty,
+					security.uom,
+					frappe.bold(security.loan_security),
+					frappe.bold(self.loan),
+				)
 				msg += "<br>"
 				msg += _("You are trying to unpledge more.")
 				frappe.throw(msg, title=_("Loan Security Unpledge Error"))
@@ -78,14 +101,14 @@
 		if not security_value and flt(pending_principal_amount, 2) > 0:
 			self._throw(security_value, pending_principal_amount, ltv_ratio)
 
-		if security_value and flt(pending_principal_amount/security_value) * 100 > ltv_ratio:
+		if security_value and flt(pending_principal_amount / security_value) * 100 > ltv_ratio:
 			self._throw(security_value, pending_principal_amount, ltv_ratio)
 
 	def _throw(self, security_value, pending_principal_amount, ltv_ratio):
 		msg = _("Loan Security Value after unpledge is {0}").format(frappe.bold(security_value))
-		msg += '<br>'
+		msg += "<br>"
 		msg += _("Pending principal amount is {0}").format(frappe.bold(flt(pending_principal_amount, 2)))
-		msg += '<br>'
+		msg += "<br>"
 		msg += _("Loan To Security Value ratio must always be {0}").format(frappe.bold(ltv_ratio))
 		frappe.throw(msg, title=_("Loan To Value ratio breach"))
 
@@ -95,13 +118,13 @@
 	def approve(self):
 		if self.status == "Approved" and not self.unpledge_time:
 			self.update_loan_status()
-			self.db_set('unpledge_time', get_datetime())
+			self.db_set("unpledge_time", get_datetime())
 
 	def update_loan_status(self, cancel=0):
 		if cancel:
-			loan_status = frappe.get_value('Loan', self.loan, 'status')
-			if loan_status == 'Closed':
-				frappe.db.set_value('Loan', self.loan, 'status', 'Loan Closure Requested')
+			loan_status = frappe.get_value("Loan", self.loan, "status")
+			if loan_status == "Closed":
+				frappe.db.set_value("Loan", self.loan, "status", "Loan Closure Requested")
 		else:
 			pledged_qty = 0
 			current_pledges = get_pledged_security_qty(self.loan)
@@ -110,34 +133,41 @@
 				pledged_qty += qty
 
 			if not pledged_qty:
-				frappe.db.set_value('Loan', self.loan,
-					{
-						'status': 'Closed',
-						'closure_date': getdate()
-					})
+				frappe.db.set_value("Loan", self.loan, {"status": "Closed", "closure_date": getdate()})
+
 
 @frappe.whitelist()
 def get_pledged_security_qty(loan):
 
 	current_pledges = {}
 
-	unpledges = frappe._dict(frappe.db.sql("""
+	unpledges = frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT u.loan_security, sum(u.qty) as qty
 		FROM `tabLoan Security Unpledge` up, `tabUnpledge` u
 		WHERE up.loan = %s
 		AND u.parent = up.name
 		AND up.status = 'Approved'
 		GROUP BY u.loan_security
-	""", (loan)))
+	""",
+			(loan),
+		)
+	)
 
-	pledges = frappe._dict(frappe.db.sql("""
+	pledges = frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT p.loan_security, sum(p.qty) as qty
 		FROM `tabLoan Security Pledge` lp, `tabPledge`p
 		WHERE lp.loan = %s
 		AND p.parent = lp.name
 		AND lp.status = 'Pledged'
 		GROUP BY p.loan_security
-	""", (loan)))
+	""",
+			(loan),
+		)
+	)
 
 	for security, qty in pledges.items():
 		current_pledges.setdefault(security, qty)
diff --git a/erpnext/loan_management/doctype/loan_type/loan_type.py b/erpnext/loan_management/doctype/loan_type/loan_type.py
index 592229c..51ee05b 100644
--- a/erpnext/loan_management/doctype/loan_type/loan_type.py
+++ b/erpnext/loan_management/doctype/loan_type/loan_type.py
@@ -12,12 +12,20 @@
 		self.validate_accounts()
 
 	def validate_accounts(self):
-		for fieldname in ['payment_account', 'loan_account', 'interest_income_account', 'penalty_income_account']:
-			company = frappe.get_value("Account", self.get(fieldname), 'company')
+		for fieldname in [
+			"payment_account",
+			"loan_account",
+			"interest_income_account",
+			"penalty_income_account",
+		]:
+			company = frappe.get_value("Account", self.get(fieldname), "company")
 
 			if company and company != self.company:
-				frappe.throw(_("Account {0} does not belong to company {1}").format(frappe.bold(self.get(fieldname)),
-					frappe.bold(self.company)))
+				frappe.throw(
+					_("Account {0} does not belong to company {1}").format(
+						frappe.bold(self.get(fieldname)), frappe.bold(self.company)
+					)
+				)
 
-		if self.get('loan_account') == self.get('payment_account'):
-			frappe.throw(_('Loan Account and Payment Account cannot be same'))
+		if self.get("loan_account") == self.get("payment_account"):
+			frappe.throw(_("Loan Account and Payment Account cannot be same"))
diff --git a/erpnext/loan_management/doctype/loan_type/loan_type_dashboard.py b/erpnext/loan_management/doctype/loan_type/loan_type_dashboard.py
index 245e102..e2467c6 100644
--- a/erpnext/loan_management/doctype/loan_type/loan_type_dashboard.py
+++ b/erpnext/loan_management/doctype/loan_type/loan_type_dashboard.py
@@ -1,12 +1,5 @@
 def get_data():
 	return {
-		'fieldname': 'loan_type',
-		'transactions': [
-			{
-				'items': ['Loan Repayment', 'Loan']
-			},
-			{
-				'items': ['Loan Application']
-			}
-		]
+		"fieldname": "loan_type",
+		"transactions": [{"items": ["Loan Repayment", "Loan"]}, {"items": ["Loan Application"]}],
 	}
diff --git a/erpnext/loan_management/doctype/loan_write_off/loan_write_off.py b/erpnext/loan_management/doctype/loan_write_off/loan_write_off.py
index 35be587..e19fd15 100644
--- a/erpnext/loan_management/doctype/loan_write_off/loan_write_off.py
+++ b/erpnext/loan_management/doctype/loan_write_off/loan_write_off.py
@@ -22,11 +22,16 @@
 
 	def validate_write_off_amount(self):
 		precision = cint(frappe.db.get_default("currency_precision")) or 2
-		total_payment, principal_paid, interest_payable, written_off_amount = frappe.get_value("Loan", self.loan,
-			['total_payment', 'total_principal_paid','total_interest_payable', 'written_off_amount'])
+		total_payment, principal_paid, interest_payable, written_off_amount = frappe.get_value(
+			"Loan",
+			self.loan,
+			["total_payment", "total_principal_paid", "total_interest_payable", "written_off_amount"],
+		)
 
-		pending_principal_amount = flt(flt(total_payment) - flt(interest_payable) - flt(principal_paid) - flt(written_off_amount),
-			precision)
+		pending_principal_amount = flt(
+			flt(total_payment) - flt(interest_payable) - flt(principal_paid) - flt(written_off_amount),
+			precision,
+		)
 
 		if self.write_off_amount > pending_principal_amount:
 			frappe.throw(_("Write off amount cannot be greater than pending principal amount"))
@@ -37,52 +42,55 @@
 
 	def on_cancel(self):
 		self.update_outstanding_amount(cancel=1)
-		self.ignore_linked_doctypes = ['GL Entry']
+		self.ignore_linked_doctypes = ["GL Entry"]
 		self.make_gl_entries(cancel=1)
 
 	def update_outstanding_amount(self, cancel=0):
-		written_off_amount = frappe.db.get_value('Loan', self.loan, 'written_off_amount')
+		written_off_amount = frappe.db.get_value("Loan", self.loan, "written_off_amount")
 
 		if cancel:
 			written_off_amount -= self.write_off_amount
 		else:
 			written_off_amount += self.write_off_amount
 
-		frappe.db.set_value('Loan', self.loan, 'written_off_amount', written_off_amount)
-
+		frappe.db.set_value("Loan", self.loan, "written_off_amount", written_off_amount)
 
 	def make_gl_entries(self, cancel=0):
 		gl_entries = []
 		loan_details = frappe.get_doc("Loan", self.loan)
 
 		gl_entries.append(
-			self.get_gl_dict({
-				"account": self.write_off_account,
-				"against": loan_details.loan_account,
-				"debit": self.write_off_amount,
-				"debit_in_account_currency": self.write_off_amount,
-				"against_voucher_type": "Loan",
-				"against_voucher": self.loan,
-				"remarks": _("Against Loan:") + self.loan,
-				"cost_center": self.cost_center,
-				"posting_date": getdate(self.posting_date)
-			})
+			self.get_gl_dict(
+				{
+					"account": self.write_off_account,
+					"against": loan_details.loan_account,
+					"debit": self.write_off_amount,
+					"debit_in_account_currency": self.write_off_amount,
+					"against_voucher_type": "Loan",
+					"against_voucher": self.loan,
+					"remarks": _("Against Loan:") + self.loan,
+					"cost_center": self.cost_center,
+					"posting_date": getdate(self.posting_date),
+				}
+			)
 		)
 
 		gl_entries.append(
-			self.get_gl_dict({
-				"account": loan_details.loan_account,
-				"party_type": loan_details.applicant_type,
-				"party": loan_details.applicant,
-				"against": self.write_off_account,
-				"credit": self.write_off_amount,
-				"credit_in_account_currency": self.write_off_amount,
-				"against_voucher_type": "Loan",
-				"against_voucher": self.loan,
-				"remarks": _("Against Loan:") + self.loan,
-				"cost_center": self.cost_center,
-				"posting_date": getdate(self.posting_date)
-			})
+			self.get_gl_dict(
+				{
+					"account": loan_details.loan_account,
+					"party_type": loan_details.applicant_type,
+					"party": loan_details.applicant,
+					"against": self.write_off_account,
+					"credit": self.write_off_amount,
+					"credit_in_account_currency": self.write_off_amount,
+					"against_voucher_type": "Loan",
+					"against_voucher": self.loan,
+					"remarks": _("Against Loan:") + self.loan,
+					"cost_center": self.cost_center,
+					"posting_date": getdate(self.posting_date),
+				}
+			)
 		)
 
 		make_gl_entries(gl_entries, cancel=cancel, merge_entries=False)
diff --git a/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py b/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py
index 4c34ccd..81464a3 100644
--- a/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py
+++ b/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual.py
@@ -17,24 +17,36 @@
 		open_loans = []
 
 		if self.loan:
-			loan_doc = frappe.get_doc('Loan', self.loan)
+			loan_doc = frappe.get_doc("Loan", self.loan)
 			if loan_doc:
 				open_loans.append(loan_doc)
 
-		if (not self.loan or not loan_doc.is_term_loan) and self.process_type != 'Term Loans':
-			make_accrual_interest_entry_for_demand_loans(self.posting_date, self.name,
-				open_loans = open_loans, loan_type = self.loan_type, accrual_type=self.accrual_type)
+		if (not self.loan or not loan_doc.is_term_loan) and self.process_type != "Term Loans":
+			make_accrual_interest_entry_for_demand_loans(
+				self.posting_date,
+				self.name,
+				open_loans=open_loans,
+				loan_type=self.loan_type,
+				accrual_type=self.accrual_type,
+			)
 
-		if (not self.loan or loan_doc.is_term_loan) and self.process_type != 'Demand Loans':
-			make_accrual_interest_entry_for_term_loans(self.posting_date, self.name, term_loan=self.loan,
-				loan_type=self.loan_type, accrual_type=self.accrual_type)
+		if (not self.loan or loan_doc.is_term_loan) and self.process_type != "Demand Loans":
+			make_accrual_interest_entry_for_term_loans(
+				self.posting_date,
+				self.name,
+				term_loan=self.loan,
+				loan_type=self.loan_type,
+				accrual_type=self.accrual_type,
+			)
 
 
-def process_loan_interest_accrual_for_demand_loans(posting_date=None, loan_type=None, loan=None, accrual_type="Regular"):
-	loan_process = frappe.new_doc('Process Loan Interest Accrual')
+def process_loan_interest_accrual_for_demand_loans(
+	posting_date=None, loan_type=None, loan=None, accrual_type="Regular"
+):
+	loan_process = frappe.new_doc("Process Loan Interest Accrual")
 	loan_process.posting_date = posting_date or nowdate()
 	loan_process.loan_type = loan_type
-	loan_process.process_type = 'Demand Loans'
+	loan_process.process_type = "Demand Loans"
 	loan_process.loan = loan
 	loan_process.accrual_type = accrual_type
 
@@ -42,25 +54,26 @@
 
 	return loan_process.name
 
+
 def process_loan_interest_accrual_for_term_loans(posting_date=None, loan_type=None, loan=None):
 
 	if not term_loan_accrual_pending(posting_date or nowdate()):
 		return
 
-	loan_process = frappe.new_doc('Process Loan Interest Accrual')
+	loan_process = frappe.new_doc("Process Loan Interest Accrual")
 	loan_process.posting_date = posting_date or nowdate()
 	loan_process.loan_type = loan_type
-	loan_process.process_type = 'Term Loans'
+	loan_process.process_type = "Term Loans"
 	loan_process.loan = loan
 
 	loan_process.submit()
 
 	return loan_process.name
 
+
 def term_loan_accrual_pending(date):
-	pending_accrual = frappe.db.get_value('Repayment Schedule', {
-		'payment_date': ('<=', date),
-		'is_accrued': 0
-	})
+	pending_accrual = frappe.db.get_value(
+		"Repayment Schedule", {"payment_date": ("<=", date), "is_accrued": 0}
+	)
 
 	return pending_accrual
diff --git a/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual_dashboard.py b/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual_dashboard.py
index 932087c..ac85df7 100644
--- a/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual_dashboard.py
+++ b/erpnext/loan_management/doctype/process_loan_interest_accrual/process_loan_interest_accrual_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
 	return {
-		'fieldname': 'process_loan_interest_accrual',
-		'transactions': [
-			{
-				'items': ['Loan Interest Accrual']
-			}
-		]
+		"fieldname": "process_loan_interest_accrual",
+		"transactions": [{"items": ["Loan Interest Accrual"]}],
 	}
diff --git a/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall.py b/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall.py
index ba9fb0c..fffc5d4 100644
--- a/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall.py
+++ b/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall.py
@@ -13,16 +13,18 @@
 
 class ProcessLoanSecurityShortfall(Document):
 	def onload(self):
-		self.set_onload('update_time', get_datetime())
+		self.set_onload("update_time", get_datetime())
 
 	def on_submit(self):
 		check_for_ltv_shortfall(self.name)
 
+
 def create_process_loan_security_shortfall():
 	if check_for_secured_loans():
 		process = frappe.new_doc("Process Loan Security Shortfall")
 		process.update_time = get_datetime()
 		process.submit()
 
+
 def check_for_secured_loans():
-	return frappe.db.count('Loan', {'docstatus': 1, 'is_secured_loan': 1})
+	return frappe.db.count("Loan", {"docstatus": 1, "is_secured_loan": 1})
diff --git a/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall_dashboard.py b/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall_dashboard.py
index 1f5d843..4d7b163 100644
--- a/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall_dashboard.py
+++ b/erpnext/loan_management/doctype/process_loan_security_shortfall/process_loan_security_shortfall_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
 	return {
-		'fieldname': 'process_loan_security_shortfall',
-		'transactions': [
-			{
-				'items': ['Loan Security Shortfall']
-			}
-		]
+		"fieldname": "process_loan_security_shortfall",
+		"transactions": [{"items": ["Loan Security Shortfall"]}],
 	}
diff --git a/erpnext/loan_management/doctype/sanctioned_loan_amount/sanctioned_loan_amount.py b/erpnext/loan_management/doctype/sanctioned_loan_amount/sanctioned_loan_amount.py
index 6063b7b..e7487cb 100644
--- a/erpnext/loan_management/doctype/sanctioned_loan_amount/sanctioned_loan_amount.py
+++ b/erpnext/loan_management/doctype/sanctioned_loan_amount/sanctioned_loan_amount.py
@@ -9,9 +9,13 @@
 
 class SanctionedLoanAmount(Document):
 	def validate(self):
-		sanctioned_doc = frappe.db.exists('Sanctioned Loan Amount', {'applicant': self.applicant, 'company': self.company})
+		sanctioned_doc = frappe.db.exists(
+			"Sanctioned Loan Amount", {"applicant": self.applicant, "company": self.company}
+		)
 
 		if sanctioned_doc and sanctioned_doc != self.name:
-			frappe.throw(_("Sanctioned Loan Amount already exists for {0} against company {1}").format(
-				frappe.bold(self.applicant), frappe.bold(self.company)
-			))
+			frappe.throw(
+				_("Sanctioned Loan Amount already exists for {0} against company {1}").format(
+					frappe.bold(self.applicant), frappe.bold(self.company)
+				)
+			)
diff --git a/erpnext/loan_management/report/applicant_wise_loan_security_exposure/applicant_wise_loan_security_exposure.py b/erpnext/loan_management/report/applicant_wise_loan_security_exposure/applicant_wise_loan_security_exposure.py
index 512b47f..02da810 100644
--- a/erpnext/loan_management/report/applicant_wise_loan_security_exposure/applicant_wise_loan_security_exposure.py
+++ b/erpnext/loan_management/report/applicant_wise_loan_security_exposure/applicant_wise_loan_security_exposure.py
@@ -17,84 +17,166 @@
 
 def get_columns(filters):
 	columns = [
-		{"label": _("Applicant Type"), "fieldname": "applicant_type", "options": "DocType", "width": 100},
-		{"label": _("Applicant Name"), "fieldname": "applicant_name", "fieldtype": "Dynamic Link", "options": "applicant_type", "width": 150},
-		{"label": _("Loan Security"), "fieldname": "loan_security", "fieldtype": "Link", "options": "Loan Security", "width": 160},
-		{"label": _("Loan Security Code"), "fieldname": "loan_security_code", "fieldtype": "Data", "width": 100},
-		{"label": _("Loan Security Name"), "fieldname": "loan_security_name", "fieldtype": "Data", "width": 150},
+		{
+			"label": _("Applicant Type"),
+			"fieldname": "applicant_type",
+			"options": "DocType",
+			"width": 100,
+		},
+		{
+			"label": _("Applicant Name"),
+			"fieldname": "applicant_name",
+			"fieldtype": "Dynamic Link",
+			"options": "applicant_type",
+			"width": 150,
+		},
+		{
+			"label": _("Loan Security"),
+			"fieldname": "loan_security",
+			"fieldtype": "Link",
+			"options": "Loan Security",
+			"width": 160,
+		},
+		{
+			"label": _("Loan Security Code"),
+			"fieldname": "loan_security_code",
+			"fieldtype": "Data",
+			"width": 100,
+		},
+		{
+			"label": _("Loan Security Name"),
+			"fieldname": "loan_security_name",
+			"fieldtype": "Data",
+			"width": 150,
+		},
 		{"label": _("Haircut"), "fieldname": "haircut", "fieldtype": "Percent", "width": 100},
-		{"label": _("Loan Security Type"), "fieldname": "loan_security_type", "fieldtype": "Link", "options": "Loan Security Type", "width": 120},
+		{
+			"label": _("Loan Security Type"),
+			"fieldname": "loan_security_type",
+			"fieldtype": "Link",
+			"options": "Loan Security Type",
+			"width": 120,
+		},
 		{"label": _("Disabled"), "fieldname": "disabled", "fieldtype": "Check", "width": 80},
 		{"label": _("Total Qty"), "fieldname": "total_qty", "fieldtype": "Float", "width": 100},
-		{"label": _("Latest Price"), "fieldname": "latest_price", "fieldtype": "Currency", "options": "currency", "width": 100},
-		{"label": _("Price Valid Upto"), "fieldname": "price_valid_upto", "fieldtype": "Datetime", "width": 100},
-		{"label": _("Current Value"), "fieldname": "current_value", "fieldtype": "Currency", "options": "currency", "width": 100},
-		{"label": _("% Of Applicant Portfolio"), "fieldname": "portfolio_percent", "fieldtype": "Percentage", "width": 100},
-		{"label": _("Currency"), "fieldname": "currency", "fieldtype": "Currency", "options": "Currency", "hidden": 1, "width": 100},
+		{
+			"label": _("Latest Price"),
+			"fieldname": "latest_price",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Price Valid Upto"),
+			"fieldname": "price_valid_upto",
+			"fieldtype": "Datetime",
+			"width": 100,
+		},
+		{
+			"label": _("Current Value"),
+			"fieldname": "current_value",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("% Of Applicant Portfolio"),
+			"fieldname": "portfolio_percent",
+			"fieldtype": "Percentage",
+			"width": 100,
+		},
+		{
+			"label": _("Currency"),
+			"fieldname": "currency",
+			"fieldtype": "Currency",
+			"options": "Currency",
+			"hidden": 1,
+			"width": 100,
+		},
 	]
 
 	return columns
 
+
 def get_data(filters):
 	data = []
 	loan_security_details = get_loan_security_details()
-	pledge_values, total_value_map, applicant_type_map = get_applicant_wise_total_loan_security_qty(filters,
-		loan_security_details)
+	pledge_values, total_value_map, applicant_type_map = get_applicant_wise_total_loan_security_qty(
+		filters, loan_security_details
+	)
 
-	currency = erpnext.get_company_currency(filters.get('company'))
+	currency = erpnext.get_company_currency(filters.get("company"))
 
 	for key, qty in pledge_values.items():
 		if qty:
 			row = {}
-			current_value = flt(qty * loan_security_details.get(key[1], {}).get('latest_price', 0))
-			valid_upto = loan_security_details.get(key[1], {}).get('valid_upto')
+			current_value = flt(qty * loan_security_details.get(key[1], {}).get("latest_price", 0))
+			valid_upto = loan_security_details.get(key[1], {}).get("valid_upto")
 
 			row.update(loan_security_details.get(key[1]))
-			row.update({
-				'applicant_type': applicant_type_map.get(key[0]),
-				'applicant_name': key[0],
-				'total_qty': qty,
-				'current_value': current_value,
-				'price_valid_upto': valid_upto,
-				'portfolio_percent': flt(current_value * 100 / total_value_map.get(key[0]), 2) if total_value_map.get(key[0]) \
+			row.update(
+				{
+					"applicant_type": applicant_type_map.get(key[0]),
+					"applicant_name": key[0],
+					"total_qty": qty,
+					"current_value": current_value,
+					"price_valid_upto": valid_upto,
+					"portfolio_percent": flt(current_value * 100 / total_value_map.get(key[0]), 2)
+					if total_value_map.get(key[0])
 					else 0.0,
-				'currency': currency
-			})
+					"currency": currency,
+				}
+			)
 
 			data.append(row)
 
 	return data
 
+
 def get_loan_security_details():
 	security_detail_map = {}
 	loan_security_price_map = {}
 	lsp_validity_map = {}
 
-	loan_security_prices = frappe.db.sql("""
+	loan_security_prices = frappe.db.sql(
+		"""
 		SELECT loan_security, loan_security_price, valid_upto
 		FROM `tabLoan Security Price` t1
 		WHERE valid_from >= (SELECT MAX(valid_from) FROM `tabLoan Security Price` t2
 		WHERE t1.loan_security = t2.loan_security)
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
 	for security in loan_security_prices:
 		loan_security_price_map.setdefault(security.loan_security, security.loan_security_price)
 		lsp_validity_map.setdefault(security.loan_security, security.valid_upto)
 
-	loan_security_details = frappe.get_all('Loan Security', fields=['name as loan_security',
-		'loan_security_code', 'loan_security_name', 'haircut', 'loan_security_type',
-		'disabled'])
+	loan_security_details = frappe.get_all(
+		"Loan Security",
+		fields=[
+			"name as loan_security",
+			"loan_security_code",
+			"loan_security_name",
+			"haircut",
+			"loan_security_type",
+			"disabled",
+		],
+	)
 
 	for security in loan_security_details:
-		security.update({
-			'latest_price': flt(loan_security_price_map.get(security.loan_security)),
-			'valid_upto': lsp_validity_map.get(security.loan_security)
-		})
+		security.update(
+			{
+				"latest_price": flt(loan_security_price_map.get(security.loan_security)),
+				"valid_upto": lsp_validity_map.get(security.loan_security),
+			}
+		)
 
 		security_detail_map.setdefault(security.loan_security, security)
 
 	return security_detail_map
 
+
 def get_applicant_wise_total_loan_security_qty(filters, loan_security_details):
 	current_pledges = {}
 	total_value_map = {}
@@ -102,39 +184,53 @@
 	applicant_wise_unpledges = {}
 	conditions = ""
 
-	if filters.get('company'):
+	if filters.get("company"):
 		conditions = "AND company = %(company)s"
 
-	unpledges = frappe.db.sql("""
+	unpledges = frappe.db.sql(
+		"""
 		SELECT up.applicant, u.loan_security, sum(u.qty) as qty
 		FROM `tabLoan Security Unpledge` up, `tabUnpledge` u
 		WHERE u.parent = up.name
 		AND up.status = 'Approved'
 		{conditions}
 		GROUP BY up.applicant, u.loan_security
-	""".format(conditions=conditions), filters, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	for unpledge in unpledges:
 		applicant_wise_unpledges.setdefault((unpledge.applicant, unpledge.loan_security), unpledge.qty)
 
-	pledges = frappe.db.sql("""
+	pledges = frappe.db.sql(
+		"""
 		SELECT lp.applicant_type, lp.applicant, p.loan_security, sum(p.qty) as qty
 		FROM `tabLoan Security Pledge` lp, `tabPledge`p
 		WHERE p.parent = lp.name
 		AND lp.status = 'Pledged'
 		{conditions}
 		GROUP BY lp.applicant, p.loan_security
-	""".format(conditions=conditions), filters, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	for security in pledges:
 		current_pledges.setdefault((security.applicant, security.loan_security), security.qty)
 		total_value_map.setdefault(security.applicant, 0.0)
 		applicant_type_map.setdefault(security.applicant, security.applicant_type)
 
-		current_pledges[(security.applicant, security.loan_security)] -= \
-			applicant_wise_unpledges.get((security.applicant, security.loan_security), 0.0)
+		current_pledges[(security.applicant, security.loan_security)] -= applicant_wise_unpledges.get(
+			(security.applicant, security.loan_security), 0.0
+		)
 
-		total_value_map[security.applicant] += current_pledges.get((security.applicant, security.loan_security)) \
-			* loan_security_details.get(security.loan_security, {}).get('latest_price', 0)
+		total_value_map[security.applicant] += current_pledges.get(
+			(security.applicant, security.loan_security)
+		) * loan_security_details.get(security.loan_security, {}).get("latest_price", 0)
 
 	return current_pledges, total_value_map, applicant_type_map
diff --git a/erpnext/loan_management/report/loan_interest_report/loan_interest_report.py b/erpnext/loan_management/report/loan_interest_report/loan_interest_report.py
index 7c51267..9186ce6 100644
--- a/erpnext/loan_management/report/loan_interest_report/loan_interest_report.py
+++ b/erpnext/loan_management/report/loan_interest_report/loan_interest_report.py
@@ -17,41 +17,148 @@
 	data = get_active_loan_details(filters)
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{"label": _("Loan"), "fieldname": "loan", "fieldtype": "Link", "options": "Loan", "width": 160},
 		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 160},
-		{"label": _("Applicant Type"), "fieldname": "applicant_type", "options": "DocType", "width": 100},
-		{"label": _("Applicant Name"), "fieldname": "applicant_name", "fieldtype": "Dynamic Link", "options": "applicant_type", "width": 150},
-		{"label": _("Loan Type"), "fieldname": "loan_type", "fieldtype": "Link", "options": "Loan Type", "width": 100},
-		{"label": _("Sanctioned Amount"), "fieldname": "sanctioned_amount", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Disbursed Amount"), "fieldname": "disbursed_amount", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Penalty Amount"), "fieldname": "penalty", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Accrued Interest"), "fieldname": "accrued_interest", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Total Repayment"), "fieldname": "total_repayment", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Principal Outstanding"), "fieldname": "principal_outstanding", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Interest Outstanding"), "fieldname": "interest_outstanding", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Total Outstanding"), "fieldname": "total_outstanding", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Undue Booked Interest"), "fieldname": "undue_interest", "fieldtype": "Currency", "options": "currency", "width": 120},
-		{"label": _("Interest %"), "fieldname": "rate_of_interest", "fieldtype": "Percent", "width": 100},
-		{"label": _("Penalty Interest %"), "fieldname": "penalty_interest", "fieldtype": "Percent", "width": 100},
-		{"label": _("Loan To Value Ratio"), "fieldname": "loan_to_value", "fieldtype": "Percent", "width": 100},
-		{"label": _("Currency"), "fieldname": "currency", "fieldtype": "Currency", "options": "Currency", "hidden": 1, "width": 100},
+		{
+			"label": _("Applicant Type"),
+			"fieldname": "applicant_type",
+			"options": "DocType",
+			"width": 100,
+		},
+		{
+			"label": _("Applicant Name"),
+			"fieldname": "applicant_name",
+			"fieldtype": "Dynamic Link",
+			"options": "applicant_type",
+			"width": 150,
+		},
+		{
+			"label": _("Loan Type"),
+			"fieldname": "loan_type",
+			"fieldtype": "Link",
+			"options": "Loan Type",
+			"width": 100,
+		},
+		{
+			"label": _("Sanctioned Amount"),
+			"fieldname": "sanctioned_amount",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Disbursed Amount"),
+			"fieldname": "disbursed_amount",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Penalty Amount"),
+			"fieldname": "penalty",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Accrued Interest"),
+			"fieldname": "accrued_interest",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Total Repayment"),
+			"fieldname": "total_repayment",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Principal Outstanding"),
+			"fieldname": "principal_outstanding",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Interest Outstanding"),
+			"fieldname": "interest_outstanding",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Total Outstanding"),
+			"fieldname": "total_outstanding",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Undue Booked Interest"),
+			"fieldname": "undue_interest",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 120,
+		},
+		{
+			"label": _("Interest %"),
+			"fieldname": "rate_of_interest",
+			"fieldtype": "Percent",
+			"width": 100,
+		},
+		{
+			"label": _("Penalty Interest %"),
+			"fieldname": "penalty_interest",
+			"fieldtype": "Percent",
+			"width": 100,
+		},
+		{
+			"label": _("Loan To Value Ratio"),
+			"fieldname": "loan_to_value",
+			"fieldtype": "Percent",
+			"width": 100,
+		},
+		{
+			"label": _("Currency"),
+			"fieldname": "currency",
+			"fieldtype": "Currency",
+			"options": "Currency",
+			"hidden": 1,
+			"width": 100,
+		},
 	]
 
 	return columns
 
+
 def get_active_loan_details(filters):
 
 	filter_obj = {"status": ("!=", "Closed")}
-	if filters.get('company'):
-		filter_obj.update({'company': filters.get('company')})
+	if filters.get("company"):
+		filter_obj.update({"company": filters.get("company")})
 
-	loan_details = frappe.get_all("Loan",
-		fields=["name as loan", "applicant_type", "applicant as applicant_name", "loan_type",
-		"disbursed_amount", "rate_of_interest", "total_payment", "total_principal_paid",
-		"total_interest_payable", "written_off_amount", "status"],
-		filters=filter_obj)
+	loan_details = frappe.get_all(
+		"Loan",
+		fields=[
+			"name as loan",
+			"applicant_type",
+			"applicant as applicant_name",
+			"loan_type",
+			"disbursed_amount",
+			"rate_of_interest",
+			"total_payment",
+			"total_principal_paid",
+			"total_interest_payable",
+			"written_off_amount",
+			"status",
+		],
+		filters=filter_obj,
+	)
 
 	loan_list = [d.loan for d in loan_details]
 
@@ -62,70 +169,105 @@
 	penal_interest_rate_map = get_penal_interest_rate_map()
 	payments = get_payments(loan_list)
 	accrual_map = get_interest_accruals(loan_list)
-	currency = erpnext.get_company_currency(filters.get('company'))
+	currency = erpnext.get_company_currency(filters.get("company"))
 
 	for loan in loan_details:
-		total_payment = loan.total_payment if loan.status == 'Disbursed' else loan.disbursed_amount
+		total_payment = loan.total_payment if loan.status == "Disbursed" else loan.disbursed_amount
 
-		loan.update({
-			"sanctioned_amount": flt(sanctioned_amount_map.get(loan.applicant_name)),
-			"principal_outstanding": flt(total_payment) - flt(loan.total_principal_paid) \
-				- flt(loan.total_interest_payable) - flt(loan.written_off_amount),
-			"total_repayment": flt(payments.get(loan.loan)),
-			"accrued_interest": flt(accrual_map.get(loan.loan, {}).get("accrued_interest")),
-			"interest_outstanding": flt(accrual_map.get(loan.loan, {}).get("interest_outstanding")),
-			"penalty": flt(accrual_map.get(loan.loan, {}).get("penalty")),
-			"penalty_interest": penal_interest_rate_map.get(loan.loan_type),
-			"undue_interest": flt(accrual_map.get(loan.loan, {}).get("undue_interest")),
-			"loan_to_value": 0.0,
-			"currency": currency
-		})
+		loan.update(
+			{
+				"sanctioned_amount": flt(sanctioned_amount_map.get(loan.applicant_name)),
+				"principal_outstanding": flt(total_payment)
+				- flt(loan.total_principal_paid)
+				- flt(loan.total_interest_payable)
+				- flt(loan.written_off_amount),
+				"total_repayment": flt(payments.get(loan.loan)),
+				"accrued_interest": flt(accrual_map.get(loan.loan, {}).get("accrued_interest")),
+				"interest_outstanding": flt(accrual_map.get(loan.loan, {}).get("interest_outstanding")),
+				"penalty": flt(accrual_map.get(loan.loan, {}).get("penalty")),
+				"penalty_interest": penal_interest_rate_map.get(loan.loan_type),
+				"undue_interest": flt(accrual_map.get(loan.loan, {}).get("undue_interest")),
+				"loan_to_value": 0.0,
+				"currency": currency,
+			}
+		)
 
-		loan['total_outstanding'] = loan['principal_outstanding'] + loan['interest_outstanding'] \
-			+ loan['penalty']
+		loan["total_outstanding"] = (
+			loan["principal_outstanding"] + loan["interest_outstanding"] + loan["penalty"]
+		)
 
 		if loan_wise_security_value.get(loan.loan):
-			loan['loan_to_value'] = flt((loan['principal_outstanding'] * 100) / loan_wise_security_value.get(loan.loan))
+			loan["loan_to_value"] = flt(
+				(loan["principal_outstanding"] * 100) / loan_wise_security_value.get(loan.loan)
+			)
 
 	return loan_details
 
+
 def get_sanctioned_amount_map():
-	return frappe._dict(frappe.get_all("Sanctioned Loan Amount", fields=["applicant", "sanctioned_amount_limit"],
-		as_list=1))
+	return frappe._dict(
+		frappe.get_all(
+			"Sanctioned Loan Amount", fields=["applicant", "sanctioned_amount_limit"], as_list=1
+		)
+	)
+
 
 def get_payments(loans):
-	return frappe._dict(frappe.get_all("Loan Repayment", fields=["against_loan", "sum(amount_paid)"],
-		filters={"against_loan": ("in", loans)}, group_by="against_loan", as_list=1))
+	return frappe._dict(
+		frappe.get_all(
+			"Loan Repayment",
+			fields=["against_loan", "sum(amount_paid)"],
+			filters={"against_loan": ("in", loans)},
+			group_by="against_loan",
+			as_list=1,
+		)
+	)
+
 
 def get_interest_accruals(loans):
 	accrual_map = {}
 
-	interest_accruals = frappe.get_all("Loan Interest Accrual",
-		fields=["loan", "interest_amount", "posting_date", "penalty_amount",
-		"paid_interest_amount", "accrual_type"], filters={"loan": ("in", loans)}, order_by="posting_date desc")
+	interest_accruals = frappe.get_all(
+		"Loan Interest Accrual",
+		fields=[
+			"loan",
+			"interest_amount",
+			"posting_date",
+			"penalty_amount",
+			"paid_interest_amount",
+			"accrual_type",
+		],
+		filters={"loan": ("in", loans)},
+		order_by="posting_date desc",
+	)
 
 	for entry in interest_accruals:
-		accrual_map.setdefault(entry.loan, {
-			"accrued_interest": 0.0,
-			"undue_interest": 0.0,
-			"interest_outstanding": 0.0,
-			"last_accrual_date": '',
-			"due_date": ''
-		})
+		accrual_map.setdefault(
+			entry.loan,
+			{
+				"accrued_interest": 0.0,
+				"undue_interest": 0.0,
+				"interest_outstanding": 0.0,
+				"last_accrual_date": "",
+				"due_date": "",
+			},
+		)
 
-		if entry.accrual_type == 'Regular':
-			if not accrual_map[entry.loan]['due_date']:
-				accrual_map[entry.loan]['due_date'] = add_days(entry.posting_date, 1)
-			if not accrual_map[entry.loan]['last_accrual_date']:
-				accrual_map[entry.loan]['last_accrual_date'] = entry.posting_date
+		if entry.accrual_type == "Regular":
+			if not accrual_map[entry.loan]["due_date"]:
+				accrual_map[entry.loan]["due_date"] = add_days(entry.posting_date, 1)
+			if not accrual_map[entry.loan]["last_accrual_date"]:
+				accrual_map[entry.loan]["last_accrual_date"] = entry.posting_date
 
-		due_date = accrual_map[entry.loan]['due_date']
-		last_accrual_date = accrual_map[entry.loan]['last_accrual_date']
+		due_date = accrual_map[entry.loan]["due_date"]
+		last_accrual_date = accrual_map[entry.loan]["last_accrual_date"]
 
 		if due_date and getdate(entry.posting_date) < getdate(due_date):
-			accrual_map[entry.loan]["interest_outstanding"] += entry.interest_amount - entry.paid_interest_amount
+			accrual_map[entry.loan]["interest_outstanding"] += (
+				entry.interest_amount - entry.paid_interest_amount
+			)
 		else:
-			accrual_map[entry.loan]['undue_interest'] += entry.interest_amount - entry.paid_interest_amount
+			accrual_map[entry.loan]["undue_interest"] += entry.interest_amount - entry.paid_interest_amount
 
 		accrual_map[entry.loan]["accrued_interest"] += entry.interest_amount
 
@@ -134,8 +276,12 @@
 
 	return accrual_map
 
+
 def get_penal_interest_rate_map():
-	return frappe._dict(frappe.get_all("Loan Type", fields=["name", "penalty_interest_rate"], as_list=1))
+	return frappe._dict(
+		frappe.get_all("Loan Type", fields=["name", "penalty_interest_rate"], as_list=1)
+	)
+
 
 def get_loan_wise_pledges(filters):
 	loan_wise_unpledges = {}
@@ -143,37 +289,51 @@
 
 	conditions = ""
 
-	if filters.get('company'):
+	if filters.get("company"):
 		conditions = "AND company = %(company)s"
 
-	unpledges = frappe.db.sql("""
+	unpledges = frappe.db.sql(
+		"""
 		SELECT up.loan, u.loan_security, sum(u.qty) as qty
 		FROM `tabLoan Security Unpledge` up, `tabUnpledge` u
 		WHERE u.parent = up.name
 		AND up.status = 'Approved'
 		{conditions}
 		GROUP BY up.loan, u.loan_security
-	""".format(conditions=conditions), filters, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	for unpledge in unpledges:
 		loan_wise_unpledges.setdefault((unpledge.loan, unpledge.loan_security), unpledge.qty)
 
-	pledges = frappe.db.sql("""
+	pledges = frappe.db.sql(
+		"""
 		SELECT lp.loan, p.loan_security, sum(p.qty) as qty
 		FROM `tabLoan Security Pledge` lp, `tabPledge`p
 		WHERE p.parent = lp.name
 		AND lp.status = 'Pledged'
 		{conditions}
 		GROUP BY lp.loan, p.loan_security
-	""".format(conditions=conditions), filters, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	for security in pledges:
 		current_pledges.setdefault((security.loan, security.loan_security), security.qty)
-		current_pledges[(security.loan, security.loan_security)] -= \
-			loan_wise_unpledges.get((security.loan, security.loan_security), 0.0)
+		current_pledges[(security.loan, security.loan_security)] -= loan_wise_unpledges.get(
+			(security.loan, security.loan_security), 0.0
+		)
 
 	return current_pledges
 
+
 def get_loan_wise_security_value(filters, current_pledges):
 	loan_security_details = get_loan_security_details()
 	loan_wise_security_value = {}
@@ -181,7 +341,8 @@
 	for key in current_pledges:
 		qty = current_pledges.get(key)
 		loan_wise_security_value.setdefault(key[0], 0.0)
-		loan_wise_security_value[key[0]] += \
-			flt(qty * loan_security_details.get(key[1], {}).get('latest_price', 0))
+		loan_wise_security_value[key[0]] += flt(
+			qty * loan_security_details.get(key[1], {}).get("latest_price", 0)
+		)
 
 	return loan_wise_security_value
diff --git a/erpnext/loan_management/report/loan_repayment_and_closure/loan_repayment_and_closure.py b/erpnext/loan_management/report/loan_repayment_and_closure/loan_repayment_and_closure.py
index 68fd3d8..253b994 100644
--- a/erpnext/loan_management/report/loan_repayment_and_closure/loan_repayment_and_closure.py
+++ b/erpnext/loan_management/report/loan_repayment_and_closure/loan_repayment_and_closure.py
@@ -11,101 +11,96 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns():
 	return [
-			{
-				"label": _("Posting Date"),
-				"fieldtype": "Date",
-				"fieldname": "posting_date",
-				"width": 100
-			},
-			{
-				"label": _("Loan Repayment"),
-				"fieldtype": "Link",
-				"fieldname": "loan_repayment",
-				"options": "Loan Repayment",
-				"width": 100
-			},
-			{
-				"label": _("Against Loan"),
-				"fieldtype": "Link",
-				"fieldname": "against_loan",
-				"options": "Loan",
-				"width": 200
-			},
-			{
-				"label": _("Applicant"),
-				"fieldtype": "Data",
-				"fieldname": "applicant",
-				"width": 150
-			},
-			{
-				"label": _("Payment Type"),
-				"fieldtype": "Data",
-				"fieldname": "payment_type",
-				"width": 150
-			},
-			{
-				"label": _("Principal Amount"),
-				"fieldtype": "Currency",
-				"fieldname": "principal_amount",
-				"options": "currency",
-				"width": 100
-			},
-			{
-				"label": _("Interest Amount"),
-				"fieldtype": "Currency",
-				"fieldname": "interest",
-				"options": "currency",
-				"width": 100
-			},
-			{
-				"label": _("Penalty Amount"),
-				"fieldtype": "Currency",
-				"fieldname": "penalty",
-				"options": "currency",
-				"width": 100
-			},
-			{
-				"label": _("Payable Amount"),
-				"fieldtype": "Currency",
-				"fieldname": "payable_amount",
-				"options": "currency",
-				"width": 100
-			},
-			{
-				"label": _("Paid Amount"),
-				"fieldtype": "Currency",
-				"fieldname": "paid_amount",
-				"options": "currency",
-				"width": 100
-			},
-			{
-				"label": _("Currency"),
-				"fieldtype": "Link",
-				"fieldname": "currency",
-				"options": "Currency",
-				"width": 100
-			}
-		]
+		{"label": _("Posting Date"), "fieldtype": "Date", "fieldname": "posting_date", "width": 100},
+		{
+			"label": _("Loan Repayment"),
+			"fieldtype": "Link",
+			"fieldname": "loan_repayment",
+			"options": "Loan Repayment",
+			"width": 100,
+		},
+		{
+			"label": _("Against Loan"),
+			"fieldtype": "Link",
+			"fieldname": "against_loan",
+			"options": "Loan",
+			"width": 200,
+		},
+		{"label": _("Applicant"), "fieldtype": "Data", "fieldname": "applicant", "width": 150},
+		{"label": _("Payment Type"), "fieldtype": "Data", "fieldname": "payment_type", "width": 150},
+		{
+			"label": _("Principal Amount"),
+			"fieldtype": "Currency",
+			"fieldname": "principal_amount",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Interest Amount"),
+			"fieldtype": "Currency",
+			"fieldname": "interest",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Penalty Amount"),
+			"fieldtype": "Currency",
+			"fieldname": "penalty",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Payable Amount"),
+			"fieldtype": "Currency",
+			"fieldname": "payable_amount",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Paid Amount"),
+			"fieldtype": "Currency",
+			"fieldname": "paid_amount",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Currency"),
+			"fieldtype": "Link",
+			"fieldname": "currency",
+			"options": "Currency",
+			"width": 100,
+		},
+	]
+
 
 def get_data(filters):
 	data = []
 
 	query_filters = {
 		"docstatus": 1,
-		"company": filters.get('company'),
+		"company": filters.get("company"),
 	}
 
-	if filters.get('applicant'):
-		query_filters.update({
-			"applicant": filters.get('applicant')
-		})
+	if filters.get("applicant"):
+		query_filters.update({"applicant": filters.get("applicant")})
 
-	loan_repayments = frappe.get_all("Loan Repayment",
-		filters = query_filters,
-		fields=["posting_date", "applicant", "name", "against_loan", "payable_amount",
-			"pending_principal_amount", "interest_payable", "penalty_amount", "amount_paid"]
+	loan_repayments = frappe.get_all(
+		"Loan Repayment",
+		filters=query_filters,
+		fields=[
+			"posting_date",
+			"applicant",
+			"name",
+			"against_loan",
+			"payable_amount",
+			"pending_principal_amount",
+			"interest_payable",
+			"penalty_amount",
+			"amount_paid",
+		],
 	)
 
 	default_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
@@ -122,7 +117,7 @@
 			"penalty": repayment.penalty_amount,
 			"payable_amount": repayment.payable_amount,
 			"paid_amount": repayment.amount_paid,
-			"currency": default_currency
+			"currency": default_currency,
 		}
 
 		data.append(row)
diff --git a/erpnext/loan_management/report/loan_security_exposure/loan_security_exposure.py b/erpnext/loan_management/report/loan_security_exposure/loan_security_exposure.py
index 7dbb966..a92f960 100644
--- a/erpnext/loan_management/report/loan_security_exposure/loan_security_exposure.py
+++ b/erpnext/loan_management/report/loan_security_exposure/loan_security_exposure.py
@@ -17,46 +17,110 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
-		{"label": _("Loan Security"), "fieldname": "loan_security", "fieldtype": "Link", "options": "Loan Security", "width": 160},
-		{"label": _("Loan Security Code"), "fieldname": "loan_security_code", "fieldtype": "Data", "width": 100},
-		{"label": _("Loan Security Name"), "fieldname": "loan_security_name", "fieldtype": "Data", "width": 150},
+		{
+			"label": _("Loan Security"),
+			"fieldname": "loan_security",
+			"fieldtype": "Link",
+			"options": "Loan Security",
+			"width": 160,
+		},
+		{
+			"label": _("Loan Security Code"),
+			"fieldname": "loan_security_code",
+			"fieldtype": "Data",
+			"width": 100,
+		},
+		{
+			"label": _("Loan Security Name"),
+			"fieldname": "loan_security_name",
+			"fieldtype": "Data",
+			"width": 150,
+		},
 		{"label": _("Haircut"), "fieldname": "haircut", "fieldtype": "Percent", "width": 100},
-		{"label": _("Loan Security Type"), "fieldname": "loan_security_type", "fieldtype": "Link", "options": "Loan Security Type", "width": 120},
+		{
+			"label": _("Loan Security Type"),
+			"fieldname": "loan_security_type",
+			"fieldtype": "Link",
+			"options": "Loan Security Type",
+			"width": 120,
+		},
 		{"label": _("Disabled"), "fieldname": "disabled", "fieldtype": "Check", "width": 80},
 		{"label": _("Total Qty"), "fieldname": "total_qty", "fieldtype": "Float", "width": 100},
-		{"label": _("Latest Price"), "fieldname": "latest_price", "fieldtype": "Currency", "options": "currency", "width": 100},
-		{"label": _("Price Valid Upto"), "fieldname": "price_valid_upto", "fieldtype": "Datetime", "width": 100},
-		{"label": _("Current Value"), "fieldname": "current_value", "fieldtype": "Currency", "options": "currency", "width": 100},
-		{"label": _("% Of Total Portfolio"), "fieldname": "portfolio_percent", "fieldtype": "Percentage", "width": 100},
-		{"label": _("Pledged Applicant Count"), "fieldname": "pledged_applicant_count", "fieldtype": "Percentage", "width": 100},
-		{"label": _("Currency"), "fieldname": "currency", "fieldtype": "Currency", "options": "Currency", "hidden": 1, "width": 100},
+		{
+			"label": _("Latest Price"),
+			"fieldname": "latest_price",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("Price Valid Upto"),
+			"fieldname": "price_valid_upto",
+			"fieldtype": "Datetime",
+			"width": 100,
+		},
+		{
+			"label": _("Current Value"),
+			"fieldname": "current_value",
+			"fieldtype": "Currency",
+			"options": "currency",
+			"width": 100,
+		},
+		{
+			"label": _("% Of Total Portfolio"),
+			"fieldname": "portfolio_percent",
+			"fieldtype": "Percentage",
+			"width": 100,
+		},
+		{
+			"label": _("Pledged Applicant Count"),
+			"fieldname": "pledged_applicant_count",
+			"fieldtype": "Percentage",
+			"width": 100,
+		},
+		{
+			"label": _("Currency"),
+			"fieldname": "currency",
+			"fieldtype": "Currency",
+			"options": "Currency",
+			"hidden": 1,
+			"width": 100,
+		},
 	]
 
 	return columns
 
+
 def get_data(filters):
 	data = []
 	loan_security_details = get_loan_security_details()
-	current_pledges, total_portfolio_value = get_company_wise_loan_security_details(filters, loan_security_details)
-	currency = erpnext.get_company_currency(filters.get('company'))
+	current_pledges, total_portfolio_value = get_company_wise_loan_security_details(
+		filters, loan_security_details
+	)
+	currency = erpnext.get_company_currency(filters.get("company"))
 
 	for security, value in current_pledges.items():
-		if value.get('qty'):
+		if value.get("qty"):
 			row = {}
-			current_value = flt(value.get('qty', 0) * loan_security_details.get(security, {}).get('latest_price', 0))
-			valid_upto = loan_security_details.get(security, {}).get('valid_upto')
+			current_value = flt(
+				value.get("qty", 0) * loan_security_details.get(security, {}).get("latest_price", 0)
+			)
+			valid_upto = loan_security_details.get(security, {}).get("valid_upto")
 
 			row.update(loan_security_details.get(security))
-			row.update({
-				'total_qty': value.get('qty'),
-				'current_value': current_value,
-				'price_valid_upto': valid_upto,
-				'portfolio_percent': flt(current_value * 100 / total_portfolio_value, 2),
-				'pledged_applicant_count': value.get('applicant_count'),
-				'currency': currency
-			})
+			row.update(
+				{
+					"total_qty": value.get("qty"),
+					"current_value": current_value,
+					"price_valid_upto": valid_upto,
+					"portfolio_percent": flt(current_value * 100 / total_portfolio_value, 2),
+					"pledged_applicant_count": value.get("applicant_count"),
+					"currency": currency,
+				}
+			)
 
 			data.append(row)
 
@@ -64,21 +128,19 @@
 
 
 def get_company_wise_loan_security_details(filters, loan_security_details):
-	pledge_values, total_value_map, applicant_type_map = get_applicant_wise_total_loan_security_qty(filters,
-		loan_security_details)
+	pledge_values, total_value_map, applicant_type_map = get_applicant_wise_total_loan_security_qty(
+		filters, loan_security_details
+	)
 
 	total_portfolio_value = 0
 	security_wise_map = {}
 	for key, qty in pledge_values.items():
-		security_wise_map.setdefault(key[1], {
-			'qty': 0.0,
-			'applicant_count': 0.0
-		})
+		security_wise_map.setdefault(key[1], {"qty": 0.0, "applicant_count": 0.0})
 
-		security_wise_map[key[1]]['qty'] += qty
+		security_wise_map[key[1]]["qty"] += qty
 		if qty:
-			security_wise_map[key[1]]['applicant_count'] += 1
+			security_wise_map[key[1]]["applicant_count"] += 1
 
-		total_portfolio_value += flt(qty * loan_security_details.get(key[1], {}).get('latest_price', 0))
+		total_portfolio_value += flt(qty * loan_security_details.get(key[1], {}).get("latest_price", 0))
 
 	return security_wise_map, total_portfolio_value
diff --git a/erpnext/loan_management/report/loan_security_status/loan_security_status.py b/erpnext/loan_management/report/loan_security_status/loan_security_status.py
index b7e7168..9a5a180 100644
--- a/erpnext/loan_management/report/loan_security_status/loan_security_status.py
+++ b/erpnext/loan_management/report/loan_security_status/loan_security_status.py
@@ -11,66 +11,41 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
-	columns= [
+	columns = [
 		{
 			"label": _("Loan Security Pledge"),
 			"fieldtype": "Link",
 			"fieldname": "loan_security_pledge",
 			"options": "Loan Security Pledge",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Loan"),
-			"fieldtype": "Link",
-			"fieldname": "loan",
-			"options": "Loan",
-			"width": 200
-		},
-		{
-			"label": _("Applicant"),
-			"fieldtype": "Data",
-			"fieldname": "applicant",
-			"width": 200
-		},
-		{
-			"label": _("Status"),
-			"fieldtype": "Data",
-			"fieldname": "status",
-			"width": 100
-		},
-		{
-			"label": _("Pledge Time"),
-			"fieldtype": "Data",
-			"fieldname": "pledge_time",
-			"width": 150
-		},
+		{"label": _("Loan"), "fieldtype": "Link", "fieldname": "loan", "options": "Loan", "width": 200},
+		{"label": _("Applicant"), "fieldtype": "Data", "fieldname": "applicant", "width": 200},
+		{"label": _("Status"), "fieldtype": "Data", "fieldname": "status", "width": 100},
+		{"label": _("Pledge Time"), "fieldtype": "Data", "fieldname": "pledge_time", "width": 150},
 		{
 			"label": _("Loan Security"),
 			"fieldtype": "Link",
 			"fieldname": "loan_security",
 			"options": "Loan Security",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Quantity"),
-			"fieldtype": "Float",
-			"fieldname": "qty",
-			"width": 100
-		},
+		{"label": _("Quantity"), "fieldtype": "Float", "fieldname": "qty", "width": 100},
 		{
 			"label": _("Loan Security Price"),
 			"fieldtype": "Currency",
 			"fieldname": "loan_security_price",
 			"options": "currency",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Loan Security Value"),
 			"fieldtype": "Currency",
 			"fieldname": "loan_security_value",
 			"options": "currency",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Currency"),
@@ -78,18 +53,20 @@
 			"fieldname": "currency",
 			"options": "Currency",
 			"width": 50,
-			"hidden": 1
-		}
+			"hidden": 1,
+		},
 	]
 
 	return columns
 
+
 def get_data(filters):
 
 	data = []
 	conditions = get_conditions(filters)
 
-	loan_security_pledges = frappe.db.sql("""
+	loan_security_pledges = frappe.db.sql(
+		"""
 		SELECT
 			p.name, p.applicant, p.loan, p.status, p.pledge_time,
 			c.loan_security, c.qty, c.loan_security_price, c.amount
@@ -100,7 +77,12 @@
 			AND c.parent = p.name
 			AND p.company = %(company)s
 			{conditions}
-	""".format(conditions = conditions), (filters), as_dict=1) #nosec
+	""".format(
+			conditions=conditions
+		),
+		(filters),
+		as_dict=1,
+	)  # nosec
 
 	default_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
 
@@ -121,6 +103,7 @@
 
 	return data
 
+
 def get_conditions(filters):
 	conditions = []
 
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
index 07d928c..256f660 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
@@ -16,17 +16,17 @@
 	def generate_schedule(self):
 		if self.docstatus != 0:
 			return
-		self.set('schedules', [])
+		self.set("schedules", [])
 		count = 1
-		for d in self.get('items'):
+		for d in self.get("items"):
 			self.validate_maintenance_detail()
 			s_list = []
 			s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits, d.sales_person)
 			for i in range(d.no_of_visits):
-				child = self.append('schedules')
+				child = self.append("schedules")
 				child.item_code = d.item_code
 				child.item_name = d.item_name
-				child.scheduled_date = s_list[i].strftime('%Y-%m-%d')
+				child.scheduled_date = s_list[i].strftime("%Y-%m-%d")
 				if d.serial_no:
 					child.serial_no = d.serial_no
 				child.idx = count
@@ -37,18 +37,14 @@
 
 	@frappe.whitelist()
 	def validate_end_date_visits(self):
-		days_in_period = {
-			"Weekly": 7,
-			"Monthly": 30,
-			"Quarterly": 91,
-			"Half Yearly": 182,
-			"Yearly": 365
-		}
+		days_in_period = {"Weekly": 7, "Monthly": 30, "Quarterly": 91, "Half Yearly": 182, "Yearly": 365}
 		for item in self.items:
 			if item.periodicity and item.periodicity != "Random" and item.start_date:
 				if not item.end_date:
 					if item.no_of_visits:
-						item.end_date = add_days(item.start_date, item.no_of_visits * days_in_period[item.periodicity])
+						item.end_date = add_days(
+							item.start_date, item.no_of_visits * days_in_period[item.periodicity]
+						)
 					else:
 						item.end_date = add_days(item.start_date, days_in_period[item.periodicity])
 
@@ -61,20 +57,23 @@
 					item.no_of_visits = cint(diff / days_in_period[item.periodicity])
 
 				elif item.no_of_visits > no_of_visits:
-					item.end_date = add_days(item.start_date, item.no_of_visits * days_in_period[item.periodicity])
+					item.end_date = add_days(
+						item.start_date, item.no_of_visits * days_in_period[item.periodicity]
+					)
 
 				elif item.no_of_visits < no_of_visits:
-					item.end_date = add_days(item.start_date, item.no_of_visits * days_in_period[item.periodicity])
-
+					item.end_date = add_days(
+						item.start_date, item.no_of_visits * days_in_period[item.periodicity]
+					)
 
 	def on_submit(self):
-		if not self.get('schedules'):
+		if not self.get("schedules"):
 			throw(_("Please click on 'Generate Schedule' to get schedule"))
 		self.check_serial_no_added()
 		self.validate_schedule()
 
 		email_map = {}
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.serial_no:
 				serial_nos = get_valid_serial_nos(d.serial_no)
 				self.validate_serial_no(d.item_code, serial_nos, d.start_date)
@@ -90,29 +89,37 @@
 
 			if no_email_sp:
 				frappe.msgprint(
-					_("Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}").format(
-						self.owner, "<br>" + "<br>".join(no_email_sp)
-					)
+					_(
+						"Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}"
+					).format(self.owner, "<br>" + "<br>".join(no_email_sp))
 				)
 
-			scheduled_date = frappe.db.sql("""select scheduled_date from
+			scheduled_date = frappe.db.sql(
+				"""select scheduled_date from
 				`tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
-				parent=%s""", (d.sales_person, d.item_code, self.name), as_dict=1)
+				parent=%s""",
+				(d.sales_person, d.item_code, self.name),
+				as_dict=1,
+			)
 
 			for key in scheduled_date:
-				description =frappe._("Reference: {0}, Item Code: {1} and Customer: {2}").format(self.name, d.item_code, self.customer)
-				event = frappe.get_doc({
-					"doctype": "Event",
-					"owner": email_map.get(d.sales_person, self.owner),
-					"subject": description,
-					"description": description,
-					"starts_on": cstr(key["scheduled_date"]) + " 10:00:00",
-					"event_type": "Private",
-				})
+				description = frappe._("Reference: {0}, Item Code: {1} and Customer: {2}").format(
+					self.name, d.item_code, self.customer
+				)
+				event = frappe.get_doc(
+					{
+						"doctype": "Event",
+						"owner": email_map.get(d.sales_person, self.owner),
+						"subject": description,
+						"description": description,
+						"starts_on": cstr(key["scheduled_date"]) + " 10:00:00",
+						"event_type": "Private",
+					}
+				)
 				event.add_participant(self.doctype, self.name)
 				event.insert(ignore_permissions=1)
 
-		frappe.db.set(self, 'status', 'Submitted')
+		frappe.db.set(self, "status", "Submitted")
 
 	def create_schedule_list(self, start_date, end_date, no_of_visit, sales_person):
 		schedule_list = []
@@ -121,11 +128,12 @@
 		add_by = date_diff / no_of_visit
 
 		for visit in range(cint(no_of_visit)):
-			if (getdate(start_date_copy) < getdate(end_date)):
+			if getdate(start_date_copy) < getdate(end_date):
 				start_date_copy = add_days(start_date_copy, add_by)
 				if len(schedule_list) < no_of_visit:
-					schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy),
-						sales_person)
+					schedule_date = self.validate_schedule_date_for_holiday_list(
+						getdate(start_date_copy), sales_person
+					)
 					if schedule_date > getdate(end_date):
 						schedule_date = getdate(end_date)
 					schedule_list.append(schedule_date)
@@ -139,9 +147,11 @@
 		if employee:
 			holiday_list = get_holiday_list_for_employee(employee)
 		else:
-			holiday_list = frappe.get_cached_value('Company', self.company, "default_holiday_list")
+			holiday_list = frappe.get_cached_value("Company", self.company, "default_holiday_list")
 
-		holidays = frappe.db.sql_list('''select holiday_date from `tabHoliday` where parent=%s''', holiday_list)
+		holidays = frappe.db.sql_list(
+			"""select holiday_date from `tabHoliday` where parent=%s""", holiday_list
+		)
 
 		if not validated and holidays:
 
@@ -157,25 +167,28 @@
 
 	def validate_dates_with_periodicity(self):
 		for d in self.get("items"):
-			if d.start_date and d.end_date and d.periodicity and d.periodicity!="Random":
+			if d.start_date and d.end_date and d.periodicity and d.periodicity != "Random":
 				date_diff = (getdate(d.end_date) - getdate(d.start_date)).days + 1
 				days_in_period = {
 					"Weekly": 7,
 					"Monthly": 30,
 					"Quarterly": 90,
 					"Half Yearly": 180,
-					"Yearly": 365
+					"Yearly": 365,
 				}
 
 				if date_diff < days_in_period[d.periodicity]:
-					throw(_("Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}")
-						.format(d.idx, d.periodicity, days_in_period[d.periodicity]))
+					throw(
+						_(
+							"Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}"
+						).format(d.idx, d.periodicity, days_in_period[d.periodicity])
+					)
 
 	def validate_maintenance_detail(self):
-		if not self.get('items'):
+		if not self.get("items"):
 			throw(_("Please enter Maintaince Details first"))
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if not d.item_code:
 				throw(_("Please select item code"))
 			elif not d.start_date or not d.end_date:
@@ -189,11 +202,14 @@
 				throw(_("Start date should be less than end date for Item {0}").format(d.item_code))
 
 	def validate_sales_order(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.sales_order:
-				chk = frappe.db.sql("""select ms.name from `tabMaintenance Schedule` ms,
+				chk = frappe.db.sql(
+					"""select ms.name from `tabMaintenance Schedule` ms,
 					`tabMaintenance Schedule Item` msi where msi.parent=ms.name and
-					msi.sales_order=%s and ms.docstatus=1""", d.sales_order)
+					msi.sales_order=%s and ms.docstatus=1""",
+					d.sales_order,
+				)
 				if chk:
 					throw(_("Maintenance Schedule {0} exists against {1}").format(chk[0][0], d.sales_order))
 
@@ -209,7 +225,7 @@
 			self.generate_schedule()
 
 	def on_update(self):
-		frappe.db.set(self, 'status', 'Draft')
+		frappe.db.set(self, "status", "Draft")
 
 	def update_amc_date(self, serial_nos, amc_expiry_date=None):
 		for serial_no in serial_nos:
@@ -219,65 +235,96 @@
 
 	def validate_serial_no(self, item_code, serial_nos, amc_start_date):
 		for serial_no in serial_nos:
-			sr_details = frappe.db.get_value("Serial No", serial_no,
-				["warranty_expiry_date", "amc_expiry_date", "warehouse", "delivery_date", "item_code"], as_dict=1)
+			sr_details = frappe.db.get_value(
+				"Serial No",
+				serial_no,
+				["warranty_expiry_date", "amc_expiry_date", "warehouse", "delivery_date", "item_code"],
+				as_dict=1,
+			)
 
 			if not sr_details:
 				frappe.throw(_("Serial No {0} not found").format(serial_no))
 
 			if sr_details.get("item_code") != item_code:
-				frappe.throw(_("Serial No {0} does not belong to Item {1}")
-					.format(frappe.bold(serial_no), frappe.bold(item_code)), title="Invalid")
+				frappe.throw(
+					_("Serial No {0} does not belong to Item {1}").format(
+						frappe.bold(serial_no), frappe.bold(item_code)
+					),
+					title="Invalid",
+				)
 
-			if sr_details.warranty_expiry_date \
-				and getdate(sr_details.warranty_expiry_date) >= getdate(amc_start_date):
-				throw(_("Serial No {0} is under warranty upto {1}")
-					.format(serial_no, sr_details.warranty_expiry_date))
+			if sr_details.warranty_expiry_date and getdate(sr_details.warranty_expiry_date) >= getdate(
+				amc_start_date
+			):
+				throw(
+					_("Serial No {0} is under warranty upto {1}").format(
+						serial_no, sr_details.warranty_expiry_date
+					)
+				)
 
-			if sr_details.amc_expiry_date and getdate(sr_details.amc_expiry_date) >= getdate(amc_start_date):
-				throw(_("Serial No {0} is under maintenance contract upto {1}")
-					.format(serial_no, sr_details.amc_expiry_date))
+			if sr_details.amc_expiry_date and getdate(sr_details.amc_expiry_date) >= getdate(
+				amc_start_date
+			):
+				throw(
+					_("Serial No {0} is under maintenance contract upto {1}").format(
+						serial_no, sr_details.amc_expiry_date
+					)
+				)
 
-			if not sr_details.warehouse and sr_details.delivery_date and \
-				getdate(sr_details.delivery_date) >= getdate(amc_start_date):
-				throw(_("Maintenance start date can not be before delivery date for Serial No {0}")
-					.format(serial_no))
+			if (
+				not sr_details.warehouse
+				and sr_details.delivery_date
+				and getdate(sr_details.delivery_date) >= getdate(amc_start_date)
+			):
+				throw(
+					_("Maintenance start date can not be before delivery date for Serial No {0}").format(
+						serial_no
+					)
+				)
 
 	def validate_schedule(self):
-		item_lst1 =[]
-		item_lst2 =[]
-		for d in self.get('items'):
+		item_lst1 = []
+		item_lst2 = []
+		for d in self.get("items"):
 			if d.item_code not in item_lst1:
 				item_lst1.append(d.item_code)
 
-		for m in self.get('schedules'):
+		for m in self.get("schedules"):
 			if m.item_code not in item_lst2:
 				item_lst2.append(m.item_code)
 
 		if len(item_lst1) != len(item_lst2):
-			throw(_("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'"))
+			throw(
+				_(
+					"Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'"
+				)
+			)
 		else:
 			for x in item_lst1:
 				if x not in item_lst2:
 					throw(_("Please click on 'Generate Schedule'"))
 
 	def check_serial_no_added(self):
-		serial_present =[]
-		for d in self.get('items'):
+		serial_present = []
+		for d in self.get("items"):
 			if d.serial_no:
 				serial_present.append(d.item_code)
 
-		for m in self.get('schedules'):
+		for m in self.get("schedules"):
 			if serial_present:
 				if m.item_code in serial_present and not m.serial_no:
-					throw(_("Please click on 'Generate Schedule' to fetch Serial No added for Item {0}").format(m.item_code))
+					throw(
+						_("Please click on 'Generate Schedule' to fetch Serial No added for Item {0}").format(
+							m.item_code
+						)
+					)
 
 	def on_cancel(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.serial_no:
 				serial_nos = get_valid_serial_nos(d.serial_no)
 				self.update_amc_date(serial_nos)
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 		delete_events(self.doctype, self.name)
 
 	def on_trash(self):
@@ -301,23 +348,26 @@
 			return items
 		elif data_type == "id":
 			for schedule in self.schedules:
-				if schedule.item_name == item_name and s_date == formatdate(schedule.scheduled_date, "dd-mm-yyyy"):
+				if schedule.item_name == item_name and s_date == formatdate(
+					schedule.scheduled_date, "dd-mm-yyyy"
+				):
 					return schedule.name
 
+
 @frappe.whitelist()
 def get_serial_nos_from_schedule(item_code, schedule=None):
 	serial_nos = []
 	if schedule:
-		serial_nos = frappe.db.get_value('Maintenance Schedule Item', {
-			'parent': schedule,
-			'item_code': item_code
-		}, 'serial_no')
+		serial_nos = frappe.db.get_value(
+			"Maintenance Schedule Item", {"parent": schedule, "item_code": item_code}, "serial_no"
+		)
 
 	if serial_nos:
 		serial_nos = get_serial_nos(serial_nos)
 
 	return serial_nos
 
+
 @frappe.whitelist()
 def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=None):
 	from frappe.model.mapper import get_mapped_doc
@@ -331,27 +381,26 @@
 		if len(serial_nos) == 1:
 			target.serial_no = serial_nos[0]
 		else:
-			target.serial_no = ''
+			target.serial_no = ""
 
-	doclist = get_mapped_doc("Maintenance Schedule", source_name, {
-		"Maintenance Schedule": {
-			"doctype": "Maintenance Visit",
-			"field_map": {
-				"name": "maintenance_schedule"
+	doclist = get_mapped_doc(
+		"Maintenance Schedule",
+		source_name,
+		{
+			"Maintenance Schedule": {
+				"doctype": "Maintenance Visit",
+				"field_map": {"name": "maintenance_schedule"},
+				"validation": {"docstatus": ["=", 1]},
+				"postprocess": update_status_and_detail,
 			},
-			"validation": {
-				"docstatus": ["=", 1]
+			"Maintenance Schedule Item": {
+				"doctype": "Maintenance Visit Purpose",
+				"condition": lambda doc: doc.item_name == item_name,
+				"field_map": {"sales_person": "service_person"},
+				"postprocess": update_serial,
 			},
-			"postprocess": update_status_and_detail
 		},
-		"Maintenance Schedule Item": {
-			"doctype": "Maintenance Visit Purpose",
-			"condition": lambda doc: doc.item_name == item_name,
-			"field_map": {
-				"sales_person": "service_person"
-			},
-			"postprocess": update_serial
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
index 6e727e5..a98cd10 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
@@ -16,6 +16,7 @@
 
 # test_records = frappe.get_test_records('Maintenance Schedule')
 
+
 class TestMaintenanceSchedule(unittest.TestCase):
 	def test_events_should_be_created_and_deleted(self):
 		ms = make_maintenance_schedule()
@@ -42,15 +43,15 @@
 		expected_end_date = add_days(i.start_date, i.no_of_visits * 7)
 		self.assertEqual(i.end_date, expected_end_date)
 
-		items = ms.get_pending_data(data_type = "items")
-		items = items.split('\n')
+		items = ms.get_pending_data(data_type="items")
+		items = items.split("\n")
 		items.pop(0)
-		expected_items = ['_Test Item']
+		expected_items = ["_Test Item"]
 		self.assertTrue(items, expected_items)
 
 		# "dates" contains all generated schedule dates
-		dates = ms.get_pending_data(data_type = "date", item_name = i.item_name)
-		dates = dates.split('\n')
+		dates = ms.get_pending_data(data_type="date", item_name=i.item_name)
+		dates = dates.split("\n")
 		dates.pop(0)
 		expected_dates.append(formatdate(add_days(i.start_date, 7), "dd-MM-yyyy"))
 		expected_dates.append(formatdate(add_days(i.start_date, 14), "dd-MM-yyyy"))
@@ -59,33 +60,38 @@
 		self.assertEqual(dates, expected_dates)
 
 		ms.submit()
-		s_id = ms.get_pending_data(data_type = "id", item_name = i.item_name, s_date = expected_dates[1])
+		s_id = ms.get_pending_data(data_type="id", item_name=i.item_name, s_date=expected_dates[1])
 
 		# Check if item is mapped in visit.
-		test_map_visit = make_maintenance_visit(source_name = ms.name, item_name = "_Test Item", s_id = s_id)
+		test_map_visit = make_maintenance_visit(source_name=ms.name, item_name="_Test Item", s_id=s_id)
 		self.assertEqual(len(test_map_visit.purposes), 1)
 		self.assertEqual(test_map_visit.purposes[0].item_name, "_Test Item")
 
-		visit = frappe.new_doc('Maintenance Visit')
+		visit = frappe.new_doc("Maintenance Visit")
 		visit = test_map_visit
 		visit.maintenance_schedule = ms.name
 		visit.maintenance_schedule_detail = s_id
 		visit.completion_status = "Partially Completed"
-		visit.set('purposes', [{
-			'item_code': i.item_code,
-			'description': "test",
-			'work_done': "test",
-			'service_person': "Sales Team",
-		}])
+		visit.set(
+			"purposes",
+			[
+				{
+					"item_code": i.item_code,
+					"description": "test",
+					"work_done": "test",
+					"service_person": "Sales Team",
+				}
+			],
+		)
 		visit.save()
 		visit.submit()
-		ms = frappe.get_doc('Maintenance Schedule', ms.name)
+		ms = frappe.get_doc("Maintenance Schedule", ms.name)
 
-		#checks if visit status is back updated in schedule
+		# checks if visit status is back updated in schedule
 		self.assertTrue(ms.schedules[1].completion_status, "Partially Completed")
 		self.assertEqual(format_date(visit.mntc_date), format_date(ms.schedules[1].actual_date))
 
-		#checks if visit status is updated on cancel
+		# checks if visit status is updated on cancel
 		visit.cancel()
 		ms.reload()
 		self.assertTrue(ms.schedules[1].completion_status, "Pending")
@@ -117,22 +123,24 @@
 
 		frappe.db.rollback()
 
+
 def make_serial_item_with_serial(item_code):
 	serial_item_doc = create_item(item_code, is_stock_item=1)
 	if not serial_item_doc.has_serial_no or not serial_item_doc.serial_no_series:
 		serial_item_doc.has_serial_no = 1
 		serial_item_doc.serial_no_series = "TEST.###"
 		serial_item_doc.save(ignore_permissions=True)
-	active_serials = frappe.db.get_all('Serial No', {"status": "Active", "item_code": item_code})
+	active_serials = frappe.db.get_all("Serial No", {"status": "Active", "item_code": item_code})
 	if len(active_serials) < 2:
 		make_serialized_item(item_code=item_code)
 
+
 def get_events(ms):
-	return frappe.get_all("Event Participants", filters={
-			"reference_doctype": ms.doctype,
-			"reference_docname": ms.name,
-			"parenttype": "Event"
-		})
+	return frappe.get_all(
+		"Event Participants",
+		filters={"reference_doctype": ms.doctype, "reference_docname": ms.name, "parenttype": "Event"},
+	)
+
 
 def make_maintenance_schedule(**args):
 	ms = frappe.new_doc("Maintenance Schedule")
@@ -140,14 +148,17 @@
 	ms.customer = "_Test Customer"
 	ms.transaction_date = today()
 
-	ms.append("items", {
-		"item_code": args.get("item_code") or "_Test Item",
-		"start_date": today(),
-		"periodicity": "Weekly",
-		"no_of_visits": 4,
-		"serial_no": args.get("serial_no"),
-		"sales_person": "Sales Team",
-	})
+	ms.append(
+		"items",
+		{
+			"item_code": args.get("item_code") or "_Test Item",
+			"start_date": today(),
+			"periodicity": "Weekly",
+			"no_of_visits": 4,
+			"serial_no": args.get("serial_no"),
+			"sales_person": "Sales Team",
+		},
+	)
 	ms.insert(ignore_permissions=True)
 
 	return ms
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
index 6fe2466..29a1784 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
@@ -14,7 +14,7 @@
 		return _("To {0}").format(self.customer_name)
 
 	def validate_serial_no(self):
-		for d in self.get('purposes'):
+		for d in self.get("purposes"):
 			if d.serial_no and not frappe.db.exists("Serial No", d.serial_no):
 				frappe.throw(_("Serial No {0} does not exist").format(d.serial_no))
 
@@ -24,13 +24,19 @@
 
 	def validate_maintenance_date(self):
 		if self.maintenance_type == "Scheduled" and self.maintenance_schedule_detail:
-			item_ref = frappe.db.get_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'item_reference')
+			item_ref = frappe.db.get_value(
+				"Maintenance Schedule Detail", self.maintenance_schedule_detail, "item_reference"
+			)
 			if item_ref:
-				start_date, end_date = frappe.db.get_value('Maintenance Schedule Item', item_ref, ['start_date', 'end_date'])
-				if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(self.mntc_date) > get_datetime(end_date):
-					frappe.throw(_("Date must be between {0} and {1}")
-						.format(format_date(start_date), format_date(end_date)))
-
+				start_date, end_date = frappe.db.get_value(
+					"Maintenance Schedule Item", item_ref, ["start_date", "end_date"]
+				)
+				if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(
+					self.mntc_date
+				) > get_datetime(end_date):
+					frappe.throw(
+						_("Date must be between {0} and {1}").format(format_date(start_date), format_date(end_date))
+					)
 
 	def validate(self):
 		self.validate_serial_no()
@@ -44,73 +50,87 @@
 			status = self.completion_status
 			actual_date = self.mntc_date
 		if self.maintenance_schedule_detail:
-			frappe.db.set_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'completion_status', status)
-			frappe.db.set_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'actual_date', actual_date)
+			frappe.db.set_value(
+				"Maintenance Schedule Detail", self.maintenance_schedule_detail, "completion_status", status
+			)
+			frappe.db.set_value(
+				"Maintenance Schedule Detail", self.maintenance_schedule_detail, "actual_date", actual_date
+			)
 
 	def update_customer_issue(self, flag):
 		if not self.maintenance_schedule:
-			for d in self.get('purposes'):
-				if d.prevdoc_docname and d.prevdoc_doctype == 'Warranty Claim' :
-					if flag==1:
+			for d in self.get("purposes"):
+				if d.prevdoc_docname and d.prevdoc_doctype == "Warranty Claim":
+					if flag == 1:
 						mntc_date = self.mntc_date
 						service_person = d.service_person
 						work_done = d.work_done
 						status = "Open"
-						if self.completion_status == 'Fully Completed':
-							status = 'Closed'
-						elif self.completion_status == 'Partially Completed':
-							status = 'Work In Progress'
+						if self.completion_status == "Fully Completed":
+							status = "Closed"
+						elif self.completion_status == "Partially Completed":
+							status = "Work In Progress"
 					else:
-						nm = frappe.db.sql("select t1.name, t1.mntc_date, t2.service_person, t2.work_done from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent = t1.name and t1.completion_status = 'Partially Completed' and t2.prevdoc_docname = %s and t1.name!=%s and t1.docstatus = 1 order by t1.name desc limit 1", (d.prevdoc_docname, self.name))
+						nm = frappe.db.sql(
+							"select t1.name, t1.mntc_date, t2.service_person, t2.work_done from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent = t1.name and t1.completion_status = 'Partially Completed' and t2.prevdoc_docname = %s and t1.name!=%s and t1.docstatus = 1 order by t1.name desc limit 1",
+							(d.prevdoc_docname, self.name),
+						)
 
 						if nm:
-							status = 'Work In Progress'
-							mntc_date = nm and nm[0][1] or ''
-							service_person = nm and nm[0][2] or ''
-							work_done = nm and nm[0][3] or ''
+							status = "Work In Progress"
+							mntc_date = nm and nm[0][1] or ""
+							service_person = nm and nm[0][2] or ""
+							work_done = nm and nm[0][3] or ""
 						else:
-							status = 'Open'
+							status = "Open"
 							mntc_date = None
 							service_person = None
 							work_done = None
 
-					wc_doc = frappe.get_doc('Warranty Claim', d.prevdoc_docname)
-					wc_doc.update({
-						'resolution_date': mntc_date,
-						'resolved_by': service_person,
-						'resolution_details': work_done,
-						'status': status
-					})
+					wc_doc = frappe.get_doc("Warranty Claim", d.prevdoc_docname)
+					wc_doc.update(
+						{
+							"resolution_date": mntc_date,
+							"resolved_by": service_person,
+							"resolution_details": work_done,
+							"status": status,
+						}
+					)
 
 					wc_doc.db_update()
 
 	def check_if_last_visit(self):
 		"""check if last maintenance visit against same sales order/ Warranty Claim"""
 		check_for_docname = None
-		for d in self.get('purposes'):
+		for d in self.get("purposes"):
 			if d.prevdoc_docname:
 				check_for_docname = d.prevdoc_docname
-				#check_for_doctype = d.prevdoc_doctype
+				# check_for_doctype = d.prevdoc_doctype
 
 		if check_for_docname:
-			check = frappe.db.sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent = t1.name and t1.name!=%s and t2.prevdoc_docname=%s and t1.docstatus = 1 and (t1.mntc_date > %s or (t1.mntc_date = %s and t1.mntc_time > %s))", (self.name, check_for_docname, self.mntc_date, self.mntc_date, self.mntc_time))
+			check = frappe.db.sql(
+				"select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent = t1.name and t1.name!=%s and t2.prevdoc_docname=%s and t1.docstatus = 1 and (t1.mntc_date > %s or (t1.mntc_date = %s and t1.mntc_time > %s))",
+				(self.name, check_for_docname, self.mntc_date, self.mntc_date, self.mntc_time),
+			)
 
 			if check:
 				check_lst = [x[0] for x in check]
-				check_lst =','.join(check_lst)
-				frappe.throw(_("Cancel Material Visits {0} before cancelling this Maintenance Visit").format(check_lst))
+				check_lst = ",".join(check_lst)
+				frappe.throw(
+					_("Cancel Material Visits {0} before cancelling this Maintenance Visit").format(check_lst)
+				)
 				raise Exception
 			else:
 				self.update_customer_issue(0)
 
 	def on_submit(self):
 		self.update_customer_issue(1)
-		frappe.db.set(self, 'status', 'Submitted')
+		frappe.db.set(self, "status", "Submitted")
 		self.update_status_and_actual_date()
 
 	def on_cancel(self):
 		self.check_if_last_visit()
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 		self.update_status_and_actual_date(cancel=True)
 
 	def on_update(self):
diff --git a/erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py
index 6a9e70a..9c868c4 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py
+++ b/erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py
@@ -8,9 +8,11 @@
 
 # test_records = frappe.get_test_records('Maintenance Visit')
 
+
 class TestMaintenanceVisit(unittest.TestCase):
 	pass
 
+
 def make_maintenance_visit():
 	mv = frappe.new_doc("Maintenance Visit")
 	mv.company = "_Test Company"
@@ -20,22 +22,23 @@
 
 	sales_person = make_sales_person("Dwight Schrute")
 
-	mv.append("purposes", {
-		"item_code": "_Test Item",
-		"sales_person": "Sales Team",
-		"description": "Test Item",
-		"work_done": "Test Work Done",
-		"service_person": sales_person.name
-	})
+	mv.append(
+		"purposes",
+		{
+			"item_code": "_Test Item",
+			"sales_person": "Sales Team",
+			"description": "Test Item",
+			"work_done": "Test Work Done",
+			"service_person": sales_person.name,
+		},
+	)
 	mv.insert(ignore_permissions=True)
 
 	return mv
 
+
 def make_sales_person(name):
-	sales_person = frappe.get_doc({
-		'doctype': "Sales Person",
-		'sales_person_name': name
-	})
-	sales_person.insert(ignore_if_duplicate = True)
+	sales_person = frappe.get_doc({"doctype": "Sales Person", "sales_person_name": name})
+	sales_person.insert(ignore_if_duplicate=True)
 
 	return sales_person
diff --git a/erpnext/manufacturing/dashboard_fixtures.py b/erpnext/manufacturing/dashboard_fixtures.py
index 1bc12ff..9e64f4d 100644
--- a/erpnext/manufacturing/dashboard_fixtures.py
+++ b/erpnext/manufacturing/dashboard_fixtures.py
@@ -11,33 +11,39 @@
 
 
 def get_data():
-	return frappe._dict({
-		"dashboards": get_dashboards(),
-		"charts": get_charts(),
-		"number_cards": get_number_cards(),
-	})
+	return frappe._dict(
+		{
+			"dashboards": get_dashboards(),
+			"charts": get_charts(),
+			"number_cards": get_number_cards(),
+		}
+	)
+
 
 def get_dashboards():
-	return [{
-		"name": "Manufacturing",
-		"dashboard_name": "Manufacturing",
-		"charts": [
-			{ "chart": "Produced Quantity", "width": "Half" },
-			{ "chart": "Completed Operation", "width": "Half" },
-			{ "chart": "Work Order Analysis", "width": "Half" },
-			{ "chart": "Quality Inspection Analysis", "width": "Half" },
-			{ "chart": "Pending Work Order", "width": "Half" },
-			{ "chart": "Last Month Downtime Analysis", "width": "Half" },
-			{ "chart": "Work Order Qty Analysis", "width": "Full" },
-			{ "chart": "Job Card Analysis", "width": "Full" }
-		],
-		"cards": [
-			{ "card": "Monthly Total Work Order" },
-			{ "card": "Monthly Completed Work Order" },
-			{ "card": "Ongoing Job Card" },
-			{ "card": "Monthly Quality Inspection"}
-		]
-	}]
+	return [
+		{
+			"name": "Manufacturing",
+			"dashboard_name": "Manufacturing",
+			"charts": [
+				{"chart": "Produced Quantity", "width": "Half"},
+				{"chart": "Completed Operation", "width": "Half"},
+				{"chart": "Work Order Analysis", "width": "Half"},
+				{"chart": "Quality Inspection Analysis", "width": "Half"},
+				{"chart": "Pending Work Order", "width": "Half"},
+				{"chart": "Last Month Downtime Analysis", "width": "Half"},
+				{"chart": "Work Order Qty Analysis", "width": "Full"},
+				{"chart": "Job Card Analysis", "width": "Full"},
+			],
+			"cards": [
+				{"card": "Monthly Total Work Order"},
+				{"card": "Monthly Completed Work Order"},
+				{"card": "Ongoing Job Card"},
+				{"card": "Monthly Quality Inspection"},
+			],
+		}
+	]
+
 
 def get_charts():
 	company = erpnext.get_default_company()
@@ -45,200 +51,198 @@
 	if not company:
 		company = frappe.db.get_value("Company", {"is_group": 0}, "name")
 
-	return [{
-		"doctype": "Dashboard Chart",
-		"based_on": "modified",
-		"chart_type": "Sum",
-		"chart_name": _("Produced Quantity"),
-		"name": "Produced Quantity",
-		"document_type": "Work Order",
-		"filters_json": json.dumps([['Work Order', 'docstatus', '=', 1, False]]),
-		"group_by_type": "Count",
-		"time_interval": "Monthly",
-		"timespan": "Last Year",
-		"owner": "Administrator",
-		"type": "Line",
-		"value_based_on": "produced_qty",
-		"is_public": 1,
-		"timeseries": 1
-	}, {
-		"doctype": "Dashboard Chart",
-		"based_on": "creation",
-		"chart_type": "Sum",
-		"chart_name": _("Completed Operation"),
-		"name": "Completed Operation",
-		"document_type": "Work Order Operation",
-		"filters_json": json.dumps([['Work Order Operation', 'docstatus', '=', 1, False]]),
-		"group_by_type": "Count",
-		"time_interval": "Quarterly",
-		"timespan": "Last Year",
-		"owner": "Administrator",
-		"type": "Line",
-		"value_based_on": "completed_qty",
-		"is_public": 1,
-		"timeseries": 1
-	}, {
-		"doctype": "Dashboard Chart",
-		"time_interval": "Yearly",
-		"chart_type": "Report",
-		"chart_name": _("Work Order Analysis"),
-		"name": "Work Order Analysis",
-		"timespan": "Last Year",
-		"report_name": "Work Order Summary",
-		"owner": "Administrator",
-		"filters_json": json.dumps({"company": company, "charts_based_on": "Status"}),
-		"type": "Donut",
-		"is_public": 1,
-		"is_custom": 1,
-		"custom_options": json.dumps({
-			"axisOptions": {
-				"shortenYAxisNumbers": 1
-			},
-			"height": 300
-		}),
-	}, {
-		"doctype": "Dashboard Chart",
-		"time_interval": "Yearly",
-		"chart_type": "Report",
-		"chart_name": _("Quality Inspection Analysis"),
-		"name": "Quality Inspection Analysis",
-		"timespan": "Last Year",
-		"report_name": "Quality Inspection Summary",
-		"owner": "Administrator",
-		"filters_json": json.dumps({}),
-		"type": "Donut",
-		"is_public": 1,
-		"is_custom": 1,
-		"custom_options": json.dumps({
-			"axisOptions": {
-				"shortenYAxisNumbers": 1
-			},
-			"height": 300
-		}),
-	}, {
-		"doctype": "Dashboard Chart",
-		"time_interval": "Yearly",
-		"chart_type": "Report",
-		"chart_name": _("Pending Work Order"),
-		"name": "Pending Work Order",
-		"timespan": "Last Year",
-		"report_name": "Work Order Summary",
-		"filters_json": json.dumps({"company": company, "charts_based_on": "Age"}),
-		"owner": "Administrator",
-		"type": "Donut",
-		"is_public": 1,
-		"is_custom": 1,
-		"custom_options": json.dumps({
-			"axisOptions": {
-				"shortenYAxisNumbers": 1
-			},
-			"height": 300
-		}),
-	}, {
-		"doctype": "Dashboard Chart",
-		"time_interval": "Yearly",
-		"chart_type": "Report",
-		"chart_name": _("Last Month Downtime Analysis"),
-		"name": "Last Month Downtime Analysis",
-		"timespan": "Last Year",
-		"filters_json": json.dumps({}),
-		"report_name": "Downtime Analysis",
-		"owner": "Administrator",
-		"is_public": 1,
-		"is_custom": 1,
-		"type": "Bar"
-	}, {
-		"doctype": "Dashboard Chart",
-		"time_interval": "Yearly",
-		"chart_type": "Report",
-		"chart_name": _("Work Order Qty Analysis"),
-		"name": "Work Order Qty Analysis",
-		"timespan": "Last Year",
-		"report_name": "Work Order Summary",
-		"filters_json": json.dumps({"company": company, "charts_based_on": "Quantity"}),
-		"owner": "Administrator",
-		"type": "Bar",
-		"is_public": 1,
-		"is_custom": 1,
-		"custom_options": json.dumps({
-			"barOptions": { "stacked": 1 }
-		}),
-	}, {
-		"doctype": "Dashboard Chart",
-		"time_interval": "Yearly",
-		"chart_type": "Report",
-		"chart_name": _("Job Card Analysis"),
-		"name": "Job Card Analysis",
-		"timespan": "Last Year",
-		"report_name": "Job Card Summary",
-		"owner": "Administrator",
-		"is_public": 1,
-		"is_custom": 1,
-		"filters_json": json.dumps({"company": company, "docstatus": 1, "range":"Monthly"}),
-		"custom_options": json.dumps({
-			"barOptions": { "stacked": 1 }
-		}),
-		"type": "Bar"
-	}]
+	return [
+		{
+			"doctype": "Dashboard Chart",
+			"based_on": "modified",
+			"chart_type": "Sum",
+			"chart_name": _("Produced Quantity"),
+			"name": "Produced Quantity",
+			"document_type": "Work Order",
+			"filters_json": json.dumps([["Work Order", "docstatus", "=", 1, False]]),
+			"group_by_type": "Count",
+			"time_interval": "Monthly",
+			"timespan": "Last Year",
+			"owner": "Administrator",
+			"type": "Line",
+			"value_based_on": "produced_qty",
+			"is_public": 1,
+			"timeseries": 1,
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"based_on": "creation",
+			"chart_type": "Sum",
+			"chart_name": _("Completed Operation"),
+			"name": "Completed Operation",
+			"document_type": "Work Order Operation",
+			"filters_json": json.dumps([["Work Order Operation", "docstatus", "=", 1, False]]),
+			"group_by_type": "Count",
+			"time_interval": "Quarterly",
+			"timespan": "Last Year",
+			"owner": "Administrator",
+			"type": "Line",
+			"value_based_on": "completed_qty",
+			"is_public": 1,
+			"timeseries": 1,
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"time_interval": "Yearly",
+			"chart_type": "Report",
+			"chart_name": _("Work Order Analysis"),
+			"name": "Work Order Analysis",
+			"timespan": "Last Year",
+			"report_name": "Work Order Summary",
+			"owner": "Administrator",
+			"filters_json": json.dumps({"company": company, "charts_based_on": "Status"}),
+			"type": "Donut",
+			"is_public": 1,
+			"is_custom": 1,
+			"custom_options": json.dumps({"axisOptions": {"shortenYAxisNumbers": 1}, "height": 300}),
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"time_interval": "Yearly",
+			"chart_type": "Report",
+			"chart_name": _("Quality Inspection Analysis"),
+			"name": "Quality Inspection Analysis",
+			"timespan": "Last Year",
+			"report_name": "Quality Inspection Summary",
+			"owner": "Administrator",
+			"filters_json": json.dumps({}),
+			"type": "Donut",
+			"is_public": 1,
+			"is_custom": 1,
+			"custom_options": json.dumps({"axisOptions": {"shortenYAxisNumbers": 1}, "height": 300}),
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"time_interval": "Yearly",
+			"chart_type": "Report",
+			"chart_name": _("Pending Work Order"),
+			"name": "Pending Work Order",
+			"timespan": "Last Year",
+			"report_name": "Work Order Summary",
+			"filters_json": json.dumps({"company": company, "charts_based_on": "Age"}),
+			"owner": "Administrator",
+			"type": "Donut",
+			"is_public": 1,
+			"is_custom": 1,
+			"custom_options": json.dumps({"axisOptions": {"shortenYAxisNumbers": 1}, "height": 300}),
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"time_interval": "Yearly",
+			"chart_type": "Report",
+			"chart_name": _("Last Month Downtime Analysis"),
+			"name": "Last Month Downtime Analysis",
+			"timespan": "Last Year",
+			"filters_json": json.dumps({}),
+			"report_name": "Downtime Analysis",
+			"owner": "Administrator",
+			"is_public": 1,
+			"is_custom": 1,
+			"type": "Bar",
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"time_interval": "Yearly",
+			"chart_type": "Report",
+			"chart_name": _("Work Order Qty Analysis"),
+			"name": "Work Order Qty Analysis",
+			"timespan": "Last Year",
+			"report_name": "Work Order Summary",
+			"filters_json": json.dumps({"company": company, "charts_based_on": "Quantity"}),
+			"owner": "Administrator",
+			"type": "Bar",
+			"is_public": 1,
+			"is_custom": 1,
+			"custom_options": json.dumps({"barOptions": {"stacked": 1}}),
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"time_interval": "Yearly",
+			"chart_type": "Report",
+			"chart_name": _("Job Card Analysis"),
+			"name": "Job Card Analysis",
+			"timespan": "Last Year",
+			"report_name": "Job Card Summary",
+			"owner": "Administrator",
+			"is_public": 1,
+			"is_custom": 1,
+			"filters_json": json.dumps({"company": company, "docstatus": 1, "range": "Monthly"}),
+			"custom_options": json.dumps({"barOptions": {"stacked": 1}}),
+			"type": "Bar",
+		},
+	]
+
 
 def get_number_cards():
 	start_date = add_months(nowdate(), -1)
 	end_date = nowdate()
 
-	return [{
-		"doctype": "Number Card",
-		"document_type": "Work Order",
-		"name": "Monthly Total Work Order",
-		"filters_json": json.dumps([
-			['Work Order', 'docstatus', '=', 1],
-			['Work Order', 'creation', 'between', [start_date, end_date]]
-		]),
-		"function": "Count",
-		"is_public": 1,
-		"label": _("Monthly Total Work Orders"),
-		"show_percentage_stats": 1,
-		"stats_time_interval": "Weekly"
-	},
-	{
-		"doctype": "Number Card",
-		"document_type": "Work Order",
-		"name": "Monthly Completed Work Order",
-		"filters_json": json.dumps([
-			['Work Order', 'status', '=', 'Completed'],
-			['Work Order', 'docstatus', '=', 1],
-			['Work Order', 'creation', 'between', [start_date, end_date]]
-		]),
-		"function": "Count",
-		"is_public": 1,
-		"label": _("Monthly Completed Work Orders"),
-		"show_percentage_stats": 1,
-		"stats_time_interval": "Weekly"
-	},
-	{
-		"doctype": "Number Card",
-		"document_type": "Job Card",
-		"name": "Ongoing Job Card",
-		"filters_json": json.dumps([
-			['Job Card', 'status','!=','Completed'],
-			['Job Card', 'docstatus', '=', 1]
-		]),
-		"function": "Count",
-		"is_public": 1,
-		"label": _("Ongoing Job Cards"),
-		"show_percentage_stats": 1,
-		"stats_time_interval": "Weekly"
-	},
-	{
-		"doctype": "Number Card",
-		"document_type": "Quality Inspection",
-		"name": "Monthly Quality Inspection",
-		"filters_json": json.dumps([
-			['Quality Inspection', 'docstatus', '=', 1],
-			['Quality Inspection', 'creation', 'between', [start_date, end_date]]
-		]),
-		"function": "Count",
-		"is_public": 1,
-		"label": _("Monthly Quality Inspections"),
-		"show_percentage_stats": 1,
-		"stats_time_interval": "Weekly"
-	}]
+	return [
+		{
+			"doctype": "Number Card",
+			"document_type": "Work Order",
+			"name": "Monthly Total Work Order",
+			"filters_json": json.dumps(
+				[
+					["Work Order", "docstatus", "=", 1],
+					["Work Order", "creation", "between", [start_date, end_date]],
+				]
+			),
+			"function": "Count",
+			"is_public": 1,
+			"label": _("Monthly Total Work Orders"),
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Weekly",
+		},
+		{
+			"doctype": "Number Card",
+			"document_type": "Work Order",
+			"name": "Monthly Completed Work Order",
+			"filters_json": json.dumps(
+				[
+					["Work Order", "status", "=", "Completed"],
+					["Work Order", "docstatus", "=", 1],
+					["Work Order", "creation", "between", [start_date, end_date]],
+				]
+			),
+			"function": "Count",
+			"is_public": 1,
+			"label": _("Monthly Completed Work Orders"),
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Weekly",
+		},
+		{
+			"doctype": "Number Card",
+			"document_type": "Job Card",
+			"name": "Ongoing Job Card",
+			"filters_json": json.dumps(
+				[["Job Card", "status", "!=", "Completed"], ["Job Card", "docstatus", "=", 1]]
+			),
+			"function": "Count",
+			"is_public": 1,
+			"label": _("Ongoing Job Cards"),
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Weekly",
+		},
+		{
+			"doctype": "Number Card",
+			"document_type": "Quality Inspection",
+			"name": "Monthly Quality Inspection",
+			"filters_json": json.dumps(
+				[
+					["Quality Inspection", "docstatus", "=", 1],
+					["Quality Inspection", "creation", "between", [start_date, end_date]],
+				]
+			),
+			"function": "Count",
+			"is_public": 1,
+			"label": _("Monthly Quality Inspections"),
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Weekly",
+		},
+	]
diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
index 5340c51..ff21401 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
@@ -29,7 +29,9 @@
 
 	def update_ordered_qty(self):
 		ref_doctype = "Sales Order" if self.blanket_order_type == "Selling" else "Purchase Order"
-		item_ordered_qty = frappe._dict(frappe.db.sql("""
+		item_ordered_qty = frappe._dict(
+			frappe.db.sql(
+				"""
 			select trans_item.item_code, sum(trans_item.stock_qty) as qty
 			from `tab{0} Item` trans_item, `tab{0}` trans
 			where trans.name = trans_item.parent
@@ -37,18 +39,24 @@
 				and trans.docstatus=1
 				and trans.status not in ('Closed', 'Stopped')
 			group by trans_item.item_code
-		""".format(ref_doctype), self.name))
+		""".format(
+					ref_doctype
+				),
+				self.name,
+			)
+		)
 
 		for d in self.items:
 			d.db_set("ordered_qty", item_ordered_qty.get(d.item_code, 0))
 
+
 @frappe.whitelist()
 def make_order(source_name):
 	doctype = frappe.flags.args.doctype
 
 	def update_doc(source_doc, target_doc, source_parent):
-		if doctype == 'Quotation':
-			target_doc.quotation_to = 'Customer'
+		if doctype == "Quotation":
+			target_doc.quotation_to = "Customer"
 			target_doc.party_name = source_doc.customer
 
 	def update_item(source, target, source_parent):
@@ -62,18 +70,16 @@
 			target.against_blanket_order = 1
 			target.blanket_order = source_name
 
-	target_doc = get_mapped_doc("Blanket Order", source_name, {
-		"Blanket Order": {
-			"doctype": doctype,
-			"postprocess": update_doc
-		},
-		"Blanket Order Item": {
-			"doctype": doctype + " Item",
-			"field_map": {
-				"rate": "blanket_order_rate",
-				"parent": "blanket_order"
+	target_doc = get_mapped_doc(
+		"Blanket Order",
+		source_name,
+		{
+			"Blanket Order": {"doctype": doctype, "postprocess": update_doc},
+			"Blanket Order Item": {
+				"doctype": doctype + " Item",
+				"field_map": {"rate": "blanket_order_rate", "parent": "blanket_order"},
+				"postprocess": update_item,
 			},
-			"postprocess": update_item
-		}
-	})
+		},
+	)
 	return target_doc
diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order_dashboard.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order_dashboard.py
index c6745c8..3106234 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order_dashboard.py
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order_dashboard.py
@@ -1,9 +1,5 @@
 def get_data():
 	return {
-		'fieldname': 'blanket_order',
-		'transactions': [
-			{
-				'items': ['Purchase Order', 'Sales Order', 'Quotation']
-			}
-		]
+		"fieldname": "blanket_order",
+		"transactions": [{"items": ["Purchase Order", "Sales Order", "Quotation"]}],
 	}
diff --git a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py
index d4d337d..2f1f3ae 100644
--- a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py
+++ b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py
@@ -16,7 +16,7 @@
 	def test_sales_order_creation(self):
 		bo = make_blanket_order(blanket_order_type="Selling")
 
-		frappe.flags.args.doctype = 'Sales Order'
+		frappe.flags.args.doctype = "Sales Order"
 		so = make_order(bo.name)
 		so.currency = get_company_currency(so.company)
 		so.delivery_date = today()
@@ -33,16 +33,15 @@
 		self.assertEqual(so.items[0].qty, bo.items[0].ordered_qty)
 
 		# test the quantity
-		frappe.flags.args.doctype = 'Sales Order'
+		frappe.flags.args.doctype = "Sales Order"
 		so1 = make_order(bo.name)
 		so1.currency = get_company_currency(so1.company)
-		self.assertEqual(so1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_qty))
-
+		self.assertEqual(so1.items[0].qty, (bo.items[0].qty - bo.items[0].ordered_qty))
 
 	def test_purchase_order_creation(self):
 		bo = make_blanket_order(blanket_order_type="Purchasing")
 
-		frappe.flags.args.doctype = 'Purchase Order'
+		frappe.flags.args.doctype = "Purchase Order"
 		po = make_order(bo.name)
 		po.currency = get_company_currency(po.company)
 		po.schedule_date = today()
@@ -59,11 +58,10 @@
 		self.assertEqual(po.items[0].qty, bo.items[0].ordered_qty)
 
 		# test the quantity
-		frappe.flags.args.doctype = 'Purchase Order'
+		frappe.flags.args.doctype = "Purchase Order"
 		po1 = make_order(bo.name)
 		po1.currency = get_company_currency(po1.company)
-		self.assertEqual(po1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_qty))
-
+		self.assertEqual(po1.items[0].qty, (bo.items[0].qty - bo.items[0].ordered_qty))
 
 
 def make_blanket_order(**args):
@@ -80,11 +78,14 @@
 	bo.from_date = today()
 	bo.to_date = add_months(bo.from_date, months=12)
 
-	bo.append("items", {
-		"item_code": args.item_code or "_Test Item",
-		"qty": args.quantity or 1000,
-		"rate": args.rate or 100
-	})
+	bo.append(
+		"items",
+		{
+			"item_code": args.item_code or "_Test Item",
+			"qty": args.quantity or 1000,
+			"rate": args.rate or 100,
+		},
+	)
 
 	bo.insert()
 	bo.submit()
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 4d7e459..bf29474 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -19,9 +19,7 @@
 from erpnext.stock.doctype.item.item import get_item_details
 from erpnext.stock.get_item_details import get_conversion_factor, get_price_list_rate
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
 
 
 class BOMTree:
@@ -31,10 +29,12 @@
 	# ref: https://docs.python.org/3/reference/datamodel.html#slots
 	__slots__ = ["name", "child_items", "is_bom", "item_code", "exploded_qty", "qty"]
 
-	def __init__(self, name: str, is_bom: bool = True, exploded_qty: float = 1.0, qty: float = 1) -> None:
+	def __init__(
+		self, name: str, is_bom: bool = True, exploded_qty: float = 1.0, qty: float = 1
+	) -> None:
 		self.name = name  # name of node, BOM number if is_bom else item_code
 		self.child_items: List["BOMTree"] = []  # list of child items
-		self.is_bom = is_bom   # true if the node is a BOM and not a leaf item
+		self.is_bom = is_bom  # true if the node is a BOM and not a leaf item
 		self.item_code: str = None  # item_code associated with node
 		self.qty = qty  # required unit quantity to make one unit of parent item.
 		self.exploded_qty = exploded_qty  # total exploded qty required for making root of tree.
@@ -62,12 +62,12 @@
 		"""Get level order traversal of tree.
 		E.g. for following tree the traversal will return list of nodes in order from top to bottom.
 		BOM:
-			- SubAssy1
-				- item1
-				- item2
-			- SubAssy2
-				- item3
-			- item4
+		        - SubAssy1
+		                - item1
+		                - item2
+		        - SubAssy2
+		                - item3
+		        - item4
 
 		returns = [SubAssy1, item1, item2, SubAssy2, item3, item4]
 		"""
@@ -96,19 +96,18 @@
 			rep += child.__repr__(level=level + 1)
 		return rep
 
+
 class BOM(WebsiteGenerator):
 	website = frappe._dict(
 		# page_title_field = "item_name",
-		condition_field = "show_in_website",
-		template = "templates/generators/bom.html"
+		condition_field="show_in_website",
+		template="templates/generators/bom.html",
 	)
 
 	def autoname(self):
 		# ignore amended documents while calculating current index
 		existing_boms = frappe.get_all(
-			"BOM",
-			filters={"item": self.item, "amended_from": ["is", "not set"]},
-			pluck="name"
+			"BOM", filters={"item": self.item, "amended_from": ["is", "not set"]}, pluck="name"
 		)
 
 		if existing_boms:
@@ -135,11 +134,15 @@
 			conflicting_bom = frappe.get_doc("BOM", name)
 
 			if conflicting_bom.item != self.item:
-				msg = (_("A BOM with name {0} already exists for item {1}.")
-					.format(frappe.bold(name), frappe.bold(conflicting_bom.item)))
+				msg = _("A BOM with name {0} already exists for item {1}.").format(
+					frappe.bold(name), frappe.bold(conflicting_bom.item)
+				)
 
-				frappe.throw(_("{0}{1} Did you rename the item? Please contact Administrator / Tech support")
-					.format(msg, "<br>"))
+				frappe.throw(
+					_("{0}{1} Did you rename the item? Please contact Administrator / Tech support").format(
+						msg, "<br>"
+					)
+				)
 
 		self.name = name
 
@@ -164,7 +167,7 @@
 		return index
 
 	def validate(self):
-		self.route = frappe.scrub(self.name).replace('_', '-')
+		self.route = frappe.scrub(self.name).replace("_", "-")
 
 		if not self.company:
 			frappe.throw(_("Please select a Company first."), title=_("Mandatory"))
@@ -184,14 +187,14 @@
 		self.validate_operations()
 		self.calculate_cost()
 		self.update_stock_qty()
-		self.update_cost(update_parent=False, from_child_bom=True, update_hour_rate = False, save=False)
+		self.update_cost(update_parent=False, from_child_bom=True, update_hour_rate=False, save=False)
 		self.validate_scrap_items()
 
 	def get_context(self, context):
-		context.parents = [{'name': 'boms', 'title': _('All BOMs') }]
+		context.parents = [{"name": "boms", "title": _("All BOMs")}]
 
 	def on_update(self):
-		frappe.cache().hdel('bom_children', self.name)
+		frappe.cache().hdel("bom_children", self.name)
 		self.check_recursion()
 
 	def on_submit(self):
@@ -221,37 +224,53 @@
 	def get_routing(self):
 		if self.routing:
 			self.set("operations", [])
-			fields = ["sequence_id", "operation", "workstation", "description",
-				"time_in_mins", "batch_size", "operating_cost", "idx", "hour_rate",
-				"set_cost_based_on_bom_qty", "fixed_time"]
+			fields = [
+				"sequence_id",
+				"operation",
+				"workstation",
+				"description",
+				"time_in_mins",
+				"batch_size",
+				"operating_cost",
+				"idx",
+				"hour_rate",
+				"set_cost_based_on_bom_qty",
+				"fixed_time",
+			]
 
-			for row in frappe.get_all("BOM Operation", fields = fields,
-				filters = {'parenttype': 'Routing', 'parent': self.routing}, order_by="sequence_id, idx"):
-				child = self.append('operations', row)
+			for row in frappe.get_all(
+				"BOM Operation",
+				fields=fields,
+				filters={"parenttype": "Routing", "parent": self.routing},
+				order_by="sequence_id, idx",
+			):
+				child = self.append("operations", row)
 				child.hour_rate = flt(row.hour_rate / self.conversion_rate, child.precision("hour_rate"))
 
 	def set_bom_material_details(self):
 		for item in self.get("items"):
 			self.validate_bom_currency(item)
 
-			item.bom_no = ''
+			item.bom_no = ""
 			if not item.do_not_explode:
 				item.bom_no = item.bom_no
 
-			ret = self.get_bom_material_detail({
-				"company": self.company,
-				"item_code": item.item_code,
-				"item_name": item.item_name,
-				"bom_no": item.bom_no,
-				"stock_qty": item.stock_qty,
-				"include_item_in_manufacturing": item.include_item_in_manufacturing,
-				"qty": item.qty,
-				"uom": item.uom,
-				"stock_uom": item.stock_uom,
-				"conversion_factor": item.conversion_factor,
-				"sourced_by_supplier": item.sourced_by_supplier,
-				"do_not_explode": item.do_not_explode
-			})
+			ret = self.get_bom_material_detail(
+				{
+					"company": self.company,
+					"item_code": item.item_code,
+					"item_name": item.item_name,
+					"bom_no": item.bom_no,
+					"stock_qty": item.stock_qty,
+					"include_item_in_manufacturing": item.include_item_in_manufacturing,
+					"qty": item.qty,
+					"uom": item.uom,
+					"stock_uom": item.stock_uom,
+					"conversion_factor": item.conversion_factor,
+					"sourced_by_supplier": item.sourced_by_supplier,
+					"do_not_explode": item.do_not_explode,
+				}
+			)
 
 			for r in ret:
 				if not item.get(r):
@@ -263,7 +282,7 @@
 				"item_code": item.item_code,
 				"company": self.company,
 				"scrap_items": True,
-				"bom_no": '',
+				"bom_no": "",
 			}
 			ret = self.get_bom_material_detail(args)
 			for key, value in ret.items():
@@ -272,75 +291,93 @@
 
 	@frappe.whitelist()
 	def get_bom_material_detail(self, args=None):
-		""" Get raw material details like uom, desc and rate"""
+		"""Get raw material details like uom, desc and rate"""
 		if not args:
-			args = frappe.form_dict.get('args')
+			args = frappe.form_dict.get("args")
 
 		if isinstance(args, str):
 			import json
+
 			args = json.loads(args)
 
-		item = self.get_item_det(args['item_code'])
+		item = self.get_item_det(args["item_code"])
 
-		args['bom_no'] = args['bom_no'] or item and cstr(item['default_bom']) or ''
-		args['transfer_for_manufacture'] = (cstr(args.get('include_item_in_manufacturing', '')) or
-			item and item.include_item_in_manufacturing or 0)
+		args["bom_no"] = args["bom_no"] or item and cstr(item["default_bom"]) or ""
+		args["transfer_for_manufacture"] = (
+			cstr(args.get("include_item_in_manufacturing", ""))
+			or item
+			and item.include_item_in_manufacturing
+			or 0
+		)
 		args.update(item)
 
 		rate = self.get_rm_rate(args)
 		ret_item = {
-			 'item_name'	: item and args['item_name'] or '',
-			 'description'  : item and args['description'] or '',
-			 'image'		: item and args['image'] or '',
-			 'stock_uom'	: item and args['stock_uom'] or '',
-			 'uom'			: item and args['stock_uom'] or '',
- 			 'conversion_factor': 1,
-			 'bom_no'		: args['bom_no'],
-			 'rate'			: rate,
-			 'qty'			: args.get("qty") or args.get("stock_qty") or 1,
-			 'stock_qty'	: args.get("qty") or args.get("stock_qty") or 1,
-			 'base_rate'	: flt(rate) * (flt(self.conversion_rate) or 1),
-			 'include_item_in_manufacturing': cint(args.get('transfer_for_manufacture')),
-			 'sourced_by_supplier'		: args.get('sourced_by_supplier', 0)
+			"item_name": item and args["item_name"] or "",
+			"description": item and args["description"] or "",
+			"image": item and args["image"] or "",
+			"stock_uom": item and args["stock_uom"] or "",
+			"uom": item and args["stock_uom"] or "",
+			"conversion_factor": 1,
+			"bom_no": args["bom_no"],
+			"rate": rate,
+			"qty": args.get("qty") or args.get("stock_qty") or 1,
+			"stock_qty": args.get("qty") or args.get("stock_qty") or 1,
+			"base_rate": flt(rate) * (flt(self.conversion_rate) or 1),
+			"include_item_in_manufacturing": cint(args.get("transfer_for_manufacture")),
+			"sourced_by_supplier": args.get("sourced_by_supplier", 0),
 		}
 
-		if args.get('do_not_explode'):
-			ret_item['bom_no'] = ''
+		if args.get("do_not_explode"):
+			ret_item["bom_no"] = ""
 
 		return ret_item
 
 	def validate_bom_currency(self, item):
-		if item.get('bom_no') and frappe.db.get_value('BOM', item.get('bom_no'), 'currency') != self.currency:
-			frappe.throw(_("Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}")
-				.format(item.idx, item.bom_no, self.currency))
+		if (
+			item.get("bom_no")
+			and frappe.db.get_value("BOM", item.get("bom_no"), "currency") != self.currency
+		):
+			frappe.throw(
+				_("Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}").format(
+					item.idx, item.bom_no, self.currency
+				)
+			)
 
 	def get_rm_rate(self, arg):
-		"""	Get raw material rate as per selected method, if bom exists takes bom cost """
+		"""Get raw material rate as per selected method, if bom exists takes bom cost"""
 		rate = 0
 		if not self.rm_cost_as_per:
 			self.rm_cost_as_per = "Valuation Rate"
 
-		if arg.get('scrap_items'):
+		if arg.get("scrap_items"):
 			rate = get_valuation_rate(arg)
 		elif arg:
-			#Customer Provided parts and Supplier sourced parts will have zero rate
-			if not frappe.db.get_value('Item', arg["item_code"], 'is_customer_provided_item') and not arg.get('sourced_by_supplier'):
-				if arg.get('bom_no') and self.set_rate_of_sub_assembly_item_based_on_bom:
-					rate = flt(self.get_bom_unitcost(arg['bom_no'])) * (arg.get("conversion_factor") or 1)
+			# Customer Provided parts and Supplier sourced parts will have zero rate
+			if not frappe.db.get_value(
+				"Item", arg["item_code"], "is_customer_provided_item"
+			) and not arg.get("sourced_by_supplier"):
+				if arg.get("bom_no") and self.set_rate_of_sub_assembly_item_based_on_bom:
+					rate = flt(self.get_bom_unitcost(arg["bom_no"])) * (arg.get("conversion_factor") or 1)
 				else:
 					rate = get_bom_item_rate(arg, self)
 
 					if not rate:
 						if self.rm_cost_as_per == "Price List":
-							frappe.msgprint(_("Price not found for item {0} in price list {1}")
-								.format(arg["item_code"], self.buying_price_list), alert=True)
+							frappe.msgprint(
+								_("Price not found for item {0} in price list {1}").format(
+									arg["item_code"], self.buying_price_list
+								),
+								alert=True,
+							)
 						else:
-							frappe.msgprint(_("{0} not found for item {1}")
-								.format(self.rm_cost_as_per, arg["item_code"]), alert=True)
+							frappe.msgprint(
+								_("{0} not found for item {1}").format(self.rm_cost_as_per, arg["item_code"]), alert=True
+							)
 		return flt(rate) * flt(self.plc_conversion_rate or 1) / (self.conversion_rate or 1)
 
 	@frappe.whitelist()
-	def update_cost(self, update_parent=True, from_child_bom=False, update_hour_rate = True, save=True):
+	def update_cost(self, update_parent=True, from_child_bom=False, update_hour_rate=True, save=True):
 		if self.docstatus == 2:
 			return
 
@@ -350,16 +387,18 @@
 			if not d.item_code:
 				continue
 
-			rate = self.get_rm_rate({
-				"company": self.company,
-				"item_code": d.item_code,
-				"bom_no": d.bom_no,
-				"qty": d.qty,
-				"uom": d.uom,
-				"stock_uom": d.stock_uom,
-				"conversion_factor": d.conversion_factor,
-				"sourced_by_supplier": d.sourced_by_supplier
-			})
+			rate = self.get_rm_rate(
+				{
+					"company": self.company,
+					"item_code": d.item_code,
+					"bom_no": d.bom_no,
+					"qty": d.qty,
+					"uom": d.uom,
+					"stock_uom": d.stock_uom,
+					"conversion_factor": d.conversion_factor,
+					"sourced_by_supplier": d.sourced_by_supplier,
+				}
+			)
 
 			if rate:
 				d.rate = rate
@@ -380,8 +419,11 @@
 
 		# update parent BOMs
 		if self.total_cost != existing_bom_cost and update_parent:
-			parent_boms = frappe.db.sql_list("""select distinct parent from `tabBOM Item`
-				where bom_no = %s and docstatus=1 and parenttype='BOM'""", self.name)
+			parent_boms = frappe.db.sql_list(
+				"""select distinct parent from `tabBOM Item`
+				where bom_no = %s and docstatus=1 and parenttype='BOM'""",
+				self.name,
+			)
 
 			for bom in parent_boms:
 				frappe.get_doc("BOM", bom).update_cost(from_child_bom=True)
@@ -393,45 +435,54 @@
 		if self.total_cost:
 			cost = self.total_cost / self.quantity
 
-			frappe.db.sql("""update `tabBOM Item` set rate=%s, amount=stock_qty*%s
+			frappe.db.sql(
+				"""update `tabBOM Item` set rate=%s, amount=stock_qty*%s
 				where bom_no = %s and docstatus < 2 and parenttype='BOM'""",
-				(cost, cost, self.name))
+				(cost, cost, self.name),
+			)
 
 	def get_bom_unitcost(self, bom_no):
-		bom = frappe.db.sql("""select name, base_total_cost/quantity as unit_cost from `tabBOM`
-			where is_active = 1 and name = %s""", bom_no, as_dict=1)
-		return bom and bom[0]['unit_cost'] or 0
+		bom = frappe.db.sql(
+			"""select name, base_total_cost/quantity as unit_cost from `tabBOM`
+			where is_active = 1 and name = %s""",
+			bom_no,
+			as_dict=1,
+		)
+		return bom and bom[0]["unit_cost"] or 0
 
 	def manage_default_bom(self):
-		""" Uncheck others if current one is selected as default or
-			check the current one as default if it the only bom for the selected item,
-			update default bom in item master
+		"""Uncheck others if current one is selected as default or
+		check the current one as default if it the only bom for the selected item,
+		update default bom in item master
 		"""
 		if self.is_default and self.is_active:
 			from frappe.model.utils import set_default
+
 			set_default(self, "item")
 			item = frappe.get_doc("Item", self.item)
 			if item.default_bom != self.name:
-				frappe.db.set_value('Item', self.item, 'default_bom', self.name)
-		elif not frappe.db.exists(dict(doctype='BOM', docstatus=1, item=self.item, is_default=1)) \
-			and self.is_active:
+				frappe.db.set_value("Item", self.item, "default_bom", self.name)
+		elif (
+			not frappe.db.exists(dict(doctype="BOM", docstatus=1, item=self.item, is_default=1))
+			and self.is_active
+		):
 			frappe.db.set(self, "is_default", 1)
 		else:
 			frappe.db.set(self, "is_default", 0)
 			item = frappe.get_doc("Item", self.item)
 			if item.default_bom == self.name:
-				frappe.db.set_value('Item', self.item, 'default_bom', None)
+				frappe.db.set_value("Item", self.item, "default_bom", None)
 
 	def clear_operations(self):
 		if not self.with_operations:
-			self.set('operations', [])
+			self.set("operations", [])
 
 	def clear_inspection(self):
 		if not self.inspection_required:
 			self.quality_inspection_template = None
 
 	def validate_main_item(self):
-		""" Validate main FG item"""
+		"""Validate main FG item"""
 		item = self.get_item_det(self.item)
 		if not item:
 			frappe.throw(_("Item {0} does not exist in the system or has expired").format(self.item))
@@ -439,30 +490,34 @@
 			ret = frappe.db.get_value("Item", self.item, ["description", "stock_uom", "item_name"])
 			self.description = ret[0]
 			self.uom = ret[1]
-			self.item_name= ret[2]
+			self.item_name = ret[2]
 
 		if not self.quantity:
 			frappe.throw(_("Quantity should be greater than 0"))
 
 	def validate_currency(self):
-		if self.rm_cost_as_per == 'Price List':
-			price_list_currency = frappe.db.get_value('Price List', self.buying_price_list, 'currency')
+		if self.rm_cost_as_per == "Price List":
+			price_list_currency = frappe.db.get_value("Price List", self.buying_price_list, "currency")
 			if price_list_currency not in (self.currency, self.company_currency()):
-				frappe.throw(_("Currency of the price list {0} must be {1} or {2}")
-					.format(self.buying_price_list, self.currency, self.company_currency()))
+				frappe.throw(
+					_("Currency of the price list {0} must be {1} or {2}").format(
+						self.buying_price_list, self.currency, self.company_currency()
+					)
+				)
 
 	def update_stock_qty(self):
-		for m in self.get('items'):
+		for m in self.get("items"):
 			if not m.conversion_factor:
-				m.conversion_factor = flt(get_conversion_factor(m.item_code, m.uom)['conversion_factor'])
+				m.conversion_factor = flt(get_conversion_factor(m.item_code, m.uom)["conversion_factor"])
 			if m.uom and m.qty:
-				m.stock_qty = flt(m.conversion_factor)*flt(m.qty)
+				m.stock_qty = flt(m.conversion_factor) * flt(m.qty)
 			if not m.uom and m.stock_uom:
 				m.uom = m.stock_uom
 				m.qty = m.stock_qty
 
 	def validate_uom_is_interger(self):
 		from erpnext.utilities.transaction_base import validate_uom_is_integer
+
 		validate_uom_is_integer(self, "uom", "qty", "BOM Item")
 		validate_uom_is_integer(self, "stock_uom", "stock_qty", "BOM Item")
 
@@ -470,23 +525,26 @@
 		if self.currency == self.company_currency():
 			self.conversion_rate = 1
 		elif self.conversion_rate == 1 or flt(self.conversion_rate) <= 0:
-			self.conversion_rate = get_exchange_rate(self.currency, self.company_currency(), args="for_buying")
+			self.conversion_rate = get_exchange_rate(
+				self.currency, self.company_currency(), args="for_buying"
+			)
 
 	def set_plc_conversion_rate(self):
 		if self.rm_cost_as_per in ["Valuation Rate", "Last Purchase Rate"]:
 			self.plc_conversion_rate = 1
 		elif not self.plc_conversion_rate and self.price_list_currency:
-			self.plc_conversion_rate = get_exchange_rate(self.price_list_currency,
-				self.company_currency(), args="for_buying")
+			self.plc_conversion_rate = get_exchange_rate(
+				self.price_list_currency, self.company_currency(), args="for_buying"
+			)
 
 	def validate_materials(self):
-		""" Validate raw material entries """
+		"""Validate raw material entries"""
 
-		if not self.get('items'):
+		if not self.get("items"):
 			frappe.throw(_("Raw Materials cannot be blank."))
 
 		check_list = []
-		for m in self.get('items'):
+		for m in self.get("items"):
 			if m.bom_no:
 				validate_bom_no(m.item_code, m.bom_no)
 			if flt(m.qty) <= 0:
@@ -494,13 +552,20 @@
 			check_list.append(m)
 
 	def check_recursion(self, bom_list=None):
-		""" Check whether recursion occurs in any bom"""
+		"""Check whether recursion occurs in any bom"""
+
 		def _throw_error(bom_name):
 			frappe.throw(_("BOM recursion: {0} cannot be parent or child of {0}").format(bom_name))
 
 		bom_list = self.traverse_tree()
-		child_items = frappe.get_all('BOM Item', fields=["bom_no", "item_code"],
-			filters={'parent': ('in', bom_list), 'parenttype': 'BOM'}) or []
+		child_items = (
+			frappe.get_all(
+				"BOM Item",
+				fields=["bom_no", "item_code"],
+				filters={"parent": ("in", bom_list), "parenttype": "BOM"},
+			)
+			or []
+		)
 
 		child_bom = {d.bom_no for d in child_items}
 		child_items_codes = {d.item_code for d in child_items}
@@ -511,19 +576,26 @@
 		if self.item in child_items_codes:
 			_throw_error(self.item)
 
-		bom_nos = frappe.get_all('BOM Item', fields=["parent"],
-			filters={'bom_no': self.name, 'parenttype': 'BOM'}) or []
+		bom_nos = (
+			frappe.get_all(
+				"BOM Item", fields=["parent"], filters={"bom_no": self.name, "parenttype": "BOM"}
+			)
+			or []
+		)
 
 		if self.name in {d.parent for d in bom_nos}:
 			_throw_error(self.name)
 
 	def traverse_tree(self, bom_list=None):
 		def _get_children(bom_no):
-			children = frappe.cache().hget('bom_children', bom_no)
+			children = frappe.cache().hget("bom_children", bom_no)
 			if children is None:
-				children = frappe.db.sql_list("""SELECT `bom_no` FROM `tabBOM Item`
-					WHERE `parent`=%s AND `bom_no`!='' AND `parenttype`='BOM'""", bom_no)
-				frappe.cache().hset('bom_children', bom_no, children)
+				children = frappe.db.sql_list(
+					"""SELECT `bom_no` FROM `tabBOM Item`
+					WHERE `parent`=%s AND `bom_no`!='' AND `parenttype`='BOM'""",
+					bom_no,
+				)
+				frappe.cache().hset("bom_children", bom_no, children)
 			return children
 
 		count = 0
@@ -533,7 +605,7 @@
 		if self.name not in bom_list:
 			bom_list.append(self.name)
 
-		while(count < len(bom_list)):
+		while count < len(bom_list):
 			for child_bom in _get_children(bom_list[count]):
 				if child_bom not in bom_list:
 					bom_list.append(child_bom)
@@ -541,19 +613,21 @@
 		bom_list.reverse()
 		return bom_list
 
-	def calculate_cost(self, update_hour_rate = False):
+	def calculate_cost(self, update_hour_rate=False):
 		"""Calculate bom totals"""
 		self.calculate_op_cost(update_hour_rate)
 		self.calculate_rm_cost()
 		self.calculate_sm_cost()
 		self.total_cost = self.operating_cost + self.raw_material_cost - self.scrap_material_cost
-		self.base_total_cost = self.base_operating_cost + self.base_raw_material_cost - self.base_scrap_material_cost
+		self.base_total_cost = (
+			self.base_operating_cost + self.base_raw_material_cost - self.base_scrap_material_cost
+		)
 
-	def calculate_op_cost(self, update_hour_rate = False):
+	def calculate_op_cost(self, update_hour_rate=False):
 		"""Update workstation rate and calculates totals"""
 		self.operating_cost = 0
 		self.base_operating_cost = 0
-		for d in self.get('operations'):
+		for d in self.get("operations"):
 			if d.workstation:
 				self.update_rate_and_time(d, update_hour_rate)
 
@@ -566,13 +640,14 @@
 			self.operating_cost += flt(operating_cost)
 			self.base_operating_cost += flt(base_operating_cost)
 
-	def update_rate_and_time(self, row, update_hour_rate = False):
+	def update_rate_and_time(self, row, update_hour_rate=False):
 		if not row.hour_rate or update_hour_rate:
 			hour_rate = flt(frappe.get_cached_value("Workstation", row.workstation, "hour_rate"))
 
 			if hour_rate:
-				row.hour_rate = (hour_rate / flt(self.conversion_rate)
-					if self.conversion_rate and hour_rate else hour_rate)
+				row.hour_rate = (
+					hour_rate / flt(self.conversion_rate) if self.conversion_rate and hour_rate else hour_rate
+				)
 
 		if row.hour_rate and row.time_in_mins:
 			row.base_hour_rate = flt(row.hour_rate) * flt(self.conversion_rate)
@@ -589,12 +664,13 @@
 		total_rm_cost = 0
 		base_total_rm_cost = 0
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			d.base_rate = flt(d.rate) * flt(self.conversion_rate)
 			d.amount = flt(d.rate, d.precision("rate")) * flt(d.qty, d.precision("qty"))
 			d.base_amount = d.amount * flt(self.conversion_rate)
-			d.qty_consumed_per_unit = flt(d.stock_qty, d.precision("stock_qty")) \
-				/ flt(self.quantity, self.precision("quantity"))
+			d.qty_consumed_per_unit = flt(d.stock_qty, d.precision("stock_qty")) / flt(
+				self.quantity, self.precision("quantity")
+			)
 
 			total_rm_cost += d.amount
 			base_total_rm_cost += d.base_amount
@@ -607,10 +683,14 @@
 		total_sm_cost = 0
 		base_total_sm_cost = 0
 
-		for d in self.get('scrap_items'):
-			d.base_rate = flt(d.rate, d.precision("rate")) * flt(self.conversion_rate, self.precision("conversion_rate"))
+		for d in self.get("scrap_items"):
+			d.base_rate = flt(d.rate, d.precision("rate")) * flt(
+				self.conversion_rate, self.precision("conversion_rate")
+			)
 			d.amount = flt(d.rate, d.precision("rate")) * flt(d.stock_qty, d.precision("stock_qty"))
-			d.base_amount = flt(d.amount, d.precision("amount")) * flt(self.conversion_rate, self.precision("conversion_rate"))
+			d.base_amount = flt(d.amount, d.precision("amount")) * flt(
+				self.conversion_rate, self.precision("conversion_rate")
+			)
 			total_sm_cost += d.amount
 			base_total_sm_cost += d.base_amount
 
@@ -619,37 +699,42 @@
 
 	def update_new_bom(self, old_bom, new_bom, rate):
 		for d in self.get("items"):
-			if d.bom_no != old_bom: continue
+			if d.bom_no != old_bom:
+				continue
 
 			d.bom_no = new_bom
 			d.rate = rate
 			d.amount = (d.stock_qty or d.qty) * rate
 
 	def update_exploded_items(self, save=True):
-		""" Update Flat BOM, following will be correct data"""
+		"""Update Flat BOM, following will be correct data"""
 		self.get_exploded_items()
 		self.add_exploded_items(save=save)
 
 	def get_exploded_items(self):
-		""" Get all raw materials including items from child bom"""
+		"""Get all raw materials including items from child bom"""
 		self.cur_exploded_items = {}
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.bom_no:
 				self.get_child_exploded_items(d.bom_no, d.stock_qty)
 			elif d.item_code:
-				self.add_to_cur_exploded_items(frappe._dict({
-					'item_code'		: d.item_code,
-					'item_name'		: d.item_name,
-					'operation'		: d.operation,
-					'source_warehouse': d.source_warehouse,
-					'description'	: d.description,
-					'image'			: d.image,
-					'stock_uom'		: d.stock_uom,
-					'stock_qty'		: flt(d.stock_qty),
-					'rate'			: flt(d.base_rate) / (flt(d.conversion_factor) or 1.0),
-					'include_item_in_manufacturing': d.include_item_in_manufacturing,
-					'sourced_by_supplier': d.sourced_by_supplier
-				}))
+				self.add_to_cur_exploded_items(
+					frappe._dict(
+						{
+							"item_code": d.item_code,
+							"item_name": d.item_name,
+							"operation": d.operation,
+							"source_warehouse": d.source_warehouse,
+							"description": d.description,
+							"image": d.image,
+							"stock_uom": d.stock_uom,
+							"stock_qty": flt(d.stock_qty),
+							"rate": flt(d.base_rate) / (flt(d.conversion_factor) or 1.0),
+							"include_item_in_manufacturing": d.include_item_in_manufacturing,
+							"sourced_by_supplier": d.sourced_by_supplier,
+						}
+					)
+				)
 
 	def company_currency(self):
 		return erpnext.get_company_currency(self.company)
@@ -661,9 +746,10 @@
 			self.cur_exploded_items[args.item_code] = args
 
 	def get_child_exploded_items(self, bom_no, stock_qty):
-		""" Add all items from Flat BOM of child BOM"""
+		"""Add all items from Flat BOM of child BOM"""
 		# Did not use qty_consumed_per_unit in the query, as it leads to rounding loss
-		child_fb_items = frappe.db.sql("""
+		child_fb_items = frappe.db.sql(
+			"""
 			SELECT
 				bom_item.item_code,
 				bom_item.item_name,
@@ -681,31 +767,38 @@
 				bom_item.parent = bom.name
 				AND bom.name = %s
 				AND bom.docstatus = 1
-		""", bom_no, as_dict = 1)
+		""",
+			bom_no,
+			as_dict=1,
+		)
 
 		for d in child_fb_items:
-			self.add_to_cur_exploded_items(frappe._dict({
-				'item_code'				: d['item_code'],
-				'item_name'				: d['item_name'],
-				'source_warehouse'		: d['source_warehouse'],
-				'operation'				: d['operation'],
-				'description'			: d['description'],
-				'stock_uom'				: d['stock_uom'],
-				'stock_qty'				: d['qty_consumed_per_unit'] * stock_qty,
-				'rate'					: flt(d['rate']),
-				'include_item_in_manufacturing': d.get('include_item_in_manufacturing', 0),
-				'sourced_by_supplier': d.get('sourced_by_supplier', 0)
-			}))
+			self.add_to_cur_exploded_items(
+				frappe._dict(
+					{
+						"item_code": d["item_code"],
+						"item_name": d["item_name"],
+						"source_warehouse": d["source_warehouse"],
+						"operation": d["operation"],
+						"description": d["description"],
+						"stock_uom": d["stock_uom"],
+						"stock_qty": d["qty_consumed_per_unit"] * stock_qty,
+						"rate": flt(d["rate"]),
+						"include_item_in_manufacturing": d.get("include_item_in_manufacturing", 0),
+						"sourced_by_supplier": d.get("sourced_by_supplier", 0),
+					}
+				)
+			)
 
 	def add_exploded_items(self, save=True):
 		"Add items to Flat BOM table"
-		self.set('exploded_items', [])
+		self.set("exploded_items", [])
 
 		if save:
 			frappe.db.sql("""delete from `tabBOM Explosion Item` where parent=%s""", self.name)
 
 		for d in sorted(self.cur_exploded_items, key=itemgetter(0)):
-			ch = self.append('exploded_items', {})
+			ch = self.append("exploded_items", {})
 			for i in self.cur_exploded_items[d].keys():
 				ch.set(i, self.cur_exploded_items[d][i])
 			ch.amount = flt(ch.stock_qty) * flt(ch.rate)
@@ -717,10 +810,13 @@
 
 	def validate_bom_links(self):
 		if not self.is_active:
-			act_pbom = frappe.db.sql("""select distinct bom_item.parent from `tabBOM Item` bom_item
+			act_pbom = frappe.db.sql(
+				"""select distinct bom_item.parent from `tabBOM Item` bom_item
 				where bom_item.bom_no = %s and bom_item.docstatus = 1 and bom_item.parenttype='BOM'
 				and exists (select * from `tabBOM` where name = bom_item.parent
-					and docstatus = 1 and is_active = 1)""", self.name)
+					and docstatus = 1 and is_active = 1)""",
+				self.name,
+			)
 
 			if act_pbom and act_pbom[0][0]:
 				frappe.throw(_("Cannot deactivate or cancel BOM as it is linked with other BOMs"))
@@ -729,20 +825,23 @@
 		if not self.with_operations:
 			self.transfer_material_against = "Work Order"
 		if not self.transfer_material_against and not self.is_new():
-			frappe.throw(_("Setting {} is required").format(self.meta.get_label("transfer_material_against")), title=_("Missing value"))
+			frappe.throw(
+				_("Setting {} is required").format(self.meta.get_label("transfer_material_against")),
+				title=_("Missing value"),
+			)
 
 	def set_routing_operations(self):
 		if self.routing and self.with_operations and not self.operations:
 			self.get_routing()
 
 	def validate_operations(self):
-		if self.with_operations and not self.get('operations') and self.docstatus == 1:
+		if self.with_operations and not self.get("operations") and self.docstatus == 1:
 			frappe.throw(_("Operations cannot be left blank"))
 
 		if self.with_operations:
 			for d in self.operations:
 				if not d.description:
-					d.description = frappe.db.get_value('Operation', d.operation, 'description')
+					d.description = frappe.db.get_value("Operation", d.operation, "description")
 				if not d.batch_size or d.batch_size <= 0:
 					d.batch_size = 1
 
@@ -754,64 +853,75 @@
 		for item in self.scrap_items:
 			msg = ""
 			if item.item_code == self.item and not item.is_process_loss:
-				msg = _('Scrap/Loss Item: {0} should have Is Process Loss checked as it is the same as the item to be manufactured or repacked.') \
-					.format(frappe.bold(item.item_code))
+				msg = _(
+					"Scrap/Loss Item: {0} should have Is Process Loss checked as it is the same as the item to be manufactured or repacked."
+				).format(frappe.bold(item.item_code))
 			elif item.item_code != self.item and item.is_process_loss:
-				msg = _('Scrap/Loss Item: {0} should not have Is Process Loss checked as it is different from  the item to be manufactured or repacked') \
-					.format(frappe.bold(item.item_code))
+				msg = _(
+					"Scrap/Loss Item: {0} should not have Is Process Loss checked as it is different from  the item to be manufactured or repacked"
+				).format(frappe.bold(item.item_code))
 
 			must_be_whole_number = frappe.get_value("UOM", item.stock_uom, "must_be_whole_number")
 			if item.is_process_loss and must_be_whole_number:
-				msg = _("Item: {0} with Stock UOM: {1} cannot be a Scrap/Loss Item as {1} is a whole UOM.") \
-					.format(frappe.bold(item.item_code), frappe.bold(item.stock_uom))
+				msg = _(
+					"Item: {0} with Stock UOM: {1} cannot be a Scrap/Loss Item as {1} is a whole UOM."
+				).format(frappe.bold(item.item_code), frappe.bold(item.stock_uom))
 
 			if item.is_process_loss and (item.stock_qty >= self.quantity):
-				msg = _("Scrap/Loss Item: {0} should have Qty less than finished goods Quantity.") \
-					.format(frappe.bold(item.item_code))
+				msg = _("Scrap/Loss Item: {0} should have Qty less than finished goods Quantity.").format(
+					frappe.bold(item.item_code)
+				)
 
 			if item.is_process_loss and (item.rate > 0):
-				msg = _("Scrap/Loss Item: {0} should have Rate set to 0 because Is Process Loss is checked.") \
-					.format(frappe.bold(item.item_code))
+				msg = _(
+					"Scrap/Loss Item: {0} should have Rate set to 0 because Is Process Loss is checked."
+				).format(frappe.bold(item.item_code))
 
 			if msg:
 				frappe.throw(msg, title=_("Note"))
 
+
 def get_bom_item_rate(args, bom_doc):
-	if bom_doc.rm_cost_as_per == 'Valuation Rate':
+	if bom_doc.rm_cost_as_per == "Valuation Rate":
 		rate = get_valuation_rate(args) * (args.get("conversion_factor") or 1)
-	elif bom_doc.rm_cost_as_per == 'Last Purchase Rate':
-		rate = (flt(args.get('last_purchase_rate'))
-			or flt(frappe.db.get_value("Item", args['item_code'], "last_purchase_rate"))) \
-				* (args.get("conversion_factor") or 1)
+	elif bom_doc.rm_cost_as_per == "Last Purchase Rate":
+		rate = (
+			flt(args.get("last_purchase_rate"))
+			or flt(frappe.db.get_value("Item", args["item_code"], "last_purchase_rate"))
+		) * (args.get("conversion_factor") or 1)
 	elif bom_doc.rm_cost_as_per == "Price List":
 		if not bom_doc.buying_price_list:
 			frappe.throw(_("Please select Price List"))
-		bom_args = frappe._dict({
-			"doctype": "BOM",
-			"price_list": bom_doc.buying_price_list,
-			"qty": args.get("qty") or 1,
-			"uom": args.get("uom") or args.get("stock_uom"),
-			"stock_uom": args.get("stock_uom"),
-			"transaction_type": "buying",
-			"company": bom_doc.company,
-			"currency": bom_doc.currency,
-			"conversion_rate": 1, # Passed conversion rate as 1 purposefully, as conversion rate is applied at the end of the function
-			"conversion_factor": args.get("conversion_factor") or 1,
-			"plc_conversion_rate": 1,
-			"ignore_party": True,
-			"ignore_conversion_rate": True
-		})
+		bom_args = frappe._dict(
+			{
+				"doctype": "BOM",
+				"price_list": bom_doc.buying_price_list,
+				"qty": args.get("qty") or 1,
+				"uom": args.get("uom") or args.get("stock_uom"),
+				"stock_uom": args.get("stock_uom"),
+				"transaction_type": "buying",
+				"company": bom_doc.company,
+				"currency": bom_doc.currency,
+				"conversion_rate": 1,  # Passed conversion rate as 1 purposefully, as conversion rate is applied at the end of the function
+				"conversion_factor": args.get("conversion_factor") or 1,
+				"plc_conversion_rate": 1,
+				"ignore_party": True,
+				"ignore_conversion_rate": True,
+			}
+		)
 		item_doc = frappe.get_cached_doc("Item", args.get("item_code"))
 		price_list_data = get_price_list_rate(bom_args, item_doc)
 		rate = price_list_data.price_list_rate
 
 	return flt(rate)
 
+
 def get_valuation_rate(args):
-	""" Get weighted average of valuation rate from all warehouses """
+	"""Get weighted average of valuation rate from all warehouses"""
 
 	total_qty, total_value, valuation_rate = 0.0, 0.0, 0.0
-	item_bins = frappe.db.sql("""
+	item_bins = frappe.db.sql(
+		"""
 		select
 			bin.actual_qty, bin.stock_value
 		from
@@ -820,33 +930,48 @@
 			bin.item_code=%(item)s
 			and bin.warehouse = warehouse.name
 			and warehouse.company=%(company)s""",
-		{"item": args['item_code'], "company": args['company']}, as_dict=1)
+		{"item": args["item_code"], "company": args["company"]},
+		as_dict=1,
+	)
 
 	for d in item_bins:
 		total_qty += flt(d.actual_qty)
 		total_value += flt(d.stock_value)
 
 	if total_qty:
-		valuation_rate =  total_value / total_qty
+		valuation_rate = total_value / total_qty
 
 	if valuation_rate <= 0:
-		last_valuation_rate = frappe.db.sql("""select valuation_rate
+		last_valuation_rate = frappe.db.sql(
+			"""select valuation_rate
 			from `tabStock Ledger Entry`
 			where item_code = %s and valuation_rate > 0 and is_cancelled = 0
-			order by posting_date desc, posting_time desc, creation desc limit 1""", args['item_code'])
+			order by posting_date desc, posting_time desc, creation desc limit 1""",
+			args["item_code"],
+		)
 
 		valuation_rate = flt(last_valuation_rate[0][0]) if last_valuation_rate else 0
 
 	if not valuation_rate:
-		valuation_rate = frappe.db.get_value("Item", args['item_code'], "valuation_rate")
+		valuation_rate = frappe.db.get_value("Item", args["item_code"], "valuation_rate")
 
 	return flt(valuation_rate)
 
+
 def get_list_context(context):
 	context.title = _("Bill of Materials")
 	# context.introduction = _('Boms')
 
-def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1, fetch_scrap_items=0, include_non_stock_items=False, fetch_qty_in_stock_uom=True):
+
+def get_bom_items_as_dict(
+	bom,
+	company,
+	qty=1,
+	fetch_exploded=1,
+	fetch_scrap_items=0,
+	include_non_stock_items=False,
+	fetch_qty_in_stock_uom=True,
+):
 	item_dict = {}
 
 	# Did not use qty_consumed_per_unit in the query, as it leads to rounding loss
@@ -883,30 +1008,40 @@
 
 	is_stock_item = 0 if include_non_stock_items else 1
 	if cint(fetch_exploded):
-		query = query.format(table="BOM Explosion Item",
+		query = query.format(
+			table="BOM Explosion Item",
 			where_conditions="",
 			is_stock_item=is_stock_item,
 			qty_field="stock_qty",
-			select_columns = """, bom_item.source_warehouse, bom_item.operation,
+			select_columns=""", bom_item.source_warehouse, bom_item.operation,
 				bom_item.include_item_in_manufacturing, bom_item.description, bom_item.rate, bom_item.sourced_by_supplier,
-				(Select idx from `tabBOM Item` where item_code = bom_item.item_code and parent = %(parent)s limit 1) as idx""")
-
-		items = frappe.db.sql(query, { "parent": bom, "qty": qty, "bom": bom, "company": company }, as_dict=True)
-	elif fetch_scrap_items:
-		query = query.format(
-			table="BOM Scrap Item", where_conditions="",
-			select_columns=", bom_item.idx, item.description, is_process_loss",
-			is_stock_item=is_stock_item, qty_field="stock_qty"
+				(Select idx from `tabBOM Item` where item_code = bom_item.item_code and parent = %(parent)s limit 1) as idx""",
 		)
 
-		items = frappe.db.sql(query, { "qty": qty, "bom": bom, "company": company }, as_dict=True)
+		items = frappe.db.sql(
+			query, {"parent": bom, "qty": qty, "bom": bom, "company": company}, as_dict=True
+		)
+	elif fetch_scrap_items:
+		query = query.format(
+			table="BOM Scrap Item",
+			where_conditions="",
+			select_columns=", bom_item.idx, item.description, is_process_loss",
+			is_stock_item=is_stock_item,
+			qty_field="stock_qty",
+		)
+
+		items = frappe.db.sql(query, {"qty": qty, "bom": bom, "company": company}, as_dict=True)
 	else:
-		query = query.format(table="BOM Item", where_conditions="", is_stock_item=is_stock_item,
+		query = query.format(
+			table="BOM Item",
+			where_conditions="",
+			is_stock_item=is_stock_item,
 			qty_field="stock_qty" if fetch_qty_in_stock_uom else "qty",
-			select_columns = """, bom_item.uom, bom_item.conversion_factor, bom_item.source_warehouse,
+			select_columns=""", bom_item.uom, bom_item.conversion_factor, bom_item.source_warehouse,
 				bom_item.idx, bom_item.operation, bom_item.include_item_in_manufacturing, bom_item.sourced_by_supplier,
-				bom_item.description, bom_item.base_rate as rate """)
-		items = frappe.db.sql(query, { "qty": qty, "bom": bom, "company": company }, as_dict=True)
+				bom_item.description, bom_item.base_rate as rate """,
+		)
+		items = frappe.db.sql(query, {"qty": qty, "bom": bom, "company": company}, as_dict=True)
 
 	for item in items:
 		if item.item_code in item_dict:
@@ -915,21 +1050,28 @@
 			item_dict[item.item_code] = item
 
 	for item, item_details in item_dict.items():
-		for d in [["Account", "expense_account", "stock_adjustment_account"],
-			["Cost Center", "cost_center", "cost_center"], ["Warehouse", "default_warehouse", ""]]:
-				company_in_record = frappe.db.get_value(d[0], item_details.get(d[1]), "company")
-				if not item_details.get(d[1]) or (company_in_record and company != company_in_record):
-					item_dict[item][d[1]] = frappe.get_cached_value('Company',  company,  d[2]) if d[2] else None
+		for d in [
+			["Account", "expense_account", "stock_adjustment_account"],
+			["Cost Center", "cost_center", "cost_center"],
+			["Warehouse", "default_warehouse", ""],
+		]:
+			company_in_record = frappe.db.get_value(d[0], item_details.get(d[1]), "company")
+			if not item_details.get(d[1]) or (company_in_record and company != company_in_record):
+				item_dict[item][d[1]] = frappe.get_cached_value("Company", company, d[2]) if d[2] else None
 
 	return item_dict
 
+
 @frappe.whitelist()
 def get_bom_items(bom, company, qty=1, fetch_exploded=1):
-	items = get_bom_items_as_dict(bom, company, qty, fetch_exploded, include_non_stock_items=True).values()
+	items = get_bom_items_as_dict(
+		bom, company, qty, fetch_exploded, include_non_stock_items=True
+	).values()
 	items = list(items)
-	items.sort(key = functools.cmp_to_key(lambda a, b: a.item_code > b.item_code and 1 or -1))
+	items.sort(key=functools.cmp_to_key(lambda a, b: a.item_code > b.item_code and 1 or -1))
 	return items
 
+
 def validate_bom_no(item, bom_no):
 	"""Validate BOM No of sub-contracted items"""
 	bom = frappe.get_doc("BOM", bom_no)
@@ -941,21 +1083,24 @@
 	if item:
 		rm_item_exists = False
 		for d in bom.items:
-			if (d.item_code.lower() == item.lower()):
+			if d.item_code.lower() == item.lower():
 				rm_item_exists = True
 		for d in bom.scrap_items:
-			if (d.item_code.lower() == item.lower()):
+			if d.item_code.lower() == item.lower():
 				rm_item_exists = True
-		if bom.item.lower() == item.lower() or \
-			bom.item.lower() == cstr(frappe.db.get_value("Item", item, "variant_of")).lower():
-				rm_item_exists = True
+		if (
+			bom.item.lower() == item.lower()
+			or bom.item.lower() == cstr(frappe.db.get_value("Item", item, "variant_of")).lower()
+		):
+			rm_item_exists = True
 		if not rm_item_exists:
 			frappe.throw(_("BOM {0} does not belong to Item {1}").format(bom_no, item))
 
+
 @frappe.whitelist()
 def get_children(parent=None, is_root=False, **filters):
-	if not parent or parent=="BOM":
-		frappe.msgprint(_('Please select a BOM'))
+	if not parent or parent == "BOM":
+		frappe.msgprint(_("Please select a BOM"))
 		return
 
 	if parent:
@@ -965,38 +1110,45 @@
 		bom_doc = frappe.get_cached_doc("BOM", frappe.form_dict.parent)
 		frappe.has_permission("BOM", doc=bom_doc, throw=True)
 
-		bom_items = frappe.get_all('BOM Item',
-			fields=['item_code', 'bom_no as value', 'stock_qty'],
-			filters=[['parent', '=', frappe.form_dict.parent]],
-			order_by='idx')
+		bom_items = frappe.get_all(
+			"BOM Item",
+			fields=["item_code", "bom_no as value", "stock_qty"],
+			filters=[["parent", "=", frappe.form_dict.parent]],
+			order_by="idx",
+		)
 
-		item_names = tuple(d.get('item_code') for d in bom_items)
+		item_names = tuple(d.get("item_code") for d in bom_items)
 
-		items = frappe.get_list('Item',
-			fields=['image', 'description', 'name', 'stock_uom', 'item_name', 'is_sub_contracted_item'],
-			filters=[['name', 'in', item_names]]) # to get only required item dicts
+		items = frappe.get_list(
+			"Item",
+			fields=["image", "description", "name", "stock_uom", "item_name", "is_sub_contracted_item"],
+			filters=[["name", "in", item_names]],
+		)  # to get only required item dicts
 
 		for bom_item in bom_items:
 			# extend bom_item dict with respective item dict
 			bom_item.update(
 				# returns an item dict from items list which matches with item_code
-				next(item for item in items if item.get('name')
-					== bom_item.get('item_code'))
+				next(item for item in items if item.get("name") == bom_item.get("item_code"))
 			)
 
 			bom_item.parent_bom_qty = bom_doc.quantity
-			bom_item.expandable = 0 if bom_item.value in ('', None)  else 1
+			bom_item.expandable = 0 if bom_item.value in ("", None) else 1
 			bom_item.image = frappe.db.escape(bom_item.image)
 
 		return bom_items
 
+
 def get_boms_in_bottom_up_order(bom_no=None):
 	def _get_parent(bom_no):
-		return frappe.db.sql_list("""
+		return frappe.db.sql_list(
+			"""
 			select distinct bom_item.parent from `tabBOM Item` bom_item
 			where bom_item.bom_no = %s and bom_item.docstatus=1 and bom_item.parenttype='BOM'
 				and exists(select bom.name from `tabBOM` bom where bom.name=bom_item.parent and bom.is_active=1)
-		""", bom_no)
+		""",
+			bom_no,
+		)
 
 	count = 0
 	bom_list = []
@@ -1004,12 +1156,14 @@
 		bom_list.append(bom_no)
 	else:
 		# get all leaf BOMs
-		bom_list = frappe.db.sql_list("""select name from `tabBOM` bom
+		bom_list = frappe.db.sql_list(
+			"""select name from `tabBOM` bom
 			where docstatus=1 and is_active=1
 				and not exists(select bom_no from `tabBOM Item`
-					where parent=bom.name and ifnull(bom_no, '')!='')""")
+					where parent=bom.name and ifnull(bom_no, '')!='')"""
+		)
 
-	while(count < len(bom_list)):
+	while count < len(bom_list):
 		for child_bom in _get_parent(bom_list[count]):
 			if child_bom not in bom_list:
 				bom_list.append(child_bom)
@@ -1017,69 +1171,92 @@
 
 	return bom_list
 
+
 def add_additional_cost(stock_entry, work_order):
 	# Add non stock items cost in the additional cost
 	stock_entry.additional_costs = []
-	expenses_included_in_valuation = frappe.get_cached_value("Company", work_order.company,
-		"expenses_included_in_valuation")
+	expenses_included_in_valuation = frappe.get_cached_value(
+		"Company", work_order.company, "expenses_included_in_valuation"
+	)
 
 	add_non_stock_items_cost(stock_entry, work_order, expenses_included_in_valuation)
 	add_operations_cost(stock_entry, work_order, expenses_included_in_valuation)
 
+
 def add_non_stock_items_cost(stock_entry, work_order, expense_account):
-	bom = frappe.get_doc('BOM', work_order.bom_no)
-	table = 'exploded_items' if work_order.get('use_multi_level_bom') else 'items'
+	bom = frappe.get_doc("BOM", work_order.bom_no)
+	table = "exploded_items" if work_order.get("use_multi_level_bom") else "items"
 
 	items = {}
 	for d in bom.get(table):
 		items.setdefault(d.item_code, d.amount)
 
-	non_stock_items = frappe.get_all('Item',
-		fields="name", filters={'name': ('in', list(items.keys())), 'ifnull(is_stock_item, 0)': 0}, as_list=1)
+	non_stock_items = frappe.get_all(
+		"Item",
+		fields="name",
+		filters={"name": ("in", list(items.keys())), "ifnull(is_stock_item, 0)": 0},
+		as_list=1,
+	)
 
 	non_stock_items_cost = 0.0
 	for name in non_stock_items:
-		non_stock_items_cost += flt(items.get(name[0])) * flt(stock_entry.fg_completed_qty) / flt(bom.quantity)
+		non_stock_items_cost += (
+			flt(items.get(name[0])) * flt(stock_entry.fg_completed_qty) / flt(bom.quantity)
+		)
 
 	if non_stock_items_cost:
-		stock_entry.append('additional_costs', {
-			'expense_account': expense_account,
-			'description': _("Non stock items"),
-			'amount': non_stock_items_cost
-		})
+		stock_entry.append(
+			"additional_costs",
+			{
+				"expense_account": expense_account,
+				"description": _("Non stock items"),
+				"amount": non_stock_items_cost,
+			},
+		)
+
 
 def add_operations_cost(stock_entry, work_order=None, expense_account=None):
 	from erpnext.stock.doctype.stock_entry.stock_entry import get_operating_cost_per_unit
+
 	operating_cost_per_unit = get_operating_cost_per_unit(work_order, stock_entry.bom_no)
 
 	if operating_cost_per_unit:
-		stock_entry.append('additional_costs', {
-			"expense_account": expense_account,
-			"description": _("Operating Cost as per Work Order / BOM"),
-			"amount": operating_cost_per_unit * flt(stock_entry.fg_completed_qty)
-		})
+		stock_entry.append(
+			"additional_costs",
+			{
+				"expense_account": expense_account,
+				"description": _("Operating Cost as per Work Order / BOM"),
+				"amount": operating_cost_per_unit * flt(stock_entry.fg_completed_qty),
+			},
+		)
 
 	if work_order and work_order.additional_operating_cost and work_order.qty:
-		additional_operating_cost_per_unit = \
-			flt(work_order.additional_operating_cost) / flt(work_order.qty)
+		additional_operating_cost_per_unit = flt(work_order.additional_operating_cost) / flt(
+			work_order.qty
+		)
 
 		if additional_operating_cost_per_unit:
-			stock_entry.append('additional_costs', {
-				"expense_account": expense_account,
-				"description": "Additional Operating Cost",
-				"amount": additional_operating_cost_per_unit * flt(stock_entry.fg_completed_qty)
-			})
+			stock_entry.append(
+				"additional_costs",
+				{
+					"expense_account": expense_account,
+					"description": "Additional Operating Cost",
+					"amount": additional_operating_cost_per_unit * flt(stock_entry.fg_completed_qty),
+				},
+			)
+
 
 @frappe.whitelist()
 def get_bom_diff(bom1, bom2):
 	from frappe.model import table_fields
 
 	if bom1 == bom2:
-		frappe.throw(_("BOM 1 {0} and BOM 2 {1} should not be same")
-			.format(frappe.bold(bom1), frappe.bold(bom2)))
+		frappe.throw(
+			_("BOM 1 {0} and BOM 2 {1} should not be same").format(frappe.bold(bom1), frappe.bold(bom2))
+		)
 
-	doc1 = frappe.get_doc('BOM', bom1)
-	doc2 = frappe.get_doc('BOM', bom2)
+	doc1 = frappe.get_doc("BOM", bom1)
+	doc2 = frappe.get_doc("BOM", bom2)
 
 	out = get_diff(doc1, doc2)
 	out.row_changed = []
@@ -1089,10 +1266,10 @@
 	meta = doc1.meta
 
 	identifiers = {
-		'operations': 'operation',
-		'items': 'item_code',
-		'scrap_items': 'item_code',
-		'exploded_items': 'item_code'
+		"operations": "operation",
+		"items": "item_code",
+		"scrap_items": "item_code",
+		"exploded_items": "item_code",
 	}
 
 	for df in meta.fields:
@@ -1123,6 +1300,7 @@
 
 	return out
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def item_query(doctype, txt, searchfield, start, page_len, filters):
@@ -1132,25 +1310,28 @@
 	order_by = "idx desc, name, item_name"
 
 	fields = ["name", "item_group", "item_name", "description"]
-	fields.extend([field for field in searchfields
-		if not field in ["name", "item_group", "description"]])
+	fields.extend(
+		[field for field in searchfields if not field in ["name", "item_group", "description"]]
+	)
 
-	searchfields = searchfields + [field for field in [searchfield or "name", "item_code", "item_group", "item_name"]
-		if not field in searchfields]
+	searchfields = searchfields + [
+		field
+		for field in [searchfield or "name", "item_code", "item_group", "item_name"]
+		if not field in searchfields
+	]
 
-	query_filters = {
-		"disabled": 0,
-		"ifnull(end_of_life, '5050-50-50')": (">", today())
-	}
+	query_filters = {"disabled": 0, "ifnull(end_of_life, '5050-50-50')": (">", today())}
 
 	or_cond_filters = {}
 	if txt:
 		for s_field in searchfields:
 			or_cond_filters[s_field] = ("like", "%{0}%".format(txt))
 
-		barcodes = frappe.get_all("Item Barcode",
+		barcodes = frappe.get_all(
+			"Item Barcode",
 			fields=["distinct parent as item_code"],
-			filters = {"barcode": ("like", "%{0}%".format(txt))})
+			filters={"barcode": ("like", "%{0}%".format(txt))},
+		)
 
 		barcodes = [d.item_code for d in barcodes]
 		if barcodes:
@@ -1164,10 +1345,17 @@
 	if filters and filters.get("is_stock_item"):
 		query_filters["is_stock_item"] = 1
 
-	return frappe.get_list("Item",
-		fields = fields, filters=query_filters,
-		or_filters = or_cond_filters, order_by=order_by,
-		limit_start=start, limit_page_length=page_len, as_list=1)
+	return frappe.get_list(
+		"Item",
+		fields=fields,
+		filters=query_filters,
+		or_filters=or_cond_filters,
+		order_by=order_by,
+		limit_start=start,
+		limit_page_length=page_len,
+		as_list=1,
+	)
+
 
 @frappe.whitelist()
 def make_variant_bom(source_name, bom_no, item, variant_items, target_doc=None):
@@ -1178,28 +1366,31 @@
 		doc.quantity = 1
 
 		item_data = get_item_details(item)
-		doc.update({
-			"item_name": item_data.item_name,
-			"description": item_data.description,
-			"uom": item_data.stock_uom,
-			"allow_alternative_item": item_data.allow_alternative_item
-		})
+		doc.update(
+			{
+				"item_name": item_data.item_name,
+				"description": item_data.description,
+				"uom": item_data.stock_uom,
+				"allow_alternative_item": item_data.allow_alternative_item,
+			}
+		)
 
 		add_variant_item(variant_items, doc, source_name)
 
-	doc = get_mapped_doc('BOM', source_name, {
-		'BOM': {
-			'doctype': 'BOM',
-			'validation': {
-				'docstatus': ['=', 1]
-			}
+	doc = get_mapped_doc(
+		"BOM",
+		source_name,
+		{
+			"BOM": {"doctype": "BOM", "validation": {"docstatus": ["=", 1]}},
+			"BOM Item": {
+				"doctype": "BOM Item",
+				# stop get_mapped_doc copying parent bom_no to children
+				"field_no_map": ["bom_no"],
+				"condition": lambda doc: doc.has_variants == 0,
+			},
 		},
-		'BOM Item': {
-			'doctype': 'BOM Item',
-			# stop get_mapped_doc copying parent bom_no to children
-			'field_no_map': ['bom_no'],
-			'condition': lambda doc: doc.has_variants == 0
-		},
-	}, target_doc, postprocess)
+		target_doc,
+		postprocess,
+	)
 
 	return doc
diff --git a/erpnext/manufacturing/doctype/bom/bom_dashboard.py b/erpnext/manufacturing/doctype/bom/bom_dashboard.py
index 0699f74..d8a810b 100644
--- a/erpnext/manufacturing/doctype/bom/bom_dashboard.py
+++ b/erpnext/manufacturing/doctype/bom/bom_dashboard.py
@@ -3,27 +3,28 @@
 
 def get_data():
 	return {
-		'fieldname': 'bom_no',
-		'non_standard_fieldnames': {
-			'Item': 'default_bom',
-			'Purchase Order': 'bom',
-			'Purchase Receipt': 'bom',
-			'Purchase Invoice': 'bom'
+		"fieldname": "bom_no",
+		"non_standard_fieldnames": {
+			"Item": "default_bom",
+			"Purchase Order": "bom",
+			"Purchase Receipt": "bom",
+			"Purchase Invoice": "bom",
 		},
-		'transactions': [
+		"transactions": [
+			{"label": _("Stock"), "items": ["Item", "Stock Entry", "Quality Inspection"]},
+			{"label": _("Manufacture"), "items": ["BOM", "Work Order", "Job Card"]},
 			{
-				'label': _('Stock'),
-				'items': ['Item', 'Stock Entry', 'Quality Inspection']
+				"label": _("Subcontract"),
+				"items": ["Purchase Order", "Purchase Receipt", "Purchase Invoice"],
 			},
-			{
-				'label': _('Manufacture'),
-				'items': ['BOM', 'Work Order', 'Job Card']
-			},
-			{
-				'label': _('Subcontract'),
-				'items': ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']
-			}
 		],
-		'disable_create_buttons': ["Item", "Purchase Order", "Purchase Receipt",
-			"Purchase Invoice", "Job Card", "Stock Entry", "BOM"]
+		"disable_create_buttons": [
+			"Item",
+			"Purchase Order",
+			"Purchase Receipt",
+			"Purchase Invoice",
+			"Job Card",
+			"Stock Entry",
+			"BOM",
+		],
 	}
diff --git a/erpnext/manufacturing/doctype/bom/test_bom.py b/erpnext/manufacturing/doctype/bom/test_bom.py
index 21e0006..524f45b 100644
--- a/erpnext/manufacturing/doctype/bom/test_bom.py
+++ b/erpnext/manufacturing/doctype/bom/test_bom.py
@@ -18,22 +18,27 @@
 )
 from erpnext.tests.test_subcontracting import set_backflush_based_on
 
-test_records = frappe.get_test_records('BOM')
+test_records = frappe.get_test_records("BOM")
 test_dependencies = ["Item", "Quality Inspection Template"]
 
+
 class TestBOM(FrappeTestCase):
 	def test_get_items(self):
 		from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
-		items_dict = get_bom_items_as_dict(bom=get_default_bom(),
-			company="_Test Company", qty=1, fetch_exploded=0)
+
+		items_dict = get_bom_items_as_dict(
+			bom=get_default_bom(), company="_Test Company", qty=1, fetch_exploded=0
+		)
 		self.assertTrue(test_records[2]["items"][0]["item_code"] in items_dict)
 		self.assertTrue(test_records[2]["items"][1]["item_code"] in items_dict)
 		self.assertEqual(len(items_dict.values()), 2)
 
 	def test_get_items_exploded(self):
 		from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
-		items_dict = get_bom_items_as_dict(bom=get_default_bom(),
-			company="_Test Company", qty=1, fetch_exploded=1)
+
+		items_dict = get_bom_items_as_dict(
+			bom=get_default_bom(), company="_Test Company", qty=1, fetch_exploded=1
+		)
 		self.assertTrue(test_records[2]["items"][0]["item_code"] in items_dict)
 		self.assertFalse(test_records[2]["items"][1]["item_code"] in items_dict)
 		self.assertTrue(test_records[0]["items"][0]["item_code"] in items_dict)
@@ -42,13 +47,14 @@
 
 	def test_get_items_list(self):
 		from erpnext.manufacturing.doctype.bom.bom import get_bom_items
+
 		self.assertEqual(len(get_bom_items(bom=get_default_bom(), company="_Test Company")), 3)
 
 	def test_default_bom(self):
 		def _get_default_bom_in_item():
 			return cstr(frappe.db.get_value("Item", "_Test FG Item 2", "default_bom"))
 
-		bom = frappe.get_doc("BOM", {"item":"_Test FG Item 2", "is_default": 1})
+		bom = frappe.get_doc("BOM", {"item": "_Test FG Item 2", "is_default": 1})
 		self.assertEqual(_get_default_bom_in_item(), bom.name)
 
 		bom.is_active = 0
@@ -56,28 +62,33 @@
 		self.assertEqual(_get_default_bom_in_item(), "")
 
 		bom.is_active = 1
-		bom.is_default=1
+		bom.is_default = 1
 		bom.save()
 
 		self.assertTrue(_get_default_bom_in_item(), bom.name)
 
 	def test_update_bom_cost_in_all_boms(self):
 		# get current rate for '_Test Item 2'
-		rm_rate = frappe.db.sql("""select rate from `tabBOM Item`
+		rm_rate = frappe.db.sql(
+			"""select rate from `tabBOM Item`
 			where parent='BOM-_Test Item Home Desktop Manufactured-001'
-			and item_code='_Test Item 2' and docstatus=1 and parenttype='BOM'""")
+			and item_code='_Test Item 2' and docstatus=1 and parenttype='BOM'"""
+		)
 		rm_rate = rm_rate[0][0] if rm_rate else 0
 
 		# Reset item valuation rate
-		reset_item_valuation_rate(item_code='_Test Item 2', qty=200, rate=rm_rate + 10)
+		reset_item_valuation_rate(item_code="_Test Item 2", qty=200, rate=rm_rate + 10)
 
 		# update cost of all BOMs based on latest valuation rate
 		update_cost()
 
 		# check if new valuation rate updated in all BOMs
-		for d in frappe.db.sql("""select rate from `tabBOM Item`
-			where item_code='_Test Item 2' and docstatus=1 and parenttype='BOM'""", as_dict=1):
-				self.assertEqual(d.rate, rm_rate + 10)
+		for d in frappe.db.sql(
+			"""select rate from `tabBOM Item`
+			where item_code='_Test Item 2' and docstatus=1 and parenttype='BOM'""",
+			as_dict=1,
+		):
+			self.assertEqual(d.rate, rm_rate + 10)
 
 	def test_bom_cost(self):
 		bom = frappe.copy_doc(test_records[2])
@@ -92,7 +103,9 @@
 		for row in bom.items:
 			raw_material_cost += row.amount
 
-		base_raw_material_cost = raw_material_cost * flt(bom.conversion_rate, bom.precision("conversion_rate"))
+		base_raw_material_cost = raw_material_cost * flt(
+			bom.conversion_rate, bom.precision("conversion_rate")
+		)
 		base_op_cost = op_cost * flt(bom.conversion_rate, bom.precision("conversion_rate"))
 
 		# test amounts in selected currency, almostEqual checks for 7 digits by default
@@ -120,14 +133,15 @@
 		for op_row in bom.operations:
 			self.assertAlmostEqual(op_row.cost_per_unit, op_row.operating_cost / 2)
 
-		self.assertAlmostEqual(bom.operating_cost, op_cost/2)
+		self.assertAlmostEqual(bom.operating_cost, op_cost / 2)
 		bom.delete()
 
 	def test_bom_cost_multi_uom_multi_currency_based_on_price_list(self):
 		frappe.db.set_value("Price List", "_Test Price List", "price_not_uom_dependent", 1)
 		for item_code, rate in (("_Test Item", 3600), ("_Test Item Home Desktop Manufactured", 3000)):
-			frappe.db.sql("delete from `tabItem Price` where price_list='_Test Price List' and item_code=%s",
-				item_code)
+			frappe.db.sql(
+				"delete from `tabItem Price` where price_list='_Test Price List' and item_code=%s", item_code
+			)
 			item_price = frappe.new_doc("Item Price")
 			item_price.price_list = "_Test Price List"
 			item_price.item_code = item_code
@@ -142,7 +156,7 @@
 		bom.items[0].conversion_factor = 5
 		bom.insert()
 
-		bom.update_cost(update_hour_rate = False)
+		bom.update_cost(update_hour_rate=False)
 
 		# test amounts in selected currency
 		self.assertEqual(bom.items[0].rate, 300)
@@ -167,11 +181,12 @@
 		bom.insert()
 
 		reset_item_valuation_rate(
-			item_code='_Test Item',
-			warehouse_list=frappe.get_all("Warehouse",
-				{"is_group":0, "company": bom.company}, pluck="name"),
+			item_code="_Test Item",
+			warehouse_list=frappe.get_all(
+				"Warehouse", {"is_group": 0, "company": bom.company}, pluck="name"
+			),
 			qty=200,
-			rate=200
+			rate=200,
 		)
 
 		bom.update_cost()
@@ -180,68 +195,64 @@
 
 	def test_subcontractor_sourced_item(self):
 		item_code = "_Test Subcontracted FG Item 1"
-		set_backflush_based_on('Material Transferred for Subcontract')
+		set_backflush_based_on("Material Transferred for Subcontract")
 
-		if not frappe.db.exists('Item', item_code):
-			make_item(item_code, {
-				'is_stock_item': 1,
-				'is_sub_contracted_item': 1,
-				'stock_uom': 'Nos'
-			})
+		if not frappe.db.exists("Item", item_code):
+			make_item(item_code, {"is_stock_item": 1, "is_sub_contracted_item": 1, "stock_uom": "Nos"})
 
-		if not frappe.db.exists('Item', "Test Extra Item 1"):
-			make_item("Test Extra Item 1", {
-				'is_stock_item': 1,
-				'stock_uom': 'Nos'
-			})
+		if not frappe.db.exists("Item", "Test Extra Item 1"):
+			make_item("Test Extra Item 1", {"is_stock_item": 1, "stock_uom": "Nos"})
 
-		if not frappe.db.exists('Item', "Test Extra Item 2"):
-			make_item("Test Extra Item 2", {
-				'is_stock_item': 1,
-				'stock_uom': 'Nos'
-			})
+		if not frappe.db.exists("Item", "Test Extra Item 2"):
+			make_item("Test Extra Item 2", {"is_stock_item": 1, "stock_uom": "Nos"})
 
-		if not frappe.db.exists('Item', "Test Extra Item 3"):
-			make_item("Test Extra Item 3", {
-				'is_stock_item': 1,
-				'stock_uom': 'Nos'
-			})
-		bom = frappe.get_doc({
-			'doctype': 'BOM',
-			'is_default': 1,
-			'item': item_code,
-			'currency': 'USD',
-			'quantity': 1,
-			'company': '_Test Company'
-		})
+		if not frappe.db.exists("Item", "Test Extra Item 3"):
+			make_item("Test Extra Item 3", {"is_stock_item": 1, "stock_uom": "Nos"})
+		bom = frappe.get_doc(
+			{
+				"doctype": "BOM",
+				"is_default": 1,
+				"item": item_code,
+				"currency": "USD",
+				"quantity": 1,
+				"company": "_Test Company",
+			}
+		)
 
 		for item in ["Test Extra Item 1", "Test Extra Item 2"]:
-			item_doc = frappe.get_doc('Item', item)
+			item_doc = frappe.get_doc("Item", item)
 
-			bom.append('items', {
-				'item_code': item,
-				'qty': 1,
-				'uom': item_doc.stock_uom,
-				'stock_uom': item_doc.stock_uom,
-				'rate': item_doc.valuation_rate
-			})
+			bom.append(
+				"items",
+				{
+					"item_code": item,
+					"qty": 1,
+					"uom": item_doc.stock_uom,
+					"stock_uom": item_doc.stock_uom,
+					"rate": item_doc.valuation_rate,
+				},
+			)
 
-		bom.append('items', {
-			'item_code': "Test Extra Item 3",
-			'qty': 1,
-			'uom': item_doc.stock_uom,
-			'stock_uom': item_doc.stock_uom,
-			'rate': 0,
-			'sourced_by_supplier': 1
-		})
+		bom.append(
+			"items",
+			{
+				"item_code": "Test Extra Item 3",
+				"qty": 1,
+				"uom": item_doc.stock_uom,
+				"stock_uom": item_doc.stock_uom,
+				"rate": 0,
+				"sourced_by_supplier": 1,
+			},
+		)
 		bom.insert(ignore_permissions=True)
 		bom.update_cost()
 		bom.submit()
 		# test that sourced_by_supplier rate is zero even after updating cost
 		self.assertEqual(bom.items[2].rate, 0)
 		# test in Purchase Order sourced_by_supplier is not added to Supplied Item
-		po = create_purchase_order(item_code=item_code, qty=1,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			item_code=item_code, qty=1, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 		bom_items = sorted([d.item_code for d in bom.items if d.sourced_by_supplier != 1])
 		supplied_items = sorted([d.rm_item_code for d in po.supplied_items])
 		self.assertEqual(bom_items, supplied_items)
@@ -249,7 +260,10 @@
 	def test_bom_tree_representation(self):
 		bom_tree = {
 			"Assembly": {
-				"SubAssembly1": {"ChildPart1": {}, "ChildPart2": {},},
+				"SubAssembly1": {
+					"ChildPart1": {},
+					"ChildPart2": {},
+				},
 				"SubAssembly2": {"ChildPart3": {}},
 				"SubAssembly3": {"SubSubAssy1": {"ChildPart4": {}}},
 				"ChildPart5": {},
@@ -260,7 +274,7 @@
 		parent_bom = create_nested_bom(bom_tree, prefix="")
 		created_tree = parent_bom.get_tree_representation()
 
-		reqd_order = level_order_traversal(bom_tree)[1:] # skip first item
+		reqd_order = level_order_traversal(bom_tree)[1:]  # skip first item
 		created_order = created_tree.level_order_traversal()
 
 		self.assertEqual(len(reqd_order), len(created_order))
@@ -272,14 +286,23 @@
 		from erpnext.controllers.item_variant import create_variant
 
 		template_item = make_item(
-			"_TestTemplateItem", {"has_variants": 1, "attributes": [{"attribute": "Test Size"},]}
+			"_TestTemplateItem",
+			{
+				"has_variants": 1,
+				"attributes": [
+					{"attribute": "Test Size"},
+				],
+			},
 		)
 		variant = create_variant(template_item.item_code, {"Test Size": "Large"})
 		variant.insert(ignore_if_duplicate=True)
 
 		bom_tree = {
 			template_item.item_code: {
-				"SubAssembly1": {"ChildPart1": {}, "ChildPart2": {},},
+				"SubAssembly1": {
+					"ChildPart1": {},
+					"ChildPart2": {},
+				},
 				"ChildPart5": {},
 			}
 		}
@@ -302,7 +325,7 @@
 	def test_bom_recursion_1st_level(self):
 		"""BOM should not allow BOM item again in child"""
 		item_code = "_Test BOM Recursion"
-		make_item(item_code, {'is_stock_item': 1})
+		make_item(item_code, {"is_stock_item": 1})
 
 		bom = frappe.new_doc("BOM")
 		bom.item = item_code
@@ -316,8 +339,8 @@
 	def test_bom_recursion_transitive(self):
 		item1 = "_Test BOM Recursion"
 		item2 = "_Test BOM Recursion 2"
-		make_item(item1, {'is_stock_item': 1})
-		make_item(item2, {'is_stock_item': 1})
+		make_item(item1, {"is_stock_item": 1})
+		make_item(item2, {"is_stock_item": 1})
 
 		bom1 = frappe.new_doc("BOM")
 		bom1.item = item1
@@ -373,19 +396,29 @@
 		self.assertRaises(frappe.ValidationError, bom_doc.submit)
 
 	def test_bom_item_query(self):
-		query = partial(item_query, doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters={"is_stock_item": 1})
+		query = partial(
+			item_query,
+			doctype="Item",
+			txt="",
+			searchfield="name",
+			start=0,
+			page_len=20,
+			filters={"is_stock_item": 1},
+		)
 
 		test_items = query(txt="_Test")
 		filtered = query(txt="_Test Item 2")
 
-		self.assertNotEqual(len(test_items), len(filtered), msg="Item filtering showing excessive results")
+		self.assertNotEqual(
+			len(test_items), len(filtered), msg="Item filtering showing excessive results"
+		)
 		self.assertTrue(0 < len(filtered) <= 3, msg="Item filtering showing excessive results")
 
 	def test_exclude_exploded_items_from_bom(self):
 		bom_no = get_default_bom()
-		new_bom = frappe.copy_doc(frappe.get_doc('BOM', bom_no))
+		new_bom = frappe.copy_doc(frappe.get_doc("BOM", bom_no))
 		for row in new_bom.items:
-			if row.item_code == '_Test Item Home Desktop Manufactured':
+			if row.item_code == "_Test Item Home Desktop Manufactured":
 				self.assertTrue(row.bom_no)
 				row.do_not_explode = True
 
@@ -394,13 +427,15 @@
 		new_bom.load_from_db()
 
 		for row in new_bom.items:
-			if row.item_code == '_Test Item Home Desktop Manufactured' and row.do_not_explode:
+			if row.item_code == "_Test Item Home Desktop Manufactured" and row.do_not_explode:
 				self.assertFalse(row.bom_no)
 
 		new_bom.delete()
 
 	def test_valid_transfer_defaults(self):
-		bom_with_op = frappe.db.get_value("BOM", {"item": "_Test FG Item 2", "with_operations": 1, "is_active": 1})
+		bom_with_op = frappe.db.get_value(
+			"BOM", {"item": "_Test FG Item 2", "with_operations": 1, "is_active": 1}
+		)
 		bom = frappe.copy_doc(frappe.get_doc("BOM", bom_with_op), ignore_no_copy=False)
 
 		# test defaults
@@ -429,12 +464,8 @@
 		bom.delete()
 
 	def test_bom_name_length(self):
-		""" test >140 char names"""
-		bom_tree = {
-			"x" * 140 : {
-				" ".join(["abc"] * 35): {}
-			}
-		}
+		"""test >140 char names"""
+		bom_tree = {"x" * 140: {" ".join(["abc"] * 35): {}}}
 		create_nested_bom(bom_tree, prefix="")
 
 	def test_version_index(self):
@@ -452,15 +483,14 @@
 
 		for expected_index, existing_boms in version_index_test_cases:
 			with self.subTest():
-				self.assertEqual(expected_index, bom.get_next_version_index(existing_boms),
-						msg=f"Incorrect index for {existing_boms}")
+				self.assertEqual(
+					expected_index,
+					bom.get_next_version_index(existing_boms),
+					msg=f"Incorrect index for {existing_boms}",
+				)
 
 	def test_bom_versioning(self):
-		bom_tree = {
-			frappe.generate_hash(length=10) : {
-				frappe.generate_hash(length=10): {}
-			}
-		}
+		bom_tree = {frappe.generate_hash(length=10): {frappe.generate_hash(length=10): {}}}
 		bom = create_nested_bom(bom_tree, prefix="")
 		self.assertEqual(int(bom.name.split("-")[-1]), 1)
 		original_bom_name = bom.name
@@ -501,7 +531,7 @@
 		bom.save()
 		bom.reload()
 
-		self.assertEqual(bom.quality_inspection_template, '_Test Quality Inspection Template')
+		self.assertEqual(bom.quality_inspection_template, "_Test Quality Inspection Template")
 
 		bom.inspection_required = 0
 		bom.save()
@@ -514,8 +544,7 @@
 
 		parent = frappe.generate_hash(length=10)
 		child = frappe.generate_hash(length=10)
-		bom_tree = {parent: {child: {}}
-		}
+		bom_tree = {parent: {child: {}}}
 		bom = create_nested_bom(bom_tree, prefix="")
 
 		# add last purchase price
@@ -534,6 +563,7 @@
 def get_default_bom(item_code="_Test FG Item 2"):
 	return frappe.db.get_value("BOM", {"item": item_code, "is_active": 1, "is_default": 1})
 
+
 def level_order_traversal(node):
 	traversal = []
 	q = deque()
@@ -548,9 +578,9 @@
 
 	return traversal
 
+
 def create_nested_bom(tree, prefix="_Test bom "):
-	""" Helper function to create a simple nested bom from tree describing item names. (along with required items)
-	"""
+	"""Helper function to create a simple nested bom from tree describing item names. (along with required items)"""
 
 	def create_items(bom_tree):
 		for item_code, subtree in bom_tree.items():
@@ -558,6 +588,7 @@
 			if not frappe.db.exists("Item", bom_item_code):
 				frappe.get_doc(doctype="Item", item_code=bom_item_code, item_group="_Test Item Group").insert()
 			create_items(subtree)
+
 	create_items(tree)
 
 	def dfs(tree, node):
@@ -592,10 +623,13 @@
 		warehouse_list = [warehouse_list]
 
 	if not warehouse_list:
-		warehouse_list = frappe.db.sql_list("""
+		warehouse_list = frappe.db.sql_list(
+			"""
 			select warehouse from `tabBin`
 			where item_code=%s and actual_qty > 0
-		""", item_code)
+		""",
+			item_code,
+		)
 
 		if not warehouse_list:
 			warehouse_list.append("_Test Warehouse - _TC")
@@ -603,44 +637,51 @@
 	for warehouse in warehouse_list:
 		create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=qty, rate=rate)
 
+
 def create_bom_with_process_loss_item(
-		fg_item, bom_item, scrap_qty, scrap_rate, fg_qty=2, is_process_loss=1):
+	fg_item, bom_item, scrap_qty, scrap_rate, fg_qty=2, is_process_loss=1
+):
 	bom_doc = frappe.new_doc("BOM")
 	bom_doc.item = fg_item.item_code
 	bom_doc.quantity = fg_qty
-	bom_doc.append("items", {
-		"item_code": bom_item.item_code,
-		"qty": 1,
-		"uom": bom_item.stock_uom,
-		"stock_uom": bom_item.stock_uom,
-		"rate": 100.0
-	})
-	bom_doc.append("scrap_items", {
-		"item_code": fg_item.item_code,
-		"qty": scrap_qty,
-		"stock_qty": scrap_qty,
-		"uom": fg_item.stock_uom,
-		"stock_uom": fg_item.stock_uom,
-		"rate": scrap_rate,
-		"is_process_loss": is_process_loss
-	})
+	bom_doc.append(
+		"items",
+		{
+			"item_code": bom_item.item_code,
+			"qty": 1,
+			"uom": bom_item.stock_uom,
+			"stock_uom": bom_item.stock_uom,
+			"rate": 100.0,
+		},
+	)
+	bom_doc.append(
+		"scrap_items",
+		{
+			"item_code": fg_item.item_code,
+			"qty": scrap_qty,
+			"stock_qty": scrap_qty,
+			"uom": fg_item.stock_uom,
+			"stock_uom": fg_item.stock_uom,
+			"rate": scrap_rate,
+			"is_process_loss": is_process_loss,
+		},
+	)
 	bom_doc.currency = "INR"
 	return bom_doc
 
+
 def create_process_loss_bom_items():
 	item_list = [
 		("_Test Item - Non Whole UOM", "Kg"),
 		("_Test Item - Whole UOM", "Unit"),
-		("_Test PL BOM Item", "Unit")
+		("_Test PL BOM Item", "Unit"),
 	]
 	return [create_process_loss_bom_item(it) for it in item_list]
 
+
 def create_process_loss_bom_item(item_tuple):
 	item_code, stock_uom = item_tuple
 	if frappe.db.exists("Item", item_code) is None:
-		return make_item(
-			item_code,
-			{'stock_uom':stock_uom, 'valuation_rate':100}
-		)
+		return make_item(item_code, {"stock_uom": stock_uom, "valuation_rate": 100})
 	else:
 		return frappe.get_doc("Item", item_code)
diff --git a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
index 0e3955f..00711ca 100644
--- a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
+++ b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
@@ -20,14 +20,14 @@
 		unit_cost = get_new_bom_unit_cost(self.new_bom)
 		self.update_new_bom(unit_cost)
 
-		frappe.cache().delete_key('bom_children')
+		frappe.cache().delete_key("bom_children")
 		bom_list = self.get_parent_boms(self.new_bom)
 
 		with click.progressbar(bom_list) as bom_list:
 			pass
 		for bom in bom_list:
 			try:
-				bom_obj = frappe.get_cached_doc('BOM', bom)
+				bom_obj = frappe.get_cached_doc("BOM", bom)
 				# this is only used for versioning and we do not want
 				# to make separate db calls by using load_doc_before_save
 				# which proves to be expensive while doing bulk replace
@@ -37,7 +37,7 @@
 				bom_obj.calculate_cost()
 				bom_obj.update_parent_cost()
 				bom_obj.db_update()
-				if bom_obj.meta.get('track_changes') and not bom_obj.flags.ignore_version:
+				if bom_obj.meta.get("track_changes") and not bom_obj.flags.ignore_version:
 					bom_obj.save_version()
 			except Exception:
 				frappe.log_error(frappe.get_traceback())
@@ -46,20 +46,26 @@
 		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"))
+		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, unit_cost):
-		frappe.db.sql("""update `tabBOM Item` set bom_no=%s,
+		frappe.db.sql(
+			"""update `tabBOM Item` set bom_no=%s,
 			rate=%s, amount=stock_qty*%s where bom_no = %s and docstatus < 2 and parenttype='BOM'""",
-			(self.new_bom, unit_cost, unit_cost, self.current_bom))
+			(self.new_bom, unit_cost, unit_cost, self.current_bom),
+		)
 
 	def get_parent_boms(self, bom, bom_list=None):
 		if bom_list is None:
 			bom_list = []
-		data = frappe.db.sql("""SELECT DISTINCT parent FROM `tabBOM Item`
-			WHERE bom_no = %s AND docstatus < 2 AND parenttype='BOM'""", bom)
+		data = frappe.db.sql(
+			"""SELECT DISTINCT parent FROM `tabBOM Item`
+			WHERE bom_no = %s AND docstatus < 2 AND parenttype='BOM'""",
+			bom,
+		)
 
 		for d in data:
 			if self.new_bom == d[0]:
@@ -70,29 +76,45 @@
 
 		return list(set(bom_list))
 
+
 def get_new_bom_unit_cost(bom):
-	new_bom_unitcost = frappe.db.sql("""SELECT `total_cost`/`quantity`
-		FROM `tabBOM` WHERE name = %s""", bom)
+	new_bom_unitcost = frappe.db.sql(
+		"""SELECT `total_cost`/`quantity`
+		FROM `tabBOM` WHERE name = %s""",
+		bom,
+	)
 
 	return flt(new_bom_unitcost[0][0]) if new_bom_unitcost else 0
 
+
 @frappe.whitelist()
 def enqueue_replace_bom(args):
 	if isinstance(args, str):
 		args = json.loads(args)
 
-	frappe.enqueue("erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.replace_bom", args=args, timeout=40000)
+	frappe.enqueue(
+		"erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.replace_bom",
+		args=args,
+		timeout=40000,
+	)
 	frappe.msgprint(_("Queued for replacing the BOM. It may take a few minutes."))
 
+
 @frappe.whitelist()
 def enqueue_update_cost():
-	frappe.enqueue("erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_cost", timeout=40000)
-	frappe.msgprint(_("Queued for updating latest price in all Bill of Materials. It may take a few minutes."))
+	frappe.enqueue(
+		"erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_cost", timeout=40000
+	)
+	frappe.msgprint(
+		_("Queued for updating latest price in all Bill of Materials. It may take a few minutes.")
+	)
+
 
 def update_latest_price_in_all_boms():
 	if frappe.db.get_single_value("Manufacturing Settings", "update_bom_costs_automatically"):
 		update_cost()
 
+
 def replace_bom(args):
 	frappe.db.auto_commit_on_many_writes = 1
 	args = frappe._dict(args)
@@ -104,6 +126,7 @@
 
 	frappe.db.auto_commit_on_many_writes = 0
 
+
 def update_cost():
 	frappe.db.auto_commit_on_many_writes = 1
 	bom_list = get_boms_in_bottom_up_order()
diff --git a/erpnext/manufacturing/doctype/bom_update_tool/test_bom_update_tool.py b/erpnext/manufacturing/doctype/bom_update_tool/test_bom_update_tool.py
index b4c625d..57785e5 100644
--- a/erpnext/manufacturing/doctype/bom_update_tool/test_bom_update_tool.py
+++ b/erpnext/manufacturing/doctype/bom_update_tool/test_bom_update_tool.py
@@ -8,7 +8,8 @@
 from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
 from erpnext.stock.doctype.item.test_item import create_item
 
-test_records = frappe.get_test_records('BOM')
+test_records = frappe.get_test_records("BOM")
+
 
 class TestBOMUpdateTool(FrappeTestCase):
 	def test_replace_bom(self):
@@ -37,10 +38,13 @@
 			if item_doc.valuation_rate != 100.00:
 				frappe.db.set_value("Item", item_doc.name, "valuation_rate", 100)
 
-		bom_no = frappe.db.get_value('BOM', {'item': 'BOM Cost Test Item 1'}, "name")
+		bom_no = frappe.db.get_value("BOM", {"item": "BOM Cost Test Item 1"}, "name")
 		if not bom_no:
-			doc = make_bom(item = 'BOM Cost Test Item 1',
-				raw_materials =['BOM Cost Test Item 2', 'BOM Cost Test Item 3'], currency="INR")
+			doc = make_bom(
+				item="BOM Cost Test Item 1",
+				raw_materials=["BOM Cost Test Item 2", "BOM Cost Test Item 3"],
+				currency="INR",
+			)
 		else:
 			doc = frappe.get_doc("BOM", bom_no)
 
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py
index 960d0e5..bf4f82f 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.py
+++ b/erpnext/manufacturing/doctype/job_card/job_card.py
@@ -26,15 +26,27 @@
 )
 
 
-class OverlapError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
 
-class OperationMismatchError(frappe.ValidationError): pass
-class OperationSequenceError(frappe.ValidationError): pass
-class JobCardCancelError(frappe.ValidationError): pass
+
+class OperationMismatchError(frappe.ValidationError):
+	pass
+
+
+class OperationSequenceError(frappe.ValidationError):
+	pass
+
+
+class JobCardCancelError(frappe.ValidationError):
+	pass
+
 
 class JobCard(Document):
 	def onload(self):
-		excess_transfer = frappe.db.get_single_value("Manufacturing Settings", "job_card_excess_transfer")
+		excess_transfer = frappe.db.get_single_value(
+			"Manufacturing Settings", "job_card_excess_transfer"
+		)
 		self.set_onload("job_card_excess_transfer", excess_transfer)
 		self.set_onload("work_order_closed", self.is_work_order_closed())
 
@@ -50,25 +62,33 @@
 	def set_sub_operations(self):
 		if not self.sub_operations and self.operation:
 			self.sub_operations = []
-			for row in frappe.get_all('Sub Operation',
-				filters = {'parent': self.operation}, fields=['operation', 'idx'], order_by='idx'):
-				row.status = 'Pending'
+			for row in frappe.get_all(
+				"Sub Operation",
+				filters={"parent": self.operation},
+				fields=["operation", "idx"],
+				order_by="idx",
+			):
+				row.status = "Pending"
 				row.sub_operation = row.operation
-				self.append('sub_operations', row)
+				self.append("sub_operations", row)
 
 	def validate_time_logs(self):
 		self.total_time_in_mins = 0.0
 		self.total_completed_qty = 0.0
 
-		if self.get('time_logs'):
-			for d in self.get('time_logs'):
+		if self.get("time_logs"):
+			for d in self.get("time_logs"):
 				if d.to_time and get_datetime(d.from_time) > get_datetime(d.to_time):
 					frappe.throw(_("Row {0}: From time must be less than to time").format(d.idx))
 
 				data = self.get_overlap_for(d)
 				if data:
-					frappe.throw(_("Row {0}: From Time and To Time of {1} is overlapping with {2}")
-						.format(d.idx, self.name, data.name), OverlapError)
+					frappe.throw(
+						_("Row {0}: From Time and To Time of {1} is overlapping with {2}").format(
+							d.idx, self.name, data.name
+						),
+						OverlapError,
+					)
 
 				if d.from_time and d.to_time:
 					d.time_in_mins = time_diff_in_hours(d.to_time, d.from_time) * 60
@@ -86,8 +106,9 @@
 		production_capacity = 1
 
 		if self.workstation:
-			production_capacity = frappe.get_cached_value("Workstation",
-				self.workstation, 'production_capacity') or 1
+			production_capacity = (
+				frappe.get_cached_value("Workstation", self.workstation, "production_capacity") or 1
+			)
 			validate_overlap_for = " and jc.workstation = %(workstation)s "
 
 		if args.get("employee"):
@@ -95,11 +116,12 @@
 			production_capacity = 1
 			validate_overlap_for = " and jctl.employee = %(employee)s "
 
-		extra_cond = ''
+		extra_cond = ""
 		if check_next_available_slot:
 			extra_cond = " or (%(from_time)s <= jctl.from_time and %(to_time)s <= jctl.to_time)"
 
-		existing = frappe.db.sql("""select jc.name as name, jctl.to_time from
+		existing = frappe.db.sql(
+			"""select jc.name as name, jctl.to_time from
 			`tabJob Card Time Log` jctl, `tabJob Card` jc where jctl.parent = jc.name and
 			(
 				(%(from_time)s > jctl.from_time and %(from_time)s < jctl.to_time) or
@@ -107,15 +129,19 @@
 				(%(from_time)s <= jctl.from_time and %(to_time)s >= jctl.to_time) {0}
 			)
 			and jctl.name != %(name)s and jc.name != %(parent)s and jc.docstatus < 2 {1}
-			order by jctl.to_time desc limit 1""".format(extra_cond, validate_overlap_for),
+			order by jctl.to_time desc limit 1""".format(
+				extra_cond, validate_overlap_for
+			),
 			{
 				"from_time": args.from_time,
 				"to_time": args.to_time,
 				"name": args.name or "No Name",
 				"parent": args.parent or "No Name",
 				"employee": args.get("employee"),
-				"workstation": self.workstation
-			}, as_dict=True)
+				"workstation": self.workstation,
+			},
+			as_dict=True,
+		)
 
 		if existing and production_capacity > len(existing):
 			return
@@ -125,10 +151,7 @@
 	def schedule_time_logs(self, row):
 		row.remaining_time_in_mins = row.time_in_mins
 		while row.remaining_time_in_mins > 0:
-			args = frappe._dict({
-				"from_time": row.planned_start_time,
-				"to_time": row.planned_end_time
-			})
+			args = frappe._dict({"from_time": row.planned_start_time, "to_time": row.planned_end_time})
 
 			self.validate_overlap_for_workstation(args, row)
 			self.check_workstation_time(row)
@@ -141,13 +164,16 @@
 
 	def check_workstation_time(self, row):
 		workstation_doc = frappe.get_cached_doc("Workstation", self.workstation)
-		if (not workstation_doc.working_hours or
-			cint(frappe.db.get_single_value("Manufacturing Settings", "allow_overtime"))):
+		if not workstation_doc.working_hours or cint(
+			frappe.db.get_single_value("Manufacturing Settings", "allow_overtime")
+		):
 			if get_datetime(row.planned_end_time) < get_datetime(row.planned_start_time):
 				row.planned_end_time = add_to_date(row.planned_start_time, minutes=row.time_in_mins)
 				row.remaining_time_in_mins = 0.0
 			else:
-				row.remaining_time_in_mins -= time_diff_in_minutes(row.planned_end_time, row.planned_start_time)
+				row.remaining_time_in_mins -= time_diff_in_minutes(
+					row.planned_end_time, row.planned_start_time
+				)
 
 			self.update_time_logs(row)
 			return
@@ -167,14 +193,15 @@
 			workstation_start_time = datetime.datetime.combine(start_date, get_time(time_slot.start_time))
 			workstation_end_time = datetime.datetime.combine(start_date, get_time(time_slot.end_time))
 
-			if (get_datetime(row.planned_start_time) >= workstation_start_time and
-				get_datetime(row.planned_start_time) <= workstation_end_time):
+			if (
+				get_datetime(row.planned_start_time) >= workstation_start_time
+				and get_datetime(row.planned_start_time) <= workstation_end_time
+			):
 				time_in_mins = time_diff_in_minutes(workstation_end_time, row.planned_start_time)
 
 				# If remaining time fit in workstation time logs else split hours as per workstation time
 				if time_in_mins > row.remaining_time_in_mins:
-					row.planned_end_time = add_to_date(row.planned_start_time,
-						minutes=row.remaining_time_in_mins)
+					row.planned_end_time = add_to_date(row.planned_start_time, minutes=row.remaining_time_in_mins)
 					row.remaining_time_in_mins = 0
 				else:
 					row.planned_end_time = add_to_date(row.planned_start_time, minutes=time_in_mins)
@@ -182,14 +209,16 @@
 
 				self.update_time_logs(row)
 
-				if total_idx != (i+1) and row.remaining_time_in_mins > 0:
-					row.planned_start_time = datetime.datetime.combine(start_date,
-						get_time(workstation_doc.working_hours[i+1].start_time))
+				if total_idx != (i + 1) and row.remaining_time_in_mins > 0:
+					row.planned_start_time = datetime.datetime.combine(
+						start_date, get_time(workstation_doc.working_hours[i + 1].start_time)
+					)
 
 		if row.remaining_time_in_mins > 0:
 			start_date = add_days(start_date, 1)
-			row.planned_start_time = datetime.datetime.combine(start_date,
-				get_time(workstation_doc.working_hours[0].start_time))
+			row.planned_start_time = datetime.datetime.combine(
+				start_date, get_time(workstation_doc.working_hours[0].start_time)
+			)
 
 	def add_time_log(self, args):
 		last_row = []
@@ -204,21 +233,25 @@
 		if last_row and args.get("complete_time"):
 			for row in self.time_logs:
 				if not row.to_time:
-					row.update({
-						"to_time": get_datetime(args.get("complete_time")),
-						"operation": args.get("sub_operation"),
-						"completed_qty": args.get("completed_qty") or 0.0
-					})
+					row.update(
+						{
+							"to_time": get_datetime(args.get("complete_time")),
+							"operation": args.get("sub_operation"),
+							"completed_qty": args.get("completed_qty") or 0.0,
+						}
+					)
 		elif args.get("start_time"):
-			new_args = frappe._dict({
-				"from_time": get_datetime(args.get("start_time")),
-				"operation": args.get("sub_operation"),
-				"completed_qty": 0.0
-			})
+			new_args = frappe._dict(
+				{
+					"from_time": get_datetime(args.get("start_time")),
+					"operation": args.get("sub_operation"),
+					"completed_qty": 0.0,
+				}
+			)
 
 			if employees:
 				for name in employees:
-					new_args.employee = name.get('employee')
+					new_args.employee = name.get("employee")
 					self.add_start_time_log(new_args)
 			else:
 				self.add_start_time_log(new_args)
@@ -236,10 +269,7 @@
 
 	def set_employees(self, employees):
 		for name in employees:
-			self.append('employee', {
-				'employee': name.get('employee'),
-				'completed_qty': 0.0
-			})
+			self.append("employee", {"employee": name.get("employee"), "completed_qty": 0.0})
 
 	def reset_timer_value(self, args):
 		self.started_time = None
@@ -263,13 +293,17 @@
 		operation_wise_completed_time = {}
 		for time_log in self.time_logs:
 			if time_log.operation not in operation_wise_completed_time:
-				operation_wise_completed_time.setdefault(time_log.operation,
-					frappe._dict({"status": "Pending", "completed_qty":0.0, "completed_time": 0.0, "employee": []}))
+				operation_wise_completed_time.setdefault(
+					time_log.operation,
+					frappe._dict(
+						{"status": "Pending", "completed_qty": 0.0, "completed_time": 0.0, "employee": []}
+					),
+				)
 
 			op_row = operation_wise_completed_time[time_log.operation]
 			op_row.status = "Work In Progress" if not time_log.time_in_mins else "Complete"
-			if self.status == 'On Hold':
-				op_row.status = 'Pause'
+			if self.status == "On Hold":
+				op_row.status = "Pause"
 
 			op_row.employee.append(time_log.employee)
 			if time_log.time_in_mins:
@@ -279,7 +313,7 @@
 		for row in self.sub_operations:
 			operation_deatils = operation_wise_completed_time.get(row.sub_operation)
 			if operation_deatils:
-				if row.status != 'Complete':
+				if row.status != "Complete":
 					row.status = operation_deatils.status
 
 				row.completed_time = operation_deatils.completed_time
@@ -289,43 +323,52 @@
 					if operation_deatils.completed_qty:
 						row.completed_qty = operation_deatils.completed_qty / len(set(operation_deatils.employee))
 			else:
-				row.status = 'Pending'
+				row.status = "Pending"
 				row.completed_time = 0.0
 				row.completed_qty = 0.0
 
 	def update_time_logs(self, row):
-		self.append("time_logs", {
-			"from_time": row.planned_start_time,
-			"to_time": row.planned_end_time,
-			"completed_qty": 0,
-			"time_in_mins": time_diff_in_minutes(row.planned_end_time, row.planned_start_time),
-		})
+		self.append(
+			"time_logs",
+			{
+				"from_time": row.planned_start_time,
+				"to_time": row.planned_end_time,
+				"completed_qty": 0,
+				"time_in_mins": time_diff_in_minutes(row.planned_end_time, row.planned_start_time),
+			},
+		)
 
 	@frappe.whitelist()
 	def get_required_items(self):
-		if not self.get('work_order'):
+		if not self.get("work_order"):
 			return
 
-		doc = frappe.get_doc('Work Order', self.get('work_order'))
-		if doc.transfer_material_against == 'Work Order' or doc.skip_transfer:
+		doc = frappe.get_doc("Work Order", self.get("work_order"))
+		if doc.transfer_material_against == "Work Order" or doc.skip_transfer:
 			return
 
 		for d in doc.required_items:
 			if not d.operation:
-				frappe.throw(_("Row {0} : Operation is required against the raw material item {1}")
-					.format(d.idx, d.item_code))
+				frappe.throw(
+					_("Row {0} : Operation is required against the raw material item {1}").format(
+						d.idx, d.item_code
+					)
+				)
 
-			if self.get('operation') == d.operation:
-				self.append('items', {
-					"item_code": d.item_code,
-					"source_warehouse": d.source_warehouse,
-					"uom": frappe.db.get_value("Item", d.item_code, 'stock_uom'),
-					"item_name": d.item_name,
-					"description": d.description,
-					"required_qty": (d.required_qty * flt(self.for_quantity)) / doc.qty,
-					"rate": d.rate,
-					"amount": d.amount
-				})
+			if self.get("operation") == d.operation:
+				self.append(
+					"items",
+					{
+						"item_code": d.item_code,
+						"source_warehouse": d.source_warehouse,
+						"uom": frappe.db.get_value("Item", d.item_code, "stock_uom"),
+						"item_name": d.item_name,
+						"description": d.description,
+						"required_qty": (d.required_qty * flt(self.for_quantity)) / doc.qty,
+						"rate": d.rate,
+						"amount": d.amount,
+					},
+				)
 
 	def on_submit(self):
 		self.validate_transfer_qty()
@@ -339,31 +382,52 @@
 
 	def validate_transfer_qty(self):
 		if self.items and self.transferred_qty < self.for_quantity:
-			frappe.throw(_('Materials needs to be transferred to the work in progress warehouse for the job card {0}')
-				.format(self.name))
+			frappe.throw(
+				_(
+					"Materials needs to be transferred to the work in progress warehouse for the job card {0}"
+				).format(self.name)
+			)
 
 	def validate_job_card(self):
-		if self.work_order and frappe.get_cached_value('Work Order', self.work_order, 'status') == 'Stopped':
-			frappe.throw(_("Transaction not allowed against stopped Work Order {0}")
-				.format(get_link_to_form('Work Order', self.work_order)))
+		if (
+			self.work_order
+			and frappe.get_cached_value("Work Order", self.work_order, "status") == "Stopped"
+		):
+			frappe.throw(
+				_("Transaction not allowed against stopped Work Order {0}").format(
+					get_link_to_form("Work Order", self.work_order)
+				)
+			)
 
 		if not self.time_logs:
-			frappe.throw(_("Time logs are required for {0} {1}")
-				.format(bold("Job Card"), get_link_to_form("Job Card", self.name)))
+			frappe.throw(
+				_("Time logs are required for {0} {1}").format(
+					bold("Job Card"), get_link_to_form("Job Card", self.name)
+				)
+			)
 
 		if self.for_quantity and self.total_completed_qty != self.for_quantity:
 			total_completed_qty = bold(_("Total Completed Qty"))
 			qty_to_manufacture = bold(_("Qty to Manufacture"))
 
-			frappe.throw(_("The {0} ({1}) must be equal to {2} ({3})")
-				.format(total_completed_qty, bold(self.total_completed_qty), qty_to_manufacture,bold(self.for_quantity)))
+			frappe.throw(
+				_("The {0} ({1}) must be equal to {2} ({3})").format(
+					total_completed_qty,
+					bold(self.total_completed_qty),
+					qty_to_manufacture,
+					bold(self.for_quantity),
+				)
+			)
 
 	def update_work_order(self):
 		if not self.work_order:
 			return
 
-		if self.is_corrective_job_card and not cint(frappe.db.get_single_value('Manufacturing Settings',
-			'add_corrective_operation_cost_in_finished_good_valuation')):
+		if self.is_corrective_job_card and not cint(
+			frappe.db.get_single_value(
+				"Manufacturing Settings", "add_corrective_operation_cost_in_finished_good_valuation"
+			)
+		):
 			return
 
 		for_quantity, time_in_mins = 0, 0
@@ -375,7 +439,7 @@
 			for_quantity = flt(data[0].completed_qty)
 			time_in_mins = flt(data[0].time_in_mins)
 
-		wo = frappe.get_doc('Work Order', self.work_order)
+		wo = frappe.get_doc("Work Order", self.work_order)
 
 		if self.is_corrective_job_card:
 			self.update_corrective_in_work_order(wo)
@@ -386,8 +450,11 @@
 
 	def update_corrective_in_work_order(self, wo):
 		wo.corrective_operation_cost = 0.0
-		for row in frappe.get_all('Job Card', fields = ['total_time_in_mins', 'hour_rate'],
-			filters = {'is_corrective_job_card': 1, 'docstatus': 1, 'work_order': self.work_order}):
+		for row in frappe.get_all(
+			"Job Card",
+			fields=["total_time_in_mins", "hour_rate"],
+			filters={"is_corrective_job_card": 1, "docstatus": 1, "work_order": self.work_order},
+		):
 			wo.corrective_operation_cost += flt(row.total_time_in_mins) * flt(row.hour_rate)
 
 		wo.calculate_operating_cost()
@@ -395,27 +462,37 @@
 		wo.save()
 
 	def validate_produced_quantity(self, for_quantity, wo):
-		if self.docstatus < 2: return
+		if self.docstatus < 2:
+			return
 
 		if wo.produced_qty > for_quantity:
-			first_part_msg = (_("The {0} {1} is used to calculate the valuation cost for the finished good {2}.")
-				.format(frappe.bold(_("Job Card")), frappe.bold(self.name), frappe.bold(self.production_item)))
+			first_part_msg = _(
+				"The {0} {1} is used to calculate the valuation cost for the finished good {2}."
+			).format(
+				frappe.bold(_("Job Card")), frappe.bold(self.name), frappe.bold(self.production_item)
+			)
 
-			second_part_msg = (_("Kindly cancel the Manufacturing Entries first against the work order {0}.")
-				.format(frappe.bold(get_link_to_form("Work Order", self.work_order))))
+			second_part_msg = _(
+				"Kindly cancel the Manufacturing Entries first against the work order {0}."
+			).format(frappe.bold(get_link_to_form("Work Order", self.work_order)))
 
-			frappe.throw(_("{0} {1}").format(first_part_msg, second_part_msg),
-				JobCardCancelError, title = _("Error"))
+			frappe.throw(
+				_("{0} {1}").format(first_part_msg, second_part_msg), JobCardCancelError, title=_("Error")
+			)
 
 	def update_work_order_data(self, for_quantity, time_in_mins, wo):
-		time_data = frappe.db.sql("""
+		time_data = frappe.db.sql(
+			"""
 				SELECT
 					min(from_time) as start_time, max(to_time) as end_time
 				FROM `tabJob Card` jc, `tabJob Card Time Log` jctl
 				WHERE
 					jctl.parent = jc.name and jc.work_order = %s and jc.operation_id = %s
 					and jc.docstatus = 1 and IFNULL(jc.is_corrective_job_card, 0) = 0
-			""", (self.work_order, self.operation_id), as_dict=1)
+			""",
+			(self.work_order, self.operation_id),
+			as_dict=1,
+		)
 
 		for data in wo.operations:
 			if data.get("name") == self.operation_id:
@@ -434,91 +511,118 @@
 		wo.save()
 
 	def get_current_operation_data(self):
-		return frappe.get_all('Job Card',
-			fields = ["sum(total_time_in_mins) as time_in_mins", "sum(total_completed_qty) as completed_qty"],
-			filters = {"docstatus": 1, "work_order": self.work_order, "operation_id": self.operation_id,
-				"is_corrective_job_card": 0})
+		return frappe.get_all(
+			"Job Card",
+			fields=["sum(total_time_in_mins) as time_in_mins", "sum(total_completed_qty) as completed_qty"],
+			filters={
+				"docstatus": 1,
+				"work_order": self.work_order,
+				"operation_id": self.operation_id,
+				"is_corrective_job_card": 0,
+			},
+		)
 
 	def set_transferred_qty_in_job_card(self, ste_doc):
 		for row in ste_doc.items:
-			if not row.job_card_item: continue
+			if not row.job_card_item:
+				continue
 
-			qty = frappe.db.sql(""" SELECT SUM(qty) from `tabStock Entry Detail` sed, `tabStock Entry` se
+			qty = frappe.db.sql(
+				""" SELECT SUM(qty) from `tabStock Entry Detail` sed, `tabStock Entry` se
 				WHERE  sed.job_card_item = %s and se.docstatus = 1 and sed.parent = se.name and
 				se.purpose = 'Material Transfer for Manufacture'
-			""", (row.job_card_item))[0][0]
+			""",
+				(row.job_card_item),
+			)[0][0]
 
-			frappe.db.set_value('Job Card Item', row.job_card_item, 'transferred_qty', flt(qty))
+			frappe.db.set_value("Job Card Item", row.job_card_item, "transferred_qty", flt(qty))
 
 	def set_transferred_qty(self, update_status=False):
 		"Set total FG Qty for which RM was transferred."
 		if not self.items:
 			self.transferred_qty = self.for_quantity if self.docstatus == 1 else 0
 
-		doc = frappe.get_doc('Work Order', self.get('work_order'))
-		if doc.transfer_material_against == 'Work Order' or doc.skip_transfer:
+		doc = frappe.get_doc("Work Order", self.get("work_order"))
+		if doc.transfer_material_against == "Work Order" or doc.skip_transfer:
 			return
 
 		if self.items:
 			# sum of 'For Quantity' of Stock Entries against JC
-			self.transferred_qty = frappe.db.get_value('Stock Entry', {
-				'job_card': self.name,
-				'work_order': self.work_order,
-				'docstatus': 1,
-				'purpose': 'Material Transfer for Manufacture'
-			}, 'sum(fg_completed_qty)') or 0
+			self.transferred_qty = (
+				frappe.db.get_value(
+					"Stock Entry",
+					{
+						"job_card": self.name,
+						"work_order": self.work_order,
+						"docstatus": 1,
+						"purpose": "Material Transfer for Manufacture",
+					},
+					"sum(fg_completed_qty)",
+				)
+				or 0
+			)
 
 		self.db_set("transferred_qty", self.transferred_qty)
 
 		qty = 0
 		if self.work_order:
-			doc = frappe.get_doc('Work Order', self.work_order)
-			if doc.transfer_material_against == 'Job Card' and not doc.skip_transfer:
+			doc = frappe.get_doc("Work Order", self.work_order)
+			if doc.transfer_material_against == "Job Card" and not doc.skip_transfer:
 				completed = True
 				for d in doc.operations:
-					if d.status != 'Completed':
+					if d.status != "Completed":
 						completed = False
 						break
 
 				if completed:
-					job_cards = frappe.get_all('Job Card', filters = {'work_order': self.work_order,
-						'docstatus': ('!=', 2)}, fields = 'sum(transferred_qty) as qty', group_by='operation_id')
+					job_cards = frappe.get_all(
+						"Job Card",
+						filters={"work_order": self.work_order, "docstatus": ("!=", 2)},
+						fields="sum(transferred_qty) as qty",
+						group_by="operation_id",
+					)
 
 					if job_cards:
 						qty = min(d.qty for d in job_cards)
 
-			doc.db_set('material_transferred_for_manufacturing', qty)
+			doc.db_set("material_transferred_for_manufacturing", qty)
 
 		self.set_status(update_status)
 
 	def set_status(self, update_status=False):
-		if self.status == "On Hold": return
+		if self.status == "On Hold":
+			return
 
-		self.status = {
-			0: "Open",
-			1: "Submitted",
-			2: "Cancelled"
-		}[self.docstatus or 0]
+		self.status = {0: "Open", 1: "Submitted", 2: "Cancelled"}[self.docstatus or 0]
 
 		if self.for_quantity <= self.transferred_qty:
-			self.status = 'Material Transferred'
+			self.status = "Material Transferred"
 
 		if self.time_logs:
-			self.status = 'Work In Progress'
+			self.status = "Work In Progress"
 
-		if (self.docstatus == 1 and
-			(self.for_quantity <= self.total_completed_qty or not self.items)):
-			self.status = 'Completed'
+		if self.docstatus == 1 and (self.for_quantity <= self.total_completed_qty or not self.items):
+			self.status = "Completed"
 
 		if update_status:
-			self.db_set('status', self.status)
+			self.db_set("status", self.status)
 
 	def validate_operation_id(self):
-		if (self.get("operation_id") and self.get("operation_row_number") and self.operation and self.work_order and
-			frappe.get_cached_value("Work Order Operation", self.operation_row_number, "name") != self.operation_id):
+		if (
+			self.get("operation_id")
+			and self.get("operation_row_number")
+			and self.operation
+			and self.work_order
+			and frappe.get_cached_value("Work Order Operation", self.operation_row_number, "name")
+			!= self.operation_id
+		):
 			work_order = bold(get_link_to_form("Work Order", self.work_order))
-			frappe.throw(_("Operation {0} does not belong to the work order {1}")
-				.format(bold(self.operation), work_order), OperationMismatchError)
+			frappe.throw(
+				_("Operation {0} does not belong to the work order {1}").format(
+					bold(self.operation), work_order
+				),
+				OperationMismatchError,
+			)
 
 	def validate_sequence_id(self):
 		if self.is_corrective_job_card:
@@ -534,18 +638,25 @@
 
 		current_operation_qty += flt(self.total_completed_qty)
 
-		data = frappe.get_all("Work Order Operation",
-			fields = ["operation", "status", "completed_qty"],
-			filters={"docstatus": 1, "parent": self.work_order, "sequence_id": ('<', self.sequence_id)},
-			order_by = "sequence_id, idx")
+		data = frappe.get_all(
+			"Work Order Operation",
+			fields=["operation", "status", "completed_qty"],
+			filters={"docstatus": 1, "parent": self.work_order, "sequence_id": ("<", self.sequence_id)},
+			order_by="sequence_id, idx",
+		)
 
-		message = "Job Card {0}: As per the sequence of the operations in the work order {1}".format(bold(self.name),
-			bold(get_link_to_form("Work Order", self.work_order)))
+		message = "Job Card {0}: As per the sequence of the operations in the work order {1}".format(
+			bold(self.name), bold(get_link_to_form("Work Order", self.work_order))
+		)
 
 		for row in data:
 			if row.status != "Completed" and row.completed_qty < current_operation_qty:
-				frappe.throw(_("{0}, complete the operation {1} before the operation {2}.")
-					.format(message, bold(row.operation), bold(self.operation)), OperationSequenceError)
+				frappe.throw(
+					_("{0}, complete the operation {1} before the operation {2}.").format(
+						message, bold(row.operation), bold(self.operation)
+					),
+					OperationSequenceError,
+				)
 
 	def validate_work_order(self):
 		if self.is_work_order_closed():
@@ -553,13 +664,14 @@
 
 	def is_work_order_closed(self):
 		if self.work_order:
-			status = frappe.get_value('Work Order', self.work_order)
+			status = frappe.get_value("Work Order", self.work_order)
 
 			if status == "Closed":
 				return True
 
 		return False
 
+
 @frappe.whitelist()
 def make_time_log(args):
 	if isinstance(args, str):
@@ -570,16 +682,17 @@
 	doc.validate_sequence_id()
 	doc.add_time_log(args)
 
+
 @frappe.whitelist()
 def get_operation_details(work_order, operation):
 	if work_order and operation:
-		return frappe.get_all("Work Order Operation", fields = ["name", "idx"],
-			filters = {
-				"parent": work_order,
-				"operation": operation
-			}
+		return frappe.get_all(
+			"Work Order Operation",
+			fields=["name", "idx"],
+			filters={"parent": work_order, "operation": operation},
 		)
 
+
 @frappe.whitelist()
 def get_operations(doctype, txt, searchfield, start, page_len, filters):
 	if not filters.get("work_order"):
@@ -589,12 +702,16 @@
 	if txt:
 		args["operation"] = ("like", "%{0}%".format(txt))
 
-	return frappe.get_all("Work Order Operation",
-		filters = args,
-		fields = ["distinct operation as operation"],
-		limit_start = start,
-		limit_page_length = page_len,
-		order_by="idx asc", as_list=1)
+	return frappe.get_all(
+		"Work Order Operation",
+		filters=args,
+		fields=["distinct operation as operation"],
+		limit_start=start,
+		limit_page_length=page_len,
+		order_by="idx asc",
+		as_list=1,
+	)
+
 
 @frappe.whitelist()
 def make_material_request(source_name, target_doc=None):
@@ -604,26 +721,29 @@
 	def set_missing_values(source, target):
 		target.material_request_type = "Material Transfer"
 
-	doclist = get_mapped_doc("Job Card", source_name, {
-		"Job Card": {
-			"doctype": "Material Request",
-			"field_map": {
-				"name": "job_card",
+	doclist = get_mapped_doc(
+		"Job Card",
+		source_name,
+		{
+			"Job Card": {
+				"doctype": "Material Request",
+				"field_map": {
+					"name": "job_card",
+				},
+			},
+			"Job Card Item": {
+				"doctype": "Material Request Item",
+				"field_map": {"required_qty": "qty", "uom": "stock_uom", "name": "job_card_item"},
+				"postprocess": update_item,
 			},
 		},
-		"Job Card Item": {
-			"doctype": "Material Request Item",
-			"field_map": {
-				"required_qty": "qty",
-				"uom": "stock_uom",
-				"name": "job_card_item"
-			},
-			"postprocess": update_item,
-		}
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_stock_entry(source_name, target_doc=None):
 	def update_item(source, target, source_parent):
@@ -641,7 +761,7 @@
 		target.from_bom = 1
 
 		# avoid negative 'For Quantity'
-		pending_fg_qty = flt(source.get('for_quantity', 0)) - flt(source.get('transferred_qty', 0))
+		pending_fg_qty = flt(source.get("for_quantity", 0)) - flt(source.get("transferred_qty", 0))
 		target.fg_completed_qty = pending_fg_qty if pending_fg_qty > 0 else 0
 
 		target.set_transfer_qty()
@@ -649,36 +769,45 @@
 		target.set_missing_values()
 		target.set_stock_entry_type()
 
-		wo_allows_alternate_item = frappe.db.get_value("Work Order", target.work_order, "allow_alternative_item")
+		wo_allows_alternate_item = frappe.db.get_value(
+			"Work Order", target.work_order, "allow_alternative_item"
+		)
 		for item in target.items:
-			item.allow_alternative_item = int(wo_allows_alternate_item and
-					frappe.get_cached_value("Item", item.item_code, "allow_alternative_item"))
+			item.allow_alternative_item = int(
+				wo_allows_alternate_item
+				and frappe.get_cached_value("Item", item.item_code, "allow_alternative_item")
+			)
 
-	doclist = get_mapped_doc("Job Card", source_name, {
-		"Job Card": {
-			"doctype": "Stock Entry",
-			"field_map": {
-				"name": "job_card",
-				"for_quantity": "fg_completed_qty"
+	doclist = get_mapped_doc(
+		"Job Card",
+		source_name,
+		{
+			"Job Card": {
+				"doctype": "Stock Entry",
+				"field_map": {"name": "job_card", "for_quantity": "fg_completed_qty"},
+			},
+			"Job Card Item": {
+				"doctype": "Stock Entry Detail",
+				"field_map": {
+					"source_warehouse": "s_warehouse",
+					"required_qty": "qty",
+					"name": "job_card_item",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: doc.required_qty > 0,
 			},
 		},
-		"Job Card Item": {
-			"doctype": "Stock Entry Detail",
-			"field_map": {
-				"source_warehouse": "s_warehouse",
-				"required_qty": "qty",
-				"name": "job_card_item"
-			},
-			"postprocess": update_item,
-			"condition": lambda doc: doc.required_qty > 0
-		}
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 def time_diff_in_minutes(string_ed_date, string_st_date):
 	return time_diff(string_ed_date, string_st_date).total_seconds() / 60
 
+
 @frappe.whitelist()
 def get_job_details(start, end, filters=None):
 	events = []
@@ -686,41 +815,49 @@
 	event_color = {
 		"Completed": "#cdf5a6",
 		"Material Transferred": "#ffdd9e",
-		"Work In Progress": "#D3D3D3"
+		"Work In Progress": "#D3D3D3",
 	}
 
 	from frappe.desk.reportview import get_filters_cond
+
 	conditions = get_filters_cond("Job Card", filters, [])
 
-	job_cards = frappe.db.sql(""" SELECT `tabJob Card`.name, `tabJob Card`.work_order,
+	job_cards = frappe.db.sql(
+		""" SELECT `tabJob Card`.name, `tabJob Card`.work_order,
 			`tabJob Card`.status, ifnull(`tabJob Card`.remarks, ''),
 			min(`tabJob Card Time Log`.from_time) as from_time,
 			max(`tabJob Card Time Log`.to_time) as to_time
 		FROM `tabJob Card` , `tabJob Card Time Log`
 		WHERE
 			`tabJob Card`.name = `tabJob Card Time Log`.parent {0}
-			group by `tabJob Card`.name""".format(conditions), as_dict=1)
+			group by `tabJob Card`.name""".format(
+			conditions
+		),
+		as_dict=1,
+	)
 
 	for d in job_cards:
-			subject_data = []
-			for field in ["name", "work_order", "remarks"]:
-				if not d.get(field): continue
+		subject_data = []
+		for field in ["name", "work_order", "remarks"]:
+			if not d.get(field):
+				continue
 
-				subject_data.append(d.get(field))
+			subject_data.append(d.get(field))
 
-			color = event_color.get(d.status)
-			job_card_data = {
-				'from_time': d.from_time,
-				'to_time': d.to_time,
-				'name': d.name,
-				'subject': '\n'.join(subject_data),
-				'color': color if color else "#89bcde"
-			}
+		color = event_color.get(d.status)
+		job_card_data = {
+			"from_time": d.from_time,
+			"to_time": d.to_time,
+			"name": d.name,
+			"subject": "\n".join(subject_data),
+			"color": color if color else "#89bcde",
+		}
 
-			events.append(job_card_data)
+		events.append(job_card_data)
 
 	return events
 
+
 @frappe.whitelist()
 def make_corrective_job_card(source_name, operation=None, for_operation=None, target_doc=None):
 	def set_missing_values(source, target):
@@ -728,20 +865,26 @@
 		target.operation = operation
 		target.for_operation = for_operation
 
-		target.set('time_logs', [])
-		target.set('employee', [])
-		target.set('items', [])
+		target.set("time_logs", [])
+		target.set("employee", [])
+		target.set("items", [])
 		target.set_sub_operations()
 		target.get_required_items()
 		target.validate_time_logs()
 
-	doclist = get_mapped_doc("Job Card", source_name, {
-		"Job Card": {
-			"doctype": "Job Card",
-			"field_map": {
-				"name": "for_job_card",
-			},
-		}
-	}, target_doc, set_missing_values)
+	doclist = get_mapped_doc(
+		"Job Card",
+		source_name,
+		{
+			"Job Card": {
+				"doctype": "Job Card",
+				"field_map": {
+					"name": "for_job_card",
+				},
+			}
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
diff --git a/erpnext/manufacturing/doctype/job_card/job_card_dashboard.py b/erpnext/manufacturing/doctype/job_card/job_card_dashboard.py
index 2c48872..14c1f36 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card_dashboard.py
+++ b/erpnext/manufacturing/doctype/job_card/job_card_dashboard.py
@@ -3,18 +3,10 @@
 
 def get_data():
 	return {
-		'fieldname': 'job_card',
-		'non_standard_fieldnames': {
-			'Quality Inspection': 'reference_name'
-		},
-		'transactions': [
-			{
-				'label': _('Transactions'),
-				'items': ['Material Request', 'Stock Entry']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Quality Inspection']
-			}
-		]
+		"fieldname": "job_card",
+		"non_standard_fieldnames": {"Quality Inspection": "reference_name"},
+		"transactions": [
+			{"label": _("Transactions"), "items": ["Material Request", "Stock Entry"]},
+			{"label": _("Reference"), "items": ["Quality Inspection"]},
+		],
 	}
diff --git a/erpnext/manufacturing/doctype/job_card/test_job_card.py b/erpnext/manufacturing/doctype/job_card/test_job_card.py
index c5841c1..4647ddf 100644
--- a/erpnext/manufacturing/doctype/job_card/test_job_card.py
+++ b/erpnext/manufacturing/doctype/job_card/test_job_card.py
@@ -20,13 +20,11 @@
 
 		transfer_material_against, source_warehouse = None, None
 
-		tests_that_skip_setup = (
-			"test_job_card_material_transfer_correctness",
-		)
+		tests_that_skip_setup = ("test_job_card_material_transfer_correctness",)
 		tests_that_transfer_against_jc = (
 			"test_job_card_multiple_materials_transfer",
 			"test_job_card_excess_material_transfer",
-			"test_job_card_partial_material_transfer"
+			"test_job_card_partial_material_transfer",
 		)
 
 		if self._testMethodName in tests_that_skip_setup:
@@ -40,7 +38,7 @@
 			item="_Test FG Item 2",
 			qty=2,
 			transfer_material_against=transfer_material_against,
-			source_warehouse=source_warehouse
+			source_warehouse=source_warehouse,
 		)
 
 	def tearDown(self):
@@ -48,8 +46,9 @@
 
 	def test_job_card(self):
 
-		job_cards = frappe.get_all('Job Card',
-			filters = {'work_order': self.work_order.name}, fields = ["operation_id", "name"])
+		job_cards = frappe.get_all(
+			"Job Card", filters={"work_order": self.work_order.name}, fields=["operation_id", "name"]
+		)
 
 		if job_cards:
 			job_card = job_cards[0]
@@ -63,30 +62,38 @@
 			frappe.delete_doc("Job Card", d.name)
 
 	def test_job_card_with_different_work_station(self):
-		job_cards = frappe.get_all('Job Card',
-			filters = {'work_order': self.work_order.name},
-			fields = ["operation_id", "workstation", "name", "for_quantity"])
+		job_cards = frappe.get_all(
+			"Job Card",
+			filters={"work_order": self.work_order.name},
+			fields=["operation_id", "workstation", "name", "for_quantity"],
+		)
 
 		job_card = job_cards[0]
 
 		if job_card:
-			workstation = frappe.db.get_value("Workstation",
-				{"name": ("not in", [job_card.workstation])}, "name")
+			workstation = frappe.db.get_value(
+				"Workstation", {"name": ("not in", [job_card.workstation])}, "name"
+			)
 
 			if not workstation or job_card.workstation == workstation:
 				workstation = make_workstation(workstation_name=random_string(5)).name
 
 			doc = frappe.get_doc("Job Card", job_card.name)
 			doc.workstation = workstation
-			doc.append("time_logs", {
-				"from_time": "2009-01-01 12:06:25",
-				"to_time": "2009-01-01 12:37:25",
-				"time_in_mins": "31.00002",
-				"completed_qty": job_card.for_quantity
-			})
+			doc.append(
+				"time_logs",
+				{
+					"from_time": "2009-01-01 12:06:25",
+					"to_time": "2009-01-01 12:37:25",
+					"time_in_mins": "31.00002",
+					"completed_qty": job_card.for_quantity,
+				},
+			)
 			doc.submit()
 
-			completed_qty = frappe.db.get_value("Work Order Operation", job_card.operation_id, "completed_qty")
+			completed_qty = frappe.db.get_value(
+				"Work Order Operation", job_card.operation_id, "completed_qty"
+			)
 			self.assertEqual(completed_qty, job_card.for_quantity)
 
 			doc.cancel()
@@ -97,51 +104,49 @@
 	def test_job_card_overlap(self):
 		wo2 = make_wo_order_test_record(item="_Test FG Item 2", qty=2)
 
-		jc1_name = frappe.db.get_value("Job Card", {'work_order': self.work_order.name})
-		jc2_name = frappe.db.get_value("Job Card", {'work_order': wo2.name})
+		jc1_name = frappe.db.get_value("Job Card", {"work_order": self.work_order.name})
+		jc2_name = frappe.db.get_value("Job Card", {"work_order": wo2.name})
 
 		jc1 = frappe.get_doc("Job Card", jc1_name)
 		jc2 = frappe.get_doc("Job Card", jc2_name)
 
-		employee = "_T-Employee-00001" # from test records
+		employee = "_T-Employee-00001"  # from test records
 
-		jc1.append("time_logs", {
-			"from_time": "2021-01-01 00:00:00",
-			"to_time": "2021-01-01 08:00:00",
-			"completed_qty": 1,
-			"employee": employee,
-		})
+		jc1.append(
+			"time_logs",
+			{
+				"from_time": "2021-01-01 00:00:00",
+				"to_time": "2021-01-01 08:00:00",
+				"completed_qty": 1,
+				"employee": employee,
+			},
+		)
 		jc1.save()
 
 		# add a new entry in same time slice
-		jc2.append("time_logs", {
-			"from_time": "2021-01-01 00:01:00",
-			"to_time": "2021-01-01 06:00:00",
-			"completed_qty": 1,
-			"employee": employee,
-		})
+		jc2.append(
+			"time_logs",
+			{
+				"from_time": "2021-01-01 00:01:00",
+				"to_time": "2021-01-01 06:00:00",
+				"completed_qty": 1,
+				"employee": employee,
+			},
+		)
 		self.assertRaises(OverlapError, jc2.save)
 
 	def test_job_card_multiple_materials_transfer(self):
 		"Test transferring RMs separately against Job Card with multiple RMs."
+		make_stock_entry(item_code="_Test Item", target="Stores - _TC", qty=10, basic_rate=100)
 		make_stock_entry(
-			item_code="_Test Item",
-			target="Stores - _TC",
-			qty=10,
-			basic_rate=100
-		)
-		make_stock_entry(
-			item_code="_Test Item Home Desktop Manufactured",
-			target="Stores - _TC",
-			qty=6,
-			basic_rate=100
+			item_code="_Test Item Home Desktop Manufactured", target="Stores - _TC", qty=6, basic_rate=100
 		)
 
-		job_card_name = frappe.db.get_value("Job Card", {'work_order': self.work_order.name})
+		job_card_name = frappe.db.get_value("Job Card", {"work_order": self.work_order.name})
 		job_card = frappe.get_doc("Job Card", job_card_name)
 
 		transfer_entry_1 = make_stock_entry_from_jc(job_card_name)
-		del transfer_entry_1.items[1] # transfer only 1 of 2 RMs
+		del transfer_entry_1.items[1]  # transfer only 1 of 2 RMs
 		transfer_entry_1.insert()
 		transfer_entry_1.submit()
 
@@ -162,12 +167,12 @@
 
 	def test_job_card_excess_material_transfer(self):
 		"Test transferring more than required RM against Job Card."
-		make_stock_entry(item_code="_Test Item", target="Stores - _TC",
-			qty=25, basic_rate=100)
-		make_stock_entry(item_code="_Test Item Home Desktop Manufactured",
-			target="Stores - _TC", qty=15, basic_rate=100)
+		make_stock_entry(item_code="_Test Item", target="Stores - _TC", qty=25, basic_rate=100)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop Manufactured", target="Stores - _TC", qty=15, basic_rate=100
+		)
 
-		job_card_name = frappe.db.get_value("Job Card", {'work_order': self.work_order.name})
+		job_card_name = frappe.db.get_value("Job Card", {"work_order": self.work_order.name})
 		job_card = frappe.get_doc("Job Card", job_card_name)
 		self.assertEqual(job_card.status, "Open")
 
@@ -193,11 +198,10 @@
 		transfer_entry_3 = make_stock_entry_from_jc(job_card_name)
 		self.assertEqual(transfer_entry_3.fg_completed_qty, 0)
 
-		job_card.append("time_logs", {
-			"from_time": "2021-01-01 00:01:00",
-			"to_time": "2021-01-01 06:00:00",
-			"completed_qty": 2
-		})
+		job_card.append(
+			"time_logs",
+			{"from_time": "2021-01-01 00:01:00", "to_time": "2021-01-01 06:00:00", "completed_qty": 2},
+		)
 		job_card.save()
 		job_card.submit()
 
@@ -207,12 +211,12 @@
 	def test_job_card_partial_material_transfer(self):
 		"Test partial material transfer against Job Card"
 
-		make_stock_entry(item_code="_Test Item", target="Stores - _TC",
-			qty=25, basic_rate=100)
-		make_stock_entry(item_code="_Test Item Home Desktop Manufactured",
-			target="Stores - _TC", qty=15, basic_rate=100)
+		make_stock_entry(item_code="_Test Item", target="Stores - _TC", qty=25, basic_rate=100)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop Manufactured", target="Stores - _TC", qty=15, basic_rate=100
+		)
 
-		job_card_name = frappe.db.get_value("Job Card", {'work_order': self.work_order.name})
+		job_card_name = frappe.db.get_value("Job Card", {"work_order": self.work_order.name})
 		job_card = frappe.get_doc("Job Card", job_card_name)
 
 		# partially transfer
@@ -242,15 +246,14 @@
 
 	def test_job_card_material_transfer_correctness(self):
 		"""
-			1. Test if only current Job Card Items are pulled in a Stock Entry against a Job Card
-			2. Test impact of changing 'For Qty' in such a Stock Entry
+		1. Test if only current Job Card Items are pulled in a Stock Entry against a Job Card
+		2. Test impact of changing 'For Qty' in such a Stock Entry
 		"""
 		create_bom_with_multiple_operations()
 		work_order = make_wo_with_transfer_against_jc()
 
 		job_card_name = frappe.db.get_value(
-			"Job Card",
-			{"work_order": work_order.name,"operation": "Test Operation A"}
+			"Job Card", {"work_order": work_order.name, "operation": "Test Operation A"}
 		)
 		job_card = frappe.get_doc("Job Card", job_card_name)
 
@@ -276,6 +279,7 @@
 
 		# rollback via tearDown method
 
+
 def create_bom_with_multiple_operations():
 	"Create a BOM with multiple operations and Material Transfer against Job Card"
 	from erpnext.manufacturing.doctype.operation.test_operation import make_operation
@@ -287,19 +291,22 @@
 		"operation": "Test Operation A",
 		"workstation": "_Test Workstation A",
 		"hour_rate_rent": 300,
-		"time_in_mins": 60
+		"time_in_mins": 60,
 	}
 	make_workstation(row)
 	make_operation(row)
 
-	bom_doc.append("operations", {
-		"operation": "Test Operation A",
-		"description": "Test Operation A",
-		"workstation": "_Test Workstation A",
-		"hour_rate": 300,
-		"time_in_mins": 60,
-		"operating_cost": 100
-	})
+	bom_doc.append(
+		"operations",
+		{
+			"operation": "Test Operation A",
+			"description": "Test Operation A",
+			"workstation": "_Test Workstation A",
+			"hour_rate": 300,
+			"time_in_mins": 60,
+			"operating_cost": 100,
+		},
+	)
 
 	bom_doc.transfer_material_against = "Job Card"
 	bom_doc.save()
@@ -307,6 +314,7 @@
 
 	return bom_doc
 
+
 def make_wo_with_transfer_against_jc():
 	"Create a WO with multiple operations and Material Transfer against Job Card"
 
@@ -315,7 +323,7 @@
 		qty=4,
 		transfer_material_against="Job Card",
 		source_warehouse="Stores - _TC",
-		do_not_submit=True
+		do_not_submit=True,
 	)
 	work_order.required_items[0].operation = "Test Operation A"
 	work_order.required_items[1].operation = "_Test Operation 1"
@@ -323,8 +331,9 @@
 
 	return work_order
 
+
 def make_bom_for_jc_tests():
-	test_records = frappe.get_test_records('BOM')
+	test_records = frappe.get_test_records("BOM")
 	bom = frappe.copy_doc(test_records[2])
 	bom.set_rate_of_sub_assembly_item_based_on_bom = 0
 	bom.rm_cost_as_per = "Valuation Rate"
diff --git a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py
index c919e8b..730a857 100644
--- a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py
+++ b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py
@@ -11,14 +11,19 @@
 class ManufacturingSettings(Document):
 	pass
 
+
 def get_mins_between_operations():
-	return relativedelta(minutes=cint(frappe.db.get_single_value("Manufacturing Settings",
-		"mins_between_operations")) or 10)
+	return relativedelta(
+		minutes=cint(frappe.db.get_single_value("Manufacturing Settings", "mins_between_operations"))
+		or 10
+	)
+
 
 @frappe.whitelist()
 def is_material_consumption_enabled():
-	if not hasattr(frappe.local, 'material_consumption'):
-		frappe.local.material_consumption = cint(frappe.db.get_single_value('Manufacturing Settings',
-			'material_consumption'))
+	if not hasattr(frappe.local, "material_consumption"):
+		frappe.local.material_consumption = cint(
+			frappe.db.get_single_value("Manufacturing Settings", "material_consumption")
+		)
 
 	return frappe.local.material_consumption
diff --git a/erpnext/manufacturing/doctype/operation/operation.py b/erpnext/manufacturing/doctype/operation/operation.py
index 41726f3..9c8f9ac 100644
--- a/erpnext/manufacturing/doctype/operation/operation.py
+++ b/erpnext/manufacturing/doctype/operation/operation.py
@@ -19,12 +19,14 @@
 		operation_list = []
 		for row in self.sub_operations:
 			if row.operation in operation_list:
-				frappe.throw(_("The operation {0} can not add multiple times")
-					.format(frappe.bold(row.operation)))
+				frappe.throw(
+					_("The operation {0} can not add multiple times").format(frappe.bold(row.operation))
+				)
 
 			if self.name == row.operation:
-				frappe.throw(_("The operation {0} can not be the sub operation")
-					.format(frappe.bold(row.operation)))
+				frappe.throw(
+					_("The operation {0} can not be the sub operation").format(frappe.bold(row.operation))
+				)
 
 			operation_list.append(row.operation)
 
diff --git a/erpnext/manufacturing/doctype/operation/operation_dashboard.py b/erpnext/manufacturing/doctype/operation/operation_dashboard.py
index 9f7efa2..8dc901a 100644
--- a/erpnext/manufacturing/doctype/operation/operation_dashboard.py
+++ b/erpnext/manufacturing/doctype/operation/operation_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'operation',
-		'transactions': [
-			{
-				'label': _('Manufacture'),
-				'items': ['BOM', 'Work Order', 'Job Card']
-			}
-		]
+		"fieldname": "operation",
+		"transactions": [{"label": _("Manufacture"), "items": ["BOM", "Work Order", "Job Card"]}],
 	}
diff --git a/erpnext/manufacturing/doctype/operation/test_operation.py b/erpnext/manufacturing/doctype/operation/test_operation.py
index e511084..ce9f8e0 100644
--- a/erpnext/manufacturing/doctype/operation/test_operation.py
+++ b/erpnext/manufacturing/doctype/operation/test_operation.py
@@ -5,11 +5,13 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Operation')
+test_records = frappe.get_test_records("Operation")
+
 
 class TestOperation(unittest.TestCase):
 	pass
 
+
 def make_operation(*args, **kwargs):
 	args = args if args else kwargs
 	if isinstance(args, tuple):
@@ -18,11 +20,9 @@
 	args = frappe._dict(args)
 
 	if not frappe.db.exists("Operation", args.operation):
-		doc = frappe.get_doc({
-			"doctype": "Operation",
-			"name": args.operation,
-			"workstation": args.workstation
-		})
+		doc = frappe.get_doc(
+			{"doctype": "Operation", "name": args.operation, "workstation": args.workstation}
+		)
 		doc.insert()
 		return doc
 
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index 349f40e..89f9ca6 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -36,7 +36,7 @@
 
 	def set_pending_qty_in_row_without_reference(self):
 		"Set Pending Qty in independent rows (not from SO or MR)."
-		if self.docstatus > 0: # set only to initialise value before submit
+		if self.docstatus > 0:  # set only to initialise value before submit
 			return
 
 		for item in self.po_items:
@@ -49,7 +49,7 @@
 			self.total_planned_qty += flt(d.planned_qty)
 
 	def validate_data(self):
-		for d in self.get('po_items'):
+		for d in self.get("po_items"):
 			if not d.bom_no:
 				frappe.throw(_("Please select BOM for Item in Row {0}").format(d.idx))
 			else:
@@ -59,9 +59,9 @@
 				frappe.throw(_("Please enter Planned Qty for Item {0} at row {1}").format(d.item_code, d.idx))
 
 	def _rename_temporary_references(self):
-		""" po_items and sub_assembly_items items are both constructed client side without saving.
+		"""po_items and sub_assembly_items items are both constructed client side without saving.
 
-			Attempt to fix linkages by using temporary names to map final row names.
+		Attempt to fix linkages by using temporary names to map final row names.
 		"""
 		new_name_map = {d.temporary_name: d.name for d in self.po_items if d.temporary_name}
 		actual_names = {d.name for d in self.po_items}
@@ -72,7 +72,7 @@
 
 	@frappe.whitelist()
 	def get_open_sales_orders(self):
-		""" Pull sales orders  which are pending to deliver based on criteria selected"""
+		"""Pull sales orders  which are pending to deliver based on criteria selected"""
 		open_so = get_sales_orders(self)
 
 		if open_so:
@@ -81,20 +81,23 @@
 			frappe.msgprint(_("Sales orders are not available for production"))
 
 	def add_so_in_table(self, open_so):
-		""" Add sales orders in the table"""
-		self.set('sales_orders', [])
+		"""Add sales orders in the table"""
+		self.set("sales_orders", [])
 
 		for data in open_so:
-			self.append('sales_orders', {
-				'sales_order': data.name,
-				'sales_order_date': data.transaction_date,
-				'customer': data.customer,
-				'grand_total': data.base_grand_total
-			})
+			self.append(
+				"sales_orders",
+				{
+					"sales_order": data.name,
+					"sales_order_date": data.transaction_date,
+					"customer": data.customer,
+					"grand_total": data.base_grand_total,
+				},
+			)
 
 	@frappe.whitelist()
 	def get_pending_material_requests(self):
-		""" Pull Material Requests that are pending based on criteria selected"""
+		"""Pull Material Requests that are pending based on criteria selected"""
 		mr_filter = item_filter = ""
 		if self.from_date:
 			mr_filter += " and mr.transaction_date >= %(from_date)s"
@@ -106,7 +109,8 @@
 		if self.item_code:
 			item_filter += " and mr_item.item_code = %(item)s"
 
-		pending_mr = frappe.db.sql("""
+		pending_mr = frappe.db.sql(
+			"""
 			select distinct mr.name, mr.transaction_date
 			from `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
 			where mr_item.parent = mr.name
@@ -115,29 +119,34 @@
 				and mr_item.qty > ifnull(mr_item.ordered_qty,0) {0} {1}
 				and (exists (select name from `tabBOM` bom where bom.item=mr_item.item_code
 					and bom.is_active = 1))
-			""".format(mr_filter, item_filter), {
+			""".format(
+				mr_filter, item_filter
+			),
+			{
 				"from_date": self.from_date,
 				"to_date": self.to_date,
 				"warehouse": self.warehouse,
 				"item": self.item_code,
-				"company": self.company
-			}, as_dict=1)
+				"company": self.company,
+			},
+			as_dict=1,
+		)
 
 		self.add_mr_in_table(pending_mr)
 
 	def add_mr_in_table(self, pending_mr):
-		""" Add Material Requests in the table"""
-		self.set('material_requests', [])
+		"""Add Material Requests in the table"""
+		self.set("material_requests", [])
 
 		for data in pending_mr:
-			self.append('material_requests', {
-				'material_request': data.name,
-				'material_request_date': data.transaction_date
-			})
+			self.append(
+				"material_requests",
+				{"material_request": data.name, "material_request_date": data.transaction_date},
+			)
 
 	@frappe.whitelist()
 	def get_items(self):
-		self.set('po_items', [])
+		self.set("po_items", [])
 		if self.get_items_from == "Sales Order":
 			self.get_so_items()
 
@@ -152,10 +161,12 @@
 	def get_bom_item(self):
 		"""Check if Item or if its Template has a BOM."""
 		bom_item = None
-		has_bom = frappe.db.exists({'doctype': 'BOM', 'item': self.item_code, 'docstatus': 1})
+		has_bom = frappe.db.exists({"doctype": "BOM", "item": self.item_code, "docstatus": 1})
 		if not has_bom:
-			template_item = frappe.db.get_value('Item', self.item_code, ['variant_of'])
-			bom_item = "bom.item = {0}".format(frappe.db.escape(template_item)) if template_item else bom_item
+			template_item = frappe.db.get_value("Item", self.item_code, ["variant_of"])
+			bom_item = (
+				"bom.item = {0}".format(frappe.db.escape(template_item)) if template_item else bom_item
+			)
 		return bom_item
 
 	def get_so_items(self):
@@ -167,11 +178,12 @@
 
 		item_condition = ""
 		bom_item = "bom.item = so_item.item_code"
-		if self.item_code and frappe.db.exists('Item', self.item_code):
+		if self.item_code and frappe.db.exists("Item", self.item_code):
 			bom_item = self.get_bom_item() or bom_item
-			item_condition = ' and so_item.item_code = {0}'.format(frappe.db.escape(self.item_code))
+			item_condition = " and so_item.item_code = {0}".format(frappe.db.escape(self.item_code))
 
-		items = frappe.db.sql("""
+		items = frappe.db.sql(
+			"""
 			select
 				distinct parent, item_code, warehouse,
 				(qty - work_order_qty) * conversion_factor as pending_qty,
@@ -181,16 +193,17 @@
 			where
 				parent in (%s) and docstatus = 1 and qty > work_order_qty
 				and exists (select name from `tabBOM` bom where %s
-				and bom.is_active = 1) %s""" %
-			(", ".join(["%s"] * len(so_list)),
-			bom_item,
-			item_condition),
-			tuple(so_list), as_dict=1)
+				and bom.is_active = 1) %s"""
+			% (", ".join(["%s"] * len(so_list)), bom_item, item_condition),
+			tuple(so_list),
+			as_dict=1,
+		)
 
 		if self.item_code:
-			item_condition = ' and so_item.item_code = {0}'.format(frappe.db.escape(self.item_code))
+			item_condition = " and so_item.item_code = {0}".format(frappe.db.escape(self.item_code))
 
-		packed_items = frappe.db.sql("""select distinct pi.parent, pi.item_code, pi.warehouse as warehouse,
+		packed_items = frappe.db.sql(
+			"""select distinct pi.parent, pi.item_code, pi.warehouse as warehouse,
 			(((so_item.qty - so_item.work_order_qty) * pi.qty) / so_item.qty)
 				as pending_qty, pi.parent_item, pi.description, so_item.name
 			from `tabSales Order Item` so_item, `tabPacked Item` pi
@@ -198,16 +211,23 @@
 			and pi.parent_item = so_item.item_code
 			and so_item.parent in (%s) and so_item.qty > so_item.work_order_qty
 			and exists (select name from `tabBOM` bom where bom.item=pi.item_code
-					and bom.is_active = 1) %s""" % \
-			(", ".join(["%s"] * len(so_list)), item_condition), tuple(so_list), as_dict=1)
+					and bom.is_active = 1) %s"""
+			% (", ".join(["%s"] * len(so_list)), item_condition),
+			tuple(so_list),
+			as_dict=1,
+		)
 
 		self.add_items(items + packed_items)
 		self.calculate_total_planned_qty()
 
 	def get_mr_items(self):
 		# Check for empty table or empty rows
-		if not self.get("material_requests") or not self.get_so_mr_list("material_request", "material_requests"):
-			frappe.throw(_("Please fill the Material Requests table"), title=_("Material Requests Required"))
+		if not self.get("material_requests") or not self.get_so_mr_list(
+			"material_request", "material_requests"
+		):
+			frappe.throw(
+				_("Please fill the Material Requests table"), title=_("Material Requests Required")
+			)
 
 		mr_list = self.get_so_mr_list("material_request", "material_requests")
 
@@ -215,13 +235,17 @@
 		if self.item_code:
 			item_condition = " and mr_item.item_code ={0}".format(frappe.db.escape(self.item_code))
 
-		items = frappe.db.sql("""select distinct parent, name, item_code, warehouse, description,
+		items = frappe.db.sql(
+			"""select distinct parent, name, item_code, warehouse, description,
 			(qty - ordered_qty) * conversion_factor as pending_qty
 			from `tabMaterial Request Item` mr_item
 			where parent in (%s) and docstatus = 1 and qty > ordered_qty
 			and exists (select name from `tabBOM` bom where bom.item=mr_item.item_code
-				and bom.is_active = 1) %s""" % \
-			(", ".join(["%s"] * len(mr_list)), item_condition), tuple(mr_list), as_dict=1)
+				and bom.is_active = 1) %s"""
+			% (", ".join(["%s"] * len(mr_list)), item_condition),
+			tuple(mr_list),
+			as_dict=1,
+		)
 
 		self.add_items(items)
 		self.calculate_total_planned_qty()
@@ -232,37 +256,36 @@
 			item_details = get_item_details(data.item_code)
 			if self.combine_items:
 				if item_details.bom_no in refs:
-					refs[item_details.bom_no]['so_details'].append({
-						'sales_order': data.parent,
-						'sales_order_item': data.name,
-						'qty': data.pending_qty
-					})
-					refs[item_details.bom_no]['qty'] += data.pending_qty
+					refs[item_details.bom_no]["so_details"].append(
+						{"sales_order": data.parent, "sales_order_item": data.name, "qty": data.pending_qty}
+					)
+					refs[item_details.bom_no]["qty"] += data.pending_qty
 					continue
 
 				else:
 					refs[item_details.bom_no] = {
-						'qty': data.pending_qty,
-						'po_item_ref': data.name,
-						'so_details': []
+						"qty": data.pending_qty,
+						"po_item_ref": data.name,
+						"so_details": [],
 					}
-					refs[item_details.bom_no]['so_details'].append({
-						'sales_order': data.parent,
-						'sales_order_item': data.name,
-						'qty': data.pending_qty
-					})
+					refs[item_details.bom_no]["so_details"].append(
+						{"sales_order": data.parent, "sales_order_item": data.name, "qty": data.pending_qty}
+					)
 
-			pi = self.append('po_items', {
-				'warehouse': data.warehouse,
-				'item_code': data.item_code,
-				'description': data.description or item_details.description,
-				'stock_uom': item_details and item_details.stock_uom or '',
-				'bom_no': item_details and item_details.bom_no or '',
-				'planned_qty': data.pending_qty,
-				'pending_qty': data.pending_qty,
-				'planned_start_date': now_datetime(),
-				'product_bundle_item': data.parent_item
-			})
+			pi = self.append(
+				"po_items",
+				{
+					"warehouse": data.warehouse,
+					"item_code": data.item_code,
+					"description": data.description or item_details.description,
+					"stock_uom": item_details and item_details.stock_uom or "",
+					"bom_no": item_details and item_details.bom_no or "",
+					"planned_qty": data.pending_qty,
+					"pending_qty": data.pending_qty,
+					"planned_start_date": now_datetime(),
+					"product_bundle_item": data.parent_item,
+				},
+			)
 			pi._set_defaults()
 
 			if self.get_items_from == "Sales Order":
@@ -277,20 +300,23 @@
 
 		if refs:
 			for po_item in self.po_items:
-				po_item.planned_qty = refs[po_item.bom_no]['qty']
-				po_item.pending_qty = refs[po_item.bom_no]['qty']
-				po_item.sales_order = ''
+				po_item.planned_qty = refs[po_item.bom_no]["qty"]
+				po_item.pending_qty = refs[po_item.bom_no]["qty"]
+				po_item.sales_order = ""
 			self.add_pp_ref(refs)
 
 	def add_pp_ref(self, refs):
 		for bom_no in refs:
-			for so_detail in refs[bom_no]['so_details']:
-				self.append('prod_plan_references', {
-						'item_reference': refs[bom_no]['po_item_ref'],
-						'sales_order': so_detail['sales_order'],
-						'sales_order_item': so_detail['sales_order_item'],
-						'qty': so_detail['qty']
-				})
+			for so_detail in refs[bom_no]["so_details"]:
+				self.append(
+					"prod_plan_references",
+					{
+						"item_reference": refs[bom_no]["po_item_ref"],
+						"sales_order": so_detail["sales_order"],
+						"sales_order_item": so_detail["sales_order_item"],
+						"qty": so_detail["qty"],
+					},
+				)
 
 	def calculate_total_produced_qty(self):
 		self.total_produced_qty = 0
@@ -308,27 +334,24 @@
 
 		self.calculate_total_produced_qty()
 		self.set_status()
-		self.db_set('status', self.status)
+		self.db_set("status", self.status)
 
 	def on_cancel(self):
-		self.db_set('status', 'Cancelled')
+		self.db_set("status", "Cancelled")
 		self.delete_draft_work_order()
 
 	def delete_draft_work_order(self):
-		for d in frappe.get_all('Work Order', fields = ["name"],
-			filters = {'docstatus': 0, 'production_plan': ("=", self.name)}):
-			frappe.delete_doc('Work Order', d.name)
+		for d in frappe.get_all(
+			"Work Order", fields=["name"], filters={"docstatus": 0, "production_plan": ("=", self.name)}
+		):
+			frappe.delete_doc("Work Order", d.name)
 
 	@frappe.whitelist()
 	def set_status(self, close=None):
-		self.status = {
-			0: 'Draft',
-			1: 'Submitted',
-			2: 'Cancelled'
-		}.get(self.docstatus)
+		self.status = {0: "Draft", 1: "Submitted", 2: "Cancelled"}.get(self.docstatus)
 
 		if close:
-			self.db_set('status', 'Closed')
+			self.db_set("status", "Closed")
 			return
 
 		if self.total_produced_qty > 0:
@@ -336,12 +359,12 @@
 			if self.all_items_completed():
 				self.status = "Completed"
 
-		if self.status != 'Completed':
+		if self.status != "Completed":
 			self.update_ordered_status()
 			self.update_requested_status()
 
 		if close is not None:
-			self.db_set('status', self.status)
+			self.db_set("status", self.status)
 
 	def update_ordered_status(self):
 		update_status = False
@@ -349,8 +372,8 @@
 			if d.planned_qty == d.ordered_qty:
 				update_status = True
 
-		if update_status and self.status != 'Completed':
-			self.status = 'In Process'
+		if update_status and self.status != "Completed":
+			self.status = "In Process"
 
 	def update_requested_status(self):
 		if not self.mr_items:
@@ -362,44 +385,44 @@
 				update_status = False
 
 		if update_status:
-			self.status = 'Material Requested'
+			self.status = "Material Requested"
 
 	def get_production_items(self):
 		item_dict = {}
 
 		for d in self.po_items:
 			item_details = {
-				"production_item"		: d.item_code,
-				"use_multi_level_bom"   : d.include_exploded_items,
-				"sales_order"			: d.sales_order,
-				"sales_order_item"		: d.sales_order_item,
-				"material_request"		: d.material_request,
-				"material_request_item"	: d.material_request_item,
-				"bom_no"				: d.bom_no,
-				"description"			: d.description,
-				"stock_uom"				: d.stock_uom,
-				"company"				: self.company,
-				"fg_warehouse"			: d.warehouse,
-				"production_plan"       : self.name,
-				"production_plan_item"  : d.name,
-				"product_bundle_item"	: d.product_bundle_item,
-				"planned_start_date"    : d.planned_start_date,
-				"project"               : self.project
+				"production_item": d.item_code,
+				"use_multi_level_bom": d.include_exploded_items,
+				"sales_order": d.sales_order,
+				"sales_order_item": d.sales_order_item,
+				"material_request": d.material_request,
+				"material_request_item": d.material_request_item,
+				"bom_no": d.bom_no,
+				"description": d.description,
+				"stock_uom": d.stock_uom,
+				"company": self.company,
+				"fg_warehouse": d.warehouse,
+				"production_plan": self.name,
+				"production_plan_item": d.name,
+				"product_bundle_item": d.product_bundle_item,
+				"planned_start_date": d.planned_start_date,
+				"project": self.project,
 			}
 
-			if not item_details['project'] and d.sales_order:
-				item_details['project'] = frappe.get_cached_value("Sales Order", d.sales_order, "project")
+			if not item_details["project"] and d.sales_order:
+				item_details["project"] = frappe.get_cached_value("Sales Order", d.sales_order, "project")
 
 			if self.get_items_from == "Material Request":
-				item_details.update({
-					"qty": d.planned_qty
-				})
+				item_details.update({"qty": d.planned_qty})
 				item_dict[(d.item_code, d.material_request_item, d.warehouse)] = item_details
 			else:
-				item_details.update({
-					"qty": flt(item_dict.get((d.item_code, d.sales_order, d.warehouse),{})
-						.get("qty")) + (flt(d.planned_qty) - flt(d.ordered_qty))
-				})
+				item_details.update(
+					{
+						"qty": flt(item_dict.get((d.item_code, d.sales_order, d.warehouse), {}).get("qty"))
+						+ (flt(d.planned_qty) - flt(d.ordered_qty))
+					}
+				)
 				item_dict[(d.item_code, d.sales_order, d.warehouse)] = item_details
 
 		return item_dict
@@ -415,15 +438,15 @@
 		self.make_work_order_for_finished_goods(wo_list, default_warehouses)
 		self.make_work_order_for_subassembly_items(wo_list, subcontracted_po, default_warehouses)
 		self.make_subcontracted_purchase_order(subcontracted_po, po_list)
-		self.show_list_created_message('Work Order', wo_list)
-		self.show_list_created_message('Purchase Order', po_list)
+		self.show_list_created_message("Work Order", wo_list)
+		self.show_list_created_message("Purchase Order", po_list)
 
 	def make_work_order_for_finished_goods(self, wo_list, default_warehouses):
 		items_data = self.get_production_items()
 
 		for key, item in items_data.items():
 			if self.sub_assembly_items:
-				item['use_multi_level_bom'] = 0
+				item["use_multi_level_bom"] = 0
 
 			set_default_warehouses(item, default_warehouses)
 			work_order = self.create_work_order(item)
@@ -432,13 +455,13 @@
 
 	def make_work_order_for_subassembly_items(self, wo_list, subcontracted_po, default_warehouses):
 		for row in self.sub_assembly_items:
-			if row.type_of_manufacturing == 'Subcontract':
+			if row.type_of_manufacturing == "Subcontract":
 				subcontracted_po.setdefault(row.supplier, []).append(row)
 				continue
 
 			work_order_data = {
-				'wip_warehouse': default_warehouses.get('wip_warehouse'),
-				'fg_warehouse': default_warehouses.get('fg_warehouse')
+				"wip_warehouse": default_warehouses.get("wip_warehouse"),
+				"fg_warehouse": default_warehouses.get("fg_warehouse"),
 			}
 
 			self.prepare_data_for_sub_assembly_items(row, work_order_data)
@@ -447,41 +470,59 @@
 				wo_list.append(work_order)
 
 	def prepare_data_for_sub_assembly_items(self, row, wo_data):
-		for field in ["production_item", "item_name", "qty", "fg_warehouse",
-			"description", "bom_no", "stock_uom", "bom_level",
-			"production_plan_item", "schedule_date"]:
+		for field in [
+			"production_item",
+			"item_name",
+			"qty",
+			"fg_warehouse",
+			"description",
+			"bom_no",
+			"stock_uom",
+			"bom_level",
+			"production_plan_item",
+			"schedule_date",
+		]:
 			if row.get(field):
 				wo_data[field] = row.get(field)
 
-		wo_data.update({
-			"use_multi_level_bom": 0,
-			"production_plan": self.name,
-			"production_plan_sub_assembly_item": row.name
-		})
+		wo_data.update(
+			{
+				"use_multi_level_bom": 0,
+				"production_plan": self.name,
+				"production_plan_sub_assembly_item": row.name,
+			}
+		)
 
 	def make_subcontracted_purchase_order(self, subcontracted_po, purchase_orders):
 		if not subcontracted_po:
 			return
 
 		for supplier, po_list in subcontracted_po.items():
-			po = frappe.new_doc('Purchase Order')
+			po = frappe.new_doc("Purchase Order")
 			po.supplier = supplier
 			po.schedule_date = getdate(po_list[0].schedule_date) if po_list[0].schedule_date else nowdate()
-			po.is_subcontracted = 'Yes'
+			po.is_subcontracted = "Yes"
 			for row in po_list:
 				po_data = {
-					'item_code': row.production_item,
-					'warehouse': row.fg_warehouse,
-					'production_plan_sub_assembly_item': row.name,
-					'bom': row.bom_no,
-					'production_plan': self.name
+					"item_code": row.production_item,
+					"warehouse": row.fg_warehouse,
+					"production_plan_sub_assembly_item": row.name,
+					"bom": row.bom_no,
+					"production_plan": self.name,
 				}
 
-				for field in ['schedule_date', 'qty', 'uom', 'stock_uom', 'item_name',
-					'description', 'production_plan_item']:
+				for field in [
+					"schedule_date",
+					"qty",
+					"uom",
+					"stock_uom",
+					"item_name",
+					"description",
+					"production_plan_item",
+				]:
 					po_data[field] = row.get(field)
 
-				po.append('items', po_data)
+				po.append("items", po_data)
 
 			po.set_missing_values()
 			po.flags.ignore_mandatory = True
@@ -503,7 +544,7 @@
 
 		wo = frappe.new_doc("Work Order")
 		wo.update(item)
-		wo.planned_start_date = item.get('planned_start_date') or item.get('schedule_date')
+		wo.planned_start_date = item.get("planned_start_date") or item.get("schedule_date")
 
 		if item.get("warehouse"):
 			wo.fg_warehouse = item.get("warehouse")
@@ -521,54 +562,60 @@
 
 	@frappe.whitelist()
 	def make_material_request(self):
-		'''Create Material Requests grouped by Sales Order and Material Request Type'''
+		"""Create Material Requests grouped by Sales Order and Material Request Type"""
 		material_request_list = []
 		material_request_map = {}
 
 		for item in self.mr_items:
-			item_doc = frappe.get_cached_doc('Item', item.item_code)
+			item_doc = frappe.get_cached_doc("Item", item.item_code)
 
 			material_request_type = item.material_request_type or item_doc.default_material_request_type
 
 			# key for Sales Order:Material Request Type:Customer
-			key = '{}:{}:{}'.format(item.sales_order, material_request_type, item_doc.customer or '')
+			key = "{}:{}:{}".format(item.sales_order, material_request_type, item_doc.customer or "")
 			schedule_date = add_days(nowdate(), cint(item_doc.lead_time_days))
 
 			if not key in material_request_map:
 				# make a new MR for the combination
 				material_request_map[key] = frappe.new_doc("Material Request")
 				material_request = material_request_map[key]
-				material_request.update({
-					"transaction_date": nowdate(),
-					"status": "Draft",
-					"company": self.company,
-					'material_request_type': material_request_type,
-					'customer': item_doc.customer or ''
-				})
+				material_request.update(
+					{
+						"transaction_date": nowdate(),
+						"status": "Draft",
+						"company": self.company,
+						"material_request_type": material_request_type,
+						"customer": item_doc.customer or "",
+					}
+				)
 				material_request_list.append(material_request)
 			else:
 				material_request = material_request_map[key]
 
 			# add item
-			material_request.append("items", {
-				"item_code": item.item_code,
-				"from_warehouse": item.from_warehouse,
-				"qty": item.quantity,
-				"schedule_date": schedule_date,
-				"warehouse": item.warehouse,
-				"sales_order": item.sales_order,
-				'production_plan': self.name,
-				'material_request_plan_item': item.name,
-				"project": frappe.db.get_value("Sales Order", item.sales_order, "project") \
-					if item.sales_order else None
-			})
+			material_request.append(
+				"items",
+				{
+					"item_code": item.item_code,
+					"from_warehouse": item.from_warehouse,
+					"qty": item.quantity,
+					"schedule_date": schedule_date,
+					"warehouse": item.warehouse,
+					"sales_order": item.sales_order,
+					"production_plan": self.name,
+					"material_request_plan_item": item.name,
+					"project": frappe.db.get_value("Sales Order", item.sales_order, "project")
+					if item.sales_order
+					else None,
+				},
+			)
 
 		for material_request in material_request_list:
 			# submit
 			material_request.flags.ignore_permissions = 1
 			material_request.run_method("set_missing_values")
 
-			if self.get('submit_material_request'):
+			if self.get("submit_material_request"):
 				material_request.submit()
 			else:
 				material_request.save()
@@ -576,17 +623,19 @@
 		frappe.flags.mute_messages = False
 
 		if material_request_list:
-			material_request_list = ["""<a href="/app/Form/Material Request/{0}">{1}</a>""".format(m.name, m.name) \
-				for m in material_request_list]
+			material_request_list = [
+				"""<a href="/app/Form/Material Request/{0}">{1}</a>""".format(m.name, m.name)
+				for m in material_request_list
+			]
 			msgprint(_("{0} created").format(comma_and(material_request_list)))
-		else :
+		else:
 			msgprint(_("No material request created"))
 
 	@frappe.whitelist()
 	def get_sub_assembly_items(self, manufacturing_type=None):
 		"Fetch sub assembly items and optionally combine them."
 		self.sub_assembly_items = []
-		sub_assembly_items_store = [] # temporary store to process all subassembly items
+		sub_assembly_items_store = []  # temporary store to process all subassembly items
 
 		for row in self.po_items:
 			bom_data = []
@@ -598,7 +647,7 @@
 			# Combine subassembly items
 			sub_assembly_items_store = self.combine_subassembly_items(sub_assembly_items_store)
 
-		sub_assembly_items_store.sort(key= lambda d: d.bom_level, reverse=True) # sort by bom level
+		sub_assembly_items_store.sort(key=lambda d: d.bom_level, reverse=True)  # sort by bom level
 
 		for idx, row in enumerate(sub_assembly_items_store):
 			row.idx = idx + 1
@@ -611,16 +660,19 @@
 			data.production_plan_item = row.name
 			data.fg_warehouse = row.warehouse
 			data.schedule_date = row.planned_start_date
-			data.type_of_manufacturing = manufacturing_type or ("Subcontract" if data.is_sub_contracted_item
-				else "In House")
+			data.type_of_manufacturing = manufacturing_type or (
+				"Subcontract" if data.is_sub_contracted_item else "In House"
+			)
 
 	def combine_subassembly_items(self, sub_assembly_items_store):
 		"Aggregate if same: Item, Warehouse, Inhouse/Outhouse Manu.g, BOM No."
 		key_wise_data = {}
 		for row in sub_assembly_items_store:
 			key = (
-				row.get("production_item"), row.get("fg_warehouse"),
-				row.get("bom_no"), row.get("type_of_manufacturing")
+				row.get("production_item"),
+				row.get("fg_warehouse"),
+				row.get("bom_no"),
+				row.get("type_of_manufacturing"),
 			)
 			if key not in key_wise_data:
 				# intialise (item, wh, bom no, man.g type) wise dict
@@ -638,12 +690,15 @@
 				# add row with key
 				key_wise_data[key] = row
 
-		sub_assembly_items_store = [key_wise_data[key] for key in key_wise_data] # unpack into single level list
+		sub_assembly_items_store = [
+			key_wise_data[key] for key in key_wise_data
+		]  # unpack into single level list
 		return sub_assembly_items_store
 
 	def all_items_completed(self):
-		all_items_produced = all(flt(d.planned_qty) - flt(d.produced_qty) < 0.000001
-									for d in self.po_items)
+		all_items_produced = all(
+			flt(d.planned_qty) - flt(d.produced_qty) < 0.000001 for d in self.po_items
+		)
 		if not all_items_produced:
 			return False
 
@@ -660,40 +715,81 @@
 		all_work_orders_completed = all(s == "Completed" for s in wo_status)
 		return all_work_orders_completed
 
+
 @frappe.whitelist()
 def download_raw_materials(doc, warehouses=None):
 	if isinstance(doc, str):
 		doc = frappe._dict(json.loads(doc))
 
-	item_list = [['Item Code', 'Item Name', 'Description',
-		'Stock UOM', 'Warehouse', 'Required Qty as per BOM',
-		'Projected Qty', 'Available Qty In Hand', 'Ordered Qty', 'Planned Qty',
-		'Reserved Qty for Production', 'Safety Stock', 'Required Qty']]
+	item_list = [
+		[
+			"Item Code",
+			"Item Name",
+			"Description",
+			"Stock UOM",
+			"Warehouse",
+			"Required Qty as per BOM",
+			"Projected Qty",
+			"Available Qty In Hand",
+			"Ordered Qty",
+			"Planned Qty",
+			"Reserved Qty for Production",
+			"Safety Stock",
+			"Required Qty",
+		]
+	]
 
 	doc.warehouse = None
 	frappe.flags.show_qty_in_stock_uom = 1
-	items = get_items_for_material_requests(doc, warehouses=warehouses, get_parent_warehouse_data=True)
+	items = get_items_for_material_requests(
+		doc, warehouses=warehouses, get_parent_warehouse_data=True
+	)
 
 	for d in items:
-		item_list.append([d.get('item_code'), d.get('item_name'),
-			d.get('description'), d.get('stock_uom'), d.get('warehouse'),
-			d.get('required_bom_qty'), d.get('projected_qty'), d.get('actual_qty'), d.get('ordered_qty'),
-			d.get('planned_qty'), d.get('reserved_qty_for_production'), d.get('safety_stock'), d.get('quantity')])
+		item_list.append(
+			[
+				d.get("item_code"),
+				d.get("item_name"),
+				d.get("description"),
+				d.get("stock_uom"),
+				d.get("warehouse"),
+				d.get("required_bom_qty"),
+				d.get("projected_qty"),
+				d.get("actual_qty"),
+				d.get("ordered_qty"),
+				d.get("planned_qty"),
+				d.get("reserved_qty_for_production"),
+				d.get("safety_stock"),
+				d.get("quantity"),
+			]
+		)
 
-		if not doc.get('for_warehouse'):
-			row = {'item_code': d.get('item_code')}
+		if not doc.get("for_warehouse"):
+			row = {"item_code": d.get("item_code")}
 			for bin_dict in get_bin_details(row, doc.company, all_warehouse=True):
-				if d.get("warehouse") == bin_dict.get('warehouse'):
+				if d.get("warehouse") == bin_dict.get("warehouse"):
 					continue
 
-				item_list.append(['', '', '', bin_dict.get('warehouse'), '',
-					bin_dict.get('projected_qty', 0), bin_dict.get('actual_qty', 0),
-					bin_dict.get('ordered_qty', 0), bin_dict.get('reserved_qty_for_production', 0)])
+				item_list.append(
+					[
+						"",
+						"",
+						"",
+						bin_dict.get("warehouse"),
+						"",
+						bin_dict.get("projected_qty", 0),
+						bin_dict.get("actual_qty", 0),
+						bin_dict.get("ordered_qty", 0),
+						bin_dict.get("reserved_qty_for_production", 0),
+					]
+				)
 
 	build_csv_response(item_list, doc.name)
 
+
 def get_exploded_items(item_details, company, bom_no, include_non_stock_items, planned_qty=1):
-	for d in frappe.db.sql("""select bei.item_code, item.default_bom as bom,
+	for d in frappe.db.sql(
+		"""select bei.item_code, item.default_bom as bom,
 			ifnull(sum(bei.stock_qty/ifnull(bom.quantity, 1)), 0)*%s as qty, item.item_name,
 			bei.description, bei.stock_uom, item.min_order_qty, bei.source_warehouse,
 			item.default_material_request_type, item.min_order_qty, item_default.default_warehouse,
@@ -709,21 +805,38 @@
 		where
 			bei.docstatus < 2
 			and bom.name=%s and item.is_stock_item in (1, {0})
-		group by bei.item_code, bei.stock_uom""".format(0 if include_non_stock_items else 1),
-		(planned_qty, company, bom_no), as_dict=1):
+		group by bei.item_code, bei.stock_uom""".format(
+			0 if include_non_stock_items else 1
+		),
+		(planned_qty, company, bom_no),
+		as_dict=1,
+	):
 		if not d.conversion_factor and d.purchase_uom:
 			d.conversion_factor = get_uom_conversion_factor(d.item_code, d.purchase_uom)
-		item_details.setdefault(d.get('item_code'), d)
+		item_details.setdefault(d.get("item_code"), d)
 
 	return item_details
 
-def get_uom_conversion_factor(item_code, uom):
-	return frappe.db.get_value('UOM Conversion Detail',
-		{'parent': item_code, 'uom': uom}, 'conversion_factor')
 
-def get_subitems(doc, data, item_details, bom_no, company, include_non_stock_items,
-	include_subcontracted_items, parent_qty, planned_qty=1):
-	items = frappe.db.sql("""
+def get_uom_conversion_factor(item_code, uom):
+	return frappe.db.get_value(
+		"UOM Conversion Detail", {"parent": item_code, "uom": uom}, "conversion_factor"
+	)
+
+
+def get_subitems(
+	doc,
+	data,
+	item_details,
+	bom_no,
+	company,
+	include_non_stock_items,
+	include_subcontracted_items,
+	parent_qty,
+	planned_qty=1,
+):
+	items = frappe.db.sql(
+		"""
 		SELECT
 			bom_item.item_code, default_material_request_type, item.item_name,
 			ifnull(%(parent_qty)s * sum(bom_item.stock_qty/ifnull(bom.quantity, 1)) * %(planned_qty)s, 0) as qty,
@@ -743,15 +856,15 @@
 			bom.name = %(bom)s
 			and bom_item.docstatus < 2
 			and item.is_stock_item in (1, {0})
-		group by bom_item.item_code""".format(0 if include_non_stock_items else 1),{
-			'bom': bom_no,
-			'parent_qty': parent_qty,
-			'planned_qty': planned_qty,
-			'company': company
-		}, as_dict=1)
+		group by bom_item.item_code""".format(
+			0 if include_non_stock_items else 1
+		),
+		{"bom": bom_no, "parent_qty": parent_qty, "planned_qty": planned_qty, "company": company},
+		as_dict=1,
+	)
 
 	for d in items:
-		if not data.get('include_exploded_items') or not d.default_bom:
+		if not data.get("include_exploded_items") or not d.default_bom:
 			if d.item_code in item_details:
 				item_details[d.item_code].qty = item_details[d.item_code].qty + d.qty
 			else:
@@ -760,89 +873,107 @@
 
 				item_details[d.item_code] = d
 
-		if data.get('include_exploded_items') and d.default_bom:
-			if ((d.default_material_request_type in ["Manufacture", "Purchase"] and
-				not d.is_sub_contracted) or (d.is_sub_contracted and include_subcontracted_items)):
+		if data.get("include_exploded_items") and d.default_bom:
+			if (
+				d.default_material_request_type in ["Manufacture", "Purchase"] and not d.is_sub_contracted
+			) or (d.is_sub_contracted and include_subcontracted_items):
 				if d.qty > 0:
-					get_subitems(doc, data, item_details, d.default_bom, company,
-						include_non_stock_items, include_subcontracted_items, d.qty)
+					get_subitems(
+						doc,
+						data,
+						item_details,
+						d.default_bom,
+						company,
+						include_non_stock_items,
+						include_subcontracted_items,
+						d.qty,
+					)
 	return item_details
 
-def get_material_request_items(row, sales_order, company,
-	ignore_existing_ordered_qty, include_safety_stock, warehouse, bin_dict):
-	total_qty = row['qty']
+
+def get_material_request_items(
+	row, sales_order, company, ignore_existing_ordered_qty, include_safety_stock, warehouse, bin_dict
+):
+	total_qty = row["qty"]
 
 	required_qty = 0
 	if ignore_existing_ordered_qty or bin_dict.get("projected_qty", 0) < 0:
 		required_qty = total_qty
 	elif total_qty > bin_dict.get("projected_qty", 0):
 		required_qty = total_qty - bin_dict.get("projected_qty", 0)
-	if required_qty > 0 and required_qty < row['min_order_qty']:
-		required_qty = row['min_order_qty']
+	if required_qty > 0 and required_qty < row["min_order_qty"]:
+		required_qty = row["min_order_qty"]
 	item_group_defaults = get_item_group_defaults(row.item_code, company)
 
-	if not row['purchase_uom']:
-		row['purchase_uom'] = row['stock_uom']
+	if not row["purchase_uom"]:
+		row["purchase_uom"] = row["stock_uom"]
 
-	if row['purchase_uom'] != row['stock_uom']:
-		if not (row['conversion_factor'] or frappe.flags.show_qty_in_stock_uom):
-			frappe.throw(_("UOM Conversion factor ({0} -> {1}) not found for item: {2}")
-				.format(row['purchase_uom'], row['stock_uom'], row.item_code))
+	if row["purchase_uom"] != row["stock_uom"]:
+		if not (row["conversion_factor"] or frappe.flags.show_qty_in_stock_uom):
+			frappe.throw(
+				_("UOM Conversion factor ({0} -> {1}) not found for item: {2}").format(
+					row["purchase_uom"], row["stock_uom"], row.item_code
+				)
+			)
 
-			required_qty = required_qty / row['conversion_factor']
+			required_qty = required_qty / row["conversion_factor"]
 
-	if frappe.db.get_value("UOM", row['purchase_uom'], "must_be_whole_number"):
+	if frappe.db.get_value("UOM", row["purchase_uom"], "must_be_whole_number"):
 		required_qty = ceil(required_qty)
 
 	if include_safety_stock:
-		required_qty += flt(row['safety_stock'])
+		required_qty += flt(row["safety_stock"])
 
 	if required_qty > 0:
 		return {
-			'item_code': row.item_code,
-			'item_name': row.item_name,
-			'quantity': required_qty,
-			'required_bom_qty': total_qty,
-			'stock_uom': row.get("stock_uom"),
-			'warehouse': warehouse or row.get('source_warehouse') \
-				or row.get('default_warehouse') or item_group_defaults.get("default_warehouse"),
-			'safety_stock': row.safety_stock,
-			'actual_qty': bin_dict.get("actual_qty", 0),
-			'projected_qty': bin_dict.get("projected_qty", 0),
-			'ordered_qty': bin_dict.get("ordered_qty", 0),
-			'reserved_qty_for_production': bin_dict.get("reserved_qty_for_production", 0),
-			'min_order_qty': row['min_order_qty'],
-			'material_request_type': row.get("default_material_request_type"),
-			'sales_order': sales_order,
-			'description': row.get("description"),
-			'uom': row.get("purchase_uom") or row.get("stock_uom")
+			"item_code": row.item_code,
+			"item_name": row.item_name,
+			"quantity": required_qty,
+			"required_bom_qty": total_qty,
+			"stock_uom": row.get("stock_uom"),
+			"warehouse": warehouse
+			or row.get("source_warehouse")
+			or row.get("default_warehouse")
+			or item_group_defaults.get("default_warehouse"),
+			"safety_stock": row.safety_stock,
+			"actual_qty": bin_dict.get("actual_qty", 0),
+			"projected_qty": bin_dict.get("projected_qty", 0),
+			"ordered_qty": bin_dict.get("ordered_qty", 0),
+			"reserved_qty_for_production": bin_dict.get("reserved_qty_for_production", 0),
+			"min_order_qty": row["min_order_qty"],
+			"material_request_type": row.get("default_material_request_type"),
+			"sales_order": sales_order,
+			"description": row.get("description"),
+			"uom": row.get("purchase_uom") or row.get("stock_uom"),
 		}
 
+
 def get_sales_orders(self):
 	so_filter = item_filter = ""
 	bom_item = "bom.item = so_item.item_code"
 
 	date_field_mapper = {
-		'from_date': ('>=', 'so.transaction_date'),
-		'to_date': ('<=', 'so.transaction_date'),
-		'from_delivery_date': ('>=', 'so_item.delivery_date'),
-		'to_delivery_date': ('<=', 'so_item.delivery_date')
+		"from_date": (">=", "so.transaction_date"),
+		"to_date": ("<=", "so.transaction_date"),
+		"from_delivery_date": (">=", "so_item.delivery_date"),
+		"to_delivery_date": ("<=", "so_item.delivery_date"),
 	}
 
 	for field, value in date_field_mapper.items():
 		if self.get(field):
 			so_filter += f" and {value[1]} {value[0]} %({field})s"
 
-	for field in ['customer', 'project', 'sales_order_status']:
+	for field in ["customer", "project", "sales_order_status"]:
 		if self.get(field):
-			so_field = 'status' if field == 'sales_order_status' else field
+			so_field = "status" if field == "sales_order_status" else field
 			so_filter += f" and so.{so_field} = %({field})s"
 
-	if self.item_code and frappe.db.exists('Item', self.item_code):
+	if self.item_code and frappe.db.exists("Item", self.item_code):
 		bom_item = self.get_bom_item() or bom_item
 		item_filter += " and so_item.item_code = %(item_code)s"
 
-	open_so = frappe.db.sql(f"""
+	open_so = frappe.db.sql(
+		f"""
 		select distinct so.name, so.transaction_date, so.customer, so.base_grand_total
 		from `tabSales Order` so, `tabSales Order Item` so_item
 		where so_item.parent = so.name
@@ -855,10 +986,14 @@
 					where pi.parent = so.name and pi.parent_item = so_item.item_code
 						and exists (select name from `tabBOM` bom where bom.item=pi.item_code
 							and bom.is_active = 1)))
-		""", self.as_dict(), as_dict=1)
+		""",
+		self.as_dict(),
+		as_dict=1,
+	)
 
 	return open_so
 
+
 @frappe.whitelist()
 def get_bin_details(row, company, for_warehouse=None, all_warehouse=False):
 	if isinstance(row, str):
@@ -867,30 +1002,42 @@
 	company = frappe.db.escape(company)
 	conditions, warehouse = "", ""
 
-	conditions = " and warehouse in (select name from `tabWarehouse` where company = {0})".format(company)
+	conditions = " and warehouse in (select name from `tabWarehouse` where company = {0})".format(
+		company
+	)
 	if not all_warehouse:
-		warehouse = for_warehouse or row.get('source_warehouse') or row.get('default_warehouse')
+		warehouse = for_warehouse or row.get("source_warehouse") or row.get("default_warehouse")
 
 	if warehouse:
 		lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"])
 		conditions = """ and warehouse in (select name from `tabWarehouse`
 			where lft >= {0} and rgt <= {1} and name=`tabBin`.warehouse and company = {2})
-		""".format(lft, rgt, company)
+		""".format(
+			lft, rgt, company
+		)
 
-	return frappe.db.sql(""" select ifnull(sum(projected_qty),0) as projected_qty,
+	return frappe.db.sql(
+		""" select ifnull(sum(projected_qty),0) as projected_qty,
 		ifnull(sum(actual_qty),0) as actual_qty, ifnull(sum(ordered_qty),0) as ordered_qty,
 		ifnull(sum(reserved_qty_for_production),0) as reserved_qty_for_production, warehouse,
 		ifnull(sum(planned_qty),0) as planned_qty
 		from `tabBin` where item_code = %(item_code)s {conditions}
 		group by item_code, warehouse
-	""".format(conditions=conditions), { "item_code": row['item_code'] }, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		{"item_code": row["item_code"]},
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def get_so_details(sales_order):
-	return frappe.db.get_value("Sales Order", sales_order,
-		['transaction_date', 'customer', 'grand_total'], as_dict=1
+	return frappe.db.get_value(
+		"Sales Order", sales_order, ["transaction_date", "customer", "grand_total"], as_dict=1
 	)
 
+
 def get_warehouse_list(warehouses):
 	warehouse_list = []
 
@@ -898,7 +1045,7 @@
 		warehouses = json.loads(warehouses)
 
 	for row in warehouses:
-		child_warehouses = frappe.db.get_descendants('Warehouse', row.get("warehouse"))
+		child_warehouses = frappe.db.get_descendants("Warehouse", row.get("warehouse"))
 		if child_warehouses:
 			warehouse_list.extend(child_warehouses)
 		else:
@@ -906,6 +1053,7 @@
 
 	return warehouse_list
 
+
 @frappe.whitelist()
 def get_items_for_material_requests(doc, warehouses=None, get_parent_warehouse_data=None):
 	if isinstance(doc, str):
@@ -914,73 +1062,92 @@
 	if warehouses:
 		warehouses = list(set(get_warehouse_list(warehouses)))
 
-		if doc.get("for_warehouse") and not get_parent_warehouse_data and doc.get("for_warehouse") in warehouses:
+		if (
+			doc.get("for_warehouse")
+			and not get_parent_warehouse_data
+			and doc.get("for_warehouse") in warehouses
+		):
 			warehouses.remove(doc.get("for_warehouse"))
 
-	doc['mr_items'] = []
+	doc["mr_items"] = []
 
-	po_items = doc.get('po_items') if doc.get('po_items') else doc.get('items')
+	po_items = doc.get("po_items") if doc.get("po_items") else doc.get("items")
 	# Check for empty table or empty rows
-	if not po_items or not [row.get('item_code') for row in po_items if row.get('item_code')]:
-		frappe.throw(_("Items to Manufacture are required to pull the Raw Materials associated with it."),
-			title=_("Items Required"))
+	if not po_items or not [row.get("item_code") for row in po_items if row.get("item_code")]:
+		frappe.throw(
+			_("Items to Manufacture are required to pull the Raw Materials associated with it."),
+			title=_("Items Required"),
+		)
 
-	company = doc.get('company')
-	ignore_existing_ordered_qty = doc.get('ignore_existing_ordered_qty')
-	include_safety_stock = doc.get('include_safety_stock')
+	company = doc.get("company")
+	ignore_existing_ordered_qty = doc.get("ignore_existing_ordered_qty")
+	include_safety_stock = doc.get("include_safety_stock")
 
 	so_item_details = frappe._dict()
 	for data in po_items:
 		if not data.get("include_exploded_items") and doc.get("sub_assembly_items"):
 			data["include_exploded_items"] = 1
 
-		planned_qty = data.get('required_qty') or data.get('planned_qty')
-		ignore_existing_ordered_qty = data.get('ignore_existing_ordered_qty') or ignore_existing_ordered_qty
-		warehouse = doc.get('for_warehouse')
+		planned_qty = data.get("required_qty") or data.get("planned_qty")
+		ignore_existing_ordered_qty = (
+			data.get("ignore_existing_ordered_qty") or ignore_existing_ordered_qty
+		)
+		warehouse = doc.get("for_warehouse")
 
 		item_details = {}
 		if data.get("bom") or data.get("bom_no"):
-			if data.get('required_qty'):
-				bom_no = data.get('bom')
+			if data.get("required_qty"):
+				bom_no = data.get("bom")
 				include_non_stock_items = 1
-				include_subcontracted_items = 1 if data.get('include_exploded_items') else 0
+				include_subcontracted_items = 1 if data.get("include_exploded_items") else 0
 			else:
-				bom_no = data.get('bom_no')
-				include_subcontracted_items = doc.get('include_subcontracted_items')
-				include_non_stock_items = doc.get('include_non_stock_items')
+				bom_no = data.get("bom_no")
+				include_subcontracted_items = doc.get("include_subcontracted_items")
+				include_non_stock_items = doc.get("include_non_stock_items")
 
 			if not planned_qty:
-				frappe.throw(_("For row {0}: Enter Planned Qty").format(data.get('idx')))
+				frappe.throw(_("For row {0}: Enter Planned Qty").format(data.get("idx")))
 
 			if bom_no:
-				if data.get('include_exploded_items') and include_subcontracted_items:
+				if data.get("include_exploded_items") and include_subcontracted_items:
 					# fetch exploded items from BOM
-					item_details = get_exploded_items(item_details,
-						company, bom_no, include_non_stock_items, planned_qty=planned_qty)
+					item_details = get_exploded_items(
+						item_details, company, bom_no, include_non_stock_items, planned_qty=planned_qty
+					)
 				else:
-					item_details = get_subitems(doc, data, item_details, bom_no, company,
-						include_non_stock_items, include_subcontracted_items, 1, planned_qty=planned_qty)
-		elif data.get('item_code'):
-			item_master = frappe.get_doc('Item', data['item_code']).as_dict()
+					item_details = get_subitems(
+						doc,
+						data,
+						item_details,
+						bom_no,
+						company,
+						include_non_stock_items,
+						include_subcontracted_items,
+						1,
+						planned_qty=planned_qty,
+					)
+		elif data.get("item_code"):
+			item_master = frappe.get_doc("Item", data["item_code"]).as_dict()
 			purchase_uom = item_master.purchase_uom or item_master.stock_uom
-			conversion_factor = (get_uom_conversion_factor(item_master.name, purchase_uom)
-				if item_master.purchase_uom else 1.0)
+			conversion_factor = (
+				get_uom_conversion_factor(item_master.name, purchase_uom) if item_master.purchase_uom else 1.0
+			)
 
 			item_details[item_master.name] = frappe._dict(
 				{
-					'item_name' : item_master.item_name,
-					'default_bom' : doc.bom,
-					'purchase_uom' : purchase_uom,
-					'default_warehouse': item_master.default_warehouse,
-					'min_order_qty' : item_master.min_order_qty,
-					'default_material_request_type' : item_master.default_material_request_type,
-					'qty': planned_qty or 1,
-					'is_sub_contracted' : item_master.is_subcontracted_item,
-					'item_code' : item_master.name,
-					'description' : item_master.description,
-					'stock_uom' : item_master.stock_uom,
-					'conversion_factor' : conversion_factor,
-					'safety_stock': item_master.safety_stock
+					"item_name": item_master.item_name,
+					"default_bom": doc.bom,
+					"purchase_uom": purchase_uom,
+					"default_warehouse": item_master.default_warehouse,
+					"min_order_qty": item_master.min_order_qty,
+					"default_material_request_type": item_master.default_material_request_type,
+					"qty": planned_qty or 1,
+					"is_sub_contracted": item_master.is_subcontracted_item,
+					"item_code": item_master.name,
+					"description": item_master.description,
+					"stock_uom": item_master.stock_uom,
+					"conversion_factor": conversion_factor,
+					"safety_stock": item_master.safety_stock,
 				}
 			)
 
@@ -989,7 +1156,9 @@
 		for item_code, details in item_details.items():
 			so_item_details.setdefault(sales_order, frappe._dict())
 			if item_code in so_item_details.get(sales_order, {}):
-				so_item_details[sales_order][item_code]['qty'] = so_item_details[sales_order][item_code].get("qty", 0) + flt(details.qty)
+				so_item_details[sales_order][item_code]["qty"] = so_item_details[sales_order][item_code].get(
+					"qty", 0
+				) + flt(details.qty)
 			else:
 				so_item_details[sales_order][item_code] = details
 
@@ -1001,8 +1170,15 @@
 			bin_dict = bin_dict[0] if bin_dict else {}
 
 			if details.qty > 0:
-				items = get_material_request_items(details, sales_order, company,
-					ignore_existing_ordered_qty, include_safety_stock, warehouse, bin_dict)
+				items = get_material_request_items(
+					details,
+					sales_order,
+					company,
+					ignore_existing_ordered_qty,
+					include_safety_stock,
+					warehouse,
+					bin_dict,
+				)
 				if items:
 					mr_items.append(items)
 
@@ -1015,18 +1191,26 @@
 
 	if not mr_items:
 		to_enable = frappe.bold(_("Ignore Existing Projected Quantity"))
-		warehouse = frappe.bold(doc.get('for_warehouse'))
-		message = _("As there are sufficient raw materials, Material Request is not required for Warehouse {0}.").format(warehouse) + "<br><br>"
+		warehouse = frappe.bold(doc.get("for_warehouse"))
+		message = (
+			_(
+				"As there are sufficient raw materials, Material Request is not required for Warehouse {0}."
+			).format(warehouse)
+			+ "<br><br>"
+		)
 		message += _("If you still want to proceed, please enable {0}.").format(to_enable)
 
 		frappe.msgprint(message, title=_("Note"))
 
 	return mr_items
 
+
 def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
 	from erpnext.stock.doctype.pick_list.pick_list import get_available_item_locations
-	locations = get_available_item_locations(item.get("item_code"),
-		warehouses, item.get("quantity"), company, ignore_validation=True)
+
+	locations = get_available_item_locations(
+		item.get("item_code"), warehouses, item.get("quantity"), company, ignore_validation=True
+	)
 
 	required_qty = item.get("quantity")
 	# get available material by transferring to production warehouse
@@ -1037,12 +1221,14 @@
 		new_dict = copy.deepcopy(item)
 		quantity = required_qty if d.get("qty") > required_qty else d.get("qty")
 
-		new_dict.update({
-			"quantity": quantity,
-			"material_request_type": "Material Transfer",
-			"uom": new_dict.get("stock_uom"),  # internal transfer should be in stock UOM
-			"from_warehouse": d.get("warehouse")
-		})
+		new_dict.update(
+			{
+				"quantity": quantity,
+				"material_request_type": "Material Transfer",
+				"uom": new_dict.get("stock_uom"),  # internal transfer should be in stock UOM
+				"from_warehouse": d.get("warehouse"),
+			}
+		)
 
 		required_qty -= quantity
 		new_mr_items.append(new_dict)
@@ -1050,16 +1236,17 @@
 	# raise purchase request for remaining qty
 	if required_qty:
 		stock_uom, purchase_uom = frappe.db.get_value(
-			'Item',
-			item['item_code'],
-			['stock_uom', 'purchase_uom']
+			"Item", item["item_code"], ["stock_uom", "purchase_uom"]
 		)
 
-		if purchase_uom != stock_uom and purchase_uom == item['uom']:
-			conversion_factor = get_uom_conversion_factor(item['item_code'], item['uom'])
+		if purchase_uom != stock_uom and purchase_uom == item["uom"]:
+			conversion_factor = get_uom_conversion_factor(item["item_code"], item["uom"])
 			if not (conversion_factor or frappe.flags.show_qty_in_stock_uom):
-				frappe.throw(_("UOM Conversion factor ({0} -> {1}) not found for item: {2}")
-					.format(purchase_uom, stock_uom, item['item_code']))
+				frappe.throw(
+					_("UOM Conversion factor ({0} -> {1}) not found for item: {2}").format(
+						purchase_uom, stock_uom, item["item_code"]
+					)
+				)
 
 			required_qty = required_qty / conversion_factor
 
@@ -1070,6 +1257,7 @@
 
 		new_mr_items.append(item)
 
+
 @frappe.whitelist()
 def get_item_data(item_code):
 	item_details = get_item_details(item_code)
@@ -1077,33 +1265,39 @@
 	return {
 		"bom_no": item_details.get("bom_no"),
 		"stock_uom": item_details.get("stock_uom")
-#		"description": item_details.get("description")
+		# 		"description": item_details.get("description")
 	}
 
+
 def get_sub_assembly_items(bom_no, bom_data, to_produce_qty, indent=0):
 	data = get_bom_children(parent=bom_no)
 	for d in data:
 		if d.expandable:
 			parent_item_code = frappe.get_cached_value("BOM", bom_no, "item")
 			stock_qty = (d.stock_qty / d.parent_bom_qty) * flt(to_produce_qty)
-			bom_data.append(frappe._dict({
-				'parent_item_code': parent_item_code,
-				'description': d.description,
-				'production_item': d.item_code,
-				'item_name': d.item_name,
-				'stock_uom': d.stock_uom,
-				'uom': d.stock_uom,
-				'bom_no': d.value,
-				'is_sub_contracted_item': d.is_sub_contracted_item,
-				'bom_level': indent,
-				'indent': indent,
-				'stock_qty': stock_qty
-			}))
+			bom_data.append(
+				frappe._dict(
+					{
+						"parent_item_code": parent_item_code,
+						"description": d.description,
+						"production_item": d.item_code,
+						"item_name": d.item_name,
+						"stock_uom": d.stock_uom,
+						"uom": d.stock_uom,
+						"bom_no": d.value,
+						"is_sub_contracted_item": d.is_sub_contracted_item,
+						"bom_level": indent,
+						"indent": indent,
+						"stock_qty": stock_qty,
+					}
+				)
+			)
 
 			if d.value:
-				get_sub_assembly_items(d.value, bom_data, stock_qty, indent=indent+1)
+				get_sub_assembly_items(d.value, bom_data, stock_qty, indent=indent + 1)
+
 
 def set_default_warehouses(row, default_warehouses):
-	for field in ['wip_warehouse', 'fg_warehouse']:
+	for field in ["wip_warehouse", "fg_warehouse"]:
 		if not row.get(field):
 			row[field] = default_warehouses.get(field)
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan_dashboard.py b/erpnext/manufacturing/doctype/production_plan/production_plan_dashboard.py
index e13f042..6fc28a3 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan_dashboard.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan_dashboard.py
@@ -3,15 +3,9 @@
 
 def get_data():
 	return {
-		'fieldname': 'production_plan',
-		'transactions': [
-			{
-				'label': _('Transactions'),
-				'items': ['Work Order', 'Material Request']
-			},
-			{
-				'label': _('Subcontract'),
-				'items': ['Purchase Order']
-			},
-		]
+		"fieldname": "production_plan",
+		"transactions": [
+			{"label": _("Transactions"), "items": ["Work Order", "Material Request"]},
+			{"label": _("Subcontract"), "items": ["Purchase Order"]},
+		],
 	}
diff --git a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
index ec49703..891a497 100644
--- a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
@@ -21,80 +21,88 @@
 
 class TestProductionPlan(FrappeTestCase):
 	def setUp(self):
-		for item in ['Test Production Item 1', 'Subassembly Item 1',
-			'Raw Material Item 1', 'Raw Material Item 2']:
+		for item in [
+			"Test Production Item 1",
+			"Subassembly Item 1",
+			"Raw Material Item 1",
+			"Raw Material Item 2",
+		]:
 			create_item(item, valuation_rate=100)
 
-			sr = frappe.db.get_value('Stock Reconciliation Item',
-				{'item_code': item, 'docstatus': 1}, 'parent')
+			sr = frappe.db.get_value(
+				"Stock Reconciliation Item", {"item_code": item, "docstatus": 1}, "parent"
+			)
 			if sr:
-				sr_doc = frappe.get_doc('Stock Reconciliation', sr)
+				sr_doc = frappe.get_doc("Stock Reconciliation", sr)
 				sr_doc.cancel()
 
-		create_item('Test Non Stock Raw Material', is_stock_item=0)
-		for item, raw_materials in {'Subassembly Item 1': ['Raw Material Item 1', 'Raw Material Item 2'],
-			'Test Production Item 1': ['Raw Material Item 1', 'Subassembly Item 1',
-			'Test Non Stock Raw Material']}.items():
-			if not frappe.db.get_value('BOM', {'item': item}):
-				make_bom(item = item, raw_materials = raw_materials)
+		create_item("Test Non Stock Raw Material", is_stock_item=0)
+		for item, raw_materials in {
+			"Subassembly Item 1": ["Raw Material Item 1", "Raw Material Item 2"],
+			"Test Production Item 1": [
+				"Raw Material Item 1",
+				"Subassembly Item 1",
+				"Test Non Stock Raw Material",
+			],
+		}.items():
+			if not frappe.db.get_value("BOM", {"item": item}):
+				make_bom(item=item, raw_materials=raw_materials)
 
 	def tearDown(self) -> None:
 		frappe.db.rollback()
 
 	def test_production_plan_mr_creation(self):
 		"Test if MRs are created for unavailable raw materials."
-		pln = create_production_plan(item_code='Test Production Item 1')
+		pln = create_production_plan(item_code="Test Production Item 1")
 		self.assertTrue(len(pln.mr_items), 2)
 
 		pln.make_material_request()
 		pln.reload()
-		self.assertTrue(pln.status, 'Material Requested')
+		self.assertTrue(pln.status, "Material Requested")
 
 		material_requests = frappe.get_all(
-			'Material Request Item',
-			fields = ['distinct parent'],
-			filters = {'production_plan': pln.name},
-			as_list=1
+			"Material Request Item",
+			fields=["distinct parent"],
+			filters={"production_plan": pln.name},
+			as_list=1,
 		)
 
 		self.assertTrue(len(material_requests), 2)
 
 		pln.make_work_order()
-		work_orders = frappe.get_all('Work Order', fields = ['name'],
-			filters = {'production_plan': pln.name}, as_list=1)
+		work_orders = frappe.get_all(
+			"Work Order", fields=["name"], filters={"production_plan": pln.name}, as_list=1
+		)
 
 		self.assertTrue(len(work_orders), len(pln.po_items))
 
 		for name in material_requests:
-			mr = frappe.get_doc('Material Request', name[0])
+			mr = frappe.get_doc("Material Request", name[0])
 			if mr.docstatus != 0:
 				mr.cancel()
 
 		for name in work_orders:
-			mr = frappe.delete_doc('Work Order', name[0])
+			mr = frappe.delete_doc("Work Order", name[0])
 
-		pln = frappe.get_doc('Production Plan', pln.name)
+		pln = frappe.get_doc("Production Plan", pln.name)
 		pln.cancel()
 
 	def test_production_plan_start_date(self):
 		"Test if Work Order has same Planned Start Date as Prod Plan."
 		planned_date = add_to_date(date=None, days=3)
 		plan = create_production_plan(
-			item_code='Test Production Item 1',
-			planned_start_date=planned_date
+			item_code="Test Production Item 1", planned_start_date=planned_date
 		)
 		plan.make_work_order()
 
 		work_orders = frappe.get_all(
-			'Work Order',
-			fields = ['name', 'planned_start_date'],
-			filters = {'production_plan': plan.name}
+			"Work Order", fields=["name", "planned_start_date"], filters={"production_plan": plan.name}
 		)
 
 		self.assertEqual(work_orders[0].planned_start_date, planned_date)
 
 		for wo in work_orders:
-			frappe.delete_doc('Work Order', wo.name)
+			frappe.delete_doc("Work Order", wo.name)
 
 		plan.reload()
 		plan.cancel()
@@ -104,15 +112,14 @@
 		- Enable 'ignore_existing_ordered_qty'.
 		- Test if MR Planning table pulls Raw Material Qty even if it is in stock.
 		"""
-		sr1 = create_stock_reconciliation(item_code="Raw Material Item 1",
-			target="_Test Warehouse - _TC", qty=1, rate=110)
-		sr2 = create_stock_reconciliation(item_code="Raw Material Item 2",
-			target="_Test Warehouse - _TC", qty=1, rate=120)
-
-		pln = create_production_plan(
-			item_code='Test Production Item 1',
-			ignore_existing_ordered_qty=1
+		sr1 = create_stock_reconciliation(
+			item_code="Raw Material Item 1", target="_Test Warehouse - _TC", qty=1, rate=110
 		)
+		sr2 = create_stock_reconciliation(
+			item_code="Raw Material Item 2", target="_Test Warehouse - _TC", qty=1, rate=120
+		)
+
+		pln = create_production_plan(item_code="Test Production Item 1", ignore_existing_ordered_qty=1)
 		self.assertTrue(len(pln.mr_items))
 		self.assertTrue(flt(pln.mr_items[0].quantity), 1.0)
 
@@ -122,19 +129,13 @@
 
 	def test_production_plan_with_non_stock_item(self):
 		"Test if MR Planning table includes Non Stock RM."
-		pln = create_production_plan(
-			item_code='Test Production Item 1',
-			include_non_stock_items=1
-		)
+		pln = create_production_plan(item_code="Test Production Item 1", include_non_stock_items=1)
 		self.assertTrue(len(pln.mr_items), 3)
 		pln.cancel()
 
 	def test_production_plan_without_multi_level(self):
 		"Test MR Planning table for non exploded BOM."
-		pln = create_production_plan(
-			item_code='Test Production Item 1',
-			use_multi_level_bom=0
-		)
+		pln = create_production_plan(item_code="Test Production Item 1", use_multi_level_bom=0)
 		self.assertTrue(len(pln.mr_items), 2)
 		pln.cancel()
 
@@ -144,15 +145,15 @@
 		- Test if MR Planning table avoids pulling Raw Material Qty as it is in stock for
 		non exploded BOM.
 		"""
-		sr1 = create_stock_reconciliation(item_code="Raw Material Item 1",
-			target="_Test Warehouse - _TC", qty=1, rate=130)
-		sr2 = create_stock_reconciliation(item_code="Subassembly Item 1",
-			target="_Test Warehouse - _TC", qty=1, rate=140)
+		sr1 = create_stock_reconciliation(
+			item_code="Raw Material Item 1", target="_Test Warehouse - _TC", qty=1, rate=130
+		)
+		sr2 = create_stock_reconciliation(
+			item_code="Subassembly Item 1", target="_Test Warehouse - _TC", qty=1, rate=140
+		)
 
 		pln = create_production_plan(
-			item_code='Test Production Item 1',
-			use_multi_level_bom=0,
-			ignore_existing_ordered_qty=0
+			item_code="Test Production Item 1", use_multi_level_bom=0, ignore_existing_ordered_qty=0
 		)
 		self.assertFalse(len(pln.mr_items))
 
@@ -162,73 +163,86 @@
 
 	def test_production_plan_sales_orders(self):
 		"Test if previously fulfilled SO (with WO) is pulled into Prod Plan."
-		item = 'Test Production Item 1'
+		item = "Test Production Item 1"
 		so = make_sales_order(item_code=item, qty=1)
 		sales_order = so.name
 		sales_order_item = so.items[0].name
 
-		pln = frappe.new_doc('Production Plan')
+		pln = frappe.new_doc("Production Plan")
 		pln.company = so.company
-		pln.get_items_from = 'Sales Order'
+		pln.get_items_from = "Sales Order"
 
-		pln.append('sales_orders', {
-			'sales_order': so.name,
-			'sales_order_date': so.transaction_date,
-			'customer': so.customer,
-			'grand_total': so.grand_total
-		})
+		pln.append(
+			"sales_orders",
+			{
+				"sales_order": so.name,
+				"sales_order_date": so.transaction_date,
+				"customer": so.customer,
+				"grand_total": so.grand_total,
+			},
+		)
 
 		pln.get_so_items()
 		pln.submit()
 		pln.make_work_order()
 
-		work_order = frappe.db.get_value('Work Order', {'sales_order': sales_order,
-			'production_plan': pln.name, 'sales_order_item': sales_order_item}, 'name')
+		work_order = frappe.db.get_value(
+			"Work Order",
+			{"sales_order": sales_order, "production_plan": pln.name, "sales_order_item": sales_order_item},
+			"name",
+		)
 
-		wo_doc = frappe.get_doc('Work Order', work_order)
-		wo_doc.update({
-			'wip_warehouse': 'Work In Progress - _TC',
-			'fg_warehouse': 'Finished Goods - _TC'
-		})
+		wo_doc = frappe.get_doc("Work Order", work_order)
+		wo_doc.update(
+			{"wip_warehouse": "Work In Progress - _TC", "fg_warehouse": "Finished Goods - _TC"}
+		)
 		wo_doc.submit()
 
-		so_wo_qty = frappe.db.get_value('Sales Order Item', sales_order_item, 'work_order_qty')
+		so_wo_qty = frappe.db.get_value("Sales Order Item", sales_order_item, "work_order_qty")
 		self.assertTrue(so_wo_qty, 5)
 
-		pln = frappe.new_doc('Production Plan')
-		pln.update({
-			'from_date': so.transaction_date,
-			'to_date': so.transaction_date,
-			'customer': so.customer,
-			'item_code': item,
-			'sales_order_status': so.status
-		})
+		pln = frappe.new_doc("Production Plan")
+		pln.update(
+			{
+				"from_date": so.transaction_date,
+				"to_date": so.transaction_date,
+				"customer": so.customer,
+				"item_code": item,
+				"sales_order_status": so.status,
+			}
+		)
 		sales_orders = get_sales_orders(pln) or {}
-		sales_orders = [d.get('name') for d in sales_orders if d.get('name') == sales_order]
+		sales_orders = [d.get("name") for d in sales_orders if d.get("name") == sales_order]
 
 		self.assertEqual(sales_orders, [])
 
 	def test_production_plan_combine_items(self):
 		"Test combining FG items in Production Plan."
-		item = 'Test Production Item 1'
+		item = "Test Production Item 1"
 		so1 = make_sales_order(item_code=item, qty=1)
 
-		pln = frappe.new_doc('Production Plan')
+		pln = frappe.new_doc("Production Plan")
 		pln.company = so1.company
-		pln.get_items_from = 'Sales Order'
-		pln.append('sales_orders', {
-			'sales_order': so1.name,
-			'sales_order_date': so1.transaction_date,
-			'customer': so1.customer,
-			'grand_total': so1.grand_total
-		})
+		pln.get_items_from = "Sales Order"
+		pln.append(
+			"sales_orders",
+			{
+				"sales_order": so1.name,
+				"sales_order_date": so1.transaction_date,
+				"customer": so1.customer,
+				"grand_total": so1.grand_total,
+			},
+		)
 		so2 = make_sales_order(item_code=item, qty=2)
-		pln.append('sales_orders', {
-			'sales_order': so2.name,
-			'sales_order_date': so2.transaction_date,
-			'customer': so2.customer,
-			'grand_total': so2.grand_total
-		})
+		pln.append(
+			"sales_orders",
+			{
+				"sales_order": so2.name,
+				"sales_order_date": so2.transaction_date,
+				"customer": so2.customer,
+				"grand_total": so2.grand_total,
+			},
+		)
 		pln.combine_items = 1
 		pln.get_items()
 		pln.submit()
@@ -236,26 +250,31 @@
 		self.assertTrue(pln.po_items[0].planned_qty, 3)
 
 		pln.make_work_order()
-		work_order = frappe.db.get_value('Work Order', {
-			'production_plan_item': pln.po_items[0].name,
-			'production_plan': pln.name
-		}, 'name')
+		work_order = frappe.db.get_value(
+			"Work Order",
+			{"production_plan_item": pln.po_items[0].name, "production_plan": pln.name},
+			"name",
+		)
 
-		wo_doc = frappe.get_doc('Work Order', work_order)
-		wo_doc.update({
-			'wip_warehouse': 'Work In Progress - _TC',
-		})
+		wo_doc = frappe.get_doc("Work Order", work_order)
+		wo_doc.update(
+			{
+				"wip_warehouse": "Work In Progress - _TC",
+			}
+		)
 
 		wo_doc.submit()
 		so_items = []
 		for plan_reference in pln.prod_plan_references:
 			so_items.append(plan_reference.sales_order_item)
-			so_wo_qty = frappe.db.get_value('Sales Order Item', plan_reference.sales_order_item, 'work_order_qty')
+			so_wo_qty = frappe.db.get_value(
+				"Sales Order Item", plan_reference.sales_order_item, "work_order_qty"
+			)
 			self.assertEqual(so_wo_qty, plan_reference.qty)
 
 		wo_doc.cancel()
 		for so_item in so_items:
-			so_wo_qty = frappe.db.get_value('Sales Order Item', so_item, 'work_order_qty')
+			so_wo_qty = frappe.db.get_value("Sales Order Item", so_item, "work_order_qty")
 			self.assertEqual(so_wo_qty, 0.0)
 
 		pln.reload()
@@ -269,12 +288,8 @@
 		"""
 		from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
 
-		bom_tree_1 = {
-			"Red-Car": {"Wheel": {"Rubber": {}}}
-		}
-		bom_tree_2 = {
-			"Green-Car": {"Wheel": {"Rubber": {}}}
-		}
+		bom_tree_1 = {"Red-Car": {"Wheel": {"Rubber": {}}}}
+		bom_tree_2 = {"Green-Car": {"Wheel": {"Rubber": {}}}}
 
 		parent_bom_1 = create_nested_bom(bom_tree_1, prefix="")
 		parent_bom_2 = create_nested_bom(bom_tree_2, prefix="")
@@ -284,20 +299,23 @@
 		frappe.db.set_value("BOM Item", parent_bom_2.items[0].name, "bom_no", subassembly_bom)
 
 		plan = create_production_plan(item_code="Red-Car", use_multi_level_bom=1, do_not_save=True)
-		plan.append("po_items", { # Add Green-Car to Prod Plan
-			'use_multi_level_bom': 1,
-			'item_code': "Green-Car",
-			'bom_no': frappe.db.get_value('Item', "Green-Car", 'default_bom'),
-			'planned_qty': 1,
-			'planned_start_date': now_datetime()
-		})
+		plan.append(
+			"po_items",
+			{  # Add Green-Car to Prod Plan
+				"use_multi_level_bom": 1,
+				"item_code": "Green-Car",
+				"bom_no": frappe.db.get_value("Item", "Green-Car", "default_bom"),
+				"planned_qty": 1,
+				"planned_start_date": now_datetime(),
+			},
+		)
 		plan.get_sub_assembly_items()
 		self.assertTrue(len(plan.sub_assembly_items), 2)
 
 		plan.combine_sub_items = 1
 		plan.get_sub_assembly_items()
 
-		self.assertTrue(len(plan.sub_assembly_items), 1) # check if sub-assembly items merged
+		self.assertTrue(len(plan.sub_assembly_items), 1)  # check if sub-assembly items merged
 		self.assertEqual(plan.sub_assembly_items[0].qty, 2.0)
 		self.assertEqual(plan.sub_assembly_items[0].stock_qty, 2.0)
 
@@ -307,25 +325,29 @@
 		self.assertTrue(len(plan.sub_assembly_items), 2)
 
 	def test_pp_to_mr_customer_provided(self):
-		" Test Material Request from Production Plan for Customer Provided Item."
-		create_item('CUST-0987', is_customer_provided_item = 1, customer = '_Test Customer', is_purchase_item = 0)
-		create_item('Production Item CUST')
+		"Test Material Request from Production Plan for Customer Provided Item."
+		create_item(
+			"CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
+		)
+		create_item("Production Item CUST")
 
-		for item, raw_materials in {'Production Item CUST': ['Raw Material Item 1', 'CUST-0987']}.items():
-			if not frappe.db.get_value('BOM', {'item': item}):
-				make_bom(item = item, raw_materials = raw_materials)
-		production_plan = create_production_plan(item_code = 'Production Item CUST')
+		for item, raw_materials in {
+			"Production Item CUST": ["Raw Material Item 1", "CUST-0987"]
+		}.items():
+			if not frappe.db.get_value("BOM", {"item": item}):
+				make_bom(item=item, raw_materials=raw_materials)
+		production_plan = create_production_plan(item_code="Production Item CUST")
 		production_plan.make_material_request()
 
 		material_request = frappe.db.get_value(
-			'Material Request Item',
-			{'production_plan': production_plan.name, 'item_code': 'CUST-0987'},
-			'parent'
+			"Material Request Item",
+			{"production_plan": production_plan.name, "item_code": "CUST-0987"},
+			"parent",
 		)
-		mr = frappe.get_doc('Material Request', material_request)
+		mr = frappe.get_doc("Material Request", material_request)
 
-		self.assertTrue(mr.material_request_type, 'Customer Provided')
-		self.assertTrue(mr.customer, '_Test Customer')
+		self.assertTrue(mr.material_request_type, "Customer Provided")
+		self.assertTrue(mr.customer, "_Test Customer")
 
 	def test_production_plan_with_multi_level_bom(self):
 		"""
@@ -339,33 +361,34 @@
 			create_item(item_code, is_stock_item=1)
 
 		# created bom upto 3 level
-		if not frappe.db.get_value('BOM', {'item': "Test BOM 3"}):
-			make_bom(item = "Test BOM 3", raw_materials = ["Test RM BOM 1"], rm_qty=3)
+		if not frappe.db.get_value("BOM", {"item": "Test BOM 3"}):
+			make_bom(item="Test BOM 3", raw_materials=["Test RM BOM 1"], rm_qty=3)
 
-		if not frappe.db.get_value('BOM', {'item': "Test BOM 2"}):
-			make_bom(item = "Test BOM 2", raw_materials = ["Test BOM 3"], rm_qty=3)
+		if not frappe.db.get_value("BOM", {"item": "Test BOM 2"}):
+			make_bom(item="Test BOM 2", raw_materials=["Test BOM 3"], rm_qty=3)
 
-		if not frappe.db.get_value('BOM', {'item': "Test BOM 1"}):
-			make_bom(item = "Test BOM 1", raw_materials = ["Test BOM 2"], rm_qty=2)
+		if not frappe.db.get_value("BOM", {"item": "Test BOM 1"}):
+			make_bom(item="Test BOM 1", raw_materials=["Test BOM 2"], rm_qty=2)
 
 		item_code = "Test BOM 1"
-		pln = frappe.new_doc('Production Plan')
+		pln = frappe.new_doc("Production Plan")
 		pln.company = "_Test Company"
-		pln.append("po_items", {
-			"item_code": item_code,
-			"bom_no": frappe.db.get_value('BOM', {'item': "Test BOM 1"}),
-			"planned_qty": 3
-		})
+		pln.append(
+			"po_items",
+			{
+				"item_code": item_code,
+				"bom_no": frappe.db.get_value("BOM", {"item": "Test BOM 1"}),
+				"planned_qty": 3,
+			},
+		)
 
-		pln.get_sub_assembly_items('In House')
+		pln.get_sub_assembly_items("In House")
 		pln.submit()
 		pln.make_work_order()
 
-		#last level sub-assembly work order produce qty
+		# last level sub-assembly work order produce qty
 		to_produce_qty = frappe.db.get_value(
-			"Work Order",
-			{"production_plan": pln.name, "production_item": "Test BOM 3"},
-			"qty"
+			"Work Order", {"production_plan": pln.name, "production_item": "Test BOM 3"}, "qty"
 		)
 
 		self.assertEqual(to_produce_qty, 18.0)
@@ -374,70 +397,72 @@
 
 	def test_get_warehouse_list_group(self):
 		"Check if required child warehouses are returned."
-		warehouse_json = '[{\"warehouse\":\"_Test Warehouse Group - _TC\"}]'
+		warehouse_json = '[{"warehouse":"_Test Warehouse Group - _TC"}]'
 
 		warehouses = set(get_warehouse_list(warehouse_json))
 		expected_warehouses = {"_Test Warehouse Group-C1 - _TC", "_Test Warehouse Group-C2 - _TC"}
 
 		missing_warehouse = expected_warehouses - warehouses
 
-		self.assertTrue(len(missing_warehouse) == 0,
-				msg=f"Following warehouses were expected {', '.join(missing_warehouse)}")
+		self.assertTrue(
+			len(missing_warehouse) == 0,
+			msg=f"Following warehouses were expected {', '.join(missing_warehouse)}",
+		)
 
 	def test_get_warehouse_list_single(self):
 		"Check if same warehouse is returned in absence of child warehouses."
-		warehouse_json = '[{\"warehouse\":\"_Test Scrap Warehouse - _TC\"}]'
+		warehouse_json = '[{"warehouse":"_Test Scrap Warehouse - _TC"}]'
 
 		warehouses = set(get_warehouse_list(warehouse_json))
-		expected_warehouses = {"_Test Scrap Warehouse - _TC", }
+		expected_warehouses = {
+			"_Test Scrap Warehouse - _TC",
+		}
 
 		self.assertEqual(warehouses, expected_warehouses)
 
 	def test_get_sales_order_with_variant(self):
 		"Check if Template BOM is fetched in absence of Variant BOM."
-		rm_item = create_item('PIV_RM', valuation_rate = 100)
-		if not frappe.db.exists('Item', {"item_code": 'PIV'}):
-			item = create_item('PIV', valuation_rate = 100)
+		rm_item = create_item("PIV_RM", valuation_rate=100)
+		if not frappe.db.exists("Item", {"item_code": "PIV"}):
+			item = create_item("PIV", valuation_rate=100)
 			variant_settings = {
 				"attributes": [
-					{
-						"attribute": "Colour"
-					},
+					{"attribute": "Colour"},
 				],
-				"has_variants": 1
+				"has_variants": 1,
 			}
 			item.update(variant_settings)
 			item.save()
-			parent_bom = make_bom(item = 'PIV', raw_materials = [rm_item.item_code])
-		if not frappe.db.exists('BOM', {"item": 'PIV'}):
-			parent_bom = make_bom(item = 'PIV', raw_materials = [rm_item.item_code])
+			parent_bom = make_bom(item="PIV", raw_materials=[rm_item.item_code])
+		if not frappe.db.exists("BOM", {"item": "PIV"}):
+			parent_bom = make_bom(item="PIV", raw_materials=[rm_item.item_code])
 		else:
-			parent_bom = frappe.get_doc('BOM', {"item": 'PIV'})
+			parent_bom = frappe.get_doc("BOM", {"item": "PIV"})
 
-		if not frappe.db.exists('Item', {"item_code": 'PIV-RED'}):
+		if not frappe.db.exists("Item", {"item_code": "PIV-RED"}):
 			variant = create_variant("PIV", {"Colour": "Red"})
 			variant.save()
-			variant_bom = make_bom(item = variant.item_code, raw_materials = [rm_item.item_code])
+			variant_bom = make_bom(item=variant.item_code, raw_materials=[rm_item.item_code])
 		else:
-			variant = frappe.get_doc('Item', 'PIV-RED')
-		if not frappe.db.exists('BOM', {"item": 'PIV-RED'}):
-			variant_bom = make_bom(item = variant.item_code, raw_materials = [rm_item.item_code])
+			variant = frappe.get_doc("Item", "PIV-RED")
+		if not frappe.db.exists("BOM", {"item": "PIV-RED"}):
+			variant_bom = make_bom(item=variant.item_code, raw_materials=[rm_item.item_code])
 
 		"""Testing when item variant has a BOM"""
 		so = make_sales_order(item_code="PIV-RED", qty=5)
-		pln = frappe.new_doc('Production Plan')
+		pln = frappe.new_doc("Production Plan")
 		pln.company = so.company
-		pln.get_items_from = 'Sales Order'
-		pln.item_code = 'PIV-RED'
+		pln.get_items_from = "Sales Order"
+		pln.item_code = "PIV-RED"
 		pln.get_open_sales_orders()
 		self.assertEqual(pln.sales_orders[0].sales_order, so.name)
 		pln.get_so_items()
-		self.assertEqual(pln.po_items[0].item_code, 'PIV-RED')
+		self.assertEqual(pln.po_items[0].item_code, "PIV-RED")
 		self.assertEqual(pln.po_items[0].bom_no, variant_bom.name)
 		so.cancel()
-		frappe.delete_doc('Sales Order', so.name)
+		frappe.delete_doc("Sales Order", so.name)
 		variant_bom.cancel()
-		frappe.delete_doc('BOM', variant_bom.name)
+		frappe.delete_doc("BOM", variant_bom.name)
 
 		"""Testing when item variant doesn't have a BOM"""
 		so = make_sales_order(item_code="PIV-RED", qty=5)
@@ -445,7 +470,7 @@
 		self.assertEqual(pln.sales_orders[0].sales_order, so.name)
 		pln.po_items = []
 		pln.get_so_items()
-		self.assertEqual(pln.po_items[0].item_code, 'PIV-RED')
+		self.assertEqual(pln.po_items[0].item_code, "PIV-RED")
 		self.assertEqual(pln.po_items[0].bom_no, parent_bom.name)
 
 		frappe.db.rollback()
@@ -457,27 +482,35 @@
 		prefix = "_TestLevel_"
 		boms = {
 			"Assembly": {
-				"SubAssembly1": {"ChildPart1": {}, "ChildPart2": {},},
+				"SubAssembly1": {
+					"ChildPart1": {},
+					"ChildPart2": {},
+				},
 				"ChildPart6": {},
 				"SubAssembly4": {"SubSubAssy2": {"ChildPart7": {}}},
 			},
 			"MegaDeepAssy": {
-				"SecretSubassy": {"SecretPart": {"VerySecret" : { "SuperSecret": {"Classified": {}}}},},
-																# ^ assert that this is
-																# first item in subassy table
-			}
+				"SecretSubassy": {
+					"SecretPart": {"VerySecret": {"SuperSecret": {"Classified": {}}}},
+				},
+				# ^ assert that this is
+				# first item in subassy table
+			},
 		}
 		create_nested_bom(boms, prefix=prefix)
 
 		items = [prefix + item_code for item_code in boms.keys()]
 		plan = create_production_plan(item_code=items[0], do_not_save=True)
-		plan.append("po_items", {
-			'use_multi_level_bom': 1,
-			'item_code': items[1],
-			'bom_no': frappe.db.get_value('Item', items[1], 'default_bom'),
-			'planned_qty': 1,
-			'planned_start_date': now_datetime()
-		})
+		plan.append(
+			"po_items",
+			{
+				"use_multi_level_bom": 1,
+				"item_code": items[1],
+				"bom_no": frappe.db.get_value("Item", items[1], "default_bom"),
+				"planned_qty": 1,
+				"planned_start_date": now_datetime(),
+			},
+		)
 		plan.get_sub_assembly_items()
 
 		bom_level_order = [d.bom_level for d in plan.sub_assembly_items]
@@ -487,6 +520,7 @@
 
 	def test_multiple_work_order_for_production_plan_item(self):
 		"Test producing Prod Plan (making WO) in parts."
+
 		def create_work_order(item, pln, qty):
 			# Get Production Items
 			items_data = pln.get_production_items()
@@ -497,14 +531,13 @@
 			# Create and Submit Work Order for each item in items_data
 			for key, item in items_data.items():
 				if pln.sub_assembly_items:
-					item['use_multi_level_bom'] = 0
+					item["use_multi_level_bom"] = 0
 
 				wo_name = pln.create_work_order(item)
 				wo_doc = frappe.get_doc("Work Order", wo_name)
-				wo_doc.update({
-					'wip_warehouse': 'Work In Progress - _TC',
-					'fg_warehouse': 'Finished Goods - _TC'
-				})
+				wo_doc.update(
+					{"wip_warehouse": "Work In Progress - _TC", "fg_warehouse": "Finished Goods - _TC"}
+				)
 				wo_doc.submit()
 				wo_list.append(wo_name)
 
@@ -554,34 +587,30 @@
 			make_stock_entry as make_se_from_wo,
 		)
 
-		make_stock_entry(item_code="Raw Material Item 1",
-			target="Work In Progress - _TC",
-			qty=2, basic_rate=100
+		make_stock_entry(
+			item_code="Raw Material Item 1", target="Work In Progress - _TC", qty=2, basic_rate=100
 		)
-		make_stock_entry(item_code="Raw Material Item 2",
-			target="Work In Progress - _TC",
-			qty=2, basic_rate=100
+		make_stock_entry(
+			item_code="Raw Material Item 2", target="Work In Progress - _TC", qty=2, basic_rate=100
 		)
 
-		item = 'Test Production Item 1'
+		item = "Test Production Item 1"
 		so = make_sales_order(item_code=item, qty=1)
 
 		pln = create_production_plan(
-			company=so.company,
-			get_items_from="Sales Order",
-			sales_order=so,
-			skip_getting_mr_items=True
+			company=so.company, get_items_from="Sales Order", sales_order=so, skip_getting_mr_items=True
 		)
 		self.assertEqual(pln.po_items[0].pending_qty, 1)
 
 		wo = make_wo_order_test_record(
-			item_code=item, qty=1,
+			item_code=item,
+			qty=1,
 			company=so.company,
-			wip_warehouse='Work In Progress - _TC',
-			fg_warehouse='Finished Goods - _TC',
+			wip_warehouse="Work In Progress - _TC",
+			fg_warehouse="Finished Goods - _TC",
 			skip_transfer=1,
 			use_multi_level_bom=1,
-			do_not_submit=True
+			do_not_submit=True,
 		)
 		wo.production_plan = pln.name
 		wo.production_plan_item = pln.po_items[0].name
@@ -604,29 +633,25 @@
 			make_stock_entry as make_se_from_wo,
 		)
 
-		make_stock_entry(item_code="Raw Material Item 1",
-			target="Work In Progress - _TC",
-			qty=2, basic_rate=100
+		make_stock_entry(
+			item_code="Raw Material Item 1", target="Work In Progress - _TC", qty=2, basic_rate=100
 		)
-		make_stock_entry(item_code="Raw Material Item 2",
-			target="Work In Progress - _TC",
-			qty=2, basic_rate=100
+		make_stock_entry(
+			item_code="Raw Material Item 2", target="Work In Progress - _TC", qty=2, basic_rate=100
 		)
 
-		pln = create_production_plan(
-			item_code='Test Production Item 1',
-			skip_getting_mr_items=True
-		)
+		pln = create_production_plan(item_code="Test Production Item 1", skip_getting_mr_items=True)
 		self.assertEqual(pln.po_items[0].pending_qty, 1)
 
 		wo = make_wo_order_test_record(
-			item_code='Test Production Item 1', qty=1,
+			item_code="Test Production Item 1",
+			qty=1,
 			company=pln.company,
-			wip_warehouse='Work In Progress - _TC',
-			fg_warehouse='Finished Goods - _TC',
+			wip_warehouse="Work In Progress - _TC",
+			fg_warehouse="Finished Goods - _TC",
 			skip_transfer=1,
 			use_multi_level_bom=1,
-			do_not_submit=True
+			do_not_submit=True,
 		)
 		wo.production_plan = pln.name
 		wo.production_plan_item = pln.po_items[0].name
@@ -644,26 +669,23 @@
 
 	def test_qty_based_status(self):
 		pp = frappe.new_doc("Production Plan")
-		pp.po_items = [
-			frappe._dict(planned_qty=5, produce_qty=4)
-		]
+		pp.po_items = [frappe._dict(planned_qty=5, produce_qty=4)]
 		self.assertFalse(pp.all_items_completed())
 
 		pp.po_items = [
 			frappe._dict(planned_qty=5, produce_qty=10),
-			frappe._dict(planned_qty=5, produce_qty=4)
+			frappe._dict(planned_qty=5, produce_qty=4),
 		]
 		self.assertFalse(pp.all_items_completed())
 
 	def test_production_plan_planned_qty(self):
 		pln = create_production_plan(item_code="_Test FG Item", planned_qty=0.55)
 		pln.make_work_order()
-		work_order = frappe.db.get_value('Work Order', {'production_plan': pln.name}, 'name')
-		wo_doc = frappe.get_doc('Work Order', work_order)
-		wo_doc.update({
-			'wip_warehouse': 'Work In Progress - _TC',
-			'fg_warehouse': 'Finished Goods - _TC'
-		})
+		work_order = frappe.db.get_value("Work Order", {"production_plan": pln.name}, "name")
+		wo_doc = frappe.get_doc("Work Order", work_order)
+		wo_doc.update(
+			{"wip_warehouse": "Work In Progress - _TC", "fg_warehouse": "Finished Goods - _TC"}
+		)
 		wo_doc.submit()
 		self.assertEqual(wo_doc.qty, 0.55)
 
@@ -674,22 +696,21 @@
 		# this can not be unittested so mocking data that would be expected
 		# from client side.
 		for _ in range(10):
-			po_item = pp.append("po_items", {
-				"name": frappe.generate_hash(length=10),
-				"temporary_name": frappe.generate_hash(length=10),
-			})
-			pp.append("sub_assembly_items", {
-				"production_plan_item": po_item.temporary_name
-			})
+			po_item = pp.append(
+				"po_items",
+				{
+					"name": frappe.generate_hash(length=10),
+					"temporary_name": frappe.generate_hash(length=10),
+				},
+			)
+			pp.append("sub_assembly_items", {"production_plan_item": po_item.temporary_name})
 		pp._rename_temporary_references()
 
 		for po_item, subassy_item in zip(pp.po_items, pp.sub_assembly_items):
 			self.assertEqual(po_item.name, subassy_item.production_plan_item)
 
 		# bad links should be erased
-		pp.append("sub_assembly_items", {
-			"production_plan_item": frappe.generate_hash(length=16)
-		})
+		pp.append("sub_assembly_items", {"production_plan_item": frappe.generate_hash(length=16)})
 		pp._rename_temporary_references()
 		self.assertIsNone(pp.sub_assembly_items[-1].production_plan_item)
 		pp.sub_assembly_items.pop()
@@ -708,40 +729,48 @@
 	"""
 	args = frappe._dict(args)
 
-	pln = frappe.get_doc({
-		'doctype': 'Production Plan',
-		'company': args.company or '_Test Company',
-		'customer': args.customer or '_Test Customer',
-		'posting_date': nowdate(),
-		'include_non_stock_items': args.include_non_stock_items or 0,
-		'include_subcontracted_items': args.include_subcontracted_items or 0,
-		'ignore_existing_ordered_qty': args.ignore_existing_ordered_qty or 0,
-		'get_items_from': 'Sales Order'
-	})
+	pln = frappe.get_doc(
+		{
+			"doctype": "Production Plan",
+			"company": args.company or "_Test Company",
+			"customer": args.customer or "_Test Customer",
+			"posting_date": nowdate(),
+			"include_non_stock_items": args.include_non_stock_items or 0,
+			"include_subcontracted_items": args.include_subcontracted_items or 0,
+			"ignore_existing_ordered_qty": args.ignore_existing_ordered_qty or 0,
+			"get_items_from": "Sales Order",
+		}
+	)
 
 	if not args.get("sales_order"):
-		pln.append('po_items', {
-			'use_multi_level_bom': args.use_multi_level_bom or 1,
-			'item_code': args.item_code,
-			'bom_no': frappe.db.get_value('Item', args.item_code, 'default_bom'),
-			'planned_qty': args.planned_qty or 1,
-			'planned_start_date': args.planned_start_date or now_datetime()
-		})
+		pln.append(
+			"po_items",
+			{
+				"use_multi_level_bom": args.use_multi_level_bom or 1,
+				"item_code": args.item_code,
+				"bom_no": frappe.db.get_value("Item", args.item_code, "default_bom"),
+				"planned_qty": args.planned_qty or 1,
+				"planned_start_date": args.planned_start_date or now_datetime(),
+			},
+		)
 
 	if args.get("get_items_from") == "Sales Order" and args.get("sales_order"):
 		so = args.get("sales_order")
-		pln.append('sales_orders', {
-			'sales_order': so.name,
-			'sales_order_date': so.transaction_date,
-			'customer': so.customer,
-			'grand_total': so.grand_total
-		})
+		pln.append(
+			"sales_orders",
+			{
+				"sales_order": so.name,
+				"sales_order_date": so.transaction_date,
+				"customer": so.customer,
+				"grand_total": so.grand_total,
+			},
+		)
 		pln.get_items()
 
 	if not args.get("skip_getting_mr_items"):
 		mr_items = get_items_for_material_requests(pln.as_dict())
 		for d in mr_items:
-			pln.append('mr_items', d)
+			pln.append("mr_items", d)
 
 	if not args.do_not_save:
 		pln.insert()
@@ -750,31 +779,37 @@
 
 	return pln
 
+
 def make_bom(**args):
 	args = frappe._dict(args)
 
-	bom = frappe.get_doc({
-		'doctype': 'BOM',
-		'is_default': 1,
-		'item': args.item,
-		'currency': args.currency or 'USD',
-		'quantity': args.quantity or 1,
-		'company': args.company or '_Test Company',
-		'routing': args.routing,
-		'with_operations': args.with_operations or 0
-	})
+	bom = frappe.get_doc(
+		{
+			"doctype": "BOM",
+			"is_default": 1,
+			"item": args.item,
+			"currency": args.currency or "USD",
+			"quantity": args.quantity or 1,
+			"company": args.company or "_Test Company",
+			"routing": args.routing,
+			"with_operations": args.with_operations or 0,
+		}
+	)
 
 	for item in args.raw_materials:
-		item_doc = frappe.get_doc('Item', item)
+		item_doc = frappe.get_doc("Item", item)
 
-		bom.append('items', {
-			'item_code': item,
-			'qty': args.rm_qty or 1.0,
-			'uom': item_doc.stock_uom,
-			'stock_uom': item_doc.stock_uom,
-			'rate': item_doc.valuation_rate or args.rate,
-			'source_warehouse': args.source_warehouse
-		})
+		bom.append(
+			"items",
+			{
+				"item_code": item,
+				"qty": args.rm_qty or 1.0,
+				"uom": item_doc.stock_uom,
+				"stock_uom": item_doc.stock_uom,
+				"rate": item_doc.valuation_rate or args.rate,
+				"source_warehouse": args.source_warehouse,
+			},
+		)
 
 	if not args.do_not_save:
 		bom.insert(ignore_permissions=True)
diff --git a/erpnext/manufacturing/doctype/routing/routing.py b/erpnext/manufacturing/doctype/routing/routing.py
index b207906..d4c37cf 100644
--- a/erpnext/manufacturing/doctype/routing/routing.py
+++ b/erpnext/manufacturing/doctype/routing/routing.py
@@ -19,9 +19,11 @@
 	def calculate_operating_cost(self):
 		for operation in self.operations:
 			if not operation.hour_rate:
-				operation.hour_rate = frappe.db.get_value("Workstation", operation.workstation, 'hour_rate')
-			operation.operating_cost = flt(flt(operation.hour_rate) * flt(operation.time_in_mins) / 60,
-					operation.precision("operating_cost"))
+				operation.hour_rate = frappe.db.get_value("Workstation", operation.workstation, "hour_rate")
+			operation.operating_cost = flt(
+				flt(operation.hour_rate) * flt(operation.time_in_mins) / 60,
+				operation.precision("operating_cost"),
+			)
 
 	def set_routing_id(self):
 		sequence_id = 0
@@ -29,7 +31,10 @@
 			if not row.sequence_id:
 				row.sequence_id = sequence_id + 1
 			elif sequence_id and row.sequence_id and cint(sequence_id) > cint(row.sequence_id):
-				frappe.throw(_("At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2}")
-					.format(row.idx, row.sequence_id, sequence_id))
+				frappe.throw(
+					_("At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2}").format(
+						row.idx, row.sequence_id, sequence_id
+					)
+				)
 
 			sequence_id = row.sequence_id
diff --git a/erpnext/manufacturing/doctype/routing/routing_dashboard.py b/erpnext/manufacturing/doctype/routing/routing_dashboard.py
index d051e38..65d7a45 100644
--- a/erpnext/manufacturing/doctype/routing/routing_dashboard.py
+++ b/erpnext/manufacturing/doctype/routing/routing_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname': 'routing',
-		'transactions': [
-			{
-				'items': ['BOM']
-			}
-		]
-	}
+	return {"fieldname": "routing", "transactions": [{"items": ["BOM"]}]}
diff --git a/erpnext/manufacturing/doctype/routing/test_routing.py b/erpnext/manufacturing/doctype/routing/test_routing.py
index 696d9bc..48f1851 100644
--- a/erpnext/manufacturing/doctype/routing/test_routing.py
+++ b/erpnext/manufacturing/doctype/routing/test_routing.py
@@ -16,24 +16,27 @@
 
 	@classmethod
 	def tearDownClass(cls):
-		frappe.db.sql('delete from tabBOM where item=%s', cls.item_code)
+		frappe.db.sql("delete from tabBOM where item=%s", cls.item_code)
 
 	def test_sequence_id(self):
-		operations = [{"operation": "Test Operation A", "workstation": "Test Workstation A", "time_in_mins": 30},
-			{"operation": "Test Operation B", "workstation": "Test Workstation A", "time_in_mins": 20}]
+		operations = [
+			{"operation": "Test Operation A", "workstation": "Test Workstation A", "time_in_mins": 30},
+			{"operation": "Test Operation B", "workstation": "Test Workstation A", "time_in_mins": 20},
+		]
 
 		make_test_records("UOM")
 
 		setup_operations(operations)
 		routing_doc = create_routing(routing_name="Testing Route", operations=operations)
 		bom_doc = setup_bom(item_code=self.item_code, routing=routing_doc.name)
-		wo_doc = make_wo_order_test_record(production_item = self.item_code, bom_no=bom_doc.name)
+		wo_doc = make_wo_order_test_record(production_item=self.item_code, bom_no=bom_doc.name)
 
 		for row in routing_doc.operations:
 			self.assertEqual(row.sequence_id, row.idx)
 
-		for data in frappe.get_all("Job Card",
-			filters={"work_order": wo_doc.name}, order_by="sequence_id desc"):
+		for data in frappe.get_all(
+			"Job Card", filters={"work_order": wo_doc.name}, order_by="sequence_id desc"
+		):
 			job_card_doc = frappe.get_doc("Job Card", data.name)
 			job_card_doc.time_logs[0].completed_qty = 10
 			if job_card_doc.sequence_id != 1:
@@ -52,33 +55,25 @@
 				"operation": "Test Operation A",
 				"workstation": "_Test Workstation A",
 				"hour_rate_rent": 300,
-				"hour_rate_labour": 750 ,
-				"time_in_mins": 30
+				"hour_rate_labour": 750,
+				"time_in_mins": 30,
 			},
 			{
 				"operation": "Test Operation B",
 				"workstation": "_Test Workstation B",
 				"hour_rate_labour": 200,
 				"hour_rate_rent": 1000,
-				"time_in_mins": 20
-			}
+				"time_in_mins": 20,
+			},
 		]
 
 		test_routing_operations = [
-			{
-				"operation": "Test Operation A",
-				"workstation": "_Test Workstation A",
-				"time_in_mins": 30
-			},
-			{
-				"operation": "Test Operation B",
-				"workstation": "_Test Workstation A",
-				"time_in_mins": 20
-			}
+			{"operation": "Test Operation A", "workstation": "_Test Workstation A", "time_in_mins": 30},
+			{"operation": "Test Operation B", "workstation": "_Test Workstation A", "time_in_mins": 20},
 		]
 		setup_operations(operations)
 		routing_doc = create_routing(routing_name="Routing Test", operations=test_routing_operations)
-		bom_doc = setup_bom(item_code="_Testing Item", routing=routing_doc.name, currency = 'INR')
+		bom_doc = setup_bom(item_code="_Testing Item", routing=routing_doc.name, currency="INR")
 		self.assertEqual(routing_doc.operations[0].time_in_mins, 30)
 		self.assertEqual(routing_doc.operations[1].time_in_mins, 20)
 		routing_doc.operations[0].time_in_mins = 90
@@ -93,10 +88,12 @@
 def setup_operations(rows):
 	from erpnext.manufacturing.doctype.operation.test_operation import make_operation
 	from erpnext.manufacturing.doctype.workstation.test_workstation import make_workstation
+
 	for row in rows:
 		make_workstation(row)
 		make_operation(row)
 
+
 def create_routing(**args):
 	args = frappe._dict(args)
 
@@ -108,7 +105,7 @@
 			doc.insert()
 		except frappe.DuplicateEntryError:
 			doc = frappe.get_doc("Routing", args.routing_name)
-			doc.delete_key('operations')
+			doc.delete_key("operations")
 			for operation in args.operations:
 				doc.append("operations", operation)
 
@@ -116,28 +113,35 @@
 
 	return doc
 
+
 def setup_bom(**args):
 	from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
 
 	args = frappe._dict(args)
 
-	if not frappe.db.exists('Item', args.item_code):
-		make_item(args.item_code, {
-			'is_stock_item': 1
-		})
+	if not frappe.db.exists("Item", args.item_code):
+		make_item(args.item_code, {"is_stock_item": 1})
 
 	if not args.raw_materials:
-		if not frappe.db.exists('Item', "Test Extra Item N-1"):
-			make_item("Test Extra Item N-1", {
-				'is_stock_item': 1,
-			})
+		if not frappe.db.exists("Item", "Test Extra Item N-1"):
+			make_item(
+				"Test Extra Item N-1",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		args.raw_materials = ['Test Extra Item N-1']
+		args.raw_materials = ["Test Extra Item N-1"]
 
-	name = frappe.db.get_value('BOM', {'item': args.item_code}, 'name')
+	name = frappe.db.get_value("BOM", {"item": args.item_code}, "name")
 	if not name:
-		bom_doc = make_bom(item = args.item_code, raw_materials = args.get("raw_materials"),
-			routing = args.routing, with_operations=1, currency = args.currency)
+		bom_doc = make_bom(
+			item=args.item_code,
+			raw_materials=args.get("raw_materials"),
+			routing=args.routing,
+			with_operations=1,
+			currency=args.currency,
+		)
 	else:
 		bom_doc = frappe.get_doc("BOM", name)
 
diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py
index 6a8136d..3721704 100644
--- a/erpnext/manufacturing/doctype/work_order/test_work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py
@@ -26,29 +26,36 @@
 
 class TestWorkOrder(FrappeTestCase):
 	def setUp(self):
-		self.warehouse = '_Test Warehouse 2 - _TC'
-		self.item = '_Test Item'
+		self.warehouse = "_Test Warehouse 2 - _TC"
+		self.item = "_Test Item"
 
 	def tearDown(self):
 		frappe.db.rollback()
 
 	def check_planned_qty(self):
 
-		planned0 = frappe.db.get_value("Bin", {"item_code": "_Test FG Item",
-			"warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty") or 0
+		planned0 = (
+			frappe.db.get_value(
+				"Bin", {"item_code": "_Test FG Item", "warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty"
+			)
+			or 0
+		)
 
 		wo_order = make_wo_order_test_record()
 
-		planned1 = frappe.db.get_value("Bin", {"item_code": "_Test FG Item",
-			"warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty")
+		planned1 = frappe.db.get_value(
+			"Bin", {"item_code": "_Test FG Item", "warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty"
+		)
 
 		self.assertEqual(planned1, planned0 + 10)
 
 		# add raw materials to stores
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="Stores - _TC", qty=100, basic_rate=100)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="Stores - _TC", qty=100, basic_rate=100)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="Stores - _TC", qty=100, basic_rate=100
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="Stores - _TC", qty=100, basic_rate=100
+		)
 
 		# from stores to wip
 		s = frappe.get_doc(make_stock_entry(wo_order.name, "Material Transfer for Manufacture", 4))
@@ -64,8 +71,9 @@
 
 		self.assertEqual(frappe.db.get_value("Work Order", wo_order.name, "produced_qty"), 4)
 
-		planned2 = frappe.db.get_value("Bin", {"item_code": "_Test FG Item",
-			"warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty")
+		planned2 = frappe.db.get_value(
+			"Bin", {"item_code": "_Test FG Item", "warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty"
+		)
 
 		self.assertEqual(planned2, planned0 + 6)
 
@@ -74,10 +82,12 @@
 	def test_over_production(self):
 		wo_doc = self.check_planned_qty()
 
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="_Test Warehouse - _TC", qty=100, basic_rate=100)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="_Test Warehouse - _TC", qty=100, basic_rate=100)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse - _TC", qty=100, basic_rate=100
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=100, basic_rate=100
+		)
 
 		s = frappe.get_doc(make_stock_entry(wo_doc.name, "Manufacture", 7))
 		s.insert()
@@ -85,13 +95,14 @@
 		self.assertRaises(StockOverProductionError, s.submit)
 
 	def test_planned_operating_cost(self):
-		wo_order = make_wo_order_test_record(item="_Test FG Item 2",
-			planned_start_date=now(), qty=1, do_not_save=True)
+		wo_order = make_wo_order_test_record(
+			item="_Test FG Item 2", planned_start_date=now(), qty=1, do_not_save=True
+		)
 		wo_order.set_work_order_operations()
 		cost = wo_order.planned_operating_cost
 		wo_order.qty = 2
 		wo_order.set_work_order_operations()
-		self.assertEqual(wo_order.planned_operating_cost, cost*2)
+		self.assertEqual(wo_order.planned_operating_cost, cost * 2)
 
 	def test_reserved_qty_for_partial_completion(self):
 		item = "_Test Item"
@@ -102,27 +113,30 @@
 		# reset to correct value
 		bin1_at_start.update_reserved_qty_for_production()
 
-		wo_order = make_wo_order_test_record(item="_Test FG Item", qty=2,
-			source_warehouse=warehouse, skip_transfer=1)
+		wo_order = make_wo_order_test_record(
+			item="_Test FG Item", qty=2, source_warehouse=warehouse, skip_transfer=1
+		)
 
 		reserved_qty_on_submission = cint(get_bin(item, warehouse).reserved_qty_for_production)
 
 		# reserved qty for production is updated
 		self.assertEqual(cint(bin1_at_start.reserved_qty_for_production) + 2, reserved_qty_on_submission)
 
-
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target=warehouse, qty=100, basic_rate=100)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target=warehouse, qty=100, basic_rate=100)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target=warehouse, qty=100, basic_rate=100
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target=warehouse, qty=100, basic_rate=100
+		)
 
 		s = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 1))
 		s.submit()
 
 		bin1_at_completion = get_bin(item, warehouse)
 
-		self.assertEqual(cint(bin1_at_completion.reserved_qty_for_production),
-			reserved_qty_on_submission - 1)
+		self.assertEqual(
+			cint(bin1_at_completion.reserved_qty_for_production), reserved_qty_on_submission - 1
+		)
 
 	def test_production_item(self):
 		wo_order = make_wo_order_test_record(item="_Test FG Item", qty=1, do_not_save=True)
@@ -146,16 +160,20 @@
 		# reset to correct value
 		self.bin1_at_start.update_reserved_qty_for_production()
 
-		self.wo_order = make_wo_order_test_record(item="_Test FG Item", qty=2,
-			source_warehouse=self.warehouse)
+		self.wo_order = make_wo_order_test_record(
+			item="_Test FG Item", qty=2, source_warehouse=self.warehouse
+		)
 
 		self.bin1_on_submit = get_bin(self.item, self.warehouse)
 
 		# reserved qty for production is updated
-		self.assertEqual(cint(self.bin1_at_start.reserved_qty_for_production) + 2,
-			cint(self.bin1_on_submit.reserved_qty_for_production))
-		self.assertEqual(cint(self.bin1_at_start.projected_qty),
-			cint(self.bin1_on_submit.projected_qty) + 2)
+		self.assertEqual(
+			cint(self.bin1_at_start.reserved_qty_for_production) + 2,
+			cint(self.bin1_on_submit.reserved_qty_for_production),
+		)
+		self.assertEqual(
+			cint(self.bin1_at_start.projected_qty), cint(self.bin1_on_submit.projected_qty) + 2
+		)
 
 	def test_reserved_qty_for_production_cancel(self):
 		self.test_reserved_qty_for_production_submit()
@@ -165,52 +183,57 @@
 		bin1_on_cancel = get_bin(self.item, self.warehouse)
 
 		# reserved_qty_for_producion updated
-		self.assertEqual(cint(self.bin1_at_start.reserved_qty_for_production),
-			cint(bin1_on_cancel.reserved_qty_for_production))
-		self.assertEqual(self.bin1_at_start.projected_qty,
-			cint(bin1_on_cancel.projected_qty))
+		self.assertEqual(
+			cint(self.bin1_at_start.reserved_qty_for_production),
+			cint(bin1_on_cancel.reserved_qty_for_production),
+		)
+		self.assertEqual(self.bin1_at_start.projected_qty, cint(bin1_on_cancel.projected_qty))
 
 	def test_reserved_qty_for_production_on_stock_entry(self):
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target= self.warehouse, qty=100, basic_rate=100)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target= self.warehouse, qty=100, basic_rate=100)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target=self.warehouse, qty=100, basic_rate=100
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target=self.warehouse, qty=100, basic_rate=100
+		)
 
 		self.test_reserved_qty_for_production_submit()
 
-		s = frappe.get_doc(make_stock_entry(self.wo_order.name,
-			"Material Transfer for Manufacture", 2))
+		s = frappe.get_doc(make_stock_entry(self.wo_order.name, "Material Transfer for Manufacture", 2))
 
 		s.submit()
 
 		bin1_on_start_production = get_bin(self.item, self.warehouse)
 
 		# reserved_qty_for_producion updated
-		self.assertEqual(cint(self.bin1_at_start.reserved_qty_for_production),
-			cint(bin1_on_start_production.reserved_qty_for_production))
+		self.assertEqual(
+			cint(self.bin1_at_start.reserved_qty_for_production),
+			cint(bin1_on_start_production.reserved_qty_for_production),
+		)
 
 		# projected qty will now be 2 less (becuase of item movement)
-		self.assertEqual(cint(self.bin1_at_start.projected_qty),
-			cint(bin1_on_start_production.projected_qty) + 2)
+		self.assertEqual(
+			cint(self.bin1_at_start.projected_qty), cint(bin1_on_start_production.projected_qty) + 2
+		)
 
 		s = frappe.get_doc(make_stock_entry(self.wo_order.name, "Manufacture", 2))
 
 		bin1_on_end_production = get_bin(self.item, self.warehouse)
 
 		# no change in reserved / projected
-		self.assertEqual(cint(bin1_on_end_production.reserved_qty_for_production),
-			cint(bin1_on_start_production.reserved_qty_for_production))
+		self.assertEqual(
+			cint(bin1_on_end_production.reserved_qty_for_production),
+			cint(bin1_on_start_production.reserved_qty_for_production),
+		)
 
 	def test_reserved_qty_for_production_closed(self):
 
-		wo1 = make_wo_order_test_record(item="_Test FG Item", qty=2,
-			source_warehouse=self.warehouse)
+		wo1 = make_wo_order_test_record(item="_Test FG Item", qty=2, source_warehouse=self.warehouse)
 		item = wo1.required_items[0].item_code
 		bin_before = get_bin(item, self.warehouse)
 		bin_before.update_reserved_qty_for_production()
 
-		make_wo_order_test_record(item="_Test FG Item", qty=2,
-			source_warehouse=self.warehouse)
+		make_wo_order_test_record(item="_Test FG Item", qty=2, source_warehouse=self.warehouse)
 		close_work_order(wo1.name, "Closed")
 
 		bin_after = get_bin(item, self.warehouse)
@@ -220,10 +243,15 @@
 		cancel_stock_entry = []
 		allow_overproduction("overproduction_percentage_for_work_order", 30)
 		wo_order = make_wo_order_test_record(planned_start_date=now(), qty=100)
-		ste1 = test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="_Test Warehouse - _TC", qty=120, basic_rate=5000.0)
-		ste2 = test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="_Test Warehouse - _TC", qty=240, basic_rate=1000.0)
+		ste1 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse - _TC", qty=120, basic_rate=5000.0
+		)
+		ste2 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse - _TC",
+			qty=240,
+			basic_rate=1000.0,
+		)
 
 		cancel_stock_entry.extend([ste1.name, ste2.name])
 
@@ -253,33 +281,37 @@
 		allow_overproduction("overproduction_percentage_for_work_order", 0)
 
 	def test_reserved_qty_for_stopped_production(self):
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target= self.warehouse, qty=100, basic_rate=100)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target= self.warehouse, qty=100, basic_rate=100)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target=self.warehouse, qty=100, basic_rate=100
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target=self.warehouse, qty=100, basic_rate=100
+		)
 
 		# 	0 0 0
 
 		self.test_reserved_qty_for_production_submit()
 
-		#2 0 -2
+		# 2 0 -2
 
-		s = frappe.get_doc(make_stock_entry(self.wo_order.name,
-			"Material Transfer for Manufacture", 1))
+		s = frappe.get_doc(make_stock_entry(self.wo_order.name, "Material Transfer for Manufacture", 1))
 
 		s.submit()
 
-		#1 -1 0
+		# 1 -1 0
 
 		bin1_on_start_production = get_bin(self.item, self.warehouse)
 
 		# reserved_qty_for_producion updated
-		self.assertEqual(cint(self.bin1_at_start.reserved_qty_for_production) + 1,
-			cint(bin1_on_start_production.reserved_qty_for_production))
+		self.assertEqual(
+			cint(self.bin1_at_start.reserved_qty_for_production) + 1,
+			cint(bin1_on_start_production.reserved_qty_for_production),
+		)
 
 		# projected qty will now be 2 less (becuase of item movement)
-		self.assertEqual(cint(self.bin1_at_start.projected_qty),
-			cint(bin1_on_start_production.projected_qty) + 2)
+		self.assertEqual(
+			cint(self.bin1_at_start.projected_qty), cint(bin1_on_start_production.projected_qty) + 2
+		)
 
 		# STOP
 		stop_unstop(self.wo_order.name, "Stopped")
@@ -287,19 +319,24 @@
 		bin1_on_stop_production = get_bin(self.item, self.warehouse)
 
 		# no change in reserved / projected
-		self.assertEqual(cint(bin1_on_stop_production.reserved_qty_for_production),
-			cint(self.bin1_at_start.reserved_qty_for_production))
-		self.assertEqual(cint(bin1_on_stop_production.projected_qty) + 1,
-			cint(self.bin1_at_start.projected_qty))
+		self.assertEqual(
+			cint(bin1_on_stop_production.reserved_qty_for_production),
+			cint(self.bin1_at_start.reserved_qty_for_production),
+		)
+		self.assertEqual(
+			cint(bin1_on_stop_production.projected_qty) + 1, cint(self.bin1_at_start.projected_qty)
+		)
 
 	def test_scrap_material_qty(self):
 		wo_order = make_wo_order_test_record(planned_start_date=now(), qty=2)
 
 		# add raw materials to stores
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="Stores - _TC", qty=10, basic_rate=5000.0)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="Stores - _TC", qty=10, basic_rate=1000.0)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="Stores - _TC", qty=10, basic_rate=5000.0
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="Stores - _TC", qty=10, basic_rate=1000.0
+		)
 
 		s = frappe.get_doc(make_stock_entry(wo_order.name, "Material Transfer for Manufacture", 2))
 		for d in s.get("items"):
@@ -311,8 +348,9 @@
 		s.insert()
 		s.submit()
 
-		wo_order_details = frappe.db.get_value("Work Order", wo_order.name,
-			["scrap_warehouse", "qty", "produced_qty", "bom_no"], as_dict=1)
+		wo_order_details = frappe.db.get_value(
+			"Work Order", wo_order.name, ["scrap_warehouse", "qty", "produced_qty", "bom_no"], as_dict=1
+		)
 
 		scrap_item_details = get_scrap_item_details(wo_order_details.bom_no)
 
@@ -321,15 +359,20 @@
 		for item in s.items:
 			if item.bom_no and item.item_code in scrap_item_details:
 				self.assertEqual(wo_order_details.scrap_warehouse, item.t_warehouse)
-				self.assertEqual(flt(wo_order_details.qty)*flt(scrap_item_details[item.item_code]), item.qty)
+				self.assertEqual(flt(wo_order_details.qty) * flt(scrap_item_details[item.item_code]), item.qty)
 
 	def test_allow_overproduction(self):
 		allow_overproduction("overproduction_percentage_for_work_order", 0)
 		wo_order = make_wo_order_test_record(planned_start_date=now(), qty=2)
-		test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="_Test Warehouse - _TC", qty=10, basic_rate=5000.0)
-		test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="_Test Warehouse - _TC", qty=10, basic_rate=1000.0)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=5000.0
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse - _TC",
+			qty=10,
+			basic_rate=1000.0,
+		)
 
 		s = frappe.get_doc(make_stock_entry(wo_order.name, "Material Transfer for Manufacture", 3))
 		s.insert()
@@ -346,42 +389,47 @@
 		so = make_sales_order(item_code="_Test FG Item", qty=2)
 
 		allow_overproduction("overproduction_percentage_for_sales_order", 0)
-		wo_order = make_wo_order_test_record(planned_start_date=now(),
-			sales_order=so.name, qty=3, do_not_save=True)
+		wo_order = make_wo_order_test_record(
+			planned_start_date=now(), sales_order=so.name, qty=3, do_not_save=True
+		)
 
 		self.assertRaises(OverProductionError, wo_order.save)
 
 		allow_overproduction("overproduction_percentage_for_sales_order", 50)
-		wo_order = make_wo_order_test_record(planned_start_date=now(),
-			sales_order=so.name, qty=3)
+		wo_order = make_wo_order_test_record(planned_start_date=now(), sales_order=so.name, qty=3)
 
 		self.assertEqual(wo_order.docstatus, 1)
 
 		allow_overproduction("overproduction_percentage_for_sales_order", 0)
 
 	def test_work_order_with_non_stock_item(self):
-		items = {'Finished Good Test Item For non stock': 1, '_Test FG Item': 1, '_Test FG Non Stock Item': 0}
+		items = {
+			"Finished Good Test Item For non stock": 1,
+			"_Test FG Item": 1,
+			"_Test FG Non Stock Item": 0,
+		}
 		for item, is_stock_item in items.items():
-			make_item(item, {
-				'is_stock_item': is_stock_item
-			})
+			make_item(item, {"is_stock_item": is_stock_item})
 
-		if not frappe.db.get_value('Item Price', {'item_code': '_Test FG Non Stock Item'}):
-			frappe.get_doc({
-				'doctype': 'Item Price',
-				'item_code': '_Test FG Non Stock Item',
-				'price_list_rate': 1000,
-				'price_list': 'Standard Buying'
-			}).insert(ignore_permissions=True)
+		if not frappe.db.get_value("Item Price", {"item_code": "_Test FG Non Stock Item"}):
+			frappe.get_doc(
+				{
+					"doctype": "Item Price",
+					"item_code": "_Test FG Non Stock Item",
+					"price_list_rate": 1000,
+					"price_list": "Standard Buying",
+				}
+			).insert(ignore_permissions=True)
 
-		fg_item = 'Finished Good Test Item For non stock'
-		test_stock_entry.make_stock_entry(item_code="_Test FG Item",
-			target="_Test Warehouse - _TC", qty=1, basic_rate=100)
+		fg_item = "Finished Good Test Item For non stock"
+		test_stock_entry.make_stock_entry(
+			item_code="_Test FG Item", target="_Test Warehouse - _TC", qty=1, basic_rate=100
+		)
 
-		if not frappe.db.get_value('BOM', {'item': fg_item}):
-			make_bom(item=fg_item, rate=1000, raw_materials = ['_Test FG Item', '_Test FG Non Stock Item'])
+		if not frappe.db.get_value("BOM", {"item": fg_item}):
+			make_bom(item=fg_item, rate=1000, raw_materials=["_Test FG Item", "_Test FG Non Stock Item"])
 
-		wo = make_wo_order_test_record(production_item = fg_item)
+		wo = make_wo_order_test_record(production_item=fg_item)
 
 		se = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 1))
 		se.insert()
@@ -395,25 +443,25 @@
 	@timeout(seconds=60)
 	def test_job_card(self):
 		stock_entries = []
-		bom = frappe.get_doc('BOM', {
-			'docstatus': 1,
-			'with_operations': 1,
-			'company': '_Test Company'
-		})
+		bom = frappe.get_doc("BOM", {"docstatus": 1, "with_operations": 1, "company": "_Test Company"})
 
-		work_order = make_wo_order_test_record(item=bom.item, qty=1,
-			bom_no=bom.name, source_warehouse="_Test Warehouse - _TC")
+		work_order = make_wo_order_test_record(
+			item=bom.item, qty=1, bom_no=bom.name, source_warehouse="_Test Warehouse - _TC"
+		)
 
 		for row in work_order.required_items:
-			stock_entry_doc = test_stock_entry.make_stock_entry(item_code=row.item_code,
-				target="_Test Warehouse - _TC", qty=row.required_qty, basic_rate=100)
+			stock_entry_doc = test_stock_entry.make_stock_entry(
+				item_code=row.item_code, target="_Test Warehouse - _TC", qty=row.required_qty, basic_rate=100
+			)
 			stock_entries.append(stock_entry_doc)
 
 		ste = frappe.get_doc(make_stock_entry(work_order.name, "Material Transfer for Manufacture", 1))
 		ste.submit()
 		stock_entries.append(ste)
 
-		job_cards = frappe.get_all('Job Card', filters = {'work_order': work_order.name}, order_by='creation asc')
+		job_cards = frappe.get_all(
+			"Job Card", filters={"work_order": work_order.name}, order_by="creation asc"
+		)
 		self.assertEqual(len(job_cards), len(bom.operations))
 
 		for i, job_card in enumerate(job_cards):
@@ -434,29 +482,33 @@
 			stock_entry.cancel()
 
 	def test_capcity_planning(self):
-		frappe.db.set_value("Manufacturing Settings", None, {
-			"disable_capacity_planning": 0,
-			"capacity_planning_for_days": 1
-		})
+		frappe.db.set_value(
+			"Manufacturing Settings",
+			None,
+			{"disable_capacity_planning": 0, "capacity_planning_for_days": 1},
+		)
 
-		data = frappe.get_cached_value('BOM', {'docstatus': 1, 'item': '_Test FG Item 2',
-			'with_operations': 1, 'company': '_Test Company'}, ['name', 'item'])
+		data = frappe.get_cached_value(
+			"BOM",
+			{"docstatus": 1, "item": "_Test FG Item 2", "with_operations": 1, "company": "_Test Company"},
+			["name", "item"],
+		)
 
 		if data:
 			bom, bom_item = data
 
 			planned_start_date = add_months(today(), months=-1)
-			work_order = make_wo_order_test_record(item=bom_item,
-				qty=10, bom_no=bom, planned_start_date=planned_start_date)
+			work_order = make_wo_order_test_record(
+				item=bom_item, qty=10, bom_no=bom, planned_start_date=planned_start_date
+			)
 
-			work_order1 = make_wo_order_test_record(item=bom_item,
-				qty=30, bom_no=bom, planned_start_date=planned_start_date, do_not_submit=1)
+			work_order1 = make_wo_order_test_record(
+				item=bom_item, qty=30, bom_no=bom, planned_start_date=planned_start_date, do_not_submit=1
+			)
 
 			self.assertRaises(CapacityError, work_order1.submit)
 
-			frappe.db.set_value("Manufacturing Settings", None, {
-				"capacity_planning_for_days": 30
-			})
+			frappe.db.set_value("Manufacturing Settings", None, {"capacity_planning_for_days": 30})
 
 			work_order1.reload()
 			work_order1.submit()
@@ -466,22 +518,22 @@
 			work_order.cancel()
 
 	def test_work_order_with_non_transfer_item(self):
-		items = {'Finished Good Transfer Item': 1, '_Test FG Item': 1, '_Test FG Item 1': 0}
+		items = {"Finished Good Transfer Item": 1, "_Test FG Item": 1, "_Test FG Item 1": 0}
 		for item, allow_transfer in items.items():
-			make_item(item, {
-				'include_item_in_manufacturing': allow_transfer
-			})
+			make_item(item, {"include_item_in_manufacturing": allow_transfer})
 
-		fg_item = 'Finished Good Transfer Item'
-		test_stock_entry.make_stock_entry(item_code="_Test FG Item",
-			target="_Test Warehouse - _TC", qty=1, basic_rate=100)
-		test_stock_entry.make_stock_entry(item_code="_Test FG Item 1",
-			target="_Test Warehouse - _TC", qty=1, basic_rate=100)
+		fg_item = "Finished Good Transfer Item"
+		test_stock_entry.make_stock_entry(
+			item_code="_Test FG Item", target="_Test Warehouse - _TC", qty=1, basic_rate=100
+		)
+		test_stock_entry.make_stock_entry(
+			item_code="_Test FG Item 1", target="_Test Warehouse - _TC", qty=1, basic_rate=100
+		)
 
-		if not frappe.db.get_value('BOM', {'item': fg_item}):
-			make_bom(item=fg_item, raw_materials = ['_Test FG Item', '_Test FG Item 1'])
+		if not frappe.db.get_value("BOM", {"item": fg_item}):
+			make_bom(item=fg_item, raw_materials=["_Test FG Item", "_Test FG Item 1"])
 
-		wo = make_wo_order_test_record(production_item = fg_item)
+		wo = make_wo_order_test_record(production_item=fg_item)
 		ste = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 1))
 		ste.insert()
 		ste.submit()
@@ -499,39 +551,42 @@
 		rm1 = "Test Batch Size Item RM 1 For BOM"
 
 		for item in ["Test Batch Size Item For BOM", "Test Batch Size Item RM 1 For BOM"]:
-			make_item(item, {
-				"include_item_in_manufacturing": 1,
-				"is_stock_item": 1
-			})
+			make_item(item, {"include_item_in_manufacturing": 1, "is_stock_item": 1})
 
-		bom_name = frappe.db.get_value("BOM",
-			{"item": fg_item, "is_active": 1, "with_operations": 1}, "name")
+		bom_name = frappe.db.get_value(
+			"BOM", {"item": fg_item, "is_active": 1, "with_operations": 1}, "name"
+		)
 
 		if not bom_name:
-			bom = make_bom(item=fg_item, rate=1000, raw_materials = [rm1], do_not_save=True)
+			bom = make_bom(item=fg_item, rate=1000, raw_materials=[rm1], do_not_save=True)
 			bom.with_operations = 1
-			bom.append("operations", {
-				"operation": "_Test Operation 1",
-				"workstation": "_Test Workstation 1",
-				"description": "Test Data",
-				"operating_cost": 100,
-				"time_in_mins": 40,
-				"batch_size": 5
-			})
+			bom.append(
+				"operations",
+				{
+					"operation": "_Test Operation 1",
+					"workstation": "_Test Workstation 1",
+					"description": "Test Data",
+					"operating_cost": 100,
+					"time_in_mins": 40,
+					"batch_size": 5,
+				},
+			)
 
 			bom.save()
 			bom.submit()
 			bom_name = bom.name
 
-		work_order = make_wo_order_test_record(item=fg_item,
-			planned_start_date=now(), qty=1, do_not_save=True)
+		work_order = make_wo_order_test_record(
+			item=fg_item, planned_start_date=now(), qty=1, do_not_save=True
+		)
 
 		work_order.set_work_order_operations()
 		work_order.save()
 		self.assertEqual(work_order.operations[0].time_in_mins, 8.0)
 
-		work_order1 = make_wo_order_test_record(item=fg_item,
-			planned_start_date=now(), qty=5, do_not_save=True)
+		work_order1 = make_wo_order_test_record(
+			item=fg_item, planned_start_date=now(), qty=5, do_not_save=True
+		)
 
 		work_order1.set_work_order_operations()
 		work_order1.save()
@@ -541,65 +596,73 @@
 		fg_item = "Test Batch Size Item For BOM 3"
 		rm1 = "Test Batch Size Item RM 1 For BOM 3"
 
-		frappe.db.set_value('Manufacturing Settings', None, 'make_serial_no_batch_from_work_order', 0)
+		frappe.db.set_value("Manufacturing Settings", None, "make_serial_no_batch_from_work_order", 0)
 		for item in ["Test Batch Size Item For BOM 3", "Test Batch Size Item RM 1 For BOM 3"]:
-			item_args = {
-				"include_item_in_manufacturing": 1,
-				"is_stock_item": 1
-			}
+			item_args = {"include_item_in_manufacturing": 1, "is_stock_item": 1}
 
 			if item == fg_item:
-				item_args['has_batch_no'] = 1
-				item_args['create_new_batch'] = 1
-				item_args['batch_number_series'] = 'TBSI3.#####'
+				item_args["has_batch_no"] = 1
+				item_args["create_new_batch"] = 1
+				item_args["batch_number_series"] = "TBSI3.#####"
 
 			make_item(item, item_args)
 
-		bom_name = frappe.db.get_value("BOM",
-			{"item": fg_item, "is_active": 1, "with_operations": 1}, "name")
+		bom_name = frappe.db.get_value(
+			"BOM", {"item": fg_item, "is_active": 1, "with_operations": 1}, "name"
+		)
 
 		if not bom_name:
-			bom = make_bom(item=fg_item, rate=1000, raw_materials = [rm1], do_not_save=True)
+			bom = make_bom(item=fg_item, rate=1000, raw_materials=[rm1], do_not_save=True)
 			bom.save()
 			bom.submit()
 			bom_name = bom.name
 
-		work_order = make_wo_order_test_record(item=fg_item, skip_transfer=True, planned_start_date=now(), qty=1)
+		work_order = make_wo_order_test_record(
+			item=fg_item, skip_transfer=True, planned_start_date=now(), qty=1
+		)
 		ste1 = frappe.get_doc(make_stock_entry(work_order.name, "Manufacture", 1))
-		for row in ste1.get('items'):
+		for row in ste1.get("items"):
 			if row.is_finished_item:
 				self.assertEqual(row.item_code, fg_item)
 
-		work_order = make_wo_order_test_record(item=fg_item, skip_transfer=True, planned_start_date=now(), qty=1)
-		frappe.db.set_value('Manufacturing Settings', None, 'make_serial_no_batch_from_work_order', 1)
+		work_order = make_wo_order_test_record(
+			item=fg_item, skip_transfer=True, planned_start_date=now(), qty=1
+		)
+		frappe.db.set_value("Manufacturing Settings", None, "make_serial_no_batch_from_work_order", 1)
 		ste1 = frappe.get_doc(make_stock_entry(work_order.name, "Manufacture", 1))
-		for row in ste1.get('items'):
+		for row in ste1.get("items"):
 			if row.is_finished_item:
 				self.assertEqual(row.item_code, fg_item)
 
-		work_order = make_wo_order_test_record(item=fg_item, skip_transfer=True, planned_start_date=now(),
-			qty=30, do_not_save = True)
+		work_order = make_wo_order_test_record(
+			item=fg_item, skip_transfer=True, planned_start_date=now(), qty=30, do_not_save=True
+		)
 		work_order.batch_size = 10
 		work_order.insert()
 		work_order.submit()
 		self.assertEqual(work_order.has_batch_no, 1)
 		ste1 = frappe.get_doc(make_stock_entry(work_order.name, "Manufacture", 30))
-		for row in ste1.get('items'):
+		for row in ste1.get("items"):
 			if row.is_finished_item:
 				self.assertEqual(row.item_code, fg_item)
 				self.assertEqual(row.qty, 10)
 
-		frappe.db.set_value('Manufacturing Settings', None, 'make_serial_no_batch_from_work_order', 0)
+		frappe.db.set_value("Manufacturing Settings", None, "make_serial_no_batch_from_work_order", 0)
 
 	def test_partial_material_consumption(self):
 		frappe.db.set_value("Manufacturing Settings", None, "material_consumption", 1)
 		wo_order = make_wo_order_test_record(planned_start_date=now(), qty=4)
 
 		ste_cancel_list = []
-		ste1 = test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="_Test Warehouse - _TC", qty=20, basic_rate=5000.0)
-		ste2 = test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="_Test Warehouse - _TC", qty=20, basic_rate=1000.0)
+		ste1 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse - _TC", qty=20, basic_rate=5000.0
+		)
+		ste2 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse - _TC",
+			qty=20,
+			basic_rate=1000.0,
+		)
 
 		ste_cancel_list.extend([ste1, ste2])
 
@@ -625,16 +688,25 @@
 
 	def test_extra_material_transfer(self):
 		frappe.db.set_value("Manufacturing Settings", None, "material_consumption", 0)
-		frappe.db.set_value("Manufacturing Settings", None, "backflush_raw_materials_based_on",
-			"Material Transferred for Manufacture")
+		frappe.db.set_value(
+			"Manufacturing Settings",
+			None,
+			"backflush_raw_materials_based_on",
+			"Material Transferred for Manufacture",
+		)
 
 		wo_order = make_wo_order_test_record(planned_start_date=now(), qty=4)
 
 		ste_cancel_list = []
-		ste1 = test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="_Test Warehouse - _TC", qty=20, basic_rate=5000.0)
-		ste2 = test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="_Test Warehouse - _TC", qty=20, basic_rate=1000.0)
+		ste1 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse - _TC", qty=20, basic_rate=5000.0
+		)
+		ste2 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse - _TC",
+			qty=20,
+			basic_rate=1000.0,
+		)
 
 		ste_cancel_list.extend([ste1, ste2])
 
@@ -666,30 +738,31 @@
 		frappe.db.set_value("Manufacturing Settings", None, "backflush_raw_materials_based_on", "BOM")
 
 	def test_make_stock_entry_for_customer_provided_item(self):
-		finished_item = 'Test Item for Make Stock Entry 1'
-		make_item(finished_item, {
+		finished_item = "Test Item for Make Stock Entry 1"
+		make_item(finished_item, {"include_item_in_manufacturing": 1, "is_stock_item": 1})
+
+		customer_provided_item = "CUST-0987"
+		make_item(
+			customer_provided_item,
+			{
+				"is_purchase_item": 0,
+				"is_customer_provided_item": 1,
+				"is_stock_item": 1,
 				"include_item_in_manufacturing": 1,
-				"is_stock_item": 1
-			})
+				"customer": "_Test Customer",
+			},
+		)
 
-		customer_provided_item = 'CUST-0987'
-		make_item(customer_provided_item, {
-			'is_purchase_item': 0,
-			'is_customer_provided_item': 1,
-			"is_stock_item": 1,
-			"include_item_in_manufacturing": 1,
-			'customer': '_Test Customer'
-		})
-
-		if not frappe.db.exists('BOM', {'item': finished_item}):
+		if not frappe.db.exists("BOM", {"item": finished_item}):
 			make_bom(item=finished_item, raw_materials=[customer_provided_item], rm_qty=1)
 
 		company = "_Test Company with perpetual inventory"
 		customer_warehouse = create_warehouse("Test Customer Provided Warehouse", company=company)
-		wo = make_wo_order_test_record(item=finished_item, qty=1, source_warehouse=customer_warehouse,
-			company=company)
+		wo = make_wo_order_test_record(
+			item=finished_item, qty=1, source_warehouse=customer_warehouse, company=company
+		)
 
-		ste = frappe.get_doc(make_stock_entry(wo.name, purpose='Material Transfer for Manufacture'))
+		ste = frappe.get_doc(make_stock_entry(wo.name, purpose="Material Transfer for Manufacture"))
 		ste.insert()
 
 		self.assertEqual(len(ste.items), 1)
@@ -698,26 +771,33 @@
 			self.assertEqual(item.valuation_rate, 0)
 
 	def test_valuation_rate_missing_on_make_stock_entry(self):
-		item_name = 'Test Valuation Rate Missing'
-		rm_item = '_Test raw material item'
-		make_item(item_name, {
-			"is_stock_item": 1,
-			"include_item_in_manufacturing": 1,
-		})
-		make_item('_Test raw material item', {
-			"is_stock_item": 1,
-			"include_item_in_manufacturing": 1,
-		})
+		item_name = "Test Valuation Rate Missing"
+		rm_item = "_Test raw material item"
+		make_item(
+			item_name,
+			{
+				"is_stock_item": 1,
+				"include_item_in_manufacturing": 1,
+			},
+		)
+		make_item(
+			"_Test raw material item",
+			{
+				"is_stock_item": 1,
+				"include_item_in_manufacturing": 1,
+			},
+		)
 
-		if not frappe.db.get_value('BOM', {'item': item_name}):
+		if not frappe.db.get_value("BOM", {"item": item_name}):
 			make_bom(item=item_name, raw_materials=[rm_item], rm_qty=1)
 
 		company = "_Test Company with perpetual inventory"
 		source_warehouse = create_warehouse("Test Valuation Rate Missing Warehouse", company=company)
-		wo = make_wo_order_test_record(item=item_name, qty=1, source_warehouse=source_warehouse,
-			company=company)
+		wo = make_wo_order_test_record(
+			item=item_name, qty=1, source_warehouse=source_warehouse, company=company
+		)
 
-		stock_entry = frappe.get_doc(make_stock_entry(wo.name, 'Material Transfer for Manufacture'))
+		stock_entry = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture"))
 		self.assertRaises(frappe.ValidationError, stock_entry.save)
 
 	def test_wo_completion_with_pl_bom(self):
@@ -727,19 +807,19 @@
 		)
 
 		qty = 4
-		scrap_qty = 0.25 # bom item qty = 1, consider as 25% of FG
+		scrap_qty = 0.25  # bom item qty = 1, consider as 25% of FG
 		source_warehouse = "Stores - _TC"
 		wip_warehouse = "_Test Warehouse - _TC"
 		fg_item_non_whole, _, bom_item = create_process_loss_bom_items()
 
-		test_stock_entry.make_stock_entry(item_code=bom_item.item_code,
-			target=source_warehouse, qty=4, basic_rate=100)
+		test_stock_entry.make_stock_entry(
+			item_code=bom_item.item_code, target=source_warehouse, qty=4, basic_rate=100
+		)
 
 		bom_no = f"BOM-{fg_item_non_whole.item_code}-001"
 		if not frappe.db.exists("BOM", bom_no):
 			bom_doc = create_bom_with_process_loss_item(
-				fg_item_non_whole, bom_item, scrap_qty=scrap_qty,
-				scrap_rate=0, fg_qty=1, is_process_loss=1
+				fg_item_non_whole, bom_item, scrap_qty=scrap_qty, scrap_rate=0, fg_qty=1, is_process_loss=1
 			)
 			bom_doc.submit()
 
@@ -752,16 +832,12 @@
 			stock_uom=fg_item_non_whole.stock_uom,
 		)
 
-		se = frappe.get_doc(
-			make_stock_entry(wo.name, "Material Transfer for Manufacture", qty)
-		)
+		se = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", qty))
 		se.get("items")[0].s_warehouse = "Stores - _TC"
 		se.insert()
 		se.submit()
 
-		se = frappe.get_doc(
-			make_stock_entry(wo.name, "Manufacture", qty)
-		)
+		se = frappe.get_doc(make_stock_entry(wo.name, "Manufacture", qty))
 		se.insert()
 		se.submit()
 
@@ -778,41 +854,52 @@
 		self.assertEqual(fg_item.qty, actual_fg_qty)
 
 		# Testing Work Order values
-		self.assertEqual(
-			frappe.db.get_value("Work Order", wo.name, "produced_qty"),
-			qty
-		)
-		self.assertEqual(
-			frappe.db.get_value("Work Order", wo.name, "process_loss_qty"),
-			total_pl_qty
-		)
+		self.assertEqual(frappe.db.get_value("Work Order", wo.name, "produced_qty"), qty)
+		self.assertEqual(frappe.db.get_value("Work Order", wo.name, "process_loss_qty"), total_pl_qty)
 
 	@timeout(seconds=60)
 	def test_job_card_scrap_item(self):
-		items = ['Test FG Item for Scrap Item Test', 'Test RM Item 1 for Scrap Item Test',
-			'Test RM Item 2 for Scrap Item Test']
+		items = [
+			"Test FG Item for Scrap Item Test",
+			"Test RM Item 1 for Scrap Item Test",
+			"Test RM Item 2 for Scrap Item Test",
+		]
 
-		company = '_Test Company with perpetual inventory'
+		company = "_Test Company with perpetual inventory"
 		for item_code in items:
-			create_item(item_code = item_code, is_stock_item = 1,
-				is_purchase_item=1, opening_stock=100, valuation_rate=10, company=company, warehouse='Stores - TCP1')
+			create_item(
+				item_code=item_code,
+				is_stock_item=1,
+				is_purchase_item=1,
+				opening_stock=100,
+				valuation_rate=10,
+				company=company,
+				warehouse="Stores - TCP1",
+			)
 
-		item = 'Test FG Item for Scrap Item Test'
-		raw_materials = ['Test RM Item 1 for Scrap Item Test', 'Test RM Item 2 for Scrap Item Test']
-		if not frappe.db.get_value('BOM', {'item': item}):
-			bom = make_bom(item=item, source_warehouse='Stores - TCP1', raw_materials=raw_materials, do_not_save=True)
+		item = "Test FG Item for Scrap Item Test"
+		raw_materials = ["Test RM Item 1 for Scrap Item Test", "Test RM Item 2 for Scrap Item Test"]
+		if not frappe.db.get_value("BOM", {"item": item}):
+			bom = make_bom(
+				item=item, source_warehouse="Stores - TCP1", raw_materials=raw_materials, do_not_save=True
+			)
 			bom.with_operations = 1
-			bom.append('operations', {
-				'operation': '_Test Operation 1',
-				'workstation': '_Test Workstation 1',
-				'hour_rate': 20,
-				'time_in_mins': 60
-			})
+			bom.append(
+				"operations",
+				{
+					"operation": "_Test Operation 1",
+					"workstation": "_Test Workstation 1",
+					"hour_rate": 20,
+					"time_in_mins": 60,
+				},
+			)
 
 			bom.submit()
 
-		wo_order = make_wo_order_test_record(item=item, company=company, planned_start_date=now(), qty=20, skip_transfer=1)
-		job_card = frappe.db.get_value('Job Card', {'work_order': wo_order.name}, 'name')
+		wo_order = make_wo_order_test_record(
+			item=item, company=company, planned_start_date=now(), qty=20, skip_transfer=1
+		)
+		job_card = frappe.db.get_value("Job Card", {"work_order": wo_order.name}, "name")
 		update_job_card(job_card)
 
 		stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
@@ -821,8 +908,10 @@
 				self.assertEqual(row.qty, 1)
 
 		# Partial Job Card 1 with qty 10
-		wo_order = make_wo_order_test_record(item=item, company=company, planned_start_date=add_days(now(), 60), qty=20, skip_transfer=1)
-		job_card = frappe.db.get_value('Job Card', {'work_order': wo_order.name}, 'name')
+		wo_order = make_wo_order_test_record(
+			item=item, company=company, planned_start_date=add_days(now(), 60), qty=20, skip_transfer=1
+		)
+		job_card = frappe.db.get_value("Job Card", {"work_order": wo_order.name}, "name")
 		update_job_card(job_card, 10)
 
 		stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
@@ -835,12 +924,12 @@
 		wo_order.load_from_db()
 		for row in wo_order.operations:
 			n_dict = row.as_dict()
-			n_dict['qty'] = 10
-			n_dict['pending_qty'] = 10
+			n_dict["qty"] = 10
+			n_dict["pending_qty"] = 10
 			operations.append(n_dict)
 
 		make_job_card(wo_order.name, operations)
-		job_card = frappe.db.get_value('Job Card', {'work_order': wo_order.name, 'docstatus': 0}, 'name')
+		job_card = frappe.db.get_value("Job Card", {"work_order": wo_order.name, "docstatus": 0}, "name")
 		update_job_card(job_card, 10)
 
 		stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
@@ -849,131 +938,160 @@
 				self.assertEqual(row.qty, 2)
 
 	def test_close_work_order(self):
-		items = ['Test FG Item for Closed WO', 'Test RM Item 1 for Closed WO',
-			'Test RM Item 2 for Closed WO']
+		items = [
+			"Test FG Item for Closed WO",
+			"Test RM Item 1 for Closed WO",
+			"Test RM Item 2 for Closed WO",
+		]
 
-		company = '_Test Company with perpetual inventory'
+		company = "_Test Company with perpetual inventory"
 		for item_code in items:
-			create_item(item_code = item_code, is_stock_item = 1,
-				is_purchase_item=1, opening_stock=100, valuation_rate=10, company=company, warehouse='Stores - TCP1')
+			create_item(
+				item_code=item_code,
+				is_stock_item=1,
+				is_purchase_item=1,
+				opening_stock=100,
+				valuation_rate=10,
+				company=company,
+				warehouse="Stores - TCP1",
+			)
 
-		item = 'Test FG Item for Closed WO'
-		raw_materials = ['Test RM Item 1 for Closed WO', 'Test RM Item 2 for Closed WO']
-		if not frappe.db.get_value('BOM', {'item': item}):
-			bom = make_bom(item=item, source_warehouse='Stores - TCP1', raw_materials=raw_materials, do_not_save=True)
+		item = "Test FG Item for Closed WO"
+		raw_materials = ["Test RM Item 1 for Closed WO", "Test RM Item 2 for Closed WO"]
+		if not frappe.db.get_value("BOM", {"item": item}):
+			bom = make_bom(
+				item=item, source_warehouse="Stores - TCP1", raw_materials=raw_materials, do_not_save=True
+			)
 			bom.with_operations = 1
-			bom.append('operations', {
-				'operation': '_Test Operation 1',
-				'workstation': '_Test Workstation 1',
-				'hour_rate': 20,
-				'time_in_mins': 60
-			})
+			bom.append(
+				"operations",
+				{
+					"operation": "_Test Operation 1",
+					"workstation": "_Test Workstation 1",
+					"hour_rate": 20,
+					"time_in_mins": 60,
+				},
+			)
 
 			bom.submit()
 
-		wo_order = make_wo_order_test_record(item=item, company=company, planned_start_date=now(), qty=20, skip_transfer=1)
-		job_cards = frappe.db.get_value('Job Card', {'work_order': wo_order.name}, 'name')
+		wo_order = make_wo_order_test_record(
+			item=item, company=company, planned_start_date=now(), qty=20, skip_transfer=1
+		)
+		job_cards = frappe.db.get_value("Job Card", {"work_order": wo_order.name}, "name")
 
 		if len(job_cards) == len(bom.operations):
 			for jc in job_cards:
-				job_card_doc = frappe.get_doc('Job Card', jc)
-				job_card_doc.append('time_logs', {
-					'from_time': now(),
-					'time_in_mins': 60,
-					'completed_qty': job_card_doc.for_quantity
-				})
+				job_card_doc = frappe.get_doc("Job Card", jc)
+				job_card_doc.append(
+					"time_logs",
+					{"from_time": now(), "time_in_mins": 60, "completed_qty": job_card_doc.for_quantity},
+				)
 
 				job_card_doc.submit()
 
 			close_work_order(wo_order, "Closed")
-			self.assertEqual(wo_order.get('status'), "Closed")
+			self.assertEqual(wo_order.get("status"), "Closed")
 
 	def test_fix_time_operations(self):
-		bom = frappe.get_doc({
-			"doctype": "BOM",
-			"item": "_Test FG Item 2",
-			"is_active": 1,
-			"is_default": 1,
-			"quantity": 1.0,
-			"with_operations": 1,
-			"operations": [
-				{
-					"operation": "_Test Operation 1",
-					"description": "_Test",
-					"workstation": "_Test Workstation 1",
-					"time_in_mins": 60,
-					"operating_cost": 140,
-					"fixed_time": 1
-				}
-			],
-			"items": [
-				{
-					"amount": 5000.0,
-					"doctype": "BOM Item",
-					"item_code": "_Test Item",
-					"parentfield": "items",
-					"qty": 1.0,
-					"rate": 5000.0,
-				},
-			],
-		})
+		bom = frappe.get_doc(
+			{
+				"doctype": "BOM",
+				"item": "_Test FG Item 2",
+				"is_active": 1,
+				"is_default": 1,
+				"quantity": 1.0,
+				"with_operations": 1,
+				"operations": [
+					{
+						"operation": "_Test Operation 1",
+						"description": "_Test",
+						"workstation": "_Test Workstation 1",
+						"time_in_mins": 60,
+						"operating_cost": 140,
+						"fixed_time": 1,
+					}
+				],
+				"items": [
+					{
+						"amount": 5000.0,
+						"doctype": "BOM Item",
+						"item_code": "_Test Item",
+						"parentfield": "items",
+						"qty": 1.0,
+						"rate": 5000.0,
+					},
+				],
+			}
+		)
 		bom.save()
 		bom.submit()
 
-
-		wo1 = make_wo_order_test_record(item=bom.item, bom_no=bom.name, qty=1, skip_transfer=1, do_not_submit=1)
-		wo2 = make_wo_order_test_record(item=bom.item, bom_no=bom.name, qty=2, skip_transfer=1, do_not_submit=1)
+		wo1 = make_wo_order_test_record(
+			item=bom.item, bom_no=bom.name, qty=1, skip_transfer=1, do_not_submit=1
+		)
+		wo2 = make_wo_order_test_record(
+			item=bom.item, bom_no=bom.name, qty=2, skip_transfer=1, do_not_submit=1
+		)
 
 		self.assertEqual(wo1.operations[0].time_in_mins, wo2.operations[0].time_in_mins)
 
 	def test_partial_manufacture_entries(self):
 		cancel_stock_entry = []
 
-		frappe.db.set_value("Manufacturing Settings", None,
-			"backflush_raw_materials_based_on", "Material Transferred for Manufacture")
+		frappe.db.set_value(
+			"Manufacturing Settings",
+			None,
+			"backflush_raw_materials_based_on",
+			"Material Transferred for Manufacture",
+		)
 
 		wo_order = make_wo_order_test_record(planned_start_date=now(), qty=100)
-		ste1 = test_stock_entry.make_stock_entry(item_code="_Test Item",
-			target="_Test Warehouse - _TC", qty=120, basic_rate=5000.0)
-		ste2 = test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="_Test Warehouse - _TC", qty=240, basic_rate=1000.0)
+		ste1 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item", target="_Test Warehouse - _TC", qty=120, basic_rate=5000.0
+		)
+		ste2 = test_stock_entry.make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			target="_Test Warehouse - _TC",
+			qty=240,
+			basic_rate=1000.0,
+		)
 
 		cancel_stock_entry.extend([ste1.name, ste2.name])
 
 		sm = frappe.get_doc(make_stock_entry(wo_order.name, "Material Transfer for Manufacture", 100))
-		for row in sm.get('items'):
-			if row.get('item_code') == '_Test Item':
+		for row in sm.get("items"):
+			if row.get("item_code") == "_Test Item":
 				row.qty = 110
 
 		sm.submit()
 		cancel_stock_entry.append(sm.name)
 
 		s = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 90))
-		for row in s.get('items'):
-			if row.get('item_code') == '_Test Item':
-				self.assertEqual(row.get('qty'), 100)
+		for row in s.get("items"):
+			if row.get("item_code") == "_Test Item":
+				self.assertEqual(row.get("qty"), 100)
 		s.submit()
 		cancel_stock_entry.append(s.name)
 
 		s1 = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 5))
-		for row in s1.get('items'):
-			if row.get('item_code') == '_Test Item':
-				self.assertEqual(row.get('qty'), 5)
+		for row in s1.get("items"):
+			if row.get("item_code") == "_Test Item":
+				self.assertEqual(row.get("qty"), 5)
 		s1.submit()
 		cancel_stock_entry.append(s1.name)
 
 		s2 = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 5))
-		for row in s2.get('items'):
-			if row.get('item_code') == '_Test Item':
-				self.assertEqual(row.get('qty'), 5)
+		for row in s2.get("items"):
+			if row.get("item_code") == "_Test Item":
+				self.assertEqual(row.get("qty"), 5)
 
 		cancel_stock_entry.reverse()
 		for ste in cancel_stock_entry:
 			doc = frappe.get_doc("Stock Entry", ste)
 			doc.cancel()
 
-		frappe.db.set_value("Manufacturing Settings", None,
-			"backflush_raw_materials_based_on", "BOM")
+		frappe.db.set_value("Manufacturing Settings", None, "backflush_raw_materials_based_on", "BOM")
 
 	@change_settings("Manufacturing Settings", {"make_serial_no_batch_from_work_order": 1})
 	def test_auto_batch_creation(self):
@@ -982,7 +1100,7 @@
 		fg_item = frappe.generate_hash(length=20)
 		child_item = frappe.generate_hash(length=20)
 
-		bom_tree =  {fg_item: {child_item: {}}}
+		bom_tree = {fg_item: {child_item: {}}}
 
 		create_nested_bom(bom_tree, prefix="")
 
@@ -998,54 +1116,55 @@
 
 
 def update_job_card(job_card, jc_qty=None):
-	employee = frappe.db.get_value('Employee', {'status': 'Active'}, 'name')
-	job_card_doc = frappe.get_doc('Job Card', job_card)
-	job_card_doc.set('scrap_items', [
-		{
-			'item_code': 'Test RM Item 1 for Scrap Item Test',
-			'stock_qty': 2
-		},
-		{
-			'item_code': 'Test RM Item 2 for Scrap Item Test',
-			'stock_qty': 2
-		},
-	])
+	employee = frappe.db.get_value("Employee", {"status": "Active"}, "name")
+	job_card_doc = frappe.get_doc("Job Card", job_card)
+	job_card_doc.set(
+		"scrap_items",
+		[
+			{"item_code": "Test RM Item 1 for Scrap Item Test", "stock_qty": 2},
+			{"item_code": "Test RM Item 2 for Scrap Item Test", "stock_qty": 2},
+		],
+	)
 
 	if jc_qty:
 		job_card_doc.for_quantity = jc_qty
 
-	job_card_doc.append('time_logs', {
-		'from_time': now(),
-		'employee': employee,
-		'time_in_mins': 60,
-		'completed_qty': job_card_doc.for_quantity
-	})
+	job_card_doc.append(
+		"time_logs",
+		{
+			"from_time": now(),
+			"employee": employee,
+			"time_in_mins": 60,
+			"completed_qty": job_card_doc.for_quantity,
+		},
+	)
 
 	job_card_doc.submit()
 
 
 def get_scrap_item_details(bom_no):
 	scrap_items = {}
-	for item in frappe.db.sql("""select item_code, stock_qty from `tabBOM Scrap Item`
-		where parent = %s""", bom_no, as_dict=1):
+	for item in frappe.db.sql(
+		"""select item_code, stock_qty from `tabBOM Scrap Item`
+		where parent = %s""",
+		bom_no,
+		as_dict=1,
+	):
 		scrap_items[item.item_code] = item.stock_qty
 
 	return scrap_items
 
+
 def allow_overproduction(fieldname, percentage):
 	doc = frappe.get_doc("Manufacturing Settings")
-	doc.update({
-		fieldname: percentage
-	})
+	doc.update({fieldname: percentage})
 	doc.save()
 
+
 def make_wo_order_test_record(**args):
 	args = frappe._dict(args)
 	if args.company and args.company != "_Test Company":
-		warehouse_map = {
-			"fg_warehouse": "_Test FG Warehouse",
-			"wip_warehouse": "_Test WIP Warehouse"
-		}
+		warehouse_map = {"fg_warehouse": "_Test FG Warehouse", "wip_warehouse": "_Test WIP Warehouse"}
 
 		for attr, wh_name in warehouse_map.items():
 			if not args.get(attr):
@@ -1053,16 +1172,17 @@
 
 	wo_order = frappe.new_doc("Work Order")
 	wo_order.production_item = args.production_item or args.item or args.item_code or "_Test FG Item"
-	wo_order.bom_no = args.bom_no or frappe.db.get_value("BOM", {"item": wo_order.production_item,
-		"is_active": 1, "is_default": 1})
+	wo_order.bom_no = args.bom_no or frappe.db.get_value(
+		"BOM", {"item": wo_order.production_item, "is_active": 1, "is_default": 1}
+	)
 	wo_order.qty = args.qty or 10
 	wo_order.wip_warehouse = args.wip_warehouse or "_Test Warehouse - _TC"
 	wo_order.fg_warehouse = args.fg_warehouse or "_Test Warehouse 1 - _TC"
 	wo_order.scrap_warehouse = args.fg_warehouse or "_Test Scrap Warehouse - _TC"
 	wo_order.company = args.company or "_Test Company"
 	wo_order.stock_uom = args.stock_uom or "_Test UOM"
-	wo_order.use_multi_level_bom= args.use_multi_level_bom or 0
-	wo_order.skip_transfer=args.skip_transfer or 0
+	wo_order.use_multi_level_bom = args.use_multi_level_bom or 0
+	wo_order.skip_transfer = args.skip_transfer or 0
 	wo_order.get_items_and_operations_from_bom()
 	wo_order.sales_order = args.sales_order or None
 	wo_order.planned_start_date = args.planned_start_date or now()
@@ -1079,4 +1199,5 @@
 			wo_order.submit()
 	return wo_order
 
-test_records = frappe.get_test_records('Work Order')
+
+test_records = frappe.get_test_records("Work Order")
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py
index e832ac9..c8c2f9a 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order.py
@@ -42,11 +42,26 @@
 from erpnext.utilities.transaction_base import validate_uom_is_integer
 
 
-class OverProductionError(frappe.ValidationError): pass
-class CapacityError(frappe.ValidationError): pass
-class StockOverProductionError(frappe.ValidationError): pass
-class OperationTooLongError(frappe.ValidationError): pass
-class ItemHasVariantError(frappe.ValidationError): pass
+class OverProductionError(frappe.ValidationError):
+	pass
+
+
+class CapacityError(frappe.ValidationError):
+	pass
+
+
+class StockOverProductionError(frappe.ValidationError):
+	pass
+
+
+class OperationTooLongError(frappe.ValidationError):
+	pass
+
+
+class ItemHasVariantError(frappe.ValidationError):
+	pass
+
+
 class SerialNoQtyError(frappe.ValidationError):
 	pass
 
@@ -74,12 +89,13 @@
 
 		validate_uom_is_integer(self, "stock_uom", ["qty", "produced_qty"])
 
-		self.set_required_items(reset_only_qty = len(self.get("required_items")))
+		self.set_required_items(reset_only_qty=len(self.get("required_items")))
 
 	def validate_sales_order(self):
 		if self.sales_order:
 			self.check_sales_order_on_hold_or_close()
-			so = frappe.db.sql("""
+			so = frappe.db.sql(
+				"""
 				select so.name, so_item.delivery_date, so.project
 				from `tabSales Order` so
 				inner join `tabSales Order Item` so_item on so_item.parent = so.name
@@ -88,10 +104,14 @@
 					and so.skip_delivery_note  = 0 and (
 					so_item.item_code=%s or
 					pk_item.item_code=%s )
-			""", (self.sales_order, self.production_item, self.production_item), as_dict=1)
+			""",
+				(self.sales_order, self.production_item, self.production_item),
+				as_dict=1,
+			)
 
 			if not so:
-				so = frappe.db.sql("""
+				so = frappe.db.sql(
+					"""
 					select
 						so.name, so_item.delivery_date, so.project
 					from
@@ -102,7 +122,10 @@
 						and so.skip_delivery_note = 0
 						and so_item.item_code = packed_item.parent_item
 						and so.docstatus = 1 and packed_item.item_code=%s
-				""", (self.sales_order, self.production_item), as_dict=1)
+				""",
+					(self.sales_order, self.production_item),
+					as_dict=1,
+				)
 
 			if len(so):
 				if not self.expected_delivery_date:
@@ -123,7 +146,9 @@
 
 	def set_default_warehouse(self):
 		if not self.wip_warehouse:
-			self.wip_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_wip_warehouse")
+			self.wip_warehouse = frappe.db.get_single_value(
+				"Manufacturing Settings", "default_wip_warehouse"
+			)
 		if not self.fg_warehouse:
 			self.fg_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_fg_warehouse")
 
@@ -145,40 +170,55 @@
 			self.planned_operating_cost += flt(d.planned_operating_cost)
 			self.actual_operating_cost += flt(d.actual_operating_cost)
 
-		variable_cost = self.actual_operating_cost if self.actual_operating_cost \
-			else self.planned_operating_cost
+		variable_cost = (
+			self.actual_operating_cost if self.actual_operating_cost else self.planned_operating_cost
+		)
 
-		self.total_operating_cost = (flt(self.additional_operating_cost)
-			+ flt(variable_cost) + flt(self.corrective_operation_cost))
+		self.total_operating_cost = (
+			flt(self.additional_operating_cost) + flt(variable_cost) + flt(self.corrective_operation_cost)
+		)
 
 	def validate_work_order_against_so(self):
 		# already ordered qty
-		ordered_qty_against_so = frappe.db.sql("""select sum(qty) from `tabWork Order`
+		ordered_qty_against_so = frappe.db.sql(
+			"""select sum(qty) from `tabWork Order`
 			where production_item = %s and sales_order = %s and docstatus < 2 and name != %s""",
-			(self.production_item, self.sales_order, self.name))[0][0]
+			(self.production_item, self.sales_order, self.name),
+		)[0][0]
 
 		total_qty = flt(ordered_qty_against_so) + flt(self.qty)
 
 		# get qty from Sales Order Item table
-		so_item_qty = frappe.db.sql("""select sum(stock_qty) from `tabSales Order Item`
+		so_item_qty = frappe.db.sql(
+			"""select sum(stock_qty) from `tabSales Order Item`
 			where parent = %s and item_code = %s""",
-			(self.sales_order, self.production_item))[0][0]
+			(self.sales_order, self.production_item),
+		)[0][0]
 		# get qty from Packing Item table
-		dnpi_qty = frappe.db.sql("""select sum(qty) from `tabPacked Item`
+		dnpi_qty = frappe.db.sql(
+			"""select sum(qty) from `tabPacked Item`
 			where parent = %s and parenttype = 'Sales Order' and item_code = %s""",
-			(self.sales_order, self.production_item))[0][0]
+			(self.sales_order, self.production_item),
+		)[0][0]
 		# total qty in SO
 		so_qty = flt(so_item_qty) + flt(dnpi_qty)
 
-		allowance_percentage = flt(frappe.db.get_single_value("Manufacturing Settings",
-			"overproduction_percentage_for_sales_order"))
+		allowance_percentage = flt(
+			frappe.db.get_single_value(
+				"Manufacturing Settings", "overproduction_percentage_for_sales_order"
+			)
+		)
 
-		if total_qty > so_qty + (allowance_percentage/100 * so_qty):
-			frappe.throw(_("Cannot produce more Item {0} than Sales Order quantity {1}")
-				.format(self.production_item, so_qty), OverProductionError)
+		if total_qty > so_qty + (allowance_percentage / 100 * so_qty):
+			frappe.throw(
+				_("Cannot produce more Item {0} than Sales Order quantity {1}").format(
+					self.production_item, so_qty
+				),
+				OverProductionError,
+			)
 
 	def update_status(self, status=None):
-		'''Update status of work order if unknown'''
+		"""Update status of work order if unknown"""
 		if status != "Stopped" and status != "Closed":
 			status = self.get_status(status)
 
@@ -190,17 +230,22 @@
 		return status
 
 	def get_status(self, status=None):
-		'''Return the status based on stock entries against this work order'''
+		"""Return the status based on stock entries against this work order"""
 		if not status:
 			status = self.status
 
-		if self.docstatus==0:
-			status = 'Draft'
-		elif self.docstatus==1:
-			if status != 'Stopped':
-				stock_entries = frappe._dict(frappe.db.sql("""select purpose, sum(fg_completed_qty)
+		if self.docstatus == 0:
+			status = "Draft"
+		elif self.docstatus == 1:
+			if status != "Stopped":
+				stock_entries = frappe._dict(
+					frappe.db.sql(
+						"""select purpose, sum(fg_completed_qty)
 					from `tabStock Entry` where work_order=%s and docstatus=1
-					group by purpose""", self.name))
+					group by purpose""",
+						self.name,
+					)
+				)
 
 				status = "Not Started"
 				if stock_entries:
@@ -209,31 +254,46 @@
 					if flt(produced_qty) >= flt(self.qty):
 						status = "Completed"
 		else:
-			status = 'Cancelled'
+			status = "Cancelled"
 
 		return status
 
 	def update_work_order_qty(self):
 		"""Update **Manufactured Qty** and **Material Transferred for Qty** in Work Order
-			based on Stock Entry"""
+		based on Stock Entry"""
 
-		allowance_percentage = flt(frappe.db.get_single_value("Manufacturing Settings",
-			"overproduction_percentage_for_work_order"))
+		allowance_percentage = flt(
+			frappe.db.get_single_value("Manufacturing Settings", "overproduction_percentage_for_work_order")
+		)
 
-		for purpose, fieldname in (("Manufacture", "produced_qty"),
-			("Material Transfer for Manufacture", "material_transferred_for_manufacturing")):
-			if (purpose == 'Material Transfer for Manufacture' and
-				self.operations and self.transfer_material_against == 'Job Card'):
+		for purpose, fieldname in (
+			("Manufacture", "produced_qty"),
+			("Material Transfer for Manufacture", "material_transferred_for_manufacturing"),
+		):
+			if (
+				purpose == "Material Transfer for Manufacture"
+				and self.operations
+				and self.transfer_material_against == "Job Card"
+			):
 				continue
 
-			qty = flt(frappe.db.sql("""select sum(fg_completed_qty)
+			qty = flt(
+				frappe.db.sql(
+					"""select sum(fg_completed_qty)
 				from `tabStock Entry` where work_order=%s and docstatus=1
-				and purpose=%s""", (self.name, purpose))[0][0])
+				and purpose=%s""",
+					(self.name, purpose),
+				)[0][0]
+			)
 
-			completed_qty = self.qty + (allowance_percentage/100 * self.qty)
+			completed_qty = self.qty + (allowance_percentage / 100 * self.qty)
 			if qty > completed_qty:
-				frappe.throw(_("{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}").format(\
-					self.meta.get_label(fieldname), qty, completed_qty, self.name), StockOverProductionError)
+				frappe.throw(
+					_("{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}").format(
+						self.meta.get_label(fieldname), qty, completed_qty, self.name
+					),
+					StockOverProductionError,
+				)
 
 			self.db_set(fieldname, qty)
 			self.set_process_loss_qty()
@@ -247,7 +307,9 @@
 			self.update_production_plan_status()
 
 	def set_process_loss_qty(self):
-		process_loss_qty = flt(frappe.db.sql("""
+		process_loss_qty = flt(
+			frappe.db.sql(
+				"""
 				SELECT sum(qty) FROM `tabStock Entry Detail`
 				WHERE
 					is_process_loss=1
@@ -258,21 +320,33 @@
 							AND purpose='Manufacture'
 							AND docstatus=1
 					)
-			""", (self.name, ))[0][0])
+			""",
+				(self.name,),
+			)[0][0]
+		)
 		if process_loss_qty is not None:
-			self.db_set('process_loss_qty', process_loss_qty)
+			self.db_set("process_loss_qty", process_loss_qty)
 
 	def update_production_plan_status(self):
-		production_plan = frappe.get_doc('Production Plan', self.production_plan)
+		production_plan = frappe.get_doc("Production Plan", self.production_plan)
 		produced_qty = 0
 		if self.production_plan_item:
-			total_qty = frappe.get_all("Work Order", fields = "sum(produced_qty) as produced_qty",
-				filters = {'docstatus': 1, 'production_plan': self.production_plan,
-					'production_plan_item': self.production_plan_item}, as_list=1)
+			total_qty = frappe.get_all(
+				"Work Order",
+				fields="sum(produced_qty) as produced_qty",
+				filters={
+					"docstatus": 1,
+					"production_plan": self.production_plan,
+					"production_plan_item": self.production_plan_item,
+				},
+				as_list=1,
+			)
 
 			produced_qty = total_qty[0][0] if total_qty else 0
 
-		production_plan.run_method("update_produced_pending_qty", produced_qty, self.production_plan_item)
+		production_plan.run_method(
+			"update_produced_pending_qty", produced_qty, self.production_plan_item
+		)
 
 	def before_submit(self):
 		self.create_serial_no_batch_no()
@@ -283,7 +357,9 @@
 		if not self.fg_warehouse:
 			frappe.throw(_("For Warehouse is required before Submit"))
 
-		if self.production_plan and frappe.db.exists('Production Plan Item Reference',{'parent':self.production_plan}):
+		if self.production_plan and frappe.db.exists(
+			"Production Plan Item Reference", {"parent": self.production_plan}
+		):
 			self.update_work_order_qty_in_combined_so()
 		else:
 			self.update_work_order_qty_in_so()
@@ -296,9 +372,11 @@
 
 	def on_cancel(self):
 		self.validate_cancel()
-		frappe.db.set(self,'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 
-		if self.production_plan and frappe.db.exists('Production Plan Item Reference',{'parent':self.production_plan}):
+		if self.production_plan and frappe.db.exists(
+			"Production Plan Item Reference", {"parent": self.production_plan}
+		):
 			self.update_work_order_qty_in_combined_so()
 		else:
 			self.update_work_order_qty_in_so()
@@ -314,16 +392,15 @@
 		if not (self.has_serial_no or self.has_batch_no):
 			return
 
-		if not cint(frappe.db.get_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order")):
+		if not cint(
+			frappe.db.get_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order")
+		):
 			return
 
 		if self.has_batch_no:
 			self.create_batch_for_finished_good()
 
-		args = {
-			"item_code": self.production_item,
-			"work_order": self.name
-		}
+		args = {"item_code": self.production_item, "work_order": self.name}
 
 		if self.has_serial_no:
 			self.make_serial_nos(args)
@@ -336,9 +413,12 @@
 		batch_auto_creation = frappe.get_cached_value("Item", self.production_item, "create_new_batch")
 		if not batch_auto_creation:
 			frappe.msgprint(
-				_("Batch not created for item {} since it does not have a batch series.")
-					.format(frappe.bold(self.production_item)),
-				alert=True, indicator="orange")
+				_("Batch not created for item {} since it does not have a batch series.").format(
+					frappe.bold(self.production_item)
+				),
+				alert=True,
+				indicator="orange",
+			)
 			return
 
 		while total_qty > 0:
@@ -352,19 +432,23 @@
 				qty = total_qty
 				total_qty = 0
 
-			make_batch(frappe._dict({
-				"item": self.production_item,
-				"qty_to_produce": qty,
-				"reference_doctype": self.doctype,
-				"reference_name": self.name
-			}))
+			make_batch(
+				frappe._dict(
+					{
+						"item": self.production_item,
+						"qty_to_produce": qty,
+						"reference_doctype": self.doctype,
+						"reference_name": self.name,
+					}
+				)
+			)
 
 	def delete_auto_created_batch_and_serial_no(self):
-		for row in frappe.get_all("Serial No", filters = {"work_order": self.name}):
+		for row in frappe.get_all("Serial No", filters={"work_order": self.name}):
 			frappe.delete_doc("Serial No", row.name)
 			self.db_set("serial_no", "")
 
-		for row in frappe.get_all("Batch", filters = {"reference_name": self.name}):
+		for row in frappe.get_all("Batch", filters={"reference_name": self.name}):
 			frappe.delete_doc("Batch", row.name)
 
 	def make_serial_nos(self, args):
@@ -379,8 +463,12 @@
 
 		serial_nos_length = len(get_serial_nos(self.serial_no))
 		if serial_nos_length != self.qty:
-			frappe.throw(_("{0} Serial Numbers required for Item {1}. You have provided {2}.")
-				.format(self.qty, self.production_item, serial_nos_length), SerialNoQtyError)
+			frappe.throw(
+				_("{0} Serial Numbers required for Item {1}. You have provided {2}.").format(
+					self.qty, self.production_item, serial_nos_length
+				),
+				SerialNoQtyError,
+			)
 
 	def create_job_card(self):
 		manufacturing_settings_doc = frappe.get_doc("Manufacturing Settings")
@@ -393,8 +481,7 @@
 			while qty > 0:
 				qty = split_qty_based_on_batch_size(self, row, qty)
 				if row.job_card_qty > 0:
-					self.prepare_data_for_job_card(row, index,
-						plan_days, enable_capacity_planning)
+					self.prepare_data_for_job_card(row, index, plan_days, enable_capacity_planning)
 
 		planned_end_date = self.operations and self.operations[-1].planned_end_time
 		if planned_end_date:
@@ -404,12 +491,14 @@
 		self.set_operation_start_end_time(index, row)
 
 		if not row.workstation:
-			frappe.throw(_("Row {0}: select the workstation against the operation {1}")
-				.format(row.idx, row.operation))
+			frappe.throw(
+				_("Row {0}: select the workstation against the operation {1}").format(row.idx, row.operation)
+			)
 
 		original_start_time = row.planned_start_time
-		job_card_doc = create_job_card(self, row, auto_create=True,
-			enable_capacity_planning=enable_capacity_planning)
+		job_card_doc = create_job_card(
+			self, row, auto_create=True, enable_capacity_planning=enable_capacity_planning
+		)
 
 		if enable_capacity_planning and job_card_doc:
 			row.planned_start_time = job_card_doc.time_logs[-1].from_time
@@ -417,22 +506,29 @@
 
 			if date_diff(row.planned_start_time, original_start_time) > plan_days:
 				frappe.message_log.pop()
-				frappe.throw(_("Unable to find the time slot in the next {0} days for the operation {1}.")
-					.format(plan_days, row.operation), CapacityError)
+				frappe.throw(
+					_("Unable to find the time slot in the next {0} days for the operation {1}.").format(
+						plan_days, row.operation
+					),
+					CapacityError,
+				)
 
 			row.db_update()
 
 	def set_operation_start_end_time(self, idx, row):
 		"""Set start and end time for given operation. If first operation, set start as
 		`planned_start_date`, else add time diff to end time of earlier operation."""
-		if idx==0:
+		if idx == 0:
 			# first operation at planned_start date
 			row.planned_start_time = self.planned_start_date
 		else:
-			row.planned_start_time = get_datetime(self.operations[idx-1].planned_end_time)\
-				+ get_mins_between_operations()
+			row.planned_start_time = (
+				get_datetime(self.operations[idx - 1].planned_end_time) + get_mins_between_operations()
+			)
 
-		row.planned_end_time = get_datetime(row.planned_start_time) + relativedelta(minutes = row.time_in_mins)
+		row.planned_end_time = get_datetime(row.planned_start_time) + relativedelta(
+			minutes=row.time_in_mins
+		)
 
 		if row.planned_start_time == row.planned_end_time:
 			frappe.throw(_("Capacity Planning Error, planned start time can not be same as end time"))
@@ -442,23 +538,35 @@
 			frappe.throw(_("Stopped Work Order cannot be cancelled, Unstop it first to cancel"))
 
 		# Check whether any stock entry exists against this Work Order
-		stock_entry = frappe.db.sql("""select name from `tabStock Entry`
-			where work_order = %s and docstatus = 1""", self.name)
+		stock_entry = frappe.db.sql(
+			"""select name from `tabStock Entry`
+			where work_order = %s and docstatus = 1""",
+			self.name,
+		)
 		if stock_entry:
-			frappe.throw(_("Cannot cancel because submitted Stock Entry {0} exists").format(frappe.utils.get_link_to_form('Stock Entry', stock_entry[0][0])))
+			frappe.throw(
+				_("Cannot cancel because submitted Stock Entry {0} exists").format(
+					frappe.utils.get_link_to_form("Stock Entry", stock_entry[0][0])
+				)
+			)
 
 	def update_planned_qty(self):
-		update_bin_qty(self.production_item, self.fg_warehouse, {
-			"planned_qty": get_planned_qty(self.production_item, self.fg_warehouse)
-		})
+		update_bin_qty(
+			self.production_item,
+			self.fg_warehouse,
+			{"planned_qty": get_planned_qty(self.production_item, self.fg_warehouse)},
+		)
 
 		if self.material_request:
 			mr_obj = frappe.get_doc("Material Request", self.material_request)
 			mr_obj.update_requested_qty([self.material_request_item])
 
 	def update_ordered_qty(self):
-		if self.production_plan and self.production_plan_item \
-			and not self.production_plan_sub_assembly_item:
+		if (
+			self.production_plan
+			and self.production_plan_item
+			and not self.production_plan_sub_assembly_item
+		):
 			qty = frappe.get_value("Production Plan Item", self.production_plan_item, "ordered_qty") or 0.0
 
 			if self.docstatus == 1:
@@ -466,12 +574,11 @@
 			elif self.docstatus == 2:
 				qty -= self.qty
 
-			frappe.db.set_value('Production Plan Item',
-				self.production_plan_item, 'ordered_qty', qty)
+			frappe.db.set_value("Production Plan Item", self.production_plan_item, "ordered_qty", qty)
 
-			doc = frappe.get_doc('Production Plan', self.production_plan)
+			doc = frappe.get_doc("Production Plan", self.production_plan)
 			doc.set_status()
-			doc.db_set('status', doc.status)
+			doc.db_set("status", doc.status)
 
 	def update_work_order_qty_in_so(self):
 		if not self.sales_order and not self.sales_order_item:
@@ -479,8 +586,11 @@
 
 		total_bundle_qty = 1
 		if self.product_bundle_item:
-			total_bundle_qty = frappe.db.sql(""" select sum(qty) from
-				`tabProduct Bundle Item` where parent = %s""", (frappe.db.escape(self.product_bundle_item)))[0][0]
+			total_bundle_qty = frappe.db.sql(
+				""" select sum(qty) from
+				`tabProduct Bundle Item` where parent = %s""",
+				(frappe.db.escape(self.product_bundle_item)),
+			)[0][0]
 
 			if not total_bundle_qty:
 				# product bundle is 0 (product bundle allows 0 qty for items)
@@ -488,49 +598,78 @@
 
 		cond = "product_bundle_item = %s" if self.product_bundle_item else "production_item = %s"
 
-		qty = frappe.db.sql(""" select sum(qty) from
+		qty = frappe.db.sql(
+			""" select sum(qty) from
 			`tabWork Order` where sales_order = %s and docstatus = 1 and {0}
-			""".format(cond), (self.sales_order, (self.product_bundle_item or self.production_item)), as_list=1)
+			""".format(
+				cond
+			),
+			(self.sales_order, (self.product_bundle_item or self.production_item)),
+			as_list=1,
+		)
 
 		work_order_qty = qty[0][0] if qty and qty[0][0] else 0
-		frappe.db.set_value('Sales Order Item',
-			self.sales_order_item, 'work_order_qty', flt(work_order_qty/total_bundle_qty, 2))
+		frappe.db.set_value(
+			"Sales Order Item",
+			self.sales_order_item,
+			"work_order_qty",
+			flt(work_order_qty / total_bundle_qty, 2),
+		)
 
 	def update_work_order_qty_in_combined_so(self):
 		total_bundle_qty = 1
 		if self.product_bundle_item:
-			total_bundle_qty = frappe.db.sql(""" select sum(qty) from
-				`tabProduct Bundle Item` where parent = %s""", (frappe.db.escape(self.product_bundle_item)))[0][0]
+			total_bundle_qty = frappe.db.sql(
+				""" select sum(qty) from
+				`tabProduct Bundle Item` where parent = %s""",
+				(frappe.db.escape(self.product_bundle_item)),
+			)[0][0]
 
 			if not total_bundle_qty:
 				# product bundle is 0 (product bundle allows 0 qty for items)
 				total_bundle_qty = 1
 
-		prod_plan = frappe.get_doc('Production Plan', self.production_plan)
-		item_reference = frappe.get_value('Production Plan Item', self.production_plan_item, 'sales_order_item')
+		prod_plan = frappe.get_doc("Production Plan", self.production_plan)
+		item_reference = frappe.get_value(
+			"Production Plan Item", self.production_plan_item, "sales_order_item"
+		)
 
 		for plan_reference in prod_plan.prod_plan_references:
 			work_order_qty = 0.0
 			if plan_reference.item_reference == item_reference:
 				if self.docstatus == 1:
 					work_order_qty = flt(plan_reference.qty) / total_bundle_qty
-				frappe.db.set_value('Sales Order Item',
-					plan_reference.sales_order_item, 'work_order_qty', work_order_qty)
+				frappe.db.set_value(
+					"Sales Order Item", plan_reference.sales_order_item, "work_order_qty", work_order_qty
+				)
 
 	def update_completed_qty_in_material_request(self):
 		if self.material_request:
-			frappe.get_doc("Material Request", self.material_request).update_completed_qty([self.material_request_item])
+			frappe.get_doc("Material Request", self.material_request).update_completed_qty(
+				[self.material_request_item]
+			)
 
 	def set_work_order_operations(self):
 		"""Fetch operations from BOM and set in 'Work Order'"""
 
 		def _get_operations(bom_no, qty=1):
-			data = frappe.get_all("BOM Operation",
-					filters={"parent": bom_no},
-					fields=["operation", "description", "workstation", "idx",
-						"base_hour_rate as hour_rate", "time_in_mins", "parent as bom",
-						"batch_size", "sequence_id", "fixed_time"],
-					order_by="idx")
+			data = frappe.get_all(
+				"BOM Operation",
+				filters={"parent": bom_no},
+				fields=[
+					"operation",
+					"description",
+					"workstation",
+					"idx",
+					"base_hour_rate as hour_rate",
+					"time_in_mins",
+					"parent as bom",
+					"batch_size",
+					"sequence_id",
+					"fixed_time",
+				],
+				order_by="idx",
+			)
 
 			for d in data:
 				if not d.fixed_time:
@@ -539,9 +678,8 @@
 
 			return data
 
-
-		self.set('operations', [])
-		if not self.bom_no or not frappe.get_cached_value('BOM', self.bom_no, 'with_operations'):
+		self.set("operations", [])
+		if not self.bom_no or not frappe.get_cached_value("BOM", self.bom_no, "with_operations"):
 			return
 
 		operations = []
@@ -555,12 +693,12 @@
 					operations.extend(_get_operations(node.name, qty=node.exploded_qty))
 
 		bom_qty = frappe.get_cached_value("BOM", self.bom_no, "quantity")
-		operations.extend(_get_operations(self.bom_no, qty=1.0/bom_qty))
+		operations.extend(_get_operations(self.bom_no, qty=1.0 / bom_qty))
 
 		for correct_index, operation in enumerate(operations, start=1):
 			operation.idx = correct_index
 
-		self.set('operations', operations)
+		self.set("operations", operations)
 		self.calculate_time()
 
 	def calculate_time(self):
@@ -576,16 +714,27 @@
 		holidays = {}
 
 		if holiday_list not in holidays:
-			holiday_list_days = [getdate(d[0]) for d in frappe.get_all("Holiday", fields=["holiday_date"],
-				filters={"parent": holiday_list}, order_by="holiday_date", limit_page_length=0, as_list=1)]
+			holiday_list_days = [
+				getdate(d[0])
+				for d in frappe.get_all(
+					"Holiday",
+					fields=["holiday_date"],
+					filters={"parent": holiday_list},
+					order_by="holiday_date",
+					limit_page_length=0,
+					as_list=1,
+				)
+			]
 
 			holidays[holiday_list] = holiday_list_days
 
 		return holidays[holiday_list]
 
 	def update_operation_status(self):
-		allowance_percentage = flt(frappe.db.get_single_value("Manufacturing Settings", "overproduction_percentage_for_work_order"))
-		max_allowed_qty_for_wo = flt(self.qty) + (allowance_percentage/100 * flt(self.qty))
+		allowance_percentage = flt(
+			frappe.db.get_single_value("Manufacturing Settings", "overproduction_percentage_for_work_order")
+		)
+		max_allowed_qty_for_wo = flt(self.qty) + (allowance_percentage / 100 * flt(self.qty))
 
 		for d in self.get("operations"):
 			if not d.completed_qty:
@@ -601,7 +750,9 @@
 
 	def set_actual_dates(self):
 		if self.get("operations"):
-			actual_start_dates = [d.actual_start_time for d in self.get("operations") if d.actual_start_time]
+			actual_start_dates = [
+				d.actual_start_time for d in self.get("operations") if d.actual_start_time
+			]
 			if actual_start_dates:
 				self.actual_start_date = min(actual_start_dates)
 
@@ -609,20 +760,21 @@
 			if actual_end_dates:
 				self.actual_end_date = max(actual_end_dates)
 		else:
-			data = frappe.get_all("Stock Entry",
-				fields = ["timestamp(posting_date, posting_time) as posting_datetime"],
-				filters = {
+			data = frappe.get_all(
+				"Stock Entry",
+				fields=["timestamp(posting_date, posting_time) as posting_datetime"],
+				filters={
 					"work_order": self.name,
-					"purpose": ("in", ["Material Transfer for Manufacture", "Manufacture"])
-				}
+					"purpose": ("in", ["Material Transfer for Manufacture", "Manufacture"]),
+				},
 			)
 
 			if data and len(data):
 				dates = [d.posting_datetime for d in data]
-				self.db_set('actual_start_date', min(dates))
+				self.db_set("actual_start_date", min(dates))
 
 				if self.status == "Completed":
-					self.db_set('actual_end_date', max(dates))
+					self.db_set("actual_end_date", max(dates))
 
 		self.set_lead_time()
 
@@ -645,24 +797,39 @@
 		if not self.qty > 0:
 			frappe.throw(_("Quantity to Manufacture must be greater than 0."))
 
-		if self.production_plan and self.production_plan_item \
-			and not self.production_plan_sub_assembly_item:
-			qty_dict = frappe.db.get_value("Production Plan Item", self.production_plan_item, ["planned_qty", "ordered_qty"], as_dict=1)
+		if (
+			self.production_plan
+			and self.production_plan_item
+			and not self.production_plan_sub_assembly_item
+		):
+			qty_dict = frappe.db.get_value(
+				"Production Plan Item", self.production_plan_item, ["planned_qty", "ordered_qty"], as_dict=1
+			)
 
 			if not qty_dict:
 				return
 
-			allowance_qty = flt(frappe.db.get_single_value("Manufacturing Settings",
-			"overproduction_percentage_for_work_order"))/100 * qty_dict.get("planned_qty", 0)
+			allowance_qty = (
+				flt(
+					frappe.db.get_single_value(
+						"Manufacturing Settings", "overproduction_percentage_for_work_order"
+					)
+				)
+				/ 100
+				* qty_dict.get("planned_qty", 0)
+			)
 
 			max_qty = qty_dict.get("planned_qty", 0) + allowance_qty - qty_dict.get("ordered_qty", 0)
 
 			if not max_qty > 0:
-				frappe.throw(_("Cannot produce more item for {0}")
-				.format(self.production_item), OverProductionError)
+				frappe.throw(
+					_("Cannot produce more item for {0}").format(self.production_item), OverProductionError
+				)
 			elif self.qty > max_qty:
-				frappe.throw(_("Cannot produce more than {0} items for {1}")
-				.format(max_qty, self.production_item), OverProductionError)
+				frappe.throw(
+					_("Cannot produce more than {0} items for {1}").format(max_qty, self.production_item),
+					OverProductionError,
+				)
 
 	def validate_transfer_against(self):
 		if not self.docstatus == 1:
@@ -671,8 +838,10 @@
 		if not self.operations:
 			self.transfer_material_against = "Work Order"
 		if not self.transfer_material_against:
-			frappe.throw(_("Setting {} is required").format(self.meta.get_label("transfer_material_against")), title=_("Missing value"))
-
+			frappe.throw(
+				_("Setting {} is required").format(self.meta.get_label("transfer_material_against")),
+				title=_("Missing value"),
+			)
 
 	def validate_operation_time(self):
 		for d in self.operations:
@@ -680,14 +849,14 @@
 				frappe.throw(_("Operation Time must be greater than 0 for Operation {0}").format(d.operation))
 
 	def update_required_items(self):
-		'''
+		"""
 		update bin reserved_qty_for_production
 		called from Stock Entry for production, after submit, cancel
-		'''
+		"""
 		# calculate consumed qty based on submitted stock entries
 		self.update_consumed_qty_for_required_items()
 
-		if self.docstatus==1:
+		if self.docstatus == 1:
 			# calculate transferred qty based on submitted stock entries
 			self.update_transferred_qty_for_required_items()
 
@@ -695,7 +864,7 @@
 			self.update_reserved_qty_for_production()
 
 	def update_reserved_qty_for_production(self, items=None):
-		'''update reserved_qty_for_production in bins'''
+		"""update reserved_qty_for_production in bins"""
 		for d in self.required_items:
 			if d.source_warehouse:
 				stock_bin = get_bin(d.item_code, d.source_warehouse)
@@ -717,17 +886,18 @@
 				d.available_qty_at_wip_warehouse = get_latest_stock_qty(d.item_code, self.wip_warehouse)
 
 	def set_required_items(self, reset_only_qty=False):
-		'''set required_items for production to keep track of reserved qty'''
+		"""set required_items for production to keep track of reserved qty"""
 		if not reset_only_qty:
 			self.required_items = []
 
 		operation = None
-		if self.get('operations') and len(self.operations) == 1:
+		if self.get("operations") and len(self.operations) == 1:
 			operation = self.operations[0].operation
 
 		if self.bom_no and self.qty:
-			item_dict = get_bom_items_as_dict(self.bom_no, self.company, qty=self.qty,
-				fetch_exploded = self.use_multi_level_bom)
+			item_dict = get_bom_items_as_dict(
+				self.bom_no, self.company, qty=self.qty, fetch_exploded=self.use_multi_level_bom
+			)
 
 			if reset_only_qty:
 				for d in self.get("required_items"):
@@ -737,19 +907,22 @@
 					if not d.operation:
 						d.operation = operation
 			else:
-				for item in sorted(item_dict.values(), key=lambda d: d['idx'] or float('inf')):
-					self.append('required_items', {
-						'rate': item.rate,
-						'amount': item.rate * item.qty,
-						'operation': item.operation or operation,
-						'item_code': item.item_code,
-						'item_name': item.item_name,
-						'description': item.description,
-						'allow_alternative_item': item.allow_alternative_item,
-						'required_qty': item.qty,
-						'source_warehouse': item.source_warehouse or item.default_warehouse,
-						'include_item_in_manufacturing': item.include_item_in_manufacturing
-					})
+				for item in sorted(item_dict.values(), key=lambda d: d["idx"] or float("inf")):
+					self.append(
+						"required_items",
+						{
+							"rate": item.rate,
+							"amount": item.rate * item.qty,
+							"operation": item.operation or operation,
+							"item_code": item.item_code,
+							"item_name": item.item_name,
+							"description": item.description,
+							"allow_alternative_item": item.allow_alternative_item,
+							"required_qty": item.qty,
+							"source_warehouse": item.source_warehouse or item.default_warehouse,
+							"include_item_in_manufacturing": item.include_item_in_manufacturing,
+						},
+					)
 
 					if not self.project:
 						self.project = item.get("project")
@@ -757,32 +930,33 @@
 			self.set_available_qty()
 
 	def update_transferred_qty_for_required_items(self):
-		'''update transferred qty from submitted stock entries for that item against
-			the work order'''
+		"""update transferred qty from submitted stock entries for that item against
+		the work order"""
 
 		for d in self.required_items:
-			transferred_qty = frappe.db.sql('''select sum(qty)
+			transferred_qty = frappe.db.sql(
+				"""select sum(qty)
 				from `tabStock Entry` entry, `tabStock Entry Detail` detail
 				where
 					entry.work_order = %(name)s
 					and entry.purpose = "Material Transfer for Manufacture"
 					and entry.docstatus = 1
 					and detail.parent = entry.name
-					and (detail.item_code = %(item)s or detail.original_item = %(item)s)''', {
-						'name': self.name,
-						'item': d.item_code
-					})[0][0]
+					and (detail.item_code = %(item)s or detail.original_item = %(item)s)""",
+				{"name": self.name, "item": d.item_code},
+			)[0][0]
 
-			d.db_set('transferred_qty', flt(transferred_qty), update_modified = False)
+			d.db_set("transferred_qty", flt(transferred_qty), update_modified=False)
 
 	def update_consumed_qty_for_required_items(self):
-		'''
-			Update consumed qty from submitted stock entries
-			against a work order for each stock item
-		'''
+		"""
+		Update consumed qty from submitted stock entries
+		against a work order for each stock item
+		"""
 
 		for item in self.required_items:
-			consumed_qty = frappe.db.sql('''
+			consumed_qty = frappe.db.sql(
+				"""
 				SELECT
 					SUM(qty)
 				FROM
@@ -797,85 +971,97 @@
 						AND detail.s_warehouse IS NOT null
 						AND (detail.item_code = %(item)s
 							OR detail.original_item = %(item)s)
-				''', {
-					'name': self.name,
-					'item': item.item_code
-				})[0][0]
+				""",
+				{"name": self.name, "item": item.item_code},
+			)[0][0]
 
-			item.db_set('consumed_qty', flt(consumed_qty), update_modified=False)
+			item.db_set("consumed_qty", flt(consumed_qty), update_modified=False)
 
 	@frappe.whitelist()
 	def make_bom(self):
-		data = frappe.db.sql(""" select sed.item_code, sed.qty, sed.s_warehouse
+		data = frappe.db.sql(
+			""" select sed.item_code, sed.qty, sed.s_warehouse
 			from `tabStock Entry Detail` sed, `tabStock Entry` se
 			where se.name = sed.parent and se.purpose = 'Manufacture'
 			and (sed.t_warehouse is null or sed.t_warehouse = '') and se.docstatus = 1
-			and se.work_order = %s""", (self.name), as_dict=1)
+			and se.work_order = %s""",
+			(self.name),
+			as_dict=1,
+		)
 
 		bom = frappe.new_doc("BOM")
 		bom.item = self.production_item
 		bom.conversion_rate = 1
 
 		for d in data:
-			bom.append('items', {
-				'item_code': d.item_code,
-				'qty': d.qty,
-				'source_warehouse': d.s_warehouse
-			})
+			bom.append("items", {"item_code": d.item_code, "qty": d.qty, "source_warehouse": d.s_warehouse})
 
 		if self.operations:
-			bom.set('operations', self.operations)
+			bom.set("operations", self.operations)
 			bom.with_operations = 1
 
 		bom.set_bom_material_details()
 		return bom
 
 	def update_batch_produced_qty(self, stock_entry_doc):
-		if not cint(frappe.db.get_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order")):
+		if not cint(
+			frappe.db.get_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order")
+		):
 			return
 
 		for row in stock_entry_doc.items:
 			if row.batch_no and (row.is_finished_item or row.is_scrap_item):
-				qty = frappe.get_all("Stock Entry Detail", filters = {"batch_no": row.batch_no, "docstatus": 1},
-					or_filters= {"is_finished_item": 1, "is_scrap_item": 1}, fields = ["sum(qty)"], as_list=1)[0][0]
+				qty = frappe.get_all(
+					"Stock Entry Detail",
+					filters={"batch_no": row.batch_no, "docstatus": 1},
+					or_filters={"is_finished_item": 1, "is_scrap_item": 1},
+					fields=["sum(qty)"],
+					as_list=1,
+				)[0][0]
 
 				frappe.db.set_value("Batch", row.batch_no, "produced_qty", flt(qty))
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_bom_operations(doctype, txt, searchfield, start, page_len, filters):
 	if txt:
-		filters['operation'] = ('like', '%%%s%%' % txt)
+		filters["operation"] = ("like", "%%%s%%" % txt)
 
-	return frappe.get_all('BOM Operation',
-		filters = filters, fields = ['operation'], as_list=1)
+	return frappe.get_all("BOM Operation", filters=filters, fields=["operation"], as_list=1)
+
 
 @frappe.whitelist()
-def get_item_details(item, project = None, skip_bom_info=False):
-	res = frappe.db.sql("""
+def get_item_details(item, project=None, skip_bom_info=False):
+	res = frappe.db.sql(
+		"""
 		select stock_uom, description, item_name, allow_alternative_item,
 			include_item_in_manufacturing
 		from `tabItem`
 		where disabled=0
 			and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %s)
 			and name=%s
-	""", (nowdate(), item), as_dict=1)
+	""",
+		(nowdate(), item),
+		as_dict=1,
+	)
 
 	if not res:
 		return {}
 
 	res = res[0]
-	if skip_bom_info: return res
+	if skip_bom_info:
+		return res
 
 	filters = {"item": item, "is_default": 1, "docstatus": 1}
 
 	if project:
 		filters = {"item": item, "project": project}
 
-	res["bom_no"] = frappe.db.get_value("BOM", filters = filters)
+	res["bom_no"] = frappe.db.get_value("BOM", filters=filters)
 
 	if not res["bom_no"]:
-		variant_of= frappe.db.get_value("Item", item, "variant_of")
+		variant_of = frappe.db.get_value("Item", item, "variant_of")
 
 		if variant_of:
 			res["bom_no"] = frappe.db.get_value("BOM", filters={"item": variant_of, "is_default": 1})
@@ -883,19 +1069,26 @@
 	if not res["bom_no"]:
 		if project:
 			res = get_item_details(item)
-			frappe.msgprint(_("Default BOM not found for Item {0} and Project {1}").format(item, project), alert=1)
+			frappe.msgprint(
+				_("Default BOM not found for Item {0} and Project {1}").format(item, project), alert=1
+			)
 		else:
 			frappe.throw(_("Default BOM for {0} not found").format(item))
 
-	bom_data = frappe.db.get_value('BOM', res['bom_no'],
-		['project', 'allow_alternative_item', 'transfer_material_against', 'item_name'], as_dict=1)
+	bom_data = frappe.db.get_value(
+		"BOM",
+		res["bom_no"],
+		["project", "allow_alternative_item", "transfer_material_against", "item_name"],
+		as_dict=1,
+	)
 
-	res['project'] = project or bom_data.pop("project")
+	res["project"] = project or bom_data.pop("project")
 	res.update(bom_data)
 	res.update(check_if_scrap_warehouse_mandatory(res["bom_no"]))
 
 	return res
 
+
 @frappe.whitelist()
 def make_work_order(bom_no, item, qty=0, project=None, variant_items=None):
 	if not frappe.has_permission("Work Order", "write"):
@@ -917,43 +1110,51 @@
 
 	return wo_doc
 
+
 def add_variant_item(variant_items, wo_doc, bom_no, table_name="items"):
 	if isinstance(variant_items, str):
 		variant_items = json.loads(variant_items)
 
 	for item in variant_items:
-		args = frappe._dict({
-			"item_code": item.get("variant_item_code"),
-			"required_qty": item.get("qty"),
-			"qty": item.get("qty"), # for bom
-			"source_warehouse": item.get("source_warehouse"),
-			"operation": item.get("operation")
-		})
+		args = frappe._dict(
+			{
+				"item_code": item.get("variant_item_code"),
+				"required_qty": item.get("qty"),
+				"qty": item.get("qty"),  # for bom
+				"source_warehouse": item.get("source_warehouse"),
+				"operation": item.get("operation"),
+			}
+		)
 
 		bom_doc = frappe.get_cached_doc("BOM", bom_no)
 		item_data = get_item_details(args.item_code, skip_bom_info=True)
 		args.update(item_data)
 
-		args["rate"] = get_bom_item_rate({
-			"company": wo_doc.company,
-			"item_code": args.get("item_code"),
-			"qty": args.get("required_qty"),
-			"uom": args.get("stock_uom"),
-			"stock_uom": args.get("stock_uom"),
-			"conversion_factor": 1
-		}, bom_doc)
+		args["rate"] = get_bom_item_rate(
+			{
+				"company": wo_doc.company,
+				"item_code": args.get("item_code"),
+				"qty": args.get("required_qty"),
+				"uom": args.get("stock_uom"),
+				"stock_uom": args.get("stock_uom"),
+				"conversion_factor": 1,
+			},
+			bom_doc,
+		)
 
 		if not args.source_warehouse:
-			args["source_warehouse"] = get_item_defaults(item.get("variant_item_code"),
-				wo_doc.company).default_warehouse
+			args["source_warehouse"] = get_item_defaults(
+				item.get("variant_item_code"), wo_doc.company
+			).default_warehouse
 
 		args["amount"] = flt(args.get("required_qty")) * flt(args.get("rate"))
 		args["uom"] = item_data.stock_uom
 		wo_doc.append(table_name, args)
 
+
 @frappe.whitelist()
 def check_if_scrap_warehouse_mandatory(bom_no):
-	res = {"set_scrap_wh_mandatory": False }
+	res = {"set_scrap_wh_mandatory": False}
 	if bom_no:
 		bom = frappe.get_doc("BOM", bom_no)
 
@@ -962,12 +1163,14 @@
 
 	return res
 
+
 @frappe.whitelist()
 def set_work_order_ops(name):
-	po = frappe.get_doc('Work Order', name)
+	po = frappe.get_doc("Work Order", name)
 	po.set_work_order_operations()
 	po.save()
 
+
 @frappe.whitelist()
 def make_stock_entry(work_order_id, purpose, qty=None):
 	work_order = frappe.get_doc("Work Order", work_order_id)
@@ -985,10 +1188,11 @@
 	stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
 	stock_entry.fg_completed_qty = qty or (flt(work_order.qty) - flt(work_order.produced_qty))
 	if work_order.bom_no:
-		stock_entry.inspection_required = frappe.db.get_value('BOM',
-			work_order.bom_no, 'inspection_required')
+		stock_entry.inspection_required = frappe.db.get_value(
+			"BOM", work_order.bom_no, "inspection_required"
+		)
 
-	if purpose=="Material Transfer for Manufacture":
+	if purpose == "Material Transfer for Manufacture":
 		stock_entry.to_warehouse = wip_warehouse
 		stock_entry.project = work_order.project
 	else:
@@ -1001,6 +1205,7 @@
 	stock_entry.set_serial_no_batch_for_finished_good()
 	return stock_entry.as_dict()
 
+
 @frappe.whitelist()
 def get_default_warehouse():
 	doc = frappe.get_cached_doc("Manufacturing Settings")
@@ -1008,12 +1213,13 @@
 	return {
 		"wip_warehouse": doc.default_wip_warehouse,
 		"fg_warehouse": doc.default_fg_warehouse,
-		"scrap_warehouse": doc.default_scrap_warehouse
+		"scrap_warehouse": doc.default_scrap_warehouse,
 	}
 
+
 @frappe.whitelist()
 def stop_unstop(work_order, status):
-	""" Called from client side on Stop/Unstop event"""
+	"""Called from client side on Stop/Unstop event"""
 
 	if not frappe.has_permission("Work Order", "write"):
 		frappe.throw(_("Not permitted"), frappe.PermissionError)
@@ -1030,24 +1236,29 @@
 
 	return pro_order.status
 
+
 @frappe.whitelist()
 def query_sales_order(production_item):
-	out = frappe.db.sql_list("""
+	out = frappe.db.sql_list(
+		"""
 		select distinct so.name from `tabSales Order` so, `tabSales Order Item` so_item
 		where so_item.parent=so.name and so_item.item_code=%s and so.docstatus=1
 	union
 		select distinct so.name from `tabSales Order` so, `tabPacked Item` pi_item
 		where pi_item.parent=so.name and pi_item.item_code=%s and so.docstatus=1
-	""", (production_item, production_item))
+	""",
+		(production_item, production_item),
+	)
 
 	return out
 
+
 @frappe.whitelist()
 def make_job_card(work_order, operations):
 	if isinstance(operations, str):
 		operations = json.loads(operations)
 
-	work_order = frappe.get_doc('Work Order', work_order)
+	work_order = frappe.get_doc("Work Order", work_order)
 	for row in operations:
 		row = frappe._dict(row)
 		validate_operation_data(row)
@@ -1057,6 +1268,7 @@
 			if row.job_card_qty > 0:
 				create_job_card(work_order, row, auto_create=True)
 
+
 @frappe.whitelist()
 def close_work_order(work_order, status):
 	if not frappe.has_permission("Work Order", "write"):
@@ -1064,15 +1276,17 @@
 
 	work_order = frappe.get_doc("Work Order", work_order)
 	if work_order.get("operations"):
-		job_cards = frappe.get_list("Job Card",
-			filters={
-				"work_order": work_order.name,
-				"status": "Work In Progress"
-			}, pluck='name')
+		job_cards = frappe.get_list(
+			"Job Card", filters={"work_order": work_order.name, "status": "Work In Progress"}, pluck="name"
+		)
 
 		if job_cards:
 			job_cards = ", ".join(job_cards)
-			frappe.throw(_("Can not close Work Order. Since {0} Job Cards are in Work In Progress state.").format(job_cards))
+			frappe.throw(
+				_("Can not close Work Order. Since {0} Job Cards are in Work In Progress state.").format(
+					job_cards
+				)
+			)
 
 	work_order.update_status(status)
 	work_order.update_planned_qty()
@@ -1080,9 +1294,11 @@
 	work_order.notify_update()
 	return work_order.status
 
+
 def split_qty_based_on_batch_size(wo_doc, row, qty):
-	if not cint(frappe.db.get_value("Operation",
-		row.operation, "create_job_card_based_on_batch_size")):
+	if not cint(
+		frappe.db.get_value("Operation", row.operation, "create_job_card_based_on_batch_size")
+	):
 		row.batch_size = row.get("qty") or wo_doc.qty
 
 	row.job_card_qty = row.batch_size
@@ -1096,55 +1312,63 @@
 
 	return qty
 
+
 def get_serial_nos_for_job_card(row, wo_doc):
 	if not wo_doc.serial_no:
 		return
 
 	serial_nos = get_serial_nos(wo_doc.serial_no)
 	used_serial_nos = []
-	for d in frappe.get_all('Job Card', fields=['serial_no'],
-		filters={'docstatus': ('<', 2), 'work_order': wo_doc.name, 'operation_id': row.name}):
+	for d in frappe.get_all(
+		"Job Card",
+		fields=["serial_no"],
+		filters={"docstatus": ("<", 2), "work_order": wo_doc.name, "operation_id": row.name},
+	):
 		used_serial_nos.extend(get_serial_nos(d.serial_no))
 
 	serial_nos = sorted(list(set(serial_nos) - set(used_serial_nos)))
-	row.serial_no = '\n'.join(serial_nos[0:row.job_card_qty])
+	row.serial_no = "\n".join(serial_nos[0 : row.job_card_qty])
+
 
 def validate_operation_data(row):
 	if row.get("qty") <= 0:
-		frappe.throw(_("Quantity to Manufacture can not be zero for the operation {0}")
-			.format(
+		frappe.throw(
+			_("Quantity to Manufacture can not be zero for the operation {0}").format(
 				frappe.bold(row.get("operation"))
 			)
 		)
 
 	if row.get("qty") > row.get("pending_qty"):
-		frappe.throw(_("For operation {0}: Quantity ({1}) can not be greter than pending quantity({2})")
-			.format(
+		frappe.throw(
+			_("For operation {0}: Quantity ({1}) can not be greter than pending quantity({2})").format(
 				frappe.bold(row.get("operation")),
 				frappe.bold(row.get("qty")),
-				frappe.bold(row.get("pending_qty"))
+				frappe.bold(row.get("pending_qty")),
 			)
 		)
 
+
 def create_job_card(work_order, row, enable_capacity_planning=False, auto_create=False):
 	doc = frappe.new_doc("Job Card")
-	doc.update({
-		'work_order': work_order.name,
-		'operation': row.get("operation"),
-		'workstation': row.get("workstation"),
-		'posting_date': nowdate(),
-		'for_quantity': row.job_card_qty or work_order.get('qty', 0),
-		'operation_id': row.get("name"),
-		'bom_no': work_order.bom_no,
-		'project': work_order.project,
-		'company': work_order.company,
-		'sequence_id': row.get("sequence_id"),
-		'wip_warehouse': work_order.wip_warehouse,
-		'hour_rate': row.get("hour_rate"),
-		'serial_no': row.get("serial_no")
-	})
+	doc.update(
+		{
+			"work_order": work_order.name,
+			"operation": row.get("operation"),
+			"workstation": row.get("workstation"),
+			"posting_date": nowdate(),
+			"for_quantity": row.job_card_qty or work_order.get("qty", 0),
+			"operation_id": row.get("name"),
+			"bom_no": work_order.bom_no,
+			"project": work_order.project,
+			"company": work_order.company,
+			"sequence_id": row.get("sequence_id"),
+			"wip_warehouse": work_order.wip_warehouse,
+			"hour_rate": row.get("hour_rate"),
+			"serial_no": row.get("serial_no"),
+		}
+	)
 
-	if work_order.transfer_material_against == 'Job Card' and not work_order.skip_transfer:
+	if work_order.transfer_material_against == "Job Card" and not work_order.skip_transfer:
 		doc.get_required_items()
 
 	if auto_create:
@@ -1153,7 +1377,9 @@
 			doc.schedule_time_logs(row)
 
 		doc.insert()
-		frappe.msgprint(_("Job card {0} created").format(get_link_to_form("Job Card", doc.name)), alert=True)
+		frappe.msgprint(
+			_("Job card {0} created").format(get_link_to_form("Job Card", doc.name)), alert=True
+		)
 
 	if enable_capacity_planning:
 		# automatically added scheduling rows shouldn't change status to WIP
@@ -1161,15 +1387,18 @@
 
 	return doc
 
+
 def get_work_order_operation_data(work_order, operation, workstation):
 	for d in work_order.operations:
 		if d.operation == operation and d.workstation == workstation:
 			return d
 
+
 @frappe.whitelist()
 def create_pick_list(source_name, target_doc=None, for_qty=None):
-	for_qty = for_qty or json.loads(target_doc).get('for_qty')
-	max_finished_goods_qty = frappe.db.get_value('Work Order', source_name, 'qty')
+	for_qty = for_qty or json.loads(target_doc).get("for_qty")
+	max_finished_goods_qty = frappe.db.get_value("Work Order", source_name, "qty")
+
 	def update_item_quantity(source, target, source_parent):
 		pending_to_issue = flt(source.required_qty) - flt(source.transferred_qty)
 		desire_to_transfer = flt(source.required_qty) / max_finished_goods_qty * flt(for_qty)
@@ -1183,25 +1412,25 @@
 		if qty:
 			target.qty = qty
 			target.stock_qty = qty
-			target.uom = frappe.get_value('Item', source.item_code, 'stock_uom')
+			target.uom = frappe.get_value("Item", source.item_code, "stock_uom")
 			target.stock_uom = target.uom
 			target.conversion_factor = 1
 		else:
 			target.delete()
 
-	doc = get_mapped_doc('Work Order', source_name, {
-		'Work Order': {
-			'doctype': 'Pick List',
-			'validation': {
-				'docstatus': ['=', 1]
-			}
+	doc = get_mapped_doc(
+		"Work Order",
+		source_name,
+		{
+			"Work Order": {"doctype": "Pick List", "validation": {"docstatus": ["=", 1]}},
+			"Work Order Item": {
+				"doctype": "Pick List Item",
+				"postprocess": update_item_quantity,
+				"condition": lambda doc: abs(doc.transferred_qty) < abs(doc.required_qty),
+			},
 		},
-		'Work Order Item': {
-			'doctype': 'Pick List Item',
-			'postprocess': update_item_quantity,
-			'condition': lambda doc: abs(doc.transferred_qty) < abs(doc.required_qty)
-		},
-	}, target_doc)
+		target_doc,
+	)
 
 	doc.for_qty = for_qty
 
@@ -1209,26 +1438,31 @@
 
 	return doc
 
+
 def get_reserved_qty_for_production(item_code: str, warehouse: str) -> float:
 	"""Get total reserved quantity for any item in specified warehouse"""
 	wo = frappe.qb.DocType("Work Order")
 	wo_item = frappe.qb.DocType("Work Order Item")
 
 	return (
-	frappe.qb
-		.from_(wo)
+		frappe.qb.from_(wo)
 		.from_(wo_item)
-		.select(Sum(Case()
+		.select(
+			Sum(
+				Case()
 				.when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
-				.else_(wo_item.required_qty - wo_item.consumed_qty))
+				.else_(wo_item.required_qty - wo_item.consumed_qty)
 			)
+		)
 		.where(
 			(wo_item.item_code == item_code)
 			& (wo_item.parent == wo.name)
 			& (wo.docstatus == 1)
 			& (wo_item.source_warehouse == warehouse)
 			& (wo.status.notin(["Stopped", "Completed", "Closed"]))
-			& ((wo_item.required_qty > wo_item.transferred_qty)
-				| (wo_item.required_qty > wo_item.consumed_qty))
+			& (
+				(wo_item.required_qty > wo_item.transferred_qty)
+				| (wo_item.required_qty > wo_item.consumed_qty)
+			)
 		)
 	).run()[0][0] or 0.0
diff --git a/erpnext/manufacturing/doctype/work_order/work_order_dashboard.py b/erpnext/manufacturing/doctype/work_order/work_order_dashboard.py
index 37dd11a..465460f 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order_dashboard.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order_dashboard.py
@@ -3,18 +3,10 @@
 
 def get_data():
 	return {
-		'fieldname': 'work_order',
-		'non_standard_fieldnames': {
-			'Batch': 'reference_name'
-		},
-		'transactions': [
-			{
-				'label': _('Transactions'),
-				'items': ['Stock Entry', 'Job Card', 'Pick List']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Serial No', 'Batch']
-			}
-		]
+		"fieldname": "work_order",
+		"non_standard_fieldnames": {"Batch": "reference_name"},
+		"transactions": [
+			{"label": _("Transactions"), "items": ["Stock Entry", "Job Card", "Pick List"]},
+			{"label": _("Reference"), "items": ["Serial No", "Batch"]},
+		],
 	}
diff --git a/erpnext/manufacturing/doctype/work_order_item/work_order_item.py b/erpnext/manufacturing/doctype/work_order_item/work_order_item.py
index 4311d3b..1792747 100644
--- a/erpnext/manufacturing/doctype/work_order_item/work_order_item.py
+++ b/erpnext/manufacturing/doctype/work_order_item/work_order_item.py
@@ -9,5 +9,6 @@
 class WorkOrderItem(Document):
 	pass
 
+
 def on_doctype_update():
 	frappe.db.add_index("Work Order Item", ["item_code", "source_warehouse"])
diff --git a/erpnext/manufacturing/doctype/workstation/test_workstation.py b/erpnext/manufacturing/doctype/workstation/test_workstation.py
index dd51017..6db985c 100644
--- a/erpnext/manufacturing/doctype/workstation/test_workstation.py
+++ b/erpnext/manufacturing/doctype/workstation/test_workstation.py
@@ -13,19 +13,42 @@
 )
 
 test_dependencies = ["Warehouse"]
-test_records = frappe.get_test_records('Workstation')
-make_test_records('Workstation')
+test_records = frappe.get_test_records("Workstation")
+make_test_records("Workstation")
+
 
 class TestWorkstation(FrappeTestCase):
 	def test_validate_timings(self):
-		check_if_within_operating_hours("_Test Workstation 1", "Operation 1", "2013-02-02 11:00:00", "2013-02-02 19:00:00")
-		check_if_within_operating_hours("_Test Workstation 1", "Operation 1", "2013-02-02 10:00:00", "2013-02-02 20:00:00")
-		self.assertRaises(NotInWorkingHoursError, check_if_within_operating_hours,
-			"_Test Workstation 1", "Operation 1", "2013-02-02 05:00:00", "2013-02-02 20:00:00")
-		self.assertRaises(NotInWorkingHoursError, check_if_within_operating_hours,
-			"_Test Workstation 1", "Operation 1", "2013-02-02 05:00:00", "2013-02-02 20:00:00")
-		self.assertRaises(WorkstationHolidayError, check_if_within_operating_hours,
-			"_Test Workstation 1", "Operation 1", "2013-02-01 10:00:00", "2013-02-02 20:00:00")
+		check_if_within_operating_hours(
+			"_Test Workstation 1", "Operation 1", "2013-02-02 11:00:00", "2013-02-02 19:00:00"
+		)
+		check_if_within_operating_hours(
+			"_Test Workstation 1", "Operation 1", "2013-02-02 10:00:00", "2013-02-02 20:00:00"
+		)
+		self.assertRaises(
+			NotInWorkingHoursError,
+			check_if_within_operating_hours,
+			"_Test Workstation 1",
+			"Operation 1",
+			"2013-02-02 05:00:00",
+			"2013-02-02 20:00:00",
+		)
+		self.assertRaises(
+			NotInWorkingHoursError,
+			check_if_within_operating_hours,
+			"_Test Workstation 1",
+			"Operation 1",
+			"2013-02-02 05:00:00",
+			"2013-02-02 20:00:00",
+		)
+		self.assertRaises(
+			WorkstationHolidayError,
+			check_if_within_operating_hours,
+			"_Test Workstation 1",
+			"Operation 1",
+			"2013-02-01 10:00:00",
+			"2013-02-02 20:00:00",
+		)
 
 	def test_update_bom_operation_rate(self):
 		operations = [
@@ -33,14 +56,14 @@
 				"operation": "Test Operation A",
 				"workstation": "_Test Workstation A",
 				"hour_rate_rent": 300,
-				"time_in_mins": 60
+				"time_in_mins": 60,
 			},
 			{
 				"operation": "Test Operation B",
 				"workstation": "_Test Workstation B",
 				"hour_rate_rent": 1000,
-				"time_in_mins": 60
-			}
+				"time_in_mins": 60,
+			},
 		]
 
 		for row in operations:
@@ -48,21 +71,13 @@
 			make_operation(row)
 
 		test_routing_operations = [
-			{
-				"operation": "Test Operation A",
-				"workstation": "_Test Workstation A",
-				"time_in_mins": 60
-			},
-			{
-				"operation": "Test Operation B",
-				"workstation": "_Test Workstation A",
-				"time_in_mins": 60
-			}
+			{"operation": "Test Operation A", "workstation": "_Test Workstation A", "time_in_mins": 60},
+			{"operation": "Test Operation B", "workstation": "_Test Workstation A", "time_in_mins": 60},
 		]
-		routing_doc = create_routing(routing_name = "Routing Test", operations=test_routing_operations)
+		routing_doc = create_routing(routing_name="Routing Test", operations=test_routing_operations)
 		bom_doc = setup_bom(item_code="_Testing Item", routing=routing_doc.name, currency="INR")
 		w1 = frappe.get_doc("Workstation", "_Test Workstation A")
-		#resets values
+		# resets values
 		w1.hour_rate_rent = 300
 		w1.hour_rate_labour = 0
 		w1.save()
@@ -72,13 +87,14 @@
 		self.assertEqual(bom_doc.operations[0].hour_rate, 300)
 		w1.hour_rate_rent = 250
 		w1.save()
-		#updating after setting new rates in workstations
+		# updating after setting new rates in workstations
 		bom_doc.update_cost()
 		bom_doc.reload()
 		self.assertEqual(w1.hour_rate, 250)
 		self.assertEqual(bom_doc.operations[0].hour_rate, 250)
 		self.assertEqual(bom_doc.operations[1].hour_rate, 250)
 
+
 def make_workstation(*args, **kwargs):
 	args = args if args else kwargs
 	if isinstance(args, tuple):
@@ -88,10 +104,7 @@
 
 	workstation_name = args.workstation_name or args.workstation
 	if not frappe.db.exists("Workstation", workstation_name):
-		doc = frappe.get_doc({
-			"doctype": "Workstation",
-			"workstation_name": workstation_name
-		})
+		doc = frappe.get_doc({"doctype": "Workstation", "workstation_name": workstation_name})
 		doc.hour_rate_rent = args.get("hour_rate_rent")
 		doc.hour_rate_labour = args.get("hour_rate_labour")
 		doc.insert()
diff --git a/erpnext/manufacturing/doctype/workstation/workstation.py b/erpnext/manufacturing/doctype/workstation/workstation.py
index 4cfd410..59e5318 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation.py
+++ b/erpnext/manufacturing/doctype/workstation/workstation.py
@@ -19,14 +19,26 @@
 from erpnext.support.doctype.issue.issue import get_holidays
 
 
-class WorkstationHolidayError(frappe.ValidationError): pass
-class NotInWorkingHoursError(frappe.ValidationError): pass
-class OverlapError(frappe.ValidationError): pass
+class WorkstationHolidayError(frappe.ValidationError):
+	pass
+
+
+class NotInWorkingHoursError(frappe.ValidationError):
+	pass
+
+
+class OverlapError(frappe.ValidationError):
+	pass
+
 
 class Workstation(Document):
 	def validate(self):
-		self.hour_rate = (flt(self.hour_rate_labour) + flt(self.hour_rate_electricity) +
-			flt(self.hour_rate_consumable) + flt(self.hour_rate_rent))
+		self.hour_rate = (
+			flt(self.hour_rate_labour)
+			+ flt(self.hour_rate_electricity)
+			+ flt(self.hour_rate_consumable)
+			+ flt(self.hour_rate_rent)
+		)
 
 	def on_update(self):
 		self.validate_overlap_for_operation_timings()
@@ -35,29 +47,41 @@
 	def validate_overlap_for_operation_timings(self):
 		"""Check if there is no overlap in setting Workstation Operating Hours"""
 		for d in self.get("working_hours"):
-			existing = frappe.db.sql_list("""select idx from `tabWorkstation Working Hour`
+			existing = frappe.db.sql_list(
+				"""select idx from `tabWorkstation Working Hour`
 				where parent = %s and name != %s
 					and (
 						(start_time between %s and %s) or
 						(end_time between %s and %s) or
 						(%s between start_time and end_time))
-				""", (self.name, d.name, d.start_time, d.end_time, d.start_time, d.end_time, d.start_time))
+				""",
+				(self.name, d.name, d.start_time, d.end_time, d.start_time, d.end_time, d.start_time),
+			)
 
 			if existing:
-				frappe.throw(_("Row #{0}: Timings conflicts with row {1}").format(d.idx, comma_and(existing)), OverlapError)
+				frappe.throw(
+					_("Row #{0}: Timings conflicts with row {1}").format(d.idx, comma_and(existing)), OverlapError
+				)
 
 	def update_bom_operation(self):
-		bom_list = frappe.db.sql("""select DISTINCT parent from `tabBOM Operation`
-			where workstation = %s and parenttype = 'routing' """, self.name)
+		bom_list = frappe.db.sql(
+			"""select DISTINCT parent from `tabBOM Operation`
+			where workstation = %s and parenttype = 'routing' """,
+			self.name,
+		)
 
 		for bom_no in bom_list:
-			frappe.db.sql("""update `tabBOM Operation` set hour_rate = %s
+			frappe.db.sql(
+				"""update `tabBOM Operation` set hour_rate = %s
 				where parent = %s and workstation = %s""",
-				(self.hour_rate, bom_no[0], self.name))
+				(self.hour_rate, bom_no[0], self.name),
+			)
 
 	def validate_workstation_holiday(self, schedule_date, skip_holiday_list_check=False):
-		if not skip_holiday_list_check and (not self.holiday_list or
-			cint(frappe.db.get_single_value("Manufacturing Settings", "allow_production_on_holidays"))):
+		if not skip_holiday_list_check and (
+			not self.holiday_list
+			or cint(frappe.db.get_single_value("Manufacturing Settings", "allow_production_on_holidays"))
+		):
 			return schedule_date
 
 		if schedule_date in tuple(get_holidays(self.holiday_list)):
@@ -66,18 +90,25 @@
 
 		return schedule_date
 
+
 @frappe.whitelist()
 def get_default_holiday_list():
-	return frappe.get_cached_value('Company',  frappe.defaults.get_user_default("Company"),  "default_holiday_list")
+	return frappe.get_cached_value(
+		"Company", frappe.defaults.get_user_default("Company"), "default_holiday_list"
+	)
+
 
 def check_if_within_operating_hours(workstation, operation, from_datetime, to_datetime):
 	if from_datetime and to_datetime:
-		if not cint(frappe.db.get_value("Manufacturing Settings", "None", "allow_production_on_holidays")):
+		if not cint(
+			frappe.db.get_value("Manufacturing Settings", "None", "allow_production_on_holidays")
+		):
 			check_workstation_for_holiday(workstation, from_datetime, to_datetime)
 
 		if not cint(frappe.db.get_value("Manufacturing Settings", None, "allow_overtime")):
 			is_within_operating_hours(workstation, operation, from_datetime, to_datetime)
 
+
 def is_within_operating_hours(workstation, operation, from_datetime, to_datetime):
 	operation_length = time_diff_in_seconds(to_datetime, from_datetime)
 	workstation = frappe.get_doc("Workstation", workstation)
@@ -87,21 +118,35 @@
 
 	for working_hour in workstation.working_hours:
 		if working_hour.start_time and working_hour.end_time:
-			slot_length = (to_timedelta(working_hour.end_time or "") - to_timedelta(working_hour.start_time or "")).total_seconds()
+			slot_length = (
+				to_timedelta(working_hour.end_time or "") - to_timedelta(working_hour.start_time or "")
+			).total_seconds()
 			if slot_length >= operation_length:
 				return
 
-	frappe.throw(_("Operation {0} longer than any available working hours in workstation {1}, break down the operation into multiple operations").format(operation, workstation.name), NotInWorkingHoursError)
+	frappe.throw(
+		_(
+			"Operation {0} longer than any available working hours in workstation {1}, break down the operation into multiple operations"
+		).format(operation, workstation.name),
+		NotInWorkingHoursError,
+	)
+
 
 def check_workstation_for_holiday(workstation, from_datetime, to_datetime):
 	holiday_list = frappe.db.get_value("Workstation", workstation, "holiday_list")
 	if holiday_list and from_datetime and to_datetime:
 		applicable_holidays = []
-		for d in frappe.db.sql("""select holiday_date from `tabHoliday` where parent = %s
+		for d in frappe.db.sql(
+			"""select holiday_date from `tabHoliday` where parent = %s
 			and holiday_date between %s and %s """,
-			(holiday_list, getdate(from_datetime), getdate(to_datetime))):
-				applicable_holidays.append(formatdate(d[0]))
+			(holiday_list, getdate(from_datetime), getdate(to_datetime)),
+		):
+			applicable_holidays.append(formatdate(d[0]))
 
 		if applicable_holidays:
-			frappe.throw(_("Workstation is closed on the following dates as per Holiday List: {0}")
-				.format(holiday_list) + "\n" + "\n".join(applicable_holidays), WorkstationHolidayError)
+			frappe.throw(
+				_("Workstation is closed on the following dates as per Holiday List: {0}").format(holiday_list)
+				+ "\n"
+				+ "\n".join(applicable_holidays),
+				WorkstationHolidayError,
+			)
diff --git a/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py b/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py
index 1fa1494..6d02221 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py
+++ b/erpnext/manufacturing/doctype/workstation/workstation_dashboard.py
@@ -3,17 +3,22 @@
 
 def get_data():
 	return {
-		'fieldname': 'workstation',
-		'transactions': [
+		"fieldname": "workstation",
+		"transactions": [
+			{"label": _("Master"), "items": ["BOM", "Routing", "Operation"]},
 			{
-				'label': _('Master'),
-				'items': ['BOM', 'Routing', 'Operation']
+				"label": _("Transaction"),
+				"items": [
+					"Work Order",
+					"Job Card",
+				],
 			},
-			{
-				'label': _('Transaction'),
-				'items': ['Work Order', 'Job Card',]
-			}
 		],
-		'disable_create_buttons': ['BOM', 'Routing', 'Operation',
-			'Work Order', 'Job Card',]
+		"disable_create_buttons": [
+			"BOM",
+			"Routing",
+			"Operation",
+			"Work Order",
+			"Job Card",
+		],
 	}
diff --git a/erpnext/manufacturing/report/bom_explorer/bom_explorer.py b/erpnext/manufacturing/report/bom_explorer/bom_explorer.py
index 19a80ab..c0affd9 100644
--- a/erpnext/manufacturing/report/bom_explorer/bom_explorer.py
+++ b/erpnext/manufacturing/report/bom_explorer/bom_explorer.py
@@ -11,30 +11,37 @@
 	get_data(filters, data)
 	return columns, data
 
+
 def get_data(filters, data):
 	get_exploded_items(filters.bom, data)
 
+
 def get_exploded_items(bom, data, indent=0, qty=1):
-	exploded_items = frappe.get_all("BOM Item",
+	exploded_items = frappe.get_all(
+		"BOM Item",
 		filters={"parent": bom},
-		fields= ['qty','bom_no','qty','scrap','item_code','item_name','description','uom'])
+		fields=["qty", "bom_no", "qty", "scrap", "item_code", "item_name", "description", "uom"],
+	)
 
 	for item in exploded_items:
 		print(item.bom_no, indent)
 		item["indent"] = indent
-		data.append({
-			'item_code': item.item_code,
-			'item_name': item.item_name,
-			'indent': indent,
-			'bom_level': indent,
-			'bom': item.bom_no,
-			'qty': item.qty * qty,
-			'uom': item.uom,
-			'description': item.description,
-			'scrap': item.scrap
-		})
+		data.append(
+			{
+				"item_code": item.item_code,
+				"item_name": item.item_name,
+				"indent": indent,
+				"bom_level": indent,
+				"bom": item.bom_no,
+				"qty": item.qty * qty,
+				"uom": item.uom,
+				"description": item.description,
+				"scrap": item.scrap,
+			}
+		)
 		if item.bom_no:
-			get_exploded_items(item.bom_no, data, indent=indent+1, qty=item.qty)
+			get_exploded_items(item.bom_no, data, indent=indent + 1, qty=item.qty)
+
 
 def get_columns():
 	return [
@@ -43,49 +50,13 @@
 			"fieldtype": "Link",
 			"fieldname": "item_code",
 			"width": 300,
-			"options": "Item"
+			"options": "Item",
 		},
-		{
-			"label": "Item Name",
-			"fieldtype": "data",
-			"fieldname": "item_name",
-			"width": 100
-		},
-		{
-			"label": "BOM",
-			"fieldtype": "Link",
-			"fieldname": "bom",
-			"width": 150,
-			"options": "BOM"
-		},
-		{
-			"label": "Qty",
-			"fieldtype": "data",
-			"fieldname": "qty",
-			"width": 100
-		},
-		{
-			"label": "UOM",
-			"fieldtype": "data",
-			"fieldname": "uom",
-			"width": 100
-		},
-		{
-			"label": "BOM Level",
-			"fieldtype": "Int",
-			"fieldname": "bom_level",
-			"width": 100
-		},
-		{
-			"label": "Standard Description",
-			"fieldtype": "data",
-			"fieldname": "description",
-			"width": 150
-		},
-		{
-			"label": "Scrap",
-			"fieldtype": "data",
-			"fieldname": "scrap",
-			"width": 100
-		},
+		{"label": "Item Name", "fieldtype": "data", "fieldname": "item_name", "width": 100},
+		{"label": "BOM", "fieldtype": "Link", "fieldname": "bom", "width": 150, "options": "BOM"},
+		{"label": "Qty", "fieldtype": "data", "fieldname": "qty", "width": 100},
+		{"label": "UOM", "fieldtype": "data", "fieldname": "uom", "width": 100},
+		{"label": "BOM Level", "fieldtype": "Int", "fieldname": "bom_level", "width": 100},
+		{"label": "Standard Description", "fieldtype": "data", "fieldname": "description", "width": 150},
+		{"label": "Scrap", "fieldtype": "data", "fieldname": "scrap", "width": 100},
 	]
diff --git a/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py
index eda9eb9..92c69cf 100644
--- a/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py
+++ b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py
@@ -11,6 +11,7 @@
 	columns = get_columns(filters)
 	return columns, data
 
+
 def get_data(filters):
 	bom_wise_data = {}
 	bom_data, report_data = [], []
@@ -24,11 +25,9 @@
 			bom_data.append(d.name)
 			row.update(d)
 		else:
-			row.update({
-				"operation": d.operation,
-				"workstation": d.workstation,
-				"time_in_mins": d.time_in_mins
-			})
+			row.update(
+				{"operation": d.operation, "workstation": d.workstation, "time_in_mins": d.time_in_mins}
+			)
 
 		# maintain BOM wise data for grouping such as:
 		# {"BOM A": [{Row1}, {Row2}], "BOM B": ...}
@@ -43,20 +42,25 @@
 
 	return report_data
 
+
 def get_filtered_data(filters):
 	bom = frappe.qb.DocType("BOM")
 	bom_ops = frappe.qb.DocType("BOM Operation")
 
 	bom_ops_query = (
 		frappe.qb.from_(bom)
-		.join(bom_ops).on(bom.name == bom_ops.parent)
+		.join(bom_ops)
+		.on(bom.name == bom_ops.parent)
 		.select(
-			bom.name, bom.item, bom.item_name, bom.uom,
-			bom_ops.operation, bom_ops.workstation, bom_ops.time_in_mins
-		).where(
-			(bom.docstatus == 1)
-			& (bom.is_active == 1)
+			bom.name,
+			bom.item,
+			bom.item_name,
+			bom.uom,
+			bom_ops.operation,
+			bom_ops.workstation,
+			bom_ops.time_in_mins,
 		)
+		.where((bom.docstatus == 1) & (bom.is_active == 1))
 	)
 
 	if filters.get("item_code"):
@@ -66,18 +70,20 @@
 		bom_ops_query = bom_ops_query.where(bom.name.isin(filters.get("bom_id")))
 
 	if filters.get("workstation"):
-		bom_ops_query = bom_ops_query.where(
-			bom_ops.workstation == filters.get("workstation")
-		)
+		bom_ops_query = bom_ops_query.where(bom_ops.workstation == filters.get("workstation"))
 
 	bom_operation_data = bom_ops_query.run(as_dict=True)
 
 	return bom_operation_data
 
+
 def get_bom_count(bom_data):
-	data = frappe.get_all("BOM Item",
+	data = frappe.get_all(
+		"BOM Item",
 		fields=["count(name) as count", "bom_no"],
-		filters= {"bom_no": ("in", bom_data)}, group_by = "bom_no")
+		filters={"bom_no": ("in", bom_data)},
+		group_by="bom_no",
+	)
 
 	bom_count = {}
 	for d in data:
@@ -85,58 +91,42 @@
 
 	return bom_count
 
+
 def get_args():
-	return frappe._dict({
-		"name": "",
-		"item": "",
-		"item_name": "",
-		"uom": ""
-	})
+	return frappe._dict({"name": "", "item": "", "item_name": "", "uom": ""})
+
 
 def get_columns(filters):
-	return [{
-		"label": _("BOM ID"),
-		"options": "BOM",
-		"fieldname": "name",
-		"fieldtype": "Link",
-		"width": 220
-	}, {
-		"label": _("Item Code"),
-		"options": "Item",
-		"fieldname": "item",
-		"fieldtype": "Link",
-		"width": 150
-	}, {
-		"label": _("Item Name"),
-		"fieldname": "item_name",
-		"fieldtype": "Data",
-		"width": 110
-	}, {
-		"label": _("UOM"),
-		"options": "UOM",
-		"fieldname": "uom",
-		"fieldtype": "Link",
-		"width": 100
-	}, {
-		"label": _("Operation"),
-		"options": "Operation",
-		"fieldname": "operation",
-		"fieldtype": "Link",
-		"width": 140
-	}, {
-		"label": _("Workstation"),
-		"options": "Workstation",
-		"fieldname": "workstation",
-		"fieldtype": "Link",
-		"width": 110
-	}, {
-		"label": _("Time (In Mins)"),
-		"fieldname": "time_in_mins",
-		"fieldtype": "Float",
-		"width": 120
-	}, {
-		"label": _("Sub-assembly BOM Count"),
-		"fieldname": "used_as_subassembly_items",
-		"fieldtype": "Int",
-		"width": 200
-	}]
+	return [
+		{"label": _("BOM ID"), "options": "BOM", "fieldname": "name", "fieldtype": "Link", "width": 220},
+		{
+			"label": _("Item Code"),
+			"options": "Item",
+			"fieldname": "item",
+			"fieldtype": "Link",
+			"width": 150,
+		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 110},
+		{"label": _("UOM"), "options": "UOM", "fieldname": "uom", "fieldtype": "Link", "width": 100},
+		{
+			"label": _("Operation"),
+			"options": "Operation",
+			"fieldname": "operation",
+			"fieldtype": "Link",
+			"width": 140,
+		},
+		{
+			"label": _("Workstation"),
+			"options": "Workstation",
+			"fieldname": "workstation",
+			"fieldtype": "Link",
+			"width": 110,
+		},
+		{"label": _("Time (In Mins)"), "fieldname": "time_in_mins", "fieldtype": "Float", "width": 120},
+		{
+			"label": _("Sub-assembly BOM Count"),
+			"fieldname": "used_as_subassembly_items",
+			"fieldtype": "Int",
+			"width": 200,
+		},
+	]
diff --git a/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py b/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py
index 2693352..933be3e 100644
--- a/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py
+++ b/erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py
@@ -23,14 +23,24 @@
 		summ_data.append(get_report_data(last_pur_price, reqd_qty, row, manufacture_details))
 	return columns, summ_data
 
+
 def get_report_data(last_pur_price, reqd_qty, row, manufacture_details):
 	to_build = row.to_build if row.to_build > 0 else 0
 	diff_qty = to_build - reqd_qty
-	return [row.item_code, row.description,
-		comma_and(manufacture_details.get(row.item_code, {}).get('manufacturer', []), add_quotes=False),
-		comma_and(manufacture_details.get(row.item_code, {}).get('manufacturer_part', []), add_quotes=False),
-		row.actual_qty, str(to_build),
-		reqd_qty, diff_qty, last_pur_price]
+	return [
+		row.item_code,
+		row.description,
+		comma_and(manufacture_details.get(row.item_code, {}).get("manufacturer", []), add_quotes=False),
+		comma_and(
+			manufacture_details.get(row.item_code, {}).get("manufacturer_part", []), add_quotes=False
+		),
+		row.actual_qty,
+		str(to_build),
+		reqd_qty,
+		diff_qty,
+		last_pur_price,
+	]
+
 
 def get_columns():
 	"""return columns"""
@@ -41,12 +51,13 @@
 		_("Manufacturer Part Number") + "::250",
 		_("Qty") + ":Float:50",
 		_("Stock Qty") + ":Float:100",
-		_("Reqd Qty")+ ":Float:100",
-		_("Diff Qty")+ ":Float:100",
-		_("Last Purchase Price")+ ":Float:100",
+		_("Reqd Qty") + ":Float:100",
+		_("Diff Qty") + ":Float:100",
+		_("Last Purchase Price") + ":Float:100",
 	]
 	return columns
 
+
 def get_bom_stock(filters):
 	conditions = ""
 	bom = filters.get("bom")
@@ -59,18 +70,23 @@
 		qty_field = "stock_qty"
 
 	if filters.get("warehouse"):
-		warehouse_details = frappe.db.get_value("Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1)
+		warehouse_details = frappe.db.get_value(
+			"Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1
+		)
 		if warehouse_details:
-			conditions += " and exists (select name from `tabWarehouse` wh \
-				where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)" % (warehouse_details.lft,
-				warehouse_details.rgt)
+			conditions += (
+				" and exists (select name from `tabWarehouse` wh \
+				where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)"
+				% (warehouse_details.lft, warehouse_details.rgt)
+			)
 		else:
 			conditions += " and ledger.warehouse = %s" % frappe.db.escape(filters.get("warehouse"))
 
 	else:
 		conditions += ""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 			SELECT
 				bom_item.item_code,
 				bom_item.description,
@@ -86,14 +102,21 @@
 			WHERE
 				bom_item.parent = '{bom}' and bom_item.parenttype='BOM'
 
-			GROUP BY bom_item.item_code""".format(qty_field=qty_field, table=table, conditions=conditions, bom=bom), as_dict=1)
+			GROUP BY bom_item.item_code""".format(
+			qty_field=qty_field, table=table, conditions=conditions, bom=bom
+		),
+		as_dict=1,
+	)
+
 
 def get_manufacturer_records():
-	details = frappe.get_all('Item Manufacturer', fields = ["manufacturer", "manufacturer_part_no", "item_code"])
+	details = frappe.get_all(
+		"Item Manufacturer", fields=["manufacturer", "manufacturer_part_no", "item_code"]
+	)
 	manufacture_details = frappe._dict()
 	for detail in details:
-		dic = manufacture_details.setdefault(detail.get('item_code'), {})
-		dic.setdefault('manufacturer', []).append(detail.get('manufacturer'))
-		dic.setdefault('manufacturer_part', []).append(detail.get('manufacturer_part_no'))
+		dic = manufacture_details.setdefault(detail.get("item_code"), {})
+		dic.setdefault("manufacturer", []).append(detail.get("manufacturer"))
+		dic.setdefault("manufacturer_part", []).append(detail.get("manufacturer_part_no"))
 
 	return manufacture_details
diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py
index fa94391..34e9826 100644
--- a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py
+++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.py
@@ -7,7 +7,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns()
 
@@ -15,6 +16,7 @@
 
 	return columns, data
 
+
 def get_columns():
 	"""return columns"""
 	columns = [
@@ -29,6 +31,7 @@
 
 	return columns
 
+
 def get_bom_stock(filters):
 	conditions = ""
 	bom = filters.get("bom")
@@ -37,25 +40,30 @@
 	qty_field = "stock_qty"
 
 	qty_to_produce = filters.get("qty_to_produce", 1)
-	if  int(qty_to_produce) <= 0:
+	if int(qty_to_produce) <= 0:
 		frappe.throw(_("Quantity to Produce can not be less than Zero"))
 
 	if filters.get("show_exploded_view"):
 		table = "`tabBOM Explosion Item`"
 
 	if filters.get("warehouse"):
-		warehouse_details = frappe.db.get_value("Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1)
+		warehouse_details = frappe.db.get_value(
+			"Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1
+		)
 		if warehouse_details:
-			conditions += " and exists (select name from `tabWarehouse` wh \
-				where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)" % (warehouse_details.lft,
-				warehouse_details.rgt)
+			conditions += (
+				" and exists (select name from `tabWarehouse` wh \
+				where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)"
+				% (warehouse_details.lft, warehouse_details.rgt)
+			)
 		else:
 			conditions += " and ledger.warehouse = %s" % frappe.db.escape(filters.get("warehouse"))
 
 	else:
 		conditions += ""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 			SELECT
 				bom_item.item_code,
 				bom_item.description ,
@@ -74,9 +82,10 @@
 				bom_item.parent = {bom} and bom_item.parenttype='BOM'
 
 			GROUP BY bom_item.item_code""".format(
-				qty_field=qty_field,
-				table=table,
-				conditions=conditions,
-				bom=frappe.db.escape(bom),
-				qty_to_produce=qty_to_produce or 1)
-			)
+			qty_field=qty_field,
+			table=table,
+			conditions=conditions,
+			bom=frappe.db.escape(bom),
+			qty_to_produce=qty_to_produce or 1,
+		)
+	)
diff --git a/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py b/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py
index a5ae43e..3fe2198 100644
--- a/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py
+++ b/erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py
@@ -12,98 +12,99 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
-	columns = [{
+	columns = [
+		{
 			"label": _("Work Order"),
 			"fieldname": "work_order",
 			"fieldtype": "Link",
 			"options": "Work Order",
-			"width": 120
-		}]
-
-	if not filters.get('bom_no'):
-		columns.extend([
-			{
-				"label": _("BOM No"),
-				"fieldname": "bom_no",
-				"fieldtype": "Link",
-				"options": "BOM",
-				"width": 180
-			}
-		])
-
-	columns.extend([
-		{
-			"label": _("Finished Good"),
-			"fieldname": "production_item",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 120
-		},
-		{
-			"label": _("Ordered Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("Produced Qty"),
-			"fieldname": "produced_qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("Raw Material"),
-			"fieldname": "raw_material_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 120
-		},
-		{
-			"label": _("Required Qty"),
-			"fieldname": "required_qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("Consumed Qty"),
-			"fieldname": "consumed_qty",
-			"fieldtype": "Float",
-			"width": 120
+			"width": 120,
 		}
-	])
+	]
+
+	if not filters.get("bom_no"):
+		columns.extend(
+			[
+				{
+					"label": _("BOM No"),
+					"fieldname": "bom_no",
+					"fieldtype": "Link",
+					"options": "BOM",
+					"width": 180,
+				}
+			]
+		)
+
+	columns.extend(
+		[
+			{
+				"label": _("Finished Good"),
+				"fieldname": "production_item",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 120,
+			},
+			{"label": _("Ordered Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 120},
+			{"label": _("Produced Qty"), "fieldname": "produced_qty", "fieldtype": "Float", "width": 120},
+			{
+				"label": _("Raw Material"),
+				"fieldname": "raw_material_code",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 120,
+			},
+			{"label": _("Required Qty"), "fieldname": "required_qty", "fieldtype": "Float", "width": 120},
+			{"label": _("Consumed Qty"), "fieldname": "consumed_qty", "fieldtype": "Float", "width": 120},
+		]
+	)
 
 	return columns
 
+
 def get_data(filters):
 	cond = "1=1"
 
-	if filters.get('bom_no') and not filters.get('work_order'):
-		cond += " and bom_no = '%s'" % filters.get('bom_no')
+	if filters.get("bom_no") and not filters.get("work_order"):
+		cond += " and bom_no = '%s'" % filters.get("bom_no")
 
-	if filters.get('work_order'):
-		cond += " and name = '%s'" % filters.get('work_order')
+	if filters.get("work_order"):
+		cond += " and name = '%s'" % filters.get("work_order")
 
 	results = []
-	for d in frappe.db.sql(""" select name as work_order, qty, produced_qty, production_item, bom_no
-		from `tabWork Order` where produced_qty > qty and docstatus = 1 and {0}""".format(cond), as_dict=1):
+	for d in frappe.db.sql(
+		""" select name as work_order, qty, produced_qty, production_item, bom_no
+		from `tabWork Order` where produced_qty > qty and docstatus = 1 and {0}""".format(
+			cond
+		),
+		as_dict=1,
+	):
 		results.append(d)
 
-		for data in frappe.get_all('Work Order Item', fields=["item_code as raw_material_code",
-			"required_qty", "consumed_qty"], filters={'parent': d.work_order, 'parenttype': 'Work Order'}):
+		for data in frappe.get_all(
+			"Work Order Item",
+			fields=["item_code as raw_material_code", "required_qty", "consumed_qty"],
+			filters={"parent": d.work_order, "parenttype": "Work Order"},
+		):
 			results.append(data)
 
 	return results
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_work_orders(doctype, txt, searchfield, start, page_len, filters):
 	cond = "1=1"
-	if filters.get('bom_no'):
-		cond += " and bom_no = '%s'" % filters.get('bom_no')
+	if filters.get("bom_no"):
+		cond += " and bom_no = '%s'" % filters.get("bom_no")
 
-	return frappe.db.sql("""select name from `tabWork Order`
+	return frappe.db.sql(
+		"""select name from `tabWork Order`
 		where name like %(name)s and {0} and produced_qty > qty and docstatus = 1
-		order by name limit {1}, {2}""".format(cond, start, page_len),{
-			'name': "%%%s%%" % txt
-		}, as_list=1)
+		order by name limit {1}, {2}""".format(
+			cond, start, page_len
+		),
+		{"name": "%%%s%%" % txt},
+		as_list=1,
+	)
diff --git a/erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py b/erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py
index 88b2117..481fe51 100644
--- a/erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py
+++ b/erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py
@@ -11,58 +11,77 @@
 
 def get_data(report_filters):
 	data = []
-	operations = frappe.get_all("Operation", filters = {"is_corrective_operation": 1})
+	operations = frappe.get_all("Operation", filters={"is_corrective_operation": 1})
 	if operations:
-		if report_filters.get('operation'):
-			operations = [report_filters.get('operation')]
+		if report_filters.get("operation"):
+			operations = [report_filters.get("operation")]
 		else:
 			operations = [d.name for d in operations]
 
 		job_card = frappe.qb.DocType("Job Card")
 
-		operating_cost = ((job_card.hour_rate) * (job_card.total_time_in_mins) / 60.0).as_('operating_cost')
-		item_code = (job_card.production_item).as_('item_code')
+		operating_cost = ((job_card.hour_rate) * (job_card.total_time_in_mins) / 60.0).as_(
+			"operating_cost"
+		)
+		item_code = (job_card.production_item).as_("item_code")
 
-		query = (frappe.qb
-					.from_(job_card)
-					.select(job_card.name, job_card.work_order, item_code, job_card.item_name,
-						job_card.operation, job_card.serial_no, job_card.batch_no,
-						job_card.workstation, job_card.total_time_in_mins, job_card.hour_rate,
-						operating_cost)
-					.where(
-						(job_card.docstatus == 1)
-						& (job_card.is_corrective_job_card == 1))
-					.groupby(job_card.name)
-				)
+		query = (
+			frappe.qb.from_(job_card)
+			.select(
+				job_card.name,
+				job_card.work_order,
+				item_code,
+				job_card.item_name,
+				job_card.operation,
+				job_card.serial_no,
+				job_card.batch_no,
+				job_card.workstation,
+				job_card.total_time_in_mins,
+				job_card.hour_rate,
+				operating_cost,
+			)
+			.where((job_card.docstatus == 1) & (job_card.is_corrective_job_card == 1))
+			.groupby(job_card.name)
+		)
 
 		query = append_filters(query, report_filters, operations, job_card)
 		data = query.run(as_dict=True)
 	return data
 
-def append_filters(query, report_filters, operations, job_card):
-	"""Append optional filters to query builder. """
 
-	for field in ("name", "work_order", "operation", "workstation",
-			"company", "serial_no", "batch_no", "production_item"):
+def append_filters(query, report_filters, operations, job_card):
+	"""Append optional filters to query builder."""
+
+	for field in (
+		"name",
+		"work_order",
+		"operation",
+		"workstation",
+		"company",
+		"serial_no",
+		"batch_no",
+		"production_item",
+	):
 		if report_filters.get(field):
-			if field == 'serial_no':
-				query = query.where(job_card[field].like('%{}%'.format(report_filters.get(field))))
-			elif field == 'operation':
+			if field == "serial_no":
+				query = query.where(job_card[field].like("%{}%".format(report_filters.get(field))))
+			elif field == "operation":
 				query = query.where(job_card[field].isin(operations))
 			else:
 				query = query.where(job_card[field] == report_filters.get(field))
 
-	if report_filters.get('from_date') or report_filters.get('to_date'):
+	if report_filters.get("from_date") or report_filters.get("to_date"):
 		job_card_time_log = frappe.qb.DocType("Job Card Time Log")
 
 		query = query.join(job_card_time_log).on(job_card.name == job_card_time_log.parent)
-		if report_filters.get('from_date'):
-			query = query.where(job_card_time_log.from_time >= report_filters.get('from_date'))
-		if report_filters.get('to_date'):
-			query = query.where(job_card_time_log.to_time <= report_filters.get('to_date'))
+		if report_filters.get("from_date"):
+			query = query.where(job_card_time_log.from_time >= report_filters.get("from_date"))
+		if report_filters.get("to_date"):
+			query = query.where(job_card_time_log.to_time <= report_filters.get("to_date"))
 
 	return query
 
+
 def get_columns(filters):
 	return [
 		{
@@ -70,64 +89,49 @@
 			"fieldtype": "Link",
 			"fieldname": "name",
 			"options": "Job Card",
-			"width": "120"
+			"width": "120",
 		},
 		{
 			"label": _("Work Order"),
 			"fieldtype": "Link",
 			"fieldname": "work_order",
 			"options": "Work Order",
-			"width": "100"
+			"width": "100",
 		},
 		{
 			"label": _("Item Code"),
 			"fieldtype": "Link",
 			"fieldname": "item_code",
 			"options": "Item",
-			"width": "100"
+			"width": "100",
 		},
-		{
-			"label": _("Item Name"),
-			"fieldtype": "Data",
-			"fieldname": "item_name",
-			"width": "100"
-		},
+		{"label": _("Item Name"), "fieldtype": "Data", "fieldname": "item_name", "width": "100"},
 		{
 			"label": _("Operation"),
 			"fieldtype": "Link",
 			"fieldname": "operation",
 			"options": "Operation",
-			"width": "100"
+			"width": "100",
 		},
-		{
-			"label": _("Serial No"),
-			"fieldtype": "Data",
-			"fieldname": "serial_no",
-			"width": "100"
-		},
-		{
-			"label": _("Batch No"),
-			"fieldtype": "Data",
-			"fieldname": "batch_no",
-			"width": "100"
-		},
+		{"label": _("Serial No"), "fieldtype": "Data", "fieldname": "serial_no", "width": "100"},
+		{"label": _("Batch No"), "fieldtype": "Data", "fieldname": "batch_no", "width": "100"},
 		{
 			"label": _("Workstation"),
 			"fieldtype": "Link",
 			"fieldname": "workstation",
 			"options": "Workstation",
-			"width": "100"
+			"width": "100",
 		},
 		{
 			"label": _("Operating Cost"),
 			"fieldtype": "Currency",
 			"fieldname": "operating_cost",
-			"width": "150"
+			"width": "150",
 		},
 		{
 			"label": _("Total Time (in Mins)"),
 			"fieldtype": "Float",
 			"fieldname": "total_time_in_mins",
-			"width": "150"
-		}
+			"width": "150",
+		},
 	]
diff --git a/erpnext/manufacturing/report/downtime_analysis/downtime_analysis.py b/erpnext/manufacturing/report/downtime_analysis/downtime_analysis.py
index 2c515d1..80a1564 100644
--- a/erpnext/manufacturing/report/downtime_analysis/downtime_analysis.py
+++ b/erpnext/manufacturing/report/downtime_analysis/downtime_analysis.py
@@ -14,10 +14,20 @@
 	chart_data = get_chart_data(data, filters)
 	return columns, data, None, chart_data
 
+
 def get_data(filters):
 	query_filters = {}
 
-	fields = ["name", "workstation", "operator", "from_time", "to_time", "downtime", "stop_reason", "remarks"]
+	fields = [
+		"name",
+		"workstation",
+		"operator",
+		"from_time",
+		"to_time",
+		"downtime",
+		"stop_reason",
+		"remarks",
+	]
 
 	query_filters["from_time"] = (">=", filters.get("from_date"))
 	query_filters["to_time"] = ("<=", filters.get("to_date"))
@@ -25,13 +35,14 @@
 	if filters.get("workstation"):
 		query_filters["workstation"] = filters.get("workstation")
 
-	data = frappe.get_all("Downtime Entry", fields= fields, filters=query_filters) or []
+	data = frappe.get_all("Downtime Entry", fields=fields, filters=query_filters) or []
 	for d in data:
 		if d.downtime:
 			d.downtime = d.downtime / 60
 
 	return data
 
+
 def get_chart_data(data, columns):
 	labels = sorted(list(set([d.workstation for d in data])))
 
@@ -47,17 +58,13 @@
 		datasets.append(workstation_wise_data.get(label, 0))
 
 	chart = {
-		"data": {
-			"labels": labels,
-			"datasets": [
-				{"name": "Machine Downtime", "values": datasets}
-			]
-		},
-		"type": "bar"
+		"data": {"labels": labels, "datasets": [{"name": "Machine Downtime", "values": datasets}]},
+		"type": "bar",
 	}
 
 	return chart
 
+
 def get_columns(filters):
 	return [
 		{
@@ -65,50 +72,25 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Downtime Entry",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Machine"),
 			"fieldname": "workstation",
 			"fieldtype": "Link",
 			"options": "Workstation",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Operator"),
 			"fieldname": "operator",
 			"fieldtype": "Link",
 			"options": "Employee",
-			"width": 130
+			"width": 130,
 		},
-		{
-			"label": _("From Time"),
-			"fieldname": "from_time",
-			"fieldtype": "Datetime",
-			"width": 160
-		},
-		{
-			"label": _("To Time"),
-			"fieldname": "to_time",
-			"fieldtype": "Datetime",
-			"width": 160
-		},
-		{
-			"label": _("Downtime (In Hours)"),
-			"fieldname": "downtime",
-			"fieldtype": "Float",
-			"width": 150
-		},
-		{
-			"label": _("Stop Reason"),
-			"fieldname": "stop_reason",
-			"fieldtype": "Data",
-			"width": 220
-		},
-		{
-			"label": _("Remarks"),
-			"fieldname": "remarks",
-			"fieldtype": "Text",
-			"width": 100
-		}
+		{"label": _("From Time"), "fieldname": "from_time", "fieldtype": "Datetime", "width": 160},
+		{"label": _("To Time"), "fieldname": "to_time", "fieldtype": "Datetime", "width": 160},
+		{"label": _("Downtime (In Hours)"), "fieldname": "downtime", "fieldtype": "Float", "width": 150},
+		{"label": _("Stop Reason"), "fieldname": "stop_reason", "fieldtype": "Data", "width": 220},
+		{"label": _("Remarks"), "fieldname": "remarks", "fieldtype": "Text", "width": 100},
 	]
diff --git a/erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py b/erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py
index 26b3359..7500744 100644
--- a/erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py
+++ b/erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py
@@ -14,6 +14,7 @@
 def execute(filters=None):
 	return ForecastingReport(filters).execute_report()
 
+
 class ExponentialSmoothingForecast(object):
 	def forecast_future_data(self):
 		for key, value in self.period_wise_data.items():
@@ -26,24 +27,22 @@
 
 				elif forecast_data:
 					previous_period_data = forecast_data[-1]
-					value[forecast_key] = (previous_period_data[1] +
-						flt(self.filters.smoothing_constant) * (
-							flt(previous_period_data[0]) - flt(previous_period_data[1])
-						)
+					value[forecast_key] = previous_period_data[1] + flt(self.filters.smoothing_constant) * (
+						flt(previous_period_data[0]) - flt(previous_period_data[1])
 					)
 
 				if value.get(forecast_key):
 					# will be use to forecaset next period
 					forecast_data.append([value.get(period.key), value.get(forecast_key)])
 
+
 class ForecastingReport(ExponentialSmoothingForecast):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
 		self.data = []
 		self.doctype = self.filters.based_on_document
 		self.child_doctype = self.doctype + " Item"
-		self.based_on_field = ("qty"
-			if self.filters.based_on_field == "Qty" else "amount")
+		self.based_on_field = "qty" if self.filters.based_on_field == "Qty" else "amount"
 		self.fieldtype = "Float" if self.based_on_field == "qty" else "Currency"
 		self.company_currency = erpnext.get_company_currency(self.filters.company)
 
@@ -63,8 +62,15 @@
 		self.period_wise_data = {}
 
 		from_date = add_years(self.filters.from_date, cint(self.filters.no_of_years) * -1)
-		self.period_list = get_period_list(from_date, self.filters.to_date,
-			from_date, self.filters.to_date, "Date Range", self.filters.periodicity, ignore_fiscal_year=True)
+		self.period_list = get_period_list(
+			from_date,
+			self.filters.to_date,
+			from_date,
+			self.filters.to_date,
+			"Date Range",
+			self.filters.periodicity,
+			ignore_fiscal_year=True,
+		)
 
 		order_data = self.get_data_for_forecast() or []
 
@@ -76,8 +82,10 @@
 			period_data = self.period_wise_data[key]
 			for period in self.period_list:
 				# check if posting date is within the period
-				if (entry.posting_date >= period.from_date and entry.posting_date <= period.to_date):
-					period_data[period.key] = period_data.get(period.key, 0.0) + flt(entry.get(self.based_on_field))
+				if entry.posting_date >= period.from_date and entry.posting_date <= period.to_date:
+					period_data[period.key] = period_data.get(period.key, 0.0) + flt(
+						entry.get(self.based_on_field)
+					)
 
 		for key, value in self.period_wise_data.items():
 			list_of_period_value = [value.get(p.key, 0) for p in self.period_list]
@@ -90,12 +98,12 @@
 	def get_data_for_forecast(self):
 		cond = ""
 		if self.filters.item_code:
-			cond = " AND soi.item_code = %s" %(frappe.db.escape(self.filters.item_code))
+			cond = " AND soi.item_code = %s" % (frappe.db.escape(self.filters.item_code))
 
 		warehouses = []
 		if self.filters.warehouse:
 			warehouses = get_child_warehouses(self.filters.warehouse)
-			cond += " AND soi.warehouse in ({})".format(','.join(['%s'] * len(warehouses)))
+			cond += " AND soi.warehouse in ({})".format(",".join(["%s"] * len(warehouses)))
 
 		input_data = [self.filters.from_date, self.filters.company]
 		if warehouses:
@@ -103,7 +111,8 @@
 
 		date_field = "posting_date" if self.doctype == "Delivery Note" else "transaction_date"
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			SELECT
 				so.{date_field} as posting_date, soi.item_code, soi.warehouse,
 				soi.item_name, soi.stock_qty as qty, soi.base_amount as amount
@@ -112,23 +121,27 @@
 			WHERE
 				so.docstatus = 1 AND so.name = soi.parent AND
 				so.{date_field} < %s AND so.company = %s {cond}
-		""".format(doc=self.doctype, child_doc=self.child_doctype, date_field=date_field, cond=cond),
-			tuple(input_data), as_dict=1)
+		""".format(
+				doc=self.doctype, child_doc=self.child_doctype, date_field=date_field, cond=cond
+			),
+			tuple(input_data),
+			as_dict=1,
+		)
 
 	def prepare_final_data(self):
 		self.data = []
 
-		if not self.period_wise_data: return
+		if not self.period_wise_data:
+			return
 
 		for key in self.period_wise_data:
 			self.data.append(self.period_wise_data.get(key))
 
 	def add_total(self):
-		if not self.data: return
+		if not self.data:
+			return
 
-		total_row = {
-			"item_code": _(frappe.bold("Total Quantity"))
-		}
+		total_row = {"item_code": _(frappe.bold("Total Quantity"))}
 
 		for value in self.data:
 			for period in self.period_list:
@@ -145,43 +158,52 @@
 		self.data.append(total_row)
 
 	def get_columns(self):
-		columns = [{
-			"label": _("Item Code"),
-			"options": "Item",
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"width": 130
-		}, {
-			"label": _("Warehouse"),
-			"options": "Warehouse",
-			"fieldname": "warehouse",
-			"fieldtype": "Link",
-			"width": 130
-		}]
+		columns = [
+			{
+				"label": _("Item Code"),
+				"options": "Item",
+				"fieldname": "item_code",
+				"fieldtype": "Link",
+				"width": 130,
+			},
+			{
+				"label": _("Warehouse"),
+				"options": "Warehouse",
+				"fieldname": "warehouse",
+				"fieldtype": "Link",
+				"width": 130,
+			},
+		]
 
-		width = 180 if self.filters.periodicity in ['Yearly', "Half-Yearly", "Quarterly"] else 100
+		width = 180 if self.filters.periodicity in ["Yearly", "Half-Yearly", "Quarterly"] else 100
 		for period in self.period_list:
-			if (self.filters.periodicity in ['Yearly', "Half-Yearly", "Quarterly"]
-				or period.from_date >= getdate(self.filters.from_date)):
+			if self.filters.periodicity in [
+				"Yearly",
+				"Half-Yearly",
+				"Quarterly",
+			] or period.from_date >= getdate(self.filters.from_date):
 
 				forecast_key = period.key
 				label = _(period.label)
 				if period.from_date >= getdate(self.filters.from_date):
-					forecast_key = 'forecast_' + period.key
+					forecast_key = "forecast_" + period.key
 					label = _(period.label) + " " + _("(Forecast)")
 
-				columns.append({
-					"label": label,
-					"fieldname": forecast_key,
-					"fieldtype": self.fieldtype,
-					"width": width,
-					"default": 0.0
-				})
+				columns.append(
+					{
+						"label": label,
+						"fieldname": forecast_key,
+						"fieldtype": self.fieldtype,
+						"width": width,
+						"default": 0.0,
+					}
+				)
 
 		return columns
 
 	def get_chart_data(self):
-		if not self.data: return
+		if not self.data:
+			return
 
 		labels = []
 		self.total_demand = []
@@ -206,40 +228,35 @@
 			"data": {
 				"labels": labels,
 				"datasets": [
-					{
-						"name": "Demand",
-						"values": self.total_demand
-					},
-					{
-						"name": "Forecast",
-						"values": self.total_forecast
-					}
-				]
+					{"name": "Demand", "values": self.total_demand},
+					{"name": "Forecast", "values": self.total_forecast},
+				],
 			},
-			"type": "line"
+			"type": "line",
 		}
 
 	def get_summary_data(self):
-		if not self.data: return
+		if not self.data:
+			return
 
 		return [
 			{
 				"value": sum(self.total_demand),
 				"label": _("Total Demand (Past Data)"),
 				"currency": self.company_currency,
-				"datatype": self.fieldtype
+				"datatype": self.fieldtype,
 			},
 			{
 				"value": sum(self.total_history_forecast),
 				"label": _("Total Forecast (Past Data)"),
 				"currency": self.company_currency,
-				"datatype": self.fieldtype
+				"datatype": self.fieldtype,
 			},
 			{
 				"value": sum(self.total_future_forecast),
 				"indicator": "Green",
 				"label": _("Total Forecast (Future Data)"),
 				"currency": self.company_currency,
-				"datatype": self.fieldtype
-			}
+				"datatype": self.fieldtype,
+			},
 		]
diff --git a/erpnext/manufacturing/report/job_card_summary/job_card_summary.py b/erpnext/manufacturing/report/job_card_summary/job_card_summary.py
index 4046bb1..a86c7a4 100644
--- a/erpnext/manufacturing/report/job_card_summary/job_card_summary.py
+++ b/erpnext/manufacturing/report/job_card_summary/job_card_summary.py
@@ -16,23 +16,34 @@
 	chart_data = get_chart_data(data, filters)
 	return columns, data, None, chart_data
 
+
 def get_data(filters):
 	query_filters = {
 		"docstatus": ("<", 2),
-		"posting_date": ("between", [filters.from_date, filters.to_date])
+		"posting_date": ("between", [filters.from_date, filters.to_date]),
 	}
 
-	fields = ["name", "status", "work_order", "production_item", "item_name", "posting_date",
-		"total_completed_qty", "workstation", "operation", "total_time_in_mins"]
+	fields = [
+		"name",
+		"status",
+		"work_order",
+		"production_item",
+		"item_name",
+		"posting_date",
+		"total_completed_qty",
+		"workstation",
+		"operation",
+		"total_time_in_mins",
+	]
 
 	for field in ["work_order", "workstation", "operation", "company"]:
 		if filters.get(field):
 			query_filters[field] = ("in", filters.get(field))
 
-	data = frappe.get_all("Job Card",
-		fields= fields, filters=query_filters)
+	data = frappe.get_all("Job Card", fields=fields, filters=query_filters)
 
-	if not data: return []
+	if not data:
+		return []
 
 	job_cards = [d.name for d in data]
 
@@ -42,9 +53,12 @@
 	}
 
 	job_card_time_details = {}
-	for job_card_data in frappe.get_all("Job Card Time Log",
+	for job_card_data in frappe.get_all(
+		"Job Card Time Log",
 		fields=["min(from_time) as from_time", "max(to_time) as to_time", "parent"],
-		filters=job_card_time_filter, group_by="parent"):
+		filters=job_card_time_filter,
+		group_by="parent",
+	):
 		job_card_time_details[job_card_data.parent] = job_card_data
 
 	res = []
@@ -60,6 +74,7 @@
 
 	return res
 
+
 def get_chart_data(job_card_details, filters):
 	labels, periodic_data = prepare_chart_data(job_card_details, filters)
 
@@ -73,23 +88,15 @@
 	datasets.append({"name": "Open", "values": open_job_cards})
 	datasets.append({"name": "Completed", "values": completed})
 
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		},
-		"type": "bar"
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}, "type": "bar"}
 
 	return chart
 
+
 def prepare_chart_data(job_card_details, filters):
 	labels = []
 
-	periodic_data = {
-		"Open": {},
-		"Completed": {}
-	}
+	periodic_data = {"Open": {}, "Completed": {}}
 
 	filters.range = "Monthly"
 
@@ -110,6 +117,7 @@
 
 	return labels, periodic_data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -117,84 +125,62 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Job Card",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
 	]
 
 	if not filters.get("status"):
 		columns.append(
-			{
-				"label": _("Status"),
-				"fieldname": "status",
-				"width": 100
-			},
+			{"label": _("Status"), "fieldname": "status", "width": 100},
 		)
 
-	columns.extend([
-		{
-			"label": _("Work Order"),
-			"fieldname": "work_order",
-			"fieldtype": "Link",
-			"options": "Work Order",
-			"width": 100
-		},
-		{
-			"label": _("Production Item"),
-			"fieldname": "production_item",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 110
-		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Workstation"),
-			"fieldname": "workstation",
-			"fieldtype": "Link",
-			"options": "Workstation",
-			"width": 110
-		},
-		{
-			"label": _("Operation"),
-			"fieldname": "operation",
-			"fieldtype": "Link",
-			"options": "Operation",
-			"width": 110
-		},
-		{
-			"label": _("Total Completed Qty"),
-			"fieldname": "total_completed_qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("From Time"),
-			"fieldname": "from_time",
-			"fieldtype": "Datetime",
-			"width": 120
-		},
-		{
-			"label": _("To Time"),
-			"fieldname": "to_time",
-			"fieldtype": "Datetime",
-			"width": 120
-		},
-		{
-			"label": _("Time Required (In Mins)"),
-			"fieldname": "total_time_in_mins",
-			"fieldtype": "Float",
-			"width": 100
-		}
-	])
+	columns.extend(
+		[
+			{
+				"label": _("Work Order"),
+				"fieldname": "work_order",
+				"fieldtype": "Link",
+				"options": "Work Order",
+				"width": 100,
+			},
+			{
+				"label": _("Production Item"),
+				"fieldname": "production_item",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 110,
+			},
+			{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
+			{
+				"label": _("Workstation"),
+				"fieldname": "workstation",
+				"fieldtype": "Link",
+				"options": "Workstation",
+				"width": 110,
+			},
+			{
+				"label": _("Operation"),
+				"fieldname": "operation",
+				"fieldtype": "Link",
+				"options": "Operation",
+				"width": 110,
+			},
+			{
+				"label": _("Total Completed Qty"),
+				"fieldname": "total_completed_qty",
+				"fieldtype": "Float",
+				"width": 120,
+			},
+			{"label": _("From Time"), "fieldname": "from_time", "fieldtype": "Datetime", "width": 120},
+			{"label": _("To Time"), "fieldname": "to_time", "fieldtype": "Datetime", "width": 120},
+			{
+				"label": _("Time Required (In Mins)"),
+				"fieldname": "total_time_in_mins",
+				"fieldtype": "Float",
+				"width": 100,
+			},
+		]
+	)
 
 	return columns
diff --git a/erpnext/manufacturing/report/process_loss_report/process_loss_report.py b/erpnext/manufacturing/report/process_loss_report/process_loss_report.py
index 9b544da..b10e643 100644
--- a/erpnext/manufacturing/report/process_loss_report/process_loss_report.py
+++ b/erpnext/manufacturing/report/process_loss_report/process_loss_report.py
@@ -12,87 +12,71 @@
 Columns = List[Dict[str, str]]
 QueryArgs = Dict[str, str]
 
+
 def execute(filters: Filters) -> Tuple[Columns, Data]:
 	columns = get_columns()
 	data = get_data(filters)
 	return columns, data
 
+
 def get_data(filters: Filters) -> Data:
 	query_args = get_query_args(filters)
 	data = run_query(query_args)
 	update_data_with_total_pl_value(data)
 	return data
 
+
 def get_columns() -> Columns:
 	return [
 		{
-			'label': _('Work Order'),
-			'fieldname': 'name',
-			'fieldtype': 'Link',
-			'options': 'Work Order',
-			'width': '200'
+			"label": _("Work Order"),
+			"fieldname": "name",
+			"fieldtype": "Link",
+			"options": "Work Order",
+			"width": "200",
 		},
 		{
-			'label': _('Item'),
-			'fieldname': 'production_item',
-			'fieldtype': 'Link',
-			'options': 'Item',
-			'width': '100'
+			"label": _("Item"),
+			"fieldname": "production_item",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": "100",
 		},
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": "100"},
 		{
-			'label': _('Status'),
-			'fieldname': 'status',
-			'fieldtype': 'Data',
-			'width': '100'
+			"label": _("Manufactured Qty"),
+			"fieldname": "produced_qty",
+			"fieldtype": "Float",
+			"width": "150",
 		},
+		{"label": _("Loss Qty"), "fieldname": "process_loss_qty", "fieldtype": "Float", "width": "150"},
 		{
-			'label': _('Manufactured Qty'),
-			'fieldname': 'produced_qty',
-			'fieldtype': 'Float',
-			'width': '150'
+			"label": _("Actual Manufactured Qty"),
+			"fieldname": "actual_produced_qty",
+			"fieldtype": "Float",
+			"width": "150",
 		},
+		{"label": _("Loss Value"), "fieldname": "total_pl_value", "fieldtype": "Float", "width": "150"},
+		{"label": _("FG Value"), "fieldname": "total_fg_value", "fieldtype": "Float", "width": "150"},
 		{
-			'label': _('Loss Qty'),
-			'fieldname': 'process_loss_qty',
-			'fieldtype': 'Float',
-			'width': '150'
+			"label": _("Raw Material Value"),
+			"fieldname": "total_rm_value",
+			"fieldtype": "Float",
+			"width": "150",
 		},
-		{
-			'label': _('Actual Manufactured Qty'),
-			'fieldname': 'actual_produced_qty',
-			'fieldtype': 'Float',
-			'width': '150'
-		},
-		{
-			'label': _('Loss Value'),
-			'fieldname': 'total_pl_value',
-			'fieldtype': 'Float',
-			'width': '150'
-		},
-		{
-			'label': _('FG Value'),
-			'fieldname': 'total_fg_value',
-			'fieldtype': 'Float',
-			'width': '150'
-		},
-		{
-			'label': _('Raw Material Value'),
-			'fieldname': 'total_rm_value',
-			'fieldtype': 'Float',
-			'width': '150'
-		}
 	]
 
+
 def get_query_args(filters: Filters) -> QueryArgs:
 	query_args = {}
 	query_args.update(filters)
-	query_args.update(
-		get_filter_conditions(filters)
-	)
+	query_args.update(get_filter_conditions(filters))
 	return query_args
 
+
 def run_query(query_args: QueryArgs) -> Data:
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			wo.name, wo.status, wo.production_item, wo.qty,
 			wo.produced_qty, wo.process_loss_qty,
@@ -111,23 +95,26 @@
 			{work_order_filter}
 		GROUP BY
 			se.work_order
-	""".format(**query_args), query_args, as_dict=1)
+	""".format(
+			**query_args
+		),
+		query_args,
+		as_dict=1,
+	)
+
 
 def update_data_with_total_pl_value(data: Data) -> None:
 	for row in data:
-		value_per_unit_fg = row['total_fg_value'] / row['actual_produced_qty']
-		row['total_pl_value'] = row['process_loss_qty'] * value_per_unit_fg
+		value_per_unit_fg = row["total_fg_value"] / row["actual_produced_qty"]
+		row["total_pl_value"] = row["process_loss_qty"] * value_per_unit_fg
+
 
 def get_filter_conditions(filters: Filters) -> QueryArgs:
 	filter_conditions = dict(item_filter="", work_order_filter="")
 	if "item" in filters:
 		production_item = filters.get("item")
-		filter_conditions.update(
-			{"item_filter": f"AND wo.production_item='{production_item}'"}
-		)
+		filter_conditions.update({"item_filter": f"AND wo.production_item='{production_item}'"})
 	if "work_order" in filters:
 		work_order_name = filters.get("work_order")
-		filter_conditions.update(
-			{"work_order_filter": f"AND wo.name='{work_order_name}'"}
-		)
+		filter_conditions.update({"work_order_filter": f"AND wo.name='{work_order_name}'"})
 	return filter_conditions
diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py
index d4743d3..12b5d19 100644
--- a/erpnext/manufacturing/report/production_analytics/production_analytics.py
+++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py
@@ -12,16 +12,11 @@
 def execute(filters=None):
 	columns = get_columns(filters)
 	data, chart = get_data(filters, columns)
-	return columns, data, None , chart
+	return columns, data, None, chart
+
 
 def get_columns(filters):
-	columns =[
-		{
-			"label": _("Status"),
-			"fieldname": "Status",
-			"fieldtype": "Data",
-			"width": 140
-		}]
+	columns = [{"label": _("Status"), "fieldname": "Status", "fieldtype": "Data", "width": 140}]
 
 	ranges = get_period_date_ranges(filters)
 
@@ -29,22 +24,20 @@
 
 		period = get_period(end_date, filters)
 
-		columns.append({
-			"label": _(period),
-			"fieldname": scrub(period),
-			"fieldtype": "Float",
-			"width": 120
-		})
+		columns.append(
+			{"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120}
+		)
 
 	return columns
 
+
 def get_periodic_data(filters, entry):
 	periodic_data = {
 		"All Work Orders": {},
 		"Not Started": {},
 		"Overdue": {},
 		"Pending": {},
-		"Completed": {}
+		"Completed": {},
 	}
 
 	ranges = get_period_date_ranges(filters)
@@ -52,34 +45,37 @@
 	for from_date, end_date in ranges:
 		period = get_period(end_date, filters)
 		for d in entry:
-			if getdate(d.creation) <= getdate(from_date) or getdate(d.creation) <= getdate(end_date) :
+			if getdate(d.creation) <= getdate(from_date) or getdate(d.creation) <= getdate(end_date):
 				periodic_data = update_periodic_data(periodic_data, "All Work Orders", period)
-				if d.status == 'Completed':
-					if getdate(d.actual_end_date) < getdate(from_date) or getdate(d.modified) < getdate(from_date):
+				if d.status == "Completed":
+					if getdate(d.actual_end_date) < getdate(from_date) or getdate(d.modified) < getdate(
+						from_date
+					):
 						periodic_data = update_periodic_data(periodic_data, "Completed", period)
-					elif getdate(d.actual_start_date) < getdate(from_date) :
+					elif getdate(d.actual_start_date) < getdate(from_date):
 						periodic_data = update_periodic_data(periodic_data, "Pending", period)
-					elif getdate(d.planned_start_date) < getdate(from_date) :
+					elif getdate(d.planned_start_date) < getdate(from_date):
 						periodic_data = update_periodic_data(periodic_data, "Overdue", period)
 					else:
 						periodic_data = update_periodic_data(periodic_data, "Not Started", period)
 
-				elif d.status == 'In Process':
-					if getdate(d.actual_start_date) < getdate(from_date) :
+				elif d.status == "In Process":
+					if getdate(d.actual_start_date) < getdate(from_date):
 						periodic_data = update_periodic_data(periodic_data, "Pending", period)
-					elif getdate(d.planned_start_date) < getdate(from_date) :
+					elif getdate(d.planned_start_date) < getdate(from_date):
 						periodic_data = update_periodic_data(periodic_data, "Overdue", period)
 					else:
 						periodic_data = update_periodic_data(periodic_data, "Not Started", period)
 
-				elif d.status == 'Not Started':
-					if getdate(d.planned_start_date) < getdate(from_date) :
+				elif d.status == "Not Started":
+					if getdate(d.planned_start_date) < getdate(from_date):
 						periodic_data = update_periodic_data(periodic_data, "Overdue", period)
 					else:
 						periodic_data = update_periodic_data(periodic_data, "Not Started", period)
 
 	return periodic_data
 
+
 def update_periodic_data(periodic_data, status, period):
 	if periodic_data.get(status).get(period):
 		periodic_data[status][period] += 1
@@ -88,22 +84,33 @@
 
 	return periodic_data
 
+
 def get_data(filters, columns):
 	data = []
-	entry = frappe.get_all("Work Order",
-		fields=["creation", "modified", "actual_start_date", "actual_end_date", "planned_start_date", "planned_end_date", "status"],
-		filters={"docstatus": 1, "company": filters["company"] })
+	entry = frappe.get_all(
+		"Work Order",
+		fields=[
+			"creation",
+			"modified",
+			"actual_start_date",
+			"actual_end_date",
+			"planned_start_date",
+			"planned_end_date",
+			"status",
+		],
+		filters={"docstatus": 1, "company": filters["company"]},
+	)
 
-	periodic_data = get_periodic_data(filters,entry)
+	periodic_data = get_periodic_data(filters, entry)
 
 	labels = ["All Work Orders", "Not Started", "Overdue", "Pending", "Completed"]
-	chart_data = get_chart_data(periodic_data,columns)
+	chart_data = get_chart_data(periodic_data, columns)
 	ranges = get_period_date_ranges(filters)
 
 	for label in labels:
 		work = {}
 		work["Status"] = label
-		for dummy,end_date in ranges:
+		for dummy, end_date in ranges:
 			period = get_period(end_date, filters)
 			if periodic_data.get(label).get(period):
 				work[scrub(period)] = periodic_data.get(label).get(period)
@@ -113,10 +120,11 @@
 
 	return data, chart_data
 
+
 def get_chart_data(periodic_data, columns):
 	labels = [d.get("label") for d in columns[1:]]
 
-	all_data, not_start, overdue, pending, completed = [], [], [] , [], []
+	all_data, not_start, overdue, pending, completed = [], [], [], [], []
 	datasets = []
 
 	for d in labels:
@@ -126,18 +134,13 @@
 		pending.append(periodic_data.get("Pending").get(d))
 		completed.append(periodic_data.get("Completed").get(d))
 
-	datasets.append({'name':'All Work Orders', 'values': all_data})
-	datasets.append({'name':'Not Started', 'values': not_start})
-	datasets.append({'name':'Overdue', 'values': overdue})
-	datasets.append({'name':'Pending', 'values': pending})
-	datasets.append({'name':'Completed', 'values': completed})
+	datasets.append({"name": "All Work Orders", "values": all_data})
+	datasets.append({"name": "Not Started", "values": not_start})
+	datasets.append({"name": "Overdue", "values": overdue})
+	datasets.append({"name": "Pending", "values": pending})
+	datasets.append({"name": "Completed", "values": completed})
 
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		}
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}}
 	chart["type"] = "line"
 
 	return chart
diff --git a/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py b/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py
index aaa2314..17f7f5e 100644
--- a/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py
+++ b/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py
@@ -13,6 +13,7 @@
 
 	return columns, data
 
+
 def get_data(filters):
 	data = []
 
@@ -23,6 +24,7 @@
 
 	return data
 
+
 def get_production_plan_item_details(filters, data, order_details):
 	itemwise_indent = {}
 
@@ -30,77 +32,85 @@
 	for row in production_plan_doc.po_items:
 		work_order = frappe.get_value(
 			"Work Order",
-			{
-				"production_plan_item": row.name,
-				"bom_no": row.bom_no,
-				"production_item": row.item_code
-			},
-			"name"
+			{"production_plan_item": row.name, "bom_no": row.bom_no, "production_item": row.item_code},
+			"name",
 		)
 
 		if row.item_code not in itemwise_indent:
 			itemwise_indent.setdefault(row.item_code, {})
 
-		data.append({
-			"indent": 0,
-			"item_code": row.item_code,
-			"item_name": frappe.get_cached_value("Item", row.item_code, "item_name"),
-			"qty": row.planned_qty,
-			"document_type": "Work Order",
-			"document_name": work_order or "",
-			"bom_level": 0,
-			"produced_qty": order_details.get((work_order, row.item_code), {}).get("produced_qty", 0),
-			"pending_qty": flt(row.planned_qty) - flt(order_details.get((work_order, row.item_code), {}).get("produced_qty", 0))
-		})
+		data.append(
+			{
+				"indent": 0,
+				"item_code": row.item_code,
+				"item_name": frappe.get_cached_value("Item", row.item_code, "item_name"),
+				"qty": row.planned_qty,
+				"document_type": "Work Order",
+				"document_name": work_order or "",
+				"bom_level": 0,
+				"produced_qty": order_details.get((work_order, row.item_code), {}).get("produced_qty", 0),
+				"pending_qty": flt(row.planned_qty)
+				- flt(order_details.get((work_order, row.item_code), {}).get("produced_qty", 0)),
+			}
+		)
 
-		get_production_plan_sub_assembly_item_details(filters, row, production_plan_doc, data, order_details)
+		get_production_plan_sub_assembly_item_details(
+			filters, row, production_plan_doc, data, order_details
+		)
 
-def get_production_plan_sub_assembly_item_details(filters, row, production_plan_doc, data, order_details):
+
+def get_production_plan_sub_assembly_item_details(
+	filters, row, production_plan_doc, data, order_details
+):
 	for item in production_plan_doc.sub_assembly_items:
 		if row.name == item.production_plan_item:
-			subcontracted_item = (item.type_of_manufacturing == 'Subcontract')
+			subcontracted_item = item.type_of_manufacturing == "Subcontract"
 
 			if subcontracted_item:
 				docname = frappe.get_value(
 					"Purchase Order Item",
-					{
-						"production_plan_sub_assembly_item": item.name,
-						"docstatus": ("<", 2)
-					},
-					"parent"
+					{"production_plan_sub_assembly_item": item.name, "docstatus": ("<", 2)},
+					"parent",
 				)
 			else:
 				docname = frappe.get_value(
-					"Work Order",
-					{
-						"production_plan_sub_assembly_item": item.name,
-						"docstatus": ("<", 2)
-					},
-					"name"
+					"Work Order", {"production_plan_sub_assembly_item": item.name, "docstatus": ("<", 2)}, "name"
 				)
 
-			data.append({
-				"indent": 1,
-				"item_code": item.production_item,
-				"item_name": item.item_name,
-				"qty": item.qty,
-				"document_type": "Work Order" if not subcontracted_item else "Purchase Order",
-				"document_name": docname or "",
-				"bom_level": item.bom_level,
-				"produced_qty": order_details.get((docname, item.production_item), {}).get("produced_qty", 0),
-				"pending_qty": flt(item.qty) - flt(order_details.get((docname, item.production_item), {}).get("produced_qty", 0))
-			})
+			data.append(
+				{
+					"indent": 1,
+					"item_code": item.production_item,
+					"item_name": item.item_name,
+					"qty": item.qty,
+					"document_type": "Work Order" if not subcontracted_item else "Purchase Order",
+					"document_name": docname or "",
+					"bom_level": item.bom_level,
+					"produced_qty": order_details.get((docname, item.production_item), {}).get("produced_qty", 0),
+					"pending_qty": flt(item.qty)
+					- flt(order_details.get((docname, item.production_item), {}).get("produced_qty", 0)),
+				}
+			)
+
 
 def get_work_order_details(filters, order_details):
-	for row in frappe.get_all("Work Order", filters = {"production_plan": filters.get("production_plan")},
-		fields=["name", "produced_qty", "production_plan", "production_item"]):
+	for row in frappe.get_all(
+		"Work Order",
+		filters={"production_plan": filters.get("production_plan")},
+		fields=["name", "produced_qty", "production_plan", "production_item"],
+	):
 		order_details.setdefault((row.name, row.production_item), row)
 
+
 def get_purchase_order_details(filters, order_details):
-	for row in frappe.get_all("Purchase Order Item", filters = {"production_plan": filters.get("production_plan")},
-		fields=["parent", "received_qty as produced_qty", "item_code"]):
+	for row in frappe.get_all(
+		"Purchase Order Item",
+		filters={"production_plan": filters.get("production_plan")},
+		fields=["parent", "received_qty as produced_qty", "item_code"],
+	):
 		order_details.setdefault((row.parent, row.item_code), row)
 
+
 def get_column(filters):
 	return [
 		{
@@ -108,49 +118,24 @@
 			"fieldtype": "Link",
 			"fieldname": "item_code",
 			"width": 300,
-			"options": "Item"
+			"options": "Item",
 		},
-		{
-			"label": "Item Name",
-			"fieldtype": "data",
-			"fieldname": "item_name",
-			"width": 100
-		},
+		{"label": "Item Name", "fieldtype": "data", "fieldname": "item_name", "width": 100},
 		{
 			"label": "Document Type",
 			"fieldtype": "Link",
 			"fieldname": "document_type",
 			"width": 150,
-			"options": "DocType"
+			"options": "DocType",
 		},
 		{
 			"label": "Document Name",
 			"fieldtype": "Dynamic Link",
 			"fieldname": "document_name",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": "BOM Level",
-			"fieldtype": "Int",
-			"fieldname": "bom_level",
-			"width": 100
-		},
-		{
-			"label": "Order Qty",
-			"fieldtype": "Float",
-			"fieldname": "qty",
-			"width": 120
-		},
-		{
-			"label": "Received Qty",
-			"fieldtype": "Float",
-			"fieldname": "produced_qty",
-			"width": 160
-		},
-		{
-			"label": "Pending Qty",
-			"fieldtype": "Float",
-			"fieldname": "pending_qty",
-			"width": 110
-		}
+		{"label": "BOM Level", "fieldtype": "Int", "fieldname": "bom_level", "width": 100},
+		{"label": "Order Qty", "fieldtype": "Float", "fieldname": "qty", "width": 120},
+		{"label": "Received Qty", "fieldtype": "Float", "fieldname": "produced_qty", "width": 160},
+		{"label": "Pending Qty", "fieldtype": "Float", "fieldname": "pending_qty", "width": 110},
 	]
diff --git a/erpnext/manufacturing/report/production_planning_report/production_planning_report.py b/erpnext/manufacturing/report/production_planning_report/production_planning_report.py
index e1e7225..1404888 100644
--- a/erpnext/manufacturing/report/production_planning_report/production_planning_report.py
+++ b/erpnext/manufacturing/report/production_planning_report/production_planning_report.py
@@ -15,38 +15,36 @@
 			stock_qty as qty_to_manufacture, `tabSales Order Item`.parent as name, bom_no, warehouse,
 			`tabSales Order Item`.delivery_date, `tabSales Order`.base_grand_total """,
 		"filters": """`tabSales Order Item`.docstatus = 1 and stock_qty > produced_qty
-			and `tabSales Order`.per_delivered < 100.0"""
+			and `tabSales Order`.per_delivered < 100.0""",
 	},
 	"Material Request": {
 		"fields": """ item_code as production_item, item_name as production_item_name, stock_uom,
 			stock_qty as qty_to_manufacture, `tabMaterial Request Item`.parent as name, bom_no, warehouse,
 			`tabMaterial Request Item`.schedule_date """,
 		"filters": """`tabMaterial Request`.docstatus = 1 and `tabMaterial Request`.per_ordered < 100
-			and `tabMaterial Request`.material_request_type = 'Manufacture' """
+			and `tabMaterial Request`.material_request_type = 'Manufacture' """,
 	},
 	"Work Order": {
 		"fields": """ production_item, item_name as production_item_name, planned_start_date,
 			stock_uom, qty as qty_to_manufacture, name, bom_no, fg_warehouse as warehouse """,
-		"filters": "docstatus = 1 and status not in ('Completed', 'Stopped')"
+		"filters": "docstatus = 1 and status not in ('Completed', 'Stopped')",
 	},
 }
 
 order_mapper = {
 	"Sales Order": {
 		"Delivery Date": "`tabSales Order Item`.delivery_date asc",
-		"Total Amount": "`tabSales Order`.base_grand_total desc"
+		"Total Amount": "`tabSales Order`.base_grand_total desc",
 	},
-	"Material Request": {
-		"Required Date": "`tabMaterial Request Item`.schedule_date asc"
-	},
-	"Work Order": {
-		"Planned Start Date": "planned_start_date asc"
-	}
+	"Material Request": {"Required Date": "`tabMaterial Request Item`.schedule_date asc"},
+	"Work Order": {"Planned Start Date": "planned_start_date asc"},
 }
 
+
 def execute(filters=None):
 	return ProductionPlanReport(filters).execute_report()
 
+
 class ProductionPlanReport(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
@@ -65,46 +63,64 @@
 		return self.columns, self.data
 
 	def get_open_orders(self):
-		doctype = ("`tabWork Order`" if self.filters.based_on == "Work Order"
-			else "`tab{doc}`, `tab{doc} Item`".format(doc=self.filters.based_on))
+		doctype = (
+			"`tabWork Order`"
+			if self.filters.based_on == "Work Order"
+			else "`tab{doc}`, `tab{doc} Item`".format(doc=self.filters.based_on)
+		)
 
 		filters = mapper.get(self.filters.based_on)["filters"]
 		filters = self.prepare_other_conditions(filters, self.filters.based_on)
 		order_by = " ORDER BY %s" % (order_mapper[self.filters.based_on][self.filters.order_by])
 
-		self.orders = frappe.db.sql(""" SELECT {fields} from {doctype}
+		self.orders = frappe.db.sql(
+			""" SELECT {fields} from {doctype}
 			WHERE {filters} {order_by}""".format(
-				doctype = doctype,
-				filters = filters,
-				order_by = order_by,
-				fields = mapper.get(self.filters.based_on)["fields"]
-			), tuple(self.filters.docnames), as_dict=1)
+				doctype=doctype,
+				filters=filters,
+				order_by=order_by,
+				fields=mapper.get(self.filters.based_on)["fields"],
+			),
+			tuple(self.filters.docnames),
+			as_dict=1,
+		)
 
 	def prepare_other_conditions(self, filters, doctype):
 		if self.filters.docnames:
 			field = "name" if doctype == "Work Order" else "`tab{} Item`.parent".format(doctype)
-			filters += " and %s in (%s)" % (field, ','.join(['%s'] * len(self.filters.docnames)))
+			filters += " and %s in (%s)" % (field, ",".join(["%s"] * len(self.filters.docnames)))
 
 		if doctype != "Work Order":
 			filters += " and `tab{doc}`.name = `tab{doc} Item`.parent".format(doc=doctype)
 
 		if self.filters.company:
-			filters += " and `tab%s`.company = %s" %(doctype, frappe.db.escape(self.filters.company))
+			filters += " and `tab%s`.company = %s" % (doctype, frappe.db.escape(self.filters.company))
 
 		return filters
 
 	def get_raw_materials(self):
-		if not self.orders: return
+		if not self.orders:
+			return
 		self.warehouses = [d.warehouse for d in self.orders]
 		self.item_codes = [d.production_item for d in self.orders]
 
 		if self.filters.based_on == "Work Order":
 			work_orders = [d.name for d in self.orders]
 
-			raw_materials = frappe.get_all("Work Order Item",
-				fields=["parent", "item_code", "item_name as raw_material_name",
-					"source_warehouse as warehouse", "required_qty"],
-				filters = {"docstatus": 1, "parent": ("in", work_orders), "source_warehouse": ("!=", "")}) or []
+			raw_materials = (
+				frappe.get_all(
+					"Work Order Item",
+					fields=[
+						"parent",
+						"item_code",
+						"item_name as raw_material_name",
+						"source_warehouse as warehouse",
+						"required_qty",
+					],
+					filters={"docstatus": 1, "parent": ("in", work_orders), "source_warehouse": ("!=", "")},
+				)
+				or []
+			)
 			self.warehouses.extend([d.source_warehouse for d in raw_materials])
 
 		else:
@@ -118,21 +134,32 @@
 
 				bom_nos.append(bom_no)
 
-			bom_doctype = ("BOM Explosion Item"
-				if self.filters.include_subassembly_raw_materials else "BOM Item")
+			bom_doctype = (
+				"BOM Explosion Item" if self.filters.include_subassembly_raw_materials else "BOM Item"
+			)
 
-			qty_field = ("qty_consumed_per_unit"
-				if self.filters.include_subassembly_raw_materials else "(bom_item.qty / bom.quantity)")
+			qty_field = (
+				"qty_consumed_per_unit"
+				if self.filters.include_subassembly_raw_materials
+				else "(bom_item.qty / bom.quantity)"
+			)
 
-			raw_materials = frappe.db.sql(""" SELECT bom_item.parent, bom_item.item_code,
+			raw_materials = frappe.db.sql(
+				""" SELECT bom_item.parent, bom_item.item_code,
 					bom_item.item_name as raw_material_name, {0} as required_qty_per_unit
 				FROM
 					`tabBOM` as bom, `tab{1}` as bom_item
 				WHERE
 					bom_item.parent in ({2}) and bom_item.parent = bom.name and bom.docstatus = 1
-			""".format(qty_field, bom_doctype, ','.join(["%s"] * len(bom_nos))), tuple(bom_nos), as_dict=1)
+			""".format(
+					qty_field, bom_doctype, ",".join(["%s"] * len(bom_nos))
+				),
+				tuple(bom_nos),
+				as_dict=1,
+			)
 
-		if not raw_materials: return
+		if not raw_materials:
+			return
 
 		self.item_codes.extend([d.item_code for d in raw_materials])
 
@@ -144,15 +171,20 @@
 			rows.append(d)
 
 	def get_item_details(self):
-		if not (self.orders and self.item_codes): return
+		if not (self.orders and self.item_codes):
+			return
 
 		self.item_details = {}
-		for d in frappe.get_all("Item Default", fields = ["parent", "default_warehouse"],
-			filters = {"company": self.filters.company, "parent": ("in", self.item_codes)}):
+		for d in frappe.get_all(
+			"Item Default",
+			fields=["parent", "default_warehouse"],
+			filters={"company": self.filters.company, "parent": ("in", self.item_codes)},
+		):
 			self.item_details[d.parent] = d
 
 	def get_bin_details(self):
-		if not (self.orders and self.raw_materials_dict): return
+		if not (self.orders and self.raw_materials_dict):
+			return
 
 		self.bin_details = {}
 		self.mrp_warehouses = []
@@ -160,48 +192,55 @@
 			self.mrp_warehouses.extend(get_child_warehouses(self.filters.raw_material_warehouse))
 			self.warehouses.extend(self.mrp_warehouses)
 
-		for d in frappe.get_all("Bin",
+		for d in frappe.get_all(
+			"Bin",
 			fields=["warehouse", "item_code", "actual_qty", "ordered_qty", "projected_qty"],
-			filters = {"item_code": ("in", self.item_codes), "warehouse": ("in", self.warehouses)}):
+			filters={"item_code": ("in", self.item_codes), "warehouse": ("in", self.warehouses)},
+		):
 			key = (d.item_code, d.warehouse)
 			if key not in self.bin_details:
 				self.bin_details.setdefault(key, d)
 
 	def get_purchase_details(self):
-		if not (self.orders and self.raw_materials_dict): return
+		if not (self.orders and self.raw_materials_dict):
+			return
 
 		self.purchase_details = {}
 
-		purchased_items = frappe.get_all("Purchase Order Item",
+		purchased_items = frappe.get_all(
+			"Purchase Order Item",
 			fields=["item_code", "min(schedule_date) as arrival_date", "qty as arrival_qty", "warehouse"],
 			filters={
 				"item_code": ("in", self.item_codes),
 				"warehouse": ("in", self.warehouses),
 				"docstatus": 1,
 			},
-			group_by = "item_code, warehouse")
+			group_by="item_code, warehouse",
+		)
 		for d in purchased_items:
 			key = (d.item_code, d.warehouse)
 			if key not in self.purchase_details:
 				self.purchase_details.setdefault(key, d)
 
 	def prepare_data(self):
-		if not self.orders: return
+		if not self.orders:
+			return
 
 		for d in self.orders:
 			key = d.name if self.filters.based_on == "Work Order" else d.bom_no
 
-			if not self.raw_materials_dict.get(key): continue
+			if not self.raw_materials_dict.get(key):
+				continue
 
 			bin_data = self.bin_details.get((d.production_item, d.warehouse)) or {}
-			d.update({
-				"for_warehouse": d.warehouse,
-				"available_qty": 0
-			})
+			d.update({"for_warehouse": d.warehouse, "available_qty": 0})
 
 			if bin_data and bin_data.get("actual_qty") > 0 and d.qty_to_manufacture:
-				d.available_qty = (bin_data.get("actual_qty")
-					if (d.qty_to_manufacture > bin_data.get("actual_qty")) else d.qty_to_manufacture)
+				d.available_qty = (
+					bin_data.get("actual_qty")
+					if (d.qty_to_manufacture > bin_data.get("actual_qty"))
+					else d.qty_to_manufacture
+				)
 
 				bin_data["actual_qty"] -= d.available_qty
 
@@ -232,8 +271,9 @@
 			d.remaining_qty = d.required_qty
 			self.pick_materials_from_warehouses(d, data, warehouses)
 
-			if (d.remaining_qty and self.filters.raw_material_warehouse
-				and d.remaining_qty != d.required_qty):
+			if (
+				d.remaining_qty and self.filters.raw_material_warehouse and d.remaining_qty != d.required_qty
+			):
 				row = self.get_args()
 				d.warehouse = self.filters.raw_material_warehouse
 				d.required_qty = d.remaining_qty
@@ -243,7 +283,8 @@
 
 	def pick_materials_from_warehouses(self, args, order_data, warehouses):
 		for index, warehouse in enumerate(warehouses):
-			if not args.remaining_qty: return
+			if not args.remaining_qty:
+				return
 
 			row = self.get_args()
 
@@ -255,14 +296,18 @@
 
 			args.allotted_qty = 0
 			if bin_data and bin_data.get("actual_qty") > 0:
-				args.allotted_qty = (bin_data.get("actual_qty")
-					if (args.required_qty > bin_data.get("actual_qty")) else args.required_qty)
+				args.allotted_qty = (
+					bin_data.get("actual_qty")
+					if (args.required_qty > bin_data.get("actual_qty"))
+					else args.required_qty
+				)
 
 				args.remaining_qty -= args.allotted_qty
 				bin_data["actual_qty"] -= args.allotted_qty
 
-			if ((self.mrp_warehouses and (args.allotted_qty or index == len(warehouses) - 1))
-				or not self.mrp_warehouses):
+			if (
+				self.mrp_warehouses and (args.allotted_qty or index == len(warehouses) - 1)
+			) or not self.mrp_warehouses:
 				if not self.index:
 					row.update(order_data)
 					self.index += 1
@@ -275,52 +320,45 @@
 				self.data.append(row)
 
 	def get_args(self):
-		return frappe._dict({
-			"work_order": "",
-			"sales_order": "",
-			"production_item": "",
-			"production_item_name": "",
-			"qty_to_manufacture": "",
-			"produced_qty": ""
-		})
+		return frappe._dict(
+			{
+				"work_order": "",
+				"sales_order": "",
+				"production_item": "",
+				"production_item_name": "",
+				"qty_to_manufacture": "",
+				"produced_qty": "",
+			}
+		)
 
 	def get_columns(self):
 		based_on = self.filters.based_on
 
-		self.columns = [{
-			"label": _("ID"),
-			"options": based_on,
-			"fieldname": "name",
-			"fieldtype": "Link",
-			"width": 100
-		}, {
-			"label": _("Item Code"),
-			"fieldname": "production_item",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 120
-		}, {
-			"label": _("Item Name"),
-			"fieldname": "production_item_name",
-			"fieldtype": "Data",
-			"width": 130
-		}, {
-			"label": _("Warehouse"),
-			"options": "Warehouse",
-			"fieldname": "for_warehouse",
-			"fieldtype": "Link",
-			"width": 100
-		}, {
-			"label": _("Order Qty"),
-			"fieldname": "qty_to_manufacture",
-			"fieldtype": "Float",
-			"width": 80
-		}, {
-			"label": _("Available"),
-			"fieldname": "available_qty",
-			"fieldtype": "Float",
-			"width": 80
-		}]
+		self.columns = [
+			{"label": _("ID"), "options": based_on, "fieldname": "name", "fieldtype": "Link", "width": 100},
+			{
+				"label": _("Item Code"),
+				"fieldname": "production_item",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 120,
+			},
+			{
+				"label": _("Item Name"),
+				"fieldname": "production_item_name",
+				"fieldtype": "Data",
+				"width": 130,
+			},
+			{
+				"label": _("Warehouse"),
+				"options": "Warehouse",
+				"fieldname": "for_warehouse",
+				"fieldtype": "Link",
+				"width": 100,
+			},
+			{"label": _("Order Qty"), "fieldname": "qty_to_manufacture", "fieldtype": "Float", "width": 80},
+			{"label": _("Available"), "fieldname": "available_qty", "fieldtype": "Float", "width": 80},
+		]
 
 		fieldname, fieldtype = "delivery_date", "Date"
 		if self.filters.based_on == "Sales Order" and self.filters.order_by == "Total Amount":
@@ -330,48 +368,50 @@
 		elif self.filters.based_on == "Work Order":
 			fieldname = "planned_start_date"
 
-		self.columns.append({
-			"label": _(self.filters.order_by),
-			"fieldname": fieldname,
-			"fieldtype": fieldtype,
-			"width": 100
-		})
+		self.columns.append(
+			{
+				"label": _(self.filters.order_by),
+				"fieldname": fieldname,
+				"fieldtype": fieldtype,
+				"width": 100,
+			}
+		)
 
-		self.columns.extend([{
-			"label": _("Raw Material Code"),
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 120
-		}, {
-			"label": _("Raw Material Name"),
-			"fieldname": "raw_material_name",
-			"fieldtype": "Data",
-			"width": 130
-		}, {
-			"label": _("Warehouse"),
-			"options": "Warehouse",
-			"fieldname": "warehouse",
-			"fieldtype": "Link",
-			"width": 110
-		}, {
-			"label": _("Required Qty"),
-			"fieldname": "required_qty",
-			"fieldtype": "Float",
-			"width": 100
-		}, {
-			"label": _("Allotted Qty"),
-			"fieldname": "allotted_qty",
-			"fieldtype": "Float",
-			"width": 100
-		}, {
-			"label": _("Expected Arrival Date"),
-			"fieldname": "arrival_date",
-			"fieldtype": "Date",
-			"width": 160
-		}, {
-			"label": _("Arrival Quantity"),
-			"fieldname": "arrival_qty",
-			"fieldtype": "Float",
-			"width": 140
-		}])
+		self.columns.extend(
+			[
+				{
+					"label": _("Raw Material Code"),
+					"fieldname": "item_code",
+					"fieldtype": "Link",
+					"options": "Item",
+					"width": 120,
+				},
+				{
+					"label": _("Raw Material Name"),
+					"fieldname": "raw_material_name",
+					"fieldtype": "Data",
+					"width": 130,
+				},
+				{
+					"label": _("Warehouse"),
+					"options": "Warehouse",
+					"fieldname": "warehouse",
+					"fieldtype": "Link",
+					"width": 110,
+				},
+				{"label": _("Required Qty"), "fieldname": "required_qty", "fieldtype": "Float", "width": 100},
+				{"label": _("Allotted Qty"), "fieldname": "allotted_qty", "fieldtype": "Float", "width": 100},
+				{
+					"label": _("Expected Arrival Date"),
+					"fieldname": "arrival_date",
+					"fieldtype": "Date",
+					"width": 160,
+				},
+				{
+					"label": _("Arrival Quantity"),
+					"fieldname": "arrival_qty",
+					"fieldtype": "Float",
+					"width": 140,
+				},
+			]
+		)
diff --git a/erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py b/erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py
index a0c4a43..0a79130 100644
--- a/erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py
+++ b/erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py
@@ -11,13 +11,24 @@
 	data = get_data(filters)
 	columns = get_columns(filters)
 	chart_data = get_chart_data(data, filters)
-	return columns, data , None, chart_data
+	return columns, data, None, chart_data
+
 
 def get_data(filters):
 	query_filters = {"docstatus": ("<", 2)}
 
-	fields = ["name", "status", "report_date", "item_code", "item_name", "sample_size",
-		"inspection_type", "reference_type", "reference_name", "inspected_by"]
+	fields = [
+		"name",
+		"status",
+		"report_date",
+		"item_code",
+		"item_name",
+		"sample_size",
+		"inspection_type",
+		"reference_type",
+		"reference_name",
+		"inspected_by",
+	]
 
 	for field in ["status", "item_code", "status", "inspected_by"]:
 		if filters.get(field):
@@ -26,36 +37,33 @@
 	query_filters["report_date"] = (">=", filters.get("from_date"))
 	query_filters["report_date"] = ("<=", filters.get("to_date"))
 
-	return frappe.get_all("Quality Inspection",
-		fields= fields, filters=query_filters, order_by="report_date asc")
+	return frappe.get_all(
+		"Quality Inspection", fields=fields, filters=query_filters, order_by="report_date asc"
+	)
+
 
 def get_chart_data(periodic_data, columns):
 	labels = ["Rejected", "Accepted"]
 
-	status_wise_data = {
-		"Accepted": 0,
-		"Rejected": 0
-	}
+	status_wise_data = {"Accepted": 0, "Rejected": 0}
 
 	datasets = []
 
 	for d in periodic_data:
 		status_wise_data[d.status] += 1
 
-	datasets.append({'name':'Qty Wise Chart',
-		'values': [status_wise_data.get("Rejected"), status_wise_data.get("Accepted")]})
+	datasets.append(
+		{
+			"name": "Qty Wise Chart",
+			"values": [status_wise_data.get("Rejected"), status_wise_data.get("Accepted")],
+		}
+	)
 
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		},
-		"type": "donut",
-		"height": 300
-	}
+	chart = {"data": {"labels": labels, "datasets": datasets}, "type": "donut", "height": 300}
 
 	return chart
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -63,71 +71,49 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Work Order",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Report Date"),
-			"fieldname": "report_date",
-			"fieldtype": "Date",
-			"width": 150
-		}
+		{"label": _("Report Date"), "fieldname": "report_date", "fieldtype": "Date", "width": 150},
 	]
 
 	if not filters.get("status"):
 		columns.append(
-			{
-				"label": _("Status"),
-				"fieldname": "status",
-				"width": 100
-			},
+			{"label": _("Status"), "fieldname": "status", "width": 100},
 		)
 
-	columns.extend([
-		{
-			"label": _("Item Code"),
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 130
-		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 130
-		},
-		{
-			"label": _("Sample Size"),
-			"fieldname": "sample_size",
-			"fieldtype": "Float",
-			"width": 110
-		},
-		{
-			"label": _("Inspection Type"),
-			"fieldname": "inspection_type",
-			"fieldtype": "Data",
-			"width": 110
-		},
-		{
-			"label": _("Document Type"),
-			"fieldname": "reference_type",
-			"fieldtype": "Data",
-			"width": 90
-		},
-		{
-			"label": _("Document Name"),
-			"fieldname": "reference_name",
-			"fieldtype": "Dynamic Link",
-			"options": "reference_type",
-			"width": 150
-		},
-		{
-			"label": _("Inspected By"),
-			"fieldname": "inspected_by",
-			"fieldtype": "Link",
-			"options": "User",
-			"width": 150
-		}
-	])
+	columns.extend(
+		[
+			{
+				"label": _("Item Code"),
+				"fieldname": "item_code",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 130,
+			},
+			{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 130},
+			{"label": _("Sample Size"), "fieldname": "sample_size", "fieldtype": "Float", "width": 110},
+			{
+				"label": _("Inspection Type"),
+				"fieldname": "inspection_type",
+				"fieldtype": "Data",
+				"width": 110,
+			},
+			{"label": _("Document Type"), "fieldname": "reference_type", "fieldtype": "Data", "width": 90},
+			{
+				"label": _("Document Name"),
+				"fieldname": "reference_name",
+				"fieldtype": "Dynamic Link",
+				"options": "reference_type",
+				"width": 150,
+			},
+			{
+				"label": _("Inspected By"),
+				"fieldname": "inspected_by",
+				"fieldtype": "Link",
+				"options": "User",
+				"width": 150,
+			},
+		]
+	)
 
 	return columns
diff --git a/erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py b/erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py
index 0528348..8158bc9 100644
--- a/erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py
+++ b/erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py
@@ -12,12 +12,13 @@
 
 	return columns, data
 
+
 def get_data(report_filters):
 	fields = get_fields()
 	filters = get_filter_condition(report_filters)
 
 	wo_items = {}
-	for d in frappe.get_all("Work Order", filters = filters, fields=fields):
+	for d in frappe.get_all("Work Order", filters=filters, fields=fields):
 		d.extra_consumed_qty = 0.0
 		if d.consumed_qty and d.consumed_qty > d.required_qty:
 			d.extra_consumed_qty = d.consumed_qty - d.required_qty
@@ -29,7 +30,7 @@
 	for key, wo_data in wo_items.items():
 		for index, row in enumerate(wo_data):
 			if index != 0:
-				#If one work order has multiple raw materials then show parent data in the first row only
+				# If one work order has multiple raw materials then show parent data in the first row only
 				for field in ["name", "status", "production_item", "qty", "produced_qty"]:
 					row[field] = ""
 
@@ -37,17 +38,28 @@
 
 	return data
 
+
 def get_fields():
-	return ["`tabWork Order Item`.`parent`", "`tabWork Order Item`.`item_code` as raw_material_item_code",
-		"`tabWork Order Item`.`item_name` as raw_material_name", "`tabWork Order Item`.`required_qty`",
-		"`tabWork Order Item`.`transferred_qty`", "`tabWork Order Item`.`consumed_qty`", "`tabWork Order`.`status`",
-		"`tabWork Order`.`name`", "`tabWork Order`.`production_item`", "`tabWork Order`.`qty`",
-		"`tabWork Order`.`produced_qty`"]
+	return [
+		"`tabWork Order Item`.`parent`",
+		"`tabWork Order Item`.`item_code` as raw_material_item_code",
+		"`tabWork Order Item`.`item_name` as raw_material_name",
+		"`tabWork Order Item`.`required_qty`",
+		"`tabWork Order Item`.`transferred_qty`",
+		"`tabWork Order Item`.`consumed_qty`",
+		"`tabWork Order`.`status`",
+		"`tabWork Order`.`name`",
+		"`tabWork Order`.`production_item`",
+		"`tabWork Order`.`qty`",
+		"`tabWork Order`.`produced_qty`",
+	]
+
 
 def get_filter_condition(report_filters):
 	filters = {
-		"docstatus": 1, "status": ("in", ["In Process", "Completed", "Stopped"]),
-		"creation": ("between", [report_filters.from_date, report_filters.to_date])
+		"docstatus": 1,
+		"status": ("in", ["In Process", "Completed", "Stopped"]),
+		"creation": ("between", [report_filters.from_date, report_filters.to_date]),
 	}
 
 	for field in ["name", "production_item", "company", "status"]:
@@ -58,6 +70,7 @@
 
 	return filters
 
+
 def get_columns():
 	return [
 		{
@@ -65,67 +78,38 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Work Order",
-			"width": 80
+			"width": 80,
 		},
-		{
-			"label": _("Status"),
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"width": 80
-		},
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 80},
 		{
 			"label": _("Production Item"),
 			"fieldname": "production_item",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 130
+			"width": 130,
 		},
-		{
-			"label": _("Qty to Produce"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("Produced Qty"),
-			"fieldname": "produced_qty",
-			"fieldtype": "Float",
-			"width": 110
-		},
+		{"label": _("Qty to Produce"), "fieldname": "qty", "fieldtype": "Float", "width": 120},
+		{"label": _("Produced Qty"), "fieldname": "produced_qty", "fieldtype": "Float", "width": 110},
 		{
 			"label": _("Raw Material Item"),
 			"fieldname": "raw_material_item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "raw_material_name",
-			"width": 130
-		},
-		{
-			"label": _("Required Qty"),
-			"fieldname": "required_qty",
-			"fieldtype": "Float",
-			"width": 100
-		},
+		{"label": _("Item Name"), "fieldname": "raw_material_name", "width": 130},
+		{"label": _("Required Qty"), "fieldname": "required_qty", "fieldtype": "Float", "width": 100},
 		{
 			"label": _("Transferred Qty"),
 			"fieldname": "transferred_qty",
 			"fieldtype": "Float",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Consumed Qty"),
-			"fieldname": "consumed_qty",
-			"fieldtype": "Float",
-			"width": 100
-		},
+		{"label": _("Consumed Qty"), "fieldname": "consumed_qty", "fieldtype": "Float", "width": 100},
 		{
 			"label": _("Extra Consumed Qty"),
 			"fieldname": "extra_consumed_qty",
 			"fieldtype": "Float",
-			"width": 100
-		}
+			"width": 100,
+		},
 	]
diff --git a/erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py b/erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py
index db0b239..c6b7e58 100644
--- a/erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py
+++ b/erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py
@@ -12,17 +12,20 @@
 	columns = get_columns()
 	return columns, data
 
+
 def get_item_list(wo_list, filters):
 	out = []
 
-	#Add a row for each item/qty
+	# Add a row for each item/qty
 	for wo_details in wo_list:
 		desc = frappe.db.get_value("BOM", wo_details.bom_no, "description")
 
-		for wo_item_details in frappe.db.get_values("Work Order Item",
-			{"parent": wo_details.name}, ["item_code", "source_warehouse"], as_dict=1):
+		for wo_item_details in frappe.db.get_values(
+			"Work Order Item", {"parent": wo_details.name}, ["item_code", "source_warehouse"], as_dict=1
+		):
 
-			item_list = frappe.db.sql("""SELECT
+			item_list = frappe.db.sql(
+				"""SELECT
 					bom_item.item_code as item_code,
 					ifnull(ledger.actual_qty*bom.quantity/bom_item.stock_qty,0) as build_qty
 				FROM
@@ -36,8 +39,14 @@
 					and bom.name = %(bom)s
 				GROUP BY
 					bom_item.item_code""",
-			{"bom": wo_details.bom_no, "warehouse": wo_item_details.source_warehouse,
-				"filterhouse": filters.warehouse, "item_code": wo_item_details.item_code}, as_dict=1)
+				{
+					"bom": wo_details.bom_no,
+					"warehouse": wo_item_details.source_warehouse,
+					"filterhouse": filters.warehouse,
+					"item_code": wo_item_details.item_code,
+				},
+				as_dict=1,
+			)
 
 			stock_qty = 0
 			count = 0
@@ -54,97 +63,99 @@
 			else:
 				build = "N"
 
-			row = frappe._dict({
-				"work_order": wo_details.name,
-				"status": wo_details.status,
-				"req_items": cint(count),
-				"instock": stock_qty,
-				"description": desc,
-				"source_warehouse": wo_item_details.source_warehouse,
-				"item_code": wo_item_details.item_code,
-				"bom_no": wo_details.bom_no,
-				"qty": wo_details.qty,
-				"buildable_qty": buildable_qty,
-				"ready_to_build": build
-			})
+			row = frappe._dict(
+				{
+					"work_order": wo_details.name,
+					"status": wo_details.status,
+					"req_items": cint(count),
+					"instock": stock_qty,
+					"description": desc,
+					"source_warehouse": wo_item_details.source_warehouse,
+					"item_code": wo_item_details.item_code,
+					"bom_no": wo_details.bom_no,
+					"qty": wo_details.qty,
+					"buildable_qty": buildable_qty,
+					"ready_to_build": build,
+				}
+			)
 
 			out.append(row)
 
 	return out
 
+
 def get_work_orders():
-	out =  frappe.get_all("Work Order", filters={"docstatus": 1, "status": ( "!=","Completed")},
-		fields=["name","status", "bom_no", "qty", "produced_qty"], order_by='name')
+	out = frappe.get_all(
+		"Work Order",
+		filters={"docstatus": 1, "status": ("!=", "Completed")},
+		fields=["name", "status", "bom_no", "qty", "produced_qty"],
+		order_by="name",
+	)
 
 	return out
 
+
 def get_columns():
-	columns = [{
-		"fieldname": "work_order",
-		"label": "Work Order",
-		"fieldtype": "Link",
-		"options": "Work Order",
-		"width": 110
-	}, {
-		"fieldname": "bom_no",
-		"label": "BOM",
-		"fieldtype": "Link",
-		"options": "BOM",
-		"width": 120
-	}, {
-		"fieldname": "description",
-		"label": "Description",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 230
-	}, {
-		"fieldname": "item_code",
-		"label": "Item Code",
-		"fieldtype": "Link",
-		"options": "Item",
-		"width": 110
-	},{
-		"fieldname": "source_warehouse",
-		"label": "Source Warehouse",
-		"fieldtype": "Link",
-		"options": "Warehouse",
-		"width": 110
-	},{
-		"fieldname": "qty",
-		"label": "Qty to Build",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 110
-	}, {
-		"fieldname": "status",
-		"label": "Status",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 100
-	}, {
-		"fieldname": "req_items",
-		"label": "# Req'd Items",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 105
-	}, {
-		"fieldname": "instock",
-		"label": "# In Stock",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 105
-	}, {
-		"fieldname": "buildable_qty",
-		"label": "Buildable Qty",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 100
-	}, {
-		"fieldname": "ready_to_build",
-		"label": "Build All?",
-		"fieldtype": "Data",
-		"options": "",
-		"width": 90
-	}]
+	columns = [
+		{
+			"fieldname": "work_order",
+			"label": "Work Order",
+			"fieldtype": "Link",
+			"options": "Work Order",
+			"width": 110,
+		},
+		{"fieldname": "bom_no", "label": "BOM", "fieldtype": "Link", "options": "BOM", "width": 120},
+		{
+			"fieldname": "description",
+			"label": "Description",
+			"fieldtype": "Data",
+			"options": "",
+			"width": 230,
+		},
+		{
+			"fieldname": "item_code",
+			"label": "Item Code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 110,
+		},
+		{
+			"fieldname": "source_warehouse",
+			"label": "Source Warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 110,
+		},
+		{"fieldname": "qty", "label": "Qty to Build", "fieldtype": "Data", "options": "", "width": 110},
+		{"fieldname": "status", "label": "Status", "fieldtype": "Data", "options": "", "width": 100},
+		{
+			"fieldname": "req_items",
+			"label": "# Req'd Items",
+			"fieldtype": "Data",
+			"options": "",
+			"width": 105,
+		},
+		{
+			"fieldname": "instock",
+			"label": "# In Stock",
+			"fieldtype": "Data",
+			"options": "",
+			"width": 105,
+		},
+		{
+			"fieldname": "buildable_qty",
+			"label": "Buildable Qty",
+			"fieldtype": "Data",
+			"options": "",
+			"width": 100,
+		},
+		{
+			"fieldname": "ready_to_build",
+			"label": "Build All?",
+			"fieldtype": "Data",
+			"options": "",
+			"width": 90,
+		},
+	]
 
 	return columns
diff --git a/erpnext/manufacturing/report/work_order_summary/work_order_summary.py b/erpnext/manufacturing/report/work_order_summary/work_order_summary.py
index d7469dd..2368bfd 100644
--- a/erpnext/manufacturing/report/work_order_summary/work_order_summary.py
+++ b/erpnext/manufacturing/report/work_order_summary/work_order_summary.py
@@ -21,11 +21,23 @@
 	chart_data = get_chart_data(data, filters)
 	return columns, data, None, chart_data
 
+
 def get_data(filters):
 	query_filters = {"docstatus": ("<", 2)}
 
-	fields = ["name", "status", "sales_order", "production_item", "qty", "produced_qty",
-		"planned_start_date", "planned_end_date", "actual_start_date", "actual_end_date", "lead_time"]
+	fields = [
+		"name",
+		"status",
+		"sales_order",
+		"production_item",
+		"qty",
+		"produced_qty",
+		"planned_start_date",
+		"planned_end_date",
+		"actual_start_date",
+		"actual_end_date",
+		"lead_time",
+	]
 
 	for field in ["sales_order", "production_item", "status", "company"]:
 		if filters.get(field):
@@ -34,15 +46,16 @@
 	query_filters["planned_start_date"] = (">=", filters.get("from_date"))
 	query_filters["planned_end_date"] = ("<=", filters.get("to_date"))
 
-	data = frappe.get_all("Work Order",
-		fields= fields, filters=query_filters, order_by="planned_start_date asc")
+	data = frappe.get_all(
+		"Work Order", fields=fields, filters=query_filters, order_by="planned_start_date asc"
+	)
 
 	res = []
 	for d in data:
 		start_date = d.actual_start_date or d.planned_start_date
 		d.age = 0
 
-		if d.status != 'Completed':
+		if d.status != "Completed":
 			d.age = date_diff(today(), start_date)
 
 		if filters.get("age") <= d.age:
@@ -50,6 +63,7 @@
 
 	return res
 
+
 def get_chart_data(data, filters):
 	if filters.get("charts_based_on") == "Status":
 		return get_chart_based_on_status(data)
@@ -58,6 +72,7 @@
 	else:
 		return get_chart_based_on_qty(data, filters)
 
+
 def get_chart_based_on_status(data):
 	labels = frappe.get_meta("Work Order").get_options("status").split("\n")
 	if "" in labels:
@@ -71,25 +86,18 @@
 	values = [status_wise_data[label] for label in labels]
 
 	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': [{'name':'Qty Wise Chart', 'values': values}]
-		},
+		"data": {"labels": labels, "datasets": [{"name": "Qty Wise Chart", "values": values}]},
 		"type": "donut",
-		"height": 300
+		"height": 300,
 	}
 
 	return chart
 
+
 def get_chart_based_on_age(data):
 	labels = ["0-30 Days", "30-60 Days", "60-90 Days", "90 Above"]
 
-	age_wise_data = {
-		"0-30 Days": 0,
-		"30-60 Days": 0,
-		"60-90 Days": 0,
-		"90 Above": 0
-	}
+	age_wise_data = {"0-30 Days": 0, "30-60 Days": 0, "60-90 Days": 0, "90 Above": 0}
 
 	for d in data:
 		if d.age > 0 and d.age <= 30:
@@ -101,20 +109,22 @@
 		else:
 			age_wise_data["90 Above"] += 1
 
-	values = [age_wise_data["0-30 Days"], age_wise_data["30-60 Days"],
-		age_wise_data["60-90 Days"], age_wise_data["90 Above"]]
+	values = [
+		age_wise_data["0-30 Days"],
+		age_wise_data["30-60 Days"],
+		age_wise_data["60-90 Days"],
+		age_wise_data["90 Above"],
+	]
 
 	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': [{'name':'Qty Wise Chart', 'values': values}]
-		},
+		"data": {"labels": labels, "datasets": [{"name": "Qty Wise Chart", "values": values}]},
 		"type": "donut",
-		"height": 300
+		"height": 300,
 	}
 
 	return chart
 
+
 def get_chart_based_on_qty(data, filters):
 	labels, periodic_data = prepare_chart_data(data, filters)
 
@@ -129,25 +139,18 @@
 	datasets.append({"name": "Completed", "values": completed})
 
 	chart = {
-		"data": {
-			'labels': labels,
-			'datasets': datasets
-		},
+		"data": {"labels": labels, "datasets": datasets},
 		"type": "bar",
-		"barOptions": {
-			"stacked": 1
-		}
+		"barOptions": {"stacked": 1},
 	}
 
 	return chart
 
+
 def prepare_chart_data(data, filters):
 	labels = []
 
-	periodic_data = {
-		"Pending": {},
-		"Completed": {}
-	}
+	periodic_data = {"Pending": {}, "Completed": {}}
 
 	filters.range = "Monthly"
 
@@ -165,11 +168,12 @@
 
 		for d in data:
 			if getdate(d.planned_start_date) >= from_date and getdate(d.planned_start_date) <= end_date:
-				periodic_data["Pending"][period] += (flt(d.qty) - flt(d.produced_qty))
+				periodic_data["Pending"][period] += flt(d.qty) - flt(d.produced_qty)
 				periodic_data["Completed"][period] += flt(d.produced_qty)
 
 	return labels, periodic_data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -177,90 +181,77 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Work Order",
-			"width": 100
+			"width": 100,
 		},
 	]
 
 	if not filters.get("status"):
 		columns.append(
-			{
-				"label": _("Status"),
-				"fieldname": "status",
-				"width": 100
-			},
+			{"label": _("Status"), "fieldname": "status", "width": 100},
 		)
 
-	columns.extend([
-		{
-			"label": _("Production Item"),
-			"fieldname": "production_item",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 130
-		},
-		{
-			"label": _("Produce Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 110
-		},
-		{
-			"label": _("Produced Qty"),
-			"fieldname": "produced_qty",
-			"fieldtype": "Float",
-			"width": 110
-		},
-		{
-			"label": _("Sales Order"),
-			"fieldname": "sales_order",
-			"fieldtype": "Link",
-			"options": "Sales Order",
-			"width": 90
-		},
-		{
-			"label": _("Planned Start Date"),
-			"fieldname": "planned_start_date",
-			"fieldtype": "Date",
-			"width": 150
-		},
-		{
-			"label": _("Planned End Date"),
-			"fieldname": "planned_end_date",
-			"fieldtype": "Date",
-			"width": 150
-		}
-	])
-
-	if filters.get("status") != 'Not Started':
-		columns.extend([
+	columns.extend(
+		[
 			{
-				"label": _("Actual Start Date"),
-				"fieldname": "actual_start_date",
+				"label": _("Production Item"),
+				"fieldname": "production_item",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 130,
+			},
+			{"label": _("Produce Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 110},
+			{"label": _("Produced Qty"), "fieldname": "produced_qty", "fieldtype": "Float", "width": 110},
+			{
+				"label": _("Sales Order"),
+				"fieldname": "sales_order",
+				"fieldtype": "Link",
+				"options": "Sales Order",
+				"width": 90,
+			},
+			{
+				"label": _("Planned Start Date"),
+				"fieldname": "planned_start_date",
 				"fieldtype": "Date",
-				"width": 100
+				"width": 150,
 			},
 			{
-				"label": _("Actual End Date"),
-				"fieldname": "actual_end_date",
+				"label": _("Planned End Date"),
+				"fieldname": "planned_end_date",
 				"fieldtype": "Date",
-				"width": 100
+				"width": 150,
 			},
-			{
-				"label": _("Age"),
-				"fieldname": "age",
-				"fieldtype": "Float",
-				"width": 110
-			},
-		])
+		]
+	)
 
-	if filters.get("status") == 'Completed':
-		columns.extend([
-			{
-				"label": _("Lead Time (in mins)"),
-				"fieldname": "lead_time",
-				"fieldtype": "Float",
-				"width": 110
-			},
-		])
+	if filters.get("status") != "Not Started":
+		columns.extend(
+			[
+				{
+					"label": _("Actual Start Date"),
+					"fieldname": "actual_start_date",
+					"fieldtype": "Date",
+					"width": 100,
+				},
+				{
+					"label": _("Actual End Date"),
+					"fieldname": "actual_end_date",
+					"fieldtype": "Date",
+					"width": 100,
+				},
+				{"label": _("Age"), "fieldname": "age", "fieldtype": "Float", "width": 110},
+			]
+		)
+
+	if filters.get("status") == "Completed":
+		columns.extend(
+			[
+				{
+					"label": _("Lead Time (in mins)"),
+					"fieldname": "lead_time",
+					"fieldtype": "Float",
+					"width": 110,
+				},
+			]
+		)
 
 	return columns
diff --git a/erpnext/patches/v10_0/add_default_cash_flow_mappers.py b/erpnext/patches/v10_0/add_default_cash_flow_mappers.py
index 165ca02..5493258 100644
--- a/erpnext/patches/v10_0/add_default_cash_flow_mappers.py
+++ b/erpnext/patches/v10_0/add_default_cash_flow_mappers.py
@@ -8,8 +8,8 @@
 
 
 def execute():
-    frappe.reload_doc('accounts', 'doctype', frappe.scrub('Cash Flow Mapping'))
-    frappe.reload_doc('accounts', 'doctype', frappe.scrub('Cash Flow Mapper'))
-    frappe.reload_doc('accounts', 'doctype', frappe.scrub('Cash Flow Mapping Template Details'))
+	frappe.reload_doc("accounts", "doctype", frappe.scrub("Cash Flow Mapping"))
+	frappe.reload_doc("accounts", "doctype", frappe.scrub("Cash Flow Mapper"))
+	frappe.reload_doc("accounts", "doctype", frappe.scrub("Cash Flow Mapping Template Details"))
 
-    create_default_cash_flow_mapper_templates()
+	create_default_cash_flow_mapper_templates()
diff --git a/erpnext/patches/v10_0/fichier_des_ecritures_comptables_for_france.py b/erpnext/patches/v10_0/fichier_des_ecritures_comptables_for_france.py
index cdf5ba2..4449729 100644
--- a/erpnext/patches/v10_0/fichier_des_ecritures_comptables_for_france.py
+++ b/erpnext/patches/v10_0/fichier_des_ecritures_comptables_for_france.py
@@ -8,6 +8,6 @@
 
 
 def execute():
-	frappe.reload_doc('regional', 'report', 'fichier_des_ecritures_comptables_[fec]')
-	for d in frappe.get_all('Company', filters = {'country': 'France'}):
+	frappe.reload_doc("regional", "report", "fichier_des_ecritures_comptables_[fec]")
+	for d in frappe.get_all("Company", filters={"country": "France"}):
 		install_country_fixtures(d.name)
diff --git a/erpnext/patches/v10_0/item_barcode_childtable_migrate.py b/erpnext/patches/v10_0/item_barcode_childtable_migrate.py
index ffff95d..e2d0943 100644
--- a/erpnext/patches/v10_0/item_barcode_childtable_migrate.py
+++ b/erpnext/patches/v10_0/item_barcode_childtable_migrate.py
@@ -7,26 +7,30 @@
 
 def execute():
 	frappe.reload_doc("stock", "doctype", "item_barcode")
-	if frappe.get_all("Item Barcode", limit=1): return
-	if "barcode" not in frappe.db.get_table_columns("Item"): return
+	if frappe.get_all("Item Barcode", limit=1):
+		return
+	if "barcode" not in frappe.db.get_table_columns("Item"):
+		return
 
-	items_barcode = frappe.db.sql("select name, barcode from tabItem where barcode is not null", as_dict=True)
+	items_barcode = frappe.db.sql(
+		"select name, barcode from tabItem where barcode is not null", as_dict=True
+	)
 	frappe.reload_doc("stock", "doctype", "item")
 
-
-
 	for item in items_barcode:
 		barcode = item.barcode.strip()
 
-		if barcode and '<' not in barcode:
+		if barcode and "<" not in barcode:
 			try:
-				frappe.get_doc({
-					'idx': 0,
-					'doctype': 'Item Barcode',
-					'barcode': barcode,
-					'parenttype': 'Item',
-					'parent': item.name,
-					'parentfield': 'barcodes'
-				}).insert()
+				frappe.get_doc(
+					{
+						"idx": 0,
+						"doctype": "Item Barcode",
+						"barcode": barcode,
+						"parenttype": "Item",
+						"parent": item.name,
+						"parentfield": "barcodes",
+					}
+				).insert()
 			except (frappe.DuplicateEntryError, frappe.UniqueValidationError):
 				continue
diff --git a/erpnext/patches/v10_0/migrate_daily_work_summary_settings_to_daily_work_summary_group.py b/erpnext/patches/v10_0/migrate_daily_work_summary_settings_to_daily_work_summary_group.py
index fd51184..2cbbe05 100644
--- a/erpnext/patches/v10_0/migrate_daily_work_summary_settings_to_daily_work_summary_group.py
+++ b/erpnext/patches/v10_0/migrate_daily_work_summary_settings_to_daily_work_summary_group.py
@@ -6,13 +6,13 @@
 
 
 def execute():
-	if not frappe.db.table_exists('Daily Work Summary Group'):
+	if not frappe.db.table_exists("Daily Work Summary Group"):
 		frappe.reload_doc("hr", "doctype", "daily_work_summary_group")
 		frappe.reload_doc("hr", "doctype", "daily_work_summary_group_user")
 
 		# check if Daily Work Summary Settings Company table exists
 		try:
-			frappe.db.sql('DESC `tabDaily Work Summary Settings Company`')
+			frappe.db.sql("DESC `tabDaily Work Summary Settings Company`")
 		except Exception:
 			return
 
@@ -20,19 +20,24 @@
 		previous_setting = get_previous_setting()
 		if previous_setting["companies"]:
 			for d in previous_setting["companies"]:
-				users = frappe.get_list("Employee", dict(
-					company=d.company, user_id=("!=", " ")), "user_id as user")
-				if(len(users)):
+				users = frappe.get_list(
+					"Employee", dict(company=d.company, user_id=("!=", " ")), "user_id as user"
+				)
+				if len(users):
 					# create new group entry for each company entry
-					new_group = frappe.get_doc(dict(doctype="Daily Work Summary Group",
-						name="Daily Work Summary for " + d.company,
-						users=users,
-						send_emails_at=d.send_emails_at,
-						subject=previous_setting["subject"],
-						message=previous_setting["message"]))
+					new_group = frappe.get_doc(
+						dict(
+							doctype="Daily Work Summary Group",
+							name="Daily Work Summary for " + d.company,
+							users=users,
+							send_emails_at=d.send_emails_at,
+							subject=previous_setting["subject"],
+							message=previous_setting["message"],
+						)
+					)
 					new_group.flags.ignore_permissions = True
 					new_group.flags.ignore_validate = True
-					new_group.insert(ignore_if_duplicate = True)
+					new_group.insert(ignore_if_duplicate=True)
 
 	frappe.delete_doc("DocType", "Daily Work Summary Settings")
 	frappe.delete_doc("DocType", "Daily Work Summary Settings Company")
@@ -41,11 +46,13 @@
 def get_previous_setting():
 	obj = {}
 	setting_data = frappe.db.sql(
-		"select field, value from tabSingles where doctype='Daily Work Summary Settings'")
+		"select field, value from tabSingles where doctype='Daily Work Summary Settings'"
+	)
 	for field, value in setting_data:
 		obj[field] = value
 	obj["companies"] = get_setting_companies()
 	return obj
 
+
 def get_setting_companies():
 	return frappe.db.sql("select * from `tabDaily Work Summary Settings Company`", as_dict=True)
diff --git a/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py b/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py
index 525d1ff..1d5518f 100644
--- a/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py
+++ b/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py
@@ -10,5 +10,5 @@
 		rename_field("Pricing Rule", "price", "rate")
 
 	except Exception as e:
-		if e.args[0]!=1054:
+		if e.args[0] != 1054:
 			raise
diff --git a/erpnext/patches/v10_0/set_currency_in_pricing_rule.py b/erpnext/patches/v10_0/set_currency_in_pricing_rule.py
index 3f3d424..d68148e 100644
--- a/erpnext/patches/v10_0/set_currency_in_pricing_rule.py
+++ b/erpnext/patches/v10_0/set_currency_in_pricing_rule.py
@@ -5,8 +5,10 @@
 	frappe.reload_doctype("Pricing Rule")
 
 	currency = frappe.db.get_default("currency")
-	for doc in frappe.get_all('Pricing Rule', fields = ["company", "name"]):
+	for doc in frappe.get_all("Pricing Rule", fields=["company", "name"]):
 		if doc.company:
-			currency = frappe.get_cached_value('Company',  doc.company,  "default_currency")
+			currency = frappe.get_cached_value("Company", doc.company, "default_currency")
 
-		frappe.db.sql("""update `tabPricing Rule` set currency = %s where name = %s""",(currency, doc.name))
+		frappe.db.sql(
+			"""update `tabPricing Rule` set currency = %s where name = %s""", (currency, doc.name)
+		)
diff --git a/erpnext/patches/v10_0/update_translatable_fields.py b/erpnext/patches/v10_0/update_translatable_fields.py
index 471f537..61b4ba5 100644
--- a/erpnext/patches/v10_0/update_translatable_fields.py
+++ b/erpnext/patches/v10_0/update_translatable_fields.py
@@ -2,37 +2,38 @@
 
 
 def execute():
-	'''
+	"""
 	Enable translatable in these fields
 	- Customer Name
 	- Supplier Name
 	- Contact Name
 	- Item Name/ Description
 	- Address
-	'''
+	"""
 
-	frappe.reload_doc('core', 'doctype', 'docfield')
-	frappe.reload_doc('custom', 'doctype', 'custom_field')
+	frappe.reload_doc("core", "doctype", "docfield")
+	frappe.reload_doc("custom", "doctype", "custom_field")
 
 	enable_for_fields = [
-		['Customer', 'customer_name'],
-		['Supplier', 'supplier_name'],
-		['Contact', 'first_name'],
-		['Contact', 'last_name'],
-		['Item', 'item_name'],
-		['Item', 'description'],
-		['Address', 'address_line1'],
-		['Address', 'address_line2'],
+		["Customer", "customer_name"],
+		["Supplier", "supplier_name"],
+		["Contact", "first_name"],
+		["Contact", "last_name"],
+		["Item", "item_name"],
+		["Item", "description"],
+		["Address", "address_line1"],
+		["Address", "address_line2"],
 	]
 
-
 	for f in enable_for_fields:
-		frappe.get_doc({
-			'doctype': 'Property Setter',
-			'doc_type': f[0],
-			'doctype_or_field': 'DocField',
-			'field_name': f[1],
-			'property': 'translatable',
-			'propery_type': 'Check',
-			'value': 1
-		}).db_insert()
+		frappe.get_doc(
+			{
+				"doctype": "Property Setter",
+				"doc_type": f[0],
+				"doctype_or_field": "DocField",
+				"field_name": f[1],
+				"property": "translatable",
+				"propery_type": "Check",
+				"value": 1,
+			}
+		).db_insert()
diff --git a/erpnext/patches/v10_1/transfer_subscription_to_auto_repeat.py b/erpnext/patches/v10_1/transfer_subscription_to_auto_repeat.py
index 6530b81..87151c1 100644
--- a/erpnext/patches/v10_1/transfer_subscription_to_auto_repeat.py
+++ b/erpnext/patches/v10_1/transfer_subscription_to_auto_repeat.py
@@ -3,41 +3,57 @@
 
 
 def execute():
-	frappe.reload_doc('automation', 'doctype', 'auto_repeat')
+	frappe.reload_doc("automation", "doctype", "auto_repeat")
 
 	doctypes_to_rename = {
-		'accounts': ['Journal Entry', 'Payment Entry', 'Purchase Invoice', 'Sales Invoice'],
-		'buying': ['Purchase Order', 'Supplier Quotation'],
-		'selling': ['Quotation', 'Sales Order'],
-		'stock': ['Delivery Note', 'Purchase Receipt']
+		"accounts": ["Journal Entry", "Payment Entry", "Purchase Invoice", "Sales Invoice"],
+		"buying": ["Purchase Order", "Supplier Quotation"],
+		"selling": ["Quotation", "Sales Order"],
+		"stock": ["Delivery Note", "Purchase Receipt"],
 	}
 
 	for module, doctypes in doctypes_to_rename.items():
 		for doctype in doctypes:
-			frappe.reload_doc(module, 'doctype', frappe.scrub(doctype))
+			frappe.reload_doc(module, "doctype", frappe.scrub(doctype))
 
-			if frappe.db.has_column(doctype, 'subscription'):
-				rename_field(doctype, 'subscription', 'auto_repeat')
+			if frappe.db.has_column(doctype, "subscription"):
+				rename_field(doctype, "subscription", "auto_repeat")
 
-	subscriptions = frappe.db.sql('select * from `tabSubscription`', as_dict=1)
+	subscriptions = frappe.db.sql("select * from `tabSubscription`", as_dict=1)
 
 	for doc in subscriptions:
-		doc['doctype'] = 'Auto Repeat'
+		doc["doctype"] = "Auto Repeat"
 		auto_repeat = frappe.get_doc(doc)
 		auto_repeat.db_insert()
 
-	frappe.db.sql('delete from `tabSubscription`')
+	frappe.db.sql("delete from `tabSubscription`")
 	frappe.db.commit()
 	drop_columns_from_subscription()
 
+
 def drop_columns_from_subscription():
-	fields_to_drop = {'Subscription': []}
-	for field in ['naming_series', 'reference_doctype', 'reference_document', 'start_date',
-		'end_date', 'submit_on_creation', 'disabled', 'frequency', 'repeat_on_day',
-		'next_schedule_date', 'notify_by_email', 'subject', 'recipients', 'print_format',
-		'message', 'status', 'amended_from']:
+	fields_to_drop = {"Subscription": []}
+	for field in [
+		"naming_series",
+		"reference_doctype",
+		"reference_document",
+		"start_date",
+		"end_date",
+		"submit_on_creation",
+		"disabled",
+		"frequency",
+		"repeat_on_day",
+		"next_schedule_date",
+		"notify_by_email",
+		"subject",
+		"recipients",
+		"print_format",
+		"message",
+		"status",
+		"amended_from",
+	]:
 
 		if field in frappe.db.get_table_columns("Subscription"):
-			fields_to_drop['Subscription'].append(field)
+			fields_to_drop["Subscription"].append(field)
 
 	frappe.model.delete_fields(fields_to_drop, delete=1)
diff --git a/erpnext/patches/v11_0/add_default_dispatch_notification_template.py b/erpnext/patches/v11_0/add_default_dispatch_notification_template.py
index c7771a5..48ca9b9 100644
--- a/erpnext/patches/v11_0/add_default_dispatch_notification_template.py
+++ b/erpnext/patches/v11_0/add_default_dispatch_notification_template.py
@@ -10,15 +10,19 @@
 
 	if not frappe.db.exists("Email Template", _("Dispatch Notification")):
 		base_path = frappe.get_app_path("erpnext", "stock", "doctype")
-		response = frappe.read_file(os.path.join(base_path, "delivery_trip/dispatch_notification_template.html"))
+		response = frappe.read_file(
+			os.path.join(base_path, "delivery_trip/dispatch_notification_template.html")
+		)
 
-		frappe.get_doc({
-			"doctype": "Email Template",
-			"name": _("Dispatch Notification"),
-			"response": response,
-			"subject": _("Your order is out for delivery!"),
-			"owner": frappe.session.user,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Dispatch Notification"),
+				"response": response,
+				"subject": _("Your order is out for delivery!"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 
 	delivery_settings = frappe.get_doc("Delivery Settings")
 	delivery_settings.dispatch_template = _("Dispatch Notification")
diff --git a/erpnext/patches/v11_0/add_default_email_template_for_leave.py b/erpnext/patches/v11_0/add_default_email_template_for_leave.py
index fdf3046..1fddc7f 100644
--- a/erpnext/patches/v11_0/add_default_email_template_for_leave.py
+++ b/erpnext/patches/v11_0/add_default_email_template_for_leave.py
@@ -7,25 +7,32 @@
 def execute():
 	frappe.reload_doc("email", "doctype", "email_template")
 
-	if not frappe.db.exists("Email Template", _('Leave Approval Notification')):
+	if not frappe.db.exists("Email Template", _("Leave Approval Notification")):
 		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
-		response = frappe.read_file(os.path.join(base_path, "leave_application/leave_application_email_template.html"))
-		frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _("Leave Approval Notification"),
-			'response': response,
-			'subject': _("Leave Approval Notification"),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		response = frappe.read_file(
+			os.path.join(base_path, "leave_application/leave_application_email_template.html")
+		)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Leave Approval Notification"),
+				"response": response,
+				"subject": _("Leave Approval Notification"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 
-
-	if not frappe.db.exists("Email Template", _('Leave Status Notification')):
+	if not frappe.db.exists("Email Template", _("Leave Status Notification")):
 		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
-		response = frappe.read_file(os.path.join(base_path, "leave_application/leave_application_email_template.html"))
-		frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _("Leave Status Notification"),
-			'response': response,
-			'subject': _("Leave Status Notification"),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		response = frappe.read_file(
+			os.path.join(base_path, "leave_application/leave_application_email_template.html")
+		)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Leave Status Notification"),
+				"response": response,
+				"subject": _("Leave Status Notification"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
diff --git a/erpnext/patches/v11_0/add_expense_claim_default_account.py b/erpnext/patches/v11_0/add_expense_claim_default_account.py
index f5658c5..ff39350 100644
--- a/erpnext/patches/v11_0/add_expense_claim_default_account.py
+++ b/erpnext/patches/v11_0/add_expense_claim_default_account.py
@@ -8,4 +8,9 @@
 
 	for company in companies:
 		if company.default_payable_account is not None:
-			frappe.db.set_value("Company", company.name, "default_expense_claim_payable_account", company.default_payable_account)
+			frappe.db.set_value(
+				"Company",
+				company.name,
+				"default_expense_claim_payable_account",
+				company.default_payable_account,
+			)
diff --git a/erpnext/patches/v11_0/add_index_on_nestedset_doctypes.py b/erpnext/patches/v11_0/add_index_on_nestedset_doctypes.py
index 7c99f58..f354616 100644
--- a/erpnext/patches/v11_0/add_index_on_nestedset_doctypes.py
+++ b/erpnext/patches/v11_0/add_index_on_nestedset_doctypes.py
@@ -7,6 +7,16 @@
 
 def execute():
 	frappe.reload_doc("assets", "doctype", "Location")
-	for dt in ("Account", "Cost Center", "File", "Employee", "Location", "Task", "Customer Group", "Sales Person", "Territory"):
+	for dt in (
+		"Account",
+		"Cost Center",
+		"File",
+		"Employee",
+		"Location",
+		"Task",
+		"Customer Group",
+		"Sales Person",
+		"Territory",
+	):
 		frappe.reload_doctype(dt)
 		frappe.get_doc("DocType", dt).run_module_method("on_doctype_update")
diff --git a/erpnext/patches/v11_0/add_item_group_defaults.py b/erpnext/patches/v11_0/add_item_group_defaults.py
index 026047a..4e6505a 100644
--- a/erpnext/patches/v11_0/add_item_group_defaults.py
+++ b/erpnext/patches/v11_0/add_item_group_defaults.py
@@ -6,31 +6,36 @@
 
 
 def execute():
-	'''
+	"""
 
 	Fields to move from item group to item defaults child table
 	[ default_cost_center, default_expense_account, default_income_account ]
 
-	'''
+	"""
 
-	frappe.reload_doc('stock', 'doctype', 'item_default')
-	frappe.reload_doc('setup', 'doctype', 'item_group')
+	frappe.reload_doc("stock", "doctype", "item_default")
+	frappe.reload_doc("setup", "doctype", "item_group")
 
 	companies = frappe.get_all("Company")
-	item_groups = frappe.db.sql("""select name, default_income_account, default_expense_account,\
-		default_cost_center from `tabItem Group`""", as_dict=True)
+	item_groups = frappe.db.sql(
+		"""select name, default_income_account, default_expense_account,\
+		default_cost_center from `tabItem Group`""",
+		as_dict=True,
+	)
 
 	if len(companies) == 1:
 		for item_group in item_groups:
 			doc = frappe.get_doc("Item Group", item_group.get("name"))
 			item_group_defaults = []
-			item_group_defaults.append({
-				"company": companies[0].name,
-				"income_account": item_group.get("default_income_account"),
-				"expense_account": item_group.get("default_expense_account"),
-				"buying_cost_center": item_group.get("default_cost_center"),
-				"selling_cost_center": item_group.get("default_cost_center")
-			})
+			item_group_defaults.append(
+				{
+					"company": companies[0].name,
+					"income_account": item_group.get("default_income_account"),
+					"expense_account": item_group.get("default_expense_account"),
+					"buying_cost_center": item_group.get("default_cost_center"),
+					"selling_cost_center": item_group.get("default_cost_center"),
+				}
+			)
 			doc.extend("item_group_defaults", item_group_defaults)
 			for child_doc in doc.item_group_defaults:
 				child_doc.db_insert()
@@ -38,10 +43,11 @@
 		item_group_dict = {
 			"default_expense_account": ["expense_account"],
 			"default_income_account": ["income_account"],
-			"default_cost_center": ["buying_cost_center", "selling_cost_center"]
+			"default_cost_center": ["buying_cost_center", "selling_cost_center"],
 		}
 		for item_group in item_groups:
 			item_group_defaults = []
+
 			def insert_into_item_defaults(doc_field_name, doc_field_value, company):
 				for d in item_group_defaults:
 					if d.get("company") == company:
@@ -50,18 +56,16 @@
 							d[doc_field_name[1]] = doc_field_value
 						return
 
-				item_group_defaults.append({
-					"company": company,
-					doc_field_name[0]: doc_field_value
-				})
+				item_group_defaults.append({"company": company, doc_field_name[0]: doc_field_value})
 
-				if(len(doc_field_name) > 1):
-					item_group_defaults[len(item_group_defaults)-1][doc_field_name[1]] = doc_field_value
+				if len(doc_field_name) > 1:
+					item_group_defaults[len(item_group_defaults) - 1][doc_field_name[1]] = doc_field_value
 
 			for d in [
-					["default_expense_account", "Account"], ["default_income_account", "Account"],
-					["default_cost_center", "Cost Center"]
-				]:
+				["default_expense_account", "Account"],
+				["default_income_account", "Account"],
+				["default_cost_center", "Cost Center"],
+			]:
 				if item_group.get(d[0]):
 					company = frappe.get_value(d[1], item_group.get(d[0]), "company", cache=True)
 					doc_field_name = item_group_dict.get(d[0])
diff --git a/erpnext/patches/v11_0/add_market_segments.py b/erpnext/patches/v11_0/add_market_segments.py
index 6dcbf99..d1111c2 100644
--- a/erpnext/patches/v11_0/add_market_segments.py
+++ b/erpnext/patches/v11_0/add_market_segments.py
@@ -4,8 +4,8 @@
 
 
 def execute():
-	frappe.reload_doc('crm', 'doctype', 'market_segment')
+	frappe.reload_doc("crm", "doctype", "market_segment")
 
-	frappe.local.lang = frappe.db.get_default("lang") or 'en'
+	frappe.local.lang = frappe.db.get_default("lang") or "en"
 
 	add_market_segments()
diff --git a/erpnext/patches/v11_0/add_permissions_in_gst_settings.py b/erpnext/patches/v11_0/add_permissions_in_gst_settings.py
index 9df1b58..f3429ef 100644
--- a/erpnext/patches/v11_0/add_permissions_in_gst_settings.py
+++ b/erpnext/patches/v11_0/add_permissions_in_gst_settings.py
@@ -4,7 +4,7 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
diff --git a/erpnext/patches/v11_0/add_sales_stages.py b/erpnext/patches/v11_0/add_sales_stages.py
index 064b721..0dac1e1 100644
--- a/erpnext/patches/v11_0/add_sales_stages.py
+++ b/erpnext/patches/v11_0/add_sales_stages.py
@@ -4,8 +4,8 @@
 
 
 def execute():
-	frappe.reload_doc('crm', 'doctype', 'sales_stage')
+	frappe.reload_doc("crm", "doctype", "sales_stage")
 
-	frappe.local.lang = frappe.db.get_default("lang") or 'en'
+	frappe.local.lang = frappe.db.get_default("lang") or "en"
 
 	add_sale_stages()
diff --git a/erpnext/patches/v11_0/check_buying_selling_in_currency_exchange.py b/erpnext/patches/v11_0/check_buying_selling_in_currency_exchange.py
index 5730212..d9d7981 100644
--- a/erpnext/patches/v11_0/check_buying_selling_in_currency_exchange.py
+++ b/erpnext/patches/v11_0/check_buying_selling_in_currency_exchange.py
@@ -2,5 +2,5 @@
 
 
 def execute():
-	frappe.reload_doc('setup', 'doctype', 'currency_exchange')
+	frappe.reload_doc("setup", "doctype", "currency_exchange")
 	frappe.db.sql("""update `tabCurrency Exchange` set for_buying = 1, for_selling = 1""")
diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py
index 034418c..84be2be 100644
--- a/erpnext/patches/v11_0/create_department_records_for_each_company.py
+++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py
@@ -4,11 +4,11 @@
 
 
 def execute():
-	frappe.local.lang = frappe.db.get_default("lang") or 'en'
+	frappe.local.lang = frappe.db.get_default("lang") or "en"
 
-	for doctype in ['department', 'leave_period', 'staffing_plan', 'job_opening']:
+	for doctype in ["department", "leave_period", "staffing_plan", "job_opening"]:
 		frappe.reload_doc("hr", "doctype", doctype)
-	frappe.reload_doc("Payroll", "doctype", 'payroll_entry')
+	frappe.reload_doc("Payroll", "doctype", "payroll_entry")
 
 	companies = frappe.db.get_all("Company", fields=["name", "abbr"])
 	departments = frappe.db.get_all("Department")
@@ -35,7 +35,7 @@
 			# append list of new department for each company
 			comp_dict[company.name][department.name] = copy_doc.name
 
-	rebuild_tree('Department', 'parent_department')
+	rebuild_tree("Department", "parent_department")
 	doctypes = ["Asset", "Employee", "Payroll Entry", "Staffing Plan", "Job Opening"]
 
 	for d in doctypes:
@@ -43,7 +43,8 @@
 
 	update_instructors(comp_dict)
 
-	frappe.local.lang = 'en'
+	frappe.local.lang = "en"
+
 
 def update_records(doctype, comp_dict):
 	when_then = []
@@ -51,20 +52,27 @@
 		records = comp_dict[company]
 
 		for department in records:
-			when_then.append('''
+			when_then.append(
+				"""
 				WHEN company = "%s" and department = "%s"
 				THEN "%s"
-			'''%(company, department, records[department]))
+			"""
+				% (company, department, records[department])
+			)
 
 	if not when_then:
 		return
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update
 			`tab%s`
 		set
 			department = CASE %s END
-	"""%(doctype, " ".join(when_then)))
+	"""
+		% (doctype, " ".join(when_then))
+	)
+
 
 def update_instructors(comp_dict):
 	when_then = []
@@ -74,17 +82,23 @@
 		records = comp_dict[employee.company] if employee.company else []
 
 		for department in records:
-			when_then.append('''
+			when_then.append(
+				"""
 				WHEN employee = "%s" and department = "%s"
 				THEN "%s"
-			'''%(employee.name, department, records[department]))
+			"""
+				% (employee.name, department, records[department])
+			)
 
 	if not when_then:
 		return
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update
 			`tabInstructor`
 		set
 			department = CASE %s END
-	"""%(" ".join(when_then)))
+	"""
+		% (" ".join(when_then))
+	)
diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py
index 823eca1..b81e867 100644
--- a/erpnext/patches/v11_0/create_salary_structure_assignments.py
+++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py
@@ -13,48 +13,62 @@
 
 
 def execute():
-	frappe.reload_doc('Payroll', 'doctype', 'Salary Structure')
+	frappe.reload_doc("Payroll", "doctype", "Salary Structure")
 	frappe.reload_doc("Payroll", "doctype", "Salary Structure Assignment")
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		delete from `tabSalary Structure Assignment`
 		where salary_structure in (select name from `tabSalary Structure` where is_active='No' or docstatus!=1)
-	""")
-	if frappe.db.table_exists('Salary Structure Employee'):
-		ss_details = frappe.db.sql("""
+	"""
+	)
+	if frappe.db.table_exists("Salary Structure Employee"):
+		ss_details = frappe.db.sql(
+			"""
 			select sse.employee, sse.employee_name, sse.from_date, sse.to_date,
 				sse.base, sse.variable, sse.parent as salary_structure, ss.company
 			from `tabSalary Structure Employee` sse, `tabSalary Structure` ss
 			where ss.name = sse.parent AND ss.is_active='Yes'
-			AND sse.employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')""", as_dict=1)
+			AND sse.employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')""",
+			as_dict=1,
+		)
 	else:
 		cols = ""
 		if "base" in frappe.db.get_table_columns("Salary Structure"):
 			cols = ", base, variable"
 
-		ss_details = frappe.db.sql("""
+		ss_details = frappe.db.sql(
+			"""
 			select name as salary_structure, employee, employee_name, from_date, to_date, company {0}
 			from `tabSalary Structure`
 			where is_active='Yes'
 			AND employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')
-		""".format(cols), as_dict=1)
+		""".format(
+				cols
+			),
+			as_dict=1,
+		)
 
 	all_companies = frappe.db.get_all("Company", fields=["name", "default_currency"])
 	for d in all_companies:
 		company = d.name
 		company_currency = d.default_currency
 
-		frappe.db.sql("""update `tabSalary Structure` set currency = %s where company=%s""", (company_currency, company))
+		frappe.db.sql(
+			"""update `tabSalary Structure` set currency = %s where company=%s""",
+			(company_currency, company),
+		)
 
 	for d in ss_details:
 		try:
-			joining_date, relieving_date = frappe.db.get_value("Employee", d.employee,
-				["date_of_joining", "relieving_date"])
+			joining_date, relieving_date = frappe.db.get_value(
+				"Employee", d.employee, ["date_of_joining", "relieving_date"]
+			)
 			from_date = d.from_date
 			if joining_date and getdate(from_date) < joining_date:
 				from_date = joining_date
 			elif relieving_date and getdate(from_date) > relieving_date:
 				continue
-			company_currency = frappe.db.get_value('Company', d.company, 'default_currency')
+			company_currency = frappe.db.get_value("Company", d.company, "default_currency")
 
 			s = frappe.new_doc("Salary Structure Assignment")
 			s.employee = d.employee
diff --git a/erpnext/patches/v11_0/drop_column_max_days_allowed.py b/erpnext/patches/v11_0/drop_column_max_days_allowed.py
index f0803cb..4b4770d 100644
--- a/erpnext/patches/v11_0/drop_column_max_days_allowed.py
+++ b/erpnext/patches/v11_0/drop_column_max_days_allowed.py
@@ -3,5 +3,5 @@
 
 def execute():
 	if frappe.db.exists("DocType", "Leave Type"):
-		if 'max_days_allowed' in frappe.db.get_table_columns("Leave Type"):
+		if "max_days_allowed" in frappe.db.get_table_columns("Leave Type"):
 			frappe.db.sql("alter table `tabLeave Type` drop column max_days_allowed")
diff --git a/erpnext/patches/v11_0/ewaybill_fields_gst_india.py b/erpnext/patches/v11_0/ewaybill_fields_gst_india.py
index 5974e27..7a06d52 100644
--- a/erpnext/patches/v11_0/ewaybill_fields_gst_india.py
+++ b/erpnext/patches/v11_0/ewaybill_fields_gst_india.py
@@ -4,8 +4,8 @@
 
 
 def execute():
-    company = frappe.get_all('Company', filters = {'country': 'India'})
-    if not company:
-        return
+	company = frappe.get_all("Company", filters={"country": "India"})
+	if not company:
+		return
 
-    make_custom_fields()
+	make_custom_fields()
diff --git a/erpnext/patches/v11_0/hr_ux_cleanups.py b/erpnext/patches/v11_0/hr_ux_cleanups.py
index 43c8504..0749bfc 100644
--- a/erpnext/patches/v11_0/hr_ux_cleanups.py
+++ b/erpnext/patches/v11_0/hr_ux_cleanups.py
@@ -2,11 +2,11 @@
 
 
 def execute():
-	frappe.reload_doctype('Employee')
-	frappe.db.sql('update tabEmployee set first_name = employee_name')
+	frappe.reload_doctype("Employee")
+	frappe.db.sql("update tabEmployee set first_name = employee_name")
 
 	# update holiday list
-	frappe.reload_doctype('Holiday List')
-	for holiday_list in frappe.get_all('Holiday List'):
-		holiday_list = frappe.get_doc('Holiday List', holiday_list.name)
-		holiday_list.db_set('total_holidays', len(holiday_list.holidays), update_modified = False)
+	frappe.reload_doctype("Holiday List")
+	for holiday_list in frappe.get_all("Holiday List"):
+		holiday_list = frappe.get_doc("Holiday List", holiday_list.name)
+		holiday_list.db_set("total_holidays", len(holiday_list.holidays), update_modified=False)
diff --git a/erpnext/patches/v11_0/inter_state_field_for_gst.py b/erpnext/patches/v11_0/inter_state_field_for_gst.py
index a1f1594..b851029 100644
--- a/erpnext/patches/v11_0/inter_state_field_for_gst.py
+++ b/erpnext/patches/v11_0/inter_state_field_for_gst.py
@@ -4,7 +4,7 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 	frappe.reload_doc("Payroll", "doctype", "Employee Tax Exemption Declaration")
@@ -28,38 +28,64 @@
 	frappe.reload_doc("accounts", "doctype", "purchase_taxes_and_charges_template")
 
 	# set is_inter_state in Taxes And Charges Templates
-	if frappe.db.has_column("Sales Taxes and Charges Template", "is_inter_state") and\
-		frappe.db.has_column("Purchase Taxes and Charges Template", "is_inter_state"):
+	if frappe.db.has_column(
+		"Sales Taxes and Charges Template", "is_inter_state"
+	) and frappe.db.has_column("Purchase Taxes and Charges Template", "is_inter_state"):
 
-		igst_accounts = set(frappe.db.sql_list('''SELECT igst_account from `tabGST Account` WHERE parent = "GST Settings"'''))
-		cgst_accounts = set(frappe.db.sql_list('''SELECT cgst_account FROM `tabGST Account` WHERE parenttype = "GST Settings"'''))
+		igst_accounts = set(
+			frappe.db.sql_list(
+				'''SELECT igst_account from `tabGST Account` WHERE parent = "GST Settings"'''
+			)
+		)
+		cgst_accounts = set(
+			frappe.db.sql_list(
+				'''SELECT cgst_account FROM `tabGST Account` WHERE parenttype = "GST Settings"'''
+			)
+		)
 
 		when_then_sales = get_formatted_data("Sales Taxes and Charges", igst_accounts, cgst_accounts)
-		when_then_purchase = get_formatted_data("Purchase Taxes and Charges", igst_accounts, cgst_accounts)
+		when_then_purchase = get_formatted_data(
+			"Purchase Taxes and Charges", igst_accounts, cgst_accounts
+		)
 
 		if when_then_sales:
-			frappe.db.sql('''update `tabSales Taxes and Charges Template`
+			frappe.db.sql(
+				"""update `tabSales Taxes and Charges Template`
 				set is_inter_state = Case {when_then} Else 0 End
-			'''.format(when_then=" ".join(when_then_sales)))
+			""".format(
+					when_then=" ".join(when_then_sales)
+				)
+			)
 
 		if when_then_purchase:
-			frappe.db.sql('''update `tabPurchase Taxes and Charges Template`
+			frappe.db.sql(
+				"""update `tabPurchase Taxes and Charges Template`
 				set is_inter_state = Case {when_then} Else 0 End
-			'''.format(when_then=" ".join(when_then_purchase)))
+			""".format(
+					when_then=" ".join(when_then_purchase)
+				)
+			)
+
 
 def get_formatted_data(doctype, igst_accounts, cgst_accounts):
 	# fetch all the rows data from child table
-	all_details = frappe.db.sql('''
+	all_details = frappe.db.sql(
+		'''
 		select parent, account_head from `tab{doctype}`
-		where parenttype="{doctype} Template"'''.format(doctype=doctype), as_dict=True)
+		where parenttype="{doctype} Template"'''.format(
+			doctype=doctype
+		),
+		as_dict=True,
+	)
 
 	# group the data in the form "parent: [list of accounts]""
 	group_detail = {}
 	for i in all_details:
-		if  not i['parent'] in group_detail: group_detail[i['parent']] = []
+		if not i["parent"] in group_detail:
+			group_detail[i["parent"]] = []
 		for j in all_details:
-			if i['parent']==j['parent']:
-				group_detail[i['parent']].append(j['account_head'])
+			if i["parent"] == j["parent"]:
+				group_detail[i["parent"]].append(j["account_head"])
 
 	# form when_then condition based on - if list of accounts for a document
 	# matches any account in igst_accounts list and not matches any in cgst_accounts list
@@ -67,6 +93,6 @@
 	for i in group_detail:
 		temp = set(group_detail[i])
 		if not temp.isdisjoint(igst_accounts) and temp.isdisjoint(cgst_accounts):
-			when_then.append('''When name='{name}' Then 1'''.format(name=i))
+			when_then.append("""When name='{name}' Then 1""".format(name=i))
 
 	return when_then
diff --git a/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py b/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py
index cd3869b..2131456 100644
--- a/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py
+++ b/erpnext/patches/v11_0/make_asset_finance_book_against_old_entries.py
@@ -6,40 +6,50 @@
 
 
 def execute():
-	frappe.reload_doc('assets', 'doctype', 'asset_finance_book')
-	frappe.reload_doc('assets', 'doctype', 'depreciation_schedule')
-	frappe.reload_doc('assets', 'doctype', 'asset_category')
-	frappe.reload_doc('assets', 'doctype', 'asset')
-	frappe.reload_doc('assets', 'doctype', 'asset_movement')
-	frappe.reload_doc('assets', 'doctype', 'asset_category_account')
+	frappe.reload_doc("assets", "doctype", "asset_finance_book")
+	frappe.reload_doc("assets", "doctype", "depreciation_schedule")
+	frappe.reload_doc("assets", "doctype", "asset_category")
+	frappe.reload_doc("assets", "doctype", "asset")
+	frappe.reload_doc("assets", "doctype", "asset_movement")
+	frappe.reload_doc("assets", "doctype", "asset_category_account")
 
 	if frappe.db.has_column("Asset", "warehouse"):
-		frappe.db.sql(""" update `tabAsset` ast, `tabWarehouse` wh
-			set ast.location = wh.warehouse_name where ast.warehouse = wh.name""")
+		frappe.db.sql(
+			""" update `tabAsset` ast, `tabWarehouse` wh
+			set ast.location = wh.warehouse_name where ast.warehouse = wh.name"""
+		)
 
-		for d in frappe.get_all('Asset'):
-			doc = frappe.get_doc('Asset', d.name)
+		for d in frappe.get_all("Asset"):
+			doc = frappe.get_doc("Asset", d.name)
 			if doc.calculate_depreciation:
-				fb = doc.append('finance_books', {
-					'depreciation_method': doc.depreciation_method,
-					'total_number_of_depreciations': doc.total_number_of_depreciations,
-					'frequency_of_depreciation': doc.frequency_of_depreciation,
-					'depreciation_start_date': doc.next_depreciation_date,
-					'expected_value_after_useful_life': doc.expected_value_after_useful_life,
-					'value_after_depreciation': doc.value_after_depreciation
-				})
+				fb = doc.append(
+					"finance_books",
+					{
+						"depreciation_method": doc.depreciation_method,
+						"total_number_of_depreciations": doc.total_number_of_depreciations,
+						"frequency_of_depreciation": doc.frequency_of_depreciation,
+						"depreciation_start_date": doc.next_depreciation_date,
+						"expected_value_after_useful_life": doc.expected_value_after_useful_life,
+						"value_after_depreciation": doc.value_after_depreciation,
+					},
+				)
 
 				fb.db_update()
 
-		frappe.db.sql(""" update `tabDepreciation Schedule` ds, `tabAsset` ast
-			set ds.depreciation_method = ast.depreciation_method, ds.finance_book_id = 1 where ds.parent = ast.name """)
+		frappe.db.sql(
+			""" update `tabDepreciation Schedule` ds, `tabAsset` ast
+			set ds.depreciation_method = ast.depreciation_method, ds.finance_book_id = 1 where ds.parent = ast.name """
+		)
 
-		for category in frappe.get_all('Asset Category'):
+		for category in frappe.get_all("Asset Category"):
 			asset_category_doc = frappe.get_doc("Asset Category", category)
-			row = asset_category_doc.append('finance_books', {
-				'depreciation_method': asset_category_doc.depreciation_method,
-				'total_number_of_depreciations': asset_category_doc.total_number_of_depreciations,
-				'frequency_of_depreciation': asset_category_doc.frequency_of_depreciation
-			})
+			row = asset_category_doc.append(
+				"finance_books",
+				{
+					"depreciation_method": asset_category_doc.depreciation_method,
+					"total_number_of_depreciations": asset_category_doc.total_number_of_depreciations,
+					"frequency_of_depreciation": asset_category_doc.frequency_of_depreciation,
+				},
+			)
 
 			row.db_update()
diff --git a/erpnext/patches/v11_0/make_italian_localization_fields.py b/erpnext/patches/v11_0/make_italian_localization_fields.py
index 8ff23a5..1b9793d 100644
--- a/erpnext/patches/v11_0/make_italian_localization_fields.py
+++ b/erpnext/patches/v11_0/make_italian_localization_fields.py
@@ -9,11 +9,11 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Italy'})
+	company = frappe.get_all("Company", filters={"country": "Italy"})
 	if not company:
 		return
 
-	frappe.reload_doc('regional', 'report', 'electronic_invoice_register')
+	frappe.reload_doc("regional", "report", "electronic_invoice_register")
 	make_custom_fields()
 	setup_report()
 
@@ -25,15 +25,21 @@
 	if condition:
 		condition = "state_code = (case state {0} end),".format(condition)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE tabAddress set {condition} country_code = UPPER(ifnull((select code
 			from `tabCountry` where name = `tabAddress`.country), ''))
 			where country_code is null and state_code is null
-	""".format(condition=condition))
+	""".format(
+			condition=condition
+		)
+	)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabSales Invoice Item` si, `tabSales Order` so
 			set si.customer_po_no = so.po_no, si.customer_po_date = so.po_date
 		WHERE
 			si.sales_order = so.name and so.po_no is not null
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v11_0/make_job_card.py b/erpnext/patches/v11_0/make_job_card.py
index 120e018..d4b2089 100644
--- a/erpnext/patches/v11_0/make_job_card.py
+++ b/erpnext/patches/v11_0/make_job_card.py
@@ -8,21 +8,26 @@
 
 
 def execute():
-	frappe.reload_doc('manufacturing', 'doctype', 'work_order')
-	frappe.reload_doc('manufacturing', 'doctype', 'work_order_item')
-	frappe.reload_doc('manufacturing', 'doctype', 'job_card')
-	frappe.reload_doc('manufacturing', 'doctype', 'job_card_item')
+	frappe.reload_doc("manufacturing", "doctype", "work_order")
+	frappe.reload_doc("manufacturing", "doctype", "work_order_item")
+	frappe.reload_doc("manufacturing", "doctype", "job_card")
+	frappe.reload_doc("manufacturing", "doctype", "job_card_item")
 
-	fieldname = frappe.db.get_value('DocField', {'fieldname': 'work_order', 'parent': 'Timesheet'}, 'fieldname')
+	fieldname = frappe.db.get_value(
+		"DocField", {"fieldname": "work_order", "parent": "Timesheet"}, "fieldname"
+	)
 	if not fieldname:
-		fieldname = frappe.db.get_value('DocField', {'fieldname': 'production_order', 'parent': 'Timesheet'}, 'fieldname')
-		if not fieldname: return
+		fieldname = frappe.db.get_value(
+			"DocField", {"fieldname": "production_order", "parent": "Timesheet"}, "fieldname"
+		)
+		if not fieldname:
+			return
 
-	for d in frappe.get_all('Timesheet',
-		filters={fieldname: ['!=', ""], 'docstatus': 0},
-		fields=[fieldname, 'name']):
+	for d in frappe.get_all(
+		"Timesheet", filters={fieldname: ["!=", ""], "docstatus": 0}, fields=[fieldname, "name"]
+	):
 		if d[fieldname]:
-			doc = frappe.get_doc('Work Order', d[fieldname])
+			doc = frappe.get_doc("Work Order", d[fieldname])
 			for row in doc.operations:
 				create_job_card(doc, row, auto_create=True)
-			frappe.delete_doc('Timesheet', d.name)
+			frappe.delete_doc("Timesheet", d.name)
diff --git a/erpnext/patches/v11_0/make_location_from_warehouse.py b/erpnext/patches/v11_0/make_location_from_warehouse.py
index ef6262b..c863bb7 100644
--- a/erpnext/patches/v11_0/make_location_from_warehouse.py
+++ b/erpnext/patches/v11_0/make_location_from_warehouse.py
@@ -7,14 +7,16 @@
 
 
 def execute():
-	if not frappe.db.get_value('Asset', {'docstatus': ('<', 2) }, 'name'): return
-	frappe.reload_doc('assets', 'doctype', 'location')
-	frappe.reload_doc('stock', 'doctype', 'warehouse')
+	if not frappe.db.get_value("Asset", {"docstatus": ("<", 2)}, "name"):
+		return
+	frappe.reload_doc("assets", "doctype", "location")
+	frappe.reload_doc("stock", "doctype", "warehouse")
 
-	for d in frappe.get_all('Warehouse',
-		fields = ['warehouse_name', 'is_group', 'parent_warehouse'], order_by="lft asc"):
+	for d in frappe.get_all(
+		"Warehouse", fields=["warehouse_name", "is_group", "parent_warehouse"], order_by="lft asc"
+	):
 		try:
-			loc = frappe.new_doc('Location')
+			loc = frappe.new_doc("Location")
 			loc.location_name = d.warehouse_name
 			loc.is_group = d.is_group
 			loc.flags.ignore_mandatory = True
@@ -27,5 +29,6 @@
 
 	rebuild_tree("Location", "parent_location")
 
+
 def get_parent_warehouse_name(warehouse):
-	return frappe.db.get_value('Warehouse', warehouse, 'warehouse_name')
+	return frappe.db.get_value("Warehouse", warehouse, "warehouse_name")
diff --git a/erpnext/patches/v11_0/make_quality_inspection_template.py b/erpnext/patches/v11_0/make_quality_inspection_template.py
index 58c9fb9..deebfa8 100644
--- a/erpnext/patches/v11_0/make_quality_inspection_template.py
+++ b/erpnext/patches/v11_0/make_quality_inspection_template.py
@@ -6,21 +6,29 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'quality_inspection_template')
-	frappe.reload_doc('stock', 'doctype', 'item')
+	frappe.reload_doc("stock", "doctype", "quality_inspection_template")
+	frappe.reload_doc("stock", "doctype", "item")
 
-	for data in frappe.get_all('Item Quality Inspection Parameter',
-		fields = ["distinct parent"], filters = {'parenttype': 'Item'}):
+	for data in frappe.get_all(
+		"Item Quality Inspection Parameter", fields=["distinct parent"], filters={"parenttype": "Item"}
+	):
 		qc_doc = frappe.new_doc("Quality Inspection Template")
-		qc_doc.quality_inspection_template_name = 'QIT/%s' % data.parent
+		qc_doc.quality_inspection_template_name = "QIT/%s" % data.parent
 		qc_doc.flags.ignore_mandatory = True
 		qc_doc.save(ignore_permissions=True)
 
-		frappe.db.set_value('Item', data.parent, "quality_inspection_template", qc_doc.name, update_modified=False)
-		frappe.db.sql(""" update `tabItem Quality Inspection Parameter`
+		frappe.db.set_value(
+			"Item", data.parent, "quality_inspection_template", qc_doc.name, update_modified=False
+		)
+		frappe.db.sql(
+			""" update `tabItem Quality Inspection Parameter`
 			set parentfield = 'item_quality_inspection_parameter', parenttype = 'Quality Inspection Template',
-			parent = %s where parenttype = 'Item' and parent = %s""", (qc_doc.name, data.parent))
+			parent = %s where parenttype = 'Item' and parent = %s""",
+			(qc_doc.name, data.parent),
+		)
 
 	# update field in item variant settings
-	frappe.db.sql(""" update `tabVariant Field` set field_name = 'quality_inspection_template'
-		where field_name = 'quality_parameters'""")
+	frappe.db.sql(
+		""" update `tabVariant Field` set field_name = 'quality_inspection_template'
+		where field_name = 'quality_parameters'"""
+	)
diff --git a/erpnext/patches/v11_0/merge_land_unit_with_location.py b/erpnext/patches/v11_0/merge_land_unit_with_location.py
index e1d0b12..c1afef6 100644
--- a/erpnext/patches/v11_0/merge_land_unit_with_location.py
+++ b/erpnext/patches/v11_0/merge_land_unit_with_location.py
@@ -8,51 +8,55 @@
 
 def execute():
 	# Rename and reload the Land Unit and Linked Land Unit doctypes
-	if frappe.db.table_exists('Land Unit') and not frappe.db.table_exists('Location'):
-		frappe.rename_doc('DocType', 'Land Unit', 'Location', force=True)
+	if frappe.db.table_exists("Land Unit") and not frappe.db.table_exists("Location"):
+		frappe.rename_doc("DocType", "Land Unit", "Location", force=True)
 
-	frappe.reload_doc('assets', 'doctype', 'location')
+	frappe.reload_doc("assets", "doctype", "location")
 
-	if frappe.db.table_exists('Linked Land Unit') and not frappe.db.table_exists('Linked Location'):
-		frappe.rename_doc('DocType', 'Linked Land Unit', 'Linked Location', force=True)
+	if frappe.db.table_exists("Linked Land Unit") and not frappe.db.table_exists("Linked Location"):
+		frappe.rename_doc("DocType", "Linked Land Unit", "Linked Location", force=True)
 
-	frappe.reload_doc('assets', 'doctype', 'linked_location')
+	frappe.reload_doc("assets", "doctype", "linked_location")
 
-	if not frappe.db.table_exists('Crop Cycle'):
-		frappe.reload_doc('agriculture', 'doctype', 'crop_cycle')
+	if not frappe.db.table_exists("Crop Cycle"):
+		frappe.reload_doc("agriculture", "doctype", "crop_cycle")
 
 	# Rename the fields in related doctypes
-	if 'linked_land_unit' in frappe.db.get_table_columns('Crop Cycle'):
-		rename_field('Crop Cycle', 'linked_land_unit', 'linked_location')
+	if "linked_land_unit" in frappe.db.get_table_columns("Crop Cycle"):
+		rename_field("Crop Cycle", "linked_land_unit", "linked_location")
 
-	if 'land_unit' in frappe.db.get_table_columns('Linked Location'):
-		rename_field('Linked Location', 'land_unit', 'location')
+	if "land_unit" in frappe.db.get_table_columns("Linked Location"):
+		rename_field("Linked Location", "land_unit", "location")
 
 	if not frappe.db.exists("Location", "All Land Units"):
-		frappe.get_doc({"doctype": "Location", "is_group": True, "location_name": "All Land Units"}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{"doctype": "Location", "is_group": True, "location_name": "All Land Units"}
+		).insert(ignore_permissions=True)
 
-	if frappe.db.table_exists('Land Unit'):
-		land_units = frappe.get_all('Land Unit', fields=['*'], order_by='lft')
+	if frappe.db.table_exists("Land Unit"):
+		land_units = frappe.get_all("Land Unit", fields=["*"], order_by="lft")
 
 		for land_unit in land_units:
-			if not frappe.db.exists('Location', land_unit.get('land_unit_name')):
-				frappe.get_doc({
-					'doctype': 'Location',
-					'location_name': land_unit.get('land_unit_name'),
-					'parent_location': land_unit.get('parent_land_unit') or "All Land Units",
-					'is_container': land_unit.get('is_container'),
-					'is_group': land_unit.get('is_group'),
-					'latitude': land_unit.get('latitude'),
-					'longitude': land_unit.get('longitude'),
-					'area': land_unit.get('area'),
-					'location': land_unit.get('location'),
-					'lft': land_unit.get('lft'),
-					'rgt': land_unit.get('rgt')
-				}).insert(ignore_permissions=True)
+			if not frappe.db.exists("Location", land_unit.get("land_unit_name")):
+				frappe.get_doc(
+					{
+						"doctype": "Location",
+						"location_name": land_unit.get("land_unit_name"),
+						"parent_location": land_unit.get("parent_land_unit") or "All Land Units",
+						"is_container": land_unit.get("is_container"),
+						"is_group": land_unit.get("is_group"),
+						"latitude": land_unit.get("latitude"),
+						"longitude": land_unit.get("longitude"),
+						"area": land_unit.get("area"),
+						"location": land_unit.get("location"),
+						"lft": land_unit.get("lft"),
+						"rgt": land_unit.get("rgt"),
+					}
+				).insert(ignore_permissions=True)
 
 	# Delete the Land Unit and Linked Land Unit doctypes
-	if frappe.db.table_exists('Land Unit'):
-		frappe.delete_doc('DocType', 'Land Unit', force=1)
+	if frappe.db.table_exists("Land Unit"):
+		frappe.delete_doc("DocType", "Land Unit", force=1)
 
-	if frappe.db.table_exists('Linked Land Unit'):
-		frappe.delete_doc('DocType', 'Linked Land Unit', force=1)
+	if frappe.db.table_exists("Linked Land Unit"):
+		frappe.delete_doc("DocType", "Linked Land Unit", force=1)
diff --git a/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py b/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py
index bfc3fbc..37c0779 100644
--- a/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py
+++ b/erpnext/patches/v11_0/move_item_defaults_to_child_table_for_multicompany.py
@@ -6,22 +6,23 @@
 
 
 def execute():
-	'''
+	"""
 
 	Fields to move from the item to item defaults child table
 	[ default_warehouse, buying_cost_center, expense_account, selling_cost_center, income_account ]
 
-	'''
-	if not frappe.db.has_column('Item', 'default_warehouse'):
+	"""
+	if not frappe.db.has_column("Item", "default_warehouse"):
 		return
 
-	frappe.reload_doc('stock', 'doctype', 'item_default')
-	frappe.reload_doc('stock', 'doctype', 'item')
+	frappe.reload_doc("stock", "doctype", "item_default")
+	frappe.reload_doc("stock", "doctype", "item")
 
 	companies = frappe.get_all("Company")
 	if len(companies) == 1 and not frappe.get_all("Item Default", limit=1):
 		try:
-			frappe.db.sql('''
+			frappe.db.sql(
+				"""
 					INSERT INTO `tabItem Default`
 						(name, parent, parenttype, parentfield, idx, company, default_warehouse,
 						buying_cost_center, selling_cost_center, expense_account, income_account, default_supplier)
@@ -30,22 +31,30 @@
 						'item_defaults' as parentfield, 1 as idx, %s as company, default_warehouse,
 						buying_cost_center, selling_cost_center, expense_account, income_account, default_supplier
 					FROM `tabItem`;
-			''', companies[0].name)
+			""",
+				companies[0].name,
+			)
 		except Exception:
 			pass
 	else:
-		item_details = frappe.db.sql(""" SELECT name, default_warehouse,
+		item_details = frappe.db.sql(
+			""" SELECT name, default_warehouse,
 				buying_cost_center, expense_account, selling_cost_center, income_account
 			FROM tabItem
 			WHERE
-				name not in (select distinct parent from `tabItem Default`) and ifnull(disabled, 0) = 0"""
-		, as_dict=1)
+				name not in (select distinct parent from `tabItem Default`) and ifnull(disabled, 0) = 0""",
+			as_dict=1,
+		)
 
 		items_default_data = {}
 		for item_data in item_details:
-			for d in [["default_warehouse", "Warehouse"], ["expense_account", "Account"],
-				["income_account", "Account"], ["buying_cost_center", "Cost Center"],
-				["selling_cost_center", "Cost Center"]]:
+			for d in [
+				["default_warehouse", "Warehouse"],
+				["expense_account", "Account"],
+				["income_account", "Account"],
+				["buying_cost_center", "Cost Center"],
+				["selling_cost_center", "Cost Center"],
+			]:
 				if item_data.get(d[0]):
 					company = frappe.get_value(d[1], item_data.get(d[0]), "company", cache=True)
 
@@ -73,25 +82,32 @@
 
 		for item_code, companywise_item_data in items_default_data.items():
 			for company, item_default_data in companywise_item_data.items():
-				to_insert_data.append((
-					frappe.generate_hash("", 10),
-					item_code,
-					'Item',
-					'item_defaults',
-					company,
-					item_default_data.get('default_warehouse'),
-					item_default_data.get('expense_account'),
-					item_default_data.get('income_account'),
-					item_default_data.get('buying_cost_center'),
-					item_default_data.get('selling_cost_center'),
-				))
+				to_insert_data.append(
+					(
+						frappe.generate_hash("", 10),
+						item_code,
+						"Item",
+						"item_defaults",
+						company,
+						item_default_data.get("default_warehouse"),
+						item_default_data.get("expense_account"),
+						item_default_data.get("income_account"),
+						item_default_data.get("buying_cost_center"),
+						item_default_data.get("selling_cost_center"),
+					)
+				)
 
 		if to_insert_data:
-			frappe.db.sql('''
+			frappe.db.sql(
+				"""
 				INSERT INTO `tabItem Default`
 				(
 					`name`, `parent`, `parenttype`, `parentfield`, `company`, `default_warehouse`,
 					`expense_account`, `income_account`, `buying_cost_center`, `selling_cost_center`
 				)
 				VALUES {}
-			'''.format(', '.join(['%s'] * len(to_insert_data))), tuple(to_insert_data))
+			""".format(
+					", ".join(["%s"] * len(to_insert_data))
+				),
+				tuple(to_insert_data),
+			)
diff --git a/erpnext/patches/v11_0/move_leave_approvers_from_employee.py b/erpnext/patches/v11_0/move_leave_approvers_from_employee.py
index 80e5ef7..f91a7db 100644
--- a/erpnext/patches/v11_0/move_leave_approvers_from_employee.py
+++ b/erpnext/patches/v11_0/move_leave_approvers_from_employee.py
@@ -7,20 +7,23 @@
 	frappe.reload_doc("hr", "doctype", "employee")
 	frappe.reload_doc("hr", "doctype", "department")
 
-	if frappe.db.has_column('Department', 'leave_approver'):
-		rename_field('Department', "leave_approver", "leave_approvers")
+	if frappe.db.has_column("Department", "leave_approver"):
+		rename_field("Department", "leave_approver", "leave_approvers")
 
-	if frappe.db.has_column('Department', 'expense_approver'):
-		rename_field('Department', "expense_approver", "expense_approvers")
+	if frappe.db.has_column("Department", "expense_approver"):
+		rename_field("Department", "expense_approver", "expense_approvers")
 
 	if not frappe.db.table_exists("Employee Leave Approver"):
 		return
 
-	approvers = frappe.db.sql("""select distinct app.leave_approver, emp.department from
+	approvers = frappe.db.sql(
+		"""select distinct app.leave_approver, emp.department from
 	`tabEmployee Leave Approver` app, `tabEmployee` emp
 		where app.parenttype = 'Employee'
 		and emp.name = app.parent
-		""", as_dict=True)
+		""",
+		as_dict=True,
+	)
 
 	for record in approvers:
 		if record.department:
@@ -28,6 +31,4 @@
 			if not department:
 				return
 			if not len(department.leave_approvers):
-				department.append("leave_approvers",{
-					"approver": record.leave_approver
-				}).db_insert()
+				department.append("leave_approvers", {"approver": record.leave_approver}).db_insert()
diff --git a/erpnext/patches/v11_0/rebuild_tree_for_company.py b/erpnext/patches/v11_0/rebuild_tree_for_company.py
index cad9c6c..fc06c5d 100644
--- a/erpnext/patches/v11_0/rebuild_tree_for_company.py
+++ b/erpnext/patches/v11_0/rebuild_tree_for_company.py
@@ -4,4 +4,4 @@
 
 def execute():
 	frappe.reload_doc("setup", "doctype", "company")
-	rebuild_tree('Company', 'parent_company')
+	rebuild_tree("Company", "parent_company")
diff --git a/erpnext/patches/v11_0/refactor_autoname_naming.py b/erpnext/patches/v11_0/refactor_autoname_naming.py
index 1c4d8f1..de453cc 100644
--- a/erpnext/patches/v11_0/refactor_autoname_naming.py
+++ b/erpnext/patches/v11_0/refactor_autoname_naming.py
@@ -6,99 +6,102 @@
 from frappe.custom.doctype.property_setter.property_setter import make_property_setter
 
 doctype_series_map = {
-	'Activity Cost': 'PROJ-ACC-.#####',
-	'Agriculture Task': 'AG-TASK-.#####',
-	'Assessment Plan': 'EDU-ASP-.YYYY.-.#####',
-	'Assessment Result': 'EDU-RES-.YYYY.-.#####',
-	'Asset Movement': 'ACC-ASM-.YYYY.-.#####',
-	'Attendance Request': 'HR-ARQ-.YY.-.MM.-.#####',
-	'Authorization Rule': 'HR-ARU-.#####',
-	'Bank Guarantee': 'ACC-BG-.YYYY.-.#####',
-	'Bin': 'MAT-BIN-.YYYY.-.#####',
-	'Certification Application': 'NPO-CAPP-.YYYY.-.#####',
-	'Certified Consultant': 'NPO-CONS-.YYYY.-.#####',
-	'Chat Room': 'CHAT-ROOM-.#####',
-	'Compensatory Leave Request': 'HR-CMP-.YY.-.MM.-.#####',
-	'Client Script': 'SYS-SCR-.#####',
-	'Employee Benefit Application': 'HR-BEN-APP-.YY.-.MM.-.#####',
-	'Employee Benefit Application Detail': '',
-	'Employee Benefit Claim': 'HR-BEN-CLM-.YY.-.MM.-.#####',
-	'Employee Incentive': 'HR-EINV-.YY.-.MM.-.#####',
-	'Employee Onboarding': 'HR-EMP-ONB-.YYYY.-.#####',
-	'Employee Onboarding Template': 'HR-EMP-ONT-.#####',
-	'Employee Promotion': 'HR-EMP-PRO-.YYYY.-.#####',
-	'Employee Separation': 'HR-EMP-SEP-.YYYY.-.#####',
-	'Employee Separation Template': 'HR-EMP-STP-.#####',
-	'Employee Tax Exemption Declaration': 'HR-TAX-DEC-.YYYY.-.#####',
-	'Employee Tax Exemption Proof Submission': 'HR-TAX-PRF-.YYYY.-.#####',
-	'Employee Transfer': 'HR-EMP-TRN-.YYYY.-.#####',
-	'Event': 'EVENT-.YYYY.-.#####',
-	'Exchange Rate Revaluation': 'ACC-ERR-.YYYY.-.#####',
-	'GL Entry': 'ACC-GLE-.YYYY.-.#####',
-	'Guardian': 'EDU-GRD-.YYYY.-.#####',
-	'Hotel Room Reservation': 'HTL-RES-.YYYY.-.#####',
-	'Item Price': '',
-	'Job Applicant': 'HR-APP-.YYYY.-.#####',
-	'Job Offer': 'HR-OFF-.YYYY.-.#####',
-	'Leave Encashment': 'HR-ENC-.YYYY.-.#####',
-	'Leave Period': 'HR-LPR-.YYYY.-.#####',
-	'Leave Policy': 'HR-LPOL-.YYYY.-.#####',
-	'Loan': 'ACC-LOAN-.YYYY.-.#####',
-	'Loan Application': 'ACC-LOAP-.YYYY.-.#####',
-	'Loyalty Point Entry': '',
-	'Membership': 'NPO-MSH-.YYYY.-.#####',
-	'Packing Slip': 'MAT-PAC-.YYYY.-.#####',
-	'Patient Appointment': 'HLC-APP-.YYYY.-.#####',
-	'Payment Terms Template Detail': '',
-	'Payroll Entry': 'HR-PRUN-.YYYY.-.#####',
-	'Period Closing Voucher': 'ACC-PCV-.YYYY.-.#####',
-	'Plant Analysis': 'AG-PLA-.YYYY.-.#####',
-	'POS Closing Entry': 'POS-CLO-.YYYY.-.#####',
-	'Prepared Report': 'SYS-PREP-.YYYY.-.#####',
-	'Program Enrollment': 'EDU-ENR-.YYYY.-.#####',
-	'Quotation Item': '',
-	'Restaurant Reservation': 'RES-RES-.YYYY.-.#####',
-	'Retention Bonus': 'HR-RTB-.YYYY.-.#####',
-	'Room': 'HTL-ROOM-.YYYY.-.#####',
-	'Salary Structure Assignment': 'HR-SSA-.YY.-.MM.-.#####',
-	'Sales Taxes and Charges': '',
-	'Share Transfer': 'ACC-SHT-.YYYY.-.#####',
-	'Shift Assignment': 'HR-SHA-.YY.-.MM.-.#####',
-	'Shift Request': 'HR-SHR-.YY.-.MM.-.#####',
-	'SMS Log': 'SYS-SMS-.#####',
-	'Soil Analysis': 'AG-ANA-.YY.-.MM.-.#####',
-	'Soil Texture': 'AG-TEX-.YYYY.-.#####',
-	'Stock Ledger Entry': 'MAT-SLE-.YYYY.-.#####',
-	'Student Leave Application': 'EDU-SLA-.YYYY.-.#####',
-	'Student Log': 'EDU-SLOG-.YYYY.-.#####',
-	'Subscription': 'ACC-SUB-.YYYY.-.#####',
-	'Task': 'TASK-.YYYY.-.#####',
-	'Tax Rule': 'ACC-TAX-RULE-.YYYY.-.#####',
-	'Training Feedback': 'HR-TRF-.YYYY.-.#####',
-	'Training Result': 'HR-TRR-.YYYY.-.#####',
-	'Travel Request': 'HR-TRQ-.YYYY.-.#####',
-	'UOM Conversion Factor': 'MAT-UOM-CNV-.#####',
-	'Water Analysis': 'HR-WAT-.YYYY.-.#####',
-	'Workflow Action': 'SYS-WACT-.#####',
+	"Activity Cost": "PROJ-ACC-.#####",
+	"Agriculture Task": "AG-TASK-.#####",
+	"Assessment Plan": "EDU-ASP-.YYYY.-.#####",
+	"Assessment Result": "EDU-RES-.YYYY.-.#####",
+	"Asset Movement": "ACC-ASM-.YYYY.-.#####",
+	"Attendance Request": "HR-ARQ-.YY.-.MM.-.#####",
+	"Authorization Rule": "HR-ARU-.#####",
+	"Bank Guarantee": "ACC-BG-.YYYY.-.#####",
+	"Bin": "MAT-BIN-.YYYY.-.#####",
+	"Certification Application": "NPO-CAPP-.YYYY.-.#####",
+	"Certified Consultant": "NPO-CONS-.YYYY.-.#####",
+	"Chat Room": "CHAT-ROOM-.#####",
+	"Compensatory Leave Request": "HR-CMP-.YY.-.MM.-.#####",
+	"Client Script": "SYS-SCR-.#####",
+	"Employee Benefit Application": "HR-BEN-APP-.YY.-.MM.-.#####",
+	"Employee Benefit Application Detail": "",
+	"Employee Benefit Claim": "HR-BEN-CLM-.YY.-.MM.-.#####",
+	"Employee Incentive": "HR-EINV-.YY.-.MM.-.#####",
+	"Employee Onboarding": "HR-EMP-ONB-.YYYY.-.#####",
+	"Employee Onboarding Template": "HR-EMP-ONT-.#####",
+	"Employee Promotion": "HR-EMP-PRO-.YYYY.-.#####",
+	"Employee Separation": "HR-EMP-SEP-.YYYY.-.#####",
+	"Employee Separation Template": "HR-EMP-STP-.#####",
+	"Employee Tax Exemption Declaration": "HR-TAX-DEC-.YYYY.-.#####",
+	"Employee Tax Exemption Proof Submission": "HR-TAX-PRF-.YYYY.-.#####",
+	"Employee Transfer": "HR-EMP-TRN-.YYYY.-.#####",
+	"Event": "EVENT-.YYYY.-.#####",
+	"Exchange Rate Revaluation": "ACC-ERR-.YYYY.-.#####",
+	"GL Entry": "ACC-GLE-.YYYY.-.#####",
+	"Guardian": "EDU-GRD-.YYYY.-.#####",
+	"Hotel Room Reservation": "HTL-RES-.YYYY.-.#####",
+	"Item Price": "",
+	"Job Applicant": "HR-APP-.YYYY.-.#####",
+	"Job Offer": "HR-OFF-.YYYY.-.#####",
+	"Leave Encashment": "HR-ENC-.YYYY.-.#####",
+	"Leave Period": "HR-LPR-.YYYY.-.#####",
+	"Leave Policy": "HR-LPOL-.YYYY.-.#####",
+	"Loan": "ACC-LOAN-.YYYY.-.#####",
+	"Loan Application": "ACC-LOAP-.YYYY.-.#####",
+	"Loyalty Point Entry": "",
+	"Membership": "NPO-MSH-.YYYY.-.#####",
+	"Packing Slip": "MAT-PAC-.YYYY.-.#####",
+	"Patient Appointment": "HLC-APP-.YYYY.-.#####",
+	"Payment Terms Template Detail": "",
+	"Payroll Entry": "HR-PRUN-.YYYY.-.#####",
+	"Period Closing Voucher": "ACC-PCV-.YYYY.-.#####",
+	"Plant Analysis": "AG-PLA-.YYYY.-.#####",
+	"POS Closing Entry": "POS-CLO-.YYYY.-.#####",
+	"Prepared Report": "SYS-PREP-.YYYY.-.#####",
+	"Program Enrollment": "EDU-ENR-.YYYY.-.#####",
+	"Quotation Item": "",
+	"Restaurant Reservation": "RES-RES-.YYYY.-.#####",
+	"Retention Bonus": "HR-RTB-.YYYY.-.#####",
+	"Room": "HTL-ROOM-.YYYY.-.#####",
+	"Salary Structure Assignment": "HR-SSA-.YY.-.MM.-.#####",
+	"Sales Taxes and Charges": "",
+	"Share Transfer": "ACC-SHT-.YYYY.-.#####",
+	"Shift Assignment": "HR-SHA-.YY.-.MM.-.#####",
+	"Shift Request": "HR-SHR-.YY.-.MM.-.#####",
+	"SMS Log": "SYS-SMS-.#####",
+	"Soil Analysis": "AG-ANA-.YY.-.MM.-.#####",
+	"Soil Texture": "AG-TEX-.YYYY.-.#####",
+	"Stock Ledger Entry": "MAT-SLE-.YYYY.-.#####",
+	"Student Leave Application": "EDU-SLA-.YYYY.-.#####",
+	"Student Log": "EDU-SLOG-.YYYY.-.#####",
+	"Subscription": "ACC-SUB-.YYYY.-.#####",
+	"Task": "TASK-.YYYY.-.#####",
+	"Tax Rule": "ACC-TAX-RULE-.YYYY.-.#####",
+	"Training Feedback": "HR-TRF-.YYYY.-.#####",
+	"Training Result": "HR-TRR-.YYYY.-.#####",
+	"Travel Request": "HR-TRQ-.YYYY.-.#####",
+	"UOM Conversion Factor": "MAT-UOM-CNV-.#####",
+	"Water Analysis": "HR-WAT-.YYYY.-.#####",
+	"Workflow Action": "SYS-WACT-.#####",
 }
 
+
 def execute():
 	series_to_set = get_series()
 	for doctype, opts in series_to_set.items():
-		set_series(doctype, opts['value'])
+		set_series(doctype, opts["value"])
+
 
 def set_series(doctype, value):
-	doc = frappe.db.exists('Property Setter', {'doc_type': doctype, 'property': 'autoname'})
+	doc = frappe.db.exists("Property Setter", {"doc_type": doctype, "property": "autoname"})
 	if doc:
-		frappe.db.set_value('Property Setter', doc, 'value', value)
+		frappe.db.set_value("Property Setter", doc, "value", value)
 	else:
-		make_property_setter(doctype, '', 'autoname', value, '', for_doctype = True)
+		make_property_setter(doctype, "", "autoname", value, "", for_doctype=True)
+
 
 def get_series():
 	series_to_set = {}
 
 	for doctype in doctype_series_map:
-		if not frappe.db.exists('DocType', doctype):
+		if not frappe.db.exists("DocType", doctype):
 			continue
 
 		if not frappe.db.a_row_exists(doctype):
@@ -110,10 +113,11 @@
 
 		# set autoname property setter
 		if series_to_preserve:
-			series_to_set[doctype] = {'value': series_to_preserve}
+			series_to_set[doctype] = {"value": series_to_preserve}
 
 	return series_to_set
 
+
 def get_series_to_preserve(doctype):
-	series_to_preserve = frappe.db.get_value('DocType', doctype, 'autoname')
+	series_to_preserve = frappe.db.get_value("DocType", doctype, "autoname")
 	return series_to_preserve
diff --git a/erpnext/patches/v11_0/refactor_naming_series.py b/erpnext/patches/v11_0/refactor_naming_series.py
index e0aa004..4945860 100644
--- a/erpnext/patches/v11_0/refactor_naming_series.py
+++ b/erpnext/patches/v11_0/refactor_naming_series.py
@@ -6,82 +6,88 @@
 from frappe.custom.doctype.property_setter.property_setter import make_property_setter
 
 doctype_series_map = {
-	'Additional Salary': 'HR-ADS-.YY.-.MM.-',
-	'Appraisal': 'HR-APR-.YY.-.MM.',
-	'Asset': 'ACC-ASS-.YYYY.-',
-	'Attendance': 'HR-ATT-.YYYY.-',
-	'Auto Repeat': 'SYS-ARP-.YYYY.-',
-	'Blanket Order': 'MFG-BLR-.YYYY.-',
-	'C-Form': 'ACC-CF-.YYYY.-',
-	'Campaign': 'SAL-CAM-.YYYY.-',
-	'Course Schedule': 'EDU-CSH-.YYYY.-',
-	'Customer': 'CUST-.YYYY.-',
-	'Delivery Note': 'MAT-DN-.YYYY.-',
-	'Delivery Trip': 'MAT-DT-.YYYY.-',
-	'Driver': 'HR-DRI-.YYYY.-',
-	'Employee': 'HR-EMP-',
-	'Employee Advance': 'HR-EAD-.YYYY.-',
-	'Expense Claim': 'HR-EXP-.YYYY.-',
-	'Fee Schedule': 'EDU-FSH-.YYYY.-',
-	'Fee Structure': 'EDU-FST-.YYYY.-',
-	'Fees': 'EDU-FEE-.YYYY.-',
-	'Installation Note': 'MAT-INS-.YYYY.-',
-	'Instructor': 'EDU-INS-.YYYY.-',
-	'Issue': 'ISS-.YYYY.-',
-	'Journal Entry': 'ACC-JV-.YYYY.-',
-	'Landed Cost Voucher': 'MAT-LCV-.YYYY.-',
-	'Lead': 'CRM-LEAD-.YYYY.-',
-	'Leave Allocation': 'HR-LAL-.YYYY.-',
-	'Leave Application': 'HR-LAP-.YYYY.-',
-	'Maintenance Schedule': 'MAT-MSH-.YYYY.-',
-	'Maintenance Visit': 'MAT-MVS-.YYYY.-',
-	'Material Request': 'MAT-MR-.YYYY.-',
-	'Member': 'NPO-MEM-.YYYY.-',
-	'Opportunity': 'CRM-OPP-.YYYY.-',
-	'Packing Slip': 'MAT-PAC-.YYYY.-',
-	'Payment Entry': 'ACC-PAY-.YYYY.-',
-	'Payment Request': 'ACC-PRQ-.YYYY.-',
-	'Production Plan': 'MFG-PP-.YYYY.-',
-	'Project Update': 'PROJ-UPD-.YYYY.-',
-	'Purchase Invoice': 'ACC-PINV-.YYYY.-',
-	'Purchase Order': 'PUR-ORD-.YYYY.-',
-	'Purchase Receipt': 'MAT-PRE-.YYYY.-',
-	'Quality Inspection': 'MAT-QA-.YYYY.-',
-	'Quotation': 'SAL-QTN-.YYYY.-',
-	'Request for Quotation': 'PUR-RFQ-.YYYY.-',
-	'Sales Invoice': 'ACC-SINV-.YYYY.-',
-	'Sales Order': 'SAL-ORD-.YYYY.-',
-	'Sample Collection': 'HLC-SC-.YYYY.-',
-	'Shareholder': 'ACC-SH-.YYYY.-',
-	'Stock Entry': 'MAT-STE-.YYYY.-',
-	'Stock Reconciliation': 'MAT-RECO-.YYYY.-',
-	'Student': 'EDU-STU-.YYYY.-',
-	'Student Applicant': 'EDU-APP-.YYYY.-',
-	'Supplier': 'SUP-.YYYY.-',
-	'Supplier Quotation': 'PUR-SQTN-.YYYY.-',
-	'Supplier Scorecard Period': 'PU-SSP-.YYYY.-',
-	'Timesheet': 'TS-.YYYY.-',
-	'Vehicle Log': 'HR-VLOG-.YYYY.-',
-	'Warranty Claim': 'SER-WRN-.YYYY.-',
-	'Work Order': 'MFG-WO-.YYYY.-'
+	"Additional Salary": "HR-ADS-.YY.-.MM.-",
+	"Appraisal": "HR-APR-.YY.-.MM.",
+	"Asset": "ACC-ASS-.YYYY.-",
+	"Attendance": "HR-ATT-.YYYY.-",
+	"Auto Repeat": "SYS-ARP-.YYYY.-",
+	"Blanket Order": "MFG-BLR-.YYYY.-",
+	"C-Form": "ACC-CF-.YYYY.-",
+	"Campaign": "SAL-CAM-.YYYY.-",
+	"Course Schedule": "EDU-CSH-.YYYY.-",
+	"Customer": "CUST-.YYYY.-",
+	"Delivery Note": "MAT-DN-.YYYY.-",
+	"Delivery Trip": "MAT-DT-.YYYY.-",
+	"Driver": "HR-DRI-.YYYY.-",
+	"Employee": "HR-EMP-",
+	"Employee Advance": "HR-EAD-.YYYY.-",
+	"Expense Claim": "HR-EXP-.YYYY.-",
+	"Fee Schedule": "EDU-FSH-.YYYY.-",
+	"Fee Structure": "EDU-FST-.YYYY.-",
+	"Fees": "EDU-FEE-.YYYY.-",
+	"Installation Note": "MAT-INS-.YYYY.-",
+	"Instructor": "EDU-INS-.YYYY.-",
+	"Issue": "ISS-.YYYY.-",
+	"Journal Entry": "ACC-JV-.YYYY.-",
+	"Landed Cost Voucher": "MAT-LCV-.YYYY.-",
+	"Lead": "CRM-LEAD-.YYYY.-",
+	"Leave Allocation": "HR-LAL-.YYYY.-",
+	"Leave Application": "HR-LAP-.YYYY.-",
+	"Maintenance Schedule": "MAT-MSH-.YYYY.-",
+	"Maintenance Visit": "MAT-MVS-.YYYY.-",
+	"Material Request": "MAT-MR-.YYYY.-",
+	"Member": "NPO-MEM-.YYYY.-",
+	"Opportunity": "CRM-OPP-.YYYY.-",
+	"Packing Slip": "MAT-PAC-.YYYY.-",
+	"Payment Entry": "ACC-PAY-.YYYY.-",
+	"Payment Request": "ACC-PRQ-.YYYY.-",
+	"Production Plan": "MFG-PP-.YYYY.-",
+	"Project Update": "PROJ-UPD-.YYYY.-",
+	"Purchase Invoice": "ACC-PINV-.YYYY.-",
+	"Purchase Order": "PUR-ORD-.YYYY.-",
+	"Purchase Receipt": "MAT-PRE-.YYYY.-",
+	"Quality Inspection": "MAT-QA-.YYYY.-",
+	"Quotation": "SAL-QTN-.YYYY.-",
+	"Request for Quotation": "PUR-RFQ-.YYYY.-",
+	"Sales Invoice": "ACC-SINV-.YYYY.-",
+	"Sales Order": "SAL-ORD-.YYYY.-",
+	"Sample Collection": "HLC-SC-.YYYY.-",
+	"Shareholder": "ACC-SH-.YYYY.-",
+	"Stock Entry": "MAT-STE-.YYYY.-",
+	"Stock Reconciliation": "MAT-RECO-.YYYY.-",
+	"Student": "EDU-STU-.YYYY.-",
+	"Student Applicant": "EDU-APP-.YYYY.-",
+	"Supplier": "SUP-.YYYY.-",
+	"Supplier Quotation": "PUR-SQTN-.YYYY.-",
+	"Supplier Scorecard Period": "PU-SSP-.YYYY.-",
+	"Timesheet": "TS-.YYYY.-",
+	"Vehicle Log": "HR-VLOG-.YYYY.-",
+	"Warranty Claim": "SER-WRN-.YYYY.-",
+	"Work Order": "MFG-WO-.YYYY.-",
 }
 
+
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update `tabProperty Setter`
 		set name=concat(doc_type, '-', field_name, '-', property)
 		where property='fetch_from'
-	""")
+	"""
+	)
 	series_to_set = get_series()
 	for doctype, opts in series_to_set.items():
 		set_series(doctype, opts["options"], opts["default"])
 
+
 def set_series(doctype, options, default):
 	def _make_property_setter(property_name, value):
-		property_setter = frappe.db.exists('Property Setter',
-			{'doc_type': doctype, 'field_name': 'naming_series', 'property': property_name})
+		property_setter = frappe.db.exists(
+			"Property Setter",
+			{"doc_type": doctype, "field_name": "naming_series", "property": property_name},
+		)
 		if property_setter:
-			frappe.db.set_value('Property Setter', property_setter, 'value', value)
+			frappe.db.set_value("Property Setter", property_setter, "value", value)
 		else:
 			make_property_setter(doctype, "naming_series", "options", value, "Text")
 
@@ -89,17 +95,18 @@
 	if default:
 		_make_property_setter("default", default)
 
+
 def get_series():
 	series_to_set = {}
 
 	for doctype in doctype_series_map:
-		if not frappe.db.exists('DocType', doctype):
+		if not frappe.db.exists("DocType", doctype):
 			continue
 		if not frappe.db.a_row_exists(doctype):
 			continue
-		if not frappe.db.has_column(doctype, 'naming_series'):
+		if not frappe.db.has_column(doctype, "naming_series"):
 			continue
-		if not frappe.get_meta(doctype).has_field('naming_series'):
+		if not frappe.get_meta(doctype).has_field("naming_series"):
 			continue
 		series_to_preserve = list(filter(None, get_series_to_preserve(doctype)))
 		default_series = get_default_series(doctype)
@@ -117,12 +124,18 @@
 
 	return series_to_set
 
+
 def get_series_to_preserve(doctype):
-	series_to_preserve = frappe.db.sql_list("""select distinct naming_series from `tab{doctype}` where ifnull(naming_series, '') != ''""".format(doctype=doctype))
+	series_to_preserve = frappe.db.sql_list(
+		"""select distinct naming_series from `tab{doctype}` where ifnull(naming_series, '') != ''""".format(
+			doctype=doctype
+		)
+	)
 	series_to_preserve.sort()
 	return series_to_preserve
 
+
 def get_default_series(doctype):
 	field = frappe.get_meta(doctype).get_field("naming_series")
-	default_series = field.get('default', '') if field else ''
+	default_series = field.get("default", "") if field else ""
 	return default_series
diff --git a/erpnext/patches/v11_0/remove_barcodes_field_from_copy_fields_to_variants.py b/erpnext/patches/v11_0/remove_barcodes_field_from_copy_fields_to_variants.py
index caf74f5..2e0204c 100644
--- a/erpnext/patches/v11_0/remove_barcodes_field_from_copy_fields_to_variants.py
+++ b/erpnext/patches/v11_0/remove_barcodes_field_from_copy_fields_to_variants.py
@@ -2,7 +2,7 @@
 
 
 def execute():
-	'''Remove barcodes field from "Copy Fields to Variants" table because barcodes must be unique'''
+	"""Remove barcodes field from "Copy Fields to Variants" table because barcodes must be unique"""
 
-	settings = frappe.get_doc('Item Variant Settings')
+	settings = frappe.get_doc("Item Variant Settings")
 	settings.remove_invalid_fields_for_copy_fields_in_variants()
diff --git a/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py b/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py
index 8fa876d..036ae8e 100644
--- a/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py
+++ b/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py
@@ -2,9 +2,10 @@
 
 # this patch should have been included with this PR https://github.com/frappe/erpnext/pull/14302
 
+
 def execute():
 	if frappe.db.table_exists("Additional Salary Component"):
 		if not frappe.db.table_exists("Additional Salary"):
 			frappe.rename_doc("DocType", "Additional Salary Component", "Additional Salary")
 
-		frappe.delete_doc('DocType', "Additional Salary Component")
+		frappe.delete_doc("DocType", "Additional Salary Component")
diff --git a/erpnext/patches/v11_0/rename_asset_adjustment_doctype.py b/erpnext/patches/v11_0/rename_asset_adjustment_doctype.py
index c7a3aa2..c444c16 100644
--- a/erpnext/patches/v11_0/rename_asset_adjustment_doctype.py
+++ b/erpnext/patches/v11_0/rename_asset_adjustment_doctype.py
@@ -6,6 +6,8 @@
 
 
 def execute():
-	if frappe.db.table_exists("Asset Adjustment") and not frappe.db.table_exists("Asset Value Adjustment"):
-		frappe.rename_doc('DocType', 'Asset Adjustment', 'Asset Value Adjustment', force=True)
-		frappe.reload_doc('assets', 'doctype', 'asset_value_adjustment')
+	if frappe.db.table_exists("Asset Adjustment") and not frappe.db.table_exists(
+		"Asset Value Adjustment"
+	):
+		frappe.rename_doc("DocType", "Asset Adjustment", "Asset Value Adjustment", force=True)
+		frappe.reload_doc("assets", "doctype", "asset_value_adjustment")
diff --git a/erpnext/patches/v11_0/rename_bom_wo_fields.py b/erpnext/patches/v11_0/rename_bom_wo_fields.py
index cab7d0a..fb25eeb 100644
--- a/erpnext/patches/v11_0/rename_bom_wo_fields.py
+++ b/erpnext/patches/v11_0/rename_bom_wo_fields.py
@@ -7,28 +7,36 @@
 
 
 def execute():
-    # updating column value to handle field change from Data to Currency
-    changed_field = "base_scrap_material_cost"
-    frappe.db.sql(f"update `tabBOM` set {changed_field} = '0' where trim(coalesce({changed_field}, ''))= ''")
+	# updating column value to handle field change from Data to Currency
+	changed_field = "base_scrap_material_cost"
+	frappe.db.sql(
+		f"update `tabBOM` set {changed_field} = '0' where trim(coalesce({changed_field}, ''))= ''"
+	)
 
-    for doctype in ['BOM Explosion Item', 'BOM Item', 'Work Order Item', 'Item']:
-        if frappe.db.has_column(doctype, 'allow_transfer_for_manufacture'):
-            if doctype != 'Item':
-                frappe.reload_doc('manufacturing', 'doctype', frappe.scrub(doctype))
-            else:
-                frappe.reload_doc('stock', 'doctype', frappe.scrub(doctype))
+	for doctype in ["BOM Explosion Item", "BOM Item", "Work Order Item", "Item"]:
+		if frappe.db.has_column(doctype, "allow_transfer_for_manufacture"):
+			if doctype != "Item":
+				frappe.reload_doc("manufacturing", "doctype", frappe.scrub(doctype))
+			else:
+				frappe.reload_doc("stock", "doctype", frappe.scrub(doctype))
 
-            rename_field(doctype, "allow_transfer_for_manufacture", "include_item_in_manufacturing")
+			rename_field(doctype, "allow_transfer_for_manufacture", "include_item_in_manufacturing")
 
-    for doctype in ['BOM', 'Work Order']:
-        frappe.reload_doc('manufacturing', 'doctype', frappe.scrub(doctype))
+	for doctype in ["BOM", "Work Order"]:
+		frappe.reload_doc("manufacturing", "doctype", frappe.scrub(doctype))
 
-        if frappe.db.has_column(doctype, 'transfer_material_against_job_card'):
-            frappe.db.sql(""" UPDATE `tab%s`
+		if frappe.db.has_column(doctype, "transfer_material_against_job_card"):
+			frappe.db.sql(
+				""" UPDATE `tab%s`
                 SET transfer_material_against = CASE WHEN
                     transfer_material_against_job_card = 1 then 'Job Card' Else 'Work Order' END
-                WHERE docstatus < 2""" % (doctype))
-        else:
-            frappe.db.sql(""" UPDATE `tab%s`
+                WHERE docstatus < 2"""
+				% (doctype)
+			)
+		else:
+			frappe.db.sql(
+				""" UPDATE `tab%s`
                 SET transfer_material_against = 'Work Order'
-                WHERE docstatus < 2""" % (doctype))
+                WHERE docstatus < 2"""
+				% (doctype)
+			)
diff --git a/erpnext/patches/v11_0/rename_duplicate_item_code_values.py b/erpnext/patches/v11_0/rename_duplicate_item_code_values.py
index 61f3856..1f65e14 100644
--- a/erpnext/patches/v11_0/rename_duplicate_item_code_values.py
+++ b/erpnext/patches/v11_0/rename_duplicate_item_code_values.py
@@ -3,7 +3,9 @@
 
 def execute():
 	items = []
-	items = frappe.db.sql("""select item_code from `tabItem` group by item_code having count(*) > 1""", as_dict=True)
+	items = frappe.db.sql(
+		"""select item_code from `tabItem` group by item_code having count(*) > 1""", as_dict=True
+	)
 	if items:
 		for item in items:
 			frappe.db.sql("""update `tabItem` set item_code=name where item_code = %s""", (item.item_code))
diff --git a/erpnext/patches/v11_0/rename_field_max_days_allowed.py b/erpnext/patches/v11_0/rename_field_max_days_allowed.py
index 4b55aa0..0813770 100644
--- a/erpnext/patches/v11_0/rename_field_max_days_allowed.py
+++ b/erpnext/patches/v11_0/rename_field_max_days_allowed.py
@@ -3,11 +3,13 @@
 
 
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabLeave Type`
 		SET max_days_allowed = '0'
 		WHERE trim(coalesce(max_days_allowed, '')) = ''
-	""")
+	"""
+	)
 	frappe.db.sql_ddl("""ALTER table `tabLeave Type` modify max_days_allowed int(8) NOT NULL""")
 	frappe.reload_doc("hr", "doctype", "leave_type")
 	rename_field("Leave Type", "max_days_allowed", "max_continuous_days_allowed")
diff --git a/erpnext/patches/v11_0/rename_members_with_naming_series.py b/erpnext/patches/v11_0/rename_members_with_naming_series.py
index 95fb55d..4dffbc8 100644
--- a/erpnext/patches/v11_0/rename_members_with_naming_series.py
+++ b/erpnext/patches/v11_0/rename_members_with_naming_series.py
@@ -3,8 +3,8 @@
 
 def execute():
 	frappe.reload_doc("non_profit", "doctype", "member")
-	old_named_members = frappe.get_all("Member", filters = {"name": ("not like", "MEM-%")})
-	correctly_named_members = frappe.get_all("Member", filters = {"name": ("like", "MEM-%")})
+	old_named_members = frappe.get_all("Member", filters={"name": ("not like", "MEM-%")})
+	correctly_named_members = frappe.get_all("Member", filters={"name": ("like", "MEM-%")})
 	current_index = len(correctly_named_members)
 
 	for member in old_named_members:
diff --git a/erpnext/patches/v11_0/rename_overproduction_percent_field.py b/erpnext/patches/v11_0/rename_overproduction_percent_field.py
index c78ec5d..74699db 100644
--- a/erpnext/patches/v11_0/rename_overproduction_percent_field.py
+++ b/erpnext/patches/v11_0/rename_overproduction_percent_field.py
@@ -7,5 +7,9 @@
 
 
 def execute():
-	frappe.reload_doc('manufacturing', 'doctype', 'manufacturing_settings')
-	rename_field('Manufacturing Settings', 'over_production_allowance_percentage', 'overproduction_percentage_for_sales_order')
+	frappe.reload_doc("manufacturing", "doctype", "manufacturing_settings")
+	rename_field(
+		"Manufacturing Settings",
+		"over_production_allowance_percentage",
+		"overproduction_percentage_for_sales_order",
+	)
diff --git a/erpnext/patches/v11_0/rename_production_order_to_work_order.py b/erpnext/patches/v11_0/rename_production_order_to_work_order.py
index 453a571..b58ac4e 100644
--- a/erpnext/patches/v11_0/rename_production_order_to_work_order.py
+++ b/erpnext/patches/v11_0/rename_production_order_to_work_order.py
@@ -7,22 +7,28 @@
 
 
 def execute():
-	frappe.rename_doc('DocType', 'Production Order', 'Work Order', force=True)
-	frappe.reload_doc('manufacturing', 'doctype', 'work_order')
+	frappe.rename_doc("DocType", "Production Order", "Work Order", force=True)
+	frappe.reload_doc("manufacturing", "doctype", "work_order")
 
-	frappe.rename_doc('DocType', 'Production Order Item', 'Work Order Item', force=True)
-	frappe.reload_doc('manufacturing', 'doctype', 'work_order_item')
+	frappe.rename_doc("DocType", "Production Order Item", "Work Order Item", force=True)
+	frappe.reload_doc("manufacturing", "doctype", "work_order_item")
 
-	frappe.rename_doc('DocType', 'Production Order Operation', 'Work Order Operation', force=True)
-	frappe.reload_doc('manufacturing', 'doctype', 'work_order_operation')
+	frappe.rename_doc("DocType", "Production Order Operation", "Work Order Operation", force=True)
+	frappe.reload_doc("manufacturing", "doctype", "work_order_operation")
 
-	frappe.reload_doc('projects', 'doctype', 'timesheet')
-	frappe.reload_doc('stock', 'doctype', 'stock_entry')
+	frappe.reload_doc("projects", "doctype", "timesheet")
+	frappe.reload_doc("stock", "doctype", "stock_entry")
 	rename_field("Timesheet", "production_order", "work_order")
 	rename_field("Stock Entry", "production_order", "work_order")
 
-	frappe.rename_doc("Report", "Production Orders in Progress", "Work Orders in Progress", force=True)
+	frappe.rename_doc(
+		"Report", "Production Orders in Progress", "Work Orders in Progress", force=True
+	)
 	frappe.rename_doc("Report", "Completed Production Orders", "Completed Work Orders", force=True)
 	frappe.rename_doc("Report", "Open Production Orders", "Open Work Orders", force=True)
-	frappe.rename_doc("Report", "Issued Items Against Production Order", "Issued Items Against Work Order", force=True)
-	frappe.rename_doc("Report", "Production Order Stock Report", "Work Order Stock Report", force=True)
+	frappe.rename_doc(
+		"Report", "Issued Items Against Production Order", "Issued Items Against Work Order", force=True
+	)
+	frappe.rename_doc(
+		"Report", "Production Order Stock Report", "Work Order Stock Report", force=True
+	)
diff --git a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
index 3f87550..96daba7 100644
--- a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
+++ b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
@@ -6,10 +6,10 @@
 
 def execute():
 	if frappe.db.table_exists("Supplier Group"):
-		frappe.reload_doc('setup', 'doctype', 'supplier_group')
+		frappe.reload_doc("setup", "doctype", "supplier_group")
 	elif frappe.db.table_exists("Supplier Type"):
 		frappe.rename_doc("DocType", "Supplier Type", "Supplier Group", force=True)
-		frappe.reload_doc('setup', 'doctype', 'supplier_group')
+		frappe.reload_doc("setup", "doctype", "supplier_group")
 		frappe.reload_doc("accounts", "doctype", "pricing_rule")
 		frappe.reload_doc("accounts", "doctype", "tax_rule")
 		frappe.reload_doc("buying", "doctype", "buying_settings")
@@ -22,16 +22,23 @@
 
 	build_tree()
 
-def build_tree():
-	frappe.db.sql("""update `tabSupplier Group` set parent_supplier_group = '{0}'
-		where is_group = 0""".format(_('All Supplier Groups')))
 
-	if not frappe.db.exists("Supplier Group", _('All Supplier Groups')):
-		frappe.get_doc({
-			'doctype': 'Supplier Group',
-			'supplier_group_name': _('All Supplier Groups'),
-			'is_group': 1,
-			'parent_supplier_group': ''
-		}).insert(ignore_permissions=True)
+def build_tree():
+	frappe.db.sql(
+		"""update `tabSupplier Group` set parent_supplier_group = '{0}'
+		where is_group = 0""".format(
+			_("All Supplier Groups")
+		)
+	)
+
+	if not frappe.db.exists("Supplier Group", _("All Supplier Groups")):
+		frappe.get_doc(
+			{
+				"doctype": "Supplier Group",
+				"supplier_group_name": _("All Supplier Groups"),
+				"is_group": 1,
+				"parent_supplier_group": "",
+			}
+		).insert(ignore_permissions=True)
 
 	rebuild_tree("Supplier Group", "parent_supplier_group")
diff --git a/erpnext/patches/v11_0/renamed_from_to_fields_in_project.py b/erpnext/patches/v11_0/renamed_from_to_fields_in_project.py
index f23a814..4dc2521 100644
--- a/erpnext/patches/v11_0/renamed_from_to_fields_in_project.py
+++ b/erpnext/patches/v11_0/renamed_from_to_fields_in_project.py
@@ -7,8 +7,8 @@
 
 
 def execute():
-    frappe.reload_doc('projects', 'doctype', 'project')
+	frappe.reload_doc("projects", "doctype", "project")
 
-    if frappe.db.has_column('Project', 'from'):
-        rename_field('Project', 'from', 'from_time')
-        rename_field('Project', 'to', 'to_time')
+	if frappe.db.has_column("Project", "from"):
+		rename_field("Project", "from", "from_time")
+		rename_field("Project", "to", "to_time")
diff --git a/erpnext/patches/v11_0/set_department_for_doctypes.py b/erpnext/patches/v11_0/set_department_for_doctypes.py
index b1098ab..1e14b9c 100644
--- a/erpnext/patches/v11_0/set_department_for_doctypes.py
+++ b/erpnext/patches/v11_0/set_department_for_doctypes.py
@@ -2,22 +2,36 @@
 
 # Set department value based on employee value
 
+
 def execute():
 
 	doctypes_to_update = {
-		'hr': ['Appraisal', 'Leave Allocation', 'Expense Claim', 'Salary Slip',
-			'Attendance', 'Training Feedback', 'Training Result Employee','Leave Application',
-			'Employee Advance', 'Training Event Employee', 'Payroll Employee Detail'],
-		'education': ['Instructor'],
-		'projects': ['Activity Cost', 'Timesheet'],
-		'setup': ['Sales Person']
+		"hr": [
+			"Appraisal",
+			"Leave Allocation",
+			"Expense Claim",
+			"Salary Slip",
+			"Attendance",
+			"Training Feedback",
+			"Training Result Employee",
+			"Leave Application",
+			"Employee Advance",
+			"Training Event Employee",
+			"Payroll Employee Detail",
+		],
+		"education": ["Instructor"],
+		"projects": ["Activity Cost", "Timesheet"],
+		"setup": ["Sales Person"],
 	}
 
 	for module, doctypes in doctypes_to_update.items():
 		for doctype in doctypes:
 			if frappe.db.table_exists(doctype):
-				frappe.reload_doc(module, 'doctype', frappe.scrub(doctype))
-				frappe.db.sql("""
+				frappe.reload_doc(module, "doctype", frappe.scrub(doctype))
+				frappe.db.sql(
+					"""
 					update `tab%s` dt
 					set department=(select department from `tabEmployee` where name=dt.employee)
-				""" % doctype)
+				"""
+					% doctype
+				)
diff --git a/erpnext/patches/v11_0/set_missing_gst_hsn_code.py b/erpnext/patches/v11_0/set_missing_gst_hsn_code.py
index ec75d45..d9356e7 100644
--- a/erpnext/patches/v11_0/set_missing_gst_hsn_code.py
+++ b/erpnext/patches/v11_0/set_missing_gst_hsn_code.py
@@ -8,15 +8,24 @@
 	if not company:
 		return
 
-	doctypes = ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice",
-		"Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"]
+	doctypes = [
+		"Quotation",
+		"Sales Order",
+		"Delivery Note",
+		"Sales Invoice",
+		"Supplier Quotation",
+		"Purchase Order",
+		"Purchase Receipt",
+		"Purchase Invoice",
+	]
 
 	for dt in doctypes:
 		date_field = "posting_date"
 		if dt in ["Quotation", "Sales Order", "Supplier Quotation", "Purchase Order"]:
 			date_field = "transaction_date"
 
-		transactions = frappe.db.sql("""
+		transactions = frappe.db.sql(
+			"""
 			select dt.name, dt_item.name as child_name
 			from `tab{dt}` dt, `tab{dt} Item` dt_item
 			where dt.name = dt_item.parent
@@ -25,18 +34,28 @@
 				and ifnull(dt_item.gst_hsn_code, '') = ''
 				and ifnull(dt_item.item_code, '') != ''
 				and dt.company in ({company})
-		""".format(dt=dt, date_field=date_field, company=", ".join(['%s']*len(company))), tuple(company), as_dict=1)
+		""".format(
+				dt=dt, date_field=date_field, company=", ".join(["%s"] * len(company))
+			),
+			tuple(company),
+			as_dict=1,
+		)
 
 		if not transactions:
 			continue
 
 		transaction_rows_name = [d.child_name for d in transactions]
 
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			update `tab{dt} Item` dt_item
 			set dt_item.gst_hsn_code = (select gst_hsn_code from tabItem where name=dt_item.item_code)
 			where dt_item.name in ({rows_name})
-		""".format(dt=dt, rows_name=", ".join(['%s']*len(transaction_rows_name))), tuple(transaction_rows_name))
+		""".format(
+				dt=dt, rows_name=", ".join(["%s"] * len(transaction_rows_name))
+			),
+			tuple(transaction_rows_name),
+		)
 
 		parent = set([d.name for d in transactions])
 		for t in list(parent):
diff --git a/erpnext/patches/v11_0/set_salary_component_properties.py b/erpnext/patches/v11_0/set_salary_component_properties.py
index 99c3b0b..3ec9f8a 100644
--- a/erpnext/patches/v11_0/set_salary_component_properties.py
+++ b/erpnext/patches/v11_0/set_salary_component_properties.py
@@ -2,15 +2,21 @@
 
 
 def execute():
-	frappe.reload_doc('Payroll', 'doctype', 'salary_detail')
-	frappe.reload_doc('Payroll', 'doctype', 'salary_component')
+	frappe.reload_doc("Payroll", "doctype", "salary_detail")
+	frappe.reload_doc("Payroll", "doctype", "salary_component")
 
 	frappe.db.sql("update `tabSalary Component` set is_tax_applicable=1 where type='Earning'")
 
-	frappe.db.sql("""update `tabSalary Component` set variable_based_on_taxable_salary=1
-	    where type='Deduction' and name in ('TDS', 'Tax Deducted at Source')""")
+	frappe.db.sql(
+		"""update `tabSalary Component` set variable_based_on_taxable_salary=1
+	    where type='Deduction' and name in ('TDS', 'Tax Deducted at Source')"""
+	)
 
-	frappe.db.sql("""update `tabSalary Detail` set is_tax_applicable=1
-	    where parentfield='earnings' and statistical_component=0""")
-	frappe.db.sql("""update `tabSalary Detail` set variable_based_on_taxable_salary=1
-	    where parentfield='deductions' and salary_component in ('TDS', 'Tax Deducted at Source')""")
+	frappe.db.sql(
+		"""update `tabSalary Detail` set is_tax_applicable=1
+	    where parentfield='earnings' and statistical_component=0"""
+	)
+	frappe.db.sql(
+		"""update `tabSalary Detail` set variable_based_on_taxable_salary=1
+	    where parentfield='deductions' and salary_component in ('TDS', 'Tax Deducted at Source')"""
+	)
diff --git a/erpnext/patches/v11_0/set_update_field_and_value_in_workflow_state.py b/erpnext/patches/v11_0/set_update_field_and_value_in_workflow_state.py
index a44daaa..548a7cb 100644
--- a/erpnext/patches/v11_0/set_update_field_and_value_in_workflow_state.py
+++ b/erpnext/patches/v11_0/set_update_field_and_value_in_workflow_state.py
@@ -3,17 +3,19 @@
 
 
 def execute():
-	for doctype in ['Expense Claim', 'Leave Application']:
+	for doctype in ["Expense Claim", "Leave Application"]:
 
 		active_workflow = get_workflow_name(doctype)
-		if not active_workflow: continue
+		if not active_workflow:
+			continue
 
-		workflow_states = frappe.get_all('Workflow Document State',
-			filters=[['parent', '=', active_workflow]],
-			fields=['*'])
+		workflow_states = frappe.get_all(
+			"Workflow Document State", filters=[["parent", "=", active_workflow]], fields=["*"]
+		)
 
 		for state in workflow_states:
-			if state.update_field: continue
-			status_field = 'approval_status' if doctype=="Expense Claim" else 'status'
-			frappe.set_value('Workflow Document State', state.name, 'update_field', status_field)
-			frappe.set_value('Workflow Document State', state.name, 'update_value', state.state)
+			if state.update_field:
+				continue
+			status_field = "approval_status" if doctype == "Expense Claim" else "status"
+			frappe.set_value("Workflow Document State", state.name, "update_field", status_field)
+			frappe.set_value("Workflow Document State", state.name, "update_value", state.state)
diff --git a/erpnext/patches/v11_0/set_user_permissions_for_department.py b/erpnext/patches/v11_0/set_user_permissions_for_department.py
index bb7ef87..9b5cb24 100644
--- a/erpnext/patches/v11_0/set_user_permissions_for_department.py
+++ b/erpnext/patches/v11_0/set_user_permissions_for_department.py
@@ -2,18 +2,24 @@
 
 
 def execute():
-    user_permissions = frappe.db.sql("""select name, for_value from `tabUser Permission`
-        where allow='Department'""", as_dict=1)
-    for d in user_permissions:
-        user_permission = frappe.get_doc("User Permission", d.name)
-        for new_dept in frappe.db.sql("""select name from tabDepartment
-            where ifnull(company, '') != '' and department_name=%s""", d.for_value):
-            try:
-                new_user_permission = frappe.copy_doc(user_permission)
-                new_user_permission.for_value = new_dept[0]
-                new_user_permission.save()
-            except frappe.DuplicateEntryError:
-                pass
+	user_permissions = frappe.db.sql(
+		"""select name, for_value from `tabUser Permission`
+        where allow='Department'""",
+		as_dict=1,
+	)
+	for d in user_permissions:
+		user_permission = frappe.get_doc("User Permission", d.name)
+		for new_dept in frappe.db.sql(
+			"""select name from tabDepartment
+            where ifnull(company, '') != '' and department_name=%s""",
+			d.for_value,
+		):
+			try:
+				new_user_permission = frappe.copy_doc(user_permission)
+				new_user_permission.for_value = new_dept[0]
+				new_user_permission.save()
+			except frappe.DuplicateEntryError:
+				pass
 
-    frappe.reload_doc("hr", "doctype", "department")
-    frappe.db.sql("update tabDepartment set disabled=1 where ifnull(company, '') = ''")
+	frappe.reload_doc("hr", "doctype", "department")
+	frappe.db.sql("update tabDepartment set disabled=1 where ifnull(company, '') = ''")
diff --git a/erpnext/patches/v11_0/skip_user_permission_check_for_department.py b/erpnext/patches/v11_0/skip_user_permission_check_for_department.py
index d387577..1327da9 100644
--- a/erpnext/patches/v11_0/skip_user_permission_check_for_department.py
+++ b/erpnext/patches/v11_0/skip_user_permission_check_for_department.py
@@ -4,20 +4,37 @@
 # Skips user permission check for doctypes where department link field was recently added
 # https://github.com/frappe/erpnext/pull/14121
 
+
 def execute():
 	doctypes_to_skip = []
-	for doctype in ['Appraisal', 'Leave Allocation', 'Expense Claim', 'Instructor', 'Salary Slip',
-					'Attendance', 'Training Feedback', 'Training Result Employee',
-					'Leave Application', 'Employee Advance', 'Activity Cost', 'Training Event Employee',
-					'Timesheet', 'Sales Person', 'Payroll Employee Detail']:
-		if frappe.db.exists('Custom Field', { 'dt': doctype, 'fieldname': 'department'}): continue
+	for doctype in [
+		"Appraisal",
+		"Leave Allocation",
+		"Expense Claim",
+		"Instructor",
+		"Salary Slip",
+		"Attendance",
+		"Training Feedback",
+		"Training Result Employee",
+		"Leave Application",
+		"Employee Advance",
+		"Activity Cost",
+		"Training Event Employee",
+		"Timesheet",
+		"Sales Person",
+		"Payroll Employee Detail",
+	]:
+		if frappe.db.exists("Custom Field", {"dt": doctype, "fieldname": "department"}):
+			continue
 		doctypes_to_skip.append(doctype)
 
-	frappe.reload_doctype('User Permission')
+	frappe.reload_doctype("User Permission")
 
-	user_permissions = frappe.get_all("User Permission",
-		filters=[['allow', '=', 'Department'], ['applicable_for', 'in', [None] + doctypes_to_skip]],
-		fields=['name', 'applicable_for'])
+	user_permissions = frappe.get_all(
+		"User Permission",
+		filters=[["allow", "=", "Department"], ["applicable_for", "in", [None] + doctypes_to_skip]],
+		fields=["name", "applicable_for"],
+	)
 
 	user_permissions_to_delete = []
 	new_user_permissions_list = []
@@ -37,24 +54,32 @@
 			for doctype in applicable_for_doctypes:
 				if doctype:
 					# Maintain sequence (name, user, allow, for_value, applicable_for, apply_to_all_doctypes)
-					new_user_permissions_list.append((
-						frappe.generate_hash("", 10),
-						user_permission.user,
-						user_permission.allow,
-						user_permission.for_value,
-						doctype,
-						0
-					))
+					new_user_permissions_list.append(
+						(
+							frappe.generate_hash("", 10),
+							user_permission.user,
+							user_permission.allow,
+							user_permission.for_value,
+							doctype,
+							0,
+						)
+					)
 
 	if new_user_permissions_list:
-		frappe.db.sql('''
+		frappe.db.sql(
+			"""
 			INSERT INTO `tabUser Permission`
 			(`name`, `user`, `allow`, `for_value`, `applicable_for`, `apply_to_all_doctypes`)
-			VALUES {}'''.format(', '.join(['%s'] * len(new_user_permissions_list))), # nosec
-			tuple(new_user_permissions_list)
+			VALUES {}""".format(
+				", ".join(["%s"] * len(new_user_permissions_list))
+			),  # nosec
+			tuple(new_user_permissions_list),
 		)
 
 	if user_permissions_to_delete:
-		frappe.db.sql('DELETE FROM `tabUser Permission` WHERE `name` IN ({})'.format( # nosec
-			','.join(['%s'] * len(user_permissions_to_delete))
-		), tuple(user_permissions_to_delete))
+		frappe.db.sql(
+			"DELETE FROM `tabUser Permission` WHERE `name` IN ({})".format(  # nosec
+				",".join(["%s"] * len(user_permissions_to_delete))
+			),
+			tuple(user_permissions_to_delete),
+		)
diff --git a/erpnext/patches/v11_0/uom_conversion_data.py b/erpnext/patches/v11_0/uom_conversion_data.py
index 81e547b..5dee084 100644
--- a/erpnext/patches/v11_0/uom_conversion_data.py
+++ b/erpnext/patches/v11_0/uom_conversion_data.py
@@ -14,8 +14,8 @@
 		# delete conversion data and insert again
 		frappe.db.sql("delete from `tabUOM Conversion Factor`")
 		try:
-			frappe.delete_doc('UOM', 'Hundredweight')
-			frappe.delete_doc('UOM', 'Pound Cubic Yard')
+			frappe.delete_doc("UOM", "Hundredweight")
+			frappe.delete_doc("UOM", "Pound Cubic Yard")
 		except frappe.LinkExistsError:
 			pass
 
diff --git a/erpnext/patches/v11_0/update_account_type_in_party_type.py b/erpnext/patches/v11_0/update_account_type_in_party_type.py
index c66cef0..e55f9f2 100644
--- a/erpnext/patches/v11_0/update_account_type_in_party_type.py
+++ b/erpnext/patches/v11_0/update_account_type_in_party_type.py
@@ -6,9 +6,15 @@
 
 
 def execute():
-	frappe.reload_doc('setup', 'doctype', 'party_type')
-	party_types = {'Customer': 'Receivable', 'Supplier': 'Payable',
-		'Employee': 'Payable', 'Member': 'Receivable', 'Shareholder': 'Payable', 'Student': 'Receivable'}
+	frappe.reload_doc("setup", "doctype", "party_type")
+	party_types = {
+		"Customer": "Receivable",
+		"Supplier": "Payable",
+		"Employee": "Payable",
+		"Member": "Receivable",
+		"Shareholder": "Payable",
+		"Student": "Receivable",
+	}
 
 	for party_type, account_type in party_types.items():
-		frappe.db.set_value('Party Type', party_type, 'account_type', account_type)
+		frappe.db.set_value("Party Type", party_type, "account_type", account_type)
diff --git a/erpnext/patches/v11_0/update_allow_transfer_for_manufacture.py b/erpnext/patches/v11_0/update_allow_transfer_for_manufacture.py
index 3e36a4b..a7351d2 100644
--- a/erpnext/patches/v11_0/update_allow_transfer_for_manufacture.py
+++ b/erpnext/patches/v11_0/update_allow_transfer_for_manufacture.py
@@ -6,16 +6,22 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'item')
-	frappe.db.sql(""" update `tabItem` set include_item_in_manufacturing = 1
-		where ifnull(is_stock_item, 0) = 1""")
+	frappe.reload_doc("stock", "doctype", "item")
+	frappe.db.sql(
+		""" update `tabItem` set include_item_in_manufacturing = 1
+		where ifnull(is_stock_item, 0) = 1"""
+	)
 
-	for doctype in ['BOM Item', 'Work Order Item', 'BOM Explosion Item']:
-		frappe.reload_doc('manufacturing', 'doctype', frappe.scrub(doctype))
+	for doctype in ["BOM Item", "Work Order Item", "BOM Explosion Item"]:
+		frappe.reload_doc("manufacturing", "doctype", frappe.scrub(doctype))
 
-		frappe.db.sql(""" update `tab{0}` child, tabItem item
+		frappe.db.sql(
+			""" update `tab{0}` child, tabItem item
 			set
 				child.include_item_in_manufacturing = 1
 			where
 				child.item_code = item.name and ifnull(item.is_stock_item, 0) = 1
-		""".format(doctype))
+		""".format(
+				doctype
+			)
+		)
diff --git a/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py b/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py
index f3a2ac6..51ba706 100644
--- a/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py
+++ b/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py
@@ -6,15 +6,19 @@
 
 
 def execute():
-	frappe.reload_doc('buying', 'doctype', 'buying_settings')
-	frappe.db.set_value('Buying Settings', None, 'backflush_raw_materials_of_subcontract_based_on', 'BOM')
+	frappe.reload_doc("buying", "doctype", "buying_settings")
+	frappe.db.set_value(
+		"Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", "BOM"
+	)
 
-	frappe.reload_doc('stock', 'doctype', 'stock_entry_detail')
-	frappe.db.sql(""" update `tabStock Entry Detail` as sed,
+	frappe.reload_doc("stock", "doctype", "stock_entry_detail")
+	frappe.db.sql(
+		""" update `tabStock Entry Detail` as sed,
 		`tabStock Entry` as se, `tabPurchase Order Item Supplied` as pois
 		set
 			sed.subcontracted_item = pois.main_item_code
 		where
 			se.purpose = 'Send to Subcontractor' and sed.parent = se.name
 			and pois.rm_item_code = sed.item_code and se.docstatus = 1
-			and pois.parenttype = 'Purchase Order'""")
+			and pois.parenttype = 'Purchase Order'"""
+	)
diff --git a/erpnext/patches/v11_0/update_brand_in_item_price.py b/erpnext/patches/v11_0/update_brand_in_item_price.py
index ce1df78..f4859ae 100644
--- a/erpnext/patches/v11_0/update_brand_in_item_price.py
+++ b/erpnext/patches/v11_0/update_brand_in_item_price.py
@@ -6,11 +6,13 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'item_price')
+	frappe.reload_doc("stock", "doctype", "item_price")
 
-	frappe.db.sql(""" update `tabItem Price`, `tabItem`
+	frappe.db.sql(
+		""" update `tabItem Price`, `tabItem`
 		set
 			`tabItem Price`.brand = `tabItem`.brand
 		where
 			`tabItem Price`.item_code = `tabItem`.name
-			and `tabItem`.brand is not null and `tabItem`.brand != ''""")
+			and `tabItem`.brand is not null and `tabItem`.brand != ''"""
+	)
diff --git a/erpnext/patches/v11_0/update_delivery_trip_status.py b/erpnext/patches/v11_0/update_delivery_trip_status.py
index 35b9535..1badfab 100755
--- a/erpnext/patches/v11_0/update_delivery_trip_status.py
+++ b/erpnext/patches/v11_0/update_delivery_trip_status.py
@@ -6,18 +6,14 @@
 
 
 def execute():
-	frappe.reload_doc('setup', 'doctype', 'global_defaults', force=True)
-	frappe.reload_doc('stock', 'doctype', 'delivery_trip')
-	frappe.reload_doc('stock', 'doctype', 'delivery_stop', force=True)
+	frappe.reload_doc("setup", "doctype", "global_defaults", force=True)
+	frappe.reload_doc("stock", "doctype", "delivery_trip")
+	frappe.reload_doc("stock", "doctype", "delivery_stop", force=True)
 
 	for trip in frappe.get_all("Delivery Trip"):
 		trip_doc = frappe.get_doc("Delivery Trip", trip.name)
 
-		status = {
-			0: "Draft",
-			1: "Scheduled",
-			2: "Cancelled"
-		}[trip_doc.docstatus]
+		status = {0: "Draft", 1: "Scheduled", 2: "Cancelled"}[trip_doc.docstatus]
 
 		if trip_doc.docstatus == 1:
 			visited_stops = [stop.visited for stop in trip_doc.delivery_stops]
diff --git a/erpnext/patches/v11_0/update_department_lft_rgt.py b/erpnext/patches/v11_0/update_department_lft_rgt.py
index aff8e15..bca5e9e 100644
--- a/erpnext/patches/v11_0/update_department_lft_rgt.py
+++ b/erpnext/patches/v11_0/update_department_lft_rgt.py
@@ -4,16 +4,18 @@
 
 
 def execute():
-	""" assign lft and rgt appropriately """
+	"""assign lft and rgt appropriately"""
 	frappe.reload_doc("hr", "doctype", "department")
-	if not frappe.db.exists("Department", _('All Departments')):
-		frappe.get_doc({
-			'doctype': 'Department',
-			'department_name': _('All Departments'),
-			'is_group': 1
-		}).insert(ignore_permissions=True, ignore_mandatory=True)
+	if not frappe.db.exists("Department", _("All Departments")):
+		frappe.get_doc(
+			{"doctype": "Department", "department_name": _("All Departments"), "is_group": 1}
+		).insert(ignore_permissions=True, ignore_mandatory=True)
 
-	frappe.db.sql("""update `tabDepartment` set parent_department = '{0}'
-		where is_group = 0""".format(_('All Departments')))
+	frappe.db.sql(
+		"""update `tabDepartment` set parent_department = '{0}'
+		where is_group = 0""".format(
+			_("All Departments")
+		)
+	)
 
 	rebuild_tree("Department", "parent_department")
diff --git a/erpnext/patches/v11_0/update_sales_partner_type.py b/erpnext/patches/v11_0/update_sales_partner_type.py
index ef58499f..2d37fd6 100644
--- a/erpnext/patches/v11_0/update_sales_partner_type.py
+++ b/erpnext/patches/v11_0/update_sales_partner_type.py
@@ -5,25 +5,28 @@
 def execute():
 	from erpnext.setup.setup_wizard.operations.install_fixtures import default_sales_partner_type
 
-	frappe.reload_doc('selling', 'doctype', 'sales_partner_type')
+	frappe.reload_doc("selling", "doctype", "sales_partner_type")
 
-	frappe.local.lang = frappe.db.get_default("lang") or 'en'
+	frappe.local.lang = frappe.db.get_default("lang") or "en"
 
 	for s in default_sales_partner_type:
 		insert_sales_partner_type(_(s))
 
 	# get partner type in existing forms (customized)
 	# and create a document if not created
-	for d in ['Sales Partner']:
-		partner_type = frappe.db.sql_list('select distinct partner_type from `tab{0}`'.format(d))
+	for d in ["Sales Partner"]:
+		partner_type = frappe.db.sql_list("select distinct partner_type from `tab{0}`".format(d))
 		for s in partner_type:
 			if s and s not in default_sales_partner_type:
 				insert_sales_partner_type(s)
 
 		# remove customization for partner type
-		for p in frappe.get_all('Property Setter', {'doc_type':d, 'field_name':'partner_type', 'property':'options'}):
-			frappe.delete_doc('Property Setter', p.name)
+		for p in frappe.get_all(
+			"Property Setter", {"doc_type": d, "field_name": "partner_type", "property": "options"}
+		):
+			frappe.delete_doc("Property Setter", p.name)
+
 
 def insert_sales_partner_type(s):
-	if not frappe.db.exists('Sales Partner Type', s):
-		frappe.get_doc(dict(doctype='Sales Partner Type', sales_partner_type=s)).insert()
+	if not frappe.db.exists("Sales Partner Type", s):
+		frappe.get_doc(dict(doctype="Sales Partner Type", sales_partner_type=s)).insert()
diff --git a/erpnext/patches/v11_0/update_total_qty_field.py b/erpnext/patches/v11_0/update_total_qty_field.py
index 4e807b4..09fcdb8 100644
--- a/erpnext/patches/v11_0/update_total_qty_field.py
+++ b/erpnext/patches/v11_0/update_total_qty_field.py
@@ -2,33 +2,46 @@
 
 
 def execute():
-	frappe.reload_doc('buying', 'doctype', 'purchase_order')
-	frappe.reload_doc('buying', 'doctype', 'supplier_quotation')
-	frappe.reload_doc('selling', 'doctype', 'sales_order')
-	frappe.reload_doc('selling', 'doctype', 'quotation')
-	frappe.reload_doc('stock', 'doctype', 'delivery_note')
-	frappe.reload_doc('stock', 'doctype', 'purchase_receipt')
-	frappe.reload_doc('accounts', 'doctype', 'sales_invoice')
-	frappe.reload_doc('accounts', 'doctype', 'purchase_invoice')
+	frappe.reload_doc("buying", "doctype", "purchase_order")
+	frappe.reload_doc("buying", "doctype", "supplier_quotation")
+	frappe.reload_doc("selling", "doctype", "sales_order")
+	frappe.reload_doc("selling", "doctype", "quotation")
+	frappe.reload_doc("stock", "doctype", "delivery_note")
+	frappe.reload_doc("stock", "doctype", "purchase_receipt")
+	frappe.reload_doc("accounts", "doctype", "sales_invoice")
+	frappe.reload_doc("accounts", "doctype", "purchase_invoice")
 
-	doctypes = ["Sales Order", "Sales Invoice", "Delivery Note",\
-		"Purchase Order", "Purchase Invoice", "Purchase Receipt", "Quotation", "Supplier Quotation"]
+	doctypes = [
+		"Sales Order",
+		"Sales Invoice",
+		"Delivery Note",
+		"Purchase Order",
+		"Purchase Invoice",
+		"Purchase Receipt",
+		"Quotation",
+		"Supplier Quotation",
+	]
 
 	for doctype in doctypes:
-		total_qty = frappe.db.sql('''
+		total_qty = frappe.db.sql(
+			"""
 			SELECT
 				parent, SUM(qty) as qty
 			FROM
 				`tab{0} Item`
 			where parenttype = '{0}'
 			GROUP BY parent
-		'''.format(doctype), as_dict = True)
+		""".format(
+				doctype
+			),
+			as_dict=True,
+		)
 
 		# Query to update total_qty might become too big, Update in batches
 		# batch_size is chosen arbitrarily, Don't try too hard to reason about it
 		batch_size = 100000
 		for i in range(0, len(total_qty), batch_size):
-			batch_transactions = total_qty[i:i + batch_size]
+			batch_transactions = total_qty[i : i + batch_size]
 
 			# UPDATE with CASE for some reason cannot use PRIMARY INDEX,
 			# causing all rows to be examined, leading to a very slow update
@@ -42,7 +55,11 @@
 			for d in batch_transactions:
 				values.append("({0}, {1})".format(frappe.db.escape(d.parent), d.qty))
 			conditions = ",".join(values)
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				INSERT INTO `tab{}` (name, total_qty) VALUES {}
 				ON DUPLICATE KEY UPDATE name = VALUES(name), total_qty = VALUES(total_qty)
-			""".format(doctype, conditions))
+			""".format(
+					doctype, conditions
+				)
+			)
diff --git a/erpnext/patches/v11_1/delete_bom_browser.py b/erpnext/patches/v11_1/delete_bom_browser.py
index 9b5c169..09ee169 100644
--- a/erpnext/patches/v11_1/delete_bom_browser.py
+++ b/erpnext/patches/v11_1/delete_bom_browser.py
@@ -6,4 +6,4 @@
 
 
 def execute():
-    frappe.delete_doc_if_exists('Page', 'bom-browser')
+	frappe.delete_doc_if_exists("Page", "bom-browser")
diff --git a/erpnext/patches/v11_1/make_job_card_time_logs.py b/erpnext/patches/v11_1/make_job_card_time_logs.py
index 100cd64..beb2c4e 100644
--- a/erpnext/patches/v11_1/make_job_card_time_logs.py
+++ b/erpnext/patches/v11_1/make_job_card_time_logs.py
@@ -6,25 +6,45 @@
 
 
 def execute():
-    frappe.reload_doc('manufacturing', 'doctype', 'job_card_time_log')
+	frappe.reload_doc("manufacturing", "doctype", "job_card_time_log")
 
-    if (frappe.db.table_exists("Job Card")
-        and frappe.get_meta("Job Card").has_field("actual_start_date")):
-        time_logs = []
-        for d in frappe.get_all('Job Card',
-            fields = ["actual_start_date", "actual_end_date", "time_in_mins", "name", "for_quantity"],
-            filters = {'docstatus': ("<", 2)}):
-            if d.actual_start_date:
-                time_logs.append([d.actual_start_date, d.actual_end_date, d.time_in_mins,
-                    d.for_quantity, d.name, 'Job Card', 'time_logs', frappe.generate_hash("", 10)])
+	if frappe.db.table_exists("Job Card") and frappe.get_meta("Job Card").has_field(
+		"actual_start_date"
+	):
+		time_logs = []
+		for d in frappe.get_all(
+			"Job Card",
+			fields=["actual_start_date", "actual_end_date", "time_in_mins", "name", "for_quantity"],
+			filters={"docstatus": ("<", 2)},
+		):
+			if d.actual_start_date:
+				time_logs.append(
+					[
+						d.actual_start_date,
+						d.actual_end_date,
+						d.time_in_mins,
+						d.for_quantity,
+						d.name,
+						"Job Card",
+						"time_logs",
+						frappe.generate_hash("", 10),
+					]
+				)
 
-        if time_logs:
-            frappe.db.sql(""" INSERT INTO
+		if time_logs:
+			frappe.db.sql(
+				""" INSERT INTO
                 `tabJob Card Time Log`
                     (from_time, to_time, time_in_mins, completed_qty, parent, parenttype, parentfield, name)
                 values {values}
-            """.format(values = ','.join(['%s'] * len(time_logs))), tuple(time_logs))
+            """.format(
+					values=",".join(["%s"] * len(time_logs))
+				),
+				tuple(time_logs),
+			)
 
-        frappe.reload_doc('manufacturing', 'doctype', 'job_card')
-        frappe.db.sql(""" update `tabJob Card` set total_completed_qty = for_quantity,
-            total_time_in_mins = time_in_mins where docstatus < 2 """)
+		frappe.reload_doc("manufacturing", "doctype", "job_card")
+		frappe.db.sql(
+			""" update `tabJob Card` set total_completed_qty = for_quantity,
+            total_time_in_mins = time_in_mins where docstatus < 2 """
+		)
diff --git a/erpnext/patches/v11_1/move_customer_lead_to_dynamic_column.py b/erpnext/patches/v11_1/move_customer_lead_to_dynamic_column.py
index d292d7a..b681f25 100644
--- a/erpnext/patches/v11_1/move_customer_lead_to_dynamic_column.py
+++ b/erpnext/patches/v11_1/move_customer_lead_to_dynamic_column.py
@@ -8,8 +8,14 @@
 def execute():
 	frappe.reload_doctype("Quotation")
 	frappe.db.sql(""" UPDATE `tabQuotation` set party_name = lead WHERE quotation_to = 'Lead' """)
-	frappe.db.sql(""" UPDATE `tabQuotation` set party_name = customer WHERE quotation_to = 'Customer' """)
+	frappe.db.sql(
+		""" UPDATE `tabQuotation` set party_name = customer WHERE quotation_to = 'Customer' """
+	)
 
 	frappe.reload_doctype("Opportunity")
-	frappe.db.sql(""" UPDATE `tabOpportunity` set party_name = lead WHERE opportunity_from = 'Lead' """)
-	frappe.db.sql(""" UPDATE `tabOpportunity` set party_name = customer WHERE opportunity_from = 'Customer' """)
+	frappe.db.sql(
+		""" UPDATE `tabOpportunity` set party_name = lead WHERE opportunity_from = 'Lead' """
+	)
+	frappe.db.sql(
+		""" UPDATE `tabOpportunity` set party_name = customer WHERE opportunity_from = 'Customer' """
+	)
diff --git a/erpnext/patches/v11_1/renamed_delayed_item_report.py b/erpnext/patches/v11_1/renamed_delayed_item_report.py
index c160b79..8624781 100644
--- a/erpnext/patches/v11_1/renamed_delayed_item_report.py
+++ b/erpnext/patches/v11_1/renamed_delayed_item_report.py
@@ -6,6 +6,6 @@
 
 
 def execute():
-    for report in ["Delayed Order Item Summary", "Delayed Order Summary"]:
-        if frappe.db.exists("Report", report):
-            frappe.delete_doc("Report", report)
+	for report in ["Delayed Order Item Summary", "Delayed Order Summary"]:
+		if frappe.db.exists("Report", report):
+			frappe.delete_doc("Report", report)
diff --git a/erpnext/patches/v11_1/set_default_action_for_quality_inspection.py b/erpnext/patches/v11_1/set_default_action_for_quality_inspection.py
index 672b762..39aa6dd 100644
--- a/erpnext/patches/v11_1/set_default_action_for_quality_inspection.py
+++ b/erpnext/patches/v11_1/set_default_action_for_quality_inspection.py
@@ -6,11 +6,13 @@
 
 
 def execute():
-    stock_settings = frappe.get_doc('Stock Settings')
-    if stock_settings.default_warehouse and not frappe.db.exists("Warehouse", stock_settings.default_warehouse):
-        stock_settings.default_warehouse = None
-    if stock_settings.stock_uom and not frappe.db.exists("UOM", stock_settings.stock_uom):
-        stock_settings.stock_uom = None
-    stock_settings.flags.ignore_mandatory = True
-    stock_settings.action_if_quality_inspection_is_not_submitted = "Stop"
-    stock_settings.save()
+	stock_settings = frappe.get_doc("Stock Settings")
+	if stock_settings.default_warehouse and not frappe.db.exists(
+		"Warehouse", stock_settings.default_warehouse
+	):
+		stock_settings.default_warehouse = None
+	if stock_settings.stock_uom and not frappe.db.exists("UOM", stock_settings.stock_uom):
+		stock_settings.stock_uom = None
+	stock_settings.flags.ignore_mandatory = True
+	stock_settings.action_if_quality_inspection_is_not_submitted = "Stop"
+	stock_settings.save()
diff --git a/erpnext/patches/v11_1/set_missing_opportunity_from.py b/erpnext/patches/v11_1/set_missing_opportunity_from.py
index beec63a..ae5f620 100644
--- a/erpnext/patches/v11_1/set_missing_opportunity_from.py
+++ b/erpnext/patches/v11_1/set_missing_opportunity_from.py
@@ -5,13 +5,23 @@
 
 	frappe.reload_doctype("Opportunity")
 	if frappe.db.has_column("Opportunity", "enquiry_from"):
-		frappe.db.sql(""" UPDATE `tabOpportunity` set opportunity_from = enquiry_from
-			where ifnull(opportunity_from, '') = '' and ifnull(enquiry_from, '') != ''""")
+		frappe.db.sql(
+			""" UPDATE `tabOpportunity` set opportunity_from = enquiry_from
+			where ifnull(opportunity_from, '') = '' and ifnull(enquiry_from, '') != ''"""
+		)
 
-	if frappe.db.has_column("Opportunity", "lead") and frappe.db.has_column("Opportunity", "enquiry_from"):
-		frappe.db.sql(""" UPDATE `tabOpportunity` set party_name = lead
-			where enquiry_from = 'Lead' and ifnull(party_name, '') = '' and ifnull(lead, '') != ''""")
+	if frappe.db.has_column("Opportunity", "lead") and frappe.db.has_column(
+		"Opportunity", "enquiry_from"
+	):
+		frappe.db.sql(
+			""" UPDATE `tabOpportunity` set party_name = lead
+			where enquiry_from = 'Lead' and ifnull(party_name, '') = '' and ifnull(lead, '') != ''"""
+		)
 
-	if frappe.db.has_column("Opportunity", "customer") and frappe.db.has_column("Opportunity", "enquiry_from"):
-		frappe.db.sql(""" UPDATE `tabOpportunity` set party_name = customer
-			 where enquiry_from = 'Customer' and ifnull(party_name, '') = '' and ifnull(customer, '') != ''""")
+	if frappe.db.has_column("Opportunity", "customer") and frappe.db.has_column(
+		"Opportunity", "enquiry_from"
+	):
+		frappe.db.sql(
+			""" UPDATE `tabOpportunity` set party_name = customer
+			 where enquiry_from = 'Customer' and ifnull(party_name, '') = '' and ifnull(customer, '') != ''"""
+		)
diff --git a/erpnext/patches/v11_1/set_missing_title_for_quotation.py b/erpnext/patches/v11_1/set_missing_title_for_quotation.py
index 93d9f0e..6e7e2c9 100644
--- a/erpnext/patches/v11_1/set_missing_title_for_quotation.py
+++ b/erpnext/patches/v11_1/set_missing_title_for_quotation.py
@@ -4,7 +4,8 @@
 def execute():
 	frappe.reload_doctype("Quotation")
 	# update customer_name from Customer document if quotation_to is set to Customer
-	frappe.db.sql('''
+	frappe.db.sql(
+		"""
 		update tabQuotation, tabCustomer
 		set
 			tabQuotation.customer_name = tabCustomer.customer_name,
@@ -13,11 +14,13 @@
 			tabQuotation.customer_name is null
 			and tabQuotation.party_name = tabCustomer.name
 			and tabQuotation.quotation_to = 'Customer'
-	''')
+	"""
+	)
 
 	# update customer_name from Lead document if quotation_to is set to Lead
 
-	frappe.db.sql('''
+	frappe.db.sql(
+		"""
 		update tabQuotation, tabLead
 		set
 			tabQuotation.customer_name =  case when ifnull(tabLead.company_name, '') != '' then tabLead.company_name else tabLead.lead_name end,
@@ -26,4 +29,5 @@
 			tabQuotation.customer_name is null
 			and tabQuotation.party_name = tabLead.name
 			and tabQuotation.quotation_to = 'Lead'
-	''')
+	"""
+	)
diff --git a/erpnext/patches/v11_1/set_salary_details_submittable.py b/erpnext/patches/v11_1/set_salary_details_submittable.py
index ac082b1..e5ecce6 100644
--- a/erpnext/patches/v11_1/set_salary_details_submittable.py
+++ b/erpnext/patches/v11_1/set_salary_details_submittable.py
@@ -2,8 +2,10 @@
 
 
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update `tabSalary Structure` ss, `tabSalary Detail` sd
 		set sd.docstatus=1
 		where ss.name=sd.parent and ss.docstatus=1 and sd.parenttype='Salary Structure'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v11_1/set_status_for_material_request_type_manufacture.py b/erpnext/patches/v11_1/set_status_for_material_request_type_manufacture.py
index 0d4f3d2..6e2edfe 100644
--- a/erpnext/patches/v11_1/set_status_for_material_request_type_manufacture.py
+++ b/erpnext/patches/v11_1/set_status_for_material_request_type_manufacture.py
@@ -2,8 +2,10 @@
 
 
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update `tabMaterial Request`
 		set status='Manufactured'
 		where docstatus=1 and material_request_type='Manufacture' and per_ordered=100 and status != 'Stopped'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v11_1/set_variant_based_on.py b/erpnext/patches/v11_1/set_variant_based_on.py
index 2e06e63..1d57527 100644
--- a/erpnext/patches/v11_1/set_variant_based_on.py
+++ b/erpnext/patches/v11_1/set_variant_based_on.py
@@ -6,7 +6,9 @@
 
 
 def execute():
-	frappe.db.sql("""update tabItem set variant_based_on = 'Item Attribute'
+	frappe.db.sql(
+		"""update tabItem set variant_based_on = 'Item Attribute'
 		where ifnull(variant_based_on, '') = ''
 		and (has_variants=1 or ifnull(variant_of, '') != '')
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v11_1/setup_guardian_role.py b/erpnext/patches/v11_1/setup_guardian_role.py
index dd9c1d2..2b25e13 100644
--- a/erpnext/patches/v11_1/setup_guardian_role.py
+++ b/erpnext/patches/v11_1/setup_guardian_role.py
@@ -2,11 +2,8 @@
 
 
 def execute():
-	if 'Education' in frappe.get_active_domains() and not frappe.db.exists("Role", "Guardian"):
+	if "Education" in frappe.get_active_domains() and not frappe.db.exists("Role", "Guardian"):
 		doc = frappe.new_doc("Role")
-		doc.update({
-			"role_name": "Guardian",
-			"desk_access": 0
-		})
+		doc.update({"role_name": "Guardian", "desk_access": 0})
 
 		doc.insert(ignore_permissions=True)
diff --git a/erpnext/patches/v11_1/update_bank_transaction_status.py b/erpnext/patches/v11_1/update_bank_transaction_status.py
index 9b8be3d..0615b04 100644
--- a/erpnext/patches/v11_1/update_bank_transaction_status.py
+++ b/erpnext/patches/v11_1/update_bank_transaction_status.py
@@ -6,22 +6,26 @@
 
 
 def execute():
-    frappe.reload_doc("accounts", "doctype", "bank_transaction")
+	frappe.reload_doc("accounts", "doctype", "bank_transaction")
 
-    bank_transaction_fields = frappe.get_meta("Bank Transaction").get_valid_columns()
+	bank_transaction_fields = frappe.get_meta("Bank Transaction").get_valid_columns()
 
-    if 'debit' in bank_transaction_fields:
-        frappe.db.sql(""" UPDATE `tabBank Transaction`
+	if "debit" in bank_transaction_fields:
+		frappe.db.sql(
+			""" UPDATE `tabBank Transaction`
             SET status = 'Reconciled'
             WHERE
                 status = 'Settled' and (debit = allocated_amount or credit = allocated_amount)
                 and ifnull(allocated_amount, 0) > 0
-        """)
+        """
+		)
 
-    elif 'deposit' in bank_transaction_fields:
-        frappe.db.sql(""" UPDATE `tabBank Transaction`
+	elif "deposit" in bank_transaction_fields:
+		frappe.db.sql(
+			""" UPDATE `tabBank Transaction`
             SET status = 'Reconciled'
             WHERE
                 status = 'Settled' and (deposit = allocated_amount or withdrawal = allocated_amount)
                 and ifnull(allocated_amount, 0) > 0
-        """)
+        """
+		)
diff --git a/erpnext/patches/v11_1/update_default_supplier_in_item_defaults.py b/erpnext/patches/v11_1/update_default_supplier_in_item_defaults.py
index 902df20..16e11ed 100644
--- a/erpnext/patches/v11_1/update_default_supplier_in_item_defaults.py
+++ b/erpnext/patches/v11_1/update_default_supplier_in_item_defaults.py
@@ -6,21 +6,23 @@
 
 
 def execute():
-	'''
-		default supplier was not set in the item defaults for multi company instance,
-			this patch will set the default supplier
+	"""
+	default supplier was not set in the item defaults for multi company instance,
+	        this patch will set the default supplier
 
-	'''
-	if not frappe.db.has_column('Item', 'default_supplier'):
+	"""
+	if not frappe.db.has_column("Item", "default_supplier"):
 		return
 
-	frappe.reload_doc('stock', 'doctype', 'item_default')
-	frappe.reload_doc('stock', 'doctype', 'item')
+	frappe.reload_doc("stock", "doctype", "item_default")
+	frappe.reload_doc("stock", "doctype", "item")
 
 	companies = frappe.get_all("Company")
 	if len(companies) > 1:
-		frappe.db.sql(""" UPDATE `tabItem Default`, `tabItem`
+		frappe.db.sql(
+			""" UPDATE `tabItem Default`, `tabItem`
 			SET `tabItem Default`.default_supplier = `tabItem`.default_supplier
 			WHERE
 				`tabItem Default`.parent = `tabItem`.name and `tabItem Default`.default_supplier is null
-				and `tabItem`.default_supplier is not null and `tabItem`.default_supplier != '' """)
+				and `tabItem`.default_supplier is not null and `tabItem`.default_supplier != '' """
+		)
diff --git a/erpnext/patches/v11_1/woocommerce_set_creation_user.py b/erpnext/patches/v11_1/woocommerce_set_creation_user.py
index 19958ee..e2d9e3e 100644
--- a/erpnext/patches/v11_1/woocommerce_set_creation_user.py
+++ b/erpnext/patches/v11_1/woocommerce_set_creation_user.py
@@ -3,7 +3,7 @@
 
 
 def execute():
-	frappe.reload_doc("erpnext_integrations", "doctype","woocommerce_settings")
+	frappe.reload_doc("erpnext_integrations", "doctype", "woocommerce_settings")
 	doc = frappe.get_doc("Woocommerce Settings")
 
 	if cint(doc.enable_sync):
diff --git a/erpnext/patches/v12_0/add_company_link_to_einvoice_settings.py b/erpnext/patches/v12_0/add_company_link_to_einvoice_settings.py
index e498b67..40965fa 100644
--- a/erpnext/patches/v12_0/add_company_link_to_einvoice_settings.py
+++ b/erpnext/patches/v12_0/add_company_link_to_einvoice_settings.py
@@ -4,15 +4,18 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
-	if not company or not frappe.db.count('E Invoice User'):
+	company = frappe.get_all("Company", filters={"country": "India"})
+	if not company or not frappe.db.count("E Invoice User"):
 		return
 
 	frappe.reload_doc("regional", "doctype", "e_invoice_user")
-	for creds in frappe.db.get_all('E Invoice User', fields=['name', 'gstin']):
-		company_name = frappe.db.sql("""
+	for creds in frappe.db.get_all("E Invoice User", fields=["name", "gstin"]):
+		company_name = frappe.db.sql(
+			"""
 			select dl.link_name from `tabAddress` a, `tabDynamic Link` dl
 			where a.gstin = %s and dl.parent = a.name and dl.link_doctype = 'Company'
-		""", (creds.get('gstin')))
+		""",
+			(creds.get("gstin")),
+		)
 		if company_name and len(company_name) > 0:
-			frappe.db.set_value('E Invoice User', creds.get('name'), 'company', company_name[0][0])
+			frappe.db.set_value("E Invoice User", creds.get("name"), "company", company_name[0][0])
diff --git a/erpnext/patches/v12_0/add_default_buying_selling_terms_in_company.py b/erpnext/patches/v12_0/add_default_buying_selling_terms_in_company.py
index 80187d8..284b616 100644
--- a/erpnext/patches/v12_0/add_default_buying_selling_terms_in_company.py
+++ b/erpnext/patches/v12_0/add_default_buying_selling_terms_in_company.py
@@ -8,12 +8,16 @@
 
 def execute():
 	frappe.reload_doc("setup", "doctype", "company")
-	if frappe.db.has_column('Company', 'default_terms'):
-		rename_field('Company', "default_terms", "default_selling_terms")
+	if frappe.db.has_column("Company", "default_terms"):
+		rename_field("Company", "default_terms", "default_selling_terms")
 
-		for company in frappe.get_all("Company", ["name", "default_selling_terms", "default_buying_terms"]):
+		for company in frappe.get_all(
+			"Company", ["name", "default_selling_terms", "default_buying_terms"]
+		):
 			if company.default_selling_terms and not company.default_buying_terms:
-				frappe.db.set_value("Company", company.name, "default_buying_terms", company.default_selling_terms)
+				frappe.db.set_value(
+					"Company", company.name, "default_buying_terms", company.default_selling_terms
+				)
 
 	frappe.reload_doc("setup", "doctype", "terms_and_conditions")
 	frappe.db.sql("update `tabTerms and Conditions` set selling=1, buying=1, hr=1")
diff --git a/erpnext/patches/v12_0/add_document_type_field_for_italy_einvoicing.py b/erpnext/patches/v12_0/add_document_type_field_for_italy_einvoicing.py
index f860cb4..a98976a 100644
--- a/erpnext/patches/v12_0/add_document_type_field_for_italy_einvoicing.py
+++ b/erpnext/patches/v12_0/add_document_type_field_for_italy_einvoicing.py
@@ -3,15 +3,19 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Italy'})
+	company = frappe.get_all("Company", filters={"country": "Italy"})
 	if not company:
 		return
 
 	custom_fields = {
-		'Sales Invoice': [
-			dict(fieldname='type_of_document', label='Type of Document',
-				fieldtype='Select', insert_after='customer_fiscal_code',
-				options='\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27'),
+		"Sales Invoice": [
+			dict(
+				fieldname="type_of_document",
+				label="Type of Document",
+				fieldtype="Select",
+				insert_after="customer_fiscal_code",
+				options="\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27",
+			),
 		]
 	}
 
diff --git a/erpnext/patches/v12_0/add_einvoice_status_field.py b/erpnext/patches/v12_0/add_einvoice_status_field.py
index aeff9ca..8c7abc6 100644
--- a/erpnext/patches/v12_0/add_einvoice_status_field.py
+++ b/erpnext/patches/v12_0/add_einvoice_status_field.py
@@ -7,66 +7,154 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	# move hidden einvoice fields to a different section
 	custom_fields = {
-		'Sales Invoice': [
-			dict(fieldname='einvoice_section', label='E-Invoice Fields', fieldtype='Section Break', insert_after='gst_vehicle_type',
-			print_hide=1, hidden=1),
-
-			dict(fieldname='ack_no', label='Ack. No.', fieldtype='Data', read_only=1, hidden=1, insert_after='einvoice_section',
-				no_copy=1, print_hide=1),
-
-			dict(fieldname='ack_date', label='Ack. Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_no', no_copy=1, print_hide=1),
-
-			dict(fieldname='irn_cancel_date', label='Cancel Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_date',
-				no_copy=1, print_hide=1),
-
-			dict(fieldname='signed_einvoice', label='Signed E-Invoice', fieldtype='Code', options='JSON', hidden=1, insert_after='irn_cancel_date',
-				no_copy=1, print_hide=1, read_only=1),
-
-			dict(fieldname='signed_qr_code', label='Signed QRCode', fieldtype='Code', options='JSON', hidden=1, insert_after='signed_einvoice',
-				no_copy=1, print_hide=1, read_only=1),
-
-			dict(fieldname='qrcode_image', label='QRCode', fieldtype='Attach Image', hidden=1, insert_after='signed_qr_code',
-				no_copy=1, print_hide=1, read_only=1),
-
-			dict(fieldname='einvoice_status', label='E-Invoice Status', fieldtype='Select', insert_after='qrcode_image',
-				options='\nPending\nGenerated\nCancelled\nFailed', default=None, hidden=1, no_copy=1, print_hide=1, read_only=1),
-
-			dict(fieldname='failure_description', label='E-Invoice Failure Description', fieldtype='Code', options='JSON',
-				hidden=1, insert_after='einvoice_status', no_copy=1, print_hide=1, read_only=1)
+		"Sales Invoice": [
+			dict(
+				fieldname="einvoice_section",
+				label="E-Invoice Fields",
+				fieldtype="Section Break",
+				insert_after="gst_vehicle_type",
+				print_hide=1,
+				hidden=1,
+			),
+			dict(
+				fieldname="ack_no",
+				label="Ack. No.",
+				fieldtype="Data",
+				read_only=1,
+				hidden=1,
+				insert_after="einvoice_section",
+				no_copy=1,
+				print_hide=1,
+			),
+			dict(
+				fieldname="ack_date",
+				label="Ack. Date",
+				fieldtype="Data",
+				read_only=1,
+				hidden=1,
+				insert_after="ack_no",
+				no_copy=1,
+				print_hide=1,
+			),
+			dict(
+				fieldname="irn_cancel_date",
+				label="Cancel Date",
+				fieldtype="Data",
+				read_only=1,
+				hidden=1,
+				insert_after="ack_date",
+				no_copy=1,
+				print_hide=1,
+			),
+			dict(
+				fieldname="signed_einvoice",
+				label="Signed E-Invoice",
+				fieldtype="Code",
+				options="JSON",
+				hidden=1,
+				insert_after="irn_cancel_date",
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="signed_qr_code",
+				label="Signed QRCode",
+				fieldtype="Code",
+				options="JSON",
+				hidden=1,
+				insert_after="signed_einvoice",
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="qrcode_image",
+				label="QRCode",
+				fieldtype="Attach Image",
+				hidden=1,
+				insert_after="signed_qr_code",
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="einvoice_status",
+				label="E-Invoice Status",
+				fieldtype="Select",
+				insert_after="qrcode_image",
+				options="\nPending\nGenerated\nCancelled\nFailed",
+				default=None,
+				hidden=1,
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="failure_description",
+				label="E-Invoice Failure Description",
+				fieldtype="Code",
+				options="JSON",
+				hidden=1,
+				insert_after="einvoice_status",
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
 		]
 	}
 	create_custom_fields(custom_fields, update=True)
 
-	if frappe.db.exists('E Invoice Settings') and frappe.db.get_single_value('E Invoice Settings', 'enable'):
-		frappe.db.sql('''
+	if frappe.db.exists("E Invoice Settings") and frappe.db.get_single_value(
+		"E Invoice Settings", "enable"
+	):
+		frappe.db.sql(
+			"""
 			UPDATE `tabSales Invoice` SET einvoice_status = 'Pending'
 			WHERE
 				posting_date >= '2021-04-01'
 				AND ifnull(irn, '') = ''
 				AND ifnull(`billing_address_gstin`, '') != ifnull(`company_gstin`, '')
 				AND ifnull(gst_category, '') in ('Registered Regular', 'SEZ', 'Overseas', 'Deemed Export')
-		''')
+		"""
+		)
 
 		# set appropriate statuses
-		frappe.db.sql('''UPDATE `tabSales Invoice` SET einvoice_status = 'Generated'
-			WHERE ifnull(irn, '') != '' AND ifnull(irn_cancelled, 0) = 0''')
+		frappe.db.sql(
+			"""UPDATE `tabSales Invoice` SET einvoice_status = 'Generated'
+			WHERE ifnull(irn, '') != '' AND ifnull(irn_cancelled, 0) = 0"""
+		)
 
-		frappe.db.sql('''UPDATE `tabSales Invoice` SET einvoice_status = 'Cancelled'
-			WHERE ifnull(irn_cancelled, 0) = 1''')
+		frappe.db.sql(
+			"""UPDATE `tabSales Invoice` SET einvoice_status = 'Cancelled'
+			WHERE ifnull(irn_cancelled, 0) = 1"""
+		)
 
 	# set correct acknowledgement in e-invoices
-	einvoices = frappe.get_all('Sales Invoice', {'irn': ['is', 'set']}, ['name', 'signed_einvoice'])
+	einvoices = frappe.get_all("Sales Invoice", {"irn": ["is", "set"]}, ["name", "signed_einvoice"])
 
 	if einvoices:
 		for inv in einvoices:
-			signed_einvoice = inv.get('signed_einvoice')
+			signed_einvoice = inv.get("signed_einvoice")
 			if signed_einvoice:
 				signed_einvoice = json.loads(signed_einvoice)
-				frappe.db.set_value('Sales Invoice', inv.get('name'), 'ack_no', signed_einvoice.get('AckNo'), update_modified=False)
-				frappe.db.set_value('Sales Invoice', inv.get('name'), 'ack_date', signed_einvoice.get('AckDt'), update_modified=False)
+				frappe.db.set_value(
+					"Sales Invoice",
+					inv.get("name"),
+					"ack_no",
+					signed_einvoice.get("AckNo"),
+					update_modified=False,
+				)
+				frappe.db.set_value(
+					"Sales Invoice",
+					inv.get("name"),
+					"ack_date",
+					signed_einvoice.get("AckDt"),
+					update_modified=False,
+				)
diff --git a/erpnext/patches/v12_0/add_einvoice_summary_report_permissions.py b/erpnext/patches/v12_0/add_einvoice_summary_report_permissions.py
index e837786..e4277ba 100644
--- a/erpnext/patches/v12_0/add_einvoice_summary_report_permissions.py
+++ b/erpnext/patches/v12_0/add_einvoice_summary_report_permissions.py
@@ -4,17 +4,17 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	if frappe.db.exists('Report', 'E-Invoice Summary') and \
-		not frappe.db.get_value('Custom Role', dict(report='E-Invoice Summary')):
-		frappe.get_doc(dict(
-			doctype='Custom Role',
-			report='E-Invoice Summary',
-			roles= [
-				dict(role='Accounts User'),
-				dict(role='Accounts Manager')
-			]
-		)).insert()
+	if frappe.db.exists("Report", "E-Invoice Summary") and not frappe.db.get_value(
+		"Custom Role", dict(report="E-Invoice Summary")
+	):
+		frappe.get_doc(
+			dict(
+				doctype="Custom Role",
+				report="E-Invoice Summary",
+				roles=[dict(role="Accounts User"), dict(role="Accounts Manager")],
+			)
+		).insert()
diff --git a/erpnext/patches/v12_0/add_eway_bill_in_delivery_note.py b/erpnext/patches/v12_0/add_eway_bill_in_delivery_note.py
index 973da89..db9fa24 100644
--- a/erpnext/patches/v12_0/add_eway_bill_in_delivery_note.py
+++ b/erpnext/patches/v12_0/add_eway_bill_in_delivery_note.py
@@ -3,18 +3,21 @@
 
 
 def execute():
-    company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 
-    if not company:
-        return
+	if not company:
+		return
 
-    create_custom_field('Delivery Note', {
-        'fieldname': 'ewaybill',
-        'label': 'E-Way Bill No.',
-        'fieldtype': 'Data',
-        'depends_on': 'eval:(doc.docstatus === 1)',
-        'allow_on_submit': 1,
-        'insert_after': 'customer_name_in_arabic',
-        'translatable': 0,
-        'owner': 'Administrator'
-    })
+	create_custom_field(
+		"Delivery Note",
+		{
+			"fieldname": "ewaybill",
+			"label": "E-Way Bill No.",
+			"fieldtype": "Data",
+			"depends_on": "eval:(doc.docstatus === 1)",
+			"allow_on_submit": 1,
+			"insert_after": "customer_name_in_arabic",
+			"translatable": 0,
+			"owner": "Administrator",
+		},
+	)
diff --git a/erpnext/patches/v12_0/add_ewaybill_validity_field.py b/erpnext/patches/v12_0/add_ewaybill_validity_field.py
index 247140d..ca3e254 100644
--- a/erpnext/patches/v12_0/add_ewaybill_validity_field.py
+++ b/erpnext/patches/v12_0/add_ewaybill_validity_field.py
@@ -5,14 +5,23 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	custom_fields = {
-		'Sales Invoice': [
-			dict(fieldname='eway_bill_validity', label='E-Way Bill Validity', fieldtype='Data', no_copy=1, print_hide=1,
-				depends_on='ewaybill', read_only=1, allow_on_submit=1, insert_after='ewaybill')
+		"Sales Invoice": [
+			dict(
+				fieldname="eway_bill_validity",
+				label="E-Way Bill Validity",
+				fieldtype="Data",
+				no_copy=1,
+				print_hide=1,
+				depends_on="ewaybill",
+				read_only=1,
+				allow_on_submit=1,
+				insert_after="ewaybill",
+			)
 		]
 	}
 	create_custom_fields(custom_fields, update=True)
diff --git a/erpnext/patches/v12_0/add_export_type_field_in_party_master.py b/erpnext/patches/v12_0/add_export_type_field_in_party_master.py
index dc9e884..b14ffd2 100644
--- a/erpnext/patches/v12_0/add_export_type_field_in_party_master.py
+++ b/erpnext/patches/v12_0/add_export_type_field_in_party_master.py
@@ -5,37 +5,38 @@
 
 def execute():
 
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	make_custom_fields()
 
-	frappe.reload_doctype('Tax Category')
-	frappe.reload_doctype('Sales Taxes and Charges Template')
-	frappe.reload_doctype('Purchase Taxes and Charges Template')
+	frappe.reload_doctype("Tax Category")
+	frappe.reload_doctype("Sales Taxes and Charges Template")
+	frappe.reload_doctype("Purchase Taxes and Charges Template")
 
 	# Create tax category with inter state field checked
-	tax_category =  frappe.db.get_value('Tax Category', {'name': 'OUT OF STATE'}, 'name')
+	tax_category = frappe.db.get_value("Tax Category", {"name": "OUT OF STATE"}, "name")
 
 	if not tax_category:
-		inter_state_category = frappe.get_doc({
-			'doctype': 'Tax Category',
-			'title': 'OUT OF STATE',
-			'is_inter_state': 1
-		}).insert()
+		inter_state_category = frappe.get_doc(
+			{"doctype": "Tax Category", "title": "OUT OF STATE", "is_inter_state": 1}
+		).insert()
 
 		tax_category = inter_state_category.name
 
-	for doctype in ('Sales Taxes and Charges Template', 'Purchase Taxes and Charges Template'):
-		if not frappe.get_meta(doctype).has_field('is_inter_state'): continue
+	for doctype in ("Sales Taxes and Charges Template", "Purchase Taxes and Charges Template"):
+		if not frappe.get_meta(doctype).has_field("is_inter_state"):
+			continue
 
-		template = frappe.db.get_value(doctype, {'is_inter_state': 1, 'disabled': 0}, ['name'])
+		template = frappe.db.get_value(doctype, {"is_inter_state": 1, "disabled": 0}, ["name"])
 		if template:
-			frappe.db.set_value(doctype, template, 'tax_category', tax_category)
+			frappe.db.set_value(doctype, template, "tax_category", tax_category)
 
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			DELETE FROM `tabCustom Field`
 			WHERE fieldname = 'is_inter_state'
 			AND dt IN ('Sales Taxes and Charges Template', 'Purchase Taxes and Charges Template')
-		""")
+		"""
+		)
diff --git a/erpnext/patches/v12_0/add_gst_category_in_delivery_note.py b/erpnext/patches/v12_0/add_gst_category_in_delivery_note.py
index 6316bb3..5944889 100644
--- a/erpnext/patches/v12_0/add_gst_category_in_delivery_note.py
+++ b/erpnext/patches/v12_0/add_gst_category_in_delivery_note.py
@@ -3,16 +3,22 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	custom_fields = {
-		'Delivery Note': [
-			dict(fieldname='gst_category', label='GST Category',
-				fieldtype='Select', insert_after='gst_vehicle_type', print_hide=1,
-				options='\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders',
-				fetch_from='customer.gst_category', fetch_if_empty=1),
+		"Delivery Note": [
+			dict(
+				fieldname="gst_category",
+				label="GST Category",
+				fieldtype="Select",
+				insert_after="gst_vehicle_type",
+				print_hide=1,
+				options="\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders",
+				fetch_from="customer.gst_category",
+				fetch_if_empty=1,
+			),
 		]
 	}
 
diff --git a/erpnext/patches/v12_0/add_item_name_in_work_orders.py b/erpnext/patches/v12_0/add_item_name_in_work_orders.py
index d765b93..0e5cd4e 100644
--- a/erpnext/patches/v12_0/add_item_name_in_work_orders.py
+++ b/erpnext/patches/v12_0/add_item_name_in_work_orders.py
@@ -4,11 +4,13 @@
 def execute():
 	frappe.reload_doc("manufacturing", "doctype", "work_order")
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE
 			`tabWork Order` wo
 				JOIN `tabItem` item ON wo.production_item = item.item_code
 		SET
 			wo.item_name = item.item_name
-	""")
+	"""
+	)
 	frappe.db.commit()
diff --git a/erpnext/patches/v12_0/add_permission_in_lower_deduction.py b/erpnext/patches/v12_0/add_permission_in_lower_deduction.py
index 1d77e5a..24748b2 100644
--- a/erpnext/patches/v12_0/add_permission_in_lower_deduction.py
+++ b/erpnext/patches/v12_0/add_permission_in_lower_deduction.py
@@ -3,12 +3,12 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	frappe.reload_doc('regional', 'doctype', 'Lower Deduction Certificate')
+	frappe.reload_doc("regional", "doctype", "Lower Deduction Certificate")
 
-	add_permission('Lower Deduction Certificate', 'Accounts Manager', 0)
-	update_permission_property('Lower Deduction Certificate', 'Accounts Manager', 0, 'write', 1)
-	update_permission_property('Lower Deduction Certificate', 'Accounts Manager', 0, 'create', 1)
+	add_permission("Lower Deduction Certificate", "Accounts Manager", 0)
+	update_permission_property("Lower Deduction Certificate", "Accounts Manager", 0, "write", 1)
+	update_permission_property("Lower Deduction Certificate", "Accounts Manager", 0, "create", 1)
diff --git a/erpnext/patches/v12_0/add_state_code_for_ladakh.py b/erpnext/patches/v12_0/add_state_code_for_ladakh.py
index 6722b7b..4b06eb1 100644
--- a/erpnext/patches/v12_0/add_state_code_for_ladakh.py
+++ b/erpnext/patches/v12_0/add_state_code_for_ladakh.py
@@ -5,15 +5,15 @@
 
 def execute():
 
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	custom_fields = ['Address-gst_state', 'Tax Category-gst_state']
+	custom_fields = ["Address-gst_state", "Tax Category-gst_state"]
 
 	# Update options in gst_state custom fields
 	for field in custom_fields:
-		if frappe.db.exists('Custom Field', field):
-			gst_state_field = frappe.get_doc('Custom Field', field)
-			gst_state_field.options = '\n'.join(states)
+		if frappe.db.exists("Custom Field", field):
+			gst_state_field = frappe.get_doc("Custom Field", field)
+			gst_state_field.options = "\n".join(states)
 			gst_state_field.save()
diff --git a/erpnext/patches/v12_0/add_taxjar_integration_field.py b/erpnext/patches/v12_0/add_taxjar_integration_field.py
index b0ddf00..9217384 100644
--- a/erpnext/patches/v12_0/add_taxjar_integration_field.py
+++ b/erpnext/patches/v12_0/add_taxjar_integration_field.py
@@ -4,7 +4,7 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters={'country': 'United States'})
+	company = frappe.get_all("Company", filters={"country": "United States"})
 	if not company:
 		return
 
diff --git a/erpnext/patches/v12_0/add_variant_of_in_item_attribute_table.py b/erpnext/patches/v12_0/add_variant_of_in_item_attribute_table.py
index c3a422c..7f044c8 100644
--- a/erpnext/patches/v12_0/add_variant_of_in_item_attribute_table.py
+++ b/erpnext/patches/v12_0/add_variant_of_in_item_attribute_table.py
@@ -2,9 +2,11 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'item_variant_attribute')
-	frappe.db.sql('''
+	frappe.reload_doc("stock", "doctype", "item_variant_attribute")
+	frappe.db.sql(
+		"""
 		UPDATE `tabItem Variant Attribute` t1
 		INNER JOIN `tabItem` t2 ON t2.name = t1.parent
 		SET t1.variant_of = t2.variant_of
-	''')
+	"""
+	)
diff --git a/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py b/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py
index aec9cb8..744ea1c 100644
--- a/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py
+++ b/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py
@@ -4,10 +4,13 @@
 
 def execute():
 
-	frappe.reload_doc('accounts', 'doctype', 'accounting_dimension')
+	frappe.reload_doc("accounts", "doctype", "accounting_dimension")
 
-	accounting_dimensions = frappe.db.sql("""select fieldname, label, document_type, disabled from
-		`tabAccounting Dimension`""", as_dict=1)
+	accounting_dimensions = frappe.db.sql(
+		"""select fieldname, label, document_type, disabled from
+		`tabAccounting Dimension`""",
+		as_dict=1,
+	)
 
 	if not accounting_dimensions:
 		return
@@ -15,13 +18,19 @@
 	count = 1
 	for d in accounting_dimensions:
 
-		if count%2 == 0:
-			insert_after_field = 'dimension_col_break'
+		if count % 2 == 0:
+			insert_after_field = "dimension_col_break"
 		else:
-			insert_after_field = 'accounting_dimensions_section'
+			insert_after_field = "accounting_dimensions_section"
 
-		for doctype in ["Subscription Plan", "Subscription", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item",
-			"Expense Claim Detail", "Expense Taxes and Charges"]:
+		for doctype in [
+			"Subscription Plan",
+			"Subscription",
+			"Opening Invoice Creation Tool",
+			"Opening Invoice Creation Tool Item",
+			"Expense Claim Detail",
+			"Expense Taxes and Charges",
+		]:
 
 			field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": d.fieldname})
 
@@ -33,7 +42,7 @@
 				"label": d.label,
 				"fieldtype": "Link",
 				"options": d.document_type,
-				"insert_after": insert_after_field
+				"insert_after": insert_after_field,
 			}
 
 			create_custom_field(doctype, df)
diff --git a/erpnext/patches/v12_0/create_default_energy_point_rules.py b/erpnext/patches/v12_0/create_default_energy_point_rules.py
index 35eaca7..da200de 100644
--- a/erpnext/patches/v12_0/create_default_energy_point_rules.py
+++ b/erpnext/patches/v12_0/create_default_energy_point_rules.py
@@ -4,5 +4,5 @@
 
 
 def execute():
-	frappe.reload_doc('social', 'doctype', 'energy_point_rule')
+	frappe.reload_doc("social", "doctype", "energy_point_rule")
 	create_default_energy_point_rules()
diff --git a/erpnext/patches/v12_0/create_irs_1099_field_united_states.py b/erpnext/patches/v12_0/create_irs_1099_field_united_states.py
index efcc7cf..80e9047 100644
--- a/erpnext/patches/v12_0/create_irs_1099_field_united_states.py
+++ b/erpnext/patches/v12_0/create_irs_1099_field_united_states.py
@@ -5,12 +5,12 @@
 
 def execute():
 
-	frappe.reload_doc('accounts', 'doctype', 'allowed_to_transact_with', force=True)
-	frappe.reload_doc('accounts', 'doctype', 'pricing_rule_detail', force=True)
-	frappe.reload_doc('crm', 'doctype', 'lost_reason_detail', force=True)
-	frappe.reload_doc('setup', 'doctype', 'quotation_lost_reason_detail', force=True)
+	frappe.reload_doc("accounts", "doctype", "allowed_to_transact_with", force=True)
+	frappe.reload_doc("accounts", "doctype", "pricing_rule_detail", force=True)
+	frappe.reload_doc("crm", "doctype", "lost_reason_detail", force=True)
+	frappe.reload_doc("setup", "doctype", "quotation_lost_reason_detail", force=True)
 
-	company = frappe.get_all('Company', filters = {'country': 'United States'})
+	company = frappe.get_all("Company", filters={"country": "United States"})
 	if not company:
 		return
 
diff --git a/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py b/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py
index d4fbded..906baf2 100644
--- a/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py
+++ b/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py
@@ -6,44 +6,76 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'}, fields=['name'])
+	company = frappe.get_all("Company", filters={"country": "India"}, fields=["name"])
 	if not company:
 		return
 
 	frappe.reload_doc("regional", "doctype", "gst_settings")
 	frappe.reload_doc("accounts", "doctype", "gst_account")
 
-	journal_entry_types = frappe.get_meta("Journal Entry").get_options("voucher_type").split("\n") + ['Reversal Of ITC']
-	make_property_setter('Journal Entry', 'voucher_type', 'options', '\n'.join(journal_entry_types), '')
+	journal_entry_types = frappe.get_meta("Journal Entry").get_options("voucher_type").split("\n") + [
+		"Reversal Of ITC"
+	]
+	make_property_setter(
+		"Journal Entry", "voucher_type", "options", "\n".join(journal_entry_types), ""
+	)
 
 	custom_fields = {
-		'Journal Entry': [
-			dict(fieldname='reversal_type', label='Reversal Type',
-				fieldtype='Select', insert_after='voucher_type', print_hide=1,
+		"Journal Entry": [
+			dict(
+				fieldname="reversal_type",
+				label="Reversal Type",
+				fieldtype="Select",
+				insert_after="voucher_type",
+				print_hide=1,
 				options="As per rules 42 & 43 of CGST Rules\nOthers",
 				depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
-				mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'"),
-			dict(fieldname='company_address', label='Company Address',
-				fieldtype='Link', options='Address', insert_after='reversal_type',
-				print_hide=1, depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
-				mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'"),
-			dict(fieldname='company_gstin', label='Company GSTIN',
-				fieldtype='Data', read_only=1, insert_after='company_address', print_hide=1,
-				fetch_from='company_address.gstin',
+				mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+			),
+			dict(
+				fieldname="company_address",
+				label="Company Address",
+				fieldtype="Link",
+				options="Address",
+				insert_after="reversal_type",
+				print_hide=1,
 				depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
-				mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'")
+				mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+			),
+			dict(
+				fieldname="company_gstin",
+				label="Company GSTIN",
+				fieldtype="Data",
+				read_only=1,
+				insert_after="company_address",
+				print_hide=1,
+				fetch_from="company_address.gstin",
+				depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+				mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+			),
 		],
-		'Purchase Invoice': [
-			dict(fieldname='eligibility_for_itc', label='Eligibility For ITC',
-				fieldtype='Select', insert_after='reason_for_issuing_document', print_hide=1,
-				options='Input Service Distributor\nImport Of Service\nImport Of Capital Goods\nITC on Reverse Charge\nIneligible As Per Section 17(5)\nIneligible Others\nAll Other ITC',
-				default="All Other ITC")
+		"Purchase Invoice": [
+			dict(
+				fieldname="eligibility_for_itc",
+				label="Eligibility For ITC",
+				fieldtype="Select",
+				insert_after="reason_for_issuing_document",
+				print_hide=1,
+				options="Input Service Distributor\nImport Of Service\nImport Of Capital Goods\nITC on Reverse Charge\nIneligible As Per Section 17(5)\nIneligible Others\nAll Other ITC",
+				default="All Other ITC",
+			)
 		],
-		'Purchase Invoice Item': [
-			dict(fieldname='taxable_value', label='Taxable Value',
-				fieldtype='Currency', insert_after='base_net_amount', hidden=1, options="Company:company:default_currency",
-				print_hide=1)
-		]
+		"Purchase Invoice Item": [
+			dict(
+				fieldname="taxable_value",
+				label="Taxable Value",
+				fieldtype="Currency",
+				insert_after="base_net_amount",
+				hidden=1,
+				options="Company:company:default_currency",
+				print_hide=1,
+			)
+		],
 	}
 
 	create_custom_fields(custom_fields, update=True)
@@ -53,28 +85,40 @@
 
 	gst_accounts = get_gst_accounts(only_non_reverse_charge=1)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabCustom Field` SET fieldtype='Currency', options='Company:company:default_currency'
 		WHERE dt = 'Purchase Invoice' and fieldname in ('itc_integrated_tax', 'itc_state_tax', 'itc_central_tax',
 			'itc_cess_amount')
-	""")
+	"""
+	)
 
-	frappe.db.sql("""UPDATE `tabPurchase Invoice` set itc_integrated_tax = '0'
-		WHERE trim(coalesce(itc_integrated_tax, '')) = '' """)
+	frappe.db.sql(
+		"""UPDATE `tabPurchase Invoice` set itc_integrated_tax = '0'
+		WHERE trim(coalesce(itc_integrated_tax, '')) = '' """
+	)
 
-	frappe.db.sql("""UPDATE `tabPurchase Invoice` set itc_state_tax = '0'
-		WHERE trim(coalesce(itc_state_tax, '')) = '' """)
+	frappe.db.sql(
+		"""UPDATE `tabPurchase Invoice` set itc_state_tax = '0'
+		WHERE trim(coalesce(itc_state_tax, '')) = '' """
+	)
 
-	frappe.db.sql("""UPDATE `tabPurchase Invoice` set itc_central_tax = '0'
-		WHERE trim(coalesce(itc_central_tax, '')) = '' """)
+	frappe.db.sql(
+		"""UPDATE `tabPurchase Invoice` set itc_central_tax = '0'
+		WHERE trim(coalesce(itc_central_tax, '')) = '' """
+	)
 
-	frappe.db.sql("""UPDATE `tabPurchase Invoice` set itc_cess_amount = '0'
-		WHERE trim(coalesce(itc_cess_amount, '')) = '' """)
+	frappe.db.sql(
+		"""UPDATE `tabPurchase Invoice` set itc_cess_amount = '0'
+		WHERE trim(coalesce(itc_cess_amount, '')) = '' """
+	)
 
 	# Get purchase invoices
-	invoices = frappe.get_all('Purchase Invoice',
-		{'posting_date': ('>=', '2021-04-01'), 'eligibility_for_itc': ('!=', 'Ineligible')},
-		['name'])
+	invoices = frappe.get_all(
+		"Purchase Invoice",
+		{"posting_date": (">=", "2021-04-01"), "eligibility_for_itc": ("!=", "Ineligible")},
+		["name"],
+	)
 
 	amount_map = {}
 
@@ -82,37 +126,42 @@
 		invoice_list = set([d.name for d in invoices])
 
 		# Get GST applied
-		amounts = frappe.db.sql("""
+		amounts = frappe.db.sql(
+			"""
 			SELECT parent, account_head, sum(base_tax_amount_after_discount_amount) as amount
 			FROM `tabPurchase Taxes and Charges`
 			where parent in %s
 			GROUP BY parent, account_head
-		""", (invoice_list), as_dict=1)
+		""",
+			(invoice_list),
+			as_dict=1,
+		)
 
 		for d in amounts:
-			amount_map.setdefault(d.parent,
-			{
-				'itc_integrated_tax': 0,
-				'itc_state_tax': 0,
-				'itc_central_tax': 0,
-				'itc_cess_amount': 0
-			})
+			amount_map.setdefault(
+				d.parent,
+				{"itc_integrated_tax": 0, "itc_state_tax": 0, "itc_central_tax": 0, "itc_cess_amount": 0},
+			)
 			if not gst_accounts:
 				continue
 
-			if d.account_head in gst_accounts.get('igst_account'):
-				amount_map[d.parent]['itc_integrated_tax'] += d.amount
-			if d.account_head in gst_accounts.get('cgst_account'):
-				amount_map[d.parent]['itc_central_tax'] += d.amount
-			if d.account_head in gst_accounts.get('sgst_account'):
-				amount_map[d.parent]['itc_state_tax'] += d.amount
-			if d.account_head in gst_accounts.get('cess_account'):
-				amount_map[d.parent]['itc_cess_amount'] += d.amount
+			if d.account_head in gst_accounts.get("igst_account"):
+				amount_map[d.parent]["itc_integrated_tax"] += d.amount
+			if d.account_head in gst_accounts.get("cgst_account"):
+				amount_map[d.parent]["itc_central_tax"] += d.amount
+			if d.account_head in gst_accounts.get("sgst_account"):
+				amount_map[d.parent]["itc_state_tax"] += d.amount
+			if d.account_head in gst_accounts.get("cess_account"):
+				amount_map[d.parent]["itc_cess_amount"] += d.amount
 
 		for invoice, values in amount_map.items():
-			frappe.db.set_value('Purchase Invoice', invoice, {
-				'itc_integrated_tax': values.get('itc_integrated_tax'),
-				'itc_central_tax': values.get('itc_central_tax'),
-				'itc_state_tax': values['itc_state_tax'],
-				'itc_cess_amount': values['itc_cess_amount'],
-			})
+			frappe.db.set_value(
+				"Purchase Invoice",
+				invoice,
+				{
+					"itc_integrated_tax": values.get("itc_integrated_tax"),
+					"itc_central_tax": values.get("itc_central_tax"),
+					"itc_state_tax": values["itc_state_tax"],
+					"itc_cess_amount": values["itc_cess_amount"],
+				},
+			)
diff --git a/erpnext/patches/v12_0/create_taxable_value_field.py b/erpnext/patches/v12_0/create_taxable_value_field.py
index 55717cc..ad95303 100644
--- a/erpnext/patches/v12_0/create_taxable_value_field.py
+++ b/erpnext/patches/v12_0/create_taxable_value_field.py
@@ -3,15 +3,21 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	custom_fields = {
-		'Sales Invoice Item': [
-			dict(fieldname='taxable_value', label='Taxable Value',
-				fieldtype='Currency', insert_after='base_net_amount', hidden=1, options="Company:company:default_currency",
-				print_hide=1)
+		"Sales Invoice Item": [
+			dict(
+				fieldname="taxable_value",
+				label="Taxable Value",
+				fieldtype="Currency",
+				insert_after="base_net_amount",
+				hidden=1,
+				options="Company:company:default_currency",
+				print_hide=1,
+			)
 		]
 	}
 
diff --git a/erpnext/patches/v12_0/delete_priority_property_setter.py b/erpnext/patches/v12_0/delete_priority_property_setter.py
index cacc463..fbb0243 100644
--- a/erpnext/patches/v12_0/delete_priority_property_setter.py
+++ b/erpnext/patches/v12_0/delete_priority_property_setter.py
@@ -2,9 +2,11 @@
 
 
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		DELETE FROM `tabProperty Setter`
 		WHERE `tabProperty Setter`.doc_type='Issue'
 			AND `tabProperty Setter`.field_name='priority'
 			AND `tabProperty Setter`.property='options'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/fix_percent_complete_for_projects.py b/erpnext/patches/v12_0/fix_percent_complete_for_projects.py
index 36f51bc..1fbcfa4 100644
--- a/erpnext/patches/v12_0/fix_percent_complete_for_projects.py
+++ b/erpnext/patches/v12_0/fix_percent_complete_for_projects.py
@@ -4,10 +4,13 @@
 
 def execute():
 	for project in frappe.get_all("Project", fields=["name", "percent_complete_method"]):
-		total = frappe.db.count('Task', dict(project=project.name))
+		total = frappe.db.count("Task", dict(project=project.name))
 		if project.percent_complete_method == "Task Completion" and total > 0:
-			completed = frappe.db.sql("""select count(name) from tabTask where
-					project=%s and status in ('Cancelled', 'Completed')""", project.name)[0][0]
+			completed = frappe.db.sql(
+				"""select count(name) from tabTask where
+					project=%s and status in ('Cancelled', 'Completed')""",
+				project.name,
+			)[0][0]
 			percent_complete = flt(flt(completed) / total * 100, 2)
 			if project.percent_complete != percent_complete:
 				frappe.db.set_value("Project", project.name, "percent_complete", percent_complete)
diff --git a/erpnext/patches/v12_0/fix_quotation_expired_status.py b/erpnext/patches/v12_0/fix_quotation_expired_status.py
index e5c4b8c..285183b 100644
--- a/erpnext/patches/v12_0/fix_quotation_expired_status.py
+++ b/erpnext/patches/v12_0/fix_quotation_expired_status.py
@@ -13,12 +13,13 @@
 			so_item.docstatus = 1 and so.docstatus = 1
 			and so_item.parent = so.name
 			and so_item.prevdoc_docname = qo.name
-			and qo.valid_till < so.transaction_date""" # check if SO was created after quotation expired
+			and qo.valid_till < so.transaction_date"""  # check if SO was created after quotation expired
 
 	frappe.db.sql(
-		"""UPDATE `tabQuotation` qo SET qo.status = 'Expired' WHERE {cond} and exists({invalid_so_against_quo})"""
-			.format(cond=cond, invalid_so_against_quo=invalid_so_against_quo)
+		"""UPDATE `tabQuotation` qo SET qo.status = 'Expired' WHERE {cond} and exists({invalid_so_against_quo})""".format(
+			cond=cond, invalid_so_against_quo=invalid_so_against_quo
 		)
+	)
 
 	valid_so_against_quo = """
 		SELECT
@@ -27,9 +28,10 @@
 			so_item.docstatus = 1 and so.docstatus = 1
 			and so_item.parent = so.name
 			and so_item.prevdoc_docname = qo.name
-			and qo.valid_till >= so.transaction_date""" # check if SO was created before quotation expired
+			and qo.valid_till >= so.transaction_date"""  # check if SO was created before quotation expired
 
 	frappe.db.sql(
-		"""UPDATE `tabQuotation` qo SET qo.status = 'Closed' WHERE {cond} and exists({valid_so_against_quo})"""
-			.format(cond=cond, valid_so_against_quo=valid_so_against_quo)
+		"""UPDATE `tabQuotation` qo SET qo.status = 'Closed' WHERE {cond} and exists({valid_so_against_quo})""".format(
+			cond=cond, valid_so_against_quo=valid_so_against_quo
 		)
+	)
diff --git a/erpnext/patches/v12_0/generate_leave_ledger_entries.py b/erpnext/patches/v12_0/generate_leave_ledger_entries.py
index 90e46d0..354c509 100644
--- a/erpnext/patches/v12_0/generate_leave_ledger_entries.py
+++ b/erpnext/patches/v12_0/generate_leave_ledger_entries.py
@@ -7,8 +7,8 @@
 
 
 def execute():
-	""" Generates leave ledger entries for leave allocation/application/encashment
-		for last allocation """
+	"""Generates leave ledger entries for leave allocation/application/encashment
+	for last allocation"""
 	frappe.reload_doc("HR", "doctype", "Leave Ledger Entry")
 	frappe.reload_doc("HR", "doctype", "Leave Encashment")
 	frappe.reload_doc("HR", "doctype", "Leave Type")
@@ -22,55 +22,79 @@
 	generate_encashment_leave_ledger_entries()
 	generate_expiry_allocation_ledger_entries()
 
+
 def update_leave_allocation_fieldname():
-	''' maps data from old field to the new field '''
-	frappe.db.sql("""
+	"""maps data from old field to the new field"""
+	frappe.db.sql(
+		"""
 		UPDATE `tabLeave Allocation`
 		SET `unused_leaves` = `carry_forwarded_leaves`
-	""")
+	"""
+	)
+
 
 def generate_allocation_ledger_entries():
-	''' fix ledger entries for missing leave allocation transaction '''
+	"""fix ledger entries for missing leave allocation transaction"""
 	allocation_list = get_allocation_records()
 
 	for allocation in allocation_list:
-		if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Allocation', 'transaction_name': allocation.name}):
+		if not frappe.db.exists(
+			"Leave Ledger Entry",
+			{"transaction_type": "Leave Allocation", "transaction_name": allocation.name},
+		):
 			allocation_obj = frappe.get_doc("Leave Allocation", allocation)
 			allocation_obj.create_leave_ledger_entry()
 
+
 def generate_application_leave_ledger_entries():
-	''' fix ledger entries for missing leave application transaction '''
+	"""fix ledger entries for missing leave application transaction"""
 	leave_applications = get_leaves_application_records()
 
 	for application in leave_applications:
-		if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Application', 'transaction_name': application.name}):
+		if not frappe.db.exists(
+			"Leave Ledger Entry",
+			{"transaction_type": "Leave Application", "transaction_name": application.name},
+		):
 			frappe.get_doc("Leave Application", application.name).create_leave_ledger_entry()
 
+
 def generate_encashment_leave_ledger_entries():
-	''' fix ledger entries for missing leave encashment transaction '''
+	"""fix ledger entries for missing leave encashment transaction"""
 	leave_encashments = get_leave_encashment_records()
 
 	for encashment in leave_encashments:
-		if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Encashment', 'transaction_name': encashment.name}):
+		if not frappe.db.exists(
+			"Leave Ledger Entry",
+			{"transaction_type": "Leave Encashment", "transaction_name": encashment.name},
+		):
 			frappe.get_doc("Leave Encashment", encashment).create_leave_ledger_entry()
 
+
 def generate_expiry_allocation_ledger_entries():
-	''' fix ledger entries for missing leave allocation transaction '''
+	"""fix ledger entries for missing leave allocation transaction"""
 	from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import expire_allocation
+
 	allocation_list = get_allocation_records()
 
 	for allocation in allocation_list:
-		if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Allocation', 'transaction_name': allocation.name, 'is_expired': 1}):
+		if not frappe.db.exists(
+			"Leave Ledger Entry",
+			{"transaction_type": "Leave Allocation", "transaction_name": allocation.name, "is_expired": 1},
+		):
 			allocation_obj = frappe.get_doc("Leave Allocation", allocation)
 			if allocation_obj.to_date <= getdate(today()):
 				expire_allocation(allocation_obj)
 
+
 def get_allocation_records():
-	return frappe.get_all("Leave Allocation", filters={"docstatus": 1},
-		fields=['name'], order_by='to_date ASC')
+	return frappe.get_all(
+		"Leave Allocation", filters={"docstatus": 1}, fields=["name"], order_by="to_date ASC"
+	)
+
 
 def get_leaves_application_records():
-	return frappe.get_all("Leave Application", filters={"docstatus": 1}, fields=['name'])
+	return frappe.get_all("Leave Application", filters={"docstatus": 1}, fields=["name"])
+
 
 def get_leave_encashment_records():
-	return frappe.get_all("Leave Encashment", filters={"docstatus": 1}, fields=['name'])
+	return frappe.get_all("Leave Encashment", filters={"docstatus": 1}, fields=["name"])
diff --git a/erpnext/patches/v12_0/make_item_manufacturer.py b/erpnext/patches/v12_0/make_item_manufacturer.py
index d66f429..3f23365 100644
--- a/erpnext/patches/v12_0/make_item_manufacturer.py
+++ b/erpnext/patches/v12_0/make_item_manufacturer.py
@@ -9,20 +9,29 @@
 	frappe.reload_doc("stock", "doctype", "item_manufacturer")
 
 	item_manufacturer = []
-	for d in frappe.db.sql(""" SELECT name, manufacturer, manufacturer_part_no, creation, owner
-		FROM `tabItem` WHERE manufacturer is not null and manufacturer != ''""", as_dict=1):
-		item_manufacturer.append((
-			frappe.generate_hash("", 10),
-			d.name,
-			d.manufacturer,
-			d.manufacturer_part_no,
-			d.creation,
-			d.owner
-		))
+	for d in frappe.db.sql(
+		""" SELECT name, manufacturer, manufacturer_part_no, creation, owner
+		FROM `tabItem` WHERE manufacturer is not null and manufacturer != ''""",
+		as_dict=1,
+	):
+		item_manufacturer.append(
+			(
+				frappe.generate_hash("", 10),
+				d.name,
+				d.manufacturer,
+				d.manufacturer_part_no,
+				d.creation,
+				d.owner,
+			)
+		)
 
 	if item_manufacturer:
-		frappe.db.sql('''
+		frappe.db.sql(
+			"""
 			INSERT INTO `tabItem Manufacturer`
 			(`name`, `item_code`, `manufacturer`, `manufacturer_part_no`, `creation`, `owner`)
-			VALUES {}'''.format(', '.join(['%s'] * len(item_manufacturer))), tuple(item_manufacturer)
+			VALUES {}""".format(
+				", ".join(["%s"] * len(item_manufacturer))
+			),
+			tuple(item_manufacturer),
 		)
diff --git a/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py b/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py
index 7ae4c42..c069c24 100644
--- a/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py
+++ b/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py
@@ -2,16 +2,22 @@
 
 
 def execute():
-	frappe.reload_doc('accounts', 'doctype', 'bank', force=1)
+	frappe.reload_doc("accounts", "doctype", "bank", force=1)
 
-	if frappe.db.table_exists('Bank') and frappe.db.table_exists('Bank Account') and frappe.db.has_column('Bank Account', 'swift_number'):
+	if (
+		frappe.db.table_exists("Bank")
+		and frappe.db.table_exists("Bank Account")
+		and frappe.db.has_column("Bank Account", "swift_number")
+	):
 		try:
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				UPDATE `tabBank` b, `tabBank Account` ba
 				SET b.swift_number = ba.swift_number WHERE b.name = ba.bank
-			""")
+			"""
+			)
 		except Exception as e:
 			frappe.log_error(e, title="Patch Migration Failed")
 
-	frappe.reload_doc('accounts', 'doctype', 'bank_account')
-	frappe.reload_doc('accounts', 'doctype', 'payment_request')
+	frappe.reload_doc("accounts", "doctype", "bank_account")
+	frappe.reload_doc("accounts", "doctype", "payment_request")
diff --git a/erpnext/patches/v12_0/move_credit_limit_to_customer_credit_limit.py b/erpnext/patches/v12_0/move_credit_limit_to_customer_credit_limit.py
index 82dfba5..17c1966 100644
--- a/erpnext/patches/v12_0/move_credit_limit_to_customer_credit_limit.py
+++ b/erpnext/patches/v12_0/move_credit_limit_to_customer_credit_limit.py
@@ -6,7 +6,7 @@
 
 
 def execute():
-	''' Move credit limit and bypass credit limit to the child table of customer credit limit '''
+	"""Move credit limit and bypass credit limit to the child table of customer credit limit"""
 	frappe.reload_doc("Selling", "doctype", "Customer Credit Limit")
 	frappe.reload_doc("Selling", "doctype", "Customer")
 	frappe.reload_doc("Setup", "doctype", "Customer Group")
@@ -16,28 +16,32 @@
 
 	move_credit_limit_to_child_table()
 
-def move_credit_limit_to_child_table():
-	''' maps data from old field to the new field in the child table '''
 
-	companies = frappe.get_all("Company", 'name')
+def move_credit_limit_to_child_table():
+	"""maps data from old field to the new field in the child table"""
+
+	companies = frappe.get_all("Company", "name")
 	for doctype in ("Customer", "Customer Group"):
 		fields = ""
-		if doctype == "Customer" \
-				and frappe.db.has_column('Customer', 'bypass_credit_limit_check_at_sales_order'):
+		if doctype == "Customer" and frappe.db.has_column(
+			"Customer", "bypass_credit_limit_check_at_sales_order"
+		):
 			fields = ", bypass_credit_limit_check_at_sales_order"
 
-		credit_limit_records = frappe.db.sql('''
+		credit_limit_records = frappe.db.sql(
+			"""
 			SELECT name, credit_limit {0}
 			FROM `tab{1}` where credit_limit > 0
-		'''.format(fields, doctype), as_dict=1) #nosec
+		""".format(
+				fields, doctype
+			),
+			as_dict=1,
+		)  # nosec
 
 		for record in credit_limit_records:
 			doc = frappe.get_doc(doctype, record.name)
 			for company in companies:
-				row = frappe._dict({
-					'credit_limit': record.credit_limit,
-					'company': company.name
-				})
+				row = frappe._dict({"credit_limit": record.credit_limit, "company": company.name})
 				if doctype == "Customer":
 					row.bypass_credit_limit_check = record.bypass_credit_limit_check_at_sales_order
 
diff --git a/erpnext/patches/v12_0/move_due_advance_amount_to_pending_amount.py b/erpnext/patches/v12_0/move_due_advance_amount_to_pending_amount.py
index 5de7e69..8b8d963 100644
--- a/erpnext/patches/v12_0/move_due_advance_amount_to_pending_amount.py
+++ b/erpnext/patches/v12_0/move_due_advance_amount_to_pending_amount.py
@@ -6,7 +6,7 @@
 
 
 def execute():
-    ''' Move from due_advance_amount to pending_amount '''
+	"""Move from due_advance_amount to pending_amount"""
 
-    if frappe.db.has_column("Employee Advance", "due_advance_amount"):
-        frappe.db.sql(''' UPDATE `tabEmployee Advance` SET pending_amount=due_advance_amount ''')
+	if frappe.db.has_column("Employee Advance", "due_advance_amount"):
+		frappe.db.sql(""" UPDATE `tabEmployee Advance` SET pending_amount=due_advance_amount """)
diff --git a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py
index 1224d75..c4c3b69 100644
--- a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py
+++ b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py
@@ -12,17 +12,22 @@
 
 	frappe.reload_doc("accounts", "doctype", "item_tax_template_detail", force=1)
 	frappe.reload_doc("accounts", "doctype", "item_tax_template", force=1)
-	existing_templates = frappe.db.sql("""select template.name, details.tax_type, details.tax_rate
+	existing_templates = frappe.db.sql(
+		"""select template.name, details.tax_type, details.tax_rate
 		from `tabItem Tax Template` template, `tabItem Tax Template Detail` details
 		where details.parent=template.name
-		""", as_dict=1)
+		""",
+		as_dict=1,
+	)
 
 	if len(existing_templates):
 		for d in existing_templates:
 			item_tax_templates.setdefault(d.name, {})
 			item_tax_templates[d.name][d.tax_type] = d.tax_rate
 
-	for d in frappe.db.sql("""select parent as item_code, tax_type, tax_rate from `tabItem Tax`""", as_dict=1):
+	for d in frappe.db.sql(
+		"""select parent as item_code, tax_type, tax_rate from `tabItem Tax`""", as_dict=1
+	):
 		old_item_taxes.setdefault(d.item_code, [])
 		old_item_taxes[d.item_code].append(d)
 
@@ -49,7 +54,9 @@
 				item_tax_map[d.tax_type] = d.tax_rate
 
 		tax_types = []
-		item_tax_template_name = get_item_tax_template(item_tax_templates, item_tax_map, item_code, tax_types=tax_types)
+		item_tax_template_name = get_item_tax_template(
+			item_tax_templates, item_tax_map, item_code, tax_types=tax_types
+		)
 
 		# update the item tax table
 		frappe.db.sql("delete from `tabItem Tax` where parent=%s and parenttype='Item'", item_code)
@@ -61,17 +68,29 @@
 				d.db_insert()
 
 	doctypes = [
-		'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice',
-		'Supplier Quotation', 'Purchase Order', 'Purchase Receipt', 'Purchase Invoice'
+		"Quotation",
+		"Sales Order",
+		"Delivery Note",
+		"Sales Invoice",
+		"Supplier Quotation",
+		"Purchase Order",
+		"Purchase Receipt",
+		"Purchase Invoice",
 	]
 
 	for dt in doctypes:
-		for d in frappe.db.sql("""select name, parenttype, parent, item_code, item_tax_rate from `tab{0} Item`
+		for d in frappe.db.sql(
+			"""select name, parenttype, parent, item_code, item_tax_rate from `tab{0} Item`
 								where ifnull(item_tax_rate, '') not in ('', '{{}}')
-								and item_tax_template is NULL""".format(dt), as_dict=1):
+								and item_tax_template is NULL""".format(
+				dt
+			),
+			as_dict=1,
+		):
 			item_tax_map = json.loads(d.item_tax_rate)
-			item_tax_template_name = get_item_tax_template(item_tax_templates,
-				item_tax_map, d.item_code, d.parenttype, d.parent, tax_types=tax_types)
+			item_tax_template_name = get_item_tax_template(
+				item_tax_templates, item_tax_map, d.item_code, d.parenttype, d.parent, tax_types=tax_types
+			)
 			frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template_name)
 
 	frappe.db.auto_commit_on_many_writes = False
@@ -81,7 +100,10 @@
 	settings.determine_address_tax_category_from = "Billing Address"
 	settings.save()
 
-def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parenttype=None, parent=None, tax_types=None):
+
+def get_item_tax_template(
+	item_tax_templates, item_tax_map, item_code, parenttype=None, parent=None, tax_types=None
+):
 	# search for previously created item tax template by comparing tax maps
 	for template, item_tax_template_map in item_tax_templates.items():
 		if item_tax_map == item_tax_template_map:
@@ -93,15 +115,23 @@
 	item_tax_template_name = item_tax_template.title
 
 	for tax_type, tax_rate in item_tax_map.items():
-		account_details = frappe.db.get_value("Account", tax_type, ['name', 'account_type', 'company'], as_dict=1)
+		account_details = frappe.db.get_value(
+			"Account", tax_type, ["name", "account_type", "company"], as_dict=1
+		)
 		if account_details:
 			item_tax_template.company = account_details.company
 			if not item_tax_template_name:
 				# set name once company is set as name is generated from company & title
 				# setting name is required to update `item_tax_templates` dict
 				item_tax_template_name = item_tax_template.set_new_name()
-			if account_details.account_type not in ('Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation'):
-				frappe.db.set_value('Account', account_details.name, 'account_type', 'Chargeable')
+			if account_details.account_type not in (
+				"Tax",
+				"Chargeable",
+				"Income Account",
+				"Expense Account",
+				"Expenses Included In Valuation",
+			):
+				frappe.db.set_value("Account", account_details.name, "account_type", "Chargeable")
 		else:
 			parts = tax_type.strip().split(" - ")
 			account_name = " - ".join(parts[:-1])
@@ -109,18 +139,25 @@
 				tax_type = None
 			else:
 				company = get_company(parts[-1], parenttype, parent)
-				parent_account = frappe.get_value("Account", {"account_name": account_name, "company": company}, "parent_account")
+				parent_account = frappe.get_value(
+					"Account", {"account_name": account_name, "company": company}, "parent_account"
+				)
 				if not parent_account:
-					parent_account = frappe.db.get_value("Account",
-						filters={"account_type": "Tax", "root_type": "Liability", "is_group": 0, "company": company}, fieldname="parent_account")
+					parent_account = frappe.db.get_value(
+						"Account",
+						filters={"account_type": "Tax", "root_type": "Liability", "is_group": 0, "company": company},
+						fieldname="parent_account",
+					)
 				if not parent_account:
-					parent_account = frappe.db.get_value("Account",
-						filters={"account_type": "Tax", "root_type": "Liability", "is_group": 1, "company": company})
+					parent_account = frappe.db.get_value(
+						"Account",
+						filters={"account_type": "Tax", "root_type": "Liability", "is_group": 1, "company": company},
+					)
 				filters = {
 					"account_name": account_name,
 					"company": company,
 					"account_type": "Tax",
-					"parent_account": parent_account
+					"parent_account": parent_account,
 				}
 				tax_type = frappe.db.get_value("Account", filters)
 				if not tax_type:
@@ -130,11 +167,19 @@
 						account.insert()
 						tax_type = account.name
 					except frappe.DuplicateEntryError:
-						tax_type = frappe.db.get_value("Account", {"account_name": account_name, "company": company}, "name")
+						tax_type = frappe.db.get_value(
+							"Account", {"account_name": account_name, "company": company}, "name"
+						)
 
 		account_type = frappe.get_cached_value("Account", tax_type, "account_type")
 
-		if tax_type and account_type in ('Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation'):
+		if tax_type and account_type in (
+			"Tax",
+			"Chargeable",
+			"Income Account",
+			"Expense Account",
+			"Expenses Included In Valuation",
+		):
 			if tax_type not in tax_types:
 				item_tax_template.append("taxes", {"tax_type": tax_type, "tax_rate": tax_rate})
 				tax_types.append(tax_type)
@@ -145,14 +190,15 @@
 		item_tax_template.save()
 		return item_tax_template.name
 
+
 def get_company(company_abbr, parenttype=None, parent=None):
 	if parenttype and parent:
-		company = frappe.get_cached_value(parenttype, parent, 'company')
+		company = frappe.get_cached_value(parenttype, parent, "company")
 	else:
 		company = frappe.db.get_value("Company", filters={"abbr": company_abbr})
 
 	if not company:
-		companies = frappe.get_all('Company')
+		companies = frappe.get_all("Company")
 		if len(companies) == 1:
 			company = companies[0].name
 
diff --git a/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py b/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py
index c396891..6788cb2 100644
--- a/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py
+++ b/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py
@@ -12,10 +12,12 @@
 		if not (frappe.conf.plaid_client_id and frappe.conf.plaid_env and frappe.conf.plaid_secret):
 			plaid_settings.enabled = 0
 		else:
-			plaid_settings.update({
-				"plaid_client_id": frappe.conf.plaid_client_id,
-				"plaid_env": frappe.conf.plaid_env,
-				"plaid_secret": frappe.conf.plaid_secret
-			})
+			plaid_settings.update(
+				{
+					"plaid_client_id": frappe.conf.plaid_client_id,
+					"plaid_env": frappe.conf.plaid_env,
+					"plaid_secret": frappe.conf.plaid_secret,
+				}
+			)
 		plaid_settings.flags.ignore_mandatory = True
 		plaid_settings.save()
diff --git a/erpnext/patches/v12_0/move_target_distribution_from_parent_to_child.py b/erpnext/patches/v12_0/move_target_distribution_from_parent_to_child.py
index 36fe18d..7192610 100644
--- a/erpnext/patches/v12_0/move_target_distribution_from_parent_to_child.py
+++ b/erpnext/patches/v12_0/move_target_distribution_from_parent_to_child.py
@@ -6,19 +6,23 @@
 
 
 def execute():
-    frappe.reload_doc("setup", "doctype", "target_detail")
-    frappe.reload_doc("core", "doctype", "prepared_report")
+	frappe.reload_doc("setup", "doctype", "target_detail")
+	frappe.reload_doc("core", "doctype", "prepared_report")
 
-    for d in ['Sales Person', 'Sales Partner', 'Territory']:
-        frappe.db.sql("""
+	for d in ["Sales Person", "Sales Partner", "Territory"]:
+		frappe.db.sql(
+			"""
             UPDATE `tab{child_doc}`, `tab{parent_doc}`
             SET
                 `tab{child_doc}`.distribution_id = `tab{parent_doc}`.distribution_id
             WHERE
                 `tab{child_doc}`.parent = `tab{parent_doc}`.name
                 and `tab{parent_doc}`.distribution_id is not null and `tab{parent_doc}`.distribution_id != ''
-        """.format(parent_doc = d, child_doc = "Target Detail"))
+        """.format(
+				parent_doc=d, child_doc="Target Detail"
+			)
+		)
 
-    frappe.delete_doc("Report", "Sales Partner-wise Transaction Summary")
-    frappe.delete_doc("Report", "Sales Person Target Variance Item Group-Wise")
-    frappe.delete_doc("Report", "Territory Target Variance Item Group-Wise")
+	frappe.delete_doc("Report", "Sales Partner-wise Transaction Summary")
+	frappe.delete_doc("Report", "Sales Person Target Variance Item Group-Wise")
+	frappe.delete_doc("Report", "Territory Target Variance Item Group-Wise")
diff --git a/erpnext/patches/v12_0/purchase_receipt_status.py b/erpnext/patches/v12_0/purchase_receipt_status.py
index 459221e..3b828d6 100644
--- a/erpnext/patches/v12_0/purchase_receipt_status.py
+++ b/erpnext/patches/v12_0/purchase_receipt_status.py
@@ -7,6 +7,7 @@
 
 logger = frappe.logger("patch", allow_site=True, file_count=50)
 
+
 def execute():
 	affected_purchase_receipts = frappe.db.sql(
 		"""select name from `tabPurchase Receipt`
@@ -16,13 +17,13 @@
 	if not affected_purchase_receipts:
 		return
 
-	logger.info("purchase_receipt_status: begin patch, PR count: {}"
-				.format(len(affected_purchase_receipts)))
+	logger.info(
+		"purchase_receipt_status: begin patch, PR count: {}".format(len(affected_purchase_receipts))
+	)
 
 	frappe.reload_doc("stock", "doctype", "Purchase Receipt")
 	frappe.reload_doc("stock", "doctype", "Purchase Receipt Item")
 
-
 	for pr in affected_purchase_receipts:
 		pr_name = pr[0]
 		logger.info("purchase_receipt_status: patching PR - {}".format(pr_name))
diff --git a/erpnext/patches/v12_0/recalculate_requested_qty_in_bin.py b/erpnext/patches/v12_0/recalculate_requested_qty_in_bin.py
index 8dec9ff..661152b 100644
--- a/erpnext/patches/v12_0/recalculate_requested_qty_in_bin.py
+++ b/erpnext/patches/v12_0/recalculate_requested_qty_in_bin.py
@@ -4,13 +4,18 @@
 
 
 def execute():
-	bin_details = frappe.db.sql("""
+	bin_details = frappe.db.sql(
+		"""
 		SELECT item_code, warehouse
-		FROM `tabBin`""",as_dict=1)
+		FROM `tabBin`""",
+		as_dict=1,
+	)
 
 	for entry in bin_details:
 		if not (entry.item_code and entry.warehouse):
 			continue
-		update_bin_qty(entry.get("item_code"), entry.get("warehouse"), {
-			"indented_qty": get_indented_qty(entry.get("item_code"), entry.get("warehouse"))
-		})
+		update_bin_qty(
+			entry.get("item_code"),
+			entry.get("warehouse"),
+			{"indented_qty": get_indented_qty(entry.get("item_code"), entry.get("warehouse"))},
+		)
diff --git a/erpnext/patches/v12_0/remove_bank_remittance_custom_fields.py b/erpnext/patches/v12_0/remove_bank_remittance_custom_fields.py
index 12768a6..b18f4eb 100644
--- a/erpnext/patches/v12_0/remove_bank_remittance_custom_fields.py
+++ b/erpnext/patches/v12_0/remove_bank_remittance_custom_fields.py
@@ -4,10 +4,15 @@
 def execute():
 	frappe.reload_doc("accounts", "doctype", "tax_category")
 	frappe.reload_doc("stock", "doctype", "item_manufacturer")
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 	if frappe.db.exists("Custom Field", "Company-bank_remittance_section"):
-		deprecated_fields = ['bank_remittance_section', 'client_code', 'remittance_column_break', 'product_code']
+		deprecated_fields = [
+			"bank_remittance_section",
+			"client_code",
+			"remittance_column_break",
+			"product_code",
+		]
 		for i in range(len(deprecated_fields)):
-			frappe.delete_doc("Custom Field", 'Company-'+deprecated_fields[i])
+			frappe.delete_doc("Custom Field", "Company-" + deprecated_fields[i])
diff --git a/erpnext/patches/v12_0/remove_denied_leaves_from_leave_ledger.py b/erpnext/patches/v12_0/remove_denied_leaves_from_leave_ledger.py
index d1d4bcc..4029a3f 100644
--- a/erpnext/patches/v12_0/remove_denied_leaves_from_leave_ledger.py
+++ b/erpnext/patches/v12_0/remove_denied_leaves_from_leave_ledger.py
@@ -6,8 +6,8 @@
 
 
 def execute():
-	''' Delete leave ledger entry created
-		via leave applications with status != Approved '''
+	"""Delete leave ledger entry created
+	via leave applications with status != Approved"""
 	if not frappe.db.a_row_exists("Leave Ledger Entry"):
 		return
 
@@ -15,14 +15,21 @@
 	if leave_application_list:
 		delete_denied_leaves_from_leave_ledger_entry(leave_application_list)
 
+
 def get_denied_leave_application_list():
-	return frappe.db.sql_list(''' Select name from `tabLeave Application` where status <> 'Approved' ''')
+	return frappe.db.sql_list(
+		""" Select name from `tabLeave Application` where status <> 'Approved' """
+	)
+
 
 def delete_denied_leaves_from_leave_ledger_entry(leave_application_list):
 	if leave_application_list:
-		frappe.db.sql(''' Delete
+		frappe.db.sql(
+			""" Delete
 			FROM `tabLeave Ledger Entry`
 			WHERE
 				transaction_type = 'Leave Application'
-				AND transaction_name in (%s) ''' % (', '.join(['%s'] * len(leave_application_list))), #nosec
-				tuple(leave_application_list))
+				AND transaction_name in (%s) """
+			% (", ".join(["%s"] * len(leave_application_list))),  # nosec
+			tuple(leave_application_list),
+		)
diff --git a/erpnext/patches/v12_0/remove_duplicate_leave_ledger_entries.py b/erpnext/patches/v12_0/remove_duplicate_leave_ledger_entries.py
index 6ad68cc..8247734 100644
--- a/erpnext/patches/v12_0/remove_duplicate_leave_ledger_entries.py
+++ b/erpnext/patches/v12_0/remove_duplicate_leave_ledger_entries.py
@@ -7,16 +7,18 @@
 
 def execute():
 	"""Delete duplicate leave ledger entries of type allocation created."""
-	frappe.reload_doc('hr', 'doctype', 'leave_ledger_entry')
+	frappe.reload_doc("hr", "doctype", "leave_ledger_entry")
 	if not frappe.db.a_row_exists("Leave Ledger Entry"):
 		return
 
 	duplicate_records_list = get_duplicate_records()
 	delete_duplicate_ledger_entries(duplicate_records_list)
 
+
 def get_duplicate_records():
 	"""Fetch all but one duplicate records from the list of expired leave allocation."""
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT name, employee, transaction_name, leave_type, is_carry_forward, from_date, to_date
 		FROM `tabLeave Ledger Entry`
 		WHERE
@@ -29,13 +31,17 @@
 			count(name) > 1
 		ORDER BY
 			creation
-	""")
+	"""
+	)
+
 
 def delete_duplicate_ledger_entries(duplicate_records_list):
 	"""Delete duplicate leave ledger entries."""
-	if not duplicate_records_list: return
+	if not duplicate_records_list:
+		return
 	for d in duplicate_records_list:
-		frappe.db.sql('''
+		frappe.db.sql(
+			"""
 			DELETE FROM `tabLeave Ledger Entry`
 			WHERE name != %s
 				AND employee = %s
@@ -44,4 +50,6 @@
 				AND is_carry_forward = %s
 				AND from_date = %s
 				AND to_date = %s
-		''', tuple(d))
+		""",
+			tuple(d),
+		)
diff --git a/erpnext/patches/v12_0/rename_account_type_doctype.py b/erpnext/patches/v12_0/rename_account_type_doctype.py
index e33a1d0..ab19554 100644
--- a/erpnext/patches/v12_0/rename_account_type_doctype.py
+++ b/erpnext/patches/v12_0/rename_account_type_doctype.py
@@ -2,6 +2,6 @@
 
 
 def execute():
-	frappe.rename_doc('DocType', 'Account Type', 'Bank Account Type', force=True)
-	frappe.rename_doc('DocType', 'Account Subtype', 'Bank Account Subtype', force=True)
-	frappe.reload_doc('accounts', 'doctype', 'bank_account')
+	frappe.rename_doc("DocType", "Account Type", "Bank Account Type", force=True)
+	frappe.rename_doc("DocType", "Account Subtype", "Bank Account Subtype", force=True)
+	frappe.reload_doc("accounts", "doctype", "bank_account")
diff --git a/erpnext/patches/v12_0/rename_bank_account_field_in_journal_entry_account.py b/erpnext/patches/v12_0/rename_bank_account_field_in_journal_entry_account.py
index a5d986a..9268753 100644
--- a/erpnext/patches/v12_0/rename_bank_account_field_in_journal_entry_account.py
+++ b/erpnext/patches/v12_0/rename_bank_account_field_in_journal_entry_account.py
@@ -7,12 +7,13 @@
 
 
 def execute():
-	''' Change the fieldname from bank_account_no to bank_account '''
+	"""Change the fieldname from bank_account_no to bank_account"""
 	if not frappe.get_meta("Journal Entry Account").has_field("bank_account"):
 		frappe.reload_doc("Accounts", "doctype", "Journal Entry Account")
 		update_journal_entry_account_fieldname()
 
+
 def update_journal_entry_account_fieldname():
-	''' maps data from old field to the new field '''
-	if frappe.db.has_column('Journal Entry Account', 'bank_account_no'):
+	"""maps data from old field to the new field"""
+	if frappe.db.has_column("Journal Entry Account", "bank_account_no"):
 		rename_field("Journal Entry Account", "bank_account_no", "bank_account")
diff --git a/erpnext/patches/v12_0/rename_bank_reconciliation.py b/erpnext/patches/v12_0/rename_bank_reconciliation.py
index 51ff0c8..aacd6e8 100644
--- a/erpnext/patches/v12_0/rename_bank_reconciliation.py
+++ b/erpnext/patches/v12_0/rename_bank_reconciliation.py
@@ -7,8 +7,8 @@
 
 def execute():
 	if frappe.db.table_exists("Bank Reconciliation"):
-		frappe.rename_doc('DocType', 'Bank Reconciliation', 'Bank Clearance', force=True)
-		frappe.reload_doc('Accounts', 'doctype', 'Bank Clearance')
+		frappe.rename_doc("DocType", "Bank Reconciliation", "Bank Clearance", force=True)
+		frappe.reload_doc("Accounts", "doctype", "Bank Clearance")
 
-		frappe.rename_doc('DocType', 'Bank Reconciliation Detail', 'Bank Clearance Detail', force=True)
-		frappe.reload_doc('Accounts', 'doctype', 'Bank Clearance Detail')
+		frappe.rename_doc("DocType", "Bank Reconciliation Detail", "Bank Clearance Detail", force=True)
+		frappe.reload_doc("Accounts", "doctype", "Bank Clearance Detail")
diff --git a/erpnext/patches/v12_0/rename_bank_reconciliation_fields.py b/erpnext/patches/v12_0/rename_bank_reconciliation_fields.py
index 629cd5b..e2a3887 100644
--- a/erpnext/patches/v12_0/rename_bank_reconciliation_fields.py
+++ b/erpnext/patches/v12_0/rename_bank_reconciliation_fields.py
@@ -5,11 +5,24 @@
 
 
 def _rename_single_field(**kwargs):
-	count = frappe.db.sql("SELECT COUNT(*) FROM tabSingles WHERE doctype='{doctype}' AND field='{new_name}';".format(**kwargs))[0][0] #nosec
+	count = frappe.db.sql(
+		"SELECT COUNT(*) FROM tabSingles WHERE doctype='{doctype}' AND field='{new_name}';".format(
+			**kwargs
+		)
+	)[0][
+		0
+	]  # nosec
 	if count == 0:
-		frappe.db.sql("UPDATE tabSingles SET field='{new_name}' WHERE doctype='{doctype}' AND field='{old_name}';".format(**kwargs)) #nosec
+		frappe.db.sql(
+			"UPDATE tabSingles SET field='{new_name}' WHERE doctype='{doctype}' AND field='{old_name}';".format(
+				**kwargs
+			)
+		)  # nosec
+
 
 def execute():
-	_rename_single_field(doctype = "Bank Clearance", old_name = "bank_account" , new_name = "account")
-	_rename_single_field(doctype = "Bank Clearance", old_name = "bank_account_no", new_name = "bank_account")
+	_rename_single_field(doctype="Bank Clearance", old_name="bank_account", new_name="account")
+	_rename_single_field(
+		doctype="Bank Clearance", old_name="bank_account_no", new_name="bank_account"
+	)
 	frappe.reload_doc("Accounts", "doctype", "Bank Clearance")
diff --git a/erpnext/patches/v12_0/rename_lost_reason_detail.py b/erpnext/patches/v12_0/rename_lost_reason_detail.py
index 96ae979..2f7f842 100644
--- a/erpnext/patches/v12_0/rename_lost_reason_detail.py
+++ b/erpnext/patches/v12_0/rename_lost_reason_detail.py
@@ -2,17 +2,23 @@
 
 
 def execute():
-    if frappe.db.exists("DocType", "Lost Reason Detail"):
-        frappe.reload_doc("crm", "doctype", "opportunity_lost_reason")
-        frappe.reload_doc("crm", "doctype", "opportunity_lost_reason_detail")
-        frappe.reload_doc("setup", "doctype", "quotation_lost_reason_detail")
+	if frappe.db.exists("DocType", "Lost Reason Detail"):
+		frappe.reload_doc("crm", "doctype", "opportunity_lost_reason")
+		frappe.reload_doc("crm", "doctype", "opportunity_lost_reason_detail")
+		frappe.reload_doc("setup", "doctype", "quotation_lost_reason_detail")
 
-        frappe.db.sql("""INSERT INTO `tabOpportunity Lost Reason Detail` SELECT * FROM `tabLost Reason Detail` WHERE `parenttype` = 'Opportunity'""")
+		frappe.db.sql(
+			"""INSERT INTO `tabOpportunity Lost Reason Detail` SELECT * FROM `tabLost Reason Detail` WHERE `parenttype` = 'Opportunity'"""
+		)
 
-        frappe.db.sql("""INSERT INTO `tabQuotation Lost Reason Detail` SELECT * FROM `tabLost Reason Detail` WHERE `parenttype` = 'Quotation'""")
+		frappe.db.sql(
+			"""INSERT INTO `tabQuotation Lost Reason Detail` SELECT * FROM `tabLost Reason Detail` WHERE `parenttype` = 'Quotation'"""
+		)
 
-        frappe.db.sql("""INSERT INTO `tabQuotation Lost Reason` (`name`, `creation`, `modified`, `modified_by`, `owner`, `docstatus`, `parent`, `parentfield`, `parenttype`, `idx`, `_comments`, `_assign`, `_user_tags`, `_liked_by`, `order_lost_reason`)
+		frappe.db.sql(
+			"""INSERT INTO `tabQuotation Lost Reason` (`name`, `creation`, `modified`, `modified_by`, `owner`, `docstatus`, `parent`, `parentfield`, `parenttype`, `idx`, `_comments`, `_assign`, `_user_tags`, `_liked_by`, `order_lost_reason`)
             SELECT o.`name`, o.`creation`, o.`modified`, o.`modified_by`, o.`owner`, o.`docstatus`, o.`parent`, o.`parentfield`, o.`parenttype`, o.`idx`, o.`_comments`, o.`_assign`, o.`_user_tags`, o.`_liked_by`, o.`lost_reason`
-            FROM `tabOpportunity Lost Reason` o LEFT JOIN `tabQuotation Lost Reason` q ON q.name = o.name WHERE q.name IS NULL""")
+            FROM `tabOpportunity Lost Reason` o LEFT JOIN `tabQuotation Lost Reason` q ON q.name = o.name WHERE q.name IS NULL"""
+		)
 
-        frappe.delete_doc("DocType", "Lost Reason Detail")
+		frappe.delete_doc("DocType", "Lost Reason Detail")
diff --git a/erpnext/patches/v12_0/rename_pos_closing_doctype.py b/erpnext/patches/v12_0/rename_pos_closing_doctype.py
index f5f0112..fb80f8d 100644
--- a/erpnext/patches/v12_0/rename_pos_closing_doctype.py
+++ b/erpnext/patches/v12_0/rename_pos_closing_doctype.py
@@ -7,17 +7,19 @@
 def execute():
 	if frappe.db.table_exists("POS Closing Voucher"):
 		if not frappe.db.exists("DocType", "POS Closing Entry"):
-			frappe.rename_doc('DocType', 'POS Closing Voucher', 'POS Closing Entry', force=True)
+			frappe.rename_doc("DocType", "POS Closing Voucher", "POS Closing Entry", force=True)
 
-		if not frappe.db.exists('DocType', 'POS Closing Entry Taxes'):
-			frappe.rename_doc('DocType', 'POS Closing Voucher Taxes', 'POS Closing Entry Taxes', force=True)
+		if not frappe.db.exists("DocType", "POS Closing Entry Taxes"):
+			frappe.rename_doc("DocType", "POS Closing Voucher Taxes", "POS Closing Entry Taxes", force=True)
 
-		if not frappe.db.exists('DocType', 'POS Closing Voucher Details'):
-			frappe.rename_doc('DocType', 'POS Closing Voucher Details', 'POS Closing Entry Detail', force=True)
+		if not frappe.db.exists("DocType", "POS Closing Voucher Details"):
+			frappe.rename_doc(
+				"DocType", "POS Closing Voucher Details", "POS Closing Entry Detail", force=True
+			)
 
-		frappe.reload_doc('Accounts', 'doctype', 'POS Closing Entry')
-		frappe.reload_doc('Accounts', 'doctype', 'POS Closing Entry Taxes')
-		frappe.reload_doc('Accounts', 'doctype', 'POS Closing Entry Detail')
+		frappe.reload_doc("Accounts", "doctype", "POS Closing Entry")
+		frappe.reload_doc("Accounts", "doctype", "POS Closing Entry Taxes")
+		frappe.reload_doc("Accounts", "doctype", "POS Closing Entry Detail")
 
 	if frappe.db.exists("DocType", "POS Closing Voucher"):
 		frappe.delete_doc("DocType", "POS Closing Voucher")
diff --git a/erpnext/patches/v12_0/rename_pricing_rule_child_doctypes.py b/erpnext/patches/v12_0/rename_pricing_rule_child_doctypes.py
index 87630fb..8d4c013 100644
--- a/erpnext/patches/v12_0/rename_pricing_rule_child_doctypes.py
+++ b/erpnext/patches/v12_0/rename_pricing_rule_child_doctypes.py
@@ -5,16 +5,17 @@
 import frappe
 
 doctypes = {
-    'Price Discount Slab': 'Promotional Scheme Price Discount',
-    'Product Discount Slab': 'Promotional Scheme Product Discount',
-    'Apply Rule On Item Code': 'Pricing Rule Item Code',
-    'Apply Rule On Item Group': 'Pricing Rule Item Group',
-    'Apply Rule On Brand': 'Pricing Rule Brand'
+	"Price Discount Slab": "Promotional Scheme Price Discount",
+	"Product Discount Slab": "Promotional Scheme Product Discount",
+	"Apply Rule On Item Code": "Pricing Rule Item Code",
+	"Apply Rule On Item Group": "Pricing Rule Item Group",
+	"Apply Rule On Brand": "Pricing Rule Brand",
 }
 
+
 def execute():
-    for old_doc, new_doc in doctypes.items():
-        if not frappe.db.table_exists(new_doc) and frappe.db.table_exists(old_doc):
-            frappe.rename_doc('DocType', old_doc, new_doc)
-            frappe.reload_doc("accounts", "doctype", frappe.scrub(new_doc))
-            frappe.delete_doc("DocType", old_doc)
+	for old_doc, new_doc in doctypes.items():
+		if not frappe.db.table_exists(new_doc) and frappe.db.table_exists(old_doc):
+			frappe.rename_doc("DocType", old_doc, new_doc)
+			frappe.reload_doc("accounts", "doctype", frappe.scrub(new_doc))
+			frappe.delete_doc("DocType", old_doc)
diff --git a/erpnext/patches/v12_0/rename_tolerance_fields.py b/erpnext/patches/v12_0/rename_tolerance_fields.py
index ca2427b..ef1ba65 100644
--- a/erpnext/patches/v12_0/rename_tolerance_fields.py
+++ b/erpnext/patches/v12_0/rename_tolerance_fields.py
@@ -7,8 +7,8 @@
 	frappe.reload_doc("stock", "doctype", "stock_settings")
 	frappe.reload_doc("accounts", "doctype", "accounts_settings")
 
-	rename_field('Stock Settings', "tolerance", "over_delivery_receipt_allowance")
-	rename_field('Item', "tolerance", "over_delivery_receipt_allowance")
+	rename_field("Stock Settings", "tolerance", "over_delivery_receipt_allowance")
+	rename_field("Item", "tolerance", "over_delivery_receipt_allowance")
 
 	qty_allowance = frappe.db.get_single_value("Stock Settings", "over_delivery_receipt_allowance")
 	frappe.db.set_value("Accounts Settings", None, "over_delivery_receipt_allowance", qty_allowance)
diff --git a/erpnext/patches/v12_0/replace_accounting_with_accounts_in_home_settings.py b/erpnext/patches/v12_0/replace_accounting_with_accounts_in_home_settings.py
index ff332f7..21dd258 100644
--- a/erpnext/patches/v12_0/replace_accounting_with_accounts_in_home_settings.py
+++ b/erpnext/patches/v12_0/replace_accounting_with_accounts_in_home_settings.py
@@ -2,5 +2,7 @@
 
 
 def execute():
-	frappe.db.sql("""UPDATE `tabUser` SET `home_settings` = REPLACE(`home_settings`, 'Accounting', 'Accounts')""")
-	frappe.cache().delete_key('home_settings')
+	frappe.db.sql(
+		"""UPDATE `tabUser` SET `home_settings` = REPLACE(`home_settings`, 'Accounting', 'Accounts')"""
+	)
+	frappe.cache().delete_key("home_settings")
diff --git a/erpnext/patches/v12_0/repost_stock_ledger_entries_for_target_warehouse.py b/erpnext/patches/v12_0/repost_stock_ledger_entries_for_target_warehouse.py
index 198963d..a4a8587 100644
--- a/erpnext/patches/v12_0/repost_stock_ledger_entries_for_target_warehouse.py
+++ b/erpnext/patches/v12_0/repost_stock_ledger_entries_for_target_warehouse.py
@@ -6,51 +6,79 @@
 
 
 def execute():
-	warehouse_perm = frappe.get_all("User Permission",
-		fields=["count(*) as p_count", "is_default", "user"], filters={"allow": "Warehouse"}, group_by="user")
+	warehouse_perm = frappe.get_all(
+		"User Permission",
+		fields=["count(*) as p_count", "is_default", "user"],
+		filters={"allow": "Warehouse"},
+		group_by="user",
+	)
 
 	if not warehouse_perm:
 		return
 
 	execute_patch = False
 	for perm_data in warehouse_perm:
-		if perm_data.p_count == 1 or (perm_data.p_count > 1 and frappe.get_all("User Permission",
-			filters = {"user": perm_data.user, "allow": "warehouse", "is_default": 1}, limit=1)):
+		if perm_data.p_count == 1 or (
+			perm_data.p_count > 1
+			and frappe.get_all(
+				"User Permission",
+				filters={"user": perm_data.user, "allow": "warehouse", "is_default": 1},
+				limit=1,
+			)
+		):
 			execute_patch = True
 			break
 
-	if not execute_patch: return
+	if not execute_patch:
+		return
 
 	for doctype in ["Sales Invoice", "Delivery Note"]:
-		if not frappe.get_meta(doctype + ' Item').get_field("target_warehouse").hidden: continue
+		if not frappe.get_meta(doctype + " Item").get_field("target_warehouse").hidden:
+			continue
 
 		cond = ""
 		if doctype == "Sales Invoice":
 			cond = " AND parent_doc.update_stock = 1"
 
-		data = frappe.db.sql(""" SELECT parent_doc.name as name, child_doc.name as child_name
+		data = frappe.db.sql(
+			""" SELECT parent_doc.name as name, child_doc.name as child_name
 			FROM
 				`tab{doctype}` parent_doc, `tab{doctype} Item` child_doc
 			WHERE
 				parent_doc.name = child_doc.parent AND parent_doc.docstatus < 2
 				AND child_doc.target_warehouse is not null AND child_doc.target_warehouse != ''
 				AND child_doc.creation > '2020-04-16' {cond}
-		""".format(doctype=doctype, cond=cond), as_dict=1)
+		""".format(
+				doctype=doctype, cond=cond
+			),
+			as_dict=1,
+		)
 
 		if data:
 			names = [d.child_name for d in data]
-			frappe.db.sql(""" UPDATE `tab{0} Item` set target_warehouse = null
-				WHERE name in ({1}) """.format(doctype, ','.join(["%s"] * len(names) )), tuple(names))
+			frappe.db.sql(
+				""" UPDATE `tab{0} Item` set target_warehouse = null
+				WHERE name in ({1}) """.format(
+					doctype, ",".join(["%s"] * len(names))
+				),
+				tuple(names),
+			)
 
-			frappe.db.sql(""" UPDATE `tabPacked Item` set target_warehouse = null
+			frappe.db.sql(
+				""" UPDATE `tabPacked Item` set target_warehouse = null
 				WHERE parenttype = '{0}' and parent_detail_docname in ({1})
-			""".format(doctype, ','.join(["%s"] * len(names) )), tuple(names))
+			""".format(
+					doctype, ",".join(["%s"] * len(names))
+				),
+				tuple(names),
+			)
 
 			parent_names = list(set([d.name for d in data]))
 
 			for d in parent_names:
 				doc = frappe.get_doc(doctype, d)
-				if doc.docstatus != 1: continue
+				if doc.docstatus != 1:
+					continue
 
 				doc.docstatus = 2
 				doc.update_stock_ledger()
@@ -61,9 +89,13 @@
 				doc.update_stock_ledger()
 				doc.make_gl_entries()
 
-	if frappe.get_meta('Sales Order Item').get_field("target_warehouse").hidden:
-		frappe.db.sql(""" UPDATE `tabSales Order Item` set target_warehouse = null
-			WHERE creation > '2020-04-16' and docstatus < 2 """)
+	if frappe.get_meta("Sales Order Item").get_field("target_warehouse").hidden:
+		frappe.db.sql(
+			""" UPDATE `tabSales Order Item` set target_warehouse = null
+			WHERE creation > '2020-04-16' and docstatus < 2 """
+		)
 
-		frappe.db.sql(""" UPDATE `tabPacked Item` set target_warehouse = null
-			WHERE creation > '2020-04-16' and docstatus < 2 and parenttype = 'Sales Order' """)
+		frappe.db.sql(
+			""" UPDATE `tabPacked Item` set target_warehouse = null
+			WHERE creation > '2020-04-16' and docstatus < 2 and parenttype = 'Sales Order' """
+		)
diff --git a/erpnext/patches/v12_0/set_against_blanket_order_in_sales_and_purchase_order.py b/erpnext/patches/v12_0/set_against_blanket_order_in_sales_and_purchase_order.py
index b76e34a..d88593b 100644
--- a/erpnext/patches/v12_0/set_against_blanket_order_in_sales_and_purchase_order.py
+++ b/erpnext/patches/v12_0/set_against_blanket_order_in_sales_and_purchase_order.py
@@ -3,12 +3,16 @@
 
 def execute():
 
-	frappe.reload_doc('selling', 'doctype', 'sales_order_item', force=True)
-	frappe.reload_doc('buying', 'doctype', 'purchase_order_item', force=True)
+	frappe.reload_doc("selling", "doctype", "sales_order_item", force=True)
+	frappe.reload_doc("buying", "doctype", "purchase_order_item", force=True)
 
-	for doctype in ('Sales Order Item', 'Purchase Order Item'):
-		frappe.db.sql("""
+	for doctype in ("Sales Order Item", "Purchase Order Item"):
+		frappe.db.sql(
+			"""
 			UPDATE `tab{0}`
 			SET against_blanket_order = 1
 			WHERE ifnull(blanket_order, '') != ''
-		""".format(doctype))
+		""".format(
+				doctype
+			)
+		)
diff --git a/erpnext/patches/v12_0/set_automatically_process_deferred_accounting_in_accounts_settings.py b/erpnext/patches/v12_0/set_automatically_process_deferred_accounting_in_accounts_settings.py
index 8f29fc8..37af989 100644
--- a/erpnext/patches/v12_0/set_automatically_process_deferred_accounting_in_accounts_settings.py
+++ b/erpnext/patches/v12_0/set_automatically_process_deferred_accounting_in_accounts_settings.py
@@ -4,4 +4,6 @@
 def execute():
 	frappe.reload_doc("accounts", "doctype", "accounts_settings")
 
-	frappe.db.set_value("Accounts Settings", None, "automatically_process_deferred_accounting_entry", 1)
+	frappe.db.set_value(
+		"Accounts Settings", None, "automatically_process_deferred_accounting_entry", 1
+	)
diff --git a/erpnext/patches/v12_0/set_cost_center_in_child_table_of_expense_claim.py b/erpnext/patches/v12_0/set_cost_center_in_child_table_of_expense_claim.py
index d3045a1..a5b4c66 100644
--- a/erpnext/patches/v12_0/set_cost_center_in_child_table_of_expense_claim.py
+++ b/erpnext/patches/v12_0/set_cost_center_in_child_table_of_expense_claim.py
@@ -2,9 +2,11 @@
 
 
 def execute():
-	frappe.reload_doc('hr', 'doctype', 'expense_claim_detail')
-	frappe.db.sql("""
+	frappe.reload_doc("hr", "doctype", "expense_claim_detail")
+	frappe.db.sql(
+		"""
 		UPDATE `tabExpense Claim Detail` child, `tabExpense Claim` par
 		SET child.cost_center = par.cost_center
 		WHERE child.parent = par.name
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py b/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
index d1e0e45..952f64b 100644
--- a/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
+++ b/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
@@ -3,8 +3,8 @@
 
 
 def execute():
-	'''Get 'Disable CWIP Accounting value' from Asset Settings, set it in 'Enable Capital Work in Progress Accounting' field
-	in Company, delete Asset Settings '''
+	"""Get 'Disable CWIP Accounting value' from Asset Settings, set it in 'Enable Capital Work in Progress Accounting' field
+	in Company, delete Asset Settings"""
 
 	if frappe.db.exists("DocType", "Asset Settings"):
 		frappe.reload_doctype("Asset Category")
diff --git a/erpnext/patches/v12_0/set_default_batch_size.py b/erpnext/patches/v12_0/set_default_batch_size.py
index 6fb6945..ac3e2f4 100644
--- a/erpnext/patches/v12_0/set_default_batch_size.py
+++ b/erpnext/patches/v12_0/set_default_batch_size.py
@@ -2,18 +2,22 @@
 
 
 def execute():
-    frappe.reload_doc("manufacturing", "doctype", "bom_operation")
-    frappe.reload_doc("manufacturing", "doctype", "work_order_operation")
+	frappe.reload_doc("manufacturing", "doctype", "bom_operation")
+	frappe.reload_doc("manufacturing", "doctype", "work_order_operation")
 
-    frappe.db.sql("""
+	frappe.db.sql(
+		"""
         UPDATE
             `tabBOM Operation` bo
         SET
             bo.batch_size = 1
-    """)
-    frappe.db.sql("""
+    """
+	)
+	frappe.db.sql(
+		"""
         UPDATE
             `tabWork Order Operation` wop
         SET
             wop.batch_size = 1
-    """)
+    """
+	)
diff --git a/erpnext/patches/v12_0/set_default_homepage_type.py b/erpnext/patches/v12_0/set_default_homepage_type.py
index 1e4333a..d70b28e 100644
--- a/erpnext/patches/v12_0/set_default_homepage_type.py
+++ b/erpnext/patches/v12_0/set_default_homepage_type.py
@@ -2,4 +2,4 @@
 
 
 def execute():
-	frappe.db.set_value('Homepage', 'Homepage', 'hero_section_based_on', 'Default')
+	frappe.db.set_value("Homepage", "Homepage", "hero_section_based_on", "Default")
diff --git a/erpnext/patches/v12_0/set_employee_preferred_emails.py b/erpnext/patches/v12_0/set_employee_preferred_emails.py
index f6eb12e..a6159c6 100644
--- a/erpnext/patches/v12_0/set_employee_preferred_emails.py
+++ b/erpnext/patches/v12_0/set_employee_preferred_emails.py
@@ -2,9 +2,11 @@
 
 
 def execute():
-	employees = frappe.get_all("Employee",
+	employees = frappe.get_all(
+		"Employee",
 		filters={"prefered_email": ""},
-		fields=["name", "prefered_contact_email", "company_email", "personal_email", "user_id"])
+		fields=["name", "prefered_contact_email", "company_email", "personal_email", "user_id"],
+	)
 
 	for employee in employees:
 		if not employee.prefered_contact_email:
@@ -13,4 +15,6 @@
 		preferred_email_field = frappe.scrub(employee.prefered_contact_email)
 
 		preferred_email = employee.get(preferred_email_field)
-		frappe.db.set_value("Employee", employee.name, "prefered_email", preferred_email, update_modified=False)
+		frappe.db.set_value(
+			"Employee", employee.name, "prefered_email", preferred_email, update_modified=False
+		)
diff --git a/erpnext/patches/v12_0/set_expense_account_in_landed_cost_voucher_taxes.py b/erpnext/patches/v12_0/set_expense_account_in_landed_cost_voucher_taxes.py
index 50d9fee..9588e02 100644
--- a/erpnext/patches/v12_0/set_expense_account_in_landed_cost_voucher_taxes.py
+++ b/erpnext/patches/v12_0/set_expense_account_in_landed_cost_voucher_taxes.py
@@ -2,14 +2,19 @@
 
 
 def execute():
-	frappe.reload_doctype('Landed Cost Taxes and Charges')
+	frappe.reload_doctype("Landed Cost Taxes and Charges")
 
-	company_account_map = frappe._dict(frappe.db.sql("""
+	company_account_map = frappe._dict(
+		frappe.db.sql(
+			"""
 		SELECT name, expenses_included_in_valuation from `tabCompany`
-	"""))
+	"""
+		)
+	)
 
 	for company, account in company_account_map.items():
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			UPDATE
 				`tabLanded Cost Taxes and Charges` t, `tabLanded Cost Voucher` l
 			SET
@@ -18,9 +23,12 @@
 				l.docstatus = 1
 				AND l.company = %s
 				AND t.parent = l.name
-		""", (account, company))
+		""",
+			(account, company),
+		)
 
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			UPDATE
 				`tabLanded Cost Taxes and Charges` t, `tabStock Entry` s
 			SET
@@ -29,4 +37,6 @@
 				s.docstatus = 1
 				AND s.company = %s
 				AND t.parent = s.name
-		""", (account, company))
+		""",
+			(account, company),
+		)
diff --git a/erpnext/patches/v12_0/set_gst_category.py b/erpnext/patches/v12_0/set_gst_category.py
index 094e2a3..126a73b 100644
--- a/erpnext/patches/v12_0/set_gst_category.py
+++ b/erpnext/patches/v12_0/set_gst_category.py
@@ -5,48 +5,62 @@
 
 def execute():
 
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	frappe.reload_doc('accounts', 'doctype', 'Tax Category')
+	frappe.reload_doc("accounts", "doctype", "Tax Category")
 
 	make_custom_fields()
 
-	for doctype in ['Sales Invoice', 'Purchase Invoice']:
-		has_column = frappe.db.has_column(doctype,'invoice_type')
+	for doctype in ["Sales Invoice", "Purchase Invoice"]:
+		has_column = frappe.db.has_column(doctype, "invoice_type")
 
 		if has_column:
 			update_map = {
-				'Regular': 'Registered Regular',
-				'Export': 'Overseas',
-				'SEZ': 'SEZ',
-				'Deemed Export': 'Deemed Export',
+				"Regular": "Registered Regular",
+				"Export": "Overseas",
+				"SEZ": "SEZ",
+				"Deemed Export": "Deemed Export",
 			}
 
 			for old, new in update_map.items():
-				frappe.db.sql("UPDATE `tab{doctype}` SET gst_category = %s where invoice_type = %s".format(doctype=doctype), (new, old)) #nosec
+				frappe.db.sql(
+					"UPDATE `tab{doctype}` SET gst_category = %s where invoice_type = %s".format(doctype=doctype),
+					(new, old),
+				)  # nosec
 
-	frappe.delete_doc('Custom Field', 'Sales Invoice-invoice_type')
-	frappe.delete_doc('Custom Field', 'Purchase Invoice-invoice_type')
+	frappe.delete_doc("Custom Field", "Sales Invoice-invoice_type")
+	frappe.delete_doc("Custom Field", "Purchase Invoice-invoice_type")
 
 	itc_update_map = {
 		"ineligible": "Ineligible",
 		"input service": "Input Service Distributor",
 		"capital goods": "Import Of Capital Goods",
-		"input": "All Other ITC"
+		"input": "All Other ITC",
 	}
 
-	has_gst_fields = frappe.db.has_column('Purchase Invoice','eligibility_for_itc')
+	has_gst_fields = frappe.db.has_column("Purchase Invoice", "eligibility_for_itc")
 
 	if has_gst_fields:
 		for old, new in itc_update_map.items():
-			frappe.db.sql("UPDATE `tabPurchase Invoice` SET eligibility_for_itc = %s where eligibility_for_itc = %s ", (new, old))
+			frappe.db.sql(
+				"UPDATE `tabPurchase Invoice` SET eligibility_for_itc = %s where eligibility_for_itc = %s ",
+				(new, old),
+			)
 
 	for doctype in ["Customer", "Supplier"]:
 
-		frappe.db.sql(""" UPDATE `tab{doctype}` t1, `tabAddress` t2, `tabDynamic Link` t3 SET t1.gst_category = "Registered Regular"
-			where t3.link_name = t1.name and t3.parent = t2.name and t2.gstin IS NOT NULL and t2.gstin != '' """.format(doctype=doctype)) #nosec
+		frappe.db.sql(
+			""" UPDATE `tab{doctype}` t1, `tabAddress` t2, `tabDynamic Link` t3 SET t1.gst_category = "Registered Regular"
+			where t3.link_name = t1.name and t3.parent = t2.name and t2.gstin IS NOT NULL and t2.gstin != '' """.format(
+				doctype=doctype
+			)
+		)  # nosec
 
-		frappe.db.sql(""" UPDATE `tab{doctype}` t1, `tabAddress` t2, `tabDynamic Link` t3 SET t1.gst_category = "Overseas"
-			where t3.link_name = t1.name and t3.parent = t2.name and t2.country != 'India' """.format(doctype=doctype)) #nosec
+		frappe.db.sql(
+			""" UPDATE `tab{doctype}` t1, `tabAddress` t2, `tabDynamic Link` t3 SET t1.gst_category = "Overseas"
+			where t3.link_name = t1.name and t3.parent = t2.name and t2.country != 'India' """.format(
+				doctype=doctype
+			)
+		)  # nosec
diff --git a/erpnext/patches/v12_0/set_job_offer_applicant_email.py b/erpnext/patches/v12_0/set_job_offer_applicant_email.py
index 7dd8492..0e3b5c4 100644
--- a/erpnext/patches/v12_0/set_job_offer_applicant_email.py
+++ b/erpnext/patches/v12_0/set_job_offer_applicant_email.py
@@ -4,9 +4,11 @@
 def execute():
 	frappe.reload_doc("hr", "doctype", "job_offer")
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE
 			`tabJob Offer` AS offer
 		SET
 			applicant_email = (SELECT email_id FROM `tabJob Applicant` WHERE name = offer.job_applicant)
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/set_lead_title_field.py b/erpnext/patches/v12_0/set_lead_title_field.py
index 86e0003..eda3007 100644
--- a/erpnext/patches/v12_0/set_lead_title_field.py
+++ b/erpnext/patches/v12_0/set_lead_title_field.py
@@ -3,9 +3,11 @@
 
 def execute():
 	frappe.reload_doc("crm", "doctype", "lead")
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE
 			`tabLead`
 		SET
 			title = IF(organization_lead = 1, company_name, lead_name)
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/set_multi_uom_in_rfq.py b/erpnext/patches/v12_0/set_multi_uom_in_rfq.py
index a8e0ec1..4d19007 100644
--- a/erpnext/patches/v12_0/set_multi_uom_in_rfq.py
+++ b/erpnext/patches/v12_0/set_multi_uom_in_rfq.py
@@ -6,10 +6,12 @@
 
 
 def execute():
-	frappe.reload_doc('buying', 'doctype', 'request_for_quotation_item')
+	frappe.reload_doc("buying", "doctype", "request_for_quotation_item")
 
-	frappe.db.sql("""UPDATE `tabRequest for Quotation Item`
+	frappe.db.sql(
+		"""UPDATE `tabRequest for Quotation Item`
 			SET
 				stock_uom = uom,
 				conversion_factor = 1,
-				stock_qty = qty""")
+				stock_qty = qty"""
+	)
diff --git a/erpnext/patches/v12_0/set_payment_entry_status.py b/erpnext/patches/v12_0/set_payment_entry_status.py
index f879295..2a3a3ad 100644
--- a/erpnext/patches/v12_0/set_payment_entry_status.py
+++ b/erpnext/patches/v12_0/set_payment_entry_status.py
@@ -3,8 +3,10 @@
 
 def execute():
 	frappe.reload_doctype("Payment Entry")
-	frappe.db.sql("""update `tabPayment Entry` set status = CASE
+	frappe.db.sql(
+		"""update `tabPayment Entry` set status = CASE
 		WHEN docstatus = 1 THEN 'Submitted'
 		WHEN docstatus = 2 THEN 'Cancelled'
 		ELSE 'Draft'
-		END;""")
+		END;"""
+	)
diff --git a/erpnext/patches/v12_0/set_permission_einvoicing.py b/erpnext/patches/v12_0/set_permission_einvoicing.py
index 01cab14..65d7097 100644
--- a/erpnext/patches/v12_0/set_permission_einvoicing.py
+++ b/erpnext/patches/v12_0/set_permission_einvoicing.py
@@ -5,7 +5,7 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Italy'})
+	company = frappe.get_all("Company", filters={"country": "Italy"})
 
 	if not company:
 		return
@@ -14,6 +14,6 @@
 
 	frappe.reload_doc("regional", "doctype", "import_supplier_invoice")
 
-	add_permission('Import Supplier Invoice', 'Accounts Manager', 0)
-	update_permission_property('Import Supplier Invoice', 'Accounts Manager', 0, 'write', 1)
-	update_permission_property('Import Supplier Invoice', 'Accounts Manager', 0, 'create', 1)
+	add_permission("Import Supplier Invoice", "Accounts Manager", 0)
+	update_permission_property("Import Supplier Invoice", "Accounts Manager", 0, "write", 1)
+	update_permission_property("Import Supplier Invoice", "Accounts Manager", 0, "create", 1)
diff --git a/erpnext/patches/v12_0/set_priority_for_support.py b/erpnext/patches/v12_0/set_priority_for_support.py
index 6d7d099..a8a07e7 100644
--- a/erpnext/patches/v12_0/set_priority_for_support.py
+++ b/erpnext/patches/v12_0/set_priority_for_support.py
@@ -4,21 +4,20 @@
 def execute():
 	frappe.reload_doc("support", "doctype", "issue_priority")
 	frappe.reload_doc("support", "doctype", "service_level_priority")
-	frappe.reload_doc('support', 'doctype', 'issue')
+	frappe.reload_doc("support", "doctype", "issue")
 
 	set_issue_priority()
 	set_priority_for_issue()
 	set_priorities_service_level()
 	set_priorities_service_level_agreement()
 
+
 def set_issue_priority():
 	# Adds priority from issue to Issue Priority DocType as Priority is a new DocType.
 	for priority in frappe.get_meta("Issue").get_field("priority").options.split("\n"):
 		if priority and not frappe.db.exists("Issue Priority", priority):
-			frappe.get_doc({
-				"doctype": "Issue Priority",
-				"name": priority
-			}).insert(ignore_permissions=True)
+			frappe.get_doc({"doctype": "Issue Priority", "name": priority}).insert(ignore_permissions=True)
+
 
 def set_priority_for_issue():
 	# Sets priority for Issues as Select field is changed to Link field.
@@ -28,38 +27,63 @@
 	for issue in issue_priority:
 		frappe.db.set_value("Issue", issue.name, "priority", issue.priority)
 
+
 def set_priorities_service_level():
 	# Migrates "priority", "response_time", "response_time_period", "resolution_time", "resolution_time_period" to Child Table
 	# as a Service Level can have multiple priorities
 	try:
-		service_level_priorities = frappe.get_list("Service Level", fields=["name", "priority", "response_time", "response_time_period", "resolution_time", "resolution_time_period"])
+		service_level_priorities = frappe.get_list(
+			"Service Level",
+			fields=[
+				"name",
+				"priority",
+				"response_time",
+				"response_time_period",
+				"resolution_time",
+				"resolution_time_period",
+			],
+		)
 
 		frappe.reload_doc("support", "doctype", "service_level")
 		frappe.reload_doc("support", "doctype", "support_settings")
-		frappe.db.set_value('Support Settings', None, 'track_service_level_agreement', 1)
+		frappe.db.set_value("Support Settings", None, "track_service_level_agreement", 1)
 
 		for service_level in service_level_priorities:
 			if service_level:
 				doc = frappe.get_doc("Service Level", service_level.name)
 				if not doc.priorities:
-					doc.append("priorities", {
-						"priority": service_level.priority,
-						"default_priority": 1,
-						"response_time": service_level.response_time,
-						"response_time_period": service_level.response_time_period,
-						"resolution_time": service_level.resolution_time,
-						"resolution_time_period": service_level.resolution_time_period
-					})
+					doc.append(
+						"priorities",
+						{
+							"priority": service_level.priority,
+							"default_priority": 1,
+							"response_time": service_level.response_time,
+							"response_time_period": service_level.response_time_period,
+							"resolution_time": service_level.resolution_time,
+							"resolution_time_period": service_level.resolution_time_period,
+						},
+					)
 					doc.flags.ignore_validate = True
 					doc.save(ignore_permissions=True)
 	except frappe.db.TableMissingError:
 		frappe.reload_doc("support", "doctype", "service_level")
 
+
 def set_priorities_service_level_agreement():
 	# Migrates "priority", "response_time", "response_time_period", "resolution_time", "resolution_time_period" to Child Table
 	# as a Service Level Agreement can have multiple priorities
 	try:
-		service_level_agreement_priorities = frappe.get_list("Service Level Agreement", fields=["name", "priority", "response_time", "response_time_period", "resolution_time", "resolution_time_period"])
+		service_level_agreement_priorities = frappe.get_list(
+			"Service Level Agreement",
+			fields=[
+				"name",
+				"priority",
+				"response_time",
+				"response_time_period",
+				"resolution_time",
+				"resolution_time_period",
+			],
+		)
 
 		frappe.reload_doc("support", "doctype", "service_level_agreement")
 
@@ -71,14 +95,17 @@
 					doc.entity_type = "Customer"
 					doc.entity = doc.customer
 
-				doc.append("priorities", {
-					"priority": service_level_agreement.priority,
-					"default_priority": 1,
-					"response_time": service_level_agreement.response_time,
-					"response_time_period": service_level_agreement.response_time_period,
-					"resolution_time": service_level_agreement.resolution_time,
-					"resolution_time_period": service_level_agreement.resolution_time_period
-				})
+				doc.append(
+					"priorities",
+					{
+						"priority": service_level_agreement.priority,
+						"default_priority": 1,
+						"response_time": service_level_agreement.response_time,
+						"response_time_period": service_level_agreement.response_time_period,
+						"resolution_time": service_level_agreement.resolution_time,
+						"resolution_time_period": service_level_agreement.resolution_time_period,
+					},
+				)
 				doc.flags.ignore_validate = True
 				doc.save(ignore_permissions=True)
 	except frappe.db.TableMissingError:
diff --git a/erpnext/patches/v12_0/set_produced_qty_field_in_sales_order_for_work_order.py b/erpnext/patches/v12_0/set_produced_qty_field_in_sales_order_for_work_order.py
index 9c851dd..562ebed 100644
--- a/erpnext/patches/v12_0/set_produced_qty_field_in_sales_order_for_work_order.py
+++ b/erpnext/patches/v12_0/set_produced_qty_field_in_sales_order_for_work_order.py
@@ -4,12 +4,14 @@
 
 
 def execute():
-	frappe.reload_doctype('Sales Order Item')
-	frappe.reload_doctype('Sales Order')
+	frappe.reload_doctype("Sales Order Item")
+	frappe.reload_doctype("Sales Order")
 
-	for d in frappe.get_all('Work Order',
-		fields = ['sales_order', 'sales_order_item'],
-		filters={'sales_order': ('!=', ''), 'sales_order_item': ('!=', '')}):
+	for d in frappe.get_all(
+		"Work Order",
+		fields=["sales_order", "sales_order_item"],
+		filters={"sales_order": ("!=", ""), "sales_order_item": ("!=", "")},
+	):
 
 		# update produced qty in sales order
 		update_produced_qty_in_so_item(d.sales_order, d.sales_order_item)
diff --git a/erpnext/patches/v12_0/set_production_capacity_in_workstation.py b/erpnext/patches/v12_0/set_production_capacity_in_workstation.py
index bd2f7e2..0246c35 100644
--- a/erpnext/patches/v12_0/set_production_capacity_in_workstation.py
+++ b/erpnext/patches/v12_0/set_production_capacity_in_workstation.py
@@ -2,7 +2,9 @@
 
 
 def execute():
-    frappe.reload_doc("manufacturing", "doctype", "workstation")
+	frappe.reload_doc("manufacturing", "doctype", "workstation")
 
-    frappe.db.sql(""" UPDATE `tabWorkstation`
-        SET production_capacity = 1 """)
+	frappe.db.sql(
+		""" UPDATE `tabWorkstation`
+        SET production_capacity = 1 """
+	)
diff --git a/erpnext/patches/v12_0/set_purchase_receipt_delivery_note_detail.py b/erpnext/patches/v12_0/set_purchase_receipt_delivery_note_detail.py
index a15166e..2edf0f5 100644
--- a/erpnext/patches/v12_0/set_purchase_receipt_delivery_note_detail.py
+++ b/erpnext/patches/v12_0/set_purchase_receipt_delivery_note_detail.py
@@ -5,29 +5,36 @@
 
 def execute():
 
-	frappe.reload_doc('stock', 'doctype', 'delivery_note_item', force=True)
-	frappe.reload_doc('stock', 'doctype', 'purchase_receipt_item', force=True)
+	frappe.reload_doc("stock", "doctype", "delivery_note_item", force=True)
+	frappe.reload_doc("stock", "doctype", "purchase_receipt_item", force=True)
 
 	def map_rows(doc_row, return_doc_row, detail_field, doctype):
 		"""Map rows after identifying similar ones."""
 
-		frappe.db.sql(""" UPDATE `tab{doctype} Item` set {detail_field} = '{doc_row_name}'
-				where name = '{return_doc_row_name}'""" \
-			.format(doctype=doctype,
-					detail_field=detail_field,
-					doc_row_name=doc_row.get('name'),
-					return_doc_row_name=return_doc_row.get('name'))) #nosec
+		frappe.db.sql(
+			""" UPDATE `tab{doctype} Item` set {detail_field} = '{doc_row_name}'
+				where name = '{return_doc_row_name}'""".format(
+				doctype=doctype,
+				detail_field=detail_field,
+				doc_row_name=doc_row.get("name"),
+				return_doc_row_name=return_doc_row.get("name"),
+			)
+		)  # nosec
 
 	def row_is_mappable(doc_row, return_doc_row, detail_field):
 		"""Checks if two rows are similar enough to be mapped."""
 
 		if doc_row.item_code == return_doc_row.item_code and not return_doc_row.get(detail_field):
-			if doc_row.get('batch_no') and return_doc_row.get('batch_no') and doc_row.batch_no == return_doc_row.batch_no:
+			if (
+				doc_row.get("batch_no")
+				and return_doc_row.get("batch_no")
+				and doc_row.batch_no == return_doc_row.batch_no
+			):
 				return True
 
-			elif doc_row.get('serial_no') and return_doc_row.get('serial_no'):
-				doc_sn = doc_row.serial_no.split('\n')
-				return_doc_sn = return_doc_row.serial_no.split('\n')
+			elif doc_row.get("serial_no") and return_doc_row.get("serial_no"):
+				doc_sn = doc_row.serial_no.split("\n")
+				return_doc_sn = return_doc_row.serial_no.split("\n")
 
 				if set(doc_sn) & set(return_doc_sn):
 					# if two rows have serial nos in common, map them
@@ -42,12 +49,17 @@
 		"""Returns a map of documents and it's return documents.
 		Format => { 'document' : ['return_document_1','return_document_2'] }"""
 
-		return_against_documents = frappe.db.sql("""
+		return_against_documents = frappe.db.sql(
+			"""
 			SELECT
 				return_against as document, name as return_document
 			FROM `tab{doctype}`
 			WHERE
-				is_return = 1 and docstatus = 1""".format(doctype=doctype),as_dict=1) #nosec
+				is_return = 1 and docstatus = 1""".format(
+				doctype=doctype
+			),
+			as_dict=1,
+		)  # nosec
 
 		for entry in return_against_documents:
 			return_document_map[entry.document].append(entry.return_document)
@@ -58,7 +70,7 @@
 		"""Map each row of the original document in the return document."""
 		mapped = []
 		return_document_map = defaultdict(list)
-		detail_field = "purchase_receipt_item" if doctype=="Purchase Receipt" else "dn_detail"
+		detail_field = "purchase_receipt_item" if doctype == "Purchase Receipt" else "dn_detail"
 
 		child_doc = frappe.scrub("{0} Item".format(doctype))
 		frappe.reload_doc("stock", "doctype", child_doc)
@@ -67,25 +79,27 @@
 
 		count = 0
 
-		#iterate through original documents and its return documents
+		# iterate through original documents and its return documents
 		for docname in return_document_map:
 			doc_items = frappe.get_cached_doc(doctype, docname).get("items")
 			for return_doc in return_document_map[docname]:
 				return_doc_items = frappe.get_cached_doc(doctype, return_doc).get("items")
 
-				#iterate through return document items and original document items for mapping
+				# iterate through return document items and original document items for mapping
 				for return_item in return_doc_items:
 					for doc_item in doc_items:
-						if row_is_mappable(doc_item, return_item, detail_field) and doc_item.get('name') not in mapped:
+						if (
+							row_is_mappable(doc_item, return_item, detail_field) and doc_item.get("name") not in mapped
+						):
 							map_rows(doc_item, return_item, detail_field, doctype)
-							mapped.append(doc_item.get('name'))
+							mapped.append(doc_item.get("name"))
 							break
 						else:
 							continue
 
 			# commit after every 100 sql updates
 			count += 1
-			if count%100 == 0:
+			if count % 100 == 0:
 				frappe.db.commit()
 
 	set_document_detail_in_return_document("Purchase Receipt")
diff --git a/erpnext/patches/v12_0/set_quotation_status.py b/erpnext/patches/v12_0/set_quotation_status.py
index 91e77e4..bebedd3 100644
--- a/erpnext/patches/v12_0/set_quotation_status.py
+++ b/erpnext/patches/v12_0/set_quotation_status.py
@@ -3,5 +3,7 @@
 
 def execute():
 
-	frappe.db.sql(""" UPDATE `tabQuotation` set status = 'Open'
-		where docstatus = 1 and status = 'Submitted' """)
+	frappe.db.sql(
+		""" UPDATE `tabQuotation` set status = 'Open'
+		where docstatus = 1 and status = 'Submitted' """
+	)
diff --git a/erpnext/patches/v12_0/set_received_qty_in_material_request_as_per_stock_uom.py b/erpnext/patches/v12_0/set_received_qty_in_material_request_as_per_stock_uom.py
index d41134d..dcdd19f 100644
--- a/erpnext/patches/v12_0/set_received_qty_in_material_request_as_per_stock_uom.py
+++ b/erpnext/patches/v12_0/set_received_qty_in_material_request_as_per_stock_uom.py
@@ -2,13 +2,16 @@
 
 
 def execute():
-	purchase_receipts = frappe.db.sql("""
+	purchase_receipts = frappe.db.sql(
+		"""
 		SELECT
 			 parent from `tabPurchase Receipt Item`
 		WHERE
 			material_request is not null
 			AND docstatus=1
-		""",as_dict=1)
+		""",
+		as_dict=1,
+	)
 
 	purchase_receipts = set([d.parent for d in purchase_receipts])
 
@@ -16,15 +19,15 @@
 		doc = frappe.get_doc("Purchase Receipt", pr)
 		doc.status_updater = [
 			{
-			'source_dt': 'Purchase Receipt Item',
-			'target_dt': 'Material Request Item',
-			'join_field': 'material_request_item',
-			'target_field': 'received_qty',
-			'target_parent_dt': 'Material Request',
-			'target_parent_field': 'per_received',
-			'target_ref_field': 'stock_qty',
-			'source_field': 'stock_qty',
-			'percent_join_field': 'material_request'
+				"source_dt": "Purchase Receipt Item",
+				"target_dt": "Material Request Item",
+				"join_field": "material_request_item",
+				"target_field": "received_qty",
+				"target_parent_dt": "Material Request",
+				"target_parent_field": "per_received",
+				"target_ref_field": "stock_qty",
+				"source_field": "stock_qty",
+				"percent_join_field": "material_request",
 			}
 		]
 		doc.update_qty()
diff --git a/erpnext/patches/v12_0/set_serial_no_status.py b/erpnext/patches/v12_0/set_serial_no_status.py
index 8c136e6..8ab342e 100644
--- a/erpnext/patches/v12_0/set_serial_no_status.py
+++ b/erpnext/patches/v12_0/set_serial_no_status.py
@@ -3,17 +3,22 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'serial_no')
+	frappe.reload_doc("stock", "doctype", "serial_no")
 
-	serial_no_list = frappe.db.sql("""select name, delivery_document_type, warranty_expiry_date, warehouse from `tabSerial No`
-		where (status is NULL OR status='')""", as_dict = 1)
+	serial_no_list = frappe.db.sql(
+		"""select name, delivery_document_type, warranty_expiry_date, warehouse from `tabSerial No`
+		where (status is NULL OR status='')""",
+		as_dict=1,
+	)
 	if len(serial_no_list) > 20000:
 		frappe.db.auto_commit_on_many_writes = True
 
 	for serial_no in serial_no_list:
 		if serial_no.get("delivery_document_type"):
 			status = "Delivered"
-		elif serial_no.get("warranty_expiry_date") and getdate(serial_no.get("warranty_expiry_date")) <= getdate(nowdate()):
+		elif serial_no.get("warranty_expiry_date") and getdate(
+			serial_no.get("warranty_expiry_date")
+		) <= getdate(nowdate()):
 			status = "Expired"
 		elif not serial_no.get("warehouse"):
 			status = "Inactive"
diff --git a/erpnext/patches/v12_0/set_task_status.py b/erpnext/patches/v12_0/set_task_status.py
index 1b4955a..1c6654e 100644
--- a/erpnext/patches/v12_0/set_task_status.py
+++ b/erpnext/patches/v12_0/set_task_status.py
@@ -2,14 +2,16 @@
 
 
 def execute():
-	frappe.reload_doctype('Task')
+	frappe.reload_doctype("Task")
 
 	# add "Completed" if customized
-	property_setter_name = frappe.db.exists('Property Setter', dict(doc_type='Task', field_name = 'status', property = 'options'))
+	property_setter_name = frappe.db.exists(
+		"Property Setter", dict(doc_type="Task", field_name="status", property="options")
+	)
 	if property_setter_name:
-		property_setter = frappe.get_doc('Property Setter', property_setter_name)
+		property_setter = frappe.get_doc("Property Setter", property_setter_name)
 		if not "Completed" in property_setter.value:
-			property_setter.value = property_setter.value + '\nCompleted'
+			property_setter.value = property_setter.value + "\nCompleted"
 			property_setter.save()
 
 	# renamed default status to Completed as status "Closed" is ambiguous
diff --git a/erpnext/patches/v12_0/set_total_batch_quantity.py b/erpnext/patches/v12_0/set_total_batch_quantity.py
index 7296eaa..068e0a6 100644
--- a/erpnext/patches/v12_0/set_total_batch_quantity.py
+++ b/erpnext/patches/v12_0/set_total_batch_quantity.py
@@ -5,7 +5,12 @@
 	frappe.reload_doc("stock", "doctype", "batch")
 
 	for batch in frappe.get_all("Batch", fields=["name", "batch_id"]):
-		batch_qty = frappe.db.get_value("Stock Ledger Entry",
-			{"docstatus": 1, "batch_no": batch.batch_id, "is_cancelled": 0},
-			"sum(actual_qty)") or 0.0
+		batch_qty = (
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"docstatus": 1, "batch_no": batch.batch_id, "is_cancelled": 0},
+				"sum(actual_qty)",
+			)
+			or 0.0
+		)
 		frappe.db.set_value("Batch", batch.name, "batch_qty", batch_qty, update_modified=False)
diff --git a/erpnext/patches/v12_0/set_updated_purpose_in_pick_list.py b/erpnext/patches/v12_0/set_updated_purpose_in_pick_list.py
index 300d0f2..1e39081 100644
--- a/erpnext/patches/v12_0/set_updated_purpose_in_pick_list.py
+++ b/erpnext/patches/v12_0/set_updated_purpose_in_pick_list.py
@@ -6,6 +6,8 @@
 
 
 def execute():
-    frappe.reload_doc("stock", "doctype", "pick_list")
-    frappe.db.sql("""UPDATE `tabPick List` set purpose = 'Delivery'
-        WHERE docstatus = 1  and purpose = 'Delivery against Sales Order' """)
+	frappe.reload_doc("stock", "doctype", "pick_list")
+	frappe.db.sql(
+		"""UPDATE `tabPick List` set purpose = 'Delivery'
+        WHERE docstatus = 1  and purpose = 'Delivery against Sales Order' """
+	)
diff --git a/erpnext/patches/v12_0/set_valid_till_date_in_supplier_quotation.py b/erpnext/patches/v12_0/set_valid_till_date_in_supplier_quotation.py
index 154d7ba..94322cd 100644
--- a/erpnext/patches/v12_0/set_valid_till_date_in_supplier_quotation.py
+++ b/erpnext/patches/v12_0/set_valid_till_date_in_supplier_quotation.py
@@ -3,6 +3,8 @@
 
 def execute():
 	frappe.reload_doc("buying", "doctype", "supplier_quotation")
-	frappe.db.sql("""UPDATE `tabSupplier Quotation`
+	frappe.db.sql(
+		"""UPDATE `tabSupplier Quotation`
 		SET valid_till = DATE_ADD(transaction_date , INTERVAL 1 MONTH)
-		WHERE docstatus < 2""")
+		WHERE docstatus < 2"""
+	)
diff --git a/erpnext/patches/v12_0/setup_einvoice_fields.py b/erpnext/patches/v12_0/setup_einvoice_fields.py
index c17666a..72fa663 100644
--- a/erpnext/patches/v12_0/setup_einvoice_fields.py
+++ b/erpnext/patches/v12_0/setup_einvoice_fields.py
@@ -7,53 +7,128 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	frappe.reload_doc("custom", "doctype", "custom_field")
 	frappe.reload_doc("regional", "doctype", "e_invoice_settings")
 	custom_fields = {
-		'Sales Invoice': [
-			dict(fieldname='irn', label='IRN', fieldtype='Data', read_only=1, insert_after='customer', no_copy=1, print_hide=1,
-				depends_on='eval:in_list(["Registered Regular", "SEZ", "Overseas", "Deemed Export"], doc.gst_category) && doc.irn_cancelled === 0'),
-
-			dict(fieldname='ack_no', label='Ack. No.', fieldtype='Data', read_only=1, hidden=1, insert_after='irn', no_copy=1, print_hide=1),
-
-			dict(fieldname='ack_date', label='Ack. Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_no', no_copy=1, print_hide=1),
-
-			dict(fieldname='irn_cancelled', label='IRN Cancelled', fieldtype='Check', no_copy=1, print_hide=1,
-				depends_on='eval:(doc.irn_cancelled === 1)', read_only=1, allow_on_submit=1, insert_after='customer'),
-
-			dict(fieldname='eway_bill_cancelled', label='E-Way Bill Cancelled', fieldtype='Check', no_copy=1, print_hide=1,
-				depends_on='eval:(doc.eway_bill_cancelled === 1)', read_only=1, allow_on_submit=1, insert_after='customer'),
-
-			dict(fieldname='signed_einvoice', fieldtype='Code', options='JSON', hidden=1, no_copy=1, print_hide=1, read_only=1),
-
-			dict(fieldname='signed_qr_code', fieldtype='Code', options='JSON', hidden=1, no_copy=1, print_hide=1, read_only=1),
-
-			dict(fieldname='qrcode_image', label='QRCode', fieldtype='Attach Image', hidden=1, no_copy=1, print_hide=1, read_only=1)
+		"Sales Invoice": [
+			dict(
+				fieldname="irn",
+				label="IRN",
+				fieldtype="Data",
+				read_only=1,
+				insert_after="customer",
+				no_copy=1,
+				print_hide=1,
+				depends_on='eval:in_list(["Registered Regular", "SEZ", "Overseas", "Deemed Export"], doc.gst_category) && doc.irn_cancelled === 0',
+			),
+			dict(
+				fieldname="ack_no",
+				label="Ack. No.",
+				fieldtype="Data",
+				read_only=1,
+				hidden=1,
+				insert_after="irn",
+				no_copy=1,
+				print_hide=1,
+			),
+			dict(
+				fieldname="ack_date",
+				label="Ack. Date",
+				fieldtype="Data",
+				read_only=1,
+				hidden=1,
+				insert_after="ack_no",
+				no_copy=1,
+				print_hide=1,
+			),
+			dict(
+				fieldname="irn_cancelled",
+				label="IRN Cancelled",
+				fieldtype="Check",
+				no_copy=1,
+				print_hide=1,
+				depends_on="eval:(doc.irn_cancelled === 1)",
+				read_only=1,
+				allow_on_submit=1,
+				insert_after="customer",
+			),
+			dict(
+				fieldname="eway_bill_cancelled",
+				label="E-Way Bill Cancelled",
+				fieldtype="Check",
+				no_copy=1,
+				print_hide=1,
+				depends_on="eval:(doc.eway_bill_cancelled === 1)",
+				read_only=1,
+				allow_on_submit=1,
+				insert_after="customer",
+			),
+			dict(
+				fieldname="signed_einvoice",
+				fieldtype="Code",
+				options="JSON",
+				hidden=1,
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="signed_qr_code",
+				fieldtype="Code",
+				options="JSON",
+				hidden=1,
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="qrcode_image",
+				label="QRCode",
+				fieldtype="Attach Image",
+				hidden=1,
+				no_copy=1,
+				print_hide=1,
+				read_only=1,
+			),
 		]
 	}
 	create_custom_fields(custom_fields, update=True)
 	add_permissions()
 	add_print_formats()
 
-	einvoice_cond = 'in_list(["Registered Regular", "SEZ", "Overseas", "Deemed Export"], doc.gst_category)'
+	einvoice_cond = (
+		'in_list(["Registered Regular", "SEZ", "Overseas", "Deemed Export"], doc.gst_category)'
+	)
 	t = {
-		'mode_of_transport': [{'default': None}],
-		'distance': [{'mandatory_depends_on': f'eval:{einvoice_cond} && doc.transporter'}],
-		'gst_vehicle_type': [{'mandatory_depends_on': f'eval:{einvoice_cond} && doc.mode_of_transport == "Road"'}],
-		'lr_date': [{'mandatory_depends_on': f'eval:{einvoice_cond} && in_list(["Air", "Ship", "Rail"], doc.mode_of_transport)'}],
-		'lr_no': [{'mandatory_depends_on': f'eval:{einvoice_cond} && in_list(["Air", "Ship", "Rail"], doc.mode_of_transport)'}],
-		'vehicle_no': [{'mandatory_depends_on': f'eval:{einvoice_cond} && doc.mode_of_transport == "Road"'}],
-		'ewaybill': [
-			{'read_only_depends_on': 'eval:doc.irn && doc.ewaybill'},
-			{'depends_on': 'eval:((doc.docstatus === 1 || doc.ewaybill) && doc.eway_bill_cancelled === 0)'}
-		]
+		"mode_of_transport": [{"default": None}],
+		"distance": [{"mandatory_depends_on": f"eval:{einvoice_cond} && doc.transporter"}],
+		"gst_vehicle_type": [
+			{"mandatory_depends_on": f'eval:{einvoice_cond} && doc.mode_of_transport == "Road"'}
+		],
+		"lr_date": [
+			{
+				"mandatory_depends_on": f'eval:{einvoice_cond} && in_list(["Air", "Ship", "Rail"], doc.mode_of_transport)'
+			}
+		],
+		"lr_no": [
+			{
+				"mandatory_depends_on": f'eval:{einvoice_cond} && in_list(["Air", "Ship", "Rail"], doc.mode_of_transport)'
+			}
+		],
+		"vehicle_no": [
+			{"mandatory_depends_on": f'eval:{einvoice_cond} && doc.mode_of_transport == "Road"'}
+		],
+		"ewaybill": [
+			{"read_only_depends_on": "eval:doc.irn && doc.ewaybill"},
+			{"depends_on": "eval:((doc.docstatus === 1 || doc.ewaybill) && doc.eway_bill_cancelled === 0)"},
+		],
 	}
 
 	for field, conditions in t.items():
 		for c in conditions:
 			[(prop, value)] = c.items()
-			frappe.db.set_value('Custom Field', { 'fieldname': field }, prop, value)
+			frappe.db.set_value("Custom Field", {"fieldname": field}, prop, value)
diff --git a/erpnext/patches/v12_0/show_einvoice_irn_cancelled_field.py b/erpnext/patches/v12_0/show_einvoice_irn_cancelled_field.py
index 3f90a03..459aeea 100644
--- a/erpnext/patches/v12_0/show_einvoice_irn_cancelled_field.py
+++ b/erpnext/patches/v12_0/show_einvoice_irn_cancelled_field.py
@@ -4,11 +4,13 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	irn_cancelled_field = frappe.db.exists('Custom Field', {'dt': 'Sales Invoice', 'fieldname': 'irn_cancelled'})
+	irn_cancelled_field = frappe.db.exists(
+		"Custom Field", {"dt": "Sales Invoice", "fieldname": "irn_cancelled"}
+	)
 	if irn_cancelled_field:
-		frappe.db.set_value('Custom Field', irn_cancelled_field, 'depends_on', 'eval: doc.irn')
-		frappe.db.set_value('Custom Field', irn_cancelled_field, 'read_only', 0)
+		frappe.db.set_value("Custom Field", irn_cancelled_field, "depends_on", "eval: doc.irn")
+		frappe.db.set_value("Custom Field", irn_cancelled_field, "read_only", 0)
diff --git a/erpnext/patches/v12_0/stock_entry_enhancements.py b/erpnext/patches/v12_0/stock_entry_enhancements.py
index 94d8ff9..db099a3 100644
--- a/erpnext/patches/v12_0/stock_entry_enhancements.py
+++ b/erpnext/patches/v12_0/stock_entry_enhancements.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import frappe
 from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
 
@@ -10,44 +9,61 @@
 def execute():
 	create_stock_entry_types()
 
-	company = frappe.db.get_value("Company", {'country': 'India'}, 'name')
+	company = frappe.db.get_value("Company", {"country": "India"}, "name")
 	if company:
 		add_gst_hsn_code_field()
 
+
 def create_stock_entry_types():
-	frappe.reload_doc('stock', 'doctype', 'stock_entry_type')
-	frappe.reload_doc('stock', 'doctype', 'stock_entry')
+	frappe.reload_doc("stock", "doctype", "stock_entry_type")
+	frappe.reload_doc("stock", "doctype", "stock_entry")
 
-	for purpose in ["Material Issue", "Material Receipt", "Material Transfer",
-		"Material Transfer for Manufacture", "Material Consumption for Manufacture", "Manufacture",
-		"Repack", "Send to Subcontractor"]:
+	for purpose in [
+		"Material Issue",
+		"Material Receipt",
+		"Material Transfer",
+		"Material Transfer for Manufacture",
+		"Material Consumption for Manufacture",
+		"Manufacture",
+		"Repack",
+		"Send to Subcontractor",
+	]:
 
-		ste_type = frappe.get_doc({
-			'doctype': 'Stock Entry Type',
-			'name': purpose,
-			'purpose': purpose
-		})
+		ste_type = frappe.get_doc({"doctype": "Stock Entry Type", "name": purpose, "purpose": purpose})
 
 		try:
 			ste_type.insert()
 		except frappe.DuplicateEntryError:
 			pass
 
-	frappe.db.sql(" UPDATE `tabStock Entry` set purpose = 'Send to Subcontractor' where purpose = 'Subcontract'")
+	frappe.db.sql(
+		" UPDATE `tabStock Entry` set purpose = 'Send to Subcontractor' where purpose = 'Subcontract'"
+	)
 	frappe.db.sql(" UPDATE `tabStock Entry` set stock_entry_type = purpose ")
 
+
 def add_gst_hsn_code_field():
 	custom_fields = {
-		'Stock Entry Detail': [dict(fieldname='gst_hsn_code', label='HSN/SAC',
-			fieldtype='Data', fetch_from='item_code.gst_hsn_code',
-			insert_after='description', allow_on_submit=1, print_hide=0)]
+		"Stock Entry Detail": [
+			dict(
+				fieldname="gst_hsn_code",
+				label="HSN/SAC",
+				fieldtype="Data",
+				fetch_from="item_code.gst_hsn_code",
+				insert_after="description",
+				allow_on_submit=1,
+				print_hide=0,
+			)
+		]
 	}
 
-	create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch, update=True)
+	create_custom_fields(custom_fields, ignore_validate=frappe.flags.in_patch, update=True)
 
-	frappe.db.sql(""" update `tabStock Entry Detail`, `tabItem`
+	frappe.db.sql(
+		""" update `tabStock Entry Detail`, `tabItem`
 		SET
 			`tabStock Entry Detail`.gst_hsn_code = `tabItem`.gst_hsn_code
 		Where
 			`tabItem`.name = `tabStock Entry Detail`.item_code and `tabItem`.gst_hsn_code is not null
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/unhide_cost_center_field.py b/erpnext/patches/v12_0/unhide_cost_center_field.py
index 7245021..5f91ef6 100644
--- a/erpnext/patches/v12_0/unhide_cost_center_field.py
+++ b/erpnext/patches/v12_0/unhide_cost_center_field.py
@@ -6,9 +6,11 @@
 
 
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		DELETE FROM `tabProperty Setter`
 		WHERE doc_type in ('Sales Invoice', 'Purchase Invoice', 'Payment Entry')
 		AND field_name = 'cost_center'
 		AND property = 'hidden'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/unset_customer_supplier_based_on_type_of_item_price.py b/erpnext/patches/v12_0/unset_customer_supplier_based_on_type_of_item_price.py
index 5b5f623..332609b 100644
--- a/erpnext/patches/v12_0/unset_customer_supplier_based_on_type_of_item_price.py
+++ b/erpnext/patches/v12_0/unset_customer_supplier_based_on_type_of_item_price.py
@@ -2,27 +2,29 @@
 
 
 def execute():
-    """
-    set proper customer and supplier details for item price
-    based on selling and buying values
-    """
+	"""
+	set proper customer and supplier details for item price
+	based on selling and buying values
+	"""
 
-    # update for selling
-    frappe.db.sql(
-        """UPDATE `tabItem Price` ip, `tabPrice List` pl
+	# update for selling
+	frappe.db.sql(
+		"""UPDATE `tabItem Price` ip, `tabPrice List` pl
         SET ip.`reference` = ip.`customer`, ip.`supplier` = NULL
         WHERE ip.`selling` = 1
         AND ip.`buying` = 0
         AND (ip.`supplier` IS NOT NULL OR ip.`supplier` = '')
         AND ip.`price_list` = pl.`name`
-        AND pl.`enabled` = 1""")
+        AND pl.`enabled` = 1"""
+	)
 
-    # update for buying
-    frappe.db.sql(
-        """UPDATE `tabItem Price` ip, `tabPrice List` pl
+	# update for buying
+	frappe.db.sql(
+		"""UPDATE `tabItem Price` ip, `tabPrice List` pl
         SET ip.`reference` = ip.`supplier`, ip.`customer` = NULL
         WHERE ip.`selling` = 0
         AND ip.`buying` = 1
         AND (ip.`customer` IS NOT NULL OR ip.`customer` = '')
         AND ip.`price_list` = pl.`name`
-        AND pl.`enabled` = 1""")
+        AND pl.`enabled` = 1"""
+	)
diff --git a/erpnext/patches/v12_0/update_address_template_for_india.py b/erpnext/patches/v12_0/update_address_template_for_india.py
index 64a2e41..27b1bb6 100644
--- a/erpnext/patches/v12_0/update_address_template_for_india.py
+++ b/erpnext/patches/v12_0/update_address_template_for_india.py
@@ -8,7 +8,7 @@
 
 
 def execute():
-	if frappe.db.get_value('Company',  {'country': 'India'},  'name'):
-		address_template = frappe.db.get_value('Address Template', 'India', 'template')
+	if frappe.db.get_value("Company", {"country": "India"}, "name"):
+		address_template = frappe.db.get_value("Address Template", "India", "template")
 		if not address_template or "gstin" not in address_template:
-			set_up_address_templates(default_country='India')
+			set_up_address_templates(default_country="India")
diff --git a/erpnext/patches/v12_0/update_bom_in_so_mr.py b/erpnext/patches/v12_0/update_bom_in_so_mr.py
index 132f3bd..114f65d 100644
--- a/erpnext/patches/v12_0/update_bom_in_so_mr.py
+++ b/erpnext/patches/v12_0/update_bom_in_so_mr.py
@@ -10,11 +10,15 @@
 		if doctype == "Material Request":
 			condition = " and doc.per_ordered < 100 and doc.material_request_type = 'Manufacture'"
 
-		frappe.db.sql(""" UPDATE `tab{doc}` as doc, `tab{doc} Item` as child_doc, tabItem as item
+		frappe.db.sql(
+			""" UPDATE `tab{doc}` as doc, `tab{doc} Item` as child_doc, tabItem as item
 			SET
 				child_doc.bom_no = item.default_bom
 			WHERE
 				child_doc.item_code = item.name and child_doc.docstatus < 2
 				and child_doc.parent = doc.name
 				and item.default_bom is not null and item.default_bom != '' {cond}
-		""".format(doc = doctype, cond = condition))
+		""".format(
+				doc=doctype, cond=condition
+			)
+		)
diff --git a/erpnext/patches/v12_0/update_due_date_in_gle.py b/erpnext/patches/v12_0/update_due_date_in_gle.py
index e4418b0..a1c4f51 100644
--- a/erpnext/patches/v12_0/update_due_date_in_gle.py
+++ b/erpnext/patches/v12_0/update_due_date_in_gle.py
@@ -2,16 +2,19 @@
 
 
 def execute():
-    frappe.reload_doc("accounts", "doctype", "gl_entry")
+	frappe.reload_doc("accounts", "doctype", "gl_entry")
 
-    for doctype in ["Sales Invoice", "Purchase Invoice", "Journal Entry"]:
-        frappe.reload_doc("accounts", "doctype", frappe.scrub(doctype))
+	for doctype in ["Sales Invoice", "Purchase Invoice", "Journal Entry"]:
+		frappe.reload_doc("accounts", "doctype", frappe.scrub(doctype))
 
-        frappe.db.sql(""" UPDATE `tabGL Entry`, `tab{doctype}`
+		frappe.db.sql(
+			""" UPDATE `tabGL Entry`, `tab{doctype}`
             SET
                 `tabGL Entry`.due_date = `tab{doctype}`.due_date
             WHERE
                 `tabGL Entry`.voucher_no = `tab{doctype}`.name and `tabGL Entry`.party is not null
                 and `tabGL Entry`.voucher_type in ('Sales Invoice', 'Purchase Invoice', 'Journal Entry')
-                and `tabGL Entry`.account in (select name from `tabAccount` where account_type in ('Receivable', 'Payable'))""" #nosec
-            .format(doctype=doctype))
+                and `tabGL Entry`.account in (select name from `tabAccount` where account_type in ('Receivable', 'Payable'))""".format(  # nosec
+				doctype=doctype
+			)
+		)
diff --git a/erpnext/patches/v12_0/update_end_date_and_status_in_email_campaign.py b/erpnext/patches/v12_0/update_end_date_and_status_in_email_campaign.py
index ef4204f..570b77b 100644
--- a/erpnext/patches/v12_0/update_end_date_and_status_in_email_campaign.py
+++ b/erpnext/patches/v12_0/update_end_date_and_status_in_email_campaign.py
@@ -3,22 +3,22 @@
 
 
 def execute():
-    if frappe.db.exists('DocType', 'Email Campaign'):
-        email_campaign = frappe.get_all('Email Campaign')
-        for campaign in email_campaign:
-            doc = frappe.get_doc("Email Campaign",campaign["name"])
-            send_after_days = []
+	if frappe.db.exists("DocType", "Email Campaign"):
+		email_campaign = frappe.get_all("Email Campaign")
+		for campaign in email_campaign:
+			doc = frappe.get_doc("Email Campaign", campaign["name"])
+			send_after_days = []
 
-            camp = frappe.get_doc("Campaign", doc.campaign_name)
-            for entry in camp.get("campaign_schedules"):
-                send_after_days.append(entry.send_after_days)
-            if send_after_days:
-                end_date = add_days(getdate(doc.start_date), max(send_after_days))
-                doc.db_set("end_date", end_date)
-            today_date = getdate(today())
-            if doc.start_date > today_date:
-                doc.db_set("status", "Scheduled")
-            elif end_date >= today_date:
-                doc.db_set("status", "In Progress")
-            elif end_date < today_date:
-                doc.db_set("status", "Completed")
+			camp = frappe.get_doc("Campaign", doc.campaign_name)
+			for entry in camp.get("campaign_schedules"):
+				send_after_days.append(entry.send_after_days)
+			if send_after_days:
+				end_date = add_days(getdate(doc.start_date), max(send_after_days))
+				doc.db_set("end_date", end_date)
+			today_date = getdate(today())
+			if doc.start_date > today_date:
+				doc.db_set("status", "Scheduled")
+			elif end_date >= today_date:
+				doc.db_set("status", "In Progress")
+			elif end_date < today_date:
+				doc.db_set("status", "Completed")
diff --git a/erpnext/patches/v12_0/update_ewaybill_field_position.py b/erpnext/patches/v12_0/update_ewaybill_field_position.py
index 132fd90..24a834b 100644
--- a/erpnext/patches/v12_0/update_ewaybill_field_position.py
+++ b/erpnext/patches/v12_0/update_ewaybill_field_position.py
@@ -2,7 +2,7 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 
 	if not company:
 		return
@@ -14,14 +14,16 @@
 
 		ewaybill_field.flags.ignore_validate = True
 
-		ewaybill_field.update({
-			'fieldname': 'ewaybill',
-			'label': 'e-Way Bill No.',
-			'fieldtype': 'Data',
-			'depends_on': 'eval:(doc.docstatus === 1)',
-			'allow_on_submit': 1,
-			'insert_after': 'tax_id',
-			'translatable': 0
-		})
+		ewaybill_field.update(
+			{
+				"fieldname": "ewaybill",
+				"label": "e-Way Bill No.",
+				"fieldtype": "Data",
+				"depends_on": "eval:(doc.docstatus === 1)",
+				"allow_on_submit": 1,
+				"insert_after": "tax_id",
+				"translatable": 0,
+			}
+		)
 
 		ewaybill_field.save()
diff --git a/erpnext/patches/v12_0/update_gst_category.py b/erpnext/patches/v12_0/update_gst_category.py
index 8b15370..16168f0 100644
--- a/erpnext/patches/v12_0/update_gst_category.py
+++ b/erpnext/patches/v12_0/update_gst_category.py
@@ -3,17 +3,21 @@
 
 def execute():
 
-    company = frappe.get_all('Company', filters = {'country': 'India'})
-    if not company:
-        return
+	company = frappe.get_all("Company", filters={"country": "India"})
+	if not company:
+		return
 
-    frappe.db.sql(""" UPDATE `tabSales Invoice` set gst_category = 'Unregistered'
+	frappe.db.sql(
+		""" UPDATE `tabSales Invoice` set gst_category = 'Unregistered'
         where gst_category = 'Registered Regular'
         and ifnull(customer_gstin, '')=''
         and ifnull(billing_address_gstin,'')=''
-    """)
+    """
+	)
 
-    frappe.db.sql(""" UPDATE `tabPurchase Invoice` set gst_category = 'Unregistered'
+	frappe.db.sql(
+		""" UPDATE `tabPurchase Invoice` set gst_category = 'Unregistered'
         where gst_category = 'Registered Regular'
         and ifnull(supplier_gstin, '')=''
-    """)
+    """
+	)
diff --git a/erpnext/patches/v12_0/update_healthcare_refactored_changes.py b/erpnext/patches/v12_0/update_healthcare_refactored_changes.py
index f553ee9..5ca0d5d 100644
--- a/erpnext/patches/v12_0/update_healthcare_refactored_changes.py
+++ b/erpnext/patches/v12_0/update_healthcare_refactored_changes.py
@@ -3,76 +3,79 @@
 from frappe.modules import get_doctype_module, scrub
 
 field_rename_map = {
-	'Healthcare Settings': [
-		['patient_master_name', 'patient_name_by'],
-		['max_visit', 'max_visits'],
-		['reg_sms', 'send_registration_msg'],
-		['reg_msg', 'registration_msg'],
-		['app_con', 'send_appointment_confirmation'],
-		['app_con_msg', 'appointment_confirmation_msg'],
-		['no_con', 'avoid_confirmation'],
-		['app_rem', 'send_appointment_reminder'],
-		['app_rem_msg', 'appointment_reminder_msg'],
-		['rem_before', 'remind_before'],
-		['manage_customer', 'link_customer_to_patient'],
-		['create_test_on_si_submit', 'create_lab_test_on_si_submit'],
-		['require_sample_collection', 'create_sample_collection_for_lab_test'],
-		['require_test_result_approval', 'lab_test_approval_required'],
-		['manage_appointment_invoice_automatically', 'automate_appointment_invoicing']
+	"Healthcare Settings": [
+		["patient_master_name", "patient_name_by"],
+		["max_visit", "max_visits"],
+		["reg_sms", "send_registration_msg"],
+		["reg_msg", "registration_msg"],
+		["app_con", "send_appointment_confirmation"],
+		["app_con_msg", "appointment_confirmation_msg"],
+		["no_con", "avoid_confirmation"],
+		["app_rem", "send_appointment_reminder"],
+		["app_rem_msg", "appointment_reminder_msg"],
+		["rem_before", "remind_before"],
+		["manage_customer", "link_customer_to_patient"],
+		["create_test_on_si_submit", "create_lab_test_on_si_submit"],
+		["require_sample_collection", "create_sample_collection_for_lab_test"],
+		["require_test_result_approval", "lab_test_approval_required"],
+		["manage_appointment_invoice_automatically", "automate_appointment_invoicing"],
 	],
-	'Drug Prescription':[
-		['use_interval', 'usage_interval'],
-		['in_every', 'interval_uom']
+	"Drug Prescription": [["use_interval", "usage_interval"], ["in_every", "interval_uom"]],
+	"Lab Test Template": [
+		["sample_quantity", "sample_qty"],
+		["sample_collection_details", "sample_details"],
 	],
-	'Lab Test Template':[
-		['sample_quantity', 'sample_qty'],
-		['sample_collection_details', 'sample_details']
+	"Sample Collection": [
+		["sample_quantity", "sample_qty"],
+		["sample_collection_details", "sample_details"],
 	],
-	'Sample Collection':[
-		['sample_quantity', 'sample_qty'],
-		['sample_collection_details', 'sample_details']
-	],
-	'Fee Validity': [
-		['max_visit', 'max_visits']
-	]
+	"Fee Validity": [["max_visit", "max_visits"]],
 }
 
+
 def execute():
 	for dn in field_rename_map:
-		if frappe.db.exists('DocType', dn):
-			if dn == 'Healthcare Settings':
-				frappe.reload_doctype('Healthcare Settings')
+		if frappe.db.exists("DocType", dn):
+			if dn == "Healthcare Settings":
+				frappe.reload_doctype("Healthcare Settings")
 			else:
 				frappe.reload_doc(get_doctype_module(dn), "doctype", scrub(dn))
 
 	for dt, field_list in field_rename_map.items():
-		if frappe.db.exists('DocType', dt):
+		if frappe.db.exists("DocType", dt):
 			for field in field_list:
-				if dt == 'Healthcare Settings':
+				if dt == "Healthcare Settings":
 					rename_field(dt, field[0], field[1])
 				elif frappe.db.has_column(dt, field[0]):
 					rename_field(dt, field[0], field[1])
 
 	# first name mandatory in Patient
-	if frappe.db.exists('DocType', 'Patient'):
+	if frappe.db.exists("DocType", "Patient"):
 		patients = frappe.db.sql("select name, patient_name from `tabPatient`", as_dict=1)
-		frappe.reload_doc('healthcare', 'doctype', 'patient')
+		frappe.reload_doc("healthcare", "doctype", "patient")
 		for entry in patients:
-			name = entry.patient_name.split(' ')
-			frappe.db.set_value('Patient', entry.name, 'first_name', name[0])
+			name = entry.patient_name.split(" ")
+			frappe.db.set_value("Patient", entry.name, "first_name", name[0])
 
 	# mark Healthcare Practitioner status as Disabled
-	if frappe.db.exists('DocType', 'Healthcare Practitioner'):
-		practitioners = frappe.db.sql("select name from `tabHealthcare Practitioner` where 'active'= 0", as_dict=1)
+	if frappe.db.exists("DocType", "Healthcare Practitioner"):
+		practitioners = frappe.db.sql(
+			"select name from `tabHealthcare Practitioner` where 'active'= 0", as_dict=1
+		)
 		practitioners_lst = [p.name for p in practitioners]
-		frappe.reload_doc('healthcare', 'doctype', 'healthcare_practitioner')
+		frappe.reload_doc("healthcare", "doctype", "healthcare_practitioner")
 		if practitioners_lst:
-			frappe.db.sql("update `tabHealthcare Practitioner` set status = 'Disabled' where name IN %(practitioners)s""", {"practitioners": practitioners_lst})
+			frappe.db.sql(
+				"update `tabHealthcare Practitioner` set status = 'Disabled' where name IN %(practitioners)s"
+				"",
+				{"practitioners": practitioners_lst},
+			)
 
 	# set Clinical Procedure status
-	if frappe.db.exists('DocType', 'Clinical Procedure'):
-		frappe.reload_doc('healthcare', 'doctype', 'clinical_procedure')
-		frappe.db.sql("""
+	if frappe.db.exists("DocType", "Clinical Procedure"):
+		frappe.reload_doc("healthcare", "doctype", "clinical_procedure")
+		frappe.db.sql(
+			"""
 			UPDATE
 				`tabClinical Procedure`
 			SET
@@ -80,57 +83,49 @@
 								WHEN status = 'Draft' THEN 0
 								ELSE 1
 							END)
-		""")
+		"""
+		)
 
 	# set complaints and diagnosis in table multiselect in Patient Encounter
-	if frappe.db.exists('DocType', 'Patient Encounter'):
-		field_list = [
-			['visit_department', 'medical_department'],
-			['type', 'appointment_type']
-		]
-		encounter_details = frappe.db.sql("""select symptoms, diagnosis, name from `tabPatient Encounter`""", as_dict=True)
-		frappe.reload_doc('healthcare', 'doctype', 'patient_encounter')
-		frappe.reload_doc('healthcare', 'doctype', 'patient_encounter_symptom')
-		frappe.reload_doc('healthcare', 'doctype', 'patient_encounter_diagnosis')
+	if frappe.db.exists("DocType", "Patient Encounter"):
+		field_list = [["visit_department", "medical_department"], ["type", "appointment_type"]]
+		encounter_details = frappe.db.sql(
+			"""select symptoms, diagnosis, name from `tabPatient Encounter`""", as_dict=True
+		)
+		frappe.reload_doc("healthcare", "doctype", "patient_encounter")
+		frappe.reload_doc("healthcare", "doctype", "patient_encounter_symptom")
+		frappe.reload_doc("healthcare", "doctype", "patient_encounter_diagnosis")
 
 		for field in field_list:
 			if frappe.db.has_column(dt, field[0]):
 				rename_field(dt, field[0], field[1])
 
 		for entry in encounter_details:
-			doc = frappe.get_doc('Patient Encounter', entry.name)
-			symptoms = entry.symptoms.split('\n') if entry.symptoms else []
+			doc = frappe.get_doc("Patient Encounter", entry.name)
+			symptoms = entry.symptoms.split("\n") if entry.symptoms else []
 			for symptom in symptoms:
-				if not frappe.db.exists('Complaint', symptom):
-					frappe.get_doc({
-						'doctype': 'Complaint',
-						'complaints': symptom
-					}).insert()
-				row = doc.append('symptoms', {
-					'complaint': symptom
-				})
+				if not frappe.db.exists("Complaint", symptom):
+					frappe.get_doc({"doctype": "Complaint", "complaints": symptom}).insert()
+				row = doc.append("symptoms", {"complaint": symptom})
 				row.db_update()
 
-			diagnosis = entry.diagnosis.split('\n') if entry.diagnosis else []
+			diagnosis = entry.diagnosis.split("\n") if entry.diagnosis else []
 			for d in diagnosis:
-				if not frappe.db.exists('Diagnosis', d):
-					frappe.get_doc({
-						'doctype': 'Diagnosis',
-						'diagnosis': d
-					}).insert()
-				row = doc.append('diagnosis', {
-					'diagnosis': d
-				})
+				if not frappe.db.exists("Diagnosis", d):
+					frappe.get_doc({"doctype": "Diagnosis", "diagnosis": d}).insert()
+				row = doc.append("diagnosis", {"diagnosis": d})
 				row.db_update()
 			doc.db_update()
 
-	if frappe.db.exists('DocType', 'Fee Validity'):
+	if frappe.db.exists("DocType", "Fee Validity"):
 		# update fee validity status
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			UPDATE
 				`tabFee Validity`
 			SET
 				status = (CASE WHEN visited >= max_visits THEN 'Completed'
 								ELSE 'Pending'
 							END)
-		""")
+		"""
+		)
diff --git a/erpnext/patches/v12_0/update_is_cancelled_field.py b/erpnext/patches/v12_0/update_is_cancelled_field.py
index 0401034..b567823 100644
--- a/erpnext/patches/v12_0/update_is_cancelled_field.py
+++ b/erpnext/patches/v12_0/update_is_cancelled_field.py
@@ -2,28 +2,35 @@
 
 
 def execute():
-	#handle type casting for is_cancelled field
+	# handle type casting for is_cancelled field
 	module_doctypes = (
-		('stock', 'Stock Ledger Entry'),
-		('stock', 'Serial No'),
-		('accounts', 'GL Entry')
+		("stock", "Stock Ledger Entry"),
+		("stock", "Serial No"),
+		("accounts", "GL Entry"),
 	)
 
 	for module, doctype in module_doctypes:
-		if (not frappe.db.has_column(doctype, "is_cancelled")
+		if (
+			not frappe.db.has_column(doctype, "is_cancelled")
 			or frappe.db.get_column_type(doctype, "is_cancelled").lower() == "int(1)"
 		):
 			continue
 
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 				UPDATE `tab{doctype}`
 				SET is_cancelled = 0
-				where is_cancelled in ('', NULL, 'No')"""
-				.format(doctype=doctype))
-		frappe.db.sql("""
+				where is_cancelled in ('', NULL, 'No')""".format(
+				doctype=doctype
+			)
+		)
+		frappe.db.sql(
+			"""
 				UPDATE `tab{doctype}`
 				SET is_cancelled = 1
-				where is_cancelled = 'Yes'"""
-				.format(doctype=doctype))
+				where is_cancelled = 'Yes'""".format(
+				doctype=doctype
+			)
+		)
 
 		frappe.reload_doc(module, "doctype", frappe.scrub(doctype))
diff --git a/erpnext/patches/v12_0/update_item_tax_template_company.py b/erpnext/patches/v12_0/update_item_tax_template_company.py
index abd4f6f..489f70d 100644
--- a/erpnext/patches/v12_0/update_item_tax_template_company.py
+++ b/erpnext/patches/v12_0/update_item_tax_template_company.py
@@ -2,12 +2,12 @@
 
 
 def execute():
-    frappe.reload_doc('accounts', 'doctype', 'item_tax_template')
+	frappe.reload_doc("accounts", "doctype", "item_tax_template")
 
-    item_tax_template_list = frappe.get_list('Item Tax Template')
-    for template in item_tax_template_list:
-        doc = frappe.get_doc('Item Tax Template', template.name)
-        for tax in doc.taxes:
-            doc.company = frappe.get_value('Account', tax.tax_type, 'company')
-            break
-        doc.save()
+	item_tax_template_list = frappe.get_list("Item Tax Template")
+	for template in item_tax_template_list:
+		doc = frappe.get_doc("Item Tax Template", template.name)
+		for tax in doc.taxes:
+			doc.company = frappe.get_value("Account", tax.tax_type, "company")
+			break
+		doc.save()
diff --git a/erpnext/patches/v12_0/update_owner_fields_in_acc_dimension_custom_fields.py b/erpnext/patches/v12_0/update_owner_fields_in_acc_dimension_custom_fields.py
index e5f24d4..7dc0af9 100644
--- a/erpnext/patches/v12_0/update_owner_fields_in_acc_dimension_custom_fields.py
+++ b/erpnext/patches/v12_0/update_owner_fields_in_acc_dimension_custom_fields.py
@@ -6,15 +6,21 @@
 
 
 def execute():
-	accounting_dimensions = frappe.db.sql("""select fieldname from
-		`tabAccounting Dimension`""", as_dict=1)
+	accounting_dimensions = frappe.db.sql(
+		"""select fieldname from
+		`tabAccounting Dimension`""",
+		as_dict=1,
+	)
 
 	doclist = get_doctypes_with_dimensions()
 
 	for dimension in accounting_dimensions:
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			UPDATE `tabCustom Field`
 			SET owner = 'Administrator'
 			WHERE fieldname = %s
-			AND dt IN (%s)""" %			#nosec
-			('%s', ', '.join(['%s']* len(doclist))), tuple([dimension.fieldname] + doclist))
+			AND dt IN (%s)"""
+			% ("%s", ", ".join(["%s"] * len(doclist))),  # nosec
+			tuple([dimension.fieldname] + doclist),
+		)
diff --git a/erpnext/patches/v12_0/update_price_list_currency_in_bom.py b/erpnext/patches/v12_0/update_price_list_currency_in_bom.py
index ea3e002..5710320 100644
--- a/erpnext/patches/v12_0/update_price_list_currency_in_bom.py
+++ b/erpnext/patches/v12_0/update_price_list_currency_in_bom.py
@@ -8,16 +8,19 @@
 	frappe.reload_doc("manufacturing", "doctype", "bom")
 	frappe.reload_doc("manufacturing", "doctype", "bom_item")
 
-	frappe.db.sql(""" UPDATE `tabBOM`, `tabPrice List`
+	frappe.db.sql(
+		""" UPDATE `tabBOM`, `tabPrice List`
 		SET
 			`tabBOM`.price_list_currency = `tabPrice List`.currency,
 			`tabBOM`.plc_conversion_rate = 1.0
 		WHERE
 			`tabBOM`.buying_price_list = `tabPrice List`.name AND `tabBOM`.docstatus < 2
 			AND `tabBOM`.rm_cost_as_per = 'Price List'
-	""")
+	"""
+	)
 
-	for d in frappe.db.sql("""
+	for d in frappe.db.sql(
+		"""
 		SELECT
 			bom.creation, bom.name, bom.price_list_currency as currency,
 			company.default_currency as company_currency
@@ -25,8 +28,11 @@
 			`tabBOM` as bom, `tabCompany` as company
 		WHERE
 			bom.company = company.name AND bom.rm_cost_as_per = 'Price List' AND
-			bom.price_list_currency != company.default_currency AND bom.docstatus < 2""", as_dict=1):
-			plc_conversion_rate = get_exchange_rate(d.currency,
-				d.company_currency, getdate(d.creation), "for_buying")
+			bom.price_list_currency != company.default_currency AND bom.docstatus < 2""",
+		as_dict=1,
+	):
+		plc_conversion_rate = get_exchange_rate(
+			d.currency, d.company_currency, getdate(d.creation), "for_buying"
+		)
 
-			frappe.db.set_value("BOM", d.name, "plc_conversion_rate", plc_conversion_rate)
+		frappe.db.set_value("BOM", d.name, "plc_conversion_rate", plc_conversion_rate)
diff --git a/erpnext/patches/v12_0/update_price_or_product_discount.py b/erpnext/patches/v12_0/update_price_or_product_discount.py
index 53c0ba5..64344c8 100644
--- a/erpnext/patches/v12_0/update_price_or_product_discount.py
+++ b/erpnext/patches/v12_0/update_price_or_product_discount.py
@@ -4,5 +4,7 @@
 def execute():
 	frappe.reload_doc("accounts", "doctype", "pricing_rule")
 
-	frappe.db.sql(""" UPDATE `tabPricing Rule` SET price_or_product_discount = 'Price'
-		WHERE ifnull(price_or_product_discount,'') = '' """)
+	frappe.db.sql(
+		""" UPDATE `tabPricing Rule` SET price_or_product_discount = 'Price'
+		WHERE ifnull(price_or_product_discount,'') = '' """
+	)
diff --git a/erpnext/patches/v12_0/update_pricing_rule_fields.py b/erpnext/patches/v12_0/update_pricing_rule_fields.py
index b7c36ae..8da06b0 100644
--- a/erpnext/patches/v12_0/update_pricing_rule_fields.py
+++ b/erpnext/patches/v12_0/update_pricing_rule_fields.py
@@ -4,68 +4,120 @@
 
 import frappe
 
-parentfield = {
-	'item_code': 'items',
-	'item_group': 'item_groups',
-	'brand': 'brands'
-}
+parentfield = {"item_code": "items", "item_group": "item_groups", "brand": "brands"}
+
 
 def execute():
 
-	if not frappe.get_all('Pricing Rule', limit=1):
+	if not frappe.get_all("Pricing Rule", limit=1):
 		return
 
-	frappe.reload_doc('accounts', 'doctype', 'pricing_rule_detail')
-	doctypes = {'Supplier Quotation': 'buying', 'Purchase Order': 'buying', 'Purchase Invoice': 'accounts',
-		'Purchase Receipt': 'stock', 'Quotation': 'selling', 'Sales Order': 'selling',
-		'Sales Invoice': 'accounts', 'Delivery Note': 'stock'}
+	frappe.reload_doc("accounts", "doctype", "pricing_rule_detail")
+	doctypes = {
+		"Supplier Quotation": "buying",
+		"Purchase Order": "buying",
+		"Purchase Invoice": "accounts",
+		"Purchase Receipt": "stock",
+		"Quotation": "selling",
+		"Sales Order": "selling",
+		"Sales Invoice": "accounts",
+		"Delivery Note": "stock",
+	}
 
 	for doctype, module in doctypes.items():
-		frappe.reload_doc(module, 'doctype', frappe.scrub(doctype))
+		frappe.reload_doc(module, "doctype", frappe.scrub(doctype))
 
-		child_doc = frappe.scrub(doctype) + '_item'
-		frappe.reload_doc(module, 'doctype', child_doc, force=True)
+		child_doc = frappe.scrub(doctype) + "_item"
+		frappe.reload_doc(module, "doctype", child_doc, force=True)
 
-		child_doctype = doctype + ' Item'
+		child_doctype = doctype + " Item"
 
-		frappe.db.sql(""" UPDATE `tab{child_doctype}` SET pricing_rules = pricing_rule
+		frappe.db.sql(
+			""" UPDATE `tab{child_doctype}` SET pricing_rules = pricing_rule
 			WHERE docstatus < 2 and pricing_rule is not null and pricing_rule != ''
-		""".format(child_doctype= child_doctype))
+		""".format(
+				child_doctype=child_doctype
+			)
+		)
 
-		data = frappe.db.sql(""" SELECT pricing_rule, name, parent,
+		data = frappe.db.sql(
+			""" SELECT pricing_rule, name, parent,
 				parenttype, creation, modified, docstatus, modified_by, owner, name
 			FROM `tab{child_doc}` where docstatus < 2 and pricing_rule is not null
-			and pricing_rule != ''""".format(child_doc=child_doctype), as_dict=1)
+			and pricing_rule != ''""".format(
+				child_doc=child_doctype
+			),
+			as_dict=1,
+		)
 
 		values = []
 		for d in data:
-			values.append((d.pricing_rule, d.name, d.parent, 'pricing_rules', d.parenttype,
-				d.creation, d.modified, d.docstatus, d.modified_by, d.owner, frappe.generate_hash("", 10)))
+			values.append(
+				(
+					d.pricing_rule,
+					d.name,
+					d.parent,
+					"pricing_rules",
+					d.parenttype,
+					d.creation,
+					d.modified,
+					d.docstatus,
+					d.modified_by,
+					d.owner,
+					frappe.generate_hash("", 10),
+				)
+			)
 
 		if values:
-			frappe.db.sql(""" INSERT INTO
+			frappe.db.sql(
+				""" INSERT INTO
 				`tabPricing Rule Detail` (`pricing_rule`, `child_docname`, `parent`, `parentfield`, `parenttype`,
 				`creation`, `modified`, `docstatus`, `modified_by`, `owner`, `name`)
-			VALUES {values} """.format(values=', '.join(['%s'] * len(values))), tuple(values))
+			VALUES {values} """.format(
+					values=", ".join(["%s"] * len(values))
+				),
+				tuple(values),
+			)
 
-	frappe.reload_doc('accounts', 'doctype', 'pricing_rule')
+	frappe.reload_doc("accounts", "doctype", "pricing_rule")
 
-	for doctype, apply_on in {'Pricing Rule Item Code': 'Item Code',
-		'Pricing Rule Item Group': 'Item Group', 'Pricing Rule Brand': 'Brand'}.items():
-		frappe.reload_doc('accounts', 'doctype', frappe.scrub(doctype))
+	for doctype, apply_on in {
+		"Pricing Rule Item Code": "Item Code",
+		"Pricing Rule Item Group": "Item Group",
+		"Pricing Rule Brand": "Brand",
+	}.items():
+		frappe.reload_doc("accounts", "doctype", frappe.scrub(doctype))
 
 		field = frappe.scrub(apply_on)
-		data = frappe.get_all('Pricing Rule', fields=[field, "name", "creation", "modified",
-			"owner", "modified_by"], filters= {'apply_on': apply_on})
+		data = frappe.get_all(
+			"Pricing Rule",
+			fields=[field, "name", "creation", "modified", "owner", "modified_by"],
+			filters={"apply_on": apply_on},
+		)
 
 		values = []
 		for d in data:
-			values.append((d.get(field), d.name, parentfield.get(field), 'Pricing Rule',
-				d.creation, d.modified, d.owner, d.modified_by, frappe.generate_hash("", 10)))
+			values.append(
+				(
+					d.get(field),
+					d.name,
+					parentfield.get(field),
+					"Pricing Rule",
+					d.creation,
+					d.modified,
+					d.owner,
+					d.modified_by,
+					frappe.generate_hash("", 10),
+				)
+			)
 
 		if values:
-			frappe.db.sql(""" INSERT INTO
+			frappe.db.sql(
+				""" INSERT INTO
 				`tab{doctype}` ({field}, parent, parentfield, parenttype, creation, modified,
 					owner, modified_by, name)
-			VALUES {values} """.format(doctype=doctype,
-				field=field, values=', '.join(['%s'] * len(values))), tuple(values))
+			VALUES {values} """.format(
+					doctype=doctype, field=field, values=", ".join(["%s"] * len(values))
+				),
+				tuple(values),
+			)
diff --git a/erpnext/patches/v12_0/update_production_plan_status.py b/erpnext/patches/v12_0/update_production_plan_status.py
index 06fc503..dc65ec2 100644
--- a/erpnext/patches/v12_0/update_production_plan_status.py
+++ b/erpnext/patches/v12_0/update_production_plan_status.py
@@ -6,7 +6,8 @@
 
 def execute():
 	frappe.reload_doc("manufacturing", "doctype", "production_plan")
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabProduction Plan` ppl
 		SET status = "Completed"
 		WHERE ppl.name IN (
@@ -28,4 +29,5 @@
 				HAVING should_set = 1
 			) ss
 		)
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v12_0/update_state_code_for_daman_and_diu.py b/erpnext/patches/v12_0/update_state_code_for_daman_and_diu.py
index 25cf6b9..d7e96fa 100644
--- a/erpnext/patches/v12_0/update_state_code_for_daman_and_diu.py
+++ b/erpnext/patches/v12_0/update_state_code_for_daman_and_diu.py
@@ -5,20 +5,22 @@
 
 def execute():
 
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	# Update options in gst_state custom field
-	gst_state = frappe.get_doc('Custom Field', 'Address-gst_state')
-	gst_state.options = '\n'.join(states)
+	gst_state = frappe.get_doc("Custom Field", "Address-gst_state")
+	gst_state.options = "\n".join(states)
 	gst_state.save()
 
 	# Update gst_state and state code in existing address
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabAddress`
 		SET
 			gst_state = 'Dadra and Nagar Haveli and Daman and Diu',
 			gst_state_number = 26
 		WHERE gst_state = 'Daman and Diu'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/add_bin_unique_constraint.py b/erpnext/patches/v13_0/add_bin_unique_constraint.py
index 57fbaae..38a8500 100644
--- a/erpnext/patches/v13_0/add_bin_unique_constraint.py
+++ b/erpnext/patches/v13_0/add_bin_unique_constraint.py
@@ -14,13 +14,16 @@
 	delete_broken_bins()
 	delete_and_patch_duplicate_bins()
 
+
 def delete_broken_bins():
 	# delete useless bins
 	frappe.db.sql("delete from `tabBin` where item_code is null or warehouse is null")
 
+
 def delete_and_patch_duplicate_bins():
 
-	duplicate_bins = frappe.db.sql("""
+	duplicate_bins = frappe.db.sql(
+		"""
 		SELECT
 			item_code, warehouse, count(*) as bin_count
 		FROM
@@ -29,18 +32,19 @@
 			item_code, warehouse
 		HAVING
 			bin_count > 1
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
 	for duplicate_bin in duplicate_bins:
 		item_code = duplicate_bin.item_code
 		warehouse = duplicate_bin.warehouse
-		existing_bins = frappe.get_list("Bin",
-				filters={
-					"item_code": item_code,
-					"warehouse": warehouse
-					},
-				fields=["name"],
-				order_by="creation",)
+		existing_bins = frappe.get_list(
+			"Bin",
+			filters={"item_code": item_code, "warehouse": warehouse},
+			fields=["name"],
+			order_by="creation",
+		)
 
 		# keep last one
 		existing_bins.pop()
@@ -53,7 +57,7 @@
 			"indented_qty": get_indented_qty(item_code, warehouse),
 			"ordered_qty": get_ordered_qty(item_code, warehouse),
 			"planned_qty": get_planned_qty(item_code, warehouse),
-			"actual_qty": get_balance_qty_from_sle(item_code, warehouse)
+			"actual_qty": get_balance_qty_from_sle(item_code, warehouse),
 		}
 
 		bin = get_bin(item_code, warehouse)
diff --git a/erpnext/patches/v13_0/add_cost_center_in_loans.py b/erpnext/patches/v13_0/add_cost_center_in_loans.py
index 25e1722..e293cf2 100644
--- a/erpnext/patches/v13_0/add_cost_center_in_loans.py
+++ b/erpnext/patches/v13_0/add_cost_center_in_loans.py
@@ -2,15 +2,11 @@
 
 
 def execute():
-	frappe.reload_doc('loan_management', 'doctype', 'loan')
-	loan = frappe.qb.DocType('Loan')
+	frappe.reload_doc("loan_management", "doctype", "loan")
+	loan = frappe.qb.DocType("Loan")
 
-	for company in frappe.get_all('Company', pluck='name'):
-		default_cost_center = frappe.db.get_value('Company', company, 'cost_center')
-		frappe.qb.update(
-			loan
-		).set(
-			loan.cost_center, default_cost_center
-		).where(
+	for company in frappe.get_all("Company", pluck="name"):
+		default_cost_center = frappe.db.get_value("Company", company, "cost_center")
+		frappe.qb.update(loan).set(loan.cost_center, default_cost_center).where(
 			loan.company == company
-		).run()
\ No newline at end of file
+		).run()
diff --git a/erpnext/patches/v13_0/add_custom_field_for_south_africa.py b/erpnext/patches/v13_0/add_custom_field_for_south_africa.py
index b34b5c1..353376b 100644
--- a/erpnext/patches/v13_0/add_custom_field_for_south_africa.py
+++ b/erpnext/patches/v13_0/add_custom_field_for_south_africa.py
@@ -7,13 +7,13 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'South Africa'})
+	company = frappe.get_all("Company", filters={"country": "South Africa"})
 	if not company:
 		return
 
-	frappe.reload_doc('regional', 'doctype', 'south_africa_vat_settings')
-	frappe.reload_doc('regional', 'report', 'vat_audit_report')
-	frappe.reload_doc('accounts', 'doctype', 'south_africa_vat_account')
+	frappe.reload_doc("regional", "doctype", "south_africa_vat_settings")
+	frappe.reload_doc("regional", "report", "vat_audit_report")
+	frappe.reload_doc("accounts", "doctype", "south_africa_vat_account")
 
 	make_custom_fields()
 	add_permissions()
diff --git a/erpnext/patches/v13_0/add_default_interview_notification_templates.py b/erpnext/patches/v13_0/add_default_interview_notification_templates.py
index 6b5de52..9a47efe 100644
--- a/erpnext/patches/v13_0/add_default_interview_notification_templates.py
+++ b/erpnext/patches/v13_0/add_default_interview_notification_templates.py
@@ -5,32 +5,40 @@
 
 
 def execute():
-	if not frappe.db.exists('Email Template', _('Interview Reminder')):
-		base_path = frappe.get_app_path('erpnext', 'hr', 'doctype')
-		response = frappe.read_file(os.path.join(base_path, 'interview/interview_reminder_notification_template.html'))
+	if not frappe.db.exists("Email Template", _("Interview Reminder")):
+		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
+		response = frappe.read_file(
+			os.path.join(base_path, "interview/interview_reminder_notification_template.html")
+		)
 
-		frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _('Interview Reminder'),
-			'response': response,
-			'subject': _('Interview Reminder'),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Interview Reminder"),
+				"response": response,
+				"subject": _("Interview Reminder"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 
-	if not frappe.db.exists('Email Template', _('Interview Feedback Reminder')):
-		base_path = frappe.get_app_path('erpnext', 'hr', 'doctype')
-		response = frappe.read_file(os.path.join(base_path, 'interview/interview_feedback_reminder_template.html'))
+	if not frappe.db.exists("Email Template", _("Interview Feedback Reminder")):
+		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
+		response = frappe.read_file(
+			os.path.join(base_path, "interview/interview_feedback_reminder_template.html")
+		)
 
-		frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': _('Interview Feedback Reminder'),
-			'response': response,
-			'subject': _('Interview Feedback Reminder'),
-			'owner': frappe.session.user,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Interview Feedback Reminder"),
+				"response": response,
+				"subject": _("Interview Feedback Reminder"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 
-	hr_settings = frappe.get_doc('HR Settings')
-	hr_settings.interview_reminder_template = _('Interview Reminder')
-	hr_settings.feedback_reminder_notification_template = _('Interview Feedback Reminder')
+	hr_settings = frappe.get_doc("HR Settings")
+	hr_settings.interview_reminder_template = _("Interview Reminder")
+	hr_settings.feedback_reminder_notification_template = _("Interview Feedback Reminder")
 	hr_settings.flags.ignore_links = True
 	hr_settings.save()
diff --git a/erpnext/patches/v13_0/add_doctype_to_sla.py b/erpnext/patches/v13_0/add_doctype_to_sla.py
index 8cee378..5f5974f 100644
--- a/erpnext/patches/v13_0/add_doctype_to_sla.py
+++ b/erpnext/patches/v13_0/add_doctype_to_sla.py
@@ -7,15 +7,15 @@
 
 
 def execute():
-	frappe.reload_doc('support', 'doctype', 'sla_fulfilled_on_status')
-	frappe.reload_doc('support', 'doctype', 'service_level_agreement')
-	if frappe.db.has_column('Service Level Agreement', 'enable'):
-		rename_field('Service Level Agreement', 'enable', 'enabled')
+	frappe.reload_doc("support", "doctype", "sla_fulfilled_on_status")
+	frappe.reload_doc("support", "doctype", "service_level_agreement")
+	if frappe.db.has_column("Service Level Agreement", "enable"):
+		rename_field("Service Level Agreement", "enable", "enabled")
 
-	for sla in frappe.get_all('Service Level Agreement'):
-		agreement = frappe.get_doc('Service Level Agreement', sla.name)
-		agreement.document_type = 'Issue'
+	for sla in frappe.get_all("Service Level Agreement"):
+		agreement = frappe.get_doc("Service Level Agreement", sla.name)
+		agreement.document_type = "Issue"
 		agreement.apply_sla_for_resolution = 1
-		agreement.append('sla_fulfilled_on', {'status': 'Resolved'})
-		agreement.append('sla_fulfilled_on', {'status': 'Closed'})
+		agreement.append("sla_fulfilled_on", {"status": "Resolved"})
+		agreement.append("sla_fulfilled_on", {"status": "Closed"})
 		agreement.save()
diff --git a/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py b/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py
index bd18b9b..517a14a 100644
--- a/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py
+++ b/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py
@@ -9,31 +9,34 @@
 
 
 def execute():
-	if not frappe.db.has_column('Work Order', 'has_batch_no'):
+	if not frappe.db.has_column("Work Order", "has_batch_no"):
 		return
 
-	frappe.reload_doc('manufacturing', 'doctype', 'manufacturing_settings')
-	if cint(frappe.db.get_single_value('Manufacturing Settings', 'make_serial_no_batch_from_work_order')):
+	frappe.reload_doc("manufacturing", "doctype", "manufacturing_settings")
+	if cint(
+		frappe.db.get_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order")
+	):
 		return
 
-	frappe.reload_doc('manufacturing', 'doctype', 'work_order')
+	frappe.reload_doc("manufacturing", "doctype", "work_order")
 	filters = {
-		'docstatus': 1,
-		'produced_qty': ('>', 0),
-		'creation': ('>=', '2021-06-29 00:00:00'),
-		'has_batch_no': 1
+		"docstatus": 1,
+		"produced_qty": (">", 0),
+		"creation": (">=", "2021-06-29 00:00:00"),
+		"has_batch_no": 1,
 	}
 
-	fields = ['name', 'production_item']
+	fields = ["name", "production_item"]
 
-	work_orders = [d.name for d in frappe.get_all('Work Order', filters = filters, fields=fields)]
+	work_orders = [d.name for d in frappe.get_all("Work Order", filters=filters, fields=fields)]
 
 	if not work_orders:
 		return
 
 	repost_stock_entries = []
 
-	stock_entries = frappe.db.sql_list('''
+	stock_entries = frappe.db.sql_list(
+		"""
 		SELECT
 			se.name
 		FROM
@@ -45,18 +48,20 @@
 			)
 		ORDER BY
 			se.posting_date, se.posting_time
-	''',  (work_orders,))
+	""",
+		(work_orders,),
+	)
 
 	if stock_entries:
-		print('Length of stock entries', len(stock_entries))
+		print("Length of stock entries", len(stock_entries))
 
 	for stock_entry in stock_entries:
-		doc = frappe.get_doc('Stock Entry', stock_entry)
+		doc = frappe.get_doc("Stock Entry", stock_entry)
 		doc.set_work_order_details()
 		doc.load_items_from_bom()
 		doc.calculate_rate_and_amount()
 		set_expense_account(doc)
-		doc.make_batches('t_warehouse')
+		doc.make_batches("t_warehouse")
 
 		if doc.docstatus == 0:
 			doc.save()
@@ -67,10 +72,14 @@
 	for repost_doc in repost_stock_entries:
 		repost_future_sle_and_gle(repost_doc)
 
+
 def set_expense_account(doc):
 	for row in doc.items:
 		if row.is_finished_item and not row.expense_account:
-			row.expense_account = frappe.get_cached_value('Company', doc.company, 'stock_adjustment_account')
+			row.expense_account = frappe.get_cached_value(
+				"Company", doc.company, "stock_adjustment_account"
+			)
+
 
 def repost_stock_entry(doc):
 	doc.db_update()
@@ -86,29 +95,36 @@
 		try:
 			make_sl_entries(sl_entries, True)
 		except Exception:
-			print(f'SLE entries not posted for the stock entry {doc.name}')
+			print(f"SLE entries not posted for the stock entry {doc.name}")
 			traceback = frappe.get_traceback()
 			frappe.log_error(traceback)
 
+
 def get_sle_for_target_warehouse(doc, sl_entries, finished_item_row):
-	for d in doc.get('items'):
+	for d in doc.get("items"):
 		if cstr(d.t_warehouse) and finished_item_row and d.name == finished_item_row.name:
-			sle = doc.get_sl_entries(d, {
-				"warehouse": cstr(d.t_warehouse),
-				"actual_qty": flt(d.transfer_qty),
-				"incoming_rate": flt(d.valuation_rate)
-			})
+			sle = doc.get_sl_entries(
+				d,
+				{
+					"warehouse": cstr(d.t_warehouse),
+					"actual_qty": flt(d.transfer_qty),
+					"incoming_rate": flt(d.valuation_rate),
+				},
+			)
 
 			sle.recalculate_rate = 1
 			sl_entries.append(sle)
 
+
 def repost_future_sle_and_gle(doc):
-	args = frappe._dict({
-		"posting_date": doc.posting_date,
-		"posting_time": doc.posting_time,
-		"voucher_type": doc.doctype,
-		"voucher_no": doc.name,
-		"company": doc.company
-	})
+	args = frappe._dict(
+		{
+			"posting_date": doc.posting_date,
+			"posting_time": doc.posting_time,
+			"voucher_type": doc.doctype,
+			"voucher_no": doc.name,
+			"company": doc.company,
+		}
+	)
 
 	create_repost_item_valuation_entry(args)
diff --git a/erpnext/patches/v13_0/add_naming_series_to_old_projects.py b/erpnext/patches/v13_0/add_naming_series_to_old_projects.py
index 71abe2e..7dce95c 100644
--- a/erpnext/patches/v13_0/add_naming_series_to_old_projects.py
+++ b/erpnext/patches/v13_0/add_naming_series_to_old_projects.py
@@ -4,8 +4,10 @@
 def execute():
 	frappe.reload_doc("projects", "doctype", "project")
 
-	frappe.db.sql("""UPDATE `tabProject`
+	frappe.db.sql(
+		"""UPDATE `tabProject`
 		SET
 			naming_series = 'PROJ-.####'
 		WHERE
-			naming_series is NULL""")
+			naming_series is NULL"""
+	)
diff --git a/erpnext/patches/v13_0/add_po_to_global_search.py b/erpnext/patches/v13_0/add_po_to_global_search.py
index 7fbaffb..514cd34 100644
--- a/erpnext/patches/v13_0/add_po_to_global_search.py
+++ b/erpnext/patches/v13_0/add_po_to_global_search.py
@@ -2,15 +2,13 @@
 
 
 def execute():
-    global_search_settings = frappe.get_single("Global Search Settings")
+	global_search_settings = frappe.get_single("Global Search Settings")
 
-    if "Purchase Order" in (
-        dt.document_type for dt in global_search_settings.allowed_in_global_search
-    ):
-        return
+	if "Purchase Order" in (
+		dt.document_type for dt in global_search_settings.allowed_in_global_search
+	):
+		return
 
-    global_search_settings.append(
-        "allowed_in_global_search", {"document_type": "Purchase Order"}
-    )
+	global_search_settings.append("allowed_in_global_search", {"document_type": "Purchase Order"})
 
-    global_search_settings.save(ignore_permissions=True)
+	global_search_settings.save(ignore_permissions=True)
diff --git a/erpnext/patches/v13_0/change_default_pos_print_format.py b/erpnext/patches/v13_0/change_default_pos_print_format.py
index 23cad31..be478a2 100644
--- a/erpnext/patches/v13_0/change_default_pos_print_format.py
+++ b/erpnext/patches/v13_0/change_default_pos_print_format.py
@@ -5,4 +5,5 @@
 	frappe.db.sql(
 		"""UPDATE `tabPOS Profile` profile
 		SET profile.`print_format` = 'POS Invoice'
-		WHERE profile.`print_format` = 'Point of Sale'""")
+		WHERE profile.`print_format` = 'Point of Sale'"""
+	)
diff --git a/erpnext/patches/v13_0/check_is_income_tax_component.py b/erpnext/patches/v13_0/check_is_income_tax_component.py
index 5e1df14..0ae3a3e 100644
--- a/erpnext/patches/v13_0/check_is_income_tax_component.py
+++ b/erpnext/patches/v13_0/check_is_income_tax_component.py
@@ -10,33 +10,36 @@
 
 def execute():
 
-	doctypes = ['salary_component',
-		'Employee Tax Exemption Declaration',
-		'Employee Tax Exemption Proof Submission',
-		'Employee Tax Exemption Declaration Category',
-		'Employee Tax Exemption Proof Submission Detail',
-		'gratuity_rule',
-		'gratuity_rule_slab',
-		'gratuity_applicable_component'
+	doctypes = [
+		"salary_component",
+		"Employee Tax Exemption Declaration",
+		"Employee Tax Exemption Proof Submission",
+		"Employee Tax Exemption Declaration Category",
+		"Employee Tax Exemption Proof Submission Detail",
+		"gratuity_rule",
+		"gratuity_rule_slab",
+		"gratuity_applicable_component",
 	]
 
 	for doctype in doctypes:
-		frappe.reload_doc('Payroll', 'doctype', doctype, force=True)
+		frappe.reload_doc("Payroll", "doctype", doctype, force=True)
 
-
-	reports = ['Professional Tax Deductions', 'Provident Fund Deductions', 'E-Invoice Summary']
+	reports = ["Professional Tax Deductions", "Provident Fund Deductions", "E-Invoice Summary"]
 	for report in reports:
-		frappe.reload_doc('Regional', 'Report', report)
-		frappe.reload_doc('Regional', 'Report', report)
+		frappe.reload_doc("Regional", "Report", report)
+		frappe.reload_doc("Regional", "Report", report)
 
 	if erpnext.get_region() == "India":
-		create_custom_field('Salary Component',
-			dict(fieldname='component_type',
-			label='Component Type',
-			fieldtype='Select',
-			insert_after='description',
-			options='\nProvident Fund\nAdditional Provident Fund\nProvident Fund Loan\nProfessional Tax',
-			depends_on='eval:doc.type == "Deduction"')
+		create_custom_field(
+			"Salary Component",
+			dict(
+				fieldname="component_type",
+				label="Component Type",
+				fieldtype="Select",
+				insert_after="description",
+				options="\nProvident Fund\nAdditional Provident Fund\nProvident Fund Loan\nProfessional Tax",
+				depends_on='eval:doc.type == "Deduction"',
+			),
 		)
 
 	if frappe.db.exists("Salary Component", "Income Tax"):
@@ -44,7 +47,9 @@
 	if frappe.db.exists("Salary Component", "TDS"):
 		frappe.db.set_value("Salary Component", "TDS", "is_income_tax_component", 1)
 
-	components = frappe.db.sql("select name from `tabSalary Component` where variable_based_on_taxable_salary = 1", as_dict=1)
+	components = frappe.db.sql(
+		"select name from `tabSalary Component` where variable_based_on_taxable_salary = 1", as_dict=1
+	)
 	for component in components:
 		frappe.db.set_value("Salary Component", component.name, "is_income_tax_component", 1)
 
@@ -52,4 +57,6 @@
 		if frappe.db.exists("Salary Component", "Provident Fund"):
 			frappe.db.set_value("Salary Component", "Provident Fund", "component_type", "Provident Fund")
 		if frappe.db.exists("Salary Component", "Professional Tax"):
-			frappe.db.set_value("Salary Component", "Professional Tax", "component_type", "Professional Tax")
+			frappe.db.set_value(
+				"Salary Component", "Professional Tax", "component_type", "Professional Tax"
+			)
diff --git a/erpnext/patches/v13_0/convert_qi_parameter_to_link_field.py b/erpnext/patches/v13_0/convert_qi_parameter_to_link_field.py
index bc64c63..efbb96c 100644
--- a/erpnext/patches/v13_0/convert_qi_parameter_to_link_field.py
+++ b/erpnext/patches/v13_0/convert_qi_parameter_to_link_field.py
@@ -2,22 +2,24 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'quality_inspection_parameter')
+	frappe.reload_doc("stock", "doctype", "quality_inspection_parameter")
 
 	# get all distinct parameters from QI readigs table
-	reading_params = frappe.db.get_all("Quality Inspection Reading", fields=["distinct specification"])
+	reading_params = frappe.db.get_all(
+		"Quality Inspection Reading", fields=["distinct specification"]
+	)
 	reading_params = [d.specification for d in reading_params]
 
 	# get all distinct parameters from QI Template as some may be unused in QI
-	template_params = frappe.db.get_all("Item Quality Inspection Parameter", fields=["distinct specification"])
+	template_params = frappe.db.get_all(
+		"Item Quality Inspection Parameter", fields=["distinct specification"]
+	)
 	template_params = [d.specification for d in template_params]
 
 	params = list(set(reading_params + template_params))
 
 	for parameter in params:
 		if not frappe.db.exists("Quality Inspection Parameter", parameter):
-			frappe.get_doc({
-				"doctype": "Quality Inspection Parameter",
-				"parameter": parameter,
-				"description": parameter
-			}).insert(ignore_permissions=True)
+			frappe.get_doc(
+				{"doctype": "Quality Inspection Parameter", "parameter": parameter, "description": parameter}
+			).insert(ignore_permissions=True)
diff --git a/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py b/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py
index d3ee3f8..020521d 100644
--- a/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py
+++ b/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py
@@ -7,51 +7,57 @@
 
 
 def execute():
-    """
-        Convert all Item links to Website Item link values in
-        exisitng 'Item Card Group' Web Page Block data.
-    """
-    frappe.reload_doc("e_commerce", "web_template", "item_card_group")
+	"""
+	Convert all Item links to Website Item link values in
+	exisitng 'Item Card Group' Web Page Block data.
+	"""
+	frappe.reload_doc("e_commerce", "web_template", "item_card_group")
 
-    blocks = frappe.db.get_all(
-        "Web Page Block",
-        filters={"web_template": "Item Card Group"},
-        fields=["parent", "web_template_values", "name"]
-    )
+	blocks = frappe.db.get_all(
+		"Web Page Block",
+		filters={"web_template": "Item Card Group"},
+		fields=["parent", "web_template_values", "name"],
+	)
 
-    fields = generate_fields_to_edit()
+	fields = generate_fields_to_edit()
 
-    for block in blocks:
-        web_template_value = json.loads(block.get('web_template_values'))
+	for block in blocks:
+		web_template_value = json.loads(block.get("web_template_values"))
 
-        for field in fields:
-            item = web_template_value.get(field)
-            if not item:
-                continue
+		for field in fields:
+			item = web_template_value.get(field)
+			if not item:
+				continue
 
-            if frappe.db.exists("Website Item", {"item_code": item}):
-                website_item = frappe.db.get_value("Website Item", {"item_code": item})
-            else:
-                website_item = make_new_website_item(item)
+			if frappe.db.exists("Website Item", {"item_code": item}):
+				website_item = frappe.db.get_value("Website Item", {"item_code": item})
+			else:
+				website_item = make_new_website_item(item)
 
-            if website_item:
-                web_template_value[field] = website_item
+			if website_item:
+				web_template_value[field] = website_item
 
-        frappe.db.set_value("Web Page Block", block.name, "web_template_values", json.dumps(web_template_value))
+		frappe.db.set_value(
+			"Web Page Block", block.name, "web_template_values", json.dumps(web_template_value)
+		)
+
 
 def generate_fields_to_edit() -> List:
-    fields = []
-    for i in range(1, 13):
-        fields.append(f"card_{i}_item") # fields like 'card_1_item', etc.
+	fields = []
+	for i in range(1, 13):
+		fields.append(f"card_{i}_item")  # fields like 'card_1_item', etc.
 
-    return fields
+	return fields
+
 
 def make_new_website_item(item: str) -> Union[str, None]:
-    try:
-        doc = frappe.get_doc("Item", item)
-        web_item = make_website_item(doc) # returns [website_item.name, item_name]
-        return web_item[0]
-    except Exception:
-        title = f"{item}: Error while converting to Website Item "
-        frappe.log_error(title + "for Item Card Group Template" + "\n\n" + frappe.get_traceback(), title=title)
-        return None
+	try:
+		doc = frappe.get_doc("Item", item)
+		web_item = make_website_item(doc)  # returns [website_item.name, item_name]
+		return web_item[0]
+	except Exception:
+		title = f"{item}: Error while converting to Website Item "
+		frappe.log_error(
+			title + "for Item Card Group Template" + "\n\n" + frappe.get_traceback(), title=title
+		)
+		return None
diff --git a/erpnext/patches/v13_0/create_accounting_dimensions_in_pos_doctypes.py b/erpnext/patches/v13_0/create_accounting_dimensions_in_pos_doctypes.py
index 4450108..51ab0e8 100644
--- a/erpnext/patches/v13_0/create_accounting_dimensions_in_pos_doctypes.py
+++ b/erpnext/patches/v13_0/create_accounting_dimensions_in_pos_doctypes.py
@@ -3,9 +3,12 @@
 
 
 def execute():
-	frappe.reload_doc('accounts', 'doctype', 'accounting_dimension')
-	accounting_dimensions = frappe.db.sql("""select fieldname, label, document_type, disabled from
-		`tabAccounting Dimension`""", as_dict=1)
+	frappe.reload_doc("accounts", "doctype", "accounting_dimension")
+	accounting_dimensions = frappe.db.sql(
+		"""select fieldname, label, document_type, disabled from
+		`tabAccounting Dimension`""",
+		as_dict=1,
+	)
 
 	if not accounting_dimensions:
 		return
@@ -14,9 +17,9 @@
 	for d in accounting_dimensions:
 
 		if count % 2 == 0:
-			insert_after_field = 'dimension_col_break'
+			insert_after_field = "dimension_col_break"
 		else:
-			insert_after_field = 'accounting_dimensions_section'
+			insert_after_field = "accounting_dimensions_section"
 
 		for doctype in ["POS Invoice", "POS Invoice Item"]:
 
@@ -32,10 +35,10 @@
 				"label": d.label,
 				"fieldtype": "Link",
 				"options": d.document_type,
-				"insert_after": insert_after_field
+				"insert_after": insert_after_field,
 			}
 
-			if df['fieldname'] not in fieldnames:
+			if df["fieldname"] not in fieldnames:
 				create_custom_field(doctype, df)
 				frappe.clear_cache(doctype=doctype)
 
diff --git a/erpnext/patches/v13_0/create_custom_field_for_finance_book.py b/erpnext/patches/v13_0/create_custom_field_for_finance_book.py
index 313b0e9..2b8666d 100644
--- a/erpnext/patches/v13_0/create_custom_field_for_finance_book.py
+++ b/erpnext/patches/v13_0/create_custom_field_for_finance_book.py
@@ -3,18 +3,18 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	custom_field = {
-		'Finance Book': [
+		"Finance Book": [
 			{
-				'fieldname': 'for_income_tax',
-				'label': 'For Income Tax',
-				'fieldtype': 'Check',
-				'insert_after': 'finance_book_name',
-				'description': 'If the asset is put to use for less than 180 days, the first Depreciation Rate will be reduced by 50%.'
+				"fieldname": "for_income_tax",
+				"label": "For Income Tax",
+				"fieldtype": "Check",
+				"insert_after": "finance_book_name",
+				"description": "If the asset is put to use for less than 180 days, the first Depreciation Rate will be reduced by 50%.",
 			}
 		]
 	}
diff --git a/erpnext/patches/v13_0/create_gst_payment_entry_fields.py b/erpnext/patches/v13_0/create_gst_payment_entry_fields.py
index 4166945..bef2516 100644
--- a/erpnext/patches/v13_0/create_gst_payment_entry_fields.py
+++ b/erpnext/patches/v13_0/create_gst_payment_entry_fields.py
@@ -6,32 +6,75 @@
 
 
 def execute():
-	frappe.reload_doc('accounts', 'doctype', 'advance_taxes_and_charges')
-	frappe.reload_doc('accounts', 'doctype', 'payment_entry')
+	frappe.reload_doc("accounts", "doctype", "advance_taxes_and_charges")
+	frappe.reload_doc("accounts", "doctype", "payment_entry")
 
-	if frappe.db.exists('Company', {'country': 'India'}):
+	if frappe.db.exists("Company", {"country": "India"}):
 		custom_fields = {
-			'Payment Entry': [
-				dict(fieldname='gst_section', label='GST Details', fieldtype='Section Break', insert_after='deductions',
-					print_hide=1, collapsible=1),
-				dict(fieldname='company_address', label='Company Address', fieldtype='Link', insert_after='gst_section',
-					print_hide=1, options='Address'),
-				dict(fieldname='company_gstin', label='Company GSTIN',
-					fieldtype='Data', insert_after='company_address',
-					fetch_from='company_address.gstin', print_hide=1, read_only=1),
-				dict(fieldname='place_of_supply', label='Place of Supply',
-					fieldtype='Data', insert_after='company_gstin',
-					print_hide=1, read_only=1),
-				dict(fieldname='customer_address', label='Customer Address', fieldtype='Link', insert_after='place_of_supply',
-					print_hide=1, options='Address', depends_on = 'eval:doc.party_type == "Customer"'),
-				dict(fieldname='customer_gstin', label='Customer GSTIN',
-					fieldtype='Data', insert_after='customer_address',
-					fetch_from='customer_address.gstin', print_hide=1, read_only=1)
+			"Payment Entry": [
+				dict(
+					fieldname="gst_section",
+					label="GST Details",
+					fieldtype="Section Break",
+					insert_after="deductions",
+					print_hide=1,
+					collapsible=1,
+				),
+				dict(
+					fieldname="company_address",
+					label="Company Address",
+					fieldtype="Link",
+					insert_after="gst_section",
+					print_hide=1,
+					options="Address",
+				),
+				dict(
+					fieldname="company_gstin",
+					label="Company GSTIN",
+					fieldtype="Data",
+					insert_after="company_address",
+					fetch_from="company_address.gstin",
+					print_hide=1,
+					read_only=1,
+				),
+				dict(
+					fieldname="place_of_supply",
+					label="Place of Supply",
+					fieldtype="Data",
+					insert_after="company_gstin",
+					print_hide=1,
+					read_only=1,
+				),
+				dict(
+					fieldname="customer_address",
+					label="Customer Address",
+					fieldtype="Link",
+					insert_after="place_of_supply",
+					print_hide=1,
+					options="Address",
+					depends_on='eval:doc.party_type == "Customer"',
+				),
+				dict(
+					fieldname="customer_gstin",
+					label="Customer GSTIN",
+					fieldtype="Data",
+					insert_after="customer_address",
+					fetch_from="customer_address.gstin",
+					print_hide=1,
+					read_only=1,
+				),
 			]
 		}
 
 		create_custom_fields(custom_fields, update=True)
 	else:
-		fields = ['gst_section', 'company_address', 'company_gstin', 'place_of_supply', 'customer_address', 'customer_gstin']
+		fields = [
+			"gst_section",
+			"company_address",
+			"company_gstin",
+			"place_of_supply",
+			"customer_address",
+			"customer_gstin",
+		]
 		for field in fields:
-			frappe.delete_doc_if_exists("Custom Field", f"Payment Entry-{field}")
\ No newline at end of file
+			frappe.delete_doc_if_exists("Custom Field", f"Payment Entry-{field}")
diff --git a/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py b/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py
index f33b4b3..093463a 100644
--- a/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py
+++ b/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py
@@ -4,9 +4,8 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Saudi Arabia'})
+	company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
 	if not company:
 		return
 
 	make_custom_fields()
-
diff --git a/erpnext/patches/v13_0/create_leave_policy_assignment_based_on_employee_current_leave_policy.py b/erpnext/patches/v13_0/create_leave_policy_assignment_based_on_employee_current_leave_policy.py
index 6f9031f..59b17ee 100644
--- a/erpnext/patches/v13_0/create_leave_policy_assignment_based_on_employee_current_leave_policy.py
+++ b/erpnext/patches/v13_0/create_leave_policy_assignment_based_on_employee_current_leave_policy.py
@@ -6,69 +6,89 @@
 
 
 def execute():
-    frappe.reload_doc('hr', 'doctype', 'leave_policy_assignment')
-    frappe.reload_doc('hr', 'doctype', 'employee_grade')
-    employee_with_assignment = []
-    leave_policy = []
+	frappe.reload_doc("hr", "doctype", "leave_policy_assignment")
+	frappe.reload_doc("hr", "doctype", "employee_grade")
+	employee_with_assignment = []
+	leave_policy = []
 
-    if "leave_policy" in frappe.db.get_table_columns("Employee"):
-        employees_with_leave_policy = frappe.db.sql("SELECT name, leave_policy FROM `tabEmployee` WHERE leave_policy IS NOT NULL and leave_policy != ''", as_dict = 1)
+	if "leave_policy" in frappe.db.get_table_columns("Employee"):
+		employees_with_leave_policy = frappe.db.sql(
+			"SELECT name, leave_policy FROM `tabEmployee` WHERE leave_policy IS NOT NULL and leave_policy != ''",
+			as_dict=1,
+		)
 
-        for employee in employees_with_leave_policy:
-            alloc = frappe.db.exists("Leave Allocation", {"employee":employee.name, "leave_policy": employee.leave_policy, "docstatus": 1})
-            if not alloc:
-                create_assignment(employee.name, employee.leave_policy)
+		for employee in employees_with_leave_policy:
+			alloc = frappe.db.exists(
+				"Leave Allocation",
+				{"employee": employee.name, "leave_policy": employee.leave_policy, "docstatus": 1},
+			)
+			if not alloc:
+				create_assignment(employee.name, employee.leave_policy)
 
-            employee_with_assignment.append(employee.name)
-            leave_policy.append(employee.leave_policy)
+			employee_with_assignment.append(employee.name)
+			leave_policy.append(employee.leave_policy)
 
-    if "default_leave_policy" in frappe.db.get_table_columns("Employee Grade"):
-        employee_grade_with_leave_policy = frappe.db.sql("SELECT name, default_leave_policy FROM `tabEmployee Grade` WHERE default_leave_policy IS NOT NULL and default_leave_policy!=''", as_dict = 1)
+	if "default_leave_policy" in frappe.db.get_table_columns("Employee Grade"):
+		employee_grade_with_leave_policy = frappe.db.sql(
+			"SELECT name, default_leave_policy FROM `tabEmployee Grade` WHERE default_leave_policy IS NOT NULL and default_leave_policy!=''",
+			as_dict=1,
+		)
 
-        #for whole employee Grade
-        for grade in employee_grade_with_leave_policy:
-            employees = get_employee_with_grade(grade.name)
-            for employee in employees:
+		# for whole employee Grade
+		for grade in employee_grade_with_leave_policy:
+			employees = get_employee_with_grade(grade.name)
+			for employee in employees:
 
-                if employee not in employee_with_assignment: #Will ensure no duplicate
-                    alloc = frappe.db.exists("Leave Allocation", {"employee":employee.name, "leave_policy": grade.default_leave_policy, "docstatus": 1})
-                    if not alloc:
-                        create_assignment(employee.name, grade.default_leave_policy)
-                    leave_policy.append(grade.default_leave_policy)
+				if employee not in employee_with_assignment:  # Will ensure no duplicate
+					alloc = frappe.db.exists(
+						"Leave Allocation",
+						{"employee": employee.name, "leave_policy": grade.default_leave_policy, "docstatus": 1},
+					)
+					if not alloc:
+						create_assignment(employee.name, grade.default_leave_policy)
+					leave_policy.append(grade.default_leave_policy)
 
-    #for old Leave allocation and leave policy from allocation, which may got updated in employee grade.
-    leave_allocations = frappe.db.sql("SELECT leave_policy, leave_period, employee FROM `tabLeave Allocation` WHERE leave_policy IS NOT NULL and leave_policy != '' and docstatus = 1 ", as_dict = 1)
+	# for old Leave allocation and leave policy from allocation, which may got updated in employee grade.
+	leave_allocations = frappe.db.sql(
+		"SELECT leave_policy, leave_period, employee FROM `tabLeave Allocation` WHERE leave_policy IS NOT NULL and leave_policy != '' and docstatus = 1 ",
+		as_dict=1,
+	)
 
-    for allocation in leave_allocations:
-        if allocation.leave_policy not in leave_policy:
-            create_assignment(allocation.employee, allocation.leave_policy, leave_period=allocation.leave_period,
-                allocation_exists=True)
+	for allocation in leave_allocations:
+		if allocation.leave_policy not in leave_policy:
+			create_assignment(
+				allocation.employee,
+				allocation.leave_policy,
+				leave_period=allocation.leave_period,
+				allocation_exists=True,
+			)
 
-def create_assignment(employee, leave_policy, leave_period=None, allocation_exists = False):
-    if frappe.db.get_value("Leave Policy", leave_policy, "docstatus") == 2:
-        return
 
-    filters = {"employee":employee, "leave_policy": leave_policy}
-    if leave_period:
-        filters["leave_period"] = leave_period
+def create_assignment(employee, leave_policy, leave_period=None, allocation_exists=False):
+	if frappe.db.get_value("Leave Policy", leave_policy, "docstatus") == 2:
+		return
 
-    if not frappe.db.exists("Leave Policy Assignment" , filters):
-        lpa = frappe.new_doc("Leave Policy Assignment")
-        lpa.employee = employee
-        lpa.leave_policy = leave_policy
+	filters = {"employee": employee, "leave_policy": leave_policy}
+	if leave_period:
+		filters["leave_period"] = leave_period
 
-        lpa.flags.ignore_mandatory = True
-        if allocation_exists:
-            lpa.assignment_based_on = 'Leave Period'
-            lpa.leave_period = leave_period
-            lpa.leaves_allocated = 1
+	if not frappe.db.exists("Leave Policy Assignment", filters):
+		lpa = frappe.new_doc("Leave Policy Assignment")
+		lpa.employee = employee
+		lpa.leave_policy = leave_policy
 
-        lpa.save()
-        if allocation_exists:
-            lpa.submit()
-            #Updating old Leave Allocation
-            frappe.db.sql("Update `tabLeave Allocation` set leave_policy_assignment = %s", lpa.name)
+		lpa.flags.ignore_mandatory = True
+		if allocation_exists:
+			lpa.assignment_based_on = "Leave Period"
+			lpa.leave_period = leave_period
+			lpa.leaves_allocated = 1
+
+		lpa.save()
+		if allocation_exists:
+			lpa.submit()
+			# Updating old Leave Allocation
+			frappe.db.sql("Update `tabLeave Allocation` set leave_policy_assignment = %s", lpa.name)
 
 
 def get_employee_with_grade(grade):
-    return frappe.get_list("Employee", filters = {"grade": grade})
+	return frappe.get_list("Employee", filters={"grade": grade})
diff --git a/erpnext/patches/v13_0/create_pan_field_for_india.py b/erpnext/patches/v13_0/create_pan_field_for_india.py
index 6df6e1e..48c688e 100644
--- a/erpnext/patches/v13_0/create_pan_field_for_india.py
+++ b/erpnext/patches/v13_0/create_pan_field_for_india.py
@@ -3,27 +3,17 @@
 
 
 def execute():
-	frappe.reload_doc('buying', 'doctype', 'supplier', force=True)
-	frappe.reload_doc('selling', 'doctype', 'customer', force=True)
-	frappe.reload_doc('core', 'doctype', 'doctype', force=True)
+	frappe.reload_doc("buying", "doctype", "supplier", force=True)
+	frappe.reload_doc("selling", "doctype", "customer", force=True)
+	frappe.reload_doc("core", "doctype", "doctype", force=True)
 
 	custom_fields = {
-		'Supplier': [
-			{
-				'fieldname': 'pan',
-				'label': 'PAN',
-				'fieldtype': 'Data',
-				'insert_after': 'supplier_type'
-			}
+		"Supplier": [
+			{"fieldname": "pan", "label": "PAN", "fieldtype": "Data", "insert_after": "supplier_type"}
 		],
-		'Customer': [
-			{
-				'fieldname': 'pan',
-				'label': 'PAN',
-				'fieldtype': 'Data',
-				'insert_after': 'customer_type'
-			}
-		]
+		"Customer": [
+			{"fieldname": "pan", "label": "PAN", "fieldtype": "Data", "insert_after": "customer_type"}
+		],
 	}
 
 	create_custom_fields(custom_fields, update=True)
diff --git a/erpnext/patches/v13_0/create_uae_pos_invoice_fields.py b/erpnext/patches/v13_0/create_uae_pos_invoice_fields.py
index 87c9cf1..66aae9a 100644
--- a/erpnext/patches/v13_0/create_uae_pos_invoice_fields.py
+++ b/erpnext/patches/v13_0/create_uae_pos_invoice_fields.py
@@ -8,12 +8,13 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': ['in', ['Saudi Arabia', 'United Arab Emirates']]})
+	company = frappe.get_all(
+		"Company", filters={"country": ["in", ["Saudi Arabia", "United Arab Emirates"]]}
+	)
 	if not company:
 		return
 
-
-	frappe.reload_doc('accounts', 'doctype', 'pos_invoice')
-	frappe.reload_doc('accounts', 'doctype', 'pos_invoice_item')
+	frappe.reload_doc("accounts", "doctype", "pos_invoice")
+	frappe.reload_doc("accounts", "doctype", "pos_invoice_item")
 
 	make_custom_fields()
diff --git a/erpnext/patches/v13_0/create_website_items.py b/erpnext/patches/v13_0/create_website_items.py
index da162a3..cb7bfc3 100644
--- a/erpnext/patches/v13_0/create_website_items.py
+++ b/erpnext/patches/v13_0/create_website_items.py
@@ -11,14 +11,31 @@
 	frappe.reload_doc("e_commerce", "doctype", "e_commerce_settings")
 	frappe.reload_doc("stock", "doctype", "item")
 
-	item_fields = ["item_code", "item_name", "item_group", "stock_uom", "brand", "image",
-		"has_variants", "variant_of", "description", "weightage"]
-	web_fields_to_map = ["route", "slideshow", "website_image_alt",
-		"website_warehouse", "web_long_description", "website_content", "thumbnail"]
+	item_fields = [
+		"item_code",
+		"item_name",
+		"item_group",
+		"stock_uom",
+		"brand",
+		"image",
+		"has_variants",
+		"variant_of",
+		"description",
+		"weightage",
+	]
+	web_fields_to_map = [
+		"route",
+		"slideshow",
+		"website_image_alt",
+		"website_warehouse",
+		"web_long_description",
+		"website_content",
+		"thumbnail",
+	]
 
 	# get all valid columns (fields) from Item master DB schema
-	item_table_fields = frappe.db.sql("desc `tabItem`", as_dict=1) # nosemgrep
-	item_table_fields = [d.get('Field') for d in item_table_fields]
+	item_table_fields = frappe.db.sql("desc `tabItem`", as_dict=1)  # nosemgrep
+	item_table_fields = [d.get("Field") for d in item_table_fields]
 
 	# prepare fields to query from Item, check if the web field exists in Item master
 	web_query_fields = []
@@ -38,11 +55,7 @@
 		# most likely a fresh installation that doesnt need this patch
 		return
 
-	items = frappe.db.get_all(
-		"Item",
-		fields=item_fields,
-		or_filters=or_filters
-	)
+	items = frappe.db.get_all("Item", fields=item_fields, or_filters=or_filters)
 	total_count = len(items)
 
 	for count, item in enumerate(items, start=1):
@@ -62,11 +75,11 @@
 		for doctype in ("Website Item Group", "Item Website Specification"):
 			frappe.db.set_value(
 				doctype,
-				{"parenttype": "Item", "parent": item.item_code}, # filters
-				{"parenttype": "Website Item", "parent": website_item.name} # value dict
+				{"parenttype": "Item", "parent": item.item_code},  # filters
+				{"parenttype": "Website Item", "parent": website_item.name},  # value dict
 			)
 
-		if count % 20 == 0: # commit after every 20 items
+		if count % 20 == 0:  # commit after every 20 items
 			frappe.db.commit()
 
-		frappe.utils.update_progress_bar('Creating Website Items', count, total_count)
+		frappe.utils.update_progress_bar("Creating Website Items", count, total_count)
diff --git a/erpnext/patches/v13_0/custom_fields_for_taxjar_integration.py b/erpnext/patches/v13_0/custom_fields_for_taxjar_integration.py
index 078c558..5cbd0b5 100644
--- a/erpnext/patches/v13_0/custom_fields_for_taxjar_integration.py
+++ b/erpnext/patches/v13_0/custom_fields_for_taxjar_integration.py
@@ -5,35 +5,68 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'United States'}, fields=['name'])
+	company = frappe.get_all("Company", filters={"country": "United States"}, fields=["name"])
 	if not company:
 		return
 
-	TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value("TaxJar Settings", "taxjar_create_transactions")
+	TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value(
+		"TaxJar Settings", "taxjar_create_transactions"
+	)
 	TAXJAR_CALCULATE_TAX = frappe.db.get_single_value("TaxJar Settings", "taxjar_calculate_tax")
 	TAXJAR_SANDBOX_MODE = frappe.db.get_single_value("TaxJar Settings", "is_sandbox")
 
-	if (not TAXJAR_CREATE_TRANSACTIONS and not TAXJAR_CALCULATE_TAX and not TAXJAR_SANDBOX_MODE):
+	if not TAXJAR_CREATE_TRANSACTIONS and not TAXJAR_CALCULATE_TAX and not TAXJAR_SANDBOX_MODE:
 		return
 
 	custom_fields = {
-		'Sales Invoice Item': [
-			dict(fieldname='product_tax_category', fieldtype='Link', insert_after='description', options='Product Tax Category',
-				label='Product Tax Category', fetch_from='item_code.product_tax_category'),
-			dict(fieldname='tax_collectable', fieldtype='Currency', insert_after='net_amount',
-				label='Tax Collectable', read_only=1, options='currency'),
-			dict(fieldname='taxable_amount', fieldtype='Currency', insert_after='tax_collectable',
-				label='Taxable Amount', read_only=1, options='currency')
+		"Sales Invoice Item": [
+			dict(
+				fieldname="product_tax_category",
+				fieldtype="Link",
+				insert_after="description",
+				options="Product Tax Category",
+				label="Product Tax Category",
+				fetch_from="item_code.product_tax_category",
+			),
+			dict(
+				fieldname="tax_collectable",
+				fieldtype="Currency",
+				insert_after="net_amount",
+				label="Tax Collectable",
+				read_only=1,
+				options="currency",
+			),
+			dict(
+				fieldname="taxable_amount",
+				fieldtype="Currency",
+				insert_after="tax_collectable",
+				label="Taxable Amount",
+				read_only=1,
+				options="currency",
+			),
 		],
-		'Item': [
-			dict(fieldname='product_tax_category', fieldtype='Link', insert_after='item_group', options='Product Tax Category',
-				label='Product Tax Category')
+		"Item": [
+			dict(
+				fieldname="product_tax_category",
+				fieldtype="Link",
+				insert_after="item_group",
+				options="Product Tax Category",
+				label="Product Tax Category",
+			)
 		],
-		'TaxJar Settings': [
-			dict(fieldname='company', fieldtype='Link', insert_after='configuration', options='Company',
-				label='Company')
-		]
+		"TaxJar Settings": [
+			dict(
+				fieldname="company",
+				fieldtype="Link",
+				insert_after="configuration",
+				options="Company",
+				label="Company",
+			)
+		],
 	}
 	create_custom_fields(custom_fields, update=True)
 	add_permissions()
-	frappe.enqueue('erpnext.erpnext_integrations.doctype.taxjar_settings.taxjar_settings.add_product_tax_categories', now=True)
+	frappe.enqueue(
+		"erpnext.erpnext_integrations.doctype.taxjar_settings.taxjar_settings.add_product_tax_categories",
+		now=True,
+	)
diff --git a/erpnext/patches/v13_0/delete_bank_reconciliation_detail.py b/erpnext/patches/v13_0/delete_bank_reconciliation_detail.py
index 75953b0..c53eb79 100644
--- a/erpnext/patches/v13_0/delete_bank_reconciliation_detail.py
+++ b/erpnext/patches/v13_0/delete_bank_reconciliation_detail.py
@@ -7,7 +7,8 @@
 
 def execute():
 
-	if frappe.db.exists('DocType', 'Bank Reconciliation Detail') and \
-		frappe.db.exists('DocType', 'Bank Clearance Detail'):
+	if frappe.db.exists("DocType", "Bank Reconciliation Detail") and frappe.db.exists(
+		"DocType", "Bank Clearance Detail"
+	):
 
-		frappe.delete_doc("DocType", 'Bank Reconciliation Detail', force=1)
+		frappe.delete_doc("DocType", "Bank Reconciliation Detail", force=1)
diff --git a/erpnext/patches/v13_0/delete_old_bank_reconciliation_doctypes.py b/erpnext/patches/v13_0/delete_old_bank_reconciliation_doctypes.py
index 2c5c577..3755315 100644
--- a/erpnext/patches/v13_0/delete_old_bank_reconciliation_doctypes.py
+++ b/erpnext/patches/v13_0/delete_old_bank_reconciliation_doctypes.py
@@ -22,7 +22,7 @@
 
 	frappe.delete_doc("Page", "bank-reconciliation", force=1)
 
-	frappe.reload_doc('accounts', 'doctype', 'bank_transaction')
+	frappe.reload_doc("accounts", "doctype", "bank_transaction")
 
 	rename_field("Bank Transaction", "debit", "deposit")
 	rename_field("Bank Transaction", "credit", "withdrawal")
diff --git a/erpnext/patches/v13_0/delete_old_purchase_reports.py b/erpnext/patches/v13_0/delete_old_purchase_reports.py
index e57d6d0..987f53f 100644
--- a/erpnext/patches/v13_0/delete_old_purchase_reports.py
+++ b/erpnext/patches/v13_0/delete_old_purchase_reports.py
@@ -8,9 +8,12 @@
 
 
 def execute():
-	reports_to_delete = ["Requested Items To Be Ordered",
-		"Purchase Order Items To Be Received or Billed","Purchase Order Items To Be Received",
-		"Purchase Order Items To Be Billed"]
+	reports_to_delete = [
+		"Requested Items To Be Ordered",
+		"Purchase Order Items To Be Received or Billed",
+		"Purchase Order Items To Be Received",
+		"Purchase Order Items To Be Billed",
+	]
 
 	for report in reports_to_delete:
 		if frappe.db.exists("Report", report):
@@ -19,8 +22,9 @@
 
 			frappe.delete_doc("Report", report)
 
+
 def delete_auto_email_reports(report):
-	""" Check for one or multiple Auto Email Reports and delete """
+	"""Check for one or multiple Auto Email Reports and delete"""
 	auto_email_reports = frappe.db.get_values("Auto Email Report", {"report": report}, ["name"])
 	for auto_email_report in auto_email_reports:
 		frappe.delete_doc("Auto Email Report", auto_email_report[0])
diff --git a/erpnext/patches/v13_0/delete_old_sales_reports.py b/erpnext/patches/v13_0/delete_old_sales_reports.py
index e6eba0a..b31c9d1 100644
--- a/erpnext/patches/v13_0/delete_old_sales_reports.py
+++ b/erpnext/patches/v13_0/delete_old_sales_reports.py
@@ -18,14 +18,16 @@
 
 			frappe.delete_doc("Report", report)
 
+
 def delete_auto_email_reports(report):
-	""" Check for one or multiple Auto Email Reports and delete """
+	"""Check for one or multiple Auto Email Reports and delete"""
 	auto_email_reports = frappe.db.get_values("Auto Email Report", {"report": report}, ["name"])
 	for auto_email_report in auto_email_reports:
 		frappe.delete_doc("Auto Email Report", auto_email_report[0])
 
+
 def delete_links_from_desktop_icons(report):
-	""" Check for one or multiple Desktop Icons and delete """
+	"""Check for one or multiple Desktop Icons and delete"""
 	desktop_icons = frappe.db.get_values("Desktop Icon", {"_report": report}, ["name"])
 	for desktop_icon in desktop_icons:
-		frappe.delete_doc("Desktop Icon", desktop_icon[0])
\ No newline at end of file
+		frappe.delete_doc("Desktop Icon", desktop_icon[0])
diff --git a/erpnext/patches/v13_0/delete_orphaned_tables.py b/erpnext/patches/v13_0/delete_orphaned_tables.py
index c32f830..794be09 100644
--- a/erpnext/patches/v13_0/delete_orphaned_tables.py
+++ b/erpnext/patches/v13_0/delete_orphaned_tables.py
@@ -7,63 +7,66 @@
 
 
 def execute():
-    frappe.reload_doc('setup', 'doctype', 'transaction_deletion_record')
+	frappe.reload_doc("setup", "doctype", "transaction_deletion_record")
 
-    if has_deleted_company_transactions():
-        child_doctypes = get_child_doctypes_whose_parent_doctypes_were_affected()
+	if has_deleted_company_transactions():
+		child_doctypes = get_child_doctypes_whose_parent_doctypes_were_affected()
 
-        for doctype in child_doctypes:
-            docs = frappe.get_all(doctype, fields=['name', 'parent', 'parenttype', 'creation'])
+		for doctype in child_doctypes:
+			docs = frappe.get_all(doctype, fields=["name", "parent", "parenttype", "creation"])
 
-            for doc in docs:
-                if not frappe.db.exists(doc['parenttype'], doc['parent']):
-                    frappe.db.delete(doctype, {'name': doc['name']})
+			for doc in docs:
+				if not frappe.db.exists(doc["parenttype"], doc["parent"]):
+					frappe.db.delete(doctype, {"name": doc["name"]})
 
-                elif check_for_new_doc_with_same_name_as_deleted_parent(doc):
-                    frappe.db.delete(doctype, {'name': doc['name']})
+				elif check_for_new_doc_with_same_name_as_deleted_parent(doc):
+					frappe.db.delete(doctype, {"name": doc["name"]})
+
 
 def has_deleted_company_transactions():
-    return frappe.get_all('Transaction Deletion Record')
+	return frappe.get_all("Transaction Deletion Record")
+
 
 def get_child_doctypes_whose_parent_doctypes_were_affected():
-    parent_doctypes = get_affected_doctypes()
-    child_doctypes = frappe.get_all(
-        'DocField',
-        filters={
-            'fieldtype': 'Table',
-            'parent':['in', parent_doctypes]
-        }, pluck='options')
+	parent_doctypes = get_affected_doctypes()
+	child_doctypes = frappe.get_all(
+		"DocField", filters={"fieldtype": "Table", "parent": ["in", parent_doctypes]}, pluck="options"
+	)
 
-    return child_doctypes
+	return child_doctypes
+
 
 def get_affected_doctypes():
-    affected_doctypes = []
-    tdr_docs = frappe.get_all('Transaction Deletion Record', pluck="name")
+	affected_doctypes = []
+	tdr_docs = frappe.get_all("Transaction Deletion Record", pluck="name")
 
-    for tdr in tdr_docs:
-        tdr_doc = frappe.get_doc("Transaction Deletion Record", tdr)
+	for tdr in tdr_docs:
+		tdr_doc = frappe.get_doc("Transaction Deletion Record", tdr)
 
-        for doctype in tdr_doc.doctypes:
-            if is_not_child_table(doctype.doctype_name):
-                affected_doctypes.append(doctype.doctype_name)
+		for doctype in tdr_doc.doctypes:
+			if is_not_child_table(doctype.doctype_name):
+				affected_doctypes.append(doctype.doctype_name)
 
-    affected_doctypes = remove_duplicate_items(affected_doctypes)
-    return affected_doctypes
+	affected_doctypes = remove_duplicate_items(affected_doctypes)
+	return affected_doctypes
+
 
 def is_not_child_table(doctype):
-    return not bool(frappe.get_value('DocType', doctype, 'istable'))
+	return not bool(frappe.get_value("DocType", doctype, "istable"))
+
 
 def remove_duplicate_items(affected_doctypes):
-    return list(set(affected_doctypes))
+	return list(set(affected_doctypes))
+
 
 def check_for_new_doc_with_same_name_as_deleted_parent(doc):
-    """
-        Compares creation times of parent and child docs.
-        Since Transaction Deletion Record resets the naming series after deletion,
-        it allows the creation of new docs with the same names as the deleted ones.
-    """
+	"""
+	Compares creation times of parent and child docs.
+	Since Transaction Deletion Record resets the naming series after deletion,
+	it allows the creation of new docs with the same names as the deleted ones.
+	"""
 
-    parent_creation_time = frappe.db.get_value(doc['parenttype'], doc['parent'], 'creation')
-    child_creation_time = doc['creation']
+	parent_creation_time = frappe.db.get_value(doc["parenttype"], doc["parent"], "creation")
+	child_creation_time = doc["creation"]
 
-    return getdate(parent_creation_time) > getdate(child_creation_time)
+	return getdate(parent_creation_time) > getdate(child_creation_time)
diff --git a/erpnext/patches/v13_0/delete_report_requested_items_to_order.py b/erpnext/patches/v13_0/delete_report_requested_items_to_order.py
index 87565f0..430a305 100644
--- a/erpnext/patches/v13_0/delete_report_requested_items_to_order.py
+++ b/erpnext/patches/v13_0/delete_report_requested_items_to_order.py
@@ -2,12 +2,16 @@
 
 
 def execute():
-	""" Check for one or multiple Auto Email Reports and delete """
-	auto_email_reports = frappe.db.get_values("Auto Email Report", {"report": "Requested Items to Order"}, ["name"])
+	"""Check for one or multiple Auto Email Reports and delete"""
+	auto_email_reports = frappe.db.get_values(
+		"Auto Email Report", {"report": "Requested Items to Order"}, ["name"]
+	)
 	for auto_email_report in auto_email_reports:
 		frappe.delete_doc("Auto Email Report", auto_email_report[0])
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		DELETE FROM `tabReport`
 		WHERE name = 'Requested Items to Order'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py b/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
index aa2a2d3..84b6c37 100644
--- a/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
+++ b/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
@@ -7,13 +7,13 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Saudi Arabia'})
+	company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
 	if company:
 		add_print_formats()
 		return
 
-	if frappe.db.exists('DocType', 'Print Format'):
+	if frappe.db.exists("DocType", "Print Format"):
 		frappe.reload_doc("regional", "print_format", "ksa_vat_invoice", force=True)
 		frappe.reload_doc("regional", "print_format", "ksa_pos_invoice", force=True)
-		for d in ('KSA VAT Invoice', 'KSA POS Invoice'):
+		for d in ("KSA VAT Invoice", "KSA POS Invoice"):
 			frappe.db.set_value("Print Format", d, "disabled", 1)
diff --git a/erpnext/patches/v13_0/drop_razorpay_payload_column.py b/erpnext/patches/v13_0/drop_razorpay_payload_column.py
index 611ba7e..ca166ce 100644
--- a/erpnext/patches/v13_0/drop_razorpay_payload_column.py
+++ b/erpnext/patches/v13_0/drop_razorpay_payload_column.py
@@ -3,5 +3,5 @@
 
 def execute():
 	if frappe.db.exists("DocType", "Membership"):
-		if 'webhook_payload' in frappe.db.get_table_columns("Membership"):
+		if "webhook_payload" in frappe.db.get_table_columns("Membership"):
 			frappe.db.sql("alter table `tabMembership` drop column webhook_payload")
diff --git a/erpnext/patches/v13_0/enable_ksa_vat_docs.py b/erpnext/patches/v13_0/enable_ksa_vat_docs.py
index 3f48262..4adf4d7 100644
--- a/erpnext/patches/v13_0/enable_ksa_vat_docs.py
+++ b/erpnext/patches/v13_0/enable_ksa_vat_docs.py
@@ -4,9 +4,9 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Saudi Arabia'})
+	company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
 	if not company:
 		return
 
 	add_print_formats()
-	add_permissions()
\ No newline at end of file
+	add_permissions()
diff --git a/erpnext/patches/v13_0/enable_provisional_accounting.py b/erpnext/patches/v13_0/enable_provisional_accounting.py
index 8e22270..dd18167 100644
--- a/erpnext/patches/v13_0/enable_provisional_accounting.py
+++ b/erpnext/patches/v13_0/enable_provisional_accounting.py
@@ -6,14 +6,11 @@
 
 	company = frappe.qb.DocType("Company")
 
-	frappe.qb.update(
-		company
-	).set(
-		company.enable_provisional_accounting_for_non_stock_items, company.enable_perpetual_inventory_for_non_stock_items
-	).set(
-		company.default_provisional_account, company.service_received_but_not_billed
-	).where(
+	frappe.qb.update(company).set(
+		company.enable_provisional_accounting_for_non_stock_items,
+		company.enable_perpetual_inventory_for_non_stock_items,
+	).set(company.default_provisional_account, company.service_received_but_not_billed).where(
 		company.enable_perpetual_inventory_for_non_stock_items == 1
 	).where(
 		company.service_received_but_not_billed.isnotnull()
-	).run()
\ No newline at end of file
+	).run()
diff --git a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py
index 7a51b43..68b5cde 100644
--- a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py
+++ b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py
@@ -2,7 +2,6 @@
 
 
 def execute():
-	frappe.reload_doc('core', 'doctype', 'scheduled_job_type')
-	if frappe.db.exists('Scheduled Job Type', 'repost_item_valuation.repost_entries'):
-		frappe.db.set_value('Scheduled Job Type',
-			'repost_item_valuation.repost_entries', 'stopped', 0)
+	frappe.reload_doc("core", "doctype", "scheduled_job_type")
+	if frappe.db.exists("Scheduled Job Type", "repost_item_valuation.repost_entries"):
+		frappe.db.set_value("Scheduled Job Type", "repost_item_valuation.repost_entries", "stopped", 0)
diff --git a/erpnext/patches/v13_0/enable_uoms.py b/erpnext/patches/v13_0/enable_uoms.py
index 4d3f637..8efd67e 100644
--- a/erpnext/patches/v13_0/enable_uoms.py
+++ b/erpnext/patches/v13_0/enable_uoms.py
@@ -2,12 +2,12 @@
 
 
 def execute():
-	frappe.reload_doc('setup', 'doctype', 'uom')
+	frappe.reload_doc("setup", "doctype", "uom")
 
 	uom = frappe.qb.DocType("UOM")
 
-	(frappe.qb
-		.update(uom)
+	(
+		frappe.qb.update(uom)
 		.set(uom.enabled, 1)
 		.where(uom.creation >= "2021-10-18")  # date when this field was released
 	).run()
diff --git a/erpnext/patches/v13_0/fetch_thumbnail_in_website_items.py b/erpnext/patches/v13_0/fetch_thumbnail_in_website_items.py
index 32ad542..9197d86 100644
--- a/erpnext/patches/v13_0/fetch_thumbnail_in_website_items.py
+++ b/erpnext/patches/v13_0/fetch_thumbnail_in_website_items.py
@@ -2,15 +2,10 @@
 
 
 def execute():
-    if frappe.db.has_column("Item", "thumbnail"):
-        website_item = frappe.qb.DocType("Website Item").as_("wi")
-        item = frappe.qb.DocType("Item")
+	if frappe.db.has_column("Item", "thumbnail"):
+		website_item = frappe.qb.DocType("Website Item").as_("wi")
+		item = frappe.qb.DocType("Item")
 
-        frappe.qb.update(website_item).inner_join(item).on(
-            website_item.item_code == item.item_code
-        ).set(
-            website_item.thumbnail, item.thumbnail
-        ).where(
-            website_item.website_image.notnull()
-            & website_item.thumbnail.isnull()
-        ).run()
+		frappe.qb.update(website_item).inner_join(item).on(website_item.item_code == item.item_code).set(
+			website_item.thumbnail, item.thumbnail
+		).where(website_item.website_image.notnull() & website_item.thumbnail.isnull()).run()
diff --git a/erpnext/patches/v13_0/fix_invoice_statuses.py b/erpnext/patches/v13_0/fix_invoice_statuses.py
index 4395757..253b425 100644
--- a/erpnext/patches/v13_0/fix_invoice_statuses.py
+++ b/erpnext/patches/v13_0/fix_invoice_statuses.py
@@ -8,6 +8,7 @@
 
 TODAY = getdate()
 
+
 def execute():
 	# This fix is not related to Party Specific Item,
 	# but it is needed for code introduced after Party Specific Item was
@@ -35,39 +36,28 @@
 			fields=fields,
 			filters={
 				"docstatus": 1,
-				"status": ("in", (
-					"Overdue",
-					"Overdue and Discounted",
-					"Partly Paid",
-					"Partly Paid and Discounted"
-				)),
+				"status": (
+					"in",
+					("Overdue", "Overdue and Discounted", "Partly Paid", "Partly Paid and Discounted"),
+				),
 				"outstanding_amount": (">", 0),
 				"modified": (">", "2021-01-01")
 				# an assumption is being made that only invoices modified
 				# after 2021 got affected as incorrectly overdue.
 				# required for performance reasons.
-			}
+			},
 		)
 
-		invoices_to_update = {
-			invoice.name: invoice for invoice in invoices_to_update
-		}
+		invoices_to_update = {invoice.name: invoice for invoice in invoices_to_update}
 
 		payment_schedule_items = frappe.get_all(
 			"Payment Schedule",
-			fields=(
-				"due_date",
-				"payment_amount",
-				"base_payment_amount",
-				"parent"
-			),
-			filters={"parent": ("in", invoices_to_update)}
+			fields=("due_date", "payment_amount", "base_payment_amount", "parent"),
+			filters={"parent": ("in", invoices_to_update)},
 		)
 
 		for item in payment_schedule_items:
-			invoices_to_update[item.parent].setdefault(
-				"payment_schedule", []
-			).append(item)
+			invoices_to_update[item.parent].setdefault("payment_schedule", []).append(item)
 
 		status_map = {}
 
@@ -81,19 +71,11 @@
 			status_map.setdefault(correct_status, []).append(doc.name)
 
 		for status, docs in status_map.items():
-			frappe.db.set_value(
-				doctype, {"name": ("in", docs)},
-				"status",
-				status,
-				update_modified=False
-			)
-
+			frappe.db.set_value(doctype, {"name": ("in", docs)}, "status", status, update_modified=False)
 
 
 def get_correct_status(doc):
-	outstanding_amount = flt(
-		doc.outstanding_amount, doc.precision("outstanding_amount")
-	)
+	outstanding_amount = flt(doc.outstanding_amount, doc.precision("outstanding_amount"))
 	total = get_total_in_party_account_currency(doc)
 
 	status = ""
diff --git a/erpnext/patches/v13_0/fix_non_unique_represents_company.py b/erpnext/patches/v13_0/fix_non_unique_represents_company.py
index e91c1db..c604f9c 100644
--- a/erpnext/patches/v13_0/fix_non_unique_represents_company.py
+++ b/erpnext/patches/v13_0/fix_non_unique_represents_company.py
@@ -2,8 +2,10 @@
 
 
 def execute():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update tabCustomer
 		set represents_company = NULL
 		where represents_company = ''
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/germany_fill_debtor_creditor_number.py b/erpnext/patches/v13_0/germany_fill_debtor_creditor_number.py
index 72cda75..fc3e68a 100644
--- a/erpnext/patches/v13_0/germany_fill_debtor_creditor_number.py
+++ b/erpnext/patches/v13_0/germany_fill_debtor_creditor_number.py
@@ -13,18 +13,24 @@
 	"DATEV". This is no longer necessary. The reference ID for DATEV will be
 	stored in a new custom field "debtor_creditor_number".
 	"""
-	company_list = frappe.get_all('Company', filters={'country': 'Germany'})
+	company_list = frappe.get_all("Company", filters={"country": "Germany"})
 
 	for company in company_list:
-		party_account_list = frappe.get_all('Party Account', filters={'company': company.name}, fields=['name', 'account', 'debtor_creditor_number'])
+		party_account_list = frappe.get_all(
+			"Party Account",
+			filters={"company": company.name},
+			fields=["name", "account", "debtor_creditor_number"],
+		)
 		for party_account in party_account_list:
 			if (not party_account.account) or party_account.debtor_creditor_number:
 				# account empty or debtor_creditor_number already filled
 				continue
 
-			account_number = frappe.db.get_value('Account', party_account.account, 'account_number')
+			account_number = frappe.db.get_value("Account", party_account.account, "account_number")
 			if not account_number:
 				continue
 
-			frappe.db.set_value('Party Account', party_account.name, 'debtor_creditor_number', account_number)
-			frappe.db.set_value('Party Account', party_account.name, 'account', '')
+			frappe.db.set_value(
+				"Party Account", party_account.name, "debtor_creditor_number", account_number
+			)
+			frappe.db.set_value("Party Account", party_account.name, "account", "")
diff --git a/erpnext/patches/v13_0/germany_make_custom_fields.py b/erpnext/patches/v13_0/germany_make_custom_fields.py
index 80b6a39..cc35813 100644
--- a/erpnext/patches/v13_0/germany_make_custom_fields.py
+++ b/erpnext/patches/v13_0/germany_make_custom_fields.py
@@ -13,7 +13,7 @@
 	It is usually run once at setup of a new company. Since it's new, run it
 	once for existing companies as well.
 	"""
-	company_list = frappe.get_all('Company', filters = {'country': 'Germany'})
+	company_list = frappe.get_all("Company", filters={"country": "Germany"})
 	if not company_list:
 		return
 
diff --git a/erpnext/patches/v13_0/gst_fields_for_pos_invoice.py b/erpnext/patches/v13_0/gst_fields_for_pos_invoice.py
index 76f8b27..efd2c21 100644
--- a/erpnext/patches/v13_0/gst_fields_for_pos_invoice.py
+++ b/erpnext/patches/v13_0/gst_fields_for_pos_invoice.py
@@ -3,40 +3,85 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'}, fields=['name'])
+	company = frappe.get_all("Company", filters={"country": "India"}, fields=["name"])
 	if not company:
 		return
 
-	hsn_sac_field = dict(fieldname='gst_hsn_code', label='HSN/SAC',
-		fieldtype='Data', fetch_from='item_code.gst_hsn_code', insert_after='description',
-		allow_on_submit=1, print_hide=1, fetch_if_empty=1)
-	nil_rated_exempt = dict(fieldname='is_nil_exempt', label='Is Nil Rated or Exempted',
-		fieldtype='Check', fetch_from='item_code.is_nil_exempt', insert_after='gst_hsn_code',
-		print_hide=1)
-	is_non_gst = dict(fieldname='is_non_gst', label='Is Non GST',
-		fieldtype='Check', fetch_from='item_code.is_non_gst', insert_after='is_nil_exempt',
-		print_hide=1)
-	taxable_value = dict(fieldname='taxable_value', label='Taxable Value',
-		fieldtype='Currency', insert_after='base_net_amount', hidden=1, options="Company:company:default_currency",
-		print_hide=1)
+	hsn_sac_field = dict(
+		fieldname="gst_hsn_code",
+		label="HSN/SAC",
+		fieldtype="Data",
+		fetch_from="item_code.gst_hsn_code",
+		insert_after="description",
+		allow_on_submit=1,
+		print_hide=1,
+		fetch_if_empty=1,
+	)
+	nil_rated_exempt = dict(
+		fieldname="is_nil_exempt",
+		label="Is Nil Rated or Exempted",
+		fieldtype="Check",
+		fetch_from="item_code.is_nil_exempt",
+		insert_after="gst_hsn_code",
+		print_hide=1,
+	)
+	is_non_gst = dict(
+		fieldname="is_non_gst",
+		label="Is Non GST",
+		fieldtype="Check",
+		fetch_from="item_code.is_non_gst",
+		insert_after="is_nil_exempt",
+		print_hide=1,
+	)
+	taxable_value = dict(
+		fieldname="taxable_value",
+		label="Taxable Value",
+		fieldtype="Currency",
+		insert_after="base_net_amount",
+		hidden=1,
+		options="Company:company:default_currency",
+		print_hide=1,
+	)
 	sales_invoice_gst_fields = [
-			dict(fieldname='billing_address_gstin', label='Billing Address GSTIN',
-				fieldtype='Data', insert_after='customer_address', read_only=1,
-				fetch_from='customer_address.gstin', print_hide=1),
-			dict(fieldname='customer_gstin', label='Customer GSTIN',
-				fieldtype='Data', insert_after='shipping_address_name',
-				fetch_from='shipping_address_name.gstin', print_hide=1),
-			dict(fieldname='place_of_supply', label='Place of Supply',
-				fieldtype='Data', insert_after='customer_gstin',
-				print_hide=1, read_only=1),
-			dict(fieldname='company_gstin', label='Company GSTIN',
-				fieldtype='Data', insert_after='company_address',
-				fetch_from='company_address.gstin', print_hide=1, read_only=1),
-		]
+		dict(
+			fieldname="billing_address_gstin",
+			label="Billing Address GSTIN",
+			fieldtype="Data",
+			insert_after="customer_address",
+			read_only=1,
+			fetch_from="customer_address.gstin",
+			print_hide=1,
+		),
+		dict(
+			fieldname="customer_gstin",
+			label="Customer GSTIN",
+			fieldtype="Data",
+			insert_after="shipping_address_name",
+			fetch_from="shipping_address_name.gstin",
+			print_hide=1,
+		),
+		dict(
+			fieldname="place_of_supply",
+			label="Place of Supply",
+			fieldtype="Data",
+			insert_after="customer_gstin",
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="company_gstin",
+			label="Company GSTIN",
+			fieldtype="Data",
+			insert_after="company_address",
+			fetch_from="company_address.gstin",
+			print_hide=1,
+			read_only=1,
+		),
+	]
 
 	custom_fields = {
-		'POS Invoice': sales_invoice_gst_fields,
-		'POS Invoice Item': [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
+		"POS Invoice": sales_invoice_gst_fields,
+		"POS Invoice Item": [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
 	}
 
-	create_custom_fields(custom_fields, update=True)
\ No newline at end of file
+	create_custom_fields(custom_fields, update=True)
diff --git a/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py b/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py
index 98ce12b..30b84ac 100644
--- a/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py
+++ b/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py
@@ -3,88 +3,92 @@
 
 
 def execute():
-	if frappe.db.exists('DocType', 'Lab Test') and frappe.db.exists('DocType', 'Lab Test Template'):
+	if frappe.db.exists("DocType", "Lab Test") and frappe.db.exists("DocType", "Lab Test Template"):
 		# rename child doctypes
 		doctypes = {
-			'Lab Test Groups': 'Lab Test Group Template',
-			'Normal Test Items': 'Normal Test Result',
-			'Sensitivity Test Items': 'Sensitivity Test Result',
-			'Special Test Items': 'Descriptive Test Result',
-			'Special Test Template': 'Descriptive Test Template'
+			"Lab Test Groups": "Lab Test Group Template",
+			"Normal Test Items": "Normal Test Result",
+			"Sensitivity Test Items": "Sensitivity Test Result",
+			"Special Test Items": "Descriptive Test Result",
+			"Special Test Template": "Descriptive Test Template",
 		}
 
-		frappe.reload_doc('healthcare', 'doctype', 'lab_test')
-		frappe.reload_doc('healthcare', 'doctype', 'lab_test_template')
+		frappe.reload_doc("healthcare", "doctype", "lab_test")
+		frappe.reload_doc("healthcare", "doctype", "lab_test_template")
 
 		for old_dt, new_dt in doctypes.items():
 			frappe.flags.link_fields = {}
-			should_rename = (
-				frappe.db.table_exists(old_dt)
-				and not frappe.db.table_exists(new_dt)
-			)
+			should_rename = frappe.db.table_exists(old_dt) and not frappe.db.table_exists(new_dt)
 			if should_rename:
-				frappe.reload_doc('healthcare', 'doctype', frappe.scrub(old_dt))
-				frappe.rename_doc('DocType', old_dt, new_dt, force=True)
-				frappe.reload_doc('healthcare', 'doctype', frappe.scrub(new_dt))
-				frappe.delete_doc_if_exists('DocType', old_dt)
+				frappe.reload_doc("healthcare", "doctype", frappe.scrub(old_dt))
+				frappe.rename_doc("DocType", old_dt, new_dt, force=True)
+				frappe.reload_doc("healthcare", "doctype", frappe.scrub(new_dt))
+				frappe.delete_doc_if_exists("DocType", old_dt)
 
 		parent_fields = {
-			'Lab Test Group Template': 'lab_test_groups',
-			'Descriptive Test Template': 'descriptive_test_templates',
-			'Normal Test Result': 'normal_test_items',
-			'Sensitivity Test Result': 'sensitivity_test_items',
-			'Descriptive Test Result': 'descriptive_test_items'
+			"Lab Test Group Template": "lab_test_groups",
+			"Descriptive Test Template": "descriptive_test_templates",
+			"Normal Test Result": "normal_test_items",
+			"Sensitivity Test Result": "sensitivity_test_items",
+			"Descriptive Test Result": "descriptive_test_items",
 		}
 
 		for doctype, parentfield in parent_fields.items():
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				UPDATE `tab{0}`
 				SET parentfield = %(parentfield)s
-			""".format(doctype), {'parentfield': parentfield})
+			""".format(
+					doctype
+				),
+				{"parentfield": parentfield},
+			)
 
 		# copy renamed child table fields (fields were already renamed in old doctype json, hence sql)
 		rename_fields = {
-			'lab_test_name': 'test_name',
-			'lab_test_event': 'test_event',
-			'lab_test_uom': 'test_uom',
-			'lab_test_comment': 'test_comment'
+			"lab_test_name": "test_name",
+			"lab_test_event": "test_event",
+			"lab_test_uom": "test_uom",
+			"lab_test_comment": "test_comment",
 		}
 
 		for new, old in rename_fields.items():
-			if frappe.db.has_column('Normal Test Result', old):
-				frappe.db.sql("""UPDATE `tabNormal Test Result` SET {} = {}"""
-					.format(new, old))
+			if frappe.db.has_column("Normal Test Result", old):
+				frappe.db.sql("""UPDATE `tabNormal Test Result` SET {} = {}""".format(new, old))
 
-		if frappe.db.has_column('Normal Test Template', 'test_event'):
+		if frappe.db.has_column("Normal Test Template", "test_event"):
 			frappe.db.sql("""UPDATE `tabNormal Test Template` SET lab_test_event = test_event""")
 
-		if frappe.db.has_column('Normal Test Template', 'test_uom'):
+		if frappe.db.has_column("Normal Test Template", "test_uom"):
 			frappe.db.sql("""UPDATE `tabNormal Test Template` SET lab_test_uom = test_uom""")
 
-		if frappe.db.has_column('Descriptive Test Result', 'test_particulars'):
-			frappe.db.sql("""UPDATE `tabDescriptive Test Result` SET lab_test_particulars = test_particulars""")
+		if frappe.db.has_column("Descriptive Test Result", "test_particulars"):
+			frappe.db.sql(
+				"""UPDATE `tabDescriptive Test Result` SET lab_test_particulars = test_particulars"""
+			)
 
 		rename_fields = {
-			'lab_test_template': 'test_template',
-			'lab_test_description': 'test_description',
-			'lab_test_rate': 'test_rate'
+			"lab_test_template": "test_template",
+			"lab_test_description": "test_description",
+			"lab_test_rate": "test_rate",
 		}
 
 		for new, old in rename_fields.items():
-			if frappe.db.has_column('Lab Test Group Template', old):
-				frappe.db.sql("""UPDATE `tabLab Test Group Template` SET {} = {}"""
-					.format(new, old))
+			if frappe.db.has_column("Lab Test Group Template", old):
+				frappe.db.sql("""UPDATE `tabLab Test Group Template` SET {} = {}""".format(new, old))
 
 		# rename field
-		frappe.reload_doc('healthcare', 'doctype', 'lab_test')
-		if frappe.db.has_column('Lab Test', 'special_toggle'):
-			rename_field('Lab Test', 'special_toggle', 'descriptive_toggle')
+		frappe.reload_doc("healthcare", "doctype", "lab_test")
+		if frappe.db.has_column("Lab Test", "special_toggle"):
+			rename_field("Lab Test", "special_toggle", "descriptive_toggle")
 
-	if frappe.db.exists('DocType', 'Lab Test Group Template'):
+	if frappe.db.exists("DocType", "Lab Test Group Template"):
 		# fix select field option
-		frappe.reload_doc('healthcare', 'doctype', 'lab_test_group_template')
-		frappe.db.sql("""
+		frappe.reload_doc("healthcare", "doctype", "lab_test_group_template")
+		frappe.db.sql(
+			"""
 			UPDATE `tabLab Test Group Template`
 			SET template_or_new_line = 'Add New Line'
 			WHERE template_or_new_line = 'Add new line'
-		""")
+		"""
+		)
diff --git a/erpnext/patches/v13_0/item_naming_series_not_mandatory.py b/erpnext/patches/v13_0/item_naming_series_not_mandatory.py
index 5fe85a4..33fb8f9 100644
--- a/erpnext/patches/v13_0/item_naming_series_not_mandatory.py
+++ b/erpnext/patches/v13_0/item_naming_series_not_mandatory.py
@@ -7,5 +7,10 @@
 
 	stock_settings = frappe.get_doc("Stock Settings")
 
-	set_by_naming_series("Item", "item_code",
-		stock_settings.get("item_naming_by")=="Naming Series", hide_name_field=True, make_mandatory=0)
+	set_by_naming_series(
+		"Item",
+		"item_code",
+		stock_settings.get("item_naming_by") == "Naming Series",
+		hide_name_field=True,
+		make_mandatory=0,
+	)
diff --git a/erpnext/patches/v13_0/item_reposting_for_incorrect_sl_and_gl.py b/erpnext/patches/v13_0/item_reposting_for_incorrect_sl_and_gl.py
index 0f2ac4b..f6427ca 100644
--- a/erpnext/patches/v13_0/item_reposting_for_incorrect_sl_and_gl.py
+++ b/erpnext/patches/v13_0/item_reposting_for_incorrect_sl_and_gl.py
@@ -7,18 +7,18 @@
 
 def execute():
 	doctypes_to_reload = [
-			("stock", "repost_item_valuation"),
-			("stock", "stock_entry_detail"),
-			("stock", "purchase_receipt_item"),
-			("stock", "delivery_note_item"),
-			("stock", "packed_item"),
-			("accounts", "sales_invoice_item"),
-			("accounts", "purchase_invoice_item"),
-			("buying", "purchase_receipt_item_supplied")
-		]
+		("stock", "repost_item_valuation"),
+		("stock", "stock_entry_detail"),
+		("stock", "purchase_receipt_item"),
+		("stock", "delivery_note_item"),
+		("stock", "packed_item"),
+		("accounts", "sales_invoice_item"),
+		("accounts", "purchase_invoice_item"),
+		("buying", "purchase_receipt_item_supplied"),
+	]
 
 	for module, doctype in doctypes_to_reload:
-		frappe.reload_doc(module, 'doctype', doctype)
+		frappe.reload_doc(module, "doctype", doctype)
 
 	reposting_project_deployed_on = get_creation_time()
 	posting_date = getdate(reposting_project_deployed_on)
@@ -32,7 +32,8 @@
 
 	company_list = []
 
-	data = frappe.db.sql('''
+	data = frappe.db.sql(
+		"""
 		SELECT
 			name, item_code, warehouse, voucher_type, voucher_no, posting_date, posting_time, company
 		FROM
@@ -41,7 +42,10 @@
 			creation > %s
 			and is_cancelled = 0
 		ORDER BY timestamp(posting_date, posting_time) asc, creation asc
-	''', reposting_project_deployed_on, as_dict=1)
+	""",
+		reposting_project_deployed_on,
+		as_dict=1,
+	)
 
 	frappe.db.auto_commit_on_many_writes = 1
 	print("Reposting Stock Ledger Entries...")
@@ -51,30 +55,36 @@
 		if d.company not in company_list:
 			company_list.append(d.company)
 
-		update_entries_after({
-			"item_code": d.item_code,
-			"warehouse": d.warehouse,
-			"posting_date": d.posting_date,
-			"posting_time": d.posting_time,
-			"voucher_type": d.voucher_type,
-			"voucher_no": d.voucher_no,
-			"sle_id": d.name
-		}, allow_negative_stock=True)
+		update_entries_after(
+			{
+				"item_code": d.item_code,
+				"warehouse": d.warehouse,
+				"posting_date": d.posting_date,
+				"posting_time": d.posting_time,
+				"voucher_type": d.voucher_type,
+				"voucher_no": d.voucher_no,
+				"sle_id": d.name,
+			},
+			allow_negative_stock=True,
+		)
 
 		i += 1
-		if i%100 == 0:
+		if i % 100 == 0:
 			print(i, "/", total_sle)
 
-
 	print("Reposting General Ledger Entries...")
 
 	if data:
-		for row in frappe.get_all('Company', filters= {'enable_perpetual_inventory': 1}):
+		for row in frappe.get_all("Company", filters={"enable_perpetual_inventory": 1}):
 			if row.name in company_list:
 				update_gl_entries_after(posting_date, posting_time, company=row.name)
 
 	frappe.db.auto_commit_on_many_writes = 0
 
+
 def get_creation_time():
-	return frappe.db.sql(''' SELECT create_time FROM
-		INFORMATION_SCHEMA.TABLES where TABLE_NAME = "tabRepost Item Valuation" ''', as_list=1)[0][0]
+	return frappe.db.sql(
+		""" SELECT create_time FROM
+		INFORMATION_SCHEMA.TABLES where TABLE_NAME = "tabRepost Item Valuation" """,
+		as_list=1,
+	)[0][0]
diff --git a/erpnext/patches/v13_0/loyalty_points_entry_for_pos_invoice.py b/erpnext/patches/v13_0/loyalty_points_entry_for_pos_invoice.py
index 68bcd8a..69a695e 100644
--- a/erpnext/patches/v13_0/loyalty_points_entry_for_pos_invoice.py
+++ b/erpnext/patches/v13_0/loyalty_points_entry_for_pos_invoice.py
@@ -6,15 +6,16 @@
 
 
 def execute():
-	'''`sales_invoice` field from loyalty point entry is splitted into `invoice_type` & `invoice` fields'''
+	"""`sales_invoice` field from loyalty point entry is splitted into `invoice_type` & `invoice` fields"""
 
 	frappe.reload_doc("Accounts", "doctype", "loyalty_point_entry")
 
-	if not frappe.db.has_column('Loyalty Point Entry', 'sales_invoice'):
+	if not frappe.db.has_column("Loyalty Point Entry", "sales_invoice"):
 		return
 
 	frappe.db.sql(
 		"""UPDATE `tabLoyalty Point Entry` lpe
 		SET lpe.`invoice_type` = 'Sales Invoice', lpe.`invoice` = lpe.`sales_invoice`
 		WHERE lpe.`sales_invoice` IS NOT NULL
-		AND (lpe.`invoice` IS NULL OR lpe.`invoice` = '')""")
+		AND (lpe.`invoice` IS NULL OR lpe.`invoice` = '')"""
+	)
diff --git a/erpnext/patches/v13_0/make_homepage_products_website_items.py b/erpnext/patches/v13_0/make_homepage_products_website_items.py
index 7a7ddba..50bfd35 100644
--- a/erpnext/patches/v13_0/make_homepage_products_website_items.py
+++ b/erpnext/patches/v13_0/make_homepage_products_website_items.py
@@ -12,4 +12,4 @@
 		row.item_code = web_item
 
 	homepage.flags.ignore_mandatory = True
-	homepage.save()
\ No newline at end of file
+	homepage.save()
diff --git a/erpnext/patches/v13_0/make_non_standard_user_type.py b/erpnext/patches/v13_0/make_non_standard_user_type.py
index ff241a3..e2c0685 100644
--- a/erpnext/patches/v13_0/make_non_standard_user_type.py
+++ b/erpnext/patches/v13_0/make_non_standard_user_type.py
@@ -9,22 +9,34 @@
 
 def execute():
 	doctype_dict = {
-		'projects': ['Timesheet'],
-		'payroll': [
-			'Salary Slip', 'Employee Tax Exemption Declaration', 'Employee Tax Exemption Proof Submission',
-			'Employee Benefit Application', 'Employee Benefit Claim'
+		"projects": ["Timesheet"],
+		"payroll": [
+			"Salary Slip",
+			"Employee Tax Exemption Declaration",
+			"Employee Tax Exemption Proof Submission",
+			"Employee Benefit Application",
+			"Employee Benefit Claim",
 		],
-		'hr': [
-			'Employee', 'Expense Claim', 'Leave Application', 'Attendance Request', 'Compensatory Leave Request',
-			'Holiday List', 'Employee Advance', 'Training Program', 'Training Feedback',
-			'Shift Request', 'Employee Grievance', 'Employee Referral', 'Travel Request'
-		]
+		"hr": [
+			"Employee",
+			"Expense Claim",
+			"Leave Application",
+			"Attendance Request",
+			"Compensatory Leave Request",
+			"Holiday List",
+			"Employee Advance",
+			"Training Program",
+			"Training Feedback",
+			"Shift Request",
+			"Employee Grievance",
+			"Employee Referral",
+			"Travel Request",
+		],
 	}
 
 	for module, doctypes in doctype_dict.items():
 		for doctype in doctypes:
-			frappe.reload_doc(module, 'doctype', doctype)
-
+			frappe.reload_doc(module, "doctype", doctype)
 
 	frappe.flags.ignore_select_perm = True
 	frappe.flags.update_select_perm_after_migrate = True
diff --git a/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py b/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
index 1c65998..492e040 100644
--- a/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
+++ b/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
@@ -4,10 +4,11 @@
 
 
 def execute():
-	frappe.reload_doc('accounts', 'doctype', 'purchase_invoice_advance')
-	frappe.reload_doc('accounts', 'doctype', 'sales_invoice_advance')
+	frappe.reload_doc("accounts", "doctype", "purchase_invoice_advance")
+	frappe.reload_doc("accounts", "doctype", "sales_invoice_advance")
 
-	purchase_invoices = frappe.db.sql("""
+	purchase_invoices = frappe.db.sql(
+		"""
 		select
 			parenttype as type, parent as name
 		from
@@ -18,9 +19,12 @@
 			and ifnull(exchange_gain_loss, 0) != 0
 		group by
 			parent
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
-	sales_invoices = frappe.db.sql("""
+	sales_invoices = frappe.db.sql(
+		"""
 		select
 			parenttype as type, parent as name
 		from
@@ -31,14 +35,16 @@
 			and ifnull(exchange_gain_loss, 0) != 0
 		group by
 			parent
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
 	if purchase_invoices + sales_invoices:
 		frappe.log_error(json.dumps(purchase_invoices + sales_invoices, indent=2), title="Patch Log")
 
-	acc_frozen_upto = frappe.db.get_value('Accounts Settings', None, 'acc_frozen_upto')
+	acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto")
 	if acc_frozen_upto:
-		frappe.db.set_value('Accounts Settings', None, 'acc_frozen_upto', None)
+		frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", None)
 
 	for invoice in purchase_invoices + sales_invoices:
 		try:
@@ -47,13 +53,13 @@
 			doc.make_gl_entries()
 			for advance in doc.advances:
 				if advance.ref_exchange_rate == 1:
-					advance.db_set('exchange_gain_loss', 0, False)
+					advance.db_set("exchange_gain_loss", 0, False)
 			doc.docstatus = 1
 			doc.make_gl_entries()
 			frappe.db.commit()
 		except Exception:
 			frappe.db.rollback()
-			print(f'Failed to correct gl entries of {invoice.name}')
+			print(f"Failed to correct gl entries of {invoice.name}")
 
 	if acc_frozen_upto:
-		frappe.db.set_value('Accounts Settings', None, 'acc_frozen_upto', acc_frozen_upto)
\ No newline at end of file
+		frappe.db.set_value("Accounts Settings", None, "acc_frozen_upto", acc_frozen_upto)
diff --git a/erpnext/patches/v13_0/move_branch_code_to_bank_account.py b/erpnext/patches/v13_0/move_branch_code_to_bank_account.py
index 350744f..2406127 100644
--- a/erpnext/patches/v13_0/move_branch_code_to_bank_account.py
+++ b/erpnext/patches/v13_0/move_branch_code_to_bank_account.py
@@ -7,11 +7,15 @@
 
 def execute():
 
-	frappe.reload_doc('accounts', 'doctype', 'bank_account')
-	frappe.reload_doc('accounts', 'doctype', 'bank')
+	frappe.reload_doc("accounts", "doctype", "bank_account")
+	frappe.reload_doc("accounts", "doctype", "bank")
 
-	if frappe.db.has_column('Bank', 'branch_code') and frappe.db.has_column('Bank Account', 'branch_code'):
-		frappe.db.sql("""UPDATE `tabBank` b, `tabBank Account` ba
+	if frappe.db.has_column("Bank", "branch_code") and frappe.db.has_column(
+		"Bank Account", "branch_code"
+	):
+		frappe.db.sql(
+			"""UPDATE `tabBank` b, `tabBank Account` ba
 			SET ba.branch_code = b.branch_code
 			WHERE ba.bank = b.name AND
-			ifnull(b.branch_code, '') != '' AND ifnull(ba.branch_code, '') = ''""")
+			ifnull(b.branch_code, '') != '' AND ifnull(ba.branch_code, '') = ''"""
+		)
diff --git a/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py b/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py
index c07caae..0290af0 100644
--- a/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py
+++ b/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py
@@ -6,47 +6,47 @@
 
 
 def execute():
-    frappe.db.sql("""UPDATE `tabPrint Format`
+	frappe.db.sql(
+		"""UPDATE `tabPrint Format`
         SET module = 'Payroll'
         WHERE name IN ('Salary Slip Based On Timesheet', 'Salary Slip Standard')"""
-    )
+	)
 
-    frappe.db.sql("""UPDATE `tabNotification` SET module='Payroll' WHERE name='Retention Bonus';"""
-    )
+	frappe.db.sql("""UPDATE `tabNotification` SET module='Payroll' WHERE name='Retention Bonus';""")
 
-    doctypes_moved = [
-        'Employee Benefit Application Detail',
-        'Employee Tax Exemption Declaration Category',
-        'Salary Component',
-        'Employee Tax Exemption Proof Submission Detail',
-        'Income Tax Slab Other Charges',
-        'Taxable Salary Slab',
-        'Payroll Period Date',
-        'Salary Slip Timesheet',
-        'Payroll Employee Detail',
-        'Salary Detail',
-        'Employee Tax Exemption Sub Category',
-        'Employee Tax Exemption Category',
-        'Employee Benefit Claim',
-        'Employee Benefit Application',
-        'Employee Other Income',
-        'Employee Tax Exemption Proof Submission',
-        'Employee Tax Exemption Declaration',
-        'Employee Incentive',
-        'Retention Bonus',
-        'Additional Salary',
-        'Income Tax Slab',
-        'Payroll Period',
-        'Salary Slip',
-        'Payroll Entry',
-        'Salary Structure Assignment',
-        'Salary Structure'
-    ]
+	doctypes_moved = [
+		"Employee Benefit Application Detail",
+		"Employee Tax Exemption Declaration Category",
+		"Salary Component",
+		"Employee Tax Exemption Proof Submission Detail",
+		"Income Tax Slab Other Charges",
+		"Taxable Salary Slab",
+		"Payroll Period Date",
+		"Salary Slip Timesheet",
+		"Payroll Employee Detail",
+		"Salary Detail",
+		"Employee Tax Exemption Sub Category",
+		"Employee Tax Exemption Category",
+		"Employee Benefit Claim",
+		"Employee Benefit Application",
+		"Employee Other Income",
+		"Employee Tax Exemption Proof Submission",
+		"Employee Tax Exemption Declaration",
+		"Employee Incentive",
+		"Retention Bonus",
+		"Additional Salary",
+		"Income Tax Slab",
+		"Payroll Period",
+		"Salary Slip",
+		"Payroll Entry",
+		"Salary Structure Assignment",
+		"Salary Structure",
+	]
 
-    for doctype in doctypes_moved:
-        frappe.delete_doc_if_exists("DocType", doctype)
+	for doctype in doctypes_moved:
+		frappe.delete_doc_if_exists("DocType", doctype)
 
-    reports = ["Salary Register", "Bank Remittance"]
+	reports = ["Salary Register", "Bank Remittance"]
 
-    for report in reports:
-        frappe.delete_doc_if_exists("Report", report)
+	for report in reports:
+		frappe.delete_doc_if_exists("Report", report)
diff --git a/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py b/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py
index fca7c09..37a3c35 100644
--- a/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py
+++ b/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py
@@ -6,7 +6,8 @@
 
 
 def execute():
-    data = frappe.db.sql('''SELECT *
+	data = frappe.db.sql(
+		"""SELECT *
         FROM `tabSingles`
         WHERE
             doctype = "HR Settings"
@@ -21,7 +22,9 @@
                 "payroll_based_on",
                 "password_policy"
             )
-            ''', as_dict=1)
+            """,
+		as_dict=1,
+	)
 
-    for d in data:
-        frappe.db.set_value("Payroll Settings", None, d.field, d.value)
+	for d in data:
+		frappe.db.set_value("Payroll Settings", None, d.field, d.value)
diff --git a/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py b/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py
index d1ea22f..f84a739 100644
--- a/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py
+++ b/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py
@@ -6,28 +6,42 @@
 
 
 def execute():
-	if not (frappe.db.table_exists("Payroll Period") and frappe.db.table_exists("Taxable Salary Slab")):
+	if not (
+		frappe.db.table_exists("Payroll Period") and frappe.db.table_exists("Taxable Salary Slab")
+	):
 		return
 
-	for doctype in ("income_tax_slab", "salary_structure_assignment", "employee_other_income", "income_tax_slab_other_charges"):
+	for doctype in (
+		"income_tax_slab",
+		"salary_structure_assignment",
+		"employee_other_income",
+		"income_tax_slab_other_charges",
+	):
 		frappe.reload_doc("Payroll", "doctype", doctype)
 
-
-	standard_tax_exemption_amount_exists = frappe.db.has_column("Payroll Period", "standard_tax_exemption_amount")
+	standard_tax_exemption_amount_exists = frappe.db.has_column(
+		"Payroll Period", "standard_tax_exemption_amount"
+	)
 
 	select_fields = "name, start_date, end_date"
 	if standard_tax_exemption_amount_exists:
 		select_fields = "name, start_date, end_date, standard_tax_exemption_amount"
 
 	for company in frappe.get_all("Company"):
-		payroll_periods =  frappe.db.sql("""
+		payroll_periods = frappe.db.sql(
+			"""
 			SELECT
 				{0}
 			FROM
 				`tabPayroll Period`
 			WHERE company=%s
 			ORDER BY start_date DESC
-		""".format(select_fields), company.name, as_dict = 1)
+		""".format(
+				select_fields
+			),
+			company.name,
+			as_dict=1,
+		)
 
 		for i, period in enumerate(payroll_periods):
 			income_tax_slab = frappe.new_doc("Income Tax Slab")
@@ -48,13 +62,17 @@
 			income_tax_slab.submit()
 
 			frappe.db.sql(
-			""" UPDATE `tabTaxable Salary Slab`
+				""" UPDATE `tabTaxable Salary Slab`
 				SET parent = %s , parentfield = 'slabs' , parenttype = "Income Tax Slab"
 				WHERE parent = %s
-			""", (income_tax_slab.name, period.name), as_dict = 1)
+			""",
+				(income_tax_slab.name, period.name),
+				as_dict=1,
+			)
 
 			if i == 0:
-				frappe.db.sql("""
+				frappe.db.sql(
+					"""
 					UPDATE
 						`tabSalary Structure Assignment`
 					set
@@ -63,16 +81,19 @@
 						company = %s
 						and from_date >= %s
 						and docstatus < 2
-				""", (income_tax_slab.name, company.name, period.start_date))
+				""",
+					(income_tax_slab.name, company.name, period.start_date),
+				)
 
 	# move other incomes to separate document
 	if not frappe.db.table_exists("Employee Tax Exemption Proof Submission"):
 		return
 
 	migrated = []
-	proofs = frappe.get_all("Employee Tax Exemption Proof Submission",
-		filters = {'docstatus': 1},
-		fields =['payroll_period', 'employee', 'company', 'income_from_other_sources']
+	proofs = frappe.get_all(
+		"Employee Tax Exemption Proof Submission",
+		filters={"docstatus": 1},
+		fields=["payroll_period", "employee", "company", "income_from_other_sources"],
 	)
 	for proof in proofs:
 		if proof.income_from_other_sources:
@@ -91,14 +112,17 @@
 	if not frappe.db.table_exists("Employee Tax Exemption Declaration"):
 		return
 
-	declerations = frappe.get_all("Employee Tax Exemption Declaration",
-		filters = {'docstatus': 1},
-		fields =['payroll_period', 'employee', 'company', 'income_from_other_sources']
+	declerations = frappe.get_all(
+		"Employee Tax Exemption Declaration",
+		filters={"docstatus": 1},
+		fields=["payroll_period", "employee", "company", "income_from_other_sources"],
 	)
 
 	for declaration in declerations:
-		if declaration.income_from_other_sources \
-				and [declaration.employee, declaration.payroll_period] not in migrated:
+		if (
+			declaration.income_from_other_sources
+			and [declaration.employee, declaration.payroll_period] not in migrated
+		):
 			employee_other_income = frappe.new_doc("Employee Other Income")
 			employee_other_income.employee = declaration.employee
 			employee_other_income.payroll_period = declaration.payroll_period
diff --git a/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py b/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py
index 7c10a31..edd0a97 100644
--- a/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py
+++ b/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py
@@ -10,43 +10,54 @@
 
 	frappe.reload_doc("hr", "doctype", "Leave Encashment")
 
-	additional_salaries = frappe.get_all("Additional Salary",
-		fields = ['name', "salary_slip", "type", "salary_component"],
-		filters = {'salary_slip': ['!=', '']},
-		group_by = 'salary_slip'
+	additional_salaries = frappe.get_all(
+		"Additional Salary",
+		fields=["name", "salary_slip", "type", "salary_component"],
+		filters={"salary_slip": ["!=", ""]},
+		group_by="salary_slip",
 	)
-	leave_encashments = frappe.get_all("Leave Encashment",
-		fields = ["name","additional_salary"],
-		filters = {'additional_salary': ['!=', '']}
+	leave_encashments = frappe.get_all(
+		"Leave Encashment",
+		fields=["name", "additional_salary"],
+		filters={"additional_salary": ["!=", ""]},
 	)
-	employee_incentives = frappe.get_all("Employee Incentive",
-		fields= ["name", "additional_salary"],
-		filters = {'additional_salary': ['!=', '']}
+	employee_incentives = frappe.get_all(
+		"Employee Incentive",
+		fields=["name", "additional_salary"],
+		filters={"additional_salary": ["!=", ""]},
 	)
 
 	for incentive in employee_incentives:
-		frappe.db.sql(""" UPDATE `tabAdditional Salary`
+		frappe.db.sql(
+			""" UPDATE `tabAdditional Salary`
 			SET ref_doctype = 'Employee Incentive', ref_docname = %s
 			WHERE name = %s
-		""", (incentive['name'], incentive['additional_salary']))
-
+		""",
+			(incentive["name"], incentive["additional_salary"]),
+		)
 
 	for leave_encashment in leave_encashments:
-		frappe.db.sql(""" UPDATE `tabAdditional Salary`
+		frappe.db.sql(
+			""" UPDATE `tabAdditional Salary`
 			SET ref_doctype = 'Leave Encashment', ref_docname = %s
 			WHERE name = %s
-		""", (leave_encashment['name'], leave_encashment['additional_salary']))
+		""",
+			(leave_encashment["name"], leave_encashment["additional_salary"]),
+		)
 
 	salary_slips = [sal["salary_slip"] for sal in additional_salaries]
 
 	for salary in additional_salaries:
-		comp_type = "earnings" if salary['type'] == 'Earning' else 'deductions'
+		comp_type = "earnings" if salary["type"] == "Earning" else "deductions"
 		if salary["salary_slip"] and salary_slips.count(salary["salary_slip"]) == 1:
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				UPDATE `tabSalary Detail`
 				SET additional_salary = %s
 				WHERE parenttype = 'Salary Slip'
 					and parentfield = %s
 					and parent = %s
 					and salary_component = %s
-			""", (salary["name"], comp_type, salary["salary_slip"], salary["salary_component"]))
+			""",
+				(salary["name"], comp_type, salary["salary_slip"], salary["salary_component"]),
+			)
diff --git a/erpnext/patches/v13_0/populate_e_commerce_settings.py b/erpnext/patches/v13_0/populate_e_commerce_settings.py
index 8f9ee51..ecf512b 100644
--- a/erpnext/patches/v13_0/populate_e_commerce_settings.py
+++ b/erpnext/patches/v13_0/populate_e_commerce_settings.py
@@ -8,17 +8,30 @@
 	frappe.reload_doc("portal", "doctype", "website_attribute")
 
 	products_settings_fields = [
-		"hide_variants", "products_per_page",
-		"enable_attribute_filters", "enable_field_filters"
+		"hide_variants",
+		"products_per_page",
+		"enable_attribute_filters",
+		"enable_field_filters",
 	]
 
 	shopping_cart_settings_fields = [
-		"enabled", "show_attachments", "show_price",
-		"show_stock_availability", "enable_variants", "show_contact_us_button",
-		"show_quantity_in_website", "show_apply_coupon_code_in_website",
-		"allow_items_not_in_stock", "company", "price_list", "default_customer_group",
-		"quotation_series", "enable_checkout", "payment_success_url",
-		"payment_gateway_account", "save_quotations_as_draft"
+		"enabled",
+		"show_attachments",
+		"show_price",
+		"show_stock_availability",
+		"enable_variants",
+		"show_contact_us_button",
+		"show_quantity_in_website",
+		"show_apply_coupon_code_in_website",
+		"allow_items_not_in_stock",
+		"company",
+		"price_list",
+		"default_customer_group",
+		"quotation_series",
+		"enable_checkout",
+		"payment_success_url",
+		"payment_gateway_account",
+		"save_quotations_as_draft",
 	]
 
 	settings = frappe.get_doc("E Commerce Settings")
@@ -27,12 +40,8 @@
 		singles = frappe.qb.DocType("Singles")
 		query = (
 			frappe.qb.from_(singles)
-			.select(
-				singles["field"], singles.value
-			).where(
-				(singles.doctype == doctype)
-				& (singles["field"].isin(fields))
-			)
+			.select(singles["field"], singles.value)
+			.where((singles.doctype == doctype) & (singles["field"].isin(fields)))
 		)
 		data = query.run(as_dict=True)
 
@@ -54,9 +63,6 @@
 		frappe.db.set_value(
 			doctype,
 			{"parent": "Products Settings"},
-			{
-				"parenttype": "E Commerce Settings",
-				"parent": "E Commerce Settings"
-			},
-			update_modified=False
+			{"parenttype": "E Commerce Settings", "parent": "E Commerce Settings"},
+			update_modified=False,
 		)
diff --git a/erpnext/patches/v13_0/print_uom_after_quantity_patch.py b/erpnext/patches/v13_0/print_uom_after_quantity_patch.py
index 3da6f74..a16f909 100644
--- a/erpnext/patches/v13_0/print_uom_after_quantity_patch.py
+++ b/erpnext/patches/v13_0/print_uom_after_quantity_patch.py
@@ -6,4 +6,4 @@
 
 
 def execute():
-    create_print_uom_after_qty_custom_field()
+	create_print_uom_after_qty_custom_field()
diff --git a/erpnext/patches/v13_0/remove_attribute_field_from_item_variant_setting.py b/erpnext/patches/v13_0/remove_attribute_field_from_item_variant_setting.py
index bbe3eb5..4efbe4d 100644
--- a/erpnext/patches/v13_0/remove_attribute_field_from_item_variant_setting.py
+++ b/erpnext/patches/v13_0/remove_attribute_field_from_item_variant_setting.py
@@ -5,5 +5,7 @@
 	"""Remove has_variants and attribute fields from item variant settings."""
 	frappe.reload_doc("stock", "doctype", "Item Variant Settings")
 
-	frappe.db.sql("""delete from `tabVariant Field`
-			where field_name in ('attributes', 'has_variants')""")
+	frappe.db.sql(
+		"""delete from `tabVariant Field`
+			where field_name in ('attributes', 'has_variants')"""
+	)
diff --git a/erpnext/patches/v13_0/remove_bad_selling_defaults.py b/erpnext/patches/v13_0/remove_bad_selling_defaults.py
index 0262539..efd2098 100644
--- a/erpnext/patches/v13_0/remove_bad_selling_defaults.py
+++ b/erpnext/patches/v13_0/remove_bad_selling_defaults.py
@@ -3,7 +3,7 @@
 
 
 def execute():
-	frappe.reload_doctype('Selling Settings')
+	frappe.reload_doctype("Selling Settings")
 	selling_settings = frappe.get_single("Selling Settings")
 
 	if selling_settings.customer_group in (_("All Customer Groups"), "All Customer Groups"):
@@ -12,5 +12,5 @@
 	if selling_settings.territory in (_("All Territories"), "All Territories"):
 		selling_settings.territory = None
 
-	selling_settings.flags.ignore_mandatory=True
+	selling_settings.flags.ignore_mandatory = True
 	selling_settings.save(ignore_permissions=True)
diff --git a/erpnext/patches/v13_0/remove_unknown_links_to_prod_plan_items.py b/erpnext/patches/v13_0/remove_unknown_links_to_prod_plan_items.py
index 317e85e..3f4a51b 100644
--- a/erpnext/patches/v13_0/remove_unknown_links_to_prod_plan_items.py
+++ b/erpnext/patches/v13_0/remove_unknown_links_to_prod_plan_items.py
@@ -10,25 +10,23 @@
 	pp_item = frappe.qb.DocType("Production Plan Item")
 
 	broken_work_orders = (
-		frappe.qb
-			.from_(work_order)
-			.left_join(pp_item).on(work_order.production_plan_item == pp_item.name)
-			.select(work_order.name)
-			.where(
-				(work_order.docstatus == 0)
-				& (work_order.production_plan_item.notnull())
-				& (work_order.production_plan_item.like("new-production-plan%"))
-				& (pp_item.name.isnull())
-			)
+		frappe.qb.from_(work_order)
+		.left_join(pp_item)
+		.on(work_order.production_plan_item == pp_item.name)
+		.select(work_order.name)
+		.where(
+			(work_order.docstatus == 0)
+			& (work_order.production_plan_item.notnull())
+			& (work_order.production_plan_item.like("new-production-plan%"))
+			& (pp_item.name.isnull())
+		)
 	).run(pluck=True)
 
 	if not broken_work_orders:
 		return
 
-	(frappe.qb
-		.update(work_order)
+	(
+		frappe.qb.update(work_order)
 		.set(work_order.production_plan_item, None)
 		.where(work_order.name.isin(broken_work_orders))
 	).run()
-
-
diff --git a/erpnext/patches/v13_0/rename_issue_doctype_fields.py b/erpnext/patches/v13_0/rename_issue_doctype_fields.py
index 80d5165..a9b6df7 100644
--- a/erpnext/patches/v13_0/rename_issue_doctype_fields.py
+++ b/erpnext/patches/v13_0/rename_issue_doctype_fields.py
@@ -7,63 +7,78 @@
 
 
 def execute():
-	if frappe.db.exists('DocType', 'Issue'):
-		issues = frappe.db.get_all('Issue', fields=['name', 'response_by_variance', 'resolution_by_variance', 'mins_to_first_response'],
-			 order_by='creation desc')
-		frappe.reload_doc('support', 'doctype', 'issue')
+	if frappe.db.exists("DocType", "Issue"):
+		issues = frappe.db.get_all(
+			"Issue",
+			fields=["name", "response_by_variance", "resolution_by_variance", "mins_to_first_response"],
+			order_by="creation desc",
+		)
+		frappe.reload_doc("support", "doctype", "issue")
 
 		# rename fields
 		rename_map = {
-			'agreement_fulfilled': 'agreement_status',
-			'mins_to_first_response': 'first_response_time'
+			"agreement_fulfilled": "agreement_status",
+			"mins_to_first_response": "first_response_time",
 		}
 		for old, new in rename_map.items():
-			rename_field('Issue', old, new)
+			rename_field("Issue", old, new)
 
 		# change fieldtype to duration
 		count = 0
 		for entry in issues:
-			response_by_variance = convert_to_seconds(entry.response_by_variance, 'Hours')
-			resolution_by_variance = convert_to_seconds(entry.resolution_by_variance, 'Hours')
-			mins_to_first_response = convert_to_seconds(entry.mins_to_first_response, 'Minutes')
-			frappe.db.set_value('Issue', entry.name, {
-				'response_by_variance': response_by_variance,
-				'resolution_by_variance': resolution_by_variance,
-				'first_response_time': mins_to_first_response
-			}, update_modified=False)
+			response_by_variance = convert_to_seconds(entry.response_by_variance, "Hours")
+			resolution_by_variance = convert_to_seconds(entry.resolution_by_variance, "Hours")
+			mins_to_first_response = convert_to_seconds(entry.mins_to_first_response, "Minutes")
+			frappe.db.set_value(
+				"Issue",
+				entry.name,
+				{
+					"response_by_variance": response_by_variance,
+					"resolution_by_variance": resolution_by_variance,
+					"first_response_time": mins_to_first_response,
+				},
+				update_modified=False,
+			)
 			# commit after every 100 updates
 			count += 1
-			if count%100 == 0:
+			if count % 100 == 0:
 				frappe.db.commit()
 
-	if frappe.db.exists('DocType', 'Opportunity'):
-		opportunities = frappe.db.get_all('Opportunity', fields=['name', 'mins_to_first_response'], order_by='creation desc')
-		frappe.reload_doctype('Opportunity', force=True)
-		rename_field('Opportunity', 'mins_to_first_response', 'first_response_time')
+	if frappe.db.exists("DocType", "Opportunity"):
+		opportunities = frappe.db.get_all(
+			"Opportunity", fields=["name", "mins_to_first_response"], order_by="creation desc"
+		)
+		frappe.reload_doctype("Opportunity", force=True)
+		rename_field("Opportunity", "mins_to_first_response", "first_response_time")
 
 		# change fieldtype to duration
-		frappe.reload_doc('crm', 'doctype', 'opportunity', force=True)
+		frappe.reload_doc("crm", "doctype", "opportunity", force=True)
 		count = 0
 		for entry in opportunities:
-			mins_to_first_response = convert_to_seconds(entry.mins_to_first_response, 'Minutes')
-			frappe.db.set_value('Opportunity', entry.name, 'first_response_time', mins_to_first_response, update_modified=False)
+			mins_to_first_response = convert_to_seconds(entry.mins_to_first_response, "Minutes")
+			frappe.db.set_value(
+				"Opportunity", entry.name, "first_response_time", mins_to_first_response, update_modified=False
+			)
 			# commit after every 100 updates
 			count += 1
-			if count%100 == 0:
+			if count % 100 == 0:
 				frappe.db.commit()
 
 	# renamed reports from "Minutes to First Response for Issues" to "First Response Time for Issues". Same for Opportunity
-	for report in ['Minutes to First Response for Issues', 'Minutes to First Response for Opportunity']:
-		if frappe.db.exists('Report', report):
-			frappe.delete_doc('Report', report, ignore_permissions=True)
+	for report in [
+		"Minutes to First Response for Issues",
+		"Minutes to First Response for Opportunity",
+	]:
+		if frappe.db.exists("Report", report):
+			frappe.delete_doc("Report", report, ignore_permissions=True)
 
 
 def convert_to_seconds(value, unit):
 	seconds = 0
 	if not value:
 		return seconds
-	if unit == 'Hours':
+	if unit == "Hours":
 		seconds = value * 3600
-	if unit == 'Minutes':
+	if unit == "Minutes":
 		seconds = value * 60
 	return seconds
diff --git a/erpnext/patches/v13_0/rename_issue_status_hold_to_on_hold.py b/erpnext/patches/v13_0/rename_issue_status_hold_to_on_hold.py
index b129cbe..d3896dd 100644
--- a/erpnext/patches/v13_0/rename_issue_status_hold_to_on_hold.py
+++ b/erpnext/patches/v13_0/rename_issue_status_hold_to_on_hold.py
@@ -6,16 +6,19 @@
 
 
 def execute():
-	if frappe.db.exists('DocType', 'Issue'):
+	if frappe.db.exists("DocType", "Issue"):
 		frappe.reload_doc("support", "doctype", "issue")
 		rename_status()
 
+
 def rename_status():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE
 			`tabIssue`
 		SET
 			status = 'On Hold'
 		WHERE
 			status = 'Hold'
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/rename_ksa_qr_field.py b/erpnext/patches/v13_0/rename_ksa_qr_field.py
index f4f9b17..e4b9141 100644
--- a/erpnext/patches/v13_0/rename_ksa_qr_field.py
+++ b/erpnext/patches/v13_0/rename_ksa_qr_field.py
@@ -7,26 +7,30 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'Saudi Arabia'})
+	company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
 	if not company:
 		return
 
-	if frappe.db.exists('DocType', 'Sales Invoice'):
-		frappe.reload_doc('accounts', 'doctype', 'sales_invoice', force=True)
+	if frappe.db.exists("DocType", "Sales Invoice"):
+		frappe.reload_doc("accounts", "doctype", "sales_invoice", force=True)
 
 		# rename_field method assumes that the field already exists or the doc is synced
-		if not frappe.db.has_column('Sales Invoice', 'ksa_einv_qr'):
-			create_custom_fields({
-				'Sales Invoice': [
-					dict(
-						fieldname='ksa_einv_qr',
-						label='KSA E-Invoicing QR',
-						fieldtype='Attach Image',
-						read_only=1, no_copy=1, hidden=1
-					)
-				]
-			})
+		if not frappe.db.has_column("Sales Invoice", "ksa_einv_qr"):
+			create_custom_fields(
+				{
+					"Sales Invoice": [
+						dict(
+							fieldname="ksa_einv_qr",
+							label="KSA E-Invoicing QR",
+							fieldtype="Attach Image",
+							read_only=1,
+							no_copy=1,
+							hidden=1,
+						)
+					]
+				}
+			)
 
-		if frappe.db.has_column('Sales Invoice', 'qr_code'):
-			rename_field('Sales Invoice', 'qr_code', 'ksa_einv_qr')
+		if frappe.db.has_column("Sales Invoice", "qr_code"):
+			rename_field("Sales Invoice", "qr_code", "ksa_einv_qr")
 			frappe.delete_doc_if_exists("Custom Field", "Sales Invoice-qr_code")
diff --git a/erpnext/patches/v13_0/rename_membership_settings_to_non_profit_settings.py b/erpnext/patches/v13_0/rename_membership_settings_to_non_profit_settings.py
index 265e2a9..0e54234 100644
--- a/erpnext/patches/v13_0/rename_membership_settings_to_non_profit_settings.py
+++ b/erpnext/patches/v13_0/rename_membership_settings_to_non_profit_settings.py
@@ -15,7 +15,7 @@
 			"enable_razorpay": "enable_razorpay_for_memberships",
 			"debit_account": "membership_debit_account",
 			"payment_account": "membership_payment_account",
-			"webhook_secret": "membership_webhook_secret"
+			"webhook_secret": "membership_webhook_secret",
 		}
 
 		for old_name, new_name in rename_fields_map.items():
diff --git a/erpnext/patches/v13_0/rename_stop_to_send_birthday_reminders.py b/erpnext/patches/v13_0/rename_stop_to_send_birthday_reminders.py
index 813fbd2..434dbb4 100644
--- a/erpnext/patches/v13_0/rename_stop_to_send_birthday_reminders.py
+++ b/erpnext/patches/v13_0/rename_stop_to_send_birthday_reminders.py
@@ -3,20 +3,17 @@
 
 
 def execute():
-	frappe.reload_doc('hr', 'doctype', 'hr_settings')
+	frappe.reload_doc("hr", "doctype", "hr_settings")
 
 	try:
 		# Rename the field
-		rename_field('HR Settings', 'stop_birthday_reminders', 'send_birthday_reminders')
+		rename_field("HR Settings", "stop_birthday_reminders", "send_birthday_reminders")
 
 		# Reverse the value
-		old_value = frappe.db.get_single_value('HR Settings', 'send_birthday_reminders')
+		old_value = frappe.db.get_single_value("HR Settings", "send_birthday_reminders")
 
 		frappe.db.set_value(
-			'HR Settings',
-			'HR Settings',
-			'send_birthday_reminders',
-			1 if old_value == 0 else 0
+			"HR Settings", "HR Settings", "send_birthday_reminders", 1 if old_value == 0 else 0
 		)
 
 	except Exception as e:
diff --git a/erpnext/patches/v13_0/replace_pos_payment_mode_table.py b/erpnext/patches/v13_0/replace_pos_payment_mode_table.py
index a2c960c..ba2feb3 100644
--- a/erpnext/patches/v13_0/replace_pos_payment_mode_table.py
+++ b/erpnext/patches/v13_0/replace_pos_payment_mode_table.py
@@ -10,9 +10,13 @@
 	pos_profiles = frappe.get_all("POS Profile")
 
 	for pos_profile in pos_profiles:
-		payments = frappe.db.sql("""
+		payments = frappe.db.sql(
+			"""
 			select idx, parentfield, parenttype, parent, mode_of_payment, `default` from `tabSales Invoice Payment` where parent=%s
-		""", pos_profile.name, as_dict=1)
+		""",
+			pos_profile.name,
+			as_dict=1,
+		)
 		if payments:
 			for payment_mode in payments:
 				pos_payment_method = frappe.new_doc("POS Payment Method")
diff --git a/erpnext/patches/v13_0/replace_supplier_item_group_with_party_specific_item.py b/erpnext/patches/v13_0/replace_supplier_item_group_with_party_specific_item.py
index ba96fdd..bf82f44 100644
--- a/erpnext/patches/v13_0/replace_supplier_item_group_with_party_specific_item.py
+++ b/erpnext/patches/v13_0/replace_supplier_item_group_with_party_specific_item.py
@@ -5,7 +5,7 @@
 
 
 def execute():
-	if frappe.db.table_exists('Supplier Item Group'):
+	if frappe.db.table_exists("Supplier Item Group"):
 		frappe.reload_doc("selling", "doctype", "party_specific_item")
 		sig = frappe.db.get_all("Supplier Item Group", fields=["name", "supplier", "item_group"])
 		for item in sig:
diff --git a/erpnext/patches/v13_0/requeue_failed_reposts.py b/erpnext/patches/v13_0/requeue_failed_reposts.py
index 213cb9e..752490d 100644
--- a/erpnext/patches/v13_0/requeue_failed_reposts.py
+++ b/erpnext/patches/v13_0/requeue_failed_reposts.py
@@ -4,9 +4,11 @@
 
 def execute():
 
-	reposts = frappe.get_all("Repost Item Valuation",
-		{"status": "Failed", "modified": [">", "2021-10-05"] },
-		["name", "modified", "error_log"])
+	reposts = frappe.get_all(
+		"Repost Item Valuation",
+		{"status": "Failed", "modified": [">", "2021-10-05"]},
+		["name", "modified", "error_log"],
+	)
 
 	for repost in reposts:
 		if "check_freezing_date" in cstr(repost.error_log):
diff --git a/erpnext/patches/v13_0/reset_clearance_date_for_intracompany_payment_entries.py b/erpnext/patches/v13_0/reset_clearance_date_for_intracompany_payment_entries.py
index 69fc6a2..5dfea5e 100644
--- a/erpnext/patches/v13_0/reset_clearance_date_for_intracompany_payment_entries.py
+++ b/erpnext/patches/v13_0/reset_clearance_date_for_intracompany_payment_entries.py
@@ -6,40 +6,35 @@
 
 
 def execute():
-    """
-        Reset Clearance Date for Payment Entries of type Internal Transfer that have only been reconciled with one Bank Transaction.
-        This will allow the Payment Entries to be reconciled with the second Bank Transaction using the Bank Reconciliation Tool.
-    """
+	"""
+	Reset Clearance Date for Payment Entries of type Internal Transfer that have only been reconciled with one Bank Transaction.
+	This will allow the Payment Entries to be reconciled with the second Bank Transaction using the Bank Reconciliation Tool.
+	"""
 
-    intra_company_pe = get_intra_company_payment_entries_with_clearance_dates()
-    reconciled_bank_transactions = get_reconciled_bank_transactions(intra_company_pe)
+	intra_company_pe = get_intra_company_payment_entries_with_clearance_dates()
+	reconciled_bank_transactions = get_reconciled_bank_transactions(intra_company_pe)
 
-    for payment_entry in reconciled_bank_transactions:
-        if len(reconciled_bank_transactions[payment_entry]) == 1:
-            frappe.db.set_value('Payment Entry', payment_entry, 'clearance_date', None)
+	for payment_entry in reconciled_bank_transactions:
+		if len(reconciled_bank_transactions[payment_entry]) == 1:
+			frappe.db.set_value("Payment Entry", payment_entry, "clearance_date", None)
+
 
 def get_intra_company_payment_entries_with_clearance_dates():
-    return frappe.get_all(
-        'Payment Entry',
-        filters = {
-            'payment_type': 'Internal Transfer',
-            'clearance_date': ["not in", None]
-        },
-        pluck = 'name'
-    )
+	return frappe.get_all(
+		"Payment Entry",
+		filters={"payment_type": "Internal Transfer", "clearance_date": ["not in", None]},
+		pluck="name",
+	)
+
 
 def get_reconciled_bank_transactions(intra_company_pe):
-    """Returns dictionary where each key:value pair is Payment Entry : List of Bank Transactions reconciled with Payment Entry"""
+	"""Returns dictionary where each key:value pair is Payment Entry : List of Bank Transactions reconciled with Payment Entry"""
 
-    reconciled_bank_transactions = {}
+	reconciled_bank_transactions = {}
 
-    for payment_entry in intra_company_pe:
-        reconciled_bank_transactions[payment_entry] = frappe.get_all(
-            'Bank Transaction Payments',
-            filters = {
-                'payment_entry': payment_entry
-            },
-            pluck='parent'
-        )
+	for payment_entry in intra_company_pe:
+		reconciled_bank_transactions[payment_entry] = frappe.get_all(
+			"Bank Transaction Payments", filters={"payment_entry": payment_entry}, pluck="parent"
+		)
 
-    return reconciled_bank_transactions
+	return reconciled_bank_transactions
diff --git a/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py b/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py
index f82a0d5..bc2d1b9 100644
--- a/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py
+++ b/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py
@@ -2,9 +2,24 @@
 
 
 def execute():
-	company = frappe.db.get_single_value('Global Defaults', 'default_company')
-	doctypes = ['Clinical Procedure', 'Inpatient Record', 'Lab Test', 'Sample Collection', 'Patient Appointment', 'Patient Encounter', 'Vital Signs', 'Therapy Session', 'Therapy Plan', 'Patient Assessment']
+	company = frappe.db.get_single_value("Global Defaults", "default_company")
+	doctypes = [
+		"Clinical Procedure",
+		"Inpatient Record",
+		"Lab Test",
+		"Sample Collection",
+		"Patient Appointment",
+		"Patient Encounter",
+		"Vital Signs",
+		"Therapy Session",
+		"Therapy Plan",
+		"Patient Assessment",
+	]
 	for entry in doctypes:
-		if frappe.db.exists('DocType', entry):
-			frappe.reload_doc('Healthcare', 'doctype', entry)
-			frappe.db.sql("update `tab{dt}` set company = {company} where ifnull(company, '') = ''".format(dt=entry, company=frappe.db.escape(company)))
+		if frappe.db.exists("DocType", entry):
+			frappe.reload_doc("Healthcare", "doctype", entry)
+			frappe.db.sql(
+				"update `tab{dt}` set company = {company} where ifnull(company, '') = ''".format(
+					dt=entry, company=frappe.db.escape(company)
+				)
+			)
diff --git a/erpnext/patches/v13_0/set_company_in_leave_ledger_entry.py b/erpnext/patches/v13_0/set_company_in_leave_ledger_entry.py
index c744f35..adc8784 100644
--- a/erpnext/patches/v13_0/set_company_in_leave_ledger_entry.py
+++ b/erpnext/patches/v13_0/set_company_in_leave_ledger_entry.py
@@ -2,7 +2,11 @@
 
 
 def execute():
-	frappe.reload_doc('HR', 'doctype', 'Leave Allocation')
-	frappe.reload_doc('HR', 'doctype', 'Leave Ledger Entry')
-	frappe.db.sql("""update `tabLeave Ledger Entry` as lle set company = (select company from `tabEmployee` where employee = lle.employee)""")
-	frappe.db.sql("""update `tabLeave Allocation` as la set company = (select company from `tabEmployee` where employee = la.employee)""")
+	frappe.reload_doc("HR", "doctype", "Leave Allocation")
+	frappe.reload_doc("HR", "doctype", "Leave Ledger Entry")
+	frappe.db.sql(
+		"""update `tabLeave Ledger Entry` as lle set company = (select company from `tabEmployee` where employee = lle.employee)"""
+	)
+	frappe.db.sql(
+		"""update `tabLeave Allocation` as la set company = (select company from `tabEmployee` where employee = la.employee)"""
+	)
diff --git a/erpnext/patches/v13_0/set_operation_time_based_on_operating_cost.py b/erpnext/patches/v13_0/set_operation_time_based_on_operating_cost.py
index e26285e..ef02e25 100644
--- a/erpnext/patches/v13_0/set_operation_time_based_on_operating_cost.py
+++ b/erpnext/patches/v13_0/set_operation_time_based_on_operating_cost.py
@@ -2,10 +2,11 @@
 
 
 def execute():
-	frappe.reload_doc('manufacturing', 'doctype', 'bom')
-	frappe.reload_doc('manufacturing', 'doctype', 'bom_operation')
+	frappe.reload_doc("manufacturing", "doctype", "bom")
+	frappe.reload_doc("manufacturing", "doctype", "bom_operation")
 
-	frappe.db.sql('''
+	frappe.db.sql(
+		"""
 		UPDATE
 			`tabBOM Operation`
 		SET
@@ -13,4 +14,5 @@
 		WHERE
 			time_in_mins = 0 AND operating_cost > 0
 			AND hour_rate > 0 AND docstatus = 1 AND parenttype = "BOM"
-	''')
+	"""
+	)
diff --git a/erpnext/patches/v13_0/set_payment_channel_in_payment_gateway_account.py b/erpnext/patches/v13_0/set_payment_channel_in_payment_gateway_account.py
index 87b3389..0cefa02 100644
--- a/erpnext/patches/v13_0/set_payment_channel_in_payment_gateway_account.py
+++ b/erpnext/patches/v13_0/set_payment_channel_in_payment_gateway_account.py
@@ -10,8 +10,11 @@
 	frappe.reload_doc("Accounts", "doctype", "Payment Gateway Account")
 	set_payment_channel_as_email()
 
+
 def set_payment_channel_as_email():
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabPayment Gateway Account`
 		SET `payment_channel` = "Email"
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/set_pos_closing_as_failed.py b/erpnext/patches/v13_0/set_pos_closing_as_failed.py
index 6a3785d..e2226c1 100644
--- a/erpnext/patches/v13_0/set_pos_closing_as_failed.py
+++ b/erpnext/patches/v13_0/set_pos_closing_as_failed.py
@@ -2,6 +2,6 @@
 
 
 def execute():
-    frappe.reload_doc('accounts', 'doctype', 'pos_closing_entry')
+	frappe.reload_doc("accounts", "doctype", "pos_closing_entry")
 
-    frappe.db.sql("update `tabPOS Closing Entry` set `status` = 'Failed' where `status` = 'Queued'")
+	frappe.db.sql("update `tabPOS Closing Entry` set `status` = 'Failed' where `status` = 'Queued'")
diff --git a/erpnext/patches/v13_0/set_return_against_in_pos_invoice_references.py b/erpnext/patches/v13_0/set_return_against_in_pos_invoice_references.py
index 6c24f52..d29b739 100644
--- a/erpnext/patches/v13_0/set_return_against_in_pos_invoice_references.py
+++ b/erpnext/patches/v13_0/set_return_against_in_pos_invoice_references.py
@@ -2,18 +2,17 @@
 
 
 def execute():
-	'''
+	"""
 	Fetch and Set is_return & return_against from POS Invoice in POS Invoice References table.
-	'''
+	"""
 
 	POSClosingEntry = frappe.qb.DocType("POS Closing Entry")
 	open_pos_closing_entries = (
-		frappe.qb
-			.from_(POSClosingEntry)
-			.select(POSClosingEntry.name)
-			.where(POSClosingEntry.docstatus == 0)
-			.run(pluck=True)
-		)
+		frappe.qb.from_(POSClosingEntry)
+		.select(POSClosingEntry.name)
+		.where(POSClosingEntry.docstatus == 0)
+		.run(pluck=True)
+	)
 
 	if not open_pos_closing_entries:
 		return
@@ -21,13 +20,12 @@
 	POSInvoiceReference = frappe.qb.DocType("POS Invoice Reference")
 	POSInvoice = frappe.qb.DocType("POS Invoice")
 	pos_invoice_references = (
-		frappe.qb
-			.from_(POSInvoiceReference)
-			.join(POSInvoice)
-			.on(POSInvoiceReference.pos_invoice == POSInvoice.name)
-			.select(POSInvoiceReference.name, POSInvoice.is_return, POSInvoice.return_against)
-			.where(POSInvoiceReference.parent.isin(open_pos_closing_entries))
-			.run(as_dict=True)
+		frappe.qb.from_(POSInvoiceReference)
+		.join(POSInvoice)
+		.on(POSInvoiceReference.pos_invoice == POSInvoice.name)
+		.select(POSInvoiceReference.name, POSInvoice.is_return, POSInvoice.return_against)
+		.where(POSInvoiceReference.parent.isin(open_pos_closing_entries))
+		.run(as_dict=True)
 	)
 
 	for row in pos_invoice_references:
diff --git a/erpnext/patches/v13_0/set_status_in_maintenance_schedule_table.py b/erpnext/patches/v13_0/set_status_in_maintenance_schedule_table.py
index 9887ad9..e1c8526 100644
--- a/erpnext/patches/v13_0/set_status_in_maintenance_schedule_table.py
+++ b/erpnext/patches/v13_0/set_status_in_maintenance_schedule_table.py
@@ -3,8 +3,10 @@
 
 def execute():
 	frappe.reload_doc("maintenance", "doctype", "Maintenance Schedule Detail")
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabMaintenance Schedule Detail`
 		SET completion_status = 'Pending'
 		WHERE docstatus < 2
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/set_training_event_attendance.py b/erpnext/patches/v13_0/set_training_event_attendance.py
index e44f321..7b55758 100644
--- a/erpnext/patches/v13_0/set_training_event_attendance.py
+++ b/erpnext/patches/v13_0/set_training_event_attendance.py
@@ -2,8 +2,10 @@
 
 
 def execute():
-    frappe.reload_doc('hr', 'doctype', 'training_event')
-    frappe.reload_doc('hr', 'doctype', 'training_event_employee')
+	frappe.reload_doc("hr", "doctype", "training_event")
+	frappe.reload_doc("hr", "doctype", "training_event_employee")
 
-    frappe.db.sql("update `tabTraining Event Employee` set `attendance` = 'Present'")
-    frappe.db.sql("update `tabTraining Event Employee` set `is_mandatory` = 1 where `attendance` = 'Mandatory'")
+	frappe.db.sql("update `tabTraining Event Employee` set `attendance` = 'Present'")
+	frappe.db.sql(
+		"update `tabTraining Event Employee` set `is_mandatory` = 1 where `attendance` = 'Mandatory'"
+	)
diff --git a/erpnext/patches/v13_0/set_work_order_qty_in_so_from_mr.py b/erpnext/patches/v13_0/set_work_order_qty_in_so_from_mr.py
index f097ab9..1adf0d8 100644
--- a/erpnext/patches/v13_0/set_work_order_qty_in_so_from_mr.py
+++ b/erpnext/patches/v13_0/set_work_order_qty_in_so_from_mr.py
@@ -2,35 +2,37 @@
 
 
 def execute():
-    """
-    1. Get submitted Work Orders with MR, MR Item and SO set
-    2. Get SO Item detail from MR Item detail in WO, and set in WO
-    3. Update work_order_qty in SO
-    """
-    work_order = frappe.qb.DocType("Work Order")
-    query = (
-        frappe.qb.from_(work_order)
-        .select(
-            work_order.name, work_order.produced_qty,
-            work_order.material_request,
-            work_order.material_request_item,
-            work_order.sales_order
-        ).where(
-            (work_order.material_request.isnotnull())
-            & (work_order.material_request_item.isnotnull())
-            & (work_order.sales_order.isnotnull())
-            & (work_order.docstatus == 1)
-            & (work_order.produced_qty > 0)
-        )
-    )
-    results = query.run(as_dict=True)
+	"""
+	1. Get submitted Work Orders with MR, MR Item and SO set
+	2. Get SO Item detail from MR Item detail in WO, and set in WO
+	3. Update work_order_qty in SO
+	"""
+	work_order = frappe.qb.DocType("Work Order")
+	query = (
+		frappe.qb.from_(work_order)
+		.select(
+			work_order.name,
+			work_order.produced_qty,
+			work_order.material_request,
+			work_order.material_request_item,
+			work_order.sales_order,
+		)
+		.where(
+			(work_order.material_request.isnotnull())
+			& (work_order.material_request_item.isnotnull())
+			& (work_order.sales_order.isnotnull())
+			& (work_order.docstatus == 1)
+			& (work_order.produced_qty > 0)
+		)
+	)
+	results = query.run(as_dict=True)
 
-    for row in results:
-        so_item = frappe.get_value(
-            "Material Request Item", row.material_request_item, "sales_order_item"
-        )
-        frappe.db.set_value("Work Order", row.name, "sales_order_item", so_item)
+	for row in results:
+		so_item = frappe.get_value(
+			"Material Request Item", row.material_request_item, "sales_order_item"
+		)
+		frappe.db.set_value("Work Order", row.name, "sales_order_item", so_item)
 
-        if so_item:
-            wo = frappe.get_doc("Work Order", row.name)
-            wo.update_work_order_qty_in_so()
+		if so_item:
+			wo = frappe.get_doc("Work Order", row.name)
+			wo.update_work_order_qty_in_so()
diff --git a/erpnext/patches/v13_0/set_youtube_video_id.py b/erpnext/patches/v13_0/set_youtube_video_id.py
index e1eb1b9..9766bb8 100644
--- a/erpnext/patches/v13_0/set_youtube_video_id.py
+++ b/erpnext/patches/v13_0/set_youtube_video_id.py
@@ -4,7 +4,7 @@
 
 
 def execute():
-	frappe.reload_doc("utilities", "doctype","video")
+	frappe.reload_doc("utilities", "doctype", "video")
 
 	for video in frappe.get_all("Video", fields=["name", "url", "youtube_video_id"]):
 		if video.url and not video.youtube_video_id:
diff --git a/erpnext/patches/v13_0/setting_custom_roles_for_some_regional_reports.py b/erpnext/patches/v13_0/setting_custom_roles_for_some_regional_reports.py
index dc3f8aa..40c10f3 100644
--- a/erpnext/patches/v13_0/setting_custom_roles_for_some_regional_reports.py
+++ b/erpnext/patches/v13_0/setting_custom_roles_for_some_regional_reports.py
@@ -4,8 +4,8 @@
 
 
 def execute():
-    company = frappe.get_all('Company', filters = {'country': 'India'})
-    if not company:
-        return
+	company = frappe.get_all("Company", filters={"country": "India"})
+	if not company:
+		return
 
-    add_custom_roles_for_reports()
+	add_custom_roles_for_reports()
diff --git a/erpnext/patches/v13_0/setup_fields_for_80g_certificate_and_donation.py b/erpnext/patches/v13_0/setup_fields_for_80g_certificate_and_donation.py
index 2d35ea3..1c36b53 100644
--- a/erpnext/patches/v13_0/setup_fields_for_80g_certificate_and_donation.py
+++ b/erpnext/patches/v13_0/setup_fields_for_80g_certificate_and_donation.py
@@ -4,15 +4,13 @@
 
 
 def execute():
-	if frappe.get_all('Company', filters = {'country': 'India'}):
-		frappe.reload_doc('accounts', 'doctype', 'POS Invoice')
-		frappe.reload_doc('accounts', 'doctype', 'POS Invoice Item')
+	if frappe.get_all("Company", filters={"country": "India"}):
+		frappe.reload_doc("accounts", "doctype", "POS Invoice")
+		frappe.reload_doc("accounts", "doctype", "POS Invoice Item")
 
 		make_custom_fields()
 
-		if not frappe.db.exists('Party Type', 'Donor'):
-			frappe.get_doc({
-				'doctype': 'Party Type',
-				'party_type': 'Donor',
-				'account_type': 'Receivable'
-			}).insert(ignore_permissions=True)
+		if not frappe.db.exists("Party Type", "Donor"):
+			frappe.get_doc(
+				{"doctype": "Party Type", "party_type": "Donor", "account_type": "Receivable"}
+			).insert(ignore_permissions=True)
diff --git a/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py b/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py
index 82cc1ff..093e8a7 100644
--- a/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py
+++ b/erpnext/patches/v13_0/setup_gratuity_rule_for_india_and_uae.py
@@ -6,12 +6,14 @@
 
 
 def execute():
-    frappe.reload_doc('payroll', 'doctype', 'gratuity_rule')
-    frappe.reload_doc('payroll', 'doctype', 'gratuity_rule_slab')
-    frappe.reload_doc('payroll', 'doctype', 'gratuity_applicable_component')
-    if frappe.db.exists("Company", {"country": "India"}):
-        from erpnext.regional.india.setup import create_gratuity_rule
-        create_gratuity_rule()
-    if frappe.db.exists("Company", {"country": "United Arab Emirates"}):
-        from erpnext.regional.united_arab_emirates.setup import create_gratuity_rule
-        create_gratuity_rule()
+	frappe.reload_doc("payroll", "doctype", "gratuity_rule")
+	frappe.reload_doc("payroll", "doctype", "gratuity_rule_slab")
+	frappe.reload_doc("payroll", "doctype", "gratuity_applicable_component")
+	if frappe.db.exists("Company", {"country": "India"}):
+		from erpnext.regional.india.setup import create_gratuity_rule
+
+		create_gratuity_rule()
+	if frappe.db.exists("Company", {"country": "United Arab Emirates"}):
+		from erpnext.regional.united_arab_emirates.setup import create_gratuity_rule
+
+		create_gratuity_rule()
diff --git a/erpnext/patches/v13_0/setup_uae_vat_fields.py b/erpnext/patches/v13_0/setup_uae_vat_fields.py
index d89e052..7046646 100644
--- a/erpnext/patches/v13_0/setup_uae_vat_fields.py
+++ b/erpnext/patches/v13_0/setup_uae_vat_fields.py
@@ -7,12 +7,12 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'United Arab Emirates'})
+	company = frappe.get_all("Company", filters={"country": "United Arab Emirates"})
 	if not company:
 		return
 
-	frappe.reload_doc('regional', 'report', 'uae_vat_201')
-	frappe.reload_doc('regional', 'doctype', 'uae_vat_settings')
-	frappe.reload_doc('regional', 'doctype', 'uae_vat_account')
+	frappe.reload_doc("regional", "report", "uae_vat_201")
+	frappe.reload_doc("regional", "doctype", "uae_vat_settings")
+	frappe.reload_doc("regional", "doctype", "uae_vat_account")
 
 	setup()
diff --git a/erpnext/patches/v13_0/stock_entry_enhancements.py b/erpnext/patches/v13_0/stock_entry_enhancements.py
index 968a83a..005980e 100644
--- a/erpnext/patches/v13_0/stock_entry_enhancements.py
+++ b/erpnext/patches/v13_0/stock_entry_enhancements.py
@@ -6,27 +6,31 @@
 
 
 def execute():
-    frappe.reload_doc("stock", "doctype", "stock_entry")
-    if frappe.db.has_column("Stock Entry", "add_to_transit"):
-        frappe.db.sql("""
+	frappe.reload_doc("stock", "doctype", "stock_entry")
+	if frappe.db.has_column("Stock Entry", "add_to_transit"):
+		frappe.db.sql(
+			"""
             UPDATE `tabStock Entry` SET
             stock_entry_type = 'Material Transfer',
             purpose = 'Material Transfer',
             add_to_transit = 1 WHERE stock_entry_type = 'Send to Warehouse'
-            """)
+            """
+		)
 
-        frappe.db.sql("""UPDATE `tabStock Entry` SET
+		frappe.db.sql(
+			"""UPDATE `tabStock Entry` SET
             stock_entry_type = 'Material Transfer',
             purpose = 'Material Transfer'
             WHERE stock_entry_type = 'Receive at Warehouse'
-            """)
+            """
+		)
 
-        frappe.reload_doc("stock", "doctype", "warehouse_type")
-        if not frappe.db.exists('Warehouse Type', 'Transit'):
-            doc = frappe.new_doc('Warehouse Type')
-            doc.name = 'Transit'
-            doc.insert()
+		frappe.reload_doc("stock", "doctype", "warehouse_type")
+		if not frappe.db.exists("Warehouse Type", "Transit"):
+			doc = frappe.new_doc("Warehouse Type")
+			doc.name = "Transit"
+			doc.insert()
 
-        frappe.reload_doc("stock", "doctype", "stock_entry_type")
-        frappe.delete_doc_if_exists("Stock Entry Type", "Send to Warehouse")
-        frappe.delete_doc_if_exists("Stock Entry Type", "Receive at Warehouse")
+		frappe.reload_doc("stock", "doctype", "stock_entry_type")
+		frappe.delete_doc_if_exists("Stock Entry Type", "Send to Warehouse")
+		frappe.delete_doc_if_exists("Stock Entry Type", "Receive at Warehouse")
diff --git a/erpnext/patches/v13_0/trim_sales_invoice_custom_field_length.py b/erpnext/patches/v13_0/trim_sales_invoice_custom_field_length.py
index fd48c0d..5f3fc57 100644
--- a/erpnext/patches/v13_0/trim_sales_invoice_custom_field_length.py
+++ b/erpnext/patches/v13_0/trim_sales_invoice_custom_field_length.py
@@ -7,12 +7,10 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	custom_fields = {
-		'Sales Invoice': get_custom_fields().get('Sales Invoice')
-	}
+	custom_fields = {"Sales Invoice": get_custom_fields().get("Sales Invoice")}
 
 	create_custom_fields(custom_fields, update=True)
diff --git a/erpnext/patches/v13_0/trim_whitespace_from_serial_nos.py b/erpnext/patches/v13_0/trim_whitespace_from_serial_nos.py
index 4ec22e9..b69a408 100644
--- a/erpnext/patches/v13_0/trim_whitespace_from_serial_nos.py
+++ b/erpnext/patches/v13_0/trim_whitespace_from_serial_nos.py
@@ -4,7 +4,8 @@
 
 
 def execute():
-	broken_sles = frappe.db.sql("""
+	broken_sles = frappe.db.sql(
+		"""
 			select name, serial_no
 			from `tabStock Ledger Entry`
 			where
@@ -12,15 +13,15 @@
 				and ( serial_no like %s or serial_no like %s or serial_no like %s or serial_no like %s
 					or serial_no = %s )
 			""",
-			(
-				" %",    # leading whitespace
-				"% ",    # trailing whitespace
-				"%\n %", # leading whitespace on newline
-				"% \n%", # trailing whitespace on newline
-				"\n",    # just new line
-			),
-			as_dict=True,
-		)
+		(
+			" %",  # leading whitespace
+			"% ",  # trailing whitespace
+			"%\n %",  # leading whitespace on newline
+			"% \n%",  # trailing whitespace on newline
+			"\n",  # just new line
+		),
+		as_dict=True,
+	)
 
 	frappe.db.MAX_WRITES_PER_TRANSACTION += len(broken_sles)
 
@@ -37,7 +38,9 @@
 		if correct_sr_no == sle.serial_no:
 			continue
 
-		frappe.db.set_value("Stock Ledger Entry", sle.name, "serial_no", correct_sr_no, update_modified=False)
+		frappe.db.set_value(
+			"Stock Ledger Entry", sle.name, "serial_no", correct_sr_no, update_modified=False
+		)
 		broken_serial_nos.update(serial_no_list)
 
 	if not broken_serial_nos:
@@ -45,14 +48,15 @@
 
 	# Patch serial No documents if they don't have purchase info
 	# Purchase info is used for fetching incoming rate
-	broken_sr_no_records = frappe.get_list("Serial No",
-			filters={
-				"status":"Active",
-				"name": ("in", broken_serial_nos),
-				"purchase_document_type": ("is", "not set")
-			},
-			pluck="name",
-		)
+	broken_sr_no_records = frappe.get_list(
+		"Serial No",
+		filters={
+			"status": "Active",
+			"name": ("in", broken_serial_nos),
+			"purchase_document_type": ("is", "not set"),
+		},
+		pluck="name",
+	)
 
 	frappe.db.MAX_WRITES_PER_TRANSACTION += len(broken_sr_no_records)
 
diff --git a/erpnext/patches/v13_0/update_accounts_in_loan_docs.py b/erpnext/patches/v13_0/update_accounts_in_loan_docs.py
index 440f912..bf98e9e 100644
--- a/erpnext/patches/v13_0/update_accounts_in_loan_docs.py
+++ b/erpnext/patches/v13_0/update_accounts_in_loan_docs.py
@@ -6,31 +6,13 @@
 	lr = frappe.qb.DocType("Loan Repayment").as_("lr")
 	loan = frappe.qb.DocType("Loan")
 
-	frappe.qb.update(
-		ld
-	).inner_join(
-		loan
-	).on(
-		loan.name == ld.against_loan
-	).set(
+	frappe.qb.update(ld).inner_join(loan).on(loan.name == ld.against_loan).set(
 		ld.disbursement_account, loan.disbursement_account
-	).set(
-		ld.loan_account, loan.loan_account
-	).where(
-		ld.docstatus < 2
-	).run()
+	).set(ld.loan_account, loan.loan_account).where(ld.docstatus < 2).run()
 
-	frappe.qb.update(
-		lr
-	).inner_join(
-		loan
-	).on(
-		loan.name == lr.against_loan
-	).set(
+	frappe.qb.update(lr).inner_join(loan).on(loan.name == lr.against_loan).set(
 		lr.payment_account, loan.payment_account
-	).set(
-		lr.loan_account, loan.loan_account
-	).set(
+	).set(lr.loan_account, loan.loan_account).set(
 		lr.penalty_income_account, loan.penalty_income_account
 	).where(
 		lr.docstatus < 2
diff --git a/erpnext/patches/v13_0/update_actual_start_and_end_date_in_wo.py b/erpnext/patches/v13_0/update_actual_start_and_end_date_in_wo.py
index 60466eb..3c6c5b5 100644
--- a/erpnext/patches/v13_0/update_actual_start_and_end_date_in_wo.py
+++ b/erpnext/patches/v13_0/update_actual_start_and_end_date_in_wo.py
@@ -11,11 +11,9 @@
 	frappe.reload_doc("manufacturing", "doctype", "work_order_item")
 	frappe.reload_doc("manufacturing", "doctype", "job_card")
 
-	data = frappe.get_all("Work Order",
-		filters = {
-			"docstatus": 1,
-			"status": ("in", ["In Process", "Completed"])
-		})
+	data = frappe.get_all(
+		"Work Order", filters={"docstatus": 1, "status": ("in", ["In Process", "Completed"])}
+	)
 
 	for d in data:
 		doc = frappe.get_doc("Work Order", d.name)
@@ -23,18 +21,22 @@
 		doc.db_set("actual_start_date", doc.actual_start_date, update_modified=False)
 
 		if doc.status == "Completed":
-			frappe.db.set_value("Work Order", d.name, {
-				"actual_end_date": doc.actual_end_date,
-				"lead_time": doc.lead_time
-			}, update_modified=False)
+			frappe.db.set_value(
+				"Work Order",
+				d.name,
+				{"actual_end_date": doc.actual_end_date, "lead_time": doc.lead_time},
+				update_modified=False,
+			)
 
 			if not doc.planned_end_date:
 				planned_end_date = add_to_date(doc.planned_start_date, minutes=doc.lead_time)
 				doc.db_set("planned_end_date", doc.actual_start_date, update_modified=False)
 
-	frappe.db.sql(""" UPDATE `tabJob Card` as jc, `tabWork Order` as wo
+	frappe.db.sql(
+		""" UPDATE `tabJob Card` as jc, `tabWork Order` as wo
 		SET
 			jc.production_item = wo.production_item, jc.item_name = wo.item_name
 		WHERE
 			jc.work_order = wo.name and IFNULL(jc.production_item, "") = ""
-	""")
\ No newline at end of file
+	"""
+	)
diff --git a/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py b/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py
index dc973a9..e37f291 100644
--- a/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py
+++ b/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py
@@ -2,7 +2,7 @@
 
 
 def execute():
-	""" Correct amount in child table of required items table."""
+	"""Correct amount in child table of required items table."""
 
 	frappe.reload_doc("manufacturing", "doctype", "work_order")
 	frappe.reload_doc("manufacturing", "doctype", "work_order_item")
diff --git a/erpnext/patches/v13_0/update_asset_quantity_field.py b/erpnext/patches/v13_0/update_asset_quantity_field.py
index 47884d1..265a3bb 100644
--- a/erpnext/patches/v13_0/update_asset_quantity_field.py
+++ b/erpnext/patches/v13_0/update_asset_quantity_field.py
@@ -2,7 +2,7 @@
 
 
 def execute():
-	if frappe.db.count('Asset'):
+	if frappe.db.count("Asset"):
 		frappe.reload_doc("assets", "doctype", "Asset")
-		asset = frappe.qb.DocType('Asset')
-		frappe.qb.update(asset).set(asset.asset_quantity, 1).run()
\ No newline at end of file
+		asset = frappe.qb.DocType("Asset")
+		frappe.qb.update(asset).set(asset.asset_quantity, 1).run()
diff --git a/erpnext/patches/v13_0/update_category_in_ltds_certificate.py b/erpnext/patches/v13_0/update_category_in_ltds_certificate.py
index a5f5a23..5a0873e 100644
--- a/erpnext/patches/v13_0/update_category_in_ltds_certificate.py
+++ b/erpnext/patches/v13_0/update_category_in_ltds_certificate.py
@@ -2,19 +2,15 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	frappe.reload_doc('regional', 'doctype', 'lower_deduction_certificate')
+	frappe.reload_doc("regional", "doctype", "lower_deduction_certificate")
 
 	ldc = frappe.qb.DocType("Lower Deduction Certificate").as_("ldc")
 	supplier = frappe.qb.DocType("Supplier")
 
-	frappe.qb.update(ldc).inner_join(supplier).on(
-		ldc.supplier == supplier.name
-	).set(
+	frappe.qb.update(ldc).inner_join(supplier).on(ldc.supplier == supplier.name).set(
 		ldc.tax_withholding_category, supplier.tax_withholding_category
-	).where(
-		ldc.tax_withholding_category.isnull()
-	).run()
\ No newline at end of file
+	).where(ldc.tax_withholding_category.isnull()).run()
diff --git a/erpnext/patches/v13_0/update_dates_in_tax_withholding_category.py b/erpnext/patches/v13_0/update_dates_in_tax_withholding_category.py
index 90fb50f..c538476 100644
--- a/erpnext/patches/v13_0/update_dates_in_tax_withholding_category.py
+++ b/erpnext/patches/v13_0/update_dates_in_tax_withholding_category.py
@@ -5,22 +5,23 @@
 
 
 def execute():
-	frappe.reload_doc('accounts', 'doctype', 'Tax Withholding Rate')
+	frappe.reload_doc("accounts", "doctype", "Tax Withholding Rate")
 
-	if frappe.db.has_column('Tax Withholding Rate', 'fiscal_year'):
-		tds_category_rates = frappe.get_all('Tax Withholding Rate', fields=['name', 'fiscal_year'])
+	if frappe.db.has_column("Tax Withholding Rate", "fiscal_year"):
+		tds_category_rates = frappe.get_all("Tax Withholding Rate", fields=["name", "fiscal_year"])
 
 		fiscal_year_map = {}
-		fiscal_year_details = frappe.get_all('Fiscal Year', fields=['name', 'year_start_date', 'year_end_date'])
+		fiscal_year_details = frappe.get_all(
+			"Fiscal Year", fields=["name", "year_start_date", "year_end_date"]
+		)
 
 		for d in fiscal_year_details:
 			fiscal_year_map.setdefault(d.name, d)
 
 		for rate in tds_category_rates:
-			from_date = fiscal_year_map.get(rate.fiscal_year).get('year_start_date')
-			to_date = fiscal_year_map.get(rate.fiscal_year).get('year_end_date')
+			from_date = fiscal_year_map.get(rate.fiscal_year).get("year_start_date")
+			to_date = fiscal_year_map.get(rate.fiscal_year).get("year_end_date")
 
-			frappe.db.set_value('Tax Withholding Rate', rate.name, {
-				'from_date': from_date,
-				'to_date': to_date
-			})
\ No newline at end of file
+			frappe.db.set_value(
+				"Tax Withholding Rate", rate.name, {"from_date": from_date, "to_date": to_date}
+			)
diff --git a/erpnext/patches/v13_0/update_deferred_settings.py b/erpnext/patches/v13_0/update_deferred_settings.py
index 1b63635..03fe66f 100644
--- a/erpnext/patches/v13_0/update_deferred_settings.py
+++ b/erpnext/patches/v13_0/update_deferred_settings.py
@@ -5,8 +5,8 @@
 
 
 def execute():
-	accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings')
-	accounts_settings.book_deferred_entries_based_on = 'Days'
+	accounts_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
+	accounts_settings.book_deferred_entries_based_on = "Days"
 	accounts_settings.book_deferred_entries_via_journal_entry = 0
 	accounts_settings.submit_journal_entries = 0
 	accounts_settings.save()
diff --git a/erpnext/patches/v13_0/update_disbursement_account.py b/erpnext/patches/v13_0/update_disbursement_account.py
index c56fa8f..d6aba47 100644
--- a/erpnext/patches/v13_0/update_disbursement_account.py
+++ b/erpnext/patches/v13_0/update_disbursement_account.py
@@ -9,14 +9,6 @@
 	loan_type = frappe.qb.DocType("Loan Type")
 	loan = frappe.qb.DocType("Loan")
 
-	frappe.qb.update(
-		loan_type
-	).set(
-		loan_type.disbursement_account, loan_type.payment_account
-	).run()
+	frappe.qb.update(loan_type).set(loan_type.disbursement_account, loan_type.payment_account).run()
 
-	frappe.qb.update(
-		loan
-	).set(
-		loan.disbursement_account, loan.payment_account
-	).run()
\ No newline at end of file
+	frappe.qb.update(loan).set(loan.disbursement_account, loan.payment_account).run()
diff --git a/erpnext/patches/v13_0/update_expense_claim_status_for_paid_advances.py b/erpnext/patches/v13_0/update_expense_claim_status_for_paid_advances.py
index 063de16..2bc17ae 100644
--- a/erpnext/patches/v13_0/update_expense_claim_status_for_paid_advances.py
+++ b/erpnext/patches/v13_0/update_expense_claim_status_for_paid_advances.py
@@ -4,18 +4,21 @@
 def execute():
 	"""
 	Update Expense Claim status to Paid if:
-		- the entire required amount is already covered via linked advances
-		- the claim is partially paid via advances and the rest is reimbursed
+	        - the entire required amount is already covered via linked advances
+	        - the claim is partially paid via advances and the rest is reimbursed
 	"""
 
-	ExpenseClaim = frappe.qb.DocType('Expense Claim')
+	ExpenseClaim = frappe.qb.DocType("Expense Claim")
 
-	(frappe.qb
-		.update(ExpenseClaim)
-		.set(ExpenseClaim.status, 'Paid')
+	(
+		frappe.qb.update(ExpenseClaim)
+		.set(ExpenseClaim.status, "Paid")
 		.where(
-			((ExpenseClaim.grand_total == 0) | (ExpenseClaim.grand_total == ExpenseClaim.total_amount_reimbursed))
-			& (ExpenseClaim.approval_status == 'Approved')
+			(
+				(ExpenseClaim.grand_total == 0)
+				| (ExpenseClaim.grand_total == ExpenseClaim.total_amount_reimbursed)
+			)
+			& (ExpenseClaim.approval_status == "Approved")
 			& (ExpenseClaim.docstatus == 1)
 			& (ExpenseClaim.total_sanctioned_amount > 0)
 		)
diff --git a/erpnext/patches/v13_0/update_export_type_for_gst.py b/erpnext/patches/v13_0/update_export_type_for_gst.py
index de57861..6236858 100644
--- a/erpnext/patches/v13_0/update_export_type_for_gst.py
+++ b/erpnext/patches/v13_0/update_export_type_for_gst.py
@@ -2,32 +2,39 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	# Update custom fields
-	fieldname = frappe.db.get_value('Custom Field', {'dt': 'Customer', 'fieldname': 'export_type'})
+	fieldname = frappe.db.get_value("Custom Field", {"dt": "Customer", "fieldname": "export_type"})
 	if fieldname:
-		frappe.db.set_value('Custom Field', fieldname,
+		frappe.db.set_value(
+			"Custom Field",
+			fieldname,
 			{
-				'default': '',
-				'mandatory_depends_on': 'eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)'
-			})
+				"default": "",
+				"mandatory_depends_on": 'eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)',
+			},
+		)
 
-	fieldname = frappe.db.get_value('Custom Field', {'dt': 'Supplier', 'fieldname': 'export_type'})
+	fieldname = frappe.db.get_value("Custom Field", {"dt": "Supplier", "fieldname": "export_type"})
 	if fieldname:
-		frappe.db.set_value('Custom Field', fieldname,
-			{
-				'default': '',
-				'mandatory_depends_on': 'eval:in_list(["SEZ", "Overseas"], doc.gst_category)'
-			})
+		frappe.db.set_value(
+			"Custom Field",
+			fieldname,
+			{"default": "", "mandatory_depends_on": 'eval:in_list(["SEZ", "Overseas"], doc.gst_category)'},
+		)
 
 	# Update Customer/Supplier Masters
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabCustomer` set export_type = '' WHERE gst_category NOT IN ('SEZ', 'Overseas', 'Deemed Export')
-	""")
+	"""
+	)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabSupplier` set export_type = '' WHERE gst_category NOT IN ('SEZ', 'Overseas')
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/update_job_card_details.py b/erpnext/patches/v13_0/update_job_card_details.py
index 12f9006..73baecf 100644
--- a/erpnext/patches/v13_0/update_job_card_details.py
+++ b/erpnext/patches/v13_0/update_job_card_details.py
@@ -10,8 +10,10 @@
 	frappe.reload_doc("manufacturing", "doctype", "job_card_item")
 	frappe.reload_doc("manufacturing", "doctype", "work_order_operation")
 
-	frappe.db.sql(""" update `tabJob Card` jc, `tabWork Order Operation` wo
+	frappe.db.sql(
+		""" update `tabJob Card` jc, `tabWork Order Operation` wo
 		SET	jc.hour_rate =  wo.hour_rate
 		WHERE
 			jc.operation_id = wo.name and jc.docstatus < 2 and wo.hour_rate > 0
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v13_0/update_job_card_status.py b/erpnext/patches/v13_0/update_job_card_status.py
index 797a3e2..f2d12da 100644
--- a/erpnext/patches/v13_0/update_job_card_status.py
+++ b/erpnext/patches/v13_0/update_job_card_status.py
@@ -7,8 +7,8 @@
 def execute():
 
 	job_card = frappe.qb.DocType("Job Card")
-	(frappe.qb
-		.update(job_card)
+	(
+		frappe.qb.update(job_card)
 		.set(job_card.status, "Completed")
 		.where(
 			(job_card.docstatus == 1)
diff --git a/erpnext/patches/v13_0/update_maintenance_schedule_field_in_visit.py b/erpnext/patches/v13_0/update_maintenance_schedule_field_in_visit.py
index 7a8c1c6..136d34e 100644
--- a/erpnext/patches/v13_0/update_maintenance_schedule_field_in_visit.py
+++ b/erpnext/patches/v13_0/update_maintenance_schedule_field_in_visit.py
@@ -1,25 +1,20 @@
-
 import frappe
 
 
 def execute():
-	frappe.reload_doctype('Maintenance Visit')
-	frappe.reload_doctype('Maintenance Visit Purpose')
+	frappe.reload_doctype("Maintenance Visit")
+	frappe.reload_doctype("Maintenance Visit Purpose")
 
 	# Updates the Maintenance Schedule link to fetch serial nos
 	from frappe.query_builder.functions import Coalesce
-	mvp = frappe.qb.DocType('Maintenance Visit Purpose')
-	mv = frappe.qb.DocType('Maintenance Visit')
 
-	frappe.qb.update(
-		mv
-	).join(
-		mvp
-	).on(mvp.parent == mv.name).set(
-		mv.maintenance_schedule,
-		Coalesce(mvp.prevdoc_docname, '')
+	mvp = frappe.qb.DocType("Maintenance Visit Purpose")
+	mv = frappe.qb.DocType("Maintenance Visit")
+
+	frappe.qb.update(mv).join(mvp).on(mvp.parent == mv.name).set(
+		mv.maintenance_schedule, Coalesce(mvp.prevdoc_docname, "")
 	).where(
-		(mv.maintenance_type == "Scheduled")
-		& (mvp.prevdoc_docname.notnull())
-		& (mv.docstatus < 2)
-	).run(as_dict=1)
+		(mv.maintenance_type == "Scheduled") & (mvp.prevdoc_docname.notnull()) & (mv.docstatus < 2)
+	).run(
+		as_dict=1
+	)
diff --git a/erpnext/patches/v13_0/update_old_loans.py b/erpnext/patches/v13_0/update_old_loans.py
index e226f1d..a1d40b7 100644
--- a/erpnext/patches/v13_0/update_old_loans.py
+++ b/erpnext/patches/v13_0/update_old_loans.py
@@ -16,69 +16,110 @@
 
 	# Create a penalty account for loan types
 
-	frappe.reload_doc('loan_management', 'doctype', 'loan_type')
-	frappe.reload_doc('loan_management', 'doctype', 'loan')
-	frappe.reload_doc('loan_management', 'doctype', 'repayment_schedule')
-	frappe.reload_doc('loan_management', 'doctype', 'process_loan_interest_accrual')
-	frappe.reload_doc('loan_management', 'doctype', 'loan_repayment')
-	frappe.reload_doc('loan_management', 'doctype', 'loan_repayment_detail')
-	frappe.reload_doc('loan_management', 'doctype', 'loan_interest_accrual')
-	frappe.reload_doc('accounts', 'doctype', 'gl_entry')
-	frappe.reload_doc('accounts', 'doctype', 'journal_entry_account')
+	frappe.reload_doc("loan_management", "doctype", "loan_type")
+	frappe.reload_doc("loan_management", "doctype", "loan")
+	frappe.reload_doc("loan_management", "doctype", "repayment_schedule")
+	frappe.reload_doc("loan_management", "doctype", "process_loan_interest_accrual")
+	frappe.reload_doc("loan_management", "doctype", "loan_repayment")
+	frappe.reload_doc("loan_management", "doctype", "loan_repayment_detail")
+	frappe.reload_doc("loan_management", "doctype", "loan_interest_accrual")
+	frappe.reload_doc("accounts", "doctype", "gl_entry")
+	frappe.reload_doc("accounts", "doctype", "journal_entry_account")
 
 	updated_loan_types = []
 	loans_to_close = []
 
 	# Update old loan status as closed
-	if frappe.db.has_column('Repayment Schedule', 'paid'):
-		loans_list = frappe.db.sql("""SELECT distinct parent from `tabRepayment Schedule`
-			where paid = 0 and docstatus = 1""", as_dict=1)
+	if frappe.db.has_column("Repayment Schedule", "paid"):
+		loans_list = frappe.db.sql(
+			"""SELECT distinct parent from `tabRepayment Schedule`
+			where paid = 0 and docstatus = 1""",
+			as_dict=1,
+		)
 
 		loans_to_close = [d.parent for d in loans_list]
 
 	if loans_to_close:
-		frappe.db.sql("UPDATE `tabLoan` set status = 'Closed' where name not in (%s)" % (', '.join(['%s'] * len(loans_to_close))), tuple(loans_to_close))
+		frappe.db.sql(
+			"UPDATE `tabLoan` set status = 'Closed' where name not in (%s)"
+			% (", ".join(["%s"] * len(loans_to_close))),
+			tuple(loans_to_close),
+		)
 
-	loans = frappe.get_all('Loan', fields=['name', 'loan_type', 'company', 'status', 'mode_of_payment',
-		'applicant_type', 'applicant', 'loan_account', 'payment_account', 'interest_income_account'],
-		filters={'docstatus': 1, 'status': ('!=', 'Closed')})
+	loans = frappe.get_all(
+		"Loan",
+		fields=[
+			"name",
+			"loan_type",
+			"company",
+			"status",
+			"mode_of_payment",
+			"applicant_type",
+			"applicant",
+			"loan_account",
+			"payment_account",
+			"interest_income_account",
+		],
+		filters={"docstatus": 1, "status": ("!=", "Closed")},
+	)
 
 	for loan in loans:
 		# Update details in Loan Types and Loan
-		loan_type_company = frappe.db.get_value('Loan Type', loan.loan_type, 'company')
+		loan_type_company = frappe.db.get_value("Loan Type", loan.loan_type, "company")
 		loan_type = loan.loan_type
 
-		group_income_account = frappe.get_value('Account', {'company': loan.company,
-			'is_group': 1, 'root_type': 'Income', 'account_name': _('Indirect Income')})
+		group_income_account = frappe.get_value(
+			"Account",
+			{
+				"company": loan.company,
+				"is_group": 1,
+				"root_type": "Income",
+				"account_name": _("Indirect Income"),
+			},
+		)
 
 		if not group_income_account:
-			group_income_account = frappe.get_value('Account', {'company': loan.company,
-				'is_group': 1, 'root_type': 'Income'})
+			group_income_account = frappe.get_value(
+				"Account", {"company": loan.company, "is_group": 1, "root_type": "Income"}
+			)
 
-		penalty_account = create_account(company=loan.company, account_type='Income Account',
-			account_name='Penalty Account', parent_account=group_income_account)
+		penalty_account = create_account(
+			company=loan.company,
+			account_type="Income Account",
+			account_name="Penalty Account",
+			parent_account=group_income_account,
+		)
 
 		# Same loan type used for multiple companies
 		if loan_type_company and loan_type_company != loan.company:
 			# get loan type for appropriate company
-			loan_type_name = frappe.get_value('Loan Type', {'company': loan.company,
-				'mode_of_payment': loan.mode_of_payment, 'loan_account': loan.loan_account,
-				'payment_account': loan.payment_account, 'interest_income_account': loan.interest_income_account,
-				'penalty_income_account': loan.penalty_income_account}, 'name')
+			loan_type_name = frappe.get_value(
+				"Loan Type",
+				{
+					"company": loan.company,
+					"mode_of_payment": loan.mode_of_payment,
+					"loan_account": loan.loan_account,
+					"payment_account": loan.payment_account,
+					"interest_income_account": loan.interest_income_account,
+					"penalty_income_account": loan.penalty_income_account,
+				},
+				"name",
+			)
 
 			if not loan_type_name:
 				loan_type_name = create_loan_type(loan, loan_type_name, penalty_account)
 
 			# update loan type in loan
-			frappe.db.sql("UPDATE `tabLoan` set loan_type = %s where name = %s", (loan_type_name,
-				loan.name))
+			frappe.db.sql(
+				"UPDATE `tabLoan` set loan_type = %s where name = %s", (loan_type_name, loan.name)
+			)
 
 			loan_type = loan_type_name
 			if loan_type_name not in updated_loan_types:
 				updated_loan_types.append(loan_type_name)
 
 		elif not loan_type_company:
-			loan_type_doc = frappe.get_doc('Loan Type', loan.loan_type)
+			loan_type_doc = frappe.get_doc("Loan Type", loan.loan_type)
 			loan_type_doc.is_term_loan = 1
 			loan_type_doc.company = loan.company
 			loan_type_doc.mode_of_payment = loan.mode_of_payment
@@ -91,26 +132,29 @@
 			loan_type = loan.loan_type
 
 		if loan_type in updated_loan_types:
-			if loan.status == 'Fully Disbursed':
-				status = 'Disbursed'
-			elif loan.status == 'Repaid/Closed':
-				status = 'Closed'
+			if loan.status == "Fully Disbursed":
+				status = "Disbursed"
+			elif loan.status == "Repaid/Closed":
+				status = "Closed"
 			else:
 				status = loan.status
 
-			frappe.db.set_value('Loan', loan.name, {
-				'is_term_loan': 1,
-				'penalty_income_account': penalty_account,
-				'status': status
-			})
+			frappe.db.set_value(
+				"Loan",
+				loan.name,
+				{"is_term_loan": 1, "penalty_income_account": penalty_account, "status": status},
+			)
 
-			process_loan_interest_accrual_for_term_loans(posting_date=nowdate(), loan_type=loan_type,
-				loan=loan.name)
+			process_loan_interest_accrual_for_term_loans(
+				posting_date=nowdate(), loan_type=loan_type, loan=loan.name
+			)
 
-
-			if frappe.db.has_column('Repayment Schedule', 'paid'):
-				total_principal, total_interest = frappe.db.get_value('Repayment Schedule', {'paid': 1, 'parent': loan.name},
-					['sum(principal_amount) as total_principal', 'sum(interest_amount) as total_interest'])
+			if frappe.db.has_column("Repayment Schedule", "paid"):
+				total_principal, total_interest = frappe.db.get_value(
+					"Repayment Schedule",
+					{"paid": 1, "parent": loan.name},
+					["sum(principal_amount) as total_principal", "sum(interest_amount) as total_interest"],
+				)
 
 				accrued_entries = get_accrued_interest_entries(loan.name)
 				for entry in accrued_entries:
@@ -127,17 +171,20 @@
 					else:
 						principal_paid = flt(total_principal)
 
-					frappe.db.sql(""" UPDATE `tabLoan Interest Accrual`
+					frappe.db.sql(
+						""" UPDATE `tabLoan Interest Accrual`
 						SET paid_principal_amount = `paid_principal_amount` + %s,
 							paid_interest_amount = `paid_interest_amount` + %s
 						WHERE name = %s""",
-						(principal_paid, interest_paid, entry.name))
+						(principal_paid, interest_paid, entry.name),
+					)
 
 					total_principal = flt(total_principal) - principal_paid
 					total_interest = flt(total_interest) - interest_paid
 
+
 def create_loan_type(loan, loan_type_name, penalty_account):
-	loan_type_doc = frappe.new_doc('Loan Type')
+	loan_type_doc = frappe.new_doc("Loan Type")
 	loan_type_doc.loan_name = make_autoname("Loan Type-.####")
 	loan_type_doc.is_term_loan = 1
 	loan_type_doc.company = loan.company
diff --git a/erpnext/patches/v13_0/update_payment_terms_outstanding.py b/erpnext/patches/v13_0/update_payment_terms_outstanding.py
index aea09ad..d0c25f3 100644
--- a/erpnext/patches/v13_0/update_payment_terms_outstanding.py
+++ b/erpnext/patches/v13_0/update_payment_terms_outstanding.py
@@ -7,10 +7,12 @@
 
 def execute():
 	frappe.reload_doc("accounts", "doctype", "Payment Schedule")
-	if frappe.db.count('Payment Schedule'):
-		frappe.db.sql('''
+	if frappe.db.count("Payment Schedule"):
+		frappe.db.sql(
+			"""
 			UPDATE
 				`tabPayment Schedule` ps
 			SET
 				ps.outstanding = (ps.payment_amount - ps.paid_amount)
-		''')
+		"""
+		)
diff --git a/erpnext/patches/v13_0/update_pos_closing_entry_in_merge_log.py b/erpnext/patches/v13_0/update_pos_closing_entry_in_merge_log.py
index b2e3559..49826df 100644
--- a/erpnext/patches/v13_0/update_pos_closing_entry_in_merge_log.py
+++ b/erpnext/patches/v13_0/update_pos_closing_entry_in_merge_log.py
@@ -8,8 +8,9 @@
 def execute():
 	frappe.reload_doc("accounts", "doctype", "POS Invoice Merge Log")
 	frappe.reload_doc("accounts", "doctype", "POS Closing Entry")
-	if frappe.db.count('POS Invoice Merge Log'):
-		frappe.db.sql('''
+	if frappe.db.count("POS Invoice Merge Log"):
+		frappe.db.sql(
+			"""
 			UPDATE
 				`tabPOS Invoice Merge Log` log, `tabPOS Invoice Reference` log_ref
 			SET
@@ -20,7 +21,8 @@
 				)
 			WHERE
 				log_ref.parent = log.name
-		''')
+		"""
+		)
 
-		frappe.db.sql('''UPDATE `tabPOS Closing Entry` SET status = 'Submitted' where docstatus = 1''')
-		frappe.db.sql('''UPDATE `tabPOS Closing Entry` SET status = 'Cancelled' where docstatus = 2''')
+		frappe.db.sql("""UPDATE `tabPOS Closing Entry` SET status = 'Submitted' where docstatus = 1""")
+		frappe.db.sql("""UPDATE `tabPOS Closing Entry` SET status = 'Cancelled' where docstatus = 2""")
diff --git a/erpnext/patches/v13_0/update_project_template_tasks.py b/erpnext/patches/v13_0/update_project_template_tasks.py
index 29debc6..c9a2322 100644
--- a/erpnext/patches/v13_0/update_project_template_tasks.py
+++ b/erpnext/patches/v13_0/update_project_template_tasks.py
@@ -11,38 +11,39 @@
 	frappe.reload_doc("projects", "doctype", "task")
 
 	# Update property setter status if any
-	property_setter = frappe.db.get_value('Property Setter', {'doc_type': 'Task',
-		'field_name': 'status', 'property': 'options'})
+	property_setter = frappe.db.get_value(
+		"Property Setter", {"doc_type": "Task", "field_name": "status", "property": "options"}
+	)
 
 	if property_setter:
-		property_setter_doc = frappe.get_doc('Property Setter', {'doc_type': 'Task',
-			'field_name': 'status', 'property': 'options'})
+		property_setter_doc = frappe.get_doc(
+			"Property Setter", {"doc_type": "Task", "field_name": "status", "property": "options"}
+		)
 		property_setter_doc.value += "\nTemplate"
 		property_setter_doc.save()
 
-	for template_name in frappe.get_all('Project Template'):
+	for template_name in frappe.get_all("Project Template"):
 		template = frappe.get_doc("Project Template", template_name.name)
 		replace_tasks = False
 		new_tasks = []
 		for task in template.tasks:
 			if task.subject:
 				replace_tasks = True
-				new_task = frappe.get_doc(dict(
-					doctype = "Task",
-					subject = task.subject,
-					start = task.start,
-					duration = task.duration,
-					task_weight = task.task_weight,
-					description = task.description,
-					is_template = 1
-				)).insert()
+				new_task = frappe.get_doc(
+					dict(
+						doctype="Task",
+						subject=task.subject,
+						start=task.start,
+						duration=task.duration,
+						task_weight=task.task_weight,
+						description=task.description,
+						is_template=1,
+					)
+				).insert()
 				new_tasks.append(new_task)
 
 		if replace_tasks:
 			template.tasks = []
 			for tsk in new_tasks:
-				template.append("tasks", {
-					"task": tsk.name,
-					"subject": tsk.subject
-				})
+				template.append("tasks", {"task": tsk.name, "subject": tsk.subject})
 			template.save()
diff --git a/erpnext/patches/v13_0/update_reason_for_resignation_in_employee.py b/erpnext/patches/v13_0/update_reason_for_resignation_in_employee.py
index f9bfc54..31aa292 100644
--- a/erpnext/patches/v13_0/update_reason_for_resignation_in_employee.py
+++ b/erpnext/patches/v13_0/update_reason_for_resignation_in_employee.py
@@ -6,10 +6,12 @@
 
 
 def execute():
-    frappe.reload_doc("hr", "doctype", "employee")
+	frappe.reload_doc("hr", "doctype", "employee")
 
-    if frappe.db.has_column("Employee", "reason_for_resignation"):
-        frappe.db.sql(""" UPDATE `tabEmployee`
+	if frappe.db.has_column("Employee", "reason_for_resignation"):
+		frappe.db.sql(
+			""" UPDATE `tabEmployee`
             SET reason_for_leaving = reason_for_resignation
             WHERE status = 'Left' and reason_for_leaving is null and reason_for_resignation is not null
-        """)
+        """
+		)
diff --git a/erpnext/patches/v13_0/update_recipient_email_digest.py b/erpnext/patches/v13_0/update_recipient_email_digest.py
index d4d45af..af7f3ff 100644
--- a/erpnext/patches/v13_0/update_recipient_email_digest.py
+++ b/erpnext/patches/v13_0/update_recipient_email_digest.py
@@ -6,17 +6,19 @@
 
 
 def execute():
-    frappe.reload_doc("setup", "doctype", "Email Digest")
-    frappe.reload_doc("setup", "doctype", "Email Digest Recipient")
-    email_digests = frappe.db.get_list('Email Digest', fields=['name', 'recipient_list'])
-    for email_digest in email_digests:
-        if email_digest.recipient_list:
-            for recipient in email_digest.recipient_list.split("\n"):
-                doc = frappe.get_doc({
-                    'doctype': 'Email Digest Recipient',
-                    'parenttype': 'Email Digest',
-                    'parentfield': 'recipients',
-                    'parent': email_digest.name,
-                    'recipient': recipient
-                })
-                doc.insert()
+	frappe.reload_doc("setup", "doctype", "Email Digest")
+	frappe.reload_doc("setup", "doctype", "Email Digest Recipient")
+	email_digests = frappe.db.get_list("Email Digest", fields=["name", "recipient_list"])
+	for email_digest in email_digests:
+		if email_digest.recipient_list:
+			for recipient in email_digest.recipient_list.split("\n"):
+				doc = frappe.get_doc(
+					{
+						"doctype": "Email Digest Recipient",
+						"parenttype": "Email Digest",
+						"parentfield": "recipients",
+						"parent": email_digest.name,
+						"recipient": recipient,
+					}
+				)
+				doc.insert()
diff --git a/erpnext/patches/v13_0/update_reserved_qty_closed_wo.py b/erpnext/patches/v13_0/update_reserved_qty_closed_wo.py
index 00926b0..72e77fe 100644
--- a/erpnext/patches/v13_0/update_reserved_qty_closed_wo.py
+++ b/erpnext/patches/v13_0/update_reserved_qty_closed_wo.py
@@ -9,15 +9,12 @@
 	wo_item = frappe.qb.DocType("Work Order Item")
 
 	incorrect_item_wh = (
-		frappe.qb
-			.from_(wo)
-			.join(wo_item).on(wo.name == wo_item.parent)
-			.select(wo_item.item_code, wo.source_warehouse).distinct()
-			.where(
-				(wo.status == "Closed")
-				& (wo.docstatus == 1)
-				& (wo.source_warehouse.notnull())
-			)
+		frappe.qb.from_(wo)
+		.join(wo_item)
+		.on(wo.name == wo_item.parent)
+		.select(wo_item.item_code, wo.source_warehouse)
+		.distinct()
+		.where((wo.status == "Closed") & (wo.docstatus == 1) & (wo.source_warehouse.notnull()))
 	).run()
 
 	for item_code, warehouse in incorrect_item_wh:
diff --git a/erpnext/patches/v13_0/update_response_by_variance.py b/erpnext/patches/v13_0/update_response_by_variance.py
index d65e903..7304455 100644
--- a/erpnext/patches/v13_0/update_response_by_variance.py
+++ b/erpnext/patches/v13_0/update_response_by_variance.py
@@ -6,27 +6,49 @@
 
 
 def execute():
-	if frappe.db.exists('DocType', 'Issue') and frappe.db.count('Issue'):
-		invalid_issues = frappe.get_all('Issue', {
-			'first_responded_on': ['is', 'set'],
-			'response_by_variance': ['<', 0]
-		}, ["name", "response_by_variance", "timestampdiff(Second, `first_responded_on`, `response_by`) as variance"])
+	if frappe.db.exists("DocType", "Issue") and frappe.db.count("Issue"):
+		invalid_issues = frappe.get_all(
+			"Issue",
+			{"first_responded_on": ["is", "set"], "response_by_variance": ["<", 0]},
+			[
+				"name",
+				"response_by_variance",
+				"timestampdiff(Second, `first_responded_on`, `response_by`) as variance",
+			],
+		)
 
 		# issues which has response_by_variance set as -ve
 		# but diff between first_responded_on & response_by is +ve i.e SLA isn't failed
-		invalid_issues = [d for d in invalid_issues if d.get('variance') > 0]
+		invalid_issues = [d for d in invalid_issues if d.get("variance") > 0]
 
 		for issue in invalid_issues:
-			frappe.db.set_value('Issue', issue.get('name'), 'response_by_variance', issue.get('variance'), update_modified=False)
+			frappe.db.set_value(
+				"Issue",
+				issue.get("name"),
+				"response_by_variance",
+				issue.get("variance"),
+				update_modified=False,
+			)
 
-		invalid_issues = frappe.get_all('Issue', {
-			'resolution_date': ['is', 'set'],
-			'resolution_by_variance': ['<', 0]
-		}, ["name", "resolution_by_variance", "timestampdiff(Second, `resolution_date`, `resolution_by`) as variance"])
+		invalid_issues = frappe.get_all(
+			"Issue",
+			{"resolution_date": ["is", "set"], "resolution_by_variance": ["<", 0]},
+			[
+				"name",
+				"resolution_by_variance",
+				"timestampdiff(Second, `resolution_date`, `resolution_by`) as variance",
+			],
+		)
 
 		# issues which has resolution_by_variance set as -ve
 		# but diff between resolution_date & resolution_by is +ve i.e SLA isn't failed
-		invalid_issues = [d for d in invalid_issues if d.get('variance') > 0]
+		invalid_issues = [d for d in invalid_issues if d.get("variance") > 0]
 
 		for issue in invalid_issues:
-			frappe.db.set_value('Issue', issue.get('name'), 'resolution_by_variance', issue.get('variance'), update_modified=False)
+			frappe.db.set_value(
+				"Issue",
+				issue.get("name"),
+				"resolution_by_variance",
+				issue.get("variance"),
+				update_modified=False,
+			)
diff --git a/erpnext/patches/v13_0/update_returned_qty_in_pr_dn.py b/erpnext/patches/v13_0/update_returned_qty_in_pr_dn.py
index dd64e05..9b5845f 100644
--- a/erpnext/patches/v13_0/update_returned_qty_in_pr_dn.py
+++ b/erpnext/patches/v13_0/update_returned_qty_in_pr_dn.py
@@ -6,14 +6,16 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'purchase_receipt')
-	frappe.reload_doc('stock', 'doctype', 'purchase_receipt_item')
-	frappe.reload_doc('stock', 'doctype', 'delivery_note')
-	frappe.reload_doc('stock', 'doctype', 'delivery_note_item')
-	frappe.reload_doc('stock', 'doctype', 'stock_settings')
+	frappe.reload_doc("stock", "doctype", "purchase_receipt")
+	frappe.reload_doc("stock", "doctype", "purchase_receipt_item")
+	frappe.reload_doc("stock", "doctype", "delivery_note")
+	frappe.reload_doc("stock", "doctype", "delivery_note_item")
+	frappe.reload_doc("stock", "doctype", "stock_settings")
 
 	def update_from_return_docs(doctype):
-		for return_doc in frappe.get_all(doctype, filters={'is_return' : 1, 'docstatus' : 1, 'return_against': ('!=', '')}):
+		for return_doc in frappe.get_all(
+			doctype, filters={"is_return": 1, "docstatus": 1, "return_against": ("!=", "")}
+		):
 			# Update original receipt/delivery document from return
 			return_doc = frappe.get_cached_doc(doctype, return_doc.name)
 			try:
@@ -27,9 +29,11 @@
 			frappe.db.commit()
 
 	# Set received qty in stock uom in PR, as returned qty is checked against it
-	frappe.db.sql(""" update `tabPurchase Receipt Item`
+	frappe.db.sql(
+		""" update `tabPurchase Receipt Item`
 		set received_stock_qty = received_qty * conversion_factor
-		where docstatus = 1 """)
+		where docstatus = 1 """
+	)
 
-	for doctype in ('Purchase Receipt', 'Delivery Note'):
+	for doctype in ("Purchase Receipt", "Delivery Note"):
 		update_from_return_docs(doctype)
diff --git a/erpnext/patches/v13_0/update_sane_transfer_against.py b/erpnext/patches/v13_0/update_sane_transfer_against.py
index a163d38..45691e2 100644
--- a/erpnext/patches/v13_0/update_sane_transfer_against.py
+++ b/erpnext/patches/v13_0/update_sane_transfer_against.py
@@ -4,8 +4,8 @@
 def execute():
 	bom = frappe.qb.DocType("BOM")
 
-	(frappe.qb
-		.update(bom)
+	(
+		frappe.qb.update(bom)
 		.set(bom.transfer_material_against, "Work Order")
 		.where(bom.with_operations == 0)
 	).run()
diff --git a/erpnext/patches/v13_0/update_shipment_status.py b/erpnext/patches/v13_0/update_shipment_status.py
index f2d7d1d..d21caf7 100644
--- a/erpnext/patches/v13_0/update_shipment_status.py
+++ b/erpnext/patches/v13_0/update_shipment_status.py
@@ -5,11 +5,15 @@
 	frappe.reload_doc("stock", "doctype", "shipment")
 
 	# update submitted status
-	frappe.db.sql("""UPDATE `tabShipment`
+	frappe.db.sql(
+		"""UPDATE `tabShipment`
 					SET status = "Submitted"
-					WHERE status = "Draft" AND docstatus = 1""")
+					WHERE status = "Draft" AND docstatus = 1"""
+	)
 
 	# update cancelled status
-	frappe.db.sql("""UPDATE `tabShipment`
+	frappe.db.sql(
+		"""UPDATE `tabShipment`
 					SET status = "Cancelled"
-					WHERE status = "Draft" AND docstatus = 2""")
+					WHERE status = "Draft" AND docstatus = 2"""
+	)
diff --git a/erpnext/patches/v13_0/update_sla_enhancements.py b/erpnext/patches/v13_0/update_sla_enhancements.py
index 7f61020..84c683a 100644
--- a/erpnext/patches/v13_0/update_sla_enhancements.py
+++ b/erpnext/patches/v13_0/update_sla_enhancements.py
@@ -8,78 +8,94 @@
 def execute():
 	# add holiday list and employee group fields in SLA
 	# change response and resolution time in priorities child table
-	if frappe.db.exists('DocType', 'Service Level Agreement'):
-		sla_details = frappe.db.get_all('Service Level Agreement', fields=['name', 'service_level'])
-		priorities = frappe.db.get_all('Service Level Priority', fields=['*'], filters={
-			'parenttype': ('in', ['Service Level Agreement', 'Service Level'])
-		})
+	if frappe.db.exists("DocType", "Service Level Agreement"):
+		sla_details = frappe.db.get_all("Service Level Agreement", fields=["name", "service_level"])
+		priorities = frappe.db.get_all(
+			"Service Level Priority",
+			fields=["*"],
+			filters={"parenttype": ("in", ["Service Level Agreement", "Service Level"])},
+		)
 
-		frappe.reload_doc('support', 'doctype', 'service_level_agreement')
-		frappe.reload_doc('support', 'doctype', 'pause_sla_on_status')
-		frappe.reload_doc('support', 'doctype', 'service_level_priority')
-		frappe.reload_doc('support', 'doctype', 'service_day')
+		frappe.reload_doc("support", "doctype", "service_level_agreement")
+		frappe.reload_doc("support", "doctype", "pause_sla_on_status")
+		frappe.reload_doc("support", "doctype", "service_level_priority")
+		frappe.reload_doc("support", "doctype", "service_day")
 
 		for entry in sla_details:
-			values = frappe.db.get_value('Service Level', entry.service_level, ['holiday_list', 'employee_group'])
+			values = frappe.db.get_value(
+				"Service Level", entry.service_level, ["holiday_list", "employee_group"]
+			)
 			if values:
 				holiday_list = values[0]
 				employee_group = values[1]
-				frappe.db.set_value('Service Level Agreement', entry.name, {
-					'holiday_list': holiday_list,
-					'employee_group': employee_group
-				})
+				frappe.db.set_value(
+					"Service Level Agreement",
+					entry.name,
+					{"holiday_list": holiday_list, "employee_group": employee_group},
+				)
 
 		priority_dict = {}
 
 		for priority in priorities:
-			if priority.parenttype == 'Service Level Agreement':
+			if priority.parenttype == "Service Level Agreement":
 				response_time = convert_to_seconds(priority.response_time, priority.response_time_period)
 				resolution_time = convert_to_seconds(priority.resolution_time, priority.resolution_time_period)
-				frappe.db.set_value('Service Level Priority', priority.name, {
-					'response_time': response_time,
-					'resolution_time': resolution_time
-				})
-			if priority.parenttype == 'Service Level':
+				frappe.db.set_value(
+					"Service Level Priority",
+					priority.name,
+					{"response_time": response_time, "resolution_time": resolution_time},
+				)
+			if priority.parenttype == "Service Level":
 				if not priority.parent in priority_dict:
 					priority_dict[priority.parent] = []
 				priority_dict[priority.parent].append(priority)
 
-
 		# copy Service Levels to Service Level Agreements
 		sl = [entry.service_level for entry in sla_details]
-		if frappe.db.exists('DocType', 'Service Level'):
-			service_levels = frappe.db.get_all('Service Level', filters={'service_level': ('not in', sl)}, fields=['*'])
+		if frappe.db.exists("DocType", "Service Level"):
+			service_levels = frappe.db.get_all(
+				"Service Level", filters={"service_level": ("not in", sl)}, fields=["*"]
+			)
 			for entry in service_levels:
-				sla = frappe.new_doc('Service Level Agreement')
+				sla = frappe.new_doc("Service Level Agreement")
 				sla.service_level = entry.service_level
 				sla.holiday_list = entry.holiday_list
 				sla.employee_group = entry.employee_group
 				sla.flags.ignore_validate = True
 				sla = sla.insert(ignore_mandatory=True)
 
-				frappe.db.sql("""
+				frappe.db.sql(
+					"""
 					UPDATE
 						`tabService Day`
 					SET
 						parent = %(new_parent)s , parentfield = 'support_and_resolution', parenttype = 'Service Level Agreement'
 					WHERE
 						parent = %(old_parent)s
-				""", {'new_parent': sla.name, 'old_parent': entry.name}, as_dict = 1)
+				""",
+					{"new_parent": sla.name, "old_parent": entry.name},
+					as_dict=1,
+				)
 
 				priority_list = priority_dict.get(entry.name)
 				if priority_list:
-					sla = frappe.get_doc('Service Level Agreement', sla.name)
+					sla = frappe.get_doc("Service Level Agreement", sla.name)
 					for priority in priority_list:
-						row = sla.append('priorities', {
-							'priority': priority.priority,
-							'default_priority': priority.default_priority,
-							'response_time': convert_to_seconds(priority.response_time, priority.response_time_period),
-							'resolution_time': convert_to_seconds(priority.resolution_time, priority.resolution_time_period)
-						})
+						row = sla.append(
+							"priorities",
+							{
+								"priority": priority.priority,
+								"default_priority": priority.default_priority,
+								"response_time": convert_to_seconds(priority.response_time, priority.response_time_period),
+								"resolution_time": convert_to_seconds(
+									priority.resolution_time, priority.resolution_time_period
+								),
+							},
+						)
 						row.db_update()
 					sla.db_update()
 
-	frappe.delete_doc_if_exists('DocType', 'Service Level')
+	frappe.delete_doc_if_exists("DocType", "Service Level")
 
 
 def convert_to_seconds(value, unit):
diff --git a/erpnext/patches/v13_0/update_start_end_date_for_old_shift_assignment.py b/erpnext/patches/v13_0/update_start_end_date_for_old_shift_assignment.py
index 665cc39..6d26ac5 100644
--- a/erpnext/patches/v13_0/update_start_end_date_for_old_shift_assignment.py
+++ b/erpnext/patches/v13_0/update_start_end_date_for_old_shift_assignment.py
@@ -6,8 +6,10 @@
 
 
 def execute():
-    frappe.reload_doc('hr', 'doctype', 'shift_assignment')
-    if frappe.db.has_column('Shift Assignment', 'date'):
-        frappe.db.sql("""update `tabShift Assignment`
+	frappe.reload_doc("hr", "doctype", "shift_assignment")
+	if frappe.db.has_column("Shift Assignment", "date"):
+		frappe.db.sql(
+			"""update `tabShift Assignment`
             set end_date=date, start_date=date
-            where date IS NOT NULL and start_date IS NULL and end_date IS NULL;""")
+            where date IS NOT NULL and start_date IS NULL and end_date IS NULL;"""
+		)
diff --git a/erpnext/patches/v13_0/update_subscription.py b/erpnext/patches/v13_0/update_subscription.py
index b67c74d..66b3def 100644
--- a/erpnext/patches/v13_0/update_subscription.py
+++ b/erpnext/patches/v13_0/update_subscription.py
@@ -7,12 +7,13 @@
 
 def execute():
 
-	frappe.reload_doc('accounts', 'doctype', 'subscription')
-	frappe.reload_doc('accounts', 'doctype', 'subscription_invoice')
-	frappe.reload_doc('accounts', 'doctype', 'subscription_plan')
+	frappe.reload_doc("accounts", "doctype", "subscription")
+	frappe.reload_doc("accounts", "doctype", "subscription_invoice")
+	frappe.reload_doc("accounts", "doctype", "subscription_plan")
 
-	if frappe.db.has_column('Subscription', 'customer'):
-		frappe.db.sql("""
+	if frappe.db.has_column("Subscription", "customer"):
+		frappe.db.sql(
+			"""
 			UPDATE `tabSubscription`
 			SET
 				start_date = start,
@@ -20,22 +21,28 @@
 				party = customer,
 				sales_tax_template = tax_template
 			WHERE IFNULL(party,'') = ''
-		""")
+		"""
+		)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		UPDATE `tabSubscription Invoice`
 		SET document_type = 'Sales Invoice'
 		WHERE IFNULL(document_type, '') = ''
-	""")
+	"""
+	)
 
 	price_determination_map = {
-		'Fixed rate': 'Fixed Rate',
-		'Based on price list': 'Based On Price List'
+		"Fixed rate": "Fixed Rate",
+		"Based on price list": "Based On Price List",
 	}
 
 	for key, value in price_determination_map.items():
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			UPDATE `tabSubscription Plan`
 			SET price_determination = %s
 			WHERE price_determination = %s
-		""", (value, key))
+		""",
+			(value, key),
+		)
diff --git a/erpnext/patches/v13_0/update_subscription_status_in_memberships.py b/erpnext/patches/v13_0/update_subscription_status_in_memberships.py
index e21fe57..d7c8499 100644
--- a/erpnext/patches/v13_0/update_subscription_status_in_memberships.py
+++ b/erpnext/patches/v13_0/update_subscription_status_in_memberships.py
@@ -2,9 +2,11 @@
 
 
 def execute():
-	if frappe.db.exists('DocType', 'Member'):
-		frappe.reload_doc('Non Profit', 'doctype', 'Member')
+	if frappe.db.exists("DocType", "Member"):
+		frappe.reload_doc("Non Profit", "doctype", "Member")
 
-		if frappe.db.has_column('Member', 'subscription_activated'):
-			frappe.db.sql('UPDATE `tabMember` SET subscription_status = "Active" WHERE subscription_activated = 1')
-			frappe.db.sql_ddl('ALTER table `tabMember` DROP COLUMN subscription_activated')
+		if frappe.db.has_column("Member", "subscription_activated"):
+			frappe.db.sql(
+				'UPDATE `tabMember` SET subscription_status = "Active" WHERE subscription_activated = 1'
+			)
+			frappe.db.sql_ddl("ALTER table `tabMember` DROP COLUMN subscription_activated")
diff --git a/erpnext/patches/v13_0/update_tax_category_for_rcm.py b/erpnext/patches/v13_0/update_tax_category_for_rcm.py
index 7af2366..8ac9534 100644
--- a/erpnext/patches/v13_0/update_tax_category_for_rcm.py
+++ b/erpnext/patches/v13_0/update_tax_category_for_rcm.py
@@ -5,27 +5,46 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	create_custom_fields({
-		'Tax Category': [
-			dict(fieldname='is_inter_state', label='Is Inter State',
-				fieldtype='Check', insert_after='disabled', print_hide=1),
-			dict(fieldname='is_reverse_charge', label='Is Reverse Charge', fieldtype='Check',
-				insert_after='is_inter_state', print_hide=1),
-			dict(fieldname='tax_category_column_break', fieldtype='Column Break',
-				insert_after='is_reverse_charge'),
-			dict(fieldname='gst_state', label='Source State', fieldtype='Select',
-				options='\n'.join(states), insert_after='company')
-		]
-	}, update=True)
+	create_custom_fields(
+		{
+			"Tax Category": [
+				dict(
+					fieldname="is_inter_state",
+					label="Is Inter State",
+					fieldtype="Check",
+					insert_after="disabled",
+					print_hide=1,
+				),
+				dict(
+					fieldname="is_reverse_charge",
+					label="Is Reverse Charge",
+					fieldtype="Check",
+					insert_after="is_inter_state",
+					print_hide=1,
+				),
+				dict(
+					fieldname="tax_category_column_break",
+					fieldtype="Column Break",
+					insert_after="is_reverse_charge",
+				),
+				dict(
+					fieldname="gst_state",
+					label="Source State",
+					fieldtype="Select",
+					options="\n".join(states),
+					insert_after="company",
+				),
+			]
+		},
+		update=True,
+	)
 
 	tax_category = frappe.qb.DocType("Tax Category")
 
-	frappe.qb.update(tax_category).set(
-		tax_category.is_reverse_charge, 1
-	).where(
-		tax_category.name.isin(['Reverse Charge Out-State', 'Reverse Charge In-State'])
-	).run()
\ No newline at end of file
+	frappe.qb.update(tax_category).set(tax_category.is_reverse_charge, 1).where(
+		tax_category.name.isin(["Reverse Charge Out-State", "Reverse Charge In-State"])
+	).run()
diff --git a/erpnext/patches/v13_0/update_tds_check_field.py b/erpnext/patches/v13_0/update_tds_check_field.py
index 436d2e6..0505266 100644
--- a/erpnext/patches/v13_0/update_tds_check_field.py
+++ b/erpnext/patches/v13_0/update_tds_check_field.py
@@ -2,9 +2,12 @@
 
 
 def execute():
-	if frappe.db.has_table("Tax Withholding Category") \
-		and frappe.db.has_column("Tax Withholding Category", "round_off_tax_amount"):
-		frappe.db.sql("""
+	if frappe.db.has_table("Tax Withholding Category") and frappe.db.has_column(
+		"Tax Withholding Category", "round_off_tax_amount"
+	):
+		frappe.db.sql(
+			"""
 			UPDATE `tabTax Withholding Category` set round_off_tax_amount = 0
 			WHERE round_off_tax_amount IS NULL
-		""")
+		"""
+		)
diff --git a/erpnext/patches/v13_0/update_timesheet_changes.py b/erpnext/patches/v13_0/update_timesheet_changes.py
index a5e3391..02654c1 100644
--- a/erpnext/patches/v13_0/update_timesheet_changes.py
+++ b/erpnext/patches/v13_0/update_timesheet_changes.py
@@ -9,17 +9,23 @@
 	if frappe.db.has_column("Timesheet Detail", "billable"):
 		rename_field("Timesheet Detail", "billable", "is_billable")
 
-	base_currency = frappe.defaults.get_global_default('currency')
+	base_currency = frappe.defaults.get_global_default("currency")
 
-	frappe.db.sql("""UPDATE `tabTimesheet Detail`
+	frappe.db.sql(
+		"""UPDATE `tabTimesheet Detail`
 			SET base_billing_rate = billing_rate,
 			base_billing_amount = billing_amount,
 			base_costing_rate = costing_rate,
-			base_costing_amount = costing_amount""")
+			base_costing_amount = costing_amount"""
+	)
 
-	frappe.db.sql("""UPDATE `tabTimesheet`
+	frappe.db.sql(
+		"""UPDATE `tabTimesheet`
 			SET currency = '{0}',
 			exchange_rate = 1.0,
 			base_total_billable_amount = total_billable_amount,
 			base_total_billed_amount = total_billed_amount,
-			base_total_costing_amount = total_costing_amount""".format(base_currency))
+			base_total_costing_amount = total_costing_amount""".format(
+			base_currency
+		)
+	)
diff --git a/erpnext/patches/v13_0/update_vehicle_no_reqd_condition.py b/erpnext/patches/v13_0/update_vehicle_no_reqd_condition.py
index 902707b..326fc57 100644
--- a/erpnext/patches/v13_0/update_vehicle_no_reqd_condition.py
+++ b/erpnext/patches/v13_0/update_vehicle_no_reqd_condition.py
@@ -2,10 +2,10 @@
 
 
 def execute():
-	frappe.reload_doc('custom', 'doctype', 'custom_field', force=True)
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	frappe.reload_doc("custom", "doctype", "custom_field", force=True)
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	if frappe.db.exists('Custom Field', { 'fieldname': 'vehicle_no' }):
-		frappe.db.set_value('Custom Field', { 'fieldname': 'vehicle_no' }, 'mandatory_depends_on', '')
+	if frappe.db.exists("Custom Field", {"fieldname": "vehicle_no"}):
+		frappe.db.set_value("Custom Field", {"fieldname": "vehicle_no"}, "mandatory_depends_on", "")
diff --git a/erpnext/patches/v13_0/updates_for_multi_currency_payroll.py b/erpnext/patches/v13_0/updates_for_multi_currency_payroll.py
index c760a6a..b395c01c 100644
--- a/erpnext/patches/v13_0/updates_for_multi_currency_payroll.py
+++ b/erpnext/patches/v13_0/updates_for_multi_currency_payroll.py
@@ -8,122 +8,116 @@
 
 def execute():
 
-	frappe.reload_doc('Accounts', 'doctype', 'Salary Component Account')
-	if frappe.db.has_column('Salary Component Account', 'default_account'):
+	frappe.reload_doc("Accounts", "doctype", "Salary Component Account")
+	if frappe.db.has_column("Salary Component Account", "default_account"):
 		rename_field("Salary Component Account", "default_account", "account")
 
 	doctype_list = [
-		{
-		'module':'HR',
-		'doctype':'Employee Advance'
-		},
-		{
-		'module':'HR',
-		'doctype':'Leave Encashment'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Additional Salary'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Employee Benefit Application'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Employee Benefit Claim'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Employee Incentive'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Employee Tax Exemption Declaration'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Employee Tax Exemption Proof Submission'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Income Tax Slab'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Payroll Entry'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Retention Bonus'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Salary Structure'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Salary Structure Assignment'
-		},
-		{
-		'module':'Payroll',
-		'doctype':'Salary Slip'
-		},
+		{"module": "HR", "doctype": "Employee Advance"},
+		{"module": "HR", "doctype": "Leave Encashment"},
+		{"module": "Payroll", "doctype": "Additional Salary"},
+		{"module": "Payroll", "doctype": "Employee Benefit Application"},
+		{"module": "Payroll", "doctype": "Employee Benefit Claim"},
+		{"module": "Payroll", "doctype": "Employee Incentive"},
+		{"module": "Payroll", "doctype": "Employee Tax Exemption Declaration"},
+		{"module": "Payroll", "doctype": "Employee Tax Exemption Proof Submission"},
+		{"module": "Payroll", "doctype": "Income Tax Slab"},
+		{"module": "Payroll", "doctype": "Payroll Entry"},
+		{"module": "Payroll", "doctype": "Retention Bonus"},
+		{"module": "Payroll", "doctype": "Salary Structure"},
+		{"module": "Payroll", "doctype": "Salary Structure Assignment"},
+		{"module": "Payroll", "doctype": "Salary Slip"},
 	]
 
 	for item in doctype_list:
-		frappe.reload_doc(item['module'], 'doctype', item['doctype'])
+		frappe.reload_doc(item["module"], "doctype", item["doctype"])
 
 	# update company in employee advance based on employee company
-	for dt in ['Employee Incentive', 'Leave Encashment', 'Employee Benefit Application', 'Employee Benefit Claim']:
-		frappe.db.sql("""
+	for dt in [
+		"Employee Incentive",
+		"Leave Encashment",
+		"Employee Benefit Application",
+		"Employee Benefit Claim",
+	]:
+		frappe.db.sql(
+			"""
 			update `tab{doctype}`
 			set company = (select company from tabEmployee where name=`tab{doctype}`.employee)
-		""".format(doctype=dt))
+		""".format(
+				doctype=dt
+			)
+		)
 
 	# update exchange rate for employee advance
 	frappe.db.sql("update `tabEmployee Advance` set exchange_rate=1")
 
 	# get all companies and it's currency
-	all_companies = frappe.db.get_all("Company", fields=["name", "default_currency", "default_payroll_payable_account"])
+	all_companies = frappe.db.get_all(
+		"Company", fields=["name", "default_currency", "default_payroll_payable_account"]
+	)
 	for d in all_companies:
 		company = d.name
 		company_currency = d.default_currency
 		default_payroll_payable_account = d.default_payroll_payable_account
 
 		if not default_payroll_payable_account:
-			default_payroll_payable_account = frappe.db.get_value("Account",
-				{"account_name": _("Payroll Payable"), "company": company, "account_currency": company_currency, "is_group": 0})
+			default_payroll_payable_account = frappe.db.get_value(
+				"Account",
+				{
+					"account_name": _("Payroll Payable"),
+					"company": company,
+					"account_currency": company_currency,
+					"is_group": 0,
+				},
+			)
 
 		# update currency in following doctypes based on company currency
-		doctypes_for_currency = ['Employee Advance', 'Leave Encashment', 'Employee Benefit Application',
-			'Employee Benefit Claim', 'Employee Incentive', 'Additional Salary',
-			'Employee Tax Exemption Declaration', 'Employee Tax Exemption Proof Submission',
-			'Income Tax Slab', 'Retention Bonus', 'Salary Structure']
+		doctypes_for_currency = [
+			"Employee Advance",
+			"Leave Encashment",
+			"Employee Benefit Application",
+			"Employee Benefit Claim",
+			"Employee Incentive",
+			"Additional Salary",
+			"Employee Tax Exemption Declaration",
+			"Employee Tax Exemption Proof Submission",
+			"Income Tax Slab",
+			"Retention Bonus",
+			"Salary Structure",
+		]
 
 		for dt in doctypes_for_currency:
-			frappe.db.sql("""update `tab{doctype}` set currency = %s where company=%s"""
-				.format(doctype=dt), (company_currency, company))
+			frappe.db.sql(
+				"""update `tab{doctype}` set currency = %s where company=%s""".format(doctype=dt),
+				(company_currency, company),
+			)
 
 		# update fields in payroll entry
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			update `tabPayroll Entry`
 			set currency = %s,
 				exchange_rate = 1,
 				payroll_payable_account=%s
 			where company=%s
-		""", (company_currency, default_payroll_payable_account, company))
+		""",
+			(company_currency, default_payroll_payable_account, company),
+		)
 
 		# update fields in Salary Structure Assignment
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			update `tabSalary Structure Assignment`
 			set currency = %s,
 				payroll_payable_account=%s
 			where company=%s
-		""", (company_currency, default_payroll_payable_account, company))
+		""",
+			(company_currency, default_payroll_payable_account, company),
+		)
 
 		# update fields in Salary Slip
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			update `tabSalary Slip`
 			set currency = %s,
 				exchange_rate = 1,
@@ -134,4 +128,6 @@
 				base_rounded_total = rounded_total,
 				base_total_in_words = total_in_words
 			where company=%s
-		""", (company_currency, company))
+		""",
+			(company_currency, company),
+		)
diff --git a/erpnext/patches/v13_0/wipe_serial_no_field_for_0_qty.py b/erpnext/patches/v13_0/wipe_serial_no_field_for_0_qty.py
index e43a8ba..693d06d 100644
--- a/erpnext/patches/v13_0/wipe_serial_no_field_for_0_qty.py
+++ b/erpnext/patches/v13_0/wipe_serial_no_field_for_0_qty.py
@@ -11,8 +11,6 @@
 
 	sr_item = frappe.qb.DocType(doctype)
 
-	(frappe.qb
-		.update(sr_item)
-		.set(sr_item.current_serial_no, None)
-		.where(sr_item.current_qty == 0)
+	(
+		frappe.qb.update(sr_item).set(sr_item.current_serial_no, None).where(sr_item.current_qty == 0)
 	).run()
diff --git a/erpnext/patches/v14_0/add_default_exit_questionnaire_notification_template.py b/erpnext/patches/v14_0/add_default_exit_questionnaire_notification_template.py
index 2a8b6ef..001c8ef 100644
--- a/erpnext/patches/v14_0/add_default_exit_questionnaire_notification_template.py
+++ b/erpnext/patches/v14_0/add_default_exit_questionnaire_notification_template.py
@@ -8,15 +8,19 @@
 	template = frappe.db.exists("Email Template", _("Exit Questionnaire Notification"))
 	if not template:
 		base_path = frappe.get_app_path("erpnext", "hr", "doctype")
-		response = frappe.read_file(os.path.join(base_path, "exit_interview/exit_questionnaire_notification_template.html"))
+		response = frappe.read_file(
+			os.path.join(base_path, "exit_interview/exit_questionnaire_notification_template.html")
+		)
 
-		template = frappe.get_doc({
-			"doctype": "Email Template",
-			"name": _("Exit Questionnaire Notification"),
-			"response": response,
-			"subject": _("Exit Questionnaire Notification"),
-			"owner": frappe.session.user,
-		}).insert(ignore_permissions=True)
+		template = frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": _("Exit Questionnaire Notification"),
+				"response": response,
+				"subject": _("Exit Questionnaire Notification"),
+				"owner": frappe.session.user,
+			}
+		).insert(ignore_permissions=True)
 		template = template.name
 
 	hr_settings = frappe.get_doc("HR Settings")
diff --git a/erpnext/patches/v14_0/delete_agriculture_doctypes.py b/erpnext/patches/v14_0/delete_agriculture_doctypes.py
index d7fe832..e0b12a2 100644
--- a/erpnext/patches/v14_0/delete_agriculture_doctypes.py
+++ b/erpnext/patches/v14_0/delete_agriculture_doctypes.py
@@ -6,14 +6,16 @@
 
 	frappe.delete_doc("Workspace", "Agriculture", ignore_missing=True, force=True)
 
-	reports = frappe.get_all("Report", {"module": "agriculture", "is_standard": "Yes"}, pluck='name')
+	reports = frappe.get_all("Report", {"module": "agriculture", "is_standard": "Yes"}, pluck="name")
 	for report in reports:
 		frappe.delete_doc("Report", report, ignore_missing=True, force=True)
 
-	dashboards = frappe.get_all("Dashboard", {"module": "agriculture", "is_standard": 1}, pluck='name')
+	dashboards = frappe.get_all(
+		"Dashboard", {"module": "agriculture", "is_standard": 1}, pluck="name"
+	)
 	for dashboard in dashboards:
 		frappe.delete_doc("Dashboard", dashboard, ignore_missing=True, force=True)
 
-	doctypes = frappe.get_all("DocType", {"module": "agriculture", "custom": 0}, pluck='name')
+	doctypes = frappe.get_all("DocType", {"module": "agriculture", "custom": 0}, pluck="name")
 	for doctype in doctypes:
 		frappe.delete_doc("DocType", doctype, ignore_missing=True)
diff --git a/erpnext/patches/v14_0/delete_amazon_mws_doctype.py b/erpnext/patches/v14_0/delete_amazon_mws_doctype.py
index 525da6c..636e743 100644
--- a/erpnext/patches/v14_0/delete_amazon_mws_doctype.py
+++ b/erpnext/patches/v14_0/delete_amazon_mws_doctype.py
@@ -2,4 +2,4 @@
 
 
 def execute():
-	frappe.delete_doc("DocType", "Amazon MWS Settings", ignore_missing=True)
\ No newline at end of file
+	frappe.delete_doc("DocType", "Amazon MWS Settings", ignore_missing=True)
diff --git a/erpnext/patches/v14_0/delete_healthcare_doctypes.py b/erpnext/patches/v14_0/delete_healthcare_doctypes.py
index 3a4f8f5..2c699e4 100644
--- a/erpnext/patches/v14_0/delete_healthcare_doctypes.py
+++ b/erpnext/patches/v14_0/delete_healthcare_doctypes.py
@@ -7,58 +7,59 @@
 
 	frappe.delete_doc("Workspace", "Healthcare", ignore_missing=True, force=True)
 
-	pages = frappe.get_all("Page", {"module": "healthcare"}, pluck='name')
+	pages = frappe.get_all("Page", {"module": "healthcare"}, pluck="name")
 	for page in pages:
 		frappe.delete_doc("Page", page, ignore_missing=True, force=True)
 
-	reports = frappe.get_all("Report", {"module": "healthcare", "is_standard": "Yes"}, pluck='name')
+	reports = frappe.get_all("Report", {"module": "healthcare", "is_standard": "Yes"}, pluck="name")
 	for report in reports:
 		frappe.delete_doc("Report", report, ignore_missing=True, force=True)
 
-	print_formats = frappe.get_all("Print Format", {"module": "healthcare", "standard": "Yes"}, pluck='name')
+	print_formats = frappe.get_all(
+		"Print Format", {"module": "healthcare", "standard": "Yes"}, pluck="name"
+	)
 	for print_format in print_formats:
 		frappe.delete_doc("Print Format", print_format, ignore_missing=True, force=True)
 
 	frappe.reload_doc("website", "doctype", "website_settings")
-	forms = frappe.get_all("Web Form", {"module": "healthcare", "is_standard": 1}, pluck='name')
+	forms = frappe.get_all("Web Form", {"module": "healthcare", "is_standard": 1}, pluck="name")
 	for form in forms:
 		frappe.delete_doc("Web Form", form, ignore_missing=True, force=True)
 
-	dashboards = frappe.get_all("Dashboard", {"module": "healthcare", "is_standard": 1}, pluck='name')
+	dashboards = frappe.get_all("Dashboard", {"module": "healthcare", "is_standard": 1}, pluck="name")
 	for dashboard in dashboards:
 		frappe.delete_doc("Dashboard", dashboard, ignore_missing=True, force=True)
 
-	dashboards = frappe.get_all("Dashboard Chart", {"module": "healthcare", "is_standard": 1}, pluck='name')
+	dashboards = frappe.get_all(
+		"Dashboard Chart", {"module": "healthcare", "is_standard": 1}, pluck="name"
+	)
 	for dashboard in dashboards:
 		frappe.delete_doc("Dashboard Chart", dashboard, ignore_missing=True, force=True)
 
 	frappe.reload_doc("desk", "doctype", "number_card")
-	cards = frappe.get_all("Number Card", {"module": "healthcare", "is_standard": 1}, pluck='name')
+	cards = frappe.get_all("Number Card", {"module": "healthcare", "is_standard": 1}, pluck="name")
 	for card in cards:
 		frappe.delete_doc("Number Card", card, ignore_missing=True, force=True)
 
-	titles = ['Lab Test', 'Prescription', 'Patient Appointment']
-	items = frappe.get_all('Portal Menu Item', filters=[['title', 'in', titles]], pluck='name')
+	titles = ["Lab Test", "Prescription", "Patient Appointment"]
+	items = frappe.get_all("Portal Menu Item", filters=[["title", "in", titles]], pluck="name")
 	for item in items:
 		frappe.delete_doc("Portal Menu Item", item, ignore_missing=True, force=True)
 
-	doctypes = frappe.get_all("DocType", {"module": "healthcare", "custom": 0}, pluck='name')
+	doctypes = frappe.get_all("DocType", {"module": "healthcare", "custom": 0}, pluck="name")
 	for doctype in doctypes:
 		frappe.delete_doc("DocType", doctype, ignore_missing=True)
 
 	frappe.delete_doc("Module Def", "Healthcare", ignore_missing=True, force=True)
 
 	custom_fields = {
-		'Sales Invoice': ['patient', 'patient_name', 'ref_practitioner'],
-		'Sales Invoice Item': ['reference_dt', 'reference_dn'],
-		'Stock Entry': ['inpatient_medication_entry'],
-		'Stock Entry Detail': ['patient', 'inpatient_medication_entry_child'],
+		"Sales Invoice": ["patient", "patient_name", "ref_practitioner"],
+		"Sales Invoice Item": ["reference_dt", "reference_dn"],
+		"Stock Entry": ["inpatient_medication_entry"],
+		"Stock Entry Detail": ["patient", "inpatient_medication_entry_child"],
 	}
 	for doc, fields in custom_fields.items():
-		filters = {
-			'dt': doc,
-			'fieldname': ['in', fields]
-		}
-		records = frappe.get_all('Custom Field', filters=filters, pluck='name')
+		filters = {"dt": doc, "fieldname": ["in", fields]}
+		records = frappe.get_all("Custom Field", filters=filters, pluck="name")
 		for record in records:
-			frappe.delete_doc('Custom Field', record, ignore_missing=True, force=True)
+			frappe.delete_doc("Custom Field", record, ignore_missing=True, force=True)
diff --git a/erpnext/patches/v14_0/delete_hospitality_doctypes.py b/erpnext/patches/v14_0/delete_hospitality_doctypes.py
index d0216f8..8fa3fe0 100644
--- a/erpnext/patches/v14_0/delete_hospitality_doctypes.py
+++ b/erpnext/patches/v14_0/delete_hospitality_doctypes.py
@@ -2,22 +2,22 @@
 
 
 def execute():
-	modules = ['Hotels', 'Restaurant']
+	modules = ["Hotels", "Restaurant"]
 
 	for module in modules:
 		frappe.delete_doc("Module Def", module, ignore_missing=True, force=True)
 
 		frappe.delete_doc("Workspace", module, ignore_missing=True, force=True)
 
-		reports = frappe.get_all("Report", {"module": module, "is_standard": "Yes"}, pluck='name')
+		reports = frappe.get_all("Report", {"module": module, "is_standard": "Yes"}, pluck="name")
 		for report in reports:
 			frappe.delete_doc("Report", report, ignore_missing=True, force=True)
 
-		dashboards = frappe.get_all("Dashboard", {"module": module, "is_standard": 1}, pluck='name')
+		dashboards = frappe.get_all("Dashboard", {"module": module, "is_standard": 1}, pluck="name")
 		for dashboard in dashboards:
 			frappe.delete_doc("Dashboard", dashboard, ignore_missing=True, force=True)
 
-		doctypes = frappe.get_all("DocType", {"module": module, "custom": 0}, pluck='name')
+		doctypes = frappe.get_all("DocType", {"module": module, "custom": 0}, pluck="name")
 		for doctype in doctypes:
 			frappe.delete_doc("DocType", doctype, ignore_missing=True)
 
diff --git a/erpnext/patches/v14_0/delete_hub_doctypes.py b/erpnext/patches/v14_0/delete_hub_doctypes.py
index d1e9e31..08f4445 100644
--- a/erpnext/patches/v14_0/delete_hub_doctypes.py
+++ b/erpnext/patches/v14_0/delete_hub_doctypes.py
@@ -3,7 +3,7 @@
 
 def execute():
 
-	doctypes = frappe.get_all("DocType", {"module": "Hub Node", "custom": 0}, pluck='name')
+	doctypes = frappe.get_all("DocType", {"module": "Hub Node", "custom": 0}, pluck="name")
 	for doctype in doctypes:
 		frappe.delete_doc("DocType", doctype, ignore_missing=True)
 
diff --git a/erpnext/patches/v14_0/delete_non_profit_doctypes.py b/erpnext/patches/v14_0/delete_non_profit_doctypes.py
index 565b10c..e9ea8b1 100644
--- a/erpnext/patches/v14_0/delete_non_profit_doctypes.py
+++ b/erpnext/patches/v14_0/delete_non_profit_doctypes.py
@@ -6,31 +6,33 @@
 
 	frappe.delete_doc("Workspace", "Non Profit", ignore_missing=True, force=True)
 
-	print_formats = frappe.get_all("Print Format", {"module": "Non Profit", "standard": "Yes"}, pluck='name')
+	print_formats = frappe.get_all(
+		"Print Format", {"module": "Non Profit", "standard": "Yes"}, pluck="name"
+	)
 	for print_format in print_formats:
 		frappe.delete_doc("Print Format", print_format, ignore_missing=True, force=True)
 
-	print_formats = ['80G Certificate for Membership', '80G Certificate for Donation']
+	print_formats = ["80G Certificate for Membership", "80G Certificate for Donation"]
 	for print_format in print_formats:
 		frappe.delete_doc("Print Format", print_format, ignore_missing=True, force=True)
 
-	reports = frappe.get_all("Report", {"module": "Non Profit", "is_standard": "Yes"}, pluck='name')
+	reports = frappe.get_all("Report", {"module": "Non Profit", "is_standard": "Yes"}, pluck="name")
 	for report in reports:
 		frappe.delete_doc("Report", report, ignore_missing=True, force=True)
 
-	dashboards = frappe.get_all("Dashboard", {"module": "Non Profit", "is_standard": 1}, pluck='name')
+	dashboards = frappe.get_all("Dashboard", {"module": "Non Profit", "is_standard": 1}, pluck="name")
 	for dashboard in dashboards:
 		frappe.delete_doc("Dashboard", dashboard, ignore_missing=True, force=True)
 
-	doctypes = frappe.get_all("DocType", {"module": "Non Profit", "custom": 0}, pluck='name')
+	doctypes = frappe.get_all("DocType", {"module": "Non Profit", "custom": 0}, pluck="name")
 	for doctype in doctypes:
 		frappe.delete_doc("DocType", doctype, ignore_missing=True)
 
-	doctypes = ['Tax Exemption 80G Certificate', 'Tax Exemption 80G Certificate Detail']
+	doctypes = ["Tax Exemption 80G Certificate", "Tax Exemption 80G Certificate Detail"]
 	for doctype in doctypes:
 		frappe.delete_doc("DocType", doctype, ignore_missing=True)
 
-	forms = ['grant-application', 'certification-application', 'certification-application-usd']
+	forms = ["grant-application", "certification-application", "certification-application-usd"]
 	for form in forms:
 		frappe.delete_doc("Web Form", form, ignore_missing=True, force=True)
 
@@ -40,24 +42,24 @@
 	]
 	for record in custom_records:
 		try:
-			frappe.delete_doc(record['doctype'], record['name'], ignore_missing=True)
+			frappe.delete_doc(record["doctype"], record["name"], ignore_missing=True)
 		except frappe.LinkExistsError:
 			pass
 
 	custom_fields = {
-		'Member': ['pan_number'],
-		'Donor': ['pan_number'],
-		'Company': [
-			'non_profit_section', 'company_80g_number', 'with_effect_from',
-			'non_profit_column_break', 'pan_details'
+		"Member": ["pan_number"],
+		"Donor": ["pan_number"],
+		"Company": [
+			"non_profit_section",
+			"company_80g_number",
+			"with_effect_from",
+			"non_profit_column_break",
+			"pan_details",
 		],
 	}
 
 	for doc, fields in custom_fields.items():
-		filters = {
-			'dt': doc,
-			'fieldname': ['in', fields]
-		}
-		records = frappe.get_all('Custom Field', filters=filters, pluck='name')
+		filters = {"dt": doc, "fieldname": ["in", fields]}
+		records = frappe.get_all("Custom Field", filters=filters, pluck="name")
 		for record in records:
-			frappe.delete_doc('Custom Field', record, ignore_missing=True, force=True)
+			frappe.delete_doc("Custom Field", record, ignore_missing=True, force=True)
diff --git a/erpnext/patches/v14_0/migrate_cost_center_allocations.py b/erpnext/patches/v14_0/migrate_cost_center_allocations.py
index c4f097f..3bd2693 100644
--- a/erpnext/patches/v14_0/migrate_cost_center_allocations.py
+++ b/erpnext/patches/v14_0/migrate_cost_center_allocations.py
@@ -4,13 +4,14 @@
 
 def execute():
 	for dt in ("cost_center_allocation", "cost_center_allocation_percentage"):
-		frappe.reload_doc('accounts', 'doctype', dt)
+		frappe.reload_doc("accounts", "doctype", dt)
 
 	cc_allocations = get_existing_cost_center_allocations()
 	if cc_allocations:
 		create_new_cost_center_allocation_records(cc_allocations)
 
-	frappe.delete_doc('DocType', 'Distributed Cost Center', ignore_missing=True)
+	frappe.delete_doc("DocType", "Distributed Cost Center", ignore_missing=True)
+
 
 def create_new_cost_center_allocation_records(cc_allocations):
 	for main_cc, allocations in cc_allocations.items():
@@ -19,13 +20,11 @@
 		cca.valid_from = today()
 
 		for child_cc, percentage in allocations.items():
-			cca.append("allocation_percentages", ({
-				"cost_center": child_cc,
-				"percentage": percentage
-			}))
+			cca.append("allocation_percentages", ({"cost_center": child_cc, "percentage": percentage}))
 		cca.save()
 		cca.submit()
 
+
 def get_existing_cost_center_allocations():
 	if not frappe.db.exists("DocType", "Distributed Cost Center"):
 		return
@@ -35,14 +34,16 @@
 
 	records = (
 		frappe.qb.from_(par)
-		.inner_join(child).on(par.name == child.parent)
+		.inner_join(child)
+		.on(par.name == child.parent)
 		.select(par.name, child.cost_center, child.percentage_allocation)
 		.where(par.enable_distributed_cost_center == 1)
 	).run(as_dict=True)
 
 	cc_allocations = frappe._dict()
 	for d in records:
-		cc_allocations.setdefault(d.name, frappe._dict())\
-			.setdefault(d.cost_center, d.percentage_allocation)
+		cc_allocations.setdefault(d.name, frappe._dict()).setdefault(
+			d.cost_center, d.percentage_allocation
+		)
 
-	return cc_allocations
\ No newline at end of file
+	return cc_allocations
diff --git a/erpnext/patches/v14_0/migrate_crm_settings.py b/erpnext/patches/v14_0/migrate_crm_settings.py
index 0c77853..696a100 100644
--- a/erpnext/patches/v14_0/migrate_crm_settings.py
+++ b/erpnext/patches/v14_0/migrate_crm_settings.py
@@ -2,16 +2,21 @@
 
 
 def execute():
-	settings = frappe.db.get_value('Selling Settings', 'Selling Settings', [
-		'campaign_naming_by',
-		'close_opportunity_after_days',
-		'default_valid_till'
-	], as_dict=True)
+	settings = frappe.db.get_value(
+		"Selling Settings",
+		"Selling Settings",
+		["campaign_naming_by", "close_opportunity_after_days", "default_valid_till"],
+		as_dict=True,
+	)
 
-	frappe.reload_doc('crm', 'doctype', 'crm_settings')
+	frappe.reload_doc("crm", "doctype", "crm_settings")
 	if settings:
-		frappe.db.set_value('CRM Settings', 'CRM Settings', {
-			'campaign_naming_by': settings.campaign_naming_by,
-			'close_opportunity_after_days': settings.close_opportunity_after_days,
-			'default_valid_till': settings.default_valid_till
-		})
+		frappe.db.set_value(
+			"CRM Settings",
+			"CRM Settings",
+			{
+				"campaign_naming_by": settings.campaign_naming_by,
+				"close_opportunity_after_days": settings.close_opportunity_after_days,
+				"default_valid_till": settings.default_valid_till,
+			},
+		)
diff --git a/erpnext/patches/v14_0/rearrange_company_fields.py b/erpnext/patches/v14_0/rearrange_company_fields.py
index fd7eb7f..d188a0c 100644
--- a/erpnext/patches/v14_0/rearrange_company_fields.py
+++ b/erpnext/patches/v14_0/rearrange_company_fields.py
@@ -3,25 +3,64 @@
 
 def execute():
 	custom_fields = {
-		'Company': [
-			dict(fieldname='hra_section', label='HRA Settings',
-				fieldtype='Section Break', insert_after='asset_received_but_not_billed', collapsible=1),
-			dict(fieldname='basic_component', label='Basic Component',
-				fieldtype='Link', options='Salary Component', insert_after='hra_section'),
-			dict(fieldname='hra_component', label='HRA Component',
-				fieldtype='Link', options='Salary Component', insert_after='basic_component'),
-			dict(fieldname='hra_column_break', fieldtype='Column Break', insert_after='hra_component'),
-			dict(fieldname='arrear_component', label='Arrear Component',
-				fieldtype='Link', options='Salary Component', insert_after='hra_column_break'),
-			dict(fieldname='non_profit_section', label='Non Profit Settings',
-				fieldtype='Section Break', insert_after='arrear_component', collapsible=1),
-			dict(fieldname='company_80g_number', label='80G Number',
-				fieldtype='Data', insert_after='non_profit_section'),
-			dict(fieldname='with_effect_from', label='80G With Effect From',
-				fieldtype='Date', insert_after='company_80g_number'),
-			dict(fieldname='non_profit_column_break', fieldtype='Column Break', insert_after='with_effect_from'),
-			dict(fieldname='pan_details', label='PAN Number',
-				fieldtype='Data', insert_after='non_profit_column_break')
+		"Company": [
+			dict(
+				fieldname="hra_section",
+				label="HRA Settings",
+				fieldtype="Section Break",
+				insert_after="asset_received_but_not_billed",
+				collapsible=1,
+			),
+			dict(
+				fieldname="basic_component",
+				label="Basic Component",
+				fieldtype="Link",
+				options="Salary Component",
+				insert_after="hra_section",
+			),
+			dict(
+				fieldname="hra_component",
+				label="HRA Component",
+				fieldtype="Link",
+				options="Salary Component",
+				insert_after="basic_component",
+			),
+			dict(fieldname="hra_column_break", fieldtype="Column Break", insert_after="hra_component"),
+			dict(
+				fieldname="arrear_component",
+				label="Arrear Component",
+				fieldtype="Link",
+				options="Salary Component",
+				insert_after="hra_column_break",
+			),
+			dict(
+				fieldname="non_profit_section",
+				label="Non Profit Settings",
+				fieldtype="Section Break",
+				insert_after="arrear_component",
+				collapsible=1,
+			),
+			dict(
+				fieldname="company_80g_number",
+				label="80G Number",
+				fieldtype="Data",
+				insert_after="non_profit_section",
+			),
+			dict(
+				fieldname="with_effect_from",
+				label="80G With Effect From",
+				fieldtype="Date",
+				insert_after="company_80g_number",
+			),
+			dict(
+				fieldname="non_profit_column_break", fieldtype="Column Break", insert_after="with_effect_from"
+			),
+			dict(
+				fieldname="pan_details",
+				label="PAN Number",
+				fieldtype="Data",
+				insert_after="non_profit_column_break",
+			),
 		]
 	}
 
diff --git a/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py b/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py
index 1cc5f38..2eb6bec 100644
--- a/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py
+++ b/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py
@@ -2,26 +2,20 @@
 
 
 def execute():
-	active_sla_documents = [sla.document_type for sla in frappe.get_all("Service Level Agreement", fields=["document_type"])]
+	active_sla_documents = [
+		sla.document_type for sla in frappe.get_all("Service Level Agreement", fields=["document_type"])
+	]
 
 	for doctype in active_sla_documents:
 		doctype = frappe.qb.DocType(doctype)
 		try:
-			frappe.qb.update(
-				doctype
-			).set(
-				doctype.agreement_status, 'First Response Due'
-			).where(
+			frappe.qb.update(doctype).set(doctype.agreement_status, "First Response Due").where(
 				doctype.first_responded_on.isnull()
 			).run()
 
-			frappe.qb.update(
-				doctype
-			).set(
-				doctype.agreement_status, 'Resolution Due'
-			).where(
-				doctype.agreement_status == 'Ongoing'
+			frappe.qb.update(doctype).set(doctype.agreement_status, "Resolution Due").where(
+				doctype.agreement_status == "Ongoing"
 			).run()
 
 		except Exception:
-			frappe.log_error(title='Failed to Patch SLA Status')
\ No newline at end of file
+			frappe.log_error(title="Failed to Patch SLA Status")
diff --git a/erpnext/patches/v14_0/restore_einvoice_fields.py b/erpnext/patches/v14_0/restore_einvoice_fields.py
index c4431fb..8c7627c 100644
--- a/erpnext/patches/v14_0/restore_einvoice_fields.py
+++ b/erpnext/patches/v14_0/restore_einvoice_fields.py
@@ -6,17 +6,34 @@
 
 def execute():
 	# restores back the 2 custom fields that was deleted while removing e-invoicing from v14
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
 	custom_fields = {
-		'Sales Invoice': [
-			dict(fieldname='irn_cancelled', label='IRN Cancelled', fieldtype='Check', no_copy=1, print_hide=1,
-				depends_on='eval:(doc.irn_cancelled === 1)', read_only=1, allow_on_submit=1, insert_after='customer'),
-
-			dict(fieldname='eway_bill_cancelled', label='E-Way Bill Cancelled', fieldtype='Check', no_copy=1, print_hide=1,
-				depends_on='eval:(doc.eway_bill_cancelled === 1)', read_only=1, allow_on_submit=1, insert_after='customer'),
+		"Sales Invoice": [
+			dict(
+				fieldname="irn_cancelled",
+				label="IRN Cancelled",
+				fieldtype="Check",
+				no_copy=1,
+				print_hide=1,
+				depends_on="eval:(doc.irn_cancelled === 1)",
+				read_only=1,
+				allow_on_submit=1,
+				insert_after="customer",
+			),
+			dict(
+				fieldname="eway_bill_cancelled",
+				label="E-Way Bill Cancelled",
+				fieldtype="Check",
+				no_copy=1,
+				print_hide=1,
+				depends_on="eval:(doc.eway_bill_cancelled === 1)",
+				read_only=1,
+				allow_on_submit=1,
+				insert_after="customer",
+			),
 		]
 	}
 	create_custom_fields(custom_fields, update=True)
diff --git a/erpnext/patches/v14_0/set_payroll_cost_centers.py b/erpnext/patches/v14_0/set_payroll_cost_centers.py
index 89b305b..0951e39 100644
--- a/erpnext/patches/v14_0/set_payroll_cost_centers.py
+++ b/erpnext/patches/v14_0/set_payroll_cost_centers.py
@@ -2,8 +2,8 @@
 
 
 def execute():
-	frappe.reload_doc('payroll', 'doctype', 'employee_cost_center')
-	frappe.reload_doc('payroll', 'doctype', 'salary_structure_assignment')
+	frappe.reload_doc("payroll", "doctype", "employee_cost_center")
+	frappe.reload_doc("payroll", "doctype", "salary_structure_assignment")
 
 	employees = frappe.get_all("Employee", fields=["department", "payroll_cost_center", "name"])
 
@@ -16,17 +16,14 @@
 		if cost_center:
 			employee_cost_center.setdefault(d.name, cost_center)
 
-	salary_structure_assignments = frappe.get_all("Salary Structure Assignment",
-		filters = {"docstatus": ["!=", 2]},
-		fields=["name", "employee"])
+	salary_structure_assignments = frappe.get_all(
+		"Salary Structure Assignment", filters={"docstatus": ["!=", 2]}, fields=["name", "employee"]
+	)
 
 	for d in salary_structure_assignments:
 		cost_center = employee_cost_center.get(d.employee)
 		if cost_center:
 			assignment = frappe.get_doc("Salary Structure Assignment", d.name)
 			if not assignment.get("payroll_cost_centers"):
-				assignment.append("payroll_cost_centers", {
-					"cost_center": cost_center,
-					"percentage": 100
-				})
-				assignment.save()
\ No newline at end of file
+				assignment.append("payroll_cost_centers", {"cost_center": cost_center, "percentage": 100})
+				assignment.save()
diff --git a/erpnext/patches/v14_0/update_employee_advance_status.py b/erpnext/patches/v14_0/update_employee_advance_status.py
index a20e35a..fc9e05e 100644
--- a/erpnext/patches/v14_0/update_employee_advance_status.py
+++ b/erpnext/patches/v14_0/update_employee_advance_status.py
@@ -2,25 +2,28 @@
 
 
 def execute():
-	frappe.reload_doc('hr', 'doctype', 'employee_advance')
+	frappe.reload_doc("hr", "doctype", "employee_advance")
 
-	advance = frappe.qb.DocType('Employee Advance')
-	(frappe.qb
-		.update(advance)
-		.set(advance.status, 'Returned')
+	advance = frappe.qb.DocType("Employee Advance")
+	(
+		frappe.qb.update(advance)
+		.set(advance.status, "Returned")
 		.where(
 			(advance.docstatus == 1)
 			& ((advance.return_amount) & (advance.paid_amount == advance.return_amount))
-			& (advance.status == 'Paid')
+			& (advance.status == "Paid")
 		)
 	).run()
 
-	(frappe.qb
-		.update(advance)
-		.set(advance.status, 'Partly Claimed and Returned')
+	(
+		frappe.qb.update(advance)
+		.set(advance.status, "Partly Claimed and Returned")
 		.where(
 			(advance.docstatus == 1)
-			& ((advance.claimed_amount & advance.return_amount) & (advance.paid_amount == (advance.return_amount + advance.claimed_amount)))
-			& (advance.status == 'Paid')
+			& (
+				(advance.claimed_amount & advance.return_amount)
+				& (advance.paid_amount == (advance.return_amount + advance.claimed_amount))
+			)
+			& (advance.status == "Paid")
 		)
-	).run()
\ No newline at end of file
+	).run()
diff --git a/erpnext/patches/v14_0/update_leave_notification_template.py b/erpnext/patches/v14_0/update_leave_notification_template.py
index e744054..aec5f8b 100644
--- a/erpnext/patches/v14_0/update_leave_notification_template.py
+++ b/erpnext/patches/v14_0/update_leave_notification_template.py
@@ -6,7 +6,9 @@
 
 def execute():
 	base_path = frappe.get_app_path("erpnext", "hr", "doctype")
-	response = frappe.read_file(os.path.join(base_path, "leave_application/leave_application_email_template.html"))
+	response = frappe.read_file(
+		os.path.join(base_path, "leave_application/leave_application_email_template.html")
+	)
 
 	template = frappe.db.exists("Email Template", _("Leave Approval Notification"))
 	if template:
diff --git a/erpnext/patches/v14_0/update_opportunity_currency_fields.py b/erpnext/patches/v14_0/update_opportunity_currency_fields.py
index 0d11c7a..076de52 100644
--- a/erpnext/patches/v14_0/update_opportunity_currency_fields.py
+++ b/erpnext/patches/v14_0/update_opportunity_currency_fields.py
@@ -7,9 +7,11 @@
 
 def execute():
 	frappe.reload_doctype("Opportunity")
-	opportunities = frappe.db.get_list('Opportunity', filters={
-		'opportunity_amount': ['>', 0]
-	}, fields=['name', 'company', 'currency', 'opportunity_amount'])
+	opportunities = frappe.db.get_list(
+		"Opportunity",
+		filters={"opportunity_amount": [">", 0]},
+		fields=["name", "company", "currency", "opportunity_amount"],
+	)
 
 	for opportunity in opportunities:
 		company_currency = erpnext.get_company_currency(opportunity.company)
@@ -22,7 +24,9 @@
 			conversion_rate = 1
 			base_opportunity_amount = flt(opportunity.opportunity_amount)
 
-		frappe.db.set_value('Opportunity', opportunity.name, {
-			'conversion_rate': conversion_rate,
-			'base_opportunity_amount': base_opportunity_amount
-		}, update_modified=False)
+		frappe.db.set_value(
+			"Opportunity",
+			opportunity.name,
+			{"conversion_rate": conversion_rate, "base_opportunity_amount": base_opportunity_amount},
+			update_modified=False,
+		)
diff --git a/erpnext/patches/v4_2/repost_reserved_qty.py b/erpnext/patches/v4_2/repost_reserved_qty.py
index ed4b19d..72ac524 100644
--- a/erpnext/patches/v4_2/repost_reserved_qty.py
+++ b/erpnext/patches/v4_2/repost_reserved_qty.py
@@ -11,7 +11,8 @@
 	for doctype in ("Sales Order Item", "Bin"):
 		frappe.reload_doctype(doctype)
 
-	repost_for = frappe.db.sql("""
+	repost_for = frappe.db.sql(
+		"""
 		select
 			distinct item_code, warehouse
 		from
@@ -26,17 +27,18 @@
 			) so_item
 		where
 			exists(select name from tabItem where name=so_item.item_code and ifnull(is_stock_item, 0)=1)
-	""")
+	"""
+	)
 
 	for item_code, warehouse in repost_for:
 		if not (item_code and warehouse):
 			continue
-		update_bin_qty(item_code, warehouse, {
-			"reserved_qty": get_reserved_qty(item_code, warehouse)
-		})
+		update_bin_qty(item_code, warehouse, {"reserved_qty": get_reserved_qty(item_code, warehouse)})
 
-	frappe.db.sql("""delete from tabBin
+	frappe.db.sql(
+		"""delete from tabBin
 		where exists(
 			select name from tabItem where name=tabBin.item_code and ifnull(is_stock_item, 0) = 0
 		)
-	""")
+	"""
+	)
diff --git a/erpnext/patches/v4_2/update_requested_and_ordered_qty.py b/erpnext/patches/v4_2/update_requested_and_ordered_qty.py
index dd79410..8ebc649 100644
--- a/erpnext/patches/v4_2/update_requested_and_ordered_qty.py
+++ b/erpnext/patches/v4_2/update_requested_and_ordered_qty.py
@@ -8,20 +8,26 @@
 def execute():
 	from erpnext.stock.stock_balance import get_indented_qty, get_ordered_qty, update_bin_qty
 
-	count=0
-	for item_code, warehouse in frappe.db.sql("""select distinct item_code, warehouse from
+	count = 0
+	for item_code, warehouse in frappe.db.sql(
+		"""select distinct item_code, warehouse from
 		(select item_code, warehouse from tabBin
 		union
-		select item_code, warehouse from `tabStock Ledger Entry`) a"""):
-			try:
-				if not (item_code and warehouse):
-					continue
-				count += 1
-				update_bin_qty(item_code, warehouse, {
+		select item_code, warehouse from `tabStock Ledger Entry`) a"""
+	):
+		try:
+			if not (item_code and warehouse):
+				continue
+			count += 1
+			update_bin_qty(
+				item_code,
+				warehouse,
+				{
 					"indented_qty": get_indented_qty(item_code, warehouse),
-					"ordered_qty": get_ordered_qty(item_code, warehouse)
-				})
-				if count % 200 == 0:
-					frappe.db.commit()
-			except Exception:
-				frappe.db.rollback()
+					"ordered_qty": get_ordered_qty(item_code, warehouse),
+				},
+			)
+			if count % 200 == 0:
+				frappe.db.commit()
+		except Exception:
+			frappe.db.rollback()
diff --git a/erpnext/patches/v5_7/update_item_description_based_on_item_master.py b/erpnext/patches/v5_7/update_item_description_based_on_item_master.py
index c46187c..edb0eaa 100644
--- a/erpnext/patches/v5_7/update_item_description_based_on_item_master.py
+++ b/erpnext/patches/v5_7/update_item_description_based_on_item_master.py
@@ -2,12 +2,16 @@
 
 
 def execute():
-	name = frappe.db.sql(""" select name from `tabPatch Log` \
+	name = frappe.db.sql(
+		""" select name from `tabPatch Log` \
 		where \
-			patch like 'execute:frappe.db.sql("update `tabProduction Order` pro set description%' """)
+			patch like 'execute:frappe.db.sql("update `tabProduction Order` pro set description%' """
+	)
 	if not name:
-		frappe.db.sql("update `tabProduction Order` pro \
+		frappe.db.sql(
+			"update `tabProduction Order` pro \
 			set \
 				description = (select description from tabItem where name=pro.production_item) \
 			where \
-				ifnull(description, '') = ''")
+				ifnull(description, '') = ''"
+		)
diff --git a/erpnext/patches/v8_1/removed_roles_from_gst_report_non_indian_account.py b/erpnext/patches/v8_1/removed_roles_from_gst_report_non_indian_account.py
index ed1dffe..a810874 100644
--- a/erpnext/patches/v8_1/removed_roles_from_gst_report_non_indian_account.py
+++ b/erpnext/patches/v8_1/removed_roles_from_gst_report_non_indian_account.py
@@ -6,14 +6,16 @@
 
 
 def execute():
-	frappe.reload_doc('core', 'doctype', 'has_role')
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	frappe.reload_doc("core", "doctype", "has_role")
+	company = frappe.get_all("Company", filters={"country": "India"})
 
 	if not company:
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			delete from
 				`tabHas Role`
 			where
 				parenttype = 'Report' and parent in('GST Sales Register',
 					'GST Purchase Register', 'GST Itemised Sales Register',
-					'GST Itemised Purchase Register', 'Eway Bill')""")
+					'GST Itemised Purchase Register', 'Eway Bill')"""
+		)
diff --git a/erpnext/patches/v8_1/setup_gst_india.py b/erpnext/patches/v8_1/setup_gst_india.py
index ff9e6a4..b034398 100644
--- a/erpnext/patches/v8_1/setup_gst_india.py
+++ b/erpnext/patches/v8_1/setup_gst_india.py
@@ -3,34 +3,43 @@
 
 
 def execute():
-	frappe.reload_doc('stock', 'doctype', 'item')
+	frappe.reload_doc("stock", "doctype", "item")
 	frappe.reload_doc("stock", "doctype", "customs_tariff_number")
 	frappe.reload_doc("accounts", "doctype", "payment_terms_template")
 	frappe.reload_doc("accounts", "doctype", "payment_schedule")
 
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	frappe.reload_doc('regional', 'doctype', 'gst_settings')
-	frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
+	frappe.reload_doc("regional", "doctype", "gst_settings")
+	frappe.reload_doc("regional", "doctype", "gst_hsn_code")
 
-	for report_name in ('GST Sales Register', 'GST Purchase Register',
-		'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
+	for report_name in (
+		"GST Sales Register",
+		"GST Purchase Register",
+		"GST Itemised Sales Register",
+		"GST Itemised Purchase Register",
+	):
 
-		frappe.reload_doc('regional', 'report', frappe.scrub(report_name))
+		frappe.reload_doc("regional", "report", frappe.scrub(report_name))
 
 	from erpnext.regional.india.setup import setup
+
 	delete_custom_field_tax_id_if_exists()
 	setup(patch=True)
 	send_gst_update_email()
 
+
 def delete_custom_field_tax_id_if_exists():
-	for field in frappe.db.sql_list("""select name from `tabCustom Field` where fieldname='tax_id'
-		and dt in ('Sales Order', 'Sales Invoice', 'Delivery Note')"""):
+	for field in frappe.db.sql_list(
+		"""select name from `tabCustom Field` where fieldname='tax_id'
+		and dt in ('Sales Order', 'Sales Invoice', 'Delivery Note')"""
+	):
 		frappe.delete_doc("Custom Field", field, ignore_permissions=True)
 		frappe.db.commit()
 
+
 def send_gst_update_email():
 	message = """Hello,
 
@@ -45,7 +54,9 @@
 
 <p>Thanks,</p>
 ERPNext Team.
-	""".format(gst_document_link="<a href='http://frappe.github.io/erpnext/user/manual/en/regional/india/'> ERPNext GST Document </a>")
+	""".format(
+		gst_document_link="<a href='http://frappe.github.io/erpnext/user/manual/en/regional/india/'> ERPNext GST Document </a>"
+	)
 
 	try:
 		sendmail_to_system_managers("[Important] ERPNext GST updates", message)
diff --git a/erpnext/patches/v8_7/sync_india_custom_fields.py b/erpnext/patches/v8_7/sync_india_custom_fields.py
index 808c833..e1b9a73 100644
--- a/erpnext/patches/v8_7/sync_india_custom_fields.py
+++ b/erpnext/patches/v8_7/sync_india_custom_fields.py
@@ -4,32 +4,39 @@
 
 
 def execute():
-	company = frappe.get_all('Company', filters = {'country': 'India'})
+	company = frappe.get_all("Company", filters={"country": "India"})
 	if not company:
 		return
 
-	frappe.reload_doc('Payroll', 'doctype', 'payroll_period')
-	frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_declaration')
-	frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_proof_submission')
-	frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_declaration_category')
-	frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_proof_submission_detail')
+	frappe.reload_doc("Payroll", "doctype", "payroll_period")
+	frappe.reload_doc("Payroll", "doctype", "employee_tax_exemption_declaration")
+	frappe.reload_doc("Payroll", "doctype", "employee_tax_exemption_proof_submission")
+	frappe.reload_doc("Payroll", "doctype", "employee_tax_exemption_declaration_category")
+	frappe.reload_doc("Payroll", "doctype", "employee_tax_exemption_proof_submission_detail")
 
-	frappe.reload_doc('accounts', 'doctype', 'tax_category')
+	frappe.reload_doc("accounts", "doctype", "tax_category")
 
 	for doctype in ["Sales Invoice", "Delivery Note", "Purchase Invoice"]:
-		frappe.db.sql("""delete from `tabCustom Field` where dt = %s
-			and fieldname in ('port_code', 'shipping_bill_number', 'shipping_bill_date')""", doctype)
+		frappe.db.sql(
+			"""delete from `tabCustom Field` where dt = %s
+			and fieldname in ('port_code', 'shipping_bill_number', 'shipping_bill_date')""",
+			doctype,
+		)
 
 	make_custom_fields()
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update `tabCustom Field`
 		set reqd = 0, `default` = ''
 		where fieldname = 'reason_for_issuing_document'
-	""")
+	"""
+	)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update tabAddress
 		set gst_state_number=concat("0", gst_state_number)
 		where ifnull(gst_state_number, '') != '' and gst_state_number<10
-	""")
+	"""
+	)
diff --git a/erpnext/payroll/doctype/additional_salary/additional_salary.py b/erpnext/payroll/doctype/additional_salary/additional_salary.py
index d618568..256a3b5 100644
--- a/erpnext/payroll/doctype/additional_salary/additional_salary.py
+++ b/erpnext/payroll/doctype/additional_salary/additional_salary.py
@@ -30,12 +30,17 @@
 			frappe.throw(_("Amount should not be less than zero"))
 
 	def validate_salary_structure(self):
-		if not frappe.db.exists('Salary Structure Assignment', {'employee': self.employee}):
-			frappe.throw(_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(self.employee))
+		if not frappe.db.exists("Salary Structure Assignment", {"employee": self.employee}):
+			frappe.throw(
+				_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(
+					self.employee
+				)
+			)
 
 	def validate_recurring_additional_salary_overlap(self):
 		if self.is_recurring:
-			additional_salaries = frappe.db.sql("""
+			additional_salaries = frappe.db.sql(
+				"""
 				SELECT
 					name
 				FROM `tabAdditional Salary`
@@ -47,22 +52,28 @@
 					AND salary_component = %s
 					AND to_date >= %s
 					AND from_date <= %s""",
-				(self.employee, self.name, self.salary_component, self.from_date, self.to_date), as_dict = 1)
+				(self.employee, self.name, self.salary_component, self.from_date, self.to_date),
+				as_dict=1,
+			)
 
 			additional_salaries = [salary.name for salary in additional_salaries]
 
 			if additional_salaries and len(additional_salaries):
-				frappe.throw(_("Additional Salary: {0} already exist for Salary Component: {1} for period {2} and {3}").format(
-					bold(comma_and(additional_salaries)),
-					bold(self.salary_component),
-					bold(formatdate(self.from_date)),
-					bold(formatdate(self.to_date)
-				)))
-
+				frappe.throw(
+					_(
+						"Additional Salary: {0} already exist for Salary Component: {1} for period {2} and {3}"
+					).format(
+						bold(comma_and(additional_salaries)),
+						bold(self.salary_component),
+						bold(formatdate(self.from_date)),
+						bold(formatdate(self.to_date)),
+					)
+				)
 
 	def validate_dates(self):
-		date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee,
-			["date_of_joining", "relieving_date"])
+		date_of_joining, relieving_date = frappe.db.get_value(
+			"Employee", self.employee, ["date_of_joining", "relieving_date"]
+		)
 
 		if getdate(self.from_date) > getdate(self.to_date):
 			frappe.throw(_("From Date can not be greater than To Date."))
@@ -81,19 +92,27 @@
 
 	def validate_employee_referral(self):
 		if self.ref_doctype == "Employee Referral":
-			referral_details = frappe.db.get_value("Employee Referral", self.ref_docname,
-				["is_applicable_for_referral_bonus", "status"], as_dict=1)
+			referral_details = frappe.db.get_value(
+				"Employee Referral",
+				self.ref_docname,
+				["is_applicable_for_referral_bonus", "status"],
+				as_dict=1,
+			)
 
 			if not referral_details.is_applicable_for_referral_bonus:
-				frappe.throw(_("Employee Referral {0} is not applicable for referral bonus.").format(
-					self.ref_docname))
+				frappe.throw(
+					_("Employee Referral {0} is not applicable for referral bonus.").format(self.ref_docname)
+				)
 
 			if self.type == "Deduction":
 				frappe.throw(_("Earning Salary Component is required for Employee Referral Bonus."))
 
 			if referral_details.status != "Accepted":
-				frappe.throw(_("Additional Salary for referral bonus can only be created against Employee Referral with status {0}").format(
-					frappe.bold("Accepted")))
+				frappe.throw(
+					_(
+						"Additional Salary for referral bonus can only be created against Employee Referral with status {0}"
+					).format(frappe.bold("Accepted"))
+				)
 
 	def update_return_amount_in_employee_advance(self):
 		if self.ref_doctype == "Employee Advance" and self.ref_docname:
@@ -125,28 +144,37 @@
 		no_of_days = date_diff(getdate(end_date), getdate(start_date)) + 1
 		return amount_per_day * no_of_days
 
+
 @frappe.whitelist()
 def get_additional_salaries(employee, start_date, end_date, component_type):
-	comp_type = 'Earning' if component_type == 'earnings' else 'Deduction'
+	comp_type = "Earning" if component_type == "earnings" else "Deduction"
 
-	additional_sal = frappe.qb.DocType('Additional Salary')
-	component_field = additional_sal.salary_component.as_('component')
-	overwrite_field = additional_sal.overwrite_salary_structure_amount.as_('overwrite')
+	additional_sal = frappe.qb.DocType("Additional Salary")
+	component_field = additional_sal.salary_component.as_("component")
+	overwrite_field = additional_sal.overwrite_salary_structure_amount.as_("overwrite")
 
-	additional_salary_list = frappe.qb.from_(
-		additional_sal
-	).select(
-		additional_sal.name, component_field, additional_sal.type,
-		additional_sal.amount, additional_sal.is_recurring, overwrite_field,
-		additional_sal.deduct_full_tax_on_selected_payroll_date
-	).where(
-		(additional_sal.employee == employee)
-		& (additional_sal.docstatus == 1)
-		& (additional_sal.type == comp_type)
-	).where(
-		additional_sal.payroll_date[start_date: end_date]
-		| ((additional_sal.from_date <= end_date) & (additional_sal.to_date >= end_date))
-	).run(as_dict=True)
+	additional_salary_list = (
+		frappe.qb.from_(additional_sal)
+		.select(
+			additional_sal.name,
+			component_field,
+			additional_sal.type,
+			additional_sal.amount,
+			additional_sal.is_recurring,
+			overwrite_field,
+			additional_sal.deduct_full_tax_on_selected_payroll_date,
+		)
+		.where(
+			(additional_sal.employee == employee)
+			& (additional_sal.docstatus == 1)
+			& (additional_sal.type == comp_type)
+		)
+		.where(
+			additional_sal.payroll_date[start_date:end_date]
+			| ((additional_sal.from_date <= end_date) & (additional_sal.to_date >= end_date))
+		)
+		.run(as_dict=True)
+	)
 
 	additional_salaries = []
 	components_to_overwrite = []
@@ -154,8 +182,12 @@
 	for d in additional_salary_list:
 		if d.overwrite:
 			if d.component in components_to_overwrite:
-				frappe.throw(_("Multiple Additional Salaries with overwrite property exist for Salary Component {0} between {1} and {2}.").format(
-					frappe.bold(d.component), start_date, end_date), title=_("Error"))
+				frappe.throw(
+					_(
+						"Multiple Additional Salaries with overwrite property exist for Salary Component {0} between {1} and {2}."
+					).format(frappe.bold(d.component), start_date, end_date),
+					title=_("Error"),
+				)
 
 			components_to_overwrite.append(d.component)
 
diff --git a/erpnext/payroll/doctype/additional_salary/test_additional_salary.py b/erpnext/payroll/doctype/additional_salary/test_additional_salary.py
index 84de912..7d5d9e0 100644
--- a/erpnext/payroll/doctype/additional_salary/test_additional_salary.py
+++ b/erpnext/payroll/doctype/additional_salary/test_additional_salary.py
@@ -17,12 +17,16 @@
 
 
 class TestAdditionalSalary(unittest.TestCase):
-
 	def setUp(self):
 		setup_test()
 
 	def tearDown(self):
-		for dt in ["Salary Slip", "Additional Salary", "Salary Structure Assignment", "Salary Structure"]:
+		for dt in [
+			"Salary Slip",
+			"Additional Salary",
+			"Salary Structure Assignment",
+			"Salary Structure",
+		]:
 			frappe.db.sql("delete from `tab%s`" % dt)
 
 	def test_recurring_additional_salary(self):
@@ -30,10 +34,14 @@
 		salary_component = None
 		emp_id = make_employee("test_additional@salary.com")
 		frappe.db.set_value("Employee", emp_id, "relieving_date", add_days(nowdate(), 1800))
-		salary_structure = make_salary_structure("Test Salary Structure Additional Salary", "Monthly", employee=emp_id)
+		salary_structure = make_salary_structure(
+			"Test Salary Structure Additional Salary", "Monthly", employee=emp_id
+		)
 		add_sal = get_additional_salary(emp_id)
 
-		ss = make_employee_salary_slip("test_additional@salary.com", "Monthly", salary_structure=salary_structure.name)
+		ss = make_employee_salary_slip(
+			"test_additional@salary.com", "Monthly", salary_structure=salary_structure.name
+		)
 		for earning in ss.earnings:
 			if earning.salary_component == "Recurring Salary Component":
 				amount = earning.amount
@@ -42,6 +50,7 @@
 		self.assertEqual(amount, add_sal.amount)
 		self.assertEqual(salary_component, add_sal.salary_component)
 
+
 def get_additional_salary(emp_id):
 	create_salary_component("Recurring Salary Component")
 	add_sal = frappe.new_doc("Additional Salary")
diff --git a/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py
index eda5015..0acd447 100644
--- a/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py
+++ b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py
@@ -34,19 +34,30 @@
 			if self.remaining_benefit > 0:
 				self.validate_remaining_benefit_amount()
 		else:
-			frappe.throw(_("As per your assigned Salary Structure you cannot apply for benefits").format(self.employee))
+			frappe.throw(
+				_("As per your assigned Salary Structure you cannot apply for benefits").format(self.employee)
+			)
 
 	def validate_prev_benefit_claim(self):
 		if self.employee_benefits:
 			for benefit in self.employee_benefits:
 				if benefit.pay_against_benefit_claim == 1:
 					payroll_period = frappe.get_doc("Payroll Period", self.payroll_period)
-					benefit_claimed = get_previous_claimed_amount(self.employee, payroll_period, component = benefit.earning_component)
-					benefit_given = get_sal_slip_total_benefit_given(self.employee, payroll_period, component = benefit.earning_component)
+					benefit_claimed = get_previous_claimed_amount(
+						self.employee, payroll_period, component=benefit.earning_component
+					)
+					benefit_given = get_sal_slip_total_benefit_given(
+						self.employee, payroll_period, component=benefit.earning_component
+					)
 					benefit_claim_remining = benefit_claimed - benefit_given
 					if benefit_claimed > 0 and benefit_claim_remining > benefit.amount:
-						frappe.throw(_("An amount of {0} already claimed for the component {1}, set the amount equal or greater than {2}").format(
-							benefit_claimed, benefit.earning_component, benefit_claim_remining))
+						frappe.throw(
+							_(
+								"An amount of {0} already claimed for the component {1}, set the amount equal or greater than {2}"
+							).format(
+								benefit_claimed, benefit.earning_component, benefit_claim_remining
+							)
+						)
 
 	def validate_remaining_benefit_amount(self):
 		# check salary structure earnings have flexi component (sum of max_benefit_amount)
@@ -65,20 +76,34 @@
 			if salary_structure.earnings:
 				for earnings in salary_structure.earnings:
 					if earnings.is_flexible_benefit == 1 and earnings.salary_component not in benefit_components:
-						pay_against_benefit_claim, max_benefit_amount = frappe.db.get_value("Salary Component", earnings.salary_component, ["pay_against_benefit_claim", "max_benefit_amount"])
+						pay_against_benefit_claim, max_benefit_amount = frappe.db.get_value(
+							"Salary Component",
+							earnings.salary_component,
+							["pay_against_benefit_claim", "max_benefit_amount"],
+						)
 						if pay_against_benefit_claim != 1:
 							pro_rata_amount += max_benefit_amount
 						else:
 							non_pro_rata_amount += max_benefit_amount
 
-			if pro_rata_amount == 0  and non_pro_rata_amount == 0:
-				frappe.throw(_("Please add the remaining benefits {0} to any of the existing component").format(self.remaining_benefit))
+			if pro_rata_amount == 0 and non_pro_rata_amount == 0:
+				frappe.throw(
+					_("Please add the remaining benefits {0} to any of the existing component").format(
+						self.remaining_benefit
+					)
+				)
 			elif non_pro_rata_amount > 0 and non_pro_rata_amount < rounded(self.remaining_benefit):
-				frappe.throw(_("You can claim only an amount of {0}, the rest amount {1} should be in the application as pro-rata component").format(
-					non_pro_rata_amount, self.remaining_benefit - non_pro_rata_amount))
+				frappe.throw(
+					_(
+						"You can claim only an amount of {0}, the rest amount {1} should be in the application as pro-rata component"
+					).format(non_pro_rata_amount, self.remaining_benefit - non_pro_rata_amount)
+				)
 			elif non_pro_rata_amount == 0:
-				frappe.throw(_("Please add the remaining benefits {0} to the application as pro-rata component").format(
-					self.remaining_benefit))
+				frappe.throw(
+					_("Please add the remaining benefits {0} to the application as pro-rata component").format(
+						self.remaining_benefit
+					)
+				)
 
 	def validate_max_benefit_for_component(self):
 		if self.employee_benefits:
@@ -87,30 +112,43 @@
 				self.validate_max_benefit(employee_benefit.earning_component)
 				max_benefit_amount += employee_benefit.amount
 			if max_benefit_amount > self.max_benefits:
-				frappe.throw(_("Maximum benefit amount of employee {0} exceeds {1}").format(self.employee, self.max_benefits))
+				frappe.throw(
+					_("Maximum benefit amount of employee {0} exceeds {1}").format(
+						self.employee, self.max_benefits
+					)
+				)
 
 	def validate_max_benefit(self, earning_component_name):
-		max_benefit_amount = frappe.db.get_value("Salary Component", earning_component_name, "max_benefit_amount")
+		max_benefit_amount = frappe.db.get_value(
+			"Salary Component", earning_component_name, "max_benefit_amount"
+		)
 		benefit_amount = 0
 		for employee_benefit in self.employee_benefits:
 			if employee_benefit.earning_component == earning_component_name:
 				benefit_amount += employee_benefit.amount
-		prev_sal_slip_flexi_amount = get_sal_slip_total_benefit_given(self.employee, frappe.get_doc("Payroll Period", self.payroll_period), earning_component_name)
+		prev_sal_slip_flexi_amount = get_sal_slip_total_benefit_given(
+			self.employee, frappe.get_doc("Payroll Period", self.payroll_period), earning_component_name
+		)
 		benefit_amount += prev_sal_slip_flexi_amount
 		if rounded(benefit_amount, 2) > max_benefit_amount:
-			frappe.throw(_("Maximum benefit amount of component {0} exceeds {1}").format(earning_component_name, max_benefit_amount))
+			frappe.throw(
+				_("Maximum benefit amount of component {0} exceeds {1}").format(
+					earning_component_name, max_benefit_amount
+				)
+			)
 
 	def validate_duplicate_on_payroll_period(self):
 		application = frappe.db.exists(
 			"Employee Benefit Application",
-			{
-				'employee': self.employee,
-				'payroll_period': self.payroll_period,
-				'docstatus': 1
-			}
+			{"employee": self.employee, "payroll_period": self.payroll_period, "docstatus": 1},
 		)
 		if application:
-			frappe.throw(_("Employee {0} already submited an apllication {1} for the payroll period {2}").format(self.employee, application, self.payroll_period))
+			frappe.throw(
+				_("Employee {0} already submited an apllication {1} for the payroll period {2}").format(
+					self.employee, application, self.payroll_period
+				)
+			)
+
 
 @frappe.whitelist()
 def get_max_benefits(employee, on_date):
@@ -121,6 +159,7 @@
 			return max_benefits
 	return False
 
+
 @frappe.whitelist()
 def get_max_benefits_remaining(employee, on_date, payroll_period):
 	max_benefits = get_max_benefits(employee, on_date)
@@ -141,9 +180,14 @@
 				sal_struct = frappe.get_doc("Salary Structure", sal_struct_name)
 				for sal_struct_row in sal_struct.get("earnings"):
 					salary_component = frappe.get_doc("Salary Component", sal_struct_row.salary_component)
-					if salary_component.depends_on_payment_days == 1 and salary_component.pay_against_benefit_claim != 1:
+					if (
+						salary_component.depends_on_payment_days == 1
+						and salary_component.pay_against_benefit_claim != 1
+					):
 						have_depends_on_payment_days = True
-						benefit_amount = get_benefit_amount_based_on_pro_rata(sal_struct, salary_component.max_benefit_amount)
+						benefit_amount = get_benefit_amount_based_on_pro_rata(
+							sal_struct, salary_component.max_benefit_amount
+						)
 						amount_per_day = benefit_amount / payroll_period_days
 						per_day_amount_total += amount_per_day
 
@@ -159,12 +203,14 @@
 			return max_benefits - prev_sal_slip_flexi_total
 	return max_benefits
 
+
 def calculate_lwp(employee, start_date, holidays, working_days):
 	lwp = 0
 	holidays = "','".join(holidays)
 	for d in range(working_days):
 		dt = add_days(cstr(getdate(start_date)), d)
-		leave = frappe.db.sql("""
+		leave = frappe.db.sql(
+			"""
 			select t1.name, t1.half_day
 			from `tabLeave Application` t1, `tabLeave Type` t2
 			where t2.name = t1.leave_type
@@ -174,56 +220,77 @@
 			and CASE WHEN t2.include_holiday != 1 THEN %(dt)s not in ('{0}') and %(dt)s between from_date and to_date
 			WHEN t2.include_holiday THEN %(dt)s between from_date and to_date
 			END
-			""".format(holidays), {"employee": employee, "dt": dt})
+			""".format(
+				holidays
+			),
+			{"employee": employee, "dt": dt},
+		)
 		if leave:
 			lwp = cint(leave[0][1]) and (lwp + 0.5) or (lwp + 1)
 	return lwp
 
-def get_benefit_component_amount(employee, start_date, end_date, salary_component, sal_struct, payroll_frequency, payroll_period):
+
+def get_benefit_component_amount(
+	employee, start_date, end_date, salary_component, sal_struct, payroll_frequency, payroll_period
+):
 	if not payroll_period:
-		frappe.msgprint(_("Start and end dates not in a valid Payroll Period, cannot calculate {0}")
-			.format(salary_component))
+		frappe.msgprint(
+			_("Start and end dates not in a valid Payroll Period, cannot calculate {0}").format(
+				salary_component
+			)
+		)
 		return False
 
 	# Considering there is only one application for a year
-	benefit_application = frappe.db.sql("""
+	benefit_application = frappe.db.sql(
+		"""
 		select name
 		from `tabEmployee Benefit Application`
 		where
 			payroll_period=%(payroll_period)s
 			and employee=%(employee)s
 			and docstatus = 1
-	""", {
-		'employee': employee,
-		'payroll_period': payroll_period.name
-	})
+	""",
+		{"employee": employee, "payroll_period": payroll_period.name},
+	)
 
 	current_benefit_amount = 0.0
-	component_max_benefit, depends_on_payment_days = frappe.db.get_value("Salary Component",
-		salary_component, ["max_benefit_amount", "depends_on_payment_days"])
+	component_max_benefit, depends_on_payment_days = frappe.db.get_value(
+		"Salary Component", salary_component, ["max_benefit_amount", "depends_on_payment_days"]
+	)
 
 	benefit_amount = 0
 	if benefit_application:
-		benefit_amount = frappe.db.get_value("Employee Benefit Application Detail",
-			{"parent": benefit_application[0][0], "earning_component": salary_component}, "amount")
+		benefit_amount = frappe.db.get_value(
+			"Employee Benefit Application Detail",
+			{"parent": benefit_application[0][0], "earning_component": salary_component},
+			"amount",
+		)
 	elif component_max_benefit:
 		benefit_amount = get_benefit_amount_based_on_pro_rata(sal_struct, component_max_benefit)
 
 	current_benefit_amount = 0
 	if benefit_amount:
-		total_sub_periods = get_period_factor(employee,
-			start_date, end_date, payroll_frequency, payroll_period, depends_on_payment_days)[0]
+		total_sub_periods = get_period_factor(
+			employee, start_date, end_date, payroll_frequency, payroll_period, depends_on_payment_days
+		)[0]
 
 		current_benefit_amount = benefit_amount / total_sub_periods
 
 	return current_benefit_amount
 
+
 def get_benefit_amount_based_on_pro_rata(sal_struct, component_max_benefit):
 	max_benefits_total = 0
 	benefit_amount = 0
 	for d in sal_struct.get("earnings"):
 		if d.is_flexible_benefit == 1:
-			component = frappe.db.get_value("Salary Component", d.salary_component, ["max_benefit_amount", "pay_against_benefit_claim"], as_dict=1)
+			component = frappe.db.get_value(
+				"Salary Component",
+				d.salary_component,
+				["max_benefit_amount", "pay_against_benefit_claim"],
+				as_dict=1,
+			)
 			if not component.pay_against_benefit_claim:
 				max_benefits_total += component.max_benefit_amount
 
@@ -234,34 +301,46 @@
 
 	return benefit_amount
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_earning_components(doctype, txt, searchfield, start, page_len, filters):
 	if len(filters) < 2:
 		return {}
 
-	salary_structure = get_assigned_salary_structure(filters['employee'], filters['date'])
+	salary_structure = get_assigned_salary_structure(filters["employee"], filters["date"])
 
 	if salary_structure:
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select salary_component
 			from `tabSalary Detail`
 			where parent = %s and is_flexible_benefit = 1
 			order by name
-		""", salary_structure)
+		""",
+			salary_structure,
+		)
 	else:
-		frappe.throw(_("Salary Structure not found for employee {0} and date {1}")
-			.format(filters['employee'], filters['date']))
+		frappe.throw(
+			_("Salary Structure not found for employee {0} and date {1}").format(
+				filters["employee"], filters["date"]
+			)
+		)
+
 
 @frappe.whitelist()
 def get_earning_components_max_benefits(employee, date, earning_component):
 	salary_structure = get_assigned_salary_structure(employee, date)
-	amount = frappe.db.sql("""
+	amount = frappe.db.sql(
+		"""
 			select amount
 			from `tabSalary Detail`
 			where parent = %s and is_flexible_benefit = 1
 			and salary_component = %s
 			order by name
-		""", salary_structure, earning_component)
+		""",
+		salary_structure,
+		earning_component,
+	)
 
 	return amount if amount else 0
diff --git a/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py
index 801ce4b..31f26b2 100644
--- a/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py
+++ b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py
@@ -23,9 +23,15 @@
 		max_benefits = get_max_benefits(self.employee, self.claim_date)
 		if not max_benefits or max_benefits <= 0:
 			frappe.throw(_("Employee {0} has no maximum benefit amount").format(self.employee))
-		payroll_period = get_payroll_period(self.claim_date, self.claim_date, frappe.db.get_value("Employee", self.employee, "company"))
+		payroll_period = get_payroll_period(
+			self.claim_date, self.claim_date, frappe.db.get_value("Employee", self.employee, "company")
+		)
 		if not payroll_period:
-			frappe.throw(_("{0} is not in a valid Payroll Period").format(frappe.format(self.claim_date, dict(fieldtype='Date'))))
+			frappe.throw(
+				_("{0} is not in a valid Payroll Period").format(
+					frappe.format(self.claim_date, dict(fieldtype="Date"))
+				)
+			)
 		self.validate_max_benefit_for_component(payroll_period)
 		self.validate_max_benefit_for_sal_struct(max_benefits)
 		self.validate_benefit_claim_amount(max_benefits, payroll_period)
@@ -36,21 +42,31 @@
 		claimed_amount = self.claimed_amount
 		claimed_amount += get_previous_claimed_amount(self.employee, payroll_period)
 		if max_benefits < claimed_amount:
-			frappe.throw(_("Maximum benefit of employee {0} exceeds {1} by the sum {2} of previous claimed\
-			amount").format(self.employee, max_benefits, claimed_amount-max_benefits))
+			frappe.throw(
+				_(
+					"Maximum benefit of employee {0} exceeds {1} by the sum {2} of previous claimed\
+			amount"
+				).format(self.employee, max_benefits, claimed_amount - max_benefits)
+			)
 
 	def validate_max_benefit_for_sal_struct(self, max_benefits):
 		if self.claimed_amount > max_benefits:
-			frappe.throw(_("Maximum benefit amount of employee {0} exceeds {1}").format(self.employee, max_benefits))
+			frappe.throw(
+				_("Maximum benefit amount of employee {0} exceeds {1}").format(self.employee, max_benefits)
+			)
 
 	def validate_max_benefit_for_component(self, payroll_period):
 		if self.max_amount_eligible:
 			claimed_amount = self.claimed_amount
-			claimed_amount += get_previous_claimed_amount(self.employee,
-				payroll_period, component = self.earning_component)
+			claimed_amount += get_previous_claimed_amount(
+				self.employee, payroll_period, component=self.earning_component
+			)
 			if claimed_amount > self.max_amount_eligible:
-				frappe.throw(_("Maximum amount eligible for the component {0} exceeds {1}")
-					.format(self.earning_component, self.max_amount_eligible))
+				frappe.throw(
+					_("Maximum amount eligible for the component {0} exceeds {1}").format(
+						self.earning_component, self.max_amount_eligible
+					)
+				)
 
 	def validate_non_pro_rata_benefit_claim(self, max_benefits, payroll_period):
 		claimed_amount = self.claimed_amount
@@ -64,30 +80,39 @@
 				sal_struct = frappe.get_doc("Salary Structure", sal_struct_name)
 				pro_rata_amount = get_benefit_pro_rata_ratio_amount(self.employee, self.claim_date, sal_struct)
 
-		claimed_amount += get_previous_claimed_amount(self.employee, payroll_period, non_pro_rata = True)
+		claimed_amount += get_previous_claimed_amount(self.employee, payroll_period, non_pro_rata=True)
 		if max_benefits < pro_rata_amount + claimed_amount:
-			frappe.throw(_("Maximum benefit of employee {0} exceeds {1} by the sum {2} of benefit application pro-rata component\
-			amount and previous claimed amount").format(self.employee, max_benefits, pro_rata_amount+claimed_amount-max_benefits))
+			frappe.throw(
+				_(
+					"Maximum benefit of employee {0} exceeds {1} by the sum {2} of benefit application pro-rata component\
+			amount and previous claimed amount"
+				).format(
+					self.employee, max_benefits, pro_rata_amount + claimed_amount - max_benefits
+				)
+			)
 
 	def get_pro_rata_amount_in_application(self, payroll_period):
 		application = frappe.db.exists(
 			"Employee Benefit Application",
-			{
-				'employee': self.employee,
-				'payroll_period': payroll_period,
-				'docstatus': 1
-			}
+			{"employee": self.employee, "payroll_period": payroll_period, "docstatus": 1},
 		)
 		if application:
-			return frappe.db.get_value("Employee Benefit Application", application, "pro_rata_dispensed_amount")
+			return frappe.db.get_value(
+				"Employee Benefit Application", application, "pro_rata_dispensed_amount"
+			)
 		return False
 
+
 def get_benefit_pro_rata_ratio_amount(employee, on_date, sal_struct):
 	total_pro_rata_max = 0
 	benefit_amount_total = 0
 	for sal_struct_row in sal_struct.get("earnings"):
 		try:
-			pay_against_benefit_claim, max_benefit_amount = frappe.db.get_value("Salary Component", sal_struct_row.salary_component, ["pay_against_benefit_claim", "max_benefit_amount"])
+			pay_against_benefit_claim, max_benefit_amount = frappe.db.get_value(
+				"Salary Component",
+				sal_struct_row.salary_component,
+				["pay_against_benefit_claim", "max_benefit_amount"],
+			)
 		except TypeError:
 			# show the error in tests?
 			frappe.throw(_("Unable to find Salary Component {0}").format(sal_struct_row.salary_component))
@@ -95,7 +120,11 @@
 			total_pro_rata_max += max_benefit_amount
 	if total_pro_rata_max > 0:
 		for sal_struct_row in sal_struct.get("earnings"):
-			pay_against_benefit_claim, max_benefit_amount = frappe.db.get_value("Salary Component", sal_struct_row.salary_component, ["pay_against_benefit_claim", "max_benefit_amount"])
+			pay_against_benefit_claim, max_benefit_amount = frappe.db.get_value(
+				"Salary Component",
+				sal_struct_row.salary_component,
+				["pay_against_benefit_claim", "max_benefit_amount"],
+			)
 
 			if sal_struct_row.is_flexible_benefit == 1 and pay_against_benefit_claim != 1:
 				component_max = max_benefit_amount
@@ -105,6 +134,7 @@
 				benefit_amount_total += benefit_amount
 	return benefit_amount_total
 
+
 def get_benefit_claim_amount(employee, start_date, end_date, salary_component=None):
 	query = """
 		select sum(claimed_amount)
@@ -119,41 +149,54 @@
 	if salary_component:
 		query += " and earning_component = %(earning_component)s"
 
-	claimed_amount = flt(frappe.db.sql(query, {
-		'employee': employee,
-		'start_date': start_date,
-		'end_date': end_date,
-		'earning_component': salary_component
-	})[0][0])
+	claimed_amount = flt(
+		frappe.db.sql(
+			query,
+			{
+				"employee": employee,
+				"start_date": start_date,
+				"end_date": end_date,
+				"earning_component": salary_component,
+			},
+		)[0][0]
+	)
 
 	return claimed_amount
 
+
 def get_total_benefit_dispensed(employee, sal_struct, sal_slip_start_date, payroll_period):
 	pro_rata_amount = 0
 	claimed_amount = 0
 	application = frappe.db.exists(
 		"Employee Benefit Application",
-		{
-			'employee': employee,
-			'payroll_period': payroll_period.name,
-			'docstatus': 1
-		}
+		{"employee": employee, "payroll_period": payroll_period.name, "docstatus": 1},
 	)
 	if application:
 		application_obj = frappe.get_doc("Employee Benefit Application", application)
-		pro_rata_amount = application_obj.pro_rata_dispensed_amount + application_obj.max_benefits - application_obj.remaining_benefit
+		pro_rata_amount = (
+			application_obj.pro_rata_dispensed_amount
+			+ application_obj.max_benefits
+			- application_obj.remaining_benefit
+		)
 	else:
 		pro_rata_amount = get_benefit_pro_rata_ratio_amount(employee, sal_slip_start_date, sal_struct)
 
-	claimed_amount += get_benefit_claim_amount(employee, payroll_period.start_date, payroll_period.end_date)
+	claimed_amount += get_benefit_claim_amount(
+		employee, payroll_period.start_date, payroll_period.end_date
+	)
 
 	return claimed_amount + pro_rata_amount
 
-def get_last_payroll_period_benefits(employee, sal_slip_start_date, sal_slip_end_date, payroll_period,  sal_struct):
+
+def get_last_payroll_period_benefits(
+	employee, sal_slip_start_date, sal_slip_end_date, payroll_period, sal_struct
+):
 	max_benefits = get_max_benefits(employee, payroll_period.end_date)
 	if not max_benefits:
 		max_benefits = 0
-	remaining_benefit = max_benefits - get_total_benefit_dispensed(employee, sal_struct, sal_slip_start_date, payroll_period)
+	remaining_benefit = max_benefits - get_total_benefit_dispensed(
+		employee, sal_struct, sal_slip_start_date, payroll_period
+	)
 	if remaining_benefit > 0:
 		have_remaining = True
 		# Set the remaining benefits to flexi non pro-rata component in the salary structure
@@ -162,7 +205,9 @@
 			if d.is_flexible_benefit == 1:
 				salary_component = frappe.get_doc("Salary Component", d.salary_component)
 				if salary_component.pay_against_benefit_claim == 1:
-					claimed_amount = get_benefit_claim_amount(employee, payroll_period.start_date, sal_slip_end_date, d.salary_component)
+					claimed_amount = get_benefit_claim_amount(
+						employee, payroll_period.start_date, sal_slip_end_date, d.salary_component
+					)
 					amount_fit_to_component = salary_component.max_benefit_amount - claimed_amount
 					if amount_fit_to_component > 0:
 						if remaining_benefit > amount_fit_to_component:
@@ -171,19 +216,23 @@
 						else:
 							amount = remaining_benefit
 							have_remaining = False
-						current_claimed_amount = get_benefit_claim_amount(employee, sal_slip_start_date, sal_slip_end_date, d.salary_component)
+						current_claimed_amount = get_benefit_claim_amount(
+							employee, sal_slip_start_date, sal_slip_end_date, d.salary_component
+						)
 						amount += current_claimed_amount
 						struct_row = {}
 						salary_components_dict = {}
-						struct_row['depends_on_payment_days'] = salary_component.depends_on_payment_days
-						struct_row['salary_component'] = salary_component.name
-						struct_row['abbr'] = salary_component.salary_component_abbr
-						struct_row['do_not_include_in_total'] = salary_component.do_not_include_in_total
-						struct_row['is_tax_applicable'] = salary_component.is_tax_applicable,
-						struct_row['is_flexible_benefit'] = salary_component.is_flexible_benefit,
-						struct_row['variable_based_on_taxable_salary'] = salary_component.variable_based_on_taxable_salary
-						salary_components_dict['amount'] = amount
-						salary_components_dict['struct_row'] = struct_row
+						struct_row["depends_on_payment_days"] = salary_component.depends_on_payment_days
+						struct_row["salary_component"] = salary_component.name
+						struct_row["abbr"] = salary_component.salary_component_abbr
+						struct_row["do_not_include_in_total"] = salary_component.do_not_include_in_total
+						struct_row["is_tax_applicable"] = (salary_component.is_tax_applicable,)
+						struct_row["is_flexible_benefit"] = (salary_component.is_flexible_benefit,)
+						struct_row[
+							"variable_based_on_taxable_salary"
+						] = salary_component.variable_based_on_taxable_salary
+						salary_components_dict["amount"] = amount
+						salary_components_dict["struct_row"] = struct_row
 						salary_components_array.append(salary_components_dict)
 			if not have_remaining:
 				break
diff --git a/erpnext/payroll/doctype/employee_incentive/employee_incentive.py b/erpnext/payroll/doctype/employee_incentive/employee_incentive.py
index a37e224..7686185 100644
--- a/erpnext/payroll/doctype/employee_incentive/employee_incentive.py
+++ b/erpnext/payroll/doctype/employee_incentive/employee_incentive.py
@@ -15,13 +15,17 @@
 		self.validate_salary_structure()
 
 	def validate_salary_structure(self):
-		if not frappe.db.exists('Salary Structure Assignment', {'employee': self.employee}):
-			frappe.throw(_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(self.employee))
+		if not frappe.db.exists("Salary Structure Assignment", {"employee": self.employee}):
+			frappe.throw(
+				_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(
+					self.employee
+				)
+			)
 
 	def on_submit(self):
-		company = frappe.db.get_value('Employee', self.employee, 'company')
+		company = frappe.db.get_value("Employee", self.employee, "company")
 
-		additional_salary = frappe.new_doc('Additional Salary')
+		additional_salary = frappe.new_doc("Additional Salary")
 		additional_salary.employee = self.employee
 		additional_salary.currency = self.currency
 		additional_salary.salary_component = self.salary_component
diff --git a/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py
index 9b5eab6..c0ef2ee 100644
--- a/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py
+++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py
@@ -20,7 +20,9 @@
 	def validate(self):
 		validate_active_employee(self.employee)
 		validate_tax_declaration(self.declarations)
-		validate_duplicate_exemption_for_payroll_period(self.doctype, self.name, self.payroll_period, self.employee)
+		validate_duplicate_exemption_for_payroll_period(
+			self.doctype, self.name, self.payroll_period, self.employee
+		)
 		self.set_total_declared_amount()
 		self.set_total_exemption_amount()
 		self.calculate_hra_exemption()
@@ -43,17 +45,23 @@
 				self.annual_hra_exemption = hra_exemption["annual_exemption"]
 				self.monthly_hra_exemption = hra_exemption["monthly_exemption"]
 
+
 @frappe.whitelist()
 def make_proof_submission(source_name, target_doc=None):
-	doclist = get_mapped_doc("Employee Tax Exemption Declaration", source_name, {
-		"Employee Tax Exemption Declaration": {
-			"doctype": "Employee Tax Exemption Proof Submission",
-			"field_no_map": ["monthly_house_rent", "monthly_hra_exemption"]
+	doclist = get_mapped_doc(
+		"Employee Tax Exemption Declaration",
+		source_name,
+		{
+			"Employee Tax Exemption Declaration": {
+				"doctype": "Employee Tax Exemption Proof Submission",
+				"field_no_map": ["monthly_house_rent", "monthly_hra_exemption"],
+			},
+			"Employee Tax Exemption Declaration Category": {
+				"doctype": "Employee Tax Exemption Proof Submission Detail",
+				"add_if_empty": True,
+			},
 		},
-		"Employee Tax Exemption Declaration Category": {
-			"doctype": "Employee Tax Exemption Proof Submission Detail",
-			"add_if_empty": True
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
diff --git a/erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py
index fc28afd..1d90e73 100644
--- a/erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py
+++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py
@@ -19,112 +19,147 @@
 		frappe.db.sql("""delete from `tabEmployee Tax Exemption Declaration`""")
 
 	def test_duplicate_category_in_declaration(self):
-		declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Declaration",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
-			"company": erpnext.get_default_company(),
-			"payroll_period": "_Test Payroll Period",
-			"currency": erpnext.get_default_currency(),
-			"declarations": [
-				dict(exemption_sub_category = "_Test Sub Category",
-					exemption_category = "_Test Category",
-					amount = 100000),
-				dict(exemption_sub_category = "_Test Sub Category",
-					exemption_category = "_Test Category",
-					amount = 50000)
-			]
-		})
+		declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Declaration",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@taxexepmtion.com"}, "name"),
+				"company": erpnext.get_default_company(),
+				"payroll_period": "_Test Payroll Period",
+				"currency": erpnext.get_default_currency(),
+				"declarations": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						amount=100000,
+					),
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						amount=50000,
+					),
+				],
+			}
+		)
 		self.assertRaises(frappe.ValidationError, declaration.save)
 
 	def test_duplicate_entry_for_payroll_period(self):
-		declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Declaration",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
-			"company":  erpnext.get_default_company(),
-			"payroll_period": "_Test Payroll Period",
-			"currency": erpnext.get_default_currency(),
-			"declarations": [
-				dict(exemption_sub_category = "_Test Sub Category",
-					exemption_category = "_Test Category",
-					amount = 100000),
-				dict(exemption_sub_category = "_Test1 Sub Category",
-					exemption_category = "_Test Category",
-					amount = 50000),
-			]
-		}).insert()
+		declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Declaration",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@taxexepmtion.com"}, "name"),
+				"company": erpnext.get_default_company(),
+				"payroll_period": "_Test Payroll Period",
+				"currency": erpnext.get_default_currency(),
+				"declarations": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						amount=100000,
+					),
+					dict(
+						exemption_sub_category="_Test1 Sub Category",
+						exemption_category="_Test Category",
+						amount=50000,
+					),
+				],
+			}
+		).insert()
 
-		duplicate_declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Declaration",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
-			"company":  erpnext.get_default_company(),
-			"payroll_period": "_Test Payroll Period",
-			"currency": erpnext.get_default_currency(),
-			"declarations": [
-				dict(exemption_sub_category = "_Test Sub Category",
-					exemption_category = "_Test Category",
-					amount = 100000)
-			]
-		})
+		duplicate_declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Declaration",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@taxexepmtion.com"}, "name"),
+				"company": erpnext.get_default_company(),
+				"payroll_period": "_Test Payroll Period",
+				"currency": erpnext.get_default_currency(),
+				"declarations": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						amount=100000,
+					)
+				],
+			}
+		)
 		self.assertRaises(DuplicateDeclarationError, duplicate_declaration.insert)
-		duplicate_declaration.employee = frappe.get_value("Employee", {"user_id":"employee1@taxexepmtion.com"}, "name")
+		duplicate_declaration.employee = frappe.get_value(
+			"Employee", {"user_id": "employee1@taxexepmtion.com"}, "name"
+		)
 		self.assertTrue(duplicate_declaration.insert)
 
 	def test_exemption_amount(self):
-		declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Declaration",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@taxexepmtion.com"}, "name"),
-			"company":  erpnext.get_default_company(),
-			"payroll_period": "_Test Payroll Period",
-			"currency": erpnext.get_default_currency(),
-			"declarations": [
-				dict(exemption_sub_category = "_Test Sub Category",
-					exemption_category = "_Test Category",
-					amount = 80000),
-				dict(exemption_sub_category = "_Test1 Sub Category",
-					exemption_category = "_Test Category",
-					amount = 60000),
-			]
-		}).insert()
+		declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Declaration",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@taxexepmtion.com"}, "name"),
+				"company": erpnext.get_default_company(),
+				"payroll_period": "_Test Payroll Period",
+				"currency": erpnext.get_default_currency(),
+				"declarations": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						amount=80000,
+					),
+					dict(
+						exemption_sub_category="_Test1 Sub Category",
+						exemption_category="_Test Category",
+						amount=60000,
+					),
+				],
+			}
+		).insert()
 
 		self.assertEqual(declaration.total_exemption_amount, 100000)
 
+
 def create_payroll_period(**args):
 	args = frappe._dict(args)
 	name = args.name or "_Test Payroll Period"
 	if not frappe.db.exists("Payroll Period", name):
 		from datetime import date
-		payroll_period = frappe.get_doc(dict(
-			doctype = 'Payroll Period',
-			name = name,
-			company =  args.company or erpnext.get_default_company(),
-			start_date = args.start_date or date(date.today().year, 1, 1),
-			end_date = args.end_date or date(date.today().year, 12, 31)
-		)).insert()
+
+		payroll_period = frappe.get_doc(
+			dict(
+				doctype="Payroll Period",
+				name=name,
+				company=args.company or erpnext.get_default_company(),
+				start_date=args.start_date or date(date.today().year, 1, 1),
+				end_date=args.end_date or date(date.today().year, 12, 31),
+			)
+		).insert()
 		return payroll_period
 	else:
 		return frappe.get_doc("Payroll Period", name)
 
+
 def create_exemption_category():
 	if not frappe.db.exists("Employee Tax Exemption Category", "_Test Category"):
-		category = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Category",
-			"name": "_Test Category",
-			"deduction_component": "Income Tax",
-			"max_amount": 100000
-		}).insert()
+		category = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Category",
+				"name": "_Test Category",
+				"deduction_component": "Income Tax",
+				"max_amount": 100000,
+			}
+		).insert()
 	if not frappe.db.exists("Employee Tax Exemption Sub Category", "_Test Sub Category"):
-		frappe.get_doc({
-			"doctype": "Employee Tax Exemption Sub Category",
-			"name": "_Test Sub Category",
-			"exemption_category": "_Test Category",
-			"max_amount": 100000,
-			"is_active": 1
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Sub Category",
+				"name": "_Test Sub Category",
+				"exemption_category": "_Test Category",
+				"max_amount": 100000,
+				"is_active": 1,
+			}
+		).insert()
 	if not frappe.db.exists("Employee Tax Exemption Sub Category", "_Test1 Sub Category"):
-		frappe.get_doc({
-			"doctype": "Employee Tax Exemption Sub Category",
-			"name": "_Test1 Sub Category",
-			"exemption_category": "_Test Category",
-			"max_amount": 50000,
-			"is_active": 1
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Sub Category",
+				"name": "_Test1 Sub Category",
+				"exemption_category": "_Test Category",
+				"max_amount": 50000,
+				"is_active": 1,
+			}
+		).insert()
diff --git a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py
index 56e73b3..c52efab 100644
--- a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py
+++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py
@@ -21,7 +21,9 @@
 		self.set_total_actual_amount()
 		self.set_total_exemption_amount()
 		self.calculate_hra_exemption()
-		validate_duplicate_exemption_for_payroll_period(self.doctype, self.name, self.payroll_period, self.employee)
+		validate_duplicate_exemption_for_payroll_period(
+			self.doctype, self.name, self.payroll_period, self.employee
+		)
 
 	def set_total_actual_amount(self):
 		self.total_actual_amount = flt(self.get("house_rent_payment_amount"))
diff --git a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py
index f2aa64c..58b2c1a 100644
--- a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py
+++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py
@@ -19,40 +19,59 @@
 		frappe.db.sql("""delete from `tabEmployee Tax Exemption Proof Submission`""")
 
 	def test_exemption_amount_lesser_than_category_max(self):
-		declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Proof Submission",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"),
-			"payroll_period": "Test Payroll Period",
-			"tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category",
-							type_of_proof = "Test Proof",
-							exemption_category = "_Test Category",
-							amount = 150000)]
-		})
+		declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Proof Submission",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@proofsubmission.com"}, "name"),
+				"payroll_period": "Test Payroll Period",
+				"tax_exemption_proofs": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						type_of_proof="Test Proof",
+						exemption_category="_Test Category",
+						amount=150000,
+					)
+				],
+			}
+		)
 		self.assertRaises(frappe.ValidationError, declaration.save)
-		declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Proof Submission",
-			"payroll_period": "Test Payroll Period",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"),
-			"tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category",
-							type_of_proof = "Test Proof",
-							exemption_category = "_Test Category",
-							amount = 100000)]
-		})
+		declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Proof Submission",
+				"payroll_period": "Test Payroll Period",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@proofsubmission.com"}, "name"),
+				"tax_exemption_proofs": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						type_of_proof="Test Proof",
+						exemption_category="_Test Category",
+						amount=100000,
+					)
+				],
+			}
+		)
 		self.assertTrue(declaration.save)
 		self.assertTrue(declaration.submit)
 
 	def test_duplicate_category_in_proof_submission(self):
-		declaration = frappe.get_doc({
-			"doctype": "Employee Tax Exemption Proof Submission",
-			"employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"),
-			"payroll_period": "Test Payroll Period",
-			"tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category",
-							exemption_category = "_Test Category",
-							type_of_proof = "Test Proof",
-							amount = 100000),
-							dict(exemption_sub_category = "_Test Sub Category",
-							exemption_category = "_Test Category",
-							amount = 50000),
-							]
-		})
+		declaration = frappe.get_doc(
+			{
+				"doctype": "Employee Tax Exemption Proof Submission",
+				"employee": frappe.get_value("Employee", {"user_id": "employee@proofsubmission.com"}, "name"),
+				"payroll_period": "Test Payroll Period",
+				"tax_exemption_proofs": [
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						type_of_proof="Test Proof",
+						amount=100000,
+					),
+					dict(
+						exemption_sub_category="_Test Sub Category",
+						exemption_category="_Test Category",
+						amount=50000,
+					),
+				],
+			}
+		)
 		self.assertRaises(frappe.ValidationError, declaration.save)
diff --git a/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py
index 4ac11f7..fb75d67 100644
--- a/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py
+++ b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py
@@ -10,7 +10,12 @@
 
 class EmployeeTaxExemptionSubCategory(Document):
 	def validate(self):
-		category_max_amount = frappe.db.get_value("Employee Tax Exemption Category", self.exemption_category, "max_amount")
+		category_max_amount = frappe.db.get_value(
+			"Employee Tax Exemption Category", self.exemption_category, "max_amount"
+		)
 		if flt(self.max_amount) > flt(category_max_amount):
-			frappe.throw(_("Max Exemption Amount cannot be greater than maximum exemption amount {0} of Tax Exemption Category {1}")
-				.format(category_max_amount, self.exemption_category))
+			frappe.throw(
+				_(
+					"Max Exemption Amount cannot be greater than maximum exemption amount {0} of Tax Exemption Category {1}"
+				).format(category_max_amount, self.exemption_category)
+			)
diff --git a/erpnext/payroll/doctype/gratuity/gratuity.py b/erpnext/payroll/doctype/gratuity/gratuity.py
index 939634a..91740ae 100644
--- a/erpnext/payroll/doctype/gratuity/gratuity.py
+++ b/erpnext/payroll/doctype/gratuity/gratuity.py
@@ -27,7 +27,7 @@
 			self.create_gl_entries()
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ['GL Entry']
+		self.ignore_linked_doctypes = ["GL Entry"]
 		self.create_gl_entries(cancel=True)
 
 	def create_gl_entries(self, cancel=False):
@@ -39,28 +39,34 @@
 		# payable entry
 		if self.amount:
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": self.payable_account,
-					"credit": self.amount,
-					"credit_in_account_currency": self.amount,
-					"against": self.expense_account,
-					"party_type": "Employee",
-					"party": self.employee,
-					"against_voucher_type": self.doctype,
-					"against_voucher": self.name,
-					"cost_center": self.cost_center
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.payable_account,
+						"credit": self.amount,
+						"credit_in_account_currency": self.amount,
+						"against": self.expense_account,
+						"party_type": "Employee",
+						"party": self.employee,
+						"against_voucher_type": self.doctype,
+						"against_voucher": self.name,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
 			)
 
 			# expense entries
 			gl_entry.append(
-				self.get_gl_dict({
-					"account": self.expense_account,
-					"debit": self.amount,
-					"debit_in_account_currency": self.amount,
-					"against": self.payable_account,
-					"cost_center": self.cost_center
-				}, item=self)
+				self.get_gl_dict(
+					{
+						"account": self.expense_account,
+						"debit": self.amount,
+						"debit_in_account_currency": self.amount,
+						"against": self.payable_account,
+						"cost_center": self.cost_center,
+					},
+					item=self,
+				)
 			)
 		else:
 			frappe.throw(_("Total Amount can not be zero"))
@@ -69,7 +75,7 @@
 
 	def create_additional_salary(self):
 		if self.pay_via_salary_slip:
-			additional_salary = frappe.new_doc('Additional Salary')
+			additional_salary = frappe.new_doc("Additional Salary")
 			additional_salary.employee = self.employee
 			additional_salary.salary_component = self.salary_component
 			additional_salary.overwrite_salary_structure_amount = 0
@@ -81,19 +87,22 @@
 			additional_salary.submit()
 
 	def set_total_advance_paid(self):
-		paid_amount = frappe.db.sql("""
+		paid_amount = frappe.db.sql(
+			"""
 			select ifnull(sum(debit_in_account_currency), 0) as paid_amount
 			from `tabGL Entry`
 			where against_voucher_type = 'Gratuity'
 				and against_voucher = %s
 				and party_type = 'Employee'
 				and party = %s
-		""", (self.name, self.employee), as_dict=1)[0].paid_amount
+		""",
+			(self.name, self.employee),
+			as_dict=1,
+		)[0].paid_amount
 
 		if flt(paid_amount) > self.amount:
 			frappe.throw(_("Row {0}# Paid Amount cannot be greater than Total amount"))
 
-
 		self.db_set("paid_amount", paid_amount)
 		if self.amount == self.paid_amount:
 			self.db_set("status", "Paid")
@@ -104,69 +113,97 @@
 	current_work_experience = calculate_work_experience(employee, gratuity_rule) or 0
 	gratuity_amount = calculate_gratuity_amount(employee, gratuity_rule, current_work_experience) or 0
 
-	return {'current_work_experience': current_work_experience, "amount": gratuity_amount}
+	return {"current_work_experience": current_work_experience, "amount": gratuity_amount}
+
 
 def calculate_work_experience(employee, gratuity_rule):
 
-	total_working_days_per_year, minimum_year_for_gratuity = frappe.db.get_value("Gratuity Rule", gratuity_rule, ["total_working_days_per_year", "minimum_year_for_gratuity"])
+	total_working_days_per_year, minimum_year_for_gratuity = frappe.db.get_value(
+		"Gratuity Rule", gratuity_rule, ["total_working_days_per_year", "minimum_year_for_gratuity"]
+	)
 
-	date_of_joining, relieving_date = frappe.db.get_value('Employee', employee, ['date_of_joining', 'relieving_date'])
+	date_of_joining, relieving_date = frappe.db.get_value(
+		"Employee", employee, ["date_of_joining", "relieving_date"]
+	)
 	if not relieving_date:
-		frappe.throw(_("Please set Relieving Date for employee: {0}").format(bold(get_link_to_form("Employee", employee))))
+		frappe.throw(
+			_("Please set Relieving Date for employee: {0}").format(
+				bold(get_link_to_form("Employee", employee))
+			)
+		)
 
-	method = frappe.db.get_value("Gratuity Rule", gratuity_rule, "work_experience_calculation_function")
-	employee_total_workings_days = calculate_employee_total_workings_days(employee, date_of_joining, relieving_date)
+	method = frappe.db.get_value(
+		"Gratuity Rule", gratuity_rule, "work_experience_calculation_function"
+	)
+	employee_total_workings_days = calculate_employee_total_workings_days(
+		employee, date_of_joining, relieving_date
+	)
 
-	current_work_experience = employee_total_workings_days/total_working_days_per_year or 1
-	current_work_experience = get_work_experience_using_method(method, current_work_experience, minimum_year_for_gratuity, employee)
+	current_work_experience = employee_total_workings_days / total_working_days_per_year or 1
+	current_work_experience = get_work_experience_using_method(
+		method, current_work_experience, minimum_year_for_gratuity, employee
+	)
 	return current_work_experience
 
-def calculate_employee_total_workings_days(employee, date_of_joining, relieving_date ):
+
+def calculate_employee_total_workings_days(employee, date_of_joining, relieving_date):
 	employee_total_workings_days = (get_datetime(relieving_date) - get_datetime(date_of_joining)).days
 
 	payroll_based_on = frappe.db.get_value("Payroll Settings", None, "payroll_based_on") or "Leave"
 	if payroll_based_on == "Leave":
 		total_lwp = get_non_working_days(employee, relieving_date, "On Leave")
 		employee_total_workings_days -= total_lwp
-	elif  payroll_based_on == "Attendance":
+	elif payroll_based_on == "Attendance":
 		total_absents = get_non_working_days(employee, relieving_date, "Absent")
 		employee_total_workings_days -= total_absents
 
 	return employee_total_workings_days
 
-def get_work_experience_using_method(method, current_work_experience, minimum_year_for_gratuity, employee):
+
+def get_work_experience_using_method(
+	method, current_work_experience, minimum_year_for_gratuity, employee
+):
 	if method == "Round off Work Experience":
 		current_work_experience = round(current_work_experience)
 	else:
 		current_work_experience = floor(current_work_experience)
 
 	if current_work_experience < minimum_year_for_gratuity:
-		frappe.throw(_("Employee: {0} have to complete minimum {1} years for gratuity").format(bold(employee), minimum_year_for_gratuity))
+		frappe.throw(
+			_("Employee: {0} have to complete minimum {1} years for gratuity").format(
+				bold(employee), minimum_year_for_gratuity
+			)
+		)
 	return current_work_experience
 
+
 def get_non_working_days(employee, relieving_date, status):
 
-	filters={
-			"docstatus": 1,
-			"status": status,
-			"employee": employee,
-			"attendance_date": ("<=", get_datetime(relieving_date))
-		}
+	filters = {
+		"docstatus": 1,
+		"status": status,
+		"employee": employee,
+		"attendance_date": ("<=", get_datetime(relieving_date)),
+	}
 
 	if status == "On Leave":
-		lwp_leave_types =  frappe.get_list("Leave Type", filters = {"is_lwp":1})
+		lwp_leave_types = frappe.get_list("Leave Type", filters={"is_lwp": 1})
 		lwp_leave_types = [leave_type.name for leave_type in lwp_leave_types]
-		filters["leave_type"] =  ("IN", lwp_leave_types)
+		filters["leave_type"] = ("IN", lwp_leave_types)
 
-
-	record = frappe.get_all("Attendance", filters=filters, fields = ["COUNT(name) as total_lwp"])
+	record = frappe.get_all("Attendance", filters=filters, fields=["COUNT(name) as total_lwp"])
 	return record[0].total_lwp if len(record) else 0
 
+
 def calculate_gratuity_amount(employee, gratuity_rule, experience):
 	applicable_earnings_component = get_applicable_components(gratuity_rule)
-	total_applicable_components_amount = get_total_applicable_component_amount(employee, applicable_earnings_component, gratuity_rule)
+	total_applicable_components_amount = get_total_applicable_component_amount(
+		employee, applicable_earnings_component, gratuity_rule
+	)
 
-	calculate_gratuity_amount_based_on = frappe.db.get_value("Gratuity Rule", gratuity_rule, "calculate_gratuity_amount_based_on")
+	calculate_gratuity_amount_based_on = frappe.db.get_value(
+		"Gratuity Rule", gratuity_rule, "calculate_gratuity_amount_based_on"
+	)
 	gratuity_amount = 0
 	slabs = get_gratuity_rule_slabs(gratuity_rule)
 	slab_found = False
@@ -174,49 +211,78 @@
 
 	for slab in slabs:
 		if calculate_gratuity_amount_based_on == "Current Slab":
-			slab_found, gratuity_amount = calculate_amount_based_on_current_slab(slab.from_year, slab.to_year,
-				experience, total_applicable_components_amount, slab.fraction_of_applicable_earnings)
+			slab_found, gratuity_amount = calculate_amount_based_on_current_slab(
+				slab.from_year,
+				slab.to_year,
+				experience,
+				total_applicable_components_amount,
+				slab.fraction_of_applicable_earnings,
+			)
 			if slab_found:
-					break
+				break
 
 		elif calculate_gratuity_amount_based_on == "Sum of all previous slabs":
 			if slab.to_year == 0 and slab.from_year == 0:
-				gratuity_amount += year_left * total_applicable_components_amount * slab.fraction_of_applicable_earnings
+				gratuity_amount += (
+					year_left * total_applicable_components_amount * slab.fraction_of_applicable_earnings
+				)
 				slab_found = True
 				break
 
-			if experience > slab.to_year and experience > slab.from_year and slab.to_year !=0:
-				gratuity_amount += (slab.to_year - slab.from_year) * total_applicable_components_amount * slab.fraction_of_applicable_earnings
-				year_left -= (slab.to_year - slab.from_year)
+			if experience > slab.to_year and experience > slab.from_year and slab.to_year != 0:
+				gratuity_amount += (
+					(slab.to_year - slab.from_year)
+					* total_applicable_components_amount
+					* slab.fraction_of_applicable_earnings
+				)
+				year_left -= slab.to_year - slab.from_year
 				slab_found = True
 			elif slab.from_year <= experience and (experience < slab.to_year or slab.to_year == 0):
-				gratuity_amount += year_left * total_applicable_components_amount * slab.fraction_of_applicable_earnings
+				gratuity_amount += (
+					year_left * total_applicable_components_amount * slab.fraction_of_applicable_earnings
+				)
 				slab_found = True
 
 	if not slab_found:
-		frappe.throw(_("No Suitable Slab found for Calculation of gratuity amount in Gratuity Rule: {0}").format(bold(gratuity_rule)))
+		frappe.throw(
+			_("No Suitable Slab found for Calculation of gratuity amount in Gratuity Rule: {0}").format(
+				bold(gratuity_rule)
+			)
+		)
 	return gratuity_amount
 
+
 def get_applicable_components(gratuity_rule):
-	applicable_earnings_component = frappe.get_all("Gratuity Applicable Component", filters= {'parent': gratuity_rule}, fields=["salary_component"])
+	applicable_earnings_component = frappe.get_all(
+		"Gratuity Applicable Component", filters={"parent": gratuity_rule}, fields=["salary_component"]
+	)
 	if len(applicable_earnings_component) == 0:
-		frappe.throw(_("No Applicable Earnings Component found for Gratuity Rule: {0}").format(bold(get_link_to_form("Gratuity Rule",gratuity_rule))))
-	applicable_earnings_component = [component.salary_component for component in applicable_earnings_component]
+		frappe.throw(
+			_("No Applicable Earnings Component found for Gratuity Rule: {0}").format(
+				bold(get_link_to_form("Gratuity Rule", gratuity_rule))
+			)
+		)
+	applicable_earnings_component = [
+		component.salary_component for component in applicable_earnings_component
+	]
 
 	return applicable_earnings_component
 
+
 def get_total_applicable_component_amount(employee, applicable_earnings_component, gratuity_rule):
-	sal_slip  = get_last_salary_slip(employee)
+	sal_slip = get_last_salary_slip(employee)
 	if not sal_slip:
 		frappe.throw(_("No Salary Slip is found for Employee: {0}").format(bold(employee)))
-	component_and_amounts = frappe.get_all("Salary Detail",
+	component_and_amounts = frappe.get_all(
+		"Salary Detail",
 		filters={
 			"docstatus": 1,
-			'parent': sal_slip,
+			"parent": sal_slip,
 			"parentfield": "earnings",
-			'salary_component': ('in', applicable_earnings_component)
+			"salary_component": ("in", applicable_earnings_component),
 		},
-		fields=["amount"])
+		fields=["amount"],
+	)
 	total_applicable_components_amount = 0
 	if not len(component_and_amounts):
 		frappe.throw(_("No Applicable Component is present in last month salary slip"))
@@ -224,30 +290,44 @@
 		total_applicable_components_amount += data.amount
 	return total_applicable_components_amount
 
-def calculate_amount_based_on_current_slab(from_year, to_year, experience, total_applicable_components_amount, fraction_of_applicable_earnings):
-	slab_found = False; gratuity_amount = 0
+
+def calculate_amount_based_on_current_slab(
+	from_year,
+	to_year,
+	experience,
+	total_applicable_components_amount,
+	fraction_of_applicable_earnings,
+):
+	slab_found = False
+	gratuity_amount = 0
 	if experience >= from_year and (to_year == 0 or experience < to_year):
-		gratuity_amount = total_applicable_components_amount * experience * fraction_of_applicable_earnings
+		gratuity_amount = (
+			total_applicable_components_amount * experience * fraction_of_applicable_earnings
+		)
 		if fraction_of_applicable_earnings:
 			slab_found = True
 
 	return slab_found, gratuity_amount
 
+
 def get_gratuity_rule_slabs(gratuity_rule):
-	return frappe.get_all("Gratuity Rule Slab", filters= {'parent': gratuity_rule}, fields = ["*"], order_by="idx")
+	return frappe.get_all(
+		"Gratuity Rule Slab", filters={"parent": gratuity_rule}, fields=["*"], order_by="idx"
+	)
+
 
 def get_salary_structure(employee):
-	return frappe.get_list("Salary Structure Assignment", filters = {
-			"employee": employee, 'docstatus': 1
-		},
+	return frappe.get_list(
+		"Salary Structure Assignment",
+		filters={"employee": employee, "docstatus": 1},
 		fields=["from_date", "salary_structure"],
-		order_by = "from_date desc")[0].salary_structure
+		order_by="from_date desc",
+	)[0].salary_structure
+
 
 def get_last_salary_slip(employee):
-	salary_slips = frappe.get_list("Salary Slip", filters = {
-			"employee": employee, 'docstatus': 1
-		},
-		order_by = "start_date desc"
+	salary_slips = frappe.get_list(
+		"Salary Slip", filters={"employee": employee, "docstatus": 1}, order_by="start_date desc"
 	)
 	if not salary_slips:
 		return
diff --git a/erpnext/payroll/doctype/gratuity/gratuity_dashboard.py b/erpnext/payroll/doctype/gratuity/gratuity_dashboard.py
index 771a6fe..9396461 100644
--- a/erpnext/payroll/doctype/gratuity/gratuity_dashboard.py
+++ b/erpnext/payroll/doctype/gratuity/gratuity_dashboard.py
@@ -3,14 +3,9 @@
 
 def get_data():
 	return {
-		'fieldname': 'reference_name',
-		'non_standard_fieldnames': {
-			'Additional Salary': 'ref_docname',
+		"fieldname": "reference_name",
+		"non_standard_fieldnames": {
+			"Additional Salary": "ref_docname",
 		},
-		'transactions': [
-			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Additional Salary']
-			}
-		]
+		"transactions": [{"label": _("Payment"), "items": ["Payment Entry", "Additional Salary"]}],
 	}
diff --git a/erpnext/payroll/doctype/gratuity/test_gratuity.py b/erpnext/payroll/doctype/gratuity/test_gratuity.py
index 90e8061..67bb447 100644
--- a/erpnext/payroll/doctype/gratuity/test_gratuity.py
+++ b/erpnext/payroll/doctype/gratuity/test_gratuity.py
@@ -17,16 +17,18 @@
 from erpnext.regional.united_arab_emirates.setup import create_gratuity_rule
 
 test_dependencies = ["Salary Component", "Salary Slip", "Account"]
+
+
 class TestGratuity(unittest.TestCase):
 	def setUp(self):
 		frappe.db.delete("Gratuity")
 		frappe.db.delete("Additional Salary", {"ref_doctype": "Gratuity"})
 
-		make_earning_salary_component(setup=True, test_tax=True, company_list=['_Test Company'])
-		make_deduction_salary_component(setup=True, test_tax=True, company_list=['_Test Company'])
+		make_earning_salary_component(setup=True, test_tax=True, company_list=["_Test Company"])
+		make_deduction_salary_component(setup=True, test_tax=True, company_list=["_Test Company"])
 
 	def test_get_last_salary_slip_should_return_none_for_new_employee(self):
-		new_employee = make_employee("new_employee@salary.com", company='_Test Company')
+		new_employee = make_employee("new_employee@salary.com", company="_Test Company")
 		salary_slip = get_last_salary_slip(new_employee)
 		assert salary_slip is None
 
@@ -37,25 +39,32 @@
 		gratuity = create_gratuity(pay_via_salary_slip=1, employee=employee, rule=rule.name)
 
 		# work experience calculation
-		date_of_joining, relieving_date = frappe.db.get_value('Employee', employee, ['date_of_joining', 'relieving_date'])
-		employee_total_workings_days = (get_datetime(relieving_date) - get_datetime(date_of_joining)).days
+		date_of_joining, relieving_date = frappe.db.get_value(
+			"Employee", employee, ["date_of_joining", "relieving_date"]
+		)
+		employee_total_workings_days = (
+			get_datetime(relieving_date) - get_datetime(date_of_joining)
+		).days
 
-		experience = employee_total_workings_days/rule.total_working_days_per_year
+		experience = employee_total_workings_days / rule.total_working_days_per_year
 		gratuity.reload()
 		from math import floor
+
 		self.assertEqual(floor(experience), gratuity.current_work_experience)
 
-		#amount Calculation
-		component_amount = frappe.get_all("Salary Detail",
-		filters={
-			"docstatus": 1,
-			'parent': sal_slip,
-			"parentfield": "earnings",
-			'salary_component': "Basic Salary"
-		},
-		fields=["amount"])
+		# amount Calculation
+		component_amount = frappe.get_all(
+			"Salary Detail",
+			filters={
+				"docstatus": 1,
+				"parent": sal_slip,
+				"parentfield": "earnings",
+				"salary_component": "Basic Salary",
+			},
+			fields=["amount"],
+		)
 
-		''' 5 - 0 fraction is 1 '''
+		""" 5 - 0 fraction is 1 """
 
 		gratuity_amount = component_amount[0].amount * experience
 		gratuity.reload()
@@ -70,13 +79,19 @@
 		rule = get_gratuity_rule("Rule Under Limited Contract (UAE)")
 		set_mode_of_payment_account()
 
-		gratuity = create_gratuity(expense_account = 'Payment Account - _TC', mode_of_payment='Cash', employee=employee)
+		gratuity = create_gratuity(
+			expense_account="Payment Account - _TC", mode_of_payment="Cash", employee=employee
+		)
 
-		#work experience calculation
-		date_of_joining, relieving_date = frappe.db.get_value('Employee', employee, ['date_of_joining', 'relieving_date'])
-		employee_total_workings_days = (get_datetime(relieving_date) - get_datetime(date_of_joining)).days
+		# work experience calculation
+		date_of_joining, relieving_date = frappe.db.get_value(
+			"Employee", employee, ["date_of_joining", "relieving_date"]
+		)
+		employee_total_workings_days = (
+			get_datetime(relieving_date) - get_datetime(date_of_joining)
+		).days
 
-		experience = employee_total_workings_days/rule.total_working_days_per_year
+		experience = employee_total_workings_days / rule.total_working_days_per_year
 
 		gratuity.reload()
 
@@ -84,29 +99,32 @@
 
 		self.assertEqual(floor(experience), gratuity.current_work_experience)
 
-		#amount Calculation
-		component_amount = frappe.get_all("Salary Detail",
-		filters={
-			"docstatus": 1,
-			'parent': sal_slip,
-			"parentfield": "earnings",
-			'salary_component': "Basic Salary"
-		},
-		fields=["amount"])
+		# amount Calculation
+		component_amount = frappe.get_all(
+			"Salary Detail",
+			filters={
+				"docstatus": 1,
+				"parent": sal_slip,
+				"parentfield": "earnings",
+				"salary_component": "Basic Salary",
+			},
+			fields=["amount"],
+		)
 
-		''' range  | Fraction
+		""" range  | Fraction
 			0-1    |    0
 			1-5    |   0.7
 			5-0    |    1
-		'''
+		"""
 
-		gratuity_amount = ((0 * 1) + (4 * 0.7) + (1 * 1)) *  component_amount[0].amount
+		gratuity_amount = ((0 * 1) + (4 * 0.7) + (1 * 1)) * component_amount[0].amount
 		gratuity.reload()
 
 		self.assertEqual(flt(gratuity_amount, 2), flt(gratuity.amount, 2))
 		self.assertEqual(gratuity.status, "Unpaid")
 
 		from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
+
 		pay_entry = get_payment_entry("Gratuity", gratuity.name)
 		pay_entry.reference_no = "123467"
 		pay_entry.reference_date = getdate()
@@ -115,7 +133,7 @@
 		gratuity.reload()
 
 		self.assertEqual(gratuity.status, "Paid")
-		self.assertEqual(flt(gratuity.paid_amount,2), flt(gratuity.amount, 2))
+		self.assertEqual(flt(gratuity.paid_amount, 2), flt(gratuity.amount, 2))
 
 	def tearDown(self):
 		frappe.db.rollback()
@@ -127,14 +145,13 @@
 		create_gratuity_rule()
 	rule = frappe.get_doc("Gratuity Rule", name)
 	rule.applicable_earnings_component = []
-	rule.append("applicable_earnings_component", {
-		"salary_component": "Basic Salary"
-	})
+	rule.append("applicable_earnings_component", {"salary_component": "Basic Salary"})
 	rule.save()
 	rule.reload()
 
 	return rule
 
+
 def create_gratuity(**args):
 	if args:
 		args = frappe._dict(args)
@@ -147,15 +164,16 @@
 		gratuity.payroll_date = getdate()
 		gratuity.salary_component = "Performance Bonus"
 	else:
-		gratuity.expense_account = args.expense_account or 'Payment Account - _TC'
+		gratuity.expense_account = args.expense_account or "Payment Account - _TC"
 		gratuity.payable_account = args.payable_account or get_payable_account("_Test Company")
-		gratuity.mode_of_payment = args.mode_of_payment or 'Cash'
+		gratuity.mode_of_payment = args.mode_of_payment or "Cash"
 
 	gratuity.save()
 	gratuity.submit()
 
 	return gratuity
 
+
 def set_mode_of_payment_account():
 	if not frappe.db.exists("Account", "Payment Account - _TC"):
 		mode_of_payment = create_account()
@@ -163,14 +181,15 @@
 	mode_of_payment = frappe.get_doc("Mode of Payment", "Cash")
 
 	mode_of_payment.accounts = []
-	mode_of_payment.append("accounts", {
-		"company": "_Test Company",
-		"default_account": "_Test Bank - _TC"
-	})
+	mode_of_payment.append(
+		"accounts", {"company": "_Test Company", "default_account": "_Test Bank - _TC"}
+	)
 	mode_of_payment.save()
 
+
 def create_account():
-	return frappe.get_doc({
+	return frappe.get_doc(
+		{
 			"doctype": "Account",
 			"company": "_Test Company",
 			"account_name": "Payment Account",
@@ -179,13 +198,15 @@
 			"currency": "INR",
 			"parent_account": "Bank Accounts - _TC",
 			"account_type": "Bank",
-		}).insert(ignore_permissions=True)
+		}
+	).insert(ignore_permissions=True)
+
 
 def create_employee_and_get_last_salary_slip():
-	employee = make_employee("test_employee@salary.com", company='_Test Company')
+	employee = make_employee("test_employee@salary.com", company="_Test Company")
 	frappe.db.set_value("Employee", employee, "relieving_date", getdate())
-	frappe.db.set_value("Employee", employee, "date_of_joining", add_days(getdate(), - (6*365)))
-	if not frappe.db.exists("Salary Slip", {"employee":employee}):
+	frappe.db.set_value("Employee", employee, "date_of_joining", add_days(getdate(), -(6 * 365)))
+	if not frappe.db.exists("Salary Slip", {"employee": employee}):
 		salary_slip = make_employee_salary_slip("test_employee@salary.com", "Monthly")
 		salary_slip.submit()
 		salary_slip = salary_slip.name
@@ -194,7 +215,10 @@
 
 	if not frappe.db.get_value("Employee", "test_employee@salary.com", "holiday_list"):
 		from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list
+
 		make_holiday_list()
-		frappe.db.set_value("Company", '_Test Company', "default_holiday_list", "Salary Slip Test Holiday List")
+		frappe.db.set_value(
+			"Company", "_Test Company", "default_holiday_list", "Salary Slip Test Holiday List"
+		)
 
 	return employee, salary_slip
diff --git a/erpnext/payroll/doctype/gratuity_rule/gratuity_rule.py b/erpnext/payroll/doctype/gratuity_rule/gratuity_rule.py
index d30cfc6..5cde79a 100644
--- a/erpnext/payroll/doctype/gratuity_rule/gratuity_rule.py
+++ b/erpnext/payroll/doctype/gratuity_rule/gratuity_rule.py
@@ -8,25 +8,34 @@
 
 
 class GratuityRule(Document):
-
 	def validate(self):
 		for current_slab in self.gratuity_rule_slabs:
 			if (current_slab.from_year > current_slab.to_year) and current_slab.to_year != 0:
-				frappe.throw(_("Row {0}: From (Year) can not be greater than To (Year)").format(current_slab.idx))
+				frappe.throw(
+					_("Row {0}: From (Year) can not be greater than To (Year)").format(current_slab.idx)
+				)
 
-			if current_slab.to_year == 0 and current_slab.from_year == 0 and len(self.gratuity_rule_slabs) > 1:
-				frappe.throw(_("You can not define multiple slabs if you have a slab with no lower and upper limits."))
+			if (
+				current_slab.to_year == 0 and current_slab.from_year == 0 and len(self.gratuity_rule_slabs) > 1
+			):
+				frappe.throw(
+					_("You can not define multiple slabs if you have a slab with no lower and upper limits.")
+				)
+
 
 def get_gratuity_rule(name, slabs, **args):
 	args = frappe._dict(args)
 
 	rule = frappe.new_doc("Gratuity Rule")
 	rule.name = name
-	rule.calculate_gratuity_amount_based_on = args.calculate_gratuity_amount_based_on or "Current Slab"
-	rule.work_experience_calculation_method = args.work_experience_calculation_method or "Take Exact Completed Years"
+	rule.calculate_gratuity_amount_based_on = (
+		args.calculate_gratuity_amount_based_on or "Current Slab"
+	)
+	rule.work_experience_calculation_method = (
+		args.work_experience_calculation_method or "Take Exact Completed Years"
+	)
 	rule.minimum_year_for_gratuity = 1
 
-
 	for slab in slabs:
 		slab = frappe._dict(slab)
 		rule.append("gratuity_rule_slabs", slab)
diff --git a/erpnext/payroll/doctype/gratuity_rule/gratuity_rule_dashboard.py b/erpnext/payroll/doctype/gratuity_rule/gratuity_rule_dashboard.py
index e7c67fb..fa5a9de 100644
--- a/erpnext/payroll/doctype/gratuity_rule/gratuity_rule_dashboard.py
+++ b/erpnext/payroll/doctype/gratuity_rule/gratuity_rule_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'gratuity_rule',
-		'transactions': [
-			{
-				'label': _('Gratuity'),
-				'items': ['Gratuity']
-			}
-		]
+		"fieldname": "gratuity_rule",
+		"transactions": [{"label": _("Gratuity"), "items": ["Gratuity"]}],
 	}
diff --git a/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.py b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.py
index 040b2c8..e62d61f 100644
--- a/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.py
+++ b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.py
@@ -4,7 +4,7 @@
 
 from frappe.model.document import Document
 
-#import frappe
+# import frappe
 import erpnext
 
 
diff --git a/erpnext/payroll/doctype/payroll_entry/payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/payroll_entry.py
index 9061c5f..54d56f9 100644
--- a/erpnext/payroll/doctype/payroll_entry/payroll_entry.py
+++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry.py
@@ -29,11 +29,11 @@
 
 class PayrollEntry(Document):
 	def onload(self):
-		if not self.docstatus==1 or self.salary_slips_submitted:
+		if not self.docstatus == 1 or self.salary_slips_submitted:
 			return
 
 		# check if salary slips were manually submitted
-		entries = frappe.db.count("Salary Slip", {'payroll_entry': self.name, 'docstatus': 1}, ['name'])
+		entries = frappe.db.count("Salary Slip", {"payroll_entry": self.name, "docstatus": 1}, ["name"])
 		if cint(entries) == len(self.employees):
 			self.set_onload("submitted_ss", True)
 
@@ -52,33 +52,51 @@
 	def validate_employee_details(self):
 		emp_with_sal_slip = []
 		for employee_details in self.employees:
-			if frappe.db.exists("Salary Slip", {"employee": employee_details.employee, "start_date": self.start_date, "end_date": self.end_date, "docstatus": 1}):
+			if frappe.db.exists(
+				"Salary Slip",
+				{
+					"employee": employee_details.employee,
+					"start_date": self.start_date,
+					"end_date": self.end_date,
+					"docstatus": 1,
+				},
+			):
 				emp_with_sal_slip.append(employee_details.employee)
 
 		if len(emp_with_sal_slip):
 			frappe.throw(_("Salary Slip already exists for {0}").format(comma_and(emp_with_sal_slip)))
 
 	def on_cancel(self):
-		frappe.delete_doc("Salary Slip", frappe.db.sql_list("""select name from `tabSalary Slip`
-			where payroll_entry=%s """, (self.name)))
+		frappe.delete_doc(
+			"Salary Slip",
+			frappe.db.sql_list(
+				"""select name from `tabSalary Slip`
+			where payroll_entry=%s """,
+				(self.name),
+			),
+		)
 		self.db_set("salary_slips_created", 0)
 		self.db_set("salary_slips_submitted", 0)
 
 	def get_emp_list(self):
 		"""
-			Returns list of active employees based on selected criteria
-			and for which salary structure exists
+		Returns list of active employees based on selected criteria
+		and for which salary structure exists
 		"""
 		self.check_mandatory()
 		filters = self.make_filters()
 		cond = get_filter_condition(filters)
 		cond += get_joining_relieving_condition(self.start_date, self.end_date)
 
-		condition = ''
+		condition = ""
 		if self.payroll_frequency:
-			condition = """and payroll_frequency = '%(payroll_frequency)s'"""% {"payroll_frequency": self.payroll_frequency}
+			condition = """and payroll_frequency = '%(payroll_frequency)s'""" % {
+				"payroll_frequency": self.payroll_frequency
+			}
 
-		sal_struct = get_sal_struct(self.company, self.currency, self.salary_slip_based_on_timesheet, condition)
+		sal_struct = get_sal_struct(
+			self.company, self.currency, self.salary_slip_based_on_timesheet, condition
+		)
 		if sal_struct:
 			cond += "and t2.salary_structure IN %(sal_struct)s "
 			cond += "and t2.payroll_payable_account = %(payroll_payable_account)s "
@@ -89,20 +107,25 @@
 
 	def make_filters(self):
 		filters = frappe._dict()
-		filters['company'] = self.company
-		filters['branch'] = self.branch
-		filters['department'] = self.department
-		filters['designation'] = self.designation
+		filters["company"] = self.company
+		filters["branch"] = self.branch
+		filters["department"] = self.department
+		filters["designation"] = self.designation
 
 		return filters
 
 	@frappe.whitelist()
 	def fill_employee_details(self):
-		self.set('employees', [])
+		self.set("employees", [])
 		employees = self.get_emp_list()
 		if not employees:
-			error_msg = _("No employees found for the mentioned criteria:<br>Company: {0}<br> Currency: {1}<br>Payroll Payable Account: {2}").format(
-				frappe.bold(self.company), frappe.bold(self.currency), frappe.bold(self.payroll_payable_account))
+			error_msg = _(
+				"No employees found for the mentioned criteria:<br>Company: {0}<br> Currency: {1}<br>Payroll Payable Account: {2}"
+			).format(
+				frappe.bold(self.company),
+				frappe.bold(self.currency),
+				frappe.bold(self.payroll_payable_account),
+			)
 			if self.branch:
 				error_msg += "<br>" + _("Branch: {0}").format(frappe.bold(self.branch))
 			if self.department:
@@ -116,38 +139,40 @@
 			frappe.throw(error_msg, title=_("No employees found"))
 
 		for d in employees:
-			self.append('employees', d)
+			self.append("employees", d)
 
 		self.number_of_employees = len(self.employees)
 		if self.validate_attendance:
 			return self.validate_employee_attendance()
 
 	def check_mandatory(self):
-		for fieldname in ['company', 'start_date', 'end_date']:
+		for fieldname in ["company", "start_date", "end_date"]:
 			if not self.get(fieldname):
 				frappe.throw(_("Please set {0}").format(self.meta.get_label(fieldname)))
 
 	@frappe.whitelist()
 	def create_salary_slips(self):
 		"""
-			Creates salary slip for selected employees if already not created
+		Creates salary slip for selected employees if already not created
 		"""
-		self.check_permission('write')
+		self.check_permission("write")
 		employees = [emp.employee for emp in self.employees]
 		if employees:
-			args = frappe._dict({
-				"salary_slip_based_on_timesheet": self.salary_slip_based_on_timesheet,
-				"payroll_frequency": self.payroll_frequency,
-				"start_date": self.start_date,
-				"end_date": self.end_date,
-				"company": self.company,
-				"posting_date": self.posting_date,
-				"deduct_tax_for_unclaimed_employee_benefits": self.deduct_tax_for_unclaimed_employee_benefits,
-				"deduct_tax_for_unsubmitted_tax_exemption_proof": self.deduct_tax_for_unsubmitted_tax_exemption_proof,
-				"payroll_entry": self.name,
-				"exchange_rate": self.exchange_rate,
-				"currency": self.currency
-			})
+			args = frappe._dict(
+				{
+					"salary_slip_based_on_timesheet": self.salary_slip_based_on_timesheet,
+					"payroll_frequency": self.payroll_frequency,
+					"start_date": self.start_date,
+					"end_date": self.end_date,
+					"company": self.company,
+					"posting_date": self.posting_date,
+					"deduct_tax_for_unclaimed_employee_benefits": self.deduct_tax_for_unclaimed_employee_benefits,
+					"deduct_tax_for_unsubmitted_tax_exemption_proof": self.deduct_tax_for_unsubmitted_tax_exemption_proof,
+					"payroll_entry": self.name,
+					"exchange_rate": self.exchange_rate,
+					"currency": self.currency,
+				}
+			)
 			if len(employees) > 30:
 				frappe.enqueue(create_salary_slips_for_employees, timeout=600, employees=employees, args=args)
 			else:
@@ -157,31 +182,33 @@
 
 	def get_sal_slip_list(self, ss_status, as_dict=False):
 		"""
-			Returns list of salary slips based on selected criteria
+		Returns list of salary slips based on selected criteria
 		"""
 
 		ss = frappe.qb.DocType("Salary Slip")
 		ss_list = (
 			frappe.qb.from_(ss)
-				.select(ss.name, ss.salary_structure)
-				.where(
-					(ss.docstatus == ss_status)
-					& (ss.start_date >= self.start_date)
-					& (ss.end_date <= self.end_date)
-					& (ss.payroll_entry == self.name)
-					& ((ss.journal_entry.isnull()) | (ss.journal_entry == ""))
-					& (Coalesce(ss.salary_slip_based_on_timesheet, 0) == self.salary_slip_based_on_timesheet)
-				)
+			.select(ss.name, ss.salary_structure)
+			.where(
+				(ss.docstatus == ss_status)
+				& (ss.start_date >= self.start_date)
+				& (ss.end_date <= self.end_date)
+				& (ss.payroll_entry == self.name)
+				& ((ss.journal_entry.isnull()) | (ss.journal_entry == ""))
+				& (Coalesce(ss.salary_slip_based_on_timesheet, 0) == self.salary_slip_based_on_timesheet)
+			)
 		).run(as_dict=as_dict)
 
 		return ss_list
 
 	@frappe.whitelist()
 	def submit_salary_slips(self):
-		self.check_permission('write')
+		self.check_permission("write")
 		ss_list = self.get_sal_slip_list(ss_status=0)
 		if len(ss_list) > 30:
-			frappe.enqueue(submit_salary_slips_for_employees, timeout=600, payroll_entry=self, salary_slips=ss_list)
+			frappe.enqueue(
+				submit_salary_slips_for_employees, timeout=600, payroll_entry=self, salary_slips=ss_list
+			)
 		else:
 			submit_salary_slips_for_employees(self, ss_list, publish_progress=False)
 
@@ -191,82 +218,96 @@
 				ss.email_salary_slip()
 
 	def get_salary_component_account(self, salary_component):
-		account = frappe.db.get_value("Salary Component Account",
-			{"parent": salary_component, "company": self.company}, "account")
+		account = frappe.db.get_value(
+			"Salary Component Account", {"parent": salary_component, "company": self.company}, "account"
+		)
 
 		if not account:
-			frappe.throw(_("Please set account in Salary Component {0}")
-				.format(salary_component))
+			frappe.throw(_("Please set account in Salary Component {0}").format(salary_component))
 
 		return account
 
 	def get_salary_components(self, component_type):
-		salary_slips = self.get_sal_slip_list(ss_status = 1, as_dict = True)
+		salary_slips = self.get_sal_slip_list(ss_status=1, as_dict=True)
 
 		if salary_slips:
 			ss = frappe.qb.DocType("Salary Slip")
 			ssd = frappe.qb.DocType("Salary Detail")
 			salary_components = (
 				frappe.qb.from_(ss)
-					.join(ssd)
-					.on(ss.name == ssd.parent)
-					.select(ssd.salary_component, ssd.amount, ssd.parentfield, ss.salary_structure, ss.employee)
-					.where(
-						(ssd.parentfield == component_type)
-						& (ss.name.isin(tuple([d.name for d in salary_slips])))
-					)
+				.join(ssd)
+				.on(ss.name == ssd.parent)
+				.select(ssd.salary_component, ssd.amount, ssd.parentfield, ss.salary_structure, ss.employee)
+				.where(
+					(ssd.parentfield == component_type) & (ss.name.isin(tuple([d.name for d in salary_slips])))
+				)
 			).run(as_dict=True)
 
 			return salary_components
 
-	def get_salary_component_total(self, component_type = None):
+	def get_salary_component_total(self, component_type=None):
 		salary_components = self.get_salary_components(component_type)
 		if salary_components:
 			component_dict = {}
 			self.employee_cost_centers = {}
 			for item in salary_components:
-				employee_cost_centers = self.get_payroll_cost_centers_for_employee(item.employee, item.salary_structure)
+				employee_cost_centers = self.get_payroll_cost_centers_for_employee(
+					item.employee, item.salary_structure
+				)
 
 				add_component_to_accrual_jv_entry = True
 				if component_type == "earnings":
-					is_flexible_benefit, only_tax_impact = \
-						frappe.get_cached_value("Salary Component",item['salary_component'], ['is_flexible_benefit', 'only_tax_impact'])
-					if is_flexible_benefit == 1 and only_tax_impact ==1:
+					is_flexible_benefit, only_tax_impact = frappe.get_cached_value(
+						"Salary Component", item["salary_component"], ["is_flexible_benefit", "only_tax_impact"]
+					)
+					if is_flexible_benefit == 1 and only_tax_impact == 1:
 						add_component_to_accrual_jv_entry = False
 
 				if add_component_to_accrual_jv_entry:
 					for cost_center, percentage in employee_cost_centers.items():
 						amount_against_cost_center = flt(item.amount) * percentage / 100
-						component_dict[(item.salary_component, cost_center)] \
-							= component_dict.get((item.salary_component, cost_center), 0) + amount_against_cost_center
+						component_dict[(item.salary_component, cost_center)] = (
+							component_dict.get((item.salary_component, cost_center), 0) + amount_against_cost_center
+						)
 
-			account_details = self.get_account(component_dict = component_dict)
+			account_details = self.get_account(component_dict=component_dict)
 			return account_details
 
 	def get_payroll_cost_centers_for_employee(self, employee, salary_structure):
 		if not self.employee_cost_centers.get(employee):
-			ss_assignment_name = frappe.db.get_value("Salary Structure Assignment",
-				{"employee": employee, "salary_structure": salary_structure, "docstatus": 1}, 'name')
+			ss_assignment_name = frappe.db.get_value(
+				"Salary Structure Assignment",
+				{"employee": employee, "salary_structure": salary_structure, "docstatus": 1},
+				"name",
+			)
 
 			if ss_assignment_name:
-				cost_centers = dict(frappe.get_all("Employee Cost Center", {"parent": ss_assignment_name},
-					["cost_center", "percentage"], as_list=1))
+				cost_centers = dict(
+					frappe.get_all(
+						"Employee Cost Center",
+						{"parent": ss_assignment_name},
+						["cost_center", "percentage"],
+						as_list=1,
+					)
+				)
 				if not cost_centers:
-					default_cost_center, department = frappe.get_cached_value("Employee", employee, ["payroll_cost_center", "department"])
+					default_cost_center, department = frappe.get_cached_value(
+						"Employee", employee, ["payroll_cost_center", "department"]
+					)
 					if not default_cost_center and department:
-						default_cost_center = frappe.get_cached_value("Department", department, "payroll_cost_center")
+						default_cost_center = frappe.get_cached_value(
+							"Department", department, "payroll_cost_center"
+						)
 					if not default_cost_center:
 						default_cost_center = self.cost_center
 
-					cost_centers = {
-						default_cost_center: 100
-					}
+					cost_centers = {default_cost_center: 100}
 
 				self.employee_cost_centers.setdefault(employee, cost_centers)
 
 		return self.employee_cost_centers.get(employee, {})
 
-	def get_account(self, component_dict = None):
+	def get_account(self, component_dict=None):
 		account_dict = {}
 		for key, amount in component_dict.items():
 			account = self.get_salary_component_account(key[0])
@@ -275,8 +316,8 @@
 
 	def make_accrual_jv_entry(self):
 		self.check_permission("write")
-		earnings = self.get_salary_component_total(component_type = "earnings") or {}
-		deductions = self.get_salary_component_total(component_type = "deductions") or {}
+		earnings = self.get_salary_component_total(component_type="earnings") or {}
+		deductions = self.get_salary_component_total(component_type="deductions") or {}
 		payroll_payable_account = self.payroll_payable_account
 		jv_name = ""
 		precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
@@ -284,8 +325,9 @@
 		if earnings or deductions:
 			journal_entry = frappe.new_doc("Journal Entry")
 			journal_entry.voucher_type = "Journal Entry"
-			journal_entry.user_remark = _("Accrual Journal Entry for salaries from {0} to {1}")\
-				.format(self.start_date, self.end_date)
+			journal_entry.user_remark = _("Accrual Journal Entry for salaries from {0} to {1}").format(
+				self.start_date, self.end_date
+			)
 			journal_entry.company = self.company
 			journal_entry.posting_date = self.posting_date
 			accounting_dimensions = get_accounting_dimensions() or []
@@ -298,36 +340,57 @@
 
 			# Earnings
 			for acc_cc, amount in earnings.items():
-				exchange_rate, amt = self.get_amount_and_exchange_rate_for_journal_entry(acc_cc[0], amount, company_currency, currencies)
+				exchange_rate, amt = self.get_amount_and_exchange_rate_for_journal_entry(
+					acc_cc[0], amount, company_currency, currencies
+				)
 				payable_amount += flt(amount, precision)
-				accounts.append(self.update_accounting_dimensions({
-					"account": acc_cc[0],
-					"debit_in_account_currency": flt(amt, precision),
-					"exchange_rate": flt(exchange_rate),
-					"cost_center": acc_cc[1] or self.cost_center,
-					"project": self.project
-				}, accounting_dimensions))
+				accounts.append(
+					self.update_accounting_dimensions(
+						{
+							"account": acc_cc[0],
+							"debit_in_account_currency": flt(amt, precision),
+							"exchange_rate": flt(exchange_rate),
+							"cost_center": acc_cc[1] or self.cost_center,
+							"project": self.project,
+						},
+						accounting_dimensions,
+					)
+				)
 
 			# Deductions
 			for acc_cc, amount in deductions.items():
-				exchange_rate, amt = self.get_amount_and_exchange_rate_for_journal_entry(acc_cc[0], amount, company_currency, currencies)
+				exchange_rate, amt = self.get_amount_and_exchange_rate_for_journal_entry(
+					acc_cc[0], amount, company_currency, currencies
+				)
 				payable_amount -= flt(amount, precision)
-				accounts.append(self.update_accounting_dimensions({
-					"account": acc_cc[0],
-					"credit_in_account_currency": flt(amt, precision),
-					"exchange_rate": flt(exchange_rate),
-					"cost_center": acc_cc[1] or self.cost_center,
-					"project": self.project
-				}, accounting_dimensions))
+				accounts.append(
+					self.update_accounting_dimensions(
+						{
+							"account": acc_cc[0],
+							"credit_in_account_currency": flt(amt, precision),
+							"exchange_rate": flt(exchange_rate),
+							"cost_center": acc_cc[1] or self.cost_center,
+							"project": self.project,
+						},
+						accounting_dimensions,
+					)
+				)
 
 			# Payable amount
-			exchange_rate, payable_amt = self.get_amount_and_exchange_rate_for_journal_entry(payroll_payable_account, payable_amount, company_currency, currencies)
-			accounts.append(self.update_accounting_dimensions({
-				"account": payroll_payable_account,
-				"credit_in_account_currency": flt(payable_amt, precision),
-				"exchange_rate": flt(exchange_rate),
-				"cost_center": self.cost_center
-			}, accounting_dimensions))
+			exchange_rate, payable_amt = self.get_amount_and_exchange_rate_for_journal_entry(
+				payroll_payable_account, payable_amount, company_currency, currencies
+			)
+			accounts.append(
+				self.update_accounting_dimensions(
+					{
+						"account": payroll_payable_account,
+						"credit_in_account_currency": flt(payable_amt, precision),
+						"exchange_rate": flt(exchange_rate),
+						"cost_center": self.cost_center,
+					},
+					accounting_dimensions,
+				)
+			)
 
 			journal_entry.set("accounts", accounts)
 			if len(currencies) > 1:
@@ -339,7 +402,7 @@
 			try:
 				journal_entry.submit()
 				jv_name = journal_entry.name
-				self.update_salary_slip_status(jv_name = jv_name)
+				self.update_salary_slip_status(jv_name=jv_name)
 			except Exception as e:
 				if type(e) in (str, list, tuple):
 					frappe.msgprint(e)
@@ -353,10 +416,12 @@
 
 		return row
 
-	def get_amount_and_exchange_rate_for_journal_entry(self, account, amount, company_currency, currencies):
+	def get_amount_and_exchange_rate_for_journal_entry(
+		self, account, amount, company_currency, currencies
+	):
 		conversion_rate = 1
 		exchange_rate = self.exchange_rate
-		account_currency = frappe.db.get_value('Account', account, 'account_currency')
+		account_currency = frappe.db.get_value("Account", account, "account_currency")
 		if account_currency not in currencies:
 			currencies.append(account_currency)
 		if account_currency == company_currency:
@@ -367,26 +432,45 @@
 
 	@frappe.whitelist()
 	def make_payment_entry(self):
-		self.check_permission('write')
+		self.check_permission("write")
 
-		salary_slip_name_list = frappe.db.sql(""" select t1.name from `tabSalary Slip` t1
+		salary_slip_name_list = frappe.db.sql(
+			""" select t1.name from `tabSalary Slip` t1
 			where t1.docstatus = 1 and start_date >= %s and end_date <= %s and t1.payroll_entry = %s
-			""", (self.start_date, self.end_date, self.name), as_list = True)
+			""",
+			(self.start_date, self.end_date, self.name),
+			as_list=True,
+		)
 
 		if salary_slip_name_list and len(salary_slip_name_list) > 0:
 			salary_slip_total = 0
 			for salary_slip_name in salary_slip_name_list:
 				salary_slip = frappe.get_doc("Salary Slip", salary_slip_name[0])
 				for sal_detail in salary_slip.earnings:
-					is_flexible_benefit, only_tax_impact, creat_separate_je, statistical_component = frappe.db.get_value("Salary Component", sal_detail.salary_component,
-						['is_flexible_benefit', 'only_tax_impact', 'create_separate_payment_entry_against_benefit_claim', 'statistical_component'])
+					(
+						is_flexible_benefit,
+						only_tax_impact,
+						creat_separate_je,
+						statistical_component,
+					) = frappe.db.get_value(
+						"Salary Component",
+						sal_detail.salary_component,
+						[
+							"is_flexible_benefit",
+							"only_tax_impact",
+							"create_separate_payment_entry_against_benefit_claim",
+							"statistical_component",
+						],
+					)
 					if only_tax_impact != 1 and statistical_component != 1:
 						if is_flexible_benefit == 1 and creat_separate_je == 1:
 							self.create_journal_entry(sal_detail.amount, sal_detail.salary_component)
 						else:
 							salary_slip_total += sal_detail.amount
 				for sal_detail in salary_slip.deductions:
-					statistical_component = frappe.db.get_value("Salary Component", sal_detail.salary_component, 'statistical_component')
+					statistical_component = frappe.db.get_value(
+						"Salary Component", sal_detail.salary_component, "statistical_component"
+					)
 					if statistical_component != 1:
 						salary_slip_total -= sal_detail.amount
 			if salary_slip_total > 0:
@@ -402,91 +486,114 @@
 		company_currency = erpnext.get_company_currency(self.company)
 		accounting_dimensions = get_accounting_dimensions() or []
 
-		exchange_rate, amount = self.get_amount_and_exchange_rate_for_journal_entry(self.payment_account, je_payment_amount, company_currency, currencies)
-		accounts.append(self.update_accounting_dimensions({
-			"account": self.payment_account,
-			"bank_account": self.bank_account,
-			"credit_in_account_currency": flt(amount, precision),
-			"exchange_rate": flt(exchange_rate),
-		}, accounting_dimensions))
+		exchange_rate, amount = self.get_amount_and_exchange_rate_for_journal_entry(
+			self.payment_account, je_payment_amount, company_currency, currencies
+		)
+		accounts.append(
+			self.update_accounting_dimensions(
+				{
+					"account": self.payment_account,
+					"bank_account": self.bank_account,
+					"credit_in_account_currency": flt(amount, precision),
+					"exchange_rate": flt(exchange_rate),
+				},
+				accounting_dimensions,
+			)
+		)
 
-		exchange_rate, amount = self.get_amount_and_exchange_rate_for_journal_entry(payroll_payable_account, je_payment_amount, company_currency, currencies)
-		accounts.append(self.update_accounting_dimensions({
-			"account": payroll_payable_account,
-			"debit_in_account_currency": flt(amount, precision),
-			"exchange_rate": flt(exchange_rate),
-			"reference_type": self.doctype,
-			"reference_name": self.name
-		}, accounting_dimensions))
+		exchange_rate, amount = self.get_amount_and_exchange_rate_for_journal_entry(
+			payroll_payable_account, je_payment_amount, company_currency, currencies
+		)
+		accounts.append(
+			self.update_accounting_dimensions(
+				{
+					"account": payroll_payable_account,
+					"debit_in_account_currency": flt(amount, precision),
+					"exchange_rate": flt(exchange_rate),
+					"reference_type": self.doctype,
+					"reference_name": self.name,
+				},
+				accounting_dimensions,
+			)
+		)
 
 		if len(currencies) > 1:
-				multi_currency = 1
+			multi_currency = 1
 
-		journal_entry = frappe.new_doc('Journal Entry')
-		journal_entry.voucher_type = 'Bank Entry'
-		journal_entry.user_remark = _('Payment of {0} from {1} to {2}')\
-			.format(user_remark, self.start_date, self.end_date)
+		journal_entry = frappe.new_doc("Journal Entry")
+		journal_entry.voucher_type = "Bank Entry"
+		journal_entry.user_remark = _("Payment of {0} from {1} to {2}").format(
+			user_remark, self.start_date, self.end_date
+		)
 		journal_entry.company = self.company
 		journal_entry.posting_date = self.posting_date
 		journal_entry.multi_currency = multi_currency
 
 		journal_entry.set("accounts", accounts)
-		journal_entry.save(ignore_permissions = True)
+		journal_entry.save(ignore_permissions=True)
 
-	def update_salary_slip_status(self, jv_name = None):
+	def update_salary_slip_status(self, jv_name=None):
 		ss_list = self.get_sal_slip_list(ss_status=1)
 		for ss in ss_list:
-			ss_obj = frappe.get_doc("Salary Slip",ss[0])
+			ss_obj = frappe.get_doc("Salary Slip", ss[0])
 			frappe.db.set_value("Salary Slip", ss_obj.name, "journal_entry", jv_name)
 
 	def set_start_end_dates(self):
-		self.update(get_start_end_dates(self.payroll_frequency,
-			self.start_date or self.posting_date, self.company))
+		self.update(
+			get_start_end_dates(self.payroll_frequency, self.start_date or self.posting_date, self.company)
+		)
 
 	@frappe.whitelist()
 	def validate_employee_attendance(self):
 		employees_to_mark_attendance = []
 		days_in_payroll, days_holiday, days_attendance_marked = 0, 0, 0
 		for employee_detail in self.employees:
-			employee_joining_date = frappe.db.get_value("Employee", employee_detail.employee, 'date_of_joining')
+			employee_joining_date = frappe.db.get_value(
+				"Employee", employee_detail.employee, "date_of_joining"
+			)
 			start_date = self.start_date
 			if employee_joining_date > getdate(self.start_date):
 				start_date = employee_joining_date
 			days_holiday = self.get_count_holidays_of_employee(employee_detail.employee, start_date)
-			days_attendance_marked = self.get_count_employee_attendance(employee_detail.employee, start_date)
+			days_attendance_marked = self.get_count_employee_attendance(
+				employee_detail.employee, start_date
+			)
 			days_in_payroll = date_diff(self.end_date, start_date) + 1
 			if days_in_payroll > days_holiday + days_attendance_marked:
-				employees_to_mark_attendance.append({
-					"employee": employee_detail.employee,
-					"employee_name": employee_detail.employee_name
-				})
+				employees_to_mark_attendance.append(
+					{"employee": employee_detail.employee, "employee_name": employee_detail.employee_name}
+				)
 		return employees_to_mark_attendance
 
 	def get_count_holidays_of_employee(self, employee, start_date):
 		holiday_list = get_holiday_list_for_employee(employee)
 		holidays = 0
 		if holiday_list:
-			days = frappe.db.sql("""select count(*) from tabHoliday where
-				parent=%s and holiday_date between %s and %s""", (holiday_list,
-				start_date, self.end_date))
+			days = frappe.db.sql(
+				"""select count(*) from tabHoliday where
+				parent=%s and holiday_date between %s and %s""",
+				(holiday_list, start_date, self.end_date),
+			)
 			if days and days[0][0]:
 				holidays = days[0][0]
 		return holidays
 
 	def get_count_employee_attendance(self, employee, start_date):
 		marked_days = 0
-		attendances = frappe.get_all("Attendance",
-			fields = ["count(*)"],
-			filters = {
-				"employee": employee,
-				"attendance_date": ('between', [start_date, self.end_date])
-			}, as_list=1)
+		attendances = frappe.get_all(
+			"Attendance",
+			fields=["count(*)"],
+			filters={"employee": employee, "attendance_date": ("between", [start_date, self.end_date])},
+			as_list=1,
+		)
 		if attendances and attendances[0][0]:
 			marked_days = attendances[0][0]
 		return marked_days
 
+
 def get_sal_struct(company, currency, salary_slip_based_on_timesheet, condition):
-	return frappe.db.sql_list("""
+	return frappe.db.sql_list(
+		"""
 		select
 			name from `tabSalary Structure`
 		where
@@ -495,26 +602,40 @@
 			and company = %(company)s
 			and currency = %(currency)s and
 			ifnull(salary_slip_based_on_timesheet,0) = %(salary_slip_based_on_timesheet)s
-			{condition}""".format(condition=condition),
-		{"company": company, "currency": currency, "salary_slip_based_on_timesheet": salary_slip_based_on_timesheet})
+			{condition}""".format(
+			condition=condition
+		),
+		{
+			"company": company,
+			"currency": currency,
+			"salary_slip_based_on_timesheet": salary_slip_based_on_timesheet,
+		},
+	)
+
 
 def get_filter_condition(filters):
-	cond = ''
-	for f in ['company', 'branch', 'department', 'designation']:
+	cond = ""
+	for f in ["company", "branch", "department", "designation"]:
 		if filters.get(f):
 			cond += " and t1." + f + " = " + frappe.db.escape(filters.get(f))
 
 	return cond
 
+
 def get_joining_relieving_condition(start_date, end_date):
 	cond = """
 		and ifnull(t1.date_of_joining, '0000-00-00') <= '%(end_date)s'
 		and ifnull(t1.relieving_date, '2199-12-31') >= '%(start_date)s'
-	""" % {"start_date": start_date, "end_date": end_date}
+	""" % {
+		"start_date": start_date,
+		"end_date": end_date,
+	}
 	return cond
 
+
 def get_emp_list(sal_struct, cond, end_date, payroll_payable_account):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 			select
 				distinct t1.name as employee, t1.employee_name, t1.department, t1.designation
 			from
@@ -524,19 +645,37 @@
 				and t2.docstatus = 1
 				and t1.status != 'Inactive'
 		%s order by t2.from_date desc
-		""" % cond, {"sal_struct": tuple(sal_struct), "from_date": end_date, "payroll_payable_account": payroll_payable_account}, as_dict=True)
+		"""
+		% cond,
+		{
+			"sal_struct": tuple(sal_struct),
+			"from_date": end_date,
+			"payroll_payable_account": payroll_payable_account,
+		},
+		as_dict=True,
+	)
+
 
 def remove_payrolled_employees(emp_list, start_date, end_date):
 	new_emp_list = []
 	for employee_details in emp_list:
-		if not frappe.db.exists("Salary Slip", {"employee": employee_details.employee, "start_date": start_date, "end_date": end_date, "docstatus": 1}):
+		if not frappe.db.exists(
+			"Salary Slip",
+			{
+				"employee": employee_details.employee,
+				"start_date": start_date,
+				"end_date": end_date,
+				"docstatus": 1,
+			},
+		):
 			new_emp_list.append(employee_details)
 
 	return new_emp_list
 
+
 @frappe.whitelist()
 def get_start_end_dates(payroll_frequency, start_date=None, company=None):
-	'''Returns dict of start and end dates for given payroll frequency based on start_date'''
+	"""Returns dict of start and end dates for given payroll frequency based on start_date"""
 
 	if payroll_frequency == "Monthly" or payroll_frequency == "Bimonthly" or payroll_frequency == "":
 		fiscal_year = get_fiscal_year(start_date, company=company)[0]
@@ -544,14 +683,14 @@
 		m = get_month_details(fiscal_year, month)
 		if payroll_frequency == "Bimonthly":
 			if getdate(start_date).day <= 15:
-				start_date = m['month_start_date']
-				end_date = m['month_mid_end_date']
+				start_date = m["month_start_date"]
+				end_date = m["month_mid_end_date"]
 			else:
-				start_date = m['month_mid_start_date']
-				end_date = m['month_end_date']
+				start_date = m["month_mid_start_date"]
+				end_date = m["month_end_date"]
 		else:
-			start_date = m['month_start_date']
-			end_date = m['month_end_date']
+			start_date = m["month_start_date"]
+			end_date = m["month_end_date"]
 
 	if payroll_frequency == "Weekly":
 		end_date = add_days(start_date, 6)
@@ -562,16 +701,15 @@
 	if payroll_frequency == "Daily":
 		end_date = start_date
 
-	return frappe._dict({
-		'start_date': start_date, 'end_date': end_date
-	})
+	return frappe._dict({"start_date": start_date, "end_date": end_date})
+
 
 def get_frequency_kwargs(frequency_name):
 	frequency_dict = {
-		'monthly': {'months': 1},
-		'fortnightly': {'days': 14},
-		'weekly': {'days': 7},
-		'daily': {'days': 1}
+		"monthly": {"months": 1},
+		"fortnightly": {"days": 14},
+		"weekly": {"days": 7},
+		"daily": {"days": 1},
 	}
 	return frequency_dict.get(frequency_name)
 
@@ -579,16 +717,18 @@
 @frappe.whitelist()
 def get_end_date(start_date, frequency):
 	start_date = getdate(start_date)
-	frequency = frequency.lower() if frequency else 'monthly'
-	kwargs = get_frequency_kwargs(frequency) if frequency != 'bimonthly' else get_frequency_kwargs('monthly')
+	frequency = frequency.lower() if frequency else "monthly"
+	kwargs = (
+		get_frequency_kwargs(frequency) if frequency != "bimonthly" else get_frequency_kwargs("monthly")
+	)
 
 	# weekly, fortnightly and daily intervals have fixed days so no problems
 	end_date = add_to_date(start_date, **kwargs) - relativedelta(days=1)
-	if frequency != 'bimonthly':
+	if frequency != "bimonthly":
 		return dict(end_date=end_date.strftime(DATE_FORMAT))
 
 	else:
-		return dict(end_date='')
+		return dict(end_date="")
 
 
 def get_month_details(year, month):
@@ -596,32 +736,36 @@
 	if ysd:
 		import calendar
 		import datetime
-		diff_mnt = cint(month)-cint(ysd.month)
-		if diff_mnt<0:
-			diff_mnt = 12-int(ysd.month)+cint(month)
-		msd = ysd + relativedelta(months=diff_mnt) # month start date
-		month_days = cint(calendar.monthrange(cint(msd.year) ,cint(month))[1]) # days in month
-		mid_start = datetime.date(msd.year, cint(month), 16) # month mid start date
-		mid_end = datetime.date(msd.year, cint(month), 15) # month mid end date
-		med = datetime.date(msd.year, cint(month), month_days) # month end date
-		return frappe._dict({
-			'year': msd.year,
-			'month_start_date': msd,
-			'month_end_date': med,
-			'month_mid_start_date': mid_start,
-			'month_mid_end_date': mid_end,
-			'month_days': month_days
-		})
+
+		diff_mnt = cint(month) - cint(ysd.month)
+		if diff_mnt < 0:
+			diff_mnt = 12 - int(ysd.month) + cint(month)
+		msd = ysd + relativedelta(months=diff_mnt)  # month start date
+		month_days = cint(calendar.monthrange(cint(msd.year), cint(month))[1])  # days in month
+		mid_start = datetime.date(msd.year, cint(month), 16)  # month mid start date
+		mid_end = datetime.date(msd.year, cint(month), 15)  # month mid end date
+		med = datetime.date(msd.year, cint(month), month_days)  # month end date
+		return frappe._dict(
+			{
+				"year": msd.year,
+				"month_start_date": msd,
+				"month_end_date": med,
+				"month_mid_start_date": mid_start,
+				"month_mid_end_date": mid_end,
+				"month_days": month_days,
+			}
+		)
 	else:
 		frappe.throw(_("Fiscal Year {0} not found").format(year))
 
+
 def get_payroll_entry_bank_entries(payroll_entry_name):
 	journal_entries = frappe.db.sql(
-		'select name from `tabJournal Entry Account` '
+		"select name from `tabJournal Entry Account` "
 		'where reference_type="Payroll Entry" '
-		'and reference_name=%s and docstatus=1',
+		"and reference_name=%s and docstatus=1",
 		payroll_entry_name,
-		as_dict=1
+		as_dict=1,
 	)
 
 	return journal_entries
@@ -631,26 +775,26 @@
 def payroll_entry_has_bank_entries(name):
 	response = {}
 	bank_entries = get_payroll_entry_bank_entries(name)
-	response['submitted'] = 1 if bank_entries else 0
+	response["submitted"] = 1 if bank_entries else 0
 
 	return response
 
+
 def create_salary_slips_for_employees(employees, args, publish_progress=True):
 	salary_slips_exists_for = get_existing_salary_slips(employees, args)
-	count=0
+	count = 0
 	salary_slips_not_created = []
 	for emp in employees:
 		if emp not in salary_slips_exists_for:
-			args.update({
-				"doctype": "Salary Slip",
-				"employee": emp
-			})
+			args.update({"doctype": "Salary Slip", "employee": emp})
 			ss = frappe.get_doc(args)
 			ss.insert()
-			count+=1
+			count += 1
 			if publish_progress:
-				frappe.publish_progress(count*100/len(set(employees) - set(salary_slips_exists_for)),
-					title = _("Creating Salary Slips..."))
+				frappe.publish_progress(
+					count * 100 / len(set(employees) - set(salary_slips_exists_for)),
+					title=_("Creating Salary Slips..."),
+				)
 
 		else:
 			salary_slips_not_created.append(emp)
@@ -660,17 +804,27 @@
 	payroll_entry.notify_update()
 
 	if salary_slips_not_created:
-		frappe.msgprint(_("Salary Slips already exists for employees {}, and will not be processed by this payroll.")
-			.format(frappe.bold(", ".join([emp for emp in salary_slips_not_created]))) , title=_("Message"), indicator="orange")
+		frappe.msgprint(
+			_(
+				"Salary Slips already exists for employees {}, and will not be processed by this payroll."
+			).format(frappe.bold(", ".join([emp for emp in salary_slips_not_created]))),
+			title=_("Message"),
+			indicator="orange",
+		)
+
 
 def get_existing_salary_slips(employees, args):
-	return frappe.db.sql_list("""
+	return frappe.db.sql_list(
+		"""
 		select distinct employee from `tabSalary Slip`
 		where docstatus!= 2 and company = %s and payroll_entry = %s
 			and start_date >= %s and end_date <= %s
 			and employee in (%s)
-	""" % ('%s', '%s', '%s', '%s', ', '.join(['%s']*len(employees))),
-		[args.company, args.payroll_entry, args.start_date, args.end_date] + employees)
+	"""
+		% ("%s", "%s", "%s", "%s", ", ".join(["%s"] * len(employees))),
+		[args.company, args.payroll_entry, args.start_date, args.end_date] + employees,
+	)
+
 
 def submit_salary_slips_for_employees(payroll_entry, salary_slips, publish_progress=True):
 	submitted_ss = []
@@ -679,8 +833,8 @@
 
 	count = 0
 	for ss in salary_slips:
-		ss_obj = frappe.get_doc("Salary Slip",ss[0])
-		if ss_obj.net_pay<0:
+		ss_obj = frappe.get_doc("Salary Slip", ss[0])
+		if ss_obj.net_pay < 0:
 			not_submitted_ss.append(ss[0])
 		else:
 			try:
@@ -691,11 +845,12 @@
 
 		count += 1
 		if publish_progress:
-			frappe.publish_progress(count*100/len(salary_slips), title = _("Submitting Salary Slips..."))
+			frappe.publish_progress(count * 100 / len(salary_slips), title=_("Submitting Salary Slips..."))
 	if submitted_ss:
 		payroll_entry.make_accrual_jv_entry()
-		frappe.msgprint(_("Salary Slip submitted for period from {0} to {1}")
-			.format(ss_obj.start_date, ss_obj.end_date))
+		frappe.msgprint(
+			_("Salary Slip submitted for period from {0} to {1}").format(ss_obj.start_date, ss_obj.end_date)
+		)
 
 		payroll_entry.email_salary_slip(submitted_ss)
 
@@ -703,33 +858,44 @@
 		payroll_entry.notify_update()
 
 	if not submitted_ss and not not_submitted_ss:
-		frappe.msgprint(_("No salary slip found to submit for the above selected criteria OR salary slip already submitted"))
+		frappe.msgprint(
+			_(
+				"No salary slip found to submit for the above selected criteria OR salary slip already submitted"
+			)
+		)
 
 	if not_submitted_ss:
 		frappe.msgprint(_("Could not submit some Salary Slips"))
 
 	frappe.flags.via_payroll_entry = False
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_payroll_entries_for_jv(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select name from `tabPayroll Entry`
 		where `{key}` LIKE %(txt)s
 		and name not in
 			(select reference_name from `tabJournal Entry Account`
 				where reference_type="Payroll Entry")
-		order by name limit %(start)s, %(page_len)s"""
-		.format(key=searchfield), {
-			'txt': "%%%s%%" % txt,
-			'start': start, 'page_len': page_len
-		})
+		order by name limit %(start)s, %(page_len)s""".format(
+			key=searchfield
+		),
+		{"txt": "%%%s%%" % txt, "start": start, "page_len": page_len},
+	)
+
 
 def get_employee_list(filters):
 	cond = get_filter_condition(filters)
 	cond += get_joining_relieving_condition(filters.start_date, filters.end_date)
-	condition = """and payroll_frequency = '%(payroll_frequency)s'"""% {"payroll_frequency": filters.payroll_frequency}
-	sal_struct = get_sal_struct(filters.company, filters.currency, filters.salary_slip_based_on_timesheet, condition)
+	condition = """and payroll_frequency = '%(payroll_frequency)s'""" % {
+		"payroll_frequency": filters.payroll_frequency
+	}
+	sal_struct = get_sal_struct(
+		filters.company, filters.currency, filters.salary_slip_based_on_timesheet, condition
+	)
 	if sal_struct:
 		cond += "and t2.salary_structure IN %(sal_struct)s "
 		cond += "and t2.payroll_payable_account = %(payroll_payable_account)s "
@@ -740,34 +906,38 @@
 
 	return []
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def employee_query(doctype, txt, searchfield, start, page_len, filters):
 	filters = frappe._dict(filters)
 	conditions = []
 	include_employees = []
-	emp_cond = ''
+	emp_cond = ""
 
 	if not filters.payroll_frequency:
-		frappe.throw(_('Select Payroll Frequency.'))
+		frappe.throw(_("Select Payroll Frequency."))
 
 	if filters.start_date and filters.end_date:
 		employee_list = get_employee_list(filters)
-		emp = filters.get('employees') or []
-		include_employees = [employee.employee for employee in employee_list if employee.employee not in emp]
-		filters.pop('start_date')
-		filters.pop('end_date')
-		filters.pop('salary_slip_based_on_timesheet')
-		filters.pop('payroll_frequency')
-		filters.pop('payroll_payable_account')
-		filters.pop('currency')
+		emp = filters.get("employees") or []
+		include_employees = [
+			employee.employee for employee in employee_list if employee.employee not in emp
+		]
+		filters.pop("start_date")
+		filters.pop("end_date")
+		filters.pop("salary_slip_based_on_timesheet")
+		filters.pop("payroll_frequency")
+		filters.pop("payroll_payable_account")
+		filters.pop("currency")
 		if filters.employees is not None:
-			filters.pop('employees')
+			filters.pop("employees")
 
 		if include_employees:
-			emp_cond += 'and employee in %(include_employees)s'
+			emp_cond += "and employee in %(include_employees)s"
 
-	return frappe.db.sql("""select name, employee_name from `tabEmployee`
+	return frappe.db.sql(
+		"""select name, employee_name from `tabEmployee`
 		where status = 'Active'
 			and docstatus < 2
 			and ({key} like %(txt)s
@@ -779,14 +949,19 @@
 			if(locate(%(_txt)s, employee_name), locate(%(_txt)s, employee_name), 99999),
 			idx desc,
 			name, employee_name
-		limit %(start)s, %(page_len)s""".format(**{
-			'key': searchfield,
-			'fcond': get_filters_cond(doctype, filters, conditions),
-			'mcond': get_match_cond(doctype),
-			'emp_cond': emp_cond
-		}), {
-			'txt': "%%%s%%" % txt,
-			'_txt': txt.replace("%", ""),
-			'start': start,
-			'page_len': page_len,
-			'include_employees': include_employees})
+		limit %(start)s, %(page_len)s""".format(
+			**{
+				"key": searchfield,
+				"fcond": get_filters_cond(doctype, filters, conditions),
+				"mcond": get_match_cond(doctype),
+				"emp_cond": emp_cond,
+			}
+		),
+		{
+			"txt": "%%%s%%" % txt,
+			"_txt": txt.replace("%", ""),
+			"start": start,
+			"page_len": page_len,
+			"include_employees": include_employees,
+		},
+	)
diff --git a/erpnext/payroll/doctype/payroll_entry/payroll_entry_dashboard.py b/erpnext/payroll/doctype/payroll_entry/payroll_entry_dashboard.py
index a33b28d..eb93d68 100644
--- a/erpnext/payroll/doctype/payroll_entry/payroll_entry_dashboard.py
+++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry_dashboard.py
@@ -1,13 +1,9 @@
 def get_data():
 	return {
-		'fieldname': 'payroll_entry',
-		'non_standard_fieldnames': {
-			'Journal Entry': 'reference_name',
-			'Payment Entry': 'reference_name',
+		"fieldname": "payroll_entry",
+		"non_standard_fieldnames": {
+			"Journal Entry": "reference_name",
+			"Payment Entry": "reference_name",
 		},
-		'transactions': [
-			{
-				'items': ['Salary Slip', 'Journal Entry']
-			}
-		]
+		"transactions": [{"items": ["Salary Slip", "Journal Entry"]}],
 	}
diff --git a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
index 3b7f4b2..fda0fcf 100644
--- a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
+++ b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
@@ -32,156 +32,240 @@
 	make_salary_structure,
 )
 
-test_dependencies = ['Holiday List']
+test_dependencies = ["Holiday List"]
+
 
 class TestPayrollEntry(unittest.TestCase):
 	@classmethod
 	def setUpClass(cls):
-		frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", '_Test Holiday List')
+		frappe.db.set_value(
+			"Company", erpnext.get_default_company(), "default_holiday_list", "_Test Holiday List"
+		)
 
 	def setUp(self):
-		for dt in ["Salary Slip", "Salary Component", "Salary Component Account",
-			"Payroll Entry", "Salary Structure", "Salary Structure Assignment", "Payroll Employee Detail", "Additional Salary"]:
-				frappe.db.sql("delete from `tab%s`" % dt)
+		for dt in [
+			"Salary Slip",
+			"Salary Component",
+			"Salary Component Account",
+			"Payroll Entry",
+			"Salary Structure",
+			"Salary Structure Assignment",
+			"Payroll Employee Detail",
+			"Additional Salary",
+		]:
+			frappe.db.sql("delete from `tab%s`" % dt)
 
 		make_earning_salary_component(setup=True, company_list=["_Test Company"])
 		make_deduction_salary_component(setup=True, test_tax=False, company_list=["_Test Company"])
 
 		frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 0)
 
-	def test_payroll_entry(self): # pylint: disable=no-self-use
+	def test_payroll_entry(self):  # pylint: disable=no-self-use
 		company = erpnext.get_default_company()
-		for data in frappe.get_all('Salary Component', fields = ["name"]):
-			if not frappe.db.get_value('Salary Component Account',
-				{'parent': data.name, 'company': company}, 'name'):
+		for data in frappe.get_all("Salary Component", fields=["name"]):
+			if not frappe.db.get_value(
+				"Salary Component Account", {"parent": data.name, "company": company}, "name"
+			):
 				get_salary_component_account(data.name)
 
-		employee = frappe.db.get_value("Employee", {'company': company})
-		company_doc = frappe.get_doc('Company', company)
-		make_salary_structure("_Test Salary Structure", "Monthly", employee, company=company, currency=company_doc.default_currency)
-		dates = get_start_end_dates('Monthly', nowdate())
-		if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
-			make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date, payable_account=company_doc.default_payroll_payable_account,
-				currency=company_doc.default_currency)
+		employee = frappe.db.get_value("Employee", {"company": company})
+		company_doc = frappe.get_doc("Company", company)
+		make_salary_structure(
+			"_Test Salary Structure",
+			"Monthly",
+			employee,
+			company=company,
+			currency=company_doc.default_currency,
+		)
+		dates = get_start_end_dates("Monthly", nowdate())
+		if not frappe.db.get_value(
+			"Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}
+		):
+			make_payroll_entry(
+				start_date=dates.start_date,
+				end_date=dates.end_date,
+				payable_account=company_doc.default_payroll_payable_account,
+				currency=company_doc.default_currency,
+			)
 
-	def test_multi_currency_payroll_entry(self): # pylint: disable=no-self-use
+	def test_multi_currency_payroll_entry(self):  # pylint: disable=no-self-use
 		company = erpnext.get_default_company()
 		employee = make_employee("test_muti_currency_employee@payroll.com", company=company)
-		for data in frappe.get_all('Salary Component', fields = ["name"]):
-			if not frappe.db.get_value('Salary Component Account',
-				{'parent': data.name, 'company': company}, 'name'):
+		for data in frappe.get_all("Salary Component", fields=["name"]):
+			if not frappe.db.get_value(
+				"Salary Component Account", {"parent": data.name, "company": company}, "name"
+			):
 				get_salary_component_account(data.name)
 
-		company_doc = frappe.get_doc('Company', company)
-		salary_structure = make_salary_structure("_Test Multi Currency Salary Structure", "Monthly", company=company, currency='USD')
-		create_salary_structure_assignment(employee, salary_structure.name, company=company, currency='USD')
-		frappe.db.sql("""delete from `tabSalary Slip` where employee=%s""",(frappe.db.get_value("Employee", {"user_id": "test_muti_currency_employee@payroll.com"})))
-		salary_slip = get_salary_slip("test_muti_currency_employee@payroll.com", "Monthly", "_Test Multi Currency Salary Structure")
-		dates = get_start_end_dates('Monthly', nowdate())
-		payroll_entry = make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date,
-			payable_account=company_doc.default_payroll_payable_account, currency='USD', exchange_rate=70)
+		company_doc = frappe.get_doc("Company", company)
+		salary_structure = make_salary_structure(
+			"_Test Multi Currency Salary Structure", "Monthly", company=company, currency="USD"
+		)
+		create_salary_structure_assignment(
+			employee, salary_structure.name, company=company, currency="USD"
+		)
+		frappe.db.sql(
+			"""delete from `tabSalary Slip` where employee=%s""",
+			(frappe.db.get_value("Employee", {"user_id": "test_muti_currency_employee@payroll.com"})),
+		)
+		salary_slip = get_salary_slip(
+			"test_muti_currency_employee@payroll.com", "Monthly", "_Test Multi Currency Salary Structure"
+		)
+		dates = get_start_end_dates("Monthly", nowdate())
+		payroll_entry = make_payroll_entry(
+			start_date=dates.start_date,
+			end_date=dates.end_date,
+			payable_account=company_doc.default_payroll_payable_account,
+			currency="USD",
+			exchange_rate=70,
+		)
 		payroll_entry.make_payment_entry()
 
 		salary_slip.load_from_db()
 
 		payroll_je = salary_slip.journal_entry
 		if payroll_je:
-			payroll_je_doc = frappe.get_doc('Journal Entry', payroll_je)
+			payroll_je_doc = frappe.get_doc("Journal Entry", payroll_je)
 
 			self.assertEqual(salary_slip.base_gross_pay, payroll_je_doc.total_debit)
 			self.assertEqual(salary_slip.base_gross_pay, payroll_je_doc.total_credit)
 
-		payment_entry = frappe.db.sql('''
+		payment_entry = frappe.db.sql(
+			"""
 			Select ifnull(sum(je.total_debit),0) as total_debit, ifnull(sum(je.total_credit),0) as total_credit from `tabJournal Entry` je, `tabJournal Entry Account` jea
 			Where je.name = jea.parent
 			And jea.reference_name = %s
-			''', (payroll_entry.name), as_dict=1)
+			""",
+			(payroll_entry.name),
+			as_dict=1,
+		)
 
 		self.assertEqual(salary_slip.base_net_pay, payment_entry[0].total_debit)
 		self.assertEqual(salary_slip.base_net_pay, payment_entry[0].total_credit)
 
-	def test_payroll_entry_with_employee_cost_center(self): # pylint: disable=no-self-use
-		for data in frappe.get_all('Salary Component', fields = ["name"]):
-			if not frappe.db.get_value('Salary Component Account',
-				{'parent': data.name, 'company': "_Test Company"}, 'name'):
+	def test_payroll_entry_with_employee_cost_center(self):  # pylint: disable=no-self-use
+		for data in frappe.get_all("Salary Component", fields=["name"]):
+			if not frappe.db.get_value(
+				"Salary Component Account", {"parent": data.name, "company": "_Test Company"}, "name"
+			):
 				get_salary_component_account(data.name)
 
-		if not frappe.db.exists('Department', "cc - _TC"):
-			frappe.get_doc({
-				'doctype': 'Department',
-				'department_name': "cc",
-				"company": "_Test Company"
-			}).insert()
+		if not frappe.db.exists("Department", "cc - _TC"):
+			frappe.get_doc(
+				{"doctype": "Department", "department_name": "cc", "company": "_Test Company"}
+			).insert()
 
 		frappe.db.sql("""delete from `tabEmployee` where employee_name='test_employee1@example.com' """)
 		frappe.db.sql("""delete from `tabEmployee` where employee_name='test_employee2@example.com' """)
 		frappe.db.sql("""delete from `tabSalary Structure` where name='_Test Salary Structure 1' """)
 		frappe.db.sql("""delete from `tabSalary Structure` where name='_Test Salary Structure 2' """)
 
-		employee1 = make_employee("test_employee1@example.com", payroll_cost_center="_Test Cost Center - _TC",
-			department="cc - _TC", company="_Test Company")
-		employee2 = make_employee("test_employee2@example.com", department="cc - _TC", company="_Test Company")
+		employee1 = make_employee(
+			"test_employee1@example.com",
+			payroll_cost_center="_Test Cost Center - _TC",
+			department="cc - _TC",
+			company="_Test Company",
+		)
+		employee2 = make_employee(
+			"test_employee2@example.com", department="cc - _TC", company="_Test Company"
+		)
 
 		if not frappe.db.exists("Account", "_Test Payroll Payable - _TC"):
-				create_account(account_name="_Test Payroll Payable",
-					company="_Test Company", parent_account="Current Liabilities - _TC", account_type="Payable")
+			create_account(
+				account_name="_Test Payroll Payable",
+				company="_Test Company",
+				parent_account="Current Liabilities - _TC",
+				account_type="Payable",
+			)
 
-		if not frappe.db.get_value("Company", "_Test Company", "default_payroll_payable_account") or \
-			frappe.db.get_value("Company", "_Test Company", "default_payroll_payable_account") != "_Test Payroll Payable - _TC":
-				frappe.db.set_value("Company", "_Test Company", "default_payroll_payable_account",
-					"_Test Payroll Payable - _TC")
-		currency=frappe.db.get_value("Company", "_Test Company", "default_currency")
+		if (
+			not frappe.db.get_value("Company", "_Test Company", "default_payroll_payable_account")
+			or frappe.db.get_value("Company", "_Test Company", "default_payroll_payable_account")
+			!= "_Test Payroll Payable - _TC"
+		):
+			frappe.db.set_value(
+				"Company", "_Test Company", "default_payroll_payable_account", "_Test Payroll Payable - _TC"
+			)
+		currency = frappe.db.get_value("Company", "_Test Company", "default_currency")
 
-		make_salary_structure("_Test Salary Structure 1", "Monthly", employee1, company="_Test Company", currency=currency, test_tax=False)
-		ss = make_salary_structure("_Test Salary Structure 2", "Monthly", employee2, company="_Test Company", currency=currency, test_tax=False)
+		make_salary_structure(
+			"_Test Salary Structure 1",
+			"Monthly",
+			employee1,
+			company="_Test Company",
+			currency=currency,
+			test_tax=False,
+		)
+		ss = make_salary_structure(
+			"_Test Salary Structure 2",
+			"Monthly",
+			employee2,
+			company="_Test Company",
+			currency=currency,
+			test_tax=False,
+		)
 
 		# update cost centers in salary structure assignment for employee2
-		ssa = frappe.db.get_value("Salary Structure Assignment",
-			{"employee": employee2, "salary_structure": ss.name, "docstatus": 1}, 'name')
+		ssa = frappe.db.get_value(
+			"Salary Structure Assignment",
+			{"employee": employee2, "salary_structure": ss.name, "docstatus": 1},
+			"name",
+		)
 
 		ssa_doc = frappe.get_doc("Salary Structure Assignment", ssa)
 		ssa_doc.payroll_cost_centers = []
-		ssa_doc.append("payroll_cost_centers", {
-			"cost_center": "_Test Cost Center - _TC",
-			"percentage": 60
-		})
-		ssa_doc.append("payroll_cost_centers", {
-			"cost_center": "_Test Cost Center 2 - _TC",
-			"percentage": 40
-		})
+		ssa_doc.append(
+			"payroll_cost_centers", {"cost_center": "_Test Cost Center - _TC", "percentage": 60}
+		)
+		ssa_doc.append(
+			"payroll_cost_centers", {"cost_center": "_Test Cost Center 2 - _TC", "percentage": 40}
+		)
 
 		ssa_doc.save()
 
-		dates = get_start_end_dates('Monthly', nowdate())
-		if not frappe.db.get_value("Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}):
-			pe = make_payroll_entry(start_date=dates.start_date, end_date=dates.end_date, payable_account="_Test Payroll Payable - _TC",
-				currency=frappe.db.get_value("Company", "_Test Company", "default_currency"), department="cc - _TC", company="_Test Company", payment_account="Cash - _TC", cost_center="Main - _TC")
+		dates = get_start_end_dates("Monthly", nowdate())
+		if not frappe.db.get_value(
+			"Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}
+		):
+			pe = make_payroll_entry(
+				start_date=dates.start_date,
+				end_date=dates.end_date,
+				payable_account="_Test Payroll Payable - _TC",
+				currency=frappe.db.get_value("Company", "_Test Company", "default_currency"),
+				department="cc - _TC",
+				company="_Test Company",
+				payment_account="Cash - _TC",
+				cost_center="Main - _TC",
+			)
 			je = frappe.db.get_value("Salary Slip", {"payroll_entry": pe.name}, "journal_entry")
-			je_entries = frappe.db.sql("""
+			je_entries = frappe.db.sql(
+				"""
 				select account, cost_center, debit, credit
 				from `tabJournal Entry Account`
 				where parent=%s
 				order by account, cost_center
-			""", je)
+			""",
+				je,
+			)
 			expected_je = (
-				('_Test Payroll Payable - _TC', 'Main - _TC', 0.0, 155600.0),
-				('Salary - _TC', '_Test Cost Center - _TC', 124800.0, 0.0),
-				('Salary - _TC', '_Test Cost Center 2 - _TC', 31200.0, 0.0),
-				('Salary Deductions - _TC', '_Test Cost Center - _TC', 0.0, 320.0),
-				('Salary Deductions - _TC', '_Test Cost Center 2 - _TC', 0.0, 80.0)
+				("_Test Payroll Payable - _TC", "Main - _TC", 0.0, 155600.0),
+				("Salary - _TC", "_Test Cost Center - _TC", 124800.0, 0.0),
+				("Salary - _TC", "_Test Cost Center 2 - _TC", 31200.0, 0.0),
+				("Salary Deductions - _TC", "_Test Cost Center - _TC", 0.0, 320.0),
+				("Salary Deductions - _TC", "_Test Cost Center 2 - _TC", 0.0, 80.0),
 			)
 
 			self.assertEqual(je_entries, expected_je)
 
 	def test_get_end_date(self):
-		self.assertEqual(get_end_date('2017-01-01', 'monthly'), {'end_date': '2017-01-31'})
-		self.assertEqual(get_end_date('2017-02-01', 'monthly'), {'end_date': '2017-02-28'})
-		self.assertEqual(get_end_date('2017-02-01', 'fortnightly'), {'end_date': '2017-02-14'})
-		self.assertEqual(get_end_date('2017-02-01', 'bimonthly'), {'end_date': ''})
-		self.assertEqual(get_end_date('2017-01-01', 'bimonthly'), {'end_date': ''})
-		self.assertEqual(get_end_date('2020-02-15', 'bimonthly'), {'end_date': ''})
-		self.assertEqual(get_end_date('2017-02-15', 'monthly'), {'end_date': '2017-03-14'})
-		self.assertEqual(get_end_date('2017-02-15', 'daily'), {'end_date': '2017-02-15'})
+		self.assertEqual(get_end_date("2017-01-01", "monthly"), {"end_date": "2017-01-31"})
+		self.assertEqual(get_end_date("2017-02-01", "monthly"), {"end_date": "2017-02-28"})
+		self.assertEqual(get_end_date("2017-02-01", "fortnightly"), {"end_date": "2017-02-14"})
+		self.assertEqual(get_end_date("2017-02-01", "bimonthly"), {"end_date": ""})
+		self.assertEqual(get_end_date("2017-01-01", "bimonthly"), {"end_date": ""})
+		self.assertEqual(get_end_date("2020-02-15", "bimonthly"), {"end_date": ""})
+		self.assertEqual(get_end_date("2017-02-15", "monthly"), {"end_date": "2017-03-14"})
+		self.assertEqual(get_end_date("2017-02-15", "daily"), {"end_date": "2017-02-15"})
 
 	def test_loan(self):
 		branch = "Test Employee Branch"
@@ -189,63 +273,88 @@
 		company = "_Test Company"
 		holiday_list = make_holiday("test holiday for loan")
 
-		company_doc = frappe.get_doc('Company', company)
+		company_doc = frappe.get_doc("Company", company)
 		if not company_doc.default_payroll_payable_account:
-			company_doc.default_payroll_payable_account = frappe.db.get_value('Account',
-				{'company': company, 'root_type': 'Liability', 'account_type': ''}, 'name')
+			company_doc.default_payroll_payable_account = frappe.db.get_value(
+				"Account", {"company": company, "root_type": "Liability", "account_type": ""}, "name"
+			)
 			company_doc.save()
 
-		if not frappe.db.exists('Branch', branch):
-			frappe.get_doc({
-				'doctype': 'Branch',
-				'branch': branch
-			}).insert()
+		if not frappe.db.exists("Branch", branch):
+			frappe.get_doc({"doctype": "Branch", "branch": branch}).insert()
 
-		employee_doc = frappe.get_doc('Employee', applicant)
+		employee_doc = frappe.get_doc("Employee", applicant)
 		employee_doc.branch = branch
 		employee_doc.holiday_list = holiday_list
 		employee_doc.save()
 
 		salary_structure = "Test Salary Structure for Loan"
-		make_salary_structure(salary_structure, "Monthly", employee=employee_doc.name, company="_Test Company", currency=company_doc.default_currency)
+		make_salary_structure(
+			salary_structure,
+			"Monthly",
+			employee=employee_doc.name,
+			company="_Test Company",
+			currency=company_doc.default_currency,
+		)
 
 		if not frappe.db.exists("Loan Type", "Car Loan"):
 			create_loan_accounts()
-			create_loan_type("Car Loan", 500000, 8.4,
+			create_loan_type(
+				"Car Loan",
+				500000,
+				8.4,
 				is_term_loan=1,
-				mode_of_payment='Cash',
-				disbursement_account='Disbursement Account - _TC',
-				payment_account='Payment Account - _TC',
-				loan_account='Loan Account - _TC',
-				interest_income_account='Interest Income Account - _TC',
-				penalty_income_account='Penalty Income Account - _TC')
+				mode_of_payment="Cash",
+				disbursement_account="Disbursement Account - _TC",
+				payment_account="Payment Account - _TC",
+				loan_account="Loan Account - _TC",
+				interest_income_account="Interest Income Account - _TC",
+				penalty_income_account="Penalty Income Account - _TC",
+			)
 
-		loan = create_loan(applicant, "Car Loan", 280000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
+		loan = create_loan(
+			applicant,
+			"Car Loan",
+			280000,
+			"Repay Over Number of Periods",
+			20,
+			posting_date=add_months(nowdate(), -1),
+		)
 		loan.repay_from_salary = 1
 		loan.submit()
 
-		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1))
+		make_loan_disbursement_entry(
+			loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1)
+		)
 		process_loan_interest_accrual_for_term_loans(posting_date=nowdate())
 
-		dates = get_start_end_dates('Monthly', nowdate())
-		make_payroll_entry(company="_Test Company", start_date=dates.start_date, payable_account=company_doc.default_payroll_payable_account,
-			currency=company_doc.default_currency, end_date=dates.end_date, branch=branch, cost_center="Main - _TC", payment_account="Cash - _TC")
+		dates = get_start_end_dates("Monthly", nowdate())
+		make_payroll_entry(
+			company="_Test Company",
+			start_date=dates.start_date,
+			payable_account=company_doc.default_payroll_payable_account,
+			currency=company_doc.default_currency,
+			end_date=dates.end_date,
+			branch=branch,
+			cost_center="Main - _TC",
+			payment_account="Cash - _TC",
+		)
 
-		name = frappe.db.get_value('Salary Slip',
-			{'posting_date': nowdate(), 'employee': applicant}, 'name')
+		name = frappe.db.get_value(
+			"Salary Slip", {"posting_date": nowdate(), "employee": applicant}, "name"
+		)
 
-		salary_slip = frappe.get_doc('Salary Slip', name)
+		salary_slip = frappe.get_doc("Salary Slip", name)
 		for row in salary_slip.loans:
 			if row.loan == loan.name:
-				interest_amount = (280000 * 8.4)/(12*100)
+				interest_amount = (280000 * 8.4) / (12 * 100)
 				principal_amount = loan.monthly_repayment_amount - interest_amount
 				self.assertEqual(row.interest_amount, interest_amount)
 				self.assertEqual(row.principal_amount, principal_amount)
-				self.assertEqual(row.total_payment,
-					interest_amount + principal_amount)
+				self.assertEqual(row.total_payment, interest_amount + principal_amount)
 
 		if salary_slip.docstatus == 0:
-			frappe.delete_doc('Salary Slip', name)
+			frappe.delete_doc("Salary Slip", name)
 
 
 def make_payroll_entry(**args):
@@ -274,17 +383,22 @@
 	payroll_entry.save()
 	payroll_entry.create_salary_slips()
 	payroll_entry.submit_salary_slips()
-	if payroll_entry.get_sal_slip_list(ss_status = 1):
+	if payroll_entry.get_sal_slip_list(ss_status=1):
 		payroll_entry.make_payment_entry()
 
 	return payroll_entry
 
+
 def get_payment_account():
-	return frappe.get_value('Account',
-		{'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name")
+	return frappe.get_value(
+		"Account",
+		{"account_type": "Cash", "company": erpnext.get_default_company(), "is_group": 0},
+		"name",
+	)
+
 
 def make_holiday(holiday_list_name):
-	if not frappe.db.exists('Holiday List', holiday_list_name):
+	if not frappe.db.exists("Holiday List", holiday_list_name):
 		current_fiscal_year = get_fiscal_year(nowdate(), as_dict=True)
 		dt = getdate(nowdate())
 
@@ -292,25 +406,23 @@
 		republic_day = dt + relativedelta(month=1, day=26, year=dt.year)
 		test_holiday = dt + relativedelta(month=2, day=2, year=dt.year)
 
-		frappe.get_doc({
-			'doctype': 'Holiday List',
-			'from_date': current_fiscal_year.year_start_date,
-			'to_date': current_fiscal_year.year_end_date,
-			'holiday_list_name': holiday_list_name,
-			'holidays': [{
-				'holiday_date': new_year,
-				'description': 'New Year'
-			}, {
-				'holiday_date': republic_day,
-				'description': 'Republic Day'
-			}, {
-				'holiday_date': test_holiday,
-				'description': 'Test Holiday'
-			}]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Holiday List",
+				"from_date": current_fiscal_year.year_start_date,
+				"to_date": current_fiscal_year.year_end_date,
+				"holiday_list_name": holiday_list_name,
+				"holidays": [
+					{"holiday_date": new_year, "description": "New Year"},
+					{"holiday_date": republic_day, "description": "Republic Day"},
+					{"holiday_date": test_holiday, "description": "Test Holiday"},
+				],
+			}
+		).insert()
 
 	return holiday_list_name
 
+
 def get_salary_slip(user, period, salary_structure):
 	salary_slip = make_employee_salary_slip(user, period, salary_structure)
 	salary_slip.exchange_rate = 70
diff --git a/erpnext/payroll/doctype/payroll_period/payroll_period.py b/erpnext/payroll/doctype/payroll_period/payroll_period.py
index 659ec6d..e1f1cab 100644
--- a/erpnext/payroll/doctype/payroll_period/payroll_period.py
+++ b/erpnext/payroll/doctype/payroll_period/payroll_period.py
@@ -30,71 +30,92 @@
 			"""
 		if not self.name:
 			# hack! if name is null, it could cause problems with !=
-			self.name = "New "+self.doctype
+			self.name = "New " + self.doctype
 
-		overlap_doc = frappe.db.sql(query.format(self.doctype),{
+		overlap_doc = frappe.db.sql(
+			query.format(self.doctype),
+			{
 				"start_date": self.start_date,
 				"end_date": self.end_date,
 				"name": self.name,
-				"company": self.company
-			}, as_dict = 1)
+				"company": self.company,
+			},
+			as_dict=1,
+		)
 
 		if overlap_doc:
-			msg = _("A {0} exists between {1} and {2} (").format(self.doctype,
-				formatdate(self.start_date), formatdate(self.end_date)) \
-				+ """ <b><a href="/app/Form/{0}/{1}">{1}</a></b>""".format(self.doctype, overlap_doc[0].name) \
+			msg = (
+				_("A {0} exists between {1} and {2} (").format(
+					self.doctype, formatdate(self.start_date), formatdate(self.end_date)
+				)
+				+ """ <b><a href="/app/Form/{0}/{1}">{1}</a></b>""".format(self.doctype, overlap_doc[0].name)
 				+ _(") for {0}").format(self.company)
+			)
 			frappe.throw(msg)
 
+
 def get_payroll_period_days(start_date, end_date, employee, company=None):
 	if not company:
 		company = frappe.db.get_value("Employee", employee, "company")
-	payroll_period = frappe.db.sql("""
+	payroll_period = frappe.db.sql(
+		"""
 		select name, start_date, end_date
 		from `tabPayroll Period`
 		where
 			company=%(company)s
 			and %(start_date)s between start_date and end_date
 			and %(end_date)s between start_date and end_date
-	""", {
-		'company': company,
-		'start_date': start_date,
-		'end_date': end_date
-	})
+	""",
+		{"company": company, "start_date": start_date, "end_date": end_date},
+	)
 
 	if len(payroll_period) > 0:
 		actual_no_of_days = date_diff(getdate(payroll_period[0][2]), getdate(payroll_period[0][1])) + 1
 		working_days = actual_no_of_days
-		if not cint(frappe.db.get_value("Payroll Settings", None, "include_holidays_in_total_working_days")):
-			holidays = get_holiday_dates_for_employee(employee, getdate(payroll_period[0][1]), getdate(payroll_period[0][2]))
+		if not cint(
+			frappe.db.get_value("Payroll Settings", None, "include_holidays_in_total_working_days")
+		):
+			holidays = get_holiday_dates_for_employee(
+				employee, getdate(payroll_period[0][1]), getdate(payroll_period[0][2])
+			)
 			working_days -= len(holidays)
 		return payroll_period[0][0], working_days, actual_no_of_days
 	return False, False, False
 
+
 def get_payroll_period(from_date, to_date, company):
-	payroll_period = frappe.db.sql("""
+	payroll_period = frappe.db.sql(
+		"""
 		select name, start_date, end_date
 		from `tabPayroll Period`
 		where start_date<=%s and end_date>= %s and company=%s
-	""", (from_date, to_date, company), as_dict=1)
+	""",
+		(from_date, to_date, company),
+		as_dict=1,
+	)
 
 	return payroll_period[0] if payroll_period else None
 
-def get_period_factor(employee, start_date, end_date, payroll_frequency, payroll_period, depends_on_payment_days=0):
+
+def get_period_factor(
+	employee, start_date, end_date, payroll_frequency, payroll_period, depends_on_payment_days=0
+):
 	# TODO if both deduct checked update the factor to make tax consistent
 	period_start, period_end = payroll_period.start_date, payroll_period.end_date
-	joining_date, relieving_date = frappe.db.get_value("Employee", employee, ["date_of_joining", "relieving_date"])
+	joining_date, relieving_date = frappe.db.get_value(
+		"Employee", employee, ["date_of_joining", "relieving_date"]
+	)
 
 	if getdate(joining_date) > getdate(period_start):
 		period_start = joining_date
 	if relieving_date and getdate(relieving_date) < getdate(period_end):
 		period_end = relieving_date
 		if month_diff(period_end, start_date) > 1:
-			start_date = add_months(start_date, - (month_diff(period_end, start_date)+1))
+			start_date = add_months(start_date, -(month_diff(period_end, start_date) + 1))
 
 	total_sub_periods, remaining_sub_periods = 0.0, 0.0
 
-	if payroll_frequency ==  "Monthly" and not depends_on_payment_days:
+	if payroll_frequency == "Monthly" and not depends_on_payment_days:
 		total_sub_periods = month_diff(payroll_period.end_date, payroll_period.start_date)
 		remaining_sub_periods = month_diff(period_end, start_date)
 	else:
diff --git a/erpnext/payroll/doctype/payroll_period/payroll_period_dashboard.py b/erpnext/payroll/doctype/payroll_period/payroll_period_dashboard.py
index 8a3332f..96632c5 100644
--- a/erpnext/payroll/doctype/payroll_period/payroll_period_dashboard.py
+++ b/erpnext/payroll/doctype/payroll_period/payroll_period_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
-     return {
-        'fieldname': 'payroll_period',
-        'transactions': [
-            {
-                'items': ['Employee Tax Exemption Proof Submission', 'Employee Tax Exemption Declaration']
-            },
-        ],
-    }
+	return {
+		"fieldname": "payroll_period",
+		"transactions": [
+			{"items": ["Employee Tax Exemption Proof Submission", "Employee Tax Exemption Declaration"]},
+		],
+	}
diff --git a/erpnext/payroll/doctype/payroll_settings/payroll_settings.py b/erpnext/payroll/doctype/payroll_settings/payroll_settings.py
index 6fd3094..33614e9 100644
--- a/erpnext/payroll/doctype/payroll_settings/payroll_settings.py
+++ b/erpnext/payroll/doctype/payroll_settings/payroll_settings.py
@@ -21,12 +21,25 @@
 			if not self.password_policy:
 				frappe.throw(_("Password policy for Salary Slips is not set"))
 
-
 	def on_update(self):
 		self.toggle_rounded_total()
 		frappe.clear_cache()
 
 	def toggle_rounded_total(self):
 		self.disable_rounded_total = cint(self.disable_rounded_total)
-		make_property_setter("Salary Slip", "rounded_total", "hidden", self.disable_rounded_total, "Check", validate_fields_for_doctype=False)
-		make_property_setter("Salary Slip", "rounded_total", "print_hide", self.disable_rounded_total, "Check", validate_fields_for_doctype=False)
+		make_property_setter(
+			"Salary Slip",
+			"rounded_total",
+			"hidden",
+			self.disable_rounded_total,
+			"Check",
+			validate_fields_for_doctype=False,
+		)
+		make_property_setter(
+			"Salary Slip",
+			"rounded_total",
+			"print_hide",
+			self.disable_rounded_total,
+			"Check",
+			validate_fields_for_doctype=False,
+		)
diff --git a/erpnext/payroll/doctype/retention_bonus/retention_bonus.py b/erpnext/payroll/doctype/retention_bonus/retention_bonus.py
index 10e8381..cdcd9a9 100644
--- a/erpnext/payroll/doctype/retention_bonus/retention_bonus.py
+++ b/erpnext/payroll/doctype/retention_bonus/retention_bonus.py
@@ -14,14 +14,14 @@
 	def validate(self):
 		validate_active_employee(self.employee)
 		if getdate(self.bonus_payment_date) < getdate():
-			frappe.throw(_('Bonus Payment Date cannot be a past date'))
+			frappe.throw(_("Bonus Payment Date cannot be a past date"))
 
 	def on_submit(self):
-		company = frappe.db.get_value('Employee', self.employee, 'company')
+		company = frappe.db.get_value("Employee", self.employee, "company")
 		additional_salary = self.get_additional_salary()
 
 		if not additional_salary:
-			additional_salary = frappe.new_doc('Additional Salary')
+			additional_salary = frappe.new_doc("Additional Salary")
 			additional_salary.employee = self.employee
 			additional_salary.salary_component = self.salary_component
 			additional_salary.amount = self.bonus_amount
@@ -34,29 +34,36 @@
 			# self.db_set('additional_salary', additional_salary.name)
 
 		else:
-			bonus_added = frappe.db.get_value('Additional Salary', additional_salary, 'amount') + self.bonus_amount
-			frappe.db.set_value('Additional Salary', additional_salary, 'amount', bonus_added)
-			self.db_set('additional_salary', additional_salary)
+			bonus_added = (
+				frappe.db.get_value("Additional Salary", additional_salary, "amount") + self.bonus_amount
+			)
+			frappe.db.set_value("Additional Salary", additional_salary, "amount", bonus_added)
+			self.db_set("additional_salary", additional_salary)
 
 	def on_cancel(self):
 
 		additional_salary = self.get_additional_salary()
 		if self.additional_salary:
-			bonus_removed = frappe.db.get_value('Additional Salary', self.additional_salary, 'amount') - self.bonus_amount
+			bonus_removed = (
+				frappe.db.get_value("Additional Salary", self.additional_salary, "amount") - self.bonus_amount
+			)
 			if bonus_removed == 0:
-				frappe.get_doc('Additional Salary', self.additional_salary).cancel()
+				frappe.get_doc("Additional Salary", self.additional_salary).cancel()
 			else:
-				frappe.db.set_value('Additional Salary', self.additional_salary, 'amount', bonus_removed)
+				frappe.db.set_value("Additional Salary", self.additional_salary, "amount", bonus_removed)
 
 			# self.db_set('additional_salary', '')
 
 	def get_additional_salary(self):
-		return frappe.db.exists('Additional Salary', {
-				'employee': self.employee,
-				'salary_component': self.salary_component,
-				'payroll_date': self.bonus_payment_date,
-				'company': self.company,
-				'docstatus': 1,
-				'ref_doctype': self.doctype,
-				'ref_docname': self.name
-			})
+		return frappe.db.exists(
+			"Additional Salary",
+			{
+				"employee": self.employee,
+				"salary_component": self.salary_component,
+				"payroll_date": self.bonus_payment_date,
+				"company": self.company,
+				"docstatus": 1,
+				"ref_doctype": self.doctype,
+				"ref_docname": self.name,
+			},
+		)
diff --git a/erpnext/payroll/doctype/salary_component/salary_component.py b/erpnext/payroll/doctype/salary_component/salary_component.py
index b8def58..409c4a1 100644
--- a/erpnext/payroll/doctype/salary_component/salary_component.py
+++ b/erpnext/payroll/doctype/salary_component/salary_component.py
@@ -12,9 +12,13 @@
 
 	def validate_abbr(self):
 		if not self.salary_component_abbr:
-			self.salary_component_abbr = ''.join([c[0] for c in
-				self.salary_component.split()]).upper()
+			self.salary_component_abbr = "".join([c[0] for c in self.salary_component.split()]).upper()
 
 		self.salary_component_abbr = self.salary_component_abbr.strip()
-		self.salary_component_abbr = append_number_if_name_exists('Salary Component', self.salary_component_abbr,
-			'salary_component_abbr', separator='_', filters={"name": ["!=", self.name]})
+		self.salary_component_abbr = append_number_if_name_exists(
+			"Salary Component",
+			self.salary_component_abbr,
+			"salary_component_abbr",
+			separator="_",
+			filters={"name": ["!=", self.name]},
+		)
diff --git a/erpnext/payroll/doctype/salary_component/test_salary_component.py b/erpnext/payroll/doctype/salary_component/test_salary_component.py
index 6e00971..cd729e8 100644
--- a/erpnext/payroll/doctype/salary_component/test_salary_component.py
+++ b/erpnext/payroll/doctype/salary_component/test_salary_component.py
@@ -7,15 +7,18 @@
 
 # test_records = frappe.get_test_records('Salary Component')
 
+
 class TestSalaryComponent(unittest.TestCase):
 	pass
 
 
 def create_salary_component(component_name, **args):
 	if not frappe.db.exists("Salary Component", component_name):
-			frappe.get_doc({
+		frappe.get_doc(
+			{
 				"doctype": "Salary Component",
 				"salary_component": component_name,
 				"type": args.get("type") or "Earning",
-				"is_tax_applicable": args.get("is_tax_applicable") or 1
-			}).insert()
+				"is_tax_applicable": args.get("is_tax_applicable") or 1,
+			}
+		).insert()
diff --git a/erpnext/payroll/doctype/salary_slip/salary_slip.py b/erpnext/payroll/doctype/salary_slip/salary_slip.py
index caaed1f..38fecac 100644
--- a/erpnext/payroll/doctype/salary_slip/salary_slip.py
+++ b/erpnext/payroll/doctype/salary_slip/salary_slip.py
@@ -48,14 +48,14 @@
 class SalarySlip(TransactionBase):
 	def __init__(self, *args, **kwargs):
 		super(SalarySlip, self).__init__(*args, **kwargs)
-		self.series = 'Sal Slip/{0}/.#####'.format(self.employee)
+		self.series = "Sal Slip/{0}/.#####".format(self.employee)
 		self.whitelisted_globals = {
 			"int": int,
 			"float": float,
 			"long": int,
 			"round": round,
 			"date": datetime.date,
-			"getdate": getdate
+			"getdate": getdate,
 		}
 
 	def autoname(self):
@@ -73,7 +73,7 @@
 			# get details from salary structure
 			self.get_emp_and_working_day_details()
 		else:
-			self.get_working_days_details(lwp = self.leave_without_pay)
+			self.get_working_days_details(lwp=self.leave_without_pay)
 
 		self.calculate_net_pay()
 		self.compute_year_to_date()
@@ -82,10 +82,16 @@
 		self.add_leave_balances()
 
 		if frappe.db.get_single_value("Payroll Settings", "max_working_hours_against_timesheet"):
-			max_working_hours = frappe.db.get_single_value("Payroll Settings", "max_working_hours_against_timesheet")
+			max_working_hours = frappe.db.get_single_value(
+				"Payroll Settings", "max_working_hours_against_timesheet"
+			)
 			if self.salary_slip_based_on_timesheet and (self.total_working_hours > int(max_working_hours)):
-				frappe.msgprint(_("Total working hours should not be greater than max working hours {0}").
-								format(max_working_hours), alert=True)
+				frappe.msgprint(
+					_("Total working hours should not be greater than max working hours {0}").format(
+						max_working_hours
+					),
+					alert=True,
+				)
 
 	def set_net_total_in_words(self):
 		doc_currency = self.currency
@@ -102,19 +108,25 @@
 			self.set_status()
 			self.update_status(self.name)
 			self.make_loan_repayment_entry()
-			if (frappe.db.get_single_value("Payroll Settings", "email_salary_slip_to_employee")) and not frappe.flags.via_payroll_entry:
+			if (
+				frappe.db.get_single_value("Payroll Settings", "email_salary_slip_to_employee")
+			) and not frappe.flags.via_payroll_entry:
 				self.email_salary_slip()
 
 		self.update_payment_status_for_gratuity()
 
 	def update_payment_status_for_gratuity(self):
-		add_salary = frappe.db.get_all("Additional Salary",
-			filters = {
+		add_salary = frappe.db.get_all(
+			"Additional Salary",
+			filters={
 				"payroll_date": ("BETWEEN", [self.start_date, self.end_date]),
 				"employee": self.employee,
 				"ref_doctype": "Gratuity",
 				"docstatus": 1,
-			}, fields = ["ref_docname", "name"], limit=1)
+			},
+			fields=["ref_docname", "name"],
+			limit=1,
+		)
 
 		if len(add_salary):
 			status = "Paid" if self.docstatus == 1 else "Unpaid"
@@ -129,6 +141,7 @@
 
 	def on_trash(self):
 		from frappe.model.naming import revert_series_if_last
+
 		revert_series_if_last(self.series, self.name)
 
 	def get_status(self):
@@ -146,9 +159,7 @@
 
 		if not joining_date:
 			joining_date, relieving_date = frappe.get_cached_value(
-				"Employee",
-				self.employee,
-				("date_of_joining", "relieving_date")
+				"Employee", self.employee, ("date_of_joining", "relieving_date")
 			)
 
 		if date_diff(self.end_date, joining_date) < 0:
@@ -165,16 +176,26 @@
 			cond = ""
 			if self.payroll_entry:
 				cond += "and payroll_entry = '{0}'".format(self.payroll_entry)
-			ret_exist = frappe.db.sql("""select name from `tabSalary Slip`
+			ret_exist = frappe.db.sql(
+				"""select name from `tabSalary Slip`
 						where start_date = %s and end_date = %s and docstatus != 2
-						and employee = %s and name != %s {0}""".format(cond),
-						(self.start_date, self.end_date, self.employee, self.name))
+						and employee = %s and name != %s {0}""".format(
+					cond
+				),
+				(self.start_date, self.end_date, self.employee, self.name),
+			)
 			if ret_exist:
-				frappe.throw(_("Salary Slip of employee {0} already created for this period").format(self.employee))
+				frappe.throw(
+					_("Salary Slip of employee {0} already created for this period").format(self.employee)
+				)
 		else:
 			for data in self.timesheets:
-				if frappe.db.get_value('Timesheet', data.time_sheet, 'status') == 'Payrolled':
-					frappe.throw(_("Salary Slip of employee {0} already created for time sheet {1}").format(self.employee, data.time_sheet))
+				if frappe.db.get_value("Timesheet", data.time_sheet, "status") == "Payrolled":
+					frappe.throw(
+						_("Salary Slip of employee {0} already created for time sheet {1}").format(
+							self.employee, data.time_sheet
+						)
+					)
 
 	def get_date_details(self):
 		if not self.end_date:
@@ -184,7 +205,7 @@
 
 	@frappe.whitelist()
 	def get_emp_and_working_day_details(self):
-		'''First time, load all the components from salary structure'''
+		"""First time, load all the components from salary structure"""
 		if self.employee:
 			self.set("earnings", [])
 			self.set("deductions", [])
@@ -193,52 +214,65 @@
 				self.get_date_details()
 
 			joining_date, relieving_date = frappe.get_cached_value(
-				"Employee",
-				self.employee,
-				("date_of_joining", "relieving_date")
+				"Employee", self.employee, ("date_of_joining", "relieving_date")
 			)
 
 			self.validate_dates(joining_date, relieving_date)
 
-			#getin leave details
+			# getin leave details
 			self.get_working_days_details(joining_date, relieving_date)
 			struct = self.check_sal_struct(joining_date, relieving_date)
 
 			if struct:
-				self._salary_structure_doc = frappe.get_doc('Salary Structure', struct)
-				self.salary_slip_based_on_timesheet = self._salary_structure_doc.salary_slip_based_on_timesheet or 0
+				self._salary_structure_doc = frappe.get_doc("Salary Structure", struct)
+				self.salary_slip_based_on_timesheet = (
+					self._salary_structure_doc.salary_slip_based_on_timesheet or 0
+				)
 				self.set_time_sheet()
 				self.pull_sal_struct()
-				ps = frappe.db.get_value("Payroll Settings", None, ["payroll_based_on","consider_unmarked_attendance_as"], as_dict=1)
+				ps = frappe.db.get_value(
+					"Payroll Settings", None, ["payroll_based_on", "consider_unmarked_attendance_as"], as_dict=1
+				)
 				return [ps.payroll_based_on, ps.consider_unmarked_attendance_as]
 
 	def set_time_sheet(self):
 		if self.salary_slip_based_on_timesheet:
 			self.set("timesheets", [])
-			timesheets = frappe.db.sql(""" select * from `tabTimesheet` where employee = %(employee)s and start_date BETWEEN %(start_date)s AND %(end_date)s and (status = 'Submitted' or
-				status = 'Billed')""", {'employee': self.employee, 'start_date': self.start_date, 'end_date': self.end_date}, as_dict=1)
+			timesheets = frappe.db.sql(
+				""" select * from `tabTimesheet` where employee = %(employee)s and start_date BETWEEN %(start_date)s AND %(end_date)s and (status = 'Submitted' or
+				status = 'Billed')""",
+				{"employee": self.employee, "start_date": self.start_date, "end_date": self.end_date},
+				as_dict=1,
+			)
 
 			for data in timesheets:
-				self.append('timesheets', {
-					'time_sheet': data.name,
-					'working_hours': data.total_hours
-				})
+				self.append("timesheets", {"time_sheet": data.name, "working_hours": data.total_hours})
 
 	def check_sal_struct(self, joining_date, relieving_date):
 		cond = """and sa.employee=%(employee)s and (sa.from_date <= %(start_date)s or
 				sa.from_date <= %(end_date)s or sa.from_date <= %(joining_date)s)"""
 		if self.payroll_frequency:
-			cond += """and ss.payroll_frequency = '%(payroll_frequency)s'""" % {"payroll_frequency": self.payroll_frequency}
+			cond += """and ss.payroll_frequency = '%(payroll_frequency)s'""" % {
+				"payroll_frequency": self.payroll_frequency
+			}
 
-		st_name = frappe.db.sql("""
+		st_name = frappe.db.sql(
+			"""
 			select sa.salary_structure
 			from `tabSalary Structure Assignment` sa join `tabSalary Structure` ss
 			where sa.salary_structure=ss.name
 				and sa.docstatus = 1 and ss.docstatus = 1 and ss.is_active ='Yes' %s
 			order by sa.from_date desc
 			limit 1
-		""" %cond, {'employee': self.employee, 'start_date': self.start_date,
-			'end_date': self.end_date, 'joining_date': joining_date})
+		"""
+			% cond,
+			{
+				"employee": self.employee,
+				"start_date": self.start_date,
+				"end_date": self.end_date,
+				"joining_date": joining_date,
+			},
+		)
 
 		if st_name:
 			self.salary_structure = st_name[0][0]
@@ -246,8 +280,12 @@
 
 		else:
 			self.salary_structure = None
-			frappe.msgprint(_("No active or default Salary Structure found for employee {0} for the given dates")
-				.format(self.employee), title=_('Salary Structure Missing'))
+			frappe.msgprint(
+				_("No active or default Salary Structure found for employee {0} for the given dates").format(
+					self.employee
+				),
+				title=_("Salary Structure Missing"),
+			)
 
 	def pull_sal_struct(self):
 		from erpnext.payroll.doctype.salary_structure.salary_structure import make_salary_slip
@@ -259,13 +297,19 @@
 			self.total_working_hours = sum([d.working_hours or 0.0 for d in self.timesheets]) or 0.0
 			wages_amount = self.hour_rate * self.total_working_hours
 
-			self.add_earning_for_hourly_wages(self, self._salary_structure_doc.salary_component, wages_amount)
+			self.add_earning_for_hourly_wages(
+				self, self._salary_structure_doc.salary_component, wages_amount
+			)
 
 		make_salary_slip(self._salary_structure_doc.name, self)
 
-	def get_working_days_details(self, joining_date=None, relieving_date=None, lwp=None, for_preview=0):
+	def get_working_days_details(
+		self, joining_date=None, relieving_date=None, lwp=None, for_preview=0
+	):
 		payroll_based_on = frappe.db.get_value("Payroll Settings", None, "payroll_based_on")
-		include_holidays_in_total_working_days = frappe.db.get_single_value("Payroll Settings", "include_holidays_in_total_working_days")
+		include_holidays_in_total_working_days = frappe.db.get_single_value(
+			"Payroll Settings", "include_holidays_in_total_working_days"
+		)
 
 		working_days = date_diff(self.end_date, self.start_date) + 1
 		if for_preview:
@@ -292,14 +336,16 @@
 		if not lwp:
 			lwp = actual_lwp
 		elif lwp != actual_lwp:
-			frappe.msgprint(_("Leave Without Pay does not match with approved {} records")
-				.format(payroll_based_on))
+			frappe.msgprint(
+				_("Leave Without Pay does not match with approved {} records").format(payroll_based_on)
+			)
 
 		self.leave_without_pay = lwp
 		self.total_working_days = working_days
 
-		payment_days = self.get_payment_days(joining_date,
-			relieving_date, include_holidays_in_total_working_days)
+		payment_days = self.get_payment_days(
+			joining_date, relieving_date, include_holidays_in_total_working_days
+		)
 
 		if flt(payment_days) > flt(lwp):
 			self.payment_days = flt(payment_days) - flt(lwp)
@@ -307,43 +353,53 @@
 			if payroll_based_on == "Attendance":
 				self.payment_days -= flt(absent)
 
-			consider_unmarked_attendance_as = frappe.db.get_value("Payroll Settings", None, "consider_unmarked_attendance_as") or "Present"
+			consider_unmarked_attendance_as = (
+				frappe.db.get_value("Payroll Settings", None, "consider_unmarked_attendance_as") or "Present"
+			)
 
-			if payroll_based_on == "Attendance" and consider_unmarked_attendance_as =="Absent":
+			if payroll_based_on == "Attendance" and consider_unmarked_attendance_as == "Absent":
 				unmarked_days = self.get_unmarked_days(include_holidays_in_total_working_days)
-				self.absent_days += unmarked_days #will be treated as absent
+				self.absent_days += unmarked_days  # will be treated as absent
 				self.payment_days -= unmarked_days
 		else:
 			self.payment_days = 0
 
 	def get_unmarked_days(self, include_holidays_in_total_working_days):
 		unmarked_days = self.total_working_days
-		joining_date, relieving_date = frappe.get_cached_value("Employee", self.employee,
-			["date_of_joining", "relieving_date"])
+		joining_date, relieving_date = frappe.get_cached_value(
+			"Employee", self.employee, ["date_of_joining", "relieving_date"]
+		)
 		start_date = self.start_date
 		end_date = self.end_date
 
 		if joining_date and (getdate(self.start_date) < joining_date <= getdate(self.end_date)):
 			start_date = joining_date
-			unmarked_days = self.get_unmarked_days_based_on_doj_or_relieving(unmarked_days,
-				include_holidays_in_total_working_days, self.start_date, joining_date)
+			unmarked_days = self.get_unmarked_days_based_on_doj_or_relieving(
+				unmarked_days, include_holidays_in_total_working_days, self.start_date, joining_date
+			)
 
 		if relieving_date and (getdate(self.start_date) <= relieving_date < getdate(self.end_date)):
 			end_date = relieving_date
-			unmarked_days = self.get_unmarked_days_based_on_doj_or_relieving(unmarked_days,
-				include_holidays_in_total_working_days, relieving_date, self.end_date)
+			unmarked_days = self.get_unmarked_days_based_on_doj_or_relieving(
+				unmarked_days, include_holidays_in_total_working_days, relieving_date, self.end_date
+			)
 
 		# exclude days for which attendance has been marked
-		unmarked_days -= frappe.get_all("Attendance", filters = {
-			"attendance_date": ["between", [start_date, end_date]],
-			"employee": self.employee,
-			"docstatus": 1
-		}, fields = ["COUNT(*) as marked_days"])[0].marked_days
+		unmarked_days -= frappe.get_all(
+			"Attendance",
+			filters={
+				"attendance_date": ["between", [start_date, end_date]],
+				"employee": self.employee,
+				"docstatus": 1,
+			},
+			fields=["COUNT(*) as marked_days"],
+		)[0].marked_days
 
 		return unmarked_days
 
-	def get_unmarked_days_based_on_doj_or_relieving(self, unmarked_days,
-		include_holidays_in_total_working_days, start_date, end_date):
+	def get_unmarked_days_based_on_doj_or_relieving(
+		self, unmarked_days, include_holidays_in_total_working_days, start_date, end_date
+	):
 		"""
 		Exclude days before DOJ or after
 		Relieving Date from unmarked days
@@ -363,8 +419,9 @@
 
 	def get_payment_days(self, joining_date, relieving_date, include_holidays_in_total_working_days):
 		if not joining_date:
-			joining_date, relieving_date = frappe.get_cached_value("Employee", self.employee,
-				["date_of_joining", "relieving_date"])
+			joining_date, relieving_date = frappe.get_cached_value(
+				"Employee", self.employee, ["date_of_joining", "relieving_date"]
+			)
 
 		start_date = getdate(self.start_date)
 		if joining_date:
@@ -378,8 +435,7 @@
 			if getdate(self.start_date) <= relieving_date <= getdate(self.end_date):
 				end_date = relieving_date
 			elif relieving_date < getdate(self.start_date):
-				frappe.throw(_("Employee relieved on {0} must be set as 'Left'")
-					.format(relieving_date))
+				frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(relieving_date))
 
 		payment_days = date_diff(end_date, start_date) + 1
 
@@ -395,12 +451,14 @@
 	def calculate_lwp_or_ppl_based_on_leave_application(self, holidays, working_days):
 		lwp = 0
 		holidays = "','".join(holidays)
-		daily_wages_fraction_for_half_day = \
+		daily_wages_fraction_for_half_day = (
 			flt(frappe.db.get_value("Payroll Settings", None, "daily_wages_fraction_for_half_day")) or 0.5
+		)
 
 		for d in range(working_days):
 			dt = add_days(cstr(getdate(self.start_date)), d)
-			leave = frappe.db.sql("""
+			leave = frappe.db.sql(
+				"""
 				SELECT t1.name,
 					CASE WHEN (t1.half_day_date = %(dt)s or t1.to_date = t1.from_date)
 					THEN t1.half_day else 0 END,
@@ -418,7 +476,11 @@
 					WHEN t2.include_holiday
 						THEN %(dt)s between from_date and to_date
 					END
-				""".format(holidays), {"employee": self.employee, "dt": dt})
+				""".format(
+					holidays
+				),
+				{"employee": self.employee, "dt": dt},
+			)
 
 			if leave:
 				equivalent_lwp_count = 0
@@ -426,10 +488,12 @@
 				is_partially_paid_leave = cint(leave[0][2])
 				fraction_of_daily_salary_per_leave = flt(leave[0][3])
 
-				equivalent_lwp_count =  (1 - daily_wages_fraction_for_half_day) if is_half_day_leave else 1
+				equivalent_lwp_count = (1 - daily_wages_fraction_for_half_day) if is_half_day_leave else 1
 
 				if is_partially_paid_leave:
-					equivalent_lwp_count *= fraction_of_daily_salary_per_leave if fraction_of_daily_salary_per_leave else 1
+					equivalent_lwp_count *= (
+						fraction_of_daily_salary_per_leave if fraction_of_daily_salary_per_leave else 1
+					)
 
 				lwp += equivalent_lwp_count
 
@@ -439,18 +503,22 @@
 		lwp = 0
 		absent = 0
 
-		daily_wages_fraction_for_half_day = \
+		daily_wages_fraction_for_half_day = (
 			flt(frappe.db.get_value("Payroll Settings", None, "daily_wages_fraction_for_half_day")) or 0.5
+		)
 
-		leave_types = frappe.get_all("Leave Type",
+		leave_types = frappe.get_all(
+			"Leave Type",
 			or_filters=[["is_ppl", "=", 1], ["is_lwp", "=", 1]],
-			fields =["name", "is_lwp", "is_ppl", "fraction_of_daily_salary_per_leave", "include_holiday"])
+			fields=["name", "is_lwp", "is_ppl", "fraction_of_daily_salary_per_leave", "include_holiday"],
+		)
 
 		leave_type_map = {}
 		for leave_type in leave_types:
 			leave_type_map[leave_type.name] = leave_type
 
-		attendances = frappe.db.sql('''
+		attendances = frappe.db.sql(
+			"""
 			SELECT attendance_date, status, leave_type
 			FROM `tabAttendance`
 			WHERE
@@ -458,30 +526,46 @@
 				AND employee = %s
 				AND docstatus = 1
 				AND attendance_date between %s and %s
-		''', values=(self.employee, self.start_date, self.end_date), as_dict=1)
+		""",
+			values=(self.employee, self.start_date, self.end_date),
+			as_dict=1,
+		)
 
 		for d in attendances:
-			if d.status in ('Half Day', 'On Leave') and d.leave_type and d.leave_type not in leave_type_map.keys():
+			if (
+				d.status in ("Half Day", "On Leave")
+				and d.leave_type
+				and d.leave_type not in leave_type_map.keys()
+			):
 				continue
 
 			if formatdate(d.attendance_date, "yyyy-mm-dd") in holidays:
-				if d.status == "Absent" or \
-					(d.leave_type and d.leave_type in leave_type_map.keys() and not leave_type_map[d.leave_type]['include_holiday']):
-						continue
+				if d.status == "Absent" or (
+					d.leave_type
+					and d.leave_type in leave_type_map.keys()
+					and not leave_type_map[d.leave_type]["include_holiday"]
+				):
+					continue
 
 			if d.leave_type:
-				fraction_of_daily_salary_per_leave = leave_type_map[d.leave_type]["fraction_of_daily_salary_per_leave"]
+				fraction_of_daily_salary_per_leave = leave_type_map[d.leave_type][
+					"fraction_of_daily_salary_per_leave"
+				]
 
 			if d.status == "Half Day":
-				equivalent_lwp =  (1 - daily_wages_fraction_for_half_day)
+				equivalent_lwp = 1 - daily_wages_fraction_for_half_day
 
 				if d.leave_type in leave_type_map.keys() and leave_type_map[d.leave_type]["is_ppl"]:
-					equivalent_lwp *= fraction_of_daily_salary_per_leave if fraction_of_daily_salary_per_leave else 1
+					equivalent_lwp *= (
+						fraction_of_daily_salary_per_leave if fraction_of_daily_salary_per_leave else 1
+					)
 				lwp += equivalent_lwp
 			elif d.status == "On Leave" and d.leave_type and d.leave_type in leave_type_map.keys():
 				equivalent_lwp = 1
 				if leave_type_map[d.leave_type]["is_ppl"]:
-					equivalent_lwp *= fraction_of_daily_salary_per_leave if fraction_of_daily_salary_per_leave else 1
+					equivalent_lwp *= (
+						fraction_of_daily_salary_per_leave if fraction_of_daily_salary_per_leave else 1
+					)
 				lwp += equivalent_lwp
 			elif d.status == "Absent":
 				absent += 1
@@ -501,15 +585,17 @@
 				"abbr": frappe.db.get_value("Salary Component", salary_component, "salary_component_abbr"),
 				"amount": self.hour_rate * self.total_working_hours,
 				"default_amount": 0.0,
-				"additional_amount": 0.0
+				"additional_amount": 0.0,
 			}
-			doc.append('earnings', wages_row)
+			doc.append("earnings", wages_row)
 
 	def calculate_net_pay(self):
 		if self.salary_structure:
 			self.calculate_component_amounts("earnings")
 		self.gross_pay = self.get_component_totals("earnings", depends_on_payment_days=1)
-		self.base_gross_pay = flt(flt(self.gross_pay) * flt(self.exchange_rate), self.precision('base_gross_pay'))
+		self.base_gross_pay = flt(
+			flt(self.gross_pay) * flt(self.exchange_rate), self.precision("base_gross_pay")
+		)
 
 		if self.salary_structure:
 			self.calculate_component_amounts("deductions")
@@ -520,18 +606,24 @@
 
 	def set_net_pay(self):
 		self.total_deduction = self.get_component_totals("deductions")
-		self.base_total_deduction = flt(flt(self.total_deduction) * flt(self.exchange_rate), self.precision('base_total_deduction'))
+		self.base_total_deduction = flt(
+			flt(self.total_deduction) * flt(self.exchange_rate), self.precision("base_total_deduction")
+		)
 		self.net_pay = flt(self.gross_pay) - (flt(self.total_deduction) + flt(self.total_loan_repayment))
 		self.rounded_total = rounded(self.net_pay)
-		self.base_net_pay = flt(flt(self.net_pay) * flt(self.exchange_rate), self.precision('base_net_pay'))
-		self.base_rounded_total = flt(rounded(self.base_net_pay), self.precision('base_net_pay'))
+		self.base_net_pay = flt(
+			flt(self.net_pay) * flt(self.exchange_rate), self.precision("base_net_pay")
+		)
+		self.base_rounded_total = flt(rounded(self.base_net_pay), self.precision("base_net_pay"))
 		if self.hour_rate:
-			self.base_hour_rate = flt(flt(self.hour_rate) * flt(self.exchange_rate), self.precision('base_hour_rate'))
+			self.base_hour_rate = flt(
+				flt(self.hour_rate) * flt(self.exchange_rate), self.precision("base_hour_rate")
+			)
 		self.set_net_total_in_words()
 
 	def calculate_component_amounts(self, component_type):
-		if not getattr(self, '_salary_structure_doc', None):
-			self._salary_structure_doc = frappe.get_doc('Salary Structure', self.salary_structure)
+		if not getattr(self, "_salary_structure_doc", None):
+			self._salary_structure_doc = frappe.get_doc("Salary Structure", self.salary_structure)
 
 		payroll_period = get_payroll_period(self.start_date, self.end_date, self.company)
 
@@ -550,15 +642,13 @@
 				self.update_component_row(struct_row, amount, component_type)
 
 	def get_data_for_eval(self):
-		'''Returns data for evaluating formula'''
+		"""Returns data for evaluating formula"""
 		data = frappe._dict()
 		employee = frappe.get_doc("Employee", self.employee).as_dict()
 
 		start_date = getdate(self.start_date)
 		date_to_validate = (
-			employee.date_of_joining
-			if employee.date_of_joining > start_date
-			else start_date
+			employee.date_of_joining if employee.date_of_joining > start_date else start_date
 		)
 
 		salary_structure_assignment = frappe.get_value(
@@ -576,8 +666,9 @@
 
 		if not salary_structure_assignment:
 			frappe.throw(
-				_("Please assign a Salary Structure for Employee {0} "
-				"applicable from or before {1} first").format(
+				_(
+					"Please assign a Salary Structure for Employee {0} " "applicable from or before {1} first"
+				).format(
 					frappe.bold(self.employee_name),
 					frappe.bold(formatdate(date_to_validate)),
 				)
@@ -592,7 +683,7 @@
 		for sc in salary_components:
 			data.setdefault(sc.salary_component_abbr, 0)
 
-		for key in ('earnings', 'deductions'):
+		for key in ("earnings", "deductions"):
 			for d in self.get(key):
 				data[d.abbr] = d.amount
 
@@ -615,8 +706,10 @@
 			return amount
 
 		except NameError as err:
-			frappe.throw(_("{0} <br> This error can be due to missing or deleted field.").format(err),
-				title=_("Name error"))
+			frappe.throw(
+				_("{0} <br> This error can be due to missing or deleted field.").format(err),
+				title=_("Name error"),
+			)
 		except SyntaxError as err:
 			frappe.throw(_("Syntax error in formula or condition: {0}").format(err))
 		except Exception as e:
@@ -626,13 +719,27 @@
 	def add_employee_benefits(self, payroll_period):
 		for struct_row in self._salary_structure_doc.get("earnings"):
 			if struct_row.is_flexible_benefit == 1:
-				if frappe.db.get_value("Salary Component", struct_row.salary_component, "pay_against_benefit_claim") != 1:
-					benefit_component_amount = get_benefit_component_amount(self.employee, self.start_date, self.end_date,
-						struct_row.salary_component, self._salary_structure_doc, self.payroll_frequency, payroll_period)
+				if (
+					frappe.db.get_value(
+						"Salary Component", struct_row.salary_component, "pay_against_benefit_claim"
+					)
+					!= 1
+				):
+					benefit_component_amount = get_benefit_component_amount(
+						self.employee,
+						self.start_date,
+						self.end_date,
+						struct_row.salary_component,
+						self._salary_structure_doc,
+						self.payroll_frequency,
+						payroll_period,
+					)
 					if benefit_component_amount:
 						self.update_component_row(struct_row, benefit_component_amount, "earnings")
 				else:
-					benefit_claim_amount = get_benefit_claim_amount(self.employee, self.start_date, self.end_date, struct_row.salary_component)
+					benefit_claim_amount = get_benefit_claim_amount(
+						self.employee, self.start_date, self.end_date, struct_row.salary_component
+					)
 					if benefit_claim_amount:
 						self.update_component_row(struct_row, benefit_claim_amount, "earnings")
 
@@ -640,9 +747,10 @@
 
 	def adjust_benefits_in_last_payroll_period(self, payroll_period):
 		if payroll_period:
-			if (getdate(payroll_period.end_date) <= getdate(self.end_date)):
-				last_benefits = get_last_payroll_period_benefits(self.employee, self.start_date, self.end_date,
-					payroll_period, self._salary_structure_doc)
+			if getdate(payroll_period.end_date) <= getdate(self.end_date):
+				last_benefits = get_last_payroll_period_benefits(
+					self.employee, self.start_date, self.end_date, payroll_period, self._salary_structure_doc
+				)
 				if last_benefits:
 					for last_benefit in last_benefits:
 						last_benefit = frappe._dict(last_benefit)
@@ -650,8 +758,9 @@
 						self.update_component_row(frappe._dict(last_benefit.struct_row), amount, "earnings")
 
 	def add_additional_salary_components(self, component_type):
-		additional_salaries = get_additional_salaries(self.employee,
-			self.start_date, self.end_date, component_type)
+		additional_salaries = get_additional_salaries(
+			self.employee, self.start_date, self.end_date, component_type
+		)
 
 		for additional_salary in additional_salaries:
 			self.update_component_row(
@@ -659,7 +768,7 @@
 				additional_salary.amount,
 				component_type,
 				additional_salary,
-				is_recurring = additional_salary.is_recurring
+				is_recurring=additional_salary.is_recurring,
 			)
 
 	def add_tax_components(self, payroll_period):
@@ -672,40 +781,43 @@
 				other_deduction_components.append(d.salary_component)
 
 		if not tax_components:
-			tax_components = [d.name for d in frappe.get_all("Salary Component", filters={"variable_based_on_taxable_salary": 1})
-				if d.name not in other_deduction_components]
+			tax_components = [
+				d.name
+				for d in frappe.get_all("Salary Component", filters={"variable_based_on_taxable_salary": 1})
+				if d.name not in other_deduction_components
+			]
 
 		for d in tax_components:
 			tax_amount = self.calculate_variable_based_on_taxable_salary(d, payroll_period)
 			tax_row = get_salary_component_data(d)
 			self.update_component_row(tax_row, tax_amount, "deductions")
 
-	def update_component_row(self, component_data, amount, component_type, additional_salary=None, is_recurring = 0):
+	def update_component_row(
+		self, component_data, amount, component_type, additional_salary=None, is_recurring=0
+	):
 		component_row = None
 		for d in self.get(component_type):
 			if d.salary_component != component_data.salary_component:
 				continue
 
-			if (
-				(
-					not d.additional_salary
-					and (not additional_salary or additional_salary.overwrite)
-				) or (
-					additional_salary
-					and additional_salary.name == d.additional_salary
-				)
+			if (not d.additional_salary and (not additional_salary or additional_salary.overwrite)) or (
+				additional_salary and additional_salary.name == d.additional_salary
 			):
 				component_row = d
 				break
 
 		if additional_salary and additional_salary.overwrite:
 			# Additional Salary with overwrite checked, remove default rows of same component
-			self.set(component_type, [
-				d for d in self.get(component_type)
-				if d.salary_component != component_data.salary_component
-				or (d.additional_salary and additional_salary.name != d.additional_salary)
-				or d == component_row
-			])
+			self.set(
+				component_type,
+				[
+					d
+					for d in self.get(component_type)
+					if d.salary_component != component_data.salary_component
+					or (d.additional_salary and additional_salary.name != d.additional_salary)
+					or d == component_row
+				],
+			)
 
 		if not component_row:
 			if not amount:
@@ -713,30 +825,38 @@
 
 			component_row = self.append(component_type)
 			for attr in (
-				'depends_on_payment_days', 'salary_component', 'abbr',
-				'do_not_include_in_total', 'is_tax_applicable',
-				'is_flexible_benefit', 'variable_based_on_taxable_salary',
-				'exempted_from_income_tax'
+				"depends_on_payment_days",
+				"salary_component",
+				"abbr",
+				"do_not_include_in_total",
+				"is_tax_applicable",
+				"is_flexible_benefit",
+				"variable_based_on_taxable_salary",
+				"exempted_from_income_tax",
 			):
 				component_row.set(attr, component_data.get(attr))
 
 		if additional_salary:
 			if additional_salary.overwrite:
-				component_row.additional_amount = flt(flt(amount) - flt(component_row.get("default_amount", 0)),
-					component_row.precision("additional_amount"))
+				component_row.additional_amount = flt(
+					flt(amount) - flt(component_row.get("default_amount", 0)),
+					component_row.precision("additional_amount"),
+				)
 			else:
 				component_row.default_amount = 0
 				component_row.additional_amount = amount
 
 			component_row.is_recurring_additional_salary = is_recurring
 			component_row.additional_salary = additional_salary.name
-			component_row.deduct_full_tax_on_selected_payroll_date = \
+			component_row.deduct_full_tax_on_selected_payroll_date = (
 				additional_salary.deduct_full_tax_on_selected_payroll_date
+			)
 		else:
 			component_row.default_amount = amount
 			component_row.additional_amount = 0
-			component_row.deduct_full_tax_on_selected_payroll_date = \
+			component_row.deduct_full_tax_on_selected_payroll_date = (
 				component_data.deduct_full_tax_on_selected_payroll_date
+			)
 
 		component_row.amount = amount
 
@@ -744,7 +864,9 @@
 
 	def update_component_amount_based_on_payment_days(self, component_row):
 		joining_date, relieving_date = self.get_joining_and_relieving_dates()
-		component_row.amount = self.get_amount_based_on_payment_days(component_row, joining_date, relieving_date)[0]
+		component_row.amount = self.get_amount_based_on_payment_days(
+			component_row, joining_date, relieving_date
+		)[0]
 
 	def set_precision_for_component_amounts(self):
 		for component_type in ("earnings", "deductions"):
@@ -753,8 +875,11 @@
 
 	def calculate_variable_based_on_taxable_salary(self, tax_component, payroll_period):
 		if not payroll_period:
-			frappe.msgprint(_("Start and end dates not in a valid Payroll Period, cannot calculate {0}.")
-				.format(tax_component))
+			frappe.msgprint(
+				_("Start and end dates not in a valid Payroll Period, cannot calculate {0}.").format(
+					tax_component
+				)
+			)
 			return
 
 		# Deduct taxes forcefully for unsubmitted tax exemption proof and unclaimed benefits in the last period
@@ -769,23 +894,34 @@
 		tax_slab = self.get_income_tax_slabs(payroll_period)
 
 		# get remaining numbers of sub-period (period for which one salary is processed)
-		remaining_sub_periods = get_period_factor(self.employee,
-			self.start_date, self.end_date, self.payroll_frequency, payroll_period)[1]
+		remaining_sub_periods = get_period_factor(
+			self.employee, self.start_date, self.end_date, self.payroll_frequency, payroll_period
+		)[1]
 		# get taxable_earnings, paid_taxes for previous period
-		previous_taxable_earnings = self.get_taxable_earnings_for_prev_period(payroll_period.start_date,
-			self.start_date, tax_slab.allow_tax_exemption)
-		previous_total_paid_taxes = self.get_tax_paid_in_period(payroll_period.start_date, self.start_date, tax_component)
+		previous_taxable_earnings = self.get_taxable_earnings_for_prev_period(
+			payroll_period.start_date, self.start_date, tax_slab.allow_tax_exemption
+		)
+		previous_total_paid_taxes = self.get_tax_paid_in_period(
+			payroll_period.start_date, self.start_date, tax_component
+		)
 
 		# get taxable_earnings for current period (all days)
-		current_taxable_earnings = self.get_taxable_earnings(tax_slab.allow_tax_exemption, payroll_period=payroll_period)
-		future_structured_taxable_earnings = current_taxable_earnings.taxable_earnings * (math.ceil(remaining_sub_periods) - 1)
+		current_taxable_earnings = self.get_taxable_earnings(
+			tax_slab.allow_tax_exemption, payroll_period=payroll_period
+		)
+		future_structured_taxable_earnings = current_taxable_earnings.taxable_earnings * (
+			math.ceil(remaining_sub_periods) - 1
+		)
 
 		# get taxable_earnings, addition_earnings for current actual payment days
-		current_taxable_earnings_for_payment_days = self.get_taxable_earnings(tax_slab.allow_tax_exemption,
-			based_on_payment_days=1, payroll_period=payroll_period)
+		current_taxable_earnings_for_payment_days = self.get_taxable_earnings(
+			tax_slab.allow_tax_exemption, based_on_payment_days=1, payroll_period=payroll_period
+		)
 		current_structured_taxable_earnings = current_taxable_earnings_for_payment_days.taxable_earnings
 		current_additional_earnings = current_taxable_earnings_for_payment_days.additional_income
-		current_additional_earnings_with_full_tax = current_taxable_earnings_for_payment_days.additional_income_with_full_tax
+		current_additional_earnings_with_full_tax = (
+			current_taxable_earnings_for_payment_days.additional_income_with_full_tax
+		)
 
 		# Get taxable unclaimed benefits
 		unclaimed_taxable_benefits = 0
@@ -796,20 +932,32 @@
 		# Total exemption amount based on tax exemption declaration
 		total_exemption_amount = self.get_total_exemption_amount(payroll_period, tax_slab)
 
-		#Employee Other Incomes
+		# Employee Other Incomes
 		other_incomes = self.get_income_form_other_sources(payroll_period) or 0.0
 
 		# Total taxable earnings including additional and other incomes
-		total_taxable_earnings = previous_taxable_earnings + current_structured_taxable_earnings + future_structured_taxable_earnings \
-			+ current_additional_earnings + other_incomes + unclaimed_taxable_benefits - total_exemption_amount
+		total_taxable_earnings = (
+			previous_taxable_earnings
+			+ current_structured_taxable_earnings
+			+ future_structured_taxable_earnings
+			+ current_additional_earnings
+			+ other_incomes
+			+ unclaimed_taxable_benefits
+			- total_exemption_amount
+		)
 
 		# Total taxable earnings without additional earnings with full tax
-		total_taxable_earnings_without_full_tax_addl_components = total_taxable_earnings - current_additional_earnings_with_full_tax
+		total_taxable_earnings_without_full_tax_addl_components = (
+			total_taxable_earnings - current_additional_earnings_with_full_tax
+		)
 
 		# Structured tax amount
 		total_structured_tax_amount = self.calculate_tax_by_tax_slab(
-			total_taxable_earnings_without_full_tax_addl_components, tax_slab)
-		current_structured_tax_amount = (total_structured_tax_amount - previous_total_paid_taxes) / remaining_sub_periods
+			total_taxable_earnings_without_full_tax_addl_components, tax_slab
+		)
+		current_structured_tax_amount = (
+			total_structured_tax_amount - previous_total_paid_taxes
+		) / remaining_sub_periods
 
 		# Total taxable earnings with additional earnings with full tax
 		full_tax_on_additional_earnings = 0.0
@@ -824,25 +972,33 @@
 		return current_tax_amount
 
 	def get_income_tax_slabs(self, payroll_period):
-		income_tax_slab, ss_assignment_name = frappe.db.get_value("Salary Structure Assignment",
-			{"employee": self.employee, "salary_structure": self.salary_structure, "docstatus": 1}, ["income_tax_slab", 'name'])
+		income_tax_slab, ss_assignment_name = frappe.db.get_value(
+			"Salary Structure Assignment",
+			{"employee": self.employee, "salary_structure": self.salary_structure, "docstatus": 1},
+			["income_tax_slab", "name"],
+		)
 
 		if not income_tax_slab:
-			frappe.throw(_("Income Tax Slab not set in Salary Structure Assignment: {0}").format(ss_assignment_name))
+			frappe.throw(
+				_("Income Tax Slab not set in Salary Structure Assignment: {0}").format(ss_assignment_name)
+			)
 
 		income_tax_slab_doc = frappe.get_doc("Income Tax Slab", income_tax_slab)
 		if income_tax_slab_doc.disabled:
 			frappe.throw(_("Income Tax Slab: {0} is disabled").format(income_tax_slab))
 
 		if getdate(income_tax_slab_doc.effective_from) > getdate(payroll_period.start_date):
-			frappe.throw(_("Income Tax Slab must be effective on or before Payroll Period Start Date: {0}")
-				.format(payroll_period.start_date))
+			frappe.throw(
+				_("Income Tax Slab must be effective on or before Payroll Period Start Date: {0}").format(
+					payroll_period.start_date
+				)
+			)
 
 		return income_tax_slab_doc
 
-
 	def get_taxable_earnings_for_prev_period(self, start_date, end_date, allow_tax_exemption=False):
-		taxable_earnings = frappe.db.sql("""
+		taxable_earnings = frappe.db.sql(
+			"""
 			select sum(sd.amount)
 			from
 				`tabSalary Detail` sd join `tabSalary Slip` ss on sd.parent=ss.name
@@ -854,16 +1010,15 @@
 				and ss.employee=%(employee)s
 				and ss.start_date between %(from_date)s and %(to_date)s
 				and ss.end_date between %(from_date)s and %(to_date)s
-			""", {
-				"employee": self.employee,
-				"from_date": start_date,
-				"to_date": end_date
-			})
+			""",
+			{"employee": self.employee, "from_date": start_date, "to_date": end_date},
+		)
 		taxable_earnings = flt(taxable_earnings[0][0]) if taxable_earnings else 0
 
 		exempted_amount = 0
 		if allow_tax_exemption:
-			exempted_amount = frappe.db.sql("""
+			exempted_amount = frappe.db.sql(
+				"""
 				select sum(sd.amount)
 				from
 					`tabSalary Detail` sd join `tabSalary Slip` ss on sd.parent=ss.name
@@ -875,18 +1030,18 @@
 					and ss.employee=%(employee)s
 					and ss.start_date between %(from_date)s and %(to_date)s
 					and ss.end_date between %(from_date)s and %(to_date)s
-				""", {
-					"employee": self.employee,
-					"from_date": start_date,
-					"to_date": end_date
-				})
+				""",
+				{"employee": self.employee, "from_date": start_date, "to_date": end_date},
+			)
 			exempted_amount = flt(exempted_amount[0][0]) if exempted_amount else 0
 
 		return taxable_earnings - exempted_amount
 
 	def get_tax_paid_in_period(self, start_date, end_date, tax_component):
 		# find total_tax_paid, tax paid for benefit, additional_salary
-		total_tax_paid = flt(frappe.db.sql("""
+		total_tax_paid = flt(
+			frappe.db.sql(
+				"""
 			select
 				sum(sd.amount)
 			from
@@ -899,16 +1054,21 @@
 				and ss.employee=%(employee)s
 				and ss.start_date between %(from_date)s and %(to_date)s
 				and ss.end_date between %(from_date)s and %(to_date)s
-		""", {
-			"salary_component": tax_component,
-			"employee": self.employee,
-			"from_date": start_date,
-			"to_date": end_date
-		})[0][0])
+		""",
+				{
+					"salary_component": tax_component,
+					"employee": self.employee,
+					"from_date": start_date,
+					"to_date": end_date,
+				},
+			)[0][0]
+		)
 
 		return total_tax_paid
 
-	def get_taxable_earnings(self, allow_tax_exemption=False, based_on_payment_days=0, payroll_period=None):
+	def get_taxable_earnings(
+		self, allow_tax_exemption=False, based_on_payment_days=0, payroll_period=None
+	):
 		joining_date, relieving_date = self.get_joining_and_relieving_dates()
 
 		taxable_earnings = 0
@@ -918,7 +1078,9 @@
 
 		for earning in self.earnings:
 			if based_on_payment_days:
-				amount, additional_amount = self.get_amount_based_on_payment_days(earning, joining_date, relieving_date)
+				amount, additional_amount = self.get_amount_based_on_payment_days(
+					earning, joining_date, relieving_date
+				)
 			else:
 				if earning.additional_amount:
 					amount, additional_amount = earning.amount, earning.additional_amount
@@ -929,13 +1091,14 @@
 				if earning.is_flexible_benefit:
 					flexi_benefits += amount
 				else:
-					taxable_earnings += (amount - additional_amount)
+					taxable_earnings += amount - additional_amount
 					additional_income += additional_amount
 
 					# Get additional amount based on future recurring additional salary
 					if additional_amount and earning.is_recurring_additional_salary:
-						additional_income += self.get_future_recurring_additional_amount(earning.additional_salary,
-							earning.additional_amount, payroll_period) # Used earning.additional_amount to consider the amount for the full month
+						additional_income += self.get_future_recurring_additional_amount(
+							earning.additional_salary, earning.additional_amount, payroll_period
+						)  # Used earning.additional_amount to consider the amount for the full month
 
 					if earning.deduct_full_tax_on_selected_payroll_date:
 						additional_income_with_full_tax += additional_amount
@@ -945,25 +1108,32 @@
 				if ded.exempted_from_income_tax:
 					amount, additional_amount = ded.amount, ded.additional_amount
 					if based_on_payment_days:
-						amount, additional_amount = self.get_amount_based_on_payment_days(ded, joining_date, relieving_date)
+						amount, additional_amount = self.get_amount_based_on_payment_days(
+							ded, joining_date, relieving_date
+						)
 
 					taxable_earnings -= flt(amount - additional_amount)
 					additional_income -= additional_amount
 
 					if additional_amount and ded.is_recurring_additional_salary:
-						additional_income -= self.get_future_recurring_additional_amount(ded.additional_salary,
-							ded.additional_amount, payroll_period) # Used ded.additional_amount to consider the amount for the full month
+						additional_income -= self.get_future_recurring_additional_amount(
+							ded.additional_salary, ded.additional_amount, payroll_period
+						)  # Used ded.additional_amount to consider the amount for the full month
 
-		return frappe._dict({
-			"taxable_earnings": taxable_earnings,
-			"additional_income": additional_income,
-			"additional_income_with_full_tax": additional_income_with_full_tax,
-			"flexi_benefits": flexi_benefits
-		})
+		return frappe._dict(
+			{
+				"taxable_earnings": taxable_earnings,
+				"additional_income": additional_income,
+				"additional_income_with_full_tax": additional_income_with_full_tax,
+				"flexi_benefits": flexi_benefits,
+			}
+		)
 
-	def get_future_recurring_additional_amount(self, additional_salary, monthly_additional_amount, payroll_period):
+	def get_future_recurring_additional_amount(
+		self, additional_salary, monthly_additional_amount, payroll_period
+	):
 		future_recurring_additional_amount = 0
-		to_date = frappe.db.get_value("Additional Salary", additional_salary, 'to_date')
+		to_date = frappe.db.get_value("Additional Salary", additional_salary, "to_date")
 
 		# future month count excluding current
 		from_date, to_date = getdate(self.start_date), getdate(to_date)
@@ -973,42 +1143,69 @@
 		if getdate(to_date) > getdate(payroll_period.end_date):
 			to_date = getdate(payroll_period.end_date)
 
-		future_recurring_period = ((to_date.year - from_date.year) * 12) + (to_date.month - from_date.month)
+		future_recurring_period = ((to_date.year - from_date.year) * 12) + (
+			to_date.month - from_date.month
+		)
 
 		if future_recurring_period > 0:
-			future_recurring_additional_amount = monthly_additional_amount * future_recurring_period # Used earning.additional_amount to consider the amount for the full month
+			future_recurring_additional_amount = (
+				monthly_additional_amount * future_recurring_period
+			)  # Used earning.additional_amount to consider the amount for the full month
 		return future_recurring_additional_amount
 
 	def get_amount_based_on_payment_days(self, row, joining_date, relieving_date):
 		amount, additional_amount = row.amount, row.additional_amount
-		timesheet_component = frappe.db.get_value("Salary Structure", self.salary_structure, "salary_component")
+		timesheet_component = frappe.db.get_value(
+			"Salary Structure", self.salary_structure, "salary_component"
+		)
 
-		if (self.salary_structure and
-			cint(row.depends_on_payment_days) and cint(self.total_working_days)
-			and not (row.additional_salary and row.default_amount) # to identify overwritten additional salary
-			and (row.salary_component != timesheet_component or
-				getdate(self.start_date) < joining_date or
-				(relieving_date and getdate(self.end_date) > relieving_date)
-			)):
-			additional_amount = flt((flt(row.additional_amount) * flt(self.payment_days)
-				/ cint(self.total_working_days)), row.precision("additional_amount"))
-			amount = flt((flt(row.default_amount) * flt(self.payment_days)
-				/ cint(self.total_working_days)), row.precision("amount")) + additional_amount
+		if (
+			self.salary_structure
+			and cint(row.depends_on_payment_days)
+			and cint(self.total_working_days)
+			and not (
+				row.additional_salary and row.default_amount
+			)  # to identify overwritten additional salary
+			and (
+				row.salary_component != timesheet_component
+				or getdate(self.start_date) < joining_date
+				or (relieving_date and getdate(self.end_date) > relieving_date)
+			)
+		):
+			additional_amount = flt(
+				(flt(row.additional_amount) * flt(self.payment_days) / cint(self.total_working_days)),
+				row.precision("additional_amount"),
+			)
+			amount = (
+				flt(
+					(flt(row.default_amount) * flt(self.payment_days) / cint(self.total_working_days)),
+					row.precision("amount"),
+				)
+				+ additional_amount
+			)
 
-		elif not self.payment_days and row.salary_component != timesheet_component and cint(row.depends_on_payment_days):
+		elif (
+			not self.payment_days
+			and row.salary_component != timesheet_component
+			and cint(row.depends_on_payment_days)
+		):
 			amount, additional_amount = 0, 0
 		elif not row.amount:
 			amount = flt(row.default_amount) + flt(row.additional_amount)
 
 		# apply rounding
-		if frappe.get_cached_value("Salary Component", row.salary_component, "round_to_the_nearest_integer"):
+		if frappe.get_cached_value(
+			"Salary Component", row.salary_component, "round_to_the_nearest_integer"
+		):
 			amount, additional_amount = rounded(amount or 0), rounded(additional_amount or 0)
 
 		return amount, additional_amount
 
 	def calculate_unclaimed_taxable_benefits(self, payroll_period):
 		# get total sum of benefits paid
-		total_benefits_paid = flt(frappe.db.sql("""
+		total_benefits_paid = flt(
+			frappe.db.sql(
+				"""
 			select sum(sd.amount)
 			from `tabSalary Detail` sd join `tabSalary Slip` ss on sd.parent=ss.name
 			where
@@ -1019,21 +1216,29 @@
 				and ss.employee=%(employee)s
 				and ss.start_date between %(start_date)s and %(end_date)s
 				and ss.end_date between %(start_date)s and %(end_date)s
-		""", {
-			"employee": self.employee,
-			"start_date": payroll_period.start_date,
-			"end_date": self.start_date
-		})[0][0])
+		""",
+				{
+					"employee": self.employee,
+					"start_date": payroll_period.start_date,
+					"end_date": self.start_date,
+				},
+			)[0][0]
+		)
 
 		# get total benefits claimed
-		total_benefits_claimed = flt(frappe.db.sql("""
+		total_benefits_claimed = flt(
+			frappe.db.sql(
+				"""
 			select sum(claimed_amount)
 			from `tabEmployee Benefit Claim`
 			where
 				docstatus=1
 				and employee=%s
 				and claim_date between %s and %s
-		""", (self.employee, payroll_period.start_date, self.end_date))[0][0])
+		""",
+				(self.employee, payroll_period.start_date, self.end_date),
+			)[0][0]
+		)
 
 		return total_benefits_paid - total_benefits_claimed
 
@@ -1041,15 +1246,19 @@
 		total_exemption_amount = 0
 		if tax_slab.allow_tax_exemption:
 			if self.deduct_tax_for_unsubmitted_tax_exemption_proof:
-				exemption_proof = frappe.db.get_value("Employee Tax Exemption Proof Submission",
+				exemption_proof = frappe.db.get_value(
+					"Employee Tax Exemption Proof Submission",
 					{"employee": self.employee, "payroll_period": payroll_period.name, "docstatus": 1},
-					["exemption_amount"])
+					["exemption_amount"],
+				)
 				if exemption_proof:
 					total_exemption_amount = exemption_proof
 			else:
-				declaration = frappe.db.get_value("Employee Tax Exemption Declaration",
+				declaration = frappe.db.get_value(
+					"Employee Tax Exemption Declaration",
 					{"employee": self.employee, "payroll_period": payroll_period.name, "docstatus": 1},
-					["total_exemption_amount"])
+					["total_exemption_amount"],
+				)
 				if declaration:
 					total_exemption_amount = declaration
 
@@ -1058,14 +1267,15 @@
 		return total_exemption_amount
 
 	def get_income_form_other_sources(self, payroll_period):
-		return frappe.get_all("Employee Other Income",
+		return frappe.get_all(
+			"Employee Other Income",
 			filters={
 				"employee": self.employee,
 				"payroll_period": payroll_period.name,
 				"company": self.company,
-				"docstatus": 1
+				"docstatus": 1,
 			},
-			fields="SUM(amount) as total_amount"
+			fields="SUM(amount) as total_amount",
 		)[0].total_amount
 
 	def calculate_tax_by_tax_slab(self, annual_taxable_earning, tax_slab):
@@ -1077,12 +1287,12 @@
 			if cond and not self.eval_tax_slab_condition(cond, data):
 				continue
 			if not slab.to_amount and annual_taxable_earning >= slab.from_amount:
-				tax_amount += (annual_taxable_earning - slab.from_amount + 1) * slab.percent_deduction *.01
+				tax_amount += (annual_taxable_earning - slab.from_amount + 1) * slab.percent_deduction * 0.01
 				continue
 			if annual_taxable_earning >= slab.from_amount and annual_taxable_earning < slab.to_amount:
-				tax_amount += (annual_taxable_earning - slab.from_amount + 1) * slab.percent_deduction *.01
+				tax_amount += (annual_taxable_earning - slab.from_amount + 1) * slab.percent_deduction * 0.01
 			elif annual_taxable_earning >= slab.from_amount and annual_taxable_earning >= slab.to_amount:
-				tax_amount += (slab.to_amount - slab.from_amount + 1) * slab.percent_deduction * .01
+				tax_amount += (slab.to_amount - slab.from_amount + 1) * slab.percent_deduction * 0.01
 
 		# other taxes and charges on income tax
 		for d in tax_slab.other_taxes_and_charges:
@@ -1102,8 +1312,10 @@
 			if condition:
 				return frappe.safe_eval(condition, self.whitelisted_globals, data)
 		except NameError as err:
-			frappe.throw(_("{0} <br> This error can be due to missing or deleted field.").format(err),
-				title=_("Name error"))
+			frappe.throw(
+				_("{0} <br> This error can be due to missing or deleted field.").format(err),
+				title=_("Name error"),
+			)
 		except SyntaxError as err:
 			frappe.throw(_("Syntax error in condition: {0}").format(err))
 		except Exception as e:
@@ -1111,8 +1323,9 @@
 			raise
 
 	def get_component_totals(self, component_type, depends_on_payment_days=0):
-		joining_date, relieving_date = frappe.get_cached_value("Employee", self.employee,
-			["date_of_joining", "relieving_date"])
+		joining_date, relieving_date = frappe.get_cached_value(
+			"Employee", self.employee, ["date_of_joining", "relieving_date"]
+		)
 
 		total = 0.0
 		for d in self.get(component_type):
@@ -1125,14 +1338,17 @@
 		return total
 
 	def get_joining_and_relieving_dates(self):
-		joining_date, relieving_date = frappe.get_cached_value("Employee", self.employee,
-			["date_of_joining", "relieving_date"])
+		joining_date, relieving_date = frappe.get_cached_value(
+			"Employee", self.employee, ["date_of_joining", "relieving_date"]
+		)
 
 		if not relieving_date:
 			relieving_date = getdate(self.end_date)
 
 		if not joining_date:
-			frappe.throw(_("Please set the Date Of Joining for employee {0}").format(frappe.bold(self.employee_name)))
+			frappe.throw(
+				_("Please set the Date Of Joining for employee {0}").format(frappe.bold(self.employee_name))
+			)
 
 		return joining_date, relieving_date
 
@@ -1141,28 +1357,38 @@
 		self.total_interest_amount = 0
 		self.total_principal_amount = 0
 
-		if not self.get('loans'):
+		if not self.get("loans"):
 			for loan in self.get_loan_details():
 
 				amounts = calculate_amounts(loan.name, self.posting_date, "Regular Payment")
 
-				if amounts['interest_amount'] or amounts['payable_principal_amount']:
-					self.append('loans', {
-						'loan': loan.name,
-						'total_payment': amounts['interest_amount'] + amounts['payable_principal_amount'],
-						'interest_amount': amounts['interest_amount'],
-						'principal_amount': amounts['payable_principal_amount'],
-						'loan_account': loan.loan_account,
-						'interest_income_account': loan.interest_income_account
-					})
+				if amounts["interest_amount"] or amounts["payable_principal_amount"]:
+					self.append(
+						"loans",
+						{
+							"loan": loan.name,
+							"total_payment": amounts["interest_amount"] + amounts["payable_principal_amount"],
+							"interest_amount": amounts["interest_amount"],
+							"principal_amount": amounts["payable_principal_amount"],
+							"loan_account": loan.loan_account,
+							"interest_income_account": loan.interest_income_account,
+						},
+					)
 
-		for payment in self.get('loans'):
+		for payment in self.get("loans"):
 			amounts = calculate_amounts(payment.loan, self.posting_date, "Regular Payment")
-			total_amount = amounts['interest_amount'] + amounts['payable_principal_amount']
+			total_amount = amounts["interest_amount"] + amounts["payable_principal_amount"]
 			if payment.total_payment > total_amount:
-				frappe.throw(_("""Row {0}: Paid amount {1} is greater than pending accrued amount {2} against loan {3}""")
-					.format(payment.idx, frappe.bold(payment.total_payment),
-						frappe.bold(total_amount), frappe.bold(payment.loan)))
+				frappe.throw(
+					_(
+						"""Row {0}: Paid amount {1} is greater than pending accrued amount {2} against loan {3}"""
+					).format(
+						payment.idx,
+						frappe.bold(payment.total_payment),
+						frappe.bold(total_amount),
+						frappe.bold(payment.loan),
+					)
+				)
 
 			self.total_interest_amount += payment.interest_amount
 			self.total_principal_amount += payment.principal_amount
@@ -1170,27 +1396,40 @@
 			self.total_loan_repayment += payment.total_payment
 
 	def get_loan_details(self):
-		return frappe.get_all("Loan",
+		return frappe.get_all(
+			"Loan",
 			fields=["name", "interest_income_account", "loan_account", "loan_type"],
-			filters = {
+			filters={
 				"applicant": self.employee,
 				"docstatus": 1,
 				"repay_from_salary": 1,
-				"company": self.company
-			})
+				"company": self.company,
+			},
+		)
 
 	def make_loan_repayment_entry(self):
 		payroll_payable_account = get_payroll_payable_account(self.company, self.payroll_entry)
 		for loan in self.loans:
 			if loan.total_payment:
-				repayment_entry = create_repayment_entry(loan.loan, self.employee,
-					self.company, self.posting_date, loan.loan_type, "Regular Payment", loan.interest_amount,
-					loan.principal_amount, loan.total_payment, payroll_payable_account=payroll_payable_account)
+				repayment_entry = create_repayment_entry(
+					loan.loan,
+					self.employee,
+					self.company,
+					self.posting_date,
+					loan.loan_type,
+					"Regular Payment",
+					loan.interest_amount,
+					loan.principal_amount,
+					loan.total_payment,
+					payroll_payable_account=payroll_payable_account,
+				)
 
 				repayment_entry.save()
 				repayment_entry.submit()
 
-				frappe.db.set_value("Salary Slip Loan", loan.name, "loan_repayment_entry", repayment_entry.name)
+				frappe.db.set_value(
+					"Salary Slip Loan", loan.name, "loan_repayment_entry", repayment_entry.name
+				)
 
 	def cancel_loan_repayment_entry(self):
 		for loan in self.loans:
@@ -1206,19 +1445,23 @@
 		if payroll_settings.encrypt_salary_slips_in_emails:
 			password = generate_password_for_pdf(payroll_settings.password_policy, self.employee)
 			message += """<br>Note: Your salary slip is password protected,
-				the password to unlock the PDF is of the format {0}. """.format(payroll_settings.password_policy)
+				the password to unlock the PDF is of the format {0}. """.format(
+				payroll_settings.password_policy
+			)
 
 		if receiver:
 			email_args = {
 				"recipients": [receiver],
 				"message": _(message),
-				"subject": 'Salary Slip - from {0} to {1}'.format(self.start_date, self.end_date),
-				"attachments": [frappe.attach_print(self.doctype, self.name, file_name=self.name, password=password)],
+				"subject": "Salary Slip - from {0} to {1}".format(self.start_date, self.end_date),
+				"attachments": [
+					frappe.attach_print(self.doctype, self.name, file_name=self.name, password=password)
+				],
 				"reference_doctype": self.doctype,
-				"reference_name": self.name
-				}
+				"reference_name": self.name,
+			}
 			if not frappe.flags.in_test:
-				enqueue(method=frappe.sendmail, queue='short', timeout=300, is_async=True, **email_args)
+				enqueue(method=frappe.sendmail, queue="short", timeout=300, is_async=True, **email_args)
 			else:
 				frappe.sendmail(**email_args)
 		else:
@@ -1227,21 +1470,20 @@
 	def update_status(self, salary_slip=None):
 		for data in self.timesheets:
 			if data.time_sheet:
-				timesheet = frappe.get_doc('Timesheet', data.time_sheet)
+				timesheet = frappe.get_doc("Timesheet", data.time_sheet)
 				timesheet.salary_slip = salary_slip
 				timesheet.flags.ignore_validate_update_after_submit = True
 				timesheet.set_status()
 				timesheet.save()
 
 	def set_status(self, status=None):
-		'''Get and update status'''
+		"""Get and update status"""
 		if not status:
 			status = self.get_status()
 		self.db_set("status", status)
 
-
 	def process_salary_structure(self, for_preview=0):
-		'''Calculate salary after salary structure details have been updated'''
+		"""Calculate salary after salary structure details have been updated"""
 		if not self.salary_slip_based_on_timesheet:
 			self.get_date_details()
 		self.pull_emp_details()
@@ -1249,7 +1491,9 @@
 		self.calculate_net_pay()
 
 	def pull_emp_details(self):
-		emp = frappe.db.get_value("Employee", self.employee, ["bank_name", "bank_ac_no", "salary_mode"], as_dict=1)
+		emp = frappe.db.get_value(
+			"Employee", self.employee, ["bank_name", "bank_ac_no", "salary_mode"], as_dict=1
+		)
 		if emp:
 			self.mode_of_payment = emp.salary_mode
 			self.bank_name = emp.bank_name
@@ -1284,7 +1528,7 @@
 		self.base_rounded_total = rounded(self.base_net_pay or 0)
 		self.set_net_total_in_words()
 
-	#calculate total working hours, earnings based on hourly wages and totals
+	# calculate total working hours, earnings based on hourly wages and totals
 	def calculate_total_for_salary_slip_based_on_timesheet(self):
 		if self.timesheets:
 			self.total_working_hours = 0
@@ -1294,7 +1538,9 @@
 
 		wages_amount = self.total_working_hours * self.hour_rate
 		self.base_hour_rate = flt(self.hour_rate) * flt(self.exchange_rate)
-		salary_component = frappe.db.get_value('Salary Structure', {'name': self.salary_structure}, 'salary_component')
+		salary_component = frappe.db.get_value(
+			"Salary Structure", {"name": self.salary_structure}, "salary_component"
+		)
 		if self.earnings:
 			for i, earning in enumerate(self.earnings):
 				if earning.salary_component == salary_component:
@@ -1306,14 +1552,17 @@
 		year_to_date = 0
 		period_start_date, period_end_date = self.get_year_to_date_period()
 
-		salary_slip_sum = frappe.get_list('Salary Slip',
-			fields = ['sum(net_pay) as net_sum', 'sum(gross_pay) as gross_sum'],
-			filters = {'employee' : self.employee,
-				'start_date' : ['>=', period_start_date],
-				'end_date' : ['<', period_end_date],
-				'name': ['!=', self.name],
-				'docstatus': 1
-			})
+		salary_slip_sum = frappe.get_list(
+			"Salary Slip",
+			fields=["sum(net_pay) as net_sum", "sum(gross_pay) as gross_sum"],
+			filters={
+				"employee": self.employee,
+				"start_date": [">=", period_start_date],
+				"end_date": ["<", period_end_date],
+				"name": ["!=", self.name],
+				"docstatus": 1,
+			},
+		)
 
 		year_to_date = flt(salary_slip_sum[0].net_sum) if salary_slip_sum else 0.0
 		gross_year_to_date = flt(salary_slip_sum[0].gross_sum) if salary_slip_sum else 0.0
@@ -1326,14 +1575,17 @@
 	def compute_month_to_date(self):
 		month_to_date = 0
 		first_day_of_the_month = get_first_day(self.start_date)
-		salary_slip_sum = frappe.get_list('Salary Slip',
-			fields = ['sum(net_pay) as sum'],
-			filters = {'employee' : self.employee,
-				'start_date' : ['>=', first_day_of_the_month],
-				'end_date' : ['<', self.start_date],
-				'name': ['!=', self.name],
-				'docstatus': 1
-			})
+		salary_slip_sum = frappe.get_list(
+			"Salary Slip",
+			fields=["sum(net_pay) as sum"],
+			filters={
+				"employee": self.employee,
+				"start_date": [">=", first_day_of_the_month],
+				"end_date": ["<", self.start_date],
+				"name": ["!=", self.name],
+				"docstatus": 1,
+			},
+		)
 
 		month_to_date = flt(salary_slip_sum[0].sum) if salary_slip_sum else 0.0
 
@@ -1343,10 +1595,11 @@
 	def compute_component_wise_year_to_date(self):
 		period_start_date, period_end_date = self.get_year_to_date_period()
 
-		for key in ('earnings', 'deductions'):
+		for key in ("earnings", "deductions"):
 			for component in self.get(key):
 				year_to_date = 0
-				component_sum = frappe.db.sql("""
+				component_sum = frappe.db.sql(
+					"""
 					SELECT sum(detail.amount) as sum
 					FROM `tabSalary Detail` as detail
 					INNER JOIN `tabSalary Slip` as salary_slip
@@ -1358,8 +1611,13 @@
 						AND salary_slip.end_date < %(period_end_date)s
 						AND salary_slip.name != %(docname)s
 						AND salary_slip.docstatus = 1""",
-						{'employee': self.employee, 'component': component.salary_component, 'period_start_date': period_start_date,
-							'period_end_date': period_end_date, 'docname': self.name}
+					{
+						"employee": self.employee,
+						"component": component.salary_component,
+						"period_start_date": period_start_date,
+						"period_end_date": period_end_date,
+						"docname": self.name,
+					},
 				)
 
 				year_to_date = flt(component_sum[0][0]) if component_sum else 0.0
@@ -1381,34 +1639,44 @@
 		return period_start_date, period_end_date
 
 	def add_leave_balances(self):
-		self.set('leave_details', [])
+		self.set("leave_details", [])
 
-		if frappe.db.get_single_value('Payroll Settings', 'show_leave_balances_in_salary_slip'):
+		if frappe.db.get_single_value("Payroll Settings", "show_leave_balances_in_salary_slip"):
 			from erpnext.hr.doctype.leave_application.leave_application import get_leave_details
+
 			leave_details = get_leave_details(self.employee, self.end_date)
 
-			for leave_type, leave_values in leave_details['leave_allocation'].items():
-				self.append('leave_details', {
-					'leave_type': leave_type,
-					'total_allocated_leaves': flt(leave_values.get('total_leaves')),
-					'expired_leaves': flt(leave_values.get('expired_leaves')),
-					'used_leaves': flt(leave_values.get('leaves_taken')),
-					'pending_leaves': flt(leave_values.get('leaves_pending_approval')),
-					'available_leaves': flt(leave_values.get('remaining_leaves'))
-				})
+			for leave_type, leave_values in leave_details["leave_allocation"].items():
+				self.append(
+					"leave_details",
+					{
+						"leave_type": leave_type,
+						"total_allocated_leaves": flt(leave_values.get("total_leaves")),
+						"expired_leaves": flt(leave_values.get("expired_leaves")),
+						"used_leaves": flt(leave_values.get("leaves_taken")),
+						"pending_leaves": flt(leave_values.get("leaves_pending_approval")),
+						"available_leaves": flt(leave_values.get("remaining_leaves")),
+					},
+				)
+
 
 def unlink_ref_doc_from_salary_slip(ref_no):
-	linked_ss = frappe.db.sql_list("""select name from `tabSalary Slip`
-	where journal_entry=%s and docstatus < 2""", (ref_no))
+	linked_ss = frappe.db.sql_list(
+		"""select name from `tabSalary Slip`
+	where journal_entry=%s and docstatus < 2""",
+		(ref_no),
+	)
 	if linked_ss:
 		for ss in linked_ss:
 			ss_doc = frappe.get_doc("Salary Slip", ss)
 			frappe.db.set_value("Salary Slip", ss_doc.name, "journal_entry", "")
 
+
 def generate_password_for_pdf(policy_template, employee):
 	employee = frappe.get_doc("Employee", employee)
 	return policy_template.format(**employee.as_dict())
 
+
 def get_salary_component_data(component):
 	return frappe.get_value(
 		"Salary Component",
@@ -1425,10 +1693,15 @@
 		as_dict=1,
 	)
 
+
 def get_payroll_payable_account(company, payroll_entry):
 	if payroll_entry:
-		payroll_payable_account = frappe.db.get_value('Payroll Entry', payroll_entry, 'payroll_payable_account')
+		payroll_payable_account = frappe.db.get_value(
+			"Payroll Entry", payroll_entry, "payroll_payable_account"
+		)
 	else:
-		payroll_payable_account = frappe.db.get_value('Company', company, 'default_payroll_payable_account')
+		payroll_payable_account = frappe.db.get_value(
+			"Company", company, "default_payroll_payable_account"
+		)
 
-	return payroll_payable_account
\ No newline at end of file
+	return payroll_payable_account
diff --git a/erpnext/payroll/doctype/salary_slip/test_salary_slip.py b/erpnext/payroll/doctype/salary_slip/test_salary_slip.py
index f072135..e1d1fa1 100644
--- a/erpnext/payroll/doctype/salary_slip/test_salary_slip.py
+++ b/erpnext/payroll/doctype/salary_slip/test_salary_slip.py
@@ -40,16 +40,14 @@
 		setup_test()
 		frappe.flags.pop("via_payroll_entry", None)
 
-
 	def tearDown(self):
 		frappe.db.rollback()
 		frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0)
 		frappe.set_user("Administrator")
 
-	@change_settings("Payroll Settings", {
-		"payroll_based_on": "Attendance",
-		"daily_wages_fraction_for_half_day": 0.75
-	})
+	@change_settings(
+		"Payroll Settings", {"payroll_based_on": "Attendance", "daily_wages_fraction_for_half_day": 0.75}
+	)
 	def test_payment_days_based_on_attendance(self):
 		no_of_days = self.get_no_of_days()
 
@@ -61,21 +59,50 @@
 		month_start_date = get_first_day(nowdate())
 		month_end_date = get_last_day(nowdate())
 
-		first_sunday = frappe.db.sql("""
+		first_sunday = frappe.db.sql(
+			"""
 			select holiday_date from `tabHoliday`
 			where parent = 'Salary Slip Test Holiday List'
 				and holiday_date between %s and %s
 			order by holiday_date
-		""", (month_start_date, month_end_date))[0][0]
+		""",
+			(month_start_date, month_end_date),
+		)[0][0]
 
-		mark_attendance(emp_id, first_sunday, 'Absent', ignore_validate=True) # invalid lwp
-		mark_attendance(emp_id, add_days(first_sunday, 1), 'Absent', ignore_validate=True) # counted as absent
-		mark_attendance(emp_id, add_days(first_sunday, 2), 'Half Day', leave_type='Leave Without Pay', ignore_validate=True) # valid 0.75 lwp
-		mark_attendance(emp_id, add_days(first_sunday, 3), 'On Leave', leave_type='Leave Without Pay', ignore_validate=True) # valid lwp
-		mark_attendance(emp_id, add_days(first_sunday, 4), 'On Leave', leave_type='Casual Leave', ignore_validate=True) # invalid lwp
-		mark_attendance(emp_id, add_days(first_sunday, 7), 'On Leave', leave_type='Leave Without Pay', ignore_validate=True) # invalid lwp
+		mark_attendance(emp_id, first_sunday, "Absent", ignore_validate=True)  # invalid lwp
+		mark_attendance(
+			emp_id, add_days(first_sunday, 1), "Absent", ignore_validate=True
+		)  # counted as absent
+		mark_attendance(
+			emp_id,
+			add_days(first_sunday, 2),
+			"Half Day",
+			leave_type="Leave Without Pay",
+			ignore_validate=True,
+		)  # valid 0.75 lwp
+		mark_attendance(
+			emp_id,
+			add_days(first_sunday, 3),
+			"On Leave",
+			leave_type="Leave Without Pay",
+			ignore_validate=True,
+		)  # valid lwp
+		mark_attendance(
+			emp_id, add_days(first_sunday, 4), "On Leave", leave_type="Casual Leave", ignore_validate=True
+		)  # invalid lwp
+		mark_attendance(
+			emp_id,
+			add_days(first_sunday, 7),
+			"On Leave",
+			leave_type="Leave Without Pay",
+			ignore_validate=True,
+		)  # invalid lwp
 
-		ss = make_employee_salary_slip("test_payment_days_based_on_attendance@salary.com", "Monthly", "Test Payment Based On Attendence")
+		ss = make_employee_salary_slip(
+			"test_payment_days_based_on_attendance@salary.com",
+			"Monthly",
+			"Test Payment Based On Attendence",
+		)
 
 		self.assertEqual(ss.leave_without_pay, 1.25)
 		self.assertEqual(ss.absent_days, 1)
@@ -85,16 +112,21 @@
 
 		self.assertEqual(ss.payment_days, days_in_month - no_of_holidays - 2.25)
 
-		#Gross pay calculation based on attendances
-		gross_pay = 78000 - ((78000 / (days_in_month - no_of_holidays)) * flt(ss.leave_without_pay + ss.absent_days))
+		# Gross pay calculation based on attendances
+		gross_pay = 78000 - (
+			(78000 / (days_in_month - no_of_holidays)) * flt(ss.leave_without_pay + ss.absent_days)
+		)
 
 		self.assertEqual(ss.gross_pay, gross_pay)
 
-	@change_settings("Payroll Settings", {
-		"payroll_based_on": "Attendance",
-		"consider_unmarked_attendance_as": "Absent",
-		"include_holidays_in_total_working_days": True
-	})
+	@change_settings(
+		"Payroll Settings",
+		{
+			"payroll_based_on": "Attendance",
+			"consider_unmarked_attendance_as": "Absent",
+			"include_holidays_in_total_working_days": True,
+		},
+	)
 	def test_payment_days_for_mid_joinee_including_holidays(self):
 		from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
 
@@ -103,31 +135,38 @@
 
 		new_emp_id = make_employee("test_payment_days_based_on_joining_date@salary.com")
 		joining_date, relieving_date = add_days(month_start_date, 3), add_days(month_end_date, -5)
-		frappe.db.set_value("Employee", new_emp_id, {
-			"date_of_joining": joining_date,
-			"relieving_date": relieving_date,
-			"status": "Left"
-		})
+		frappe.db.set_value(
+			"Employee",
+			new_emp_id,
+			{"date_of_joining": joining_date, "relieving_date": relieving_date, "status": "Left"},
+		)
 
 		holidays = 0
 
 		for days in range(date_diff(relieving_date, joining_date) + 1):
 			date = add_days(joining_date, days)
 			if not is_holiday("Salary Slip Test Holiday List", date):
-				mark_attendance(new_emp_id, date, 'Present', ignore_validate=True)
+				mark_attendance(new_emp_id, date, "Present", ignore_validate=True)
 			else:
 				holidays += 1
 
-		new_ss = make_employee_salary_slip("test_payment_days_based_on_joining_date@salary.com", "Monthly", "Test Payment Based On Attendence")
+		new_ss = make_employee_salary_slip(
+			"test_payment_days_based_on_joining_date@salary.com",
+			"Monthly",
+			"Test Payment Based On Attendence",
+		)
 
 		self.assertEqual(new_ss.total_working_days, no_of_days[0])
 		self.assertEqual(new_ss.payment_days, no_of_days[0] - holidays - 8)
 
-	@change_settings("Payroll Settings", {
-		"payroll_based_on": "Attendance",
-		"consider_unmarked_attendance_as": "Absent",
-		"include_holidays_in_total_working_days": False
-	})
+	@change_settings(
+		"Payroll Settings",
+		{
+			"payroll_based_on": "Attendance",
+			"consider_unmarked_attendance_as": "Absent",
+			"include_holidays_in_total_working_days": False,
+		},
+	)
 	def test_payment_days_for_mid_joinee_excluding_holidays(self):
 		from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
 
@@ -136,29 +175,31 @@
 
 		new_emp_id = make_employee("test_payment_days_based_on_joining_date@salary.com")
 		joining_date, relieving_date = add_days(month_start_date, 3), add_days(month_end_date, -5)
-		frappe.db.set_value("Employee", new_emp_id, {
-			"date_of_joining": joining_date,
-			"relieving_date": relieving_date,
-			"status": "Left"
-		})
+		frappe.db.set_value(
+			"Employee",
+			new_emp_id,
+			{"date_of_joining": joining_date, "relieving_date": relieving_date, "status": "Left"},
+		)
 
 		holidays = 0
 
 		for days in range(date_diff(relieving_date, joining_date) + 1):
 			date = add_days(joining_date, days)
 			if not is_holiday("Salary Slip Test Holiday List", date):
-				mark_attendance(new_emp_id, date, 'Present', ignore_validate=True)
+				mark_attendance(new_emp_id, date, "Present", ignore_validate=True)
 			else:
 				holidays += 1
 
-		new_ss = make_employee_salary_slip("test_payment_days_based_on_joining_date@salary.com", "Monthly", "Test Payment Based On Attendence")
+		new_ss = make_employee_salary_slip(
+			"test_payment_days_based_on_joining_date@salary.com",
+			"Monthly",
+			"Test Payment Based On Attendence",
+		)
 
 		self.assertEqual(new_ss.total_working_days, no_of_days[0] - no_of_days[1])
 		self.assertEqual(new_ss.payment_days, no_of_days[0] - holidays - 8)
 
-	@change_settings("Payroll Settings", {
-		"payroll_based_on": "Leave"
-	})
+	@change_settings("Payroll Settings", {"payroll_based_on": "Leave"})
 	def test_payment_days_based_on_leave_application(self):
 		no_of_days = self.get_no_of_days()
 
@@ -170,30 +211,41 @@
 		month_start_date = get_first_day(nowdate())
 		month_end_date = get_last_day(nowdate())
 
-		first_sunday = frappe.db.sql("""
+		first_sunday = frappe.db.sql(
+			"""
 			select holiday_date from `tabHoliday`
 			where parent = 'Salary Slip Test Holiday List'
 				and holiday_date between %s and %s
 			order by holiday_date
-		""", (month_start_date, month_end_date))[0][0]
+		""",
+			(month_start_date, month_end_date),
+		)[0][0]
 
 		make_leave_application(emp_id, first_sunday, add_days(first_sunday, 3), "Leave Without Pay")
 
-		leave_type_ppl = create_leave_type(leave_type_name="Test Partially Paid Leave", is_ppl = 1)
+		leave_type_ppl = create_leave_type(leave_type_name="Test Partially Paid Leave", is_ppl=1)
 		leave_type_ppl.save()
 
 		alloc = create_leave_allocation(
-			employee = emp_id, from_date = add_days(first_sunday, 4),
-			to_date = add_days(first_sunday, 10), new_leaves_allocated = 3,
-			leave_type = "Test Partially Paid Leave")
+			employee=emp_id,
+			from_date=add_days(first_sunday, 4),
+			to_date=add_days(first_sunday, 10),
+			new_leaves_allocated=3,
+			leave_type="Test Partially Paid Leave",
+		)
 		alloc.save()
 		alloc.submit()
 
-		#two day leave ppl with fraction_of_daily_salary_per_leave = 0.5 equivalent to single day lwp
-		make_leave_application(emp_id, add_days(first_sunday, 4), add_days(first_sunday, 5), "Test Partially Paid Leave")
+		# two day leave ppl with fraction_of_daily_salary_per_leave = 0.5 equivalent to single day lwp
+		make_leave_application(
+			emp_id, add_days(first_sunday, 4), add_days(first_sunday, 5), "Test Partially Paid Leave"
+		)
 
-		ss = make_employee_salary_slip("test_payment_days_based_on_leave_application@salary.com", "Monthly", "Test Payment Based On Leave Application")
-
+		ss = make_employee_salary_slip(
+			"test_payment_days_based_on_leave_application@salary.com",
+			"Monthly",
+			"Test Payment Based On Leave Application",
+		)
 
 		self.assertEqual(ss.leave_without_pay, 4)
 
@@ -202,9 +254,7 @@
 
 		self.assertEqual(ss.payment_days, days_in_month - no_of_holidays - 4)
 
-	@change_settings("Payroll Settings", {
-		"payroll_based_on": "Attendance"
-	})
+	@change_settings("Payroll Settings", {"payroll_based_on": "Attendance"})
 	def test_payment_days_in_salary_slip_based_on_timesheet(self):
 		from erpnext.hr.doctype.attendance.attendance import mark_attendance
 		from erpnext.projects.doctype.timesheet.test_timesheet import (
@@ -215,21 +265,30 @@
 			make_salary_slip as make_salary_slip_for_timesheet,
 		)
 
-		emp = make_employee("test_employee_timesheet@salary.com", company="_Test Company", holiday_list="Salary Slip Test Holiday List")
+		emp = make_employee(
+			"test_employee_timesheet@salary.com",
+			company="_Test Company",
+			holiday_list="Salary Slip Test Holiday List",
+		)
 		frappe.db.set_value("Employee", emp, {"relieving_date": None, "status": "Active"})
 
 		# mark attendance
 		month_start_date = get_first_day(nowdate())
 		month_end_date = get_last_day(nowdate())
 
-		first_sunday = frappe.db.sql("""
+		first_sunday = frappe.db.sql(
+			"""
 			select holiday_date from `tabHoliday`
 			where parent = 'Salary Slip Test Holiday List'
 				and holiday_date between %s and %s
 			order by holiday_date
-		""", (month_start_date, month_end_date))[0][0]
+		""",
+			(month_start_date, month_end_date),
+		)[0][0]
 
-		mark_attendance(emp, add_days(first_sunday, 1), 'Absent', ignore_validate=True) # counted as absent
+		mark_attendance(
+			emp, add_days(first_sunday, 1), "Absent", ignore_validate=True
+		)  # counted as absent
 
 		# salary structure based on timesheet
 		make_salary_structure_for_timesheet(emp)
@@ -248,13 +307,14 @@
 		self.assertEqual(salary_slip.payment_days, days_in_month - no_of_holidays - 1)
 
 		# gross pay calculation based on attendance (payment days)
-		gross_pay = 78100 - ((78000 / (days_in_month - no_of_holidays)) * flt(salary_slip.leave_without_pay + salary_slip.absent_days))
+		gross_pay = 78100 - (
+			(78000 / (days_in_month - no_of_holidays))
+			* flt(salary_slip.leave_without_pay + salary_slip.absent_days)
+		)
 
 		self.assertEqual(salary_slip.gross_pay, flt(gross_pay, 2))
 
-	@change_settings("Payroll Settings", {
-		"payroll_based_on": "Attendance"
-	})
+	@change_settings("Payroll Settings", {"payroll_based_on": "Attendance"})
 	def test_component_amount_dependent_on_another_payment_days_based_component(self):
 		from erpnext.hr.doctype.attendance.attendance import mark_attendance
 		from erpnext.payroll.doctype.salary_structure.test_salary_structure import (
@@ -265,23 +325,32 @@
 		employee = make_employee("test_payment_days_based_component@salary.com", company="_Test Company")
 
 		# base = 50000
-		create_salary_structure_assignment(employee, salary_structure.name, company="_Test Company", currency="INR")
+		create_salary_structure_assignment(
+			employee, salary_structure.name, company="_Test Company", currency="INR"
+		)
 
 		# mark employee absent for a day since this case works fine if payment days are equal to working days
 		month_start_date = get_first_day(nowdate())
 		month_end_date = get_last_day(nowdate())
 
-		first_sunday = frappe.db.sql("""
+		first_sunday = frappe.db.sql(
+			"""
 			select holiday_date from `tabHoliday`
 			where parent = 'Salary Slip Test Holiday List'
 				and holiday_date between %s and %s
 			order by holiday_date
-		""", (month_start_date, month_end_date))[0][0]
+		""",
+			(month_start_date, month_end_date),
+		)[0][0]
 
-		mark_attendance(employee, add_days(first_sunday, 1), 'Absent', ignore_validate=True) # counted as absent
+		mark_attendance(
+			employee, add_days(first_sunday, 1), "Absent", ignore_validate=True
+		)  # counted as absent
 
 		# make salary slip and assert payment days
-		ss = make_salary_slip_for_payment_days_dependency_test("test_payment_days_based_component@salary.com", salary_structure.name)
+		ss = make_salary_slip_for_payment_days_dependency_test(
+			"test_payment_days_based_component@salary.com", salary_structure.name
+		)
 		self.assertEqual(ss.absent_days, 1)
 
 		ss.reload()
@@ -304,17 +373,31 @@
 
 		self.assertEqual(actual_amount, expected_amount)
 
-	@change_settings("Payroll Settings", {
-		"include_holidays_in_total_working_days": 1
-	})
+	@change_settings("Payroll Settings", {"include_holidays_in_total_working_days": 1})
 	def test_salary_slip_with_holidays_included(self):
 		no_of_days = self.get_no_of_days()
 		make_employee("test_salary_slip_with_holidays_included@salary.com")
-		frappe.db.set_value("Employee", frappe.get_value("Employee",
-			{"employee_name":"test_salary_slip_with_holidays_included@salary.com"}, "name"), "relieving_date", None)
-		frappe.db.set_value("Employee", frappe.get_value("Employee",
-			{"employee_name":"test_salary_slip_with_holidays_included@salary.com"}, "name"), "status", "Active")
-		ss = make_employee_salary_slip("test_salary_slip_with_holidays_included@salary.com", "Monthly", "Test Salary Slip With Holidays Included")
+		frappe.db.set_value(
+			"Employee",
+			frappe.get_value(
+				"Employee", {"employee_name": "test_salary_slip_with_holidays_included@salary.com"}, "name"
+			),
+			"relieving_date",
+			None,
+		)
+		frappe.db.set_value(
+			"Employee",
+			frappe.get_value(
+				"Employee", {"employee_name": "test_salary_slip_with_holidays_included@salary.com"}, "name"
+			),
+			"status",
+			"Active",
+		)
+		ss = make_employee_salary_slip(
+			"test_salary_slip_with_holidays_included@salary.com",
+			"Monthly",
+			"Test Salary Slip With Holidays Included",
+		)
 
 		self.assertEqual(ss.total_working_days, no_of_days[0])
 		self.assertEqual(ss.payment_days, no_of_days[0])
@@ -322,17 +405,31 @@
 		self.assertEqual(ss.earnings[1].amount, 3000)
 		self.assertEqual(ss.gross_pay, 78000)
 
-	@change_settings("Payroll Settings", {
-		"include_holidays_in_total_working_days": 0
-	})
+	@change_settings("Payroll Settings", {"include_holidays_in_total_working_days": 0})
 	def test_salary_slip_with_holidays_excluded(self):
 		no_of_days = self.get_no_of_days()
 		make_employee("test_salary_slip_with_holidays_excluded@salary.com")
-		frappe.db.set_value("Employee", frappe.get_value("Employee",
-			{"employee_name":"test_salary_slip_with_holidays_excluded@salary.com"}, "name"), "relieving_date", None)
-		frappe.db.set_value("Employee", frappe.get_value("Employee",
-			{"employee_name":"test_salary_slip_with_holidays_excluded@salary.com"}, "name"), "status", "Active")
-		ss = make_employee_salary_slip("test_salary_slip_with_holidays_excluded@salary.com", "Monthly",  "Test Salary Slip With Holidays Excluded")
+		frappe.db.set_value(
+			"Employee",
+			frappe.get_value(
+				"Employee", {"employee_name": "test_salary_slip_with_holidays_excluded@salary.com"}, "name"
+			),
+			"relieving_date",
+			None,
+		)
+		frappe.db.set_value(
+			"Employee",
+			frappe.get_value(
+				"Employee", {"employee_name": "test_salary_slip_with_holidays_excluded@salary.com"}, "name"
+			),
+			"status",
+			"Active",
+		)
+		ss = make_employee_salary_slip(
+			"test_salary_slip_with_holidays_excluded@salary.com",
+			"Monthly",
+			"Test Salary Slip With Holidays Excluded",
+		)
 
 		self.assertEqual(ss.total_working_days, no_of_days[0] - no_of_days[1])
 		self.assertEqual(ss.payment_days, no_of_days[0] - no_of_days[1])
@@ -341,9 +438,7 @@
 		self.assertEqual(ss.earnings[1].amount, 3000)
 		self.assertEqual(ss.gross_pay, 78000)
 
-	@change_settings("Payroll Settings", {
-		"include_holidays_in_total_working_days": 1
-	})
+	@change_settings("Payroll Settings", {"include_holidays_in_total_working_days": 1})
 	def test_payment_days(self):
 		from erpnext.payroll.doctype.salary_structure.test_salary_structure import (
 			create_salary_structure_assignment,
@@ -354,23 +449,23 @@
 		# set joinng date in the same month
 		employee = make_employee("test_payment_days@salary.com")
 		if getdate(nowdate()).day >= 15:
-			relieving_date = getdate(add_days(nowdate(),-10))
-			date_of_joining = getdate(add_days(nowdate(),-10))
+			relieving_date = getdate(add_days(nowdate(), -10))
+			date_of_joining = getdate(add_days(nowdate(), -10))
 		elif getdate(nowdate()).day < 15 and getdate(nowdate()).day >= 5:
-			date_of_joining = getdate(add_days(nowdate(),-3))
-			relieving_date = getdate(add_days(nowdate(),-3))
+			date_of_joining = getdate(add_days(nowdate(), -3))
+			relieving_date = getdate(add_days(nowdate(), -3))
 		elif getdate(nowdate()).day < 5 and not getdate(nowdate()).day == 1:
-			date_of_joining = getdate(add_days(nowdate(),-1))
-			relieving_date = getdate(add_days(nowdate(),-1))
+			date_of_joining = getdate(add_days(nowdate(), -1))
+			relieving_date = getdate(add_days(nowdate(), -1))
 		elif getdate(nowdate()).day == 1:
 			date_of_joining = getdate(nowdate())
 			relieving_date = getdate(nowdate())
 
-		frappe.db.set_value("Employee", employee, {
-			"date_of_joining": date_of_joining,
-			"relieving_date": None,
-			"status": "Active"
-		})
+		frappe.db.set_value(
+			"Employee",
+			employee,
+			{"date_of_joining": date_of_joining, "relieving_date": None, "status": "Active"},
+		)
 
 		salary_structure = "Test Payment Days"
 		ss = make_employee_salary_slip("test_payment_days@salary.com", "Monthly", salary_structure)
@@ -379,11 +474,15 @@
 		self.assertEqual(ss.payment_days, (no_of_days[0] - getdate(date_of_joining).day + 1))
 
 		# set relieving date in the same month
-		frappe.db.set_value("Employee", employee, {
-			"date_of_joining": add_days(nowdate(),-60),
-			"relieving_date": relieving_date,
-			"status": "Left"
-		})
+		frappe.db.set_value(
+			"Employee",
+			employee,
+			{
+				"date_of_joining": add_days(nowdate(), -60),
+				"relieving_date": relieving_date,
+				"status": "Left",
+			},
+		)
 
 		if date_of_joining.day > 1:
 			self.assertRaises(frappe.ValidationError, ss.save)
@@ -395,21 +494,31 @@
 		self.assertEqual(ss.total_working_days, no_of_days[0])
 		self.assertEqual(ss.payment_days, getdate(relieving_date).day)
 
-		frappe.db.set_value("Employee", frappe.get_value("Employee",
-			{"employee_name":"test_payment_days@salary.com"}, "name"), "relieving_date", None)
-		frappe.db.set_value("Employee", frappe.get_value("Employee",
-			{"employee_name":"test_payment_days@salary.com"}, "name"), "status", "Active")
+		frappe.db.set_value(
+			"Employee",
+			frappe.get_value("Employee", {"employee_name": "test_payment_days@salary.com"}, "name"),
+			"relieving_date",
+			None,
+		)
+		frappe.db.set_value(
+			"Employee",
+			frappe.get_value("Employee", {"employee_name": "test_payment_days@salary.com"}, "name"),
+			"status",
+			"Active",
+		)
 
 	def test_employee_salary_slip_read_permission(self):
 		make_employee("test_employee_salary_slip_read_permission@salary.com")
 
-		salary_slip_test_employee = make_employee_salary_slip("test_employee_salary_slip_read_permission@salary.com", "Monthly", "Test Employee Salary Slip Read Permission")
+		salary_slip_test_employee = make_employee_salary_slip(
+			"test_employee_salary_slip_read_permission@salary.com",
+			"Monthly",
+			"Test Employee Salary Slip Read Permission",
+		)
 		frappe.set_user("test_employee_salary_slip_read_permission@salary.com")
 		self.assertTrue(salary_slip_test_employee.has_permission("read"))
 
-	@change_settings("Payroll Settings", {
-		"email_salary_slip_to_employee": 1
-	})
+	@change_settings("Payroll Settings", {"email_salary_slip_to_employee": 1})
 	def test_email_salary_slip(self):
 		frappe.db.delete("Email Queue")
 
@@ -440,34 +549,58 @@
 
 		create_loan_accounts()
 
-		create_loan_type("Car Loan", 500000, 8.4,
+		create_loan_type(
+			"Car Loan",
+			500000,
+			8.4,
 			is_term_loan=1,
-			mode_of_payment='Cash',
-			disbursement_account='Disbursement Account - _TC',
-			payment_account='Payment Account - _TC',
-			loan_account='Loan Account - _TC',
-			interest_income_account='Interest Income Account - _TC',
-			penalty_income_account='Penalty Income Account - _TC')
+			mode_of_payment="Cash",
+			disbursement_account="Disbursement Account - _TC",
+			payment_account="Payment Account - _TC",
+			loan_account="Loan Account - _TC",
+			interest_income_account="Interest Income Account - _TC",
+			penalty_income_account="Penalty Income Account - _TC",
+		)
 
 		payroll_period = create_payroll_period(name="_Test Payroll Period 1", company="_Test Company")
 
-		make_salary_structure("Test Loan Repayment Salary Structure", "Monthly", employee=applicant, currency='INR',
-			payroll_period=payroll_period)
+		make_salary_structure(
+			"Test Loan Repayment Salary Structure",
+			"Monthly",
+			employee=applicant,
+			currency="INR",
+			payroll_period=payroll_period,
+		)
 
-		frappe.db.sql("delete from tabLoan where applicant = 'test_loan_repayment_salary_slip@salary.com'")
-		loan = create_loan(applicant, "Car Loan", 11000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
+		frappe.db.sql(
+			"delete from tabLoan where applicant = 'test_loan_repayment_salary_slip@salary.com'"
+		)
+		loan = create_loan(
+			applicant,
+			"Car Loan",
+			11000,
+			"Repay Over Number of Periods",
+			20,
+			posting_date=add_months(nowdate(), -1),
+		)
 		loan.repay_from_salary = 1
 		loan.submit()
 
-		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1))
+		make_loan_disbursement_entry(
+			loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1)
+		)
 
 		process_loan_interest_accrual_for_term_loans(posting_date=nowdate())
 
-		ss = make_employee_salary_slip("test_loan_repayment_salary_slip@salary.com", "Monthly", "Test Loan Repayment Salary Structure")
+		ss = make_employee_salary_slip(
+			"test_loan_repayment_salary_slip@salary.com", "Monthly", "Test Loan Repayment Salary Structure"
+		)
 		ss.submit()
 
 		self.assertEqual(ss.total_loan_repayment, 592)
-		self.assertEqual(ss.net_pay, (flt(ss.gross_pay) - (flt(ss.total_deduction) + flt(ss.total_loan_repayment))))
+		self.assertEqual(
+			ss.net_pay, (flt(ss.gross_pay) - (flt(ss.total_deduction) + flt(ss.total_loan_repayment)))
+		)
 
 	def test_payroll_frequency(self):
 		fiscal_year = get_fiscal_year(nowdate(), company=erpnext.get_default_company())[0]
@@ -476,18 +609,22 @@
 
 		for payroll_frequency in ["Monthly", "Bimonthly", "Fortnightly", "Weekly", "Daily"]:
 			make_employee(payroll_frequency + "_test_employee@salary.com")
-			ss = make_employee_salary_slip(payroll_frequency + "_test_employee@salary.com", payroll_frequency, payroll_frequency + "_Test Payroll Frequency")
+			ss = make_employee_salary_slip(
+				payroll_frequency + "_test_employee@salary.com",
+				payroll_frequency,
+				payroll_frequency + "_Test Payroll Frequency",
+			)
 			if payroll_frequency == "Monthly":
-				self.assertEqual(ss.end_date, m['month_end_date'])
+				self.assertEqual(ss.end_date, m["month_end_date"])
 			elif payroll_frequency == "Bimonthly":
 				if getdate(ss.start_date).day <= 15:
-					self.assertEqual(ss.end_date, m['month_mid_end_date'])
+					self.assertEqual(ss.end_date, m["month_mid_end_date"])
 				else:
-					self.assertEqual(ss.end_date, m['month_end_date'])
+					self.assertEqual(ss.end_date, m["month_end_date"])
 			elif payroll_frequency == "Fortnightly":
-				self.assertEqual(ss.end_date, add_days(nowdate(),13))
+				self.assertEqual(ss.end_date, add_days(nowdate(), 13))
 			elif payroll_frequency == "Weekly":
-				self.assertEqual(ss.end_date, add_days(nowdate(),6))
+				self.assertEqual(ss.end_date, add_days(nowdate(), 6))
 			elif payroll_frequency == "Daily":
 				self.assertEqual(ss.end_date, nowdate())
 
@@ -495,14 +632,22 @@
 		from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
 
 		applicant = make_employee("test_multi_currency_salary_slip@salary.com", company="_Test Company")
-		frappe.db.sql("""delete from `tabSalary Structure` where name='Test Multi Currency Salary Slip'""")
-		salary_structure = make_salary_structure("Test Multi Currency Salary Slip", "Monthly", employee=applicant, company="_Test Company", currency='USD')
-		salary_slip = make_salary_slip(salary_structure.name, employee = applicant)
+		frappe.db.sql(
+			"""delete from `tabSalary Structure` where name='Test Multi Currency Salary Slip'"""
+		)
+		salary_structure = make_salary_structure(
+			"Test Multi Currency Salary Slip",
+			"Monthly",
+			employee=applicant,
+			company="_Test Company",
+			currency="USD",
+		)
+		salary_slip = make_salary_slip(salary_structure.name, employee=applicant)
 		salary_slip.exchange_rate = 70
 		salary_slip.calculate_net_pay()
 
 		self.assertEqual(salary_slip.gross_pay, 78000)
-		self.assertEqual(salary_slip.base_gross_pay, 78000*70)
+		self.assertEqual(salary_slip.base_gross_pay, 78000 * 70)
 
 	def test_year_to_date_computation(self):
 		from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
@@ -511,20 +656,36 @@
 
 		payroll_period = create_payroll_period(name="_Test Payroll Period 1", company="_Test Company")
 
-		create_tax_slab(payroll_period, allow_tax_exemption=True, currency="INR", effective_date=getdate("2019-04-01"),
-			company="_Test Company")
+		create_tax_slab(
+			payroll_period,
+			allow_tax_exemption=True,
+			currency="INR",
+			effective_date=getdate("2019-04-01"),
+			company="_Test Company",
+		)
 
-		salary_structure = make_salary_structure("Monthly Salary Structure Test for Salary Slip YTD",
-			"Monthly", employee=applicant, company="_Test Company", currency="INR", payroll_period=payroll_period)
+		salary_structure = make_salary_structure(
+			"Monthly Salary Structure Test for Salary Slip YTD",
+			"Monthly",
+			employee=applicant,
+			company="_Test Company",
+			currency="INR",
+			payroll_period=payroll_period,
+		)
 
 		# clear salary slip for this employee
 		frappe.db.sql("DELETE FROM `tabSalary Slip` where employee_name = 'test_ytd@salary.com'")
 
-		create_salary_slips_for_payroll_period(applicant, salary_structure.name,
-			payroll_period, deduct_random=False, num=6)
+		create_salary_slips_for_payroll_period(
+			applicant, salary_structure.name, payroll_period, deduct_random=False, num=6
+		)
 
-		salary_slips = frappe.get_all('Salary Slip', fields=['year_to_date', 'net_pay'], filters={'employee_name':
-			'test_ytd@salary.com'}, order_by = 'posting_date')
+		salary_slips = frappe.get_all(
+			"Salary Slip",
+			fields=["year_to_date", "net_pay"],
+			filters={"employee_name": "test_ytd@salary.com"},
+			order_by="posting_date",
+		)
 
 		year_to_date = 0
 		for slip in salary_slips:
@@ -539,20 +700,36 @@
 
 		payroll_period = create_payroll_period(name="_Test Payroll Period 1", company="_Test Company")
 
-		create_tax_slab(payroll_period, allow_tax_exemption=True, currency="INR", effective_date=getdate("2019-04-01"),
-			company="_Test Company")
+		create_tax_slab(
+			payroll_period,
+			allow_tax_exemption=True,
+			currency="INR",
+			effective_date=getdate("2019-04-01"),
+			company="_Test Company",
+		)
 
-		salary_structure = make_salary_structure("Monthly Salary Structure Test for Salary Slip YTD",
-			"Monthly", employee=applicant, company="_Test Company", currency="INR", payroll_period=payroll_period)
+		salary_structure = make_salary_structure(
+			"Monthly Salary Structure Test for Salary Slip YTD",
+			"Monthly",
+			employee=applicant,
+			company="_Test Company",
+			currency="INR",
+			payroll_period=payroll_period,
+		)
 
 		# clear salary slip for this employee
 		frappe.db.sql("DELETE FROM `tabSalary Slip` where employee_name = '%s'" % employee_name)
 
-		create_salary_slips_for_payroll_period(applicant, salary_structure.name,
-			payroll_period, deduct_random=False, num=3)
+		create_salary_slips_for_payroll_period(
+			applicant, salary_structure.name, payroll_period, deduct_random=False, num=3
+		)
 
-		salary_slips = frappe.get_all("Salary Slip", fields=["name"], filters={"employee_name":
-			employee_name}, order_by="posting_date")
+		salary_slips = frappe.get_all(
+			"Salary Slip",
+			fields=["name"],
+			filters={"employee_name": employee_name},
+			order_by="posting_date",
+		)
 
 		year_to_date = dict()
 		for slip in salary_slips:
@@ -583,21 +760,27 @@
 			"Employee Tax Exemption Declaration",
 			"Employee Tax Exemption Proof Submission",
 			"Employee Benefit Claim",
-			"Salary Structure Assignment"
+			"Salary Structure Assignment",
 		]
 		for doc in delete_docs:
 			frappe.db.sql("delete from `tab%s` where employee='%s'" % (doc, employee))
 
 		from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
 
-		salary_structure = make_salary_structure("Stucture to test tax", "Monthly",
-			other_details={"max_benefits": 100000}, test_tax=True,
-			employee=employee, payroll_period=payroll_period)
+		salary_structure = make_salary_structure(
+			"Stucture to test tax",
+			"Monthly",
+			other_details={"max_benefits": 100000},
+			test_tax=True,
+			employee=employee,
+			payroll_period=payroll_period,
+		)
 
 		# create salary slip for whole period deducting tax only on last period
 		# to find the total tax amount paid
-		create_salary_slips_for_payroll_period(employee, salary_structure.name,
-			payroll_period, deduct_random=False)
+		create_salary_slips_for_payroll_period(
+			employee, salary_structure.name, payroll_period, deduct_random=False
+		)
 		tax_paid = get_tax_paid_in_period(employee)
 
 		annual_tax = 113589.0
@@ -612,8 +795,9 @@
 		create_exemption_declaration(employee, payroll_period.name)
 
 		# create for payroll deducting in random months
-		data["deducted_dates"] = create_salary_slips_for_payroll_period(employee,
-			salary_structure.name, payroll_period)
+		data["deducted_dates"] = create_salary_slips_for_payroll_period(
+			employee, salary_structure.name, payroll_period
+		)
 		tax_paid = get_tax_paid_in_period(employee)
 
 		# No proof, benefit claim sumitted, total tax paid, should not change
@@ -628,12 +812,14 @@
 
 		# Submit benefit claim for total 50000
 		data["benefit-1"] = create_benefit_claim(employee, payroll_period, 15000, "Medical Allowance")
-		data["benefit-2"] = create_benefit_claim(employee, payroll_period, 35000, "Leave Travel Allowance")
-
+		data["benefit-2"] = create_benefit_claim(
+			employee, payroll_period, 35000, "Leave Travel Allowance"
+		)
 
 		frappe.db.sql("""delete from `tabSalary Slip` where employee=%s""", (employee))
-		data["deducted_dates"] = create_salary_slips_for_payroll_period(employee,
-			salary_structure.name, payroll_period)
+		data["deducted_dates"] = create_salary_slips_for_payroll_period(
+			employee, salary_structure.name, payroll_period
+		)
 		tax_paid = get_tax_paid_in_period(employee)
 
 		# total taxable income 416000, 166000 @ 5% ie. 8300
@@ -646,8 +832,9 @@
 		# create additional salary of 150000
 		frappe.db.sql("""delete from `tabSalary Slip` where employee=%s""", (employee))
 		data["additional-1"] = create_additional_salary(employee, payroll_period, 150000)
-		data["deducted_dates"] = create_salary_slips_for_payroll_period(employee,
-			salary_structure.name, payroll_period)
+		data["deducted_dates"] = create_salary_slips_for_payroll_period(
+			employee, salary_structure.name, payroll_period
+		)
 
 		# total taxable income 566000, 250000 @ 5%, 66000 @ 20%, 12500 + 13200
 		tax_paid = get_tax_paid_in_period(employee)
@@ -676,20 +863,25 @@
 			"Employee Tax Exemption Declaration",
 			"Employee Tax Exemption Proof Submission",
 			"Employee Benefit Claim",
-			"Salary Structure Assignment"
+			"Salary Structure Assignment",
 		]
 		for doc in delete_docs:
 			frappe.db.sql("delete from `tab%s` where employee='%s'" % (doc, employee))
 
 		from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
 
-		salary_structure = make_salary_structure("Stucture to test tax", "Monthly",
-			other_details={"max_benefits": 100000}, test_tax=True,
-			employee=employee, payroll_period=payroll_period)
+		salary_structure = make_salary_structure(
+			"Stucture to test tax",
+			"Monthly",
+			other_details={"max_benefits": 100000},
+			test_tax=True,
+			employee=employee,
+			payroll_period=payroll_period,
+		)
 
-
-		create_salary_slips_for_payroll_period(employee, salary_structure.name,
-			payroll_period, deduct_random=False, num=3)
+		create_salary_slips_for_payroll_period(
+			employee, salary_structure.name, payroll_period, deduct_random=False, num=3
+		)
 
 		tax_paid = get_tax_paid_in_period(employee)
 
@@ -698,7 +890,7 @@
 
 		frappe.db.sql("""delete from `tabSalary Slip` where employee=%s""", (employee))
 
-		#------------------------------------
+		# ------------------------------------
 		# Recurring additional salary
 		start_date = add_months(payroll_period.start_date, 3)
 		end_date = add_months(payroll_period.start_date, 5)
@@ -706,8 +898,9 @@
 
 		frappe.db.sql("""delete from `tabSalary Slip` where employee=%s""", (employee))
 
-		create_salary_slips_for_payroll_period(employee, salary_structure.name,
-			payroll_period, deduct_random=False, num=4)
+		create_salary_slips_for_payroll_period(
+			employee, salary_structure.name, payroll_period, deduct_random=False, num=4
+		)
 
 		tax_paid = get_tax_paid_in_period(employee)
 
@@ -724,43 +917,50 @@
 		activity_type.save()
 
 	def get_no_of_days(self):
-		no_of_days_in_month = calendar.monthrange(getdate(nowdate()).year,
-			getdate(nowdate()).month)
-		no_of_holidays_in_month = len([1 for i in calendar.monthcalendar(getdate(nowdate()).year,
-			getdate(nowdate()).month) if i[6] != 0])
+		no_of_days_in_month = calendar.monthrange(getdate(nowdate()).year, getdate(nowdate()).month)
+		no_of_holidays_in_month = len(
+			[
+				1
+				for i in calendar.monthcalendar(getdate(nowdate()).year, getdate(nowdate()).month)
+				if i[6] != 0
+			]
+		)
 
 		return [no_of_days_in_month[1], no_of_holidays_in_month]
 
+
 def make_employee_salary_slip(user, payroll_frequency, salary_structure=None):
 	from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure
 
 	if not salary_structure:
 		salary_structure = payroll_frequency + " Salary Structure Test for Salary Slip"
 
-	employee = frappe.db.get_value("Employee",
-					{
-						"user_id": user
-					},
-					["name", "company", "employee_name"],
-					as_dict=True)
+	employee = frappe.db.get_value(
+		"Employee", {"user_id": user}, ["name", "company", "employee_name"], as_dict=True
+	)
 
-	salary_structure_doc = make_salary_structure(salary_structure, payroll_frequency, employee=employee.name, company=employee.company)
-	salary_slip_name = frappe.db.get_value("Salary Slip", {"employee": frappe.db.get_value("Employee", {"user_id": user})})
+	salary_structure_doc = make_salary_structure(
+		salary_structure, payroll_frequency, employee=employee.name, company=employee.company
+	)
+	salary_slip_name = frappe.db.get_value(
+		"Salary Slip", {"employee": frappe.db.get_value("Employee", {"user_id": user})}
+	)
 
 	if not salary_slip_name:
-		salary_slip = make_salary_slip(salary_structure_doc.name, employee = employee.name)
+		salary_slip = make_salary_slip(salary_structure_doc.name, employee=employee.name)
 		salary_slip.employee_name = employee.employee_name
 		salary_slip.payroll_frequency = payroll_frequency
 		salary_slip.posting_date = nowdate()
 		salary_slip.insert()
 	else:
-		salary_slip = frappe.get_doc('Salary Slip', salary_slip_name)
+		salary_slip = frappe.get_doc("Salary Slip", salary_slip_name)
 
 	return salary_slip
 
+
 def make_salary_component(salary_components, test_tax, company_list=None):
 	for salary_component in salary_components:
-		if frappe.db.exists('Salary Component', salary_component["salary_component"]):
+		if frappe.db.exists("Salary Component", salary_component["salary_component"]):
 			continue
 
 		if test_tax:
@@ -780,6 +980,7 @@
 
 		get_salary_component_account(doc, company_list)
 
+
 def get_salary_component_account(sal_comp, company_list=None):
 	company = erpnext.get_default_company()
 
@@ -791,7 +992,7 @@
 
 	if not sal_comp.get("accounts"):
 		for d in company_list:
-			company_abbr = frappe.get_cached_value('Company', d, 'abbr')
+			company_abbr = frappe.get_cached_value("Company", d, "abbr")
 
 			if sal_comp.type == "Earning":
 				account_name = "Salary"
@@ -800,177 +1001,202 @@
 				account_name = "Salary Deductions"
 				parent_account = "Current Liabilities - " + company_abbr
 
-			sal_comp.append("accounts", {
-				"company": d,
-				"account": create_account(account_name, d, parent_account)
-			})
+			sal_comp.append(
+				"accounts", {"company": d, "account": create_account(account_name, d, parent_account)}
+			)
 			sal_comp.save()
 
+
 def create_account(account_name, company, parent_account, account_type=None):
-	company_abbr = frappe.get_cached_value('Company',  company,  'abbr')
+	company_abbr = frappe.get_cached_value("Company", company, "abbr")
 	account = frappe.db.get_value("Account", account_name + " - " + company_abbr)
 	if not account:
-		frappe.get_doc({
-			"doctype": "Account",
-			"account_name": account_name,
-			"parent_account": parent_account,
-			"company": company
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"account_name": account_name,
+				"parent_account": parent_account,
+				"company": company,
+			}
+		).insert()
 	return account
 
+
 def make_earning_salary_component(setup=False, test_tax=False, company_list=None):
 	data = [
 		{
-			"salary_component": 'Basic Salary',
-			"abbr":'BS',
-			"condition": 'base > 10000',
-			"formula": 'base',
+			"salary_component": "Basic Salary",
+			"abbr": "BS",
+			"condition": "base > 10000",
+			"formula": "base",
 			"type": "Earning",
-			"amount_based_on_formula": 1
+			"amount_based_on_formula": 1,
 		},
+		{"salary_component": "HRA", "abbr": "H", "amount": 3000, "type": "Earning"},
 		{
-			"salary_component": 'HRA',
-			"abbr":'H',
-			"amount": 3000,
-			"type": "Earning"
-		},
-		{
-			"salary_component": 'Special Allowance',
-			"abbr":'SA',
-			"condition": 'H < 10000',
-			"formula": 'BS*.5',
+			"salary_component": "Special Allowance",
+			"abbr": "SA",
+			"condition": "H < 10000",
+			"formula": "BS*.5",
 			"type": "Earning",
-			"amount_based_on_formula": 1
+			"amount_based_on_formula": 1,
 		},
-		{
-			"salary_component": "Leave Encashment",
-			"abbr": 'LE',
-			"type": "Earning"
-		}
+		{"salary_component": "Leave Encashment", "abbr": "LE", "type": "Earning"},
 	]
 	if test_tax:
-		data.extend([
-			{
-				"salary_component": "Leave Travel Allowance",
-				"abbr": 'B',
-				"is_flexible_benefit": 1,
-				"type": "Earning",
-				"pay_against_benefit_claim": 1,
-				"max_benefit_amount": 100000,
-				"depends_on_payment_days": 0
-			},
-			{
-				"salary_component": "Medical Allowance",
-				"abbr": 'B',
-				"is_flexible_benefit": 1,
-				"pay_against_benefit_claim": 0,
-				"type": "Earning",
-				"max_benefit_amount": 15000
-			},
-			{
-				"salary_component": "Performance Bonus",
-				"abbr": 'B',
-				"type": "Earning"
-			}
-		])
+		data.extend(
+			[
+				{
+					"salary_component": "Leave Travel Allowance",
+					"abbr": "B",
+					"is_flexible_benefit": 1,
+					"type": "Earning",
+					"pay_against_benefit_claim": 1,
+					"max_benefit_amount": 100000,
+					"depends_on_payment_days": 0,
+				},
+				{
+					"salary_component": "Medical Allowance",
+					"abbr": "B",
+					"is_flexible_benefit": 1,
+					"pay_against_benefit_claim": 0,
+					"type": "Earning",
+					"max_benefit_amount": 15000,
+				},
+				{"salary_component": "Performance Bonus", "abbr": "B", "type": "Earning"},
+			]
+		)
 	if setup or test_tax:
 		make_salary_component(data, test_tax, company_list)
-	data.append({
-		"salary_component": 'Basic Salary',
-		"abbr":'BS',
-		"condition": 'base < 10000',
-		"formula": 'base*.2',
-		"type": "Earning",
-		"amount_based_on_formula": 1
-	})
+	data.append(
+		{
+			"salary_component": "Basic Salary",
+			"abbr": "BS",
+			"condition": "base < 10000",
+			"formula": "base*.2",
+			"type": "Earning",
+			"amount_based_on_formula": 1,
+		}
+	)
 	return data
 
+
 def make_deduction_salary_component(setup=False, test_tax=False, company_list=None):
-	data =  [
+	data = [
 		{
-			"salary_component": 'Professional Tax',
-			"abbr":'PT',
+			"salary_component": "Professional Tax",
+			"abbr": "PT",
 			"type": "Deduction",
 			"amount": 200,
-			"exempted_from_income_tax": 1
-
+			"exempted_from_income_tax": 1,
 		}
 	]
 	if not test_tax:
-		data.append({
-			"salary_component": 'TDS',
-			"abbr":'T',
-			"condition": 'employment_type=="Intern"',
-			"type": "Deduction",
-			"round_to_the_nearest_integer": 1
-		})
+		data.append(
+			{
+				"salary_component": "TDS",
+				"abbr": "T",
+				"condition": 'employment_type=="Intern"',
+				"type": "Deduction",
+				"round_to_the_nearest_integer": 1,
+			}
+		)
 	else:
-		data.append({
-			"salary_component": 'TDS',
-			"abbr":'T',
-			"type": "Deduction",
-			"depends_on_payment_days": 0,
-			"variable_based_on_taxable_salary": 1,
-			"round_to_the_nearest_integer": 1
-		})
+		data.append(
+			{
+				"salary_component": "TDS",
+				"abbr": "T",
+				"type": "Deduction",
+				"depends_on_payment_days": 0,
+				"variable_based_on_taxable_salary": 1,
+				"round_to_the_nearest_integer": 1,
+			}
+		)
 	if setup or test_tax:
 		make_salary_component(data, test_tax, company_list)
 
 	return data
 
+
 def get_tax_paid_in_period(employee):
-	tax_paid_amount = frappe.db.sql("""select sum(sd.amount) from `tabSalary Detail`
+	tax_paid_amount = frappe.db.sql(
+		"""select sum(sd.amount) from `tabSalary Detail`
 		sd join `tabSalary Slip` ss where ss.name=sd.parent and ss.employee=%s
-		and ss.docstatus=1 and sd.salary_component='TDS'""", (employee))
+		and ss.docstatus=1 and sd.salary_component='TDS'""",
+		(employee),
+	)
 	return tax_paid_amount[0][0]
 
+
 def create_exemption_declaration(employee, payroll_period):
 	create_exemption_category()
-	declaration = frappe.get_doc({
-		"doctype": "Employee Tax Exemption Declaration",
-		"employee": employee,
-		"payroll_period": payroll_period,
-		"company": erpnext.get_default_company(),
-		"currency": erpnext.get_default_currency()
-	})
-	declaration.append("declarations", {
-		"exemption_sub_category": "_Test Sub Category",
-		"exemption_category": "_Test Category",
-		"amount": 100000
-	})
+	declaration = frappe.get_doc(
+		{
+			"doctype": "Employee Tax Exemption Declaration",
+			"employee": employee,
+			"payroll_period": payroll_period,
+			"company": erpnext.get_default_company(),
+			"currency": erpnext.get_default_currency(),
+		}
+	)
+	declaration.append(
+		"declarations",
+		{
+			"exemption_sub_category": "_Test Sub Category",
+			"exemption_category": "_Test Category",
+			"amount": 100000,
+		},
+	)
 	declaration.submit()
 
+
 def create_proof_submission(employee, payroll_period, amount):
 	submission_date = add_months(payroll_period.start_date, random.randint(0, 11))
-	proof_submission = frappe.get_doc({
-		"doctype": "Employee Tax Exemption Proof Submission",
-		"employee": employee,
-		"payroll_period": payroll_period.name,
-		"submission_date": submission_date,
-		"currency": erpnext.get_default_currency()
-	})
-	proof_submission.append("tax_exemption_proofs", {
-		"exemption_sub_category": "_Test Sub Category",
-		"exemption_category": "_Test Category",
-		"type_of_proof": "Test", "amount": amount
-	})
+	proof_submission = frappe.get_doc(
+		{
+			"doctype": "Employee Tax Exemption Proof Submission",
+			"employee": employee,
+			"payroll_period": payroll_period.name,
+			"submission_date": submission_date,
+			"currency": erpnext.get_default_currency(),
+		}
+	)
+	proof_submission.append(
+		"tax_exemption_proofs",
+		{
+			"exemption_sub_category": "_Test Sub Category",
+			"exemption_category": "_Test Category",
+			"type_of_proof": "Test",
+			"amount": amount,
+		},
+	)
 	proof_submission.submit()
 	return submission_date
 
+
 def create_benefit_claim(employee, payroll_period, amount, component):
 	claim_date = add_months(payroll_period.start_date, random.randint(0, 11))
-	frappe.get_doc({
-		"doctype": "Employee Benefit Claim",
-		"employee": employee,
-		"claimed_amount": amount,
-		"claim_date": claim_date,
-		"earning_component": component,
-		"currency": erpnext.get_default_currency()
-	}).submit()
+	frappe.get_doc(
+		{
+			"doctype": "Employee Benefit Claim",
+			"employee": employee,
+			"claimed_amount": amount,
+			"claim_date": claim_date,
+			"earning_component": component,
+			"currency": erpnext.get_default_currency(),
+		}
+	).submit()
 	return claim_date
 
-def create_tax_slab(payroll_period, effective_date = None, allow_tax_exemption = False, dont_submit = False, currency=None,
-	company=None):
+
+def create_tax_slab(
+	payroll_period,
+	effective_date=None,
+	allow_tax_exemption=False,
+	dont_submit=False,
+	currency=None,
+	company=None,
+):
 	if not currency:
 		currency = erpnext.get_default_currency()
 
@@ -982,17 +1208,10 @@
 			"from_amount": 250000,
 			"to_amount": 500000,
 			"percent_deduction": 5,
-			"condition": "annual_taxable_earning > 500000"
+			"condition": "annual_taxable_earning > 500000",
 		},
-		{
-			"from_amount": 500001,
-			"to_amount": 1000000,
-			"percent_deduction": 20
-		},
-		{
-			"from_amount": 1000001,
-			"percent_deduction": 30
-		}
+		{"from_amount": 500001, "to_amount": 1000000, "percent_deduction": 20},
+		{"from_amount": 1000001, "percent_deduction": 30},
 	]
 
 	income_tax_slab_name = frappe.db.get_value("Income Tax Slab", {"currency": currency})
@@ -1000,7 +1219,7 @@
 		income_tax_slab = frappe.new_doc("Income Tax Slab")
 		income_tax_slab.name = "Tax Slab: " + payroll_period.name + " " + cstr(currency)
 		income_tax_slab.effective_from = effective_date or add_days(payroll_period.start_date, -2)
-		income_tax_slab.company = company or ''
+		income_tax_slab.company = company or ""
 		income_tax_slab.currency = currency
 
 		if allow_tax_exemption:
@@ -1010,10 +1229,7 @@
 		for item in slabs:
 			income_tax_slab.append("slabs", item)
 
-		income_tax_slab.append("other_taxes_and_charges", {
-			"description": "cess",
-			"percent": 4
-		})
+		income_tax_slab.append("other_taxes_and_charges", {"description": "cess", "percent": 4})
 
 		income_tax_slab.save()
 		if not dont_submit:
@@ -1023,12 +1239,21 @@
 	else:
 		return income_tax_slab_name
 
-def create_salary_slips_for_payroll_period(employee, salary_structure, payroll_period, deduct_random=True, num=12):
+
+def create_salary_slips_for_payroll_period(
+	employee, salary_structure, payroll_period, deduct_random=True, num=12
+):
 	deducted_dates = []
 	i = 0
 	while i < num:
-		slip = frappe.get_doc({"doctype": "Salary Slip", "employee": employee,
-				"salary_structure": salary_structure, "frequency": "Monthly"})
+		slip = frappe.get_doc(
+			{
+				"doctype": "Salary Slip",
+				"employee": employee,
+				"salary_structure": salary_structure,
+				"frequency": "Monthly",
+			}
+		)
 		if i == 0:
 			posting_date = add_days(payroll_period.start_date, 25)
 		else:
@@ -1047,50 +1272,66 @@
 		i += 1
 	return deducted_dates
 
+
 def create_additional_salary(employee, payroll_period, amount):
 	salary_date = add_months(payroll_period.start_date, random.randint(0, 11))
-	frappe.get_doc({
-		"doctype": "Additional Salary",
-		"employee": employee,
-		"company": erpnext.get_default_company(),
-		"salary_component": "Performance Bonus",
-		"payroll_date": salary_date,
-		"amount": amount,
-		"type": "Earning",
-		"currency": erpnext.get_default_currency()
-	}).submit()
+	frappe.get_doc(
+		{
+			"doctype": "Additional Salary",
+			"employee": employee,
+			"company": erpnext.get_default_company(),
+			"salary_component": "Performance Bonus",
+			"payroll_date": salary_date,
+			"amount": amount,
+			"type": "Earning",
+			"currency": erpnext.get_default_currency(),
+		}
+	).submit()
 	return salary_date
 
+
 def make_leave_application(employee, from_date, to_date, leave_type, company=None, submit=True):
-	leave_application = frappe.get_doc(dict(
-		doctype = 'Leave Application',
-		employee = employee,
-		leave_type = leave_type,
-		from_date = from_date,
-		to_date = to_date,
-		company = company or erpnext.get_default_company() or "_Test Company",
-		status = "Approved",
-		leave_approver = 'test@example.com'
-	)).insert()
+	leave_application = frappe.get_doc(
+		dict(
+			doctype="Leave Application",
+			employee=employee,
+			leave_type=leave_type,
+			from_date=from_date,
+			to_date=to_date,
+			company=company or erpnext.get_default_company() or "_Test Company",
+			status="Approved",
+			leave_approver="test@example.com",
+		)
+	).insert()
 
 	if submit:
 		leave_application.submit()
 
 	return leave_application
 
+
 def setup_test():
 	make_earning_salary_component(setup=True, company_list=["_Test Company"])
 	make_deduction_salary_component(setup=True, company_list=["_Test Company"])
 
-	for dt in ["Leave Application", "Leave Allocation", "Salary Slip", "Attendance", "Additional Salary"]:
+	for dt in [
+		"Leave Application",
+		"Leave Allocation",
+		"Salary Slip",
+		"Attendance",
+		"Additional Salary",
+	]:
 		frappe.db.sql("delete from `tab%s`" % dt)
 
 	make_holiday_list()
 
-	frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", "Salary Slip Test Holiday List")
+	frappe.db.set_value(
+		"Company", erpnext.get_default_company(), "default_holiday_list", "Salary Slip Test Holiday List"
+	)
 	frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 0)
-	frappe.db.set_value('HR Settings', None, 'leave_status_notification_template', None)
-	frappe.db.set_value('HR Settings', None, 'leave_approval_notification_template', None)
+	frappe.db.set_value("HR Settings", None, "leave_status_notification_template", None)
+	frappe.db.set_value("HR Settings", None, "leave_approval_notification_template", None)
+
 
 def make_holiday_list(list_name=None, from_date=None, to_date=None):
 	fiscal_year = get_fiscal_year(nowdate(), company=erpnext.get_default_company())
@@ -1098,19 +1339,22 @@
 
 	frappe.delete_doc_if_exists("Holiday List", name, force=True)
 
-	holiday_list = frappe.get_doc({
-		"doctype": "Holiday List",
-		"holiday_list_name": name,
-		"from_date": from_date or fiscal_year[1],
-		"to_date": to_date or fiscal_year[2],
-		"weekly_off": "Sunday"
-	}).insert()
+	holiday_list = frappe.get_doc(
+		{
+			"doctype": "Holiday List",
+			"holiday_list_name": name,
+			"from_date": from_date or fiscal_year[1],
+			"to_date": to_date or fiscal_year[2],
+			"weekly_off": "Sunday",
+		}
+	).insert()
 	holiday_list.get_weekly_off_dates()
 	holiday_list.save()
 	holiday_list = holiday_list.name
 
 	return holiday_list
 
+
 def make_salary_structure_for_payment_days_based_component_dependency():
 	earnings = [
 		{
@@ -1118,7 +1362,7 @@
 			"abbr": "P_BS",
 			"type": "Earning",
 			"formula": "base",
-			"amount_based_on_formula": 1
+			"amount_based_on_formula": 1,
 		},
 		{
 			"salary_component": "HRA - Payment Days",
@@ -1126,8 +1370,8 @@
 			"type": "Earning",
 			"depends_on_payment_days": 1,
 			"amount_based_on_formula": 1,
-			"formula": "base * 0.20"
-		}
+			"formula": "base * 0.20",
+		},
 	]
 
 	make_salary_component(earnings, False, company_list=["_Test Company"])
@@ -1138,7 +1382,7 @@
 			"abbr": "P_PT",
 			"type": "Deduction",
 			"depends_on_payment_days": 1,
-			"amount": 200.00
+			"amount": 200.00,
 		},
 		{
 			"salary_component": "P - Employee Provident Fund",
@@ -1147,8 +1391,8 @@
 			"exempted_from_income_tax": 1,
 			"amount_based_on_formula": 1,
 			"depends_on_payment_days": 0,
-			"formula": "(gross_pay - P_HRA) * 0.12"
-		}
+			"formula": "(gross_pay - P_HRA) * 0.12",
+		},
 	]
 
 	make_salary_component(deductions, False, company_list=["_Test Company"])
@@ -1163,7 +1407,7 @@
 		"company": "_Test Company",
 		"payroll_frequency": "Monthly",
 		"payment_account": get_random("Account", filters={"account_currency": "INR"}),
-		"currency": "INR"
+		"currency": "INR",
 	}
 
 	salary_structure_doc = frappe.get_doc(details)
@@ -1179,12 +1423,10 @@
 
 	return salary_structure_doc
 
+
 def make_salary_slip_for_payment_days_dependency_test(employee, salary_structure):
 	employee = frappe.db.get_value(
-		"Employee",
-		{"user_id": employee},
-		["name", "company", "employee_name"],
-		as_dict=True
+		"Employee", {"user_id": employee}, ["name", "company", "employee_name"], as_dict=True
 	)
 
 	salary_slip_name = frappe.db.get_value("Salary Slip", {"employee": employee.name})
@@ -1200,16 +1442,21 @@
 
 	return salary_slip
 
-def create_recurring_additional_salary(employee, salary_component, amount, from_date, to_date, company=None):
-	frappe.get_doc({
-		"doctype": "Additional Salary",
-		"employee": employee,
-		"company": company or erpnext.get_default_company(),
-		"salary_component": salary_component,
-		"is_recurring": 1,
-		"from_date": from_date,
-		"to_date": to_date,
-		"amount": amount,
-		"type": "Earning",
-		"currency": erpnext.get_default_currency()
-	}).submit()
+
+def create_recurring_additional_salary(
+	employee, salary_component, amount, from_date, to_date, company=None
+):
+	frappe.get_doc(
+		{
+			"doctype": "Additional Salary",
+			"employee": employee,
+			"company": company or erpnext.get_default_company(),
+			"salary_component": salary_component,
+			"is_recurring": 1,
+			"from_date": from_date,
+			"to_date": to_date,
+			"amount": amount,
+			"type": "Earning",
+			"currency": erpnext.get_default_currency(),
+		}
+	).submit()
diff --git a/erpnext/payroll/doctype/salary_structure/salary_structure.py b/erpnext/payroll/doctype/salary_structure/salary_structure.py
index 4cbf948..fa36b7a 100644
--- a/erpnext/payroll/doctype/salary_structure/salary_structure.py
+++ b/erpnext/payroll/doctype/salary_structure/salary_structure.py
@@ -20,12 +20,21 @@
 		self.validate_component_based_on_tax_slab()
 
 	def set_missing_values(self):
-		overwritten_fields = ["depends_on_payment_days", "variable_based_on_taxable_salary", "is_tax_applicable", "is_flexible_benefit"]
+		overwritten_fields = [
+			"depends_on_payment_days",
+			"variable_based_on_taxable_salary",
+			"is_tax_applicable",
+			"is_flexible_benefit",
+		]
 		overwritten_fields_if_missing = ["amount_based_on_formula", "formula", "amount"]
 		for table in ["earnings", "deductions"]:
 			for d in self.get(table):
-				component_default_value = frappe.db.get_value("Salary Component", cstr(d.salary_component),
-					overwritten_fields + overwritten_fields_if_missing, as_dict=1)
+				component_default_value = frappe.db.get_value(
+					"Salary Component",
+					cstr(d.salary_component),
+					overwritten_fields + overwritten_fields_if_missing,
+					as_dict=1,
+				)
 				if component_default_value:
 					for fieldname in overwritten_fields:
 						value = component_default_value.get(fieldname)
@@ -39,8 +48,11 @@
 	def validate_component_based_on_tax_slab(self):
 		for row in self.deductions:
 			if row.variable_based_on_taxable_salary and (row.amount or row.formula):
-				frappe.throw(_("Row #{0}: Cannot set amount or formula for Salary Component {1} with Variable Based On Taxable Salary")
-					.format(row.idx, row.salary_component))
+				frappe.throw(
+					_(
+						"Row #{0}: Cannot set amount or formula for Salary Component {1} with Variable Based On Taxable Salary"
+					).format(row.idx, row.salary_component)
+				)
 
 	def validate_amount(self):
 		if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet:
@@ -63,16 +75,23 @@
 			for earning_component in self.earnings:
 				if earning_component.is_flexible_benefit == 1:
 					have_a_flexi = True
-					max_of_component = frappe.db.get_value("Salary Component", earning_component.salary_component, "max_benefit_amount")
+					max_of_component = frappe.db.get_value(
+						"Salary Component", earning_component.salary_component, "max_benefit_amount"
+					)
 					flexi_amount += max_of_component
 
 			if have_a_flexi and flt(self.max_benefits) == 0:
 				frappe.throw(_("Max benefits should be greater than zero to dispense benefits"))
 			if have_a_flexi and flexi_amount and flt(self.max_benefits) > flexi_amount:
-				frappe.throw(_("Total flexible benefit component amount {0} should not be less than max benefits {1}")
-					.format(flexi_amount, self.max_benefits))
+				frappe.throw(
+					_(
+						"Total flexible benefit component amount {0} should not be less than max benefits {1}"
+					).format(flexi_amount, self.max_benefits)
+				)
 		if not have_a_flexi and flt(self.max_benefits) > 0:
-			frappe.throw(_("Salary Structure should have flexible benefit component(s) to dispense benefit amount"))
+			frappe.throw(
+				_("Salary Structure should have flexible benefit component(s) to dispense benefit amount")
+			)
 
 	def get_employees(self, **kwargs):
 		conditions, values = [], []
@@ -83,58 +102,117 @@
 
 		condition_str = " and " + " and ".join(conditions) if conditions else ""
 
-		employees = frappe.db.sql_list("select name from tabEmployee where status='Active' {condition}"
-			.format(condition=condition_str), tuple(values))
+		employees = frappe.db.sql_list(
+			"select name from tabEmployee where status='Active' {condition}".format(
+				condition=condition_str
+			),
+			tuple(values),
+		)
 
 		return employees
 
 	@frappe.whitelist()
-	def assign_salary_structure(self, grade=None, department=None, designation=None, employee=None,
-			payroll_payable_account=None, from_date=None, base=None, variable=None, income_tax_slab=None):
-		employees = self.get_employees(company= self.company, grade= grade,department= department,designation= designation,name=employee)
+	def assign_salary_structure(
+		self,
+		grade=None,
+		department=None,
+		designation=None,
+		employee=None,
+		payroll_payable_account=None,
+		from_date=None,
+		base=None,
+		variable=None,
+		income_tax_slab=None,
+	):
+		employees = self.get_employees(
+			company=self.company, grade=grade, department=department, designation=designation, name=employee
+		)
 
 		if employees:
 			if len(employees) > 20:
-				frappe.enqueue(assign_salary_structure_for_employees, timeout=600,
-					employees=employees, salary_structure=self,
+				frappe.enqueue(
+					assign_salary_structure_for_employees,
+					timeout=600,
+					employees=employees,
+					salary_structure=self,
 					payroll_payable_account=payroll_payable_account,
-					from_date=from_date, base=base, variable=variable, income_tax_slab=income_tax_slab)
+					from_date=from_date,
+					base=base,
+					variable=variable,
+					income_tax_slab=income_tax_slab,
+				)
 			else:
-				assign_salary_structure_for_employees(employees, self,
+				assign_salary_structure_for_employees(
+					employees,
+					self,
 					payroll_payable_account=payroll_payable_account,
-					from_date=from_date, base=base, variable=variable, income_tax_slab=income_tax_slab)
+					from_date=from_date,
+					base=base,
+					variable=variable,
+					income_tax_slab=income_tax_slab,
+				)
 		else:
 			frappe.msgprint(_("No Employee Found"))
 
 
-
-def assign_salary_structure_for_employees(employees, salary_structure, payroll_payable_account=None, from_date=None, base=None, variable=None, income_tax_slab=None):
+def assign_salary_structure_for_employees(
+	employees,
+	salary_structure,
+	payroll_payable_account=None,
+	from_date=None,
+	base=None,
+	variable=None,
+	income_tax_slab=None,
+):
 	salary_structures_assignments = []
 	existing_assignments_for = get_existing_assignments(employees, salary_structure, from_date)
-	count=0
+	count = 0
 	for employee in employees:
 		if employee in existing_assignments_for:
 			continue
-		count +=1
+		count += 1
 
-		salary_structures_assignment = create_salary_structures_assignment(employee,
-			salary_structure, payroll_payable_account, from_date, base, variable, income_tax_slab)
+		salary_structures_assignment = create_salary_structures_assignment(
+			employee, salary_structure, payroll_payable_account, from_date, base, variable, income_tax_slab
+		)
 		salary_structures_assignments.append(salary_structures_assignment)
-		frappe.publish_progress(count*100/len(set(employees) - set(existing_assignments_for)), title = _("Assigning Structures..."))
+		frappe.publish_progress(
+			count * 100 / len(set(employees) - set(existing_assignments_for)),
+			title=_("Assigning Structures..."),
+		)
 
 	if salary_structures_assignments:
 		frappe.msgprint(_("Structures have been assigned successfully"))
 
 
-def create_salary_structures_assignment(employee, salary_structure, payroll_payable_account, from_date, base, variable, income_tax_slab=None):
+def create_salary_structures_assignment(
+	employee,
+	salary_structure,
+	payroll_payable_account,
+	from_date,
+	base,
+	variable,
+	income_tax_slab=None,
+):
 	if not payroll_payable_account:
-		payroll_payable_account = frappe.db.get_value('Company', salary_structure.company, 'default_payroll_payable_account')
+		payroll_payable_account = frappe.db.get_value(
+			"Company", salary_structure.company, "default_payroll_payable_account"
+		)
 		if not payroll_payable_account:
 			frappe.throw(_('Please set "Default Payroll Payable Account" in Company Defaults'))
-	payroll_payable_account_currency = frappe.db.get_value('Account',  payroll_payable_account, 'account_currency')
+	payroll_payable_account_currency = frappe.db.get_value(
+		"Account", payroll_payable_account, "account_currency"
+	)
 	company_curency = erpnext.get_company_currency(salary_structure.company)
-	if payroll_payable_account_currency != salary_structure.currency and payroll_payable_account_currency != company_curency:
-		frappe.throw(_("Invalid Payroll Payable Account. The account currency must be {0} or {1}").format(salary_structure.currency, company_curency))
+	if (
+		payroll_payable_account_currency != salary_structure.currency
+		and payroll_payable_account_currency != company_curency
+	):
+		frappe.throw(
+			_("Invalid Payroll Payable Account. The account currency must be {0} or {1}").format(
+				salary_structure.currency, company_curency
+			)
+		)
 
 	assignment = frappe.new_doc("Salary Structure Assignment")
 	assignment.employee = employee
@@ -146,61 +224,92 @@
 	assignment.base = base
 	assignment.variable = variable
 	assignment.income_tax_slab = income_tax_slab
-	assignment.save(ignore_permissions = True)
+	assignment.save(ignore_permissions=True)
 	assignment.submit()
 	return assignment.name
 
 
 def get_existing_assignments(employees, salary_structure, from_date):
-	salary_structures_assignments = frappe.db.sql_list("""
+	salary_structures_assignments = frappe.db.sql_list(
+		"""
 		select distinct employee from `tabSalary Structure Assignment`
 		where salary_structure=%s and employee in (%s)
 		and from_date=%s  and company= %s and docstatus=1
-	""" % ('%s', ', '.join(['%s']*len(employees)),'%s', '%s'), [salary_structure.name] + employees+[from_date]+[salary_structure.company])
+	"""
+		% ("%s", ", ".join(["%s"] * len(employees)), "%s", "%s"),
+		[salary_structure.name] + employees + [from_date] + [salary_structure.company],
+	)
 	if salary_structures_assignments:
-		frappe.msgprint(_("Skipping Salary Structure Assignment for the following employees, as Salary Structure Assignment records already exists against them. {0}")
-			.format("\n".join(salary_structures_assignments)))
+		frappe.msgprint(
+			_(
+				"Skipping Salary Structure Assignment for the following employees, as Salary Structure Assignment records already exists against them. {0}"
+			).format("\n".join(salary_structures_assignments))
+		)
 	return salary_structures_assignments
 
+
 @frappe.whitelist()
-def make_salary_slip(source_name, target_doc = None, employee = None, as_print = False, print_format = None, for_preview=0, ignore_permissions=False):
+def make_salary_slip(
+	source_name,
+	target_doc=None,
+	employee=None,
+	as_print=False,
+	print_format=None,
+	for_preview=0,
+	ignore_permissions=False,
+):
 	def postprocess(source, target):
 		if employee:
-			employee_details = frappe.db.get_value("Employee", employee,
-				["employee_name", "branch", "designation", "department"], as_dict=1)
+			employee_details = frappe.db.get_value(
+				"Employee", employee, ["employee_name", "branch", "designation", "department"], as_dict=1
+			)
 			target.employee = employee
 			target.employee_name = employee_details.employee_name
 			target.branch = employee_details.branch
 			target.designation = employee_details.designation
 			target.department = employee_details.department
 
-		target.run_method('process_salary_structure', for_preview=for_preview)
+		target.run_method("process_salary_structure", for_preview=for_preview)
 
-	doc = get_mapped_doc("Salary Structure", source_name, {
-		"Salary Structure": {
-			"doctype": "Salary Slip",
-			"field_map": {
-				"total_earning": "gross_pay",
-				"name": "salary_structure",
-				"currency": "currency"
+	doc = get_mapped_doc(
+		"Salary Structure",
+		source_name,
+		{
+			"Salary Structure": {
+				"doctype": "Salary Slip",
+				"field_map": {
+					"total_earning": "gross_pay",
+					"name": "salary_structure",
+					"currency": "currency",
+				},
 			}
-		}
-	}, target_doc, postprocess, ignore_child_tables=True, ignore_permissions=ignore_permissions)
+		},
+		target_doc,
+		postprocess,
+		ignore_child_tables=True,
+		ignore_permissions=ignore_permissions,
+	)
 
 	if cint(as_print):
-		doc.name = 'Preview for {0}'.format(employee)
-		return frappe.get_print(doc.doctype, doc.name, doc = doc, print_format = print_format)
+		doc.name = "Preview for {0}".format(employee)
+		return frappe.get_print(doc.doctype, doc.name, doc=doc, print_format=print_format)
 	else:
 		return doc
 
 
 @frappe.whitelist()
 def get_employees(salary_structure):
-	employees = frappe.get_list('Salary Structure Assignment',
-		filters={'salary_structure': salary_structure, 'docstatus': 1}, fields=['employee'])
+	employees = frappe.get_list(
+		"Salary Structure Assignment",
+		filters={"salary_structure": salary_structure, "docstatus": 1},
+		fields=["employee"],
+	)
 
 	if not employees:
-		frappe.throw(_("There's no Employee with Salary Structure: {0}. Assign {1} to an Employee to preview Salary Slip").format(
-			salary_structure, salary_structure))
+		frappe.throw(
+			_(
+				"There's no Employee with Salary Structure: {0}. Assign {1} to an Employee to preview Salary Slip"
+			).format(salary_structure, salary_structure)
+		)
 
 	return list(set([d.employee for d in employees]))
diff --git a/erpnext/payroll/doctype/salary_structure/salary_structure_dashboard.py b/erpnext/payroll/doctype/salary_structure/salary_structure_dashboard.py
index 014d0ba..cf363b4 100644
--- a/erpnext/payroll/doctype/salary_structure/salary_structure_dashboard.py
+++ b/erpnext/payroll/doctype/salary_structure/salary_structure_dashboard.py
@@ -1,15 +1,9 @@
 def get_data():
 	return {
-		'fieldname': 'salary_structure',
-		'non_standard_fieldnames': {
-			'Employee Grade': 'default_salary_structure'
-		},
-		'transactions': [
-			{
-				'items': ['Salary Structure Assignment', 'Salary Slip']
-			},
-			{
-				'items': ['Employee Grade']
-			},
-		]
+		"fieldname": "salary_structure",
+		"non_standard_fieldnames": {"Employee Grade": "default_salary_structure"},
+		"transactions": [
+			{"items": ["Salary Structure Assignment", "Salary Slip"]},
+			{"items": ["Employee Grade"]},
+		],
 	}
diff --git a/erpnext/payroll/doctype/salary_structure/test_salary_structure.py b/erpnext/payroll/doctype/salary_structure/test_salary_structure.py
index e2d0d1c..def622b 100644
--- a/erpnext/payroll/doctype/salary_structure/test_salary_structure.py
+++ b/erpnext/payroll/doctype/salary_structure/test_salary_structure.py
@@ -22,25 +22,33 @@
 
 test_dependencies = ["Fiscal Year"]
 
+
 class TestSalaryStructure(unittest.TestCase):
 	def setUp(self):
 		for dt in ["Salary Slip", "Salary Structure", "Salary Structure Assignment"]:
 			frappe.db.sql("delete from `tab%s`" % dt)
 
 		self.make_holiday_list()
-		frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", "Salary Structure Test Holiday List")
+		frappe.db.set_value(
+			"Company",
+			erpnext.get_default_company(),
+			"default_holiday_list",
+			"Salary Structure Test Holiday List",
+		)
 		make_employee("test_employee@salary.com")
 		make_employee("test_employee_2@salary.com")
 
 	def make_holiday_list(self):
 		if not frappe.db.get_value("Holiday List", "Salary Structure Test Holiday List"):
-			holiday_list = frappe.get_doc({
-				"doctype": "Holiday List",
-				"holiday_list_name": "Salary Structure Test Holiday List",
-				"from_date": nowdate(),
-				"to_date": add_years(nowdate(), 1),
-				"weekly_off": "Sunday"
-			}).insert()
+			holiday_list = frappe.get_doc(
+				{
+					"doctype": "Holiday List",
+					"holiday_list_name": "Salary Structure Test Holiday List",
+					"from_date": nowdate(),
+					"to_date": add_years(nowdate(), 1),
+					"weekly_off": "Sunday",
+				}
+			).insert()
 			holiday_list.get_weekly_off_dates()
 			holiday_list.save()
 
@@ -48,31 +56,33 @@
 
 		emp = make_employee("test_employee_3@salary.com")
 
-		sal_struct = make_salary_structure("Salary Structure 2", "Monthly", dont_submit = True)
+		sal_struct = make_salary_structure("Salary Structure 2", "Monthly", dont_submit=True)
 
 		sal_struct.earnings = [sal_struct.earnings[0]]
 		sal_struct.earnings[0].amount_based_on_formula = 1
-		sal_struct.earnings[0].formula =  "base"
+		sal_struct.earnings[0].formula = "base"
 
 		sal_struct.deductions = [sal_struct.deductions[0]]
 
 		sal_struct.deductions[0].amount_based_on_formula = 1
 		sal_struct.deductions[0].condition = "gross_pay > 100"
-		sal_struct.deductions[0].formula =  "gross_pay * 0.2"
+		sal_struct.deductions[0].formula = "gross_pay * 0.2"
 
 		sal_struct.submit()
 
 		assignment = create_salary_structure_assignment(emp, "Salary Structure 2")
-		ss = make_salary_slip(sal_struct.name, employee = emp)
+		ss = make_salary_slip(sal_struct.name, employee=emp)
 
 		self.assertEqual(assignment.base * 0.2, ss.deductions[0].amount)
 
 	def test_amount_totals(self):
 		frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0)
-		sal_slip = frappe.get_value("Salary Slip", {"employee_name":"test_employee_2@salary.com"})
+		sal_slip = frappe.get_value("Salary Slip", {"employee_name": "test_employee_2@salary.com"})
 		if not sal_slip:
-			sal_slip = make_employee_salary_slip("test_employee_2@salary.com", "Monthly", "Salary Structure Sample")
-			self.assertEqual(sal_slip.get("salary_structure"), 'Salary Structure Sample')
+			sal_slip = make_employee_salary_slip(
+				"test_employee_2@salary.com", "Monthly", "Salary Structure Sample"
+			)
+			self.assertEqual(sal_slip.get("salary_structure"), "Salary Structure Sample")
 			self.assertEqual(sal_slip.get("earnings")[0].amount, 50000)
 			self.assertEqual(sal_slip.get("earnings")[1].amount, 3000)
 			self.assertEqual(sal_slip.get("earnings")[2].amount, 25000)
@@ -84,12 +94,12 @@
 		salary_structure = make_salary_structure("Salary Structure Sample", "Monthly", dont_submit=True)
 
 		for row in salary_structure.earnings:
-			row.formula = "\n%s\n\n"%row.formula
-			row.condition = "\n%s\n\n"%row.condition
+			row.formula = "\n%s\n\n" % row.formula
+			row.condition = "\n%s\n\n" % row.condition
 
 		for row in salary_structure.deductions:
-			row.formula = "\n%s\n\n"%row.formula
-			row.condition = "\n%s\n\n"%row.condition
+			row.formula = "\n%s\n\n" % row.formula
+			row.condition = "\n%s\n\n" % row.condition
 
 		salary_structure.save()
 
@@ -101,29 +111,47 @@
 
 	def test_salary_structures_assignment(self):
 		company_currency = erpnext.get_default_currency()
-		salary_structure = make_salary_structure("Salary Structure Sample", "Monthly", currency=company_currency)
+		salary_structure = make_salary_structure(
+			"Salary Structure Sample", "Monthly", currency=company_currency
+		)
 		employee = "test_assign_stucture@salary.com"
 		employee_doc_name = make_employee(employee)
 		# clear the already assigned stuctures
-		frappe.db.sql('''delete from `tabSalary Structure Assignment` where employee=%s and salary_structure=%s ''',
-					  ("test_assign_stucture@salary.com",salary_structure.name))
-		#test structure_assignment
-		salary_structure.assign_salary_structure(employee=employee_doc_name,from_date='2013-01-01',base=5000,variable=200)
-		salary_structure_assignment = frappe.get_doc("Salary Structure Assignment",{'employee':employee_doc_name, 'from_date':'2013-01-01'})
+		frappe.db.sql(
+			"""delete from `tabSalary Structure Assignment` where employee=%s and salary_structure=%s """,
+			("test_assign_stucture@salary.com", salary_structure.name),
+		)
+		# test structure_assignment
+		salary_structure.assign_salary_structure(
+			employee=employee_doc_name, from_date="2013-01-01", base=5000, variable=200
+		)
+		salary_structure_assignment = frappe.get_doc(
+			"Salary Structure Assignment", {"employee": employee_doc_name, "from_date": "2013-01-01"}
+		)
 		self.assertEqual(salary_structure_assignment.docstatus, 1)
 		self.assertEqual(salary_structure_assignment.base, 5000)
 		self.assertEqual(salary_structure_assignment.variable, 200)
 
 	def test_multi_currency_salary_structure(self):
 		make_employee("test_muti_currency_employee@salary.com")
-		sal_struct = make_salary_structure("Salary Structure Multi Currency", "Monthly", currency='USD')
-		self.assertEqual(sal_struct.currency, 'USD')
+		sal_struct = make_salary_structure("Salary Structure Multi Currency", "Monthly", currency="USD")
+		self.assertEqual(sal_struct.currency, "USD")
 
-def make_salary_structure(salary_structure, payroll_frequency, employee=None,
-	from_date=None, dont_submit=False, other_details=None,test_tax=False,
-	company=None, currency=erpnext.get_default_currency(), payroll_period=None):
+
+def make_salary_structure(
+	salary_structure,
+	payroll_frequency,
+	employee=None,
+	from_date=None,
+	dont_submit=False,
+	other_details=None,
+	test_tax=False,
+	company=None,
+	currency=erpnext.get_default_currency(),
+	payroll_period=None,
+):
 	if test_tax:
-		frappe.db.sql("""delete from `tabSalary Structure` where name=%s""",(salary_structure))
+		frappe.db.sql("""delete from `tabSalary Structure` where name=%s""", (salary_structure))
 
 	if frappe.db.exists("Salary Structure", salary_structure):
 		frappe.db.delete("Salary Structure", salary_structure)
@@ -132,11 +160,15 @@
 		"doctype": "Salary Structure",
 		"name": salary_structure,
 		"company": company or erpnext.get_default_company(),
-		"earnings": make_earning_salary_component(setup=True,  test_tax=test_tax, company_list=["_Test Company"]),
-		"deductions": make_deduction_salary_component(setup=True, test_tax=test_tax, company_list=["_Test Company"]),
+		"earnings": make_earning_salary_component(
+			setup=True, test_tax=test_tax, company_list=["_Test Company"]
+		),
+		"deductions": make_deduction_salary_component(
+			setup=True, test_tax=test_tax, company_list=["_Test Company"]
+		),
 		"payroll_frequency": payroll_frequency,
-		"payment_account": get_random("Account", filters={'account_currency': currency}),
-		"currency": currency
+		"payment_account": get_random("Account", filters={"account_currency": currency}),
+		"currency": currency,
 	}
 	if other_details and isinstance(other_details, dict):
 		details.update(other_details)
@@ -145,31 +177,41 @@
 	if not dont_submit:
 		salary_structure_doc.submit()
 
-	filters = {'employee':employee, 'docstatus': 1}
+	filters = {"employee": employee, "docstatus": 1}
 	if not from_date and payroll_period:
 		from_date = payroll_period.start_date
 
 	if from_date:
-		filters['from_date'] = from_date
+		filters["from_date"] = from_date
 
-	if employee and not frappe.db.get_value("Salary Structure Assignment",
-		filters) and salary_structure_doc.docstatus==1:
+	if (
+		employee
+		and not frappe.db.get_value("Salary Structure Assignment", filters)
+		and salary_structure_doc.docstatus == 1
+	):
 		create_salary_structure_assignment(
 			employee,
 			salary_structure,
 			from_date=from_date,
 			company=company,
 			currency=currency,
-			payroll_period=payroll_period
+			payroll_period=payroll_period,
 		)
 
 	return salary_structure_doc
 
-def create_salary_structure_assignment(employee, salary_structure, from_date=None, company=None, currency=erpnext.get_default_currency(),
-	payroll_period=None):
+
+def create_salary_structure_assignment(
+	employee,
+	salary_structure,
+	from_date=None,
+	company=None,
+	currency=erpnext.get_default_currency(),
+	payroll_period=None,
+):
 
 	if frappe.db.exists("Salary Structure Assignment", {"employee": employee}):
-		frappe.db.sql("""delete from `tabSalary Structure Assignment` where employee=%s""",(employee))
+		frappe.db.sql("""delete from `tabSalary Structure Assignment` where employee=%s""", (employee))
 
 	if not payroll_period:
 		payroll_period = create_payroll_period()
@@ -200,6 +242,7 @@
 	salary_structure_assignment.submit()
 	return salary_structure_assignment
 
+
 def get_payable_account(company=None):
 	if not company:
 		company = erpnext.get_default_company()
diff --git a/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.py
index 8359478..28b5eb1 100644
--- a/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.py
+++ b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.py
@@ -8,7 +8,9 @@
 from frappe.utils import flt, getdate
 
 
-class DuplicateAssignment(frappe.ValidationError): pass
+class DuplicateAssignment(frappe.ValidationError):
+	pass
+
 
 class SalaryStructureAssignment(Document):
 	def validate(self):
@@ -21,38 +23,61 @@
 		self.validate_cost_center_distribution()
 
 	def validate_dates(self):
-		joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
-			["date_of_joining", "relieving_date"])
+		joining_date, relieving_date = frappe.db.get_value(
+			"Employee", self.employee, ["date_of_joining", "relieving_date"]
+		)
 
 		if self.from_date:
-			if frappe.db.exists("Salary Structure Assignment", {"employee": self.employee, "from_date": self.from_date, "docstatus": 1}):
+			if frappe.db.exists(
+				"Salary Structure Assignment",
+				{"employee": self.employee, "from_date": self.from_date, "docstatus": 1},
+			):
 				frappe.throw(_("Salary Structure Assignment for Employee already exists"), DuplicateAssignment)
 
 			if joining_date and getdate(self.from_date) < joining_date:
-				frappe.throw(_("From Date {0} cannot be before employee's joining Date {1}")
-					.format(self.from_date, joining_date))
+				frappe.throw(
+					_("From Date {0} cannot be before employee's joining Date {1}").format(
+						self.from_date, joining_date
+					)
+				)
 
 			# flag - old_employee is for migrating the old employees data via patch
 			if relieving_date and getdate(self.from_date) > relieving_date and not self.flags.old_employee:
-				frappe.throw(_("From Date {0} cannot be after employee's relieving Date {1}")
-					.format(self.from_date, relieving_date))
+				frappe.throw(
+					_("From Date {0} cannot be after employee's relieving Date {1}").format(
+						self.from_date, relieving_date
+					)
+				)
 
 	def validate_income_tax_slab(self):
 		if not self.income_tax_slab:
 			return
 
-		income_tax_slab_currency = frappe.db.get_value('Income Tax Slab', self.income_tax_slab, 'currency')
+		income_tax_slab_currency = frappe.db.get_value(
+			"Income Tax Slab", self.income_tax_slab, "currency"
+		)
 		if self.currency != income_tax_slab_currency:
-			frappe.throw(_("Currency of selected Income Tax Slab should be {0} instead of {1}").format(self.currency, income_tax_slab_currency))
+			frappe.throw(
+				_("Currency of selected Income Tax Slab should be {0} instead of {1}").format(
+					self.currency, income_tax_slab_currency
+				)
+			)
 
 	def set_payroll_payable_account(self):
 		if not self.payroll_payable_account:
-			payroll_payable_account = frappe.db.get_value('Company', self.company, 'default_payroll_payable_account')
+			payroll_payable_account = frappe.db.get_value(
+				"Company", self.company, "default_payroll_payable_account"
+			)
 			if not payroll_payable_account:
 				payroll_payable_account = frappe.db.get_value(
-					"Account", {
-						"account_name": _("Payroll Payable"), "company": self.company, "account_currency": frappe.db.get_value(
-							"Company", self.company, "default_currency"), "is_group": 0})
+					"Account",
+					{
+						"account_name": _("Payroll Payable"),
+						"company": self.company,
+						"account_currency": frappe.db.get_value("Company", self.company, "default_currency"),
+						"is_group": 0,
+					},
+				)
 			self.payroll_payable_account = payroll_payable_account
 
 	@frappe.whitelist()
@@ -60,10 +85,9 @@
 		self.payroll_cost_centers = []
 		default_payroll_cost_center = self.get_payroll_cost_center()
 		if default_payroll_cost_center:
-			self.append("payroll_cost_centers", {
-				"cost_center": default_payroll_cost_center,
-				"percentage": 100
-			})
+			self.append(
+				"payroll_cost_centers", {"cost_center": default_payroll_cost_center, "percentage": 100}
+			)
 
 	def get_payroll_cost_center(self):
 		payroll_cost_center = frappe.db.get_value("Employee", self.employee, "payroll_cost_center")
@@ -82,20 +106,29 @@
 def get_assigned_salary_structure(employee, on_date):
 	if not employee or not on_date:
 		return None
-	salary_structure = frappe.db.sql("""
+	salary_structure = frappe.db.sql(
+		"""
 		select salary_structure from `tabSalary Structure Assignment`
 		where employee=%(employee)s
 		and docstatus = 1
-		and %(on_date)s >= from_date order by from_date desc limit 1""", {
-			'employee': employee,
-			'on_date': on_date,
-		})
+		and %(on_date)s >= from_date order by from_date desc limit 1""",
+		{
+			"employee": employee,
+			"on_date": on_date,
+		},
+	)
 	return salary_structure[0][0] if salary_structure else None
 
 
 @frappe.whitelist()
 def get_employee_currency(employee):
-	employee_currency = frappe.db.get_value('Salary Structure Assignment', {'employee': employee}, 'currency')
+	employee_currency = frappe.db.get_value(
+		"Salary Structure Assignment", {"employee": employee}, "currency"
+	)
 	if not employee_currency:
-		frappe.throw(_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(employee))
+		frappe.throw(
+			_("There is no Salary Structure assigned to {0}. First assign a Salary Stucture.").format(
+				employee
+			)
+		)
 	return employee_currency
diff --git a/erpnext/payroll/report/bank_remittance/bank_remittance.py b/erpnext/payroll/report/bank_remittance/bank_remittance.py
index 6c3bd37..9d8efff 100644
--- a/erpnext/payroll/report/bank_remittance/bank_remittance.py
+++ b/erpnext/payroll/report/bank_remittance/bank_remittance.py
@@ -13,63 +13,47 @@
 			"fieldtype": "Link",
 			"fieldname": "payroll_no",
 			"options": "Payroll Entry",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Debit A/C Number"),
 			"fieldtype": "Int",
 			"fieldname": "debit_account",
 			"hidden": 1,
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Payment Date"),
-			"fieldtype": "Data",
-			"fieldname": "payment_date",
-			"width": 100
-		},
+		{"label": _("Payment Date"), "fieldtype": "Data", "fieldname": "payment_date", "width": 100},
 		{
 			"label": _("Employee Name"),
 			"fieldtype": "Link",
 			"fieldname": "employee_name",
 			"options": "Employee",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Bank Name"),
-			"fieldtype": "Data",
-			"fieldname": "bank_name",
-			"width": 50
-		},
+		{"label": _("Bank Name"), "fieldtype": "Data", "fieldname": "bank_name", "width": 50},
 		{
 			"label": _("Employee A/C Number"),
 			"fieldtype": "Int",
 			"fieldname": "employee_account_no",
-			"width": 50
-		}
+			"width": 50,
+		},
 	]
 
-	if frappe.db.has_column('Employee', 'ifsc_code'):
-		columns.append({
-			"label": _("IFSC Code"),
-			"fieldtype": "Data",
-			"fieldname": "bank_code",
-			"width": 100
-		})
+	if frappe.db.has_column("Employee", "ifsc_code"):
+		columns.append(
+			{"label": _("IFSC Code"), "fieldtype": "Data", "fieldname": "bank_code", "width": 100}
+		)
 
-	columns += [{
-		"label": _("Currency"),
-		"fieldtype": "Data",
-		"fieldname": "currency",
-		"width": 50
-	},
-	{
-		"label": _("Net Salary Amount"),
-		"fieldtype": "Currency",
-		"options": "currency",
-		"fieldname": "amount",
-		"width": 100
-	}]
+	columns += [
+		{"label": _("Currency"), "fieldtype": "Data", "fieldname": "currency", "width": 50},
+		{
+			"label": _("Net Salary Amount"),
+			"fieldtype": "Currency",
+			"options": "currency",
+			"fieldname": "amount",
+			"width": 100,
+		},
+	]
 
 	data = []
 
@@ -77,41 +61,48 @@
 	payroll_entries = get_payroll_entries(accounts, filters)
 	salary_slips = get_salary_slips(payroll_entries)
 
-	if frappe.db.has_column('Employee', 'ifsc_code'):
+	if frappe.db.has_column("Employee", "ifsc_code"):
 		get_emp_bank_ifsc_code(salary_slips)
 
 	for salary in salary_slips:
-		if salary.bank_name and salary.bank_account_no and salary.debit_acc_no and salary.status in ["Submitted", "Paid"]:
+		if (
+			salary.bank_name
+			and salary.bank_account_no
+			and salary.debit_acc_no
+			and salary.status in ["Submitted", "Paid"]
+		):
 			row = {
 				"payroll_no": salary.payroll_entry,
 				"debit_account": salary.debit_acc_no,
-				"payment_date": frappe.utils.formatdate(salary.modified.strftime('%Y-%m-%d')),
+				"payment_date": frappe.utils.formatdate(salary.modified.strftime("%Y-%m-%d")),
 				"bank_name": salary.bank_name,
 				"employee_account_no": salary.bank_account_no,
 				"bank_code": salary.ifsc_code,
-				"employee_name": salary.employee+": " + salary.employee_name,
-				"currency": frappe.get_cached_value('Company', filters.company, 'default_currency'),
+				"employee_name": salary.employee + ": " + salary.employee_name,
+				"currency": frappe.get_cached_value("Company", filters.company, "default_currency"),
 				"amount": salary.net_pay,
 			}
 			data.append(row)
 
 	return columns, data
 
+
 def get_bank_accounts():
 	accounts = [d.name for d in get_all("Account", filters={"account_type": "Bank"})]
 	return accounts
 
+
 def get_payroll_entries(accounts, filters):
 	payroll_filter = [
-		('payment_account', 'IN', accounts),
-		('number_of_employees', '>', 0),
-		('Company', '=', filters.company)
+		("payment_account", "IN", accounts),
+		("number_of_employees", ">", 0),
+		("Company", "=", filters.company),
 	]
 	if filters.to_date:
-		payroll_filter.append(('posting_date', '<', filters.to_date))
+		payroll_filter.append(("posting_date", "<", filters.to_date))
 
 	if filters.from_date:
-		payroll_filter.append(('posting_date', '>', filters.from_date))
+		payroll_filter.append(("posting_date", ">", filters.from_date))
 
 	entries = get_all("Payroll Entry", payroll_filter, ["name", "payment_account"])
 
@@ -119,10 +110,22 @@
 	entries = set_company_account(payment_accounts, entries)
 	return entries
 
+
 def get_salary_slips(payroll_entries):
-	payroll  = [d.name for d in payroll_entries]
-	salary_slips = get_all("Salary Slip", filters = [("payroll_entry", "IN", payroll)],
-		fields = ["modified", "net_pay", "bank_name", "bank_account_no", "payroll_entry", "employee", "employee_name", "status"]
+	payroll = [d.name for d in payroll_entries]
+	salary_slips = get_all(
+		"Salary Slip",
+		filters=[("payroll_entry", "IN", payroll)],
+		fields=[
+			"modified",
+			"net_pay",
+			"bank_name",
+			"bank_account_no",
+			"payroll_entry",
+			"employee",
+			"employee_name",
+			"status",
+		],
 	)
 
 	payroll_entry_map = {}
@@ -132,12 +135,13 @@
 	# appending company debit accounts
 	for slip in salary_slips:
 		if slip.payroll_entry:
-			slip["debit_acc_no"] = payroll_entry_map[slip.payroll_entry]['company_account']
+			slip["debit_acc_no"] = payroll_entry_map[slip.payroll_entry]["company_account"]
 		else:
 			slip["debit_acc_no"] = None
 
 	return salary_slips
 
+
 def get_emp_bank_ifsc_code(salary_slips):
 	emp_names = [d.employee for d in salary_slips]
 	ifsc_codes = get_all("Employee", [("name", "IN", emp_names)], ["ifsc_code", "name"])
@@ -147,20 +151,23 @@
 		ifsc_codes_map[code.name] = code
 
 	for slip in salary_slips:
-		slip["ifsc_code"] = ifsc_codes_map[code.name]['ifsc_code']
+		slip["ifsc_code"] = ifsc_codes_map[code.name]["ifsc_code"]
 
 	return salary_slips
 
+
 def set_company_account(payment_accounts, payroll_entries):
-	company_accounts = get_all("Bank Account", [("account", "in", payment_accounts)], ["account", "bank_account_no"])
+	company_accounts = get_all(
+		"Bank Account", [("account", "in", payment_accounts)], ["account", "bank_account_no"]
+	)
 	company_accounts_map = {}
 	for acc in company_accounts:
 		company_accounts_map[acc.account] = acc
 
 	for entry in payroll_entries:
-		company_account = ''
+		company_account = ""
 		if entry.payment_account in company_accounts_map:
-			company_account = company_accounts_map[entry.payment_account]['bank_account_no']
+			company_account = company_accounts_map[entry.payment_account]["bank_account_no"]
 		entry["company_account"] = company_account
 
 	return payroll_entries
diff --git a/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py
index 75a9f97..ccf1656 100644
--- a/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py
+++ b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py
@@ -14,6 +14,7 @@
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -21,65 +22,55 @@
 			"options": "Employee",
 			"fieldname": "employee",
 			"fieldtype": "Link",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Employee Name"),
 			"options": "Employee",
 			"fieldname": "employee_name",
 			"fieldtype": "Link",
-			"width": 160
-		}]
+			"width": 160,
+		},
+	]
 
 	if erpnext.get_region() == "India":
-		columns.append({
-			"label": _("PAN Number"),
-			"fieldname": "pan_number",
-			"fieldtype": "Data",
-			"width": 140
-		})
+		columns.append(
+			{"label": _("PAN Number"), "fieldname": "pan_number", "fieldtype": "Data", "width": 140}
+		)
 
-	columns += [{
-			"label": _("Income Tax Component"),
-			"fieldname": "it_comp",
-			"fieldtype": "Data",
-			"width": 170
-		},
+	columns += [
+		{"label": _("Income Tax Component"), "fieldname": "it_comp", "fieldtype": "Data", "width": 170},
 		{
 			"label": _("Income Tax Amount"),
 			"fieldname": "it_amount",
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Gross Pay"),
 			"fieldname": "gross_pay",
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 140
-		}
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 140},
 	]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = [""]
 
 	if filters.get("department"):
-		conditions.append("sal.department = '%s' " % (filters["department"]) )
+		conditions.append("sal.department = '%s' " % (filters["department"]))
 
 	if filters.get("branch"):
-		conditions.append("sal.branch = '%s' " % (filters["branch"]) )
+		conditions.append("sal.branch = '%s' " % (filters["branch"]))
 
 	if filters.get("company"):
-		conditions.append("sal.company = '%s' " % (filters["company"]) )
+		conditions.append("sal.company = '%s' " % (filters["company"]))
 
 	if filters.get("month"):
 		conditions.append("month(sal.start_date) = '%s' " % (filters["month"]))
@@ -95,10 +86,14 @@
 	data = []
 
 	if erpnext.get_region() == "India":
-		employee_pan_dict = frappe._dict(frappe.db.sql(""" select employee, pan_number from `tabEmployee`"""))
+		employee_pan_dict = frappe._dict(
+			frappe.db.sql(""" select employee, pan_number from `tabEmployee`""")
+		)
 
-	component_types = frappe.db.sql(""" select name from `tabSalary Component`
-		where is_income_tax_component = 1 """)
+	component_types = frappe.db.sql(
+		""" select name from `tabSalary Component`
+		where is_income_tax_component = 1 """
+	)
 
 	component_types = [comp_type[0] for comp_type in component_types]
 
@@ -107,14 +102,19 @@
 
 	conditions = get_conditions(filters)
 
-	entry = frappe.db.sql(""" select sal.employee, sal.employee_name, sal.posting_date, ded.salary_component, ded.amount,sal.gross_pay
+	entry = frappe.db.sql(
+		""" select sal.employee, sal.employee_name, sal.posting_date, ded.salary_component, ded.amount,sal.gross_pay
 		from `tabSalary Slip` sal, `tabSalary Detail` ded
 		where sal.name = ded.parent
 		and ded.parentfield = 'deductions'
 		and ded.parenttype = 'Salary Slip'
 		and sal.docstatus = 1 %s
 		and ded.salary_component in (%s)
-	""" % (conditions , ", ".join(['%s']*len(component_types))), tuple(component_types), as_dict=1)
+	"""
+		% (conditions, ", ".join(["%s"] * len(component_types))),
+		tuple(component_types),
+		as_dict=1,
+	)
 
 	for d in entry:
 
@@ -125,7 +125,7 @@
 			"posting_date": d.posting_date,
 			# "pan_number": employee_pan_dict.get(d.employee),
 			"it_amount": d.amount,
-			"gross_pay": d.gross_pay
+			"gross_pay": d.gross_pay,
 		}
 
 		if erpnext.get_region() == "India":
diff --git a/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py
index fa68575..e5348df 100644
--- a/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py
+++ b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py
@@ -19,42 +19,39 @@
 
 	columns = get_columns(filters, mode_of_payments)
 	data, total_rows, report_summary = get_data(filters, mode_of_payments)
-	chart =  get_chart(mode_of_payments, total_rows)
+	chart = get_chart(mode_of_payments, total_rows)
 
 	return columns, data, None, chart, report_summary
 
+
 def get_columns(filters, mode_of_payments):
-	columns = [{
-		"label": _("Branch"),
-		"options": "Branch",
-		"fieldname": "branch",
-		"fieldtype": "Link",
-		"width": 200
-	}]
+	columns = [
+		{
+			"label": _("Branch"),
+			"options": "Branch",
+			"fieldname": "branch",
+			"fieldtype": "Link",
+			"width": 200,
+		}
+	]
 
 	for mode in mode_of_payments:
-		columns.append({
-			"label": _(mode),
-			"fieldname": mode,
-			"fieldtype": "Currency",
-			"width": 160
-		})
+		columns.append({"label": _(mode), "fieldname": mode, "fieldtype": "Currency", "width": 160})
 
-	columns.append({
-		"label": _("Total"),
-		"fieldname": "total",
-		"fieldtype": "Currency",
-		"width": 140
-	})
+	columns.append({"label": _("Total"), "fieldname": "total", "fieldtype": "Currency", "width": 140})
 
 	return columns
 
+
 def get_payment_modes():
-	mode_of_payments = frappe.db.sql_list("""
+	mode_of_payments = frappe.db.sql_list(
+		"""
 		select distinct mode_of_payment from `tabSalary Slip` where docstatus = 1
-	""")
+	"""
+	)
 	return mode_of_payments
 
+
 def prepare_data(entry):
 	branch_wise_entries = {}
 	gross_pay = 0
@@ -68,36 +65,42 @@
 
 	return branch_wise_entries, gross_pay
 
+
 def get_data(filters, mode_of_payments):
 	data = []
 
 	conditions = get_conditions(filters)
 
-	entry = frappe.db.sql("""
+	entry = frappe.db.sql(
+		"""
 		select branch, mode_of_payment, sum(net_pay) as net_pay, sum(gross_pay) as gross_pay
 		from `tabSalary Slip` sal
 		where docstatus = 1 %s
 		group by branch, mode_of_payment
-		""" % (conditions), as_dict=1)
+		"""
+		% (conditions),
+		as_dict=1,
+	)
 
 	branch_wise_entries, gross_pay = prepare_data(entry)
 
-	branches = frappe.db.sql_list("""
+	branches = frappe.db.sql_list(
+		"""
 		select distinct branch from `tabSalary Slip` sal
 		where docstatus = 1 %s
-	""" % (conditions))
+	"""
+		% (conditions)
+	)
 
 	total_row = {"total": 0, "branch": "Total"}
 
 	for branch in branches:
 		total = 0
-		row = {
-			"branch": branch
-		}
+		row = {"branch": branch}
 		for mode in mode_of_payments:
 			if branch_wise_entries.get(branch).get(mode):
 				row[mode] = branch_wise_entries.get(branch).get(mode)
-				total +=  branch_wise_entries.get(branch).get(mode)
+				total += branch_wise_entries.get(branch).get(mode)
 
 		row["total"] = total
 		data.append(row)
@@ -110,24 +113,18 @@
 	if data:
 		data.append(total_row)
 		data.append({})
-		data.append({
-			"branch": "<b>Total Gross Pay</b>",
-			mode_of_payments[0]:gross_pay
-		})
-		data.append({
-			"branch": "<b>Total Deductions</b>",
-			mode_of_payments[0]:total_deductions
-		})
-		data.append({
-			"branch": "<b>Total Net Pay</b>",
-			mode_of_payments[0]:total_row.get("total")
-		})
+		data.append({"branch": "<b>Total Gross Pay</b>", mode_of_payments[0]: gross_pay})
+		data.append({"branch": "<b>Total Deductions</b>", mode_of_payments[0]: total_deductions})
+		data.append({"branch": "<b>Total Net Pay</b>", mode_of_payments[0]: total_row.get("total")})
 
 		currency = erpnext.get_company_currency(filters.company)
-		report_summary = get_report_summary(gross_pay, total_deductions, total_row.get("total"), currency)
+		report_summary = get_report_summary(
+			gross_pay, total_deductions, total_row.get("total"), currency
+		)
 
 	return data, total_row, report_summary
 
+
 def get_total_based_on_mode_of_payment(data, mode_of_payments):
 
 	total = 0
@@ -140,6 +137,7 @@
 	total_row["total"] = total
 	return total_row
 
+
 def get_report_summary(gross_pay, total_deductions, net_pay, currency):
 	return [
 		{
@@ -147,24 +145,25 @@
 			"label": "Total Gross Pay",
 			"indicator": "Green",
 			"datatype": "Currency",
-			"currency": currency
+			"currency": currency,
 		},
 		{
 			"value": total_deductions,
 			"label": "Total Deduction",
 			"datatype": "Currency",
 			"indicator": "Red",
-			"currency": currency
+			"currency": currency,
 		},
 		{
 			"value": net_pay,
 			"label": "Total Net Pay",
 			"datatype": "Currency",
 			"indicator": "Blue",
-			"currency": currency
-		}
+			"currency": currency,
+		},
 	]
 
+
 def get_chart(mode_of_payments, data):
 	if data:
 		values = []
@@ -175,10 +174,7 @@
 			labels.append([mode])
 
 		chart = {
-			"data": {
-				"labels": labels,
-				"datasets": [{'name': 'Mode Of Payments', "values": values}]
-			}
+			"data": {"labels": labels, "datasets": [{"name": "Mode Of Payments", "values": values}]}
 		}
-		chart['type'] = "bar"
+		chart["type"] = "bar"
 		return chart
diff --git a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py
index 578c816..4f9370b 100644
--- a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py
+++ b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py
@@ -14,6 +14,7 @@
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -21,71 +22,52 @@
 			"options": "Branch",
 			"fieldname": "branch",
 			"fieldtype": "Link",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Employee Name"),
 			"options": "Employee",
 			"fieldname": "employee_name",
 			"fieldtype": "Link",
-			"width": 160
+			"width": 160,
 		},
 		{
 			"label": _("Employee"),
-			"options":"Employee",
+			"options": "Employee",
 			"fieldname": "employee",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Gross Pay"),
 			"fieldname": "gross_pay",
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Bank"),
-			"fieldname": "bank",
-			"fieldtype": "Data",
-			"width": 140
-		},
-		{
-			"label": _("Account No"),
-			"fieldname": "account_no",
-			"fieldtype": "Data",
-			"width": 140
-		},
+		{"label": _("Bank"), "fieldname": "bank", "fieldtype": "Data", "width": 140},
+		{"label": _("Account No"), "fieldname": "account_no", "fieldtype": "Data", "width": 140},
 	]
 	if erpnext.get_region() == "India":
 		columns += [
-			{
-				"label": _("IFSC"),
-				"fieldname": "ifsc",
-				"fieldtype": "Data",
-				"width": 140
-			},
-			{
-				"label": _("MICR"),
-				"fieldname": "micr",
-				"fieldtype": "Data",
-				"width": 140
-			}
+			{"label": _("IFSC"), "fieldname": "ifsc", "fieldtype": "Data", "width": 140},
+			{"label": _("MICR"), "fieldname": "micr", "fieldtype": "Data", "width": 140},
 		]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = [""]
 
 	if filters.get("department"):
-		conditions.append("department = '%s' " % (filters["department"]) )
+		conditions.append("department = '%s' " % (filters["department"]))
 
 	if filters.get("branch"):
-		conditions.append("branch = '%s' " % (filters["branch"]) )
+		conditions.append("branch = '%s' " % (filters["branch"]))
 
 	if filters.get("company"):
-		conditions.append("company = '%s' " % (filters["company"]) )
+		conditions.append("company = '%s' " % (filters["company"]))
 
 	if filters.get("month"):
 		conditions.append("month(start_date) = '%s' " % (filters["month"]))
@@ -95,6 +77,7 @@
 
 	return " and ".join(conditions)
 
+
 def get_data(filters):
 
 	data = []
@@ -103,36 +86,39 @@
 	if erpnext.get_region() == "India":
 		fields += ["ifsc_code", "micr_code"]
 
-
-	employee_details = frappe.get_list("Employee", fields = fields)
+	employee_details = frappe.get_list("Employee", fields=fields)
 	employee_data_dict = {}
 
 	for d in employee_details:
 		employee_data_dict.setdefault(
-			d.employee,{
-				"bank_ac_no" : d.bank_ac_no,
-				"ifsc_code" : d.ifsc_code or None,
-				"micr_code" : d.micr_code or  None,
-				"branch" : d.branch,
-				"salary_mode" : d.salary_mode,
-				"bank_name": d.bank_name
-			}
+			d.employee,
+			{
+				"bank_ac_no": d.bank_ac_no,
+				"ifsc_code": d.ifsc_code or None,
+				"micr_code": d.micr_code or None,
+				"branch": d.branch,
+				"salary_mode": d.salary_mode,
+				"bank_name": d.bank_name,
+			},
 		)
 
 	conditions = get_conditions(filters)
 
-	entry = frappe.db.sql(""" select employee, employee_name, gross_pay
+	entry = frappe.db.sql(
+		""" select employee, employee_name, gross_pay
 		from `tabSalary Slip`
 		where docstatus = 1 %s """
-		%(conditions), as_dict =1)
+		% (conditions),
+		as_dict=1,
+	)
 
 	for d in entry:
 
 		employee = {
-			"branch" : employee_data_dict.get(d.employee).get("branch"),
-			"employee_name" : d.employee_name,
-			"employee" : d.employee,
-			"gross_pay" : d.gross_pay,
+			"branch": employee_data_dict.get(d.employee).get("branch"),
+			"employee_name": d.employee_name,
+			"employee": d.employee,
+			"gross_pay": d.gross_pay,
 		}
 
 		if employee_data_dict.get(d.employee).get("salary_mode") == "Bank":
@@ -144,7 +130,9 @@
 		else:
 			employee["account_no"] = employee_data_dict.get(d.employee).get("salary_mode")
 
-		if filters.get("type") and employee_data_dict.get(d.employee).get("salary_mode") == filters.get("type"):
+		if filters.get("type") and employee_data_dict.get(d.employee).get("salary_mode") == filters.get(
+			"type"
+		):
 			data.append(employee)
 		elif not filters.get("type"):
 			data.append(employee)
diff --git a/erpnext/payroll/report/salary_register/salary_register.py b/erpnext/payroll/report/salary_register/salary_register.py
index 78deb22..0a62b43 100644
--- a/erpnext/payroll/report/salary_register/salary_register.py
+++ b/erpnext/payroll/report/salary_register/salary_register.py
@@ -10,29 +10,46 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 	currency = None
-	if filters.get('currency'):
-		currency = filters.get('currency')
+	if filters.get("currency"):
+		currency = filters.get("currency")
 	company_currency = erpnext.get_company_currency(filters.get("company"))
 	salary_slips = get_salary_slips(filters, company_currency)
-	if not salary_slips: return [], []
+	if not salary_slips:
+		return [], []
 
 	columns, earning_types, ded_types = get_columns(salary_slips)
 	ss_earning_map = get_ss_earning_map(salary_slips, currency, company_currency)
-	ss_ded_map = get_ss_ded_map(salary_slips,currency, company_currency)
+	ss_ded_map = get_ss_ded_map(salary_slips, currency, company_currency)
 	doj_map = get_employee_doj_map()
 
 	data = []
 	for ss in salary_slips:
-		row = [ss.name, ss.employee, ss.employee_name, doj_map.get(ss.employee), ss.branch, ss.department, ss.designation,
-			ss.company, ss.start_date, ss.end_date, ss.leave_without_pay, ss.payment_days]
+		row = [
+			ss.name,
+			ss.employee,
+			ss.employee_name,
+			doj_map.get(ss.employee),
+			ss.branch,
+			ss.department,
+			ss.designation,
+			ss.company,
+			ss.start_date,
+			ss.end_date,
+			ss.leave_without_pay,
+			ss.payment_days,
+		]
 
-		if ss.branch is not None: columns[3] = columns[3].replace('-1','120')
-		if ss.department is not None: columns[4] = columns[4].replace('-1','120')
-		if ss.designation is not None: columns[5] = columns[5].replace('-1','120')
-		if ss.leave_without_pay is not None: columns[9] = columns[9].replace('-1','130')
-
+		if ss.branch is not None:
+			columns[3] = columns[3].replace("-1", "120")
+		if ss.department is not None:
+			columns[4] = columns[4].replace("-1", "120")
+		if ss.designation is not None:
+			columns[5] = columns[5].replace("-1", "120")
+		if ss.leave_without_pay is not None:
+			columns[9] = columns[9].replace("-1", "130")
 
 		for e in earning_types:
 			row.append(ss_earning_map.get(ss.name, {}).get(e))
@@ -48,7 +65,10 @@
 		row.append(ss.total_loan_repayment)
 
 		if currency == company_currency:
-			row += [flt(ss.total_deduction) * flt(ss.exchange_rate), flt(ss.net_pay) * flt(ss.exchange_rate)]
+			row += [
+				flt(ss.total_deduction) * flt(ss.exchange_rate),
+				flt(ss.net_pay) * flt(ss.exchange_rate),
+			]
 		else:
 			row += [ss.total_deduction, ss.net_pay]
 		row.append(currency or company_currency)
@@ -56,53 +76,81 @@
 
 	return columns, data
 
+
 def get_columns(salary_slips):
 	"""
 	columns = [
+	        _("Salary Slip ID") + ":Link/Salary Slip:150",
+	        _("Employee") + ":Link/Employee:120",
+	        _("Employee Name") + "::140",
+	        _("Date of Joining") + "::80",
+	        _("Branch") + ":Link/Branch:120",
+	        _("Department") + ":Link/Department:120",
+	        _("Designation") + ":Link/Designation:120",
+	        _("Company") + ":Link/Company:120",
+	        _("Start Date") + "::80",
+	        _("End Date") + "::80",
+	        _("Leave Without Pay") + ":Float:130",
+	        _("Payment Days") + ":Float:120",
+	        _("Currency") + ":Link/Currency:80"
+	]
+	"""
+	columns = [
 		_("Salary Slip ID") + ":Link/Salary Slip:150",
 		_("Employee") + ":Link/Employee:120",
 		_("Employee Name") + "::140",
 		_("Date of Joining") + "::80",
-		_("Branch") + ":Link/Branch:120",
-		_("Department") + ":Link/Department:120",
+		_("Branch") + ":Link/Branch:-1",
+		_("Department") + ":Link/Department:-1",
 		_("Designation") + ":Link/Designation:120",
 		_("Company") + ":Link/Company:120",
 		_("Start Date") + "::80",
 		_("End Date") + "::80",
-		_("Leave Without Pay") + ":Float:130",
+		_("Leave Without Pay") + ":Float:50",
 		_("Payment Days") + ":Float:120",
-		_("Currency") + ":Link/Currency:80"
-	]
-	"""
-	columns = [
-		_("Salary Slip ID") + ":Link/Salary Slip:150",_("Employee") + ":Link/Employee:120", _("Employee Name") + "::140",
-		_("Date of Joining") + "::80", _("Branch") + ":Link/Branch:-1", _("Department") + ":Link/Department:-1",
-		_("Designation") + ":Link/Designation:120", _("Company") + ":Link/Company:120", _("Start Date") + "::80",
-		_("End Date") + "::80", _("Leave Without Pay") + ":Float:50", _("Payment Days") + ":Float:120"
 	]
 
 	salary_components = {_("Earning"): [], _("Deduction"): []}
 
-	for component in frappe.db.sql("""select distinct sd.salary_component, sc.type
+	for component in frappe.db.sql(
+		"""select distinct sd.salary_component, sc.type
 		from `tabSalary Detail` sd, `tabSalary Component` sc
-		where sc.name=sd.salary_component and sd.amount != 0 and sd.parent in (%s)""" %
-		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1):
+		where sc.name=sd.salary_component and sd.amount != 0 and sd.parent in (%s)"""
+		% (", ".join(["%s"] * len(salary_slips))),
+		tuple([d.name for d in salary_slips]),
+		as_dict=1,
+	):
 		salary_components[_(component.type)].append(component.salary_component)
 
-	columns = columns + [(e + ":Currency:120") for e in salary_components[_("Earning")]] + \
-		[_("Gross Pay") + ":Currency:120"] + [(d + ":Currency:120") for d in salary_components[_("Deduction")]] + \
-		[_("Loan Repayment") + ":Currency:120", _("Total Deduction") + ":Currency:120", _("Net Pay") + ":Currency:120"]
+	columns = (
+		columns
+		+ [(e + ":Currency:120") for e in salary_components[_("Earning")]]
+		+ [_("Gross Pay") + ":Currency:120"]
+		+ [(d + ":Currency:120") for d in salary_components[_("Deduction")]]
+		+ [
+			_("Loan Repayment") + ":Currency:120",
+			_("Total Deduction") + ":Currency:120",
+			_("Net Pay") + ":Currency:120",
+		]
+	)
 
 	return columns, salary_components[_("Earning")], salary_components[_("Deduction")]
 
+
 def get_salary_slips(filters, company_currency):
-	filters.update({"from_date": filters.get("from_date"), "to_date":filters.get("to_date")})
+	filters.update({"from_date": filters.get("from_date"), "to_date": filters.get("to_date")})
 	conditions, filters = get_conditions(filters, company_currency)
-	salary_slips = frappe.db.sql("""select * from `tabSalary Slip` where %s
-		order by employee""" % conditions, filters, as_dict=1)
+	salary_slips = frappe.db.sql(
+		"""select * from `tabSalary Slip` where %s
+		order by employee"""
+		% conditions,
+		filters,
+		as_dict=1,
+	)
 
 	return salary_slips or []
 
+
 def get_conditions(filters, company_currency):
 	conditions = ""
 	doc_status = {"Draft": 0, "Submitted": 1, "Cancelled": 2}
@@ -110,48 +158,71 @@
 	if filters.get("docstatus"):
 		conditions += "docstatus = {0}".format(doc_status[filters.get("docstatus")])
 
-	if filters.get("from_date"): conditions += " and start_date >= %(from_date)s"
-	if filters.get("to_date"): conditions += " and end_date <= %(to_date)s"
-	if filters.get("company"): conditions += " and company = %(company)s"
-	if filters.get("employee"): conditions += " and employee = %(employee)s"
+	if filters.get("from_date"):
+		conditions += " and start_date >= %(from_date)s"
+	if filters.get("to_date"):
+		conditions += " and end_date <= %(to_date)s"
+	if filters.get("company"):
+		conditions += " and company = %(company)s"
+	if filters.get("employee"):
+		conditions += " and employee = %(employee)s"
 	if filters.get("currency") and filters.get("currency") != company_currency:
 		conditions += " and currency = %(currency)s"
 
 	return conditions, filters
 
+
 def get_employee_doj_map():
-	return	frappe._dict(frappe.db.sql("""
+	return frappe._dict(
+		frappe.db.sql(
+			"""
 				SELECT
 					employee,
 					date_of_joining
 				FROM `tabEmployee`
-				"""))
+				"""
+		)
+	)
+
 
 def get_ss_earning_map(salary_slips, currency, company_currency):
-	ss_earnings = frappe.db.sql("""select sd.parent, sd.salary_component, sd.amount, ss.exchange_rate, ss.name
-		from `tabSalary Detail` sd, `tabSalary Slip` ss where sd.parent=ss.name and sd.parent in (%s)""" %
-		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1)
+	ss_earnings = frappe.db.sql(
+		"""select sd.parent, sd.salary_component, sd.amount, ss.exchange_rate, ss.name
+		from `tabSalary Detail` sd, `tabSalary Slip` ss where sd.parent=ss.name and sd.parent in (%s)"""
+		% (", ".join(["%s"] * len(salary_slips))),
+		tuple([d.name for d in salary_slips]),
+		as_dict=1,
+	)
 
 	ss_earning_map = {}
 	for d in ss_earnings:
 		ss_earning_map.setdefault(d.parent, frappe._dict()).setdefault(d.salary_component, 0.0)
 		if currency == company_currency:
-			ss_earning_map[d.parent][d.salary_component] += flt(d.amount) * flt(d.exchange_rate if d.exchange_rate else 1)
+			ss_earning_map[d.parent][d.salary_component] += flt(d.amount) * flt(
+				d.exchange_rate if d.exchange_rate else 1
+			)
 		else:
 			ss_earning_map[d.parent][d.salary_component] += flt(d.amount)
 
 	return ss_earning_map
 
+
 def get_ss_ded_map(salary_slips, currency, company_currency):
-	ss_deductions = frappe.db.sql("""select sd.parent, sd.salary_component, sd.amount, ss.exchange_rate, ss.name
-		from `tabSalary Detail` sd, `tabSalary Slip` ss where sd.parent=ss.name and sd.parent in (%s)""" %
-		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1)
+	ss_deductions = frappe.db.sql(
+		"""select sd.parent, sd.salary_component, sd.amount, ss.exchange_rate, ss.name
+		from `tabSalary Detail` sd, `tabSalary Slip` ss where sd.parent=ss.name and sd.parent in (%s)"""
+		% (", ".join(["%s"] * len(salary_slips))),
+		tuple([d.name for d in salary_slips]),
+		as_dict=1,
+	)
 
 	ss_ded_map = {}
 	for d in ss_deductions:
 		ss_ded_map.setdefault(d.parent, frappe._dict()).setdefault(d.salary_component, 0.0)
 		if currency == company_currency:
-			ss_ded_map[d.parent][d.salary_component] += flt(d.amount) * flt(d.exchange_rate if d.exchange_rate else 1)
+			ss_ded_map[d.parent][d.salary_component] += flt(d.amount) * flt(
+				d.exchange_rate if d.exchange_rate else 1
+			)
 		else:
 			ss_ded_map[d.parent][d.salary_component] += flt(d.amount)
 
diff --git a/erpnext/portal/doctype/homepage/homepage.py b/erpnext/portal/doctype/homepage/homepage.py
index 8092ba2..5bb05f0 100644
--- a/erpnext/portal/doctype/homepage/homepage.py
+++ b/erpnext/portal/doctype/homepage/homepage.py
@@ -11,17 +11,27 @@
 	def validate(self):
 		if not self.description:
 			self.description = frappe._("This is an example website auto-generated from ERPNext")
-		delete_page_cache('home')
+		delete_page_cache("home")
 
 	def setup_items(self):
-		for d in frappe.get_all('Website Item', fields=['name', 'item_name', 'description', 'image', 'route'],
-			filters={'published': 1}, limit=3):
+		for d in frappe.get_all(
+			"Website Item",
+			fields=["name", "item_name", "description", "image", "route"],
+			filters={"published": 1},
+			limit=3,
+		):
 
-			doc = frappe.get_doc('Website Item', d.name)
+			doc = frappe.get_doc("Website Item", d.name)
 			if not doc.route:
 				# set missing route
 				doc.save()
-			self.append('products', dict(item_code=d.name,
-				item_name=d.item_name, description=d.description,
-				image=d.image, route=d.route))
-
+			self.append(
+				"products",
+				dict(
+					item_code=d.name,
+					item_name=d.item_name,
+					description=d.description,
+					image=d.image,
+					route=d.route,
+				),
+			)
diff --git a/erpnext/portal/doctype/homepage/test_homepage.py b/erpnext/portal/doctype/homepage/test_homepage.py
index fb0367f..e153223 100644
--- a/erpnext/portal/doctype/homepage/test_homepage.py
+++ b/erpnext/portal/doctype/homepage/test_homepage.py
@@ -10,7 +10,7 @@
 
 class TestHomepage(unittest.TestCase):
 	def test_homepage_load(self):
-		set_request(method='GET', path='home')
+		set_request(method="GET", path="home")
 		response = get_response()
 
 		self.assertEqual(response.status_code, 200)
diff --git a/erpnext/portal/doctype/homepage_section/test_homepage_section.py b/erpnext/portal/doctype/homepage_section/test_homepage_section.py
index c3be146..27b0169 100644
--- a/erpnext/portal/doctype/homepage_section/test_homepage_section.py
+++ b/erpnext/portal/doctype/homepage_section/test_homepage_section.py
@@ -12,65 +12,79 @@
 class TestHomepageSection(unittest.TestCase):
 	def test_homepage_section_card(self):
 		try:
-			frappe.get_doc({
-				'doctype': 'Homepage Section',
-				'name': 'Card Section',
-				'section_based_on': 'Cards',
-				'section_cards': [
-					{'title': 'Card 1', 'subtitle': 'Subtitle 1', 'content': 'This is test card 1', 'route': '/card-1'},
-					{'title': 'Card 2', 'subtitle': 'Subtitle 2', 'content': 'This is test card 2', 'image': 'test.jpg'},
-				],
-				'no_of_columns': 3
-			}).insert(ignore_if_duplicate=True)
+			frappe.get_doc(
+				{
+					"doctype": "Homepage Section",
+					"name": "Card Section",
+					"section_based_on": "Cards",
+					"section_cards": [
+						{
+							"title": "Card 1",
+							"subtitle": "Subtitle 1",
+							"content": "This is test card 1",
+							"route": "/card-1",
+						},
+						{
+							"title": "Card 2",
+							"subtitle": "Subtitle 2",
+							"content": "This is test card 2",
+							"image": "test.jpg",
+						},
+					],
+					"no_of_columns": 3,
+				}
+			).insert(ignore_if_duplicate=True)
 		except frappe.DuplicateEntryError:
 			pass
 
-		set_request(method='GET', path='home')
+		set_request(method="GET", path="home")
 		response = get_response()
 
 		self.assertEqual(response.status_code, 200)
 
 		html = frappe.safe_decode(response.get_data())
 
-		soup = BeautifulSoup(html, 'html.parser')
-		sections = soup.find('main').find_all('section')
+		soup = BeautifulSoup(html, "html.parser")
+		sections = soup.find("main").find_all("section")
 		self.assertEqual(len(sections), 3)
 
 		homepage_section = sections[2]
-		self.assertEqual(homepage_section.h3.text, 'Card Section')
+		self.assertEqual(homepage_section.h3.text, "Card Section")
 
 		cards = homepage_section.find_all(class_="card")
 
 		self.assertEqual(len(cards), 2)
-		self.assertEqual(cards[0].h5.text, 'Card 1')
-		self.assertEqual(cards[0].a['href'], '/card-1')
-		self.assertEqual(cards[1].p.text, 'Subtitle 2')
-		self.assertEqual(cards[1].find(class_='website-image-lazy')['data-src'], 'test.jpg')
+		self.assertEqual(cards[0].h5.text, "Card 1")
+		self.assertEqual(cards[0].a["href"], "/card-1")
+		self.assertEqual(cards[1].p.text, "Subtitle 2")
+		self.assertEqual(cards[1].find(class_="website-image-lazy")["data-src"], "test.jpg")
 
 		# cleanup
 		frappe.db.rollback()
 
 	def test_homepage_section_custom_html(self):
-		frappe.get_doc({
-			'doctype': 'Homepage Section',
-			'name': 'Custom HTML Section',
-			'section_based_on': 'Custom HTML',
-			'section_html': '<div class="custom-section">My custom html</div>',
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Homepage Section",
+				"name": "Custom HTML Section",
+				"section_based_on": "Custom HTML",
+				"section_html": '<div class="custom-section">My custom html</div>',
+			}
+		).insert()
 
-		set_request(method='GET', path='home')
+		set_request(method="GET", path="home")
 		response = get_response()
 
 		self.assertEqual(response.status_code, 200)
 
 		html = frappe.safe_decode(response.get_data())
 
-		soup = BeautifulSoup(html, 'html.parser')
-		sections = soup.find('main').find_all(class_='custom-section')
+		soup = BeautifulSoup(html, "html.parser")
+		sections = soup.find("main").find_all(class_="custom-section")
 		self.assertEqual(len(sections), 1)
 
 		homepage_section = sections[0]
-		self.assertEqual(homepage_section.text, 'My custom html')
+		self.assertEqual(homepage_section.text, "My custom html")
 
 		# cleanup
 		frappe.db.rollback()
diff --git a/erpnext/portal/utils.py b/erpnext/portal/utils.py
index 24bcab4..09d1007 100644
--- a/erpnext/portal/utils.py
+++ b/erpnext/portal/utils.py
@@ -8,40 +8,41 @@
 
 
 def set_default_role(doc, method):
-	'''Set customer, supplier, student, guardian based on email'''
+	"""Set customer, supplier, student, guardian based on email"""
 	if frappe.flags.setting_role or frappe.flags.in_migrate:
 		return
 
 	roles = frappe.get_roles(doc.name)
 
-	contact_name = frappe.get_value('Contact', dict(email_id=doc.email))
+	contact_name = frappe.get_value("Contact", dict(email_id=doc.email))
 	if contact_name:
-		contact = frappe.get_doc('Contact', contact_name)
+		contact = frappe.get_doc("Contact", contact_name)
 		for link in contact.links:
 			frappe.flags.setting_role = True
-			if link.link_doctype=='Customer' and 'Customer' not in roles:
-				doc.add_roles('Customer')
-			elif link.link_doctype=='Supplier' and 'Supplier' not in roles:
-				doc.add_roles('Supplier')
-	elif frappe.get_value('Student', dict(student_email_id=doc.email)) and 'Student' not in roles:
-		doc.add_roles('Student')
-	elif frappe.get_value('Guardian', dict(email_address=doc.email)) and 'Guardian' not in roles:
-		doc.add_roles('Guardian')
+			if link.link_doctype == "Customer" and "Customer" not in roles:
+				doc.add_roles("Customer")
+			elif link.link_doctype == "Supplier" and "Supplier" not in roles:
+				doc.add_roles("Supplier")
+	elif frappe.get_value("Student", dict(student_email_id=doc.email)) and "Student" not in roles:
+		doc.add_roles("Student")
+	elif frappe.get_value("Guardian", dict(email_address=doc.email)) and "Guardian" not in roles:
+		doc.add_roles("Guardian")
+
 
 def create_customer_or_supplier():
-	'''Based on the default Role (Customer, Supplier), create a Customer / Supplier.
+	"""Based on the default Role (Customer, Supplier), create a Customer / Supplier.
 	Called on_session_creation hook.
-	'''
+	"""
 	user = frappe.session.user
 
-	if frappe.db.get_value('User', user, 'user_type') != 'Website User':
+	if frappe.db.get_value("User", user, "user_type") != "Website User":
 		return
 
 	user_roles = frappe.get_roles()
-	portal_settings = frappe.get_single('Portal Settings')
+	portal_settings = frappe.get_single("Portal Settings")
 	default_role = portal_settings.default_role
 
-	if default_role not in ['Customer', 'Supplier']:
+	if default_role not in ["Customer", "Supplier"]:
 		return
 
 	# create customer / supplier if the user has that role
@@ -59,34 +60,33 @@
 	party = frappe.new_doc(doctype)
 	fullname = frappe.utils.get_fullname(user)
 
-	if doctype == 'Customer':
+	if doctype == "Customer":
 		cart_settings = get_shopping_cart_settings()
 
 		if cart_settings.enable_checkout:
 			debtors_account = get_debtors_account(cart_settings)
 		else:
-			debtors_account = ''
+			debtors_account = ""
 
-		party.update({
-			"customer_name": fullname,
-			"customer_type": "Individual",
-			"customer_group": cart_settings.default_customer_group,
-			"territory": get_root_of("Territory")
-		})
+		party.update(
+			{
+				"customer_name": fullname,
+				"customer_type": "Individual",
+				"customer_group": cart_settings.default_customer_group,
+				"territory": get_root_of("Territory"),
+			}
+		)
 
 		if debtors_account:
-			party.update({
-				"accounts": [{
-					"company": cart_settings.company,
-					"account": debtors_account
-				}]
-			})
+			party.update({"accounts": [{"company": cart_settings.company, "account": debtors_account}]})
 	else:
-		party.update({
-			"supplier_name": fullname,
-			"supplier_group": "All Supplier Groups",
-			"supplier_type": "Individual"
-		})
+		party.update(
+			{
+				"supplier_name": fullname,
+				"supplier_group": "All Supplier Groups",
+				"supplier_type": "Individual",
+			}
+		)
 
 	party.flags.ignore_mandatory = True
 	party.insert(ignore_permissions=True)
@@ -95,28 +95,27 @@
 
 	if party_exists(alternate_doctype, user):
 		# if user is both customer and supplier, alter fullname to avoid contact name duplication
-		fullname +=  "-" + doctype
+		fullname += "-" + doctype
 
 	create_party_contact(doctype, fullname, user, party.name)
 
 	return party
 
+
 def create_party_contact(doctype, fullname, user, party_name):
 	contact = frappe.new_doc("Contact")
-	contact.update({
-		"first_name": fullname,
-		"email_id": user
-	})
-	contact.append('links', dict(link_doctype=doctype, link_name=party_name))
-	contact.append('email_ids', dict(email_id=user))
+	contact.update({"first_name": fullname, "email_id": user})
+	contact.append("links", dict(link_doctype=doctype, link_name=party_name))
+	contact.append("email_ids", dict(email_id=user))
 	contact.flags.ignore_mandatory = True
 	contact.insert(ignore_permissions=True)
 
+
 def party_exists(doctype, user):
 	# check if contact exists against party and if it is linked to the doctype
 	contact_name = frappe.db.get_value("Contact", {"email_id": user})
 	if contact_name:
-		contact = frappe.get_doc('Contact', contact_name)
+		contact = frappe.get_doc("Contact", contact_name)
 		doctypes = [d.link_doctype for d in contact.links]
 		return doctype in doctypes
 
diff --git a/erpnext/projects/doctype/activity_cost/activity_cost.py b/erpnext/projects/doctype/activity_cost/activity_cost.py
index bc4bb9d..b99aa1e 100644
--- a/erpnext/projects/doctype/activity_cost/activity_cost.py
+++ b/erpnext/projects/doctype/activity_cost/activity_cost.py
@@ -7,7 +7,9 @@
 from frappe.model.document import Document
 
 
-class DuplicationError(frappe.ValidationError): pass
+class DuplicationError(frappe.ValidationError):
+	pass
+
 
 class ActivityCost(Document):
 	def validate(self):
@@ -24,12 +26,22 @@
 
 	def check_unique(self):
 		if self.employee:
-			if frappe.db.sql("""select name from `tabActivity Cost` where employee_name= %s and activity_type= %s and name != %s""",
-				(self.employee_name, self.activity_type, self.name)):
-					frappe.throw(_("Activity Cost exists for Employee {0} against Activity Type - {1}")
-						.format(self.employee, self.activity_type), DuplicationError)
+			if frappe.db.sql(
+				"""select name from `tabActivity Cost` where employee_name= %s and activity_type= %s and name != %s""",
+				(self.employee_name, self.activity_type, self.name),
+			):
+				frappe.throw(
+					_("Activity Cost exists for Employee {0} against Activity Type - {1}").format(
+						self.employee, self.activity_type
+					),
+					DuplicationError,
+				)
 		else:
-			if frappe.db.sql("""select name from `tabActivity Cost` where ifnull(employee, '')='' and activity_type= %s and name != %s""",
-				(self.activity_type, self.name)):
-					frappe.throw(_("Default Activity Cost exists for Activity Type - {0}")
-						.format(self.activity_type), DuplicationError)
+			if frappe.db.sql(
+				"""select name from `tabActivity Cost` where ifnull(employee, '')='' and activity_type= %s and name != %s""",
+				(self.activity_type, self.name),
+			):
+				frappe.throw(
+					_("Default Activity Cost exists for Activity Type - {0}").format(self.activity_type),
+					DuplicationError,
+				)
diff --git a/erpnext/projects/doctype/activity_cost/test_activity_cost.py b/erpnext/projects/doctype/activity_cost/test_activity_cost.py
index d53e582..8da797e 100644
--- a/erpnext/projects/doctype/activity_cost/test_activity_cost.py
+++ b/erpnext/projects/doctype/activity_cost/test_activity_cost.py
@@ -11,15 +11,17 @@
 class TestActivityCost(unittest.TestCase):
 	def test_duplication(self):
 		frappe.db.sql("delete from `tabActivity Cost`")
-		activity_cost1 = frappe.new_doc('Activity Cost')
-		activity_cost1.update({
-			"employee": "_T-Employee-00001",
-			"employee_name": "_Test Employee",
-			"activity_type": "_Test Activity Type 1",
-			"billing_rate": 100,
-			"costing_rate": 50
-		})
+		activity_cost1 = frappe.new_doc("Activity Cost")
+		activity_cost1.update(
+			{
+				"employee": "_T-Employee-00001",
+				"employee_name": "_Test Employee",
+				"activity_type": "_Test Activity Type 1",
+				"billing_rate": 100,
+				"costing_rate": 50,
+			}
+		)
 		activity_cost1.insert()
 		activity_cost2 = frappe.copy_doc(activity_cost1)
-		self.assertRaises(DuplicationError, activity_cost2.insert )
+		self.assertRaises(DuplicationError, activity_cost2.insert)
 		frappe.db.sql("delete from `tabActivity Cost`")
diff --git a/erpnext/projects/doctype/activity_type/test_activity_type.py b/erpnext/projects/doctype/activity_type/test_activity_type.py
index bb74b88..d51439e 100644
--- a/erpnext/projects/doctype/activity_type/test_activity_type.py
+++ b/erpnext/projects/doctype/activity_type/test_activity_type.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Activity Type')
+test_records = frappe.get_test_records("Activity Type")
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 6281c1a..7031fcb 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -18,20 +18,26 @@
 
 class Project(Document):
 	def get_feed(self):
-		return '{0}: {1}'.format(_(self.status), frappe.safe_decode(self.project_name))
+		return "{0}: {1}".format(_(self.status), frappe.safe_decode(self.project_name))
 
 	def onload(self):
-		self.set_onload('activity_summary', frappe.db.sql('''select activity_type,
+		self.set_onload(
+			"activity_summary",
+			frappe.db.sql(
+				"""select activity_type,
 			sum(hours) as total_hours
 			from `tabTimesheet Detail` where project=%s and docstatus < 2 group by activity_type
-			order by total_hours desc''', self.name, as_dict=True))
+			order by total_hours desc""",
+				self.name,
+				as_dict=True,
+			),
+		)
 
 		self.update_costing()
 
 	def before_print(self, settings=None):
 		self.onload()
 
-
 	def validate(self):
 		if not self.is_new():
 			self.copy_from_template()
@@ -41,17 +47,17 @@
 		update_employee_boarding_status(self)
 
 	def copy_from_template(self):
-		'''
+		"""
 		Copy tasks from template
-		'''
-		if self.project_template and not frappe.db.get_all('Task', dict(project = self.name), limit=1):
+		"""
+		if self.project_template and not frappe.db.get_all("Task", dict(project=self.name), limit=1):
 
 			# has a template, and no loaded tasks, so lets create
 			if not self.expected_start_date:
 				# project starts today
 				self.expected_start_date = today()
 
-			template = frappe.get_doc('Project Template', self.project_template)
+			template = frappe.get_doc("Project Template", self.project_template)
 
 			if not self.project_type:
 				self.project_type = template.project_type
@@ -67,19 +73,21 @@
 			self.dependency_mapping(tmp_task_details, project_tasks)
 
 	def create_task_from_template(self, task_details):
-		return frappe.get_doc(dict(
-				doctype = 'Task',
-				subject = task_details.subject,
-				project = self.name,
-				status = 'Open',
-				exp_start_date = self.calculate_start_date(task_details),
-				exp_end_date = self.calculate_end_date(task_details),
-				description = task_details.description,
-				task_weight = task_details.task_weight,
-				type = task_details.type,
-				issue = task_details.issue,
-				is_group = task_details.is_group
-			)).insert()
+		return frappe.get_doc(
+			dict(
+				doctype="Task",
+				subject=task_details.subject,
+				project=self.name,
+				status="Open",
+				exp_start_date=self.calculate_start_date(task_details),
+				exp_end_date=self.calculate_end_date(task_details),
+				description=task_details.description,
+				task_weight=task_details.task_weight,
+				type=task_details.type,
+				issue=task_details.issue,
+				is_group=task_details.is_group,
+			)
+		).insert()
 
 	def calculate_start_date(self, task_details):
 		self.start_date = add_days(self.expected_start_date, task_details.start)
@@ -107,23 +115,26 @@
 		if template_task.get("depends_on") and not project_task.get("depends_on"):
 			for child_task in template_task.get("depends_on"):
 				child_task_subject = frappe.db.get_value("Task", child_task.task, "subject")
-				corresponding_project_task = list(filter(lambda x: x.subject == child_task_subject, project_tasks))
+				corresponding_project_task = list(
+					filter(lambda x: x.subject == child_task_subject, project_tasks)
+				)
 				if len(corresponding_project_task):
-					project_task.append("depends_on",{
-						"task": corresponding_project_task[0].name
-					})
+					project_task.append("depends_on", {"task": corresponding_project_task[0].name})
 					project_task.save()
 
 	def check_for_parent_tasks(self, template_task, project_task, project_tasks):
 		if template_task.get("parent_task") and not project_task.get("parent_task"):
 			parent_task_subject = frappe.db.get_value("Task", template_task.get("parent_task"), "subject")
-			corresponding_project_task = list(filter(lambda x: x.subject == parent_task_subject, project_tasks))
+			corresponding_project_task = list(
+				filter(lambda x: x.subject == parent_task_subject, project_tasks)
+			)
 			if len(corresponding_project_task):
 				project_task.parent_task = corresponding_project_task[0].name
 				project_task.save()
 
 	def is_row_updated(self, row, existing_task_data, fields):
-		if self.get("__islocal") or not existing_task_data: return True
+		if self.get("__islocal") or not existing_task_data:
+			return True
 
 		d = existing_task_data.get(row.task_id, {})
 
@@ -132,7 +143,7 @@
 				return True
 
 	def update_project(self):
-		'''Called externally by Task'''
+		"""Called externally by Task"""
 		self.update_percent_complete()
 		update_employee_boarding_status(self)
 		self.update_costing()
@@ -152,52 +163,74 @@
 				self.percent_complete = 100
 			return
 
-		total = frappe.db.count('Task', dict(project=self.name))
+		total = frappe.db.count("Task", dict(project=self.name))
 
 		if not total:
 			self.percent_complete = 0
 		else:
 			if (self.percent_complete_method == "Task Completion" and total > 0) or (
-				not self.percent_complete_method and total > 0):
-				completed = frappe.db.sql("""select count(name) from tabTask where
-					project=%s and status in ('Cancelled', 'Completed')""", self.name)[0][0]
+				not self.percent_complete_method and total > 0
+			):
+				completed = frappe.db.sql(
+					"""select count(name) from tabTask where
+					project=%s and status in ('Cancelled', 'Completed')""",
+					self.name,
+				)[0][0]
 				self.percent_complete = flt(flt(completed) / total * 100, 2)
 
-			if (self.percent_complete_method == "Task Progress" and total > 0):
-				progress = frappe.db.sql("""select sum(progress) from tabTask where
-					project=%s""", self.name)[0][0]
+			if self.percent_complete_method == "Task Progress" and total > 0:
+				progress = frappe.db.sql(
+					"""select sum(progress) from tabTask where
+					project=%s""",
+					self.name,
+				)[0][0]
 				self.percent_complete = flt(flt(progress) / total, 2)
 
-			if (self.percent_complete_method == "Task Weight" and total > 0):
-				weight_sum = frappe.db.sql("""select sum(task_weight) from tabTask where
-					project=%s""", self.name)[0][0]
-				weighted_progress = frappe.db.sql("""select progress, task_weight from tabTask where
-					project=%s""", self.name, as_dict=1)
+			if self.percent_complete_method == "Task Weight" and total > 0:
+				weight_sum = frappe.db.sql(
+					"""select sum(task_weight) from tabTask where
+					project=%s""",
+					self.name,
+				)[0][0]
+				weighted_progress = frappe.db.sql(
+					"""select progress, task_weight from tabTask where
+					project=%s""",
+					self.name,
+					as_dict=1,
+				)
 				pct_complete = 0
 				for row in weighted_progress:
 					pct_complete += row["progress"] * frappe.utils.safe_div(row["task_weight"], weight_sum)
 				self.percent_complete = flt(flt(pct_complete), 2)
 
 		# don't update status if it is cancelled
-		if self.status == 'Cancelled':
+		if self.status == "Cancelled":
 			return
 
 		if self.percent_complete == 100:
 			self.status = "Completed"
 
 	def update_costing(self):
-		from_time_sheet = frappe.db.sql("""select
+		from_time_sheet = frappe.db.sql(
+			"""select
 			sum(costing_amount) as costing_amount,
 			sum(billing_amount) as billing_amount,
 			min(from_time) as start_date,
 			max(to_time) as end_date,
 			sum(hours) as time
-			from `tabTimesheet Detail` where project = %s and docstatus = 1""", self.name, as_dict=1)[0]
+			from `tabTimesheet Detail` where project = %s and docstatus = 1""",
+			self.name,
+			as_dict=1,
+		)[0]
 
-		from_expense_claim = frappe.db.sql("""select
+		from_expense_claim = frappe.db.sql(
+			"""select
 			sum(total_sanctioned_amount) as total_sanctioned_amount
 			from `tabExpense Claim` where project = %s
-			and docstatus = 1""", self.name, as_dict=1)[0]
+			and docstatus = 1""",
+			self.name,
+			as_dict=1,
+		)[0]
 
 		self.actual_start_date = from_time_sheet.start_date
 		self.actual_end_date = from_time_sheet.end_date
@@ -213,41 +246,54 @@
 		self.calculate_gross_margin()
 
 	def calculate_gross_margin(self):
-		expense_amount = (flt(self.total_costing_amount) + flt(self.total_expense_claim)
-			+ flt(self.total_purchase_cost) + flt(self.get('total_consumed_material_cost', 0)))
+		expense_amount = (
+			flt(self.total_costing_amount)
+			+ flt(self.total_expense_claim)
+			+ flt(self.total_purchase_cost)
+			+ flt(self.get("total_consumed_material_cost", 0))
+		)
 
 		self.gross_margin = flt(self.total_billed_amount) - expense_amount
 		if self.total_billed_amount:
 			self.per_gross_margin = (self.gross_margin / flt(self.total_billed_amount)) * 100
 
 	def update_purchase_costing(self):
-		total_purchase_cost = frappe.db.sql("""select sum(base_net_amount)
-			from `tabPurchase Invoice Item` where project = %s and docstatus=1""", self.name)
+		total_purchase_cost = frappe.db.sql(
+			"""select sum(base_net_amount)
+			from `tabPurchase Invoice Item` where project = %s and docstatus=1""",
+			self.name,
+		)
 
 		self.total_purchase_cost = total_purchase_cost and total_purchase_cost[0][0] or 0
 
 	def update_sales_amount(self):
-		total_sales_amount = frappe.db.sql("""select sum(base_net_total)
-			from `tabSales Order` where project = %s and docstatus=1""", self.name)
+		total_sales_amount = frappe.db.sql(
+			"""select sum(base_net_total)
+			from `tabSales Order` where project = %s and docstatus=1""",
+			self.name,
+		)
 
 		self.total_sales_amount = total_sales_amount and total_sales_amount[0][0] or 0
 
 	def update_billed_amount(self):
-		total_billed_amount = frappe.db.sql("""select sum(base_net_total)
-			from `tabSales Invoice` where project = %s and docstatus=1""", self.name)
+		total_billed_amount = frappe.db.sql(
+			"""select sum(base_net_total)
+			from `tabSales Invoice` where project = %s and docstatus=1""",
+			self.name,
+		)
 
 		self.total_billed_amount = total_billed_amount and total_billed_amount[0][0] or 0
 
 	def after_rename(self, old_name, new_name, merge=False):
 		if old_name == self.copied_from:
-			frappe.db.set_value('Project', new_name, 'copied_from', new_name)
+			frappe.db.set_value("Project", new_name, "copied_from", new_name)
 
 	def send_welcome_email(self):
 		url = get_url("/project/?name={0}".format(self.name))
 		messages = (
 			_("You have been invited to collaborate on the project: {0}").format(self.name),
 			url,
-			_("Join")
+			_("Join"),
 		)
 
 		content = """
@@ -257,21 +303,31 @@
 
 		for user in self.users:
 			if user.welcome_email_sent == 0:
-				frappe.sendmail(user.user, subject=_("Project Collaboration Invitation"),
-								content=content.format(*messages))
+				frappe.sendmail(
+					user.user, subject=_("Project Collaboration Invitation"), content=content.format(*messages)
+				)
 				user.welcome_email_sent = 1
 
+
 def get_timeline_data(doctype, name):
-	'''Return timeline for attendance'''
-	return dict(frappe.db.sql('''select unix_timestamp(from_time), count(*)
+	"""Return timeline for attendance"""
+	return dict(
+		frappe.db.sql(
+			"""select unix_timestamp(from_time), count(*)
 		from `tabTimesheet Detail` where project=%s
 			and from_time > date_sub(curdate(), interval 1 year)
 			and docstatus < 2
-			group by date(from_time)''', name))
+			group by date(from_time)""",
+			name,
+		)
+	)
 
 
-def get_project_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"):
-	return frappe.db.sql('''select distinct project.*
+def get_project_list(
+	doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"
+):
+	return frappe.db.sql(
+		"""select distinct project.*
 		from tabProject project, `tabProject User` project_user
 		where
 			(project_user.user = %(user)s
@@ -279,27 +335,32 @@
 			or project.owner = %(user)s
 			order by project.modified desc
 			limit {0}, {1}
-		'''.format(limit_start, limit_page_length),
-						 {'user': frappe.session.user},
-						 as_dict=True,
-						 update={'doctype': 'Project'})
+		""".format(
+			limit_start, limit_page_length
+		),
+		{"user": frappe.session.user},
+		as_dict=True,
+		update={"doctype": "Project"},
+	)
 
 
 def get_list_context(context=None):
 	return {
 		"show_sidebar": True,
 		"show_search": True,
-		'no_breadcrumbs': True,
+		"no_breadcrumbs": True,
 		"title": _("Projects"),
 		"get_list": get_project_list,
-		"row_template": "templates/includes/projects/project_row.html"
+		"row_template": "templates/includes/projects/project_row.html",
 	}
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_users_for_project(doctype, txt, searchfield, start, page_len, filters):
 	conditions = []
-	return frappe.db.sql("""select name, concat_ws(' ', first_name, middle_name, last_name)
+	return frappe.db.sql(
+		"""select name, concat_ws(' ', first_name, middle_name, last_name)
 		from `tabUser`
 		where enabled=1
 			and name not in ("Guest", "Administrator")
@@ -311,47 +372,51 @@
 			if(locate(%(_txt)s, full_name), locate(%(_txt)s, full_name), 99999),
 			idx desc,
 			name, full_name
-		limit %(start)s, %(page_len)s""".format(**{
-		'key': searchfield,
-		'fcond': get_filters_cond(doctype, filters, conditions),
-		'mcond': get_match_cond(doctype)
-	}), {
-							 'txt': "%%%s%%" % txt,
-							 '_txt': txt.replace("%", ""),
-							 'start': start,
-							 'page_len': page_len
-						 })
+		limit %(start)s, %(page_len)s""".format(
+			**{
+				"key": searchfield,
+				"fcond": get_filters_cond(doctype, filters, conditions),
+				"mcond": get_match_cond(doctype),
+			}
+		),
+		{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
+	)
 
 
 @frappe.whitelist()
 def get_cost_center_name(project):
 	return frappe.db.get_value("Project", project, "cost_center")
 
+
 def hourly_reminder():
 	fields = ["from_time", "to_time"]
 	projects = get_projects_for_collect_progress("Hourly", fields)
 
 	for project in projects:
-		if (get_time(nowtime()) >= get_time(project.from_time) or
-			get_time(nowtime()) <= get_time(project.to_time)):
+		if get_time(nowtime()) >= get_time(project.from_time) or get_time(nowtime()) <= get_time(
+			project.to_time
+		):
 			send_project_update_email_to_users(project.name)
 
+
 def project_status_update_reminder():
 	daily_reminder()
 	twice_daily_reminder()
 	weekly_reminder()
 
+
 def daily_reminder():
 	fields = ["daily_time_to_send"]
-	projects =  get_projects_for_collect_progress("Daily", fields)
+	projects = get_projects_for_collect_progress("Daily", fields)
 
 	for project in projects:
 		if allow_to_make_project_update(project.name, project.get("daily_time_to_send"), "Daily"):
 			send_project_update_email_to_users(project.name)
 
+
 def twice_daily_reminder():
 	fields = ["first_email", "second_email"]
-	projects =  get_projects_for_collect_progress("Twice Daily", fields)
+	projects = get_projects_for_collect_progress("Twice Daily", fields)
 	fields.remove("name")
 
 	for project in projects:
@@ -359,9 +424,10 @@
 			if allow_to_make_project_update(project.name, project.get(d), "Twicely"):
 				send_project_update_email_to_users(project.name)
 
+
 def weekly_reminder():
 	fields = ["day_to_send", "weekly_time_to_send"]
-	projects =  get_projects_for_collect_progress("Weekly", fields)
+	projects = get_projects_for_collect_progress("Weekly", fields)
 
 	current_day = get_datetime().strftime("%A")
 	for project in projects:
@@ -371,12 +437,16 @@
 		if allow_to_make_project_update(project.name, project.get("weekly_time_to_send"), "Weekly"):
 			send_project_update_email_to_users(project.name)
 
+
 def allow_to_make_project_update(project, time, frequency):
-	data = frappe.db.sql(""" SELECT name from `tabProject Update`
-		WHERE project = %s and date = %s """, (project, today()))
+	data = frappe.db.sql(
+		""" SELECT name from `tabProject Update`
+		WHERE project = %s and date = %s """,
+		(project, today()),
+	)
 
 	# len(data) > 1 condition is checked for twicely frequency
-	if data and (frequency in ['Daily', 'Weekly'] or len(data) > 1):
+	if data and (frequency in ["Daily", "Weekly"] or len(data) > 1):
 		return False
 
 	if get_time(nowtime()) >= get_time(time):
@@ -385,138 +455,162 @@
 
 @frappe.whitelist()
 def create_duplicate_project(prev_doc, project_name):
-	''' Create duplicate project based on the old project '''
+	"""Create duplicate project based on the old project"""
 	import json
+
 	prev_doc = json.loads(prev_doc)
 
-	if project_name == prev_doc.get('name'):
+	if project_name == prev_doc.get("name"):
 		frappe.throw(_("Use a name that is different from previous project name"))
 
 	# change the copied doc name to new project name
 	project = frappe.copy_doc(prev_doc)
 	project.name = project_name
-	project.project_template = ''
+	project.project_template = ""
 	project.project_name = project_name
 	project.insert()
 
 	# fetch all the task linked with the old project
-	task_list = frappe.get_all("Task", filters={
-		'project': prev_doc.get('name')
-	}, fields=['name'])
+	task_list = frappe.get_all("Task", filters={"project": prev_doc.get("name")}, fields=["name"])
 
 	# Create duplicate task for all the task
 	for task in task_list:
-		task = frappe.get_doc('Task', task)
+		task = frappe.get_doc("Task", task)
 		new_task = frappe.copy_doc(task)
 		new_task.project = project.name
 		new_task.insert()
 
-	project.db_set('project_template', prev_doc.get('project_template'))
+	project.db_set("project_template", prev_doc.get("project_template"))
+
 
 def get_projects_for_collect_progress(frequency, fields):
 	fields.extend(["name"])
 
-	return frappe.get_all("Project", fields = fields,
-		filters = {'collect_progress': 1, 'frequency': frequency, 'status': 'Open'})
+	return frappe.get_all(
+		"Project",
+		fields=fields,
+		filters={"collect_progress": 1, "frequency": frequency, "status": "Open"},
+	)
+
 
 def send_project_update_email_to_users(project):
-	doc = frappe.get_doc('Project', project)
+	doc = frappe.get_doc("Project", project)
 
-	if is_holiday(doc.holiday_list) or not doc.users: return
+	if is_holiday(doc.holiday_list) or not doc.users:
+		return
 
-	project_update = frappe.get_doc({
-		"doctype" : "Project Update",
-		"project" : project,
-		"sent": 0,
-		"date": today(),
-		"time": nowtime(),
-		"naming_series": "UPDATE-.project.-.YY.MM.DD.-",
-	}).insert()
+	project_update = frappe.get_doc(
+		{
+			"doctype": "Project Update",
+			"project": project,
+			"sent": 0,
+			"date": today(),
+			"time": nowtime(),
+			"naming_series": "UPDATE-.project.-.YY.MM.DD.-",
+		}
+	).insert()
 
 	subject = "For project %s, update your status" % (project)
 
-	incoming_email_account = frappe.db.get_value('Email Account',
-		dict(enable_incoming=1, default_incoming=1), 'email_id')
+	incoming_email_account = frappe.db.get_value(
+		"Email Account", dict(enable_incoming=1, default_incoming=1), "email_id"
+	)
 
-	frappe.sendmail(recipients=get_users_email(doc),
+	frappe.sendmail(
+		recipients=get_users_email(doc),
 		message=doc.message,
 		subject=_(subject),
 		reference_doctype=project_update.doctype,
 		reference_name=project_update.name,
-		reply_to=incoming_email_account
+		reply_to=incoming_email_account,
 	)
 
+
 def collect_project_status():
-	for data in frappe.get_all("Project Update",
-		{'date': today(), 'sent': 0}):
-		replies = frappe.get_all('Communication',
-			fields=['content', 'text_content', 'sender'],
-			filters=dict(reference_doctype="Project Update",
+	for data in frappe.get_all("Project Update", {"date": today(), "sent": 0}):
+		replies = frappe.get_all(
+			"Communication",
+			fields=["content", "text_content", "sender"],
+			filters=dict(
+				reference_doctype="Project Update",
 				reference_name=data.name,
-				communication_type='Communication',
-				sent_or_received='Received'),
-			order_by='creation asc')
+				communication_type="Communication",
+				sent_or_received="Received",
+			),
+			order_by="creation asc",
+		)
 
 		for d in replies:
 			doc = frappe.get_doc("Project Update", data.name)
-			user_data = frappe.db.get_values("User", {"email": d.sender},
-				["full_name", "user_image", "name"], as_dict=True)[0]
+			user_data = frappe.db.get_values(
+				"User", {"email": d.sender}, ["full_name", "user_image", "name"], as_dict=True
+			)[0]
 
-			doc.append("users", {
-				'user': user_data.name,
-				'full_name': user_data.full_name,
-				'image': user_data.user_image,
-				'project_status': frappe.utils.md_to_html(
-					EmailReplyParser.parse_reply(d.text_content) or d.content
-				)
-			})
+			doc.append(
+				"users",
+				{
+					"user": user_data.name,
+					"full_name": user_data.full_name,
+					"image": user_data.user_image,
+					"project_status": frappe.utils.md_to_html(
+						EmailReplyParser.parse_reply(d.text_content) or d.content
+					),
+				},
+			)
 
 			doc.save(ignore_permissions=True)
 
+
 def send_project_status_email_to_users():
 	yesterday = add_days(today(), -1)
 
-	for d in frappe.get_all("Project Update",
-		{'date': yesterday, 'sent': 0}):
+	for d in frappe.get_all("Project Update", {"date": yesterday, "sent": 0}):
 		doc = frappe.get_doc("Project Update", d.name)
 
-		project_doc = frappe.get_doc('Project', doc.project)
+		project_doc = frappe.get_doc("Project", doc.project)
 
-		args = {
-			"users": doc.users,
-			"title": _("Project Summary for {0}").format(yesterday)
-		}
+		args = {"users": doc.users, "title": _("Project Summary for {0}").format(yesterday)}
 
-		frappe.sendmail(recipients=get_users_email(project_doc),
-			template='daily_project_summary',
+		frappe.sendmail(
+			recipients=get_users_email(project_doc),
+			template="daily_project_summary",
 			args=args,
 			subject=_("Daily Project Summary for {0}").format(d.name),
 			reference_doctype="Project Update",
-			reference_name=d.name)
+			reference_name=d.name,
+		)
 
-		doc.db_set('sent', 1)
+		doc.db_set("sent", 1)
+
 
 def update_project_sales_billing():
 	sales_update_frequency = frappe.db.get_single_value("Selling Settings", "sales_update_frequency")
 	if sales_update_frequency == "Each Transaction":
 		return
-	elif (sales_update_frequency == "Monthly" and frappe.utils.now_datetime().day != 1):
+	elif sales_update_frequency == "Monthly" and frappe.utils.now_datetime().day != 1:
 		return
 
-	#Else simply fallback to Daily
-	exists_query = '(SELECT 1 from `tab{doctype}` where docstatus = 1 and project = `tabProject`.name)'
+	# Else simply fallback to Daily
+	exists_query = (
+		"(SELECT 1 from `tab{doctype}` where docstatus = 1 and project = `tabProject`.name)"
+	)
 	project_map = {}
-	for project_details in frappe.db.sql('''
+	for project_details in frappe.db.sql(
+		"""
 			SELECT name, 1 as order_exists, null as invoice_exists from `tabProject` where
 			exists {order_exists}
 			union
 			SELECT name, null as order_exists, 1 as invoice_exists from `tabProject` where
 			exists {invoice_exists}
-		'''.format(
+		""".format(
 			order_exists=exists_query.format(doctype="Sales Order"),
 			invoice_exists=exists_query.format(doctype="Sales Invoice"),
-		), as_dict=True):
-		project = project_map.setdefault(project_details.name, frappe.get_doc('Project', project_details.name))
+		),
+		as_dict=True,
+	):
+		project = project_map.setdefault(
+			project_details.name, frappe.get_doc("Project", project_details.name)
+		)
 		if project_details.order_exists:
 			project.update_sales_amount()
 		if project_details.invoice_exists:
@@ -525,29 +619,31 @@
 	for project in project_map.values():
 		project.save()
 
+
 @frappe.whitelist()
 def create_kanban_board_if_not_exists(project):
 	from frappe.desk.doctype.kanban_board.kanban_board import quick_kanban_board
 
-	project = frappe.get_doc('Project', project)
-	if not frappe.db.exists('Kanban Board', project.project_name):
-		quick_kanban_board('Task', project.project_name, 'status', project.name)
+	project = frappe.get_doc("Project", project)
+	if not frappe.db.exists("Kanban Board", project.project_name):
+		quick_kanban_board("Task", project.project_name, "status", project.name)
 
 	return True
 
+
 @frappe.whitelist()
 def set_project_status(project, status):
-	'''
+	"""
 	set status for project and all related tasks
-	'''
-	if not status in ('Completed', 'Cancelled'):
-		frappe.throw(_('Status must be Cancelled or Completed'))
+	"""
+	if not status in ("Completed", "Cancelled"):
+		frappe.throw(_("Status must be Cancelled or Completed"))
 
-	project = frappe.get_doc('Project', project)
-	frappe.has_permission(doc = project, throw = True)
+	project = frappe.get_doc("Project", project)
+	frappe.has_permission(doc=project, throw=True)
 
-	for task in frappe.get_all('Task', dict(project = project.name)):
-		frappe.db.set_value('Task', task.name, 'status', status)
+	for task in frappe.get_all("Task", dict(project=project.name)):
+		frappe.db.set_value("Task", task.name, "status", status)
 
 	project.status = status
 	project.save()
diff --git a/erpnext/projects/doctype/project/project_dashboard.py b/erpnext/projects/doctype/project/project_dashboard.py
index a7d1835..b6c74f9 100644
--- a/erpnext/projects/doctype/project/project_dashboard.py
+++ b/erpnext/projects/doctype/project/project_dashboard.py
@@ -3,25 +3,16 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on the Time Sheets created against this project'),
-		'fieldname': 'project',
-		'transactions': [
+		"heatmap": True,
+		"heatmap_message": _("This is based on the Time Sheets created against this project"),
+		"fieldname": "project",
+		"transactions": [
 			{
-				'label': _('Project'),
-				'items': ['Task', 'Timesheet', 'Expense Claim', 'Issue' , 'Project Update']
+				"label": _("Project"),
+				"items": ["Task", "Timesheet", "Expense Claim", "Issue", "Project Update"],
 			},
-			{
-				'label': _('Material'),
-				'items': ['Material Request', 'BOM', 'Stock Entry']
-			},
-			{
-				'label': _('Sales'),
-				'items': ['Sales Order', 'Delivery Note', 'Sales Invoice']
-			},
-			{
-				'label': _('Purchase'),
-				'items': ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']
-			},
-		]
+			{"label": _("Material"), "items": ["Material Request", "BOM", "Stock Entry"]},
+			{"label": _("Sales"), "items": ["Sales Order", "Delivery Note", "Sales Invoice"]},
+			{"label": _("Purchase"), "items": ["Purchase Order", "Purchase Receipt", "Purchase Invoice"]},
+		],
 	}
diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py
index df42e82..8a599ce 100644
--- a/erpnext/projects/doctype/project/test_project.py
+++ b/erpnext/projects/doctype/project/test_project.py
@@ -11,7 +11,7 @@
 from erpnext.selling.doctype.sales_order.sales_order import make_project as make_project_from_so
 from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
 
-test_records = frappe.get_test_records('Project')
+test_records = frappe.get_test_records("Project")
 test_ignore = ["Sales Order"]
 
 
@@ -19,53 +19,83 @@
 	def test_project_with_template_having_no_parent_and_depend_tasks(self):
 		project_name = "Test Project with Template - No Parent and Dependend Tasks"
 		frappe.db.sql(""" delete from tabTask where project = %s """, project_name)
-		frappe.delete_doc('Project', project_name)
+		frappe.delete_doc("Project", project_name)
 
 		task1 = task_exists("Test Template Task with No Parent and Dependency")
 		if not task1:
-			task1 = create_task(subject="Test Template Task with No Parent and Dependency", is_template=1, begin=5, duration=3)
+			task1 = create_task(
+				subject="Test Template Task with No Parent and Dependency", is_template=1, begin=5, duration=3
+			)
 
-		template = make_project_template("Test Project Template - No Parent and Dependend Tasks", [task1])
+		template = make_project_template(
+			"Test Project Template - No Parent and Dependend Tasks", [task1]
+		)
 		project = get_project(project_name, template)
-		tasks = frappe.get_all('Task', ['subject','exp_end_date','depends_on_tasks'], dict(project=project.name), order_by='creation asc')
+		tasks = frappe.get_all(
+			"Task",
+			["subject", "exp_end_date", "depends_on_tasks"],
+			dict(project=project.name),
+			order_by="creation asc",
+		)
 
-		self.assertEqual(tasks[0].subject, 'Test Template Task with No Parent and Dependency')
+		self.assertEqual(tasks[0].subject, "Test Template Task with No Parent and Dependency")
 		self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 5, 3))
 		self.assertEqual(len(tasks), 1)
 
 	def test_project_template_having_parent_child_tasks(self):
 		project_name = "Test Project with Template - Tasks with Parent-Child Relation"
 
-		if frappe.db.get_value('Project', {'project_name': project_name}, 'name'):
-			project_name = frappe.db.get_value('Project', {'project_name': project_name}, 'name')
+		if frappe.db.get_value("Project", {"project_name": project_name}, "name"):
+			project_name = frappe.db.get_value("Project", {"project_name": project_name}, "name")
 
 		frappe.db.sql(""" delete from tabTask where project = %s """, project_name)
-		frappe.delete_doc('Project', project_name)
+		frappe.delete_doc("Project", project_name)
 
 		task1 = task_exists("Test Template Task Parent")
 		if not task1:
-			task1 = create_task(subject="Test Template Task Parent", is_group=1, is_template=1, begin=1, duration=10)
+			task1 = create_task(
+				subject="Test Template Task Parent", is_group=1, is_template=1, begin=1, duration=10
+			)
 
 		task2 = task_exists("Test Template Task Child 1")
 		if not task2:
-			task2 = create_task(subject="Test Template Task Child 1", parent_task=task1.name, is_template=1, begin=1, duration=3)
+			task2 = create_task(
+				subject="Test Template Task Child 1",
+				parent_task=task1.name,
+				is_template=1,
+				begin=1,
+				duration=3,
+			)
 
 		task3 = task_exists("Test Template Task Child 2")
 		if not task3:
-			task3 = create_task(subject="Test Template Task Child 2", parent_task=task1.name, is_template=1, begin=2, duration=3)
+			task3 = create_task(
+				subject="Test Template Task Child 2",
+				parent_task=task1.name,
+				is_template=1,
+				begin=2,
+				duration=3,
+			)
 
-		template = make_project_template("Test Project Template  - Tasks with Parent-Child Relation", [task1, task2, task3])
+		template = make_project_template(
+			"Test Project Template  - Tasks with Parent-Child Relation", [task1, task2, task3]
+		)
 		project = get_project(project_name, template)
-		tasks = frappe.get_all('Task', ['subject','exp_end_date','depends_on_tasks', 'name', 'parent_task'], dict(project=project.name), order_by='creation asc')
+		tasks = frappe.get_all(
+			"Task",
+			["subject", "exp_end_date", "depends_on_tasks", "name", "parent_task"],
+			dict(project=project.name),
+			order_by="creation asc",
+		)
 
-		self.assertEqual(tasks[0].subject, 'Test Template Task Parent')
+		self.assertEqual(tasks[0].subject, "Test Template Task Parent")
 		self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 1, 10))
 
-		self.assertEqual(tasks[1].subject, 'Test Template Task Child 1')
+		self.assertEqual(tasks[1].subject, "Test Template Task Child 1")
 		self.assertEqual(getdate(tasks[1].exp_end_date), calculate_end_date(project, 1, 3))
 		self.assertEqual(tasks[1].parent_task, tasks[0].name)
 
-		self.assertEqual(tasks[2].subject, 'Test Template Task Child 2')
+		self.assertEqual(tasks[2].subject, "Test Template Task Child 2")
 		self.assertEqual(getdate(tasks[2].exp_end_date), calculate_end_date(project, 2, 3))
 		self.assertEqual(tasks[2].parent_task, tasks[0].name)
 
@@ -74,26 +104,39 @@
 	def test_project_template_having_dependent_tasks(self):
 		project_name = "Test Project with Template - Dependent Tasks"
 		frappe.db.sql(""" delete from tabTask where project = %s  """, project_name)
-		frappe.delete_doc('Project', project_name)
+		frappe.delete_doc("Project", project_name)
 
 		task1 = task_exists("Test Template Task for Dependency")
 		if not task1:
-			task1 = create_task(subject="Test Template Task for Dependency", is_template=1, begin=3, duration=1)
+			task1 = create_task(
+				subject="Test Template Task for Dependency", is_template=1, begin=3, duration=1
+			)
 
 		task2 = task_exists("Test Template Task with Dependency")
 		if not task2:
-			task2 = create_task(subject="Test Template Task with Dependency", depends_on=task1.name, is_template=1, begin=2, duration=2)
+			task2 = create_task(
+				subject="Test Template Task with Dependency",
+				depends_on=task1.name,
+				is_template=1,
+				begin=2,
+				duration=2,
+			)
 
 		template = make_project_template("Test Project with Template - Dependent Tasks", [task1, task2])
 		project = get_project(project_name, template)
-		tasks = frappe.get_all('Task', ['subject','exp_end_date','depends_on_tasks', 'name'], dict(project=project.name), order_by='creation asc')
+		tasks = frappe.get_all(
+			"Task",
+			["subject", "exp_end_date", "depends_on_tasks", "name"],
+			dict(project=project.name),
+			order_by="creation asc",
+		)
 
-		self.assertEqual(tasks[1].subject, 'Test Template Task with Dependency')
+		self.assertEqual(tasks[1].subject, "Test Template Task with Dependency")
 		self.assertEqual(getdate(tasks[1].exp_end_date), calculate_end_date(project, 2, 2))
-		self.assertTrue(tasks[1].depends_on_tasks.find(tasks[0].name) >= 0 )
+		self.assertTrue(tasks[1].depends_on_tasks.find(tasks[0].name) >= 0)
 
-		self.assertEqual(tasks[0].subject, 'Test Template Task for Dependency')
-		self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 3, 1) )
+		self.assertEqual(tasks[0].subject, "Test Template Task for Dependency")
+		self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 3, 1))
 
 		self.assertEqual(len(tasks), 2)
 
@@ -112,32 +155,38 @@
 		so.reload()
 		self.assertFalse(so.project)
 
+
 def get_project(name, template):
 
-	project = frappe.get_doc(dict(
-		doctype = 'Project',
-		project_name = name,
-		status = 'Open',
-		project_template = template.name,
-		expected_start_date = nowdate(),
-		company="_Test Company"
-	)).insert()
+	project = frappe.get_doc(
+		dict(
+			doctype="Project",
+			project_name=name,
+			status="Open",
+			project_template=template.name,
+			expected_start_date=nowdate(),
+			company="_Test Company",
+		)
+	).insert()
 
 	return project
 
+
 def make_project(args):
 	args = frappe._dict(args)
 
 	if args.project_name and frappe.db.exists("Project", {"project_name": args.project_name}):
 		return frappe.get_doc("Project", {"project_name": args.project_name})
 
-	project = frappe.get_doc(dict(
-		doctype = 'Project',
-		project_name = args.project_name,
-		status = 'Open',
-		expected_start_date = args.start_date,
-		company= args.company or '_Test Company'
-	))
+	project = frappe.get_doc(
+		dict(
+			doctype="Project",
+			project_name=args.project_name,
+			status="Open",
+			expected_start_date=args.start_date,
+			company=args.company or "_Test Company",
+		)
+	)
 
 	if args.project_template_name:
 		template = make_project_template(args.project_template_name)
@@ -147,12 +196,14 @@
 
 	return project
 
+
 def task_exists(subject):
-	result = frappe.db.get_list("Task", filters={"subject": subject},fields=["name"])
+	result = frappe.db.get_list("Task", filters={"subject": subject}, fields=["name"])
 	if not len(result):
 		return False
 	return frappe.get_doc("Task", result[0].name)
 
+
 def calculate_end_date(project, start, duration):
 	start = add_days(project.expected_start_date, start)
 	start = project.update_if_holiday(start)
diff --git a/erpnext/projects/doctype/project_template/project_template.py b/erpnext/projects/doctype/project_template/project_template.py
index 3cc8d68..89afb1b 100644
--- a/erpnext/projects/doctype/project_template/project_template.py
+++ b/erpnext/projects/doctype/project_template/project_template.py
@@ -9,7 +9,6 @@
 
 
 class ProjectTemplate(Document):
-
 	def validate(self):
 		self.validate_dependencies()
 
@@ -19,9 +18,13 @@
 			if task_details.depends_on:
 				for dependency_task in task_details.depends_on:
 					if not self.check_dependent_task_presence(dependency_task.task):
-						task_details_format = get_link_to_form("Task",task_details.name)
+						task_details_format = get_link_to_form("Task", task_details.name)
 						dependency_task_format = get_link_to_form("Task", dependency_task.task)
-						frappe.throw(_("Task {0} depends on Task {1}. Please add Task {1} to the Tasks list.").format(frappe.bold(task_details_format), frappe.bold(dependency_task_format)))
+						frappe.throw(
+							_("Task {0} depends on Task {1}. Please add Task {1} to the Tasks list.").format(
+								frappe.bold(task_details_format), frappe.bold(dependency_task_format)
+							)
+						)
 
 	def check_dependent_task_presence(self, task):
 		for task_details in self.tasks:
diff --git a/erpnext/projects/doctype/project_template/project_template_dashboard.py b/erpnext/projects/doctype/project_template/project_template_dashboard.py
index a03a57d..0c567c1 100644
--- a/erpnext/projects/doctype/project_template/project_template_dashboard.py
+++ b/erpnext/projects/doctype/project_template/project_template_dashboard.py
@@ -1,9 +1,2 @@
 def get_data():
-	return {
-		'fieldname': 'project_template',
-		'transactions': [
-			{
-				'items': ['Project']
-			}
-		]
-	}
+	return {"fieldname": "project_template", "transactions": [{"items": ["Project"]}]}
diff --git a/erpnext/projects/doctype/project_template/test_project_template.py b/erpnext/projects/doctype/project_template/test_project_template.py
index 8424833..4fd24bf 100644
--- a/erpnext/projects/doctype/project_template/test_project_template.py
+++ b/erpnext/projects/doctype/project_template/test_project_template.py
@@ -11,20 +11,16 @@
 class TestProjectTemplate(unittest.TestCase):
 	pass
 
+
 def make_project_template(project_template_name, project_tasks=[]):
-	if not frappe.db.exists('Project Template', project_template_name):
+	if not frappe.db.exists("Project Template", project_template_name):
 		project_tasks = project_tasks or [
-				create_task(subject="_Test Template Task 1", is_template=1, begin=0, duration=3),
-				create_task(subject="_Test Template Task 2", is_template=1, begin=0, duration=2),
-			]
-		doc = frappe.get_doc(dict(
-			doctype = 'Project Template',
-			name = project_template_name
-		))
+			create_task(subject="_Test Template Task 1", is_template=1, begin=0, duration=3),
+			create_task(subject="_Test Template Task 2", is_template=1, begin=0, duration=2),
+		]
+		doc = frappe.get_doc(dict(doctype="Project Template", name=project_template_name))
 		for task in project_tasks:
-			doc.append("tasks",{
-				"task": task.name
-			})
+			doc.append("tasks", {"task": task.name})
 		doc.insert()
 
-	return frappe.get_doc('Project Template', project_template_name)
+	return frappe.get_doc("Project Template", project_template_name)
diff --git a/erpnext/projects/doctype/project_update/project_update.py b/erpnext/projects/doctype/project_update/project_update.py
index 42ba5f6..5a29fb6 100644
--- a/erpnext/projects/doctype/project_update/project_update.py
+++ b/erpnext/projects/doctype/project_update/project_update.py
@@ -7,36 +7,88 @@
 
 
 class ProjectUpdate(Document):
-    pass
+	pass
+
 
 @frappe.whitelist()
 def daily_reminder():
-    project = frappe.db.sql("""SELECT `tabProject`.project_name,`tabProject`.frequency,`tabProject`.expected_start_date,`tabProject`.expected_end_date,`tabProject`.percent_complete FROM `tabProject`;""")
-    for projects in project:
-        project_name = projects[0]
-        frequency = projects[1]
-        date_start = projects[2]
-        date_end = projects [3]
-        progress = projects [4]
-        draft = frappe.db.sql("""SELECT count(docstatus) from `tabProject Update` WHERE `tabProject Update`.project = %s AND `tabProject Update`.docstatus = 0;""",project_name)
-        for drafts in draft:
-            number_of_drafts = drafts[0]
-        update = frappe.db.sql("""SELECT name,date,time,progress,progress_details FROM `tabProject Update` WHERE `tabProject Update`.project = %s AND date = DATE_ADD(CURDATE(), INTERVAL -1 DAY);""",project_name)
-        email_sending(project_name,frequency,date_start,date_end,progress,number_of_drafts,update)
+	project = frappe.db.sql(
+		"""SELECT `tabProject`.project_name,`tabProject`.frequency,`tabProject`.expected_start_date,`tabProject`.expected_end_date,`tabProject`.percent_complete FROM `tabProject`;"""
+	)
+	for projects in project:
+		project_name = projects[0]
+		frequency = projects[1]
+		date_start = projects[2]
+		date_end = projects[3]
+		progress = projects[4]
+		draft = frappe.db.sql(
+			"""SELECT count(docstatus) from `tabProject Update` WHERE `tabProject Update`.project = %s AND `tabProject Update`.docstatus = 0;""",
+			project_name,
+		)
+		for drafts in draft:
+			number_of_drafts = drafts[0]
+		update = frappe.db.sql(
+			"""SELECT name,date,time,progress,progress_details FROM `tabProject Update` WHERE `tabProject Update`.project = %s AND date = DATE_ADD(CURDATE(), INTERVAL -1 DAY);""",
+			project_name,
+		)
+		email_sending(project_name, frequency, date_start, date_end, progress, number_of_drafts, update)
 
-def email_sending(project_name,frequency,date_start,date_end,progress,number_of_drafts,update):
 
-    holiday = frappe.db.sql("""SELECT holiday_date FROM `tabHoliday` where holiday_date = CURDATE();""")
-    msg = "<p>Project Name: " + project_name + "</p><p>Frequency: " + " " + frequency + "</p><p>Update Reminder:" + " " + str(date_start) + "</p><p>Expected Date End:" + " " + str(date_end) + "</p><p>Percent Progress:" + " " + str(progress) + "</p><p>Number of Updates:" + " " + str(len(update)) + "</p>" + "</p><p>Number of drafts:" + " " + str(number_of_drafts) + "</p>"
-    msg += """</u></b></p><table class='table table-bordered'><tr>
+def email_sending(
+	project_name, frequency, date_start, date_end, progress, number_of_drafts, update
+):
+
+	holiday = frappe.db.sql(
+		"""SELECT holiday_date FROM `tabHoliday` where holiday_date = CURDATE();"""
+	)
+	msg = (
+		"<p>Project Name: "
+		+ project_name
+		+ "</p><p>Frequency: "
+		+ " "
+		+ frequency
+		+ "</p><p>Update Reminder:"
+		+ " "
+		+ str(date_start)
+		+ "</p><p>Expected Date End:"
+		+ " "
+		+ str(date_end)
+		+ "</p><p>Percent Progress:"
+		+ " "
+		+ str(progress)
+		+ "</p><p>Number of Updates:"
+		+ " "
+		+ str(len(update))
+		+ "</p>"
+		+ "</p><p>Number of drafts:"
+		+ " "
+		+ str(number_of_drafts)
+		+ "</p>"
+	)
+	msg += """</u></b></p><table class='table table-bordered'><tr>
                 <th>Project ID</th><th>Date Updated</th><th>Time Updated</th><th>Project Status</th><th>Notes</th>"""
-    for updates in update:
-        msg += "<tr><td>" + str(updates[0]) + "</td><td>" + str(updates[1]) + "</td><td>" + str(updates[2]) + "</td><td>" + str(updates[3]) + "</td>" + "</td><td>" + str(updates[4]) + "</td></tr>"
+	for updates in update:
+		msg += (
+			"<tr><td>"
+			+ str(updates[0])
+			+ "</td><td>"
+			+ str(updates[1])
+			+ "</td><td>"
+			+ str(updates[2])
+			+ "</td><td>"
+			+ str(updates[3])
+			+ "</td>"
+			+ "</td><td>"
+			+ str(updates[4])
+			+ "</td></tr>"
+		)
 
-    msg += "</table>"
-    if len(holiday) == 0:
-        email = frappe.db.sql("""SELECT user from `tabProject User` WHERE parent = %s;""", project_name)
-        for emails in email:
-            frappe.sendmail(recipients=emails,subject=frappe._(project_name + ' ' + 'Summary'),message = msg)
-    else:
-    	pass
+	msg += "</table>"
+	if len(holiday) == 0:
+		email = frappe.db.sql("""SELECT user from `tabProject User` WHERE parent = %s;""", project_name)
+		for emails in email:
+			frappe.sendmail(
+				recipients=emails, subject=frappe._(project_name + " " + "Summary"), message=msg
+			)
+	else:
+		pass
diff --git a/erpnext/projects/doctype/project_update/test_project_update.py b/erpnext/projects/doctype/project_update/test_project_update.py
index f29c931..8663350 100644
--- a/erpnext/projects/doctype/project_update/test_project_update.py
+++ b/erpnext/projects/doctype/project_update/test_project_update.py
@@ -9,5 +9,6 @@
 class TestProjectUpdate(unittest.TestCase):
 	pass
 
-test_records = frappe.get_test_records('Project Update')
+
+test_records = frappe.get_test_records("Project Update")
 test_ignore = ["Sales Order"]
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 8fa0538..4575fb5 100755
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -12,19 +12,24 @@
 from frappe.utils.nestedset import NestedSet
 
 
-class CircularReferenceError(frappe.ValidationError): pass
-class EndDateCannotBeGreaterThanProjectEndDateError(frappe.ValidationError): pass
+class CircularReferenceError(frappe.ValidationError):
+	pass
+
+
+class EndDateCannotBeGreaterThanProjectEndDateError(frappe.ValidationError):
+	pass
+
 
 class Task(NestedSet):
-	nsm_parent_field = 'parent_task'
+	nsm_parent_field = "parent_task"
 
 	def get_feed(self):
-		return '{0}: {1}'.format(_(self.status), self.subject)
+		return "{0}: {1}".format(_(self.status), self.subject)
 
 	def get_customer_details(self):
 		cust = frappe.db.sql("select customer_name from `tabCustomer` where name=%s", self.customer)
 		if cust:
-			ret = {'customer_name': cust and cust[0][0] or ''}
+			ret = {"customer_name": cust and cust[0][0] or ""}
 			return ret
 
 	def validate(self):
@@ -38,19 +43,37 @@
 		self.validate_completed_on()
 
 	def validate_dates(self):
-		if self.exp_start_date and self.exp_end_date and getdate(self.exp_start_date) > getdate(self.exp_end_date):
-			frappe.throw(_("{0} can not be greater than {1}").format(frappe.bold("Expected Start Date"), \
-				frappe.bold("Expected End Date")))
+		if (
+			self.exp_start_date
+			and self.exp_end_date
+			and getdate(self.exp_start_date) > getdate(self.exp_end_date)
+		):
+			frappe.throw(
+				_("{0} can not be greater than {1}").format(
+					frappe.bold("Expected Start Date"), frappe.bold("Expected End Date")
+				)
+			)
 
-		if self.act_start_date and self.act_end_date and getdate(self.act_start_date) > getdate(self.act_end_date):
-			frappe.throw(_("{0} can not be greater than {1}").format(frappe.bold("Actual Start Date"), \
-				frappe.bold("Actual End Date")))
+		if (
+			self.act_start_date
+			and self.act_end_date
+			and getdate(self.act_start_date) > getdate(self.act_end_date)
+		):
+			frappe.throw(
+				_("{0} can not be greater than {1}").format(
+					frappe.bold("Actual Start Date"), frappe.bold("Actual End Date")
+				)
+			)
 
 	def validate_parent_expected_end_date(self):
 		if self.parent_task:
 			parent_exp_end_date = frappe.db.get_value("Task", self.parent_task, "exp_end_date")
 			if parent_exp_end_date and getdate(self.get("exp_end_date")) > getdate(parent_exp_end_date):
-				frappe.throw(_("Expected End Date should be less than or equal to parent task's Expected End Date {0}.").format(getdate(parent_exp_end_date)))
+				frappe.throw(
+					_(
+						"Expected End Date should be less than or equal to parent task's Expected End Date {0}."
+					).format(getdate(parent_exp_end_date))
+				)
 
 	def validate_parent_project_dates(self):
 		if not self.project or frappe.flags.in_test:
@@ -59,16 +82,24 @@
 		expected_end_date = frappe.db.get_value("Project", self.project, "expected_end_date")
 
 		if expected_end_date:
-			validate_project_dates(getdate(expected_end_date), self, "exp_start_date", "exp_end_date", "Expected")
-			validate_project_dates(getdate(expected_end_date), self, "act_start_date", "act_end_date", "Actual")
+			validate_project_dates(
+				getdate(expected_end_date), self, "exp_start_date", "exp_end_date", "Expected"
+			)
+			validate_project_dates(
+				getdate(expected_end_date), self, "act_start_date", "act_end_date", "Actual"
+			)
 
 	def validate_status(self):
 		if self.is_template and self.status != "Template":
 			self.status = "Template"
-		if self.status!=self.get_db_value("status") and self.status == "Completed":
+		if self.status != self.get_db_value("status") and self.status == "Completed":
 			for d in self.depends_on:
 				if frappe.db.get_value("Task", d.task, "status") not in ("Completed", "Cancelled"):
-					frappe.throw(_("Cannot complete task {0} as its dependant task {1} are not ccompleted / cancelled.").format(frappe.bold(self.name), frappe.bold(d.task)))
+					frappe.throw(
+						_(
+							"Cannot complete task {0} as its dependant task {1} are not ccompleted / cancelled."
+						).format(frappe.bold(self.name), frappe.bold(d.task))
+					)
 
 			close_all_assignments(self.doctype, self.name)
 
@@ -76,7 +107,7 @@
 		if flt(self.progress or 0) > 100:
 			frappe.throw(_("Progress % for a task cannot be more than 100."))
 
-		if self.status == 'Completed':
+		if self.status == "Completed":
 			self.progress = 100
 
 	def validate_dependencies_for_template_task(self):
@@ -126,34 +157,43 @@
 			clear(self.doctype, self.name)
 
 	def update_total_expense_claim(self):
-		self.total_expense_claim = frappe.db.sql("""select sum(total_sanctioned_amount) from `tabExpense Claim`
-			where project = %s and task = %s and docstatus=1""",(self.project, self.name))[0][0]
+		self.total_expense_claim = frappe.db.sql(
+			"""select sum(total_sanctioned_amount) from `tabExpense Claim`
+			where project = %s and task = %s and docstatus=1""",
+			(self.project, self.name),
+		)[0][0]
 
 	def update_time_and_costing(self):
-		tl = frappe.db.sql("""select min(from_time) as start_date, max(to_time) as end_date,
+		tl = frappe.db.sql(
+			"""select min(from_time) as start_date, max(to_time) as end_date,
 			sum(billing_amount) as total_billing_amount, sum(costing_amount) as total_costing_amount,
-			sum(hours) as time from `tabTimesheet Detail` where task = %s and docstatus=1"""
-			,self.name, as_dict=1)[0]
+			sum(hours) as time from `tabTimesheet Detail` where task = %s and docstatus=1""",
+			self.name,
+			as_dict=1,
+		)[0]
 		if self.status == "Open":
 			self.status = "Working"
-		self.total_costing_amount= tl.total_costing_amount
-		self.total_billing_amount= tl.total_billing_amount
-		self.actual_time= tl.time
-		self.act_start_date= tl.start_date
-		self.act_end_date= tl.end_date
+		self.total_costing_amount = tl.total_costing_amount
+		self.total_billing_amount = tl.total_billing_amount
+		self.actual_time = tl.time
+		self.act_start_date = tl.start_date
+		self.act_end_date = tl.end_date
 
 	def update_project(self):
 		if self.project and not self.flags.from_project:
 			frappe.get_cached_doc("Project", self.project).update_project()
 
 	def check_recursion(self):
-		if self.flags.ignore_recursion_check: return
-		check_list = [['task', 'parent'], ['parent', 'task']]
+		if self.flags.ignore_recursion_check:
+			return
+		check_list = [["task", "parent"], ["parent", "task"]]
 		for d in check_list:
 			task_list, count = [self.name], 0
-			while (len(task_list) > count ):
-				tasks = frappe.db.sql(" select %s from `tabTask Depends On` where %s = %s " %
-					(d[0], d[1], '%s'), cstr(task_list[count]))
+			while len(task_list) > count:
+				tasks = frappe.db.sql(
+					" select %s from `tabTask Depends On` where %s = %s " % (d[0], d[1], "%s"),
+					cstr(task_list[count]),
+				)
 				count = count + 1
 				for b in tasks:
 					if b[0] == self.name:
@@ -167,15 +207,24 @@
 	def reschedule_dependent_tasks(self):
 		end_date = self.exp_end_date or self.act_end_date
 		if end_date:
-			for task_name in frappe.db.sql("""
+			for task_name in frappe.db.sql(
+				"""
 				select name from `tabTask` as parent
 				where parent.project = %(project)s
 					and parent.name in (
 						select parent from `tabTask Depends On` as child
 						where child.task = %(task)s and child.project = %(project)s)
-			""", {'project': self.project, 'task':self.name }, as_dict=1):
+			""",
+				{"project": self.project, "task": self.name},
+				as_dict=1,
+			):
 				task = frappe.get_doc("Task", task_name.name)
-				if task.exp_start_date and task.exp_end_date and task.exp_start_date < getdate(end_date) and task.status == "Open":
+				if (
+					task.exp_start_date
+					and task.exp_end_date
+					and task.exp_start_date < getdate(end_date)
+					and task.status == "Open"
+				):
 					task_duration = date_diff(task.exp_end_date, task.exp_start_date)
 					task.exp_start_date = add_days(end_date, 1)
 					task.exp_end_date = add_days(task.exp_start_date, task_duration)
@@ -183,19 +232,19 @@
 					task.save()
 
 	def has_webform_permission(self):
-		project_user = frappe.db.get_value("Project User", {"parent": self.project, "user":frappe.session.user} , "user")
+		project_user = frappe.db.get_value(
+			"Project User", {"parent": self.project, "user": frappe.session.user}, "user"
+		)
 		if project_user:
 			return True
 
 	def populate_depends_on(self):
 		if self.parent_task:
-			parent = frappe.get_doc('Task', self.parent_task)
+			parent = frappe.get_doc("Task", self.parent_task)
 			if self.name not in [row.task for row in parent.depends_on]:
-				parent.append("depends_on", {
-					"doctype": "Task Depends On",
-					"task": self.name,
-					"subject": self.subject
-				})
+				parent.append(
+					"depends_on", {"doctype": "Task Depends On", "task": self.name, "subject": self.subject}
+				)
 				parent.save()
 
 	def on_trash(self):
@@ -208,12 +257,14 @@
 		self.update_project()
 
 	def update_status(self):
-		if self.status not in ('Cancelled', 'Completed') and self.exp_end_date:
+		if self.status not in ("Cancelled", "Completed") and self.exp_end_date:
 			from datetime import datetime
+
 			if self.exp_end_date < datetime.now().date():
-				self.db_set('status', 'Overdue', update_modified=False)
+				self.db_set("status", "Overdue", update_modified=False)
 				self.update_project()
 
+
 @frappe.whitelist()
 def check_if_child_exists(name):
 	child_tasks = frappe.get_all("Task", filters={"parent_task": name})
@@ -225,24 +276,29 @@
 @frappe.validate_and_sanitize_search_inputs
 def get_project(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
+
 	meta = frappe.get_meta(doctype)
 	searchfields = meta.get_search_fields()
-	search_columns = ", " + ", ".join(searchfields) if searchfields else ''
+	search_columns = ", " + ", ".join(searchfields) if searchfields else ""
 	search_cond = " or " + " or ".join(field + " like %(txt)s" for field in searchfields)
 
-	return frappe.db.sql(""" select name {search_columns} from `tabProject`
+	return frappe.db.sql(
+		""" select name {search_columns} from `tabProject`
 		where %(key)s like %(txt)s
 			%(mcond)s
 			{search_condition}
 		order by name
-		limit %(start)s, %(page_len)s""".format(search_columns = search_columns,
-			search_condition=search_cond), {
-			'key': searchfield,
-			'txt': '%' + txt + '%',
-			'mcond':get_match_cond(doctype),
-			'start': start,
-			'page_len': page_len
-		})
+		limit %(start)s, %(page_len)s""".format(
+			search_columns=search_columns, search_condition=search_cond
+		),
+		{
+			"key": searchfield,
+			"txt": "%" + txt + "%",
+			"mcond": get_match_cond(doctype),
+			"start": start,
+			"page_len": page_len,
+		},
+	)
 
 
 @frappe.whitelist()
@@ -253,8 +309,13 @@
 		task.status = status
 		task.save()
 
+
 def set_tasks_as_overdue():
-	tasks = frappe.get_all("Task", filters={"status": ["not in", ["Cancelled", "Completed"]]}, fields=["name", "status", "review_date"])
+	tasks = frappe.get_all(
+		"Task",
+		filters={"status": ["not in", ["Cancelled", "Completed"]]},
+		fields=["name", "status", "review_date"],
+	)
 	for task in tasks:
 		if task.status == "Pending Review":
 			if getdate(task.review_date) > getdate(today()):
@@ -265,18 +326,24 @@
 @frappe.whitelist()
 def make_timesheet(source_name, target_doc=None, ignore_permissions=False):
 	def set_missing_values(source, target):
-		target.append("time_logs", {
-			"hours": source.actual_time,
-			"completed": source.status == "Completed",
-			"project": source.project,
-			"task": source.name
-		})
+		target.append(
+			"time_logs",
+			{
+				"hours": source.actual_time,
+				"completed": source.status == "Completed",
+				"project": source.project,
+				"task": source.name,
+			},
+		)
 
-	doclist = get_mapped_doc("Task", source_name, {
-			"Task": {
-				"doctype": "Timesheet"
-			}
-		}, target_doc, postprocess=set_missing_values, ignore_permissions=ignore_permissions)
+	doclist = get_mapped_doc(
+		"Task",
+		source_name,
+		{"Task": {"doctype": "Timesheet"}},
+		target_doc,
+		postprocess=set_missing_values,
+		ignore_permissions=ignore_permissions,
+	)
 
 	return doclist
 
@@ -284,60 +351,69 @@
 @frappe.whitelist()
 def get_children(doctype, parent, task=None, project=None, is_root=False):
 
-	filters = [['docstatus', '<', '2']]
+	filters = [["docstatus", "<", "2"]]
 
 	if task:
-		filters.append(['parent_task', '=', task])
+		filters.append(["parent_task", "=", task])
 	elif parent and not is_root:
 		# via expand child
-		filters.append(['parent_task', '=', parent])
+		filters.append(["parent_task", "=", parent])
 	else:
-		filters.append(['ifnull(`parent_task`, "")', '=', ''])
+		filters.append(['ifnull(`parent_task`, "")', "=", ""])
 
 	if project:
-		filters.append(['project', '=', project])
+		filters.append(["project", "=", project])
 
-	tasks = frappe.get_list(doctype, fields=[
-		'name as value',
-		'subject as title',
-		'is_group as expandable'
-	], filters=filters, order_by='name')
+	tasks = frappe.get_list(
+		doctype,
+		fields=["name as value", "subject as title", "is_group as expandable"],
+		filters=filters,
+		order_by="name",
+	)
 
 	# return tasks
 	return tasks
 
+
 @frappe.whitelist()
 def add_node():
 	from frappe.desk.treeview import make_tree_args
+
 	args = frappe.form_dict
-	args.update({
-		"name_field": "subject"
-	})
+	args.update({"name_field": "subject"})
 	args = make_tree_args(**args)
 
-	if args.parent_task == 'All Tasks' or args.parent_task == args.project:
+	if args.parent_task == "All Tasks" or args.parent_task == args.project:
 		args.parent_task = None
 
 	frappe.get_doc(args).insert()
 
+
 @frappe.whitelist()
 def add_multiple_tasks(data, parent):
 	data = json.loads(data)
-	new_doc = {'doctype': 'Task', 'parent_task': parent if parent!="All Tasks" else ""}
-	new_doc['project'] = frappe.db.get_value('Task', {"name": parent}, 'project') or ""
+	new_doc = {"doctype": "Task", "parent_task": parent if parent != "All Tasks" else ""}
+	new_doc["project"] = frappe.db.get_value("Task", {"name": parent}, "project") or ""
 
 	for d in data:
-		if not d.get("subject"): continue
-		new_doc['subject'] = d.get("subject")
+		if not d.get("subject"):
+			continue
+		new_doc["subject"] = d.get("subject")
 		new_task = frappe.get_doc(new_doc)
 		new_task.insert()
 
+
 def on_doctype_update():
 	frappe.db.add_index("Task", ["lft", "rgt"])
 
+
 def validate_project_dates(project_end_date, task, task_start, task_end, actual_or_expected_date):
 	if task.get(task_start) and date_diff(project_end_date, getdate(task.get(task_start))) < 0:
-		frappe.throw(_("Task's {0} Start Date cannot be after Project's End Date.").format(actual_or_expected_date))
+		frappe.throw(
+			_("Task's {0} Start Date cannot be after Project's End Date.").format(actual_or_expected_date)
+		)
 
 	if task.get(task_end) and date_diff(project_end_date, getdate(task.get(task_end))) < 0:
-		frappe.throw(_("Task's {0} End Date cannot be after Project's End Date.").format(actual_or_expected_date))
+		frappe.throw(
+			_("Task's {0} End Date cannot be after Project's End Date.").format(actual_or_expected_date)
+		)
diff --git a/erpnext/projects/doctype/task/task_dashboard.py b/erpnext/projects/doctype/task/task_dashboard.py
index f7470f8..07477da 100644
--- a/erpnext/projects/doctype/task/task_dashboard.py
+++ b/erpnext/projects/doctype/task/task_dashboard.py
@@ -3,15 +3,9 @@
 
 def get_data():
 	return {
-		'fieldname': 'task',
-		'transactions': [
-			{
-				'label': _('Activity'),
-				'items': ['Timesheet']
-			},
-			{
-				'label': _('Accounting'),
-				'items': ['Expense Claim']
-			}
-		]
+		"fieldname": "task",
+		"transactions": [
+			{"label": _("Activity"), "items": ["Timesheet"]},
+			{"label": _("Accounting"), "items": ["Expense Claim"]},
+		],
 	}
diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py
index 5f5b519..c0333f8 100644
--- a/erpnext/projects/doctype/task/test_task.py
+++ b/erpnext/projects/doctype/task/test_task.py
@@ -16,9 +16,7 @@
 		task3 = create_task("_Test Task 3", add_days(nowdate(), 11), add_days(nowdate(), 15), task2.name)
 
 		task1.reload()
-		task1.append("depends_on", {
-			"task": task3.name
-		})
+		task1.append("depends_on", {"task": task3.name})
 
 		self.assertRaises(CircularReferenceError, task1.save)
 
@@ -27,9 +25,7 @@
 
 		task4 = create_task("_Test Task 4", nowdate(), add_days(nowdate(), 15), task1.name)
 
-		task3.append("depends_on", {
-			"task": task4.name
-		})
+		task3.append("depends_on", {"task": task4.name})
 
 	def test_reschedule_dependent_task(self):
 		project = frappe.get_value("Project", {"project_name": "_Test Project"})
@@ -44,20 +40,22 @@
 		task3.get("depends_on")[0].project = project
 		task3.save()
 
-		task1.update({
-			"exp_end_date": add_days(nowdate(), 20)
-		})
+		task1.update({"exp_end_date": add_days(nowdate(), 20)})
 		task1.save()
 
-		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_start_date"),
-			getdate(add_days(nowdate(), 21)))
-		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_end_date"),
-			getdate(add_days(nowdate(), 25)))
+		self.assertEqual(
+			frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate(add_days(nowdate(), 21))
+		)
+		self.assertEqual(
+			frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate(add_days(nowdate(), 25))
+		)
 
-		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"),
-			getdate(add_days(nowdate(), 26)))
-		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"),
-			getdate(add_days(nowdate(), 30)))
+		self.assertEqual(
+			frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate(add_days(nowdate(), 26))
+		)
+		self.assertEqual(
+			frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate(add_days(nowdate(), 30))
+		)
 
 	def test_close_assignment(self):
 		if not frappe.db.exists("Task", "Test Close Assignment"):
@@ -67,18 +65,27 @@
 
 		def assign():
 			from frappe.desk.form import assign_to
-			assign_to.add({
-				"assign_to": ["test@example.com"],
-				"doctype": task.doctype,
-				"name": task.name,
-				"description": "Close this task"
-			})
+
+			assign_to.add(
+				{
+					"assign_to": ["test@example.com"],
+					"doctype": task.doctype,
+					"name": task.name,
+					"description": "Close this task",
+				}
+			)
 
 		def get_owner_and_status():
-			return frappe.db.get_value("ToDo",
-				filters={"reference_type": task.doctype, "reference_name": task.name,
-					"description": "Close this task"},
-				fieldname=("allocated_to", "status"), as_dict=True)
+			return frappe.db.get_value(
+				"ToDo",
+				filters={
+					"reference_type": task.doctype,
+					"reference_name": task.name,
+					"description": "Close this task",
+				},
+				fieldname=("allocated_to", "status"),
+				as_dict=True,
+			)
 
 		assign()
 		todo = get_owner_and_status()
@@ -97,18 +104,36 @@
 		task = create_task("Testing Overdue", add_days(nowdate(), -10), add_days(nowdate(), -5))
 
 		from erpnext.projects.doctype.task.task import set_tasks_as_overdue
+
 		set_tasks_as_overdue()
 
 		self.assertEqual(frappe.db.get_value("Task", task.name, "status"), "Overdue")
 
-def create_task(subject, start=None, end=None, depends_on=None, project=None, parent_task=None, is_group=0, is_template=0, begin=0, duration=0, save=True):
+
+def create_task(
+	subject,
+	start=None,
+	end=None,
+	depends_on=None,
+	project=None,
+	parent_task=None,
+	is_group=0,
+	is_template=0,
+	begin=0,
+	duration=0,
+	save=True,
+):
 	if not frappe.db.exists("Task", subject):
-		task = frappe.new_doc('Task')
+		task = frappe.new_doc("Task")
 		task.status = "Open"
 		task.subject = subject
 		task.exp_start_date = start or nowdate()
 		task.exp_end_date = end or nowdate()
-		task.project = project or None if is_template else frappe.get_value("Project", {"project_name": "_Test Project"})
+		task.project = (
+			project or None
+			if is_template
+			else frappe.get_value("Project", {"project_name": "_Test Project"})
+		)
 		task.is_template = is_template
 		task.start = begin
 		task.duration = duration
@@ -120,9 +145,7 @@
 		task = frappe.get_doc("Task", subject)
 
 	if depends_on:
-		task.append("depends_on", {
-			"task": depends_on
-		})
+		task.append("depends_on", {"task": depends_on})
 		if save:
 			task.save()
 	return task
diff --git a/erpnext/projects/doctype/timesheet/test_timesheet.py b/erpnext/projects/doctype/timesheet/test_timesheet.py
index 8b60357..57bfd5b 100644
--- a/erpnext/projects/doctype/timesheet/test_timesheet.py
+++ b/erpnext/projects/doctype/timesheet/test_timesheet.py
@@ -27,8 +27,8 @@
 class TestTimesheet(unittest.TestCase):
 	@classmethod
 	def setUpClass(cls):
-		make_earning_salary_component(setup=True, company_list=['_Test Company'])
-		make_deduction_salary_component(setup=True, company_list=['_Test Company'])
+		make_earning_salary_component(setup=True, company_list=["_Test Company"])
+		make_deduction_salary_component(setup=True, company_list=["_Test Company"])
 
 	def setUp(self):
 		for dt in ["Salary Slip", "Salary Structure", "Salary Structure Assignment", "Timesheet"]:
@@ -62,7 +62,7 @@
 		emp = make_employee("test_employee_6@salary.com", company="_Test Company")
 
 		salary_structure = make_salary_structure_for_timesheet(emp)
-		timesheet = make_timesheet(emp, simulate = True, is_billable=1)
+		timesheet = make_timesheet(emp, simulate=True, is_billable=1)
 		salary_slip = make_salary_slip(timesheet.name)
 		salary_slip.submit()
 
@@ -73,27 +73,27 @@
 		self.assertEqual(salary_slip.timesheets[0].time_sheet, timesheet.name)
 		self.assertEqual(salary_slip.timesheets[0].working_hours, 2)
 
-		timesheet = frappe.get_doc('Timesheet', timesheet.name)
-		self.assertEqual(timesheet.status, 'Payslip')
+		timesheet = frappe.get_doc("Timesheet", timesheet.name)
+		self.assertEqual(timesheet.status, "Payslip")
 		salary_slip.cancel()
 
-		timesheet = frappe.get_doc('Timesheet', timesheet.name)
-		self.assertEqual(timesheet.status, 'Submitted')
+		timesheet = frappe.get_doc("Timesheet", timesheet.name)
+		self.assertEqual(timesheet.status, "Submitted")
 
 	def test_sales_invoice_from_timesheet(self):
 		emp = make_employee("test_employee_6@salary.com")
 
 		timesheet = make_timesheet(emp, simulate=True, is_billable=1)
-		sales_invoice = make_sales_invoice(timesheet.name, '_Test Item', '_Test Customer')
+		sales_invoice = make_sales_invoice(timesheet.name, "_Test Item", "_Test Customer")
 		sales_invoice.due_date = nowdate()
 		sales_invoice.submit()
-		timesheet = frappe.get_doc('Timesheet', timesheet.name)
+		timesheet = frappe.get_doc("Timesheet", timesheet.name)
 		self.assertEqual(sales_invoice.total_billing_amount, 100)
-		self.assertEqual(timesheet.status, 'Billed')
-		self.assertEqual(sales_invoice.customer, '_Test Customer')
+		self.assertEqual(timesheet.status, "Billed")
+		self.assertEqual(sales_invoice.customer, "_Test Customer")
 
 		item = sales_invoice.items[0]
-		self.assertEqual(item.item_code, '_Test Item')
+		self.assertEqual(item.item_code, "_Test Item")
 		self.assertEqual(item.qty, 2.00)
 		self.assertEqual(item.rate, 50.00)
 
@@ -101,19 +101,21 @@
 		emp = make_employee("test_employee_6@salary.com")
 		project = frappe.get_value("Project", {"project_name": "_Test Project"})
 
-		timesheet = make_timesheet(emp, simulate=True, is_billable=1, project=project, company='_Test Company')
+		timesheet = make_timesheet(
+			emp, simulate=True, is_billable=1, project=project, company="_Test Company"
+		)
 		sales_invoice = create_sales_invoice(do_not_save=True)
 		sales_invoice.project = project
 		sales_invoice.submit()
 
-		ts = frappe.get_doc('Timesheet', timesheet.name)
+		ts = frappe.get_doc("Timesheet", timesheet.name)
 		self.assertEqual(ts.per_billed, 100)
 		self.assertEqual(ts.time_logs[0].sales_invoice, sales_invoice.name)
 
 	def test_timesheet_time_overlap(self):
 		emp = make_employee("test_employee_6@salary.com")
 
-		settings = frappe.get_single('Projects Settings')
+		settings = frappe.get_single("Projects Settings")
 		initial_setting = settings.ignore_employee_time_overlap
 		settings.ignore_employee_time_overlap = 0
 		settings.save()
@@ -122,24 +124,24 @@
 		timesheet = frappe.new_doc("Timesheet")
 		timesheet.employee = emp
 		timesheet.append(
-			'time_logs',
+			"time_logs",
 			{
 				"billable": 1,
 				"activity_type": "_Test Activity Type",
 				"from_time": now_datetime(),
 				"to_time": now_datetime() + datetime.timedelta(hours=3),
-				"company": "_Test Company"
-			}
+				"company": "_Test Company",
+			},
 		)
 		timesheet.append(
-			'time_logs',
+			"time_logs",
 			{
 				"billable": 1,
 				"activity_type": "_Test Activity Type",
 				"from_time": now_datetime(),
 				"to_time": now_datetime() + datetime.timedelta(hours=3),
-				"company": "_Test Company"
-			}
+				"company": "_Test Company",
+			},
 		)
 
 		self.assertRaises(frappe.ValidationError, timesheet.save)
@@ -158,27 +160,27 @@
 		timesheet = frappe.new_doc("Timesheet")
 		timesheet.employee = emp
 		timesheet.append(
-			'time_logs',
+			"time_logs",
 			{
 				"billable": 1,
 				"activity_type": "_Test Activity Type",
 				"from_time": now_datetime(),
 				"to_time": now_datetime() + datetime.timedelta(hours=3),
-				"company": "_Test Company"
-			}
+				"company": "_Test Company",
+			},
 		)
 		timesheet.append(
-			'time_logs',
+			"time_logs",
 			{
 				"billable": 1,
 				"activity_type": "_Test Activity Type",
 				"from_time": now_datetime() + datetime.timedelta(hours=3),
 				"to_time": now_datetime() + datetime.timedelta(hours=4),
-				"company": "_Test Company"
-			}
+				"company": "_Test Company",
+			},
 		)
 
-		timesheet.save() # should not throw an error
+		timesheet.save()  # should not throw an error
 
 	def test_to_time(self):
 		emp = make_employee("test_employee_6@salary.com")
@@ -187,14 +189,14 @@
 		timesheet = frappe.new_doc("Timesheet")
 		timesheet.employee = emp
 		timesheet.append(
-			'time_logs',
+			"time_logs",
 			{
 				"billable": 1,
 				"activity_type": "_Test Activity Type",
 				"from_time": from_time,
 				"hours": 2,
-				"company": "_Test Company"
-			}
+				"company": "_Test Company",
+			},
 		)
 		timesheet.save()
 
@@ -207,39 +209,51 @@
 	frequency = "Monthly"
 
 	if not frappe.db.exists("Salary Component", "Timesheet Component"):
-		frappe.get_doc({"doctype": "Salary Component", "salary_component": "Timesheet Component"}).insert()
+		frappe.get_doc(
+			{"doctype": "Salary Component", "salary_component": "Timesheet Component"}
+		).insert()
 
-	salary_structure = make_salary_structure(salary_structure_name, frequency, company=company, dont_submit=True)
+	salary_structure = make_salary_structure(
+		salary_structure_name, frequency, company=company, dont_submit=True
+	)
 	salary_structure.salary_component = "Timesheet Component"
 	salary_structure.salary_slip_based_on_timesheet = 1
 	salary_structure.hour_rate = 50.0
 	salary_structure.save()
 	salary_structure.submit()
 
-	if not frappe.db.get_value("Salary Structure Assignment",
-		{'employee':employee, 'docstatus': 1}):
-			frappe.db.set_value('Employee', employee, 'date_of_joining',
-				add_months(nowdate(), -5))
-			create_salary_structure_assignment(employee, salary_structure.name)
+	if not frappe.db.get_value("Salary Structure Assignment", {"employee": employee, "docstatus": 1}):
+		frappe.db.set_value("Employee", employee, "date_of_joining", add_months(nowdate(), -5))
+		create_salary_structure_assignment(employee, salary_structure.name)
 
 	return salary_structure
 
 
-def make_timesheet(employee, simulate=False, is_billable = 0, activity_type="_Test Activity Type", project=None, task=None, company=None):
+def make_timesheet(
+	employee,
+	simulate=False,
+	is_billable=0,
+	activity_type="_Test Activity Type",
+	project=None,
+	task=None,
+	company=None,
+):
 	update_activity_type(activity_type)
 	timesheet = frappe.new_doc("Timesheet")
 	timesheet.employee = employee
-	timesheet.company = company or '_Test Company'
-	timesheet_detail = timesheet.append('time_logs', {})
+	timesheet.company = company or "_Test Company"
+	timesheet_detail = timesheet.append("time_logs", {})
 	timesheet_detail.is_billable = is_billable
 	timesheet_detail.activity_type = activity_type
 	timesheet_detail.from_time = now_datetime()
 	timesheet_detail.hours = 2
-	timesheet_detail.to_time = timesheet_detail.from_time + datetime.timedelta(hours= timesheet_detail.hours)
+	timesheet_detail.to_time = timesheet_detail.from_time + datetime.timedelta(
+		hours=timesheet_detail.hours
+	)
 	timesheet_detail.project = project
 	timesheet_detail.task = task
 
-	for data in timesheet.get('time_logs'):
+	for data in timesheet.get("time_logs"):
 		if simulate:
 			while True:
 				try:
@@ -247,7 +261,7 @@
 					break
 				except OverlapError:
 					data.from_time = data.from_time + datetime.timedelta(minutes=10)
-					data.to_time = data.from_time + datetime.timedelta(hours= data.hours)
+					data.to_time = data.from_time + datetime.timedelta(hours=data.hours)
 		else:
 			timesheet.save(ignore_permissions=True)
 
@@ -255,7 +269,8 @@
 
 	return timesheet
 
+
 def update_activity_type(activity_type):
-	activity_type = frappe.get_doc('Activity Type',activity_type)
+	activity_type = frappe.get_doc("Activity Type", activity_type)
 	activity_type.billing_rate = 50.0
 	activity_type.save(ignore_permissions=True)
diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py
index b44d501..2ef966b 100644
--- a/erpnext/projects/doctype/timesheet/timesheet.py
+++ b/erpnext/projects/doctype/timesheet/timesheet.py
@@ -14,8 +14,13 @@
 from erpnext.setup.utils import get_exchange_rate
 
 
-class OverlapError(frappe.ValidationError): pass
-class OverWorkLoggedError(frappe.ValidationError): pass
+class OverlapError(frappe.ValidationError):
+	pass
+
+
+class OverWorkLoggedError(frappe.ValidationError):
+	pass
+
 
 class Timesheet(Document):
 	def validate(self):
@@ -32,7 +37,7 @@
 
 	def set_employee_name(self):
 		if self.employee and not self.employee_name:
-			self.employee_name = frappe.db.get_value('Employee', self.employee, 'employee_name')
+			self.employee_name = frappe.db.get_value("Employee", self.employee, "employee_name")
 
 	def calculate_total_amounts(self):
 		self.total_hours = 0.0
@@ -70,11 +75,7 @@
 			args.billing_hours = 0
 
 	def set_status(self):
-		self.status = {
-			"0": "Draft",
-			"1": "Submitted",
-			"2": "Cancelled"
-		}[str(self.docstatus or 0)]
+		self.status = {"0": "Draft", "1": "Submitted", "2": "Cancelled"}[str(self.docstatus or 0)]
 
 		if self.per_billed == 100:
 			self.status = "Billed"
@@ -135,7 +136,7 @@
 				frappe.throw(_("To date cannot be before from date"))
 
 	def validate_time_logs(self):
-		for data in self.get('time_logs'):
+		for data in self.get("time_logs"):
 			self.set_to_time(data)
 			self.validate_overlap(data)
 			self.set_project(data)
@@ -150,7 +151,7 @@
 			data.to_time = _to_time
 
 	def validate_overlap(self, data):
-		settings = frappe.get_single('Projects Settings')
+		settings = frappe.get_single("Projects Settings")
 		self.validate_overlap_for("user", data, self.user, settings.ignore_user_time_overlap)
 		self.validate_overlap_for("employee", data, self.employee, settings.ignore_employee_time_overlap)
 
@@ -159,7 +160,11 @@
 
 	def validate_project(self, data):
 		if self.parent_project and self.parent_project != data.project:
-			frappe.throw(_("Row {0}: Project must be same as the one set in the Timesheet: {1}.").format(data.idx, self.parent_project))
+			frappe.throw(
+				_("Row {0}: Project must be same as the one set in the Timesheet: {1}.").format(
+					data.idx, self.parent_project
+				)
+			)
 
 	def validate_overlap_for(self, fieldname, args, value, ignore_validation=False):
 		if not value or ignore_validation:
@@ -167,8 +172,12 @@
 
 		existing = self.get_overlap_for(fieldname, args, value)
 		if existing:
-			frappe.throw(_("Row {0}: From Time and To Time of {1} is overlapping with {2}")
-				.format(args.idx, self.name, existing.name), OverlapError)
+			frappe.throw(
+				_("Row {0}: From Time and To Time of {1} is overlapping with {2}").format(
+					args.idx, self.name, existing.name
+				),
+				OverlapError,
+			)
 
 	def get_overlap_for(self, fieldname, args, value):
 		timesheet = frappe.qb.DocType("Timesheet")
@@ -179,20 +188,22 @@
 
 		existing = (
 			frappe.qb.from_(timesheet)
-				.join(timelog)
-				.on(timelog.parent == timesheet.name)
-				.select(timesheet.name.as_('name'), timelog.from_time.as_('from_time'), timelog.to_time.as_('to_time'))
-				.where(
-					(timelog.name != (args.name or "No Name"))
-					& (timesheet.name != (args.parent or "No Name"))
-					& (timesheet.docstatus < 2)
-					& (timesheet[fieldname] == value)
-					& (
-						((from_time > timelog.from_time) & (from_time < timelog.to_time))
-						| ((to_time > timelog.from_time) & (to_time < timelog.to_time))
-						| ((from_time <= timelog.from_time) & (to_time >= timelog.to_time))
-					)
+			.join(timelog)
+			.on(timelog.parent == timesheet.name)
+			.select(
+				timesheet.name.as_("name"), timelog.from_time.as_("from_time"), timelog.to_time.as_("to_time")
+			)
+			.where(
+				(timelog.name != (args.name or "No Name"))
+				& (timesheet.name != (args.parent or "No Name"))
+				& (timesheet.docstatus < 2)
+				& (timesheet[fieldname] == value)
+				& (
+					((from_time > timelog.from_time) & (from_time < timelog.to_time))
+					| ((to_time > timelog.from_time) & (to_time < timelog.to_time))
+					| ((from_time <= timelog.from_time) & (to_time >= timelog.to_time))
 				)
+			)
 		).run(as_dict=True)
 
 		if self.check_internal_overlap(fieldname, args):
@@ -202,8 +213,7 @@
 
 	def check_internal_overlap(self, fieldname, args):
 		for time_log in self.time_logs:
-			if not (time_log.from_time and time_log.to_time
-				and args.from_time and args.to_time):
+			if not (time_log.from_time and time_log.to_time and args.from_time and args.to_time):
 				continue
 
 			from_time = get_datetime(time_log.from_time)
@@ -211,10 +221,14 @@
 			args_from_time = get_datetime(args.from_time)
 			args_to_time = get_datetime(args.to_time)
 
-			if (args.get(fieldname) == time_log.get(fieldname)) and (args.idx != time_log.idx) and (
-				(args_from_time > from_time and args_from_time < to_time)
-				or (args_to_time > from_time and args_to_time < to_time)
-				or (args_from_time <= from_time and args_to_time >= to_time)
+			if (
+				(args.get(fieldname) == time_log.get(fieldname))
+				and (args.idx != time_log.idx)
+				and (
+					(args_from_time > from_time and args_from_time < to_time)
+					or (args_to_time > from_time and args_to_time < to_time)
+					or (args_from_time <= from_time and args_to_time >= to_time)
+				)
 			):
 				return True
 		return False
@@ -226,8 +240,12 @@
 				hours = data.billing_hours or 0
 				costing_hours = data.billing_hours or data.hours or 0
 				if rate:
-					data.billing_rate = flt(rate.get('billing_rate')) if flt(data.billing_rate) == 0 else data.billing_rate
-					data.costing_rate = flt(rate.get('costing_rate')) if flt(data.costing_rate) == 0 else data.costing_rate
+					data.billing_rate = (
+						flt(rate.get("billing_rate")) if flt(data.billing_rate) == 0 else data.billing_rate
+					)
+					data.costing_rate = (
+						flt(rate.get("costing_rate")) if flt(data.costing_rate) == 0 else data.costing_rate
+					)
 					data.billing_amount = data.billing_rate * hours
 					data.costing_amount = data.costing_rate * costing_hours
 
@@ -235,6 +253,7 @@
 		if not ts_detail.is_billable:
 			ts_detail.billing_rate = 0.0
 
+
 @frappe.whitelist()
 def get_projectwise_timesheet_data(project=None, parent=None, from_time=None, to_time=None):
 	condition = ""
@@ -269,22 +288,22 @@
 		ORDER BY tsd.from_time ASC
 	"""
 
-	filters = {
-		"project": project,
-		"parent": parent,
-		"from_time": from_time,
-		"to_time": to_time
-	}
+	filters = {"project": project, "parent": parent, "from_time": from_time, "to_time": to_time}
 
 	return frappe.db.sql(query, filters, as_dict=1)
 
 
 @frappe.whitelist()
 def get_timesheet_detail_rate(timelog, currency):
-	timelog_detail = frappe.db.sql("""SELECT tsd.billing_amount as billing_amount,
+	timelog_detail = frappe.db.sql(
+		"""SELECT tsd.billing_amount as billing_amount,
 		ts.currency as currency FROM `tabTimesheet Detail` tsd
 		INNER JOIN `tabTimesheet` ts ON ts.name=tsd.parent
-		WHERE tsd.name = '{0}'""".format(timelog), as_dict = 1)[0]
+		WHERE tsd.name = '{0}'""".format(
+			timelog
+		),
+		as_dict=1,
+	)[0]
 
 	if timelog_detail.currency:
 		exchange_rate = get_exchange_rate(timelog_detail.currency, currency)
@@ -292,44 +311,60 @@
 		return timelog_detail.billing_amount * exchange_rate
 	return timelog_detail.billing_amount
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_timesheet(doctype, txt, searchfield, start, page_len, filters):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	condition = ""
 	if filters.get("project"):
 		condition = "and tsd.project = %(project)s"
 
-	return frappe.db.sql("""select distinct tsd.parent from `tabTimesheet Detail` tsd,
+	return frappe.db.sql(
+		"""select distinct tsd.parent from `tabTimesheet Detail` tsd,
 			`tabTimesheet` ts where
 			ts.status in ('Submitted', 'Payslip') and tsd.parent = ts.name and
 			tsd.docstatus = 1 and ts.total_billable_amount > 0
 			and tsd.parent LIKE %(txt)s {condition}
-			order by tsd.parent limit %(start)s, %(page_len)s"""
-			.format(condition=condition), {
-				'txt': '%' + txt + '%',
-				"start": start, "page_len": page_len, 'project': filters.get("project")
-			})
+			order by tsd.parent limit %(start)s, %(page_len)s""".format(
+			condition=condition
+		),
+		{
+			"txt": "%" + txt + "%",
+			"start": start,
+			"page_len": page_len,
+			"project": filters.get("project"),
+		},
+	)
+
 
 @frappe.whitelist()
 def get_timesheet_data(name, project):
 	data = None
-	if project and project!='':
+	if project and project != "":
 		data = get_projectwise_timesheet_data(project, name)
 	else:
-		data = frappe.get_all('Timesheet',
-			fields = ["(total_billable_amount - total_billed_amount) as billing_amt", "total_billable_hours as billing_hours"], filters = {'name': name})
+		data = frappe.get_all(
+			"Timesheet",
+			fields=[
+				"(total_billable_amount - total_billed_amount) as billing_amt",
+				"total_billable_hours as billing_hours",
+			],
+			filters={"name": name},
+		)
 	return {
-		'billing_hours': data[0].billing_hours if data else None,
-		'billing_amount': data[0].billing_amt if data else None,
-		'timesheet_detail': data[0].name if data and project and project!= '' else None
+		"billing_hours": data[0].billing_hours if data else None,
+		"billing_amount": data[0].billing_amt if data else None,
+		"timesheet_detail": data[0].name if data and project and project != "" else None,
 	}
 
+
 @frappe.whitelist()
 def make_sales_invoice(source_name, item_code=None, customer=None, currency=None):
 	target = frappe.new_doc("Sales Invoice")
-	timesheet = frappe.get_doc('Timesheet', source_name)
+	timesheet = frappe.get_doc("Timesheet", source_name)
 
 	if not timesheet.total_billable_hours:
 		frappe.throw(_("Invoice can't be made for zero billing hour"))
@@ -349,28 +384,28 @@
 		target.currency = currency
 
 	if item_code:
-		target.append('items', {
-			'item_code': item_code,
-			'qty': hours,
-			'rate': billing_rate
-		})
+		target.append("items", {"item_code": item_code, "qty": hours, "rate": billing_rate})
 
 	for time_log in timesheet.time_logs:
 		if time_log.is_billable:
-			target.append('timesheets', {
-				'time_sheet': timesheet.name,
-				'billing_hours': time_log.billing_hours,
-				'billing_amount': time_log.billing_amount,
-				'timesheet_detail': time_log.name,
-				'activity_type': time_log.activity_type,
-				'description': time_log.description
-			})
+			target.append(
+				"timesheets",
+				{
+					"time_sheet": timesheet.name,
+					"billing_hours": time_log.billing_hours,
+					"billing_amount": time_log.billing_amount,
+					"timesheet_detail": time_log.name,
+					"activity_type": time_log.activity_type,
+					"description": time_log.description,
+				},
+			)
 
 	target.run_method("calculate_billing_amount_for_timesheet")
 	target.run_method("set_missing_values")
 
 	return target
 
+
 @frappe.whitelist()
 def make_salary_slip(source_name, target_doc=None):
 	target = frappe.new_doc("Salary Slip")
@@ -379,8 +414,9 @@
 
 	return target
 
+
 def set_missing_values(time_sheet, target):
-	doc = frappe.get_doc('Timesheet', time_sheet)
+	doc = frappe.get_doc("Timesheet", time_sheet)
 	target.employee = doc.employee
 	target.employee_name = doc.employee_name
 	target.salary_slip_based_on_timesheet = 1
@@ -388,26 +424,33 @@
 	target.end_date = doc.end_date
 	target.posting_date = doc.modified
 	target.total_working_hours = doc.total_hours
-	target.append('timesheets', {
-		'time_sheet': doc.name,
-		'working_hours': doc.total_hours
-	})
+	target.append("timesheets", {"time_sheet": doc.name, "working_hours": doc.total_hours})
+
 
 @frappe.whitelist()
 def get_activity_cost(employee=None, activity_type=None, currency=None):
-	base_currency = frappe.defaults.get_global_default('currency')
-	rate = frappe.db.get_values("Activity Cost", {"employee": employee,
-		"activity_type": activity_type}, ["costing_rate", "billing_rate"], as_dict=True)
+	base_currency = frappe.defaults.get_global_default("currency")
+	rate = frappe.db.get_values(
+		"Activity Cost",
+		{"employee": employee, "activity_type": activity_type},
+		["costing_rate", "billing_rate"],
+		as_dict=True,
+	)
 	if not rate:
-		rate = frappe.db.get_values("Activity Type", {"activity_type": activity_type},
-			["costing_rate", "billing_rate"], as_dict=True)
-		if rate and currency and currency!=base_currency:
+		rate = frappe.db.get_values(
+			"Activity Type",
+			{"activity_type": activity_type},
+			["costing_rate", "billing_rate"],
+			as_dict=True,
+		)
+		if rate and currency and currency != base_currency:
 			exchange_rate = get_exchange_rate(base_currency, currency)
 			rate[0]["costing_rate"] = rate[0]["costing_rate"] * exchange_rate
 			rate[0]["billing_rate"] = rate[0]["billing_rate"] * exchange_rate
 
 	return rate[0] if rate else {}
 
+
 @frappe.whitelist()
 def get_events(start, end, filters=None):
 	"""Returns events for Gantt / Calendar view rendering.
@@ -417,9 +460,11 @@
 	"""
 	filters = json.loads(filters)
 	from frappe.desk.calendar import get_event_conditions
+
 	conditions = get_event_conditions("Timesheet", filters)
 
-	return frappe.db.sql("""select `tabTimesheet Detail`.name as name,
+	return frappe.db.sql(
+		"""select `tabTimesheet Detail`.name as name,
 			`tabTimesheet Detail`.docstatus as status, `tabTimesheet Detail`.parent as parent,
 			from_time as start_date, hours, activity_type,
 			`tabTimesheet Detail`.project, to_time as end_date,
@@ -428,29 +473,37 @@
 		where `tabTimesheet Detail`.parent = `tabTimesheet`.name
 			and `tabTimesheet`.docstatus < 2
 			and (from_time <= %(end)s and to_time >= %(start)s) {conditions} {match_cond}
-		""".format(conditions=conditions, match_cond = get_match_cond('Timesheet')),
-		{
-			"start": start,
-			"end": end
-		}, as_dict=True, update={"allDay": 0})
+		""".format(
+			conditions=conditions, match_cond=get_match_cond("Timesheet")
+		),
+		{"start": start, "end": end},
+		as_dict=True,
+		update={"allDay": 0},
+	)
 
-def get_timesheets_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"):
+
+def get_timesheets_list(
+	doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"
+):
 	user = frappe.session.user
 	# find customer name from contact.
-	customer = ''
+	customer = ""
 	timesheets = []
 
-	contact = frappe.db.exists('Contact', {'user': user})
+	contact = frappe.db.exists("Contact", {"user": user})
 	if contact:
 		# find customer
-		contact = frappe.get_doc('Contact', contact)
-		customer = contact.get_link_for('Customer')
+		contact = frappe.get_doc("Contact", contact)
+		customer = contact.get_link_for("Customer")
 
 	if customer:
-		sales_invoices = [d.name for d in frappe.get_all('Sales Invoice', filters={'customer': customer})] or [None]
-		projects = [d.name for d in frappe.get_all('Project', filters={'customer': customer})]
+		sales_invoices = [
+			d.name for d in frappe.get_all("Sales Invoice", filters={"customer": customer})
+		] or [None]
+		projects = [d.name for d in frappe.get_all("Project", filters={"customer": customer})]
 		# Return timesheet related data to web portal.
-		timesheets = frappe.db.sql('''
+		timesheets = frappe.db.sql(
+			"""
 			SELECT
 				ts.name, tsd.activity_type, ts.status, ts.total_billable_hours,
 				COALESCE(ts.sales_invoice, tsd.sales_invoice) AS sales_invoice, tsd.project
@@ -463,16 +516,22 @@
 				)
 			ORDER BY `end_date` ASC
 			LIMIT {0}, {1}
-		'''.format(limit_start, limit_page_length), dict(sales_invoices=sales_invoices, projects=projects), as_dict=True) #nosec
+		""".format(
+				limit_start, limit_page_length
+			),
+			dict(sales_invoices=sales_invoices, projects=projects),
+			as_dict=True,
+		)  # nosec
 
 	return timesheets
 
+
 def get_list_context(context=None):
 	return {
 		"show_sidebar": True,
 		"show_search": True,
-		'no_breadcrumbs': True,
+		"no_breadcrumbs": True,
 		"title": _("Timesheets"),
 		"get_list": get_timesheets_list,
-		"row_template": "templates/includes/timesheet/timesheet_row.html"
+		"row_template": "templates/includes/timesheet/timesheet_row.html",
 	}
diff --git a/erpnext/projects/doctype/timesheet/timesheet_dashboard.py b/erpnext/projects/doctype/timesheet/timesheet_dashboard.py
index 15fe797..6d6b57b 100644
--- a/erpnext/projects/doctype/timesheet/timesheet_dashboard.py
+++ b/erpnext/projects/doctype/timesheet/timesheet_dashboard.py
@@ -3,11 +3,6 @@
 
 def get_data():
 	return {
-		'fieldname': 'time_sheet',
-		'transactions': [
-			{
-				'label': _('References'),
-				'items': ['Sales Invoice', 'Salary Slip']
-			}
-		]
+		"fieldname": "time_sheet",
+		"transactions": [{"label": _("References"), "items": ["Sales Invoice", "Salary Slip"]}],
 	}
diff --git a/erpnext/projects/report/billing_summary.py b/erpnext/projects/report/billing_summary.py
index 46479d0..bc8f2af 100644
--- a/erpnext/projects/report/billing_summary.py
+++ b/erpnext/projects/report/billing_summary.py
@@ -2,7 +2,6 @@
 # For license information, please see license.txt
 
 
-
 import frappe
 from frappe import _
 from frappe.utils import flt, time_diff_in_hours
@@ -15,52 +14,45 @@
 			"fieldtype": "Link",
 			"fieldname": "employee",
 			"options": "Employee",
-			"width": 300
+			"width": 300,
 		},
 		{
 			"label": _("Employee Name"),
 			"fieldtype": "data",
 			"fieldname": "employee_name",
 			"hidden": 1,
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Timesheet"),
 			"fieldtype": "Link",
 			"fieldname": "timesheet",
 			"options": "Timesheet",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Working Hours"),
-			"fieldtype": "Float",
-			"fieldname": "total_hours",
-			"width": 150
-		},
+		{"label": _("Working Hours"), "fieldtype": "Float", "fieldname": "total_hours", "width": 150},
 		{
 			"label": _("Billable Hours"),
 			"fieldtype": "Float",
 			"fieldname": "total_billable_hours",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Billing Amount"),
-			"fieldtype": "Currency",
-			"fieldname": "amount",
-			"width": 150
-		}
+		{"label": _("Billing Amount"), "fieldtype": "Currency", "fieldname": "amount", "width": 150},
 	]
 
+
 def get_data(filters):
 	data = []
-	if(filters.from_date > filters.to_date):
+	if filters.from_date > filters.to_date:
 		frappe.msgprint(_("From Date can not be greater than To Date"))
 		return data
 
 	timesheets = get_timesheets(filters)
 
 	filters.from_date = frappe.utils.get_datetime(filters.from_date)
-	filters.to_date = frappe.utils.add_to_date(frappe.utils.get_datetime(filters.to_date), days=1, seconds=-1)
+	filters.to_date = frappe.utils.add_to_date(
+		frappe.utils.get_datetime(filters.to_date), days=1, seconds=-1
+	)
 
 	timesheet_details = get_timesheet_details(filters, timesheets.keys())
 
@@ -88,46 +80,58 @@
 			total_amount += billing_duration * flt(row.billing_rate)
 
 		if total_hours:
-			data.append({
-				"employee": timesheets.get(ts).employee,
-				"employee_name": timesheets.get(ts).employee_name,
-				"timesheet": ts,
-				"total_billable_hours": total_billing_hours,
-				"total_hours": total_hours,
-				"amount": total_amount
-			})
+			data.append(
+				{
+					"employee": timesheets.get(ts).employee,
+					"employee_name": timesheets.get(ts).employee_name,
+					"timesheet": ts,
+					"total_billable_hours": total_billing_hours,
+					"total_hours": total_hours,
+					"amount": total_amount,
+				}
+			)
 
 	return data
 
+
 def get_timesheets(filters):
 	record_filters = [
-			["start_date", "<=", filters.to_date],
-			["end_date", ">=", filters.from_date],
-			["docstatus", "=", 1]
-		]
+		["start_date", "<=", filters.to_date],
+		["end_date", ">=", filters.from_date],
+		["docstatus", "=", 1],
+	]
 
 	if "employee" in filters:
 		record_filters.append(["employee", "=", filters.employee])
 
-	timesheets = frappe.get_all("Timesheet", filters=record_filters, fields=["employee", "employee_name", "name"])
+	timesheets = frappe.get_all(
+		"Timesheet", filters=record_filters, fields=["employee", "employee_name", "name"]
+	)
 	timesheet_map = frappe._dict()
 	for d in timesheets:
 		timesheet_map.setdefault(d.name, d)
 
 	return timesheet_map
 
+
 def get_timesheet_details(filters, timesheet_list):
-	timesheet_details_filter = {
-		"parent": ["in", timesheet_list]
-	}
+	timesheet_details_filter = {"parent": ["in", timesheet_list]}
 
 	if "project" in filters:
 		timesheet_details_filter["project"] = filters.project
 
 	timesheet_details = frappe.get_all(
 		"Timesheet Detail",
-		filters = timesheet_details_filter,
-		fields=["from_time", "to_time", "hours", "is_billable", "billing_hours", "billing_rate", "parent"]
+		filters=timesheet_details_filter,
+		fields=[
+			"from_time",
+			"to_time",
+			"hours",
+			"is_billable",
+			"billing_hours",
+			"billing_rate",
+			"parent",
+		],
 	)
 
 	timesheet_details_map = frappe._dict()
@@ -136,6 +140,7 @@
 
 	return timesheet_details_map
 
+
 def get_billable_and_total_duration(activity, start_time, end_time):
 	precision = frappe.get_precision("Timesheet Detail", "hours")
 	activity_duration = time_diff_in_hours(end_time, start_time)
diff --git a/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py b/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py
index f733768..b31a063 100644
--- a/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py
+++ b/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py
@@ -20,21 +20,37 @@
 
 	return columns, data
 
+
 def get_column():
-	return [_("Timesheet") + ":Link/Timesheet:120", _("Employee") + "::150", _("Employee Name") + "::150",
-		_("From Datetime") + "::140", _("To Datetime") + "::140", _("Hours") + "::70",
-		_("Activity Type") + "::120", _("Task") + ":Link/Task:150",
-		_("Project") + ":Link/Project:120", _("Status") + "::70"]
+	return [
+		_("Timesheet") + ":Link/Timesheet:120",
+		_("Employee") + "::150",
+		_("Employee Name") + "::150",
+		_("From Datetime") + "::140",
+		_("To Datetime") + "::140",
+		_("Hours") + "::70",
+		_("Activity Type") + "::120",
+		_("Task") + ":Link/Task:150",
+		_("Project") + ":Link/Project:120",
+		_("Status") + "::70",
+	]
+
 
 def get_data(conditions, filters):
-	time_sheet = frappe.db.sql(""" select `tabTimesheet`.name, `tabTimesheet`.employee, `tabTimesheet`.employee_name,
+	time_sheet = frappe.db.sql(
+		""" select `tabTimesheet`.name, `tabTimesheet`.employee, `tabTimesheet`.employee_name,
 		`tabTimesheet Detail`.from_time, `tabTimesheet Detail`.to_time, `tabTimesheet Detail`.hours,
 		`tabTimesheet Detail`.activity_type, `tabTimesheet Detail`.task, `tabTimesheet Detail`.project,
 		`tabTimesheet`.status from `tabTimesheet Detail`, `tabTimesheet` where
-		`tabTimesheet Detail`.parent = `tabTimesheet`.name and %s order by `tabTimesheet`.name"""%(conditions), filters, as_list=1)
+		`tabTimesheet Detail`.parent = `tabTimesheet`.name and %s order by `tabTimesheet`.name"""
+		% (conditions),
+		filters,
+		as_list=1,
+	)
 
 	return time_sheet
 
+
 def get_conditions(filters):
 	conditions = "`tabTimesheet`.docstatus = 1"
 	if filters.get("from_date"):
diff --git a/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py b/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py
index 3ab2bb6..5c3dc2d 100644
--- a/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py
+++ b/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py
@@ -13,14 +13,24 @@
 	charts = get_chart_data(data)
 	return columns, data, None, charts
 
+
 def get_data(filters):
 	conditions = get_conditions(filters)
-	tasks = frappe.get_all("Task",
-			filters = conditions,
-			fields = ["name", "subject", "exp_start_date", "exp_end_date",
-					"status", "priority", "completed_on", "progress"],
-			order_by="creation"
-		)
+	tasks = frappe.get_all(
+		"Task",
+		filters=conditions,
+		fields=[
+			"name",
+			"subject",
+			"exp_start_date",
+			"exp_end_date",
+			"status",
+			"priority",
+			"completed_on",
+			"progress",
+		],
+		order_by="creation",
+	)
 	for task in tasks:
 		if task.exp_end_date:
 			if task.completed_on:
@@ -39,6 +49,7 @@
 	tasks.sort(key=lambda x: x["delay"], reverse=True)
 	return tasks
 
+
 def get_conditions(filters):
 	conditions = frappe._dict()
 	keys = ["priority", "status"]
@@ -51,6 +62,7 @@
 		conditions.exp_start_date = ["<=", filters.get("to_date")]
 	return conditions
 
+
 def get_chart_data(data):
 	delay, on_track = 0, 0
 	for entry in data:
@@ -61,74 +73,29 @@
 	charts = {
 		"data": {
 			"labels": ["On Track", "Delayed"],
-			"datasets": [
-				{
-					"name": "Delayed",
-					"values": [on_track, delay]
-				}
-			]
+			"datasets": [{"name": "Delayed", "values": [on_track, delay]}],
 		},
 		"type": "percentage",
-		"colors": ["#84D5BA", "#CB4B5F"]
+		"colors": ["#84D5BA", "#CB4B5F"],
 	}
 	return charts
 
+
 def get_columns():
 	columns = [
-		{
-			"fieldname": "name",
-			"fieldtype": "Link",
-			"label": "Task",
-			"options": "Task",
-			"width": 150
-		},
-		{
-			"fieldname": "subject",
-			"fieldtype": "Data",
-			"label": "Subject",
-			"width": 200
-		},
-		{
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"label": "Status",
-			"width": 100
-		},
-		{
-			"fieldname": "priority",
-			"fieldtype": "Data",
-			"label": "Priority",
-			"width": 80
-		},
-		{
-			"fieldname": "progress",
-			"fieldtype": "Data",
-			"label": "Progress (%)",
-			"width": 120
-		},
+		{"fieldname": "name", "fieldtype": "Link", "label": "Task", "options": "Task", "width": 150},
+		{"fieldname": "subject", "fieldtype": "Data", "label": "Subject", "width": 200},
+		{"fieldname": "status", "fieldtype": "Data", "label": "Status", "width": 100},
+		{"fieldname": "priority", "fieldtype": "Data", "label": "Priority", "width": 80},
+		{"fieldname": "progress", "fieldtype": "Data", "label": "Progress (%)", "width": 120},
 		{
 			"fieldname": "exp_start_date",
 			"fieldtype": "Date",
 			"label": "Expected Start Date",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"fieldname": "exp_end_date",
-			"fieldtype": "Date",
-			"label": "Expected End Date",
-			"width": 150
-		},
-		{
-			"fieldname": "completed_on",
-			"fieldtype": "Date",
-			"label": "Actual End Date",
-			"width": 130
-		},
-		{
-			"fieldname": "delay",
-			"fieldtype": "Data",
-			"label": "Delay (In Days)",
-			"width": 120
-		}
+		{"fieldname": "exp_end_date", "fieldtype": "Date", "label": "Expected End Date", "width": 150},
+		{"fieldname": "completed_on", "fieldtype": "Date", "label": "Actual End Date", "width": 130},
+		{"fieldname": "delay", "fieldtype": "Data", "label": "Delay (In Days)", "width": 120},
 	]
 	return columns
diff --git a/erpnext/projects/report/delayed_tasks_summary/test_delayed_tasks_summary.py b/erpnext/projects/report/delayed_tasks_summary/test_delayed_tasks_summary.py
index e2ba7c2..91a0607 100644
--- a/erpnext/projects/report/delayed_tasks_summary/test_delayed_tasks_summary.py
+++ b/erpnext/projects/report/delayed_tasks_summary/test_delayed_tasks_summary.py
@@ -18,25 +18,17 @@
 		task1.save()
 
 	def test_delayed_tasks_summary(self):
-		filters = frappe._dict({
-			"from_date": add_months(nowdate(), -1),
-			"to_date": nowdate(),
-			"priority": "Low",
-			"status": "Open"
-		})
-		expected_data = [
+		filters = frappe._dict(
 			{
-				"subject": "_Test Task 99",
+				"from_date": add_months(nowdate(), -1),
+				"to_date": nowdate(),
+				"priority": "Low",
 				"status": "Open",
-				"priority": "Low",
-				"delay": 1
-			},
-			{
-				"subject": "_Test Task 98",
-				"status": "Completed",
-				"priority": "Low",
-				"delay": -1
 			}
+		)
+		expected_data = [
+			{"subject": "_Test Task 99", "status": "Open", "priority": "Low", "delay": 1},
+			{"subject": "_Test Task 98", "status": "Completed", "priority": "Low", "delay": -1},
 		]
 		report = execute(filters)
 		data = list(filter(lambda x: x.subject == "_Test Task 99", report[1]))[0]
diff --git a/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/employee_hours_utilization_based_on_timesheet.py b/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/employee_hours_utilization_based_on_timesheet.py
index dd4f8ea..a89e6f0 100644
--- a/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/employee_hours_utilization_based_on_timesheet.py
+++ b/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/employee_hours_utilization_based_on_timesheet.py
@@ -10,8 +10,10 @@
 def execute(filters=None):
 	return EmployeeHoursReport(filters).run()
 
+
 class EmployeeHoursReport:
-	'''Employee Hours Utilization Report Based On Timesheet'''
+	"""Employee Hours Utilization Report Based On Timesheet"""
+
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
 
@@ -25,13 +27,17 @@
 		self.day_span = (self.to_date - self.from_date).days
 
 		if self.day_span <= 0:
-			frappe.throw(_('From Date must come before To Date'))
+			frappe.throw(_("From Date must come before To Date"))
 
 	def validate_standard_working_hours(self):
-		self.standard_working_hours = frappe.db.get_single_value('HR Settings', 'standard_working_hours')
+		self.standard_working_hours = frappe.db.get_single_value("HR Settings", "standard_working_hours")
 		if not self.standard_working_hours:
-			msg = _('The metrics for this report are calculated based on the Standard Working Hours. Please set {0} in {1}.').format(
-				frappe.bold('Standard Working Hours'), frappe.utils.get_link_to_form('HR Settings', 'HR Settings'))
+			msg = _(
+				"The metrics for this report are calculated based on the Standard Working Hours. Please set {0} in {1}."
+			).format(
+				frappe.bold("Standard Working Hours"),
+				frappe.utils.get_link_to_form("HR Settings", "HR Settings"),
+			)
 
 			frappe.throw(msg)
 
@@ -46,55 +52,50 @@
 	def generate_columns(self):
 		self.columns = [
 			{
-				'label': _('Employee'),
-				'options': 'Employee',
-				'fieldname': 'employee',
-				'fieldtype': 'Link',
-				'width': 230
+				"label": _("Employee"),
+				"options": "Employee",
+				"fieldname": "employee",
+				"fieldtype": "Link",
+				"width": 230,
 			},
 			{
-				'label': _('Department'),
-				'options': 'Department',
-				'fieldname': 'department',
-				'fieldtype': 'Link',
-				'width': 120
+				"label": _("Department"),
+				"options": "Department",
+				"fieldname": "department",
+				"fieldtype": "Link",
+				"width": 120,
+			},
+			{"label": _("Total Hours (T)"), "fieldname": "total_hours", "fieldtype": "Float", "width": 120},
+			{
+				"label": _("Billed Hours (B)"),
+				"fieldname": "billed_hours",
+				"fieldtype": "Float",
+				"width": 170,
 			},
 			{
-				'label': _('Total Hours (T)'),
-				'fieldname': 'total_hours',
-				'fieldtype': 'Float',
-				'width': 120
+				"label": _("Non-Billed Hours (NB)"),
+				"fieldname": "non_billed_hours",
+				"fieldtype": "Float",
+				"width": 170,
 			},
 			{
-				'label': _('Billed Hours (B)'),
-				'fieldname': 'billed_hours',
-				'fieldtype': 'Float',
-				'width': 170
+				"label": _("Untracked Hours (U)"),
+				"fieldname": "untracked_hours",
+				"fieldtype": "Float",
+				"width": 170,
 			},
 			{
-				'label': _('Non-Billed Hours (NB)'),
-				'fieldname': 'non_billed_hours',
-				'fieldtype': 'Float',
-				'width': 170
+				"label": _("% Utilization (B + NB) / T"),
+				"fieldname": "per_util",
+				"fieldtype": "Percentage",
+				"width": 200,
 			},
 			{
-				'label': _('Untracked Hours (U)'),
-				'fieldname': 'untracked_hours',
-				'fieldtype': 'Float',
-				'width': 170
+				"label": _("% Utilization (B / T)"),
+				"fieldname": "per_util_billed_only",
+				"fieldtype": "Percentage",
+				"width": 200,
 			},
-			{
-				'label': _('% Utilization (B + NB) / T'),
-				'fieldname': 'per_util',
-				'fieldtype': 'Percentage',
-				'width': 200
-			},
-			{
-				'label': _('% Utilization (B / T)'),
-				'fieldname': 'per_util_billed_only',
-				'fieldtype': 'Percentage',
-				'width': 200
-			}
 		]
 
 	def generate_data(self):
@@ -111,35 +112,36 @@
 
 		for emp, data in self.stats_by_employee.items():
 			row = frappe._dict()
-			row['employee'] = emp
+			row["employee"] = emp
 			row.update(data)
 			self.data.append(row)
 
 		#  Sort by descending order of percentage utilization
-		self.data.sort(key=lambda x: x['per_util'], reverse=True)
+		self.data.sort(key=lambda x: x["per_util"], reverse=True)
 
 	def filter_stats_by_department(self):
 		filtered_data = frappe._dict()
 		for emp, data in self.stats_by_employee.items():
-			if data['department'] == self.filters.department:
+			if data["department"] == self.filters.department:
 				filtered_data[emp] = data
 
 		# Update stats
 		self.stats_by_employee = filtered_data
 
 	def generate_filtered_time_logs(self):
-		additional_filters = ''
+		additional_filters = ""
 
-		filter_fields = ['employee', 'project', 'company']
+		filter_fields = ["employee", "project", "company"]
 
 		for field in filter_fields:
 			if self.filters.get(field):
-				if field == 'project':
+				if field == "project":
 					additional_filters += f"AND ttd.{field} = '{self.filters.get(field)}'"
 				else:
 					additional_filters += f"AND tt.{field} = '{self.filters.get(field)}'"
 
-		self.filtered_time_logs = frappe.db.sql('''
+		self.filtered_time_logs = frappe.db.sql(
+			"""
 			SELECT tt.employee AS employee, ttd.hours AS hours, ttd.is_billable AS is_billable, ttd.project AS project
 			FROM `tabTimesheet Detail` AS ttd
 			JOIN `tabTimesheet` AS tt
@@ -148,47 +150,46 @@
 			AND tt.start_date BETWEEN '{0}' AND '{1}'
 			AND tt.end_date BETWEEN '{0}' AND '{1}'
 			{2}
-		'''.format(self.filters.from_date, self.filters.to_date, additional_filters))
+		""".format(
+				self.filters.from_date, self.filters.to_date, additional_filters
+			)
+		)
 
 	def generate_stats_by_employee(self):
 		self.stats_by_employee = frappe._dict()
 
 		for emp, hours, is_billable, project in self.filtered_time_logs:
-			self.stats_by_employee.setdefault(
-				emp, frappe._dict()
-			).setdefault('billed_hours', 0.0)
+			self.stats_by_employee.setdefault(emp, frappe._dict()).setdefault("billed_hours", 0.0)
 
-			self.stats_by_employee[emp].setdefault('non_billed_hours', 0.0)
+			self.stats_by_employee[emp].setdefault("non_billed_hours", 0.0)
 
 			if is_billable:
-				self.stats_by_employee[emp]['billed_hours'] += flt(hours, 2)
+				self.stats_by_employee[emp]["billed_hours"] += flt(hours, 2)
 			else:
-				self.stats_by_employee[emp]['non_billed_hours'] += flt(hours, 2)
+				self.stats_by_employee[emp]["non_billed_hours"] += flt(hours, 2)
 
 	def set_employee_department_and_name(self):
 		for emp in self.stats_by_employee:
-			emp_name = frappe.db.get_value(
-				'Employee', emp, 'employee_name'
-			)
-			emp_dept = frappe.db.get_value(
-				'Employee', emp, 'department'
-			)
+			emp_name = frappe.db.get_value("Employee", emp, "employee_name")
+			emp_dept = frappe.db.get_value("Employee", emp, "department")
 
-			self.stats_by_employee[emp]['department'] = emp_dept
-			self.stats_by_employee[emp]['employee_name'] = emp_name
+			self.stats_by_employee[emp]["department"] = emp_dept
+			self.stats_by_employee[emp]["employee_name"] = emp_name
 
 	def calculate_utilizations(self):
 		TOTAL_HOURS = flt(self.standard_working_hours * self.day_span, 2)
 		for emp, data in self.stats_by_employee.items():
-			data['total_hours'] = TOTAL_HOURS
-			data['untracked_hours'] = flt(TOTAL_HOURS - data['billed_hours'] - data['non_billed_hours'], 2)
+			data["total_hours"] = TOTAL_HOURS
+			data["untracked_hours"] = flt(TOTAL_HOURS - data["billed_hours"] - data["non_billed_hours"], 2)
 
 			# To handle overtime edge-case
-			if data['untracked_hours'] < 0:
-				data['untracked_hours'] = 0.0
+			if data["untracked_hours"] < 0:
+				data["untracked_hours"] = 0.0
 
-			data['per_util'] = flt(((data['billed_hours'] + data['non_billed_hours']) / TOTAL_HOURS) * 100, 2)
-			data['per_util_billed_only'] = flt((data['billed_hours'] / TOTAL_HOURS) * 100, 2)
+			data["per_util"] = flt(
+				((data["billed_hours"] + data["non_billed_hours"]) / TOTAL_HOURS) * 100, 2
+			)
+			data["per_util_billed_only"] = flt((data["billed_hours"] / TOTAL_HOURS) * 100, 2)
 
 	def generate_report_summary(self):
 		self.report_summary = []
@@ -202,11 +203,11 @@
 		total_untracked = 0.0
 
 		for row in self.data:
-			avg_utilization += row['per_util']
-			avg_utilization_billed_only += row['per_util_billed_only']
-			total_billed += row['billed_hours']
-			total_non_billed += row['non_billed_hours']
-			total_untracked += row['untracked_hours']
+			avg_utilization += row["per_util"]
+			avg_utilization_billed_only += row["per_util_billed_only"]
+			total_billed += row["billed_hours"]
+			total_non_billed += row["non_billed_hours"]
+			total_untracked += row["untracked_hours"]
 
 		avg_utilization /= len(self.data)
 		avg_utilization = flt(avg_utilization, 2)
@@ -217,27 +218,19 @@
 		THRESHOLD_PERCENTAGE = 70.0
 		self.report_summary = [
 			{
-				'value': f'{avg_utilization}%',
-				'indicator': 'Red' if avg_utilization < THRESHOLD_PERCENTAGE else 'Green',
-				'label': _('Avg Utilization'),
-				'datatype': 'Percentage'
+				"value": f"{avg_utilization}%",
+				"indicator": "Red" if avg_utilization < THRESHOLD_PERCENTAGE else "Green",
+				"label": _("Avg Utilization"),
+				"datatype": "Percentage",
 			},
 			{
-				'value': f'{avg_utilization_billed_only}%',
-				'indicator': 'Red' if avg_utilization_billed_only < THRESHOLD_PERCENTAGE else 'Green',
-				'label': _('Avg Utilization (Billed Only)'),
-				'datatype': 'Percentage'
+				"value": f"{avg_utilization_billed_only}%",
+				"indicator": "Red" if avg_utilization_billed_only < THRESHOLD_PERCENTAGE else "Green",
+				"label": _("Avg Utilization (Billed Only)"),
+				"datatype": "Percentage",
 			},
-			{
-				'value': total_billed,
-				'label': _('Total Billed Hours'),
-				'datatype': 'Float'
-			},
-			{
-				'value': total_non_billed,
-				'label': _('Total Non-Billed Hours'),
-				'datatype': 'Float'
-			}
+			{"value": total_billed, "label": _("Total Billed Hours"), "datatype": "Float"},
+			{"value": total_non_billed, "label": _("Total Non-Billed Hours"), "datatype": "Float"},
 		]
 
 	def generate_chart_data(self):
@@ -248,33 +241,21 @@
 		non_billed_hours = []
 		untracked_hours = []
 
-
 		for row in self.data:
-			labels.append(row.get('employee_name'))
-			billed_hours.append(row.get('billed_hours'))
-			non_billed_hours.append(row.get('non_billed_hours'))
-			untracked_hours.append(row.get('untracked_hours'))
+			labels.append(row.get("employee_name"))
+			billed_hours.append(row.get("billed_hours"))
+			non_billed_hours.append(row.get("non_billed_hours"))
+			untracked_hours.append(row.get("untracked_hours"))
 
 		self.chart = {
-			'data': {
-				'labels': labels[:30],
-				'datasets': [
-					{
-						'name': _('Billed Hours'),
-						'values': billed_hours[:30]
-					},
-					{
-						'name': _('Non-Billed Hours'),
-						'values': non_billed_hours[:30]
-					},
-					{
-						'name': _('Untracked Hours'),
-						'values': untracked_hours[:30]
-					}
-				]
+			"data": {
+				"labels": labels[:30],
+				"datasets": [
+					{"name": _("Billed Hours"), "values": billed_hours[:30]},
+					{"name": _("Non-Billed Hours"), "values": non_billed_hours[:30]},
+					{"name": _("Untracked Hours"), "values": untracked_hours[:30]},
+				],
 			},
-			'type': 'bar',
-			'barOptions': {
-				'stacked': True
-			}
+			"type": "bar",
+			"barOptions": {"stacked": True},
 		}
diff --git a/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py b/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py
index b500bc8..4cddc4a 100644
--- a/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py
+++ b/erpnext/projects/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py
@@ -11,191 +11,189 @@
 
 
 class TestEmployeeUtilization(unittest.TestCase):
-    @classmethod
-    def setUpClass(cls):
-        # Create test employee
-        cls.test_emp1 = make_employee("test1@employeeutil.com", "_Test Company")
-        cls.test_emp2 = make_employee("test2@employeeutil.com", "_Test Company")
+	@classmethod
+	def setUpClass(cls):
+		# Create test employee
+		cls.test_emp1 = make_employee("test1@employeeutil.com", "_Test Company")
+		cls.test_emp2 = make_employee("test2@employeeutil.com", "_Test Company")
 
-        # Create test project
-        cls.test_project = make_project({"project_name": "_Test Project"})
+		# Create test project
+		cls.test_project = make_project({"project_name": "_Test Project"})
 
-        # Create test timesheets
-        cls.create_test_timesheets()
+		# Create test timesheets
+		cls.create_test_timesheets()
 
-        frappe.db.set_value("HR Settings", "HR Settings", "standard_working_hours", 9)
+		frappe.db.set_value("HR Settings", "HR Settings", "standard_working_hours", 9)
 
-    @classmethod
-    def create_test_timesheets(cls):
-        timesheet1 = frappe.new_doc("Timesheet")
-        timesheet1.employee = cls.test_emp1
-        timesheet1.company = '_Test Company'
+	@classmethod
+	def create_test_timesheets(cls):
+		timesheet1 = frappe.new_doc("Timesheet")
+		timesheet1.employee = cls.test_emp1
+		timesheet1.company = "_Test Company"
 
-        timesheet1.append("time_logs", {
-            "activity_type": get_random("Activity Type"),
-            "hours": 5,
-            "is_billable": 1,
-            "from_time": '2021-04-01 13:30:00.000000',
-            "to_time": '2021-04-01 18:30:00.000000'
-        })
+		timesheet1.append(
+			"time_logs",
+			{
+				"activity_type": get_random("Activity Type"),
+				"hours": 5,
+				"is_billable": 1,
+				"from_time": "2021-04-01 13:30:00.000000",
+				"to_time": "2021-04-01 18:30:00.000000",
+			},
+		)
 
-        timesheet1.save()
-        timesheet1.submit()
+		timesheet1.save()
+		timesheet1.submit()
 
-        timesheet2 = frappe.new_doc("Timesheet")
-        timesheet2.employee = cls.test_emp2
-        timesheet2.company = '_Test Company'
+		timesheet2 = frappe.new_doc("Timesheet")
+		timesheet2.employee = cls.test_emp2
+		timesheet2.company = "_Test Company"
 
-        timesheet2.append("time_logs", {
-            "activity_type": get_random("Activity Type"),
-            "hours": 10,
-            "is_billable": 0,
-            "from_time": '2021-04-01 13:30:00.000000',
-            "to_time": '2021-04-01 23:30:00.000000',
-            "project": cls.test_project.name
-        })
+		timesheet2.append(
+			"time_logs",
+			{
+				"activity_type": get_random("Activity Type"),
+				"hours": 10,
+				"is_billable": 0,
+				"from_time": "2021-04-01 13:30:00.000000",
+				"to_time": "2021-04-01 23:30:00.000000",
+				"project": cls.test_project.name,
+			},
+		)
 
-        timesheet2.save()
-        timesheet2.submit()
+		timesheet2.save()
+		timesheet2.submit()
 
-    @classmethod
-    def tearDownClass(cls):
-        # Delete time logs
-        frappe.db.sql("""
+	@classmethod
+	def tearDownClass(cls):
+		# Delete time logs
+		frappe.db.sql(
+			"""
             DELETE FROM `tabTimesheet Detail`
             WHERE parent IN (
                 SELECT name
                 FROM `tabTimesheet`
                 WHERE company = '_Test Company'
             )
-        """)
+        """
+		)
 
-        frappe.db.sql("DELETE FROM `tabTimesheet` WHERE company='_Test Company'")
-        frappe.db.sql(f"DELETE FROM `tabProject` WHERE name='{cls.test_project.name}'")
+		frappe.db.sql("DELETE FROM `tabTimesheet` WHERE company='_Test Company'")
+		frappe.db.sql(f"DELETE FROM `tabProject` WHERE name='{cls.test_project.name}'")
 
-    def test_utilization_report_with_required_filters_only(self):
-        filters = {
-            "company": "_Test Company",
-            "from_date": "2021-04-01",
-            "to_date": "2021-04-03"
-        }
+	def test_utilization_report_with_required_filters_only(self):
+		filters = {"company": "_Test Company", "from_date": "2021-04-01", "to_date": "2021-04-03"}
 
-        report = execute(filters)
+		report = execute(filters)
 
-        expected_data = self.get_expected_data_for_test_employees()
-        self.assertEqual(report[1], expected_data)
+		expected_data = self.get_expected_data_for_test_employees()
+		self.assertEqual(report[1], expected_data)
 
-    def test_utilization_report_for_single_employee(self):
-        filters = {
-            "company": "_Test Company",
-            "from_date": "2021-04-01",
-            "to_date": "2021-04-03",
-            "employee": self.test_emp1
-        }
+	def test_utilization_report_for_single_employee(self):
+		filters = {
+			"company": "_Test Company",
+			"from_date": "2021-04-01",
+			"to_date": "2021-04-03",
+			"employee": self.test_emp1,
+		}
 
-        report = execute(filters)
+		report = execute(filters)
 
-        emp1_data = frappe.get_doc('Employee', self.test_emp1)
-        expected_data = [
-            {
-                'employee': self.test_emp1,
-                'employee_name': 'test1@employeeutil.com',
-                'billed_hours': 5.0,
-                'non_billed_hours': 0.0,
-                'department': emp1_data.department,
-                'total_hours': 18.0,
-                'untracked_hours': 13.0,
-                'per_util': 27.78,
-                'per_util_billed_only': 27.78
-            }
-        ]
+		emp1_data = frappe.get_doc("Employee", self.test_emp1)
+		expected_data = [
+			{
+				"employee": self.test_emp1,
+				"employee_name": "test1@employeeutil.com",
+				"billed_hours": 5.0,
+				"non_billed_hours": 0.0,
+				"department": emp1_data.department,
+				"total_hours": 18.0,
+				"untracked_hours": 13.0,
+				"per_util": 27.78,
+				"per_util_billed_only": 27.78,
+			}
+		]
 
-        self.assertEqual(report[1], expected_data)
+		self.assertEqual(report[1], expected_data)
 
-    def test_utilization_report_for_project(self):
-        filters = {
-            "company": "_Test Company",
-            "from_date": "2021-04-01",
-            "to_date": "2021-04-03",
-            "project": self.test_project.name
-        }
+	def test_utilization_report_for_project(self):
+		filters = {
+			"company": "_Test Company",
+			"from_date": "2021-04-01",
+			"to_date": "2021-04-03",
+			"project": self.test_project.name,
+		}
 
-        report = execute(filters)
+		report = execute(filters)
 
-        emp2_data = frappe.get_doc('Employee', self.test_emp2)
-        expected_data = [
-            {
-                'employee': self.test_emp2,
-                'employee_name': 'test2@employeeutil.com',
-                'billed_hours': 0.0,
-                'non_billed_hours': 10.0,
-                'department': emp2_data.department,
-                'total_hours': 18.0,
-                'untracked_hours': 8.0,
-                'per_util': 55.56,
-                'per_util_billed_only': 0.0
-            }
-        ]
+		emp2_data = frappe.get_doc("Employee", self.test_emp2)
+		expected_data = [
+			{
+				"employee": self.test_emp2,
+				"employee_name": "test2@employeeutil.com",
+				"billed_hours": 0.0,
+				"non_billed_hours": 10.0,
+				"department": emp2_data.department,
+				"total_hours": 18.0,
+				"untracked_hours": 8.0,
+				"per_util": 55.56,
+				"per_util_billed_only": 0.0,
+			}
+		]
 
-        self.assertEqual(report[1], expected_data)
+		self.assertEqual(report[1], expected_data)
 
-    def test_utilization_report_for_department(self):
-        emp1_data = frappe.get_doc('Employee', self.test_emp1)
-        filters = {
-            "company": "_Test Company",
-            "from_date": "2021-04-01",
-            "to_date": "2021-04-03",
-            "department": emp1_data.department
-        }
+	def test_utilization_report_for_department(self):
+		emp1_data = frappe.get_doc("Employee", self.test_emp1)
+		filters = {
+			"company": "_Test Company",
+			"from_date": "2021-04-01",
+			"to_date": "2021-04-03",
+			"department": emp1_data.department,
+		}
 
-        report = execute(filters)
+		report = execute(filters)
 
-        expected_data = self.get_expected_data_for_test_employees()
-        self.assertEqual(report[1], expected_data)
+		expected_data = self.get_expected_data_for_test_employees()
+		self.assertEqual(report[1], expected_data)
 
-    def test_report_summary_data(self):
-        filters = {
-            "company": "_Test Company",
-            "from_date": "2021-04-01",
-            "to_date": "2021-04-03"
-        }
+	def test_report_summary_data(self):
+		filters = {"company": "_Test Company", "from_date": "2021-04-01", "to_date": "2021-04-03"}
 
-        report = execute(filters)
-        summary = report[4]
-        expected_summary_values = ['41.67%', '13.89%', 5.0, 10.0]
+		report = execute(filters)
+		summary = report[4]
+		expected_summary_values = ["41.67%", "13.89%", 5.0, 10.0]
 
-        self.assertEqual(len(summary), 4)
+		self.assertEqual(len(summary), 4)
 
-        for i in range(4):
-            self.assertEqual(
-                summary[i]['value'], expected_summary_values[i]
-            )
+		for i in range(4):
+			self.assertEqual(summary[i]["value"], expected_summary_values[i])
 
-    def get_expected_data_for_test_employees(self):
-        emp1_data = frappe.get_doc('Employee', self.test_emp1)
-        emp2_data = frappe.get_doc('Employee', self.test_emp2)
+	def get_expected_data_for_test_employees(self):
+		emp1_data = frappe.get_doc("Employee", self.test_emp1)
+		emp2_data = frappe.get_doc("Employee", self.test_emp2)
 
-        return [
-            {
-                'employee': self.test_emp2,
-                'employee_name': 'test2@employeeutil.com',
-                'billed_hours': 0.0,
-                'non_billed_hours': 10.0,
-                'department': emp2_data.department,
-                'total_hours': 18.0,
-                'untracked_hours': 8.0,
-                'per_util': 55.56,
-                'per_util_billed_only': 0.0
-            },
-            {
-                'employee': self.test_emp1,
-                'employee_name': 'test1@employeeutil.com',
-                'billed_hours': 5.0,
-                'non_billed_hours': 0.0,
-                'department': emp1_data.department,
-                'total_hours': 18.0,
-                'untracked_hours': 13.0,
-                'per_util': 27.78,
-                'per_util_billed_only': 27.78
-            }
-        ]
+		return [
+			{
+				"employee": self.test_emp2,
+				"employee_name": "test2@employeeutil.com",
+				"billed_hours": 0.0,
+				"non_billed_hours": 10.0,
+				"department": emp2_data.department,
+				"total_hours": 18.0,
+				"untracked_hours": 8.0,
+				"per_util": 55.56,
+				"per_util_billed_only": 0.0,
+			},
+			{
+				"employee": self.test_emp1,
+				"employee_name": "test1@employeeutil.com",
+				"billed_hours": 5.0,
+				"non_billed_hours": 0.0,
+				"department": emp1_data.department,
+				"total_hours": 18.0,
+				"untracked_hours": 13.0,
+				"per_util": 27.78,
+				"per_util_billed_only": 27.78,
+			},
+		]
diff --git a/erpnext/projects/report/project_profitability/project_profitability.py b/erpnext/projects/report/project_profitability/project_profitability.py
index 23c3b82..abbbaf5 100644
--- a/erpnext/projects/report/project_profitability/project_profitability.py
+++ b/erpnext/projects/report/project_profitability/project_profitability.py
@@ -12,17 +12,23 @@
 	charts = get_chart_data(data)
 	return columns, data, None, charts
 
+
 def get_data(filters):
 	data = get_rows(filters)
 	data = calculate_cost_and_profit(data)
 	return data
 
+
 def get_rows(filters):
 	conditions = get_conditions(filters)
 	standard_working_hours = frappe.db.get_single_value("HR Settings", "standard_working_hours")
 	if not standard_working_hours:
-		msg = _("The metrics for this report are calculated based on the Standard Working Hours. Please set {0} in {1}.").format(
-			frappe.bold("Standard Working Hours"), frappe.utils.get_link_to_form("HR Settings", "HR Settings"))
+		msg = _(
+			"The metrics for this report are calculated based on the Standard Working Hours. Please set {0} in {1}."
+		).format(
+			frappe.bold("Standard Working Hours"),
+			frappe.utils.get_link_to_form("HR Settings", "HR Settings"),
+		)
 
 		frappe.msgprint(msg)
 		return []
@@ -43,12 +49,17 @@
 						`tabSalary Slip Timesheet` as sst join `tabTimesheet` on tabTimesheet.name = sst.time_sheet
 						join `tabSales Invoice Timesheet` as sit on sit.time_sheet = tabTimesheet.name
 						join `tabSales Invoice` as si on si.name = sit.parent and si.status != "Cancelled"
-						join `tabSalary Slip` as ss on ss.name = sst.parent and ss.status != "Cancelled" """.format(standard_working_hours)
+						join `tabSalary Slip` as ss on ss.name = sst.parent and ss.status != "Cancelled" """.format(
+		standard_working_hours
+	)
 	if conditions:
 		sql += """
 				WHERE
-					{0}) as t""".format(conditions)
-	return frappe.db.sql(sql,filters, as_dict=True)
+					{0}) as t""".format(
+			conditions
+		)
+	return frappe.db.sql(sql, filters, as_dict=True)
+
 
 def calculate_cost_and_profit(data):
 	for row in data:
@@ -56,6 +67,7 @@
 		row.profit = flt(row.base_grand_total) - flt(row.base_gross_pay) * flt(row.utilization)
 	return data
 
+
 def get_conditions(filters):
 	conditions = []
 
@@ -75,11 +87,14 @@
 		conditions.append("tabTimesheet.employee={0}".format(frappe.db.escape(filters.get("employee"))))
 
 	if filters.get("project"):
-		conditions.append("tabTimesheet.parent_project={0}".format(frappe.db.escape(filters.get("project"))))
+		conditions.append(
+			"tabTimesheet.parent_project={0}".format(frappe.db.escape(filters.get("project")))
+		)
 
 	conditions = " and ".join(conditions)
 	return conditions
 
+
 def get_chart_data(data):
 	if not data:
 		return None
@@ -92,20 +107,13 @@
 		utilization.append(entry.get("utilization"))
 
 	charts = {
-		"data": {
-			"labels": labels,
-			"datasets": [
-				{
-					"name": "Utilization",
-					"values": utilization
-				}
-			]
-		},
+		"data": {"labels": labels, "datasets": [{"name": "Utilization", "values": utilization}]},
 		"type": "bar",
-		"colors": ["#84BDD5"]
+		"colors": ["#84BDD5"],
 	}
 	return charts
 
+
 def get_columns():
 	return [
 		{
@@ -113,98 +121,78 @@
 			"label": _("Customer"),
 			"fieldtype": "Link",
 			"options": "Customer",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"fieldname": "employee",
 			"label": _("Employee"),
 			"fieldtype": "Link",
 			"options": "Employee",
-			"width": 130
+			"width": 130,
 		},
-		{
-			"fieldname": "employee_name",
-			"label": _("Employee Name"),
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"fieldname": "employee_name", "label": _("Employee Name"), "fieldtype": "Data", "width": 120},
 		{
 			"fieldname": "voucher_no",
 			"label": _("Sales Invoice"),
 			"fieldtype": "Link",
 			"options": "Sales Invoice",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "timesheet",
 			"label": _("Timesheet"),
 			"fieldtype": "Link",
 			"options": "Timesheet",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "project",
 			"label": _("Project"),
 			"fieldtype": "Link",
 			"options": "Project",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"fieldname": "base_grand_total",
 			"label": _("Bill Amount"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"fieldname": "base_gross_pay",
 			"label": _("Cost"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"fieldname": "profit",
 			"label": _("Profit"),
 			"fieldtype": "Currency",
 			"options": "currency",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"fieldname": "utilization",
-			"label": _("Utilization"),
-			"fieldtype": "Percentage",
-			"width": 100
-		},
+		{"fieldname": "utilization", "label": _("Utilization"), "fieldtype": "Percentage", "width": 100},
 		{
 			"fieldname": "fractional_cost",
 			"label": _("Fractional Cost"),
 			"fieldtype": "Int",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "total_billed_hours",
 			"label": _("Total Billed Hours"),
 			"fieldtype": "Int",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"fieldname": "start_date",
-			"label": _("Start Date"),
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"fieldname": "end_date",
-			"label": _("End Date"),
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"fieldname": "start_date", "label": _("Start Date"), "fieldtype": "Date", "width": 100},
+		{"fieldname": "end_date", "label": _("End Date"), "fieldtype": "Date", "width": 100},
 		{
 			"label": _("Currency"),
 			"fieldname": "currency",
 			"fieldtype": "Link",
 			"options": "Currency",
-			"width": 80
-		}
+			"width": 80,
+		},
 	]
diff --git a/erpnext/projects/report/project_profitability/test_project_profitability.py b/erpnext/projects/report/project_profitability/test_project_profitability.py
index 3ca28c1..91a5447 100644
--- a/erpnext/projects/report/project_profitability/test_project_profitability.py
+++ b/erpnext/projects/report/project_profitability/test_project_profitability.py
@@ -13,13 +13,15 @@
 
 class TestProjectProfitability(FrappeTestCase):
 	def setUp(self):
-		frappe.db.sql('delete from `tabTimesheet`')
-		emp = make_employee('test_employee_9@salary.com', company='_Test Company')
+		frappe.db.sql("delete from `tabTimesheet`")
+		emp = make_employee("test_employee_9@salary.com", company="_Test Company")
 
-		if not frappe.db.exists('Salary Component', 'Timesheet Component'):
-			frappe.get_doc({'doctype': 'Salary Component', 'salary_component': 'Timesheet Component'}).insert()
+		if not frappe.db.exists("Salary Component", "Timesheet Component"):
+			frappe.get_doc(
+				{"doctype": "Salary Component", "salary_component": "Timesheet Component"}
+			).insert()
 
-		make_salary_structure_for_timesheet(emp, company='_Test Company')
+		make_salary_structure_for_timesheet(emp, company="_Test Company")
 		date = getdate()
 
 		self.timesheet = make_timesheet(emp, is_billable=1)
@@ -28,21 +30,21 @@
 
 		holidays = self.salary_slip.get_holidays_for_employee(date, date)
 		if holidays:
-			frappe.db.set_value('Payroll Settings', None, 'include_holidays_in_total_working_days', 1)
+			frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1)
 
 		self.salary_slip.submit()
-		self.sales_invoice = make_sales_invoice(self.timesheet.name, '_Test Item', '_Test Customer')
+		self.sales_invoice = make_sales_invoice(self.timesheet.name, "_Test Item", "_Test Customer")
 		self.sales_invoice.due_date = date
 		self.sales_invoice.submit()
 
-		frappe.db.set_value('HR Settings', None, 'standard_working_hours', 8)
-		frappe.db.set_value('Payroll Settings', None, 'include_holidays_in_total_working_days', 0)
+		frappe.db.set_value("HR Settings", None, "standard_working_hours", 8)
+		frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0)
 
 	def test_project_profitability(self):
 		filters = {
-			'company': '_Test Company',
-			'start_date': add_days(self.timesheet.start_date, -3),
-			'end_date': self.timesheet.start_date
+			"company": "_Test Company",
+			"start_date": add_days(self.timesheet.start_date, -3),
+			"end_date": self.timesheet.start_date,
 		}
 
 		report = execute(filters)
@@ -58,7 +60,9 @@
 		self.assertEqual(self.salary_slip.total_working_days, row.total_working_days)
 
 		standard_working_hours = frappe.db.get_single_value("HR Settings", "standard_working_hours")
-		utilization = timesheet.total_billed_hours/(self.salary_slip.total_working_days * standard_working_hours)
+		utilization = timesheet.total_billed_hours / (
+			self.salary_slip.total_working_days * standard_working_hours
+		)
 		self.assertEqual(utilization, row.utilization)
 
 		profit = self.sales_invoice.base_grand_total - self.salary_slip.base_gross_pay * utilization
diff --git a/erpnext/projects/report/project_summary/project_summary.py b/erpnext/projects/report/project_summary/project_summary.py
index ce1b701..606c0c2 100644
--- a/erpnext/projects/report/project_summary/project_summary.py
+++ b/erpnext/projects/report/project_summary/project_summary.py
@@ -10,18 +10,35 @@
 	columns = get_columns()
 	data = []
 
-	data = frappe.db.get_all("Project", filters=filters, fields=["name", 'status', "percent_complete", "expected_start_date", "expected_end_date", "project_type"], order_by="expected_end_date")
+	data = frappe.db.get_all(
+		"Project",
+		filters=filters,
+		fields=[
+			"name",
+			"status",
+			"percent_complete",
+			"expected_start_date",
+			"expected_end_date",
+			"project_type",
+		],
+		order_by="expected_end_date",
+	)
 
 	for project in data:
 		project["total_tasks"] = frappe.db.count("Task", filters={"project": project.name})
-		project["completed_tasks"] = frappe.db.count("Task", filters={"project": project.name, "status": "Completed"})
-		project["overdue_tasks"] = frappe.db.count("Task", filters={"project": project.name, "status": "Overdue"})
+		project["completed_tasks"] = frappe.db.count(
+			"Task", filters={"project": project.name, "status": "Completed"}
+		)
+		project["overdue_tasks"] = frappe.db.count(
+			"Task", filters={"project": project.name, "status": "Overdue"}
+		)
 
 	chart = get_chart_data(data)
 	report_summary = get_report_summary(data)
 
 	return columns, data, None, chart, report_summary
 
+
 def get_columns():
 	return [
 		{
@@ -29,59 +46,35 @@
 			"label": _("Project"),
 			"fieldtype": "Link",
 			"options": "Project",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"fieldname": "project_type",
 			"label": _("Type"),
 			"fieldtype": "Link",
 			"options": "Project Type",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"fieldname": "status",
-			"label": _("Status"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "total_tasks",
-			"label": _("Total Tasks"),
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"fieldname": "status", "label": _("Status"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "total_tasks", "label": _("Total Tasks"), "fieldtype": "Data", "width": 120},
 		{
 			"fieldname": "completed_tasks",
 			"label": _("Tasks Completed"),
 			"fieldtype": "Data",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"fieldname": "overdue_tasks",
-			"label": _("Tasks Overdue"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "percent_complete",
-			"label": _("Completion"),
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"fieldname": "overdue_tasks", "label": _("Tasks Overdue"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "percent_complete", "label": _("Completion"), "fieldtype": "Data", "width": 120},
 		{
 			"fieldname": "expected_start_date",
 			"label": _("Start Date"),
 			"fieldtype": "Date",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"fieldname": "expected_end_date",
-			"label": _("End Date"),
-			"fieldtype": "Date",
-			"width": 120
-		},
+		{"fieldname": "expected_end_date", "label": _("End Date"), "fieldtype": "Date", "width": 120},
 	]
 
+
 def get_chart_data(data):
 	labels = []
 	total = []
@@ -96,29 +89,19 @@
 
 	return {
 		"data": {
-			'labels': labels[:30],
-			'datasets': [
-				{
-					"name": "Overdue",
-					"values": overdue[:30]
-				},
-				{
-					"name": "Completed",
-					"values": completed[:30]
-				},
-				{
-					"name": "Total Tasks",
-					"values": total[:30]
-				},
-			]
+			"labels": labels[:30],
+			"datasets": [
+				{"name": "Overdue", "values": overdue[:30]},
+				{"name": "Completed", "values": completed[:30]},
+				{"name": "Total Tasks", "values": total[:30]},
+			],
 		},
 		"type": "bar",
 		"colors": ["#fc4f51", "#78d6ff", "#7575ff"],
-		"barOptions": {
-			"stacked": True
-		}
+		"barOptions": {"stacked": True},
 	}
 
+
 def get_report_summary(data):
 	if not data:
 		return None
@@ -152,5 +135,5 @@
 			"indicator": "Green" if total_overdue == 0 else "Red",
 			"label": _("Overdue Tasks"),
 			"datatype": "Int",
-		}
+		},
 	]
diff --git a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
index 31bcc3b..da609ca 100644
--- a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
+++ b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
@@ -14,29 +14,56 @@
 
 	data = []
 	for project in proj_details:
-		data.append([project.name, pr_item_map.get(project.name, 0),
-			se_item_map.get(project.name, 0), dn_item_map.get(project.name, 0),
-			project.project_name, project.status, project.company,
-			project.customer, project.estimated_costing, project.expected_start_date,
-			project.expected_end_date])
+		data.append(
+			[
+				project.name,
+				pr_item_map.get(project.name, 0),
+				se_item_map.get(project.name, 0),
+				dn_item_map.get(project.name, 0),
+				project.project_name,
+				project.status,
+				project.company,
+				project.customer,
+				project.estimated_costing,
+				project.expected_start_date,
+				project.expected_end_date,
+			]
+		)
 
 	return columns, data
 
+
 def get_columns():
-	return [_("Project Id") + ":Link/Project:140", _("Cost of Purchased Items") + ":Currency:160",
-		_("Cost of Issued Items") + ":Currency:160", _("Cost of Delivered Items") + ":Currency:160",
-		_("Project Name") + "::120", _("Project Status") + "::120", _("Company") + ":Link/Company:100",
-		_("Customer") + ":Link/Customer:140", _("Project Value") + ":Currency:120",
-		_("Project Start Date") + ":Date:120", _("Completion Date") + ":Date:120"]
+	return [
+		_("Project Id") + ":Link/Project:140",
+		_("Cost of Purchased Items") + ":Currency:160",
+		_("Cost of Issued Items") + ":Currency:160",
+		_("Cost of Delivered Items") + ":Currency:160",
+		_("Project Name") + "::120",
+		_("Project Status") + "::120",
+		_("Company") + ":Link/Company:100",
+		_("Customer") + ":Link/Customer:140",
+		_("Project Value") + ":Currency:120",
+		_("Project Start Date") + ":Date:120",
+		_("Completion Date") + ":Date:120",
+	]
+
 
 def get_project_details():
-	return frappe.db.sql(""" select name, project_name, status, company, customer, estimated_costing,
-		expected_start_date, expected_end_date from tabProject where docstatus < 2""", as_dict=1)
+	return frappe.db.sql(
+		""" select name, project_name, status, company, customer, estimated_costing,
+		expected_start_date, expected_end_date from tabProject where docstatus < 2""",
+		as_dict=1,
+	)
+
 
 def get_purchased_items_cost():
-	pr_items = frappe.db.sql("""select project, sum(base_net_amount) as amount
+	pr_items = frappe.db.sql(
+		"""select project, sum(base_net_amount) as amount
 		from `tabPurchase Receipt Item` where ifnull(project, '') != ''
-		and docstatus = 1 group by project""", as_dict=1)
+		and docstatus = 1 group by project""",
+		as_dict=1,
+	)
 
 	pr_item_map = {}
 	for item in pr_items:
@@ -44,11 +71,15 @@
 
 	return pr_item_map
 
+
 def get_issued_items_cost():
-	se_items = frappe.db.sql("""select se.project, sum(se_item.amount) as amount
+	se_items = frappe.db.sql(
+		"""select se.project, sum(se_item.amount) as amount
 		from `tabStock Entry` se, `tabStock Entry Detail` se_item
 		where se.name = se_item.parent and se.docstatus = 1 and ifnull(se_item.t_warehouse, '') = ''
-		and ifnull(se.project, '') != '' group by se.project""", as_dict=1)
+		and ifnull(se.project, '') != '' group by se.project""",
+		as_dict=1,
+	)
 
 	se_item_map = {}
 	for item in se_items:
@@ -56,18 +87,24 @@
 
 	return se_item_map
 
+
 def get_delivered_items_cost():
-	dn_items = frappe.db.sql("""select dn.project, sum(dn_item.base_net_amount) as amount
+	dn_items = frappe.db.sql(
+		"""select dn.project, sum(dn_item.base_net_amount) as amount
 		from `tabDelivery Note` dn, `tabDelivery Note Item` dn_item
 		where dn.name = dn_item.parent and dn.docstatus = 1 and ifnull(dn.project, '') != ''
-		group by dn.project""", as_dict=1)
+		group by dn.project""",
+		as_dict=1,
+	)
 
-	si_items = frappe.db.sql("""select si.project, sum(si_item.base_net_amount) as amount
+	si_items = frappe.db.sql(
+		"""select si.project, sum(si_item.base_net_amount) as amount
 		from `tabSales Invoice` si, `tabSales Invoice Item` si_item
 		where si.name = si_item.parent and si.docstatus = 1 and si.update_stock = 1
 		and si.is_pos = 1 and ifnull(si.project, '') != ''
-		group by si.project""", as_dict=1)
-
+		group by si.project""",
+		as_dict=1,
+	)
 
 	dn_item_map = {}
 	for item in dn_items:
diff --git a/erpnext/projects/utils.py b/erpnext/projects/utils.py
index 5d74550..000ea66 100644
--- a/erpnext/projects/utils.py
+++ b/erpnext/projects/utils.py
@@ -17,14 +17,15 @@
 	match_conditions = build_match_conditions("Task")
 	match_conditions = ("and" + match_conditions) if match_conditions else ""
 
-	return frappe.db.sql("""select name, subject from `tabTask`
+	return frappe.db.sql(
+		"""select name, subject from `tabTask`
 		where (`%s` like %s or `subject` like %s) %s
 		order by
 			case when `subject` like %s then 0 else 1 end,
 			case when `%s` like %s then 0 else 1 end,
 			`%s`,
 			subject
-		limit %s, %s""" %
-		(searchfield, "%s", "%s", match_conditions, "%s",
-			searchfield, "%s", searchfield, "%s", "%s"),
-		(search_string, search_string, order_by_string, order_by_string, start, page_len))
+		limit %s, %s"""
+		% (searchfield, "%s", "%s", match_conditions, "%s", searchfield, "%s", searchfield, "%s", "%s"),
+		(search_string, search_string, order_by_string, order_by_string, start, page_len),
+	)
diff --git a/erpnext/projects/web_form/tasks/tasks.py b/erpnext/projects/web_form/tasks/tasks.py
index 99249ed..b422973 100644
--- a/erpnext/projects/web_form/tasks/tasks.py
+++ b/erpnext/projects/web_form/tasks/tasks.py
@@ -3,9 +3,13 @@
 
 def get_context(context):
 	if frappe.form_dict.project:
-		context.parents = [{'title': frappe.form_dict.project, 'route': '/projects?project='+ frappe.form_dict.project}]
+		context.parents = [
+			{"title": frappe.form_dict.project, "route": "/projects?project=" + frappe.form_dict.project}
+		]
 		context.success_url = "/projects?project=" + frappe.form_dict.project
 
-	elif context.doc and context.doc.get('project'):
-		context.parents = [{'title': context.doc.project, 'route': '/projects?project='+ context.doc.project}]
+	elif context.doc and context.doc.get("project"):
+		context.parents = [
+			{"title": context.doc.project, "route": "/projects?project=" + context.doc.project}
+		]
 		context.success_url = "/projects?project=" + context.doc.project
diff --git a/erpnext/quality_management/doctype/quality_action/quality_action.py b/erpnext/quality_management/doctype/quality_action/quality_action.py
index 87245f9..f7cd94d 100644
--- a/erpnext/quality_management/doctype/quality_action/quality_action.py
+++ b/erpnext/quality_management/doctype/quality_action/quality_action.py
@@ -7,4 +7,4 @@
 
 class QualityAction(Document):
 	def validate(self):
-		self.status = 'Open' if any([d.status=='Open' for d in self.resolutions]) else 'Completed'
+		self.status = "Open" if any([d.status == "Open" for d in self.resolutions]) else "Completed"
diff --git a/erpnext/quality_management/doctype/quality_feedback/quality_feedback.py b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.py
index ec5d67f..cc8ce26 100644
--- a/erpnext/quality_management/doctype/quality_feedback/quality_feedback.py
+++ b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.py
@@ -9,15 +9,12 @@
 class QualityFeedback(Document):
 	@frappe.whitelist()
 	def set_parameters(self):
-		if self.template and not getattr(self, 'parameters', []):
-			for d in frappe.get_doc('Quality Feedback Template', self.template).parameters:
-				self.append('parameters', dict(
-					parameter = d.parameter,
-					rating = 1
-				))
+		if self.template and not getattr(self, "parameters", []):
+			for d in frappe.get_doc("Quality Feedback Template", self.template).parameters:
+				self.append("parameters", dict(parameter=d.parameter, rating=1))
 
 	def validate(self):
 		if not self.document_name:
-			self.document_type ='User'
+			self.document_type = "User"
 			self.document_name = frappe.session.user
 		self.set_parameters()
diff --git a/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py b/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
index fe36cc6..58d0632 100644
--- a/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
+++ b/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
@@ -8,21 +8,22 @@
 
 class TestQualityFeedback(unittest.TestCase):
 	def test_quality_feedback(self):
-		template = frappe.get_doc(dict(
-			doctype = 'Quality Feedback Template',
-			template = 'Test Template',
-			parameters = [
-				dict(parameter='Test Parameter 1'),
-				dict(parameter='Test Parameter 2')
-			]
-		)).insert()
+		template = frappe.get_doc(
+			dict(
+				doctype="Quality Feedback Template",
+				template="Test Template",
+				parameters=[dict(parameter="Test Parameter 1"), dict(parameter="Test Parameter 2")],
+			)
+		).insert()
 
-		feedback = frappe.get_doc(dict(
-			doctype = 'Quality Feedback',
-			template = template.name,
-			document_type = 'User',
-			document_name = frappe.session.user
-		)).insert()
+		feedback = frappe.get_doc(
+			dict(
+				doctype="Quality Feedback",
+				template=template.name,
+				document_type="User",
+				document_name=frappe.session.user,
+			)
+		).insert()
 
 		self.assertEqual(template.parameters[0].parameter, feedback.parameters[0].parameter)
 
diff --git a/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py b/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
index 67fdaca..40606cd 100644
--- a/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
+++ b/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
@@ -13,12 +13,13 @@
 		self.assertTrue(goal)
 		goal.delete()
 
+
 def get_quality_goal():
-	return frappe.get_doc(dict(
-		doctype = 'Quality Goal',
-		goal = 'Test Quality Module',
-		frequency = 'Daily',
-		objectives = [
-			dict(objective = 'Check test cases', target='100', uom='Percent')
-		]
-	)).insert()
+	return frappe.get_doc(
+		dict(
+			doctype="Quality Goal",
+			goal="Test Quality Module",
+			frequency="Daily",
+			objectives=[dict(objective="Check test cases", target="100", uom="Percent")],
+		)
+	).insert()
diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py
index 0f535ba..72f9e6d 100644
--- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py
+++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py
@@ -8,7 +8,7 @@
 
 
 class QualityProcedure(NestedSet):
-	nsm_parent_field = 'parent_quality_procedure'
+	nsm_parent_field = "parent_quality_procedure"
 
 	def before_save(self):
 		self.check_for_incorrect_child()
@@ -29,14 +29,19 @@
 
 	def on_trash(self):
 		# clear from child table (sub procedures)
-		frappe.db.sql('''update `tabQuality Procedure Process`
-			set `procedure`='' where `procedure`=%s''', self.name)
+		frappe.db.sql(
+			"""update `tabQuality Procedure Process`
+			set `procedure`='' where `procedure`=%s""",
+			self.name,
+		)
 		NestedSet.on_trash(self, allow_root_deletion=True)
 
 	def set_parent(self):
 		for process in self.processes:
 			# Set parent for only those children who don't have a parent
-			has_parent = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure")
+			has_parent = frappe.db.get_value(
+				"Quality Procedure", process.procedure, "parent_quality_procedure"
+			)
 			if not has_parent and process.procedure:
 				frappe.db.set_value(self.doctype, process.procedure, "parent_quality_procedure", self.name)
 
@@ -45,10 +50,17 @@
 			if process.procedure:
 				self.is_group = 1
 				# Check if any child process belongs to another parent.
-				parent_quality_procedure = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure")
+				parent_quality_procedure = frappe.db.get_value(
+					"Quality Procedure", process.procedure, "parent_quality_procedure"
+				)
 				if parent_quality_procedure and parent_quality_procedure != self.name:
-					frappe.throw(_("{0} already has a Parent Procedure {1}.").format(frappe.bold(process.procedure), frappe.bold(parent_quality_procedure)),
-						title=_("Invalid Child Procedure"))
+					frappe.throw(
+						_("{0} already has a Parent Procedure {1}.").format(
+							frappe.bold(process.procedure), frappe.bold(parent_quality_procedure)
+						),
+						title=_("Invalid Child Procedure"),
+					)
+
 
 @frappe.whitelist()
 def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False):
@@ -56,16 +68,23 @@
 		parent = ""
 
 	if parent:
-		parent_procedure = frappe.get_doc('Quality Procedure', parent)
+		parent_procedure = frappe.get_doc("Quality Procedure", parent)
 		# return the list in order
-		return [dict(
-				value=d.procedure,
-				expandable=frappe.db.get_value('Quality Procedure', d.procedure, 'is_group'))
-				for d in parent_procedure.processes if d.procedure
-			]
+		return [
+			dict(
+				value=d.procedure, expandable=frappe.db.get_value("Quality Procedure", d.procedure, "is_group")
+			)
+			for d in parent_procedure.processes
+			if d.procedure
+		]
 	else:
-		return frappe.get_all(doctype, fields=['name as value', 'is_group as expandable'],
-			filters = dict(parent_quality_procedure = parent), order_by='name asc')
+		return frappe.get_all(
+			doctype,
+			fields=["name as value", "is_group as expandable"],
+			filters=dict(parent_quality_procedure=parent),
+			order_by="name asc",
+		)
+
 
 @frappe.whitelist()
 def add_node():
@@ -74,7 +93,7 @@
 	args = frappe.form_dict
 	args = make_tree_args(**args)
 
-	if args.parent_quality_procedure == 'All Quality Procedures':
+	if args.parent_quality_procedure == "All Quality Procedures":
 		args.parent_quality_procedure = None
 
 	return frappe.get_doc(args).insert()
diff --git a/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py
index 6130895..daf7a69 100644
--- a/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py
+++ b/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py
@@ -11,16 +11,21 @@
 class TestQualityProcedure(unittest.TestCase):
 	def test_add_node(self):
 		try:
-			procedure = frappe.get_doc(dict(
-				doctype = 'Quality Procedure',
-				quality_procedure_name = 'Test Procedure 1',
-				processes = [
-					dict(process_description = 'Test Step 1')
-				]
-			)).insert()
+			procedure = frappe.get_doc(
+				dict(
+					doctype="Quality Procedure",
+					quality_procedure_name="Test Procedure 1",
+					processes=[dict(process_description="Test Step 1")],
+				)
+			).insert()
 
-			frappe.form_dict = dict(doctype = 'Quality Procedure', quality_procedure_name = 'Test Child 1',
-				parent_quality_procedure = procedure.name, cmd='test', is_root='false')
+			frappe.form_dict = dict(
+				doctype="Quality Procedure",
+				quality_procedure_name="Test Child 1",
+				parent_quality_procedure=procedure.name,
+				cmd="test",
+				is_root="false",
+			)
 			node = add_node()
 
 			procedure.reload()
@@ -39,12 +44,13 @@
 		finally:
 			procedure.delete()
 
+
 def create_procedure():
-	return frappe.get_doc(dict(
-		doctype = 'Quality Procedure',
-		quality_procedure_name = 'Test Procedure 1',
-		is_group = 1,
-		processes = [
-			dict(process_description = 'Test Step 1')
-		]
-	)).insert()
+	return frappe.get_doc(
+		dict(
+			doctype="Quality Procedure",
+			quality_procedure_name="Test Procedure 1",
+			is_group=1,
+			processes=[dict(process_description="Test Step 1")],
+		)
+	).insert()
diff --git a/erpnext/quality_management/doctype/quality_review/quality_review.py b/erpnext/quality_management/doctype/quality_review/quality_review.py
index b896f8d..f691005 100644
--- a/erpnext/quality_management/doctype/quality_review/quality_review.py
+++ b/erpnext/quality_management/doctype/quality_review/quality_review.py
@@ -10,55 +10,52 @@
 	def validate(self):
 		# fetch targets from goal
 		if not self.reviews:
-			for d in frappe.get_doc('Quality Goal', self.goal).objectives:
-				self.append('reviews', dict(
-					objective = d.objective,
-					target = d.target,
-					uom = d.uom
-				))
+			for d in frappe.get_doc("Quality Goal", self.goal).objectives:
+				self.append("reviews", dict(objective=d.objective, target=d.target, uom=d.uom))
 
 		self.set_status()
 
 	def set_status(self):
 		# if any child item is failed, fail the parent
-		if not len(self.reviews or []) or any([d.status=='Open' for d in self.reviews]):
-			self.status = 'Open'
-		elif any([d.status=='Failed' for d in self.reviews]):
-			self.status = 'Failed'
+		if not len(self.reviews or []) or any([d.status == "Open" for d in self.reviews]):
+			self.status = "Open"
+		elif any([d.status == "Failed" for d in self.reviews]):
+			self.status = "Failed"
 		else:
-			self.status = 'Passed'
+			self.status = "Passed"
+
 
 def review():
 	day = frappe.utils.getdate().day
 	weekday = frappe.utils.getdate().strftime("%A")
 	month = frappe.utils.getdate().strftime("%B")
 
-	for goal in frappe.get_list("Quality Goal", fields=['name', 'frequency', 'date', 'weekday']):
-		if goal.frequency == 'Daily':
+	for goal in frappe.get_list("Quality Goal", fields=["name", "frequency", "date", "weekday"]):
+		if goal.frequency == "Daily":
 			create_review(goal.name)
 
-		elif goal.frequency == 'Weekly' and goal.weekday == weekday:
+		elif goal.frequency == "Weekly" and goal.weekday == weekday:
 			create_review(goal.name)
 
-		elif goal.frequency == 'Monthly' and goal.date == str(day):
+		elif goal.frequency == "Monthly" and goal.date == str(day):
 			create_review(goal.name)
 
-		elif goal.frequency == 'Quarterly' and day==1 and get_quarter(month):
+		elif goal.frequency == "Quarterly" and day == 1 and get_quarter(month):
 			create_review(goal.name)
 
+
 def create_review(goal):
 	goal = frappe.get_doc("Quality Goal", goal)
 
-	review = frappe.get_doc({
-		"doctype": "Quality Review",
-		"goal": goal.name,
-		"date": frappe.utils.getdate()
-	})
+	review = frappe.get_doc(
+		{"doctype": "Quality Review", "goal": goal.name, "date": frappe.utils.getdate()}
+	)
 
 	review.insert(ignore_permissions=True)
 
+
 def get_quarter(month):
-	if month in  ["January", "April", "July", "October"]:
+	if month in ["January", "April", "July", "October"]:
 		return True
 	else:
 		return False
diff --git a/erpnext/quality_management/doctype/quality_review/test_quality_review.py b/erpnext/quality_management/doctype/quality_review/test_quality_review.py
index 8a254db..c76e7f2 100644
--- a/erpnext/quality_management/doctype/quality_review/test_quality_review.py
+++ b/erpnext/quality_management/doctype/quality_review/test_quality_review.py
@@ -15,7 +15,7 @@
 		review()
 
 		# check if review exists
-		quality_review = frappe.get_doc('Quality Review', dict(goal = quality_goal.name))
+		quality_review = frappe.get_doc("Quality Review", dict(goal=quality_goal.name))
 		self.assertEqual(quality_goal.objectives[0].target, quality_review.reviews[0].target)
 		quality_review.delete()
 
diff --git a/erpnext/regional/__init__.py b/erpnext/regional/__init__.py
index c460286..ec2db81 100644
--- a/erpnext/regional/__init__.py
+++ b/erpnext/regional/__init__.py
@@ -13,6 +13,7 @@
 	if region in ["Nepal", "France"] and doc.docstatus != 0:
 		frappe.throw(_("Deletion is not permitted for country {0}").format(region))
 
+
 def create_transaction_log(doc, method):
 	"""
 	Appends the transaction to a chain of hashed logs for legal resons.
@@ -24,10 +25,11 @@
 
 	data = str(doc.as_dict())
 
-	frappe.get_doc({
-		"doctype": "Transaction Log",
-		"reference_doctype": doc.doctype,
-		"document_name": doc.name,
-		"data": data
-	}).insert(ignore_permissions=True)
-
+	frappe.get_doc(
+		{
+			"doctype": "Transaction Log",
+			"reference_doctype": doc.doctype,
+			"document_name": doc.name,
+			"data": data,
+		}
+	).insert(ignore_permissions=True)
diff --git a/erpnext/regional/address_template/setup.py b/erpnext/regional/address_template/setup.py
index 1b4087d..fd1dfa7 100644
--- a/erpnext/regional/address_template/setup.py
+++ b/erpnext/regional/address_template/setup.py
@@ -2,17 +2,20 @@
 import os
 import frappe
 
+
 def set_up_address_templates(default_country=None):
 	for country, html in get_address_templates():
 		is_default = 1 if country == default_country else 0
 		update_address_template(country, html, is_default)
 
+
 def get_address_templates():
 	"""
 	Return country and path for all HTML files in this directory.
 
 	Returns a list of dicts.
 	"""
+
 	def country(file_name):
 		"""Convert 'united_states.html' to 'United States'."""
 		suffix_pos = file_name.find(".html")
@@ -45,9 +48,6 @@
 		frappe.db.set_value("Address Template", country, "template", html)
 		frappe.db.set_value("Address Template", country, "is_default", is_default)
 	else:
-		frappe.get_doc(dict(
-			doctype="Address Template",
-			country=country,
-			is_default=is_default,
-			template=html
-		)).insert()
+		frappe.get_doc(
+			dict(doctype="Address Template", country=country, is_default=is_default, template=html)
+		).insert()
diff --git a/erpnext/regional/address_template/test_regional_address_template.py b/erpnext/regional/address_template/test_regional_address_template.py
index 780db40..523653b 100644
--- a/erpnext/regional/address_template/test_regional_address_template.py
+++ b/erpnext/regional/address_template/test_regional_address_template.py
@@ -9,13 +9,11 @@
 	if frappe.db.exists("Country", country):
 		return frappe.get_doc("Country", country)
 	else:
-		c = frappe.get_doc({
-			"doctype": "Country",
-			"country_name": country
-		})
+		c = frappe.get_doc({"doctype": "Country", "country_name": country})
 		c.insert()
 		return c
 
+
 class TestRegionalAddressTemplate(TestCase):
 	def test_get_address_templates(self):
 		"""Get the countries and paths from the templates directory."""
@@ -34,11 +32,9 @@
 		"""Update an existing Address Template."""
 		country = ensure_country("Germany")
 		if not frappe.db.exists("Address Template", country.name):
-			template = frappe.get_doc({
-				"doctype": "Address Template",
-				"country": country.name,
-				"template": "EXISTING"
-			}).insert()
+			template = frappe.get_doc(
+				{"doctype": "Address Template", "country": country.name, "template": "EXISTING"}
+			).insert()
 
 		update_address_template(country.name, "NEW")
 		doc = frappe.get_doc("Address Template", country.name)
diff --git a/erpnext/regional/doctype/e_invoice_settings/e_invoice_settings.py b/erpnext/regional/doctype/e_invoice_settings/e_invoice_settings.py
index 342d583..0959a10 100644
--- a/erpnext/regional/doctype/e_invoice_settings/e_invoice_settings.py
+++ b/erpnext/regional/doctype/e_invoice_settings/e_invoice_settings.py
@@ -10,4 +10,4 @@
 class EInvoiceSettings(Document):
 	def validate(self):
 		if self.enable and not self.credentials:
-			frappe.throw(_('You must add atleast one credentials to be able to use E Invoicing.'))
+			frappe.throw(_("You must add atleast one credentials to be able to use E Invoicing."))
diff --git a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
index 3b73a5c..e6bdabd 100644
--- a/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
+++ b/erpnext/regional/doctype/gst_hsn_code/gst_hsn_code.py
@@ -9,25 +9,28 @@
 class GSTHSNCode(Document):
 	pass
 
+
 @frappe.whitelist()
 def update_taxes_in_item_master(taxes, hsn_code):
-	items = frappe.get_list("Item", filters={
-		'gst_hsn_code': hsn_code
-	})
+	items = frappe.get_list("Item", filters={"gst_hsn_code": hsn_code})
 
 	taxes = frappe.parse_json(taxes)
 	frappe.enqueue(update_item_document, items=items, taxes=taxes)
 	return 1
 
+
 def update_item_document(items, taxes):
 	for item in items:
-		item_to_be_updated=frappe.get_doc("Item", item.name)
+		item_to_be_updated = frappe.get_doc("Item", item.name)
 		item_to_be_updated.taxes = []
 		for tax in taxes:
 			tax = frappe._dict(tax)
-			item_to_be_updated.append("taxes", {
-				'item_tax_template': tax.item_tax_template,
-				'tax_category': tax.tax_category,
-				'valid_from': tax.valid_from
-			})
+			item_to_be_updated.append(
+				"taxes",
+				{
+					"item_tax_template": tax.item_tax_template,
+					"tax_category": tax.tax_category,
+					"valid_from": tax.valid_from,
+				},
+			)
 			item_to_be_updated.save()
diff --git a/erpnext/regional/doctype/gst_settings/gst_settings.py b/erpnext/regional/doctype/gst_settings/gst_settings.py
index 13ef3e0..ff09ed0 100644
--- a/erpnext/regional/doctype/gst_settings/gst_settings.py
+++ b/erpnext/regional/doctype/gst_settings/gst_settings.py
@@ -11,15 +11,21 @@
 from frappe.utils import date_diff, get_url, nowdate
 
 
-class EmailMissing(frappe.ValidationError): pass
+class EmailMissing(frappe.ValidationError):
+	pass
+
 
 class GSTSettings(Document):
 	def onload(self):
 		data = frappe._dict()
-		data.total_addresses = frappe.db.sql('''select count(*) from tabAddress where country = "India"''')
-		data.total_addresses_with_gstin = frappe.db.sql('''select distinct count(*)
-			from tabAddress where country = "India" and ifnull(gstin, '')!='' ''')
-		self.set_onload('data', data)
+		data.total_addresses = frappe.db.sql(
+			'''select count(*) from tabAddress where country = "India"'''
+		)
+		data.total_addresses_with_gstin = frappe.db.sql(
+			"""select distinct count(*)
+			from tabAddress where country = "India" and ifnull(gstin, '')!='' """
+		)
+		self.set_onload("data", data)
 
 	def validate(self):
 		# Validate duplicate accounts
@@ -27,37 +33,44 @@
 
 	def validate_duplicate_accounts(self):
 		account_list = []
-		for account in self.get('gst_accounts'):
-			for fieldname in ['cgst_account', 'sgst_account', 'igst_account', 'cess_account']:
+		for account in self.get("gst_accounts"):
+			for fieldname in ["cgst_account", "sgst_account", "igst_account", "cess_account"]:
 				if account.get(fieldname) in account_list:
-					frappe.throw(_("Account {0} appears multiple times").format(
-						frappe.bold(account.get(fieldname))))
+					frappe.throw(
+						_("Account {0} appears multiple times").format(frappe.bold(account.get(fieldname)))
+					)
 
 				if account.get(fieldname):
 					account_list.append(account.get(fieldname))
 
+
 @frappe.whitelist()
 def send_reminder():
-	frappe.has_permission('GST Settings', throw=True)
+	frappe.has_permission("GST Settings", throw=True)
 
-	last_sent = frappe.db.get_single_value('GST Settings', 'gstin_email_sent_on')
+	last_sent = frappe.db.get_single_value("GST Settings", "gstin_email_sent_on")
 	if last_sent and date_diff(nowdate(), last_sent) < 3:
 		frappe.throw(_("Please wait 3 days before resending the reminder."))
 
-	frappe.db.set_value('GST Settings', 'GST Settings', 'gstin_email_sent_on', nowdate())
+	frappe.db.set_value("GST Settings", "GST Settings", "gstin_email_sent_on", nowdate())
 
 	# enqueue if large number of customers, suppliser
-	frappe.enqueue('erpnext.regional.doctype.gst_settings.gst_settings.send_gstin_reminder_to_all_parties')
-	frappe.msgprint(_('Email Reminders will be sent to all parties with email contacts'))
+	frappe.enqueue(
+		"erpnext.regional.doctype.gst_settings.gst_settings.send_gstin_reminder_to_all_parties"
+	)
+	frappe.msgprint(_("Email Reminders will be sent to all parties with email contacts"))
+
 
 def send_gstin_reminder_to_all_parties():
 	parties = []
-	for address_name in frappe.db.sql('''select name
-		from tabAddress where country = "India" and ifnull(gstin, '')='' '''):
-		address = frappe.get_doc('Address', address_name[0])
+	for address_name in frappe.db.sql(
+		"""select name
+		from tabAddress where country = "India" and ifnull(gstin, '')='' """
+	):
+		address = frappe.get_doc("Address", address_name[0])
 		for link in address.links:
 			party = frappe.get_doc(link.link_doctype, link.link_name)
-			if link.link_doctype in ('Customer', 'Supplier'):
+			if link.link_doctype in ("Customer", "Supplier"):
 				t = (link.link_doctype, link.link_name, address.email_id)
 				if not t in parties:
 					parties.append(t)
@@ -74,29 +87,30 @@
 
 @frappe.whitelist()
 def send_gstin_reminder(party_type, party):
-	'''Send GSTIN reminder to one party (called from Customer, Supplier form)'''
+	"""Send GSTIN reminder to one party (called from Customer, Supplier form)"""
 	frappe.has_permission(party_type, throw=True)
-	email = _send_gstin_reminder(party_type ,party)
+	email = _send_gstin_reminder(party_type, party)
 	if email:
-		frappe.msgprint(_('Reminder to update GSTIN Sent'), title='Reminder sent', indicator='green')
+		frappe.msgprint(_("Reminder to update GSTIN Sent"), title="Reminder sent", indicator="green")
+
 
 def _send_gstin_reminder(party_type, party, default_email_id=None, sent_to=None):
-	'''Send GST Reminder email'''
-	email_id = frappe.db.get_value('Contact', get_default_contact(party_type, party), 'email_id')
+	"""Send GST Reminder email"""
+	email_id = frappe.db.get_value("Contact", get_default_contact(party_type, party), "email_id")
 	if not email_id:
 		# get email from address
 		email_id = default_email_id
 
 	if not email_id:
-		frappe.throw(_('Email not found in default contact'), exc=EmailMissing)
+		frappe.throw(_("Email not found in default contact"), exc=EmailMissing)
 
 	if sent_to and email_id in sent_to:
 		return
 
 	frappe.sendmail(
-		subject='Please update your GSTIN',
+		subject="Please update your GSTIN",
 		recipients=email_id,
-		message='''
+		message="""
 		<p>Hello,</p>
 		<p>Please help us send you GST Ready Invoices.</p>
 		<p>
@@ -109,7 +123,9 @@
 			<br>
 			ERPNext is a free and open source ERP system.
 		</p>
-		'''.format(os.path.join(get_url(), '/regional/india/update-gstin'), party)
+		""".format(
+			os.path.join(get_url(), "/regional/india/update-gstin"), party
+		),
 	)
 
 	return email_id
diff --git a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py
index d5ff88c..d6210ab 100644
--- a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py
+++ b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py
@@ -18,7 +18,7 @@
 		self.get_data()
 
 	def get_data(self):
-		self.report_dict = json.loads(get_json('gstr_3b_report_template'))
+		self.report_dict = json.loads(get_json("gstr_3b_report_template"))
 
 		self.gst_details = self.get_company_gst_details()
 		self.report_dict["gstin"] = self.gst_details.get("gstin")
@@ -42,40 +42,46 @@
 		self.json_output = frappe.as_json(self.report_dict)
 
 	def set_inward_nil_exempt(self, inward_nil_exempt):
-		self.report_dict["inward_sup"]["isup_details"][0]["inter"] = flt(inward_nil_exempt.get("gst").get("inter"), 2)
-		self.report_dict["inward_sup"]["isup_details"][0]["intra"] = flt(inward_nil_exempt.get("gst").get("intra"), 2)
-		self.report_dict["inward_sup"]["isup_details"][1]["inter"] = flt(inward_nil_exempt.get("non_gst").get("inter"), 2)
-		self.report_dict["inward_sup"]["isup_details"][1]["intra"] = flt(inward_nil_exempt.get("non_gst").get("intra"), 2)
+		self.report_dict["inward_sup"]["isup_details"][0]["inter"] = flt(
+			inward_nil_exempt.get("gst").get("inter"), 2
+		)
+		self.report_dict["inward_sup"]["isup_details"][0]["intra"] = flt(
+			inward_nil_exempt.get("gst").get("intra"), 2
+		)
+		self.report_dict["inward_sup"]["isup_details"][1]["inter"] = flt(
+			inward_nil_exempt.get("non_gst").get("inter"), 2
+		)
+		self.report_dict["inward_sup"]["isup_details"][1]["intra"] = flt(
+			inward_nil_exempt.get("non_gst").get("intra"), 2
+		)
 
 	def set_itc_details(self, itc_details):
 		itc_eligible_type_map = {
-			'IMPG': 'Import Of Capital Goods',
-			'IMPS': 'Import Of Service',
-			'ISRC': 'ITC on Reverse Charge',
-			'ISD': 'Input Service Distributor',
-			'OTH': 'All Other ITC'
+			"IMPG": "Import Of Capital Goods",
+			"IMPS": "Import Of Service",
+			"ISRC": "ITC on Reverse Charge",
+			"ISD": "Input Service Distributor",
+			"OTH": "All Other ITC",
 		}
 
-		itc_ineligible_map = {
-			'RUL': 'Ineligible As Per Section 17(5)',
-			'OTH': 'Ineligible Others'
-		}
+		itc_ineligible_map = {"RUL": "Ineligible As Per Section 17(5)", "OTH": "Ineligible Others"}
 
 		net_itc = self.report_dict["itc_elg"]["itc_net"]
 
 		for d in self.report_dict["itc_elg"]["itc_avl"]:
 			itc_type = itc_eligible_type_map.get(d["ty"])
-			for key in ['iamt', 'camt', 'samt', 'csamt']:
+			for key in ["iamt", "camt", "samt", "csamt"]:
 				d[key] = flt(itc_details.get(itc_type, {}).get(key))
 				net_itc[key] += flt(d[key], 2)
 
 		for d in self.report_dict["itc_elg"]["itc_inelg"]:
 			itc_type = itc_ineligible_map.get(d["ty"])
-			for key in ['iamt', 'camt', 'samt', 'csamt']:
+			for key in ["iamt", "camt", "samt", "csamt"]:
 				d[key] = flt(itc_details.get(itc_type, {}).get(key))
 
 	def get_itc_reversal_entries(self):
-		reversal_entries = frappe.db.sql("""
+		reversal_entries = frappe.db.sql(
+			"""
 			SELECT ja.account, j.reversal_type, sum(credit_in_account_currency) as amount
 			FROM `tabJournal Entry` j, `tabJournal Entry Account` ja
 			where j.docstatus = 1
@@ -84,24 +90,27 @@
 			and j.voucher_type = 'Reversal Of ITC'
 			and month(j.posting_date) = %s and year(j.posting_date) = %s
 			and j.company = %s and j.company_gstin = %s
-			GROUP BY ja.account, j.reversal_type""", (self.month_no, self.year, self.company,
-			self.gst_details.get("gstin")), as_dict=1)
+			GROUP BY ja.account, j.reversal_type""",
+			(self.month_no, self.year, self.company, self.gst_details.get("gstin")),
+			as_dict=1,
+		)
 
 		net_itc = self.report_dict["itc_elg"]["itc_net"]
 
 		for entry in reversal_entries:
-			if entry.reversal_type == 'As per rules 42 & 43 of CGST Rules':
+			if entry.reversal_type == "As per rules 42 & 43 of CGST Rules":
 				index = 0
 			else:
 				index = 1
 
-			for key in ['camt', 'samt', 'iamt', 'csamt']:
+			for key in ["camt", "samt", "iamt", "csamt"]:
 				if entry.account in self.account_heads.get(key):
 					self.report_dict["itc_elg"]["itc_rev"][index][key] += flt(entry.amount)
 					net_itc[key] -= flt(entry.amount)
 
 	def get_itc_details(self):
-		itc_amounts = frappe.db.sql("""
+		itc_amounts = frappe.db.sql(
+			"""
 			SELECT eligibility_for_itc, sum(itc_integrated_tax) as itc_integrated_tax,
 			sum(itc_central_tax) as itc_central_tax,
 			sum(itc_state_tax) as itc_state_tax,
@@ -112,21 +121,28 @@
 			and month(posting_date) = %s and year(posting_date) = %s and company = %s
 			and company_gstin = %s
 			GROUP BY eligibility_for_itc
-		""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
+		""",
+			(self.month_no, self.year, self.company, self.gst_details.get("gstin")),
+			as_dict=1,
+		)
 
 		itc_details = {}
 		for d in itc_amounts:
-			itc_details.setdefault(d.eligibility_for_itc, {
-				'iamt': d.itc_integrated_tax,
-				'camt': d.itc_central_tax,
-				'samt': d.itc_state_tax,
-				'csamt': d.itc_cess_amount
-			})
+			itc_details.setdefault(
+				d.eligibility_for_itc,
+				{
+					"iamt": d.itc_integrated_tax,
+					"camt": d.itc_central_tax,
+					"samt": d.itc_state_tax,
+					"csamt": d.itc_cess_amount,
+				},
+			)
 
 		return itc_details
 
 	def get_inward_nil_exempt(self, state):
-		inward_nil_exempt = frappe.db.sql("""
+		inward_nil_exempt = frappe.db.sql(
+			"""
 			SELECT p.place_of_supply, p.supplier_address,
 			i.base_amount, i.is_nil_exempt, i.is_non_gst
 			FROM `tabPurchase Invoice` p , `tabPurchase Invoice Item` i
@@ -137,17 +153,13 @@
 			month(p.posting_date) = %s and year(p.posting_date) = %s
 			and p.company = %s and p.company_gstin = %s
 		""",
-			(self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
+			(self.month_no, self.year, self.company, self.gst_details.get("gstin")),
+			as_dict=1,
+		)
 
 		inward_nil_exempt_details = {
-			"gst": {
-				"intra": 0.0,
-				"inter": 0.0
-			},
-			"non_gst": {
-				"intra": 0.0,
-				"inter": 0.0
-			}
+			"gst": {"intra": 0.0, "inter": 0.0},
+			"non_gst": {"intra": 0.0, "inter": 0.0},
 		}
 
 		address_state_map = get_address_state_map()
@@ -158,11 +170,13 @@
 
 			supplier_state = address_state_map.get(d.supplier_address) or state
 
-			if (d.is_nil_exempt == 1 or d.get('gst_category') == 'Registered Composition') \
-				and cstr(supplier_state) == cstr(d.place_of_supply.split("-")[1]):
+			if (d.is_nil_exempt == 1 or d.get("gst_category") == "Registered Composition") and cstr(
+				supplier_state
+			) == cstr(d.place_of_supply.split("-")[1]):
 				inward_nil_exempt_details["gst"]["intra"] += d.base_amount
-			elif (d.is_nil_exempt == 1 or d.get('gst_category') == 'Registered Composition') \
-				and cstr(supplier_state) != cstr(d.place_of_supply.split("-")[1]):
+			elif (d.is_nil_exempt == 1 or d.get("gst_category") == "Registered Composition") and cstr(
+				supplier_state
+			) != cstr(d.place_of_supply.split("-")[1]):
 				inward_nil_exempt_details["gst"]["inter"] += d.base_amount
 			elif d.is_non_gst == 1 and cstr(supplier_state) == cstr(d.place_of_supply.split("-")[1]):
 				inward_nil_exempt_details["non_gst"]["intra"] += d.base_amount
@@ -179,12 +193,13 @@
 	def get_outward_tax_invoices(self, doctype, reverse_charge=None):
 		self.invoices = []
 		self.invoice_detail_map = {}
-		condition = ''
+		condition = ""
 
 		if reverse_charge:
 			condition += "AND reverse_charge = 'Y'"
 
-		invoice_details = frappe.db.sql("""
+		invoice_details = frappe.db.sql(
+			"""
 			SELECT
 				name, gst_category, export_type, place_of_supply
 			FROM
@@ -198,8 +213,12 @@
 				AND is_opening = 'No'
 				{reverse_charge}
 			ORDER BY name
-		""".format(doctype=doctype, reverse_charge=condition), (self.month_no, self.year,
-			self.company, self.gst_details.get("gstin")), as_dict=1)
+		""".format(
+				doctype=doctype, reverse_charge=condition
+			),
+			(self.month_no, self.year, self.company, self.gst_details.get("gstin")),
+			as_dict=1,
+		)
 
 		for d in invoice_details:
 			self.invoice_detail_map.setdefault(d.name, d)
@@ -210,20 +229,27 @@
 		self.is_nil_exempt = []
 		self.is_non_gst = []
 
-		if self.get('invoices'):
-			item_details = frappe.db.sql("""
+		if self.get("invoices"):
+			item_details = frappe.db.sql(
+				"""
 				SELECT
 					item_code, parent, taxable_value, base_net_amount, item_tax_rate,
 					is_nil_exempt, is_non_gst
 				FROM
 					`tab%s Item`
 				WHERE parent in (%s)
-			""" % (doctype, ', '.join(['%s']*len(self.invoices))), tuple(self.invoices), as_dict=1)
+			"""
+				% (doctype, ", ".join(["%s"] * len(self.invoices))),
+				tuple(self.invoices),
+				as_dict=1,
+			)
 
 			for d in item_details:
 				if d.item_code not in self.invoice_items.get(d.parent, {}):
 					self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code, 0.0)
-					self.invoice_items[d.parent][d.item_code] += d.get('taxable_value', 0) or d.get('base_net_amount', 0)
+					self.invoice_items[d.parent][d.item_code] += d.get("taxable_value", 0) or d.get(
+						"base_net_amount", 0
+					)
 
 				if d.is_nil_exempt and d.item_code not in self.is_nil_exempt:
 					self.is_nil_exempt.append(d.item_code)
@@ -233,16 +259,17 @@
 
 	def get_outward_tax_details(self, doctype):
 		if doctype == "Sales Invoice":
-			tax_template = 'Sales Taxes and Charges'
+			tax_template = "Sales Taxes and Charges"
 		elif doctype == "Purchase Invoice":
-			tax_template = 'Purchase Taxes and Charges'
+			tax_template = "Purchase Taxes and Charges"
 
 		self.items_based_on_tax_rate = {}
 		self.invoice_cess = frappe._dict()
 		self.cgst_sgst_invoices = []
 
-		if self.get('invoices'):
-			tax_details = frappe.db.sql("""
+		if self.get("invoices"):
+			tax_details = frappe.db.sql(
+				"""
 				SELECT
 					parent, account_head, item_wise_tax_detail, base_tax_amount_after_discount_amount
 				FROM `tab%s`
@@ -250,24 +277,28 @@
 					parenttype = %s and docstatus = 1
 					and parent in (%s)
 				ORDER BY account_head
-			""" % (tax_template, '%s', ', '.join(['%s']*len(self.invoices))),
-				tuple([doctype] + list(self.invoices)))
+			"""
+				% (tax_template, "%s", ", ".join(["%s"] * len(self.invoices))),
+				tuple([doctype] + list(self.invoices)),
+			)
 
 			for parent, account, item_wise_tax_detail, tax_amount in tax_details:
-				if account in self.account_heads.get('csamt'):
+				if account in self.account_heads.get("csamt"):
 					self.invoice_cess.setdefault(parent, tax_amount)
 				else:
 					if item_wise_tax_detail:
 						try:
 							item_wise_tax_detail = json.loads(item_wise_tax_detail)
 							cgst_or_sgst = False
-							if account in self.account_heads.get('camt') \
-								or account in self.account_heads.get('samt'):
+							if account in self.account_heads.get("camt") or account in self.account_heads.get("samt"):
 								cgst_or_sgst = True
 
 							for item_code, tax_amounts in item_wise_tax_detail.items():
-								if not (cgst_or_sgst or account in self.account_heads.get('iamt') or
-									(item_code in self.is_non_gst + self.is_nil_exempt)):
+								if not (
+									cgst_or_sgst
+									or account in self.account_heads.get("iamt")
+									or (item_code in self.is_non_gst + self.is_nil_exempt)
+								):
 									continue
 
 								tax_rate = tax_amounts[0]
@@ -277,66 +308,76 @@
 										if parent not in self.cgst_sgst_invoices:
 											self.cgst_sgst_invoices.append(parent)
 
-									rate_based_dict = self.items_based_on_tax_rate\
-										.setdefault(parent, {}).setdefault(tax_rate, [])
+									rate_based_dict = self.items_based_on_tax_rate.setdefault(parent, {}).setdefault(
+										tax_rate, []
+									)
 									if item_code not in rate_based_dict:
 										rate_based_dict.append(item_code)
 						except ValueError:
 							continue
 
-
-		if self.get('invoice_items'):
+		if self.get("invoice_items"):
 			# Build itemised tax for export invoices, nil and exempted where tax table is blank
 			for invoice, items in self.invoice_items.items():
-				if invoice not in self.items_based_on_tax_rate and self.invoice_detail_map.get(invoice, {}).get('export_type') \
-					== "Without Payment of Tax" and self.invoice_detail_map.get(invoice, {}).get('gst_category') == "Overseas":
+				if (
+					invoice not in self.items_based_on_tax_rate
+					and self.invoice_detail_map.get(invoice, {}).get("export_type") == "Without Payment of Tax"
+					and self.invoice_detail_map.get(invoice, {}).get("gst_category") == "Overseas"
+				):
 					self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, items.keys())
 				else:
 					for item in items.keys():
-						if item in self.is_nil_exempt + self.is_non_gst and \
-							item not in self.items_based_on_tax_rate.get(invoice, {}).get(0, []):
-								self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, [])
-								self.items_based_on_tax_rate[invoice][0].append(item)
+						if (
+							item in self.is_nil_exempt + self.is_non_gst
+							and item not in self.items_based_on_tax_rate.get(invoice, {}).get(0, [])
+						):
+							self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, [])
+							self.items_based_on_tax_rate[invoice][0].append(item)
 
 	def set_outward_taxable_supplies(self):
 		inter_state_supply_details = {}
 
 		for inv, items_based_on_rate in self.items_based_on_tax_rate.items():
-			gst_category = self.invoice_detail_map.get(inv, {}).get('gst_category')
-			place_of_supply = self.invoice_detail_map.get(inv, {}).get('place_of_supply') or '00-Other Territory'
-			export_type = self.invoice_detail_map.get(inv, {}).get('export_type')
+			gst_category = self.invoice_detail_map.get(inv, {}).get("gst_category")
+			place_of_supply = (
+				self.invoice_detail_map.get(inv, {}).get("place_of_supply") or "00-Other Territory"
+			)
+			export_type = self.invoice_detail_map.get(inv, {}).get("export_type")
 
 			for rate, items in items_based_on_rate.items():
 				for item_code, taxable_value in self.invoice_items.get(inv).items():
 					if item_code in items:
 						if item_code in self.is_nil_exempt:
-							self.report_dict['sup_details']['osup_nil_exmp']['txval'] += taxable_value
+							self.report_dict["sup_details"]["osup_nil_exmp"]["txval"] += taxable_value
 						elif item_code in self.is_non_gst:
-							self.report_dict['sup_details']['osup_nongst']['txval'] += taxable_value
-						elif rate == 0 or (gst_category == 'Overseas' and export_type == 'Without Payment of Tax'):
-							self.report_dict['sup_details']['osup_zero']['txval'] += taxable_value
+							self.report_dict["sup_details"]["osup_nongst"]["txval"] += taxable_value
+						elif rate == 0 or (gst_category == "Overseas" and export_type == "Without Payment of Tax"):
+							self.report_dict["sup_details"]["osup_zero"]["txval"] += taxable_value
 						else:
 							if inv in self.cgst_sgst_invoices:
-								tax_rate = rate/2
-								self.report_dict['sup_details']['osup_det']['camt'] += (taxable_value * tax_rate /100)
-								self.report_dict['sup_details']['osup_det']['samt'] += (taxable_value * tax_rate /100)
-								self.report_dict['sup_details']['osup_det']['txval'] += taxable_value
+								tax_rate = rate / 2
+								self.report_dict["sup_details"]["osup_det"]["camt"] += taxable_value * tax_rate / 100
+								self.report_dict["sup_details"]["osup_det"]["samt"] += taxable_value * tax_rate / 100
+								self.report_dict["sup_details"]["osup_det"]["txval"] += taxable_value
 							else:
-								self.report_dict['sup_details']['osup_det']['iamt'] += (taxable_value * rate /100)
-								self.report_dict['sup_details']['osup_det']['txval'] += taxable_value
+								self.report_dict["sup_details"]["osup_det"]["iamt"] += taxable_value * rate / 100
+								self.report_dict["sup_details"]["osup_det"]["txval"] += taxable_value
 
-								if gst_category in ['Unregistered', 'Registered Composition', 'UIN Holders'] and \
-								self.gst_details.get("gst_state") != place_of_supply.split("-")[1]:
-									inter_state_supply_details.setdefault((gst_category, place_of_supply), {
-										"txval": 0.0,
-										"pos": place_of_supply.split("-")[0],
-										"iamt": 0.0
-									})
-									inter_state_supply_details[(gst_category, place_of_supply)]['txval'] += taxable_value
-									inter_state_supply_details[(gst_category, place_of_supply)]['iamt'] += (taxable_value * rate /100)
+								if (
+									gst_category in ["Unregistered", "Registered Composition", "UIN Holders"]
+									and self.gst_details.get("gst_state") != place_of_supply.split("-")[1]
+								):
+									inter_state_supply_details.setdefault(
+										(gst_category, place_of_supply),
+										{"txval": 0.0, "pos": place_of_supply.split("-")[0], "iamt": 0.0},
+									)
+									inter_state_supply_details[(gst_category, place_of_supply)]["txval"] += taxable_value
+									inter_state_supply_details[(gst_category, place_of_supply)]["iamt"] += (
+										taxable_value * rate / 100
+									)
 
 			if self.invoice_cess.get(inv):
-				self.report_dict['sup_details']['osup_det']['csamt'] += flt(self.invoice_cess.get(inv), 2)
+				self.report_dict["sup_details"]["osup_det"]["csamt"] += flt(self.invoice_cess.get(inv), 2)
 
 		self.set_inter_state_supply(inter_state_supply_details)
 
@@ -346,13 +387,13 @@
 				for item_code, taxable_value in self.invoice_items.get(inv).items():
 					if item_code in items:
 						if inv in self.cgst_sgst_invoices:
-							tax_rate = rate/2
-							self.report_dict['sup_details']['isup_rev']['camt'] += (taxable_value * tax_rate /100)
-							self.report_dict['sup_details']['isup_rev']['samt'] += (taxable_value * tax_rate /100)
-							self.report_dict['sup_details']['isup_rev']['txval'] += taxable_value
+							tax_rate = rate / 2
+							self.report_dict["sup_details"]["isup_rev"]["camt"] += taxable_value * tax_rate / 100
+							self.report_dict["sup_details"]["isup_rev"]["samt"] += taxable_value * tax_rate / 100
+							self.report_dict["sup_details"]["isup_rev"]["txval"] += taxable_value
 						else:
-							self.report_dict['sup_details']['isup_rev']['iamt'] += (taxable_value * rate /100)
-							self.report_dict['sup_details']['isup_rev']['txval'] += taxable_value
+							self.report_dict["sup_details"]["isup_rev"]["iamt"] += taxable_value * rate / 100
+							self.report_dict["sup_details"]["isup_rev"]["txval"] += taxable_value
 
 	def set_inter_state_supply(self, inter_state_supply):
 		for key, value in inter_state_supply.items():
@@ -366,29 +407,33 @@
 				self.report_dict["inter_sup"]["uin_details"].append(value)
 
 	def get_company_gst_details(self):
-		gst_details =  frappe.get_all("Address",
+		gst_details = frappe.get_all(
+			"Address",
 			fields=["gstin", "gst_state", "gst_state_number"],
-			filters={
-				"name":self.company_address
-			})
+			filters={"name": self.company_address},
+		)
 
 		if gst_details:
 			return gst_details[0]
 		else:
-			frappe.throw(_("Please enter GSTIN and state for the Company Address {0}").format(self.company_address))
+			frappe.throw(
+				_("Please enter GSTIN and state for the Company Address {0}").format(self.company_address)
+			)
 
 	def get_account_heads(self):
 		account_map = {
-			'sgst_account': 'samt',
-			'cess_account': 'csamt',
-			'cgst_account': 'camt',
-			'igst_account': 'iamt'
+			"sgst_account": "samt",
+			"cess_account": "csamt",
+			"cgst_account": "camt",
+			"igst_account": "iamt",
 		}
 
 		account_heads = {}
-		gst_settings_accounts = frappe.get_all("GST Account",
-			filters={'company': self.company, 'is_reverse_charge_account': 0},
-			fields=["cgst_account", "sgst_account", "igst_account", "cess_account"])
+		gst_settings_accounts = frappe.get_all(
+			"GST Account",
+			filters={"company": self.company, "is_reverse_charge_account": 0},
+			fields=["cgst_account", "sgst_account", "igst_account", "cess_account"],
+		)
 
 		if not gst_settings_accounts:
 			frappe.throw(_("Please set GST Accounts in GST Settings"))
@@ -405,42 +450,48 @@
 		for doctype in ["Sales Invoice", "Purchase Invoice"]:
 
 			if doctype == "Sales Invoice":
-				party_type = 'Customer'
-				party = 'customer'
+				party_type = "Customer"
+				party = "customer"
 			else:
-				party_type = 'Supplier'
-				party = 'supplier'
+				party_type = "Supplier"
+				party = "supplier"
 
 			docnames = frappe.db.sql(
-			"""
+				"""
 				SELECT t1.name FROM `tab{doctype}` t1, `tab{party_type}` t2
 				WHERE t1.docstatus = 1 and t1.is_opening = 'No'
 				and month(t1.posting_date) = %s and year(t1.posting_date) = %s
 				and t1.company = %s and t1.place_of_supply IS NULL and t1.{party} = t2.name and
 				t2.gst_category != 'Overseas'
-			""".format(doctype = doctype, party_type = party_type,
-				party=party) ,(self.month_no, self.year, self.company), as_dict=1) #nosec
+			""".format(
+					doctype=doctype, party_type=party_type, party=party
+				),
+				(self.month_no, self.year, self.company),
+				as_dict=1,
+			)  # nosec
 
 			for d in docnames:
 				missing_field_invoices.append(d.name)
 
 		return ",".join(missing_field_invoices)
 
+
 def get_address_state_map():
-	return frappe._dict(
-		frappe.get_all('Address', fields=['name', 'gst_state'], as_list=1)
-	)
+	return frappe._dict(frappe.get_all("Address", fields=["name", "gst_state"], as_list=1))
+
 
 def get_json(template):
-	file_path = os.path.join(os.path.dirname(__file__), '{template}.json'.format(template=template))
-	with open(file_path, 'r') as f:
+	file_path = os.path.join(os.path.dirname(__file__), "{template}.json".format(template=template))
+	with open(file_path, "r") as f:
 		return cstr(f.read())
 
+
 def get_state_code(state):
 	state_code = state_numbers.get(state)
 
 	return state_code
 
+
 def get_period(month, year=None):
 	month_no = {
 		"January": 1,
@@ -454,7 +505,7 @@
 		"September": 9,
 		"October": 10,
 		"November": 11,
-		"December": 12
+		"December": 12,
 	}.get(month)
 
 	if year:
@@ -465,12 +516,13 @@
 
 @frappe.whitelist()
 def view_report(name):
-	json_data = frappe.get_value("GSTR 3B Report", name, 'json_output')
+	json_data = frappe.get_value("GSTR 3B Report", name, "json_output")
 	return json.loads(json_data)
 
+
 @frappe.whitelist()
 def make_json(name):
-	json_data = frappe.get_value("GSTR 3B Report", name, 'json_output')
+	json_data = frappe.get_value("GSTR 3B Report", name, "json_output")
 	file_name = "GST3B.json"
 	frappe.local.response.filename = file_name
 	frappe.local.response.filecontent = json_data
diff --git a/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py
index e12e3d7..3862c62 100644
--- a/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py
+++ b/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py
@@ -13,6 +13,7 @@
 
 test_dependencies = ["Territory", "Customer Group", "Supplier Group", "Item"]
 
+
 class TestGSTR3BReport(unittest.TestCase):
 	def setUp(self):
 		frappe.set_user("Administrator")
@@ -22,7 +23,7 @@
 		frappe.db.sql("delete from `tabGSTR 3B Report` where company='_Test Company GST'")
 
 		make_company()
-		make_item("Milk", properties = {"is_nil_exempt": 1, "standard_rate": 0.000000})
+		make_item("Milk", properties={"is_nil_exempt": 1, "standard_rate": 0.000000})
 		set_account_heads()
 		make_customers()
 		make_suppliers()
@@ -40,7 +41,7 @@
 			9: "September",
 			10: "October",
 			11: "November",
-			12: "December"
+			12: "December",
 		}
 
 		make_sales_invoice()
@@ -50,13 +51,15 @@
 			report = frappe.get_doc("GSTR 3B Report", "GSTR3B-March-2019-_Test Address GST-Billing")
 			report.save()
 		else:
-			report = frappe.get_doc({
-				"doctype": "GSTR 3B Report",
-				"company": "_Test Company GST",
-				"company_address": "_Test Address GST-Billing",
-				"year": getdate().year,
-				"month": month_number_mapping.get(getdate().month)
-			}).insert()
+			report = frappe.get_doc(
+				{
+					"doctype": "GSTR 3B Report",
+					"company": "_Test Company GST",
+					"company_address": "_Test Address GST-Billing",
+					"year": getdate().year,
+					"month": month_number_mapping.get(getdate().month),
+				}
+			).insert()
 
 		output = json.loads(report.json_output)
 
@@ -68,32 +71,36 @@
 		self.assertEqual(output["itc_elg"]["itc_avl"][4]["camt"], 22.50)
 
 	def test_gst_rounding(self):
-		gst_settings = frappe.get_doc('GST Settings')
+		gst_settings = frappe.get_doc("GST Settings")
 		gst_settings.round_off_gst_values = 1
 		gst_settings.save()
 
 		current_country = frappe.flags.country
-		frappe.flags.country = 'India'
+		frappe.flags.country = "India"
 
-		si = create_sales_invoice(company="_Test Company GST",
-			customer = '_Test GST Customer',
-			currency = 'INR',
-			warehouse = 'Finished Goods - _GST',
-			debit_to = 'Debtors - _GST',
-			income_account = 'Sales - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			cost_center = 'Main - _GST',
+		si = create_sales_invoice(
+			company="_Test Company GST",
+			customer="_Test GST Customer",
+			currency="INR",
+			warehouse="Finished Goods - _GST",
+			debit_to="Debtors - _GST",
+			income_account="Sales - _GST",
+			expense_account="Cost of Goods Sold - _GST",
+			cost_center="Main - _GST",
 			rate=216,
-			do_not_save=1
+			do_not_save=1,
 		)
 
-		si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Output Tax IGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "IGST @ 18.0",
-			"rate": 18
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "Output Tax IGST - _GST",
+				"cost_center": "Main - _GST",
+				"description": "IGST @ 18.0",
+				"rate": 18,
+			},
+		)
 
 		si.save()
 		# Check for 39 instead of 38.88
@@ -105,20 +112,313 @@
 
 	def test_gst_category_auto_update(self):
 		if not frappe.db.exists("Customer", "_Test GST Customer With GSTIN"):
-			customer = frappe.get_doc({
+			customer = frappe.get_doc(
+				{
+					"customer_group": "_Test Customer Group",
+					"customer_name": "_Test GST Customer With GSTIN",
+					"customer_type": "Individual",
+					"doctype": "Customer",
+					"territory": "_Test Territory",
+				}
+			).insert()
+
+			self.assertEqual(customer.gst_category, "Unregistered")
+
+		if not frappe.db.exists("Address", "_Test GST Category-1-Billing"):
+			address = frappe.get_doc(
+				{
+					"address_line1": "_Test Address Line 1",
+					"address_title": "_Test GST Category-1",
+					"address_type": "Billing",
+					"city": "_Test City",
+					"state": "Test State",
+					"country": "India",
+					"doctype": "Address",
+					"is_primary_address": 1,
+					"phone": "+91 0000000000",
+					"gstin": "29AZWPS7135H1ZG",
+					"gst_state": "Karnataka",
+					"gst_state_number": "29",
+				}
+			).insert()
+
+			address.append(
+				"links", {"link_doctype": "Customer", "link_name": "_Test GST Customer With GSTIN"}
+			)
+
+			address.save()
+
+		customer.load_from_db()
+		self.assertEqual(customer.gst_category, "Registered Regular")
+
+
+def make_sales_invoice():
+	si = create_sales_invoice(
+		company="_Test Company GST",
+		customer="_Test GST Customer",
+		currency="INR",
+		warehouse="Finished Goods - _GST",
+		debit_to="Debtors - _GST",
+		income_account="Sales - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		cost_center="Main - _GST",
+		do_not_save=1,
+	)
+
+	si.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Output Tax IGST - _GST",
+			"cost_center": "Main - _GST",
+			"description": "IGST @ 18.0",
+			"rate": 18,
+		},
+	)
+
+	si.submit()
+
+	si1 = create_sales_invoice(
+		company="_Test Company GST",
+		customer="_Test GST SEZ Customer",
+		currency="INR",
+		warehouse="Finished Goods - _GST",
+		debit_to="Debtors - _GST",
+		income_account="Sales - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		cost_center="Main - _GST",
+		do_not_save=1,
+	)
+
+	si1.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Output Tax IGST - _GST",
+			"cost_center": "Main - _GST",
+			"description": "IGST @ 18.0",
+			"rate": 18,
+		},
+	)
+
+	si1.submit()
+
+	si2 = create_sales_invoice(
+		company="_Test Company GST",
+		customer="_Test Unregistered Customer",
+		currency="INR",
+		warehouse="Finished Goods - _GST",
+		debit_to="Debtors - _GST",
+		income_account="Sales - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		cost_center="Main - _GST",
+		do_not_save=1,
+	)
+
+	si2.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Output Tax IGST - _GST",
+			"cost_center": "Main - _GST",
+			"description": "IGST @ 18.0",
+			"rate": 18,
+		},
+	)
+
+	si2.submit()
+
+	si3 = create_sales_invoice(
+		company="_Test Company GST",
+		customer="_Test GST Customer",
+		currency="INR",
+		item="Milk",
+		warehouse="Finished Goods - _GST",
+		debit_to="Debtors - _GST",
+		income_account="Sales - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		cost_center="Main - _GST",
+		do_not_save=1,
+	)
+	si3.submit()
+
+
+def create_purchase_invoices():
+	pi = make_purchase_invoice(
+		company="_Test Company GST",
+		supplier="_Test Registered Supplier",
+		currency="INR",
+		warehouse="Finished Goods - _GST",
+		cost_center="Main - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		do_not_save=1,
+	)
+
+	pi.eligibility_for_itc = "All Other ITC"
+
+	pi.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Input Tax CGST - _GST",
+			"cost_center": "Main - _GST",
+			"description": "CGST @ 9.0",
+			"rate": 9,
+		},
+	)
+
+	pi.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "Input Tax SGST - _GST",
+			"cost_center": "Main - _GST",
+			"description": "SGST @ 9.0",
+			"rate": 9,
+		},
+	)
+
+	pi.submit()
+
+	pi1 = make_purchase_invoice(
+		company="_Test Company GST",
+		supplier="_Test Registered Supplier",
+		currency="INR",
+		warehouse="Finished Goods - _GST",
+		cost_center="Main - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		item="Milk",
+		do_not_save=1,
+	)
+
+	pi1.shipping_address = "_Test Supplier GST-1-Billing"
+	pi1.save()
+
+	pi1.submit()
+
+	pi2 = make_purchase_invoice(
+		company="_Test Company GST",
+		customer="_Test Registered Supplier",
+		currency="INR",
+		item="Milk",
+		warehouse="Finished Goods - _GST",
+		expense_account="Cost of Goods Sold - _GST",
+		cost_center="Main - _GST",
+		rate=250,
+		qty=1,
+		do_not_save=1,
+	)
+	pi2.submit()
+
+
+def make_suppliers():
+	if not frappe.db.exists("Supplier", "_Test Registered Supplier"):
+		frappe.get_doc(
+			{
+				"supplier_group": "_Test Supplier Group",
+				"supplier_name": "_Test Registered Supplier",
+				"gst_category": "Registered Regular",
+				"supplier_type": "Individual",
+				"doctype": "Supplier",
+			}
+		).insert()
+
+	if not frappe.db.exists("Supplier", "_Test Unregistered Supplier"):
+		frappe.get_doc(
+			{
+				"supplier_group": "_Test Supplier Group",
+				"supplier_name": "_Test Unregistered Supplier",
+				"gst_category": "Unregistered",
+				"supplier_type": "Individual",
+				"doctype": "Supplier",
+			}
+		).insert()
+
+	if not frappe.db.exists("Address", "_Test Supplier GST-1-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_title": "_Test Supplier GST-1",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+91 0000000000",
+				"gstin": "29AACCV0498C1Z9",
+				"gst_state": "Karnataka",
+			}
+		).insert()
+
+		address.append("links", {"link_doctype": "Supplier", "link_name": "_Test Registered Supplier"})
+
+		address.is_shipping_address = 1
+		address.save()
+
+	if not frappe.db.exists("Address", "_Test Supplier GST-2-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_title": "_Test Supplier GST-2",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+91 0000000000",
+				"gst_state": "Karnataka",
+			}
+		).insert()
+
+		address.append("links", {"link_doctype": "Supplier", "link_name": "_Test Unregistered Supplier"})
+
+		address.save()
+
+
+def make_customers():
+	if not frappe.db.exists("Customer", "_Test GST Customer"):
+		frappe.get_doc(
+			{
 				"customer_group": "_Test Customer Group",
-				"customer_name": "_Test GST Customer With GSTIN",
+				"customer_name": "_Test GST Customer",
+				"gst_category": "Registered Regular",
 				"customer_type": "Individual",
 				"doctype": "Customer",
-				"territory": "_Test Territory"
-			}).insert()
+				"territory": "_Test Territory",
+			}
+		).insert()
 
-			self.assertEqual(customer.gst_category, 'Unregistered')
+	if not frappe.db.exists("Customer", "_Test GST SEZ Customer"):
+		frappe.get_doc(
+			{
+				"customer_group": "_Test Customer Group",
+				"customer_name": "_Test GST SEZ Customer",
+				"gst_category": "SEZ",
+				"customer_type": "Individual",
+				"doctype": "Customer",
+				"territory": "_Test Territory",
+			}
+		).insert()
 
-		if not frappe.db.exists('Address', '_Test GST Category-1-Billing'):
-			address = frappe.get_doc({
+	if not frappe.db.exists("Customer", "_Test Unregistered Customer"):
+		frappe.get_doc(
+			{
+				"customer_group": "_Test Customer Group",
+				"customer_name": "_Test Unregistered Customer",
+				"gst_category": "Unregistered",
+				"customer_type": "Individual",
+				"doctype": "Customer",
+				"territory": "_Test Territory",
+			}
+		).insert()
+
+	if not frappe.db.exists("Address", "_Test GST-1-Billing"):
+		address = frappe.get_doc(
+			{
 				"address_line1": "_Test Address Line 1",
-				"address_title": "_Test GST Category-1",
+				"address_title": "_Test GST-1",
 				"address_type": "Billing",
 				"city": "_Test City",
 				"state": "Test State",
@@ -128,315 +428,54 @@
 				"phone": "+91 0000000000",
 				"gstin": "29AZWPS7135H1ZG",
 				"gst_state": "Karnataka",
-				"gst_state_number": "29"
-			}).insert()
+				"gst_state_number": "29",
+			}
+		).insert()
 
-			address.append("links", {
-				"link_doctype": "Customer",
-				"link_name": "_Test GST Customer With GSTIN"
-			})
-
-			address.save()
-
-		customer.load_from_db()
-		self.assertEqual(customer.gst_category, 'Registered Regular')
-
-
-def make_sales_invoice():
-	si = create_sales_invoice(company="_Test Company GST",
-			customer = '_Test GST Customer',
-			currency = 'INR',
-			warehouse = 'Finished Goods - _GST',
-			debit_to = 'Debtors - _GST',
-			income_account = 'Sales - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			cost_center = 'Main - _GST',
-			do_not_save=1
-		)
-
-	si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Output Tax IGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "IGST @ 18.0",
-			"rate": 18
-		})
-
-	si.submit()
-
-	si1 = create_sales_invoice(company="_Test Company GST",
-			customer = '_Test GST SEZ Customer',
-			currency = 'INR',
-			warehouse = 'Finished Goods - _GST',
-			debit_to = 'Debtors - _GST',
-			income_account = 'Sales - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			cost_center = 'Main - _GST',
-			do_not_save=1
-		)
-
-	si1.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Output Tax IGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "IGST @ 18.0",
-			"rate": 18
-		})
-
-	si1.submit()
-
-	si2 = create_sales_invoice(company="_Test Company GST",
-			customer = '_Test Unregistered Customer',
-			currency = 'INR',
-			warehouse = 'Finished Goods - _GST',
-			debit_to = 'Debtors - _GST',
-			income_account = 'Sales - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			cost_center = 'Main - _GST',
-			do_not_save=1
-		)
-
-	si2.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Output Tax IGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "IGST @ 18.0",
-			"rate": 18
-		})
-
-	si2.submit()
-
-	si3 = create_sales_invoice(company="_Test Company GST",
-			customer = '_Test GST Customer',
-			currency = 'INR',
-			item = 'Milk',
-			warehouse = 'Finished Goods - _GST',
-			debit_to = 'Debtors - _GST',
-			income_account = 'Sales - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			cost_center = 'Main - _GST',
-			do_not_save=1
-		)
-	si3.submit()
-
-def create_purchase_invoices():
-	pi = make_purchase_invoice(
-			company="_Test Company GST",
-			supplier = '_Test Registered Supplier',
-			currency = 'INR',
-			warehouse = 'Finished Goods - _GST',
-			cost_center = 'Main - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			do_not_save=1,
-		)
-
-	pi.eligibility_for_itc = "All Other ITC"
-
-	pi.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Input Tax CGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "CGST @ 9.0",
-			"rate": 9
-		})
-
-	pi.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Input Tax SGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "SGST @ 9.0",
-			"rate": 9
-		})
-
-	pi.submit()
-
-	pi1 = make_purchase_invoice(
-			company="_Test Company GST",
-			supplier = '_Test Registered Supplier',
-			currency = 'INR',
-			warehouse = 'Finished Goods - _GST',
-			cost_center = 'Main - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			item = "Milk",
-			do_not_save=1
-		)
-
-	pi1.shipping_address = "_Test Supplier GST-1-Billing"
-	pi1.save()
-
-	pi1.submit()
-
-	pi2 = make_purchase_invoice(company="_Test Company GST",
-			customer = '_Test Registered Supplier',
-			currency = 'INR',
-			item = 'Milk',
-			warehouse = 'Finished Goods - _GST',
-			expense_account = 'Cost of Goods Sold - _GST',
-			cost_center = 'Main - _GST',
-			rate=250,
-			qty=1,
-			do_not_save=1
-		)
-	pi2.submit()
-
-def make_suppliers():
-	if not frappe.db.exists("Supplier", "_Test Registered Supplier"):
-		frappe.get_doc({
-			"supplier_group": "_Test Supplier Group",
-			"supplier_name": "_Test Registered Supplier",
-			"gst_category": "Registered Regular",
-			"supplier_type": "Individual",
-			"doctype": "Supplier",
-		}).insert()
-
-	if not frappe.db.exists("Supplier", "_Test Unregistered Supplier"):
-		frappe.get_doc({
-			"supplier_group": "_Test Supplier Group",
-			"supplier_name": "_Test Unregistered Supplier",
-			"gst_category": "Unregistered",
-			"supplier_type": "Individual",
-			"doctype": "Supplier",
-		}).insert()
-
-	if not frappe.db.exists('Address', '_Test Supplier GST-1-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_title": "_Test Supplier GST-1",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+91 0000000000",
-			"gstin": "29AACCV0498C1Z9",
-			"gst_state": "Karnataka",
-		}).insert()
-
-		address.append("links", {
-			"link_doctype": "Supplier",
-			"link_name": "_Test Registered Supplier"
-		})
-
-		address.is_shipping_address = 1
-		address.save()
-
-	if not frappe.db.exists('Address', '_Test Supplier GST-2-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_title": "_Test Supplier GST-2",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+91 0000000000",
-			"gst_state": "Karnataka",
-		}).insert()
-
-		address.append("links", {
-			"link_doctype": "Supplier",
-			"link_name": "_Test Unregistered Supplier"
-		})
+		address.append("links", {"link_doctype": "Customer", "link_name": "_Test GST Customer"})
 
 		address.save()
 
-def make_customers():
-	if not frappe.db.exists("Customer", "_Test GST Customer"):
-		frappe.get_doc({
-			"customer_group": "_Test Customer Group",
-			"customer_name": "_Test GST Customer",
-			"gst_category": "Registered Regular",
-			"customer_type": "Individual",
-			"doctype": "Customer",
-			"territory": "_Test Territory"
-		}).insert()
+	if not frappe.db.exists("Address", "_Test GST-2-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_title": "_Test GST-2",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+91 0000000000",
+				"gst_state": "Haryana",
+			}
+		).insert()
 
-	if not frappe.db.exists("Customer", "_Test GST SEZ Customer"):
-		frappe.get_doc({
-			"customer_group": "_Test Customer Group",
-			"customer_name": "_Test GST SEZ Customer",
-			"gst_category": "SEZ",
-			"customer_type": "Individual",
-			"doctype": "Customer",
-			"territory": "_Test Territory"
-		}).insert()
-
-	if not frappe.db.exists("Customer", "_Test Unregistered Customer"):
-		frappe.get_doc({
-			"customer_group": "_Test Customer Group",
-			"customer_name": "_Test Unregistered Customer",
-			"gst_category": "Unregistered",
-			"customer_type": "Individual",
-			"doctype": "Customer",
-			"territory": "_Test Territory"
-		}).insert()
-
-	if not frappe.db.exists('Address', '_Test GST-1-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_title": "_Test GST-1",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+91 0000000000",
-			"gstin": "29AZWPS7135H1ZG",
-			"gst_state": "Karnataka",
-			"gst_state_number": "29"
-		}).insert()
-
-		address.append("links", {
-			"link_doctype": "Customer",
-			"link_name": "_Test GST Customer"
-		})
+		address.append("links", {"link_doctype": "Customer", "link_name": "_Test Unregistered Customer"})
 
 		address.save()
 
-	if not frappe.db.exists('Address', '_Test GST-2-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_title": "_Test GST-2",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+91 0000000000",
-			"gst_state": "Haryana",
-		}).insert()
+	if not frappe.db.exists("Address", "_Test GST-3-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_line1": "_Test Address Line 1",
+				"address_title": "_Test GST-3",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+91 0000000000",
+				"gst_state": "Gujarat",
+			}
+		).insert()
 
-		address.append("links", {
-			"link_doctype": "Customer",
-			"link_name": "_Test Unregistered Customer"
-		})
+		address.append("links", {"link_doctype": "Customer", "link_name": "_Test GST SEZ Customer"})
 
 		address.save()
 
-	if not frappe.db.exists('Address', '_Test GST-3-Billing'):
-		address = frappe.get_doc({
-			"address_line1": "_Test Address Line 1",
-			"address_title": "_Test GST-3",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+91 0000000000",
-			"gst_state": "Gujarat",
-		}).insert()
-
-		address.append("links", {
-			"link_doctype": "Customer",
-			"link_name": "_Test GST SEZ Customer"
-		})
-
-		address.save()
 
 def make_company():
 	if frappe.db.exists("Company", "_Test Company GST"):
@@ -449,43 +488,47 @@
 	company.country = "India"
 	company.insert()
 
-	if not frappe.db.exists('Address', '_Test Address GST-Billing'):
-		address = frappe.get_doc({
-			"address_title": "_Test Address GST",
-			"address_line1": "_Test Address Line 1",
-			"address_type": "Billing",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"doctype": "Address",
-			"is_primary_address": 1,
-			"phone": "+91 0000000000",
-			"gstin": "27AAECE4835E1ZR",
-			"gst_state": "Maharashtra",
-			"gst_state_number": "27"
-		}).insert()
+	if not frappe.db.exists("Address", "_Test Address GST-Billing"):
+		address = frappe.get_doc(
+			{
+				"address_title": "_Test Address GST",
+				"address_line1": "_Test Address Line 1",
+				"address_type": "Billing",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"doctype": "Address",
+				"is_primary_address": 1,
+				"phone": "+91 0000000000",
+				"gstin": "27AAECE4835E1ZR",
+				"gst_state": "Maharashtra",
+				"gst_state_number": "27",
+			}
+		).insert()
 
-		address.append("links", {
-			"link_doctype": "Company",
-			"link_name": "_Test Company GST"
-		})
+		address.append("links", {"link_doctype": "Company", "link_name": "_Test Company GST"})
 
 		address.save()
 
+
 def set_account_heads():
 	gst_settings = frappe.get_doc("GST Settings")
 
 	gst_account = frappe.get_all(
 		"GST Account",
 		fields=["cgst_account", "sgst_account", "igst_account"],
-		filters = {"company": "_Test Company GST"})
+		filters={"company": "_Test Company GST"},
+	)
 
 	if not gst_account:
-		gst_settings.append("gst_accounts", {
-			"company": "_Test Company GST",
-			"cgst_account": "Output Tax CGST - _GST",
-			"sgst_account": "Output Tax SGST - _GST",
-			"igst_account": "Output Tax IGST - _GST"
-		})
+		gst_settings.append(
+			"gst_accounts",
+			{
+				"company": "_Test Company GST",
+				"cgst_account": "Output Tax CGST - _GST",
+				"sgst_account": "Output Tax SGST - _GST",
+				"igst_account": "Output Tax IGST - _GST",
+			},
+		)
 
 		gst_settings.save()
diff --git a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
index 97b8488..77c4d7c 100644
--- a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
+++ b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
@@ -27,11 +27,10 @@
 			self.name = "Import Invoice on " + format_datetime(self.creation)
 
 	def import_xml_data(self):
-		zip_file = frappe.get_doc("File", {
-			"file_url": self.zip_file,
-			"attached_to_doctype": self.doctype,
-			"attached_to_name": self.name
-		})
+		zip_file = frappe.get_doc(
+			"File",
+			{"file_url": self.zip_file, "attached_to_doctype": self.doctype, "attached_to_name": self.name},
+		)
 
 		self.publish("File Import", _("Processing XML Files"), 1, 3)
 
@@ -65,10 +64,10 @@
 				"bill_no": line.Numero.text,
 				"total_discount": 0,
 				"items": [],
-				"buying_price_list": self.default_buying_price_list
+				"buying_price_list": self.default_buying_price_list,
 			}
 
-			if not invoices_args.get("bill_no", ''):
+			if not invoices_args.get("bill_no", ""):
 				frappe.throw(_("Numero has not set in the XML file"))
 
 			supp_dict = get_supplier_details(file_content)
@@ -84,15 +83,23 @@
 			self.file_count += 1
 			if pi_name:
 				self.purchase_invoices_count += 1
-				file_save = save_file(file_name, encoded_content, "Purchase Invoice",
-					pi_name, folder=None, decode=False, is_private=0, df=None)
+				file_save = save_file(
+					file_name,
+					encoded_content,
+					"Purchase Invoice",
+					pi_name,
+					folder=None,
+					decode=False,
+					is_private=0,
+					df=None,
+				)
 
 	def prepare_items_for_invoice(self, file_content, invoices_args):
 		qty = 1
-		rate, tax_rate = [0 ,0]
+		rate, tax_rate = [0, 0]
 		uom = self.default_uom
 
-		#read file for item information
+		# read file for item information
 		for line in file_content.find_all("DettaglioLinee"):
 			if line.find("PrezzoUnitario") and line.find("PrezzoTotale"):
 				rate = flt(line.PrezzoUnitario.text) or 0
@@ -103,30 +110,34 @@
 					if line.find("UnitaMisura"):
 						uom = create_uom(line.UnitaMisura.text)
 
-				if (rate < 0 and line_total < 0):
+				if rate < 0 and line_total < 0:
 					qty *= -1
 					invoices_args["return_invoice"] = 1
 
 				if line.find("AliquotaIVA"):
 					tax_rate = flt(line.AliquotaIVA.text)
 
-				line_str = re.sub('[^A-Za-z0-9]+', '-', line.Descrizione.text)
+				line_str = re.sub("[^A-Za-z0-9]+", "-", line.Descrizione.text)
 				item_name = line_str[0:140]
 
-				invoices_args['items'].append({
-					"item_code": self.item_code,
-					"item_name": item_name,
-					"description": line_str,
-					"qty": qty,
-					"uom": uom,
-					"rate": abs(rate),
-					"conversion_factor": 1.0,
-					"tax_rate": tax_rate
-				})
+				invoices_args["items"].append(
+					{
+						"item_code": self.item_code,
+						"item_name": item_name,
+						"description": line_str,
+						"qty": qty,
+						"uom": uom,
+						"rate": abs(rate),
+						"conversion_factor": 1.0,
+						"tax_rate": tax_rate,
+					}
+				)
 
 				for disc_line in line.find_all("ScontoMaggiorazione"):
 					if disc_line.find("Percentuale"):
-						invoices_args["total_discount"] += flt((flt(disc_line.Percentuale.text) / 100) * (rate * qty))
+						invoices_args["total_discount"] += flt(
+							(flt(disc_line.Percentuale.text) / 100) * (rate * qty)
+						)
 
 	@frappe.whitelist()
 	def process_file_data(self):
@@ -134,10 +145,13 @@
 		frappe.enqueue_doc(self.doctype, self.name, "import_xml_data", queue="long", timeout=3600)
 
 	def publish(self, title, message, count, total):
-		frappe.publish_realtime("import_invoice_update", {"title": title, "message": message, "count": count, "total": total})
+		frappe.publish_realtime(
+			"import_invoice_update", {"title": title, "message": message, "count": count, "total": total}
+		)
+
 
 def get_file_content(file_name, zip_file_object):
-	content = ''
+	content = ""
 	encoded_content = zip_file_object.read(file_name)
 
 	try:
@@ -150,113 +164,122 @@
 
 	return content
 
+
 def get_supplier_details(file_content):
 	supplier_info = {}
 	for line in file_content.find_all("CedentePrestatore"):
-		supplier_info['tax_id'] = line.DatiAnagrafici.IdPaese.text + line.DatiAnagrafici.IdCodice.text
+		supplier_info["tax_id"] = line.DatiAnagrafici.IdPaese.text + line.DatiAnagrafici.IdCodice.text
 		if line.find("CodiceFiscale"):
-			supplier_info['fiscal_code'] = line.DatiAnagrafici.CodiceFiscale.text
+			supplier_info["fiscal_code"] = line.DatiAnagrafici.CodiceFiscale.text
 
 		if line.find("RegimeFiscale"):
-			supplier_info['fiscal_regime'] = line.DatiAnagrafici.RegimeFiscale.text
+			supplier_info["fiscal_regime"] = line.DatiAnagrafici.RegimeFiscale.text
 
 		if line.find("Denominazione"):
-			supplier_info['supplier'] = line.DatiAnagrafici.Anagrafica.Denominazione.text
+			supplier_info["supplier"] = line.DatiAnagrafici.Anagrafica.Denominazione.text
 
 		if line.find("Nome"):
-			supplier_info['supplier'] = (line.DatiAnagrafici.Anagrafica.Nome.text
-				+ " " + line.DatiAnagrafici.Anagrafica.Cognome.text)
+			supplier_info["supplier"] = (
+				line.DatiAnagrafici.Anagrafica.Nome.text + " " + line.DatiAnagrafici.Anagrafica.Cognome.text
+			)
 
-		supplier_info['address_line1'] = line.Sede.Indirizzo.text
-		supplier_info['city'] = line.Sede.Comune.text
+		supplier_info["address_line1"] = line.Sede.Indirizzo.text
+		supplier_info["city"] = line.Sede.Comune.text
 		if line.find("Provincia"):
-			supplier_info['province'] = line.Sede.Provincia.text
+			supplier_info["province"] = line.Sede.Provincia.text
 
-		supplier_info['pin_code'] = line.Sede.CAP.text
-		supplier_info['country'] = get_country(line.Sede.Nazione.text)
+		supplier_info["pin_code"] = line.Sede.CAP.text
+		supplier_info["country"] = get_country(line.Sede.Nazione.text)
 
 		return supplier_info
 
+
 def get_taxes_from_file(file_content, tax_account):
 	taxes = []
-	#read file for taxes information
+	# read file for taxes information
 	for line in file_content.find_all("DatiRiepilogo"):
 		if line.find("AliquotaIVA"):
 			if line.find("EsigibilitaIVA"):
 				descr = line.EsigibilitaIVA.text
 			else:
 				descr = "None"
-			taxes.append({
-				"charge_type": "Actual",
-				"account_head": tax_account,
-				"tax_rate": flt(line.AliquotaIVA.text) or 0,
-				"description": descr,
-				"tax_amount": flt(line.Imposta.text) if len(line.find("Imposta"))!=0 else 0
-			})
+			taxes.append(
+				{
+					"charge_type": "Actual",
+					"account_head": tax_account,
+					"tax_rate": flt(line.AliquotaIVA.text) or 0,
+					"description": descr,
+					"tax_amount": flt(line.Imposta.text) if len(line.find("Imposta")) != 0 else 0,
+				}
+			)
 
 	return taxes
 
+
 def get_payment_terms_from_file(file_content):
 	terms = []
-	#Get mode of payment dict from setup
-	mop_options = frappe.get_meta('Mode of Payment').fields[4].options
-	mop_str = re.sub('\n', ',', mop_options)
+	# Get mode of payment dict from setup
+	mop_options = frappe.get_meta("Mode of Payment").fields[4].options
+	mop_str = re.sub("\n", ",", mop_options)
 	mop_dict = dict(item.split("-") for item in mop_str.split(","))
-	#read file for payment information
+	# read file for payment information
 	for line in file_content.find_all("DettaglioPagamento"):
-		mop_code = line.ModalitaPagamento.text + '-' + mop_dict.get(line.ModalitaPagamento.text)
+		mop_code = line.ModalitaPagamento.text + "-" + mop_dict.get(line.ModalitaPagamento.text)
 		if line.find("DataScadenzaPagamento"):
 			due_date = dateutil.parser.parse(line.DataScadenzaPagamento.text).strftime("%Y-%m-%d")
 		else:
 			due_date = today()
-		terms.append({
-			"mode_of_payment_code": mop_code,
-			"bank_account_iban": line.IBAN.text if line.find("IBAN") else "",
-			"due_date": due_date,
-			"payment_amount": line.ImportoPagamento.text
-		})
+		terms.append(
+			{
+				"mode_of_payment_code": mop_code,
+				"bank_account_iban": line.IBAN.text if line.find("IBAN") else "",
+				"due_date": due_date,
+				"payment_amount": line.ImportoPagamento.text,
+			}
+		)
 
 	return terms
 
+
 def get_destination_code_from_file(file_content):
-	destination_code = ''
+	destination_code = ""
 	for line in file_content.find_all("DatiTrasmissione"):
 		destination_code = line.CodiceDestinatario.text
 
 	return destination_code
 
+
 def create_supplier(supplier_group, args):
 	args = frappe._dict(args)
 
-	existing_supplier_name = frappe.db.get_value("Supplier",
-				filters={"tax_id": args.tax_id}, fieldname="name")
+	existing_supplier_name = frappe.db.get_value(
+		"Supplier", filters={"tax_id": args.tax_id}, fieldname="name"
+	)
 	if existing_supplier_name:
 		pass
 	else:
-		existing_supplier_name = frappe.db.get_value("Supplier",
-				filters={"name": args.supplier}, fieldname="name")
+		existing_supplier_name = frappe.db.get_value(
+			"Supplier", filters={"name": args.supplier}, fieldname="name"
+		)
 
 	if existing_supplier_name:
 		filters = [
-				["Dynamic Link", "link_doctype", "=", "Supplier"],
-				["Dynamic Link", "link_name", "=", args.existing_supplier_name],
-				["Dynamic Link", "parenttype", "=", "Contact"]
-			]
+			["Dynamic Link", "link_doctype", "=", "Supplier"],
+			["Dynamic Link", "link_name", "=", args.existing_supplier_name],
+			["Dynamic Link", "parenttype", "=", "Contact"],
+		]
 
 		if not frappe.get_list("Contact", filters):
 			new_contact = frappe.new_doc("Contact")
 			new_contact.first_name = args.supplier[:30]
-			new_contact.append('links', {
-				"link_doctype": "Supplier",
-				"link_name": existing_supplier_name
-			})
+			new_contact.append("links", {"link_doctype": "Supplier", "link_name": existing_supplier_name})
 			new_contact.insert(ignore_mandatory=True)
 
 		return existing_supplier_name
 	else:
 
 		new_supplier = frappe.new_doc("Supplier")
-		new_supplier.supplier_name = re.sub('&amp', '&', args.supplier)
+		new_supplier.supplier_name = re.sub("&amp", "&", args.supplier)
 		new_supplier.supplier_group = supplier_group
 		new_supplier.tax_id = args.tax_id
 		new_supplier.fiscal_code = args.fiscal_code
@@ -265,23 +288,21 @@
 
 		new_contact = frappe.new_doc("Contact")
 		new_contact.first_name = args.supplier[:30]
-		new_contact.append('links', {
-			"link_doctype": "Supplier",
-			"link_name": new_supplier.name
-		})
+		new_contact.append("links", {"link_doctype": "Supplier", "link_name": new_supplier.name})
 
 		new_contact.insert(ignore_mandatory=True)
 
 		return new_supplier.name
 
+
 def create_address(supplier_name, args):
 	args = frappe._dict(args)
 
 	filters = [
-			["Dynamic Link", "link_doctype", "=", "Supplier"],
-			["Dynamic Link", "link_name", "=", supplier_name],
-			["Dynamic Link", "parenttype", "=", "Address"]
-		]
+		["Dynamic Link", "link_doctype", "=", "Supplier"],
+		["Dynamic Link", "link_name", "=", supplier_name],
+		["Dynamic Link", "parenttype", "=", "Address"],
+	]
 
 	existing_address = frappe.get_list("Address", filters)
 
@@ -300,50 +321,52 @@
 
 		for address in existing_address:
 			address_doc = frappe.get_doc("Address", address["name"])
-			if (address_doc.address_line1 == new_address_doc.address_line1 and
-				address_doc.pincode == new_address_doc.pincode):
+			if (
+				address_doc.address_line1 == new_address_doc.address_line1
+				and address_doc.pincode == new_address_doc.pincode
+			):
 				return address
 
-		new_address_doc.append("links", {
-			"link_doctype": "Supplier",
-			"link_name": supplier_name
-		})
+		new_address_doc.append("links", {"link_doctype": "Supplier", "link_name": supplier_name})
 		new_address_doc.address_type = "Billing"
 		new_address_doc.insert(ignore_mandatory=True)
 		return new_address_doc.name
 	else:
 		return None
 
+
 def create_purchase_invoice(supplier_name, file_name, args, name):
 	args = frappe._dict(args)
-	pi = frappe.get_doc({
-		"doctype": "Purchase Invoice",
-		"company": args.company,
-		"currency": erpnext.get_company_currency(args.company),
-		"naming_series": args.naming_series,
-		"supplier": supplier_name,
-		"is_return": args.is_return,
-		"posting_date": today(),
-		"bill_no": args.bill_no,
-		"buying_price_list": args.buying_price_list,
-		"bill_date": args.bill_date,
-		"destination_code": args.destination_code,
-		"document_type": args.document_type,
-		"disable_rounded_total": 1,
-		"items": args["items"],
-		"taxes": args["taxes"]
-	})
+	pi = frappe.get_doc(
+		{
+			"doctype": "Purchase Invoice",
+			"company": args.company,
+			"currency": erpnext.get_company_currency(args.company),
+			"naming_series": args.naming_series,
+			"supplier": supplier_name,
+			"is_return": args.is_return,
+			"posting_date": today(),
+			"bill_no": args.bill_no,
+			"buying_price_list": args.buying_price_list,
+			"bill_date": args.bill_date,
+			"destination_code": args.destination_code,
+			"document_type": args.document_type,
+			"disable_rounded_total": 1,
+			"items": args["items"],
+			"taxes": args["taxes"],
+		}
+	)
 
 	try:
 		pi.set_missing_values()
 		pi.insert(ignore_mandatory=True)
 
-		#if discount exists in file, apply any discount on grand total
+		# if discount exists in file, apply any discount on grand total
 		if args.total_discount > 0:
 			pi.apply_discount_on = "Grand Total"
 			pi.discount_amount = args.total_discount
 			pi.save()
-		#adjust payment amount to match with grand total calculated
+		# adjust payment amount to match with grand total calculated
 		calc_total = 0
 		adj = 0
 		for term in args.terms:
@@ -352,31 +375,37 @@
 			adj = calc_total - flt(pi.grand_total)
 		pi.payment_schedule = []
 		for term in args.terms:
-			pi.append('payment_schedule',{"mode_of_payment_code": term["mode_of_payment_code"],
-			"bank_account_iban": term["bank_account_iban"],
-			"due_date": term["due_date"],
-			"payment_amount": flt(term["payment_amount"]) - adj })
+			pi.append(
+				"payment_schedule",
+				{
+					"mode_of_payment_code": term["mode_of_payment_code"],
+					"bank_account_iban": term["bank_account_iban"],
+					"due_date": term["due_date"],
+					"payment_amount": flt(term["payment_amount"]) - adj,
+				},
+			)
 			adj = 0
 		pi.imported_grand_total = calc_total
 		pi.save()
 		return pi.name
 	except Exception as e:
 		frappe.db.set_value("Import Supplier Invoice", name, "status", "Error")
-		frappe.log_error(message=e,
-			title="Create Purchase Invoice: " + args.get("bill_no") + "File Name: " + file_name)
+		frappe.log_error(
+			message=e, title="Create Purchase Invoice: " + args.get("bill_no") + "File Name: " + file_name
+		)
 		return None
 
+
 def get_country(code):
-	existing_country_name = frappe.db.get_value("Country",
-			filters={"code": code}, fieldname="name")
+	existing_country_name = frappe.db.get_value("Country", filters={"code": code}, fieldname="name")
 	if existing_country_name:
 		return existing_country_name
 	else:
 		frappe.throw(_("Country Code in File does not match with country code set up in the system"))
 
+
 def create_uom(uom):
-	existing_uom = frappe.db.get_value("UOM",
-			filters={"uom_name": uom}, fieldname="uom_name")
+	existing_uom = frappe.db.get_value("UOM", filters={"uom_name": uom}, fieldname="uom_name")
 	if existing_uom:
 		return existing_uom
 	else:
diff --git a/erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.py b/erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.py
index f148881..cc223e9 100644
--- a/erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.py
+++ b/erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.py
@@ -21,24 +21,34 @@
 
 		fiscal_year = get_fiscal_year(fiscal_year=self.fiscal_year, as_dict=True)
 
-		if not (fiscal_year.year_start_date <= getdate(self.valid_from) \
-			<= fiscal_year.year_end_date):
+		if not (fiscal_year.year_start_date <= getdate(self.valid_from) <= fiscal_year.year_end_date):
 			frappe.throw(_("Valid From date not in Fiscal Year {0}").format(frappe.bold(self.fiscal_year)))
 
-		if not (fiscal_year.year_start_date <= getdate(self.valid_upto) \
-			<= fiscal_year.year_end_date):
+		if not (fiscal_year.year_start_date <= getdate(self.valid_upto) <= fiscal_year.year_end_date):
 			frappe.throw(_("Valid Upto date not in Fiscal Year {0}").format(frappe.bold(self.fiscal_year)))
 
 	def validate_supplier_against_tax_category(self):
-		duplicate_certificate = frappe.db.get_value('Lower Deduction Certificate',
-			{'supplier': self.supplier, 'tax_withholding_category': self.tax_withholding_category, 'name': ("!=", self.name)},
-			['name', 'valid_from', 'valid_upto'], as_dict=True)
+		duplicate_certificate = frappe.db.get_value(
+			"Lower Deduction Certificate",
+			{
+				"supplier": self.supplier,
+				"tax_withholding_category": self.tax_withholding_category,
+				"name": ("!=", self.name),
+			},
+			["name", "valid_from", "valid_upto"],
+			as_dict=True,
+		)
 		if duplicate_certificate and self.are_dates_overlapping(duplicate_certificate):
-			certificate_link = get_link_to_form('Lower Deduction Certificate', duplicate_certificate.name)
-			frappe.throw(_("There is already a valid Lower Deduction Certificate {0} for Supplier {1} against category {2} for this time period.")
-				.format(certificate_link, frappe.bold(self.supplier), frappe.bold(self.tax_withholding_category)))
+			certificate_link = get_link_to_form("Lower Deduction Certificate", duplicate_certificate.name)
+			frappe.throw(
+				_(
+					"There is already a valid Lower Deduction Certificate {0} for Supplier {1} against category {2} for this time period."
+				).format(
+					certificate_link, frappe.bold(self.supplier), frappe.bold(self.tax_withholding_category)
+				)
+			)
 
-	def are_dates_overlapping(self,duplicate_certificate):
+	def are_dates_overlapping(self, duplicate_certificate):
 		valid_from = duplicate_certificate.valid_from
 		valid_upto = duplicate_certificate.valid_upto
 		if valid_from <= getdate(self.valid_from) <= valid_upto:
diff --git a/erpnext/regional/france/setup.py b/erpnext/regional/france/setup.py
index 5d48203..da772d6 100644
--- a/erpnext/regional/france/setup.py
+++ b/erpnext/regional/france/setup.py
@@ -5,28 +5,26 @@
 import frappe
 from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
 
+
 def setup(company=None, patch=True):
 	make_custom_fields()
 	add_custom_roles_for_reports()
 
+
 def make_custom_fields():
 	custom_fields = {
-		'Company': [
-			dict(fieldname='siren_number', label='SIREN Number',
-			fieldtype='Data', insert_after='website')
+		"Company": [
+			dict(fieldname="siren_number", label="SIREN Number", fieldtype="Data", insert_after="website")
 		]
 	}
 
 	create_custom_fields(custom_fields)
 
-def add_custom_roles_for_reports():
-	report_name = 'Fichier des Ecritures Comptables [FEC]'
 
-	if not frappe.db.get_value('Custom Role', dict(report=report_name)):
-		frappe.get_doc(dict(
-			doctype='Custom Role',
-			report=report_name,
-			roles= [
-				dict(role='Accounts Manager')
-			]
-		)).insert()
+def add_custom_roles_for_reports():
+	report_name = "Fichier des Ecritures Comptables [FEC]"
+
+	if not frappe.db.get_value("Custom Role", dict(report=report_name)):
+		frappe.get_doc(
+			dict(doctype="Custom Role", report=report_name, roles=[dict(role="Accounts Manager")])
+		).insert()
diff --git a/erpnext/regional/france/utils.py b/erpnext/regional/france/utils.py
index 8413165..65dfd2d 100644
--- a/erpnext/regional/france/utils.py
+++ b/erpnext/regional/france/utils.py
@@ -2,8 +2,7 @@
 # For license information, please see license.txt
 
 
-
 # don't remove this function it is used in tests
 def test_method():
-	'''test function'''
-	return 'overridden'
+	"""test function"""
+	return "overridden"
diff --git a/erpnext/regional/germany/setup.py b/erpnext/regional/germany/setup.py
index a68cecc..b8e66c3 100644
--- a/erpnext/regional/germany/setup.py
+++ b/erpnext/regional/germany/setup.py
@@ -9,9 +9,14 @@
 
 def make_custom_fields():
 	custom_fields = {
-		'Party Account': [
-			dict(fieldname='debtor_creditor_number', label='Debtor/Creditor Number',
-			fieldtype='Data', insert_after='account', translatable=0)
+		"Party Account": [
+			dict(
+				fieldname="debtor_creditor_number",
+				label="Debtor/Creditor Number",
+				fieldtype="Data",
+				insert_after="account",
+				translatable=0,
+			)
 		]
 	}
 
@@ -20,12 +25,11 @@
 
 def add_custom_roles_for_reports():
 	"""Add Access Control to UAE VAT 201."""
-	if not frappe.db.get_value('Custom Role', dict(report='DATEV')):
-		frappe.get_doc(dict(
-			doctype='Custom Role',
-			report='DATEV',
-			roles= [
-				dict(role='Accounts User'),
-				dict(role='Accounts Manager')
-			]
-		)).insert()
+	if not frappe.db.get_value("Custom Role", dict(report="DATEV")):
+		frappe.get_doc(
+			dict(
+				doctype="Custom Role",
+				report="DATEV",
+				roles=[dict(role="Accounts User"), dict(role="Accounts Manager")],
+			)
+		).insert()
diff --git a/erpnext/regional/germany/utils/datev/datev_constants.py b/erpnext/regional/germany/utils/datev/datev_constants.py
index 8f2dc2d..9524481 100644
--- a/erpnext/regional/germany/utils/datev/datev_constants.py
+++ b/erpnext/regional/germany/utils/datev/datev_constants.py
@@ -185,7 +185,7 @@
 	# Steuersatz für Steuerschlüssel
 	"Steuersatz",
 	# Beispiel: DE für Deutschland
-	"Land"
+	"Land",
 ]
 
 DEBTOR_CREDITOR_COLUMNS = [
@@ -446,7 +446,7 @@
 	"Mahnfrist 1",
 	"Mahnfrist 2",
 	"Mahnfrist 3",
-	"Letzte Frist"
+	"Letzte Frist",
 ]
 
 ACCOUNT_NAME_COLUMNS = [
@@ -456,10 +456,11 @@
 	"Kontenbeschriftung",
 	# Language of the account name
 	# "de-DE" or "en-GB"
-	"Sprach-ID"
+	"Sprach-ID",
 ]
 
-class DataCategory():
+
+class DataCategory:
 
 	"""Field of the CSV Header."""
 
@@ -468,7 +469,8 @@
 	TRANSACTIONS = "21"
 	POSTING_TEXT_CONSTANTS = "67"
 
-class FormatName():
+
+class FormatName:
 
 	"""Field of the CSV Header, corresponds to DataCategory."""
 
@@ -477,19 +479,22 @@
 	TRANSACTIONS = "Buchungsstapel"
 	POSTING_TEXT_CONSTANTS = "Buchungstextkonstanten"
 
-class Transactions():
+
+class Transactions:
 	DATA_CATEGORY = DataCategory.TRANSACTIONS
 	FORMAT_NAME = FormatName.TRANSACTIONS
 	FORMAT_VERSION = "9"
 	COLUMNS = TRANSACTION_COLUMNS
 
-class DebtorsCreditors():
+
+class DebtorsCreditors:
 	DATA_CATEGORY = DataCategory.DEBTORS_CREDITORS
 	FORMAT_NAME = FormatName.DEBTORS_CREDITORS
 	FORMAT_VERSION = "5"
 	COLUMNS = DEBTOR_CREDITOR_COLUMNS
 
-class AccountNames():
+
+class AccountNames:
 	DATA_CATEGORY = DataCategory.ACCOUNT_NAMES
 	FORMAT_NAME = FormatName.ACCOUNT_NAMES
 	FORMAT_VERSION = "2"
diff --git a/erpnext/regional/germany/utils/datev/datev_csv.py b/erpnext/regional/germany/utils/datev/datev_csv.py
index ec271a1..d4e9c27 100644
--- a/erpnext/regional/germany/utils/datev/datev_csv.py
+++ b/erpnext/regional/germany/utils/datev/datev_csv.py
@@ -28,133 +28,137 @@
 	result = empty_df.append(data_df, sort=True)
 
 	if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS:
-		result['Belegdatum'] = pd.to_datetime(result['Belegdatum'])
+		result["Belegdatum"] = pd.to_datetime(result["Belegdatum"])
 
-		result['Beleginfo - Inhalt 6'] = pd.to_datetime(result['Beleginfo - Inhalt 6'])
-		result['Beleginfo - Inhalt 6'] = result['Beleginfo - Inhalt 6'].dt.strftime('%d%m%Y')
+		result["Beleginfo - Inhalt 6"] = pd.to_datetime(result["Beleginfo - Inhalt 6"])
+		result["Beleginfo - Inhalt 6"] = result["Beleginfo - Inhalt 6"].dt.strftime("%d%m%Y")
 
-		result['Fälligkeit'] = pd.to_datetime(result['Fälligkeit'])
-		result['Fälligkeit'] = result['Fälligkeit'].dt.strftime('%d%m%y')
+		result["Fälligkeit"] = pd.to_datetime(result["Fälligkeit"])
+		result["Fälligkeit"] = result["Fälligkeit"].dt.strftime("%d%m%y")
 
-		result.sort_values(by='Belegdatum', inplace=True, kind='stable', ignore_index=True)
+		result.sort_values(by="Belegdatum", inplace=True, kind="stable", ignore_index=True)
 
 	if csv_class.DATA_CATEGORY == DataCategory.ACCOUNT_NAMES:
-		result['Sprach-ID'] = 'de-DE'
+		result["Sprach-ID"] = "de-DE"
 
 	data = result.to_csv(
 		# Reason for str(';'): https://github.com/pandas-dev/pandas/issues/6035
-		sep=';',
+		sep=";",
 		# European decimal seperator
-		decimal=',',
+		decimal=",",
 		# Windows "ANSI" encoding
-		encoding='latin_1',
+		encoding="latin_1",
 		# format date as DDMM
-		date_format='%d%m',
+		date_format="%d%m",
 		# Windows line terminator
-		line_terminator='\r\n',
+		line_terminator="\r\n",
 		# Do not number rows
 		index=False,
 		# Use all columns defined above
 		columns=csv_class.COLUMNS,
 		# Quote most fields, even currency values with "," separator
-		quoting=QUOTE_NONNUMERIC
+		quoting=QUOTE_NONNUMERIC,
 	)
 
-	data = data.encode('latin_1', errors='replace')
+	data = data.encode("latin_1", errors="replace")
 
 	header = get_header(filters, csv_class)
-	header = ';'.join(header).encode('latin_1', errors='replace')
+	header = ";".join(header).encode("latin_1", errors="replace")
 
 	# 1st Row: Header with meta data
 	# 2nd Row: Data heading (Überschrift der Nutzdaten), included in `data` here.
 	# 3rd - nth Row: Data (Nutzdaten)
-	return header + b'\r\n' + data
+	return header + b"\r\n" + data
 
 
 def get_header(filters, csv_class):
-	description = filters.get('voucher_type', csv_class.FORMAT_NAME)
-	company = filters.get('company')
-	datev_settings = frappe.get_doc('DATEV Settings', {'client': company})
-	default_currency = frappe.get_value('Company', company, 'default_currency')
-	coa = frappe.get_value('Company', company, 'chart_of_accounts')
-	coa_short_code = '04' if 'SKR04' in coa else ('03' if 'SKR03' in coa else '')
+	description = filters.get("voucher_type", csv_class.FORMAT_NAME)
+	company = filters.get("company")
+	datev_settings = frappe.get_doc("DATEV Settings", {"client": company})
+	default_currency = frappe.get_value("Company", company, "default_currency")
+	coa = frappe.get_value("Company", company, "chart_of_accounts")
+	coa_short_code = "04" if "SKR04" in coa else ("03" if "SKR03" in coa else "")
 
 	header = [
 		# DATEV format
-		#	"DTVF" = created by DATEV software,
-		#	"EXTF" = created by other software
+		# 	"DTVF" = created by DATEV software,
+		# 	"EXTF" = created by other software
 		'"EXTF"',
 		# version of the DATEV format
-		#	141 = 1.41, 
-		#	510 = 5.10,
-		#	720 = 7.20
-		'700',
+		# 	141 = 1.41,
+		# 	510 = 5.10,
+		# 	720 = 7.20
+		"700",
 		csv_class.DATA_CATEGORY,
 		'"%s"' % csv_class.FORMAT_NAME,
 		# Format version (regarding format name)
 		csv_class.FORMAT_VERSION,
 		# Generated on
-		datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '000',
+		datetime.datetime.now().strftime("%Y%m%d%H%M%S") + "000",
 		# Imported on -- stays empty
-		'',
+		"",
 		# Origin. Any two symbols, will be replaced by "SV" on import.
 		'"EN"',
 		# I = Exported by
 		'"%s"' % frappe.session.user,
 		# J = Imported by -- stays empty
-		'',
+		"",
 		# K = Tax consultant number (Beraternummer)
-		datev_settings.get('consultant_number', '0000000'),
+		datev_settings.get("consultant_number", "0000000"),
 		# L = Tax client number (Mandantennummer)
-		datev_settings.get('client_number', '00000'),
+		datev_settings.get("client_number", "00000"),
 		# M = Start of the fiscal year (Wirtschaftsjahresbeginn)
-		frappe.utils.formatdate(filters.get('fiscal_year_start'), 'yyyyMMdd'),
+		frappe.utils.formatdate(filters.get("fiscal_year_start"), "yyyyMMdd"),
 		# N = Length of account numbers (Sachkontenlänge)
-		str(filters.get('account_number_length', 4)),
+		str(filters.get("account_number_length", 4)),
 		# O = Transaction batch start date (YYYYMMDD)
-		frappe.utils.formatdate(filters.get('from_date'), 'yyyyMMdd') if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else '',
+		frappe.utils.formatdate(filters.get("from_date"), "yyyyMMdd")
+		if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS
+		else "",
 		# P = Transaction batch end date (YYYYMMDD)
-		frappe.utils.formatdate(filters.get('to_date'), 'yyyyMMdd') if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else '',
+		frappe.utils.formatdate(filters.get("to_date"), "yyyyMMdd")
+		if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS
+		else "",
 		# Q = Description (for example, "Sales Invoice") Max. 30 chars
-		'"{}"'.format(_(description)) if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else '',
+		'"{}"'.format(_(description)) if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else "",
 		# R = Diktatkürzel
-		'',
+		"",
 		# S = Buchungstyp
-		#	1 = Transaction batch (Finanzbuchführung),
-		#	2 = Annual financial statement (Jahresabschluss)
-		'1' if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else '',
+		# 	1 = Transaction batch (Finanzbuchführung),
+		# 	2 = Annual financial statement (Jahresabschluss)
+		"1" if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else "",
 		# T = Rechnungslegungszweck
-		#	0 oder leer = vom Rechnungslegungszweck unabhängig
-		#	50 = Handelsrecht
-		#	30 = Steuerrecht
-		#	64 = IFRS
-		#	40 = Kalkulatorik
-		#	11 = Reserviert
-		#	12 = Reserviert
-		'0' if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else '',
+		# 	0 oder leer = vom Rechnungslegungszweck unabhängig
+		# 	50 = Handelsrecht
+		# 	30 = Steuerrecht
+		# 	64 = IFRS
+		# 	40 = Kalkulatorik
+		# 	11 = Reserviert
+		# 	12 = Reserviert
+		"0" if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else "",
 		# U = Festschreibung
 		# TODO: Filter by Accounting Period. In export for closed Accounting Period, this will be "1"
-		'0',
+		"0",
 		# V = Default currency, for example, "EUR"
-		'"%s"' % default_currency if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else '',
+		'"%s"' % default_currency if csv_class.DATA_CATEGORY == DataCategory.TRANSACTIONS else "",
 		# reserviert
-		'',
+		"",
 		# Derivatskennzeichen
-		'',
+		"",
 		# reserviert
-		'',
+		"",
 		# reserviert
-		'',
+		"",
 		# SKR
 		'"%s"' % coa_short_code,
 		# Branchen-Lösungs-ID
-		'',
+		"",
 		# reserviert
-		'',
+		"",
 		# reserviert
-		'',
+		"",
 		# Anwendungsinformation (Verarbeitungskennzeichen der abgebenden Anwendung)
-		''
+		"",
 	]
 	return header
 
@@ -169,12 +173,12 @@
 	"""
 	zip_buffer = BytesIO()
 
-	zip_file = zipfile.ZipFile(zip_buffer, mode='w', compression=zipfile.ZIP_DEFLATED)
+	zip_file = zipfile.ZipFile(zip_buffer, mode="w", compression=zipfile.ZIP_DEFLATED)
 	for csv_file in csv_files:
-		zip_file.writestr(csv_file.get('file_name'), csv_file.get('csv_data'))
+		zip_file.writestr(csv_file.get("file_name"), csv_file.get("csv_data"))
 
 	zip_file.close()
 
-	frappe.response['filecontent'] = zip_buffer.getvalue()
-	frappe.response['filename'] = zip_filename
-	frappe.response['type'] = 'binary'
+	frappe.response["filecontent"] = zip_buffer.getvalue()
+	frappe.response["filename"] = zip_filename
+	frappe.response["type"] = "binary"
diff --git a/erpnext/regional/india/__init__.py b/erpnext/regional/india/__init__.py
index c703575..2e98a03 100644
--- a/erpnext/regional/india/__init__.py
+++ b/erpnext/regional/india/__init__.py
@@ -1,83 +1,82 @@
-
 states = [
- '',
- 'Andaman and Nicobar Islands',
- 'Andhra Pradesh',
- 'Arunachal Pradesh',
- 'Assam',
- 'Bihar',
- 'Chandigarh',
- 'Chhattisgarh',
- 'Dadra and Nagar Haveli and Daman and Diu',
- 'Delhi',
- 'Goa',
- 'Gujarat',
- 'Haryana',
- 'Himachal Pradesh',
- 'Jammu and Kashmir',
- 'Jharkhand',
- 'Karnataka',
- 'Kerala',
- 'Ladakh',
- 'Lakshadweep Islands',
- 'Madhya Pradesh',
- 'Maharashtra',
- 'Manipur',
- 'Meghalaya',
- 'Mizoram',
- 'Nagaland',
- 'Odisha',
- 'Other Territory',
- 'Pondicherry',
- 'Punjab',
- 'Rajasthan',
- 'Sikkim',
- 'Tamil Nadu',
- 'Telangana',
- 'Tripura',
- 'Uttar Pradesh',
- 'Uttarakhand',
- 'West Bengal',
+	"",
+	"Andaman and Nicobar Islands",
+	"Andhra Pradesh",
+	"Arunachal Pradesh",
+	"Assam",
+	"Bihar",
+	"Chandigarh",
+	"Chhattisgarh",
+	"Dadra and Nagar Haveli and Daman and Diu",
+	"Delhi",
+	"Goa",
+	"Gujarat",
+	"Haryana",
+	"Himachal Pradesh",
+	"Jammu and Kashmir",
+	"Jharkhand",
+	"Karnataka",
+	"Kerala",
+	"Ladakh",
+	"Lakshadweep Islands",
+	"Madhya Pradesh",
+	"Maharashtra",
+	"Manipur",
+	"Meghalaya",
+	"Mizoram",
+	"Nagaland",
+	"Odisha",
+	"Other Territory",
+	"Pondicherry",
+	"Punjab",
+	"Rajasthan",
+	"Sikkim",
+	"Tamil Nadu",
+	"Telangana",
+	"Tripura",
+	"Uttar Pradesh",
+	"Uttarakhand",
+	"West Bengal",
 ]
 
 state_numbers = {
- "Andaman and Nicobar Islands": "35",
- "Andhra Pradesh": "37",
- "Arunachal Pradesh": "12",
- "Assam": "18",
- "Bihar": "10",
- "Chandigarh": "04",
- "Chhattisgarh": "22",
- "Dadra and Nagar Haveli and Daman and Diu": "26",
- "Delhi": "07",
- "Goa": "30",
- "Gujarat": "24",
- "Haryana": "06",
- "Himachal Pradesh": "02",
- "Jammu and Kashmir": "01",
- "Jharkhand": "20",
- "Karnataka": "29",
- "Kerala": "32",
- "Ladakh": "38",
- "Lakshadweep Islands": "31",
- "Madhya Pradesh": "23",
- "Maharashtra": "27",
- "Manipur": "14",
- "Meghalaya": "17",
- "Mizoram": "15",
- "Nagaland": "13",
- "Odisha": "21",
- "Other Territory": "97",
- "Pondicherry": "34",
- "Punjab": "03",
- "Rajasthan": "08",
- "Sikkim": "11",
- "Tamil Nadu": "33",
- "Telangana": "36",
- "Tripura": "16",
- "Uttar Pradesh": "09",
- "Uttarakhand": "05",
- "West Bengal": "19",
+	"Andaman and Nicobar Islands": "35",
+	"Andhra Pradesh": "37",
+	"Arunachal Pradesh": "12",
+	"Assam": "18",
+	"Bihar": "10",
+	"Chandigarh": "04",
+	"Chhattisgarh": "22",
+	"Dadra and Nagar Haveli and Daman and Diu": "26",
+	"Delhi": "07",
+	"Goa": "30",
+	"Gujarat": "24",
+	"Haryana": "06",
+	"Himachal Pradesh": "02",
+	"Jammu and Kashmir": "01",
+	"Jharkhand": "20",
+	"Karnataka": "29",
+	"Kerala": "32",
+	"Ladakh": "38",
+	"Lakshadweep Islands": "31",
+	"Madhya Pradesh": "23",
+	"Maharashtra": "27",
+	"Manipur": "14",
+	"Meghalaya": "17",
+	"Mizoram": "15",
+	"Nagaland": "13",
+	"Odisha": "21",
+	"Other Territory": "97",
+	"Pondicherry": "34",
+	"Punjab": "03",
+	"Rajasthan": "08",
+	"Sikkim": "11",
+	"Tamil Nadu": "33",
+	"Telangana": "36",
+	"Tripura": "16",
+	"Uttar Pradesh": "09",
+	"Uttarakhand": "05",
+	"West Bengal": "19",
 }
 
 number_state_mapping = {v: k for k, v in state_numbers.items()}
diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py
index 64c75c4..cbdec56 100644
--- a/erpnext/regional/india/e_invoice/utils.py
+++ b/erpnext/regional/india/e_invoice/utils.py
@@ -39,121 +39,157 @@
 	if isinstance(doc, str):
 		doc = json.loads(doc)
 
-	invalid_doctype = doc.get('doctype') != 'Sales Invoice'
+	invalid_doctype = doc.get("doctype") != "Sales Invoice"
 	if invalid_doctype:
 		return False
 
-	einvoicing_enabled = cint(frappe.db.get_single_value('E Invoice Settings', 'enable'))
+	einvoicing_enabled = cint(frappe.db.get_single_value("E Invoice Settings", "enable"))
 	if not einvoicing_enabled:
 		return False
 
-	einvoicing_eligible_from = frappe.db.get_single_value('E Invoice Settings', 'applicable_from') or '2021-04-01'
-	if getdate(doc.get('posting_date')) < getdate(einvoicing_eligible_from):
+	einvoicing_eligible_from = (
+		frappe.db.get_single_value("E Invoice Settings", "applicable_from") or "2021-04-01"
+	)
+	if getdate(doc.get("posting_date")) < getdate(einvoicing_eligible_from):
 		return False
 
-	invalid_company = not frappe.db.get_value('E Invoice User', { 'company': doc.get('company') })
-	invalid_supply_type = doc.get('gst_category') not in ['Registered Regular', 'SEZ', 'Overseas', 'Deemed Export']
-	company_transaction = doc.get('billing_address_gstin') == doc.get('company_gstin')
+	invalid_company = not frappe.db.get_value("E Invoice User", {"company": doc.get("company")})
+	invalid_supply_type = doc.get("gst_category") not in [
+		"Registered Regular",
+		"SEZ",
+		"Overseas",
+		"Deemed Export",
+	]
+	company_transaction = doc.get("billing_address_gstin") == doc.get("company_gstin")
 
 	# if export invoice, then taxes can be empty
 	# invoice can only be ineligible if no taxes applied and is not an export invoice
-	no_taxes_applied = not doc.get('taxes') and not doc.get('gst_category') == 'Overseas'
-	has_non_gst_item = any(d for d in doc.get('items', []) if d.get('is_non_gst'))
+	no_taxes_applied = not doc.get("taxes") and not doc.get("gst_category") == "Overseas"
+	has_non_gst_item = any(d for d in doc.get("items", []) if d.get("is_non_gst"))
 
-	if invalid_company or invalid_supply_type or company_transaction or no_taxes_applied or has_non_gst_item:
+	if (
+		invalid_company
+		or invalid_supply_type
+		or company_transaction
+		or no_taxes_applied
+		or has_non_gst_item
+	):
 		return False
 
 	return True
 
+
 def validate_einvoice_fields(doc):
 	invoice_eligible = validate_eligibility(doc)
 
 	if not invoice_eligible:
 		return
 
-	if doc.docstatus == 0 and doc._action == 'save':
+	if doc.docstatus == 0 and doc._action == "save":
 		if doc.irn:
-			frappe.throw(_('You cannot edit the invoice after generating IRN'), title=_('Edit Not Allowed'))
+			frappe.throw(_("You cannot edit the invoice after generating IRN"), title=_("Edit Not Allowed"))
 		if len(doc.name) > 16:
 			raise_document_name_too_long_error()
 
-		doc.einvoice_status = 'Pending'
+		doc.einvoice_status = "Pending"
 
-	elif doc.docstatus == 1 and doc._action == 'submit' and not doc.irn:
-		frappe.throw(_('You must generate IRN before submitting the document.'), title=_('Missing IRN'))
+	elif doc.docstatus == 1 and doc._action == "submit" and not doc.irn:
+		frappe.throw(_("You must generate IRN before submitting the document."), title=_("Missing IRN"))
 
-	elif doc.irn and doc.docstatus == 2 and doc._action == 'cancel' and not doc.irn_cancelled:
-		frappe.throw(_('You must cancel IRN before cancelling the document.'), title=_('Cancel Not Allowed'))
+	elif doc.irn and doc.docstatus == 2 and doc._action == "cancel" and not doc.irn_cancelled:
+		frappe.throw(
+			_("You must cancel IRN before cancelling the document."), title=_("Cancel Not Allowed")
+		)
+
 
 def raise_document_name_too_long_error():
-	title = _('Document ID Too Long')
-	msg = _('As you have E-Invoicing enabled, to be able to generate IRN for this invoice')
-	msg += ', '
-	msg += _('document id {} exceed 16 letters.').format(bold(_('should not')))
-	msg += '<br><br>'
-	msg += _('You must {} your {} in order to have document id of {} length 16.').format(
-		bold(_('modify')), bold(_('naming series')), bold(_('maximum'))
+	title = _("Document ID Too Long")
+	msg = _("As you have E-Invoicing enabled, to be able to generate IRN for this invoice")
+	msg += ", "
+	msg += _("document id {} exceed 16 letters.").format(bold(_("should not")))
+	msg += "<br><br>"
+	msg += _("You must {} your {} in order to have document id of {} length 16.").format(
+		bold(_("modify")), bold(_("naming series")), bold(_("maximum"))
 	)
-	msg += _('Please account for ammended documents too.')
+	msg += _("Please account for ammended documents too.")
 	frappe.throw(msg, title=title)
 
+
 def read_json(name):
-	file_path = os.path.join(os.path.dirname(__file__), '{name}.json'.format(name=name))
-	with open(file_path, 'r') as f:
+	file_path = os.path.join(os.path.dirname(__file__), "{name}.json".format(name=name))
+	with open(file_path, "r") as f:
 		return cstr(f.read())
 
+
 def get_transaction_details(invoice):
-	supply_type = ''
-	if invoice.gst_category == 'Registered Regular': supply_type = 'B2B'
-	elif invoice.gst_category == 'SEZ': supply_type = 'SEZWOP'
-	elif invoice.gst_category == 'Overseas': supply_type = 'EXPWOP'
-	elif invoice.gst_category == 'Deemed Export': supply_type = 'DEXP'
+	supply_type = ""
+	if invoice.gst_category == "Registered Regular":
+		supply_type = "B2B"
+	elif invoice.gst_category == "SEZ":
+		supply_type = "SEZWOP"
+	elif invoice.gst_category == "Overseas":
+		supply_type = "EXPWOP"
+	elif invoice.gst_category == "Deemed Export":
+		supply_type = "DEXP"
 
 	if not supply_type:
-		rr, sez, overseas, export = bold('Registered Regular'), bold('SEZ'), bold('Overseas'), bold('Deemed Export')
-		frappe.throw(_('GST category should be one of {}, {}, {}, {}').format(rr, sez, overseas, export),
-			title=_('Invalid Supply Type'))
+		rr, sez, overseas, export = (
+			bold("Registered Regular"),
+			bold("SEZ"),
+			bold("Overseas"),
+			bold("Deemed Export"),
+		)
+		frappe.throw(
+			_("GST category should be one of {}, {}, {}, {}").format(rr, sez, overseas, export),
+			title=_("Invalid Supply Type"),
+		)
 
-	return frappe._dict(dict(
-		tax_scheme='GST',
-		supply_type=supply_type,
-		reverse_charge=invoice.reverse_charge
-	))
+	return frappe._dict(
+		dict(tax_scheme="GST", supply_type=supply_type, reverse_charge=invoice.reverse_charge)
+	)
+
 
 def get_doc_details(invoice):
-	if getdate(invoice.posting_date) < getdate('2021-01-01'):
-		frappe.throw(_('IRN generation is not allowed for invoices dated before 1st Jan 2021'), title=_('Not Allowed'))
+	if getdate(invoice.posting_date) < getdate("2021-01-01"):
+		frappe.throw(
+			_("IRN generation is not allowed for invoices dated before 1st Jan 2021"),
+			title=_("Not Allowed"),
+		)
 
-	invoice_type = 'CRN' if invoice.is_return else 'INV'
+	invoice_type = "CRN" if invoice.is_return else "INV"
 
 	invoice_name = invoice.name
-	invoice_date = format_date(invoice.posting_date, 'dd/mm/yyyy')
+	invoice_date = format_date(invoice.posting_date, "dd/mm/yyyy")
 
-	return frappe._dict(dict(
-		invoice_type=invoice_type,
-		invoice_name=invoice_name,
-		invoice_date=invoice_date
-	))
+	return frappe._dict(
+		dict(invoice_type=invoice_type, invoice_name=invoice_name, invoice_date=invoice_date)
+	)
+
 
 def validate_address_fields(address, skip_gstin_validation):
-	if ((not address.gstin and not skip_gstin_validation)
+	if (
+		(not address.gstin and not skip_gstin_validation)
 		or not address.city
 		or not address.pincode
 		or not address.address_title
 		or not address.address_line1
-		or not address.gst_state_number):
+		or not address.gst_state_number
+	):
 
 		frappe.throw(
-			msg=_('Address Lines, City, Pincode, GSTIN are mandatory for address {}. Please set them and try again.').format(address.name),
-			title=_('Missing Address Fields')
+			msg=_(
+				"Address Lines, City, Pincode, GSTIN are mandatory for address {}. Please set them and try again."
+			).format(address.name),
+			title=_("Missing Address Fields"),
 		)
 
 	if address.address_line2 and len(address.address_line2) < 2:
 		# to prevent "The field Address 2 must be a string with a minimum length of 3 and a maximum length of 100"
 		address.address_line2 = ""
 
+
 def get_party_details(address_name, skip_gstin_validation=False):
-	addr = frappe.get_doc('Address', address_name)
+	addr = frappe.get_doc("Address", address_name)
 
 	validate_address_fields(addr, skip_gstin_validation)
 
@@ -161,44 +197,53 @@
 		# according to einvoice standard
 		addr.pincode = 999999
 
-	party_address_details = frappe._dict(dict(
-		legal_name=sanitize_for_json(addr.address_title),
-		location=sanitize_for_json(addr.city),
-		pincode=addr.pincode, gstin=addr.gstin,
-		state_code=addr.gst_state_number,
-		address_line1=sanitize_for_json(addr.address_line1),
-		address_line2=sanitize_for_json(addr.address_line2)
-	))
+	party_address_details = frappe._dict(
+		dict(
+			legal_name=sanitize_for_json(addr.address_title),
+			location=sanitize_for_json(addr.city),
+			pincode=addr.pincode,
+			gstin=addr.gstin,
+			state_code=addr.gst_state_number,
+			address_line1=sanitize_for_json(addr.address_line1),
+			address_line2=sanitize_for_json(addr.address_line2),
+		)
+	)
 
 	return party_address_details
 
+
 def get_overseas_address_details(address_name):
 	address_title, address_line1, address_line2, city = frappe.db.get_value(
-		'Address', address_name, ['address_title', 'address_line1', 'address_line2', 'city']
+		"Address", address_name, ["address_title", "address_line1", "address_line2", "city"]
 	)
 
 	if not address_title or not address_line1 or not city:
 		frappe.throw(
-			msg=_('Address lines and city is mandatory for address {}. Please set them and try again.').format(
-				get_link_to_form('Address', address_name)
-			),
-			title=_('Missing Address Fields')
+			msg=_(
+				"Address lines and city is mandatory for address {}. Please set them and try again."
+			).format(get_link_to_form("Address", address_name)),
+			title=_("Missing Address Fields"),
 		)
 
-	return frappe._dict(dict(
-		gstin='URP',
-		legal_name=sanitize_for_json(address_title),
-		location=city,
-		address_line1=sanitize_for_json(address_line1),
-		address_line2=sanitize_for_json(address_line2),
-		pincode=999999, state_code=96, place_of_supply=96
-	))
+	return frappe._dict(
+		dict(
+			gstin="URP",
+			legal_name=sanitize_for_json(address_title),
+			location=city,
+			address_line1=sanitize_for_json(address_line1),
+			address_line2=sanitize_for_json(address_line2),
+			pincode=999999,
+			state_code=96,
+			place_of_supply=96,
+		)
+	)
+
 
 def get_item_list(invoice):
 	item_list = []
 
 	for d in invoice.items:
-		einvoice_item_schema = read_json('einv_item_template')
+		einvoice_item_schema = read_json("einv_item_template")
 		item = frappe._dict({})
 		item.update(d.as_dict())
 
@@ -214,29 +259,41 @@
 		item.taxable_value = abs(item.taxable_value)
 		item.discount_amount = 0
 
-		item.is_service_item = 'Y' if item.gst_hsn_code and item.gst_hsn_code[:2] == "99" else 'N'
+		item.is_service_item = "Y" if item.gst_hsn_code and item.gst_hsn_code[:2] == "99" else "N"
 		item.serial_no = ""
 
 		item = update_item_taxes(invoice, item)
 
 		item.total_value = abs(
-			item.taxable_value + item.igst_amount + item.sgst_amount +
-			item.cgst_amount + item.cess_amount + item.cess_nadv_amount + item.other_charges
+			item.taxable_value
+			+ item.igst_amount
+			+ item.sgst_amount
+			+ item.cgst_amount
+			+ item.cess_amount
+			+ item.cess_nadv_amount
+			+ item.other_charges
 		)
 		einv_item = einvoice_item_schema.format(item=item)
 		item_list.append(einv_item)
 
-	return ', '.join(item_list)
+	return ", ".join(item_list)
+
 
 def update_item_taxes(invoice, item):
 	gst_accounts = get_gst_accounts(invoice.company)
 	gst_accounts_list = [d for accounts in gst_accounts.values() for d in accounts if d]
 
 	for attr in [
-		'tax_rate', 'cess_rate', 'cess_nadv_amount',
-		'cgst_amount',  'sgst_amount', 'igst_amount',
-		'cess_amount', 'cess_nadv_amount', 'other_charges'
-		]:
+		"tax_rate",
+		"cess_rate",
+		"cess_nadv_amount",
+		"cgst_amount",
+		"sgst_amount",
+		"igst_amount",
+		"cess_amount",
+		"cess_nadv_amount",
+		"other_charges",
+	]:
 		item[attr] = 0
 
 	for t in invoice.taxes:
@@ -251,35 +308,39 @@
 
 			if t.account_head in gst_accounts.cess_account:
 				item_tax_amount_after_discount = item_tax_detail[1]
-				if t.charge_type == 'On Item Quantity':
+				if t.charge_type == "On Item Quantity":
 					item.cess_nadv_amount += abs(item_tax_amount_after_discount)
 				else:
 					item.cess_rate += item_tax_rate
 					item.cess_amount += abs(item_tax_amount_after_discount)
 
-			for tax_type in ['igst', 'cgst', 'sgst']:
-				if t.account_head in gst_accounts[f'{tax_type}_account']:
+			for tax_type in ["igst", "cgst", "sgst"]:
+				if t.account_head in gst_accounts[f"{tax_type}_account"]:
 					item.tax_rate += item_tax_rate
-					item[f'{tax_type}_amount'] += abs(item_tax_amount)
+					item[f"{tax_type}_amount"] += abs(item_tax_amount)
 		else:
 			# TODO: other charges per item
 			pass
 
 	return item
 
+
 def get_invoice_value_details(invoice):
 	invoice_value_details = frappe._dict(dict())
-	invoice_value_details.base_total = abs(sum([i.taxable_value for i in invoice.get('items')]))
+	invoice_value_details.base_total = abs(sum([i.taxable_value for i in invoice.get("items")]))
 	invoice_value_details.invoice_discount_amt = 0
 
 	invoice_value_details.round_off = invoice.base_rounding_adjustment
-	invoice_value_details.base_grand_total = abs(invoice.base_rounded_total) or abs(invoice.base_grand_total)
+	invoice_value_details.base_grand_total = abs(invoice.base_rounded_total) or abs(
+		invoice.base_grand_total
+	)
 	invoice_value_details.grand_total = abs(invoice.rounded_total) or abs(invoice.grand_total)
 
 	invoice_value_details = update_invoice_taxes(invoice, invoice_value_details)
 
 	return invoice_value_details
 
+
 def update_invoice_taxes(invoice, invoice_value_details):
 	gst_accounts = get_gst_accounts(invoice.company)
 	gst_accounts_list = [d for accounts in gst_accounts.values() for d in accounts if d]
@@ -298,90 +359,117 @@
 				# using after discount amt since item also uses after discount amt for cess calc
 				invoice_value_details.total_cess_amt += abs(t.base_tax_amount_after_discount_amount)
 
-			for tax_type in ['igst', 'cgst', 'sgst']:
-				if t.account_head in gst_accounts[f'{tax_type}_account']:
+			for tax_type in ["igst", "cgst", "sgst"]:
+				if t.account_head in gst_accounts[f"{tax_type}_account"]:
 
-					invoice_value_details[f'total_{tax_type}_amt'] += abs(tax_amount)
+					invoice_value_details[f"total_{tax_type}_amt"] += abs(tax_amount)
 				update_other_charges(t, invoice_value_details, gst_accounts_list, invoice, considered_rows)
 		else:
 			invoice_value_details.total_other_charges += abs(tax_amount)
 
 	return invoice_value_details
 
-def update_other_charges(tax_row, invoice_value_details, gst_accounts_list, invoice, considered_rows):
+
+def update_other_charges(
+	tax_row, invoice_value_details, gst_accounts_list, invoice, considered_rows
+):
 	prev_row_id = cint(tax_row.row_id) - 1
 	if tax_row.account_head in gst_accounts_list and prev_row_id not in considered_rows:
-		if tax_row.charge_type == 'On Previous Row Amount':
-			amount = invoice.get('taxes')[prev_row_id].tax_amount_after_discount_amount
+		if tax_row.charge_type == "On Previous Row Amount":
+			amount = invoice.get("taxes")[prev_row_id].tax_amount_after_discount_amount
 			invoice_value_details.total_other_charges -= abs(amount)
 			considered_rows.append(prev_row_id)
-		if tax_row.charge_type == 'On Previous Row Total':
-			amount = invoice.get('taxes')[prev_row_id].base_total - invoice.base_net_total
+		if tax_row.charge_type == "On Previous Row Total":
+			amount = invoice.get("taxes")[prev_row_id].base_total - invoice.base_net_total
 			invoice_value_details.total_other_charges -= abs(amount)
 			considered_rows.append(prev_row_id)
 
+
 def get_payment_details(invoice):
 	payee_name = invoice.company
-	mode_of_payment = ', '.join([d.mode_of_payment for d in invoice.payments])
+	mode_of_payment = ", ".join([d.mode_of_payment for d in invoice.payments])
 	paid_amount = invoice.base_paid_amount
 	outstanding_amount = invoice.outstanding_amount
 
-	return frappe._dict(dict(
-		payee_name=payee_name, mode_of_payment=mode_of_payment,
-		paid_amount=paid_amount, outstanding_amount=outstanding_amount
-	))
+	return frappe._dict(
+		dict(
+			payee_name=payee_name,
+			mode_of_payment=mode_of_payment,
+			paid_amount=paid_amount,
+			outstanding_amount=outstanding_amount,
+		)
+	)
+
 
 def get_return_doc_reference(invoice):
-	invoice_date = frappe.db.get_value('Sales Invoice', invoice.return_against, 'posting_date')
-	return frappe._dict(dict(
-		invoice_name=invoice.return_against, invoice_date=format_date(invoice_date, 'dd/mm/yyyy')
-	))
+	invoice_date = frappe.db.get_value("Sales Invoice", invoice.return_against, "posting_date")
+	return frappe._dict(
+		dict(invoice_name=invoice.return_against, invoice_date=format_date(invoice_date, "dd/mm/yyyy"))
+	)
+
 
 def get_eway_bill_details(invoice):
 	if invoice.is_return:
-		frappe.throw(_('E-Way Bill cannot be generated for Credit Notes & Debit Notes. Please clear fields in the Transporter Section of the invoice.'),
-			title=_('Invalid Fields'))
+		frappe.throw(
+			_(
+				"E-Way Bill cannot be generated for Credit Notes & Debit Notes. Please clear fields in the Transporter Section of the invoice."
+			),
+			title=_("Invalid Fields"),
+		)
 
+	mode_of_transport = {"": "", "Road": "1", "Air": "2", "Rail": "3", "Ship": "4"}
+	vehicle_type = {"Regular": "R", "Over Dimensional Cargo (ODC)": "O"}
 
-	mode_of_transport = { '': '', 'Road': '1', 'Air': '2', 'Rail': '3', 'Ship': '4' }
-	vehicle_type = { 'Regular': 'R', 'Over Dimensional Cargo (ODC)': 'O' }
+	return frappe._dict(
+		dict(
+			gstin=invoice.gst_transporter_id,
+			name=invoice.transporter_name,
+			mode_of_transport=mode_of_transport[invoice.mode_of_transport],
+			distance=invoice.distance or 0,
+			document_name=invoice.lr_no,
+			document_date=format_date(invoice.lr_date, "dd/mm/yyyy"),
+			vehicle_no=invoice.vehicle_no,
+			vehicle_type=vehicle_type[invoice.gst_vehicle_type],
+		)
+	)
 
-	return frappe._dict(dict(
-		gstin=invoice.gst_transporter_id,
-		name=invoice.transporter_name,
-		mode_of_transport=mode_of_transport[invoice.mode_of_transport],
-		distance=invoice.distance or 0,
-		document_name=invoice.lr_no,
-		document_date=format_date(invoice.lr_date, 'dd/mm/yyyy'),
-		vehicle_no=invoice.vehicle_no,
-		vehicle_type=vehicle_type[invoice.gst_vehicle_type]
-	))
 
 def validate_mandatory_fields(invoice):
 	if not invoice.company_address:
 		frappe.throw(
-			_('Company Address is mandatory to fetch company GSTIN details. Please set Company Address and try again.'),
-			title=_('Missing Fields')
+			_(
+				"Company Address is mandatory to fetch company GSTIN details. Please set Company Address and try again."
+			),
+			title=_("Missing Fields"),
 		)
 	if not invoice.customer_address:
 		frappe.throw(
-			_('Customer Address is mandatory to fetch customer GSTIN details. Please set Company Address and try again.'),
-			title=_('Missing Fields')
+			_(
+				"Customer Address is mandatory to fetch customer GSTIN details. Please set Company Address and try again."
+			),
+			title=_("Missing Fields"),
 		)
-	if not frappe.db.get_value('Address', invoice.company_address, 'gstin'):
+	if not frappe.db.get_value("Address", invoice.company_address, "gstin"):
 		frappe.throw(
-			_('GSTIN is mandatory to fetch company GSTIN details. Please enter GSTIN in selected company address.'),
-			title=_('Missing Fields')
+			_(
+				"GSTIN is mandatory to fetch company GSTIN details. Please enter GSTIN in selected company address."
+			),
+			title=_("Missing Fields"),
 		)
-	if invoice.gst_category != 'Overseas' and not frappe.db.get_value('Address', invoice.customer_address, 'gstin'):
+	if invoice.gst_category != "Overseas" and not frappe.db.get_value(
+		"Address", invoice.customer_address, "gstin"
+	):
 		frappe.throw(
-			_('GSTIN is mandatory to fetch customer GSTIN details. Please enter GSTIN in selected customer address.'),
-			title=_('Missing Fields')
+			_(
+				"GSTIN is mandatory to fetch customer GSTIN details. Please enter GSTIN in selected customer address."
+			),
+			title=_("Missing Fields"),
 		)
 
+
 def validate_totals(einvoice):
-	item_list = einvoice['ItemList']
-	value_details = einvoice['ValDtls']
+	item_list = einvoice["ItemList"]
+	value_details = einvoice["ValDtls"]
 
 	total_item_ass_value = 0
 	total_item_cgst_value = 0
@@ -389,43 +477,90 @@
 	total_item_igst_value = 0
 	total_item_value = 0
 	for item in item_list:
-		total_item_ass_value += flt(item['AssAmt'])
-		total_item_cgst_value += flt(item['CgstAmt'])
-		total_item_sgst_value += flt(item['SgstAmt'])
-		total_item_igst_value += flt(item['IgstAmt'])
-		total_item_value += flt(item['TotItemVal'])
+		total_item_ass_value += flt(item["AssAmt"])
+		total_item_cgst_value += flt(item["CgstAmt"])
+		total_item_sgst_value += flt(item["SgstAmt"])
+		total_item_igst_value += flt(item["IgstAmt"])
+		total_item_value += flt(item["TotItemVal"])
 
-		if abs(flt(item['AssAmt']) * flt(item['GstRt']) / 100) - (flt(item['CgstAmt']) + flt(item['SgstAmt']) + flt(item['IgstAmt'])) > 1:
-			frappe.throw(_('Row #{}: GST rate is invalid. Please remove tax rows with zero tax amount from taxes table.').format(item.idx))
+		if (
+			abs(flt(item["AssAmt"]) * flt(item["GstRt"]) / 100)
+			- (flt(item["CgstAmt"]) + flt(item["SgstAmt"]) + flt(item["IgstAmt"]))
+			> 1
+		):
+			frappe.throw(
+				_(
+					"Row #{}: GST rate is invalid. Please remove tax rows with zero tax amount from taxes table."
+				).format(item.idx)
+			)
 
-	if abs(flt(value_details['AssVal']) - total_item_ass_value) > 1:
-		frappe.throw(_('Total Taxable Value of the items is not equal to the Invoice Net Total. Please check item taxes / discounts for any correction.'))
+	if abs(flt(value_details["AssVal"]) - total_item_ass_value) > 1:
+		frappe.throw(
+			_(
+				"Total Taxable Value of the items is not equal to the Invoice Net Total. Please check item taxes / discounts for any correction."
+			)
+		)
 
-	if abs(flt(value_details['CgstVal']) + flt(value_details['SgstVal']) - total_item_cgst_value - total_item_sgst_value) > 1:
-		frappe.throw(_('CGST + SGST value of the items is not equal to total CGST + SGST value. Please review taxes for any correction.'))
+	if (
+		abs(
+			flt(value_details["CgstVal"])
+			+ flt(value_details["SgstVal"])
+			- total_item_cgst_value
+			- total_item_sgst_value
+		)
+		> 1
+	):
+		frappe.throw(
+			_(
+				"CGST + SGST value of the items is not equal to total CGST + SGST value. Please review taxes for any correction."
+			)
+		)
 
-	if abs(flt(value_details['IgstVal']) - total_item_igst_value) > 1:
-		frappe.throw(_('IGST value of all items is not equal to total IGST value. Please review taxes for any correction.'))
+	if abs(flt(value_details["IgstVal"]) - total_item_igst_value) > 1:
+		frappe.throw(
+			_(
+				"IGST value of all items is not equal to total IGST value. Please review taxes for any correction."
+			)
+		)
 
-	if abs(
-		flt(value_details['TotInvVal']) + flt(value_details['Discount']) -
-		flt(value_details['OthChrg']) - flt(value_details['RndOffAmt']) -
-		total_item_value
-	) > 1:
-		frappe.throw(_('Total Value of the items is not equal to the Invoice Grand Total. Please check item taxes / discounts for any correction.'))
+	if (
+		abs(
+			flt(value_details["TotInvVal"])
+			+ flt(value_details["Discount"])
+			- flt(value_details["OthChrg"])
+			- flt(value_details["RndOffAmt"])
+			- total_item_value
+		)
+		> 1
+	):
+		frappe.throw(
+			_(
+				"Total Value of the items is not equal to the Invoice Grand Total. Please check item taxes / discounts for any correction."
+			)
+		)
 
-	calculated_invoice_value = \
-			flt(value_details['AssVal']) + flt(value_details['CgstVal']) \
-			+ flt(value_details['SgstVal']) + flt(value_details['IgstVal']) \
-			+ flt(value_details['OthChrg']) + flt(value_details['RndOffAmt']) - flt(value_details['Discount'])
+	calculated_invoice_value = (
+		flt(value_details["AssVal"])
+		+ flt(value_details["CgstVal"])
+		+ flt(value_details["SgstVal"])
+		+ flt(value_details["IgstVal"])
+		+ flt(value_details["OthChrg"])
+		+ flt(value_details["RndOffAmt"])
+		- flt(value_details["Discount"])
+	)
 
-	if abs(flt(value_details['TotInvVal']) - calculated_invoice_value) > 1:
-		frappe.throw(_('Total Item Value + Taxes - Discount is not equal to the Invoice Grand Total. Please check taxes / discounts for any correction.'))
+	if abs(flt(value_details["TotInvVal"]) - calculated_invoice_value) > 1:
+		frappe.throw(
+			_(
+				"Total Item Value + Taxes - Discount is not equal to the Invoice Grand Total. Please check taxes / discounts for any correction."
+			)
+		)
+
 
 def make_einvoice(invoice):
 	validate_mandatory_fields(invoice)
 
-	schema = read_json('einv_template')
+	schema = read_json("einv_template")
 
 	transaction_details = get_transaction_details(invoice)
 	item_list = get_item_list(invoice)
@@ -433,13 +568,13 @@
 	invoice_value_details = get_invoice_value_details(invoice)
 	seller_details = get_party_details(invoice.company_address)
 
-	if invoice.gst_category == 'Overseas':
+	if invoice.gst_category == "Overseas":
 		buyer_details = get_overseas_address_details(invoice.customer_address)
 	else:
 		buyer_details = get_party_details(invoice.customer_address)
 		place_of_supply = get_place_of_supply(invoice, invoice.doctype)
 		if place_of_supply:
-			place_of_supply = place_of_supply.split('-')[0]
+			place_of_supply = place_of_supply.split("-")[0]
 		else:
 			place_of_supply = sanitize_for_json(invoice.billing_address_gstin)[:2]
 		buyer_details.update(dict(place_of_supply=place_of_supply))
@@ -449,7 +584,7 @@
 
 	shipping_details = payment_details = prev_doc_details = eway_bill_details = frappe._dict({})
 	if invoice.shipping_address_name and invoice.customer_address != invoice.shipping_address_name:
-		if invoice.gst_category == 'Overseas':
+		if invoice.gst_category == "Overseas":
 			shipping_details = get_overseas_address_details(invoice.shipping_address_name)
 		else:
 			shipping_details = get_party_details(invoice.shipping_address_name, skip_gstin_validation=True)
@@ -471,11 +606,19 @@
 	period_details = export_details = frappe._dict({})
 
 	einvoice = schema.format(
-		transaction_details=transaction_details, doc_details=doc_details, dispatch_details=dispatch_details,
-		seller_details=seller_details, buyer_details=buyer_details, shipping_details=shipping_details,
-		item_list=item_list, invoice_value_details=invoice_value_details, payment_details=payment_details,
-		period_details=period_details, prev_doc_details=prev_doc_details,
-		export_details=export_details, eway_bill_details=eway_bill_details
+		transaction_details=transaction_details,
+		doc_details=doc_details,
+		dispatch_details=dispatch_details,
+		seller_details=seller_details,
+		buyer_details=buyer_details,
+		shipping_details=shipping_details,
+		item_list=item_list,
+		invoice_value_details=invoice_value_details,
+		payment_details=payment_details,
+		period_details=period_details,
+		prev_doc_details=prev_doc_details,
+		export_details=export_details,
+		eway_bill_details=eway_bill_details,
 	)
 
 	try:
@@ -492,15 +635,18 @@
 
 	return einvoice
 
+
 def show_link_to_error_log(invoice, einvoice):
 	err_log = log_error(einvoice)
-	link_to_error_log = get_link_to_form('Error Log', err_log.name, 'Error Log')
+	link_to_error_log = get_link_to_form("Error Log", err_log.name, "Error Log")
 	frappe.throw(
-		_('An error occurred while creating e-invoice for {}. Please check {} for more information.').format(
-			invoice.name, link_to_error_log),
-		title=_('E Invoice Creation Failed')
+		_(
+			"An error occurred while creating e-invoice for {}. Please check {} for more information."
+		).format(invoice.name, link_to_error_log),
+		title=_("E Invoice Creation Failed"),
 	)
 
+
 def log_error(data=None):
 	if isinstance(data, str):
 		data = json.loads(data)
@@ -510,16 +656,47 @@
 	err_msg = str(sys.exc_info()[1])
 	data = json.dumps(data, indent=4)
 
-	message = "\n".join([
-		"Error", err_msg, seperator,
-		"Data:", data, seperator,
-		"Exception:", err_tb
-	])
-	return frappe.log_error(title=_('E Invoice Request Failed'), message=message)
+	message = "\n".join(["Error", err_msg, seperator, "Data:", data, seperator, "Exception:", err_tb])
+	return frappe.log_error(title=_("E Invoice Request Failed"), message=message)
+
 
 def santize_einvoice_fields(einvoice):
-	int_fields = ["Pin","Distance","CrDay"]
-	float_fields = ["Qty","FreeQty","UnitPrice","TotAmt","Discount","PreTaxVal","AssAmt","GstRt","IgstAmt","CgstAmt","SgstAmt","CesRt","CesAmt","CesNonAdvlAmt","StateCesRt","StateCesAmt","StateCesNonAdvlAmt","OthChrg","TotItemVal","AssVal","CgstVal","SgstVal","IgstVal","CesVal","StCesVal","Discount","OthChrg","RndOffAmt","TotInvVal","TotInvValFc","PaidAmt","PaymtDue","ExpDuty",]
+	int_fields = ["Pin", "Distance", "CrDay"]
+	float_fields = [
+		"Qty",
+		"FreeQty",
+		"UnitPrice",
+		"TotAmt",
+		"Discount",
+		"PreTaxVal",
+		"AssAmt",
+		"GstRt",
+		"IgstAmt",
+		"CgstAmt",
+		"SgstAmt",
+		"CesRt",
+		"CesAmt",
+		"CesNonAdvlAmt",
+		"StateCesRt",
+		"StateCesAmt",
+		"StateCesNonAdvlAmt",
+		"OthChrg",
+		"TotItemVal",
+		"AssVal",
+		"CgstVal",
+		"SgstVal",
+		"IgstVal",
+		"CesVal",
+		"StCesVal",
+		"Discount",
+		"OthChrg",
+		"RndOffAmt",
+		"TotInvVal",
+		"TotInvValFc",
+		"PaidAmt",
+		"PaymtDue",
+		"ExpDuty",
+	]
 	copy = einvoice.copy()
 	for key, value in copy.items():
 		if isinstance(value, list):
@@ -551,22 +728,31 @@
 
 	return einvoice
 
+
 def safe_json_load(json_string):
 	try:
 		return json.loads(json_string)
 	except json.JSONDecodeError as e:
 		# print a snippet of 40 characters around the location where error occured
 		pos = e.pos
-		start, end = max(0, pos-20), min(len(json_string)-1, pos+20)
+		start, end = max(0, pos - 20), min(len(json_string) - 1, pos + 20)
 		snippet = json_string[start:end]
-		frappe.throw(_("Error in input data. Please check for any special characters near following input: <br> {}").format(snippet))
+		frappe.throw(
+			_(
+				"Error in input data. Please check for any special characters near following input: <br> {}"
+			).format(snippet)
+		)
+
 
 class RequestFailed(Exception):
 	pass
+
+
 class CancellationNotAllowed(Exception):
 	pass
 
-class GSPConnector():
+
+class GSPConnector:
 	def __init__(self, doctype=None, docname=None):
 		self.doctype = doctype
 		self.docname = docname
@@ -575,15 +761,19 @@
 		self.set_credentials()
 
 		# authenticate url is same for sandbox & live
-		self.authenticate_url = 'https://gsp.adaequare.com/gsp/authenticate?grant_type=token'
-		self.base_url = 'https://gsp.adaequare.com' if not self.e_invoice_settings.sandbox_mode else 'https://gsp.adaequare.com/test'
+		self.authenticate_url = "https://gsp.adaequare.com/gsp/authenticate?grant_type=token"
+		self.base_url = (
+			"https://gsp.adaequare.com"
+			if not self.e_invoice_settings.sandbox_mode
+			else "https://gsp.adaequare.com/test"
+		)
 
-		self.cancel_irn_url = self.base_url + '/enriched/ei/api/invoice/cancel'
-		self.irn_details_url = self.base_url + '/enriched/ei/api/invoice/irn'
-		self.generate_irn_url = self.base_url + '/enriched/ei/api/invoice'
-		self.gstin_details_url = self.base_url + '/enriched/ei/api/master/gstin'
-		self.cancel_ewaybill_url = self.base_url + '/enriched/ewb/ewayapi?action=CANEWB'
-		self.generate_ewaybill_url = self.base_url + '/enriched/ei/api/ewaybill'
+		self.cancel_irn_url = self.base_url + "/enriched/ei/api/invoice/cancel"
+		self.irn_details_url = self.base_url + "/enriched/ei/api/invoice/irn"
+		self.generate_irn_url = self.base_url + "/enriched/ei/api/invoice"
+		self.gstin_details_url = self.base_url + "/enriched/ei/api/master/gstin"
+		self.cancel_ewaybill_url = self.base_url + "/enriched/ewb/ewayapi?action=CANEWB"
+		self.generate_ewaybill_url = self.base_url + "/enriched/ei/api/ewaybill"
 
 	def set_invoice(self):
 		self.invoice = None
@@ -591,10 +781,14 @@
 			self.invoice = frappe.get_cached_doc(self.doctype, self.docname)
 
 	def set_credentials(self):
-		self.e_invoice_settings = frappe.get_cached_doc('E Invoice Settings')
+		self.e_invoice_settings = frappe.get_cached_doc("E Invoice Settings")
 
 		if not self.e_invoice_settings.enable:
-			frappe.throw(_("E-Invoicing is disabled. Please enable it from {} to generate e-invoices.").format(get_link_to_form("E Invoice Settings", "E Invoice Settings")))
+			frappe.throw(
+				_("E-Invoicing is disabled. Please enable it from {} to generate e-invoices.").format(
+					get_link_to_form("E Invoice Settings", "E Invoice Settings")
+				)
+			)
 
 		if self.invoice:
 			gstin = self.get_seller_gstin()
@@ -602,14 +796,22 @@
 			if credentials_for_gstin:
 				self.credentials = credentials_for_gstin[0]
 			else:
-				frappe.throw(_('Cannot find e-invoicing credentials for selected Company GSTIN. Please check E-Invoice Settings'))
+				frappe.throw(
+					_(
+						"Cannot find e-invoicing credentials for selected Company GSTIN. Please check E-Invoice Settings"
+					)
+				)
 		else:
-			self.credentials = self.e_invoice_settings.credentials[0] if self.e_invoice_settings.credentials else None
+			self.credentials = (
+				self.e_invoice_settings.credentials[0] if self.e_invoice_settings.credentials else None
+			)
 
 	def get_seller_gstin(self):
-		gstin = frappe.db.get_value('Address', self.invoice.company_address, 'gstin')
+		gstin = frappe.db.get_value("Address", self.invoice.company_address, "gstin")
 		if not gstin:
-			frappe.throw(_('Cannot retrieve Company GSTIN. Please select company address with valid GSTIN.'))
+			frappe.throw(
+				_("Cannot retrieve Company GSTIN. Please select company address with valid GSTIN.")
+			)
 		return gstin
 
 	def get_auth_token(self):
@@ -619,7 +821,7 @@
 		return self.e_invoice_settings.auth_token
 
 	def make_request(self, request_type, url, headers=None, data=None):
-		if request_type == 'post':
+		if request_type == "post":
 			res = make_post_request(url, headers=headers, data=data)
 		else:
 			res = make_get_request(url, headers=headers, data=data)
@@ -628,36 +830,37 @@
 		return res
 
 	def log_request(self, url, headers, data, res):
-		headers.update({ 'password': self.credentials.password })
-		request_log = frappe.get_doc({
-			"doctype": "E Invoice Request Log",
-			"user": frappe.session.user,
-			"reference_invoice": self.invoice.name if self.invoice else None,
-			"url": url,
-			"headers": json.dumps(headers, indent=4) if headers else None,
-			"data": json.dumps(data, indent=4) if isinstance(data, dict) else data,
-			"response": json.dumps(res, indent=4) if res else None
-		})
+		headers.update({"password": self.credentials.password})
+		request_log = frappe.get_doc(
+			{
+				"doctype": "E Invoice Request Log",
+				"user": frappe.session.user,
+				"reference_invoice": self.invoice.name if self.invoice else None,
+				"url": url,
+				"headers": json.dumps(headers, indent=4) if headers else None,
+				"data": json.dumps(data, indent=4) if isinstance(data, dict) else data,
+				"response": json.dumps(res, indent=4) if res else None,
+			}
+		)
 		request_log.save(ignore_permissions=True)
 		frappe.db.commit()
 
 	def get_client_credentials(self):
 		if self.e_invoice_settings.client_id and self.e_invoice_settings.client_secret:
-			return self.e_invoice_settings.client_id, self.e_invoice_settings.get_password('client_secret')
+			return self.e_invoice_settings.client_id, self.e_invoice_settings.get_password("client_secret")
 
 		return frappe.conf.einvoice_client_id, frappe.conf.einvoice_client_secret
 
 	def fetch_auth_token(self):
 		client_id, client_secret = self.get_client_credentials()
-		headers = {
-			'gspappid': client_id,
-			'gspappsecret': client_secret
-		}
+		headers = {"gspappid": client_id, "gspappsecret": client_secret}
 		res = {}
 		try:
-			res = self.make_request('post', self.authenticate_url, headers)
-			self.e_invoice_settings.auth_token = "{} {}".format(res.get('token_type'), res.get('access_token'))
-			self.e_invoice_settings.token_expiry = add_to_date(None, seconds=res.get('expires_in'))
+			res = self.make_request("post", self.authenticate_url, headers)
+			self.e_invoice_settings.auth_token = "{} {}".format(
+				res.get("token_type"), res.get("access_token")
+			)
+			self.e_invoice_settings.token_expiry = add_to_date(None, seconds=res.get("expires_in"))
 			self.e_invoice_settings.save(ignore_permissions=True)
 			self.e_invoice_settings.reload()
 
@@ -667,22 +870,22 @@
 
 	def get_headers(self):
 		return {
-			'content-type': 'application/json',
-			'user_name': self.credentials.username,
-			'password': self.credentials.get_password(),
-			'gstin': self.credentials.gstin,
-			'authorization': self.get_auth_token(),
-			'requestid': str(base64.b64encode(os.urandom(18))),
+			"content-type": "application/json",
+			"user_name": self.credentials.username,
+			"password": self.credentials.get_password(),
+			"gstin": self.credentials.gstin,
+			"authorization": self.get_auth_token(),
+			"requestid": str(base64.b64encode(os.urandom(18))),
 		}
 
 	def fetch_gstin_details(self, gstin):
 		headers = self.get_headers()
 
 		try:
-			params = '?gstin={gstin}'.format(gstin=gstin)
-			res = self.make_request('get', self.gstin_details_url + params, headers)
-			if res.get('success'):
-				return res.get('result')
+			params = "?gstin={gstin}".format(gstin=gstin)
+			res = self.make_request("get", self.gstin_details_url + params, headers)
+			if res.get("success"):
+				return res.get("result")
 			else:
 				log_error(res)
 				raise RequestFailed
@@ -693,10 +896,11 @@
 		except Exception:
 			log_error()
 			self.raise_error(True)
+
 	@staticmethod
 	def get_gstin_details(gstin):
-		'''fetch and cache GSTIN details'''
-		if not hasattr(frappe.local, 'gstin_cache'):
+		"""fetch and cache GSTIN details"""
+		if not hasattr(frappe.local, "gstin_cache"):
 			frappe.local.gstin_cache = {}
 
 		key = gstin
@@ -704,7 +908,7 @@
 		details = gsp_connector.fetch_gstin_details(gstin)
 
 		frappe.local.gstin_cache[key] = details
-		frappe.cache().hset('gstin_cache', key, details)
+		frappe.cache().hset("gstin_cache", key, details)
 		return details
 
 	def generate_irn(self):
@@ -713,27 +917,29 @@
 			headers = self.get_headers()
 			einvoice = make_einvoice(self.invoice)
 			data = json.dumps(einvoice, indent=4)
-			res = self.make_request('post', self.generate_irn_url, headers, data)
+			res = self.make_request("post", self.generate_irn_url, headers, data)
 
-			if res.get('success'):
-				self.set_einvoice_data(res.get('result'))
+			if res.get("success"):
+				self.set_einvoice_data(res.get("result"))
 
-			elif '2150' in res.get('message'):
+			elif "2150" in res.get("message"):
 				# IRN already generated but not updated in invoice
 				# Extract the IRN from the response description and fetch irn details
-				irn = res.get('result')[0].get('Desc').get('Irn')
+				irn = res.get("result")[0].get("Desc").get("Irn")
 				irn_details = self.get_irn_details(irn)
 				if irn_details:
 					self.set_einvoice_data(irn_details)
 				else:
-					raise RequestFailed('IRN has already been generated for the invoice but cannot fetch details for the it. \
-						Contact ERPNext support to resolve the issue.')
+					raise RequestFailed(
+						"IRN has already been generated for the invoice but cannot fetch details for the it. \
+						Contact ERPNext support to resolve the issue."
+					)
 
 			else:
 				raise RequestFailed
 
 		except RequestFailed:
-			errors = self.sanitize_error_message(res.get('message'))
+			errors = self.sanitize_error_message(res.get("message"))
 			self.set_failed_status(errors=errors)
 			self.raise_error(errors=errors)
 
@@ -745,7 +951,7 @@
 	@staticmethod
 	def bulk_generate_irn(invoices):
 		gsp_connector = GSPConnector()
-		gsp_connector.doctype = 'Sales Invoice'
+		gsp_connector.doctype = "Sales Invoice"
 
 		failed = []
 
@@ -757,10 +963,7 @@
 				gsp_connector.generate_irn()
 
 			except Exception as e:
-				failed.append({
-					'docname': invoice,
-					'message': str(e)
-				})
+				failed.append({"docname": invoice, "message": str(e)})
 
 		return failed
 
@@ -768,15 +971,15 @@
 		headers = self.get_headers()
 
 		try:
-			params = '?irn={irn}'.format(irn=irn)
-			res = self.make_request('get', self.irn_details_url + params, headers)
-			if res.get('success'):
-				return res.get('result')
+			params = "?irn={irn}".format(irn=irn)
+			res = self.make_request("get", self.irn_details_url + params, headers)
+			if res.get("success"):
+				return res.get("result")
 			else:
 				raise RequestFailed
 
 		except RequestFailed:
-			errors = self.sanitize_error_message(res.get('message'))
+			errors = self.sanitize_error_message(res.get("message"))
 			self.raise_error(errors=errors)
 
 		except Exception:
@@ -788,26 +991,30 @@
 		try:
 			# validate cancellation
 			if time_diff_in_hours(now_datetime(), self.invoice.ack_date) > 24:
-				frappe.throw(_('E-Invoice cannot be cancelled after 24 hours of IRN generation.'), title=_('Not Allowed'), exc=CancellationNotAllowed)
+				frappe.throw(
+					_("E-Invoice cannot be cancelled after 24 hours of IRN generation."),
+					title=_("Not Allowed"),
+					exc=CancellationNotAllowed,
+				)
 			if not irn:
-				frappe.throw(_('IRN not found. You must generate IRN before cancelling.'), title=_('Not Allowed'), exc=CancellationNotAllowed)
+				frappe.throw(
+					_("IRN not found. You must generate IRN before cancelling."),
+					title=_("Not Allowed"),
+					exc=CancellationNotAllowed,
+				)
 
 			headers = self.get_headers()
-			data = json.dumps({
-				'Irn': irn,
-				'Cnlrsn': reason,
-				'Cnlrem': remark
-			}, indent=4)
+			data = json.dumps({"Irn": irn, "Cnlrsn": reason, "Cnlrem": remark}, indent=4)
 
-			res = self.make_request('post', self.cancel_irn_url, headers, data)
-			if res.get('success') or '9999' in res.get('message'):
+			res = self.make_request("post", self.cancel_irn_url, headers, data)
+			if res.get("success") or "9999" in res.get("message"):
 				self.invoice.irn_cancelled = 1
-				self.invoice.irn_cancel_date = res.get('result')['CancelDate'] if res.get('result') else ""
-				self.invoice.einvoice_status = 'Cancelled'
+				self.invoice.irn_cancel_date = res.get("result")["CancelDate"] if res.get("result") else ""
+				self.invoice.einvoice_status = "Cancelled"
 				self.invoice.flags.updater_reference = {
-					'doctype': self.invoice.doctype,
-					'docname': self.invoice.name,
-					'label': _('IRN Cancelled - {}').format(remark)
+					"doctype": self.invoice.doctype,
+					"docname": self.invoice.name,
+					"label": _("IRN Cancelled - {}").format(remark),
 				}
 				self.update_invoice()
 
@@ -815,7 +1022,7 @@
 				raise RequestFailed
 
 		except RequestFailed:
-			errors = self.sanitize_error_message(res.get('message'))
+			errors = self.sanitize_error_message(res.get("message"))
 			self.set_failed_status(errors=errors)
 			self.raise_error(errors=errors)
 
@@ -831,7 +1038,7 @@
 	@staticmethod
 	def bulk_cancel_irn(invoices, reason, remark):
 		gsp_connector = GSPConnector()
-		gsp_connector.doctype = 'Sales Invoice'
+		gsp_connector.doctype = "Sales Invoice"
 
 		failed = []
 
@@ -844,10 +1051,7 @@
 				gsp_connector.cancel_irn(irn, reason, remark)
 
 			except Exception as e:
-				failed.append({
-					'docname': invoice,
-					'message': str(e)
-				})
+				failed.append({"docname": invoice, "message": str(e)})
 
 		return failed
 
@@ -856,29 +1060,32 @@
 
 		headers = self.get_headers()
 		eway_bill_details = get_eway_bill_details(args)
-		data = json.dumps({
-			'Irn': args.irn,
-			'Distance': cint(eway_bill_details.distance),
-			'TransMode': eway_bill_details.mode_of_transport,
-			'TransId': eway_bill_details.gstin,
-			'TransName': eway_bill_details.transporter,
-			'TrnDocDt': eway_bill_details.document_date,
-			'TrnDocNo': eway_bill_details.document_name,
-			'VehNo': eway_bill_details.vehicle_no,
-			'VehType': eway_bill_details.vehicle_type
-		}, indent=4)
+		data = json.dumps(
+			{
+				"Irn": args.irn,
+				"Distance": cint(eway_bill_details.distance),
+				"TransMode": eway_bill_details.mode_of_transport,
+				"TransId": eway_bill_details.gstin,
+				"TransName": eway_bill_details.transporter,
+				"TrnDocDt": eway_bill_details.document_date,
+				"TrnDocNo": eway_bill_details.document_name,
+				"VehNo": eway_bill_details.vehicle_no,
+				"VehType": eway_bill_details.vehicle_type,
+			},
+			indent=4,
+		)
 
 		try:
-			res = self.make_request('post', self.generate_ewaybill_url, headers, data)
-			if res.get('success'):
-				self.invoice.ewaybill = res.get('result').get('EwbNo')
-				self.invoice.eway_bill_validity = res.get('result').get('EwbValidTill')
+			res = self.make_request("post", self.generate_ewaybill_url, headers, data)
+			if res.get("success"):
+				self.invoice.ewaybill = res.get("result").get("EwbNo")
+				self.invoice.eway_bill_validity = res.get("result").get("EwbValidTill")
 				self.invoice.eway_bill_cancelled = 0
 				self.invoice.update(args)
 				self.invoice.flags.updater_reference = {
-					'doctype': self.invoice.doctype,
-					'docname': self.invoice.name,
-					'label': _('E-Way Bill Generated')
+					"doctype": self.invoice.doctype,
+					"docname": self.invoice.name,
+					"label": _("E-Way Bill Generated"),
 				}
 				self.update_invoice()
 
@@ -886,7 +1093,7 @@
 				raise RequestFailed
 
 		except RequestFailed:
-			errors = self.sanitize_error_message(res.get('message'))
+			errors = self.sanitize_error_message(res.get("message"))
 			self.raise_error(errors=errors)
 
 		except Exception:
@@ -895,22 +1102,18 @@
 
 	def cancel_eway_bill(self, eway_bill, reason, remark):
 		headers = self.get_headers()
-		data = json.dumps({
-			'ewbNo': eway_bill,
-			'cancelRsnCode': reason,
-			'cancelRmrk': remark
-		}, indent=4)
+		data = json.dumps({"ewbNo": eway_bill, "cancelRsnCode": reason, "cancelRmrk": remark}, indent=4)
 		headers["username"] = headers["user_name"]
 		del headers["user_name"]
 		try:
-			res = self.make_request('post', self.cancel_ewaybill_url, headers, data)
-			if res.get('success'):
-				self.invoice.ewaybill = ''
+			res = self.make_request("post", self.cancel_ewaybill_url, headers, data)
+			if res.get("success"):
+				self.invoice.ewaybill = ""
 				self.invoice.eway_bill_cancelled = 1
 				self.invoice.flags.updater_reference = {
-					'doctype': self.invoice.doctype,
-					'docname': self.invoice.name,
-					'label': _('E-Way Bill Cancelled - {}').format(remark)
+					"doctype": self.invoice.doctype,
+					"docname": self.invoice.name,
+					"label": _("E-Way Bill Cancelled - {}").format(remark),
 				}
 				self.update_invoice()
 
@@ -918,7 +1121,7 @@
 				raise RequestFailed
 
 		except RequestFailed:
-			errors = self.sanitize_error_message(res.get('message'))
+			errors = self.sanitize_error_message(res.get("message"))
 			self.raise_error(errors=errors)
 
 		except Exception:
@@ -926,24 +1129,24 @@
 			self.raise_error(True)
 
 	def sanitize_error_message(self, message):
-		'''
-			On validation errors, response message looks something like this:
-			message = '2174 : For inter-state transaction, CGST and SGST amounts are not applicable; only IGST amount is applicable,
-						3095 : Supplier GSTIN is inactive'
-			we search for string between ':' to extract the error messages
-			errors = [
-				': For inter-state transaction, CGST and SGST amounts are not applicable; only IGST amount is applicable, 3095 ',
-				': Test'
-			]
-			then we trim down the message by looping over errors
-		'''
+		"""
+		On validation errors, response message looks something like this:
+		message = '2174 : For inter-state transaction, CGST and SGST amounts are not applicable; only IGST amount is applicable,
+		                        3095 : Supplier GSTIN is inactive'
+		we search for string between ':' to extract the error messages
+		errors = [
+		        ': For inter-state transaction, CGST and SGST amounts are not applicable; only IGST amount is applicable, 3095 ',
+		        ': Test'
+		]
+		then we trim down the message by looping over errors
+		"""
 		if not message:
 			return []
 
-		errors = re.findall(': [^:]+', message)
+		errors = re.findall(": [^:]+", message)
 		for idx, e in enumerate(errors):
 			# remove colons
-			errors[idx] = errors[idx].replace(':', '').strip()
+			errors[idx] = errors[idx].replace(":", "").strip()
 			# if not last
 			if idx != len(errors) - 1:
 				# remove last 7 chars eg: ', 3095 '
@@ -954,39 +1157,41 @@
 	def raise_error(self, raise_exception=False, errors=None):
 		if errors is None:
 			errors = []
-		title = _('E Invoice Request Failed')
+		title = _("E Invoice Request Failed")
 		if errors:
 			frappe.throw(errors, title=title, as_list=1)
 		else:
 			link_to_error_list = '<a href="/app/error-log" target="_blank">Error Log</a>'
 			frappe.msgprint(
-				_('An error occurred while making e-invoicing request. Please check {} for more information.').format(link_to_error_list),
+				_(
+					"An error occurred while making e-invoicing request. Please check {} for more information."
+				).format(link_to_error_list),
 				title=title,
 				raise_exception=raise_exception,
-				indicator='red'
+				indicator="red",
 			)
 
 	def set_einvoice_data(self, res):
-		enc_signed_invoice = res.get('SignedInvoice')
-		dec_signed_invoice = jwt.decode(enc_signed_invoice, options={"verify_signature": False})['data']
+		enc_signed_invoice = res.get("SignedInvoice")
+		dec_signed_invoice = jwt.decode(enc_signed_invoice, options={"verify_signature": False})["data"]
 
-		self.invoice.irn = res.get('Irn')
-		self.invoice.ewaybill = res.get('EwbNo')
-		self.invoice.eway_bill_validity = res.get('EwbValidTill')
-		self.invoice.ack_no = res.get('AckNo')
-		self.invoice.ack_date = res.get('AckDt')
+		self.invoice.irn = res.get("Irn")
+		self.invoice.ewaybill = res.get("EwbNo")
+		self.invoice.eway_bill_validity = res.get("EwbValidTill")
+		self.invoice.ack_no = res.get("AckNo")
+		self.invoice.ack_date = res.get("AckDt")
 		self.invoice.signed_einvoice = dec_signed_invoice
-		self.invoice.ack_no = res.get('AckNo')
-		self.invoice.ack_date = res.get('AckDt')
-		self.invoice.signed_qr_code = res.get('SignedQRCode')
-		self.invoice.einvoice_status = 'Generated'
+		self.invoice.ack_no = res.get("AckNo")
+		self.invoice.ack_date = res.get("AckDt")
+		self.invoice.signed_qr_code = res.get("SignedQRCode")
+		self.invoice.einvoice_status = "Generated"
 
 		self.attach_qrcode_image()
 
 		self.invoice.flags.updater_reference = {
-			'doctype': self.invoice.doctype,
-			'docname': self.invoice.name,
-			'label': _('IRN Generated')
+			"doctype": self.invoice.doctype,
+			"docname": self.invoice.name,
+			"label": _("IRN Generated"),
 		}
 		self.update_invoice()
 
@@ -994,19 +1199,22 @@
 		qrcode = self.invoice.signed_qr_code
 		doctype = self.invoice.doctype
 		docname = self.invoice.name
-		filename = 'QRCode_{}.png'.format(docname).replace(os.path.sep, "__")
+		filename = "QRCode_{}.png".format(docname).replace(os.path.sep, "__")
 
 		qr_image = io.BytesIO()
-		url = qrcreate(qrcode, error='L')
+		url = qrcreate(qrcode, error="L")
 		url.png(qr_image, scale=2, quiet_zone=1)
-		_file = frappe.get_doc({
-			"doctype": "File",
-			"file_name": filename,
-			"attached_to_doctype": doctype,
-			"attached_to_name": docname,
-			"attached_to_field": "qrcode_image",
-			"is_private": 0,
-			"content": qr_image.getvalue()})
+		_file = frappe.get_doc(
+			{
+				"doctype": "File",
+				"file_name": filename,
+				"attached_to_doctype": doctype,
+				"attached_to_name": docname,
+				"attached_to_field": "qrcode_image",
+				"is_private": 0,
+				"content": qr_image.getvalue(),
+			}
+		)
 		_file.save()
 		frappe.db.commit()
 		self.invoice.qrcode_image = _file.file_url
@@ -1018,50 +1226,57 @@
 
 	def set_failed_status(self, errors=None):
 		frappe.db.rollback()
-		self.invoice.einvoice_status = 'Failed'
+		self.invoice.einvoice_status = "Failed"
 		self.invoice.failure_description = self.get_failure_message(errors) if errors else ""
 		self.update_invoice()
 		frappe.db.commit()
 
 	def get_failure_message(self, errors):
 		if isinstance(errors, list):
-			errors = ', '.join(errors)
+			errors = ", ".join(errors)
 		return errors
 
+
 def sanitize_for_json(string):
 	"""Escape JSON specific characters from a string."""
 
 	# json.dumps adds double-quotes to the string. Indexing to remove them.
 	return json.dumps(string)[1:-1]
 
+
 @frappe.whitelist()
 def get_einvoice(doctype, docname):
 	invoice = frappe.get_doc(doctype, docname)
 	return make_einvoice(invoice)
 
+
 @frappe.whitelist()
 def generate_irn(doctype, docname):
 	gsp_connector = GSPConnector(doctype, docname)
 	gsp_connector.generate_irn()
 
+
 @frappe.whitelist()
 def cancel_irn(doctype, docname, irn, reason, remark):
 	gsp_connector = GSPConnector(doctype, docname)
 	gsp_connector.cancel_irn(irn, reason, remark)
 
+
 @frappe.whitelist()
 def generate_eway_bill(doctype, docname, **kwargs):
 	gsp_connector = GSPConnector(doctype, docname)
 	gsp_connector.generate_eway_bill(**kwargs)
 
+
 @frappe.whitelist()
 def cancel_eway_bill(doctype, docname):
 	# TODO: uncomment when eway_bill api from Adequare is enabled
 	# gsp_connector = GSPConnector(doctype, docname)
 	# gsp_connector.cancel_eway_bill(eway_bill, reason, remark)
 
-	frappe.db.set_value(doctype, docname, 'ewaybill', '')
-	frappe.db.set_value(doctype, docname, 'eway_bill_cancelled', 1)
+	frappe.db.set_value(doctype, docname, "ewaybill", "")
+	frappe.db.set_value(doctype, docname, "eway_bill_cancelled", 1)
+
 
 @frappe.whitelist()
 def generate_einvoices(docnames):
@@ -1076,40 +1291,40 @@
 
 		success = len(docnames) - len(failures)
 		frappe.msgprint(
-			_('{} e-invoices generated successfully').format(success),
-			title=_('Bulk E-Invoice Generation Complete')
+			_("{} e-invoices generated successfully").format(success),
+			title=_("Bulk E-Invoice Generation Complete"),
 		)
 
 	else:
 		enqueue_bulk_action(schedule_bulk_generate_irn, docnames=docnames)
 
+
 def schedule_bulk_generate_irn(docnames):
 	failures = GSPConnector.bulk_generate_irn(docnames)
 	frappe.local.message_log = []
 
-	frappe.publish_realtime("bulk_einvoice_generation_complete", {
-		"user": frappe.session.user,
-		"failures": failures,
-		"invoices": docnames
-	})
+	frappe.publish_realtime(
+		"bulk_einvoice_generation_complete",
+		{"user": frappe.session.user, "failures": failures, "invoices": docnames},
+	)
+
 
 def show_bulk_action_failure_message(failures):
 	for doc in failures:
-		docname = '<a href="sales-invoice/{0}">{0}</a>'.format(doc.get('docname'))
-		message = doc.get('message').replace("'", '"')
-		if message[0] == '[':
+		docname = '<a href="sales-invoice/{0}">{0}</a>'.format(doc.get("docname"))
+		message = doc.get("message").replace("'", '"')
+		if message[0] == "[":
 			errors = json.loads(message)
-			error_list = ''.join(['<li>{}</li>'.format(err) for err in errors])
-			message = '''{} has following errors:<br>
-				<ul style="padding-left: 20px; padding-top: 5px">{}</ul>'''.format(docname, error_list)
+			error_list = "".join(["<li>{}</li>".format(err) for err in errors])
+			message = """{} has following errors:<br>
+				<ul style="padding-left: 20px; padding-top: 5px">{}</ul>""".format(
+				docname, error_list
+			)
 		else:
-			message = '{} - {}'.format(docname, message)
+			message = "{} - {}".format(docname, message)
 
-		frappe.msgprint(
-			message,
-			title=_('Bulk E-Invoice Generation Complete'),
-			indicator='red'
-		)
+		frappe.msgprint(message, title=_("Bulk E-Invoice Generation Complete"), indicator="red")
+
 
 @frappe.whitelist()
 def cancel_irns(docnames, reason, remark):
@@ -1124,21 +1339,22 @@
 
 		success = len(docnames) - len(failures)
 		frappe.msgprint(
-			_('{} e-invoices cancelled successfully').format(success),
-			title=_('Bulk E-Invoice Cancellation Complete')
+			_("{} e-invoices cancelled successfully").format(success),
+			title=_("Bulk E-Invoice Cancellation Complete"),
 		)
 	else:
 		enqueue_bulk_action(schedule_bulk_cancel_irn, docnames=docnames, reason=reason, remark=remark)
 
+
 def schedule_bulk_cancel_irn(docnames, reason, remark):
 	failures = GSPConnector.bulk_cancel_irn(docnames, reason, remark)
 	frappe.local.message_log = []
 
-	frappe.publish_realtime("bulk_einvoice_cancellation_complete", {
-		"user": frappe.session.user,
-		"failures": failures,
-		"invoices": docnames
-	})
+	frappe.publish_realtime(
+		"bulk_einvoice_cancellation_complete",
+		{"user": frappe.session.user, "failures": failures, "invoices": docnames},
+	)
+
 
 def enqueue_bulk_action(job, **kwargs):
 	check_scheduler_status()
@@ -1153,16 +1369,18 @@
 	)
 
 	if job == schedule_bulk_generate_irn:
-		msg = _('E-Invoices will be generated in a background process.')
+		msg = _("E-Invoices will be generated in a background process.")
 	else:
-		msg = _('E-Invoices will be cancelled in a background process.')
+		msg = _("E-Invoices will be cancelled in a background process.")
 
 	frappe.msgprint(msg, alert=1)
 
+
 def check_scheduler_status():
 	if is_scheduler_inactive() and not frappe.flags.in_test:
 		frappe.throw(_("Scheduler is inactive. Cannot enqueue job."), title=_("Scheduler Inactive"))
 
+
 def job_already_enqueued(job_name):
 	enqueued_jobs = [d.get("job_name") for d in get_info()]
 	if job_name in enqueued_jobs:
diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py
index 12b10bb..40fa6cd 100644
--- a/erpnext/regional/india/setup.py
+++ b/erpnext/regional/india/setup.py
@@ -10,104 +10,118 @@
 from erpnext.accounts.utils import get_fiscal_year, FiscalYearError
 from frappe.utils import today
 
+
 def setup(company=None, patch=True):
 	# Company independent fixtures should be called only once at the first company setup
-	if patch or frappe.db.count('Company', {'country': 'India'}) <=1:
+	if patch or frappe.db.count("Company", {"country": "India"}) <= 1:
 		setup_company_independent_fixtures(patch=patch)
 
 	if not patch:
 		make_fixtures(company)
 
+
 # TODO: for all countries
 def setup_company_independent_fixtures(patch=False):
 	make_custom_fields()
 	make_property_setters(patch=patch)
 	add_permissions()
 	add_custom_roles_for_reports()
-	frappe.enqueue('erpnext.regional.india.setup.add_hsn_sac_codes', now=frappe.flags.in_test)
+	frappe.enqueue("erpnext.regional.india.setup.add_hsn_sac_codes", now=frappe.flags.in_test)
 	create_gratuity_rule()
 	add_print_formats()
 	update_accounts_settings_for_taxes()
 
+
 def add_hsn_sac_codes():
 	if frappe.flags.in_test and frappe.flags.created_hsn_codes:
 		return
 
 	# HSN codes
-	with open(os.path.join(os.path.dirname(__file__), 'hsn_code_data.json'), 'r') as f:
+	with open(os.path.join(os.path.dirname(__file__), "hsn_code_data.json"), "r") as f:
 		hsn_codes = json.loads(f.read())
 
 	create_hsn_codes(hsn_codes, code_field="hsn_code")
 
 	# SAC Codes
-	with open(os.path.join(os.path.dirname(__file__), 'sac_code_data.json'), 'r') as f:
+	with open(os.path.join(os.path.dirname(__file__), "sac_code_data.json"), "r") as f:
 		sac_codes = json.loads(f.read())
 	create_hsn_codes(sac_codes, code_field="sac_code")
 
 	if frappe.flags.in_test:
 		frappe.flags.created_hsn_codes = True
 
+
 def create_hsn_codes(data, code_field):
 	for d in data:
-		hsn_code = frappe.new_doc('GST HSN Code')
+		hsn_code = frappe.new_doc("GST HSN Code")
 		hsn_code.description = d["description"]
 		hsn_code.hsn_code = d[code_field]
 		hsn_code.name = d[code_field]
 		hsn_code.db_insert(ignore_if_duplicate=True)
 
+
 def add_custom_roles_for_reports():
-	for report_name in ('GST Sales Register', 'GST Purchase Register',
-		'GST Itemised Sales Register', 'GST Itemised Purchase Register', 'Eway Bill', 'E-Invoice Summary'):
+	for report_name in (
+		"GST Sales Register",
+		"GST Purchase Register",
+		"GST Itemised Sales Register",
+		"GST Itemised Purchase Register",
+		"Eway Bill",
+		"E-Invoice Summary",
+	):
 
-		if not frappe.db.get_value('Custom Role', dict(report=report_name)):
-			frappe.get_doc(dict(
-				doctype='Custom Role',
-				report=report_name,
-				roles= [
-					dict(role='Accounts User'),
-					dict(role='Accounts Manager')
-				]
-			)).insert()
+		if not frappe.db.get_value("Custom Role", dict(report=report_name)):
+			frappe.get_doc(
+				dict(
+					doctype="Custom Role",
+					report=report_name,
+					roles=[dict(role="Accounts User"), dict(role="Accounts Manager")],
+				)
+			).insert()
 
-	for report_name in ('Professional Tax Deductions', 'Provident Fund Deductions'):
+	for report_name in ("Professional Tax Deductions", "Provident Fund Deductions"):
 
-		if not frappe.db.get_value('Custom Role', dict(report=report_name)):
-			frappe.get_doc(dict(
-				doctype='Custom Role',
-				report=report_name,
-				roles= [
-					dict(role='HR User'),
-					dict(role='HR Manager'),
-					dict(role='Employee')
-				]
-			)).insert()
+		if not frappe.db.get_value("Custom Role", dict(report=report_name)):
+			frappe.get_doc(
+				dict(
+					doctype="Custom Role",
+					report=report_name,
+					roles=[dict(role="HR User"), dict(role="HR Manager"), dict(role="Employee")],
+				)
+			).insert()
 
-	for report_name in ('HSN-wise-summary of outward supplies', 'GSTR-1', 'GSTR-2'):
+	for report_name in ("HSN-wise-summary of outward supplies", "GSTR-1", "GSTR-2"):
 
-		if not frappe.db.get_value('Custom Role', dict(report=report_name)):
-			frappe.get_doc(dict(
-				doctype='Custom Role',
-				report=report_name,
-				roles= [
-					dict(role='Accounts User'),
-					dict(role='Accounts Manager'),
-					dict(role='Auditor')
-				]
-			)).insert()
+		if not frappe.db.get_value("Custom Role", dict(report=report_name)):
+			frappe.get_doc(
+				dict(
+					doctype="Custom Role",
+					report=report_name,
+					roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
+				)
+			).insert()
+
 
 def add_permissions():
-	for doctype in ('GST HSN Code', 'GST Settings', 'GSTR 3B Report', 'Lower Deduction Certificate', 'E Invoice Settings'):
-		add_permission(doctype, 'All', 0)
-		for role in ('Accounts Manager', 'Accounts User', 'System Manager'):
+	for doctype in (
+		"GST HSN Code",
+		"GST Settings",
+		"GSTR 3B Report",
+		"Lower Deduction Certificate",
+		"E Invoice Settings",
+	):
+		add_permission(doctype, "All", 0)
+		for role in ("Accounts Manager", "Accounts User", "System Manager"):
 			add_permission(doctype, role, 0)
-			update_permission_property(doctype, role, 0, 'write', 1)
-			update_permission_property(doctype, role, 0, 'create', 1)
+			update_permission_property(doctype, role, 0, "write", 1)
+			update_permission_property(doctype, role, 0, "create", 1)
 
-		if doctype == 'GST HSN Code':
-			for role in ('Item Manager', 'Stock Manager'):
+		if doctype == "GST HSN Code":
+			for role in ("Item Manager", "Stock Manager"):
 				add_permission(doctype, role, 0)
-				update_permission_property(doctype, role, 0, 'write', 1)
-				update_permission_property(doctype, role, 0, 'create', 1)
+				update_permission_property(doctype, role, 0, "write", 1)
+				update_permission_property(doctype, role, 0, "create", 1)
+
 
 def add_print_formats():
 	frappe.reload_doc("regional", "print_format", "gst_tax_invoice")
@@ -118,602 +132,1081 @@
 	frappe.db.set_value("Print Format", "GST Tax Invoice", "disabled", 0)
 	frappe.db.set_value("Print Format", "GST E-Invoice", "disabled", 0)
 
+
 def make_property_setters(patch=False):
 	# GST rules do not allow for an invoice no. bigger than 16 characters
-	journal_entry_types = frappe.get_meta("Journal Entry").get_options("voucher_type").split("\n") + ['Reversal Of ITC']
-	sales_invoice_series = ['SINV-.YY.-', 'SRET-.YY.-', ''] + frappe.get_meta("Sales Invoice").get_options("naming_series").split("\n")
-	purchase_invoice_series = ['PINV-.YY.-', 'PRET-.YY.-', ''] + frappe.get_meta("Purchase Invoice").get_options("naming_series").split("\n")
+	journal_entry_types = frappe.get_meta("Journal Entry").get_options("voucher_type").split("\n") + [
+		"Reversal Of ITC"
+	]
+	sales_invoice_series = ["SINV-.YY.-", "SRET-.YY.-", ""] + frappe.get_meta(
+		"Sales Invoice"
+	).get_options("naming_series").split("\n")
+	purchase_invoice_series = ["PINV-.YY.-", "PRET-.YY.-", ""] + frappe.get_meta(
+		"Purchase Invoice"
+	).get_options("naming_series").split("\n")
 
 	if not patch:
-		make_property_setter('Sales Invoice', 'naming_series', 'options', '\n'.join(sales_invoice_series), '')
-		make_property_setter('Purchase Invoice', 'naming_series', 'options', '\n'.join(purchase_invoice_series), '')
-		make_property_setter('Journal Entry', 'voucher_type', 'options', '\n'.join(journal_entry_types), '')
+		make_property_setter(
+			"Sales Invoice", "naming_series", "options", "\n".join(sales_invoice_series), ""
+		)
+		make_property_setter(
+			"Purchase Invoice", "naming_series", "options", "\n".join(purchase_invoice_series), ""
+		)
+		make_property_setter(
+			"Journal Entry", "voucher_type", "options", "\n".join(journal_entry_types), ""
+		)
+
 
 def make_custom_fields(update=True):
 	custom_fields = get_custom_fields()
 	create_custom_fields(custom_fields, update=update)
 
+
 def get_custom_fields():
-	hsn_sac_field = dict(fieldname='gst_hsn_code', label='HSN/SAC',
-		fieldtype='Data', fetch_from='item_code.gst_hsn_code', insert_after='description',
-		allow_on_submit=1, print_hide=1, fetch_if_empty=1)
-	nil_rated_exempt = dict(fieldname='is_nil_exempt', label='Is Nil Rated or Exempted',
-		fieldtype='Check', fetch_from='item_code.is_nil_exempt', insert_after='gst_hsn_code',
-		print_hide=1)
-	is_non_gst = dict(fieldname='is_non_gst', label='Is Non GST',
-		fieldtype='Check', fetch_from='item_code.is_non_gst', insert_after='is_nil_exempt',
-		print_hide=1)
-	taxable_value = dict(fieldname='taxable_value', label='Taxable Value',
-		fieldtype='Currency', insert_after='base_net_amount', hidden=1, options="Company:company:default_currency",
-		print_hide=1)
+	hsn_sac_field = dict(
+		fieldname="gst_hsn_code",
+		label="HSN/SAC",
+		fieldtype="Data",
+		fetch_from="item_code.gst_hsn_code",
+		insert_after="description",
+		allow_on_submit=1,
+		print_hide=1,
+		fetch_if_empty=1,
+	)
+	nil_rated_exempt = dict(
+		fieldname="is_nil_exempt",
+		label="Is Nil Rated or Exempted",
+		fieldtype="Check",
+		fetch_from="item_code.is_nil_exempt",
+		insert_after="gst_hsn_code",
+		print_hide=1,
+	)
+	is_non_gst = dict(
+		fieldname="is_non_gst",
+		label="Is Non GST",
+		fieldtype="Check",
+		fetch_from="item_code.is_non_gst",
+		insert_after="is_nil_exempt",
+		print_hide=1,
+	)
+	taxable_value = dict(
+		fieldname="taxable_value",
+		label="Taxable Value",
+		fieldtype="Currency",
+		insert_after="base_net_amount",
+		hidden=1,
+		options="Company:company:default_currency",
+		print_hide=1,
+	)
 
 	purchase_invoice_gst_category = [
-		dict(fieldname='gst_section', label='GST Details', fieldtype='Section Break',
-			insert_after='language', print_hide=1, collapsible=1),
-		dict(fieldname='gst_category', label='GST Category',
-			fieldtype='Select', insert_after='gst_section', print_hide=1,
-			options='\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nUIN Holders',
-			fetch_from='supplier.gst_category', fetch_if_empty=1),
-		dict(fieldname='export_type', label='Export Type',
-			fieldtype='Select', insert_after='gst_category', print_hide=1,
+		dict(
+			fieldname="gst_section",
+			label="GST Details",
+			fieldtype="Section Break",
+			insert_after="language",
+			print_hide=1,
+			collapsible=1,
+		),
+		dict(
+			fieldname="gst_category",
+			label="GST Category",
+			fieldtype="Select",
+			insert_after="gst_section",
+			print_hide=1,
+			options="\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nUIN Holders",
+			fetch_from="supplier.gst_category",
+			fetch_if_empty=1,
+		),
+		dict(
+			fieldname="export_type",
+			label="Export Type",
+			fieldtype="Select",
+			insert_after="gst_category",
+			print_hide=1,
 			depends_on='eval:in_list(["SEZ", "Overseas"], doc.gst_category)',
-			options='\nWith Payment of Tax\nWithout Payment of Tax', fetch_from='supplier.export_type',
-			fetch_if_empty=1),
+			options="\nWith Payment of Tax\nWithout Payment of Tax",
+			fetch_from="supplier.export_type",
+			fetch_if_empty=1,
+		),
 	]
 
 	sales_invoice_gst_category = [
-		dict(fieldname='gst_section', label='GST Details', fieldtype='Section Break',
-			insert_after='language', print_hide=1, collapsible=1),
-		dict(fieldname='gst_category', label='GST Category',
-			fieldtype='Select', insert_after='gst_section', print_hide=1,
-			options='\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders',
-			fetch_from='customer.gst_category', fetch_if_empty=1, length=25),
-		dict(fieldname='export_type', label='Export Type',
-			fieldtype='Select', insert_after='gst_category', print_hide=1,
+		dict(
+			fieldname="gst_section",
+			label="GST Details",
+			fieldtype="Section Break",
+			insert_after="language",
+			print_hide=1,
+			collapsible=1,
+		),
+		dict(
+			fieldname="gst_category",
+			label="GST Category",
+			fieldtype="Select",
+			insert_after="gst_section",
+			print_hide=1,
+			options="\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders",
+			fetch_from="customer.gst_category",
+			fetch_if_empty=1,
+			length=25,
+		),
+		dict(
+			fieldname="export_type",
+			label="Export Type",
+			fieldtype="Select",
+			insert_after="gst_category",
+			print_hide=1,
 			depends_on='eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)',
-			options='\nWith Payment of Tax\nWithout Payment of Tax', fetch_from='customer.export_type',
-			fetch_if_empty=1, length=25),
+			options="\nWith Payment of Tax\nWithout Payment of Tax",
+			fetch_from="customer.export_type",
+			fetch_if_empty=1,
+			length=25,
+		),
 	]
 
 	delivery_note_gst_category = [
-		dict(fieldname='gst_category', label='GST Category',
-			fieldtype='Select', insert_after='gst_vehicle_type', print_hide=1,
-			options='\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders',
-			fetch_from='customer.gst_category', fetch_if_empty=1),
+		dict(
+			fieldname="gst_category",
+			label="GST Category",
+			fieldtype="Select",
+			insert_after="gst_vehicle_type",
+			print_hide=1,
+			options="\nRegistered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders",
+			fetch_from="customer.gst_category",
+			fetch_if_empty=1,
+		),
 	]
 
 	invoice_gst_fields = [
-		dict(fieldname='invoice_copy', label='Invoice Copy', length=30,
-			fieldtype='Select', insert_after='export_type', print_hide=1, allow_on_submit=1,
-			options='Original for Recipient\nDuplicate for Transporter\nDuplicate for Supplier\nTriplicate for Supplier'),
-		dict(fieldname='reverse_charge', label='Reverse Charge', length=2,
-			fieldtype='Select', insert_after='invoice_copy', print_hide=1,
-			options='Y\nN', default='N'),
-		dict(fieldname='ecommerce_gstin', label='E-commerce GSTIN', length=15,
-			fieldtype='Data', insert_after='export_type', print_hide=1),
-		dict(fieldname='gst_col_break', fieldtype='Column Break', insert_after='ecommerce_gstin'),
-		dict(fieldname='reason_for_issuing_document', label='Reason For Issuing document',
-			fieldtype='Select', insert_after='gst_col_break', print_hide=1,
-			depends_on='eval:doc.is_return==1', length=45,
-			options='\n01-Sales Return\n02-Post Sale Discount\n03-Deficiency in services\n04-Correction in Invoice\n05-Change in POS\n06-Finalization of Provisional assessment\n07-Others')
+		dict(
+			fieldname="invoice_copy",
+			label="Invoice Copy",
+			length=30,
+			fieldtype="Select",
+			insert_after="export_type",
+			print_hide=1,
+			allow_on_submit=1,
+			options="Original for Recipient\nDuplicate for Transporter\nDuplicate for Supplier\nTriplicate for Supplier",
+		),
+		dict(
+			fieldname="reverse_charge",
+			label="Reverse Charge",
+			length=2,
+			fieldtype="Select",
+			insert_after="invoice_copy",
+			print_hide=1,
+			options="Y\nN",
+			default="N",
+		),
+		dict(
+			fieldname="ecommerce_gstin",
+			label="E-commerce GSTIN",
+			length=15,
+			fieldtype="Data",
+			insert_after="export_type",
+			print_hide=1,
+		),
+		dict(fieldname="gst_col_break", fieldtype="Column Break", insert_after="ecommerce_gstin"),
+		dict(
+			fieldname="reason_for_issuing_document",
+			label="Reason For Issuing document",
+			fieldtype="Select",
+			insert_after="gst_col_break",
+			print_hide=1,
+			depends_on="eval:doc.is_return==1",
+			length=45,
+			options="\n01-Sales Return\n02-Post Sale Discount\n03-Deficiency in services\n04-Correction in Invoice\n05-Change in POS\n06-Finalization of Provisional assessment\n07-Others",
+		),
 	]
 
 	purchase_invoice_gst_fields = [
-			dict(fieldname='supplier_gstin', label='Supplier GSTIN',
-				fieldtype='Data', insert_after='supplier_address',
-				fetch_from='supplier_address.gstin', print_hide=1, read_only=1),
-			dict(fieldname='company_gstin', label='Company GSTIN',
-				fieldtype='Data', insert_after='shipping_address_display',
-				fetch_from='shipping_address.gstin', print_hide=1, read_only=1),
-			dict(fieldname='place_of_supply', label='Place of Supply',
-				fieldtype='Data', insert_after='shipping_address',
-				print_hide=1, read_only=1),
-		]
+		dict(
+			fieldname="supplier_gstin",
+			label="Supplier GSTIN",
+			fieldtype="Data",
+			insert_after="supplier_address",
+			fetch_from="supplier_address.gstin",
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="company_gstin",
+			label="Company GSTIN",
+			fieldtype="Data",
+			insert_after="shipping_address_display",
+			fetch_from="shipping_address.gstin",
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="place_of_supply",
+			label="Place of Supply",
+			fieldtype="Data",
+			insert_after="shipping_address",
+			print_hide=1,
+			read_only=1,
+		),
+	]
 
 	purchase_invoice_itc_fields = [
-			dict(fieldname='eligibility_for_itc', label='Eligibility For ITC',
-				fieldtype='Select', insert_after='reason_for_issuing_document', print_hide=1,
-				options='Input Service Distributor\nImport Of Service\nImport Of Capital Goods\nITC on Reverse Charge\nIneligible As Per Section 17(5)\nIneligible Others\nAll Other ITC',
-				default="All Other ITC"),
-			dict(fieldname='itc_integrated_tax', label='Availed ITC Integrated Tax',
-				fieldtype='Currency', insert_after='eligibility_for_itc',
-				options='Company:company:default_currency', print_hide=1),
-			dict(fieldname='itc_central_tax', label='Availed ITC Central Tax',
-				fieldtype='Currency', insert_after='itc_integrated_tax',
-				options='Company:company:default_currency', print_hide=1),
-			dict(fieldname='itc_state_tax', label='Availed ITC State/UT Tax',
-				fieldtype='Currency', insert_after='itc_central_tax',
-				options='Company:company:default_currency', print_hide=1),
-			dict(fieldname='itc_cess_amount', label='Availed ITC Cess',
-				fieldtype='Currency', insert_after='itc_state_tax',
-				options='Company:company:default_currency', print_hide=1),
-		]
+		dict(
+			fieldname="eligibility_for_itc",
+			label="Eligibility For ITC",
+			fieldtype="Select",
+			insert_after="reason_for_issuing_document",
+			print_hide=1,
+			options="Input Service Distributor\nImport Of Service\nImport Of Capital Goods\nITC on Reverse Charge\nIneligible As Per Section 17(5)\nIneligible Others\nAll Other ITC",
+			default="All Other ITC",
+		),
+		dict(
+			fieldname="itc_integrated_tax",
+			label="Availed ITC Integrated Tax",
+			fieldtype="Currency",
+			insert_after="eligibility_for_itc",
+			options="Company:company:default_currency",
+			print_hide=1,
+		),
+		dict(
+			fieldname="itc_central_tax",
+			label="Availed ITC Central Tax",
+			fieldtype="Currency",
+			insert_after="itc_integrated_tax",
+			options="Company:company:default_currency",
+			print_hide=1,
+		),
+		dict(
+			fieldname="itc_state_tax",
+			label="Availed ITC State/UT Tax",
+			fieldtype="Currency",
+			insert_after="itc_central_tax",
+			options="Company:company:default_currency",
+			print_hide=1,
+		),
+		dict(
+			fieldname="itc_cess_amount",
+			label="Availed ITC Cess",
+			fieldtype="Currency",
+			insert_after="itc_state_tax",
+			options="Company:company:default_currency",
+			print_hide=1,
+		),
+	]
 
 	sales_invoice_gst_fields = [
-			dict(fieldname='billing_address_gstin', label='Billing Address GSTIN',
-				fieldtype='Data', insert_after='customer_address', read_only=1,
-				fetch_from='customer_address.gstin', print_hide=1, length=15),
-			dict(fieldname='customer_gstin', label='Customer GSTIN',
-				fieldtype='Data', insert_after='shipping_address_name',
-				fetch_from='shipping_address_name.gstin', print_hide=1, length=15),
-			dict(fieldname='place_of_supply', label='Place of Supply',
-				fieldtype='Data', insert_after='customer_gstin',
-				print_hide=1, read_only=1, length=50),
-			dict(fieldname='company_gstin', label='Company GSTIN',
-				fieldtype='Data', insert_after='company_address',
-				fetch_from='company_address.gstin', print_hide=1, read_only=1, length=15),
-		]
+		dict(
+			fieldname="billing_address_gstin",
+			label="Billing Address GSTIN",
+			fieldtype="Data",
+			insert_after="customer_address",
+			read_only=1,
+			fetch_from="customer_address.gstin",
+			print_hide=1,
+			length=15,
+		),
+		dict(
+			fieldname="customer_gstin",
+			label="Customer GSTIN",
+			fieldtype="Data",
+			insert_after="shipping_address_name",
+			fetch_from="shipping_address_name.gstin",
+			print_hide=1,
+			length=15,
+		),
+		dict(
+			fieldname="place_of_supply",
+			label="Place of Supply",
+			fieldtype="Data",
+			insert_after="customer_gstin",
+			print_hide=1,
+			read_only=1,
+			length=50,
+		),
+		dict(
+			fieldname="company_gstin",
+			label="Company GSTIN",
+			fieldtype="Data",
+			insert_after="company_address",
+			fetch_from="company_address.gstin",
+			print_hide=1,
+			read_only=1,
+			length=15,
+		),
+	]
 
 	sales_invoice_shipping_fields = [
-			dict(fieldname='port_code', label='Port Code',
-				fieldtype='Data', insert_after='reason_for_issuing_document', print_hide=1,
-				depends_on="eval:doc.gst_category=='Overseas' ", length=15),
-			dict(fieldname='shipping_bill_number', label=' Shipping Bill Number',
-				fieldtype='Data', insert_after='port_code', print_hide=1,
-				depends_on="eval:doc.gst_category=='Overseas' ", length=50),
-			dict(fieldname='shipping_bill_date', label='Shipping Bill Date',
-				fieldtype='Date', insert_after='shipping_bill_number', print_hide=1,
-				depends_on="eval:doc.gst_category=='Overseas' "),
-		]
+		dict(
+			fieldname="port_code",
+			label="Port Code",
+			fieldtype="Data",
+			insert_after="reason_for_issuing_document",
+			print_hide=1,
+			depends_on="eval:doc.gst_category=='Overseas' ",
+			length=15,
+		),
+		dict(
+			fieldname="shipping_bill_number",
+			label=" Shipping Bill Number",
+			fieldtype="Data",
+			insert_after="port_code",
+			print_hide=1,
+			depends_on="eval:doc.gst_category=='Overseas' ",
+			length=50,
+		),
+		dict(
+			fieldname="shipping_bill_date",
+			label="Shipping Bill Date",
+			fieldtype="Date",
+			insert_after="shipping_bill_number",
+			print_hide=1,
+			depends_on="eval:doc.gst_category=='Overseas' ",
+		),
+	]
 
 	journal_entry_fields = [
-		dict(fieldname='reversal_type', label='Reversal Type',
-			fieldtype='Select', insert_after='voucher_type', print_hide=1,
+		dict(
+			fieldname="reversal_type",
+			label="Reversal Type",
+			fieldtype="Select",
+			insert_after="voucher_type",
+			print_hide=1,
 			options="As per rules 42 & 43 of CGST Rules\nOthers",
 			depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
-			mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'"),
-		dict(fieldname='company_address', label='Company Address',
-			fieldtype='Link', options='Address', insert_after='reversal_type',
-			print_hide=1, depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
-			mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'"),
-		dict(fieldname='company_gstin', label='Company GSTIN',
-			fieldtype='Data', read_only=1, insert_after='company_address', print_hide=1,
-			fetch_from='company_address.gstin',
+			mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+		),
+		dict(
+			fieldname="company_address",
+			label="Company Address",
+			fieldtype="Link",
+			options="Address",
+			insert_after="reversal_type",
+			print_hide=1,
 			depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
-			mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'")
+			mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+		),
+		dict(
+			fieldname="company_gstin",
+			label="Company GSTIN",
+			fieldtype="Data",
+			read_only=1,
+			insert_after="company_address",
+			print_hide=1,
+			fetch_from="company_address.gstin",
+			depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+			mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'",
+		),
 	]
 
 	inter_state_gst_field = [
-		dict(fieldname='is_inter_state', label='Is Inter State',
-			fieldtype='Check', insert_after='disabled', print_hide=1),
-		dict(fieldname='is_reverse_charge', label='Is Reverse Charge', fieldtype='Check',
-			insert_after='is_inter_state', print_hide=1),
-		dict(fieldname='tax_category_column_break', fieldtype='Column Break',
-			insert_after='is_reverse_charge'),
-		dict(fieldname='gst_state', label='Source State', fieldtype='Select',
-			options='\n'.join(states), insert_after='company')
+		dict(
+			fieldname="is_inter_state",
+			label="Is Inter State",
+			fieldtype="Check",
+			insert_after="disabled",
+			print_hide=1,
+		),
+		dict(
+			fieldname="is_reverse_charge",
+			label="Is Reverse Charge",
+			fieldtype="Check",
+			insert_after="is_inter_state",
+			print_hide=1,
+		),
+		dict(
+			fieldname="tax_category_column_break",
+			fieldtype="Column Break",
+			insert_after="is_reverse_charge",
+		),
+		dict(
+			fieldname="gst_state",
+			label="Source State",
+			fieldtype="Select",
+			options="\n".join(states),
+			insert_after="company",
+		),
 	]
 
 	ewaybill_fields = [
 		{
-			'fieldname': 'distance',
-			'label': 'Distance (in km)',
-			'fieldtype': 'Float',
-			'insert_after': 'vehicle_no',
-			'print_hide': 1
+			"fieldname": "distance",
+			"label": "Distance (in km)",
+			"fieldtype": "Float",
+			"insert_after": "vehicle_no",
+			"print_hide": 1,
 		},
 		{
-			'fieldname': 'gst_transporter_id',
-			'label': 'GST Transporter ID',
-			'fieldtype': 'Data',
-			'insert_after': 'transporter',
-			'fetch_from': 'transporter.gst_transporter_id',
-			'print_hide': 1,
-			'translatable': 0
+			"fieldname": "gst_transporter_id",
+			"label": "GST Transporter ID",
+			"fieldtype": "Data",
+			"insert_after": "transporter",
+			"fetch_from": "transporter.gst_transporter_id",
+			"print_hide": 1,
+			"translatable": 0,
 		},
 		{
-			'fieldname': 'mode_of_transport',
-			'label': 'Mode of Transport',
-			'fieldtype': 'Select',
-			'options': '\nRoad\nAir\nRail\nShip',
-			'default': 'Road',
-			'insert_after': 'transporter_name',
-			'print_hide': 1,
-			'translatable': 0
+			"fieldname": "mode_of_transport",
+			"label": "Mode of Transport",
+			"fieldtype": "Select",
+			"options": "\nRoad\nAir\nRail\nShip",
+			"default": "Road",
+			"insert_after": "transporter_name",
+			"print_hide": 1,
+			"translatable": 0,
 		},
 		{
-			'fieldname': 'gst_vehicle_type',
-			'label': 'GST Vehicle Type',
-			'fieldtype': 'Select',
-			'options': 'Regular\nOver Dimensional Cargo (ODC)',
-			'depends_on': 'eval:(doc.mode_of_transport === "Road")',
-			'default': 'Regular',
-			'insert_after': 'lr_date',
-			'print_hide': 1,
-			'translatable': 0
+			"fieldname": "gst_vehicle_type",
+			"label": "GST Vehicle Type",
+			"fieldtype": "Select",
+			"options": "Regular\nOver Dimensional Cargo (ODC)",
+			"depends_on": 'eval:(doc.mode_of_transport === "Road")',
+			"default": "Regular",
+			"insert_after": "lr_date",
+			"print_hide": 1,
+			"translatable": 0,
 		},
 		{
-			'fieldname': 'ewaybill',
-			'label': 'E-Way Bill No.',
-			'fieldtype': 'Data',
-			'depends_on': 'eval:(doc.docstatus === 1)',
-			'allow_on_submit': 1,
-			'insert_after': 'customer_name_in_arabic',
-			'translatable': 0,
-		}
+			"fieldname": "ewaybill",
+			"label": "E-Way Bill No.",
+			"fieldtype": "Data",
+			"depends_on": "eval:(doc.docstatus === 1)",
+			"allow_on_submit": 1,
+			"insert_after": "customer_name_in_arabic",
+			"translatable": 0,
+		},
 	]
 
 	si_ewaybill_fields = [
 		{
-			'fieldname': 'transporter_info',
- 			'label': 'Transporter Info',
- 			'fieldtype': 'Section Break',
- 			'insert_after': 'terms',
- 			'collapsible': 1,
- 			'collapsible_depends_on': 'transporter',
- 			'print_hide': 1
+			"fieldname": "transporter_info",
+			"label": "Transporter Info",
+			"fieldtype": "Section Break",
+			"insert_after": "terms",
+			"collapsible": 1,
+			"collapsible_depends_on": "transporter",
+			"print_hide": 1,
 		},
 		{
-			'fieldname': 'transporter',
-			'label': 'Transporter',
-			'fieldtype': 'Link',
-			'insert_after': 'transporter_info',
-			'options': 'Supplier',
-			'print_hide': 1
+			"fieldname": "transporter",
+			"label": "Transporter",
+			"fieldtype": "Link",
+			"insert_after": "transporter_info",
+			"options": "Supplier",
+			"print_hide": 1,
 		},
 		{
-			'fieldname': 'gst_transporter_id',
-			'label': 'GST Transporter ID',
-			'fieldtype': 'Data',
-			'insert_after': 'transporter',
-			'fetch_from': 'transporter.gst_transporter_id',
-			'print_hide': 1,
-			'translatable': 0,
-			'length': 20
+			"fieldname": "gst_transporter_id",
+			"label": "GST Transporter ID",
+			"fieldtype": "Data",
+			"insert_after": "transporter",
+			"fetch_from": "transporter.gst_transporter_id",
+			"print_hide": 1,
+			"translatable": 0,
+			"length": 20,
 		},
 		{
-			'fieldname': 'driver',
-			'label': 'Driver',
-			'fieldtype': 'Link',
-			'insert_after': 'gst_transporter_id',
-			'options': 'Driver',
-			'print_hide': 1
+			"fieldname": "driver",
+			"label": "Driver",
+			"fieldtype": "Link",
+			"insert_after": "gst_transporter_id",
+			"options": "Driver",
+			"print_hide": 1,
 		},
 		{
-			'fieldname': 'lr_no',
-			'label': 'Transport Receipt No',
-			'fieldtype': 'Data',
-			'insert_after': 'driver',
-			'print_hide': 1,
-			'translatable': 0,
-			'length': 30
+			"fieldname": "lr_no",
+			"label": "Transport Receipt No",
+			"fieldtype": "Data",
+			"insert_after": "driver",
+			"print_hide": 1,
+			"translatable": 0,
+			"length": 30,
 		},
 		{
-			'fieldname': 'vehicle_no',
-			'label': 'Vehicle No',
-			'fieldtype': 'Data',
-			'insert_after': 'lr_no',
-			'print_hide': 1,
-			'translatable': 0,
-			'length': 10
+			"fieldname": "vehicle_no",
+			"label": "Vehicle No",
+			"fieldtype": "Data",
+			"insert_after": "lr_no",
+			"print_hide": 1,
+			"translatable": 0,
+			"length": 10,
 		},
 		{
-			'fieldname': 'distance',
-			'label': 'Distance (in km)',
-			'fieldtype': 'Float',
-			'insert_after': 'vehicle_no',
-			'print_hide': 1
+			"fieldname": "distance",
+			"label": "Distance (in km)",
+			"fieldtype": "Float",
+			"insert_after": "vehicle_no",
+			"print_hide": 1,
+		},
+		{"fieldname": "transporter_col_break", "fieldtype": "Column Break", "insert_after": "distance"},
+		{
+			"fieldname": "transporter_name",
+			"label": "Transporter Name",
+			"fieldtype": "Small Text",
+			"insert_after": "transporter_col_break",
+			"fetch_from": "transporter.name",
+			"read_only": 1,
+			"print_hide": 1,
+			"translatable": 0,
 		},
 		{
-			'fieldname': 'transporter_col_break',
-			'fieldtype': 'Column Break',
-			'insert_after': 'distance'
+			"fieldname": "mode_of_transport",
+			"label": "Mode of Transport",
+			"fieldtype": "Select",
+			"options": "\nRoad\nAir\nRail\nShip",
+			"insert_after": "transporter_name",
+			"print_hide": 1,
+			"translatable": 0,
+			"length": 5,
 		},
 		{
-			'fieldname': 'transporter_name',
-			'label': 'Transporter Name',
-			'fieldtype': 'Small Text',
-			'insert_after': 'transporter_col_break',
-			'fetch_from': 'transporter.name',
-			'read_only': 1,
-			'print_hide': 1,
-			'translatable': 0
+			"fieldname": "driver_name",
+			"label": "Driver Name",
+			"fieldtype": "Small Text",
+			"insert_after": "mode_of_transport",
+			"fetch_from": "driver.full_name",
+			"print_hide": 1,
+			"translatable": 0,
 		},
 		{
-			'fieldname': 'mode_of_transport',
-			'label': 'Mode of Transport',
-			'fieldtype': 'Select',
-			'options': '\nRoad\nAir\nRail\nShip',
-			'insert_after': 'transporter_name',
-			'print_hide': 1,
-			'translatable': 0,
-			'length': 5
+			"fieldname": "lr_date",
+			"label": "Transport Receipt Date",
+			"fieldtype": "Date",
+			"insert_after": "driver_name",
+			"default": "Today",
+			"print_hide": 1,
 		},
 		{
-			'fieldname': 'driver_name',
-			'label': 'Driver Name',
-			'fieldtype': 'Small Text',
-			'insert_after': 'mode_of_transport',
-			'fetch_from': 'driver.full_name',
-			'print_hide': 1,
-			'translatable': 0
+			"fieldname": "gst_vehicle_type",
+			"label": "GST Vehicle Type",
+			"fieldtype": "Select",
+			"options": "Regular\nOver Dimensional Cargo (ODC)",
+			"depends_on": 'eval:(doc.mode_of_transport === "Road")',
+			"default": "Regular",
+			"insert_after": "lr_date",
+			"print_hide": 1,
+			"translatable": 0,
+			"length": 30,
 		},
 		{
-			'fieldname': 'lr_date',
-			'label': 'Transport Receipt Date',
-			'fieldtype': 'Date',
-			'insert_after': 'driver_name',
-			'default': 'Today',
-			'print_hide': 1
+			"fieldname": "ewaybill",
+			"label": "E-Way Bill No.",
+			"fieldtype": "Data",
+			"depends_on": "eval:((doc.docstatus === 1 || doc.ewaybill) && doc.eway_bill_cancelled === 0)",
+			"allow_on_submit": 1,
+			"insert_after": "tax_id",
+			"translatable": 0,
+			"length": 20,
 		},
-		{
-			'fieldname': 'gst_vehicle_type',
-			'label': 'GST Vehicle Type',
-			'fieldtype': 'Select',
-			'options': 'Regular\nOver Dimensional Cargo (ODC)',
-			'depends_on': 'eval:(doc.mode_of_transport === "Road")',
-			'default': 'Regular',
-			'insert_after': 'lr_date',
-			'print_hide': 1,
-			'translatable': 0,
-			'length': 30
-		},
-		{
-			'fieldname': 'ewaybill',
-			'label': 'E-Way Bill No.',
-			'fieldtype': 'Data',
-			'depends_on': 'eval:((doc.docstatus === 1 || doc.ewaybill) && doc.eway_bill_cancelled === 0)',
-			'allow_on_submit': 1,
-			'insert_after': 'tax_id',
-			'translatable': 0,
-			'length': 20
-		}
 	]
 
 	payment_entry_fields = [
-		dict(fieldname='gst_section', label='GST Details', fieldtype='Section Break', insert_after='deductions',
-			print_hide=1, collapsible=1),
-		dict(fieldname='company_address', label='Company Address', fieldtype='Link', insert_after='gst_section',
-			print_hide=1, options='Address'),
-		dict(fieldname='company_gstin', label='Company GSTIN',
-			fieldtype='Data', insert_after='company_address',
-			fetch_from='company_address.gstin', print_hide=1, read_only=1),
-		dict(fieldname='place_of_supply', label='Place of Supply',
-			fieldtype='Data', insert_after='company_gstin',
-			print_hide=1, read_only=1),
-		dict(fieldname='gst_column_break', fieldtype='Column Break',
-				insert_after='place_of_supply'),
-		dict(fieldname='customer_address', label='Customer Address', fieldtype='Link', insert_after='gst_column_break',
-			print_hide=1, options='Address', depends_on = 'eval:doc.party_type == "Customer"'),
-		dict(fieldname='customer_gstin', label='Customer GSTIN',
-			fieldtype='Data', insert_after='customer_address',
-			fetch_from='customer_address.gstin', print_hide=1, read_only=1)
+		dict(
+			fieldname="gst_section",
+			label="GST Details",
+			fieldtype="Section Break",
+			insert_after="deductions",
+			print_hide=1,
+			collapsible=1,
+		),
+		dict(
+			fieldname="company_address",
+			label="Company Address",
+			fieldtype="Link",
+			insert_after="gst_section",
+			print_hide=1,
+			options="Address",
+		),
+		dict(
+			fieldname="company_gstin",
+			label="Company GSTIN",
+			fieldtype="Data",
+			insert_after="company_address",
+			fetch_from="company_address.gstin",
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="place_of_supply",
+			label="Place of Supply",
+			fieldtype="Data",
+			insert_after="company_gstin",
+			print_hide=1,
+			read_only=1,
+		),
+		dict(fieldname="gst_column_break", fieldtype="Column Break", insert_after="place_of_supply"),
+		dict(
+			fieldname="customer_address",
+			label="Customer Address",
+			fieldtype="Link",
+			insert_after="gst_column_break",
+			print_hide=1,
+			options="Address",
+			depends_on='eval:doc.party_type == "Customer"',
+		),
+		dict(
+			fieldname="customer_gstin",
+			label="Customer GSTIN",
+			fieldtype="Data",
+			insert_after="customer_address",
+			fetch_from="customer_address.gstin",
+			print_hide=1,
+			read_only=1,
+		),
 	]
 
 	si_einvoice_fields = [
-		dict(fieldname='irn', label='IRN', fieldtype='Data', read_only=1, insert_after='customer', no_copy=1, print_hide=1,
-			depends_on='eval:in_list(["Registered Regular", "SEZ", "Overseas", "Deemed Export"], doc.gst_category) && doc.irn_cancelled === 0'),
-
-		dict(fieldname='irn_cancelled', label='IRN Cancelled', fieldtype='Check', no_copy=1, print_hide=1,
-			depends_on='eval: doc.irn', allow_on_submit=1, insert_after='customer'),
-
-		dict(fieldname='eway_bill_validity', label='E-Way Bill Validity', fieldtype='Data', no_copy=1, print_hide=1,
-			depends_on='ewaybill', read_only=1, allow_on_submit=1, insert_after='ewaybill'),
-
-		dict(fieldname='eway_bill_cancelled', label='E-Way Bill Cancelled', fieldtype='Check', no_copy=1, print_hide=1,
-			depends_on='eval:(doc.eway_bill_cancelled === 1)', read_only=1, allow_on_submit=1, insert_after='customer'),
-
-		dict(fieldname='einvoice_section', label='E-Invoice Fields', fieldtype='Section Break', insert_after='gst_vehicle_type',
-			print_hide=1, hidden=1),
-
-		dict(fieldname='ack_no', label='Ack. No.', fieldtype='Data', read_only=1, hidden=1, insert_after='einvoice_section',
-			no_copy=1, print_hide=1),
-
-		dict(fieldname='ack_date', label='Ack. Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_no', no_copy=1, print_hide=1),
-
-		dict(fieldname='irn_cancel_date', label='Cancel Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_date',
-			no_copy=1, print_hide=1),
-
-		dict(fieldname='signed_einvoice', label='Signed E-Invoice', fieldtype='Code', options='JSON', hidden=1, insert_after='irn_cancel_date',
-			no_copy=1, print_hide=1, read_only=1),
-
-		dict(fieldname='signed_qr_code', label='Signed QRCode', fieldtype='Code', options='JSON', hidden=1, insert_after='signed_einvoice',
-			no_copy=1, print_hide=1, read_only=1),
-
-		dict(fieldname='qrcode_image', label='QRCode', fieldtype='Attach Image', hidden=1, insert_after='signed_qr_code',
-			no_copy=1, print_hide=1, read_only=1),
-
-		dict(fieldname='einvoice_status', label='E-Invoice Status', fieldtype='Select', insert_after='qrcode_image',
-			options='\nPending\nGenerated\nCancelled\nFailed', default=None, hidden=1, no_copy=1, print_hide=1, read_only=1),
-
-		dict(fieldname='failure_description', label='E-Invoice Failure Description', fieldtype='Code', options='JSON',
-			hidden=1, insert_after='einvoice_status', no_copy=1, print_hide=1, read_only=1)
+		dict(
+			fieldname="irn",
+			label="IRN",
+			fieldtype="Data",
+			read_only=1,
+			insert_after="customer",
+			no_copy=1,
+			print_hide=1,
+			depends_on='eval:in_list(["Registered Regular", "SEZ", "Overseas", "Deemed Export"], doc.gst_category) && doc.irn_cancelled === 0',
+		),
+		dict(
+			fieldname="irn_cancelled",
+			label="IRN Cancelled",
+			fieldtype="Check",
+			no_copy=1,
+			print_hide=1,
+			depends_on="eval: doc.irn",
+			allow_on_submit=1,
+			insert_after="customer",
+		),
+		dict(
+			fieldname="eway_bill_validity",
+			label="E-Way Bill Validity",
+			fieldtype="Data",
+			no_copy=1,
+			print_hide=1,
+			depends_on="ewaybill",
+			read_only=1,
+			allow_on_submit=1,
+			insert_after="ewaybill",
+		),
+		dict(
+			fieldname="eway_bill_cancelled",
+			label="E-Way Bill Cancelled",
+			fieldtype="Check",
+			no_copy=1,
+			print_hide=1,
+			depends_on="eval:(doc.eway_bill_cancelled === 1)",
+			read_only=1,
+			allow_on_submit=1,
+			insert_after="customer",
+		),
+		dict(
+			fieldname="einvoice_section",
+			label="E-Invoice Fields",
+			fieldtype="Section Break",
+			insert_after="gst_vehicle_type",
+			print_hide=1,
+			hidden=1,
+		),
+		dict(
+			fieldname="ack_no",
+			label="Ack. No.",
+			fieldtype="Data",
+			read_only=1,
+			hidden=1,
+			insert_after="einvoice_section",
+			no_copy=1,
+			print_hide=1,
+		),
+		dict(
+			fieldname="ack_date",
+			label="Ack. Date",
+			fieldtype="Data",
+			read_only=1,
+			hidden=1,
+			insert_after="ack_no",
+			no_copy=1,
+			print_hide=1,
+		),
+		dict(
+			fieldname="irn_cancel_date",
+			label="Cancel Date",
+			fieldtype="Data",
+			read_only=1,
+			hidden=1,
+			insert_after="ack_date",
+			no_copy=1,
+			print_hide=1,
+		),
+		dict(
+			fieldname="signed_einvoice",
+			label="Signed E-Invoice",
+			fieldtype="Code",
+			options="JSON",
+			hidden=1,
+			insert_after="irn_cancel_date",
+			no_copy=1,
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="signed_qr_code",
+			label="Signed QRCode",
+			fieldtype="Code",
+			options="JSON",
+			hidden=1,
+			insert_after="signed_einvoice",
+			no_copy=1,
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="qrcode_image",
+			label="QRCode",
+			fieldtype="Attach Image",
+			hidden=1,
+			insert_after="signed_qr_code",
+			no_copy=1,
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="einvoice_status",
+			label="E-Invoice Status",
+			fieldtype="Select",
+			insert_after="qrcode_image",
+			options="\nPending\nGenerated\nCancelled\nFailed",
+			default=None,
+			hidden=1,
+			no_copy=1,
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="failure_description",
+			label="E-Invoice Failure Description",
+			fieldtype="Code",
+			options="JSON",
+			hidden=1,
+			insert_after="einvoice_status",
+			no_copy=1,
+			print_hide=1,
+			read_only=1,
+		),
 	]
 
 	custom_fields = {
-		'Address': [
-			dict(fieldname='gstin', label='Party GSTIN', fieldtype='Data',
-				insert_after='fax'),
-			dict(fieldname='gst_state', label='GST State', fieldtype='Select',
-				options='\n'.join(states), insert_after='gstin'),
-			dict(fieldname='gst_state_number', label='GST State Number',
-				fieldtype='Data', insert_after='gst_state', read_only=1),
+		"Address": [
+			dict(fieldname="gstin", label="Party GSTIN", fieldtype="Data", insert_after="fax"),
+			dict(
+				fieldname="gst_state",
+				label="GST State",
+				fieldtype="Select",
+				options="\n".join(states),
+				insert_after="gstin",
+			),
+			dict(
+				fieldname="gst_state_number",
+				label="GST State Number",
+				fieldtype="Data",
+				insert_after="gst_state",
+				read_only=1,
+			),
 		],
-		'Purchase Invoice': purchase_invoice_gst_category + invoice_gst_fields + purchase_invoice_itc_fields + purchase_invoice_gst_fields,
-		'Purchase Order': purchase_invoice_gst_fields,
-		'Purchase Receipt': purchase_invoice_gst_fields,
-		'Sales Invoice': sales_invoice_gst_category + invoice_gst_fields + sales_invoice_shipping_fields + sales_invoice_gst_fields + si_ewaybill_fields + si_einvoice_fields,
-		'POS Invoice': sales_invoice_gst_fields,
-		'Delivery Note': sales_invoice_gst_fields + ewaybill_fields + sales_invoice_shipping_fields + delivery_note_gst_category,
-		'Payment Entry': payment_entry_fields,
-		'Journal Entry': journal_entry_fields,
-		'Sales Order': sales_invoice_gst_fields,
-		'Tax Category': inter_state_gst_field,
-		'Item': [
-			dict(fieldname='gst_hsn_code', label='HSN/SAC',
-				fieldtype='Link', options='GST HSN Code', insert_after='item_group'),
-			dict(fieldname='is_nil_exempt', label='Is Nil Rated or Exempted',
-				fieldtype='Check', insert_after='gst_hsn_code'),
-			dict(fieldname='is_non_gst', label='Is Non GST ',
-				fieldtype='Check', insert_after='is_nil_exempt')
+		"Purchase Invoice": purchase_invoice_gst_category
+		+ invoice_gst_fields
+		+ purchase_invoice_itc_fields
+		+ purchase_invoice_gst_fields,
+		"Purchase Order": purchase_invoice_gst_fields,
+		"Purchase Receipt": purchase_invoice_gst_fields,
+		"Sales Invoice": sales_invoice_gst_category
+		+ invoice_gst_fields
+		+ sales_invoice_shipping_fields
+		+ sales_invoice_gst_fields
+		+ si_ewaybill_fields
+		+ si_einvoice_fields,
+		"POS Invoice": sales_invoice_gst_fields,
+		"Delivery Note": sales_invoice_gst_fields
+		+ ewaybill_fields
+		+ sales_invoice_shipping_fields
+		+ delivery_note_gst_category,
+		"Payment Entry": payment_entry_fields,
+		"Journal Entry": journal_entry_fields,
+		"Sales Order": sales_invoice_gst_fields,
+		"Tax Category": inter_state_gst_field,
+		"Item": [
+			dict(
+				fieldname="gst_hsn_code",
+				label="HSN/SAC",
+				fieldtype="Link",
+				options="GST HSN Code",
+				insert_after="item_group",
+			),
+			dict(
+				fieldname="is_nil_exempt",
+				label="Is Nil Rated or Exempted",
+				fieldtype="Check",
+				insert_after="gst_hsn_code",
+			),
+			dict(
+				fieldname="is_non_gst", label="Is Non GST ", fieldtype="Check", insert_after="is_nil_exempt"
+			),
 		],
-		'Quotation Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Supplier Quotation Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Sales Order Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Delivery Note Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Sales Invoice Item': [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
-		'POS Invoice Item': [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
-		'Purchase Order Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Purchase Receipt Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Purchase Invoice Item': [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
-		'Material Request Item': [hsn_sac_field, nil_rated_exempt, is_non_gst],
-		'Salary Component': [
-			dict(fieldname=  'component_type',
-				label= 'Component Type',
-				fieldtype=  'Select',
-				insert_after= 'description',
-				options= "\nProvident Fund\nAdditional Provident Fund\nProvident Fund Loan\nProfessional Tax",
-				depends_on = 'eval:doc.type == "Deduction"'
+		"Quotation Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Supplier Quotation Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Sales Order Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Delivery Note Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Sales Invoice Item": [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
+		"POS Invoice Item": [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
+		"Purchase Order Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Purchase Receipt Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Purchase Invoice Item": [hsn_sac_field, nil_rated_exempt, is_non_gst, taxable_value],
+		"Material Request Item": [hsn_sac_field, nil_rated_exempt, is_non_gst],
+		"Salary Component": [
+			dict(
+				fieldname="component_type",
+				label="Component Type",
+				fieldtype="Select",
+				insert_after="description",
+				options="\nProvident Fund\nAdditional Provident Fund\nProvident Fund Loan\nProfessional Tax",
+				depends_on='eval:doc.type == "Deduction"',
 			)
 		],
-		'Employee': [
-			dict(fieldname='ifsc_code',
-				label='IFSC Code',
-				fieldtype='Data',
-				insert_after='bank_ac_no',
+		"Employee": [
+			dict(
+				fieldname="ifsc_code",
+				label="IFSC Code",
+				fieldtype="Data",
+				insert_after="bank_ac_no",
 				print_hide=1,
-				depends_on='eval:doc.salary_mode == "Bank"'
-				),
-			dict(
-				fieldname =  'pan_number',
-				label = 'PAN Number',
-				fieldtype = 'Data',
-				insert_after = 'payroll_cost_center',
-				print_hide = 1
+				depends_on='eval:doc.salary_mode == "Bank"',
 			),
 			dict(
-				fieldname =  'micr_code',
-				label = 'MICR Code',
-				fieldtype = 'Data',
-				insert_after = 'ifsc_code',
-				print_hide = 1,
-				depends_on='eval:doc.salary_mode == "Bank"'
+				fieldname="pan_number",
+				label="PAN Number",
+				fieldtype="Data",
+				insert_after="payroll_cost_center",
+				print_hide=1,
 			),
 			dict(
-				fieldname = 'provident_fund_account',
-				label = 'Provident Fund Account',
-				fieldtype = 'Data',
-				insert_after = 'pan_number'
-			)
-
+				fieldname="micr_code",
+				label="MICR Code",
+				fieldtype="Data",
+				insert_after="ifsc_code",
+				print_hide=1,
+				depends_on='eval:doc.salary_mode == "Bank"',
+			),
+			dict(
+				fieldname="provident_fund_account",
+				label="Provident Fund Account",
+				fieldtype="Data",
+				insert_after="pan_number",
+			),
 		],
-		'Company': [
-			dict(fieldname='hra_section', label='HRA Settings',
-				fieldtype='Section Break', insert_after='asset_received_but_not_billed', collapsible=1),
-			dict(fieldname='basic_component', label='Basic Component',
-				fieldtype='Link', options='Salary Component', insert_after='hra_section'),
-			dict(fieldname='hra_component', label='HRA Component',
-				fieldtype='Link', options='Salary Component', insert_after='basic_component'),
-			dict(fieldname='hra_column_break', fieldtype='Column Break', insert_after='hra_component'),
-			dict(fieldname='arrear_component', label='Arrear Component',
-				fieldtype='Link', options='Salary Component', insert_after='hra_column_break'),
+		"Company": [
+			dict(
+				fieldname="hra_section",
+				label="HRA Settings",
+				fieldtype="Section Break",
+				insert_after="asset_received_but_not_billed",
+				collapsible=1,
+			),
+			dict(
+				fieldname="basic_component",
+				label="Basic Component",
+				fieldtype="Link",
+				options="Salary Component",
+				insert_after="hra_section",
+			),
+			dict(
+				fieldname="hra_component",
+				label="HRA Component",
+				fieldtype="Link",
+				options="Salary Component",
+				insert_after="basic_component",
+			),
+			dict(fieldname="hra_column_break", fieldtype="Column Break", insert_after="hra_component"),
+			dict(
+				fieldname="arrear_component",
+				label="Arrear Component",
+				fieldtype="Link",
+				options="Salary Component",
+				insert_after="hra_column_break",
+			),
 		],
-		'Employee Tax Exemption Declaration':[
-			dict(fieldname='hra_section', label='HRA Exemption',
-				fieldtype='Section Break', insert_after='declarations'),
-			dict(fieldname='monthly_house_rent', label='Monthly House Rent',
-				fieldtype='Currency', insert_after='hra_section'),
-			dict(fieldname='rented_in_metro_city', label='Rented in Metro City',
-				fieldtype='Check', insert_after='monthly_house_rent', depends_on='monthly_house_rent'),
-			dict(fieldname='salary_structure_hra', label='HRA as per Salary Structure',
-				fieldtype='Currency', insert_after='rented_in_metro_city', read_only=1, depends_on='monthly_house_rent'),
-			dict(fieldname='hra_column_break', fieldtype='Column Break',
-				insert_after='salary_structure_hra', depends_on='monthly_house_rent'),
-			dict(fieldname='annual_hra_exemption', label='Annual HRA Exemption',
-				fieldtype='Currency', insert_after='hra_column_break', read_only=1, depends_on='monthly_house_rent'),
-			dict(fieldname='monthly_hra_exemption', label='Monthly HRA Exemption',
-				fieldtype='Currency', insert_after='annual_hra_exemption', read_only=1, depends_on='monthly_house_rent')
+		"Employee Tax Exemption Declaration": [
+			dict(
+				fieldname="hra_section",
+				label="HRA Exemption",
+				fieldtype="Section Break",
+				insert_after="declarations",
+			),
+			dict(
+				fieldname="monthly_house_rent",
+				label="Monthly House Rent",
+				fieldtype="Currency",
+				insert_after="hra_section",
+			),
+			dict(
+				fieldname="rented_in_metro_city",
+				label="Rented in Metro City",
+				fieldtype="Check",
+				insert_after="monthly_house_rent",
+				depends_on="monthly_house_rent",
+			),
+			dict(
+				fieldname="salary_structure_hra",
+				label="HRA as per Salary Structure",
+				fieldtype="Currency",
+				insert_after="rented_in_metro_city",
+				read_only=1,
+				depends_on="monthly_house_rent",
+			),
+			dict(
+				fieldname="hra_column_break",
+				fieldtype="Column Break",
+				insert_after="salary_structure_hra",
+				depends_on="monthly_house_rent",
+			),
+			dict(
+				fieldname="annual_hra_exemption",
+				label="Annual HRA Exemption",
+				fieldtype="Currency",
+				insert_after="hra_column_break",
+				read_only=1,
+				depends_on="monthly_house_rent",
+			),
+			dict(
+				fieldname="monthly_hra_exemption",
+				label="Monthly HRA Exemption",
+				fieldtype="Currency",
+				insert_after="annual_hra_exemption",
+				read_only=1,
+				depends_on="monthly_house_rent",
+			),
 		],
-		'Employee Tax Exemption Proof Submission': [
-			dict(fieldname='hra_section', label='HRA Exemption',
-				fieldtype='Section Break', insert_after='tax_exemption_proofs'),
-			dict(fieldname='house_rent_payment_amount', label='House Rent Payment Amount',
-				fieldtype='Currency', insert_after='hra_section'),
-			dict(fieldname='rented_in_metro_city', label='Rented in Metro City',
-				fieldtype='Check', insert_after='house_rent_payment_amount', depends_on='house_rent_payment_amount'),
-			dict(fieldname='rented_from_date', label='Rented From Date',
-				fieldtype='Date', insert_after='rented_in_metro_city', depends_on='house_rent_payment_amount'),
-			dict(fieldname='rented_to_date', label='Rented To Date',
-				fieldtype='Date', insert_after='rented_from_date', depends_on='house_rent_payment_amount'),
-			dict(fieldname='hra_column_break', fieldtype='Column Break',
-				insert_after='rented_to_date', depends_on='house_rent_payment_amount'),
-			dict(fieldname='monthly_house_rent', label='Monthly House Rent',
-				fieldtype='Currency', insert_after='hra_column_break', read_only=1, depends_on='house_rent_payment_amount'),
-			dict(fieldname='monthly_hra_exemption', label='Monthly Eligible Amount',
-				fieldtype='Currency', insert_after='monthly_house_rent', read_only=1, depends_on='house_rent_payment_amount'),
-			dict(fieldname='total_eligible_hra_exemption', label='Total Eligible HRA Exemption',
-				fieldtype='Currency', insert_after='monthly_hra_exemption', read_only=1, depends_on='house_rent_payment_amount')
+		"Employee Tax Exemption Proof Submission": [
+			dict(
+				fieldname="hra_section",
+				label="HRA Exemption",
+				fieldtype="Section Break",
+				insert_after="tax_exemption_proofs",
+			),
+			dict(
+				fieldname="house_rent_payment_amount",
+				label="House Rent Payment Amount",
+				fieldtype="Currency",
+				insert_after="hra_section",
+			),
+			dict(
+				fieldname="rented_in_metro_city",
+				label="Rented in Metro City",
+				fieldtype="Check",
+				insert_after="house_rent_payment_amount",
+				depends_on="house_rent_payment_amount",
+			),
+			dict(
+				fieldname="rented_from_date",
+				label="Rented From Date",
+				fieldtype="Date",
+				insert_after="rented_in_metro_city",
+				depends_on="house_rent_payment_amount",
+			),
+			dict(
+				fieldname="rented_to_date",
+				label="Rented To Date",
+				fieldtype="Date",
+				insert_after="rented_from_date",
+				depends_on="house_rent_payment_amount",
+			),
+			dict(
+				fieldname="hra_column_break",
+				fieldtype="Column Break",
+				insert_after="rented_to_date",
+				depends_on="house_rent_payment_amount",
+			),
+			dict(
+				fieldname="monthly_house_rent",
+				label="Monthly House Rent",
+				fieldtype="Currency",
+				insert_after="hra_column_break",
+				read_only=1,
+				depends_on="house_rent_payment_amount",
+			),
+			dict(
+				fieldname="monthly_hra_exemption",
+				label="Monthly Eligible Amount",
+				fieldtype="Currency",
+				insert_after="monthly_house_rent",
+				read_only=1,
+				depends_on="house_rent_payment_amount",
+			),
+			dict(
+				fieldname="total_eligible_hra_exemption",
+				label="Total Eligible HRA Exemption",
+				fieldtype="Currency",
+				insert_after="monthly_hra_exemption",
+				read_only=1,
+				depends_on="house_rent_payment_amount",
+			),
 		],
-		'Supplier': [
+		"Supplier": [
+			{"fieldname": "pan", "label": "PAN", "fieldtype": "Data", "insert_after": "supplier_type"},
 			{
-				'fieldname': 'pan',
-				'label': 'PAN',
-				'fieldtype': 'Data',
-				'insert_after': 'supplier_type'
+				"fieldname": "gst_transporter_id",
+				"label": "GST Transporter ID",
+				"fieldtype": "Data",
+				"insert_after": "pan",
+				"depends_on": "eval:doc.is_transporter",
 			},
 			{
-				'fieldname': 'gst_transporter_id',
-				'label': 'GST Transporter ID',
-				'fieldtype': 'Data',
-				'insert_after': 'pan',
-				'depends_on': 'eval:doc.is_transporter'
+				"fieldname": "gst_category",
+				"label": "GST Category",
+				"fieldtype": "Select",
+				"insert_after": "gst_transporter_id",
+				"options": "Registered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nUIN Holders",
+				"default": "Unregistered",
 			},
 			{
-				'fieldname': 'gst_category',
-				'label': 'GST Category',
-				'fieldtype': 'Select',
-				'insert_after': 'gst_transporter_id',
-				'options': 'Registered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nUIN Holders',
-				'default': 'Unregistered'
+				"fieldname": "export_type",
+				"label": "Export Type",
+				"fieldtype": "Select",
+				"insert_after": "gst_category",
+				"depends_on": 'eval:in_list(["SEZ", "Overseas"], doc.gst_category)',
+				"options": "\nWith Payment of Tax\nWithout Payment of Tax",
+				"mandatory_depends_on": 'eval:in_list(["SEZ", "Overseas"], doc.gst_category)',
+			},
+		],
+		"Customer": [
+			{"fieldname": "pan", "label": "PAN", "fieldtype": "Data", "insert_after": "customer_type"},
+			{
+				"fieldname": "gst_category",
+				"label": "GST Category",
+				"fieldtype": "Select",
+				"insert_after": "pan",
+				"options": "Registered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders",
+				"default": "Unregistered",
 			},
 			{
-				'fieldname': 'export_type',
-				'label': 'Export Type',
-				'fieldtype': 'Select',
-				'insert_after': 'gst_category',
-				'depends_on':'eval:in_list(["SEZ", "Overseas"], doc.gst_category)',
-				'options': '\nWith Payment of Tax\nWithout Payment of Tax',
-				'mandatory_depends_on': 'eval:in_list(["SEZ", "Overseas"], doc.gst_category)'
+				"fieldname": "export_type",
+				"label": "Export Type",
+				"fieldtype": "Select",
+				"insert_after": "gst_category",
+				"depends_on": 'eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)',
+				"options": "\nWith Payment of Tax\nWithout Payment of Tax",
+				"mandatory_depends_on": 'eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)',
+			},
+		],
+		"Finance Book": [
+			{
+				"fieldname": "for_income_tax",
+				"label": "For Income Tax",
+				"fieldtype": "Check",
+				"insert_after": "finance_book_name",
+				"description": "If the asset is put to use for less than 180 days, the first Depreciation Rate will be reduced by 50%.",
 			}
 		],
-		'Customer': [
-			{
-				'fieldname': 'pan',
-				'label': 'PAN',
-				'fieldtype': 'Data',
-				'insert_after': 'customer_type'
-			},
-			{
-				'fieldname': 'gst_category',
-				'label': 'GST Category',
-				'fieldtype': 'Select',
-				'insert_after': 'pan',
-				'options': 'Registered Regular\nRegistered Composition\nUnregistered\nSEZ\nOverseas\nConsumer\nDeemed Export\nUIN Holders',
-				'default': 'Unregistered'
-			},
-			{
-				'fieldname': 'export_type',
-				'label': 'Export Type',
-				'fieldtype': 'Select',
-				'insert_after': 'gst_category',
-				'depends_on':'eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)',
-				'options': '\nWith Payment of Tax\nWithout Payment of Tax',
-				'mandatory_depends_on': 'eval:in_list(["SEZ", "Overseas", "Deemed Export"], doc.gst_category)'
-			}
-		],
-		'Finance Book': [
-			{
-				'fieldname': 'for_income_tax',
-				'label': 'For Income Tax',
-				'fieldtype': 'Check',
-				'insert_after': 'finance_book_name',
-				'description': 'If the asset is put to use for less than 180 days, the first Depreciation Rate will be reduced by 50%.'
-			}
-		]
 	}
 
 	return custom_fields
 
+
 def make_fixtures(company=None):
 	docs = []
 	company = company or frappe.db.get_value("Global Defaults", None, "default_company")
@@ -734,33 +1227,47 @@
 	# create records for Tax Withholding Category
 	set_tax_withholding_category(company)
 
+
 def update_regional_tax_settings(country, company):
 	# Will only add default GST accounts if present
-	input_account_names = ['Input Tax CGST', 'Input Tax SGST', 'Input Tax IGST']
-	output_account_names = ['Output Tax CGST', 'Output Tax SGST', 'Output Tax IGST']
-	rcm_accounts = ['Input Tax CGST RCM', 'Input Tax SGST RCM', 'Input Tax IGST RCM']
-	gst_settings = frappe.get_single('GST Settings')
+	input_account_names = ["Input Tax CGST", "Input Tax SGST", "Input Tax IGST"]
+	output_account_names = ["Output Tax CGST", "Output Tax SGST", "Output Tax IGST"]
+	rcm_accounts = ["Input Tax CGST RCM", "Input Tax SGST RCM", "Input Tax IGST RCM"]
+	gst_settings = frappe.get_single("GST Settings")
 	existing_account_list = []
 
-	for account in gst_settings.get('gst_accounts'):
-		for key in ['cgst_account', 'sgst_account', 'igst_account']:
+	for account in gst_settings.get("gst_accounts"):
+		for key in ["cgst_account", "sgst_account", "igst_account"]:
 			existing_account_list.append(account.get(key))
 
-	gst_accounts = frappe._dict(frappe.get_all("Account",
-		{'company': company, 'account_name': ('in', input_account_names +
-			output_account_names + rcm_accounts)}, ['account_name', 'name'], as_list=1))
+	gst_accounts = frappe._dict(
+		frappe.get_all(
+			"Account",
+			{
+				"company": company,
+				"account_name": ("in", input_account_names + output_account_names + rcm_accounts),
+			},
+			["account_name", "name"],
+			as_list=1,
+		)
+	)
 
-	add_accounts_in_gst_settings(company,  input_account_names, gst_accounts,
-		existing_account_list, gst_settings)
-	add_accounts_in_gst_settings(company, output_account_names, gst_accounts,
-		existing_account_list, gst_settings)
-	add_accounts_in_gst_settings(company, rcm_accounts, gst_accounts,
-		existing_account_list, gst_settings, is_reverse_charge=1)
+	add_accounts_in_gst_settings(
+		company, input_account_names, gst_accounts, existing_account_list, gst_settings
+	)
+	add_accounts_in_gst_settings(
+		company, output_account_names, gst_accounts, existing_account_list, gst_settings
+	)
+	add_accounts_in_gst_settings(
+		company, rcm_accounts, gst_accounts, existing_account_list, gst_settings, is_reverse_charge=1
+	)
 
 	gst_settings.save()
 
-def add_accounts_in_gst_settings(company, account_names, gst_accounts,
-	existing_account_list, gst_settings, is_reverse_charge=0):
+
+def add_accounts_in_gst_settings(
+	company, account_names, gst_accounts, existing_account_list, gst_settings, is_reverse_charge=0
+):
 	accounts_not_added = 1
 
 	for account in account_names:
@@ -773,35 +1280,72 @@
 			accounts_not_added = 0
 
 	if accounts_not_added:
-		gst_settings.append('gst_accounts', {
-			'company': company,
-			'cgst_account': gst_accounts.get(account_names[0]),
-			'sgst_account': gst_accounts.get(account_names[1]),
-			'igst_account': gst_accounts.get(account_names[2]),
-			'is_reverse_charge_account': is_reverse_charge
-		})
+		gst_settings.append(
+			"gst_accounts",
+			{
+				"company": company,
+				"cgst_account": gst_accounts.get(account_names[0]),
+				"sgst_account": gst_accounts.get(account_names[1]),
+				"igst_account": gst_accounts.get(account_names[2]),
+				"is_reverse_charge_account": is_reverse_charge,
+			},
+		)
+
 
 def set_salary_components(docs):
-	docs.extend([
-		{'doctype': 'Salary Component', 'salary_component': 'Professional Tax',
-			'description': 'Professional Tax', 'type': 'Deduction', 'exempted_from_income_tax': 1},
-		{'doctype': 'Salary Component', 'salary_component': 'Provident Fund',
-			'description': 'Provident fund', 'type': 'Deduction', 'is_tax_applicable': 1},
-		{'doctype': 'Salary Component', 'salary_component': 'House Rent Allowance',
-			'description': 'House Rent Allowance', 'type': 'Earning', 'is_tax_applicable': 1},
-		{'doctype': 'Salary Component', 'salary_component': 'Basic',
-			'description': 'Basic', 'type': 'Earning', 'is_tax_applicable': 1},
-		{'doctype': 'Salary Component', 'salary_component': 'Arrear',
-			'description': 'Arrear', 'type': 'Earning', 'is_tax_applicable': 1},
-		{'doctype': 'Salary Component', 'salary_component': 'Leave Encashment',
-			'description': 'Leave Encashment', 'type': 'Earning', 'is_tax_applicable': 1}
-	])
+	docs.extend(
+		[
+			{
+				"doctype": "Salary Component",
+				"salary_component": "Professional Tax",
+				"description": "Professional Tax",
+				"type": "Deduction",
+				"exempted_from_income_tax": 1,
+			},
+			{
+				"doctype": "Salary Component",
+				"salary_component": "Provident Fund",
+				"description": "Provident fund",
+				"type": "Deduction",
+				"is_tax_applicable": 1,
+			},
+			{
+				"doctype": "Salary Component",
+				"salary_component": "House Rent Allowance",
+				"description": "House Rent Allowance",
+				"type": "Earning",
+				"is_tax_applicable": 1,
+			},
+			{
+				"doctype": "Salary Component",
+				"salary_component": "Basic",
+				"description": "Basic",
+				"type": "Earning",
+				"is_tax_applicable": 1,
+			},
+			{
+				"doctype": "Salary Component",
+				"salary_component": "Arrear",
+				"description": "Arrear",
+				"type": "Earning",
+				"is_tax_applicable": 1,
+			},
+			{
+				"doctype": "Salary Component",
+				"salary_component": "Leave Encashment",
+				"description": "Leave Encashment",
+				"type": "Earning",
+				"is_tax_applicable": 1,
+			},
+		]
+	)
+
 
 def set_tax_withholding_category(company):
 	accounts = []
 	fiscal_year_details = None
 	abbr = frappe.get_value("Company", company, "abbr")
-	tds_account = frappe.get_value("Account", 'TDS Payable - {0}'.format(abbr), 'name')
+	tds_account = frappe.get_value("Account", "TDS Payable - {0}".format(abbr), "name")
 
 	if company and tds_account:
 		accounts = [dict(company=company, account=tds_account)]
@@ -828,10 +1372,13 @@
 
 			if fiscal_year_details:
 				# if fiscal year don't match with any of the already entered data, append rate row
-				fy_exist = [k for k in doc.get('rates') if k.get('from_date') <= fiscal_year_details[1] \
-					and k.get('to_date') >= fiscal_year_details[2]]
+				fy_exist = [
+					k
+					for k in doc.get("rates")
+					if k.get("from_date") <= fiscal_year_details[1] and k.get("to_date") >= fiscal_year_details[2]
+				]
 				if not fy_exist:
-					doc.append("rates", d.get('rates')[0])
+					doc.append("rates", d.get("rates")[0])
 
 			doc.flags.ignore_permissions = True
 			doc.flags.ignore_validate = True
@@ -839,164 +1386,451 @@
 			doc.flags.ignore_links = True
 			doc.save()
 
+
 def set_tds_account(docs, company):
-	parent_account = frappe.db.get_value("Account", filters = {"account_name": "Duties and Taxes", "company": company})
+	parent_account = frappe.db.get_value(
+		"Account", filters={"account_name": "Duties and Taxes", "company": company}
+	)
 	if parent_account:
-		docs.extend([
-			{
-				"doctype": "Account",
-				"account_name": "TDS Payable",
-				"account_type": "Tax",
-				"parent_account": parent_account,
-				"company": company
-			}
-		])
+		docs.extend(
+			[
+				{
+					"doctype": "Account",
+					"account_name": "TDS Payable",
+					"account_type": "Tax",
+					"parent_account": parent_account,
+					"company": company,
+				}
+			]
+		)
+
 
 def get_tds_details(accounts, fiscal_year_details):
 	# bootstrap default tax withholding sections
 	return [
-		dict(name="TDS - 194C - Company",
+		dict(
+			name="TDS - 194C - Company",
 			category_name="Payment to Contractors (Single / Aggregate)",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 2, "single_threshold": 30000, "cumulative_threshold": 100000}]),
-		dict(name="TDS - 194C - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 2,
+					"single_threshold": 30000,
+					"cumulative_threshold": 100000,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194C - Individual",
 			category_name="Payment to Contractors (Single / Aggregate)",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 1, "single_threshold": 30000, "cumulative_threshold": 100000}]),
-		dict(name="TDS - 194C - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 1,
+					"single_threshold": 30000,
+					"cumulative_threshold": 100000,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194C - No PAN / Invalid PAN",
 			category_name="Payment to Contractors (Single / Aggregate)",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 30000, "cumulative_threshold": 100000}]),
-		dict(name="TDS - 194D - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 30000,
+					"cumulative_threshold": 100000,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194D - Company",
 			category_name="Insurance Commission",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 5, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194D - Company Assessee",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 5,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194D - Company Assessee",
 			category_name="Insurance Commission",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194D - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194D - Individual",
 			category_name="Insurance Commission",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 5, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194D - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 5,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194D - No PAN / Invalid PAN",
 			category_name="Insurance Commission",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194DA - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194DA - Company",
 			category_name="Non-exempt payments made under a life insurance policy",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 1, "single_threshold": 100000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194DA - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 1,
+					"single_threshold": 100000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194DA - Individual",
 			category_name="Non-exempt payments made under a life insurance policy",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 1, "single_threshold": 100000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194DA - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 1,
+					"single_threshold": 100000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194DA - No PAN / Invalid PAN",
 			category_name="Non-exempt payments made under a life insurance policy",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 100000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194H - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 100000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194H - Company",
 			category_name="Commission / Brokerage",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 5, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194H - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 5,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194H - Individual",
 			category_name="Commission / Brokerage",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 5, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194H - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 5,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194H - No PAN / Invalid PAN",
 			category_name="Commission / Brokerage",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 15000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194I - Rent - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 15000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194I - Rent - Company",
 			category_name="Rent",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 180000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194I - Rent - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 180000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194I - Rent - Individual",
 			category_name="Rent",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 180000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194I - Rent - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 180000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194I - Rent - No PAN / Invalid PAN",
 			category_name="Rent",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 180000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194I - Rent/Machinery - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 180000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194I - Rent/Machinery - Company",
 			category_name="Rent-Plant / Machinery",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 2, "single_threshold": 180000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194I - Rent/Machinery - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 2,
+					"single_threshold": 180000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194I - Rent/Machinery - Individual",
 			category_name="Rent-Plant / Machinery",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 2, "single_threshold": 180000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194I - Rent/Machinery - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 2,
+					"single_threshold": 180000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194I - Rent/Machinery - No PAN / Invalid PAN",
 			category_name="Rent-Plant / Machinery",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 180000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194J - Professional Fees - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 180000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194J - Professional Fees - Company",
 			category_name="Professional Fees",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 30000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194J - Professional Fees - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 30000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194J - Professional Fees - Individual",
 			category_name="Professional Fees",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 30000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194J - Professional Fees - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 30000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194J - Professional Fees - No PAN / Invalid PAN",
 			category_name="Professional Fees",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 30000, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194J - Director Fees - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 30000,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194J - Director Fees - Company",
 			category_name="Director Fees",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 0, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194J - Director Fees - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 0,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194J - Director Fees - Individual",
 			category_name="Director Fees",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 0, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194J - Director Fees - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 0,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194J - Director Fees - No PAN / Invalid PAN",
 			category_name="Director Fees",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 0, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194 - Dividends - Company",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 0,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194 - Dividends - Company",
 			category_name="Dividends",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 2500, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194 - Dividends - Individual",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 2500,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194 - Dividends - Individual",
 			category_name="Dividends",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 10, "single_threshold": 2500, "cumulative_threshold": 0}]),
-		dict(name="TDS - 194 - Dividends - No PAN / Invalid PAN",
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 10,
+					"single_threshold": 2500,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
+		dict(
+			name="TDS - 194 - Dividends - No PAN / Invalid PAN",
 			category_name="Dividends",
-			doctype="Tax Withholding Category", accounts=accounts,
-			rates=[{"from_date": fiscal_year_details[1], "to_date": fiscal_year_details[2],
-			"tax_withholding_rate": 20, "single_threshold": 2500, "cumulative_threshold": 0}])
+			doctype="Tax Withholding Category",
+			accounts=accounts,
+			rates=[
+				{
+					"from_date": fiscal_year_details[1],
+					"to_date": fiscal_year_details[2],
+					"tax_withholding_rate": 20,
+					"single_threshold": 2500,
+					"cumulative_threshold": 0,
+				}
+			],
+		),
 	]
 
+
 def create_gratuity_rule():
 	# Standard Indain Gratuity Rule
 	if not frappe.db.exists("Gratuity Rule", "Indian Standard Gratuity Rule"):
@@ -1006,16 +1840,16 @@
 		rule.work_experience_calculation_method = "Round Off Work Experience"
 		rule.minimum_year_for_gratuity = 5
 
-		fraction = 15/26
-		rule.append("gratuity_rule_slabs", {
-			"from_year": 0,
-			"to_year":0,
-			"fraction_of_applicable_earnings": fraction
-		})
+		fraction = 15 / 26
+		rule.append(
+			"gratuity_rule_slabs",
+			{"from_year": 0, "to_year": 0, "fraction_of_applicable_earnings": fraction},
+		)
 
 		rule.flags.ignore_mandatory = True
 		rule.save()
 
+
 def update_accounts_settings_for_taxes():
-	if frappe.db.count('Company') == 1:
-		frappe.db.set_value('Accounts Settings', None, "add_taxes_from_item_tax_template", 0)
+	if frappe.db.count("Company") == 1:
+		frappe.db.set_value("Accounts Settings", None, "add_taxes_from_item_tax_template", 0)
diff --git a/erpnext/regional/india/test_utils.py b/erpnext/regional/india/test_utils.py
index c95a0b3..5c24830 100644
--- a/erpnext/regional/india/test_utils.py
+++ b/erpnext/regional/india/test_utils.py
@@ -12,14 +12,12 @@
 		mock_get_cached.return_value = "India"  # mock country
 		posting_date = "2021-05-01"
 
-		invalid_names = ["SI$1231", "012345678901234567", "SI 2020 05",
-				"SI.2020.0001", "PI2021 - 001"]
+		invalid_names = ["SI$1231", "012345678901234567", "SI 2020 05", "SI.2020.0001", "PI2021 - 001"]
 		for name in invalid_names:
 			doc = frappe._dict(name=name, posting_date=posting_date)
 			self.assertRaises(frappe.ValidationError, validate_document_name, doc)
 
-		valid_names = ["012345678901236", "SI/2020/0001", "SI/2020-0001",
-			"2020-PI-0001", "PI2020-0001"]
+		valid_names = ["012345678901236", "SI/2020/0001", "SI/2020-0001", "2020-PI-0001", "PI2020-0001"]
 		for name in valid_names:
 			doc = frappe._dict(name=name, posting_date=posting_date)
 			try:
diff --git a/erpnext/regional/india/utils.py b/erpnext/regional/india/utils.py
index 55b563e..47e6ae6 100644
--- a/erpnext/regional/india/utils.py
+++ b/erpnext/regional/india/utils.py
@@ -12,43 +12,51 @@
 from erpnext.payroll.doctype.salary_structure.salary_structure import make_salary_slip
 from erpnext.regional.india import number_state_mapping, state_numbers, states
 
-GST_INVOICE_NUMBER_FORMAT = re.compile(r"^[a-zA-Z0-9\-/]+$")   #alphanumeric and - /
-GSTIN_FORMAT = re.compile("^[0-9]{2}[A-Z]{4}[0-9A-Z]{1}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}[1-9A-Z]{1}[0-9A-Z]{1}$")
+GST_INVOICE_NUMBER_FORMAT = re.compile(r"^[a-zA-Z0-9\-/]+$")  # alphanumeric and - /
+GSTIN_FORMAT = re.compile(
+	"^[0-9]{2}[A-Z]{4}[0-9A-Z]{1}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}[1-9A-Z]{1}[0-9A-Z]{1}$"
+)
 GSTIN_UIN_FORMAT = re.compile("^[0-9]{4}[A-Z]{3}[0-9]{5}[0-9A-Z]{3}")
 PAN_NUMBER_FORMAT = re.compile("[A-Z]{5}[0-9]{4}[A-Z]{1}")
 
 
 def validate_gstin_for_india(doc, method):
-	if hasattr(doc, 'gst_state'):
+	if hasattr(doc, "gst_state"):
 		set_gst_state_and_state_number(doc)
 
-	if not hasattr(doc, 'gstin') or not doc.gstin:
+	if not hasattr(doc, "gstin") or not doc.gstin:
 		return
 
 	gst_category = []
 
-	if hasattr(doc, 'gst_category'):
+	if hasattr(doc, "gst_category"):
 		if len(doc.links):
 			link_doctype = doc.links[0].get("link_doctype")
 			link_name = doc.links[0].get("link_name")
 
 			if link_doctype in ["Customer", "Supplier"]:
-				gst_category = frappe.db.get_value(link_doctype, {'name': link_name}, ['gst_category'])
+				gst_category = frappe.db.get_value(link_doctype, {"name": link_name}, ["gst_category"])
 
 	doc.gstin = doc.gstin.upper().strip()
-	if not doc.gstin or doc.gstin == 'NA':
+	if not doc.gstin or doc.gstin == "NA":
 		return
 
 	if len(doc.gstin) != 15:
 		frappe.throw(_("A GSTIN must have 15 characters."), title=_("Invalid GSTIN"))
 
-	if gst_category and gst_category == 'UIN Holders':
+	if gst_category and gst_category == "UIN Holders":
 		if not GSTIN_UIN_FORMAT.match(doc.gstin):
-			frappe.throw(_("The input you've entered doesn't match the GSTIN format for UIN Holders or Non-Resident OIDAR Service Providers"),
-				title=_("Invalid GSTIN"))
+			frappe.throw(
+				_(
+					"The input you've entered doesn't match the GSTIN format for UIN Holders or Non-Resident OIDAR Service Providers"
+				),
+				title=_("Invalid GSTIN"),
+			)
 	else:
 		if not GSTIN_FORMAT.match(doc.gstin):
-			frappe.throw(_("The input you've entered doesn't match the format of GSTIN."), title=_("Invalid GSTIN"))
+			frappe.throw(
+				_("The input you've entered doesn't match the format of GSTIN."), title=_("Invalid GSTIN")
+			)
 
 		validate_gstin_check_digit(doc.gstin)
 
@@ -56,46 +64,68 @@
 			frappe.throw(_("Please enter GST state"), title=_("Invalid State"))
 
 		if doc.gst_state_number != doc.gstin[:2]:
-			frappe.throw(_("First 2 digits of GSTIN should match with State number {0}.")
-				.format(doc.gst_state_number), title=_("Invalid GSTIN"))
+			frappe.throw(
+				_("First 2 digits of GSTIN should match with State number {0}.").format(doc.gst_state_number),
+				title=_("Invalid GSTIN"),
+			)
+
 
 def validate_pan_for_india(doc, method):
-	if doc.get('country') != 'India' or not doc.get('pan'):
+	if doc.get("country") != "India" or not doc.get("pan"):
 		return
 
 	if not PAN_NUMBER_FORMAT.match(doc.pan):
 		frappe.throw(_("Invalid PAN No. The input you've entered doesn't match the format of PAN."))
 
+
 def validate_tax_category(doc, method):
-	if doc.get('gst_state') and frappe.db.get_value('Tax Category', {'gst_state': doc.gst_state, 'is_inter_state': doc.is_inter_state,
-		'is_reverse_charge': doc.is_reverse_charge}):
+	if doc.get("gst_state") and frappe.db.get_value(
+		"Tax Category",
+		{
+			"gst_state": doc.gst_state,
+			"is_inter_state": doc.is_inter_state,
+			"is_reverse_charge": doc.is_reverse_charge,
+		},
+	):
 		if doc.is_inter_state:
-			frappe.throw(_("Inter State tax category for GST State {0} already exists").format(doc.gst_state))
+			frappe.throw(
+				_("Inter State tax category for GST State {0} already exists").format(doc.gst_state)
+			)
 		else:
-			frappe.throw(_("Intra State tax category for GST State {0} already exists").format(doc.gst_state))
+			frappe.throw(
+				_("Intra State tax category for GST State {0} already exists").format(doc.gst_state)
+			)
+
 
 def update_gst_category(doc, method):
 	for link in doc.links:
-		if link.link_doctype in ['Customer', 'Supplier']:
+		if link.link_doctype in ["Customer", "Supplier"]:
 			meta = frappe.get_meta(link.link_doctype)
-			if doc.get('gstin') and meta.has_field('gst_category'):
-				frappe.db.set_value(link.link_doctype, {'name': link.link_name, 'gst_category': 'Unregistered'}, 'gst_category', 'Registered Regular')
+			if doc.get("gstin") and meta.has_field("gst_category"):
+				frappe.db.set_value(
+					link.link_doctype,
+					{"name": link.link_name, "gst_category": "Unregistered"},
+					"gst_category",
+					"Registered Regular",
+				)
+
 
 def set_gst_state_and_state_number(doc):
 	if not doc.gst_state and doc.state:
 		state = doc.state.lower()
-		states_lowercase = {s.lower():s for s in states}
+		states_lowercase = {s.lower(): s for s in states}
 		if state in states_lowercase:
 			doc.gst_state = states_lowercase[state]
 		else:
 			return
 	doc.gst_state_number = state_numbers.get(doc.gst_state)
 
-def validate_gstin_check_digit(gstin, label='GSTIN'):
-	''' Function to validate the check digit of the GSTIN.'''
+
+def validate_gstin_check_digit(gstin, label="GSTIN"):
+	"""Function to validate the check digit of the GSTIN."""
 	factor = 1
 	total = 0
-	code_point_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+	code_point_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 	mod = len(code_point_chars)
 	input_chars = gstin[:-1]
 	for char in input_chars:
@@ -104,24 +134,30 @@
 		total += digit
 		factor = 2 if factor == 1 else 1
 	if gstin[-1] != code_point_chars[((mod - (total % mod)) % mod)]:
-		frappe.throw(_("""Invalid {0}! The check digit validation has failed. Please ensure you've typed the {0} correctly.""").format(label))
+		frappe.throw(
+			_(
+				"""Invalid {0}! The check digit validation has failed. Please ensure you've typed the {0} correctly."""
+			).format(label)
+		)
+
 
 def get_itemised_tax_breakup_header(item_doctype, tax_accounts):
-	hsn_wise_in_gst_settings = frappe.db.get_single_value('GST Settings','hsn_wise_tax_breakup')
-	if frappe.get_meta(item_doctype).has_field('gst_hsn_code') and hsn_wise_in_gst_settings:
+	hsn_wise_in_gst_settings = frappe.db.get_single_value("GST Settings", "hsn_wise_tax_breakup")
+	if frappe.get_meta(item_doctype).has_field("gst_hsn_code") and hsn_wise_in_gst_settings:
 		return [_("HSN/SAC"), _("Taxable Amount")] + tax_accounts
 	else:
 		return [_("Item"), _("Taxable Amount")] + tax_accounts
 
+
 def get_itemised_tax_breakup_data(doc, account_wise=False, hsn_wise=False):
 	itemised_tax = get_itemised_tax(doc.taxes, with_tax_account=account_wise)
 
 	itemised_taxable_amount = get_itemised_taxable_amount(doc.items)
 
-	if not frappe.get_meta(doc.doctype + " Item").has_field('gst_hsn_code'):
+	if not frappe.get_meta(doc.doctype + " Item").has_field("gst_hsn_code"):
 		return itemised_tax, itemised_taxable_amount
 
-	hsn_wise_in_gst_settings = frappe.db.get_single_value('GST Settings','hsn_wise_tax_breakup')
+	hsn_wise_in_gst_settings = frappe.db.get_single_value("GST Settings", "hsn_wise_tax_breakup")
 
 	tax_breakup_hsn_wise = hsn_wise or hsn_wise_in_gst_settings
 	if tax_breakup_hsn_wise:
@@ -136,7 +172,7 @@
 		for tax_desc, tax_detail in taxes.items():
 			key = tax_desc
 			if account_wise:
-				key = tax_detail.get('tax_account')
+				key = tax_detail.get("tax_account")
 			hsn_tax[item_or_hsn].setdefault(key, {"tax_rate": 0, "tax_amount": 0})
 			hsn_tax[item_or_hsn][key]["tax_rate"] = tax_detail.get("tax_rate")
 			hsn_tax[item_or_hsn][key]["tax_amount"] += tax_detail.get("tax_amount")
@@ -150,9 +186,11 @@
 
 	return hsn_tax, hsn_taxable_amount
 
+
 def set_place_of_supply(doc, method=None):
 	doc.place_of_supply = get_place_of_supply(doc, doc.doctype)
 
+
 def validate_document_name(doc, method=None):
 	"""Validate GST invoice number requirements."""
 
@@ -163,18 +201,29 @@
 		return
 
 	if len(doc.name) > 16:
-		frappe.throw(_("Maximum length of document number should be 16 characters as per GST rules. Please change the naming series."))
+		frappe.throw(
+			_(
+				"Maximum length of document number should be 16 characters as per GST rules. Please change the naming series."
+			)
+		)
 
 	if not GST_INVOICE_NUMBER_FORMAT.match(doc.name):
-		frappe.throw(_("Document name should only contain alphanumeric values, dash(-) and slash(/) characters as per GST rules. Please change the naming series."))
+		frappe.throw(
+			_(
+				"Document name should only contain alphanumeric values, dash(-) and slash(/) characters as per GST rules. Please change the naming series."
+			)
+		)
+
 
 # don't remove this function it is used in tests
 def test_method():
-	'''test function'''
-	return 'overridden'
+	"""test function"""
+	return "overridden"
+
 
 def get_place_of_supply(party_details, doctype):
-	if not frappe.get_meta('Address').has_field('gst_state'): return
+	if not frappe.get_meta("Address").has_field("gst_state"):
+		return
 
 	if doctype in ("Sales Invoice", "Delivery Note", "Sales Order"):
 		address_name = party_details.customer_address or party_details.shipping_address_name
@@ -182,11 +231,14 @@
 		address_name = party_details.shipping_address or party_details.supplier_address
 
 	if address_name:
-		address = frappe.db.get_value("Address", address_name, ["gst_state", "gst_state_number", "gstin"], as_dict=1)
+		address = frappe.db.get_value(
+			"Address", address_name, ["gst_state", "gst_state_number", "gstin"], as_dict=1
+		)
 		if address and address.gst_state and address.gst_state_number:
 			party_details.gstin = address.gstin
 			return cstr(address.gst_state_number) + "-" + cstr(address.gst_state)
 
+
 @frappe.whitelist()
 def get_regional_address_details(party_details, doctype, company):
 	if isinstance(party_details, str):
@@ -198,28 +250,40 @@
 	party_details.place_of_supply = get_place_of_supply(party_details, doctype)
 
 	if is_internal_transfer(party_details, doctype):
-		party_details.taxes_and_charges = ''
+		party_details.taxes_and_charges = ""
 		party_details.taxes = []
 		return party_details
 
 	if doctype in ("Sales Invoice", "Delivery Note", "Sales Order"):
 		master_doctype = "Sales Taxes and Charges Template"
-		tax_template_by_category = get_tax_template_based_on_category(master_doctype, company, party_details)
+		tax_template_by_category = get_tax_template_based_on_category(
+			master_doctype, company, party_details
+		)
 
 	elif doctype in ("Purchase Invoice", "Purchase Order", "Purchase Receipt"):
 		master_doctype = "Purchase Taxes and Charges Template"
-		tax_template_by_category = get_tax_template_based_on_category(master_doctype, company, party_details)
+		tax_template_by_category = get_tax_template_based_on_category(
+			master_doctype, company, party_details
+		)
 
 	if tax_template_by_category:
-		party_details['taxes_and_charges'] = tax_template_by_category
+		party_details["taxes_and_charges"] = tax_template_by_category
 		return party_details
 
-	if not party_details.place_of_supply: return party_details
-	if not party_details.company_gstin: return party_details
+	if not party_details.place_of_supply:
+		return party_details
+	if not party_details.company_gstin:
+		return party_details
 
-	if ((doctype in ("Sales Invoice", "Delivery Note", "Sales Order") and party_details.company_gstin
-		and party_details.company_gstin[:2] != party_details.place_of_supply[:2]) or (doctype in ("Purchase Invoice",
-		"Purchase Order", "Purchase Receipt") and party_details.supplier_gstin and party_details.supplier_gstin[:2] != party_details.place_of_supply[:2])):
+	if (
+		doctype in ("Sales Invoice", "Delivery Note", "Sales Order")
+		and party_details.company_gstin
+		and party_details.company_gstin[:2] != party_details.place_of_supply[:2]
+	) or (
+		doctype in ("Purchase Invoice", "Purchase Order", "Purchase Receipt")
+		and party_details.supplier_gstin
+		and party_details.supplier_gstin[:2] != party_details.place_of_supply[:2]
+	):
 		default_tax = get_tax_template(master_doctype, company, 1, party_details.company_gstin[:2])
 	else:
 		default_tax = get_tax_template(master_doctype, company, 0, party_details.company_gstin[:2])
@@ -232,11 +296,19 @@
 
 	return party_details
 
+
 def update_party_details(party_details, doctype):
-	for address_field in ['shipping_address', 'company_address', 'supplier_address', 'shipping_address_name', 'customer_address']:
+	for address_field in [
+		"shipping_address",
+		"company_address",
+		"supplier_address",
+		"shipping_address_name",
+		"customer_address",
+	]:
 		if party_details.get(address_field):
 			party_details.update(get_fetch_values(doctype, address_field, party_details.get(address_field)))
 
+
 def is_internal_transfer(party_details, doctype):
 	if doctype in ("Sales Invoice", "Delivery Note", "Sales Order"):
 		destination_gstin = party_details.company_gstin
@@ -251,66 +323,93 @@
 	else:
 		False
 
+
 def get_tax_template_based_on_category(master_doctype, company, party_details):
-	if not party_details.get('tax_category'):
+	if not party_details.get("tax_category"):
 		return
 
-	default_tax = frappe.db.get_value(master_doctype, {'company': company, 'tax_category': party_details.get('tax_category')},
-		'name')
+	default_tax = frappe.db.get_value(
+		master_doctype, {"company": company, "tax_category": party_details.get("tax_category")}, "name"
+	)
 
 	return default_tax
 
+
 def get_tax_template(master_doctype, company, is_inter_state, state_code):
-	tax_categories = frappe.get_all('Tax Category', fields = ['name', 'is_inter_state', 'gst_state'],
-		filters = {'is_inter_state': is_inter_state, 'is_reverse_charge': 0})
+	tax_categories = frappe.get_all(
+		"Tax Category",
+		fields=["name", "is_inter_state", "gst_state"],
+		filters={"is_inter_state": is_inter_state, "is_reverse_charge": 0},
+	)
 
-	default_tax = ''
+	default_tax = ""
 
 	for tax_category in tax_categories:
-		if tax_category.gst_state == number_state_mapping[state_code] or \
-	 		(not default_tax and not tax_category.gst_state):
-			default_tax = frappe.db.get_value(master_doctype,
-				{'company': company, 'disabled': 0, 'tax_category': tax_category.name}, 'name')
+		if tax_category.gst_state == number_state_mapping[state_code] or (
+			not default_tax and not tax_category.gst_state
+		):
+			default_tax = frappe.db.get_value(
+				master_doctype, {"company": company, "disabled": 0, "tax_category": tax_category.name}, "name"
+			)
 	return default_tax
 
+
 def calculate_annual_eligible_hra_exemption(doc):
-	basic_component, hra_component = frappe.db.get_value('Company',  doc.company,  ["basic_component", "hra_component"])
+	basic_component, hra_component = frappe.db.get_value(
+		"Company", doc.company, ["basic_component", "hra_component"]
+	)
 	if not (basic_component and hra_component):
 		frappe.throw(_("Please mention Basic and HRA component in Company"))
 	annual_exemption, monthly_exemption, hra_amount = 0, 0, 0
 	if hra_component and basic_component:
 		assignment = get_salary_assignment(doc.employee, nowdate())
 		if assignment:
-			hra_component_exists = frappe.db.exists("Salary Detail", {
-				"parent": assignment.salary_structure,
-				"salary_component": hra_component,
-				"parentfield": "earnings",
-				"parenttype": "Salary Structure"
-			})
+			hra_component_exists = frappe.db.exists(
+				"Salary Detail",
+				{
+					"parent": assignment.salary_structure,
+					"salary_component": hra_component,
+					"parentfield": "earnings",
+					"parenttype": "Salary Structure",
+				},
+			)
 
 			if hra_component_exists:
-				basic_amount, hra_amount = get_component_amt_from_salary_slip(doc.employee,
-					assignment.salary_structure, basic_component, hra_component)
+				basic_amount, hra_amount = get_component_amt_from_salary_slip(
+					doc.employee, assignment.salary_structure, basic_component, hra_component
+				)
 				if hra_amount:
 					if doc.monthly_house_rent:
-						annual_exemption = calculate_hra_exemption(assignment.salary_structure,
-							basic_amount, hra_amount, doc.monthly_house_rent, doc.rented_in_metro_city)
+						annual_exemption = calculate_hra_exemption(
+							assignment.salary_structure,
+							basic_amount,
+							hra_amount,
+							doc.monthly_house_rent,
+							doc.rented_in_metro_city,
+						)
 						if annual_exemption > 0:
 							monthly_exemption = annual_exemption / 12
 						else:
 							annual_exemption = 0
 
 		elif doc.docstatus == 1:
-			frappe.throw(_("Salary Structure must be submitted before submission of Tax Ememption Declaration"))
+			frappe.throw(
+				_("Salary Structure must be submitted before submission of Tax Ememption Declaration")
+			)
 
-	return frappe._dict({
-		"hra_amount": hra_amount,
-		"annual_exemption": annual_exemption,
-		"monthly_exemption": monthly_exemption
-	})
+	return frappe._dict(
+		{
+			"hra_amount": hra_amount,
+			"annual_exemption": annual_exemption,
+			"monthly_exemption": monthly_exemption,
+		}
+	)
+
 
 def get_component_amt_from_salary_slip(employee, salary_structure, basic_component, hra_component):
-	salary_slip = make_salary_slip(salary_structure, employee=employee, for_preview=1, ignore_permissions=True)
+	salary_slip = make_salary_slip(
+		salary_structure, employee=employee, for_preview=1, ignore_permissions=True
+	)
 	basic_amt, hra_amt = 0, 0
 	for earning in salary_slip.earnings:
 		if earning.salary_component == basic_component:
@@ -321,7 +420,10 @@
 			return basic_amt, hra_amt
 	return basic_amt, hra_amt
 
-def calculate_hra_exemption(salary_structure, basic, monthly_hra, monthly_house_rent, rented_in_metro_city):
+
+def calculate_hra_exemption(
+	salary_structure, basic, monthly_hra, monthly_house_rent, rented_in_metro_city
+):
 	# TODO make this configurable
 	exemptions = []
 	frequency = frappe.get_value("Salary Structure", salary_structure, "payroll_frequency")
@@ -338,6 +440,7 @@
 	# return minimum of 3 cases
 	return min(exemptions)
 
+
 def get_annual_component_pay(frequency, amount):
 	if frequency == "Daily":
 		return amount * 365
@@ -350,6 +453,7 @@
 	elif frequency == "Bimonthly":
 		return amount * 6
 
+
 def validate_house_rent_dates(doc):
 	if not doc.rented_to_date or not doc.rented_from_date:
 		frappe.throw(_("House rented dates required for exemption calculation"))
@@ -357,30 +461,34 @@
 	if date_diff(doc.rented_to_date, doc.rented_from_date) < 14:
 		frappe.throw(_("House rented dates should be atleast 15 days apart"))
 
-	proofs = frappe.db.sql("""
+	proofs = frappe.db.sql(
+		"""
 		select name
 		from `tabEmployee Tax Exemption Proof Submission`
 		where
 			docstatus=1 and employee=%(employee)s and payroll_period=%(payroll_period)s
 			and (rented_from_date between %(from_date)s and %(to_date)s or rented_to_date between %(from_date)s and %(to_date)s)
-	""", {
-		"employee": doc.employee,
-		"payroll_period": doc.payroll_period,
-		"from_date": doc.rented_from_date,
-		"to_date": doc.rented_to_date
-	})
+	""",
+		{
+			"employee": doc.employee,
+			"payroll_period": doc.payroll_period,
+			"from_date": doc.rented_from_date,
+			"to_date": doc.rented_to_date,
+		},
+	)
 
 	if proofs:
 		frappe.throw(_("House rent paid days overlapping with {0}").format(proofs[0][0]))
 
+
 def calculate_hra_exemption_for_period(doc):
 	monthly_rent, eligible_hra = 0, 0
 	if doc.house_rent_payment_amount:
 		validate_house_rent_dates(doc)
 		# TODO receive rented months or validate dates are start and end of months?
 		# Calc monthly rent, round to nearest .5
-		factor = flt(date_diff(doc.rented_to_date, doc.rented_from_date) + 1)/30
-		factor = round(factor * 2)/2
+		factor = flt(date_diff(doc.rented_to_date, doc.rented_from_date) + 1) / 30
+		factor = round(factor * 2) / 2
 		monthly_rent = doc.house_rent_payment_amount / factor
 		# update field used by calculate_annual_eligible_hra_exemption
 		doc.monthly_house_rent = monthly_rent
@@ -393,6 +501,7 @@
 		exemptions["total_eligible_hra_exemption"] = eligible_hra
 		return exemptions
 
+
 def get_ewb_data(dt, dn):
 
 	ewaybills = []
@@ -401,32 +510,38 @@
 
 		validate_doc(doc)
 
-		data = frappe._dict({
-			"transporterId": "",
-			"TotNonAdvolVal": 0,
-		})
+		data = frappe._dict(
+			{
+				"transporterId": "",
+				"TotNonAdvolVal": 0,
+			}
+		)
 
 		data.userGstin = data.fromGstin = doc.company_gstin
-		data.supplyType = 'O'
+		data.supplyType = "O"
 
-		if dt == 'Delivery Note':
+		if dt == "Delivery Note":
 			data.subSupplyType = 1
-		elif doc.gst_category in ['Registered Regular', 'SEZ']:
+		elif doc.gst_category in ["Registered Regular", "SEZ"]:
 			data.subSupplyType = 1
-		elif doc.gst_category in ['Overseas', 'Deemed Export']:
+		elif doc.gst_category in ["Overseas", "Deemed Export"]:
 			data.subSupplyType = 3
 		else:
-			frappe.throw(_('Unsupported GST Category for E-Way Bill JSON generation'))
+			frappe.throw(_("Unsupported GST Category for E-Way Bill JSON generation"))
 
-		data.docType = 'INV'
-		data.docDate = frappe.utils.formatdate(doc.posting_date, 'dd/mm/yyyy')
+		data.docType = "INV"
+		data.docDate = frappe.utils.formatdate(doc.posting_date, "dd/mm/yyyy")
 
-		company_address = frappe.get_doc('Address', doc.company_address)
-		billing_address = frappe.get_doc('Address', doc.customer_address)
+		company_address = frappe.get_doc("Address", doc.company_address)
+		billing_address = frappe.get_doc("Address", doc.customer_address)
 
-		#added dispatch address
-		dispatch_address = frappe.get_doc('Address', doc.dispatch_address_name) if doc.dispatch_address_name else company_address
-		shipping_address = frappe.get_doc('Address', doc.shipping_address_name)
+		# added dispatch address
+		dispatch_address = (
+			frappe.get_doc("Address", doc.dispatch_address_name)
+			if doc.dispatch_address_name
+			else company_address
+		)
+		shipping_address = frappe.get_doc("Address", doc.shipping_address_name)
 
 		data = get_address_details(data, doc, company_address, billing_address, dispatch_address)
 
@@ -435,75 +550,78 @@
 
 		data = get_item_list(data, doc, hsn_wise=True)
 
-		disable_rounded = frappe.db.get_single_value('Global Defaults', 'disable_rounded_total')
+		disable_rounded = frappe.db.get_single_value("Global Defaults", "disable_rounded_total")
 		data.totInvValue = doc.grand_total if disable_rounded else doc.rounded_total
 
 		data = get_transport_details(data, doc)
 
 		fields = {
 			"/. -": {
-				'docNo': doc.name,
-				'fromTrdName': doc.company,
-				'toTrdName': doc.customer_name,
-				'transDocNo': doc.lr_no,
+				"docNo": doc.name,
+				"fromTrdName": doc.company,
+				"toTrdName": doc.customer_name,
+				"transDocNo": doc.lr_no,
 			},
 			"@#/,&. -": {
-				'fromAddr1': company_address.address_line1,
-				'fromAddr2': company_address.address_line2,
-				'fromPlace': company_address.city,
-				'toAddr1': shipping_address.address_line1,
-				'toAddr2': shipping_address.address_line2,
-				'toPlace': shipping_address.city,
-				'transporterName': doc.transporter_name
-			}
+				"fromAddr1": company_address.address_line1,
+				"fromAddr2": company_address.address_line2,
+				"fromPlace": company_address.city,
+				"toAddr1": shipping_address.address_line1,
+				"toAddr2": shipping_address.address_line2,
+				"toPlace": shipping_address.city,
+				"transporterName": doc.transporter_name,
+			},
 		}
 
 		for allowed_chars, field_map in fields.items():
 			for key, value in field_map.items():
 				if not value:
-					data[key] = ''
+					data[key] = ""
 				else:
-					data[key] = re.sub(r'[^\w' + allowed_chars + ']', '', value)
+					data[key] = re.sub(r"[^\w" + allowed_chars + "]", "", value)
 
 		ewaybills.append(data)
 
-	data = {
-		'version': '1.0.0421',
-		'billLists': ewaybills
-	}
+	data = {"version": "1.0.0421", "billLists": ewaybills}
 
 	return data
 
+
 @frappe.whitelist()
 def generate_ewb_json(dt, dn):
 	dn = json.loads(dn)
 	return get_ewb_data(dt, dn)
 
+
 @frappe.whitelist()
 def download_ewb_json():
 	data = json.loads(frappe.local.form_dict.data)
 	frappe.local.response.filecontent = json.dumps(data, indent=4, sort_keys=True)
-	frappe.local.response.type = 'download'
+	frappe.local.response.type = "download"
 
-	filename_prefix = 'Bulk'
+	filename_prefix = "Bulk"
 	docname = frappe.local.form_dict.docname
 	if docname:
-		if docname.startswith('['):
+		if docname.startswith("["):
 			docname = json.loads(docname)
 			if len(docname) == 1:
 				docname = docname[0]
 
 		if not isinstance(docname, list):
 			# removes characters not allowed in a filename (https://stackoverflow.com/a/38766141/4767738)
-			filename_prefix = re.sub(r'[^\w_.)( -]', '', docname)
+			filename_prefix = re.sub(r"[^\w_.)( -]", "", docname)
 
-	frappe.local.response.filename = '{0}_e-WayBill_Data_{1}.json'.format(filename_prefix, frappe.utils.random_string(5))
+	frappe.local.response.filename = "{0}_e-WayBill_Data_{1}.json".format(
+		filename_prefix, frappe.utils.random_string(5)
+	)
+
 
 @frappe.whitelist()
 def get_gstins_for_company(company):
-	company_gstins =[]
+	company_gstins = []
 	if company:
-		company_gstins = frappe.db.sql("""select
+		company_gstins = frappe.db.sql(
+			"""select
 			distinct `tabAddress`.gstin
 		from
 			`tabAddress`, `tabDynamic Link`
@@ -511,56 +629,66 @@
 			`tabDynamic Link`.parent = `tabAddress`.name and
 			`tabDynamic Link`.parenttype = 'Address' and
 			`tabDynamic Link`.link_doctype = 'Company' and
-			`tabDynamic Link`.link_name = %(company)s""", {"company": company})
+			`tabDynamic Link`.link_name = %(company)s""",
+			{"company": company},
+		)
 	return company_gstins
 
+
 def get_address_details(data, doc, company_address, billing_address, dispatch_address):
-	data.fromPincode = validate_pincode(company_address.pincode, 'Company Address')
-	data.fromStateCode = validate_state_code(company_address.gst_state_number, 'Company Address')
-	data.actualFromStateCode = validate_state_code(dispatch_address.gst_state_number, 'Dispatch Address')
+	data.fromPincode = validate_pincode(company_address.pincode, "Company Address")
+	data.fromStateCode = validate_state_code(company_address.gst_state_number, "Company Address")
+	data.actualFromStateCode = validate_state_code(
+		dispatch_address.gst_state_number, "Dispatch Address"
+	)
 
 	if not doc.billing_address_gstin or len(doc.billing_address_gstin) < 15:
-		data.toGstin = 'URP'
+		data.toGstin = "URP"
 		set_gst_state_and_state_number(billing_address)
 	else:
 		data.toGstin = doc.billing_address_gstin
 
-	data.toPincode = validate_pincode(billing_address.pincode, 'Customer Address')
-	data.toStateCode = validate_state_code(billing_address.gst_state_number, 'Customer Address')
+	data.toPincode = validate_pincode(billing_address.pincode, "Customer Address")
+	data.toStateCode = validate_state_code(billing_address.gst_state_number, "Customer Address")
 
 	if doc.customer_address != doc.shipping_address_name:
 		data.transType = 2
-		shipping_address = frappe.get_doc('Address', doc.shipping_address_name)
+		shipping_address = frappe.get_doc("Address", doc.shipping_address_name)
 		set_gst_state_and_state_number(shipping_address)
-		data.toPincode = validate_pincode(shipping_address.pincode, 'Shipping Address')
-		data.actualToStateCode = validate_state_code(shipping_address.gst_state_number, 'Shipping Address')
+		data.toPincode = validate_pincode(shipping_address.pincode, "Shipping Address")
+		data.actualToStateCode = validate_state_code(
+			shipping_address.gst_state_number, "Shipping Address"
+		)
 	else:
 		data.transType = 1
 		data.actualToStateCode = data.toStateCode
 		shipping_address = billing_address
 
-	if doc.gst_category == 'SEZ':
+	if doc.gst_category == "SEZ":
 		data.toStateCode = 99
 
 	return data
 
+
 def get_item_list(data, doc, hsn_wise=False):
-	for attr in ['cgstValue', 'sgstValue', 'igstValue', 'cessValue', 'OthValue']:
+	for attr in ["cgstValue", "sgstValue", "igstValue", "cessValue", "OthValue"]:
 		data[attr] = 0
 
 	gst_accounts = get_gst_accounts(doc.company, account_wise=True)
 	tax_map = {
-		'sgst_account': ['sgstRate', 'sgstValue'],
-		'cgst_account': ['cgstRate', 'cgstValue'],
-		'igst_account': ['igstRate', 'igstValue'],
-		'cess_account': ['cessRate', 'cessValue']
+		"sgst_account": ["sgstRate", "sgstValue"],
+		"cgst_account": ["cgstRate", "cgstValue"],
+		"igst_account": ["igstRate", "igstValue"],
+		"cess_account": ["cessRate", "cessValue"],
 	}
-	item_data_attrs = ['sgstRate', 'cgstRate', 'igstRate', 'cessRate', 'cessNonAdvol']
-	hsn_wise_charges, hsn_taxable_amount = get_itemised_tax_breakup_data(doc, account_wise=True, hsn_wise=hsn_wise)
+	item_data_attrs = ["sgstRate", "cgstRate", "igstRate", "cessRate", "cessNonAdvol"]
+	hsn_wise_charges, hsn_taxable_amount = get_itemised_tax_breakup_data(
+		doc, account_wise=True, hsn_wise=hsn_wise
+	)
 	for item_or_hsn, taxable_amount in hsn_taxable_amount.items():
 		item_data = frappe._dict()
 		if not item_or_hsn:
-			frappe.throw(_('GST HSN Code does not exist for one or more items'))
+			frappe.throw(_("GST HSN Code does not exist for one or more items"))
 		item_data.hsnCode = int(item_or_hsn) if hsn_wise else item_or_hsn
 		item_data.taxableAmount = taxable_amount
 		item_data.qtyUnit = ""
@@ -568,87 +696,89 @@
 			item_data[attr] = 0
 
 		for account, tax_detail in hsn_wise_charges.get(item_or_hsn, {}).items():
-			account_type = gst_accounts.get(account, '')
+			account_type = gst_accounts.get(account, "")
 			for tax_acc, attrs in tax_map.items():
 				if account_type == tax_acc:
-					item_data[attrs[0]] = tax_detail.get('tax_rate')
-					data[attrs[1]] += tax_detail.get('tax_amount')
+					item_data[attrs[0]] = tax_detail.get("tax_rate")
+					data[attrs[1]] += tax_detail.get("tax_amount")
 					break
 			else:
-				data.OthValue += tax_detail.get('tax_amount')
+				data.OthValue += tax_detail.get("tax_amount")
 
 		data.itemList.append(item_data)
 
 		# Tax amounts rounded to 2 decimals to avoid exceeding max character limit
-		for attr in ['sgstValue', 'cgstValue', 'igstValue', 'cessValue']:
+		for attr in ["sgstValue", "cgstValue", "igstValue", "cessValue"]:
 			data[attr] = flt(data[attr], 2)
 
 	return data
 
+
 def validate_doc(doc):
 	if doc.docstatus != 1:
-		frappe.throw(_('E-Way Bill JSON can only be generated from submitted document'))
+		frappe.throw(_("E-Way Bill JSON can only be generated from submitted document"))
 
 	if doc.is_return:
-		frappe.throw(_('E-Way Bill JSON cannot be generated for Sales Return as of now'))
+		frappe.throw(_("E-Way Bill JSON cannot be generated for Sales Return as of now"))
 
 	if doc.ewaybill:
-		frappe.throw(_('e-Way Bill already exists for this document'))
+		frappe.throw(_("e-Way Bill already exists for this document"))
 
-	reqd_fields = ['company_gstin', 'company_address', 'customer_address',
-		'shipping_address_name', 'mode_of_transport', 'distance']
+	reqd_fields = [
+		"company_gstin",
+		"company_address",
+		"customer_address",
+		"shipping_address_name",
+		"mode_of_transport",
+		"distance",
+	]
 
 	for fieldname in reqd_fields:
 		if not doc.get(fieldname):
-			frappe.throw(_('{} is required to generate E-Way Bill JSON').format(
-				doc.meta.get_label(fieldname)
-			))
+			frappe.throw(
+				_("{} is required to generate E-Way Bill JSON").format(doc.meta.get_label(fieldname))
+			)
 
 	if len(doc.company_gstin) < 15:
-		frappe.throw(_('You must be a registered supplier to generate e-Way Bill'))
+		frappe.throw(_("You must be a registered supplier to generate e-Way Bill"))
+
 
 def get_transport_details(data, doc):
 	if doc.distance > 4000:
-		frappe.throw(_('Distance cannot be greater than 4000 kms'))
+		frappe.throw(_("Distance cannot be greater than 4000 kms"))
 
 	data.transDistance = int(round(doc.distance))
 
-	transport_modes = {
-		'Road': 1,
-		'Rail': 2,
-		'Air': 3,
-		'Ship': 4
-	}
+	transport_modes = {"Road": 1, "Rail": 2, "Air": 3, "Ship": 4}
 
-	vehicle_types = {
-		'Regular': 'R',
-		'Over Dimensional Cargo (ODC)': 'O'
-	}
+	vehicle_types = {"Regular": "R", "Over Dimensional Cargo (ODC)": "O"}
 
 	data.transMode = transport_modes.get(doc.mode_of_transport)
 
-	if doc.mode_of_transport == 'Road':
+	if doc.mode_of_transport == "Road":
 		if not doc.gst_transporter_id and not doc.vehicle_no:
-			frappe.throw(_('Either GST Transporter ID or Vehicle No is required if Mode of Transport is Road'))
+			frappe.throw(
+				_("Either GST Transporter ID or Vehicle No is required if Mode of Transport is Road")
+			)
 		if doc.vehicle_no:
-			data.vehicleNo = doc.vehicle_no.replace(' ', '')
+			data.vehicleNo = doc.vehicle_no.replace(" ", "")
 		if not doc.gst_vehicle_type:
-			frappe.throw(_('Vehicle Type is required if Mode of Transport is Road'))
+			frappe.throw(_("Vehicle Type is required if Mode of Transport is Road"))
 		else:
 			data.vehicleType = vehicle_types.get(doc.gst_vehicle_type)
 	else:
 		if not doc.lr_no or not doc.lr_date:
-			frappe.throw(_('Transport Receipt No and Date are mandatory for your chosen Mode of Transport'))
+			frappe.throw(_("Transport Receipt No and Date are mandatory for your chosen Mode of Transport"))
 
 	if doc.lr_no:
 		data.transDocNo = doc.lr_no
 
 	if doc.lr_date:
-		data.transDocDate = frappe.utils.formatdate(doc.lr_date, 'dd/mm/yyyy')
+		data.transDocDate = frappe.utils.formatdate(doc.lr_date, "dd/mm/yyyy")
 
 	if doc.gst_transporter_id:
 		if doc.gst_transporter_id[0:2] != "88":
-			validate_gstin_check_digit(doc.gst_transporter_id, label='GST Transporter ID')
+			validate_gstin_check_digit(doc.gst_transporter_id, label="GST Transporter ID")
 		data.transporterId = doc.gst_transporter_id
 
 	return data
@@ -661,12 +791,13 @@
 	if not pincode:
 		frappe.throw(_(pin_not_found.format(address)))
 
-	pincode = pincode.replace(' ', '')
+	pincode = pincode.replace(" ", "")
 	if not pincode.isdigit() or len(pincode) != 6:
 		frappe.throw(_(incorrect_pin.format(address)))
 	else:
 		return int(pincode)
 
+
 def validate_state_code(state_code, address):
 	no_state_code = "GST State Code not found for {0}. Please set GST State in {0}"
 	if not state_code:
@@ -674,21 +805,26 @@
 	else:
 		return int(state_code)
 
+
 @frappe.whitelist()
-def get_gst_accounts(company=None, account_wise=False, only_reverse_charge=0, only_non_reverse_charge=0):
-	filters={"parent": "GST Settings"}
+def get_gst_accounts(
+	company=None, account_wise=False, only_reverse_charge=0, only_non_reverse_charge=0
+):
+	filters = {"parent": "GST Settings"}
 
 	if company:
-		filters.update({'company': company})
+		filters.update({"company": company})
 	if only_reverse_charge:
-		filters.update({'is_reverse_charge_account': 1})
+		filters.update({"is_reverse_charge_account": 1})
 	elif only_non_reverse_charge:
-		filters.update({'is_reverse_charge_account': 0})
+		filters.update({"is_reverse_charge_account": 0})
 
 	gst_accounts = frappe._dict()
-	gst_settings_accounts = frappe.get_all("GST Account",
+	gst_settings_accounts = frappe.get_all(
+		"GST Account",
 		filters=filters,
-		fields=["cgst_account", "sgst_account", "igst_account", "cess_account"])
+		fields=["cgst_account", "sgst_account", "igst_account", "cess_account"],
+	)
 
 	if not gst_settings_accounts and not frappe.flags.in_test and not frappe.flags.in_migrate:
 		frappe.throw(_("Please set GST Accounts in GST Settings"))
@@ -702,32 +838,39 @@
 
 	return gst_accounts
 
-def validate_reverse_charge_transaction(doc, method):
-	country = frappe.get_cached_value('Company', doc.company, 'country')
 
-	if country != 'India':
+def validate_reverse_charge_transaction(doc, method):
+	country = frappe.get_cached_value("Company", doc.company, "country")
+
+	if country != "India":
 		return
 
 	base_gst_tax = 0
 	base_reverse_charge_booked = 0
 
-	if doc.reverse_charge == 'Y':
+	if doc.reverse_charge == "Y":
 		gst_accounts = get_gst_accounts(doc.company, only_reverse_charge=1)
-		reverse_charge_accounts = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
-			+ gst_accounts.get('igst_account')
+		reverse_charge_accounts = (
+			gst_accounts.get("cgst_account")
+			+ gst_accounts.get("sgst_account")
+			+ gst_accounts.get("igst_account")
+		)
 
 		gst_accounts = get_gst_accounts(doc.company, only_non_reverse_charge=1)
-		non_reverse_charge_accounts = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
-			+ gst_accounts.get('igst_account')
+		non_reverse_charge_accounts = (
+			gst_accounts.get("cgst_account")
+			+ gst_accounts.get("sgst_account")
+			+ gst_accounts.get("igst_account")
+		)
 
-		for tax in doc.get('taxes'):
+		for tax in doc.get("taxes"):
 			if tax.account_head in non_reverse_charge_accounts:
-				if tax.add_deduct_tax == 'Add':
+				if tax.add_deduct_tax == "Add":
 					base_gst_tax += tax.base_tax_amount_after_discount_amount
 				else:
 					base_gst_tax += tax.base_tax_amount_after_discount_amount
 			elif tax.account_head in reverse_charge_accounts:
-				if tax.add_deduct_tax == 'Add':
+				if tax.add_deduct_tax == "Add":
 					base_reverse_charge_booked += tax.base_tax_amount_after_discount_amount
 				else:
 					base_reverse_charge_booked += tax.base_tax_amount_after_discount_amount
@@ -735,57 +878,65 @@
 		if base_gst_tax != base_reverse_charge_booked:
 			msg = _("Booked reverse charge is not equal to applied tax amount")
 			msg += "<br>"
-			msg += _("Please refer {gst_document_link} to learn more about how to setup and create reverse charge invoice").format(
-				gst_document_link='<a href="https://docs.erpnext.com/docs/user/manual/en/regional/india/gst-setup">GST Documentation</a>')
+			msg += _(
+				"Please refer {gst_document_link} to learn more about how to setup and create reverse charge invoice"
+			).format(
+				gst_document_link='<a href="https://docs.erpnext.com/docs/user/manual/en/regional/india/gst-setup">GST Documentation</a>'
+			)
 
 			frappe.throw(msg)
 
-def update_itc_availed_fields(doc, method):
-	country = frappe.get_cached_value('Company', doc.company, 'country')
 
-	if country != 'India':
+def update_itc_availed_fields(doc, method):
+	country = frappe.get_cached_value("Company", doc.company, "country")
+
+	if country != "India":
 		return
 
 	# Initialize values
 	doc.itc_integrated_tax = doc.itc_state_tax = doc.itc_central_tax = doc.itc_cess_amount = 0
 	gst_accounts = get_gst_accounts(doc.company, only_non_reverse_charge=1)
 
-	for tax in doc.get('taxes'):
-		if tax.account_head in gst_accounts.get('igst_account', []):
+	for tax in doc.get("taxes"):
+		if tax.account_head in gst_accounts.get("igst_account", []):
 			doc.itc_integrated_tax += flt(tax.base_tax_amount_after_discount_amount)
-		if tax.account_head in gst_accounts.get('sgst_account', []):
+		if tax.account_head in gst_accounts.get("sgst_account", []):
 			doc.itc_state_tax += flt(tax.base_tax_amount_after_discount_amount)
-		if tax.account_head in gst_accounts.get('cgst_account', []):
+		if tax.account_head in gst_accounts.get("cgst_account", []):
 			doc.itc_central_tax += flt(tax.base_tax_amount_after_discount_amount)
-		if tax.account_head in gst_accounts.get('cess_account', []):
+		if tax.account_head in gst_accounts.get("cess_account", []):
 			doc.itc_cess_amount += flt(tax.base_tax_amount_after_discount_amount)
 
+
 def update_place_of_supply(doc, method):
-	country = frappe.get_cached_value('Company', doc.company, 'country')
-	if country != 'India':
+	country = frappe.get_cached_value("Company", doc.company, "country")
+	if country != "India":
 		return
 
-	address = frappe.db.get_value("Address", doc.get('customer_address'), ["gst_state", "gst_state_number"], as_dict=1)
+	address = frappe.db.get_value(
+		"Address", doc.get("customer_address"), ["gst_state", "gst_state_number"], as_dict=1
+	)
 	if address and address.gst_state and address.gst_state_number:
 		doc.place_of_supply = cstr(address.gst_state_number) + "-" + cstr(address.gst_state)
 
+
 @frappe.whitelist()
 def get_regional_round_off_accounts(company, account_list):
-	country = frappe.get_cached_value('Company', company, 'country')
+	country = frappe.get_cached_value("Company", company, "country")
 
-	if country != 'India':
+	if country != "India":
 		return
 
 	if isinstance(account_list, str):
 		account_list = json.loads(account_list)
 
-	if not frappe.db.get_single_value('GST Settings', 'round_off_gst_values'):
+	if not frappe.db.get_single_value("GST Settings", "round_off_gst_values"):
 		return
 
 	gst_accounts = get_gst_accounts(company)
 
 	gst_account_list = []
-	for account in ['cgst_account', 'sgst_account', 'igst_account']:
+	for account in ["cgst_account", "sgst_account", "igst_account"]:
 		if account in gst_accounts:
 			gst_account_list += gst_accounts.get(account)
 
@@ -793,94 +944,113 @@
 
 	return account_list
 
-def update_taxable_values(doc, method):
-	country = frappe.get_cached_value('Company', doc.company, 'country')
 
-	if country != 'India':
+def update_taxable_values(doc, method):
+	country = frappe.get_cached_value("Company", doc.company, "country")
+
+	if country != "India":
 		return
 
 	gst_accounts = get_gst_accounts(doc.company)
 
 	# Only considering sgst account to avoid inflating taxable value
-	gst_account_list = gst_accounts.get('sgst_account', []) + gst_accounts.get('sgst_account', []) \
-		+ gst_accounts.get('igst_account', [])
+	gst_account_list = (
+		gst_accounts.get("sgst_account", [])
+		+ gst_accounts.get("sgst_account", [])
+		+ gst_accounts.get("igst_account", [])
+	)
 
 	additional_taxes = 0
 	total_charges = 0
 	item_count = 0
 	considered_rows = []
 
-	for tax in doc.get('taxes'):
+	for tax in doc.get("taxes"):
 		prev_row_id = cint(tax.row_id) - 1
 		if tax.account_head in gst_account_list and prev_row_id not in considered_rows:
-			if tax.charge_type == 'On Previous Row Amount':
-				additional_taxes += doc.get('taxes')[prev_row_id].tax_amount_after_discount_amount
+			if tax.charge_type == "On Previous Row Amount":
+				additional_taxes += doc.get("taxes")[prev_row_id].tax_amount_after_discount_amount
 				considered_rows.append(prev_row_id)
-			if tax.charge_type == 'On Previous Row Total':
-				additional_taxes += doc.get('taxes')[prev_row_id].base_total - doc.base_net_total
+			if tax.charge_type == "On Previous Row Total":
+				additional_taxes += doc.get("taxes")[prev_row_id].base_total - doc.base_net_total
 				considered_rows.append(prev_row_id)
 
-	for item in doc.get('items'):
+	for item in doc.get("items"):
 		proportionate_value = item.base_net_amount if doc.base_net_total else item.qty
 		total_value = doc.base_net_total if doc.base_net_total else doc.total_qty
 
-		applicable_charges = flt(flt(proportionate_value * (flt(additional_taxes) / flt(total_value)),
-			item.precision('taxable_value')))
+		applicable_charges = flt(
+			flt(
+				proportionate_value * (flt(additional_taxes) / flt(total_value)),
+				item.precision("taxable_value"),
+			)
+		)
 		item.taxable_value = applicable_charges + proportionate_value
 		total_charges += applicable_charges
 		item_count += 1
 
 	if total_charges != additional_taxes:
 		diff = additional_taxes - total_charges
-		doc.get('items')[item_count - 1].taxable_value += diff
+		doc.get("items")[item_count - 1].taxable_value += diff
+
 
 def get_depreciation_amount(asset, depreciable_value, row):
 	if row.depreciation_method in ("Straight Line", "Manual"):
 		# if the Depreciation Schedule is being prepared for the first time
 		if not asset.flags.increase_in_asset_life:
-			depreciation_amount = (flt(asset.gross_purchase_amount) -
-				flt(row.expected_value_after_useful_life)) / flt(row.total_number_of_depreciations)
+			depreciation_amount = (
+				flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
+			) / flt(row.total_number_of_depreciations)
 
 		# if the Depreciation Schedule is being modified after Asset Repair
 		else:
-			depreciation_amount = (flt(row.value_after_depreciation) -
-				flt(row.expected_value_after_useful_life)) / (date_diff(asset.to_date, asset.available_for_use_date) / 365)
+			depreciation_amount = (
+				flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
+			) / (date_diff(asset.to_date, asset.available_for_use_date) / 365)
 
 	else:
 		rate_of_depreciation = row.rate_of_depreciation
 		# if its the first depreciation
 		if depreciable_value == asset.gross_purchase_amount:
-			if row.finance_book and frappe.db.get_value('Finance Book', row.finance_book, 'for_income_tax'):
+			if row.finance_book and frappe.db.get_value("Finance Book", row.finance_book, "for_income_tax"):
 				# as per IT act, if the asset is purchased in the 2nd half of fiscal year, then rate is divided by 2
 				diff = date_diff(row.depreciation_start_date, asset.available_for_use_date)
 				if diff <= 180:
 					rate_of_depreciation = rate_of_depreciation / 2
 					frappe.msgprint(
-						_('As per IT Act, the rate of depreciation for the first depreciation entry is reduced by 50%.'))
+						_(
+							"As per IT Act, the rate of depreciation for the first depreciation entry is reduced by 50%."
+						)
+					)
 
 		depreciation_amount = flt(depreciable_value * (flt(rate_of_depreciation) / 100))
 
 	return depreciation_amount
 
+
 def set_item_tax_from_hsn_code(item):
 	if not item.taxes and item.gst_hsn_code:
 		hsn_doc = frappe.get_doc("GST HSN Code", item.gst_hsn_code)
 
 		for tax in hsn_doc.taxes:
-			item.append('taxes', {
-				'item_tax_template': tax.item_tax_template,
-				'tax_category': tax.tax_category,
-				'valid_from': tax.valid_from
-			})
+			item.append(
+				"taxes",
+				{
+					"item_tax_template": tax.item_tax_template,
+					"tax_category": tax.tax_category,
+					"valid_from": tax.valid_from,
+				},
+			)
+
 
 def delete_gst_settings_for_company(doc, method):
-	if doc.country != 'India':
+	if doc.country != "India":
 		return
 
 	gst_settings = frappe.get_doc("GST Settings")
 	records_to_delete = []
 
-	for d in reversed(gst_settings.get('gst_accounts')):
+	for d in reversed(gst_settings.get("gst_accounts")):
 		if d.company == doc.name:
 			records_to_delete.append(d)
 
diff --git a/erpnext/regional/italy/__init__.py b/erpnext/regional/italy/__init__.py
index eb20f65..643e955 100644
--- a/erpnext/regional/italy/__init__.py
+++ b/erpnext/regional/italy/__init__.py
@@ -1,77 +1,172 @@
 fiscal_regimes = [
-    "RF01-Ordinario",
-    "RF02-Contribuenti minimi (art.1, c.96-117, L. 244/07)",
-    "RF04-Agricoltura e attività connesse e pesca (artt.34 e 34-bis, DPR 633/72)",
-    "RF05-Vendita sali e tabacchi (art.74, c.1, DPR. 633/72)",
-    "RF06-Commercio fiammiferi (art.74, c.1, DPR  633/72)",
-    "RF07-Editoria (art.74, c.1, DPR  633/72)",
-    "RF08-Gestione servizi telefonia pubblica (art.74, c.1, DPR 633/72)",
-    "RF09-Rivendita documenti di trasporto pubblico e di sosta (art.74, c.1, DPR  633/72)",
-    "RF10-Intrattenimenti, giochi e altre attività di cui alla tariffa allegata al DPR 640/72 (art.74, c.6, DPR 633/72)",
-    "RF11-Agenzie viaggi e turismo (art.74-ter, DPR 633/72)",
-    "RF12-Agriturismo (art.5, c.2, L. 413/91)",
-    "RF13-Vendite a domicilio (art.25-bis, c.6, DPR  600/73)",
-    "RF14-Rivendita beni usati, oggetti d’arte, d’antiquariato o da collezione (art.36, DL 41/95)",
-    "RF15-Agenzie di vendite all’asta di oggetti d’arte, antiquariato o da collezione (art.40-bis, DL 41/95)",
-    "RF16-IVA per cassa P.A. (art.6, c.5, DPR 633/72)",
-    "RF17-IVA per cassa (art. 32-bis, DL 83/2012)",
-    "RF18-Altro",
-    "RF19-Regime forfettario (art.1, c.54-89, L. 190/2014)"
+	"RF01-Ordinario",
+	"RF02-Contribuenti minimi (art.1, c.96-117, L. 244/07)",
+	"RF04-Agricoltura e attività connesse e pesca (artt.34 e 34-bis, DPR 633/72)",
+	"RF05-Vendita sali e tabacchi (art.74, c.1, DPR. 633/72)",
+	"RF06-Commercio fiammiferi (art.74, c.1, DPR  633/72)",
+	"RF07-Editoria (art.74, c.1, DPR  633/72)",
+	"RF08-Gestione servizi telefonia pubblica (art.74, c.1, DPR 633/72)",
+	"RF09-Rivendita documenti di trasporto pubblico e di sosta (art.74, c.1, DPR  633/72)",
+	"RF10-Intrattenimenti, giochi e altre attività di cui alla tariffa allegata al DPR 640/72 (art.74, c.6, DPR 633/72)",
+	"RF11-Agenzie viaggi e turismo (art.74-ter, DPR 633/72)",
+	"RF12-Agriturismo (art.5, c.2, L. 413/91)",
+	"RF13-Vendite a domicilio (art.25-bis, c.6, DPR  600/73)",
+	"RF14-Rivendita beni usati, oggetti d’arte, d’antiquariato o da collezione (art.36, DL 41/95)",
+	"RF15-Agenzie di vendite all’asta di oggetti d’arte, antiquariato o da collezione (art.40-bis, DL 41/95)",
+	"RF16-IVA per cassa P.A. (art.6, c.5, DPR 633/72)",
+	"RF17-IVA per cassa (art. 32-bis, DL 83/2012)",
+	"RF18-Altro",
+	"RF19-Regime forfettario (art.1, c.54-89, L. 190/2014)",
 ]
 
 tax_exemption_reasons = [
-    "N1-Escluse ex art. 15",
-    "N2-Non Soggette",
-    "N3-Non Imponibili",
-    "N4-Esenti",
-    "N5-Regime del margine / IVA non esposta in fattura",
-    "N6-Inversione Contabile",
-    "N7-IVA assolta in altro stato UE"
+	"N1-Escluse ex art. 15",
+	"N2-Non Soggette",
+	"N3-Non Imponibili",
+	"N4-Esenti",
+	"N5-Regime del margine / IVA non esposta in fattura",
+	"N6-Inversione Contabile",
+	"N7-IVA assolta in altro stato UE",
 ]
 
 mode_of_payment_codes = [
-    "MP01-Contanti",
-    "MP02-Assegno",
-    "MP03-Assegno circolare",
-    "MP04-Contanti presso Tesoreria",
-    "MP05-Bonifico",
-    "MP06-Vaglia cambiario",
-    "MP07-Bollettino bancario",
-    "MP08-Carta di pagamento",
-    "MP09-RID",
-    "MP10-RID utenze",
-    "MP11-RID veloce",
-    "MP12-RIBA",
-    "MP13-MAV",
-    "MP14-Quietanza erario",
-    "MP15-Giroconto su conti di contabilità speciale",
-    "MP16-Domiciliazione bancaria",
-    "MP17-Domiciliazione postale",
-    "MP18-Bollettino di c/c postale",
-    "MP19-SEPA Direct Debit",
-    "MP20-SEPA Direct Debit CORE",
-    "MP21-SEPA Direct Debit B2B",
-    "MP22-Trattenuta su somme già riscosse"
+	"MP01-Contanti",
+	"MP02-Assegno",
+	"MP03-Assegno circolare",
+	"MP04-Contanti presso Tesoreria",
+	"MP05-Bonifico",
+	"MP06-Vaglia cambiario",
+	"MP07-Bollettino bancario",
+	"MP08-Carta di pagamento",
+	"MP09-RID",
+	"MP10-RID utenze",
+	"MP11-RID veloce",
+	"MP12-RIBA",
+	"MP13-MAV",
+	"MP14-Quietanza erario",
+	"MP15-Giroconto su conti di contabilità speciale",
+	"MP16-Domiciliazione bancaria",
+	"MP17-Domiciliazione postale",
+	"MP18-Bollettino di c/c postale",
+	"MP19-SEPA Direct Debit",
+	"MP20-SEPA Direct Debit CORE",
+	"MP21-SEPA Direct Debit B2B",
+	"MP22-Trattenuta su somme già riscosse",
 ]
 
-vat_collectability_options = [
-    "I-Immediata",
-    "D-Differita",
-    "S-Scissione dei Pagamenti"
-]
+vat_collectability_options = ["I-Immediata", "D-Differita", "S-Scissione dei Pagamenti"]
 
-state_codes = {'Siracusa': 'SR', 'Bologna': 'BO', 'Grosseto': 'GR', 'Caserta': 'CE', 'Alessandria': 'AL', 'Ancona': 'AN', 'Pavia': 'PV',
- 'Benevento or Beneventum': 'BN', 'Modena': 'MO', 'Lodi': 'LO', 'Novara': 'NO', 'Avellino': 'AV', 'Verona': 'VR', 'Forli-Cesena': 'FC',
- 'Caltanissetta': 'CL', 'Brescia': 'BS', 'Rieti': 'RI', 'Treviso': 'TV', 'Ogliastra': 'OG', 'Olbia-Tempio': 'OT', 'Bergamo': 'BG',
- 'Napoli': 'NA', 'Campobasso': 'CB', 'Fermo': 'FM', 'Roma': 'RM', 'Lucca': 'LU', 'Rovigo': 'RO', 'Piacenza': 'PC', 'Monza and Brianza': 'MB',
- 'La Spezia': 'SP', 'Pescara': 'PE', 'Vercelli': 'VC', 'Enna': 'EN', 'Nuoro': 'NU', 'Medio Campidano': 'MD', 'Trieste': 'TS', 'Aosta': 'AO',
- 'Firenze': 'FI', 'Trapani': 'TP', 'Messina': 'ME', 'Teramo': 'TE', 'Udine': 'UD', 'Verbano-Cusio-Ossola': 'VB', 'Padua': 'PD',
- 'Reggio Emilia': 'RE', 'Frosinone': 'FR', 'Taranto': 'TA', 'Catanzaro': 'CZ', 'Belluno': 'BL', 'Pordenone': 'PN', 'Viterbo': 'VT',
- 'Gorizia': 'GO', 'Vatican City': 'SCV', 'Ferrara': 'FE', 'Chieti': 'CH', 'Crotone': 'KR', 'Foggia': 'FG', 'Perugia': 'PG', 'Bari': 'BA',
- 'Massa-Carrara': 'MS', 'Pisa': 'PI', 'Latina': 'LT', 'Salerno': 'SA', 'Turin': 'TO', 'Lecco': 'LC', 'Lecce': 'LE', 'Pistoia': 'PT', 'Como': 'CO',
- 'Barletta-Andria-Trani': 'BT', 'Mantua': 'MN', 'Ragusa': 'RG', 'Macerata': 'MC', 'Imperia': 'IM', 'Palermo': 'PA', 'Matera': 'MT', "L'Aquila": 'AQ',
- 'Milano': 'MI', 'Catania': 'CT', 'Pesaro e Urbino': 'PU', 'Potenza': 'PZ', 'Republic of San Marino': 'RSM', 'Genoa': 'GE', 'Brindisi': 'BR',
- 'Cagliari': 'CA', 'Siena': 'SI', 'Vibo Valentia': 'VV', 'Reggio Calabria': 'RC', 'Ascoli Piceno': 'AP', 'Carbonia-Iglesias': 'CI', 'Oristano': 'OR',
- 'Asti': 'AT', 'Ravenna': 'RA', 'Vicenza': 'VI', 'Savona': 'SV', 'Biella': 'BI', 'Rimini': 'RN', 'Agrigento': 'AG', 'Prato': 'PO', 'Cuneo': 'CN',
- 'Cosenza': 'CS', 'Livorno or Leghorn': 'LI', 'Sondrio': 'SO', 'Cremona': 'CR', 'Isernia': 'IS', 'Trento': 'TN', 'Terni': 'TR', 'Bolzano/Bozen': 'BZ',
- 'Parma': 'PR', 'Varese': 'VA', 'Venezia': 'VE', 'Sassari': 'SS', 'Arezzo': 'AR'}
+state_codes = {
+	"Siracusa": "SR",
+	"Bologna": "BO",
+	"Grosseto": "GR",
+	"Caserta": "CE",
+	"Alessandria": "AL",
+	"Ancona": "AN",
+	"Pavia": "PV",
+	"Benevento or Beneventum": "BN",
+	"Modena": "MO",
+	"Lodi": "LO",
+	"Novara": "NO",
+	"Avellino": "AV",
+	"Verona": "VR",
+	"Forli-Cesena": "FC",
+	"Caltanissetta": "CL",
+	"Brescia": "BS",
+	"Rieti": "RI",
+	"Treviso": "TV",
+	"Ogliastra": "OG",
+	"Olbia-Tempio": "OT",
+	"Bergamo": "BG",
+	"Napoli": "NA",
+	"Campobasso": "CB",
+	"Fermo": "FM",
+	"Roma": "RM",
+	"Lucca": "LU",
+	"Rovigo": "RO",
+	"Piacenza": "PC",
+	"Monza and Brianza": "MB",
+	"La Spezia": "SP",
+	"Pescara": "PE",
+	"Vercelli": "VC",
+	"Enna": "EN",
+	"Nuoro": "NU",
+	"Medio Campidano": "MD",
+	"Trieste": "TS",
+	"Aosta": "AO",
+	"Firenze": "FI",
+	"Trapani": "TP",
+	"Messina": "ME",
+	"Teramo": "TE",
+	"Udine": "UD",
+	"Verbano-Cusio-Ossola": "VB",
+	"Padua": "PD",
+	"Reggio Emilia": "RE",
+	"Frosinone": "FR",
+	"Taranto": "TA",
+	"Catanzaro": "CZ",
+	"Belluno": "BL",
+	"Pordenone": "PN",
+	"Viterbo": "VT",
+	"Gorizia": "GO",
+	"Vatican City": "SCV",
+	"Ferrara": "FE",
+	"Chieti": "CH",
+	"Crotone": "KR",
+	"Foggia": "FG",
+	"Perugia": "PG",
+	"Bari": "BA",
+	"Massa-Carrara": "MS",
+	"Pisa": "PI",
+	"Latina": "LT",
+	"Salerno": "SA",
+	"Turin": "TO",
+	"Lecco": "LC",
+	"Lecce": "LE",
+	"Pistoia": "PT",
+	"Como": "CO",
+	"Barletta-Andria-Trani": "BT",
+	"Mantua": "MN",
+	"Ragusa": "RG",
+	"Macerata": "MC",
+	"Imperia": "IM",
+	"Palermo": "PA",
+	"Matera": "MT",
+	"L'Aquila": "AQ",
+	"Milano": "MI",
+	"Catania": "CT",
+	"Pesaro e Urbino": "PU",
+	"Potenza": "PZ",
+	"Republic of San Marino": "RSM",
+	"Genoa": "GE",
+	"Brindisi": "BR",
+	"Cagliari": "CA",
+	"Siena": "SI",
+	"Vibo Valentia": "VV",
+	"Reggio Calabria": "RC",
+	"Ascoli Piceno": "AP",
+	"Carbonia-Iglesias": "CI",
+	"Oristano": "OR",
+	"Asti": "AT",
+	"Ravenna": "RA",
+	"Vicenza": "VI",
+	"Savona": "SV",
+	"Biella": "BI",
+	"Rimini": "RN",
+	"Agrigento": "AG",
+	"Prato": "PO",
+	"Cuneo": "CN",
+	"Cosenza": "CS",
+	"Livorno or Leghorn": "LI",
+	"Sondrio": "SO",
+	"Cremona": "CR",
+	"Isernia": "IS",
+	"Trento": "TN",
+	"Terni": "TR",
+	"Bolzano/Bozen": "BZ",
+	"Parma": "PR",
+	"Varese": "VA",
+	"Venezia": "VE",
+	"Sassari": "SS",
+	"Arezzo": "AR",
+}
diff --git a/erpnext/regional/italy/setup.py b/erpnext/regional/italy/setup.py
index 531f10d..1f66b36 100644
--- a/erpnext/regional/italy/setup.py
+++ b/erpnext/regional/italy/setup.py
@@ -7,213 +7,489 @@
 from frappe import _
 from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
 from frappe.permissions import add_permission, update_permission_property
-from erpnext.regional.italy import fiscal_regimes, tax_exemption_reasons, mode_of_payment_codes, vat_collectability_options
+from erpnext.regional.italy import (
+	fiscal_regimes,
+	tax_exemption_reasons,
+	mode_of_payment_codes,
+	vat_collectability_options,
+)
+
 
 def setup(company=None, patch=True):
 	make_custom_fields()
 	setup_report()
 	add_permissions()
 
+
 def make_custom_fields(update=True):
 	invoice_item_fields = [
-		dict(fieldname='tax_rate', label='Tax Rate',
-			fieldtype='Float', insert_after='description',
-			print_hide=1, hidden=1, read_only=1),
-		dict(fieldname='tax_amount', label='Tax Amount',
-			fieldtype='Currency', insert_after='tax_rate',
-			print_hide=1, hidden=1, read_only=1, options="currency"),
-		dict(fieldname='total_amount', label='Total Amount',
-			fieldtype='Currency', insert_after='tax_amount',
-			print_hide=1, hidden=1, read_only=1, options="currency")
+		dict(
+			fieldname="tax_rate",
+			label="Tax Rate",
+			fieldtype="Float",
+			insert_after="description",
+			print_hide=1,
+			hidden=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="tax_amount",
+			label="Tax Amount",
+			fieldtype="Currency",
+			insert_after="tax_rate",
+			print_hide=1,
+			hidden=1,
+			read_only=1,
+			options="currency",
+		),
+		dict(
+			fieldname="total_amount",
+			label="Total Amount",
+			fieldtype="Currency",
+			insert_after="tax_amount",
+			print_hide=1,
+			hidden=1,
+			read_only=1,
+			options="currency",
+		),
 	]
 
 	customer_po_fields = [
-		dict(fieldname='customer_po_details', label='Customer PO',
-			fieldtype='Section Break', insert_after='image'),
-		dict(fieldname='customer_po_no', label='Customer PO No',
-			fieldtype='Data', insert_after='customer_po_details',
-			fetch_from = 'sales_order.po_no',
-			print_hide=1, allow_on_submit=1, fetch_if_empty= 1, read_only=1, no_copy=1),
-		dict(fieldname='customer_po_clm_brk', label='',
-			fieldtype='Column Break', insert_after='customer_po_no',
-			print_hide=1, read_only=1),
-		dict(fieldname='customer_po_date', label='Customer PO Date',
-			fieldtype='Date', insert_after='customer_po_clm_brk',
-			fetch_from = 'sales_order.po_date',
-			print_hide=1, allow_on_submit=1, fetch_if_empty= 1, read_only=1, no_copy=1)
+		dict(
+			fieldname="customer_po_details",
+			label="Customer PO",
+			fieldtype="Section Break",
+			insert_after="image",
+		),
+		dict(
+			fieldname="customer_po_no",
+			label="Customer PO No",
+			fieldtype="Data",
+			insert_after="customer_po_details",
+			fetch_from="sales_order.po_no",
+			print_hide=1,
+			allow_on_submit=1,
+			fetch_if_empty=1,
+			read_only=1,
+			no_copy=1,
+		),
+		dict(
+			fieldname="customer_po_clm_brk",
+			label="",
+			fieldtype="Column Break",
+			insert_after="customer_po_no",
+			print_hide=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="customer_po_date",
+			label="Customer PO Date",
+			fieldtype="Date",
+			insert_after="customer_po_clm_brk",
+			fetch_from="sales_order.po_date",
+			print_hide=1,
+			allow_on_submit=1,
+			fetch_if_empty=1,
+			read_only=1,
+			no_copy=1,
+		),
 	]
 
 	custom_fields = {
-		'Company': [
-			dict(fieldname='sb_e_invoicing', label='E-Invoicing',
-				fieldtype='Section Break', insert_after='date_of_establishment', print_hide=1),
-			dict(fieldname='fiscal_regime', label='Fiscal Regime',
-				fieldtype='Select', insert_after='sb_e_invoicing', print_hide=1,
-				options="\n".join(map(lambda x: frappe.safe_decode(x, encoding='utf-8'), fiscal_regimes))),
-			dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='fiscal_regime', print_hide=1,
-				description=_("Applicable if the company is an Individual or a Proprietorship")),
-			dict(fieldname='vat_collectability', label='VAT Collectability',
-				fieldtype='Select', insert_after='fiscal_code', print_hide=1,
-				options="\n".join(map(lambda x: frappe.safe_decode(x, encoding='utf-8'), vat_collectability_options))),
-			dict(fieldname='cb_e_invoicing1', fieldtype='Column Break', insert_after='vat_collectability', print_hide=1),
-			dict(fieldname='registrar_office_province', label='Province of the Registrar Office',
-				fieldtype='Data', insert_after='cb_e_invoicing1', print_hide=1, length=2),
-			dict(fieldname='registration_number', label='Registration Number',
-				fieldtype='Data', insert_after='registrar_office_province', print_hide=1, length=20),
-			dict(fieldname='share_capital_amount', label='Share Capital',
-				fieldtype='Currency', insert_after='registration_number', print_hide=1,
-				description=_('Applicable if the company is SpA, SApA or SRL')),
-			dict(fieldname='no_of_members', label='No of Members',
-				fieldtype='Select', insert_after='share_capital_amount', print_hide=1,
-				options="\nSU-Socio Unico\nSM-Piu Soci", description=_("Applicable if the company is a limited liability company")),
-			dict(fieldname='liquidation_state', label='Liquidation State',
-				fieldtype='Select', insert_after='no_of_members', print_hide=1,
-				options="\nLS-In Liquidazione\nLN-Non in Liquidazione")
+		"Company": [
+			dict(
+				fieldname="sb_e_invoicing",
+				label="E-Invoicing",
+				fieldtype="Section Break",
+				insert_after="date_of_establishment",
+				print_hide=1,
+			),
+			dict(
+				fieldname="fiscal_regime",
+				label="Fiscal Regime",
+				fieldtype="Select",
+				insert_after="sb_e_invoicing",
+				print_hide=1,
+				options="\n".join(map(lambda x: frappe.safe_decode(x, encoding="utf-8"), fiscal_regimes)),
+			),
+			dict(
+				fieldname="fiscal_code",
+				label="Fiscal Code",
+				fieldtype="Data",
+				insert_after="fiscal_regime",
+				print_hide=1,
+				description=_("Applicable if the company is an Individual or a Proprietorship"),
+			),
+			dict(
+				fieldname="vat_collectability",
+				label="VAT Collectability",
+				fieldtype="Select",
+				insert_after="fiscal_code",
+				print_hide=1,
+				options="\n".join(
+					map(lambda x: frappe.safe_decode(x, encoding="utf-8"), vat_collectability_options)
+				),
+			),
+			dict(
+				fieldname="cb_e_invoicing1",
+				fieldtype="Column Break",
+				insert_after="vat_collectability",
+				print_hide=1,
+			),
+			dict(
+				fieldname="registrar_office_province",
+				label="Province of the Registrar Office",
+				fieldtype="Data",
+				insert_after="cb_e_invoicing1",
+				print_hide=1,
+				length=2,
+			),
+			dict(
+				fieldname="registration_number",
+				label="Registration Number",
+				fieldtype="Data",
+				insert_after="registrar_office_province",
+				print_hide=1,
+				length=20,
+			),
+			dict(
+				fieldname="share_capital_amount",
+				label="Share Capital",
+				fieldtype="Currency",
+				insert_after="registration_number",
+				print_hide=1,
+				description=_("Applicable if the company is SpA, SApA or SRL"),
+			),
+			dict(
+				fieldname="no_of_members",
+				label="No of Members",
+				fieldtype="Select",
+				insert_after="share_capital_amount",
+				print_hide=1,
+				options="\nSU-Socio Unico\nSM-Piu Soci",
+				description=_("Applicable if the company is a limited liability company"),
+			),
+			dict(
+				fieldname="liquidation_state",
+				label="Liquidation State",
+				fieldtype="Select",
+				insert_after="no_of_members",
+				print_hide=1,
+				options="\nLS-In Liquidazione\nLN-Non in Liquidazione",
+			),
 		],
-		'Sales Taxes and Charges': [
-			dict(fieldname='tax_exemption_reason', label='Tax Exemption Reason',
-				fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
+		"Sales Taxes and Charges": [
+			dict(
+				fieldname="tax_exemption_reason",
+				label="Tax Exemption Reason",
+				fieldtype="Select",
+				insert_after="included_in_print_rate",
+				print_hide=1,
 				depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0',
-				options="\n" + "\n".join(map(lambda x: frappe.safe_decode(x, encoding='utf-8'), tax_exemption_reasons))),
-			dict(fieldname='tax_exemption_law', label='Tax Exempt Under',
-				fieldtype='Text', insert_after='tax_exemption_reason', print_hide=1,
-				depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0')
+				options="\n"
+				+ "\n".join(map(lambda x: frappe.safe_decode(x, encoding="utf-8"), tax_exemption_reasons)),
+			),
+			dict(
+				fieldname="tax_exemption_law",
+				label="Tax Exempt Under",
+				fieldtype="Text",
+				insert_after="tax_exemption_reason",
+				print_hide=1,
+				depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0',
+			),
 		],
-		'Customer': [
-			dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='tax_id', print_hide=1),
-			dict(fieldname='recipient_code', label='Recipient Code',
-				fieldtype='Data', insert_after='fiscal_code', print_hide=1, default="0000000"),
-			dict(fieldname='pec', label='Recipient PEC',
-				fieldtype='Data', insert_after='fiscal_code', print_hide=1),
-			dict(fieldname='is_public_administration', label='Is Public Administration',
-				fieldtype='Check', insert_after='is_internal_customer', print_hide=1,
+		"Customer": [
+			dict(
+				fieldname="fiscal_code",
+				label="Fiscal Code",
+				fieldtype="Data",
+				insert_after="tax_id",
+				print_hide=1,
+			),
+			dict(
+				fieldname="recipient_code",
+				label="Recipient Code",
+				fieldtype="Data",
+				insert_after="fiscal_code",
+				print_hide=1,
+				default="0000000",
+			),
+			dict(
+				fieldname="pec",
+				label="Recipient PEC",
+				fieldtype="Data",
+				insert_after="fiscal_code",
+				print_hide=1,
+			),
+			dict(
+				fieldname="is_public_administration",
+				label="Is Public Administration",
+				fieldtype="Check",
+				insert_after="is_internal_customer",
+				print_hide=1,
 				description=_("Set this if the customer is a Public Administration company."),
-				depends_on='eval:doc.customer_type=="Company"'),
-			dict(fieldname='first_name', label='First Name', fieldtype='Data',
-				insert_after='salutation', print_hide=1, depends_on='eval:doc.customer_type!="Company"'),
-			dict(fieldname='last_name', label='Last Name', fieldtype='Data',
-				insert_after='first_name', print_hide=1, depends_on='eval:doc.customer_type!="Company"')
+				depends_on='eval:doc.customer_type=="Company"',
+			),
+			dict(
+				fieldname="first_name",
+				label="First Name",
+				fieldtype="Data",
+				insert_after="salutation",
+				print_hide=1,
+				depends_on='eval:doc.customer_type!="Company"',
+			),
+			dict(
+				fieldname="last_name",
+				label="Last Name",
+				fieldtype="Data",
+				insert_after="first_name",
+				print_hide=1,
+				depends_on='eval:doc.customer_type!="Company"',
+			),
 		],
-		'Mode of Payment': [
-			dict(fieldname='mode_of_payment_code', label='Code',
-			fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
-			options="\n".join(map(lambda x: frappe.safe_decode(x, encoding='utf-8'), mode_of_payment_codes)))
+		"Mode of Payment": [
+			dict(
+				fieldname="mode_of_payment_code",
+				label="Code",
+				fieldtype="Select",
+				insert_after="included_in_print_rate",
+				print_hide=1,
+				options="\n".join(
+					map(lambda x: frappe.safe_decode(x, encoding="utf-8"), mode_of_payment_codes)
+				),
+			)
 		],
-		'Payment Schedule': [
-			dict(fieldname='mode_of_payment_code', label='Code',
-				fieldtype='Select', insert_after='mode_of_payment', print_hide=1,
-				options="\n".join(map(lambda x: frappe.safe_decode(x, encoding='utf-8'), mode_of_payment_codes)),
-				fetch_from="mode_of_payment.mode_of_payment_code", read_only=1),
-			dict(fieldname='bank_account', label='Bank Account',
-				fieldtype='Link', insert_after='mode_of_payment_code', print_hide=1,
-				options="Bank Account"),
-			dict(fieldname='bank_account_name', label='Bank Name',
-				fieldtype='Data', insert_after='bank_account', print_hide=1,
-				fetch_from="bank_account.bank", read_only=1),
-			dict(fieldname='bank_account_no', label='Bank Account No',
-				fieldtype='Data', insert_after='bank_account_name', print_hide=1,
-				fetch_from="bank_account.bank_account_no", read_only=1),
-			dict(fieldname='bank_account_iban', label='IBAN',
-				fieldtype='Data', insert_after='bank_account_name', print_hide=1,
-				fetch_from="bank_account.iban", read_only=1),
-			dict(fieldname='bank_account_swift_number', label='Swift Code (BIC)',
-				fieldtype='Data', insert_after='bank_account_iban', print_hide=1,
-				fetch_from="bank_account.swift_number", read_only=1),
+		"Payment Schedule": [
+			dict(
+				fieldname="mode_of_payment_code",
+				label="Code",
+				fieldtype="Select",
+				insert_after="mode_of_payment",
+				print_hide=1,
+				options="\n".join(
+					map(lambda x: frappe.safe_decode(x, encoding="utf-8"), mode_of_payment_codes)
+				),
+				fetch_from="mode_of_payment.mode_of_payment_code",
+				read_only=1,
+			),
+			dict(
+				fieldname="bank_account",
+				label="Bank Account",
+				fieldtype="Link",
+				insert_after="mode_of_payment_code",
+				print_hide=1,
+				options="Bank Account",
+			),
+			dict(
+				fieldname="bank_account_name",
+				label="Bank Name",
+				fieldtype="Data",
+				insert_after="bank_account",
+				print_hide=1,
+				fetch_from="bank_account.bank",
+				read_only=1,
+			),
+			dict(
+				fieldname="bank_account_no",
+				label="Bank Account No",
+				fieldtype="Data",
+				insert_after="bank_account_name",
+				print_hide=1,
+				fetch_from="bank_account.bank_account_no",
+				read_only=1,
+			),
+			dict(
+				fieldname="bank_account_iban",
+				label="IBAN",
+				fieldtype="Data",
+				insert_after="bank_account_name",
+				print_hide=1,
+				fetch_from="bank_account.iban",
+				read_only=1,
+			),
+			dict(
+				fieldname="bank_account_swift_number",
+				label="Swift Code (BIC)",
+				fieldtype="Data",
+				insert_after="bank_account_iban",
+				print_hide=1,
+				fetch_from="bank_account.swift_number",
+				read_only=1,
+			),
 		],
 		"Sales Invoice": [
-			dict(fieldname='vat_collectability', label='VAT Collectability',
-				fieldtype='Select', insert_after='taxes_and_charges', print_hide=1,
-				options="\n".join(map(lambda x: frappe.safe_decode(x, encoding='utf-8'), vat_collectability_options)),
-				fetch_from="company.vat_collectability"),
-			dict(fieldname='sb_e_invoicing_reference', label='E-Invoicing',
-				fieldtype='Section Break', insert_after='against_income_account', print_hide=1),
-			dict(fieldname='company_fiscal_code', label='Company Fiscal Code',
-				fieldtype='Data', insert_after='sb_e_invoicing_reference', print_hide=1, read_only=1,
-				fetch_from="company.fiscal_code"),
-			dict(fieldname='company_fiscal_regime', label='Company Fiscal Regime',
-				fieldtype='Data', insert_after='company_fiscal_code', print_hide=1, read_only=1,
-				fetch_from="company.fiscal_regime"),
-			dict(fieldname='cb_e_invoicing_reference', fieldtype='Column Break',
-				insert_after='company_fiscal_regime', print_hide=1),
-			dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
-				fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
-				fetch_from="customer.fiscal_code"),
-			dict(fieldname='type_of_document', label='Type of Document',
-				fieldtype='Select', insert_after='customer_fiscal_code',
-				options='\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27'),
-		],
-		'Purchase Invoice Item': invoice_item_fields,
-		'Sales Order Item': invoice_item_fields,
-		'Delivery Note Item': invoice_item_fields,
-		'Sales Invoice Item': invoice_item_fields + customer_po_fields,
-		'Quotation Item': invoice_item_fields,
-		'Purchase Order Item': invoice_item_fields,
-		'Purchase Receipt Item': invoice_item_fields,
-		'Supplier Quotation Item': invoice_item_fields,
-		'Address': [
-			dict(fieldname='country_code', label='Country Code',
-				fieldtype='Data', insert_after='country', print_hide=1, read_only=0,
-				fetch_from="country.code"),
-			dict(fieldname='state_code', label='State Code',
-				fieldtype='Data', insert_after='state', print_hide=1)
-		],
-		'Purchase Invoice': [
-			dict(fieldname='document_type', label='Document Type',
-				fieldtype='Data', insert_after='company', print_hide=1, read_only=1
+			dict(
+				fieldname="vat_collectability",
+				label="VAT Collectability",
+				fieldtype="Select",
+				insert_after="taxes_and_charges",
+				print_hide=1,
+				options="\n".join(
+					map(lambda x: frappe.safe_decode(x, encoding="utf-8"), vat_collectability_options)
 				),
-			dict(fieldname='destination_code', label='Destination Code',
-				fieldtype='Data', insert_after='company', print_hide=1, read_only=1
-				),
-			dict(fieldname='imported_grand_total', label='Imported Grand Total',
-				fieldtype='Data', insert_after='update_auto_repeat_reference', print_hide=1, read_only=1
-				)
+				fetch_from="company.vat_collectability",
+			),
+			dict(
+				fieldname="sb_e_invoicing_reference",
+				label="E-Invoicing",
+				fieldtype="Section Break",
+				insert_after="against_income_account",
+				print_hide=1,
+			),
+			dict(
+				fieldname="company_fiscal_code",
+				label="Company Fiscal Code",
+				fieldtype="Data",
+				insert_after="sb_e_invoicing_reference",
+				print_hide=1,
+				read_only=1,
+				fetch_from="company.fiscal_code",
+			),
+			dict(
+				fieldname="company_fiscal_regime",
+				label="Company Fiscal Regime",
+				fieldtype="Data",
+				insert_after="company_fiscal_code",
+				print_hide=1,
+				read_only=1,
+				fetch_from="company.fiscal_regime",
+			),
+			dict(
+				fieldname="cb_e_invoicing_reference",
+				fieldtype="Column Break",
+				insert_after="company_fiscal_regime",
+				print_hide=1,
+			),
+			dict(
+				fieldname="customer_fiscal_code",
+				label="Customer Fiscal Code",
+				fieldtype="Data",
+				insert_after="cb_e_invoicing_reference",
+				read_only=1,
+				fetch_from="customer.fiscal_code",
+			),
+			dict(
+				fieldname="type_of_document",
+				label="Type of Document",
+				fieldtype="Select",
+				insert_after="customer_fiscal_code",
+				options="\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27",
+			),
 		],
-		'Purchase Taxes and Charges': [
-			dict(fieldname='tax_rate', label='Tax Rate',
-				fieldtype='Data', insert_after='parenttype', print_hide=1, read_only=0
-				)
+		"Purchase Invoice Item": invoice_item_fields,
+		"Sales Order Item": invoice_item_fields,
+		"Delivery Note Item": invoice_item_fields,
+		"Sales Invoice Item": invoice_item_fields + customer_po_fields,
+		"Quotation Item": invoice_item_fields,
+		"Purchase Order Item": invoice_item_fields,
+		"Purchase Receipt Item": invoice_item_fields,
+		"Supplier Quotation Item": invoice_item_fields,
+		"Address": [
+			dict(
+				fieldname="country_code",
+				label="Country Code",
+				fieldtype="Data",
+				insert_after="country",
+				print_hide=1,
+				read_only=0,
+				fetch_from="country.code",
+			),
+			dict(
+				fieldname="state_code",
+				label="State Code",
+				fieldtype="Data",
+				insert_after="state",
+				print_hide=1,
+			),
 		],
-		'Supplier': [
-			dict(fieldname='fiscal_code', label='Fiscal Code',
-				fieldtype='Data', insert_after='tax_id', print_hide=1, read_only=1
-				),
-			dict(fieldname='fiscal_regime', label='Fiscal Regime',
-				fieldtype='Select', insert_after='fiscal_code', print_hide=1, read_only=1,
-				options= "\nRF01\nRF02\nRF04\nRF05\nRF06\nRF07\nRF08\nRF09\nRF10\nRF11\nRF12\nRF13\nRF14\nRF15\nRF16\nRF17\nRF18\nRF19"
-				)
-		]
+		"Purchase Invoice": [
+			dict(
+				fieldname="document_type",
+				label="Document Type",
+				fieldtype="Data",
+				insert_after="company",
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="destination_code",
+				label="Destination Code",
+				fieldtype="Data",
+				insert_after="company",
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="imported_grand_total",
+				label="Imported Grand Total",
+				fieldtype="Data",
+				insert_after="update_auto_repeat_reference",
+				print_hide=1,
+				read_only=1,
+			),
+		],
+		"Purchase Taxes and Charges": [
+			dict(
+				fieldname="tax_rate",
+				label="Tax Rate",
+				fieldtype="Data",
+				insert_after="parenttype",
+				print_hide=1,
+				read_only=0,
+			)
+		],
+		"Supplier": [
+			dict(
+				fieldname="fiscal_code",
+				label="Fiscal Code",
+				fieldtype="Data",
+				insert_after="tax_id",
+				print_hide=1,
+				read_only=1,
+			),
+			dict(
+				fieldname="fiscal_regime",
+				label="Fiscal Regime",
+				fieldtype="Select",
+				insert_after="fiscal_code",
+				print_hide=1,
+				read_only=1,
+				options="\nRF01\nRF02\nRF04\nRF05\nRF06\nRF07\nRF08\nRF09\nRF10\nRF11\nRF12\nRF13\nRF14\nRF15\nRF16\nRF17\nRF18\nRF19",
+			),
+		],
 	}
 
-	create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch, update=update)
+	create_custom_fields(custom_fields, ignore_validate=frappe.flags.in_patch, update=update)
+
 
 def setup_report():
-	report_name = 'Electronic Invoice Register'
+	report_name = "Electronic Invoice Register"
 	frappe.db.set_value("Report", report_name, "disabled", 0)
 
-	if not frappe.db.get_value('Custom Role', dict(report=report_name)):
-		frappe.get_doc(dict(
-			doctype='Custom Role',
-			report=report_name,
-			roles= [
-				dict(role='Accounts User'),
-				dict(role='Accounts Manager')
-			]
-		)).insert()
+	if not frappe.db.get_value("Custom Role", dict(report=report_name)):
+		frappe.get_doc(
+			dict(
+				doctype="Custom Role",
+				report=report_name,
+				roles=[dict(role="Accounts User"), dict(role="Accounts Manager")],
+			)
+		).insert()
+
 
 def add_permissions():
-	doctype = 'Import Supplier Invoice'
-	add_permission(doctype, 'All', 0)
+	doctype = "Import Supplier Invoice"
+	add_permission(doctype, "All", 0)
 
-	for role in ('Accounts Manager', 'Accounts User','Purchase User', 'Auditor'):
+	for role in ("Accounts Manager", "Accounts User", "Purchase User", "Auditor"):
 		add_permission(doctype, role, 0)
-		update_permission_property(doctype, role, 0, 'print', 1)
-		update_permission_property(doctype, role, 0, 'report', 1)
+		update_permission_property(doctype, role, 0, "print", 1)
+		update_permission_property(doctype, role, 0, "report", 1)
 
-		if role in ('Accounts Manager', 'Accounts User'):
-			update_permission_property(doctype, role, 0, 'write', 1)
-			update_permission_property(doctype, role, 0, 'create', 1)
+		if role in ("Accounts Manager", "Accounts User"):
+			update_permission_property(doctype, role, 0, "write", 1)
+			update_permission_property(doctype, role, 0, "create", 1)
 
-	update_permission_property(doctype, 'Accounts Manager', 0, 'delete', 1)
-	add_permission(doctype, 'Accounts Manager', 1)
-	update_permission_property(doctype, 'Accounts Manager', 1, 'write', 1)
-	update_permission_property(doctype, 'Accounts Manager', 1, 'create', 1)
+	update_permission_property(doctype, "Accounts Manager", 0, "delete", 1)
+	add_permission(doctype, "Accounts Manager", 1)
+	update_permission_property(doctype, "Accounts Manager", 1, "write", 1)
+	update_permission_property(doctype, "Accounts Manager", 1, "create", 1)
diff --git a/erpnext/regional/italy/utils.py b/erpnext/regional/italy/utils.py
index c82557b..f5b2e2d 100644
--- a/erpnext/regional/italy/utils.py
+++ b/erpnext/regional/italy/utils.py
@@ -11,41 +11,41 @@
 
 
 def update_itemised_tax_data(doc):
-	if not doc.taxes: return
+	if not doc.taxes:
+		return
 
-	if doc.doctype == "Purchase Invoice": return
+	if doc.doctype == "Purchase Invoice":
+		return
 
 	itemised_tax = get_itemised_tax(doc.taxes)
 
 	for row in doc.items:
 		tax_rate = 0.0
 		if itemised_tax.get(row.item_code):
-			tax_rate = sum([tax.get('tax_rate', 0) for d, tax in itemised_tax.get(row.item_code).items()])
+			tax_rate = sum([tax.get("tax_rate", 0) for d, tax in itemised_tax.get(row.item_code).items()])
 
 		row.tax_rate = flt(tax_rate, row.precision("tax_rate"))
 		row.tax_amount = flt((row.net_amount * tax_rate) / 100, row.precision("net_amount"))
 		row.total_amount = flt((row.net_amount + row.tax_amount), row.precision("total_amount"))
 
+
 @frappe.whitelist()
 def export_invoices(filters=None):
-	frappe.has_permission('Sales Invoice', throw=True)
+	frappe.has_permission("Sales Invoice", throw=True)
 
 	invoices = frappe.get_all(
-		"Sales Invoice",
-		filters=get_conditions(filters),
-		fields=["name", "company_tax_id"]
+		"Sales Invoice", filters=get_conditions(filters), fields=["name", "company_tax_id"]
 	)
 
 	attachments = get_e_invoice_attachments(invoices)
 
-	zip_filename = "{0}-einvoices.zip".format(
-		frappe.utils.get_datetime().strftime("%Y%m%d_%H%M%S"))
+	zip_filename = "{0}-einvoices.zip".format(frappe.utils.get_datetime().strftime("%Y%m%d_%H%M%S"))
 
 	download_zip(attachments, zip_filename)
 
 
 def prepare_invoice(invoice, progressive_number):
-	#set company information
+	# set company information
 	company = frappe.get_doc("Company", invoice.company)
 
 	invoice.progressive_number = progressive_number
@@ -54,15 +54,17 @@
 	company_address = frappe.get_doc("Address", invoice.company_address)
 	invoice.company_address_data = company_address
 
-	#Set invoice type
+	# Set invoice type
 	if not invoice.type_of_document:
 		if invoice.is_return and invoice.return_against:
-			invoice.type_of_document = "TD04" #Credit Note (Nota di Credito)
-			invoice.return_against_unamended =  get_unamended_name(frappe.get_doc("Sales Invoice", invoice.return_against))
+			invoice.type_of_document = "TD04"  # Credit Note (Nota di Credito)
+			invoice.return_against_unamended = get_unamended_name(
+				frappe.get_doc("Sales Invoice", invoice.return_against)
+			)
 		else:
-			invoice.type_of_document = "TD01" #Sales Invoice (Fattura)
+			invoice.type_of_document = "TD01"  # Sales Invoice (Fattura)
 
-	#set customer information
+	# set customer information
 	invoice.customer_data = frappe.get_doc("Customer", invoice.customer)
 	customer_address = frappe.get_doc("Address", invoice.customer_address)
 	invoice.customer_address_data = customer_address
@@ -79,8 +81,10 @@
 	tax_data = get_invoice_summary(invoice.e_invoice_items, invoice.taxes)
 	invoice.tax_data = tax_data
 
-	#Check if stamp duty (Bollo) of 2 EUR exists.
-	stamp_duty_charge_row = next((tax for tax in invoice.taxes if tax.charge_type == "Actual" and tax.tax_amount == 2.0 ), None)
+	# Check if stamp duty (Bollo) of 2 EUR exists.
+	stamp_duty_charge_row = next(
+		(tax for tax in invoice.taxes if tax.charge_type == "Actual" and tax.tax_amount == 2.0), None
+	)
 	if stamp_duty_charge_row:
 		invoice.stamp_duty = stamp_duty_charge_row.tax_amount
 
@@ -90,24 +94,28 @@
 
 	customer_po_data = {}
 	for d in invoice.e_invoice_items:
-		if (d.customer_po_no and d.customer_po_date
-			and d.customer_po_no not in customer_po_data):
+		if d.customer_po_no and d.customer_po_date and d.customer_po_no not in customer_po_data:
 			customer_po_data[d.customer_po_no] = d.customer_po_date
 
 	invoice.customer_po_data = customer_po_data
 
 	return invoice
 
+
 def get_conditions(filters):
 	filters = json.loads(filters)
 
 	conditions = {"docstatus": 1, "company_tax_id": ("!=", "")}
 
-	if filters.get("company"): conditions["company"] = filters["company"]
-	if filters.get("customer"): conditions["customer"] =  filters["customer"]
+	if filters.get("company"):
+		conditions["company"] = filters["company"]
+	if filters.get("customer"):
+		conditions["customer"] = filters["customer"]
 
-	if filters.get("from_date"): conditions["posting_date"] = (">=", filters["from_date"])
-	if filters.get("to_date"): conditions["posting_date"] = ("<=", filters["to_date"])
+	if filters.get("from_date"):
+		conditions["posting_date"] = (">=", filters["from_date"])
+	if filters.get("to_date"):
+		conditions["posting_date"] = ("<=", filters["to_date"])
 
 	if filters.get("from_date") and filters.get("to_date"):
 		conditions["posting_date"] = ("between", [filters.get("from_date"), filters.get("to_date")])
@@ -119,10 +127,9 @@
 	import zipfile
 
 	zip_stream = io.BytesIO()
-	with zipfile.ZipFile(zip_stream, 'w', zipfile.ZIP_DEFLATED) as zip_file:
+	with zipfile.ZipFile(zip_stream, "w", zipfile.ZIP_DEFLATED) as zip_file:
 		for file in files:
-			file_path = frappe.utils.get_files_path(
-				file.file_name, is_private=file.is_private)
+			file_path = frappe.utils.get_files_path(file.file_name, is_private=file.is_private)
 
 			zip_file.write(file_path, arcname=file.file_name)
 
@@ -131,20 +138,21 @@
 	frappe.local.response.type = "download"
 	zip_stream.close()
 
+
 def get_invoice_summary(items, taxes):
 	summary_data = frappe._dict()
 	for tax in taxes:
-		#Include only VAT charges.
+		# Include only VAT charges.
 		if tax.charge_type == "Actual":
 			continue
 
-		#Charges to appear as items in the e-invoice.
+		# Charges to appear as items in the e-invoice.
 		if tax.charge_type in ["On Previous Row Total", "On Previous Row Amount"]:
 			reference_row = next((row for row in taxes if row.idx == int(tax.row_id or 0)), None)
 			if reference_row:
 				items.append(
 					frappe._dict(
-						idx=len(items)+1,
+						idx=len(items) + 1,
 						item_code=reference_row.description,
 						item_name=reference_row.description,
 						description=reference_row.description,
@@ -157,11 +165,11 @@
 						net_amount=reference_row.tax_amount,
 						taxable_amount=reference_row.tax_amount,
 						item_tax_rate={tax.account_head: tax.rate},
-						charges=True
+						charges=True,
 					)
 				)
 
-		#Check item tax rates if tax rate is zero.
+		# Check item tax rates if tax rate is zero.
 		if tax.rate == 0:
 			for item in items:
 				item_tax_rate = item.item_tax_rate
@@ -171,8 +179,15 @@
 				if item_tax_rate and tax.account_head in item_tax_rate:
 					key = cstr(item_tax_rate[tax.account_head])
 					if key not in summary_data:
-						summary_data.setdefault(key, {"tax_amount": 0.0, "taxable_amount": 0.0,
-							"tax_exemption_reason": "", "tax_exemption_law": ""})
+						summary_data.setdefault(
+							key,
+							{
+								"tax_amount": 0.0,
+								"taxable_amount": 0.0,
+								"tax_exemption_reason": "",
+								"tax_exemption_law": "",
+							},
+						)
 
 					summary_data[key]["tax_amount"] += item.tax_amount
 					summary_data[key]["taxable_amount"] += item.net_amount
@@ -180,93 +195,138 @@
 						summary_data[key]["tax_exemption_reason"] = tax.tax_exemption_reason
 						summary_data[key]["tax_exemption_law"] = tax.tax_exemption_law
 
-			if summary_data.get("0.0") and tax.charge_type in ["On Previous Row Total",
-				"On Previous Row Amount"]:
+			if summary_data.get("0.0") and tax.charge_type in [
+				"On Previous Row Total",
+				"On Previous Row Amount",
+			]:
 				summary_data[key]["taxable_amount"] = tax.total
 
-			if summary_data == {}: #Implies that Zero VAT has not been set on any item.
-				summary_data.setdefault("0.0", {"tax_amount": 0.0, "taxable_amount": tax.total,
-					"tax_exemption_reason": tax.tax_exemption_reason, "tax_exemption_law": tax.tax_exemption_law})
+			if summary_data == {}:  # Implies that Zero VAT has not been set on any item.
+				summary_data.setdefault(
+					"0.0",
+					{
+						"tax_amount": 0.0,
+						"taxable_amount": tax.total,
+						"tax_exemption_reason": tax.tax_exemption_reason,
+						"tax_exemption_law": tax.tax_exemption_law,
+					},
+				)
 
 		else:
 			item_wise_tax_detail = json.loads(tax.item_wise_tax_detail)
-			for rate_item in [tax_item for tax_item in item_wise_tax_detail.items() if tax_item[1][0] == tax.rate]:
+			for rate_item in [
+				tax_item for tax_item in item_wise_tax_detail.items() if tax_item[1][0] == tax.rate
+			]:
 				key = cstr(tax.rate)
-				if not summary_data.get(key): summary_data.setdefault(key, {"tax_amount": 0.0, "taxable_amount": 0.0})
+				if not summary_data.get(key):
+					summary_data.setdefault(key, {"tax_amount": 0.0, "taxable_amount": 0.0})
 				summary_data[key]["tax_amount"] += rate_item[1][1]
-				summary_data[key]["taxable_amount"] += sum([item.net_amount for item in items if item.item_code == rate_item[0]])
+				summary_data[key]["taxable_amount"] += sum(
+					[item.net_amount for item in items if item.item_code == rate_item[0]]
+				)
 
 			for item in items:
 				key = cstr(tax.rate)
 				if item.get("charges"):
-					if not summary_data.get(key): summary_data.setdefault(key, {"taxable_amount": 0.0})
+					if not summary_data.get(key):
+						summary_data.setdefault(key, {"taxable_amount": 0.0})
 					summary_data[key]["taxable_amount"] += item.taxable_amount
 
 	return summary_data
 
-#Preflight for successful e-invoice export.
+
+# Preflight for successful e-invoice export.
 def sales_invoice_validate(doc):
-	#Validate company
-	if doc.doctype != 'Sales Invoice':
+	# Validate company
+	if doc.doctype != "Sales Invoice":
 		return
 
 	if not doc.company_address:
-		frappe.throw(_("Please set an Address on the Company '%s'" % doc.company), title=_("E-Invoicing Information Missing"))
+		frappe.throw(
+			_("Please set an Address on the Company '%s'" % doc.company),
+			title=_("E-Invoicing Information Missing"),
+		)
 	else:
 		validate_address(doc.company_address)
 
-	company_fiscal_regime = frappe.get_cached_value("Company", doc.company, 'fiscal_regime')
+	company_fiscal_regime = frappe.get_cached_value("Company", doc.company, "fiscal_regime")
 	if not company_fiscal_regime:
-		frappe.throw(_("Fiscal Regime is mandatory, kindly set the fiscal regime in the company {0}")
-			.format(doc.company))
+		frappe.throw(
+			_("Fiscal Regime is mandatory, kindly set the fiscal regime in the company {0}").format(
+				doc.company
+			)
+		)
 	else:
 		doc.company_fiscal_regime = company_fiscal_regime
 
-	doc.company_tax_id = frappe.get_cached_value("Company", doc.company, 'tax_id')
-	doc.company_fiscal_code = frappe.get_cached_value("Company", doc.company, 'fiscal_code')
+	doc.company_tax_id = frappe.get_cached_value("Company", doc.company, "tax_id")
+	doc.company_fiscal_code = frappe.get_cached_value("Company", doc.company, "fiscal_code")
 	if not doc.company_tax_id and not doc.company_fiscal_code:
-		frappe.throw(_("Please set either the Tax ID or Fiscal Code on Company '%s'" % doc.company), title=_("E-Invoicing Information Missing"))
+		frappe.throw(
+			_("Please set either the Tax ID or Fiscal Code on Company '%s'" % doc.company),
+			title=_("E-Invoicing Information Missing"),
+		)
 
-	#Validate customer details
+	# Validate customer details
 	customer = frappe.get_doc("Customer", doc.customer)
 
 	if customer.customer_type == "Individual":
 		doc.customer_fiscal_code = customer.fiscal_code
 		if not doc.customer_fiscal_code:
-			frappe.throw(_("Please set Fiscal Code for the customer '%s'" % doc.customer), title=_("E-Invoicing Information Missing"))
+			frappe.throw(
+				_("Please set Fiscal Code for the customer '%s'" % doc.customer),
+				title=_("E-Invoicing Information Missing"),
+			)
 	else:
 		if customer.is_public_administration:
 			doc.customer_fiscal_code = customer.fiscal_code
 			if not doc.customer_fiscal_code:
-				frappe.throw(_("Please set Fiscal Code for the public administration '%s'" % doc.customer), title=_("E-Invoicing Information Missing"))
+				frappe.throw(
+					_("Please set Fiscal Code for the public administration '%s'" % doc.customer),
+					title=_("E-Invoicing Information Missing"),
+				)
 		else:
 			doc.tax_id = customer.tax_id
 			if not doc.tax_id:
-				frappe.throw(_("Please set Tax ID for the customer '%s'" % doc.customer), title=_("E-Invoicing Information Missing"))
+				frappe.throw(
+					_("Please set Tax ID for the customer '%s'" % doc.customer),
+					title=_("E-Invoicing Information Missing"),
+				)
 
 	if not doc.customer_address:
-	 	frappe.throw(_("Please set the Customer Address"), title=_("E-Invoicing Information Missing"))
+		frappe.throw(_("Please set the Customer Address"), title=_("E-Invoicing Information Missing"))
 	else:
 		validate_address(doc.customer_address)
 
 	if not len(doc.taxes):
-		frappe.throw(_("Please set at least one row in the Taxes and Charges Table"), title=_("E-Invoicing Information Missing"))
+		frappe.throw(
+			_("Please set at least one row in the Taxes and Charges Table"),
+			title=_("E-Invoicing Information Missing"),
+		)
 	else:
 		for row in doc.taxes:
 			if row.rate == 0 and row.tax_amount == 0 and not row.tax_exemption_reason:
-				frappe.throw(_("Row {0}: Please set at Tax Exemption Reason in Sales Taxes and Charges").format(row.idx),
-					title=_("E-Invoicing Information Missing"))
+				frappe.throw(
+					_("Row {0}: Please set at Tax Exemption Reason in Sales Taxes and Charges").format(row.idx),
+					title=_("E-Invoicing Information Missing"),
+				)
 
 	for schedule in doc.payment_schedule:
 		if schedule.mode_of_payment and not schedule.mode_of_payment_code:
-			schedule.mode_of_payment_code = frappe.get_cached_value('Mode of Payment',
-				schedule.mode_of_payment, 'mode_of_payment_code')
+			schedule.mode_of_payment_code = frappe.get_cached_value(
+				"Mode of Payment", schedule.mode_of_payment, "mode_of_payment_code"
+			)
 
-#Ensure payment details are valid for e-invoice.
+
+# Ensure payment details are valid for e-invoice.
 def sales_invoice_on_submit(doc, method):
-	#Validate payment details
-	if get_company_country(doc.company) not in ['Italy',
-		'Italia', 'Italian Republic', 'Repubblica Italiana']:
+	# Validate payment details
+	if get_company_country(doc.company) not in [
+		"Italy",
+		"Italia",
+		"Italian Republic",
+		"Repubblica Italiana",
+	]:
 		return
 
 	if not len(doc.payment_schedule):
@@ -274,38 +334,53 @@
 	else:
 		for schedule in doc.payment_schedule:
 			if not schedule.mode_of_payment:
-				frappe.throw(_("Row {0}: Please set the Mode of Payment in Payment Schedule").format(schedule.idx),
-					title=_("E-Invoicing Information Missing"))
-			elif not frappe.db.get_value("Mode of Payment", schedule.mode_of_payment, "mode_of_payment_code"):
-				frappe.throw(_("Row {0}: Please set the correct code on Mode of Payment {1}").format(schedule.idx, schedule.mode_of_payment),
-					title=_("E-Invoicing Information Missing"))
+				frappe.throw(
+					_("Row {0}: Please set the Mode of Payment in Payment Schedule").format(schedule.idx),
+					title=_("E-Invoicing Information Missing"),
+				)
+			elif not frappe.db.get_value(
+				"Mode of Payment", schedule.mode_of_payment, "mode_of_payment_code"
+			):
+				frappe.throw(
+					_("Row {0}: Please set the correct code on Mode of Payment {1}").format(
+						schedule.idx, schedule.mode_of_payment
+					),
+					title=_("E-Invoicing Information Missing"),
+				)
 
 	prepare_and_attach_invoice(doc)
 
+
 def prepare_and_attach_invoice(doc, replace=False):
 	progressive_name, progressive_number = get_progressive_name_and_number(doc, replace)
 
 	invoice = prepare_invoice(doc, progressive_number)
 	item_meta = frappe.get_meta("Sales Invoice Item")
 
-	invoice_xml = frappe.render_template('erpnext/regional/italy/e-invoice.xml',
-		context={"doc": invoice, "item_meta": item_meta}, is_path=True)
+	invoice_xml = frappe.render_template(
+		"erpnext/regional/italy/e-invoice.xml",
+		context={"doc": invoice, "item_meta": item_meta},
+		is_path=True,
+	)
 
 	invoice_xml = invoice_xml.replace("&", "&amp;")
 
 	xml_filename = progressive_name + ".xml"
 
-	_file = frappe.get_doc({
-		"doctype": "File",
-		"file_name": xml_filename,
-		"attached_to_doctype": doc.doctype,
-		"attached_to_name": doc.name,
-		"is_private": True,
-		"content": invoice_xml
-	})
+	_file = frappe.get_doc(
+		{
+			"doctype": "File",
+			"file_name": xml_filename,
+			"attached_to_doctype": doc.doctype,
+			"attached_to_name": doc.name,
+			"is_private": True,
+			"content": invoice_xml,
+		}
+	)
 	_file.save()
 	return _file
 
+
 @frappe.whitelist()
 def generate_single_invoice(docname):
 	doc = frappe.get_doc("Sales Invoice", docname)
@@ -314,17 +389,24 @@
 	e_invoice = prepare_and_attach_invoice(doc, True)
 	return e_invoice.file_url
 
+
 # Delete e-invoice attachment on cancel.
 def sales_invoice_on_cancel(doc, method):
-	if get_company_country(doc.company) not in ['Italy',
-		'Italia', 'Italian Republic', 'Repubblica Italiana']:
+	if get_company_country(doc.company) not in [
+		"Italy",
+		"Italia",
+		"Italian Republic",
+		"Repubblica Italiana",
+	]:
 		return
 
 	for attachment in get_e_invoice_attachments(doc):
 		remove_file(attachment.name, attached_to_doctype=doc.doctype, attached_to_name=doc.name)
 
+
 def get_company_country(company):
-	return frappe.get_cached_value('Company', company, 'country')
+	return frappe.get_cached_value("Company", company, "country")
+
 
 def get_e_invoice_attachments(invoices):
 	if not isinstance(invoices, list):
@@ -338,16 +420,14 @@
 			invoice.company_tax_id
 			if invoice.company_tax_id.startswith("IT")
 			else "IT" + invoice.company_tax_id
-		) for invoice in invoices
+		)
+		for invoice in invoices
 	}
 
 	attachments = frappe.get_all(
 		"File",
 		fields=("name", "file_name", "attached_to_name", "is_private"),
-		filters= {
-			"attached_to_name": ('in', tax_id_map),
-			"attached_to_doctype": 'Sales Invoice'
-		}
+		filters={"attached_to_name": ("in", tax_id_map), "attached_to_doctype": "Sales Invoice"},
 	)
 
 	out = []
@@ -355,21 +435,24 @@
 		if (
 			attachment.file_name
 			and attachment.file_name.endswith(".xml")
-			and attachment.file_name.startswith(
-				tax_id_map.get(attachment.attached_to_name))
+			and attachment.file_name.startswith(tax_id_map.get(attachment.attached_to_name))
 		):
 			out.append(attachment)
 
 	return out
 
+
 def validate_address(address_name):
 	fields = ["pincode", "city", "country_code"]
 	data = frappe.get_cached_value("Address", address_name, fields, as_dict=1) or {}
 
 	for field in fields:
 		if not data.get(field):
-			frappe.throw(_("Please set {0} for address {1}").format(field.replace('-',''), address_name),
-				title=_("E-Invoicing Information Missing"))
+			frappe.throw(
+				_("Please set {0} for address {1}").format(field.replace("-", ""), address_name),
+				title=_("E-Invoicing Information Missing"),
+			)
+
 
 def get_unamended_name(doc):
 	attributes = ["naming_series", "amended_from"]
@@ -382,6 +465,7 @@
 	else:
 		return doc.name
 
+
 def get_progressive_name_and_number(doc, replace=False):
 	if replace:
 		for attachment in get_e_invoice_attachments(doc):
@@ -389,24 +473,30 @@
 			filename = attachment.file_name.split(".xml")[0]
 			return filename, filename.split("_")[1]
 
-	company_tax_id = doc.company_tax_id if doc.company_tax_id.startswith("IT") else "IT" + doc.company_tax_id
+	company_tax_id = (
+		doc.company_tax_id if doc.company_tax_id.startswith("IT") else "IT" + doc.company_tax_id
+	)
 	progressive_name = frappe.model.naming.make_autoname(company_tax_id + "_.#####")
 	progressive_number = progressive_name.split("_")[1]
 
 	return progressive_name, progressive_number
 
+
 def set_state_code(doc, method):
-	if doc.get('country_code'):
+	if doc.get("country_code"):
 		doc.country_code = doc.country_code.upper()
 
-	if not doc.get('state'):
+	if not doc.get("state"):
 		return
 
-	if not (hasattr(doc, "state_code") and doc.country in ["Italy", "Italia", "Italian Republic", "Repubblica Italiana"]):
+	if not (
+		hasattr(doc, "state_code")
+		and doc.country in ["Italy", "Italia", "Italian Republic", "Repubblica Italiana"]
+	):
 		return
 
-	state_codes_lower = {key.lower():value for key,value in state_codes.items()}
+	state_codes_lower = {key.lower(): value for key, value in state_codes.items()}
 
-	state = doc.get('state','').lower()
+	state = doc.get("state", "").lower()
 	if state_codes_lower.get(state):
 		doc.state_code = state_codes_lower.get(state)
diff --git a/erpnext/regional/report/datev/datev.py b/erpnext/regional/report/datev/datev.py
index 92a10c2..2d888a8 100644
--- a/erpnext/regional/report/datev/datev.py
+++ b/erpnext/regional/report/datev/datev.py
@@ -25,134 +25,104 @@
 		"label": "Umsatz (ohne Soll/Haben-Kz)",
 		"fieldname": "Umsatz (ohne Soll/Haben-Kz)",
 		"fieldtype": "Currency",
-		"width": 100
+		"width": 100,
 	},
 	{
 		"label": "Soll/Haben-Kennzeichen",
 		"fieldname": "Soll/Haben-Kennzeichen",
 		"fieldtype": "Data",
-		"width": 100
+		"width": 100,
 	},
-	{
-		"label": "Konto",
-		"fieldname": "Konto",
-		"fieldtype": "Data",
-		"width": 100
-	},
+	{"label": "Konto", "fieldname": "Konto", "fieldtype": "Data", "width": 100},
 	{
 		"label": "Gegenkonto (ohne BU-Schlüssel)",
 		"fieldname": "Gegenkonto (ohne BU-Schlüssel)",
 		"fieldtype": "Data",
-		"width": 100
+		"width": 100,
 	},
-	{
-		"label": "BU-Schlüssel",
-		"fieldname": "BU-Schlüssel",
-		"fieldtype": "Data",
-		"width": 100
-	},
-	{
-		"label": "Belegdatum",
-		"fieldname": "Belegdatum",
-		"fieldtype": "Date",
-		"width": 100
-	},
-	{
-		"label": "Belegfeld 1",
-		"fieldname": "Belegfeld 1",
-		"fieldtype": "Data",
-		"width": 150
-	},
-	{
-		"label": "Buchungstext",
-		"fieldname": "Buchungstext",
-		"fieldtype": "Text",
-		"width": 300
-	},
+	{"label": "BU-Schlüssel", "fieldname": "BU-Schlüssel", "fieldtype": "Data", "width": 100},
+	{"label": "Belegdatum", "fieldname": "Belegdatum", "fieldtype": "Date", "width": 100},
+	{"label": "Belegfeld 1", "fieldname": "Belegfeld 1", "fieldtype": "Data", "width": 150},
+	{"label": "Buchungstext", "fieldname": "Buchungstext", "fieldtype": "Text", "width": 300},
 	{
 		"label": "Beleginfo - Art 1",
 		"fieldname": "Beleginfo - Art 1",
 		"fieldtype": "Link",
 		"options": "DocType",
-		"width": 100
+		"width": 100,
 	},
 	{
 		"label": "Beleginfo - Inhalt 1",
 		"fieldname": "Beleginfo - Inhalt 1",
 		"fieldtype": "Dynamic Link",
 		"options": "Beleginfo - Art 1",
-		"width": 150
+		"width": 150,
 	},
 	{
 		"label": "Beleginfo - Art 2",
 		"fieldname": "Beleginfo - Art 2",
 		"fieldtype": "Link",
 		"options": "DocType",
-		"width": 100
+		"width": 100,
 	},
 	{
 		"label": "Beleginfo - Inhalt 2",
 		"fieldname": "Beleginfo - Inhalt 2",
 		"fieldtype": "Dynamic Link",
 		"options": "Beleginfo - Art 2",
-		"width": 150
+		"width": 150,
 	},
 	{
 		"label": "Beleginfo - Art 3",
 		"fieldname": "Beleginfo - Art 3",
 		"fieldtype": "Link",
 		"options": "DocType",
-		"width": 100
+		"width": 100,
 	},
 	{
 		"label": "Beleginfo - Inhalt 3",
 		"fieldname": "Beleginfo - Inhalt 3",
 		"fieldtype": "Dynamic Link",
 		"options": "Beleginfo - Art 3",
-		"width": 150
+		"width": 150,
 	},
 	{
 		"label": "Beleginfo - Art 4",
 		"fieldname": "Beleginfo - Art 4",
 		"fieldtype": "Data",
-		"width": 100
+		"width": 100,
 	},
 	{
 		"label": "Beleginfo - Inhalt 4",
 		"fieldname": "Beleginfo - Inhalt 4",
 		"fieldtype": "Data",
-		"width": 150
+		"width": 150,
 	},
 	{
 		"label": "Beleginfo - Art 5",
 		"fieldname": "Beleginfo - Art 5",
 		"fieldtype": "Data",
-		"width": 150
+		"width": 150,
 	},
 	{
 		"label": "Beleginfo - Inhalt 5",
 		"fieldname": "Beleginfo - Inhalt 5",
 		"fieldtype": "Data",
-		"width": 100
+		"width": 100,
 	},
 	{
 		"label": "Beleginfo - Art 6",
 		"fieldname": "Beleginfo - Art 6",
 		"fieldtype": "Data",
-		"width": 150
+		"width": 150,
 	},
 	{
 		"label": "Beleginfo - Inhalt 6",
 		"fieldname": "Beleginfo - Inhalt 6",
 		"fieldtype": "Date",
-		"width": 100
+		"width": 100,
 	},
-	{
-		"label": "Fälligkeit",
-		"fieldname": "Fälligkeit",
-		"fieldtype": "Date",
-		"width": 100
-	}
+	{"label": "Fälligkeit", "fieldname": "Fälligkeit", "fieldtype": "Date", "width": 100},
 ]
 
 
@@ -160,8 +130,8 @@
 	"""Entry point for frappe."""
 	data = []
 	if filters and validate(filters):
-		fn = 'temporary_against_account_number'
-		filters[fn] = frappe.get_value('DATEV Settings', filters.get('company'), fn)
+		fn = "temporary_against_account_number"
+		filters[fn] = frappe.get_value("DATEV Settings", filters.get("company"), fn)
 		data = get_transactions(filters, as_dict=0)
 
 	return COLUMNS, data
@@ -169,23 +139,23 @@
 
 def validate(filters):
 	"""Make sure all mandatory filters and settings are present."""
-	company = filters.get('company')
+	company = filters.get("company")
 	if not company:
-		frappe.throw(_('<b>Company</b> is a mandatory filter.'))
+		frappe.throw(_("<b>Company</b> is a mandatory filter."))
 
-	from_date = filters.get('from_date')
+	from_date = filters.get("from_date")
 	if not from_date:
-		frappe.throw(_('<b>From Date</b> is a mandatory filter.'))
+		frappe.throw(_("<b>From Date</b> is a mandatory filter."))
 
-	to_date = filters.get('to_date')
+	to_date = filters.get("to_date")
 	if not to_date:
-		frappe.throw(_('<b>To Date</b> is a mandatory filter.'))
+		frappe.throw(_("<b>To Date</b> is a mandatory filter."))
 
 	validate_fiscal_year(from_date, to_date, company)
 
-	if not frappe.db.exists('DATEV Settings', filters.get('company')):
-		msg = 'Please create DATEV Settings for Company {}'.format(filters.get('company'))
-		frappe.log_error(msg, title='DATEV Settings missing')
+	if not frappe.db.exists("DATEV Settings", filters.get("company")):
+		msg = "Please create DATEV Settings for Company {}".format(filters.get("company"))
+		frappe.log_error(msg, title="DATEV Settings missing")
 		return False
 
 	return True
@@ -195,7 +165,7 @@
 	from_fiscal_year = get_fiscal_year(date=from_date, company=company)
 	to_fiscal_year = get_fiscal_year(date=to_date, company=company)
 	if from_fiscal_year != to_fiscal_year:
-		frappe.throw(_('Dates {} and {} are not in the same fiscal year.').format(from_date, to_date))
+		frappe.throw(_("Dates {} and {} are not in the same fiscal year.").format(from_date, to_date))
 
 
 def get_transactions(filters, as_dict=1):
@@ -211,7 +181,7 @@
 		# specific query methods for some voucher types
 		"Payment Entry": get_payment_entry_params,
 		"Sales Invoice": get_sales_invoice_params,
-		"Purchase Invoice": get_purchase_invoice_params
+		"Purchase Invoice": get_purchase_invoice_params,
 	}
 
 	only_voucher_type = filters.get("voucher_type")
@@ -307,7 +277,9 @@
 
 	if filters.get("exclude_voucher_types"):
 		# exclude voucher types that are queried by a dedicated method
-		exclude = "({})".format(', '.join("'{}'".format(key) for key in filters.get("exclude_voucher_types")))
+		exclude = "({})".format(
+			", ".join("'{}'".format(key) for key in filters.get("exclude_voucher_types"))
+		)
 		extra_filters = "AND gl.voucher_type NOT IN {}".format(exclude)
 
 	# if voucher type filter is set, allow only this type
@@ -379,10 +351,8 @@
 		{extra_filters}
 
 		ORDER BY 'Belegdatum', gl.voucher_no""".format(
-			extra_fields=extra_fields,
-			extra_joins=extra_joins,
-			extra_filters=extra_filters
-		)
+		extra_fields=extra_fields, extra_joins=extra_joins, extra_filters=extra_filters
+	)
 
 	gl_entries = frappe.db.sql(query, filters, as_dict=as_dict)
 
@@ -396,7 +366,8 @@
 	Arguments:
 	filters -- dict of filters to be passed to the sql query
 	"""
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 
 			par.debtor_creditor_number as 'Konto',
@@ -448,7 +419,10 @@
 			on country.name = adr.country
 
 		WHERE adr.is_primary_address = '1'
-		""", filters, as_dict=1)
+		""",
+		filters,
+		as_dict=1,
+	)
 
 
 def get_suppliers(filters):
@@ -458,7 +432,8 @@
 	Arguments:
 	filters -- dict of filters to be passed to the sql query
 	"""
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 
 			par.debtor_creditor_number as 'Konto',
@@ -511,11 +486,15 @@
 			on country.name = adr.country
 
 		WHERE adr.is_primary_address = '1'
-		""", filters, as_dict=1)
+		""",
+		filters,
+		as_dict=1,
+	)
 
 
 def get_account_names(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 
 			account_number as 'Konto',
@@ -526,7 +505,10 @@
 		WHERE company = %(company)s
 		AND is_group = 0
 		AND account_number != ''
-	""", filters, as_dict=1)
+	""",
+		filters,
+		as_dict=1,
+	)
 
 
 @frappe.whitelist()
@@ -546,40 +528,43 @@
 		filters = json.loads(filters)
 
 	validate(filters)
-	company = filters.get('company')
+	company = filters.get("company")
 
-	fiscal_year = get_fiscal_year(date=filters.get('from_date'), company=company)
-	filters['fiscal_year_start'] = fiscal_year[1]
+	fiscal_year = get_fiscal_year(date=filters.get("from_date"), company=company)
+	filters["fiscal_year_start"] = fiscal_year[1]
 
 	# set chart of accounts used
-	coa = frappe.get_value('Company', company, 'chart_of_accounts')
-	filters['skr'] = '04' if 'SKR04' in coa else ('03' if 'SKR03' in coa else '')
+	coa = frappe.get_value("Company", company, "chart_of_accounts")
+	filters["skr"] = "04" if "SKR04" in coa else ("03" if "SKR03" in coa else "")
 
-	datev_settings = frappe.get_doc('DATEV Settings', company)
-	filters['account_number_length'] = datev_settings.account_number_length
-	filters['temporary_against_account_number'] = datev_settings.temporary_against_account_number
+	datev_settings = frappe.get_doc("DATEV Settings", company)
+	filters["account_number_length"] = datev_settings.account_number_length
+	filters["temporary_against_account_number"] = datev_settings.temporary_against_account_number
 
 	transactions = get_transactions(filters)
 	account_names = get_account_names(filters)
 	customers = get_customers(filters)
 	suppliers = get_suppliers(filters)
 
-	zip_name = '{} DATEV.zip'.format(frappe.utils.datetime.date.today())
-	zip_and_download(zip_name, [
-		{
-			'file_name': 'EXTF_Buchungsstapel.csv',
-			'csv_data': get_datev_csv(transactions, filters, csv_class=Transactions)
-		},
-		{
-			'file_name': 'EXTF_Kontenbeschriftungen.csv',
-			'csv_data': get_datev_csv(account_names, filters, csv_class=AccountNames)
-		},
-		{
-			'file_name': 'EXTF_Kunden.csv',
-			'csv_data': get_datev_csv(customers, filters, csv_class=DebtorsCreditors)
-		},
-		{
-			'file_name': 'EXTF_Lieferanten.csv',
-			'csv_data': get_datev_csv(suppliers, filters, csv_class=DebtorsCreditors)
-		},
-	])
+	zip_name = "{} DATEV.zip".format(frappe.utils.datetime.date.today())
+	zip_and_download(
+		zip_name,
+		[
+			{
+				"file_name": "EXTF_Buchungsstapel.csv",
+				"csv_data": get_datev_csv(transactions, filters, csv_class=Transactions),
+			},
+			{
+				"file_name": "EXTF_Kontenbeschriftungen.csv",
+				"csv_data": get_datev_csv(account_names, filters, csv_class=AccountNames),
+			},
+			{
+				"file_name": "EXTF_Kunden.csv",
+				"csv_data": get_datev_csv(customers, filters, csv_class=DebtorsCreditors),
+			},
+			{
+				"file_name": "EXTF_Lieferanten.csv",
+				"csv_data": get_datev_csv(suppliers, filters, csv_class=DebtorsCreditors),
+			},
+		],
+	)
diff --git a/erpnext/regional/report/datev/test_datev.py b/erpnext/regional/report/datev/test_datev.py
index 052fb2a..0df8c06 100644
--- a/erpnext/regional/report/datev/test_datev.py
+++ b/erpnext/regional/report/datev/test_datev.py
@@ -23,15 +23,17 @@
 
 def make_company(company_name, abbr):
 	if not frappe.db.exists("Company", company_name):
-		company = frappe.get_doc({
-			"doctype": "Company",
-			"company_name": company_name,
-			"abbr": abbr,
-			"default_currency": "EUR",
-			"country": "Germany",
-			"create_chart_of_accounts_based_on": "Standard Template",
-			"chart_of_accounts": "SKR04 mit Kontonummern"
-		})
+		company = frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": company_name,
+				"abbr": abbr,
+				"default_currency": "EUR",
+				"country": "Germany",
+				"create_chart_of_accounts_based_on": "Standard Template",
+				"chart_of_accounts": "SKR04 mit Kontonummern",
+			}
+		)
 		company.insert()
 	else:
 		company = frappe.get_doc("Company", company_name)
@@ -45,17 +47,20 @@
 	company.save()
 	return company
 
+
 def setup_fiscal_year():
 	fiscal_year = None
 	year = cstr(now_datetime().year)
 	if not frappe.db.get_value("Fiscal Year", {"year": year}, "name"):
 		try:
-			fiscal_year = frappe.get_doc({
-				"doctype": "Fiscal Year",
-				"year": year,
-				"year_start_date": "{0}-01-01".format(year),
-				"year_end_date": "{0}-12-31".format(year)
-			})
+			fiscal_year = frappe.get_doc(
+				{
+					"doctype": "Fiscal Year",
+					"year": year,
+					"year_start_date": "{0}-01-01".format(year),
+					"year_end_date": "{0}-12-31".format(year),
+				}
+			)
 			fiscal_year.insert()
 		except frappe.NameError:
 			pass
@@ -63,75 +68,78 @@
 	if fiscal_year:
 		fiscal_year.set_as_default()
 
+
 def make_customer_with_account(customer_name, company):
-	acc_name = frappe.db.get_value("Account", {
-			"account_name": customer_name,
-			"company": company.name
-		}, "name")
+	acc_name = frappe.db.get_value(
+		"Account", {"account_name": customer_name, "company": company.name}, "name"
+	)
 
 	if not acc_name:
-		acc = frappe.get_doc({
-			"doctype": "Account",
-			"parent_account": "1 - Forderungen aus Lieferungen und Leistungen - _TG",
-			"account_name": customer_name,
-			"company": company.name,
-			"account_type": "Receivable",
-			"account_number": "10001"
-		})
+		acc = frappe.get_doc(
+			{
+				"doctype": "Account",
+				"parent_account": "1 - Forderungen aus Lieferungen und Leistungen - _TG",
+				"account_name": customer_name,
+				"company": company.name,
+				"account_type": "Receivable",
+				"account_number": "10001",
+			}
+		)
 		acc.insert()
 		acc_name = acc.name
 
 	if not frappe.db.exists("Customer", customer_name):
-		customer = frappe.get_doc({
-			"doctype": "Customer",
-			"customer_name": customer_name,
-			"customer_type": "Company",
-			"accounts": [{
-				"company": company.name,
-				"account": acc_name
-			}]
-		})
+		customer = frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_name": customer_name,
+				"customer_type": "Company",
+				"accounts": [{"company": company.name, "account": acc_name}],
+			}
+		)
 		customer.insert()
 	else:
 		customer = frappe.get_doc("Customer", customer_name)
 
 	return customer
 
+
 def make_item(item_code, company):
-	warehouse_name = frappe.db.get_value("Warehouse", {
-			"warehouse_name": "Stores",
-			"company": company.name
-		}, "name")
+	warehouse_name = frappe.db.get_value(
+		"Warehouse", {"warehouse_name": "Stores", "company": company.name}, "name"
+	)
 
 	if not frappe.db.exists("Item", item_code):
-		item = frappe.get_doc({
-			"doctype": "Item",
-			"item_code": item_code,
-			"item_name": item_code,
-			"description": item_code,
-			"item_group": "All Item Groups",
-			"is_stock_item": 0,
-			"is_purchase_item": 0,
-			"is_customer_provided_item": 0,
-			"item_defaults": [{
-				"default_warehouse": warehouse_name,
-				"company": company.name
-			}]
-		})
+		item = frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": item_code,
+				"item_name": item_code,
+				"description": item_code,
+				"item_group": "All Item Groups",
+				"is_stock_item": 0,
+				"is_purchase_item": 0,
+				"is_customer_provided_item": 0,
+				"item_defaults": [{"default_warehouse": warehouse_name, "company": company.name}],
+			}
+		)
 		item.insert()
 	else:
 		item = frappe.get_doc("Item", item_code)
 	return item
 
+
 def make_datev_settings(company):
 	if not frappe.db.exists("DATEV Settings", company.name):
-		frappe.get_doc({
-			"doctype": "DATEV Settings",
-			"client": company.name,
-			"client_number": "12345",
-			"consultant_number": "67890",
-			"temporary_against_account_number": "9999"
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "DATEV Settings",
+				"client": company.name,
+				"client_number": "12345",
+				"consultant_number": "67890",
+				"temporary_against_account_number": "9999",
+			}
+		).insert()
 
 
 class TestDatev(TestCase):
@@ -142,27 +150,24 @@
 			"company": self.company.name,
 			"from_date": today(),
 			"to_date": today(),
-			"temporary_against_account_number": "9999"
+			"temporary_against_account_number": "9999",
 		}
 
 		make_datev_settings(self.company)
 		item = make_item("_Test Item", self.company)
 		setup_fiscal_year()
 
-		warehouse = frappe.db.get_value("Item Default", {
-				"parent": item.name,
-				"company": self.company.name
-			}, "default_warehouse")
+		warehouse = frappe.db.get_value(
+			"Item Default", {"parent": item.name, "company": self.company.name}, "default_warehouse"
+		)
 
-		income_account = frappe.db.get_value("Account", {
-				"account_number": "4200",
-				"company": self.company.name
-			}, "name")
+		income_account = frappe.db.get_value(
+			"Account", {"account_number": "4200", "company": self.company.name}, "name"
+		)
 
-		tax_account = frappe.db.get_value("Account", {
-				"account_number": "3806",
-				"company": self.company.name
-			}, "name")
+		tax_account = frappe.db.get_value(
+			"Account", {"account_number": "3806", "company": self.company.name}, "name"
+		)
 
 		si = create_sales_invoice(
 			company=self.company.name,
@@ -174,16 +179,19 @@
 			cost_center=self.company.cost_center,
 			warehouse=warehouse,
 			item=item.name,
-			do_not_save=1
+			do_not_save=1,
 		)
 
-		si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": tax_account,
-			"description": "Umsatzsteuer 19 %",
-			"rate": 19,
-			"cost_center": self.company.cost_center
-		})
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": tax_account,
+				"description": "Umsatzsteuer 19 %",
+				"rate": 19,
+				"cost_center": self.company.cost_center,
+			},
+		)
 
 		si.cost_center = self.company.cost_center
 
@@ -219,16 +227,18 @@
 		self.assertTrue(DebtorsCreditors.DATA_CATEGORY in get_header(self.filters, DebtorsCreditors))
 
 	def test_csv(self):
-		test_data = [{
-			"Umsatz (ohne Soll/Haben-Kz)": 100,
-			"Soll/Haben-Kennzeichen": "H",
-			"Kontonummer": "4200",
-			"Gegenkonto (ohne BU-Schlüssel)": "10000",
-			"Belegdatum": today(),
-			"Buchungstext": "No remark",
-			"Beleginfo - Art 1": "Sales Invoice",
-			"Beleginfo - Inhalt 1": "SINV-0001"
-		}]
+		test_data = [
+			{
+				"Umsatz (ohne Soll/Haben-Kz)": 100,
+				"Soll/Haben-Kennzeichen": "H",
+				"Kontonummer": "4200",
+				"Gegenkonto (ohne BU-Schlüssel)": "10000",
+				"Belegdatum": today(),
+				"Buchungstext": "No remark",
+				"Beleginfo - Art 1": "Sales Invoice",
+				"Beleginfo - Inhalt 1": "SINV-0001",
+			}
+		]
 		get_datev_csv(data=test_data, filters=self.filters, csv_class=Transactions)
 
 	def test_download(self):
@@ -237,6 +247,6 @@
 
 		# zipfile.is_zipfile() expects a file-like object
 		zip_buffer = BytesIO()
-		zip_buffer.write(frappe.response['filecontent'])
+		zip_buffer.write(frappe.response["filecontent"])
 
 		self.assertTrue(zipfile.is_zipfile(zip_buffer))
diff --git a/erpnext/regional/report/e_invoice_summary/e_invoice_summary.py b/erpnext/regional/report/e_invoice_summary/e_invoice_summary.py
index 2110c44..255bb92 100644
--- a/erpnext/regional/report/e_invoice_summary/e_invoice_summary.py
+++ b/erpnext/regional/report/e_invoice_summary/e_invoice_summary.py
@@ -13,98 +13,70 @@
 
 	return columns, data
 
+
 def validate_filters(filters=None):
 	if filters is None:
 		filters = {}
 	filters = frappe._dict(filters)
 
 	if not filters.company:
-		frappe.throw(_('{} is mandatory for generating E-Invoice Summary Report').format(_('Company')), title=_('Invalid Filter'))
+		frappe.throw(
+			_("{} is mandatory for generating E-Invoice Summary Report").format(_("Company")),
+			title=_("Invalid Filter"),
+		)
 	if filters.company:
 		# validate if company has e-invoicing enabled
 		pass
 	if not filters.from_date or not filters.to_date:
-		frappe.throw(_('From Date & To Date is mandatory for generating E-Invoice Summary Report'), title=_('Invalid Filter'))
+		frappe.throw(
+			_("From Date & To Date is mandatory for generating E-Invoice Summary Report"),
+			title=_("Invalid Filter"),
+		)
 	if filters.from_date > filters.to_date:
-		frappe.throw(_('From Date must be before To Date'), title=_('Invalid Filter'))
+		frappe.throw(_("From Date must be before To Date"), title=_("Invalid Filter"))
+
 
 def get_data(filters=None):
 	if filters is None:
 		filters = {}
 	query_filters = {
-		'posting_date': ['between', [filters.from_date, filters.to_date]],
-		'einvoice_status': ['is', 'set'],
-		'company': filters.company
+		"posting_date": ["between", [filters.from_date, filters.to_date]],
+		"einvoice_status": ["is", "set"],
+		"company": filters.company,
 	}
 	if filters.customer:
-		query_filters['customer'] = filters.customer
+		query_filters["customer"] = filters.customer
 	if filters.status:
-		query_filters['einvoice_status'] = filters.status
+		query_filters["einvoice_status"] = filters.status
 
 	data = frappe.get_all(
-		'Sales Invoice',
-		filters=query_filters,
-		fields=[d.get('fieldname') for d in get_columns()]
+		"Sales Invoice", filters=query_filters, fields=[d.get("fieldname") for d in get_columns()]
 	)
 
 	return data
 
+
 def get_columns():
 	return [
-		{
-			"fieldtype": "Date",
-			"fieldname": "posting_date",
-			"label": _("Posting Date"),
-			"width": 0
-		},
+		{"fieldtype": "Date", "fieldname": "posting_date", "label": _("Posting Date"), "width": 0},
 		{
 			"fieldtype": "Link",
 			"fieldname": "name",
 			"label": _("Sales Invoice"),
 			"options": "Sales Invoice",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"fieldtype": "Data",
-			"fieldname": "einvoice_status",
-			"label": _("Status"),
-			"width": 100
-		},
-		{
-			"fieldtype": "Link",
-			"fieldname": "customer",
-			"options": "Customer",
-			"label": _("Customer")
-		},
-		{
-			"fieldtype": "Check",
-			"fieldname": "is_return",
-			"label": _("Is Return"),
-			"width": 85
-		},
-		{
-			"fieldtype": "Data",
-			"fieldname": "ack_no",
-			"label": "Ack. No.",
-			"width": 145
-		},
-		{
-			"fieldtype": "Data",
-			"fieldname": "ack_date",
-			"label": "Ack. Date",
-			"width": 165
-		},
-		{
-			"fieldtype": "Data",
-			"fieldname": "irn",
-			"label": _("IRN No."),
-			"width": 250
-		},
+		{"fieldtype": "Data", "fieldname": "einvoice_status", "label": _("Status"), "width": 100},
+		{"fieldtype": "Link", "fieldname": "customer", "options": "Customer", "label": _("Customer")},
+		{"fieldtype": "Check", "fieldname": "is_return", "label": _("Is Return"), "width": 85},
+		{"fieldtype": "Data", "fieldname": "ack_no", "label": "Ack. No.", "width": 145},
+		{"fieldtype": "Data", "fieldname": "ack_date", "label": "Ack. Date", "width": 165},
+		{"fieldtype": "Data", "fieldname": "irn", "label": _("IRN No."), "width": 250},
 		{
 			"fieldtype": "Currency",
 			"options": "Company:company:default_currency",
 			"fieldname": "base_grand_total",
 			"label": _("Grand Total"),
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
diff --git a/erpnext/regional/report/eway_bill/eway_bill.py b/erpnext/regional/report/eway_bill/eway_bill.py
index f3fe5e8..8dcd6a3 100644
--- a/erpnext/regional/report/eway_bill/eway_bill.py
+++ b/erpnext/regional/report/eway_bill/eway_bill.py
@@ -11,35 +11,41 @@
 
 
 def execute(filters=None):
-	if not filters: filters.setdefault('posting_date', [nowdate(), nowdate()])
+	if not filters:
+		filters.setdefault("posting_date", [nowdate(), nowdate()])
 	columns, data = [], []
 	columns = get_columns()
 	data = get_data(filters)
 	return columns, data
 
+
 def get_data(filters):
 
 	conditions = get_conditions(filters)
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		SELECT
 			dn.name as dn_id, dn.posting_date, dn.company, dn.company_gstin, dn.customer, dn.customer_gstin, dni.item_code, dni.item_name, dni.description, dni.gst_hsn_code, dni.uom, dni.qty, dni.amount, dn.mode_of_transport, dn.distance, dn.transporter_name, dn.gst_transporter_id, dn.lr_no, dn.lr_date, dn.vehicle_no, dn.gst_vehicle_type, dn.company_address, dn.shipping_address_name
 		FROM
 			`tabDelivery Note` AS dn join `tabDelivery Note Item` AS dni on (dni.parent = dn.name)
 		WHERE
 			dn.docstatus < 2
-			%s """ % conditions, as_dict=1)
+			%s """
+		% conditions,
+		as_dict=1,
+	)
 
 	unit = {
-		'Bag': "BAGS",
-		'Bottle': "BOTTLES",
-		'Kg': "KILOGRAMS",
-		'Liter': "LITERS",
-		'Meter': "METERS",
-		'Nos': "NUMBERS",
-		'PKT': "PACKS",
-		'Roll': "ROLLS",
-		'Set': "SETS"
+		"Bag": "BAGS",
+		"Bottle": "BOTTLES",
+		"Kg": "KILOGRAMS",
+		"Liter": "LITERS",
+		"Meter": "METERS",
+		"Nos": "NUMBERS",
+		"PKT": "PACKS",
+		"Roll": "ROLLS",
+		"Set": "SETS",
 	}
 
 	# Regular expression set to remove all the special characters
@@ -51,11 +57,11 @@
 		set_address_details(row, special_characters)
 
 		# Eway Bill accepts date as dd/mm/yyyy and not dd-mm-yyyy
-		row.posting_date = '/'.join(str(row.posting_date).replace("-", "/").split('/')[::-1])
-		row.lr_date = '/'.join(str(row.lr_date).replace("-", "/").split('/')[::-1])
+		row.posting_date = "/".join(str(row.posting_date).replace("-", "/").split("/")[::-1])
+		row.lr_date = "/".join(str(row.lr_date).replace("-", "/").split("/")[::-1])
 
-		if row.gst_vehicle_type == 'Over Dimensional Cargo (ODC)':
-			row.gst_vehicle_type = 'ODC'
+		if row.gst_vehicle_type == "Over Dimensional Cargo (ODC)":
+			row.gst_vehicle_type = "ODC"
 
 		row.item_name = re.sub(special_characters, " ", row.item_name)
 		row.description = row.item_name
@@ -67,58 +73,80 @@
 
 	return data
 
+
 def get_conditions(filters):
 
 	conditions = ""
 
-	conditions += filters.get('company') and " AND dn.company = '%s' " % filters.get('company') or ""
-	conditions += filters.get('posting_date') and " AND dn.posting_date >= '%s' AND dn.posting_date <= '%s' " % (filters.get('posting_date')[0], filters.get('posting_date')[1]) or ""
-	conditions += filters.get('delivery_note') and " AND dn.name = '%s' " % filters.get('delivery_note') or ""
-	conditions += filters.get('customer') and " AND dn.customer = '%s' " % filters.get('customer').replace("'", "\'") or ""
+	conditions += filters.get("company") and " AND dn.company = '%s' " % filters.get("company") or ""
+	conditions += (
+		filters.get("posting_date")
+		and " AND dn.posting_date >= '%s' AND dn.posting_date <= '%s' "
+		% (filters.get("posting_date")[0], filters.get("posting_date")[1])
+		or ""
+	)
+	conditions += (
+		filters.get("delivery_note") and " AND dn.name = '%s' " % filters.get("delivery_note") or ""
+	)
+	conditions += (
+		filters.get("customer")
+		and " AND dn.customer = '%s' " % filters.get("customer").replace("'", "'")
+		or ""
+	)
 
 	return conditions
 
+
 def set_defaults(row):
-	row.setdefault(u'supply_type', "Outward")
-	row.setdefault(u'sub_type', "Supply")
-	row.setdefault(u'doc_type', "Delivery Challan")
+	row.setdefault("supply_type", "Outward")
+	row.setdefault("sub_type", "Supply")
+	row.setdefault("doc_type", "Delivery Challan")
+
 
 def set_address_details(row, special_characters):
 
-	if row.get('company_address'):
-		address_line1, address_line2, city, pincode, state = frappe.db.get_value("Address", row.get('company_address'), ['address_line1', 'address_line2', 'city', 'pincode', 'state'])
+	if row.get("company_address"):
+		address_line1, address_line2, city, pincode, state = frappe.db.get_value(
+			"Address",
+			row.get("company_address"),
+			["address_line1", "address_line2", "city", "pincode", "state"],
+		)
 
-		row.update({'from_address_1': re.sub(special_characters, "", address_line1 or '')})
-		row.update({'from_address_2': re.sub(special_characters, "", address_line2 or '')})
-		row.update({'from_place': city and city.upper() or ''})
-		row.update({'from_pin_code': pincode and pincode.replace(" ", "") or ''})
-		row.update({'from_state': state and state.upper() or ''})
-		row.update({'dispatch_state': row.from_state})
+		row.update({"from_address_1": re.sub(special_characters, "", address_line1 or "")})
+		row.update({"from_address_2": re.sub(special_characters, "", address_line2 or "")})
+		row.update({"from_place": city and city.upper() or ""})
+		row.update({"from_pin_code": pincode and pincode.replace(" ", "") or ""})
+		row.update({"from_state": state and state.upper() or ""})
+		row.update({"dispatch_state": row.from_state})
 
-	if row.get('shipping_address_name'):
-		address_line1, address_line2, city, pincode, state = frappe.db.get_value("Address", row.get('shipping_address_name'), ['address_line1', 'address_line2', 'city', 'pincode', 'state'])
+	if row.get("shipping_address_name"):
+		address_line1, address_line2, city, pincode, state = frappe.db.get_value(
+			"Address",
+			row.get("shipping_address_name"),
+			["address_line1", "address_line2", "city", "pincode", "state"],
+		)
 
-		row.update({'to_address_1': re.sub(special_characters, "", address_line1 or '')})
-		row.update({'to_address_2': re.sub(special_characters, "", address_line2 or '')})
-		row.update({'to_place': city and city.upper() or ''})
-		row.update({'to_pin_code': pincode and pincode.replace(" ", "") or ''})
-		row.update({'to_state': state and state.upper() or ''})
-		row.update({'ship_to_state': row.to_state})
+		row.update({"to_address_1": re.sub(special_characters, "", address_line1 or "")})
+		row.update({"to_address_2": re.sub(special_characters, "", address_line2 or "")})
+		row.update({"to_place": city and city.upper() or ""})
+		row.update({"to_pin_code": pincode and pincode.replace(" ", "") or ""})
+		row.update({"to_state": state and state.upper() or ""})
+		row.update({"ship_to_state": row.to_state})
+
 
 def set_taxes(row, filters):
-	taxes = frappe.get_all("Sales Taxes and Charges",
-				filters={
-					'parent': row.dn_id
-				},
-				fields=('item_wise_tax_detail', 'account_head'))
+	taxes = frappe.get_all(
+		"Sales Taxes and Charges",
+		filters={"parent": row.dn_id},
+		fields=("item_wise_tax_detail", "account_head"),
+	)
 
 	account_list = ["cgst_account", "sgst_account", "igst_account", "cess_account"]
-	taxes_list = frappe.get_all("GST Account",
-		filters={
-			"parent": "GST Settings",
-			"company": filters.company
-		},
-		fields=account_list)
+	taxes_list = frappe.get_all(
+		"GST Account",
+		filters={"parent": "GST Settings", "company": filters.company},
+		fields=account_list,
+	)
 
 	if not taxes_list:
 		frappe.throw(_("Please set GST Accounts in GST Settings"))
@@ -141,253 +169,89 @@
 		item_tax_rate.pop(tax[key])
 
 	row.amount = float(row.amount) + sum(i[1] for i in item_tax_rate.values())
-	row.update({'tax_rate': '+'.join(tax_rate)})
+	row.update({"tax_rate": "+".join(tax_rate)})
+
 
 def get_columns():
 	columns = [
-		{
-			"fieldname": "supply_type",
-			"label": _("Supply Type"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "sub_type",
-			"label": _("Sub Type"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "doc_type",
-			"label": _("Doc Type"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "supply_type", "label": _("Supply Type"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "sub_type", "label": _("Sub Type"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "doc_type", "label": _("Doc Type"), "fieldtype": "Data", "width": 100},
 		{
 			"fieldname": "dn_id",
 			"label": _("Doc Name"),
 			"fieldtype": "Link",
 			"options": "Delivery Note",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"fieldname": "posting_date",
-			"label": _("Doc Date"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "posting_date", "label": _("Doc Date"), "fieldtype": "Data", "width": 100},
 		{
 			"fieldname": "company",
 			"label": _("From Party Name"),
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"fieldname": "company_gstin",
-			"label": _("From GSTIN"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "from_address_1",
-			"label": _("From Address 1"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "from_address_2",
-			"label": _("From Address 2"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "from_place",
-			"label": _("From Place"),
-			"fieldtype": "Data",
-			"width": 80
-		},
-		{
-			"fieldname": "from_pin_code",
-			"label": _("From Pin Code"),
-			"fieldtype": "Data",
-			"width": 80
-		},
-		{
-			"fieldname": "from_state",
-			"label": _("From State"),
-			"fieldtype": "Data",
-			"width": 80
-		},
-		{
-			"fieldname": "dispatch_state",
-			"label": _("Dispatch State"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "customer",
-			"label": _("To Party Name"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "customer_gstin",
-			"label": _("To GSTIN"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "to_address_1",
-			"label": _("To Address 1"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "to_address_2",
-			"label": _("To Address 2"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "to_place",
-			"label": _("To Place"),
-			"fieldtype": "Data",
-			"width": 80
-		},
-		{
-			"fieldname": "to_pin_code",
-			"label": _("To Pin Code"),
-			"fieldtype": "Data",
-			"width": 80
-		},
-		{
-			"fieldname": "to_state",
-			"label": _("To State"),
-			"fieldtype": "Data",
-			"width": 80
-		},
-		{
-			"fieldname": "ship_to_state",
-			"label": _("Ship To State"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "company_gstin", "label": _("From GSTIN"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "from_address_1", "label": _("From Address 1"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "from_address_2", "label": _("From Address 2"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "from_place", "label": _("From Place"), "fieldtype": "Data", "width": 80},
+		{"fieldname": "from_pin_code", "label": _("From Pin Code"), "fieldtype": "Data", "width": 80},
+		{"fieldname": "from_state", "label": _("From State"), "fieldtype": "Data", "width": 80},
+		{"fieldname": "dispatch_state", "label": _("Dispatch State"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "customer", "label": _("To Party Name"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "customer_gstin", "label": _("To GSTIN"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "to_address_1", "label": _("To Address 1"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "to_address_2", "label": _("To Address 2"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "to_place", "label": _("To Place"), "fieldtype": "Data", "width": 80},
+		{"fieldname": "to_pin_code", "label": _("To Pin Code"), "fieldtype": "Data", "width": 80},
+		{"fieldname": "to_state", "label": _("To State"), "fieldtype": "Data", "width": 80},
+		{"fieldname": "ship_to_state", "label": _("Ship To State"), "fieldtype": "Data", "width": 100},
 		{
 			"fieldname": "item_name",
 			"label": _("Product"),
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"fieldname": "description",
-			"label": _("Description"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "gst_hsn_code",
-			"label": _("HSN"),
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"fieldname": "uom",
-			"label": _("Unit"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "qty",
-			"label": _("Qty"),
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"fieldname": "amount",
-			"label": _("Accessable Value"),
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"fieldname": "tax_rate",
-			"label": _("Tax Rate"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "cgst_amount",
-			"label": _("CGST Amount"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "sgst_amount",
-			"label": _("SGST Amount"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "igst_amount",
-			"label": _("IGST Amount"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "cess_amount",
-			"label": _("CESS Amount"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "description", "label": _("Description"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "gst_hsn_code", "label": _("HSN"), "fieldtype": "Data", "width": 120},
+		{"fieldname": "uom", "label": _("Unit"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "qty", "label": _("Qty"), "fieldtype": "Float", "width": 100},
+		{"fieldname": "amount", "label": _("Accessable Value"), "fieldtype": "Float", "width": 120},
+		{"fieldname": "tax_rate", "label": _("Tax Rate"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "cgst_amount", "label": _("CGST Amount"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "sgst_amount", "label": _("SGST Amount"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "igst_amount", "label": _("IGST Amount"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "cess_amount", "label": _("CESS Amount"), "fieldtype": "Data", "width": 100},
 		{
 			"fieldname": "mode_of_transport",
 			"label": _("Mode of Transport"),
 			"fieldtype": "Data",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"fieldname": "distance",
-			"label": _("Distance"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "distance", "label": _("Distance"), "fieldtype": "Data", "width": 100},
 		{
 			"fieldname": "transporter_name",
 			"label": _("Transporter Name"),
 			"fieldtype": "Data",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"fieldname": "gst_transporter_id",
 			"label": _("Transporter ID"),
 			"fieldtype": "Data",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"fieldname": "lr_no",
-			"label": _("Transport Receipt No"),
-			"fieldtype": "Data",
-			"width": 120
-		},
+		{"fieldname": "lr_no", "label": _("Transport Receipt No"), "fieldtype": "Data", "width": 120},
 		{
 			"fieldname": "lr_date",
 			"label": _("Transport Receipt Date"),
 			"fieldtype": "Data",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"fieldname": "vehicle_no",
-			"label": _("Vehicle No"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "gst_vehicle_type",
-			"label": _("Vehicle Type"),
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"fieldname": "vehicle_no", "label": _("Vehicle No"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "gst_vehicle_type", "label": _("Vehicle Type"), "fieldtype": "Data", "width": 100},
 	]
 
 	return columns
diff --git "a/erpnext/regional/report/fichier_des_ecritures_comptables_\133fec\135/fichier_des_ecritures_comptables_\133fec\135.py" "b/erpnext/regional/report/fichier_des_ecritures_comptables_\133fec\135/fichier_des_ecritures_comptables_\133fec\135.py"
index 59888ff..c75179e 100644
--- "a/erpnext/regional/report/fichier_des_ecritures_comptables_\133fec\135/fichier_des_ecritures_comptables_\133fec\135.py"
+++ "b/erpnext/regional/report/fichier_des_ecritures_comptables_\133fec\135/fichier_des_ecritures_comptables_\133fec\135.py"
@@ -26,31 +26,42 @@
 
 
 def validate_filters(filters, account_details):
-	if not filters.get('company'):
-		frappe.throw(_('{0} is mandatory').format(_('Company')))
+	if not filters.get("company"):
+		frappe.throw(_("{0} is mandatory").format(_("Company")))
 
-	if not filters.get('fiscal_year'):
-		frappe.throw(_('{0} is mandatory').format(_('Fiscal Year')))
+	if not filters.get("fiscal_year"):
+		frappe.throw(_("{0} is mandatory").format(_("Fiscal Year")))
 
 
 def set_account_currency(filters):
 
-	filters["company_currency"] = frappe.get_cached_value('Company',  filters.company,  "default_currency")
+	filters["company_currency"] = frappe.get_cached_value(
+		"Company", filters.company, "default_currency"
+	)
 
 	return filters
 
 
 def get_columns(filters):
 	columns = [
-		"JournalCode" + "::90", "JournalLib" + "::90",
-		"EcritureNum" + ":Dynamic Link:90", "EcritureDate" + "::90",
-		"CompteNum" + ":Link/Account:100", "CompteLib" + ":Link/Account:200",
-		"CompAuxNum" + "::90", "CompAuxLib" + "::90",
-		"PieceRef" + "::90", "PieceDate" + "::90",
-		"EcritureLib" + "::90", "Debit" + "::90", "Credit" + "::90",
-		"EcritureLet" + "::90", "DateLet" +
-		"::90", "ValidDate" + "::90",
-		"Montantdevise" + "::90", "Idevise" + "::90"
+		"JournalCode" + "::90",
+		"JournalLib" + "::90",
+		"EcritureNum" + ":Dynamic Link:90",
+		"EcritureDate" + "::90",
+		"CompteNum" + ":Link/Account:100",
+		"CompteLib" + ":Link/Account:200",
+		"CompAuxNum" + "::90",
+		"CompAuxLib" + "::90",
+		"PieceRef" + "::90",
+		"PieceDate" + "::90",
+		"EcritureLib" + "::90",
+		"Debit" + "::90",
+		"Credit" + "::90",
+		"EcritureLet" + "::90",
+		"DateLet" + "::90",
+		"ValidDate" + "::90",
+		"Montantdevise" + "::90",
+		"Idevise" + "::90",
 	]
 
 	return columns
@@ -66,10 +77,14 @@
 
 def get_gl_entries(filters):
 
-	group_by_condition = "group by voucher_type, voucher_no, account" \
-		if filters.get("group_by_voucher") else "group by gl.name"
+	group_by_condition = (
+		"group by voucher_type, voucher_no, account"
+		if filters.get("group_by_voucher")
+		else "group by gl.name"
+	)
 
-	gl_entries = frappe.db.sql("""
+	gl_entries = frappe.db.sql(
+		"""
 		select
 			gl.posting_date as GlPostDate, gl.name as GlName, gl.account, gl.transaction_date,
 			sum(gl.debit) as debit, sum(gl.credit) as credit,
@@ -99,8 +114,12 @@
 			left join `tabMember` mem on gl.party = mem.name
 		where gl.company=%(company)s and gl.fiscal_year=%(fiscal_year)s
 		{group_by_condition}
-		order by GlPostDate, voucher_no"""\
-		.format(group_by_condition=group_by_condition), filters, as_dict=1)
+		order by GlPostDate, voucher_no""".format(
+			group_by_condition=group_by_condition
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return gl_entries
 
@@ -108,25 +127,37 @@
 def get_result_as_list(data, filters):
 	result = []
 
-	company_currency = frappe.get_cached_value('Company',  filters.company,  "default_currency")
-	accounts = frappe.get_all("Account", filters={"Company": filters.company}, fields=["name", "account_number"])
+	company_currency = frappe.get_cached_value("Company", filters.company, "default_currency")
+	accounts = frappe.get_all(
+		"Account", filters={"Company": filters.company}, fields=["name", "account_number"]
+	)
 
 	for d in data:
 
 		JournalCode = re.split("-|/|[0-9]", d.get("voucher_no"))[0]
 
-		if d.get("voucher_no").startswith("{0}-".format(JournalCode)) or d.get("voucher_no").startswith("{0}/".format(JournalCode)):
+		if d.get("voucher_no").startswith("{0}-".format(JournalCode)) or d.get("voucher_no").startswith(
+			"{0}/".format(JournalCode)
+		):
 			EcritureNum = re.split("-|/", d.get("voucher_no"))[1]
 		else:
-			EcritureNum = re.search(r"{0}(\d+)".format(JournalCode), d.get("voucher_no"), re.IGNORECASE).group(1)
+			EcritureNum = re.search(
+				r"{0}(\d+)".format(JournalCode), d.get("voucher_no"), re.IGNORECASE
+			).group(1)
 
 		EcritureDate = format_datetime(d.get("GlPostDate"), "yyyyMMdd")
 
-		account_number = [account.account_number for account in accounts if account.name == d.get("account")]
+		account_number = [
+			account.account_number for account in accounts if account.name == d.get("account")
+		]
 		if account_number[0] is not None:
-			CompteNum =  account_number[0]
+			CompteNum = account_number[0]
 		else:
-			frappe.throw(_("Account number for account {0} is not available.<br> Please setup your Chart of Accounts correctly.").format(d.get("account")))
+			frappe.throw(
+				_(
+					"Account number for account {0} is not available.<br> Please setup your Chart of Accounts correctly."
+				).format(d.get("account"))
+			)
 
 		if d.get("party_type") == "Customer":
 			CompAuxNum = d.get("cusName")
@@ -172,19 +203,45 @@
 
 		PieceDate = format_datetime(d.get("GlPostDate"), "yyyyMMdd")
 
-		debit = '{:.2f}'.format(d.get("debit")).replace(".", ",")
+		debit = "{:.2f}".format(d.get("debit")).replace(".", ",")
 
-		credit = '{:.2f}'.format(d.get("credit")).replace(".", ",")
+		credit = "{:.2f}".format(d.get("credit")).replace(".", ",")
 
 		Idevise = d.get("account_currency")
 
 		if Idevise != company_currency:
-			Montantdevise = '{:.2f}'.format(d.get("debitCurr")).replace(".", ",") if d.get("debitCurr") != 0 else '{:.2f}'.format(d.get("creditCurr")).replace(".", ",")
+			Montantdevise = (
+				"{:.2f}".format(d.get("debitCurr")).replace(".", ",")
+				if d.get("debitCurr") != 0
+				else "{:.2f}".format(d.get("creditCurr")).replace(".", ",")
+			)
 		else:
-			Montantdevise = '{:.2f}'.format(d.get("debit")).replace(".", ",") if d.get("debit") != 0 else '{:.2f}'.format(d.get("credit")).replace(".", ",")
+			Montantdevise = (
+				"{:.2f}".format(d.get("debit")).replace(".", ",")
+				if d.get("debit") != 0
+				else "{:.2f}".format(d.get("credit")).replace(".", ",")
+			)
 
-		row = [JournalCode, d.get("voucher_type"), EcritureNum, EcritureDate, CompteNum, d.get("account"), CompAuxNum, CompAuxLib,
-			   PieceRef, PieceDate, EcritureLib, debit, credit, "", "", ValidDate, Montantdevise, Idevise]
+		row = [
+			JournalCode,
+			d.get("voucher_type"),
+			EcritureNum,
+			EcritureDate,
+			CompteNum,
+			d.get("account"),
+			CompAuxNum,
+			CompAuxLib,
+			PieceRef,
+			PieceDate,
+			EcritureLib,
+			debit,
+			credit,
+			"",
+			"",
+			ValidDate,
+			Montantdevise,
+			Idevise,
+		]
 
 		result.append(row)
 
diff --git a/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py b/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py
index 528868c..fec63f2 100644
--- a/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py
+++ b/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py
@@ -8,24 +8,28 @@
 
 
 def execute(filters=None):
-	return _execute(filters, additional_table_columns=[
-		dict(fieldtype='Data', label='Supplier GSTIN', fieldname="supplier_gstin", width=120),
-		dict(fieldtype='Data', label='Company GSTIN', fieldname="company_gstin", width=120),
-		dict(fieldtype='Data', label='Reverse Charge', fieldname="reverse_charge", width=120),
-		dict(fieldtype='Data', label='GST Category', fieldname="gst_category", width=120),
-		dict(fieldtype='Data', label='Export Type', fieldname="export_type", width=120),
-		dict(fieldtype='Data', label='E-Commerce GSTIN', fieldname="ecommerce_gstin", width=130),
-		dict(fieldtype='Data', label='HSN Code', fieldname="gst_hsn_code", width=120),
-		dict(fieldtype='Data', label='Supplier Invoice No', fieldname="bill_no", width=120),
-		dict(fieldtype='Date', label='Supplier Invoice Date', fieldname="bill_date", width=100)
-	], additional_query_columns=[
-		'supplier_gstin',
-		'company_gstin',
-		'reverse_charge',
-		'gst_category',
-		'export_type',
-		'ecommerce_gstin',
-		'gst_hsn_code',
-		'bill_no',
-		'bill_date'
-	])
+	return _execute(
+		filters,
+		additional_table_columns=[
+			dict(fieldtype="Data", label="Supplier GSTIN", fieldname="supplier_gstin", width=120),
+			dict(fieldtype="Data", label="Company GSTIN", fieldname="company_gstin", width=120),
+			dict(fieldtype="Data", label="Reverse Charge", fieldname="reverse_charge", width=120),
+			dict(fieldtype="Data", label="GST Category", fieldname="gst_category", width=120),
+			dict(fieldtype="Data", label="Export Type", fieldname="export_type", width=120),
+			dict(fieldtype="Data", label="E-Commerce GSTIN", fieldname="ecommerce_gstin", width=130),
+			dict(fieldtype="Data", label="HSN Code", fieldname="gst_hsn_code", width=120),
+			dict(fieldtype="Data", label="Supplier Invoice No", fieldname="bill_no", width=120),
+			dict(fieldtype="Date", label="Supplier Invoice Date", fieldname="bill_date", width=100),
+		],
+		additional_query_columns=[
+			"supplier_gstin",
+			"company_gstin",
+			"reverse_charge",
+			"gst_category",
+			"export_type",
+			"ecommerce_gstin",
+			"gst_hsn_code",
+			"bill_no",
+			"bill_date",
+		],
+	)
diff --git a/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.py b/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.py
index 386e219..bb1843f 100644
--- a/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.py
+++ b/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.py
@@ -6,24 +6,30 @@
 
 
 def execute(filters=None):
-	return _execute(filters, additional_table_columns=[
-		dict(fieldtype='Data', label='Customer GSTIN', fieldname="customer_gstin", width=120),
-		dict(fieldtype='Data', label='Billing Address GSTIN', fieldname="billing_address_gstin", width=140),
-		dict(fieldtype='Data', label='Company GSTIN', fieldname="company_gstin", width=120),
-		dict(fieldtype='Data', label='Place of Supply', fieldname="place_of_supply", width=120),
-		dict(fieldtype='Data', label='Reverse Charge', fieldname="reverse_charge", width=120),
-		dict(fieldtype='Data', label='GST Category', fieldname="gst_category", width=120),
-		dict(fieldtype='Data', label='Export Type', fieldname="export_type", width=120),
-		dict(fieldtype='Data', label='E-Commerce GSTIN', fieldname="ecommerce_gstin", width=130),
-		dict(fieldtype='Data', label='HSN Code', fieldname="gst_hsn_code", width=120)
-	], additional_query_columns=[
-		'customer_gstin',
-		'billing_address_gstin',
-		'company_gstin',
-		'place_of_supply',
-		'reverse_charge',
-		'gst_category',
-		'export_type',
-		'ecommerce_gstin',
-		'gst_hsn_code'
-	])
+	return _execute(
+		filters,
+		additional_table_columns=[
+			dict(fieldtype="Data", label="Customer GSTIN", fieldname="customer_gstin", width=120),
+			dict(
+				fieldtype="Data", label="Billing Address GSTIN", fieldname="billing_address_gstin", width=140
+			),
+			dict(fieldtype="Data", label="Company GSTIN", fieldname="company_gstin", width=120),
+			dict(fieldtype="Data", label="Place of Supply", fieldname="place_of_supply", width=120),
+			dict(fieldtype="Data", label="Reverse Charge", fieldname="reverse_charge", width=120),
+			dict(fieldtype="Data", label="GST Category", fieldname="gst_category", width=120),
+			dict(fieldtype="Data", label="Export Type", fieldname="export_type", width=120),
+			dict(fieldtype="Data", label="E-Commerce GSTIN", fieldname="ecommerce_gstin", width=130),
+			dict(fieldtype="Data", label="HSN Code", fieldname="gst_hsn_code", width=120),
+		],
+		additional_query_columns=[
+			"customer_gstin",
+			"billing_address_gstin",
+			"company_gstin",
+			"place_of_supply",
+			"reverse_charge",
+			"gst_category",
+			"export_type",
+			"ecommerce_gstin",
+			"gst_hsn_code",
+		],
+	)
diff --git a/erpnext/regional/report/gst_purchase_register/gst_purchase_register.py b/erpnext/regional/report/gst_purchase_register/gst_purchase_register.py
index 2d99408..609dbba 100644
--- a/erpnext/regional/report/gst_purchase_register/gst_purchase_register.py
+++ b/erpnext/regional/report/gst_purchase_register/gst_purchase_register.py
@@ -6,18 +6,22 @@
 
 
 def execute(filters=None):
-	return _execute(filters, additional_table_columns=[
-		dict(fieldtype='Data', label='Supplier GSTIN', fieldname="supplier_gstin", width=120),
-		dict(fieldtype='Data', label='Company GSTIN', fieldname="company_gstin", width=120),
-		dict(fieldtype='Data', label='Reverse Charge', fieldname="reverse_charge", width=120),
-		dict(fieldtype='Data', label='GST Category', fieldname="gst_category", width=120),
-		dict(fieldtype='Data', label='Export Type', fieldname="export_type", width=120),
-		dict(fieldtype='Data', label='E-Commerce GSTIN', fieldname="ecommerce_gstin", width=130)
-	], additional_query_columns=[
-		'supplier_gstin',
-		'company_gstin',
-		'reverse_charge',
-		'gst_category',
-		'export_type',
-		'ecommerce_gstin'
-	])
+	return _execute(
+		filters,
+		additional_table_columns=[
+			dict(fieldtype="Data", label="Supplier GSTIN", fieldname="supplier_gstin", width=120),
+			dict(fieldtype="Data", label="Company GSTIN", fieldname="company_gstin", width=120),
+			dict(fieldtype="Data", label="Reverse Charge", fieldname="reverse_charge", width=120),
+			dict(fieldtype="Data", label="GST Category", fieldname="gst_category", width=120),
+			dict(fieldtype="Data", label="Export Type", fieldname="export_type", width=120),
+			dict(fieldtype="Data", label="E-Commerce GSTIN", fieldname="ecommerce_gstin", width=130),
+		],
+		additional_query_columns=[
+			"supplier_gstin",
+			"company_gstin",
+			"reverse_charge",
+			"gst_category",
+			"export_type",
+			"ecommerce_gstin",
+		],
+	)
diff --git a/erpnext/regional/report/gst_sales_register/gst_sales_register.py b/erpnext/regional/report/gst_sales_register/gst_sales_register.py
index a6f2b3d..94ceb19 100644
--- a/erpnext/regional/report/gst_sales_register/gst_sales_register.py
+++ b/erpnext/regional/report/gst_sales_register/gst_sales_register.py
@@ -6,22 +6,28 @@
 
 
 def execute(filters=None):
-	return _execute(filters, additional_table_columns=[
-		dict(fieldtype='Data', label='Customer GSTIN', fieldname="customer_gstin", width=120),
-		dict(fieldtype='Data', label='Billing Address GSTIN', fieldname="billing_address_gstin", width=140),
-		dict(fieldtype='Data', label='Company GSTIN', fieldname="company_gstin", width=120),
-		dict(fieldtype='Data', label='Place of Supply', fieldname="place_of_supply", width=120),
-		dict(fieldtype='Data', label='Reverse Charge', fieldname="reverse_charge", width=120),
-		dict(fieldtype='Data', label='GST Category', fieldname="gst_category", width=120),
-		dict(fieldtype='Data', label='Export Type', fieldname="export_type", width=120),
-		dict(fieldtype='Data', label='E-Commerce GSTIN', fieldname="ecommerce_gstin", width=130)
-	], additional_query_columns=[
-		'customer_gstin',
-		'billing_address_gstin',
-		'company_gstin',
-		'place_of_supply',
-		'reverse_charge',
-		'gst_category',
-		'export_type',
-		'ecommerce_gstin'
-	])
+	return _execute(
+		filters,
+		additional_table_columns=[
+			dict(fieldtype="Data", label="Customer GSTIN", fieldname="customer_gstin", width=120),
+			dict(
+				fieldtype="Data", label="Billing Address GSTIN", fieldname="billing_address_gstin", width=140
+			),
+			dict(fieldtype="Data", label="Company GSTIN", fieldname="company_gstin", width=120),
+			dict(fieldtype="Data", label="Place of Supply", fieldname="place_of_supply", width=120),
+			dict(fieldtype="Data", label="Reverse Charge", fieldname="reverse_charge", width=120),
+			dict(fieldtype="Data", label="GST Category", fieldname="gst_category", width=120),
+			dict(fieldtype="Data", label="Export Type", fieldname="export_type", width=120),
+			dict(fieldtype="Data", label="E-Commerce GSTIN", fieldname="ecommerce_gstin", width=130),
+		],
+		additional_query_columns=[
+			"customer_gstin",
+			"billing_address_gstin",
+			"company_gstin",
+			"place_of_supply",
+			"reverse_charge",
+			"gst_category",
+			"export_type",
+			"ecommerce_gstin",
+		],
+	)
diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py
index 8fcb6bb..0fe0647 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.py
+++ b/erpnext/regional/report/gstr_1/gstr_1.py
@@ -15,6 +15,7 @@
 def execute(filters=None):
 	return Gstr1Report(filters).run()
 
+
 class Gstr1Report(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
@@ -59,7 +60,7 @@
 		return self.columns, self.data
 
 	def get_data(self):
-		if self.filters.get("type_of_business") in  ("B2C Small", "B2C Large"):
+		if self.filters.get("type_of_business") in ("B2C Small", "B2C Large"):
 			self.get_b2c_data()
 		elif self.filters.get("type_of_business") == "Advances":
 			self.get_advance_data()
@@ -83,15 +84,17 @@
 		advances = self.get_advance_entries()
 		for entry in advances:
 			# only consider IGST and SGST so as to avoid duplication of taxable amount
-			if entry.account_head in self.gst_accounts.igst_account or \
-				entry.account_head in self.gst_accounts.sgst_account:
+			if (
+				entry.account_head in self.gst_accounts.igst_account
+				or entry.account_head in self.gst_accounts.sgst_account
+			):
 				advances_data.setdefault((entry.place_of_supply, entry.rate), [0.0, 0.0])
-				advances_data[(entry.place_of_supply, entry.rate)][0] += (entry.amount * 100 / entry.rate)
+				advances_data[(entry.place_of_supply, entry.rate)][0] += entry.amount * 100 / entry.rate
 			elif entry.account_head in self.gst_accounts.cess_account:
 				advances_data[(entry.place_of_supply, entry.rate)][1] += entry.amount
 
 		for key, value in advances_data.items():
-			row= [key[0], key[1], value[0], value[1]]
+			row = [key[0], key[1], value[0], value[1]]
 			self.data.append(row)
 
 	def get_nil_rated_invoices(self):
@@ -100,31 +103,31 @@
 				"description": "Inter-State supplies to registered persons",
 				"nil_rated": 0.0,
 				"exempted": 0.0,
-				"non_gst": 0.0
+				"non_gst": 0.0,
 			},
 			{
 				"description": "Intra-State supplies to registered persons",
 				"nil_rated": 0.0,
 				"exempted": 0.0,
-				"non_gst": 0.0
+				"non_gst": 0.0,
 			},
 			{
 				"description": "Inter-State supplies to unregistered persons",
 				"nil_rated": 0.0,
 				"exempted": 0.0,
-				"non_gst": 0.0
+				"non_gst": 0.0,
 			},
 			{
 				"description": "Intra-State supplies to unregistered persons",
 				"nil_rated": 0.0,
 				"exempted": 0.0,
-				"non_gst": 0.0
-			}
+				"non_gst": 0.0,
+			},
 		]
 
 		for invoice, details in self.nil_exempt_non_gst.items():
 			invoice_detail = self.invoices.get(invoice)
-			if invoice_detail.get('gst_category') in ("Registered Regular", "Deemed Export", "SEZ"):
+			if invoice_detail.get("gst_category") in ("Registered Regular", "Deemed Export", "SEZ"):
 				if is_inter_state(invoice_detail):
 					nil_exempt_output[0]["nil_rated"] += details[0]
 					nil_exempt_output[0]["exempted"] += details[1]
@@ -153,26 +156,34 @@
 				invoice_details = self.invoices.get(inv)
 				for rate, items in items_based_on_rate.items():
 					place_of_supply = invoice_details.get("place_of_supply")
-					ecommerce_gstin =  invoice_details.get("ecommerce_gstin")
+					ecommerce_gstin = invoice_details.get("ecommerce_gstin")
 
-					b2cs_output.setdefault((rate, place_of_supply, ecommerce_gstin), {
-						"place_of_supply": "",
-						"ecommerce_gstin": "",
-						"rate": "",
-						"taxable_value": 0,
-						"cess_amount": 0,
-						"type": "",
-						"invoice_number": invoice_details.get("invoice_number"),
-						"posting_date": invoice_details.get("posting_date"),
-						"invoice_value": invoice_details.get("base_grand_total"),
-					})
+					b2cs_output.setdefault(
+						(rate, place_of_supply, ecommerce_gstin),
+						{
+							"place_of_supply": "",
+							"ecommerce_gstin": "",
+							"rate": "",
+							"taxable_value": 0,
+							"cess_amount": 0,
+							"type": "",
+							"invoice_number": invoice_details.get("invoice_number"),
+							"posting_date": invoice_details.get("posting_date"),
+							"invoice_value": invoice_details.get("base_grand_total"),
+						},
+					)
 
 					row = b2cs_output.get((rate, place_of_supply, ecommerce_gstin))
 					row["place_of_supply"] = place_of_supply
 					row["ecommerce_gstin"] = ecommerce_gstin
 					row["rate"] = rate
-					row["taxable_value"] += sum([abs(net_amount)
-						for item_code, net_amount in self.invoice_items.get(inv).items() if item_code in items])
+					row["taxable_value"] += sum(
+						[
+							abs(net_amount)
+							for item_code, net_amount in self.invoice_items.get(inv).items()
+							if item_code in items
+						]
+					)
 					row["cess_amount"] += flt(self.invoice_cess.get(inv), 2)
 					row["type"] = "E" if ecommerce_gstin else "OE"
 
@@ -182,14 +193,17 @@
 	def get_row_data_for_invoice(self, invoice, invoice_details, tax_rate, items):
 		row = []
 		for fieldname in self.invoice_fields:
-			if self.filters.get("type_of_business") in ("CDNR-REG", "CDNR-UNREG") and fieldname == "invoice_value":
+			if (
+				self.filters.get("type_of_business") in ("CDNR-REG", "CDNR-UNREG")
+				and fieldname == "invoice_value"
+			):
 				row.append(abs(invoice_details.base_rounded_total) or abs(invoice_details.base_grand_total))
 			elif fieldname == "invoice_value":
 				row.append(invoice_details.base_rounded_total or invoice_details.base_grand_total)
-			elif fieldname in ('posting_date', 'shipping_bill_date'):
-				row.append(formatdate(invoice_details.get(fieldname), 'dd-MMM-YY'))
+			elif fieldname in ("posting_date", "shipping_bill_date"):
+				row.append(formatdate(invoice_details.get(fieldname), "dd-MMM-YY"))
 			elif fieldname == "export_type":
-				export_type = "WPAY" if invoice_details.get(fieldname)=="With Payment of Tax" else "WOPAY"
+				export_type = "WPAY" if invoice_details.get(fieldname) == "With Payment of Tax" else "WOPAY"
 				row.append(export_type)
 			else:
 				row.append(invoice_details.get(fieldname))
@@ -202,20 +216,25 @@
 
 		for item_code, net_amount in self.invoice_items.get(invoice).items():
 			if item_code in items:
-				if self.item_tax_rate.get(invoice) and tax_rate/division_factor in self.item_tax_rate.get(invoice, {}).get(item_code, []):
+				if self.item_tax_rate.get(invoice) and tax_rate / division_factor in self.item_tax_rate.get(
+					invoice, {}
+				).get(item_code, []):
 					taxable_value += abs(net_amount)
 				elif not self.item_tax_rate.get(invoice):
 					taxable_value += abs(net_amount)
 				elif tax_rate:
 					taxable_value += abs(net_amount)
-				elif not tax_rate and self.filters.get('type_of_business') == 'EXPORT' \
-					and invoice_details.get('export_type') == "Without Payment of Tax":
+				elif (
+					not tax_rate
+					and self.filters.get("type_of_business") == "EXPORT"
+					and invoice_details.get("export_type") == "Without Payment of Tax"
+				):
 					taxable_value += abs(net_amount)
 
 		row += [tax_rate or 0, taxable_value]
 
 		for column in self.other_columns:
-			if column.get('fieldname') == 'cess_amount':
+			if column.get("fieldname") == "cess_amount":
 				row.append(flt(self.invoice_cess.get(invoice), 2))
 
 		return row, taxable_value
@@ -224,68 +243,82 @@
 		self.invoices = frappe._dict()
 		conditions = self.get_conditions()
 
-		invoice_data = frappe.db.sql("""
+		invoice_data = frappe.db.sql(
+			"""
 			select
 				{select_columns}
 			from `tab{doctype}`
 			where docstatus = 1 {where_conditions}
 			and is_opening = 'No'
 			order by posting_date desc
-			""".format(select_columns=self.select_columns, doctype=self.doctype,
-				where_conditions=conditions), self.filters, as_dict=1)
+			""".format(
+				select_columns=self.select_columns, doctype=self.doctype, where_conditions=conditions
+			),
+			self.filters,
+			as_dict=1,
+		)
 
 		for d in invoice_data:
 			self.invoices.setdefault(d.invoice_number, d)
 
 	def get_advance_entries(self):
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			SELECT SUM(a.base_tax_amount) as amount, a.account_head, a.rate, p.place_of_supply
 			FROM `tabPayment Entry` p, `tabAdvance Taxes and Charges` a
 			WHERE p.docstatus = 1
 			AND p.name = a.parent
 			AND posting_date between %s and %s
 			GROUP BY a.account_head, p.place_of_supply, a.rate
-		""", (self.filters.get('from_date'), self.filters.get('to_date')), as_dict=1)
+		""",
+			(self.filters.get("from_date"), self.filters.get("to_date")),
+			as_dict=1,
+		)
 
 	def get_conditions(self):
 		conditions = ""
 
-		for opts in (("company", " and company=%(company)s"),
+		for opts in (
+			("company", " and company=%(company)s"),
 			("from_date", " and posting_date>=%(from_date)s"),
 			("to_date", " and posting_date<=%(to_date)s"),
 			("company_address", " and company_address=%(company_address)s"),
-			("company_gstin", " and company_gstin=%(company_gstin)s")):
-				if self.filters.get(opts[0]):
-					conditions += opts[1]
+			("company_gstin", " and company_gstin=%(company_gstin)s"),
+		):
+			if self.filters.get(opts[0]):
+				conditions += opts[1]
 
-
-		if self.filters.get("type_of_business") ==  "B2B":
+		if self.filters.get("type_of_business") == "B2B":
 			conditions += "AND IFNULL(gst_category, '') in ('Registered Regular', 'Registered Composition', 'Deemed Export', 'SEZ') AND is_return != 1 AND is_debit_note !=1"
 
 		if self.filters.get("type_of_business") in ("B2C Large", "B2C Small"):
-			b2c_limit = frappe.db.get_single_value('GST Settings', 'b2c_limit')
+			b2c_limit = frappe.db.get_single_value("GST Settings", "b2c_limit")
 			if not b2c_limit:
 				frappe.throw(_("Please set B2C Limit in GST Settings."))
 
-		if self.filters.get("type_of_business") ==  "B2C Large":
+		if self.filters.get("type_of_business") == "B2C Large":
 			conditions += """ AND ifnull(SUBSTR(place_of_supply, 1, 2),'') != ifnull(SUBSTR(company_gstin, 1, 2),'')
-				AND grand_total > {0} AND is_return != 1 AND is_debit_note !=1 AND gst_category ='Unregistered' """.format(flt(b2c_limit))
+				AND grand_total > {0} AND is_return != 1 AND is_debit_note !=1 AND gst_category ='Unregistered' """.format(
+				flt(b2c_limit)
+			)
 
-		elif self.filters.get("type_of_business") ==  "B2C Small":
+		elif self.filters.get("type_of_business") == "B2C Small":
 			conditions += """ AND (
 				SUBSTR(place_of_supply, 1, 2) = SUBSTR(company_gstin, 1, 2)
-					OR grand_total <= {0}) and is_return != 1 AND gst_category ='Unregistered' """.format(flt(b2c_limit))
+					OR grand_total <= {0}) and is_return != 1 AND gst_category ='Unregistered' """.format(
+				flt(b2c_limit)
+			)
 
 		elif self.filters.get("type_of_business") == "CDNR-REG":
 			conditions += """ AND (is_return = 1 OR is_debit_note = 1) AND IFNULL(gst_category, '') in ('Registered Regular', 'Deemed Export', 'SEZ')"""
 
 		elif self.filters.get("type_of_business") == "CDNR-UNREG":
-			b2c_limit = frappe.db.get_single_value('GST Settings', 'b2c_limit')
+			b2c_limit = frappe.db.get_single_value("GST Settings", "b2c_limit")
 			conditions += """ AND ifnull(SUBSTR(place_of_supply, 1, 2),'') != ifnull(SUBSTR(company_gstin, 1, 2),'')
 				AND (is_return = 1 OR is_debit_note = 1)
 				AND IFNULL(gst_category, '') in ('Unregistered', 'Overseas')"""
 
-		elif self.filters.get("type_of_business") ==  "EXPORT":
+		elif self.filters.get("type_of_business") == "EXPORT":
 			conditions += """ AND is_return !=1 and gst_category = 'Overseas' """
 
 		conditions += " AND IFNULL(billing_address_gstin, '') != company_gstin"
@@ -297,15 +330,22 @@
 		self.item_tax_rate = frappe._dict()
 		self.nil_exempt_non_gst = {}
 
-		items = frappe.db.sql("""
+		items = frappe.db.sql(
+			"""
 			select item_code, parent, taxable_value, base_net_amount, item_tax_rate, is_nil_exempt,
 			is_non_gst from `tab%s Item`
 			where parent in (%s)
-		""" % (self.doctype, ', '.join(['%s']*len(self.invoices))), tuple(self.invoices), as_dict=1)
+		"""
+			% (self.doctype, ", ".join(["%s"] * len(self.invoices))),
+			tuple(self.invoices),
+			as_dict=1,
+		)
 
 		for d in items:
 			self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code, 0.0)
-			self.invoice_items[d.parent][d.item_code] += d.get('taxable_value', 0) or d.get('base_net_amount', 0)
+			self.invoice_items[d.parent][d.item_code] += d.get("taxable_value", 0) or d.get(
+				"base_net_amount", 0
+			)
 
 			item_tax_rate = {}
 
@@ -319,15 +359,16 @@
 			if d.is_nil_exempt:
 				self.nil_exempt_non_gst.setdefault(d.parent, [0.0, 0.0, 0.0])
 				if item_tax_rate:
-					self.nil_exempt_non_gst[d.parent][0] += d.get('taxable_value', 0)
+					self.nil_exempt_non_gst[d.parent][0] += d.get("taxable_value", 0)
 				else:
-					self.nil_exempt_non_gst[d.parent][1] += d.get('taxable_value', 0)
+					self.nil_exempt_non_gst[d.parent][1] += d.get("taxable_value", 0)
 			elif d.is_non_gst:
 				self.nil_exempt_non_gst.setdefault(d.parent, [0.0, 0.0, 0.0])
-				self.nil_exempt_non_gst[d.parent][2] += d.get('taxable_value', 0)
+				self.nil_exempt_non_gst[d.parent][2] += d.get("taxable_value", 0)
 
 	def get_items_based_on_tax_rate(self):
-		self.tax_details = frappe.db.sql("""
+		self.tax_details = frappe.db.sql(
+			"""
 			select
 				parent, account_head, item_wise_tax_detail, base_tax_amount_after_discount_amount
 			from `tab%s`
@@ -335,8 +376,10 @@
 				parenttype = %s and docstatus = 1
 				and parent in (%s)
 			order by account_head
-		""" % (self.tax_doctype, '%s', ', '.join(['%s']*len(self.invoices.keys()))),
-			tuple([self.doctype] + list(self.invoices.keys())))
+		"""
+			% (self.tax_doctype, "%s", ", ".join(["%s"] * len(self.invoices.keys()))),
+			tuple([self.doctype] + list(self.invoices.keys())),
+		)
 
 		self.items_based_on_tax_rate = {}
 		self.invoice_cess = frappe._dict()
@@ -352,8 +395,7 @@
 					try:
 						item_wise_tax_detail = json.loads(item_wise_tax_detail)
 						cgst_or_sgst = False
-						if account in self.gst_accounts.cgst_account \
-							or account in self.gst_accounts.sgst_account:
+						if account in self.gst_accounts.cgst_account or account in self.gst_accounts.sgst_account:
 							cgst_or_sgst = True
 
 						if not (cgst_or_sgst or account in self.gst_accounts.igst_account):
@@ -370,22 +412,30 @@
 									if parent not in self.cgst_sgst_invoices:
 										self.cgst_sgst_invoices.append(parent)
 
-								rate_based_dict = self.items_based_on_tax_rate\
-									.setdefault(parent, {}).setdefault(tax_rate, [])
+								rate_based_dict = self.items_based_on_tax_rate.setdefault(parent, {}).setdefault(
+									tax_rate, []
+								)
 								if item_code not in rate_based_dict:
 									rate_based_dict.append(item_code)
 					except ValueError:
 						continue
 		if unidentified_gst_accounts:
-			frappe.msgprint(_("Following accounts might be selected in GST Settings:")
-				+ "<br>" + "<br>".join(unidentified_gst_accounts), alert=True)
+			frappe.msgprint(
+				_("Following accounts might be selected in GST Settings:")
+				+ "<br>"
+				+ "<br>".join(unidentified_gst_accounts),
+				alert=True,
+			)
 
 		# Build itemised tax for export invoices where tax table is blank
 		for invoice, items in self.invoice_items.items():
-			if invoice not in self.items_based_on_tax_rate and invoice not in unidentified_gst_accounts_invoice \
-				and self.invoices.get(invoice, {}).get('export_type') == "Without Payment of Tax" \
-				and self.invoices.get(invoice, {}).get('gst_category') in ("Overseas", "SEZ"):
-					self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, items.keys())
+			if (
+				invoice not in self.items_based_on_tax_rate
+				and invoice not in unidentified_gst_accounts_invoice
+				and self.invoices.get(invoice, {}).get("export_type") == "Without Payment of Tax"
+				and self.invoices.get(invoice, {}).get("gst_category") in ("Overseas", "SEZ")
+			):
+				self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, items.keys())
 
 	def get_columns(self):
 		self.other_columns = []
@@ -393,417 +443,258 @@
 
 		if self.filters.get("type_of_business") != "NIL Rated":
 			self.tax_columns = [
-				{
-					"fieldname": "rate",
-					"label": "Rate",
-					"fieldtype": "Int",
-					"width": 60
-				},
+				{"fieldname": "rate", "label": "Rate", "fieldtype": "Int", "width": 60},
 				{
 					"fieldname": "taxable_value",
 					"label": "Taxable Value",
 					"fieldtype": "Currency",
-					"width": 100
-				}
+					"width": 100,
+				},
 			]
 
-		if self.filters.get("type_of_business") ==  "B2B":
+		if self.filters.get("type_of_business") == "B2B":
 			self.invoice_columns = [
 				{
 					"fieldname": "billing_address_gstin",
 					"label": "GSTIN/UIN of Recipient",
 					"fieldtype": "Data",
-					"width": 150
+					"width": 150,
 				},
-				{
-					"fieldname": "customer_name",
-					"label": "Receiver Name",
-					"fieldtype": "Data",
-					"width":100
-				},
+				{"fieldname": "customer_name", "label": "Receiver Name", "fieldtype": "Data", "width": 100},
 				{
 					"fieldname": "invoice_number",
 					"label": "Invoice Number",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width":100
+					"width": 100,
 				},
-				{
-					"fieldname": "posting_date",
-					"label": "Invoice date",
-					"fieldtype": "Data",
-					"width":80
-				},
+				{"fieldname": "posting_date", "label": "Invoice date", "fieldtype": "Data", "width": 80},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width":100
+					"width": 100,
 				},
 				{
 					"fieldname": "place_of_supply",
 					"label": "Place Of Supply",
 					"fieldtype": "Data",
-					"width":100
+					"width": 100,
 				},
-				{
-					"fieldname": "reverse_charge",
-					"label": "Reverse Charge",
-					"fieldtype": "Data"
-				},
-				{
-					"fieldname": "gst_category",
-					"label": "Invoice Type",
-					"fieldtype": "Data"
-				},
+				{"fieldname": "reverse_charge", "label": "Reverse Charge", "fieldtype": "Data"},
+				{"fieldname": "gst_category", "label": "Invoice Type", "fieldtype": "Data"},
 				{
 					"fieldname": "ecommerce_gstin",
 					"label": "E-Commerce GSTIN",
 					"fieldtype": "Data",
-					"width":120
-				}
+					"width": 120,
+				},
 			]
 			self.other_columns = [
-					{
-						"fieldname": "cess_amount",
-						"label": "Cess Amount",
-						"fieldtype": "Currency",
-						"width": 100
-					}
-				]
+				{"fieldname": "cess_amount", "label": "Cess Amount", "fieldtype": "Currency", "width": 100}
+			]
 
-		elif self.filters.get("type_of_business") ==  "B2C Large":
+		elif self.filters.get("type_of_business") == "B2C Large":
 			self.invoice_columns = [
 				{
 					"fieldname": "invoice_number",
 					"label": "Invoice Number",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "posting_date",
-					"label": "Invoice date",
-					"fieldtype": "Data",
-					"width": 100
-				},
+				{"fieldname": "posting_date", "label": "Invoice date", "fieldtype": "Data", "width": 100},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width": 100
+					"width": 100,
 				},
 				{
 					"fieldname": "place_of_supply",
 					"label": "Place Of Supply",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "ecommerce_gstin",
 					"label": "E-Commerce GSTIN",
 					"fieldtype": "Data",
-					"width": 130
-				}
+					"width": 130,
+				},
 			]
 			self.other_columns = [
-					{
-						"fieldname": "cess_amount",
-						"label": "Cess Amount",
-						"fieldtype": "Currency",
-						"width": 100
-					}
-				]
+				{"fieldname": "cess_amount", "label": "Cess Amount", "fieldtype": "Currency", "width": 100}
+			]
 		elif self.filters.get("type_of_business") == "CDNR-REG":
 			self.invoice_columns = [
 				{
 					"fieldname": "billing_address_gstin",
 					"label": "GSTIN/UIN of Recipient",
 					"fieldtype": "Data",
-					"width": 150
+					"width": 150,
 				},
-				{
-					"fieldname": "customer_name",
-					"label": "Receiver Name",
-					"fieldtype": "Data",
-					"width": 120
-				},
+				{"fieldname": "customer_name", "label": "Receiver Name", "fieldtype": "Data", "width": 120},
 				{
 					"fieldname": "return_against",
 					"label": "Invoice/Advance Receipt Number",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "posting_date",
 					"label": "Invoice/Advance Receipt date",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "invoice_number",
 					"label": "Invoice/Advance Receipt Number",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width":120
+					"width": 120,
 				},
-				{
-					"fieldname": "reverse_charge",
-					"label": "Reverse Charge",
-					"fieldtype": "Data"
-				},
-				{
-					"fieldname": "export_type",
-					"label": "Export Type",
-					"fieldtype": "Data",
-					"hidden": 1
-				},
+				{"fieldname": "reverse_charge", "label": "Reverse Charge", "fieldtype": "Data"},
+				{"fieldname": "export_type", "label": "Export Type", "fieldtype": "Data", "hidden": 1},
 				{
 					"fieldname": "reason_for_issuing_document",
 					"label": "Reason For Issuing document",
 					"fieldtype": "Data",
-					"width": 140
+					"width": 140,
 				},
 				{
 					"fieldname": "place_of_supply",
 					"label": "Place Of Supply",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "gst_category",
-					"label": "GST Category",
-					"fieldtype": "Data"
-				},
+				{"fieldname": "gst_category", "label": "GST Category", "fieldtype": "Data"},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width": 120
-				}
+					"width": 120,
+				},
 			]
 			self.other_columns = [
-				{
-					"fieldname": "cess_amount",
-					"label": "Cess Amount",
-					"fieldtype": "Currency",
-					"width": 100
-				},
-				{
-					"fieldname": "pre_gst",
-					"label": "PRE GST",
-					"fieldtype": "Data",
-					"width": 80
-				},
-				{
-					"fieldname": "document_type",
-					"label": "Document Type",
-					"fieldtype": "Data",
-					"width": 80
-				}
+				{"fieldname": "cess_amount", "label": "Cess Amount", "fieldtype": "Currency", "width": 100},
+				{"fieldname": "pre_gst", "label": "PRE GST", "fieldtype": "Data", "width": 80},
+				{"fieldname": "document_type", "label": "Document Type", "fieldtype": "Data", "width": 80},
 			]
 		elif self.filters.get("type_of_business") == "CDNR-UNREG":
 			self.invoice_columns = [
-				{
-					"fieldname": "customer_name",
-					"label": "Receiver Name",
-					"fieldtype": "Data",
-					"width": 120
-				},
+				{"fieldname": "customer_name", "label": "Receiver Name", "fieldtype": "Data", "width": 120},
 				{
 					"fieldname": "return_against",
 					"label": "Issued Against",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "posting_date",
-					"label": "Note Date",
-					"fieldtype": "Date",
-					"width": 120
-				},
+				{"fieldname": "posting_date", "label": "Note Date", "fieldtype": "Date", "width": 120},
 				{
 					"fieldname": "invoice_number",
 					"label": "Note Number",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width":120
+					"width": 120,
 				},
-				{
-					"fieldname": "export_type",
-					"label": "Export Type",
-					"fieldtype": "Data",
-					"hidden": 1
-				},
+				{"fieldname": "export_type", "label": "Export Type", "fieldtype": "Data", "hidden": 1},
 				{
 					"fieldname": "reason_for_issuing_document",
 					"label": "Reason For Issuing document",
 					"fieldtype": "Data",
-					"width": 140
+					"width": 140,
 				},
 				{
 					"fieldname": "place_of_supply",
 					"label": "Place Of Supply",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "gst_category",
-					"label": "GST Category",
-					"fieldtype": "Data"
-				},
+				{"fieldname": "gst_category", "label": "GST Category", "fieldtype": "Data"},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width": 120
-				}
+					"width": 120,
+				},
 			]
 			self.other_columns = [
-				{
-					"fieldname": "cess_amount",
-					"label": "Cess Amount",
-					"fieldtype": "Currency",
-					"width": 100
-				},
-				{
-					"fieldname": "pre_gst",
-					"label": "PRE GST",
-					"fieldtype": "Data",
-					"width": 80
-				},
-				{
-					"fieldname": "document_type",
-					"label": "Document Type",
-					"fieldtype": "Data",
-					"width": 80
-				}
+				{"fieldname": "cess_amount", "label": "Cess Amount", "fieldtype": "Currency", "width": 100},
+				{"fieldname": "pre_gst", "label": "PRE GST", "fieldtype": "Data", "width": 80},
+				{"fieldname": "document_type", "label": "Document Type", "fieldtype": "Data", "width": 80},
 			]
-		elif self.filters.get("type_of_business") ==  "B2C Small":
+		elif self.filters.get("type_of_business") == "B2C Small":
 			self.invoice_columns = [
 				{
 					"fieldname": "place_of_supply",
 					"label": "Place Of Supply",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "ecommerce_gstin",
 					"label": "E-Commerce GSTIN",
 					"fieldtype": "Data",
-					"width": 130
-				}
+					"width": 130,
+				},
 			]
 			self.other_columns = [
-				{
-						"fieldname": "cess_amount",
-						"label": "Cess Amount",
-						"fieldtype": "Currency",
-						"width": 100
-				},
-				{
-					"fieldname": "type",
-					"label": "Type",
-					"fieldtype": "Data",
-					"width": 50
-				}
+				{"fieldname": "cess_amount", "label": "Cess Amount", "fieldtype": "Currency", "width": 100},
+				{"fieldname": "type", "label": "Type", "fieldtype": "Data", "width": 50},
 			]
-		elif self.filters.get("type_of_business") ==  "EXPORT":
+		elif self.filters.get("type_of_business") == "EXPORT":
 			self.invoice_columns = [
-				{
-					"fieldname": "export_type",
-					"label": "Export Type",
-					"fieldtype": "Data",
-					"width":120
-				},
+				{"fieldname": "export_type", "label": "Export Type", "fieldtype": "Data", "width": 120},
 				{
 					"fieldname": "invoice_number",
 					"label": "Invoice Number",
 					"fieldtype": "Link",
 					"options": "Sales Invoice",
-					"width":120
+					"width": 120,
 				},
-				{
-					"fieldname": "posting_date",
-					"label": "Invoice date",
-					"fieldtype": "Data",
-					"width": 120
-				},
+				{"fieldname": "posting_date", "label": "Invoice date", "fieldtype": "Data", "width": 120},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "port_code",
-					"label": "Port Code",
-					"fieldtype": "Data",
-					"width": 120
-				},
+				{"fieldname": "port_code", "label": "Port Code", "fieldtype": "Data", "width": 120},
 				{
 					"fieldname": "shipping_bill_number",
 					"label": "Shipping Bill Number",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "shipping_bill_date",
 					"label": "Shipping Bill Date",
 					"fieldtype": "Data",
-					"width": 120
-				}
+					"width": 120,
+				},
 			]
 		elif self.filters.get("type_of_business") == "Advances":
 			self.invoice_columns = [
-				{
-					"fieldname": "place_of_supply",
-					"label": "Place Of Supply",
-					"fieldtype": "Data",
-					"width": 120
-				}
+				{"fieldname": "place_of_supply", "label": "Place Of Supply", "fieldtype": "Data", "width": 120}
 			]
 
 			self.other_columns = [
-				{
-						"fieldname": "cess_amount",
-						"label": "Cess Amount",
-						"fieldtype": "Currency",
-						"width": 100
-				}
+				{"fieldname": "cess_amount", "label": "Cess Amount", "fieldtype": "Currency", "width": 100}
 			]
 		elif self.filters.get("type_of_business") == "NIL Rated":
 			self.invoice_columns = [
-				{
-					"fieldname": "description",
-					"label": "Description",
-					"fieldtype": "Data",
-					"width": 420
-				},
-				{
-					"fieldname": "nil_rated",
-					"label": "Nil Rated",
-					"fieldtype": "Currency",
-					"width": 200
-				},
-				{
-					"fieldname": "exempted",
-					"label": "Exempted",
-					"fieldtype": "Currency",
-					"width": 200
-				},
-				{
-					"fieldname": "non_gst",
-					"label": "Non GST",
-					"fieldtype": "Currency",
-					"width": 200
-				}
+				{"fieldname": "description", "label": "Description", "fieldtype": "Data", "width": 420},
+				{"fieldname": "nil_rated", "label": "Nil Rated", "fieldtype": "Currency", "width": 200},
+				{"fieldname": "exempted", "label": "Exempted", "fieldtype": "Currency", "width": 200},
+				{"fieldname": "non_gst", "label": "Non GST", "fieldtype": "Currency", "width": 200},
 			]
 
 		self.columns = self.invoice_columns + self.tax_columns + self.other_columns
 
+
 @frappe.whitelist()
 def get_json(filters, report_name, data):
 	filters = json.loads(filters)
@@ -812,13 +703,14 @@
 
 	fp = "%02d%s" % (getdate(filters["to_date"]).month, getdate(filters["to_date"]).year)
 
-	gst_json = {"version": "GST3.0.4",
-		"hash": "hash", "gstin": gstin, "fp": fp}
+	gst_json = {"version": "GST3.0.4", "hash": "hash", "gstin": gstin, "fp": fp}
 
 	res = {}
 	if filters["type_of_business"] == "B2B":
 		for item in report_data[:-1]:
-			res.setdefault(item["billing_address_gstin"], {}).setdefault(item["invoice_number"],[]).append(item)
+			res.setdefault(item["billing_address_gstin"], {}).setdefault(item["invoice_number"], []).append(
+				item
+			)
 
 		out = get_b2b_json(res, gstin)
 		gst_json["b2b"] = out
@@ -842,13 +734,15 @@
 		gst_json["exp"] = out
 	elif filters["type_of_business"] == "CDNR-REG":
 		for item in report_data[:-1]:
-			res.setdefault(item["billing_address_gstin"], {}).setdefault(item["invoice_number"],[]).append(item)
+			res.setdefault(item["billing_address_gstin"], {}).setdefault(item["invoice_number"], []).append(
+				item
+			)
 
 		out = get_cdnr_reg_json(res, gstin)
 		gst_json["cdnr"] = out
 	elif filters["type_of_business"] == "CDNR-UNREG":
 		for item in report_data[:-1]:
-			res.setdefault(item["invoice_number"],[]).append(item)
+			res.setdefault(item["invoice_number"], []).append(item)
 
 		out = get_cdnr_unreg_json(res, gstin)
 		gst_json["cdnur"] = out
@@ -856,10 +750,14 @@
 	elif filters["type_of_business"] == "Advances":
 		for item in report_data[:-1]:
 			if not item.get("place_of_supply"):
-				frappe.throw(_("""{0} not entered in some entries.
-					Please update and try again""").format(frappe.bold("Place Of Supply")))
+				frappe.throw(
+					_(
+						"""{0} not entered in some entries.
+					Please update and try again"""
+					).format(frappe.bold("Place Of Supply"))
+				)
 
-			res.setdefault(item["place_of_supply"],[]).append(item)
+			res.setdefault(item["place_of_supply"], []).append(item)
 
 		out = get_advances_json(res, gstin)
 		gst_json["at"] = out
@@ -869,30 +767,34 @@
 		out = get_exempted_json(res)
 		gst_json["nil"] = out
 
-	return {
-		'report_name': report_name,
-		'report_type': filters['type_of_business'],
-		'data': gst_json
-	}
+	return {"report_name": report_name, "report_type": filters["type_of_business"], "data": gst_json}
+
 
 def get_b2b_json(res, gstin):
 	out = []
 	for gst_in in res:
 		b2b_item, inv = {"ctin": gst_in, "inv": []}, []
-		if not gst_in: continue
+		if not gst_in:
+			continue
 
 		for number, invoice in res[gst_in].items():
 			if not invoice[0]["place_of_supply"]:
-				frappe.throw(_("""{0} not entered in Invoice {1}.
-					Please update and try again""").format(frappe.bold("Place Of Supply"),
-					frappe.bold(invoice[0]['invoice_number'])))
+				frappe.throw(
+					_(
+						"""{0} not entered in Invoice {1}.
+					Please update and try again"""
+					).format(
+						frappe.bold("Place Of Supply"), frappe.bold(invoice[0]["invoice_number"])
+					)
+				)
 
 			inv_item = get_basic_invoice_detail(invoice[0])
-			inv_item["pos"] = "%02d" % int(invoice[0]["place_of_supply"].split('-')[0])
+			inv_item["pos"] = "%02d" % int(invoice[0]["place_of_supply"].split("-")[0])
 			inv_item["rchrg"] = invoice[0]["reverse_charge"]
 			inv_item["inv_typ"] = get_invoice_type(invoice[0])
 
-			if inv_item["pos"]=="00": continue
+			if inv_item["pos"] == "00":
+				continue
 			inv_item["itms"] = []
 
 			for item in invoice:
@@ -900,95 +802,101 @@
 
 			inv.append(inv_item)
 
-		if not inv: continue
+		if not inv:
+			continue
 		b2b_item["inv"] = inv
 		out.append(b2b_item)
 
 	return out
 
+
 def get_b2cs_json(data, gstin):
 	company_state_number = gstin[0:2]
 
 	out = []
 	for d in data:
 		if not d.get("place_of_supply"):
-			frappe.throw(_("""{0} not entered in some invoices.
-				Please update and try again""").format(frappe.bold("Place Of Supply")))
+			frappe.throw(
+				_(
+					"""{0} not entered in some invoices.
+				Please update and try again"""
+				).format(frappe.bold("Place Of Supply"))
+			)
 
-		pos = d.get('place_of_supply').split('-')[0]
+		pos = d.get("place_of_supply").split("-")[0]
 		tax_details = {}
 
-		rate = d.get('rate', 0)
-		tax = flt((d["taxable_value"]*rate)/100.0, 2)
+		rate = d.get("rate", 0)
+		tax = flt((d["taxable_value"] * rate) / 100.0, 2)
 
 		if company_state_number == pos:
-			tax_details.update({"camt": flt(tax/2.0, 2), "samt": flt(tax/2.0, 2)})
+			tax_details.update({"camt": flt(tax / 2.0, 2), "samt": flt(tax / 2.0, 2)})
 		else:
 			tax_details.update({"iamt": tax})
 
 		inv = {
 			"sply_ty": "INTRA" if company_state_number == pos else "INTER",
 			"pos": pos,
-			"typ": d.get('type'),
-			"txval": flt(d.get('taxable_value'), 2),
+			"typ": d.get("type"),
+			"txval": flt(d.get("taxable_value"), 2),
 			"rt": rate,
-			"iamt": flt(tax_details.get('iamt'), 2),
-			"camt": flt(tax_details.get('camt'), 2),
-			"samt": flt(tax_details.get('samt'), 2),
-			"csamt": flt(d.get('cess_amount'), 2)
+			"iamt": flt(tax_details.get("iamt"), 2),
+			"camt": flt(tax_details.get("camt"), 2),
+			"samt": flt(tax_details.get("samt"), 2),
+			"csamt": flt(d.get("cess_amount"), 2),
 		}
 
-		if d.get('type') == "E" and d.get('ecommerce_gstin'):
-			inv.update({
-				"etin": d.get('ecommerce_gstin')
-			})
+		if d.get("type") == "E" and d.get("ecommerce_gstin"):
+			inv.update({"etin": d.get("ecommerce_gstin")})
 
 		out.append(inv)
 
 	return out
 
+
 def get_advances_json(data, gstin):
 	company_state_number = gstin[0:2]
 	out = []
 	for place_of_supply, items in data.items():
-		supply_type = "INTRA" if company_state_number == place_of_supply.split('-')[0] else "INTER"
-		row = {
-			"pos": place_of_supply.split('-')[0],
-			"itms": [],
-			"sply_ty": supply_type
-		}
+		supply_type = "INTRA" if company_state_number == place_of_supply.split("-")[0] else "INTER"
+		row = {"pos": place_of_supply.split("-")[0], "itms": [], "sply_ty": supply_type}
 
 		for item in items:
 			itms = {
-				'rt': item['rate'],
-				'ad_amount': flt(item.get('taxable_value')),
-				'csamt': flt(item.get('cess_amount'))
+				"rt": item["rate"],
+				"ad_amount": flt(item.get("taxable_value")),
+				"csamt": flt(item.get("cess_amount")),
 			}
 
 			if supply_type == "INTRA":
-				itms.update({
-					"samt": flt((itms["ad_amount"] * itms["rt"]) / 100),
-					"camt": flt((itms["ad_amount"] * itms["rt"]) / 100),
-					"rt": itms["rt"] * 2
-				})
+				itms.update(
+					{
+						"samt": flt((itms["ad_amount"] * itms["rt"]) / 100),
+						"camt": flt((itms["ad_amount"] * itms["rt"]) / 100),
+						"rt": itms["rt"] * 2,
+					}
+				)
 			else:
-				itms.update({
-					"iamt": flt((itms["ad_amount"] * itms["rt"]) / 100)
-				})
+				itms.update({"iamt": flt((itms["ad_amount"] * itms["rt"]) / 100)})
 
-			row['itms'].append(itms)
+			row["itms"].append(itms)
 		out.append(row)
 
 	return out
 
+
 def get_b2cl_json(res, gstin):
 	out = []
 	for pos in res:
 		if not pos:
-			frappe.throw(_("""{0} not entered in some invoices.
-				Please update and try again""").format(frappe.bold("Place Of Supply")))
+			frappe.throw(
+				_(
+					"""{0} not entered in some invoices.
+				Please update and try again"""
+				).format(frappe.bold("Place Of Supply"))
+			)
 
-		b2cl_item, inv = {"pos": "%02d" % int(pos.split('-')[0]), "inv": []}, []
+		b2cl_item, inv = {"pos": "%02d" % int(pos.split("-")[0]), "inv": []}, []
 
 		for row in res[pos]:
 			inv_item = get_basic_invoice_detail(row)
@@ -1004,6 +912,7 @@
 
 	return out
 
+
 def get_export_json(res):
 	out = []
 	for exp_type in res:
@@ -1011,12 +920,9 @@
 
 		for row in res[exp_type]:
 			inv_item = get_basic_invoice_detail(row)
-			inv_item["itms"] = [{
-				"txval": flt(row["taxable_value"], 2),
-				"rt": row["rate"] or 0,
-				"iamt": 0,
-				"csamt": 0
-			}]
+			inv_item["itms"] = [
+				{"txval": flt(row["taxable_value"], 2), "rt": row["rate"] or 0, "iamt": 0, "csamt": 0}
+			]
 
 			inv.append(inv_item)
 
@@ -1025,27 +931,34 @@
 
 	return out
 
+
 def get_cdnr_reg_json(res, gstin):
 	out = []
 
 	for gst_in in res:
 		cdnr_item, inv = {"ctin": gst_in, "nt": []}, []
-		if not gst_in: continue
+		if not gst_in:
+			continue
 
 		for number, invoice in res[gst_in].items():
 			if not invoice[0]["place_of_supply"]:
-				frappe.throw(_("""{0} not entered in Invoice {1}.
-					Please update and try again""").format(frappe.bold("Place Of Supply"),
-					frappe.bold(invoice[0]['invoice_number'])))
+				frappe.throw(
+					_(
+						"""{0} not entered in Invoice {1}.
+					Please update and try again"""
+					).format(
+						frappe.bold("Place Of Supply"), frappe.bold(invoice[0]["invoice_number"])
+					)
+				)
 
 			inv_item = {
 				"nt_num": invoice[0]["invoice_number"],
-				"nt_dt": getdate(invoice[0]["posting_date"]).strftime('%d-%m-%Y'),
+				"nt_dt": getdate(invoice[0]["posting_date"]).strftime("%d-%m-%Y"),
 				"val": abs(flt(invoice[0]["invoice_value"])),
 				"ntty": invoice[0]["document_type"],
-				"pos": "%02d" % int(invoice[0]["place_of_supply"].split('-')[0]),
+				"pos": "%02d" % int(invoice[0]["place_of_supply"].split("-")[0]),
 				"rchrg": invoice[0]["reverse_charge"],
-				"inv_typ": get_invoice_type(invoice[0])
+				"inv_typ": get_invoice_type(invoice[0]),
 			}
 
 			inv_item["itms"] = []
@@ -1054,23 +967,25 @@
 
 			inv.append(inv_item)
 
-		if not inv: continue
+		if not inv:
+			continue
 		cdnr_item["nt"] = inv
 		out.append(cdnr_item)
 
 	return out
 
+
 def get_cdnr_unreg_json(res, gstin):
 	out = []
 
 	for invoice, items in res.items():
 		inv_item = {
 			"nt_num": items[0]["invoice_number"],
-			"nt_dt": getdate(items[0]["posting_date"]).strftime('%d-%m-%Y'),
+			"nt_dt": getdate(items[0]["posting_date"]).strftime("%d-%m-%Y"),
 			"val": abs(flt(items[0]["invoice_value"])),
 			"ntty": items[0]["document_type"],
-			"pos": "%02d" % int(items[0]["place_of_supply"].split('-')[0]),
-			"typ": get_invoice_type(items[0])
+			"pos": "%02d" % int(items[0]["place_of_supply"].split("-")[0]),
+			"typ": get_invoice_type(items[0]),
 		}
 
 		inv_item["itms"] = []
@@ -1081,63 +996,62 @@
 
 	return out
 
+
 def get_exempted_json(data):
 	out = {
 		"inv": [
-			{
-				"sply_ty": "INTRB2B"
-			},
-			{
-				"sply_ty": "INTRAB2B"
-			},
-			{
-				"sply_ty": "INTRB2C"
-			},
-			{
-				"sply_ty": "INTRAB2C"
-			}
+			{"sply_ty": "INTRB2B"},
+			{"sply_ty": "INTRAB2B"},
+			{"sply_ty": "INTRB2C"},
+			{"sply_ty": "INTRAB2C"},
 		]
 	}
 
 	for i, v in enumerate(data):
-		if data[i].get('nil_rated'):
-			out['inv'][i]['nil_amt'] = data[i]['nil_rated']
+		if data[i].get("nil_rated"):
+			out["inv"][i]["nil_amt"] = data[i]["nil_rated"]
 
-		if data[i].get('exempted'):
-			out['inv'][i]['expt_amt'] = data[i]['exempted']
+		if data[i].get("exempted"):
+			out["inv"][i]["expt_amt"] = data[i]["exempted"]
 
-		if data[i].get('non_gst'):
-			out['inv'][i]['ngsup_amt'] = data[i]['non_gst']
+		if data[i].get("non_gst"):
+			out["inv"][i]["ngsup_amt"] = data[i]["non_gst"]
 
 	return out
 
+
 def get_invoice_type(row):
-	gst_category = row.get('gst_category')
+	gst_category = row.get("gst_category")
 
-	if gst_category == 'SEZ':
-		return 'SEWP' if row.get('export_type') == 'WPAY' else 'SEWOP'
+	if gst_category == "SEZ":
+		return "SEWP" if row.get("export_type") == "WPAY" else "SEWOP"
 
-	if gst_category == 'Overseas':
-		return 'EXPWP' if row.get('export_type') == 'WPAY' else 'EXPWOP'
+	if gst_category == "Overseas":
+		return "EXPWP" if row.get("export_type") == "WPAY" else "EXPWOP"
 
-	return ({
-		'Deemed Export': 'DE',
-		'Registered Regular': 'R',
-		'Registered Composition': 'R',
-		'Unregistered': 'B2CL'
-	}).get(gst_category)
+	return (
+		{
+			"Deemed Export": "DE",
+			"Registered Regular": "R",
+			"Registered Composition": "R",
+			"Unregistered": "B2CL",
+		}
+	).get(gst_category)
+
 
 def get_basic_invoice_detail(row):
 	return {
 		"inum": row["invoice_number"],
-		"idt": getdate(row["posting_date"]).strftime('%d-%m-%Y'),
-		"val": flt(row["invoice_value"], 2)
+		"idt": getdate(row["posting_date"]).strftime("%d-%m-%Y"),
+		"val": flt(row["invoice_value"], 2),
 	}
 
+
 def get_rate_and_tax_details(row, gstin):
-	itm_det = {"txval": flt(row["taxable_value"], 2),
+	itm_det = {
+		"txval": flt(row["taxable_value"], 2),
 		"rt": row["rate"],
-		"csamt": (flt(row.get("cess_amount"), 2) or 0)
+		"csamt": (flt(row.get("cess_amount"), 2) or 0),
 	}
 
 	# calculate rate
@@ -1145,17 +1059,18 @@
 	rate = row.get("rate") or 0
 
 	# calculate tax amount added
-	tax = flt((row["taxable_value"]*rate)/100.0, 2)
-	frappe.errprint([tax, tax/2])
+	tax = flt((row["taxable_value"] * rate) / 100.0, 2)
+	frappe.errprint([tax, tax / 2])
 	if row.get("billing_address_gstin") and gstin[0:2] == row["billing_address_gstin"][0:2]:
-		itm_det.update({"camt": flt(tax/2.0, 2), "samt": flt(tax/2.0, 2)})
+		itm_det.update({"camt": flt(tax / 2.0, 2), "samt": flt(tax / 2.0, 2)})
 	else:
 		itm_det.update({"iamt": tax})
 
 	return {"num": int(num), "itm_det": itm_det}
 
+
 def get_company_gstin_number(company, address=None, all_gstins=False):
-	gstin = ''
+	gstin = ""
 	if address:
 		gstin = frappe.db.get_value("Address", address, "gstin")
 
@@ -1165,28 +1080,36 @@
 			["Dynamic Link", "link_doctype", "=", "Company"],
 			["Dynamic Link", "link_name", "=", company],
 			["Dynamic Link", "parenttype", "=", "Address"],
-			["gstin", "!=", '']
+			["gstin", "!=", ""],
 		]
-		gstin = frappe.get_all("Address", filters=filters, pluck="gstin", order_by="is_primary_address desc")
+		gstin = frappe.get_all(
+			"Address", filters=filters, pluck="gstin", order_by="is_primary_address desc"
+		)
 		if gstin and not all_gstins:
 			gstin = gstin[0]
 
 	if not gstin:
 		address = frappe.bold(address) if address else ""
-		frappe.throw(_("Please set valid GSTIN No. in Company Address {} for company {}").format(
-			address, frappe.bold(company)
-		))
+		frappe.throw(
+			_("Please set valid GSTIN No. in Company Address {} for company {}").format(
+				address, frappe.bold(company)
+			)
+		)
 
 	return gstin
 
+
 @frappe.whitelist()
 def download_json_file():
-	''' download json content in a file '''
+	"""download json content in a file"""
 	data = frappe._dict(frappe.local.form_dict)
-	frappe.response['filename'] = frappe.scrub("{0} {1}".format(data['report_name'], data['report_type'])) + '.json'
-	frappe.response['filecontent'] = data['data']
-	frappe.response['content_type'] = 'application/json'
-	frappe.response['type'] = 'download'
+	frappe.response["filename"] = (
+		frappe.scrub("{0} {1}".format(data["report_name"], data["report_type"])) + ".json"
+	)
+	frappe.response["filecontent"] = data["data"]
+	frappe.response["content_type"] = "application/json"
+	frappe.response["type"] = "download"
+
 
 def is_inter_state(invoice_detail):
 	if invoice_detail.place_of_supply.split("-")[0] != invoice_detail.company_gstin[:2]:
@@ -1200,16 +1123,16 @@
 	address = frappe.qb.DocType("Address")
 	links = frappe.qb.DocType("Dynamic Link")
 
-	addresses = frappe.qb.from_(address).inner_join(links).on(
-		address.name == links.parent
-	).select(
-		address.gstin
-	).where(
-		links.link_doctype == 'Company'
-	).where(
-		links.link_name == company
-	).run(as_dict=1)
+	addresses = (
+		frappe.qb.from_(address)
+		.inner_join(links)
+		.on(address.name == links.parent)
+		.select(address.gstin)
+		.where(links.link_doctype == "Company")
+		.where(links.link_name == company)
+		.run(as_dict=1)
+	)
 
-	address_list = [''] + [d.gstin for d in addresses]
+	address_list = [""] + [d.gstin for d in addresses]
 
-	return address_list
\ No newline at end of file
+	return address_list
diff --git a/erpnext/regional/report/gstr_2/gstr_2.py b/erpnext/regional/report/gstr_2/gstr_2.py
index 47c856d..a189d2a 100644
--- a/erpnext/regional/report/gstr_2/gstr_2.py
+++ b/erpnext/regional/report/gstr_2/gstr_2.py
@@ -12,6 +12,7 @@
 def execute(filters=None):
 	return Gstr2Report(filters).run()
 
+
 class Gstr2Report(Gstr1Report):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
@@ -47,7 +48,7 @@
 		for inv, items_based_on_rate in self.items_based_on_tax_rate.items():
 			invoice_details = self.invoices.get(inv)
 			for rate, items in items_based_on_rate.items():
-				if rate or invoice_details.get('gst_category') == 'Registered Composition':
+				if rate or invoice_details.get("gst_category") == "Registered Composition":
 					if inv not in self.igst_invoices:
 						rate = rate / 2
 						row, taxable_value = self.get_row_data_for_invoice(inv, invoice_details, rate, items)
@@ -60,13 +61,13 @@
 
 					row += [
 						self.invoice_cess.get(inv),
-						invoice_details.get('eligibility_for_itc'),
-						invoice_details.get('itc_integrated_tax'),
-						invoice_details.get('itc_central_tax'),
-						invoice_details.get('itc_state_tax'),
-						invoice_details.get('itc_cess_amount')
+						invoice_details.get("eligibility_for_itc"),
+						invoice_details.get("itc_integrated_tax"),
+						invoice_details.get("itc_central_tax"),
+						invoice_details.get("itc_state_tax"),
+						invoice_details.get("itc_cess_amount"),
 					]
-					if self.filters.get("type_of_business") ==  "CDNR":
+					if self.filters.get("type_of_business") == "CDNR":
 						row.append("Y" if invoice_details.posting_date <= date(2017, 7, 1) else "N")
 						row.append("C" if invoice_details.return_against else "R")
 
@@ -82,201 +83,158 @@
 	def get_conditions(self):
 		conditions = ""
 
-		for opts in (("company", " and company=%(company)s"),
+		for opts in (
+			("company", " and company=%(company)s"),
 			("from_date", " and posting_date>=%(from_date)s"),
-			("to_date", " and posting_date<=%(to_date)s")):
-				if self.filters.get(opts[0]):
-					conditions += opts[1]
+			("to_date", " and posting_date<=%(to_date)s"),
+		):
+			if self.filters.get(opts[0]):
+				conditions += opts[1]
 
-		if self.filters.get("type_of_business") ==  "B2B":
+		if self.filters.get("type_of_business") == "B2B":
 			conditions += "and ifnull(gst_category, '') in ('Registered Regular', 'Deemed Export', 'SEZ', 'Registered Composition') and is_return != 1 "
 
-		elif self.filters.get("type_of_business") ==  "CDNR":
+		elif self.filters.get("type_of_business") == "CDNR":
 			conditions += """ and is_return = 1 """
 
 		return conditions
 
 	def get_columns(self):
 		self.tax_columns = [
-			{
-				"fieldname": "rate",
-				"label": "Rate",
-				"fieldtype": "Int",
-				"width": 60
-			},
-			{
-				"fieldname": "taxable_value",
-				"label": "Taxable Value",
-				"fieldtype": "Currency",
-				"width": 100
-			},
+			{"fieldname": "rate", "label": "Rate", "fieldtype": "Int", "width": 60},
+			{"fieldname": "taxable_value", "label": "Taxable Value", "fieldtype": "Currency", "width": 100},
 			{
 				"fieldname": "integrated_tax_paid",
 				"label": "Integrated Tax Paid",
 				"fieldtype": "Currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"fieldname": "central_tax_paid",
 				"label": "Central Tax Paid",
 				"fieldtype": "Currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"fieldname": "state_tax_paid",
 				"label": "State/UT Tax Paid",
 				"fieldtype": "Currency",
-				"width": 100
+				"width": 100,
 			},
-			{
-				"fieldname": "cess_amount",
-				"label": "Cess Paid",
-				"fieldtype": "Currency",
-				"width": 100
-			},
+			{"fieldname": "cess_amount", "label": "Cess Paid", "fieldtype": "Currency", "width": 100},
 			{
 				"fieldname": "eligibility_for_itc",
 				"label": "Eligibility For ITC",
 				"fieldtype": "Data",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"fieldname": "itc_integrated_tax",
 				"label": "Availed ITC Integrated Tax",
 				"fieldtype": "Currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"fieldname": "itc_central_tax",
 				"label": "Availed ITC Central Tax",
 				"fieldtype": "Currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"fieldname": "itc_state_tax",
 				"label": "Availed ITC State/UT Tax",
 				"fieldtype": "Currency",
-				"width": 100
+				"width": 100,
 			},
 			{
 				"fieldname": "itc_cess_amount",
 				"label": "Availed ITC Cess ",
 				"fieldtype": "Currency",
-				"width": 100
-			}
+				"width": 100,
+			},
 		]
 		self.other_columns = []
 
-		if self.filters.get("type_of_business") ==  "B2B":
+		if self.filters.get("type_of_business") == "B2B":
 			self.invoice_columns = [
 				{
 					"fieldname": "supplier_gstin",
 					"label": "GSTIN of Supplier",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "invoice_number",
 					"label": "Invoice Number",
 					"fieldtype": "Link",
 					"options": "Purchase Invoice",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "posting_date",
-					"label": "Invoice date",
-					"fieldtype": "Date",
-					"width": 120
-				},
+				{"fieldname": "posting_date", "label": "Invoice date", "fieldtype": "Date", "width": 120},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "place_of_supply",
 					"label": "Place of Supply",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "reverse_charge",
-					"label": "Reverse Charge",
-					"fieldtype": "Data",
-					"width": 80
-				},
-				{
-					"fieldname": "gst_category",
-					"label": "Invoice Type",
-					"fieldtype": "Data",
-					"width": 80
-				}
+				{"fieldname": "reverse_charge", "label": "Reverse Charge", "fieldtype": "Data", "width": 80},
+				{"fieldname": "gst_category", "label": "Invoice Type", "fieldtype": "Data", "width": 80},
 			]
-		elif self.filters.get("type_of_business") ==  "CDNR":
+		elif self.filters.get("type_of_business") == "CDNR":
 			self.invoice_columns = [
 				{
 					"fieldname": "supplier_gstin",
 					"label": "GSTIN of Supplier",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "invoice_number",
 					"label": "Note/Refund Voucher Number",
 					"fieldtype": "Link",
-					"options": "Purchase Invoice"
+					"options": "Purchase Invoice",
 				},
 				{
 					"fieldname": "posting_date",
 					"label": "Note/Refund Voucher date",
 					"fieldtype": "Date",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "return_against",
 					"label": "Invoice/Advance Payment Voucher Number",
 					"fieldtype": "Link",
 					"options": "Purchase Invoice",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "posting_date",
 					"label": "Invoice/Advance Payment Voucher date",
 					"fieldtype": "Date",
-					"width": 120
+					"width": 120,
 				},
 				{
 					"fieldname": "reason_for_issuing_document",
 					"label": "Reason For Issuing document",
 					"fieldtype": "Data",
-					"width": 120
+					"width": 120,
 				},
-				{
-					"fieldname": "supply_type",
-					"label": "Supply Type",
-					"fieldtype": "Data",
-					"width": 120
-				},
+				{"fieldname": "supply_type", "label": "Supply Type", "fieldtype": "Data", "width": 120},
 				{
 					"fieldname": "invoice_value",
 					"label": "Invoice Value",
 					"fieldtype": "Currency",
-					"width": 120
-				}
+					"width": 120,
+				},
 			]
 			self.other_columns = [
-				{
-					"fieldname": "pre_gst",
-					"label": "PRE GST",
-					"fieldtype": "Data",
-					"width": 50
-				},
-				{
-					"fieldname": "document_type",
-					"label": "Document Type",
-					"fieldtype": "Data",
-					"width": 50
-				}
+				{"fieldname": "pre_gst", "label": "PRE GST", "fieldtype": "Data", "width": 50},
+				{"fieldname": "document_type", "label": "Document Type", "fieldtype": "Data", "width": 50},
 			]
 		self.columns = self.invoice_columns + self.tax_columns + self.other_columns
diff --git a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py
index 1c1335e..09f2df1 100644
--- a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py
+++ b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py
@@ -17,8 +17,10 @@
 def execute(filters=None):
 	return _execute(filters)
 
+
 def _execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 	columns = get_columns()
 
 	company_currency = erpnext.get_company_currency(filters.company)
@@ -46,9 +48,10 @@
 			data.append(row)
 			added_item.append((d.parent, d.item_code))
 	if data:
-		data = get_merged_data(columns, data) # merge same hsn code data
+		data = get_merged_data(columns, data)  # merge same hsn code data
 	return columns, data
 
+
 def get_columns():
 	columns = [
 		{
@@ -56,63 +59,47 @@
 			"label": _("HSN/SAC"),
 			"fieldtype": "Link",
 			"options": "GST HSN Code",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"fieldname": "description",
-			"label": _("Description"),
-			"fieldtype": "Data",
-			"width": 300
-		},
-		{
-			"fieldname": "stock_uom",
-			"label": _("Stock UOM"),
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"fieldname": "stock_qty",
-			"label": _("Stock Qty"),
-			"fieldtype": "Float",
-			"width": 90
-		},
-		{
-			"fieldname": "total_amount",
-			"label": _("Total Amount"),
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"fieldname": "description", "label": _("Description"), "fieldtype": "Data", "width": 300},
+		{"fieldname": "stock_uom", "label": _("Stock UOM"), "fieldtype": "Data", "width": 100},
+		{"fieldname": "stock_qty", "label": _("Stock Qty"), "fieldtype": "Float", "width": 90},
+		{"fieldname": "total_amount", "label": _("Total Amount"), "fieldtype": "Currency", "width": 120},
 		{
 			"fieldname": "taxable_amount",
 			"label": _("Total Taxable Amount"),
 			"fieldtype": "Currency",
-			"width": 170
-		}
+			"width": 170,
+		},
 	]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 
-	for opts in (("company", " and company=%(company)s"),
+	for opts in (
+		("company", " and company=%(company)s"),
 		("gst_hsn_code", " and gst_hsn_code=%(gst_hsn_code)s"),
 		("company_gstin", " and company_gstin=%(company_gstin)s"),
 		("from_date", " and posting_date >= %(from_date)s"),
-		("to_date", "and posting_date <= %(to_date)s")):
-			if filters.get(opts[0]):
-				conditions += opts[1]
+		("to_date", "and posting_date <= %(to_date)s"),
+	):
+		if filters.get(opts[0]):
+			conditions += opts[1]
 
 	return conditions
 
+
 def get_items(filters):
 	conditions = get_conditions(filters)
 	match_conditions = frappe.build_match_conditions("Sales Invoice")
 	if match_conditions:
 		match_conditions = " and {0} ".format(match_conditions)
 
-
-	items = frappe.db.sql("""
+	items = frappe.db.sql(
+		"""
 		select
 			`tabSales Invoice Item`.gst_hsn_code,
 			`tabSales Invoice Item`.stock_uom,
@@ -129,25 +116,41 @@
 		group by
 			`tabSales Invoice Item`.parent, `tabSales Invoice Item`.item_code
 
-		""" % (conditions, match_conditions), filters, as_dict=1)
+		"""
+		% (conditions, match_conditions),
+		filters,
+		as_dict=1,
+	)
 
 	return items
 
-def get_tax_accounts(item_list, columns, company_currency, doctype="Sales Invoice", tax_doctype="Sales Taxes and Charges"):
+
+def get_tax_accounts(
+	item_list,
+	columns,
+	company_currency,
+	doctype="Sales Invoice",
+	tax_doctype="Sales Taxes and Charges",
+):
 	item_row_map = {}
 	tax_columns = []
 	invoice_item_row = {}
 	itemised_tax = {}
 	conditions = ""
 
-	tax_amount_precision = get_field_precision(frappe.get_meta(tax_doctype).get_field("tax_amount"),
-		currency=company_currency) or 2
+	tax_amount_precision = (
+		get_field_precision(
+			frappe.get_meta(tax_doctype).get_field("tax_amount"), currency=company_currency
+		)
+		or 2
+	)
 
 	for d in item_list:
 		invoice_item_row.setdefault(d.parent, []).append(d)
 		item_row_map.setdefault(d.parent, {}).setdefault(d.item_code or d.item_name, []).append(d)
 
-	tax_details = frappe.db.sql("""
+	tax_details = frappe.db.sql(
+		"""
 		select
 			parent, account_head, item_wise_tax_detail,
 			base_tax_amount_after_discount_amount
@@ -158,8 +161,10 @@
 			and parent in (%s)
 			%s
 		order by description
-	""" % (tax_doctype, '%s', ', '.join(['%s']*len(invoice_item_row)), conditions),
-		tuple([doctype] + list(invoice_item_row)))
+	"""
+		% (tax_doctype, "%s", ", ".join(["%s"] * len(invoice_item_row)), conditions),
+		tuple([doctype] + list(invoice_item_row)),
+	)
 
 	for parent, account_head, item_wise_tax_detail, tax_amount in tax_details:
 
@@ -183,74 +188,74 @@
 					for d in item_row_map.get(parent, {}).get(item_code, []):
 						item_tax_amount = tax_amount
 						if item_tax_amount:
-							itemised_tax.setdefault((parent, item_code), {})[account_head] = frappe._dict({
-								"tax_amount": flt(item_tax_amount, tax_amount_precision)
-							})
+							itemised_tax.setdefault((parent, item_code), {})[account_head] = frappe._dict(
+								{"tax_amount": flt(item_tax_amount, tax_amount_precision)}
+							)
 			except ValueError:
 				continue
 
 	tax_columns.sort()
 	for account_head in tax_columns:
-		columns.append({
-			"label": account_head,
-			"fieldname": frappe.scrub(account_head),
-			"fieldtype": "Float",
-			"width": 110
-		})
+		columns.append(
+			{
+				"label": account_head,
+				"fieldname": frappe.scrub(account_head),
+				"fieldtype": "Float",
+				"width": 110,
+			}
+		)
 
 	return itemised_tax, tax_columns
 
+
 def get_merged_data(columns, data):
-	merged_hsn_dict = {} # to group same hsn under one key and perform row addition
+	merged_hsn_dict = {}  # to group same hsn under one key and perform row addition
 	result = []
 
 	for row in data:
 		merged_hsn_dict.setdefault(row[0], {})
 		for i, d in enumerate(columns):
-			if d['fieldtype'] not in ('Int', 'Float', 'Currency'):
-				merged_hsn_dict[row[0]][d['fieldname']] = row[i]
+			if d["fieldtype"] not in ("Int", "Float", "Currency"):
+				merged_hsn_dict[row[0]][d["fieldname"]] = row[i]
 			else:
-				if merged_hsn_dict.get(row[0], {}).get(d['fieldname'], ''):
-					merged_hsn_dict[row[0]][d['fieldname']] += row[i]
+				if merged_hsn_dict.get(row[0], {}).get(d["fieldname"], ""):
+					merged_hsn_dict[row[0]][d["fieldname"]] += row[i]
 				else:
-					merged_hsn_dict[row[0]][d['fieldname']] = row[i]
+					merged_hsn_dict[row[0]][d["fieldname"]] = row[i]
 
 	for key, value in merged_hsn_dict.items():
 		result.append(value)
 
 	return result
 
+
 @frappe.whitelist()
 def get_json(filters, report_name, data):
 	filters = json.loads(filters)
 	report_data = json.loads(data)
-	gstin = filters.get('company_gstin') or get_company_gstin_number(filters["company"])
+	gstin = filters.get("company_gstin") or get_company_gstin_number(filters["company"])
 
-	if not filters.get('from_date') or not filters.get('to_date'):
+	if not filters.get("from_date") or not filters.get("to_date"):
 		frappe.throw(_("Please enter From Date and To Date to generate JSON"))
 
 	fp = "%02d%s" % (getdate(filters["to_date"]).month, getdate(filters["to_date"]).year)
 
-	gst_json = {"version": "GST2.3.4",
-		"hash": "hash", "gstin": gstin, "fp": fp}
+	gst_json = {"version": "GST2.3.4", "hash": "hash", "gstin": gstin, "fp": fp}
 
-	gst_json["hsn"] = {
-		"data": get_hsn_wise_json_data(filters, report_data)
-	}
+	gst_json["hsn"] = {"data": get_hsn_wise_json_data(filters, report_data)}
 
-	return {
-		'report_name': report_name,
-		'data': gst_json
-	}
+	return {"report_name": report_name, "data": gst_json}
+
 
 @frappe.whitelist()
 def download_json_file():
-	'''download json content in a file'''
+	"""download json content in a file"""
 	data = frappe._dict(frappe.local.form_dict)
-	frappe.response['filename'] = frappe.scrub("{0}".format(data['report_name'])) + '.json'
-	frappe.response['filecontent'] = data['data']
-	frappe.response['content_type'] = 'application/json'
-	frappe.response['type'] = 'download'
+	frappe.response["filename"] = frappe.scrub("{0}".format(data["report_name"])) + ".json"
+	frappe.response["filecontent"] = data["data"]
+	frappe.response["content_type"] = "application/json"
+	frappe.response["type"] = "download"
+
 
 def get_hsn_wise_json_data(filters, report_data):
 
@@ -271,23 +276,22 @@
 			"iamt": 0.0,
 			"camt": 0.0,
 			"samt": 0.0,
-			"csamt": 0.0
-
+			"csamt": 0.0,
 		}
 
-		for account in gst_accounts.get('igst_account'):
-			row['iamt'] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
+		for account in gst_accounts.get("igst_account"):
+			row["iamt"] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
 
-		for account in gst_accounts.get('cgst_account'):
-			row['camt'] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
+		for account in gst_accounts.get("cgst_account"):
+			row["camt"] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
 
-		for account in gst_accounts.get('sgst_account'):
-			row['samt'] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
+		for account in gst_accounts.get("sgst_account"):
+			row["samt"] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
 
-		for account in gst_accounts.get('cess_account'):
-			row['csamt'] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
+		for account in gst_accounts.get("cess_account"):
+			row["csamt"] += flt(hsn.get(frappe.scrub(cstr(account)), 0.0), 2)
 
 		data.append(row)
-		count +=1
+		count += 1
 
 	return data
diff --git a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/test_hsn_wise_summary_of_outward_supplies.py b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/test_hsn_wise_summary_of_outward_supplies.py
index 86dc458..090473f 100644
--- a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/test_hsn_wise_summary_of_outward_supplies.py
+++ b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/test_hsn_wise_summary_of_outward_supplies.py
@@ -28,7 +28,7 @@
 		setup_company()
 		setup_customers()
 		setup_gst_settings()
-		make_item("Golf Car", properties={ "gst_hsn_code": "999900" })
+		make_item("Golf Car", properties={"gst_hsn_code": "999900"})
 
 	@classmethod
 	def tearDownClass(cls):
@@ -37,53 +37,66 @@
 	def test_hsn_summary_for_invoice_with_duplicate_items(self):
 		si = create_sales_invoice(
 			company="_Test Company GST",
-			customer = "_Test GST Customer",
-			currency = "INR",
-			warehouse = "Finished Goods - _GST",
-			debit_to = "Debtors - _GST",
-			income_account = "Sales - _GST",
-			expense_account = "Cost of Goods Sold - _GST",
-			cost_center = "Main - _GST",
-			do_not_save=1
+			customer="_Test GST Customer",
+			currency="INR",
+			warehouse="Finished Goods - _GST",
+			debit_to="Debtors - _GST",
+			income_account="Sales - _GST",
+			expense_account="Cost of Goods Sold - _GST",
+			cost_center="Main - _GST",
+			do_not_save=1,
 		)
 
 		si.items = []
-		si.append("items", {
-			"item_code": "Golf Car",
-			"gst_hsn_code": "999900",
-			"qty": "1",
-			"rate": "120",
-			"cost_center": "Main - _GST"
-		})
-		si.append("items", {
-			"item_code": "Golf Car",
-			"gst_hsn_code": "999900",
-			"qty": "1",
-			"rate": "140",
-			"cost_center": "Main - _GST"
-		})
-		si.append("taxes", {
-			"charge_type": "On Net Total",
-			"account_head": "Output Tax IGST - _GST",
-			"cost_center": "Main - _GST",
-			"description": "IGST @ 18.0",
-			"rate": 18
-		})
+		si.append(
+			"items",
+			{
+				"item_code": "Golf Car",
+				"gst_hsn_code": "999900",
+				"qty": "1",
+				"rate": "120",
+				"cost_center": "Main - _GST",
+			},
+		)
+		si.append(
+			"items",
+			{
+				"item_code": "Golf Car",
+				"gst_hsn_code": "999900",
+				"qty": "1",
+				"rate": "140",
+				"cost_center": "Main - _GST",
+			},
+		)
+		si.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "Output Tax IGST - _GST",
+				"cost_center": "Main - _GST",
+				"description": "IGST @ 18.0",
+				"rate": 18,
+			},
+		)
 		si.posting_date = "2020-11-17"
 		si.submit()
 		si.reload()
 
-		[columns, data] = run_report(filters=frappe._dict({
-			"company": "_Test Company GST",
-			"gst_hsn_code": "999900",
-			"company_gstin": si.company_gstin,
-			"from_date": si.posting_date,
-			"to_date": si.posting_date
-		}))
+		[columns, data] = run_report(
+			filters=frappe._dict(
+				{
+					"company": "_Test Company GST",
+					"gst_hsn_code": "999900",
+					"company_gstin": si.company_gstin,
+					"from_date": si.posting_date,
+					"to_date": si.posting_date,
+				}
+			)
+		)
 
-		filtered_rows = list(filter(lambda row: row['gst_hsn_code'] == "999900", data))
+		filtered_rows = list(filter(lambda row: row["gst_hsn_code"] == "999900", data))
 		self.assertTrue(filtered_rows)
 
 		hsn_row = filtered_rows[0]
-		self.assertEquals(hsn_row['stock_qty'], 2.0)
-		self.assertEquals(hsn_row['total_amount'], 306.8)
+		self.assertEquals(hsn_row["stock_qty"], 2.0)
+		self.assertEquals(hsn_row["total_amount"], 306.8)
diff --git a/erpnext/regional/report/irs_1099/irs_1099.py b/erpnext/regional/report/irs_1099/irs_1099.py
index 147a59f..92aeb5e 100644
--- a/erpnext/regional/report/irs_1099/irs_1099.py
+++ b/erpnext/regional/report/irs_1099/irs_1099.py
@@ -20,22 +20,21 @@
 def execute(filters=None):
 	filters = filters if isinstance(filters, frappe._dict) else frappe._dict(filters)
 	if not filters:
-		filters.setdefault('fiscal_year', get_fiscal_year(nowdate())[0])
-		filters.setdefault('company', frappe.db.get_default("company"))
+		filters.setdefault("fiscal_year", get_fiscal_year(nowdate())[0])
+		filters.setdefault("company", frappe.db.get_default("company"))
 
-	region = frappe.db.get_value("Company",
-		filters={"name": filters.company},
-		fieldname=["country"])
+	region = frappe.db.get_value("Company", filters={"name": filters.company}, fieldname=["country"])
 
-	if region != 'United States':
+	if region != "United States":
 		return [], []
 
 	columns = get_columns()
 	conditions = ""
 	if filters.supplier_group:
-		conditions += "AND s.supplier_group = %s" %frappe.db.escape(filters.get("supplier_group"))
+		conditions += "AND s.supplier_group = %s" % frappe.db.escape(filters.get("supplier_group"))
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		SELECT
 			s.supplier_group as "supplier_group",
 			gl.party AS "supplier",
@@ -56,10 +55,12 @@
 			gl.party
 
 		ORDER BY
-			gl.party DESC""".format(conditions=conditions), {
-				"fiscal_year": filters.fiscal_year,
-				"company": filters.company
-			}, as_dict=True)
+			gl.party DESC""".format(
+			conditions=conditions
+		),
+		{"fiscal_year": filters.fiscal_year, "company": filters.company},
+		as_dict=True,
+	)
 
 	return columns, data
 
@@ -71,37 +72,29 @@
 			"label": _("Supplier Group"),
 			"fieldtype": "Link",
 			"options": "Supplier Group",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"fieldname": "supplier",
 			"label": _("Supplier"),
 			"fieldtype": "Link",
 			"options": "Supplier",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"fieldname": "tax_id",
-			"label": _("Tax ID"),
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"fieldname": "payments",
-			"label": _("Total Payments"),
-			"fieldtype": "Currency",
-			"width": 200
-		}
+		{"fieldname": "tax_id", "label": _("Tax ID"), "fieldtype": "Data", "width": 200},
+		{"fieldname": "payments", "label": _("Total Payments"), "fieldtype": "Currency", "width": 200},
 	]
 
 
 @frappe.whitelist()
 def irs_1099_print(filters):
 	if not filters:
-		frappe._dict({
-			"company": frappe.db.get_default("Company"),
-			"fiscal_year": frappe.db.get_default("Fiscal Year")
-		})
+		frappe._dict(
+			{
+				"company": frappe.db.get_default("Company"),
+				"fiscal_year": frappe.db.get_default("Fiscal Year"),
+			}
+		)
 	else:
 		filters = frappe._dict(json.loads(filters))
 
@@ -121,17 +114,21 @@
 		row["company_tin"] = company_tin
 		row["payer_street_address"] = company_address
 		row["recipient_street_address"], row["recipient_city_state"] = get_street_address_html(
-			"Supplier", row.supplier)
+			"Supplier", row.supplier
+		)
 		row["payments"] = fmt_money(row["payments"], precision=0, currency="USD")
 		pdf = get_pdf(render_template(template, row), output=output if output else None)
 
-	frappe.local.response.filename = f"{filters.fiscal_year} {filters.company} IRS 1099 Forms{IRS_1099_FORMS_FILE_EXTENSION}"
+	frappe.local.response.filename = (
+		f"{filters.fiscal_year} {filters.company} IRS 1099 Forms{IRS_1099_FORMS_FILE_EXTENSION}"
+	)
 	frappe.local.response.filecontent = read_multi_pdf(output)
 	frappe.local.response.type = "download"
 
 
 def get_payer_address_html(company):
-	address_list = frappe.db.sql("""
+	address_list = frappe.db.sql(
+		"""
 		SELECT
 			name
 		FROM
@@ -141,7 +138,10 @@
 		ORDER BY
 			address_type="Postal" DESC, address_type="Billing" DESC
 		LIMIT 1
-	""", {"company": company}, as_dict=True)
+	""",
+		{"company": company},
+		as_dict=True,
+	)
 
 	address_display = ""
 	if address_list:
@@ -152,7 +152,8 @@
 
 
 def get_street_address_html(party_type, party):
-	address_list = frappe.db.sql("""
+	address_list = frappe.db.sql(
+		"""
 		SELECT
 			link.parent
 		FROM
@@ -165,7 +166,10 @@
 			address.address_type="Postal" DESC,
 			address.address_type="Billing" DESC
 		LIMIT 1
-	""", {"party": party}, as_dict=True)
+	""",
+		{"party": party},
+		as_dict=True,
+	)
 
 	street_address = city_state = ""
 	if address_list:
diff --git a/erpnext/regional/report/ksa_vat/ksa_vat.py b/erpnext/regional/report/ksa_vat/ksa_vat.py
index cc26bd7..15996d2 100644
--- a/erpnext/regional/report/ksa_vat/ksa_vat.py
+++ b/erpnext/regional/report/ksa_vat/ksa_vat.py
@@ -14,6 +14,7 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns():
 	return [
 		{
@@ -48,101 +49,136 @@
 			"label": _("Currency"),
 			"fieldtype": "Currency",
 			"width": 150,
-			"hidden": 1
-		}
+			"hidden": 1,
+		},
 	]
 
+
 def get_data(filters):
 	data = []
 
 	# Validate if vat settings exist
-	company = filters.get('company')
-	company_currency = frappe.get_cached_value('Company',  company, "default_currency")
+	company = filters.get("company")
+	company_currency = frappe.get_cached_value("Company", company, "default_currency")
 
-	if frappe.db.exists('KSA VAT Setting', company) is None:
-		url = get_url_to_list('KSA VAT Setting')
+	if frappe.db.exists("KSA VAT Setting", company) is None:
+		url = get_url_to_list("KSA VAT Setting")
 		frappe.msgprint(_('Create <a href="{}">KSA VAT Setting</a> for this company').format(url))
 		return data
 
-	ksa_vat_setting = frappe.get_doc('KSA VAT Setting', company)
+	ksa_vat_setting = frappe.get_doc("KSA VAT Setting", company)
 
 	# Sales Heading
-	append_data(data, 'VAT on Sales', '', '', '', company_currency)
+	append_data(data, "VAT on Sales", "", "", "", company_currency)
 
 	grand_total_taxable_amount = 0
 	grand_total_taxable_adjustment_amount = 0
 	grand_total_tax = 0
 
 	for vat_setting in ksa_vat_setting.ksa_vat_sales_accounts:
-		total_taxable_amount, total_taxable_adjustment_amount, \
-			total_tax = get_tax_data_for_each_vat_setting(vat_setting, filters, 'Sales Invoice')
+		(
+			total_taxable_amount,
+			total_taxable_adjustment_amount,
+			total_tax,
+		) = get_tax_data_for_each_vat_setting(vat_setting, filters, "Sales Invoice")
 
 		# Adding results to data
-		append_data(data, vat_setting.title, total_taxable_amount,
-			total_taxable_adjustment_amount, total_tax, company_currency)
+		append_data(
+			data,
+			vat_setting.title,
+			total_taxable_amount,
+			total_taxable_adjustment_amount,
+			total_tax,
+			company_currency,
+		)
 
 		grand_total_taxable_amount += total_taxable_amount
 		grand_total_taxable_adjustment_amount += total_taxable_adjustment_amount
 		grand_total_tax += total_tax
 
 	# Sales Grand Total
-	append_data(data, 'Grand Total', grand_total_taxable_amount,
-		grand_total_taxable_adjustment_amount, grand_total_tax, company_currency)
+	append_data(
+		data,
+		"Grand Total",
+		grand_total_taxable_amount,
+		grand_total_taxable_adjustment_amount,
+		grand_total_tax,
+		company_currency,
+	)
 
 	# Blank Line
-	append_data(data, '', '', '', '', company_currency)
+	append_data(data, "", "", "", "", company_currency)
 
 	# Purchase Heading
-	append_data(data, 'VAT on Purchases', '', '', '', company_currency)
+	append_data(data, "VAT on Purchases", "", "", "", company_currency)
 
 	grand_total_taxable_amount = 0
 	grand_total_taxable_adjustment_amount = 0
 	grand_total_tax = 0
 
 	for vat_setting in ksa_vat_setting.ksa_vat_purchase_accounts:
-		total_taxable_amount, total_taxable_adjustment_amount, \
-			total_tax = get_tax_data_for_each_vat_setting(vat_setting, filters, 'Purchase Invoice')
+		(
+			total_taxable_amount,
+			total_taxable_adjustment_amount,
+			total_tax,
+		) = get_tax_data_for_each_vat_setting(vat_setting, filters, "Purchase Invoice")
 
 		# Adding results to data
-		append_data(data, vat_setting.title, total_taxable_amount,
-			total_taxable_adjustment_amount, total_tax, company_currency)
+		append_data(
+			data,
+			vat_setting.title,
+			total_taxable_amount,
+			total_taxable_adjustment_amount,
+			total_tax,
+			company_currency,
+		)
 
 		grand_total_taxable_amount += total_taxable_amount
 		grand_total_taxable_adjustment_amount += total_taxable_adjustment_amount
 		grand_total_tax += total_tax
 
 	# Purchase Grand Total
-	append_data(data, 'Grand Total', grand_total_taxable_amount,
-		grand_total_taxable_adjustment_amount, grand_total_tax, company_currency)
+	append_data(
+		data,
+		"Grand Total",
+		grand_total_taxable_amount,
+		grand_total_taxable_adjustment_amount,
+		grand_total_tax,
+		company_currency,
+	)
 
 	return data
 
+
 def get_tax_data_for_each_vat_setting(vat_setting, filters, doctype):
-	'''
+	"""
 	(KSA, {filters}, 'Sales Invoice') => 500, 153, 10 \n
 	calculates and returns \n
-	total_taxable_amount, total_taxable_adjustment_amount, total_tax'''
-	from_date = filters.get('from_date')
-	to_date = filters.get('to_date')
+	total_taxable_amount, total_taxable_adjustment_amount, total_tax"""
+	from_date = filters.get("from_date")
+	to_date = filters.get("to_date")
 
 	# Initiate variables
 	total_taxable_amount = 0
 	total_taxable_adjustment_amount = 0
 	total_tax = 0
 	# Fetch All Invoices
-	invoices = frappe.get_all(doctype,
-	filters ={
-		'docstatus': 1,
-		'posting_date': ['between', [from_date, to_date]]
-	}, fields =['name', 'is_return'])
+	invoices = frappe.get_all(
+		doctype,
+		filters={"docstatus": 1, "posting_date": ["between", [from_date, to_date]]},
+		fields=["name", "is_return"],
+	)
 
 	for invoice in invoices:
-		invoice_items = frappe.get_all(f'{doctype} Item',
-		filters ={
-			'docstatus': 1,
-			'parent': invoice.name,
-			'item_tax_template': vat_setting.item_tax_template
-		}, fields =['item_code', 'net_amount'])
+		invoice_items = frappe.get_all(
+			f"{doctype} Item",
+			filters={
+				"docstatus": 1,
+				"parent": invoice.name,
+				"item_tax_template": vat_setting.item_tax_template,
+			},
+			fields=["item_code", "net_amount"],
+		)
 
 		for item in invoice_items:
 			# Summing up total taxable amount
@@ -158,24 +194,31 @@
 	return total_taxable_amount, total_taxable_adjustment_amount, total_tax
 
 
-
 def append_data(data, title, amount, adjustment_amount, vat_amount, company_currency):
 	"""Returns data with appended value."""
-	data.append({"title": _(title), "amount": amount, "adjustment_amount": adjustment_amount, "vat_amount": vat_amount,
-		"currency": company_currency})
+	data.append(
+		{
+			"title": _(title),
+			"amount": amount,
+			"adjustment_amount": adjustment_amount,
+			"vat_amount": vat_amount,
+			"currency": company_currency,
+		}
+	)
+
 
 def get_tax_amount(item_code, account_head, doctype, parent):
-	if doctype == 'Sales Invoice':
-		tax_doctype = 'Sales Taxes and Charges'
+	if doctype == "Sales Invoice":
+		tax_doctype = "Sales Taxes and Charges"
 
-	elif doctype == 'Purchase Invoice':
-		tax_doctype = 'Purchase Taxes and Charges'
+	elif doctype == "Purchase Invoice":
+		tax_doctype = "Purchase Taxes and Charges"
 
-	item_wise_tax_detail = frappe.get_value(tax_doctype, {
-		'docstatus': 1,
-		'parent': parent,
-		'account_head': account_head
-	}, 'item_wise_tax_detail')
+	item_wise_tax_detail = frappe.get_value(
+		tax_doctype,
+		{"docstatus": 1, "parent": parent, "account_head": account_head},
+		"item_wise_tax_detail",
+	)
 
 	tax_amount = 0
 	if item_wise_tax_detail and len(item_wise_tax_detail) > 0:
diff --git a/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py
index def4379..17a62d5 100644
--- a/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py
+++ b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py
@@ -16,6 +16,7 @@
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -23,53 +24,54 @@
 			"options": "Employee",
 			"fieldname": "employee",
 			"fieldtype": "Link",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Employee Name"),
 			"options": "Employee",
 			"fieldname": "employee_name",
 			"fieldtype": "Link",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 140
-		}
+		{"label": _("Amount"), "fieldname": "amount", "fieldtype": "Currency", "width": 140},
 	]
 
 	return columns
 
+
 def get_data(filters):
 
 	data = []
 
-	component_type_dict = frappe._dict(frappe.db.sql(""" select name, component_type from `tabSalary Component`
-		where component_type = 'Professional Tax' """))
+	component_type_dict = frappe._dict(
+		frappe.db.sql(
+			""" select name, component_type from `tabSalary Component`
+		where component_type = 'Professional Tax' """
+		)
+	)
 
 	if not len(component_type_dict):
 		return []
 
 	conditions = get_conditions(filters)
 
-	entry = frappe.db.sql(""" select sal.employee, sal.employee_name, ded.salary_component, ded.amount
+	entry = frappe.db.sql(
+		""" select sal.employee, sal.employee_name, ded.salary_component, ded.amount
 		from `tabSalary Slip` sal, `tabSalary Detail` ded
 		where sal.name = ded.parent
 		and ded.parentfield = 'deductions'
 		and ded.parenttype = 'Salary Slip'
 		and sal.docstatus = 1 %s
 		and ded.salary_component in (%s)
-	""" % (conditions , ", ".join(['%s']*len(component_type_dict))), tuple(component_type_dict.keys()), as_dict=1)
+	"""
+		% (conditions, ", ".join(["%s"] * len(component_type_dict))),
+		tuple(component_type_dict.keys()),
+		as_dict=1,
+	)
 
 	for d in entry:
 
-		employee = {
-			"employee": d.employee,
-			"employee_name": d.employee_name,
-			"amount": d.amount
-		}
+		employee = {"employee": d.employee, "employee_name": d.employee_name, "amount": d.amount}
 
 		data.append(employee)
 
diff --git a/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py
index 190f408..ab4b6e7 100644
--- a/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py
+++ b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py
@@ -13,6 +13,7 @@
 
 	return columns, data
 
+
 def get_columns(filters):
 	columns = [
 		{
@@ -20,57 +21,38 @@
 			"options": "Employee",
 			"fieldname": "employee",
 			"fieldtype": "Link",
-			"width": 200
+			"width": 200,
 		},
 		{
 			"label": _("Employee Name"),
 			"options": "Employee",
 			"fieldname": "employee_name",
 			"fieldtype": "Link",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label": _("PF Account"),
-			"fieldname": "pf_account",
-			"fieldtype": "Data",
-			"width": 140
-		},
-		{
-			"label": _("PF Amount"),
-			"fieldname": "pf_amount",
-			"fieldtype": "Currency",
-			"width": 140
-		},
+		{"label": _("PF Account"), "fieldname": "pf_account", "fieldtype": "Data", "width": 140},
+		{"label": _("PF Amount"), "fieldname": "pf_amount", "fieldtype": "Currency", "width": 140},
 		{
 			"label": _("Additional PF"),
 			"fieldname": "additional_pf",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("PF Loan"),
-			"fieldname": "pf_loan",
-			"fieldtype": "Currency",
-			"width": 140
-		},
-		{
-			"label": _("Total"),
-			"fieldname": "total",
-			"fieldtype": "Currency",
-			"width": 140
-		}
+		{"label": _("PF Loan"), "fieldname": "pf_loan", "fieldtype": "Currency", "width": 140},
+		{"label": _("Total"), "fieldname": "total", "fieldtype": "Currency", "width": 140},
 	]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = [""]
 
 	if filters.get("department"):
-		conditions.append("sal.department = '%s' " % (filters["department"]) )
+		conditions.append("sal.department = '%s' " % (filters["department"]))
 
 	if filters.get("branch"):
-		conditions.append("sal.branch = '%s' " % (filters["branch"]) )
+		conditions.append("sal.branch = '%s' " % (filters["branch"]))
 
 	if filters.get("company"):
 		conditions.append("sal.company = '%s' " % (filters["company"]))
@@ -86,10 +68,13 @@
 
 	return " and ".join(conditions)
 
-def prepare_data(entry,component_type_dict):
+
+def prepare_data(entry, component_type_dict):
 	data_list = {}
 
-	employee_account_dict = frappe._dict(frappe.db.sql(""" select name, provident_fund_account from `tabEmployee`"""))
+	employee_account_dict = frappe._dict(
+		frappe.db.sql(""" select name, provident_fund_account from `tabEmployee`""")
+	)
 
 	for d in entry:
 
@@ -98,40 +83,57 @@
 		if data_list.get(d.name):
 			data_list[d.name][component_type] = d.amount
 		else:
-			data_list.setdefault(d.name,{
-				"employee": d.employee,
-				"employee_name": d.employee_name,
-				"pf_account": employee_account_dict.get(d.employee),
-				component_type: d.amount
-			})
+			data_list.setdefault(
+				d.name,
+				{
+					"employee": d.employee,
+					"employee_name": d.employee_name,
+					"pf_account": employee_account_dict.get(d.employee),
+					component_type: d.amount,
+				},
+			)
 
 	return data_list
 
+
 def get_data(filters):
 	data = []
 
 	conditions = get_conditions(filters)
 
-	salary_slips = frappe.db.sql(""" select sal.name from `tabSalary Slip` sal
+	salary_slips = frappe.db.sql(
+		""" select sal.name from `tabSalary Slip` sal
 		where docstatus = 1 %s
-		""" % (conditions), as_dict=1)
+		"""
+		% (conditions),
+		as_dict=1,
+	)
 
-	component_type_dict = frappe._dict(frappe.db.sql(""" select name, component_type from `tabSalary Component`
-		where component_type in ('Provident Fund', 'Additional Provident Fund', 'Provident Fund Loan')"""))
+	component_type_dict = frappe._dict(
+		frappe.db.sql(
+			""" select name, component_type from `tabSalary Component`
+		where component_type in ('Provident Fund', 'Additional Provident Fund', 'Provident Fund Loan')"""
+		)
+	)
 
 	if not len(component_type_dict):
 		return []
 
-	entry = frappe.db.sql(""" select sal.name, sal.employee, sal.employee_name, ded.salary_component, ded.amount
+	entry = frappe.db.sql(
+		""" select sal.name, sal.employee, sal.employee_name, ded.salary_component, ded.amount
 		from `tabSalary Slip` sal, `tabSalary Detail` ded
 		where sal.name = ded.parent
 		and ded.parentfield = 'deductions'
 		and ded.parenttype = 'Salary Slip'
 		and sal.docstatus = 1 %s
 		and ded.salary_component in (%s)
-	""" % (conditions, ", ".join(['%s']*len(component_type_dict))), tuple(component_type_dict.keys()), as_dict=1)
+	"""
+		% (conditions, ", ".join(["%s"] * len(component_type_dict))),
+		tuple(component_type_dict.keys()),
+		as_dict=1,
+	)
 
-	data_list = prepare_data(entry,component_type_dict)
+	data_list = prepare_data(entry, component_type_dict)
 
 	for d in salary_slips:
 		total = 0
@@ -139,7 +141,7 @@
 			employee = {
 				"employee": data_list.get(d.name).get("employee"),
 				"employee_name": data_list.get(d.name).get("employee_name"),
-				"pf_account": data_list.get(d.name).get("pf_account")
+				"pf_account": data_list.get(d.name).get("pf_account"),
 			}
 
 			if data_list.get(d.name).get("Provident Fund"):
@@ -160,9 +162,12 @@
 
 	return data
 
+
 @frappe.whitelist()
 def get_years():
-	year_list = frappe.db.sql_list("""select distinct YEAR(end_date) from `tabSalary Slip` ORDER BY YEAR(end_date) DESC""")
+	year_list = frappe.db.sql_list(
+		"""select distinct YEAR(end_date) from `tabSalary Slip` ORDER BY YEAR(end_date) DESC"""
+	)
 	if not year_list:
 		year_list = [getdate().year]
 
diff --git a/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py b/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py
index 464939f..2966b06 100644
--- a/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py
+++ b/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py
@@ -18,6 +18,7 @@
 
 test_dependencies = ["Territory", "Customer Group", "Supplier Group", "Item"]
 
+
 class TestUaeVat201(TestCase):
 	def setUp(self):
 		frappe.set_user("Administrator")
@@ -34,9 +35,9 @@
 
 		create_warehouse("_Test UAE VAT Supplier Warehouse", company="_Test Company UAE VAT")
 
-		make_item("_Test UAE VAT Item", properties = {"is_zero_rated": 0, "is_exempt": 0})
-		make_item("_Test UAE VAT Zero Rated Item", properties = {"is_zero_rated": 1, "is_exempt": 0})
-		make_item("_Test UAE VAT Exempt Item", properties = {"is_zero_rated": 0, "is_exempt": 1})
+		make_item("_Test UAE VAT Item", properties={"is_zero_rated": 0, "is_exempt": 0})
+		make_item("_Test UAE VAT Zero Rated Item", properties={"is_zero_rated": 1, "is_exempt": 0})
+		make_item("_Test UAE VAT Exempt Item", properties={"is_zero_rated": 0, "is_exempt": 1})
 
 		make_sales_invoices()
 
@@ -52,27 +53,30 @@
 				"raw_amount": amount,
 				"raw_vat_amount": vat,
 			}
-		self.assertEqual(amounts_by_emirate["Sharjah"]["raw_amount"],100)
-		self.assertEqual(amounts_by_emirate["Sharjah"]["raw_vat_amount"],5)
-		self.assertEqual(amounts_by_emirate["Dubai"]["raw_amount"],200)
-		self.assertEqual(amounts_by_emirate["Dubai"]["raw_vat_amount"],10)
-		self.assertEqual(get_tourist_tax_return_total(filters),100)
-		self.assertEqual(get_tourist_tax_return_tax(filters),2)
-		self.assertEqual(get_zero_rated_total(filters),100)
-		self.assertEqual(get_exempt_total(filters),100)
-		self.assertEqual(get_standard_rated_expenses_total(filters),250)
-		self.assertEqual(get_standard_rated_expenses_tax(filters),1)
+		self.assertEqual(amounts_by_emirate["Sharjah"]["raw_amount"], 100)
+		self.assertEqual(amounts_by_emirate["Sharjah"]["raw_vat_amount"], 5)
+		self.assertEqual(amounts_by_emirate["Dubai"]["raw_amount"], 200)
+		self.assertEqual(amounts_by_emirate["Dubai"]["raw_vat_amount"], 10)
+		self.assertEqual(get_tourist_tax_return_total(filters), 100)
+		self.assertEqual(get_tourist_tax_return_tax(filters), 2)
+		self.assertEqual(get_zero_rated_total(filters), 100)
+		self.assertEqual(get_exempt_total(filters), 100)
+		self.assertEqual(get_standard_rated_expenses_total(filters), 250)
+		self.assertEqual(get_standard_rated_expenses_tax(filters), 1)
+
 
 def make_company(company_name, abbr):
 	if not frappe.db.exists("Company", company_name):
-		company = frappe.get_doc({
-			"doctype": "Company",
-			"company_name": company_name,
-			"abbr": abbr,
-			"default_currency": "AED",
-			"country": "United Arab Emirates",
-			"create_chart_of_accounts_based_on": "Standard Template",
-		})
+		company = frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": company_name,
+				"abbr": abbr,
+				"default_currency": "AED",
+				"country": "United Arab Emirates",
+				"create_chart_of_accounts_based_on": "Standard Template",
+			}
+		)
 		company.insert()
 	else:
 		company = frappe.get_doc("Company", company_name)
@@ -85,49 +89,51 @@
 	company.save()
 	return company
 
+
 def set_vat_accounts():
 	if not frappe.db.exists("UAE VAT Settings", "_Test Company UAE VAT"):
 		vat_accounts = frappe.get_all(
 			"Account",
 			fields=["name"],
-			filters = {
-				"company": "_Test Company UAE VAT",
-				"is_group": 0,
-				"account_type": "Tax"
-			}
+			filters={"company": "_Test Company UAE VAT", "is_group": 0, "account_type": "Tax"},
 		)
 
 		uae_vat_accounts = []
 		for account in vat_accounts:
-			uae_vat_accounts.append({
-				"doctype": "UAE VAT Account",
-				"account": account.name
-			})
+			uae_vat_accounts.append({"doctype": "UAE VAT Account", "account": account.name})
 
-		frappe.get_doc({
-			"company": "_Test Company UAE VAT",
-			"uae_vat_accounts": uae_vat_accounts,
-			"doctype": "UAE VAT Settings",
-		}).insert()
+		frappe.get_doc(
+			{
+				"company": "_Test Company UAE VAT",
+				"uae_vat_accounts": uae_vat_accounts,
+				"doctype": "UAE VAT Settings",
+			}
+		).insert()
+
 
 def make_customer():
 	if not frappe.db.exists("Customer", "_Test UAE Customer"):
-		customer = frappe.get_doc({
-			"doctype": "Customer",
-			"customer_name": "_Test UAE Customer",
-			"customer_type": "Company",
-		})
+		customer = frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_name": "_Test UAE Customer",
+				"customer_type": "Company",
+			}
+		)
 		customer.insert()
 
 
 def make_supplier():
 	if not frappe.db.exists("Supplier", "_Test UAE Supplier"):
-		frappe.get_doc({
-			"supplier_group": "Local",
-			"supplier_name": "_Test UAE Supplier",
-			"supplier_type": "Individual",
-			"doctype": "Supplier",
-		}).insert()
+		frappe.get_doc(
+			{
+				"supplier_group": "Local",
+				"supplier_name": "_Test UAE Supplier",
+				"supplier_type": "Individual",
+				"doctype": "Supplier",
+			}
+		).insert()
+
 
 def create_warehouse(warehouse_name, properties=None, company=None):
 	if not company:
@@ -147,17 +153,20 @@
 	else:
 		return warehouse_id
 
+
 def make_item(item_code, properties=None):
 	if frappe.db.exists("Item", item_code):
 		return frappe.get_doc("Item", item_code)
 
-	item = frappe.get_doc({
-		"doctype": "Item",
-		"item_code": item_code,
-		"item_name": item_code,
-		"description": item_code,
-		"item_group": "Products"
-	})
+	item = frappe.get_doc(
+		{
+			"doctype": "Item",
+			"item_code": item_code,
+			"item_name": item_code,
+			"description": item_code,
+			"item_group": "Products",
+		}
+	)
 
 	if properties:
 		item.update(properties)
@@ -166,71 +175,77 @@
 
 	return item
 
+
 def make_sales_invoices():
-	def make_sales_invoices_wrapper(emirate, item, tax = True, tourist_tax= False):
+	def make_sales_invoices_wrapper(emirate, item, tax=True, tourist_tax=False):
 		si = create_sales_invoice(
 			company="_Test Company UAE VAT",
-			customer = '_Test UAE Customer',
-			currency = 'AED',
-			warehouse = 'Finished Goods - _TCUV',
-			debit_to = 'Debtors - _TCUV',
-			income_account = 'Sales - _TCUV',
-			expense_account = 'Cost of Goods Sold - _TCUV',
-			cost_center = 'Main - _TCUV',
-			item = item,
-			do_not_save=1
+			customer="_Test UAE Customer",
+			currency="AED",
+			warehouse="Finished Goods - _TCUV",
+			debit_to="Debtors - _TCUV",
+			income_account="Sales - _TCUV",
+			expense_account="Cost of Goods Sold - _TCUV",
+			cost_center="Main - _TCUV",
+			item=item,
+			do_not_save=1,
 		)
 		si.vat_emirate = emirate
 		if tax:
 			si.append(
-				"taxes", {
+				"taxes",
+				{
 					"charge_type": "On Net Total",
 					"account_head": "VAT 5% - _TCUV",
 					"cost_center": "Main - _TCUV",
 					"description": "VAT 5% @ 5.0",
-					"rate": 5.0
-				}
+					"rate": 5.0,
+				},
 			)
 		if tourist_tax:
 			si.tourist_tax_return = 2
 		si.submit()
 
-	#Define Item Names
+	# Define Item Names
 	uae_item = "_Test UAE VAT Item"
 	uae_exempt_item = "_Test UAE VAT Exempt Item"
 	uae_zero_rated_item = "_Test UAE VAT Zero Rated Item"
 
-	#Sales Invoice with standard rated expense in Dubai
-	make_sales_invoices_wrapper('Dubai', uae_item)
-	#Sales Invoice with standard rated expense in Sharjah
-	make_sales_invoices_wrapper('Sharjah', uae_item)
-	#Sales Invoice with Tourist Tax Return
-	make_sales_invoices_wrapper('Dubai', uae_item, True, True)
-	#Sales Invoice with Exempt Item
-	make_sales_invoices_wrapper('Sharjah', uae_exempt_item, False)
-	#Sales Invoice with Zero Rated Item
-	make_sales_invoices_wrapper('Sharjah', uae_zero_rated_item, False)
+	# Sales Invoice with standard rated expense in Dubai
+	make_sales_invoices_wrapper("Dubai", uae_item)
+	# Sales Invoice with standard rated expense in Sharjah
+	make_sales_invoices_wrapper("Sharjah", uae_item)
+	# Sales Invoice with Tourist Tax Return
+	make_sales_invoices_wrapper("Dubai", uae_item, True, True)
+	# Sales Invoice with Exempt Item
+	make_sales_invoices_wrapper("Sharjah", uae_exempt_item, False)
+	# Sales Invoice with Zero Rated Item
+	make_sales_invoices_wrapper("Sharjah", uae_zero_rated_item, False)
+
 
 def create_purchase_invoices():
 	pi = make_purchase_invoice(
 		company="_Test Company UAE VAT",
-		supplier = '_Test UAE Supplier',
-		supplier_warehouse = '_Test UAE VAT Supplier Warehouse - _TCUV',
-		warehouse = '_Test UAE VAT Supplier Warehouse - _TCUV',
-		currency = 'AED',
-		cost_center = 'Main - _TCUV',
-		expense_account = 'Cost of Goods Sold - _TCUV',
-		item = "_Test UAE VAT Item",
+		supplier="_Test UAE Supplier",
+		supplier_warehouse="_Test UAE VAT Supplier Warehouse - _TCUV",
+		warehouse="_Test UAE VAT Supplier Warehouse - _TCUV",
+		currency="AED",
+		cost_center="Main - _TCUV",
+		expense_account="Cost of Goods Sold - _TCUV",
+		item="_Test UAE VAT Item",
 		do_not_save=1,
-		uom = "Nos"
+		uom="Nos",
 	)
-	pi.append("taxes", {
-		"charge_type": "On Net Total",
-		"account_head": "VAT 5% - _TCUV",
-		"cost_center": "Main - _TCUV",
-		"description": "VAT 5% @ 5.0",
-		"rate": 5.0
-	})
+	pi.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "VAT 5% - _TCUV",
+			"cost_center": "Main - _TCUV",
+			"description": "VAT 5% @ 5.0",
+			"rate": 5.0,
+		},
+	)
 
 	pi.recoverable_standard_rated_expenses = 1
 
diff --git a/erpnext/regional/report/uae_vat_201/uae_vat_201.py b/erpnext/regional/report/uae_vat_201/uae_vat_201.py
index f8379aa..59ef58b 100644
--- a/erpnext/regional/report/uae_vat_201/uae_vat_201.py
+++ b/erpnext/regional/report/uae_vat_201/uae_vat_201.py
@@ -11,21 +11,12 @@
 	data, emirates, amounts_by_emirate = get_data(filters)
 	return columns, data
 
+
 def get_columns():
 	"""Creates a list of dictionaries that are used to generate column headers of the data table."""
 	return [
-		{
-			"fieldname": "no",
-			"label": _("No"),
-			"fieldtype": "Data",
-			"width": 50
-		},
-		{
-			"fieldname": "legend",
-			"label": _("Legend"),
-			"fieldtype": "Data",
-			"width": 300
-		},
+		{"fieldname": "no", "label": _("No"), "fieldtype": "Data", "width": 50},
+		{"fieldname": "legend", "label": _("Legend"), "fieldtype": "Data", "width": 300},
 		{
 			"fieldname": "amount",
 			"label": _("Amount (AED)"),
@@ -37,41 +28,53 @@
 			"label": _("VAT Amount (AED)"),
 			"fieldtype": "Currency",
 			"width": 150,
-		}
+		},
 	]
 
-def get_data(filters = None):
+
+def get_data(filters=None):
 	"""Returns the list of dictionaries. Each dictionary is a row in the datatable and chart data."""
 	data = []
 	emirates, amounts_by_emirate = append_vat_on_sales(data, filters)
 	append_vat_on_expenses(data, filters)
 	return data, emirates, amounts_by_emirate
 
+
 def append_vat_on_sales(data, filters):
 	"""Appends Sales and All Other Outputs."""
-	append_data(data, '', _('VAT on Sales and All Other Outputs'), '', '')
+	append_data(data, "", _("VAT on Sales and All Other Outputs"), "", "")
 
 	emirates, amounts_by_emirate = standard_rated_expenses_emiratewise(data, filters)
 
-	append_data(data, '2',
-		 _('Tax Refunds provided to Tourists under the Tax Refunds for Tourists Scheme'),
-		frappe.format((-1) * get_tourist_tax_return_total(filters), 'Currency'),
-		frappe.format((-1) * get_tourist_tax_return_tax(filters), 'Currency'))
+	append_data(
+		data,
+		"2",
+		_("Tax Refunds provided to Tourists under the Tax Refunds for Tourists Scheme"),
+		frappe.format((-1) * get_tourist_tax_return_total(filters), "Currency"),
+		frappe.format((-1) * get_tourist_tax_return_tax(filters), "Currency"),
+	)
 
-	append_data(data, '3', _('Supplies subject to the reverse charge provision'),
-		frappe.format(get_reverse_charge_total(filters), 'Currency'),
-		frappe.format(get_reverse_charge_tax(filters), 'Currency'))
+	append_data(
+		data,
+		"3",
+		_("Supplies subject to the reverse charge provision"),
+		frappe.format(get_reverse_charge_total(filters), "Currency"),
+		frappe.format(get_reverse_charge_tax(filters), "Currency"),
+	)
 
-	append_data(data, '4', _('Zero Rated'),
-		frappe.format(get_zero_rated_total(filters), 'Currency'), "-")
+	append_data(
+		data, "4", _("Zero Rated"), frappe.format(get_zero_rated_total(filters), "Currency"), "-"
+	)
 
-	append_data(data, '5', _('Exempt Supplies'),
-		frappe.format(get_exempt_total(filters), 'Currency'),"-")
+	append_data(
+		data, "5", _("Exempt Supplies"), frappe.format(get_exempt_total(filters), "Currency"), "-"
+	)
 
-	append_data(data, '', '', '', '')
+	append_data(data, "", "", "", "")
 
 	return emirates, amounts_by_emirate
 
+
 def standard_rated_expenses_emiratewise(data, filters):
 	"""Append emiratewise standard rated expenses and vat."""
 	total_emiratewise = get_total_emiratewise(filters)
@@ -82,44 +85,61 @@
 			"legend": emirate,
 			"raw_amount": amount,
 			"raw_vat_amount": vat,
-			"amount": frappe.format(amount, 'Currency'),
-			"vat_amount": frappe.format(vat, 'Currency'),
+			"amount": frappe.format(amount, "Currency"),
+			"vat_amount": frappe.format(vat, "Currency"),
 		}
 	amounts_by_emirate = append_emiratewise_expenses(data, emirates, amounts_by_emirate)
 	return emirates, amounts_by_emirate
 
+
 def append_emiratewise_expenses(data, emirates, amounts_by_emirate):
 	"""Append emiratewise standard rated expenses and vat."""
 	for no, emirate in enumerate(emirates, 97):
 		if emirate in amounts_by_emirate:
-			amounts_by_emirate[emirate]["no"] = _('1{0}').format(chr(no))
-			amounts_by_emirate[emirate]["legend"] = _('Standard rated supplies in {0}').format(emirate)
+			amounts_by_emirate[emirate]["no"] = _("1{0}").format(chr(no))
+			amounts_by_emirate[emirate]["legend"] = _("Standard rated supplies in {0}").format(emirate)
 			data.append(amounts_by_emirate[emirate])
 		else:
-			append_data(data, _('1{0}').format(chr(no)),
-				_('Standard rated supplies in {0}').format(emirate),
-				frappe.format(0, 'Currency'), frappe.format(0, 'Currency'))
+			append_data(
+				data,
+				_("1{0}").format(chr(no)),
+				_("Standard rated supplies in {0}").format(emirate),
+				frappe.format(0, "Currency"),
+				frappe.format(0, "Currency"),
+			)
 	return amounts_by_emirate
 
+
 def append_vat_on_expenses(data, filters):
 	"""Appends Expenses and All Other Inputs."""
-	append_data(data, '', _('VAT on Expenses and All Other Inputs'), '', '')
-	append_data(data, '9', _('Standard Rated Expenses'),
-		frappe.format(get_standard_rated_expenses_total(filters), 'Currency'),
-		frappe.format(get_standard_rated_expenses_tax(filters), 'Currency'))
-	append_data(data, '10', _('Supplies subject to the reverse charge provision'),
-		frappe.format(get_reverse_charge_recoverable_total(filters), 'Currency'),
-		frappe.format(get_reverse_charge_recoverable_tax(filters), 'Currency'))
+	append_data(data, "", _("VAT on Expenses and All Other Inputs"), "", "")
+	append_data(
+		data,
+		"9",
+		_("Standard Rated Expenses"),
+		frappe.format(get_standard_rated_expenses_total(filters), "Currency"),
+		frappe.format(get_standard_rated_expenses_tax(filters), "Currency"),
+	)
+	append_data(
+		data,
+		"10",
+		_("Supplies subject to the reverse charge provision"),
+		frappe.format(get_reverse_charge_recoverable_total(filters), "Currency"),
+		frappe.format(get_reverse_charge_recoverable_tax(filters), "Currency"),
+	)
+
 
 def append_data(data, no, legend, amount, vat_amount):
 	"""Returns data with appended value."""
-	data.append({"no": no, "legend":legend, "amount": amount, "vat_amount": vat_amount})
+	data.append({"no": no, "legend": legend, "amount": amount, "vat_amount": vat_amount})
+
 
 def get_total_emiratewise(filters):
 	"""Returns Emiratewise Amount and Taxes."""
 	conditions = get_conditions(filters)
 	try:
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select
 				s.vat_emirate as emirate, sum(i.base_amount) as total, sum(i.tax_amount)
 			from
@@ -131,52 +151,54 @@
 				{where_conditions}
 			group by
 				s.vat_emirate;
-			""".format(where_conditions=conditions), filters)
+			""".format(
+				where_conditions=conditions
+			),
+			filters,
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_emirates():
 	"""Returns a List of emirates in the order that they are to be displayed."""
-	return [
-		'Abu Dhabi',
-		'Dubai',
-		'Sharjah',
-		'Ajman',
-		'Umm Al Quwain',
-		'Ras Al Khaimah',
-		'Fujairah'
-	]
+	return ["Abu Dhabi", "Dubai", "Sharjah", "Ajman", "Umm Al Quwain", "Ras Al Khaimah", "Fujairah"]
+
 
 def get_filters(filters):
 	"""The conditions to be used to filter data to calculate the total sale."""
 	query_filters = []
 	if filters.get("company"):
-		query_filters.append(["company", '=', filters['company']])
+		query_filters.append(["company", "=", filters["company"]])
 	if filters.get("from_date"):
-		query_filters.append(["posting_date", '>=', filters['from_date']])
+		query_filters.append(["posting_date", ">=", filters["from_date"]])
 	if filters.get("from_date"):
-		query_filters.append(["posting_date", '<=', filters['to_date']])
+		query_filters.append(["posting_date", "<=", filters["to_date"]])
 	return query_filters
 
+
 def get_reverse_charge_total(filters):
 	"""Returns the sum of the total of each Purchase invoice made."""
 	query_filters = get_filters(filters)
-	query_filters.append(['reverse_charge', '=', 'Y'])
-	query_filters.append(['docstatus', '=', 1])
+	query_filters.append(["reverse_charge", "=", "Y"])
+	query_filters.append(["docstatus", "=", 1])
 	try:
-		return frappe.db.get_all('Purchase Invoice',
-			filters = query_filters,
-			fields = ['sum(total)'],
-			as_list=True,
-			limit = 1
-		)[0][0] or 0
+		return (
+			frappe.db.get_all(
+				"Purchase Invoice", filters=query_filters, fields=["sum(total)"], as_list=True, limit=1
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_reverse_charge_tax(filters):
 	"""Returns the sum of the tax of each Purchase invoice made."""
 	conditions = get_conditions_join(filters)
-	return frappe.db.sql("""
+	return (
+		frappe.db.sql(
+			"""
 		select sum(debit)  from
 			`tabPurchase Invoice` p inner join `tabGL Entry` gl
 		on
@@ -187,28 +209,38 @@
 			and gl.docstatus = 1
 			and account in (select account from `tabUAE VAT Account` where  parent=%(company)s)
 			{where_conditions} ;
-		""".format(where_conditions=conditions), filters)[0][0] or 0
+		""".format(
+				where_conditions=conditions
+			),
+			filters,
+		)[0][0]
+		or 0
+	)
+
 
 def get_reverse_charge_recoverable_total(filters):
 	"""Returns the sum of the total of each Purchase invoice made with recoverable reverse charge."""
 	query_filters = get_filters(filters)
-	query_filters.append(['reverse_charge', '=', 'Y'])
-	query_filters.append(['recoverable_reverse_charge', '>', '0'])
-	query_filters.append(['docstatus', '=', 1])
+	query_filters.append(["reverse_charge", "=", "Y"])
+	query_filters.append(["recoverable_reverse_charge", ">", "0"])
+	query_filters.append(["docstatus", "=", 1])
 	try:
-		return frappe.db.get_all('Purchase Invoice',
-			filters = query_filters,
-			fields = ['sum(total)'],
-			as_list=True,
-			limit = 1
-		)[0][0] or 0
+		return (
+			frappe.db.get_all(
+				"Purchase Invoice", filters=query_filters, fields=["sum(total)"], as_list=True, limit=1
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_reverse_charge_recoverable_tax(filters):
 	"""Returns the sum of the tax of each Purchase invoice made."""
 	conditions = get_conditions_join(filters)
-	return frappe.db.sql("""
+	return (
+		frappe.db.sql(
+			"""
 		select
 			sum(debit * p.recoverable_reverse_charge / 100)
 		from
@@ -222,83 +254,107 @@
 			and gl.docstatus = 1
 			and account in (select account from `tabUAE VAT Account` where  parent=%(company)s)
 			{where_conditions} ;
-		""".format(where_conditions=conditions), filters)[0][0] or 0
+		""".format(
+				where_conditions=conditions
+			),
+			filters,
+		)[0][0]
+		or 0
+	)
+
 
 def get_conditions_join(filters):
 	"""The conditions to be used to filter data to calculate the total vat."""
 	conditions = ""
-	for opts in (("company", " and p.company=%(company)s"),
+	for opts in (
+		("company", " and p.company=%(company)s"),
 		("from_date", " and p.posting_date>=%(from_date)s"),
-		("to_date", " and p.posting_date<=%(to_date)s")):
+		("to_date", " and p.posting_date<=%(to_date)s"),
+	):
 		if filters.get(opts[0]):
 			conditions += opts[1]
 	return conditions
 
+
 def get_standard_rated_expenses_total(filters):
 	"""Returns the sum of the total of each Purchase invoice made with recoverable reverse charge."""
 	query_filters = get_filters(filters)
-	query_filters.append(['recoverable_standard_rated_expenses', '>', 0])
-	query_filters.append(['docstatus', '=', 1])
+	query_filters.append(["recoverable_standard_rated_expenses", ">", 0])
+	query_filters.append(["docstatus", "=", 1])
 	try:
-		return frappe.db.get_all('Purchase Invoice',
-			filters = query_filters,
-			fields = ['sum(total)'],
-			as_list=True,
-			limit = 1
-		)[0][0]  or 0
+		return (
+			frappe.db.get_all(
+				"Purchase Invoice", filters=query_filters, fields=["sum(total)"], as_list=True, limit=1
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_standard_rated_expenses_tax(filters):
 	"""Returns the sum of the tax of each Purchase invoice made."""
 	query_filters = get_filters(filters)
-	query_filters.append(['recoverable_standard_rated_expenses', '>', 0])
-	query_filters.append(['docstatus', '=', 1])
+	query_filters.append(["recoverable_standard_rated_expenses", ">", 0])
+	query_filters.append(["docstatus", "=", 1])
 	try:
-		return frappe.db.get_all('Purchase Invoice',
-			filters = query_filters,
-			fields = ['sum(recoverable_standard_rated_expenses)'],
-			as_list=True,
-			limit = 1
-		)[0][0]  or 0
+		return (
+			frappe.db.get_all(
+				"Purchase Invoice",
+				filters=query_filters,
+				fields=["sum(recoverable_standard_rated_expenses)"],
+				as_list=True,
+				limit=1,
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_tourist_tax_return_total(filters):
 	"""Returns the sum of the total of each Sales invoice with non zero tourist_tax_return."""
 	query_filters = get_filters(filters)
-	query_filters.append(['tourist_tax_return', '>', 0])
-	query_filters.append(['docstatus', '=', 1])
+	query_filters.append(["tourist_tax_return", ">", 0])
+	query_filters.append(["docstatus", "=", 1])
 	try:
-		return frappe.db.get_all('Sales Invoice',
-			filters = query_filters,
-			fields = ['sum(total)'],
-			as_list=True,
-			limit = 1
-		)[0][0]  or 0
+		return (
+			frappe.db.get_all(
+				"Sales Invoice", filters=query_filters, fields=["sum(total)"], as_list=True, limit=1
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_tourist_tax_return_tax(filters):
 	"""Returns the sum of the tax of each Sales invoice with non zero tourist_tax_return."""
 	query_filters = get_filters(filters)
-	query_filters.append(['tourist_tax_return', '>', 0])
-	query_filters.append(['docstatus', '=', 1])
+	query_filters.append(["tourist_tax_return", ">", 0])
+	query_filters.append(["docstatus", "=", 1])
 	try:
-		return frappe.db.get_all('Sales Invoice',
-			filters = query_filters,
-			fields = ['sum(tourist_tax_return)'],
-			as_list=True,
-			limit = 1
-		)[0][0]  or 0
+		return (
+			frappe.db.get_all(
+				"Sales Invoice",
+				filters=query_filters,
+				fields=["sum(tourist_tax_return)"],
+				as_list=True,
+				limit=1,
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_zero_rated_total(filters):
 	"""Returns the sum of each Sales Invoice Item Amount which is zero rated."""
 	conditions = get_conditions(filters)
 	try:
-		return frappe.db.sql("""
+		return (
+			frappe.db.sql(
+				"""
 			select
 				sum(i.base_amount) as total
 			from
@@ -308,15 +364,24 @@
 			where
 				s.docstatus = 1 and  i.is_zero_rated = 1
 				{where_conditions} ;
-			""".format(where_conditions=conditions), filters)[0][0] or 0
+			""".format(
+					where_conditions=conditions
+				),
+				filters,
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
 
+
 def get_exempt_total(filters):
 	"""Returns the sum of each Sales Invoice Item Amount which is Vat Exempt."""
 	conditions = get_conditions(filters)
 	try:
-		return frappe.db.sql("""
+		return (
+			frappe.db.sql(
+				"""
 			select
 				sum(i.base_amount) as total
 			from
@@ -326,15 +391,25 @@
 			where
 				s.docstatus = 1 and  i.is_exempt = 1
 				{where_conditions} ;
-			""".format(where_conditions=conditions), filters)[0][0] or 0
+			""".format(
+					where_conditions=conditions
+				),
+				filters,
+			)[0][0]
+			or 0
+		)
 	except (IndexError, TypeError):
 		return 0
+
+
 def get_conditions(filters):
 	"""The conditions to be used to filter data to calculate the total sale."""
 	conditions = ""
-	for opts in (("company", " and company=%(company)s"),
+	for opts in (
+		("company", " and company=%(company)s"),
 		("from_date", " and posting_date>=%(from_date)s"),
-		("to_date", " and posting_date<=%(to_date)s")):
+		("to_date", " and posting_date<=%(to_date)s"),
+	):
 		if filters.get(opts[0]):
 			conditions += opts[1]
 	return conditions
diff --git a/erpnext/regional/report/vat_audit_report/test_vat_audit_report.py b/erpnext/regional/report/vat_audit_report/test_vat_audit_report.py
index f22abae..a898a25 100644
--- a/erpnext/regional/report/vat_audit_report/test_vat_audit_report.py
+++ b/erpnext/regional/report/vat_audit_report/test_vat_audit_report.py
@@ -18,14 +18,22 @@
 		frappe.set_user("Administrator")
 		make_company("_Test Company SA VAT", "_TCSV")
 
-		create_account(account_name="VAT - 0%", account_type="Tax",
-			parent_account="Duties and Taxes - _TCSV", company="_Test Company SA VAT")
-		create_account(account_name="VAT - 15%", account_type="Tax",
-			parent_account="Duties and Taxes - _TCSV", company="_Test Company SA VAT")
+		create_account(
+			account_name="VAT - 0%",
+			account_type="Tax",
+			parent_account="Duties and Taxes - _TCSV",
+			company="_Test Company SA VAT",
+		)
+		create_account(
+			account_name="VAT - 15%",
+			account_type="Tax",
+			parent_account="Duties and Taxes - _TCSV",
+			company="_Test Company SA VAT",
+		)
 		set_sa_vat_accounts()
 
 		make_item("_Test SA VAT Item")
-		make_item("_Test SA VAT Zero Rated Item", properties = {"is_zero_rated": 1})
+		make_item("_Test SA VAT Zero Rated Item", properties={"is_zero_rated": 1})
 
 		make_customer()
 		make_supplier()
@@ -38,34 +46,33 @@
 		frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company SA VAT'")
 
 	def test_vat_audit_report(self):
-		filters = {
-			"company": "_Test Company SA VAT",
-			"from_date": today(),
-			"to_date": today()
-		}
+		filters = {"company": "_Test Company SA VAT", "from_date": today(), "to_date": today()}
 		columns, data = execute(filters)
 		total_tax_amount = 0
 		total_row_tax = 0
 		for row in data:
 			keys = row.keys()
 			# skips total row tax_amount in if.. and skips section header in elif..
-			if 'voucher_no' in keys:
-				total_tax_amount = total_tax_amount + row['tax_amount']
-			elif 'tax_amount' in keys:
-				total_row_tax = total_row_tax + row['tax_amount']
+			if "voucher_no" in keys:
+				total_tax_amount = total_tax_amount + row["tax_amount"]
+			elif "tax_amount" in keys:
+				total_row_tax = total_row_tax + row["tax_amount"]
 
 		self.assertEqual(total_tax_amount, total_row_tax)
 
+
 def make_company(company_name, abbr):
 	if not frappe.db.exists("Company", company_name):
-		company = frappe.get_doc({
-			"doctype": "Company",
-			"company_name": company_name,
-			"abbr": abbr,
-			"default_currency": "ZAR",
-			"country": "South Africa",
-			"create_chart_of_accounts_based_on": "Standard Template"
-		})
+		company = frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": company_name,
+				"abbr": abbr,
+				"default_currency": "ZAR",
+				"country": "South Africa",
+				"create_chart_of_accounts_based_on": "Standard Template",
+			}
+		)
 		company.insert()
 	else:
 		company = frappe.get_doc("Company", company_name)
@@ -79,86 +86,95 @@
 
 	return company
 
+
 def set_sa_vat_accounts():
 	if not frappe.db.exists("South Africa VAT Settings", "_Test Company SA VAT"):
 		vat_accounts = frappe.get_all(
 			"Account",
 			fields=["name"],
-			filters = {
-				"company": "_Test Company SA VAT",
-				"is_group": 0,
-				"account_type": "Tax"
-			}
+			filters={"company": "_Test Company SA VAT", "is_group": 0, "account_type": "Tax"},
 		)
 
 		sa_vat_accounts = []
 		for account in vat_accounts:
-			sa_vat_accounts.append({
-				"doctype": "South Africa VAT Account",
-				"account": account.name
-			})
+			sa_vat_accounts.append({"doctype": "South Africa VAT Account", "account": account.name})
 
-		frappe.get_doc({
-			"company": "_Test Company SA VAT",
-			"vat_accounts": sa_vat_accounts,
-			"doctype": "South Africa VAT Settings",
-		}).insert()
+		frappe.get_doc(
+			{
+				"company": "_Test Company SA VAT",
+				"vat_accounts": sa_vat_accounts,
+				"doctype": "South Africa VAT Settings",
+			}
+		).insert()
+
 
 def make_customer():
 	if not frappe.db.exists("Customer", "_Test SA Customer"):
-		frappe.get_doc({
-			"doctype": "Customer",
-			"customer_name": "_Test SA Customer",
-			"customer_type": "Company",
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_name": "_Test SA Customer",
+				"customer_type": "Company",
+			}
+		).insert()
+
 
 def make_supplier():
 	if not frappe.db.exists("Supplier", "_Test SA Supplier"):
-		frappe.get_doc({
-			"doctype": "Supplier",
-			"supplier_name": "_Test SA Supplier",
-			"supplier_type": "Company",
-			"supplier_group":"All Supplier Groups"
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Supplier",
+				"supplier_name": "_Test SA Supplier",
+				"supplier_type": "Company",
+				"supplier_group": "All Supplier Groups",
+			}
+		).insert()
+
 
 def make_item(item_code, properties=None):
 	if not frappe.db.exists("Item", item_code):
-		item = frappe.get_doc({
-			"doctype": "Item",
-			"item_code": item_code,
-			"item_name": item_code,
-			"description": item_code,
-			"item_group": "Products"
-		})
+		item = frappe.get_doc(
+			{
+				"doctype": "Item",
+				"item_code": item_code,
+				"item_name": item_code,
+				"description": item_code,
+				"item_group": "Products",
+			}
+		)
 
 		if properties:
 			item.update(properties)
 
 		item.insert()
 
+
 def make_sales_invoices():
 	def make_sales_invoices_wrapper(item, rate, tax_account, tax_rate, tax=True):
 		si = create_sales_invoice(
 			company="_Test Company SA VAT",
-			customer = "_Test SA Customer",
-			currency = "ZAR",
+			customer="_Test SA Customer",
+			currency="ZAR",
 			item=item,
 			rate=rate,
-			warehouse = "Finished Goods - _TCSV",
-			debit_to = "Debtors - _TCSV",
-			income_account = "Sales - _TCSV",
-			expense_account = "Cost of Goods Sold - _TCSV",
-			cost_center = "Main - _TCSV",
-			do_not_save=1
+			warehouse="Finished Goods - _TCSV",
+			debit_to="Debtors - _TCSV",
+			income_account="Sales - _TCSV",
+			expense_account="Cost of Goods Sold - _TCSV",
+			cost_center="Main - _TCSV",
+			do_not_save=1,
 		)
 		if tax:
-			si.append("taxes", {
+			si.append(
+				"taxes",
+				{
 					"charge_type": "On Net Total",
 					"account_head": tax_account,
 					"cost_center": "Main - _TCSV",
 					"description": "VAT 15% @ 15.0",
-					"rate": tax_rate
-				})
+					"rate": tax_rate,
+				},
+			)
 
 		si.submit()
 
@@ -168,27 +184,31 @@
 	make_sales_invoices_wrapper(test_item, 100.0, "VAT - 15% - _TCSV", 15.0)
 	make_sales_invoices_wrapper(test_zero_rated_item, 100.0, "VAT - 0% - _TCSV", 0.0)
 
+
 def create_purchase_invoices():
 	pi = make_purchase_invoice(
-		company = "_Test Company SA VAT",
-		supplier = "_Test SA Supplier",
-		supplier_warehouse = "Finished Goods - _TCSV",
-		warehouse = "Finished Goods - _TCSV",
-		currency = "ZAR",
-		cost_center = "Main - _TCSV",
-		expense_account = "Cost of Goods Sold - _TCSV",
-		item = "_Test SA VAT Item",
-		qty = 1,
-		rate = 100,
-		uom = "Nos",
-		do_not_save = 1
+		company="_Test Company SA VAT",
+		supplier="_Test SA Supplier",
+		supplier_warehouse="Finished Goods - _TCSV",
+		warehouse="Finished Goods - _TCSV",
+		currency="ZAR",
+		cost_center="Main - _TCSV",
+		expense_account="Cost of Goods Sold - _TCSV",
+		item="_Test SA VAT Item",
+		qty=1,
+		rate=100,
+		uom="Nos",
+		do_not_save=1,
 	)
-	pi.append("taxes", {
-		"charge_type": "On Net Total",
-		"account_head": "VAT - 15% - _TCSV",
-		"cost_center": "Main - _TCSV",
-		"description": "VAT 15% @ 15.0",
-		"rate": 15.0
-	})
+	pi.append(
+		"taxes",
+		{
+			"charge_type": "On Net Total",
+			"account_head": "VAT - 15% - _TCSV",
+			"cost_center": "Main - _TCSV",
+			"description": "VAT 15% @ 15.0",
+			"rate": 15.0,
+		},
+	)
 
 	pi.submit()
diff --git a/erpnext/regional/report/vat_audit_report/vat_audit_report.py b/erpnext/regional/report/vat_audit_report/vat_audit_report.py
index 17e5064..6e59824 100644
--- a/erpnext/regional/report/vat_audit_report/vat_audit_report.py
+++ b/erpnext/regional/report/vat_audit_report/vat_audit_report.py
@@ -12,8 +12,8 @@
 def execute(filters=None):
 	return VATAuditReport(filters).run()
 
-class VATAuditReport(object):
 
+class VATAuditReport(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
 		self.columns = []
@@ -27,8 +27,11 @@
 			self.select_columns = """
 			name as voucher_no,
 			posting_date, remarks"""
-			columns = ", supplier as party, credit_to as account" if doctype=="Purchase Invoice" \
+			columns = (
+				", supplier as party, credit_to as account"
+				if doctype == "Purchase Invoice"
 				else ", customer as party, debit_to as account"
+			)
 			self.select_columns += columns
 
 			self.get_invoice_data(doctype)
@@ -41,17 +44,21 @@
 		return self.columns, self.data
 
 	def get_sa_vat_accounts(self):
-		self.sa_vat_accounts = frappe.get_all("South Africa VAT Account",
-			filters = {"parent": self.filters.company}, pluck="account")
+		self.sa_vat_accounts = frappe.get_all(
+			"South Africa VAT Account", filters={"parent": self.filters.company}, pluck="account"
+		)
 		if not self.sa_vat_accounts and not frappe.flags.in_test and not frappe.flags.in_migrate:
-			link_to_settings = get_link_to_form("South Africa VAT Settings", "", label="South Africa VAT Settings")
+			link_to_settings = get_link_to_form(
+				"South Africa VAT Settings", "", label="South Africa VAT Settings"
+			)
 			frappe.throw(_("Please set VAT Accounts in {0}").format(link_to_settings))
 
 	def get_invoice_data(self, doctype):
 		conditions = self.get_conditions()
 		self.invoices = frappe._dict()
 
-		invoice_data = frappe.db.sql("""
+		invoice_data = frappe.db.sql(
+			"""
 			SELECT
 				{select_columns}
 			FROM
@@ -61,8 +68,12 @@
 				and is_opening = "No"
 			ORDER BY
 				posting_date DESC
-			""".format(select_columns=self.select_columns, doctype=doctype,
-				where_conditions=conditions), self.filters, as_dict=1)
+			""".format(
+				select_columns=self.select_columns, doctype=doctype, where_conditions=conditions
+			),
+			self.filters,
+			as_dict=1,
+		)
 
 		for d in invoice_data:
 			self.invoices.setdefault(d.voucher_no, d)
@@ -70,28 +81,34 @@
 	def get_invoice_items(self, doctype):
 		self.invoice_items = frappe._dict()
 
-		items = frappe.db.sql("""
+		items = frappe.db.sql(
+			"""
 			SELECT
 				item_code, parent, base_net_amount, is_zero_rated
 			FROM
 				`tab%s Item`
 			WHERE
 				parent in (%s)
-			""" % (doctype, ", ".join(["%s"]*len(self.invoices))), tuple(self.invoices), as_dict=1)
+			"""
+			% (doctype, ", ".join(["%s"] * len(self.invoices))),
+			tuple(self.invoices),
+			as_dict=1,
+		)
 		for d in items:
 			if d.item_code not in self.invoice_items.get(d.parent, {}):
-				self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code, {
-					'net_amount': 0.0})
-				self.invoice_items[d.parent][d.item_code]['net_amount'] += d.get('base_net_amount', 0)
-				self.invoice_items[d.parent][d.item_code]['is_zero_rated'] = d.is_zero_rated
+				self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code, {"net_amount": 0.0})
+				self.invoice_items[d.parent][d.item_code]["net_amount"] += d.get("base_net_amount", 0)
+				self.invoice_items[d.parent][d.item_code]["is_zero_rated"] = d.is_zero_rated
 
 	def get_items_based_on_tax_rate(self, doctype):
 		self.items_based_on_tax_rate = frappe._dict()
 		self.item_tax_rate = frappe._dict()
-		self.tax_doctype = "Purchase Taxes and Charges" if doctype=="Purchase Invoice" \
-			else "Sales Taxes and Charges"
+		self.tax_doctype = (
+			"Purchase Taxes and Charges" if doctype == "Purchase Invoice" else "Sales Taxes and Charges"
+		)
 
-		self.tax_details = frappe.db.sql("""
+		self.tax_details = frappe.db.sql(
+			"""
 			SELECT
 				parent, account_head, item_wise_tax_detail, base_tax_amount_after_discount_amount
 			FROM
@@ -101,8 +118,10 @@
 				and parent in (%s)
 			ORDER BY
 				account_head
-			""" % (self.tax_doctype, "%s", ", ".join(["%s"]*len(self.invoices.keys()))),
-			tuple([doctype] + list(self.invoices.keys())))
+			"""
+			% (self.tax_doctype, "%s", ", ".join(["%s"] * len(self.invoices.keys()))),
+			tuple([doctype] + list(self.invoices.keys())),
+		)
 
 		for parent, account, item_wise_tax_detail, tax_amount in self.tax_details:
 			if item_wise_tax_detail:
@@ -113,14 +132,15 @@
 						continue
 					for item_code, taxes in item_wise_tax_detail.items():
 						is_zero_rated = self.invoice_items.get(parent).get(item_code).get("is_zero_rated")
-						#to skip items with non-zero tax rate in multiple rows
+						# to skip items with non-zero tax rate in multiple rows
 						if taxes[0] == 0 and not is_zero_rated:
 							continue
 						tax_rate, item_amount_map = self.get_item_amount_map(parent, item_code, taxes)
 
 						if tax_rate is not None:
-							rate_based_dict = self.items_based_on_tax_rate.setdefault(parent, {}) \
-								.setdefault(tax_rate, [])
+							rate_based_dict = self.items_based_on_tax_rate.setdefault(parent, {}).setdefault(
+								tax_rate, []
+							)
 							if item_code not in rate_based_dict:
 								rate_based_dict.append(item_code)
 				except ValueError:
@@ -131,13 +151,12 @@
 		tax_rate = taxes[0]
 		tax_amount = taxes[1]
 		gross_amount = net_amount + tax_amount
-		item_amount_map = self.item_tax_rate.setdefault(parent, {}) \
-			.setdefault(item_code, [])
+		item_amount_map = self.item_tax_rate.setdefault(parent, {}).setdefault(item_code, [])
 		amount_dict = {
 			"tax_rate": tax_rate,
 			"gross_amount": gross_amount,
 			"tax_amount": tax_amount,
-			"net_amount": net_amount
+			"net_amount": net_amount,
 		}
 		item_amount_map.append(amount_dict)
 
@@ -145,9 +164,11 @@
 
 	def get_conditions(self):
 		conditions = ""
-		for opts in (("company", " and company=%(company)s"),
+		for opts in (
+			("company", " and company=%(company)s"),
 			("from_date", " and posting_date>=%(from_date)s"),
-			("to_date", " and posting_date<=%(to_date)s")):
+			("to_date", " and posting_date<=%(to_date)s"),
+		):
 			if self.filters.get(opts[0]):
 				conditions += opts[1]
 
@@ -174,13 +195,13 @@
 				"gross_amount": total_gross,
 				"tax_amount": total_tax,
 				"net_amount": total_net,
-				"bold":1
+				"bold": 1,
 			}
 			self.data.append(total)
 			self.data.append({})
 
 	def get_consolidated_data(self, doctype):
-		consolidated_data_map={}
+		consolidated_data_map = {}
 		for inv, inv_data in self.invoices.items():
 			if self.items_based_on_tax_rate.get(inv):
 				for rate, items in self.items_based_on_tax_rate.get(inv).items():
@@ -195,78 +216,53 @@
 						row["party_type"] = "Customer" if doctype == "Sales Invoice" else "Supplier"
 						row["party"] = inv_data.get("party")
 						row["remarks"] = inv_data.get("remarks")
-						row["gross_amount"]= item_details[0].get("gross_amount")
-						row["tax_amount"]= item_details[0].get("tax_amount")
-						row["net_amount"]= item_details[0].get("net_amount")
+						row["gross_amount"] = item_details[0].get("gross_amount")
+						row["tax_amount"] = item_details[0].get("tax_amount")
+						row["net_amount"] = item_details[0].get("net_amount")
 						consolidated_data_map[rate]["data"].append(row)
 
 		return consolidated_data_map
 
 	def get_columns(self):
 		self.columns = [
-			{
-				"fieldname": "posting_date",
-				"label": "Posting Date",
-				"fieldtype": "Data",
-				"width": 200
-			},
+			{"fieldname": "posting_date", "label": "Posting Date", "fieldtype": "Data", "width": 200},
 			{
 				"fieldname": "account",
 				"label": "Account",
 				"fieldtype": "Link",
 				"options": "Account",
-				"width": 150
+				"width": 150,
 			},
 			{
 				"fieldname": "voucher_type",
 				"label": "Voucher Type",
 				"fieldtype": "Data",
 				"width": 140,
-				"hidden": 1
+				"hidden": 1,
 			},
 			{
 				"fieldname": "voucher_no",
 				"label": "Reference",
 				"fieldtype": "Dynamic Link",
 				"options": "voucher_type",
-				"width": 150
+				"width": 150,
 			},
 			{
 				"fieldname": "party_type",
 				"label": "Party Type",
 				"fieldtype": "Data",
 				"width": 140,
-				"hidden": 1
+				"hidden": 1,
 			},
 			{
 				"fieldname": "party",
 				"label": "Party",
 				"fieldtype": "Dynamic Link",
 				"options": "party_type",
-				"width": 150
+				"width": 150,
 			},
-			{
-				"fieldname": "remarks",
-				"label": "Details",
-				"fieldtype": "Data",
-				"width": 150
-			},
-			{
-				"fieldname": "net_amount",
-				"label": "Net Amount",
-				"fieldtype": "Currency",
-				"width": 130
-			},
-			{
-				"fieldname": "tax_amount",
-				"label": "Tax Amount",
-				"fieldtype": "Currency",
-				"width": 130
-			},
-			{
-				"fieldname": "gross_amount",
-				"label": "Gross Amount",
-				"fieldtype": "Currency",
-				"width": 130
-			},
+			{"fieldname": "remarks", "label": "Details", "fieldtype": "Data", "width": 150},
+			{"fieldname": "net_amount", "label": "Net Amount", "fieldtype": "Currency", "width": 130},
+			{"fieldname": "tax_amount", "label": "Tax Amount", "fieldtype": "Currency", "width": 130},
+			{"fieldname": "gross_amount", "label": "Gross Amount", "fieldtype": "Currency", "width": 130},
 		]
diff --git a/erpnext/regional/saudi_arabia/setup.py b/erpnext/regional/saudi_arabia/setup.py
index d2ef6f3..7f41c46 100644
--- a/erpnext/regional/saudi_arabia/setup.py
+++ b/erpnext/regional/saudi_arabia/setup.py
@@ -3,14 +3,18 @@
 
 import frappe
 from frappe.permissions import add_permission, update_permission_property
-from erpnext.regional.saudi_arabia.wizard.operations.setup_ksa_vat_setting import create_ksa_vat_setting
+from erpnext.regional.saudi_arabia.wizard.operations.setup_ksa_vat_setting import (
+	create_ksa_vat_setting,
+)
 from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
 
+
 def setup(company=None, patch=True):
 	add_print_formats()
 	add_permissions()
 	make_custom_fields()
 
+
 def add_print_formats():
 	frappe.reload_doc("regional", "print_format", "detailed_tax_invoice", force=True)
 	frappe.reload_doc("regional", "print_format", "simplified_tax_invoice", force=True)
@@ -18,19 +22,27 @@
 	frappe.reload_doc("regional", "print_format", "ksa_vat_invoice", force=True)
 	frappe.reload_doc("regional", "print_format", "ksa_pos_invoice", force=True)
 
-	for d in ('Simplified Tax Invoice', 'Detailed Tax Invoice', 'Tax Invoice', 'KSA VAT Invoice', 'KSA POS Invoice'):
+	for d in (
+		"Simplified Tax Invoice",
+		"Detailed Tax Invoice",
+		"Tax Invoice",
+		"KSA VAT Invoice",
+		"KSA POS Invoice",
+	):
 		frappe.db.set_value("Print Format", d, "disabled", 0)
 
+
 def add_permissions():
 	"""Add Permissions for KSA VAT Setting."""
-	add_permission('KSA VAT Setting', 'All', 0)
-	for role in ('Accounts Manager', 'Accounts User', 'System Manager'):
-		add_permission('KSA VAT Setting', role, 0)
-		update_permission_property('KSA VAT Setting', role, 0, 'write', 1)
-		update_permission_property('KSA VAT Setting', role, 0, 'create', 1)
+	add_permission("KSA VAT Setting", "All", 0)
+	for role in ("Accounts Manager", "Accounts User", "System Manager"):
+		add_permission("KSA VAT Setting", role, 0)
+		update_permission_property("KSA VAT Setting", role, 0, "write", 1)
+		update_permission_property("KSA VAT Setting", role, 0, "create", 1)
 
 	"""Enable KSA VAT Report"""
-	frappe.db.set_value('Report', 'KSA VAT', 'disabled', 0)
+	frappe.db.set_value("Report", "KSA VAT", "disabled", 0)
+
 
 def make_custom_fields():
 	"""Create Custom fields
@@ -38,71 +50,124 @@
 	- Company Name in Arabic
 	- Address in Arabic
 	"""
-	is_zero_rated = dict(fieldname='is_zero_rated', label='Is Zero Rated',
-		fieldtype='Check', fetch_from='item_code.is_zero_rated', insert_after='description',
-		print_hide=1)
+	is_zero_rated = dict(
+		fieldname="is_zero_rated",
+		label="Is Zero Rated",
+		fieldtype="Check",
+		fetch_from="item_code.is_zero_rated",
+		insert_after="description",
+		print_hide=1,
+	)
 
-	is_exempt = dict(fieldname='is_exempt', label='Is Exempt',
-		fieldtype='Check', fetch_from='item_code.is_exempt', insert_after='is_zero_rated',
-		print_hide=1)
+	is_exempt = dict(
+		fieldname="is_exempt",
+		label="Is Exempt",
+		fieldtype="Check",
+		fetch_from="item_code.is_exempt",
+		insert_after="is_zero_rated",
+		print_hide=1,
+	)
 
 	purchase_invoice_fields = [
-			dict(fieldname='company_trn', label='Company TRN',
-				fieldtype='Read Only', insert_after='shipping_address',
-				fetch_from='company.tax_id', print_hide=1),
-			dict(fieldname='supplier_name_in_arabic', label='Supplier Name in Arabic',
-				fieldtype='Read Only', insert_after='supplier_name',
-				fetch_from='supplier.supplier_name_in_arabic', print_hide=1)
-		]
+		dict(
+			fieldname="company_trn",
+			label="Company TRN",
+			fieldtype="Read Only",
+			insert_after="shipping_address",
+			fetch_from="company.tax_id",
+			print_hide=1,
+		),
+		dict(
+			fieldname="supplier_name_in_arabic",
+			label="Supplier Name in Arabic",
+			fieldtype="Read Only",
+			insert_after="supplier_name",
+			fetch_from="supplier.supplier_name_in_arabic",
+			print_hide=1,
+		),
+	]
 
 	sales_invoice_fields = [
-			dict(fieldname='company_trn', label='Company TRN',
-				fieldtype='Read Only', insert_after='company_address',
-				fetch_from='company.tax_id', print_hide=1),
-			dict(fieldname='customer_name_in_arabic', label='Customer Name in Arabic',
-				fieldtype='Read Only', insert_after='customer_name',
-				fetch_from='customer.customer_name_in_arabic', print_hide=1),
-			dict(fieldname='ksa_einv_qr', label='KSA E-Invoicing QR',
-				fieldtype='Attach Image', read_only=1, no_copy=1, hidden=1)
-		]
+		dict(
+			fieldname="company_trn",
+			label="Company TRN",
+			fieldtype="Read Only",
+			insert_after="company_address",
+			fetch_from="company.tax_id",
+			print_hide=1,
+		),
+		dict(
+			fieldname="customer_name_in_arabic",
+			label="Customer Name in Arabic",
+			fieldtype="Read Only",
+			insert_after="customer_name",
+			fetch_from="customer.customer_name_in_arabic",
+			print_hide=1,
+		),
+		dict(
+			fieldname="ksa_einv_qr",
+			label="KSA E-Invoicing QR",
+			fieldtype="Attach Image",
+			read_only=1,
+			no_copy=1,
+			hidden=1,
+		),
+	]
 
 	custom_fields = {
-		'Item': [is_zero_rated, is_exempt],
-		'Customer': [
-			dict(fieldname='customer_name_in_arabic', label='Customer Name in Arabic',
-				fieldtype='Data', insert_after='customer_name'),
+		"Item": [is_zero_rated, is_exempt],
+		"Customer": [
+			dict(
+				fieldname="customer_name_in_arabic",
+				label="Customer Name in Arabic",
+				fieldtype="Data",
+				insert_after="customer_name",
+			),
 		],
-		'Supplier': [
-			dict(fieldname='supplier_name_in_arabic', label='Supplier Name in Arabic',
-				fieldtype='Data', insert_after='supplier_name'),
+		"Supplier": [
+			dict(
+				fieldname="supplier_name_in_arabic",
+				label="Supplier Name in Arabic",
+				fieldtype="Data",
+				insert_after="supplier_name",
+			),
 		],
-		'Purchase Invoice': purchase_invoice_fields,
-		'Purchase Order': purchase_invoice_fields,
-		'Purchase Receipt': purchase_invoice_fields,
-		'Sales Invoice': sales_invoice_fields,
-		'POS Invoice': sales_invoice_fields,
-		'Sales Order': sales_invoice_fields,
-		'Delivery Note': sales_invoice_fields,
-		'Sales Invoice Item': [is_zero_rated, is_exempt],
-		'POS Invoice Item': [is_zero_rated, is_exempt],
-		'Purchase Invoice Item': [is_zero_rated, is_exempt],
-		'Sales Order Item': [is_zero_rated, is_exempt],
-		'Delivery Note Item': [is_zero_rated, is_exempt],
-		'Quotation Item': [is_zero_rated, is_exempt],
-		'Purchase Order Item': [is_zero_rated, is_exempt],
-		'Purchase Receipt Item': [is_zero_rated, is_exempt],
-		'Supplier Quotation Item': [is_zero_rated, is_exempt],
-		'Address': [
-			dict(fieldname='address_in_arabic', label='Address in Arabic',
-				fieldtype='Data',insert_after='address_line2')
+		"Purchase Invoice": purchase_invoice_fields,
+		"Purchase Order": purchase_invoice_fields,
+		"Purchase Receipt": purchase_invoice_fields,
+		"Sales Invoice": sales_invoice_fields,
+		"POS Invoice": sales_invoice_fields,
+		"Sales Order": sales_invoice_fields,
+		"Delivery Note": sales_invoice_fields,
+		"Sales Invoice Item": [is_zero_rated, is_exempt],
+		"POS Invoice Item": [is_zero_rated, is_exempt],
+		"Purchase Invoice Item": [is_zero_rated, is_exempt],
+		"Sales Order Item": [is_zero_rated, is_exempt],
+		"Delivery Note Item": [is_zero_rated, is_exempt],
+		"Quotation Item": [is_zero_rated, is_exempt],
+		"Purchase Order Item": [is_zero_rated, is_exempt],
+		"Purchase Receipt Item": [is_zero_rated, is_exempt],
+		"Supplier Quotation Item": [is_zero_rated, is_exempt],
+		"Address": [
+			dict(
+				fieldname="address_in_arabic",
+				label="Address in Arabic",
+				fieldtype="Data",
+				insert_after="address_line2",
+			)
 		],
-		'Company': [
-			dict(fieldname='company_name_in_arabic', label='Company Name In Arabic',
-				fieldtype='Data', insert_after='company_name')
-		]
+		"Company": [
+			dict(
+				fieldname="company_name_in_arabic",
+				label="Company Name In Arabic",
+				fieldtype="Data",
+				insert_after="company_name",
+			)
+		],
 	}
 
 	create_custom_fields(custom_fields, ignore_validate=True, update=True)
 
+
 def update_regional_tax_settings(country, company):
 	create_ksa_vat_setting(company)
diff --git a/erpnext/regional/saudi_arabia/utils.py b/erpnext/regional/saudi_arabia/utils.py
index 515862d..b47adc9 100644
--- a/erpnext/regional/saudi_arabia/utils.py
+++ b/erpnext/regional/saudi_arabia/utils.py
@@ -13,21 +13,25 @@
 
 def create_qr_code(doc, method=None):
 	region = get_region(doc.company)
-	if region not in ['Saudi Arabia']:
+	if region not in ["Saudi Arabia"]:
 		return
 
 	# if QR Code field not present, create it. Invoices without QR are invalid as per law.
-	if not hasattr(doc, 'ksa_einv_qr'):
-		create_custom_fields({
-			doc.doctype: [
-				dict(
-					fieldname='ksa_einv_qr',
-					label='KSA E-Invoicing QR',
-					fieldtype='Attach Image',
-					read_only=1, no_copy=1, hidden=1
-				)
-			]
-		})
+	if not hasattr(doc, "ksa_einv_qr"):
+		create_custom_fields(
+			{
+				doc.doctype: [
+					dict(
+						fieldname="ksa_einv_qr",
+						label="KSA E-Invoicing QR",
+						fieldtype="Attach Image",
+						read_only=1,
+						no_copy=1,
+						hidden=1,
+					)
+				]
+			}
+		)
 
 	# Don't create QR Code if it already exists
 	qr_code = doc.get("ksa_einv_qr")
@@ -37,129 +41,129 @@
 	meta = frappe.get_meta(doc.doctype)
 
 	if "ksa_einv_qr" in [d.fieldname for d in meta.get_image_fields()]:
-		''' TLV conversion for
+		"""TLV conversion for
 		1. Seller's Name
 		2. VAT Number
 		3. Time Stamp
 		4. Invoice Amount
 		5. VAT Amount
-		'''
+		"""
 		tlv_array = []
 		# Sellers Name
 
-		seller_name = frappe.db.get_value(
-			'Company',
-			doc.company,
-			'company_name_in_arabic')
+		seller_name = frappe.db.get_value("Company", doc.company, "company_name_in_arabic")
 
 		if not seller_name:
-			frappe.throw(_('Arabic name missing for {} in the company document').format(doc.company))
+			frappe.throw(_("Arabic name missing for {} in the company document").format(doc.company))
 
 		tag = bytes([1]).hex()
-		length = bytes([len(seller_name.encode('utf-8'))]).hex()
-		value = seller_name.encode('utf-8').hex()
-		tlv_array.append(''.join([tag, length, value]))
+		length = bytes([len(seller_name.encode("utf-8"))]).hex()
+		value = seller_name.encode("utf-8").hex()
+		tlv_array.append("".join([tag, length, value]))
 
 		# VAT Number
-		tax_id = frappe.db.get_value('Company', doc.company, 'tax_id')
+		tax_id = frappe.db.get_value("Company", doc.company, "tax_id")
 		if not tax_id:
-			frappe.throw(_('Tax ID missing for {} in the company document').format(doc.company))
+			frappe.throw(_("Tax ID missing for {} in the company document").format(doc.company))
 
 		tag = bytes([2]).hex()
 		length = bytes([len(tax_id)]).hex()
-		value = tax_id.encode('utf-8').hex()
-		tlv_array.append(''.join([tag, length, value]))
+		value = tax_id.encode("utf-8").hex()
+		tlv_array.append("".join([tag, length, value]))
 
 		# Time Stamp
 		posting_date = getdate(doc.posting_date)
 		time = get_time(doc.posting_time)
 		seconds = time.hour * 60 * 60 + time.minute * 60 + time.second
 		time_stamp = add_to_date(posting_date, seconds=seconds)
-		time_stamp = time_stamp.strftime('%Y-%m-%dT%H:%M:%SZ')
+		time_stamp = time_stamp.strftime("%Y-%m-%dT%H:%M:%SZ")
 
 		tag = bytes([3]).hex()
 		length = bytes([len(time_stamp)]).hex()
-		value = time_stamp.encode('utf-8').hex()
-		tlv_array.append(''.join([tag, length, value]))
+		value = time_stamp.encode("utf-8").hex()
+		tlv_array.append("".join([tag, length, value]))
 
 		# Invoice Amount
 		invoice_amount = str(doc.grand_total)
 		tag = bytes([4]).hex()
 		length = bytes([len(invoice_amount)]).hex()
-		value = invoice_amount.encode('utf-8').hex()
-		tlv_array.append(''.join([tag, length, value]))
+		value = invoice_amount.encode("utf-8").hex()
+		tlv_array.append("".join([tag, length, value]))
 
 		# VAT Amount
 		vat_amount = str(get_vat_amount(doc))
 
 		tag = bytes([5]).hex()
 		length = bytes([len(vat_amount)]).hex()
-		value = vat_amount.encode('utf-8').hex()
-		tlv_array.append(''.join([tag, length, value]))
+		value = vat_amount.encode("utf-8").hex()
+		tlv_array.append("".join([tag, length, value]))
 
 		# Joining bytes into one
-		tlv_buff = ''.join(tlv_array)
+		tlv_buff = "".join(tlv_array)
 
 		# base64 conversion for QR Code
 		base64_string = b64encode(bytes.fromhex(tlv_buff)).decode()
 
 		qr_image = io.BytesIO()
-		url = qr_create(base64_string, error='L')
+		url = qr_create(base64_string, error="L")
 		url.png(qr_image, scale=2, quiet_zone=1)
 
 		name = frappe.generate_hash(doc.name, 5)
 
 		# making file
 		filename = f"QRCode-{name}.png".replace(os.path.sep, "__")
-		_file = frappe.get_doc({
-			"doctype": "File",
-			"file_name": filename,
-			"is_private": 0,
-			"content": qr_image.getvalue(),
-			"attached_to_doctype": doc.get("doctype"),
-			"attached_to_name": doc.get("name"),
-			"attached_to_field": "ksa_einv_qr"
-		})
+		_file = frappe.get_doc(
+			{
+				"doctype": "File",
+				"file_name": filename,
+				"is_private": 0,
+				"content": qr_image.getvalue(),
+				"attached_to_doctype": doc.get("doctype"),
+				"attached_to_name": doc.get("name"),
+				"attached_to_field": "ksa_einv_qr",
+			}
+		)
 
 		_file.save()
 
 		# assigning to document
-		doc.db_set('ksa_einv_qr', _file.file_url)
+		doc.db_set("ksa_einv_qr", _file.file_url)
 		doc.notify_update()
 
+
 def get_vat_amount(doc):
-	vat_settings = frappe.db.get_value('KSA VAT Setting', {'company': doc.company})
+	vat_settings = frappe.db.get_value("KSA VAT Setting", {"company": doc.company})
 	vat_accounts = []
 	vat_amount = 0
 
 	if vat_settings:
-		vat_settings_doc = frappe.get_cached_doc('KSA VAT Setting', vat_settings)
+		vat_settings_doc = frappe.get_cached_doc("KSA VAT Setting", vat_settings)
 
-		for row in vat_settings_doc.get('ksa_vat_sales_accounts'):
+		for row in vat_settings_doc.get("ksa_vat_sales_accounts"):
 			vat_accounts.append(row.account)
 
-	for tax in doc.get('taxes'):
+	for tax in doc.get("taxes"):
 		if tax.account_head in vat_accounts:
 			vat_amount += tax.tax_amount
 
 	return vat_amount
 
+
 def delete_qr_code_file(doc, method=None):
 	region = get_region(doc.company)
-	if region not in ['Saudi Arabia']:
+	if region not in ["Saudi Arabia"]:
 		return
 
-	if hasattr(doc, 'ksa_einv_qr'):
-		if doc.get('ksa_einv_qr'):
-			file_doc = frappe.get_list('File', {
-				'file_url': doc.get('ksa_einv_qr')
-			})
+	if hasattr(doc, "ksa_einv_qr"):
+		if doc.get("ksa_einv_qr"):
+			file_doc = frappe.get_list("File", {"file_url": doc.get("ksa_einv_qr")})
 			if len(file_doc):
-				frappe.delete_doc('File', file_doc[0].name)
+				frappe.delete_doc("File", file_doc[0].name)
+
 
 def delete_vat_settings_for_company(doc, method=None):
-	if doc.country != 'Saudi Arabia':
+	if doc.country != "Saudi Arabia":
 		return
 
-	if frappe.db.exists('KSA VAT Setting', doc.name):
-		frappe.delete_doc('KSA VAT Setting', doc.name)
+	if frappe.db.exists("KSA VAT Setting", doc.name):
+		frappe.delete_doc("KSA VAT Setting", doc.name)
diff --git a/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py b/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py
index 97300dc..66d9df2 100644
--- a/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py
+++ b/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py
@@ -5,39 +5,42 @@
 
 
 def create_ksa_vat_setting(company):
-    """On creation of first company. Creates KSA VAT Setting"""
+	"""On creation of first company. Creates KSA VAT Setting"""
 
-    company = frappe.get_doc('Company', company)
+	company = frappe.get_doc("Company", company)
 
-    file_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'ksa_vat_settings.json')
-    with open(file_path, 'r') as json_file:
-        account_data = json.load(json_file)
+	file_path = os.path.join(os.path.dirname(__file__), "..", "data", "ksa_vat_settings.json")
+	with open(file_path, "r") as json_file:
+		account_data = json.load(json_file)
 
-    # Creating KSA VAT Setting
-    ksa_vat_setting = frappe.get_doc({
-        'doctype': 'KSA VAT Setting',
-        'company': company.name
-    })
+	# Creating KSA VAT Setting
+	ksa_vat_setting = frappe.get_doc({"doctype": "KSA VAT Setting", "company": company.name})
 
-    for data in account_data:
-        if data['type'] == 'Sales Account':
-            for row in data['accounts']:
-                item_tax_template = row['item_tax_template']
-                account = row['account']
-                ksa_vat_setting.append('ksa_vat_sales_accounts', {
-                    'title': row['title'],
-                    'item_tax_template': f'{item_tax_template} - {company.abbr}',
-                    'account': f'{account} - {company.abbr}'
-                })
+	for data in account_data:
+		if data["type"] == "Sales Account":
+			for row in data["accounts"]:
+				item_tax_template = row["item_tax_template"]
+				account = row["account"]
+				ksa_vat_setting.append(
+					"ksa_vat_sales_accounts",
+					{
+						"title": row["title"],
+						"item_tax_template": f"{item_tax_template} - {company.abbr}",
+						"account": f"{account} - {company.abbr}",
+					},
+				)
 
-        elif data['type'] == 'Purchase Account':
-            for row in data['accounts']:
-                item_tax_template = row['item_tax_template']
-                account = row['account']
-                ksa_vat_setting.append('ksa_vat_purchase_accounts', {
-                    'title': row['title'],
-                    'item_tax_template': f'{item_tax_template} - {company.abbr}',
-                    'account': f'{account} - {company.abbr}'
-                })
+		elif data["type"] == "Purchase Account":
+			for row in data["accounts"]:
+				item_tax_template = row["item_tax_template"]
+				account = row["account"]
+				ksa_vat_setting.append(
+					"ksa_vat_purchase_accounts",
+					{
+						"title": row["title"],
+						"item_tax_template": f"{item_tax_template} - {company.abbr}",
+						"account": f"{account} - {company.abbr}",
+					},
+				)
 
-    ksa_vat_setting.save()
+	ksa_vat_setting.save()
diff --git a/erpnext/regional/south_africa/setup.py b/erpnext/regional/south_africa/setup.py
index 6af135b..289f272 100644
--- a/erpnext/regional/south_africa/setup.py
+++ b/erpnext/regional/south_africa/setup.py
@@ -6,44 +6,53 @@
 from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
 from frappe.permissions import add_permission, update_permission_property
 
+
 def setup(company=None, patch=True):
 	make_custom_fields()
 	add_permissions()
 
+
 def make_custom_fields(update=True):
-	is_zero_rated = dict(fieldname='is_zero_rated', label='Is Zero Rated',
-		fieldtype='Check', fetch_from='item_code.is_zero_rated',
-		insert_after='description', print_hide=1)
+	is_zero_rated = dict(
+		fieldname="is_zero_rated",
+		label="Is Zero Rated",
+		fieldtype="Check",
+		fetch_from="item_code.is_zero_rated",
+		insert_after="description",
+		print_hide=1,
+	)
 	custom_fields = {
-		'Item': [
-			dict(fieldname='is_zero_rated', label='Is Zero Rated',
-				fieldtype='Check', insert_after='item_group',
-				print_hide=1)
+		"Item": [
+			dict(
+				fieldname="is_zero_rated",
+				label="Is Zero Rated",
+				fieldtype="Check",
+				insert_after="item_group",
+				print_hide=1,
+			)
 		],
-		'Sales Invoice Item': is_zero_rated,
-		'Purchase Invoice Item': is_zero_rated
+		"Sales Invoice Item": is_zero_rated,
+		"Purchase Invoice Item": is_zero_rated,
 	}
 
 	create_custom_fields(custom_fields, update=update)
 
+
 def add_permissions():
 	"""Add Permissions for South Africa VAT Settings and South Africa VAT Account
-		and VAT Audit Report"""
-	for doctype in ('South Africa VAT Settings', 'South Africa VAT Account'):
-		add_permission(doctype, 'All', 0)
-		for role in ('Accounts Manager', 'Accounts User', 'System Manager'):
+	and VAT Audit Report"""
+	for doctype in ("South Africa VAT Settings", "South Africa VAT Account"):
+		add_permission(doctype, "All", 0)
+		for role in ("Accounts Manager", "Accounts User", "System Manager"):
 			add_permission(doctype, role, 0)
-			update_permission_property(doctype, role, 0, 'write', 1)
-			update_permission_property(doctype, role, 0, 'create', 1)
+			update_permission_property(doctype, role, 0, "write", 1)
+			update_permission_property(doctype, role, 0, "create", 1)
 
-
-	if not frappe.db.get_value('Custom Role', dict(report="VAT Audit Report")):
-		frappe.get_doc(dict(
-			doctype='Custom Role',
-			report="VAT Audit Report",
-			roles= [
-				dict(role='Accounts User'),
-				dict(role='Accounts Manager'),
-				dict(role='Auditor')
-			]
-		)).insert()
+	if not frappe.db.get_value("Custom Role", dict(report="VAT Audit Report")):
+		frappe.get_doc(
+			dict(
+				doctype="Custom Role",
+				report="VAT Audit Report",
+				roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
+			)
+		).insert()
diff --git a/erpnext/regional/turkey/setup.py b/erpnext/regional/turkey/setup.py
index 1d3770a..c915189 100644
--- a/erpnext/regional/turkey/setup.py
+++ b/erpnext/regional/turkey/setup.py
@@ -1,2 +1,2 @@
 def setup(company=None, patch=True):
-    pass
+	pass
diff --git a/erpnext/regional/united_arab_emirates/setup.py b/erpnext/regional/united_arab_emirates/setup.py
index 922443b..cc647f8 100644
--- a/erpnext/regional/united_arab_emirates/setup.py
+++ b/erpnext/regional/united_arab_emirates/setup.py
@@ -7,6 +7,7 @@
 from frappe.permissions import add_permission, update_permission_property
 from erpnext.payroll.doctype.gratuity_rule.gratuity_rule import get_gratuity_rule
 
+
 def setup(company=None, patch=True):
 	make_custom_fields()
 	add_print_formats()
@@ -14,145 +15,270 @@
 	add_permissions()
 	create_gratuity_rule()
 
+
 def make_custom_fields():
-	is_zero_rated = dict(fieldname='is_zero_rated', label='Is Zero Rated',
-		fieldtype='Check', fetch_from='item_code.is_zero_rated', insert_after='description',
-		print_hide=1)
-	is_exempt = dict(fieldname='is_exempt', label='Is Exempt',
-		fieldtype='Check', fetch_from='item_code.is_exempt', insert_after='is_zero_rated',
-		print_hide=1)
+	is_zero_rated = dict(
+		fieldname="is_zero_rated",
+		label="Is Zero Rated",
+		fieldtype="Check",
+		fetch_from="item_code.is_zero_rated",
+		insert_after="description",
+		print_hide=1,
+	)
+	is_exempt = dict(
+		fieldname="is_exempt",
+		label="Is Exempt",
+		fieldtype="Check",
+		fetch_from="item_code.is_exempt",
+		insert_after="is_zero_rated",
+		print_hide=1,
+	)
 
 	invoice_fields = [
-		dict(fieldname='vat_section', label='VAT Details', fieldtype='Section Break',
-			insert_after='group_same_items', print_hide=1, collapsible=1),
-		dict(fieldname='permit_no', label='Permit Number',
-			fieldtype='Data', insert_after='vat_section', print_hide=1),
+		dict(
+			fieldname="vat_section",
+			label="VAT Details",
+			fieldtype="Section Break",
+			insert_after="group_same_items",
+			print_hide=1,
+			collapsible=1,
+		),
+		dict(
+			fieldname="permit_no",
+			label="Permit Number",
+			fieldtype="Data",
+			insert_after="vat_section",
+			print_hide=1,
+		),
 	]
 
 	purchase_invoice_fields = [
-			dict(fieldname='company_trn', label='Company TRN',
-				fieldtype='Read Only', insert_after='shipping_address',
-				fetch_from='company.tax_id', print_hide=1),
-			dict(fieldname='supplier_name_in_arabic', label='Supplier Name in Arabic',
-				fieldtype='Read Only', insert_after='supplier_name',
-				fetch_from='supplier.supplier_name_in_arabic', print_hide=1),
-			dict(fieldname='recoverable_standard_rated_expenses', print_hide=1, default='0',
-				label='Recoverable Standard Rated Expenses (AED)', insert_after='permit_no',
-				fieldtype='Currency', ),
-			dict(fieldname='reverse_charge', label='Reverse Charge Applicable',
-				fieldtype='Select', insert_after='recoverable_standard_rated_expenses', print_hide=1,
-				options='Y\nN', default='N'),
-			dict(fieldname='recoverable_reverse_charge', label='Recoverable Reverse Charge (Percentage)',
-				insert_after='reverse_charge', fieldtype='Percent', print_hide=1,
-				depends_on="eval:doc.reverse_charge=='Y'", default='100.000'),
-		]
+		dict(
+			fieldname="company_trn",
+			label="Company TRN",
+			fieldtype="Read Only",
+			insert_after="shipping_address",
+			fetch_from="company.tax_id",
+			print_hide=1,
+		),
+		dict(
+			fieldname="supplier_name_in_arabic",
+			label="Supplier Name in Arabic",
+			fieldtype="Read Only",
+			insert_after="supplier_name",
+			fetch_from="supplier.supplier_name_in_arabic",
+			print_hide=1,
+		),
+		dict(
+			fieldname="recoverable_standard_rated_expenses",
+			print_hide=1,
+			default="0",
+			label="Recoverable Standard Rated Expenses (AED)",
+			insert_after="permit_no",
+			fieldtype="Currency",
+		),
+		dict(
+			fieldname="reverse_charge",
+			label="Reverse Charge Applicable",
+			fieldtype="Select",
+			insert_after="recoverable_standard_rated_expenses",
+			print_hide=1,
+			options="Y\nN",
+			default="N",
+		),
+		dict(
+			fieldname="recoverable_reverse_charge",
+			label="Recoverable Reverse Charge (Percentage)",
+			insert_after="reverse_charge",
+			fieldtype="Percent",
+			print_hide=1,
+			depends_on="eval:doc.reverse_charge=='Y'",
+			default="100.000",
+		),
+	]
 
 	sales_invoice_fields = [
-			dict(fieldname='company_trn', label='Company TRN',
-				fieldtype='Read Only', insert_after='company_address',
-				fetch_from='company.tax_id', print_hide=1),
-			dict(fieldname='customer_name_in_arabic', label='Customer Name in Arabic',
-				fieldtype='Read Only', insert_after='customer_name',
-				fetch_from='customer.customer_name_in_arabic', print_hide=1),
-			dict(fieldname='vat_emirate', label='VAT Emirate', insert_after='permit_no', fieldtype='Select',
-				options='\nAbu Dhabi\nAjman\nDubai\nFujairah\nRas Al Khaimah\nSharjah\nUmm Al Quwain',
-				fetch_from='company_address.emirate'),
-			dict(fieldname='tourist_tax_return', label='Tax Refund provided to Tourists (AED)',
-				insert_after='vat_emirate', fieldtype='Currency', print_hide=1, default='0'),
-		]
+		dict(
+			fieldname="company_trn",
+			label="Company TRN",
+			fieldtype="Read Only",
+			insert_after="company_address",
+			fetch_from="company.tax_id",
+			print_hide=1,
+		),
+		dict(
+			fieldname="customer_name_in_arabic",
+			label="Customer Name in Arabic",
+			fieldtype="Read Only",
+			insert_after="customer_name",
+			fetch_from="customer.customer_name_in_arabic",
+			print_hide=1,
+		),
+		dict(
+			fieldname="vat_emirate",
+			label="VAT Emirate",
+			insert_after="permit_no",
+			fieldtype="Select",
+			options="\nAbu Dhabi\nAjman\nDubai\nFujairah\nRas Al Khaimah\nSharjah\nUmm Al Quwain",
+			fetch_from="company_address.emirate",
+		),
+		dict(
+			fieldname="tourist_tax_return",
+			label="Tax Refund provided to Tourists (AED)",
+			insert_after="vat_emirate",
+			fieldtype="Currency",
+			print_hide=1,
+			default="0",
+		),
+	]
 
 	invoice_item_fields = [
-		dict(fieldname='tax_code', label='Tax Code',
-			fieldtype='Read Only', fetch_from='item_code.tax_code', insert_after='description',
-			allow_on_submit=1, print_hide=1),
-		dict(fieldname='tax_rate', label='Tax Rate',
-			fieldtype='Float', insert_after='tax_code',
-			print_hide=1, hidden=1, read_only=1),
-		dict(fieldname='tax_amount', label='Tax Amount',
-			fieldtype='Currency', insert_after='tax_rate',
-			print_hide=1, hidden=1, read_only=1, options="currency"),
-		dict(fieldname='total_amount', label='Total Amount',
-			fieldtype='Currency', insert_after='tax_amount',
-			print_hide=1, hidden=1, read_only=1, options="currency"),
+		dict(
+			fieldname="tax_code",
+			label="Tax Code",
+			fieldtype="Read Only",
+			fetch_from="item_code.tax_code",
+			insert_after="description",
+			allow_on_submit=1,
+			print_hide=1,
+		),
+		dict(
+			fieldname="tax_rate",
+			label="Tax Rate",
+			fieldtype="Float",
+			insert_after="tax_code",
+			print_hide=1,
+			hidden=1,
+			read_only=1,
+		),
+		dict(
+			fieldname="tax_amount",
+			label="Tax Amount",
+			fieldtype="Currency",
+			insert_after="tax_rate",
+			print_hide=1,
+			hidden=1,
+			read_only=1,
+			options="currency",
+		),
+		dict(
+			fieldname="total_amount",
+			label="Total Amount",
+			fieldtype="Currency",
+			insert_after="tax_amount",
+			print_hide=1,
+			hidden=1,
+			read_only=1,
+			options="currency",
+		),
 	]
 
 	delivery_date_field = [
-		dict(fieldname='delivery_date', label='Delivery Date',
-			fieldtype='Date', insert_after='item_name', print_hide=1)
+		dict(
+			fieldname="delivery_date",
+			label="Delivery Date",
+			fieldtype="Date",
+			insert_after="item_name",
+			print_hide=1,
+		)
 	]
 
 	custom_fields = {
-		'Item': [
-			dict(fieldname='tax_code', label='Tax Code',
-				fieldtype='Data', insert_after='item_group'),
-			dict(fieldname='is_zero_rated', label='Is Zero Rated',
-				fieldtype='Check', insert_after='tax_code',
-				print_hide=1),
-			dict(fieldname='is_exempt', label='Is Exempt',
-				fieldtype='Check', insert_after='is_zero_rated',
-				print_hide=1)
+		"Item": [
+			dict(fieldname="tax_code", label="Tax Code", fieldtype="Data", insert_after="item_group"),
+			dict(
+				fieldname="is_zero_rated",
+				label="Is Zero Rated",
+				fieldtype="Check",
+				insert_after="tax_code",
+				print_hide=1,
+			),
+			dict(
+				fieldname="is_exempt",
+				label="Is Exempt",
+				fieldtype="Check",
+				insert_after="is_zero_rated",
+				print_hide=1,
+			),
 		],
-		'Customer': [
-			dict(fieldname='customer_name_in_arabic', label='Customer Name in Arabic',
-				fieldtype='Data', insert_after='customer_name'),
+		"Customer": [
+			dict(
+				fieldname="customer_name_in_arabic",
+				label="Customer Name in Arabic",
+				fieldtype="Data",
+				insert_after="customer_name",
+			),
 		],
-		'Supplier': [
-			dict(fieldname='supplier_name_in_arabic', label='Supplier Name in Arabic',
-				fieldtype='Data', insert_after='supplier_name'),
+		"Supplier": [
+			dict(
+				fieldname="supplier_name_in_arabic",
+				label="Supplier Name in Arabic",
+				fieldtype="Data",
+				insert_after="supplier_name",
+			),
 		],
-		'Address': [
-			dict(fieldname='emirate', label='Emirate', fieldtype='Select', insert_after='state',
-			options='\nAbu Dhabi\nAjman\nDubai\nFujairah\nRas Al Khaimah\nSharjah\nUmm Al Quwain')
+		"Address": [
+			dict(
+				fieldname="emirate",
+				label="Emirate",
+				fieldtype="Select",
+				insert_after="state",
+				options="\nAbu Dhabi\nAjman\nDubai\nFujairah\nRas Al Khaimah\nSharjah\nUmm Al Quwain",
+			)
 		],
-		'Purchase Invoice': purchase_invoice_fields + invoice_fields,
-		'Purchase Order': purchase_invoice_fields + invoice_fields,
-		'Purchase Receipt': purchase_invoice_fields + invoice_fields,
-		'Sales Invoice': sales_invoice_fields + invoice_fields,
-		'POS Invoice': sales_invoice_fields + invoice_fields,
-		'Sales Order': sales_invoice_fields + invoice_fields,
-		'Delivery Note': sales_invoice_fields + invoice_fields,
-		'Sales Invoice Item': invoice_item_fields + delivery_date_field + [is_zero_rated, is_exempt],
-		'POS Invoice Item': invoice_item_fields + delivery_date_field + [is_zero_rated, is_exempt],
-		'Purchase Invoice Item': invoice_item_fields,
-		'Sales Order Item': invoice_item_fields,
-		'Delivery Note Item': invoice_item_fields,
-		'Quotation Item': invoice_item_fields,
-		'Purchase Order Item': invoice_item_fields,
-		'Purchase Receipt Item': invoice_item_fields,
-		'Supplier Quotation Item': invoice_item_fields,
+		"Purchase Invoice": purchase_invoice_fields + invoice_fields,
+		"Purchase Order": purchase_invoice_fields + invoice_fields,
+		"Purchase Receipt": purchase_invoice_fields + invoice_fields,
+		"Sales Invoice": sales_invoice_fields + invoice_fields,
+		"POS Invoice": sales_invoice_fields + invoice_fields,
+		"Sales Order": sales_invoice_fields + invoice_fields,
+		"Delivery Note": sales_invoice_fields + invoice_fields,
+		"Sales Invoice Item": invoice_item_fields + delivery_date_field + [is_zero_rated, is_exempt],
+		"POS Invoice Item": invoice_item_fields + delivery_date_field + [is_zero_rated, is_exempt],
+		"Purchase Invoice Item": invoice_item_fields,
+		"Sales Order Item": invoice_item_fields,
+		"Delivery Note Item": invoice_item_fields,
+		"Quotation Item": invoice_item_fields,
+		"Purchase Order Item": invoice_item_fields,
+		"Purchase Receipt Item": invoice_item_fields,
+		"Supplier Quotation Item": invoice_item_fields,
 	}
 
 	create_custom_fields(custom_fields)
 
+
 def add_print_formats():
 	frappe.reload_doc("regional", "print_format", "detailed_tax_invoice")
 	frappe.reload_doc("regional", "print_format", "simplified_tax_invoice")
 	frappe.reload_doc("regional", "print_format", "tax_invoice")
 
-	frappe.db.sql(""" update `tabPrint Format` set disabled = 0 where
-		name in('Simplified Tax Invoice', 'Detailed Tax Invoice', 'Tax Invoice') """)
+	frappe.db.sql(
+		""" update `tabPrint Format` set disabled = 0 where
+		name in('Simplified Tax Invoice', 'Detailed Tax Invoice', 'Tax Invoice') """
+	)
+
 
 def add_custom_roles_for_reports():
 	"""Add Access Control to UAE VAT 201."""
-	if not frappe.db.get_value('Custom Role', dict(report='UAE VAT 201')):
-		frappe.get_doc(dict(
-			doctype='Custom Role',
-			report='UAE VAT 201',
-			roles= [
-				dict(role='Accounts User'),
-				dict(role='Accounts Manager'),
-				dict(role='Auditor')
-			]
-		)).insert()
+	if not frappe.db.get_value("Custom Role", dict(report="UAE VAT 201")):
+		frappe.get_doc(
+			dict(
+				doctype="Custom Role",
+				report="UAE VAT 201",
+				roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
+			)
+		).insert()
+
 
 def add_permissions():
 	"""Add Permissions for UAE VAT Settings and UAE VAT Account."""
-	for doctype in ('UAE VAT Settings', 'UAE VAT Account'):
-		add_permission(doctype, 'All', 0)
-		for role in ('Accounts Manager', 'Accounts User', 'System Manager'):
+	for doctype in ("UAE VAT Settings", "UAE VAT Account"):
+		add_permission(doctype, "All", 0)
+		for role in ("Accounts Manager", "Accounts User", "System Manager"):
 			add_permission(doctype, role, 0)
-			update_permission_property(doctype, role, 0, 'write', 1)
-			update_permission_property(doctype, role, 0, 'create', 1)
+			update_permission_property(doctype, role, 0, "write", 1)
+			update_permission_property(doctype, role, 0, "create", 1)
+
 
 def create_gratuity_rule():
 	rule_1 = rule_2 = rule_3 = None
@@ -160,7 +286,11 @@
 	# Rule Under Limited Contract
 	slabs = get_slab_for_limited_contract()
 	if not frappe.db.exists("Gratuity Rule", "Rule Under Limited Contract (UAE)"):
-		rule_1 = get_gratuity_rule("Rule Under Limited Contract (UAE)", slabs, calculate_gratuity_amount_based_on="Sum of all previous slabs")
+		rule_1 = get_gratuity_rule(
+			"Rule Under Limited Contract (UAE)",
+			slabs,
+			calculate_gratuity_amount_based_on="Sum of all previous slabs",
+		)
 
 	# Rule Under Unlimited Contract on termination
 	slabs = get_slab_for_unlimited_contract_on_termination()
@@ -172,7 +302,7 @@
 	if not frappe.db.exists("Gratuity Rule", "Rule Under Unlimited Contract on resignation (UAE)"):
 		rule_3 = get_gratuity_rule("Rule Under Unlimited Contract on resignation (UAE)", slabs)
 
-	#for applicable salary component user need to set this by its own
+	# for applicable salary component user need to set this by its own
 	if rule_1:
 		rule_1.flags.ignore_mandatory = True
 		rule_1.save()
@@ -185,61 +315,29 @@
 
 
 def get_slab_for_limited_contract():
-	return [{
-		"from_year": 0,
-		"to_year":1,
-		"fraction_of_applicable_earnings": 0
-	},
-	{
-		"from_year": 1,
-		"to_year":5,
-		"fraction_of_applicable_earnings": 21/30
-	},
-	{
-		"from_year": 5,
-		"to_year":0,
-		"fraction_of_applicable_earnings": 1
-	}]
+	return [
+		{"from_year": 0, "to_year": 1, "fraction_of_applicable_earnings": 0},
+		{"from_year": 1, "to_year": 5, "fraction_of_applicable_earnings": 21 / 30},
+		{"from_year": 5, "to_year": 0, "fraction_of_applicable_earnings": 1},
+	]
+
 
 def get_slab_for_unlimited_contract_on_termination():
-	return [{
-		"from_year": 0,
-		"to_year":1,
-		"fraction_of_applicable_earnings": 0
-	},
-	{
-		"from_year": 1,
-		"to_year":5,
-		"fraction_of_applicable_earnings": 21/30
-	},
-	{
-		"from_year": 5,
-		"to_year":0,
-		"fraction_of_applicable_earnings": 1
-	}]
+	return [
+		{"from_year": 0, "to_year": 1, "fraction_of_applicable_earnings": 0},
+		{"from_year": 1, "to_year": 5, "fraction_of_applicable_earnings": 21 / 30},
+		{"from_year": 5, "to_year": 0, "fraction_of_applicable_earnings": 1},
+	]
+
 
 def get_slab_for_unlimited_contract_on_resignation():
-	fraction_1 = 1/3 * 21/30
-	fraction_2 = 2/3 * 21/30
-	fraction_3 = 21/30
+	fraction_1 = 1 / 3 * 21 / 30
+	fraction_2 = 2 / 3 * 21 / 30
+	fraction_3 = 21 / 30
 
-	return [{
-		"from_year": 0,
-		"to_year":1,
-		"fraction_of_applicable_earnings": 0
-	},
-	{
-		"from_year": 1,
-		"to_year":3,
-		"fraction_of_applicable_earnings": fraction_1
-	},
-	{
-		"from_year": 3,
-		"to_year":5,
-		"fraction_of_applicable_earnings": fraction_2
-	},
-	{
-		"from_year": 5,
-		"to_year":0,
-		"fraction_of_applicable_earnings": fraction_3
-	}]
+	return [
+		{"from_year": 0, "to_year": 1, "fraction_of_applicable_earnings": 0},
+		{"from_year": 1, "to_year": 3, "fraction_of_applicable_earnings": fraction_1},
+		{"from_year": 3, "to_year": 5, "fraction_of_applicable_earnings": fraction_2},
+		{"from_year": 5, "to_year": 0, "fraction_of_applicable_earnings": fraction_3},
+	]
diff --git a/erpnext/regional/united_arab_emirates/utils.py b/erpnext/regional/united_arab_emirates/utils.py
index bdede84..a910af6 100644
--- a/erpnext/regional/united_arab_emirates/utils.py
+++ b/erpnext/regional/united_arab_emirates/utils.py
@@ -7,7 +7,8 @@
 
 
 def update_itemised_tax_data(doc):
-	if not doc.taxes: return
+	if not doc.taxes:
+		return
 
 	itemised_tax = get_itemised_tax(doc.taxes)
 
@@ -24,40 +25,39 @@
 			for account, rate in item_tax_rate.items():
 				tax_rate += rate
 		elif row.item_code and itemised_tax.get(row.item_code):
-			tax_rate = sum([tax.get('tax_rate', 0) for d, tax in itemised_tax.get(row.item_code).items()])
+			tax_rate = sum([tax.get("tax_rate", 0) for d, tax in itemised_tax.get(row.item_code).items()])
 
 		meta = frappe.get_meta(row.doctype)
 
-		if meta.has_field('tax_rate'):
+		if meta.has_field("tax_rate"):
 			row.tax_rate = flt(tax_rate, row.precision("tax_rate"))
 			row.tax_amount = flt((row.net_amount * tax_rate) / 100, row.precision("net_amount"))
 			row.total_amount = flt((row.net_amount + row.tax_amount), row.precision("total_amount"))
 
+
 def get_account_currency(account):
 	"""Helper function to get account currency."""
 	if not account:
 		return
+
 	def generator():
 		account_currency, company = frappe.get_cached_value(
-			"Account",
-			account,
-			["account_currency",
-			"company"]
+			"Account", account, ["account_currency", "company"]
 		)
 		if not account_currency:
-			account_currency = frappe.get_cached_value('Company',  company,  "default_currency")
+			account_currency = frappe.get_cached_value("Company", company, "default_currency")
 
 		return account_currency
 
 	return frappe.local_cache("account_currency", account, generator)
 
+
 def get_tax_accounts(company):
 	"""Get the list of tax accounts for a specific company."""
 	tax_accounts_dict = frappe._dict()
-	tax_accounts_list = frappe.get_all("UAE VAT Account",
-		filters={"parent": company},
-		fields=["Account"]
-		)
+	tax_accounts_list = frappe.get_all(
+		"UAE VAT Account", filters={"parent": company}, fields=["Account"]
+	)
 
 	if not tax_accounts_list and not frappe.flags.in_test:
 		frappe.throw(_('Please set Vat Accounts for Company: "{0}" in UAE VAT Settings').format(company))
@@ -67,23 +67,24 @@
 
 	return tax_accounts_dict
 
+
 def update_grand_total_for_rcm(doc, method):
 	"""If the Reverse Charge is Applicable subtract the tax amount from the grand total and update in the form."""
-	country = frappe.get_cached_value('Company', doc.company, 'country')
+	country = frappe.get_cached_value("Company", doc.company, "country")
 
-	if country != 'United Arab Emirates':
+	if country != "United Arab Emirates":
 		return
 
 	if not doc.total_taxes_and_charges:
 		return
 
-	if doc.reverse_charge == 'Y':
+	if doc.reverse_charge == "Y":
 		tax_accounts = get_tax_accounts(doc.company)
 
 		base_vat_tax = 0
 		vat_tax = 0
 
-		for tax in doc.get('taxes'):
+		for tax in doc.get("taxes"):
 			if tax.category not in ("Total", "Valuation and Total"):
 				continue
 
@@ -98,6 +99,7 @@
 
 		update_totals(vat_tax, base_vat_tax, doc)
 
+
 def update_totals(vat_tax, base_vat_tax, doc):
 	"""Update the grand total values in the form."""
 	doc.base_grand_total -= base_vat_tax
@@ -109,56 +111,67 @@
 			doc.outstanding_amount = doc.grand_total
 
 		else:
-			doc.rounded_total = round_based_on_smallest_currency_fraction(doc.grand_total,
-				doc.currency, doc.precision("rounded_total"))
-			doc.rounding_adjustment = flt(doc.rounded_total - doc.grand_total,
-				doc.precision("rounding_adjustment"))
+			doc.rounded_total = round_based_on_smallest_currency_fraction(
+				doc.grand_total, doc.currency, doc.precision("rounded_total")
+			)
+			doc.rounding_adjustment = flt(
+				doc.rounded_total - doc.grand_total, doc.precision("rounding_adjustment")
+			)
 			doc.outstanding_amount = doc.rounded_total or doc.grand_total
 
 	doc.in_words = money_in_words(doc.grand_total, doc.currency)
-	doc.base_in_words = money_in_words(doc.base_grand_total, erpnext.get_company_currency(doc.company))
+	doc.base_in_words = money_in_words(
+		doc.base_grand_total, erpnext.get_company_currency(doc.company)
+	)
 	doc.set_payment_schedule()
 
+
 def make_regional_gl_entries(gl_entries, doc):
 	"""Hooked to make_regional_gl_entries in Purchase Invoice.It appends the region specific general ledger entries to the list of GL Entries."""
-	country = frappe.get_cached_value('Company', doc.company, 'country')
+	country = frappe.get_cached_value("Company", doc.company, "country")
 
-	if country != 'United Arab Emirates':
+	if country != "United Arab Emirates":
 		return gl_entries
 
-	if doc.reverse_charge == 'Y':
+	if doc.reverse_charge == "Y":
 		tax_accounts = get_tax_accounts(doc.company)
-		for tax in doc.get('taxes'):
+		for tax in doc.get("taxes"):
 			if tax.category not in ("Total", "Valuation and Total"):
 				continue
 			gl_entries = make_gl_entry(tax, gl_entries, doc, tax_accounts)
 	return gl_entries
 
+
 def make_gl_entry(tax, gl_entries, doc, tax_accounts):
 	dr_or_cr = "credit" if tax.add_deduct_tax == "Add" else "debit"
-	if flt(tax.base_tax_amount_after_discount_amount)  and tax.account_head in tax_accounts:
+	if flt(tax.base_tax_amount_after_discount_amount) and tax.account_head in tax_accounts:
 		account_currency = get_account_currency(tax.account_head)
 
-		gl_entries.append(doc.get_gl_dict({
-				"account": tax.account_head,
-				"cost_center": tax.cost_center,
-				"posting_date": doc.posting_date,
-				"against": doc.supplier,
-				dr_or_cr: tax.base_tax_amount_after_discount_amount,
-				dr_or_cr + "_in_account_currency": tax.base_tax_amount_after_discount_amount \
-					if account_currency==doc.company_currency \
-					else tax.tax_amount_after_discount_amount
-			}, account_currency, item=tax
-		))
+		gl_entries.append(
+			doc.get_gl_dict(
+				{
+					"account": tax.account_head,
+					"cost_center": tax.cost_center,
+					"posting_date": doc.posting_date,
+					"against": doc.supplier,
+					dr_or_cr: tax.base_tax_amount_after_discount_amount,
+					dr_or_cr + "_in_account_currency": tax.base_tax_amount_after_discount_amount
+					if account_currency == doc.company_currency
+					else tax.tax_amount_after_discount_amount,
+				},
+				account_currency,
+				item=tax,
+			)
+		)
 	return gl_entries
 
 
 def validate_returns(doc, method):
 	"""Standard Rated expenses should not be set when Reverse Charge Applicable is set."""
-	country = frappe.get_cached_value('Company', doc.company, 'country')
-	if country != 'United Arab Emirates':
+	country = frappe.get_cached_value("Company", doc.company, "country")
+	if country != "United Arab Emirates":
 		return
-	if doc.reverse_charge == 'Y' and  flt(doc.recoverable_standard_rated_expenses) != 0:
-		frappe.throw(_(
-			"Recoverable Standard Rated expenses should not be set when Reverse Charge Applicable is Y"
-		))
+	if doc.reverse_charge == "Y" and flt(doc.recoverable_standard_rated_expenses) != 0:
+		frappe.throw(
+			_("Recoverable Standard Rated expenses should not be set when Reverse Charge Applicable is Y")
+		)
diff --git a/erpnext/regional/united_states/setup.py b/erpnext/regional/united_states/setup.py
index db6a9c3..b8f8572 100644
--- a/erpnext/regional/united_states/setup.py
+++ b/erpnext/regional/united_states/setup.py
@@ -7,40 +7,64 @@
 from frappe.permissions import add_permission, update_permission_property
 from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
 
+
 def setup(company=None, patch=True):
 	# Company independent fixtures should be called only once at the first company setup
-	if frappe.db.count('Company', {'country': 'United States'}) <=1:
+	if frappe.db.count("Company", {"country": "United States"}) <= 1:
 		setup_company_independent_fixtures(patch=patch)
 
+
 def setup_company_independent_fixtures(company=None, patch=True):
 	make_custom_fields()
 	add_print_formats()
 
+
 def make_custom_fields(update=True):
 	custom_fields = {
-		'Supplier': [
-			dict(fieldname='irs_1099', fieldtype='Check', insert_after='tax_id',
-				label='Is IRS 1099 reporting required for supplier?')
+		"Supplier": [
+			dict(
+				fieldname="irs_1099",
+				fieldtype="Check",
+				insert_after="tax_id",
+				label="Is IRS 1099 reporting required for supplier?",
+			)
 		],
-		'Sales Order': [
-			dict(fieldname='exempt_from_sales_tax', fieldtype='Check', insert_after='taxes_and_charges',
-				label='Is customer exempted from sales tax?')
+		"Sales Order": [
+			dict(
+				fieldname="exempt_from_sales_tax",
+				fieldtype="Check",
+				insert_after="taxes_and_charges",
+				label="Is customer exempted from sales tax?",
+			)
 		],
-		'Sales Invoice': [
-			dict(fieldname='exempt_from_sales_tax', fieldtype='Check', insert_after='taxes_section',
-				label='Is customer exempted from sales tax?')
+		"Sales Invoice": [
+			dict(
+				fieldname="exempt_from_sales_tax",
+				fieldtype="Check",
+				insert_after="taxes_section",
+				label="Is customer exempted from sales tax?",
+			)
 		],
-		'Customer': [
-			dict(fieldname='exempt_from_sales_tax', fieldtype='Check', insert_after='represents_company',
-				label='Is customer exempted from sales tax?')
+		"Customer": [
+			dict(
+				fieldname="exempt_from_sales_tax",
+				fieldtype="Check",
+				insert_after="represents_company",
+				label="Is customer exempted from sales tax?",
+			)
 		],
-		'Quotation': [
-			dict(fieldname='exempt_from_sales_tax', fieldtype='Check', insert_after='taxes_and_charges',
-				label='Is customer exempted from sales tax?')
-		]
+		"Quotation": [
+			dict(
+				fieldname="exempt_from_sales_tax",
+				fieldtype="Check",
+				insert_after="taxes_and_charges",
+				label="Is customer exempted from sales tax?",
+			)
+		],
 	}
 	create_custom_fields(custom_fields, update=update)
 
+
 def add_print_formats():
 	frappe.reload_doc("regional", "print_format", "irs_1099_form")
 	frappe.db.set_value("Print Format", "IRS 1099 Form", "disabled", 0)
diff --git a/erpnext/regional/united_states/test_united_states.py b/erpnext/regional/united_states/test_united_states.py
index 652b483..83ba6ed 100644
--- a/erpnext/regional/united_states/test_united_states.py
+++ b/erpnext/regional/united_states/test_united_states.py
@@ -9,49 +9,51 @@
 
 
 class TestUnitedStates(unittest.TestCase):
-    def test_irs_1099_custom_field(self):
+	def test_irs_1099_custom_field(self):
 
-        if not frappe.db.exists("Supplier", "_US 1099 Test Supplier"):
-            doc = frappe.new_doc("Supplier")
-            doc.supplier_name = "_US 1099 Test Supplier"
-            doc.supplier_group = "Services"
-            doc.supplier_type = "Company"
-            doc.country = "United States"
-            doc.tax_id = "04-1234567"
-            doc.irs_1099 = 1
-            doc.save()
-            frappe.db.commit()
-            supplier = frappe.get_doc('Supplier', "_US 1099 Test Supplier")
-            self.assertEqual(supplier.irs_1099, 1)
+		if not frappe.db.exists("Supplier", "_US 1099 Test Supplier"):
+			doc = frappe.new_doc("Supplier")
+			doc.supplier_name = "_US 1099 Test Supplier"
+			doc.supplier_group = "Services"
+			doc.supplier_type = "Company"
+			doc.country = "United States"
+			doc.tax_id = "04-1234567"
+			doc.irs_1099 = 1
+			doc.save()
+			frappe.db.commit()
+			supplier = frappe.get_doc("Supplier", "_US 1099 Test Supplier")
+			self.assertEqual(supplier.irs_1099, 1)
 
-    def test_irs_1099_report(self):
-        make_payment_entry_to_irs_1099_supplier()
-        filters = frappe._dict({"fiscal_year": "_Test Fiscal Year 2016", "company": "_Test Company 1"})
-        columns, data = execute_1099_report(filters)
-        expected_row = {'supplier': '_US 1099 Test Supplier',
-                        'supplier_group': 'Services',
-                        'payments': 100.0,
-                        'tax_id': '04-1234567'}
-        self.assertEqual(data[0], expected_row)
+	def test_irs_1099_report(self):
+		make_payment_entry_to_irs_1099_supplier()
+		filters = frappe._dict({"fiscal_year": "_Test Fiscal Year 2016", "company": "_Test Company 1"})
+		columns, data = execute_1099_report(filters)
+		expected_row = {
+			"supplier": "_US 1099 Test Supplier",
+			"supplier_group": "Services",
+			"payments": 100.0,
+			"tax_id": "04-1234567",
+		}
+		self.assertEqual(data[0], expected_row)
 
 
 def make_payment_entry_to_irs_1099_supplier():
 
-    frappe.db.sql("delete from `tabGL Entry` where party='_US 1099 Test Supplier'")
-    frappe.db.sql("delete from `tabGL Entry` where against='_US 1099 Test Supplier'")
-    frappe.db.sql("delete from `tabPayment Entry` where party='_US 1099 Test Supplier'")
+	frappe.db.sql("delete from `tabGL Entry` where party='_US 1099 Test Supplier'")
+	frappe.db.sql("delete from `tabGL Entry` where against='_US 1099 Test Supplier'")
+	frappe.db.sql("delete from `tabPayment Entry` where party='_US 1099 Test Supplier'")
 
-    pe = frappe.new_doc("Payment Entry")
-    pe.payment_type = "Pay"
-    pe.company = "_Test Company 1"
-    pe.posting_date = "2016-01-10"
-    pe.paid_from = "_Test Bank USD - _TC1"
-    pe.paid_to = "_Test Payable USD - _TC1"
-    pe.paid_amount = 100
-    pe.received_amount = 100
-    pe.reference_no = "For IRS 1099 testing"
-    pe.reference_date = "2016-01-10"
-    pe.party_type = "Supplier"
-    pe.party = "_US 1099 Test Supplier"
-    pe.insert()
-    pe.submit()
+	pe = frappe.new_doc("Payment Entry")
+	pe.payment_type = "Pay"
+	pe.company = "_Test Company 1"
+	pe.posting_date = "2016-01-10"
+	pe.paid_from = "_Test Bank USD - _TC1"
+	pe.paid_to = "_Test Payable USD - _TC1"
+	pe.paid_amount = 100
+	pe.received_amount = 100
+	pe.reference_no = "For IRS 1099 testing"
+	pe.reference_date = "2016-01-10"
+	pe.party_type = "Supplier"
+	pe.party = "_US 1099 Test Supplier"
+	pe.insert()
+	pe.submit()
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index 634c481..2e5cbb8 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -37,13 +37,13 @@
 
 	def load_dashboard_info(self):
 		info = get_dashboard_info(self.doctype, self.name, self.loyalty_program)
-		self.set_onload('dashboard_info', info)
+		self.set_onload("dashboard_info", info)
 
 	def autoname(self):
-		cust_master_name = frappe.defaults.get_global_default('cust_master_name')
-		if cust_master_name == 'Customer Name':
+		cust_master_name = frappe.defaults.get_global_default("cust_master_name")
+		if cust_master_name == "Customer Name":
 			self.name = self.get_customer_name()
-		elif cust_master_name == 'Naming Series':
+		elif cust_master_name == "Naming Series":
 			set_name_by_naming_series(self)
 		else:
 			self.name = set_name_from_naming_options(frappe.get_meta(self.doctype).autoname, self)
@@ -51,22 +51,30 @@
 	def get_customer_name(self):
 
 		if frappe.db.get_value("Customer", self.customer_name) and not frappe.flags.in_import:
-			count = frappe.db.sql("""select ifnull(MAX(CAST(SUBSTRING_INDEX(name, ' ', -1) AS UNSIGNED)), 0) from tabCustomer
-				 where name like %s""", "%{0} - %".format(self.customer_name), as_list=1)[0][0]
+			count = frappe.db.sql(
+				"""select ifnull(MAX(CAST(SUBSTRING_INDEX(name, ' ', -1) AS UNSIGNED)), 0) from tabCustomer
+				 where name like %s""",
+				"%{0} - %".format(self.customer_name),
+				as_list=1,
+			)[0][0]
 			count = cint(count) + 1
 
 			new_customer_name = "{0} - {1}".format(self.customer_name, cstr(count))
 
-			msgprint(_("Changed customer name to '{}' as '{}' already exists.")
-					.format(new_customer_name, self.customer_name),
-					title=_("Note"), indicator="yellow")
+			msgprint(
+				_("Changed customer name to '{}' as '{}' already exists.").format(
+					new_customer_name, self.customer_name
+				),
+				title=_("Note"),
+				indicator="yellow",
+			)
 
 			return new_customer_name
 
 		return self.customer_name
 
 	def after_insert(self):
-		'''If customer created from Lead, update customer id in quotations, opportunities'''
+		"""If customer created from Lead, update customer id in quotations, opportunities"""
 		self.update_lead_status()
 
 	def validate(self):
@@ -80,8 +88,8 @@
 		self.validate_internal_customer()
 
 		# set loyalty program tier
-		if frappe.db.exists('Customer', self.name):
-			customer = frappe.get_doc('Customer', self.name)
+		if frappe.db.exists("Customer", self.name):
+			customer = frappe.get_doc("Customer", self.name)
 			if self.loyalty_program == customer.loyalty_program and not self.loyalty_program_tier:
 				self.loyalty_program_tier = customer.loyalty_program_tier
 
@@ -91,7 +99,7 @@
 
 	@frappe.whitelist()
 	def get_customer_group_details(self):
-		doc = frappe.get_doc('Customer Group', self.customer_group)
+		doc = frappe.get_doc("Customer Group", self.customer_group)
 		self.accounts = self.credit_limits = []
 		self.payment_terms = self.default_price_list = ""
 
@@ -100,14 +108,16 @@
 
 		for row in tables:
 			table, field = row[0], row[1]
-			if not doc.get(table): continue
+			if not doc.get(table):
+				continue
 
 			for entry in doc.get(table):
 				child = self.append(table)
 				child.update({"company": entry.company, field: entry.get(field)})
 
 		for field in fields:
-			if not doc.get(field): continue
+			if not doc.get(field):
+				continue
 			self.update({field: doc.get(field)})
 
 		self.save()
@@ -115,23 +125,37 @@
 	def check_customer_group_change(self):
 		frappe.flags.customer_group_changed = False
 
-		if not self.get('__islocal'):
-			if self.customer_group != frappe.db.get_value('Customer', self.name, 'customer_group'):
+		if not self.get("__islocal"):
+			if self.customer_group != frappe.db.get_value("Customer", self.name, "customer_group"):
 				frappe.flags.customer_group_changed = True
 
 	def validate_default_bank_account(self):
 		if self.default_bank_account:
-			is_company_account = frappe.db.get_value('Bank Account', self.default_bank_account, 'is_company_account')
+			is_company_account = frappe.db.get_value(
+				"Bank Account", self.default_bank_account, "is_company_account"
+			)
 			if not is_company_account:
-				frappe.throw(_("{0} is not a company bank account").format(frappe.bold(self.default_bank_account)))
+				frappe.throw(
+					_("{0} is not a company bank account").format(frappe.bold(self.default_bank_account))
+				)
 
 	def validate_internal_customer(self):
-		internal_customer = frappe.db.get_value("Customer",
-			{"is_internal_customer": 1, "represents_company": self.represents_company, "name": ("!=", self.name)}, "name")
+		internal_customer = frappe.db.get_value(
+			"Customer",
+			{
+				"is_internal_customer": 1,
+				"represents_company": self.represents_company,
+				"name": ("!=", self.name),
+			},
+			"name",
+		)
 
 		if internal_customer:
-			frappe.throw(_("Internal Customer for company {0} already exists").format(
-				frappe.bold(self.represents_company)))
+			frappe.throw(
+				_("Internal Customer for company {0} already exists").format(
+					frappe.bold(self.represents_company)
+				)
+			)
 
 	def on_update(self):
 		self.validate_name_with_customer_group()
@@ -149,21 +173,22 @@
 	def update_customer_groups(self):
 		ignore_doctypes = ["Lead", "Opportunity", "POS Profile", "Tax Rule", "Pricing Rule"]
 		if frappe.flags.customer_group_changed:
-			update_linked_doctypes('Customer', self.name, 'Customer Group',
-				self.customer_group, ignore_doctypes)
+			update_linked_doctypes(
+				"Customer", self.name, "Customer Group", self.customer_group, ignore_doctypes
+			)
 
 	def create_primary_contact(self):
 		if not self.customer_primary_contact and not self.lead_name:
 			if self.mobile_no or self.email_id:
 				contact = make_contact(self)
-				self.db_set('customer_primary_contact', contact.name)
-				self.db_set('mobile_no', self.mobile_no)
-				self.db_set('email_id', self.email_id)
+				self.db_set("customer_primary_contact", contact.name)
+				self.db_set("mobile_no", self.mobile_no)
+				self.db_set("email_id", self.email_id)
 
 	def create_primary_address(self):
 		from frappe.contacts.doctype.address.address import get_address_display
 
-		if self.flags.is_new_doc and self.get('address_line1'):
+		if self.flags.is_new_doc and self.get("address_line1"):
 			address = make_address(self)
 			address_display = get_address_display(address.name)
 
@@ -171,8 +196,8 @@
 			self.db_set("primary_address", address_display)
 
 	def update_lead_status(self):
-		'''If Customer created from Lead, update lead status to "Converted"
-		update Customer link in Quotation, Opportunity'''
+		"""If Customer created from Lead, update lead status to "Converted"
+		update Customer link in Quotation, Opportunity"""
 		if self.lead_name:
 			frappe.db.set_value("Lead", self.lead_name, "status", "Converted")
 
@@ -191,22 +216,36 @@
 
 			for row in linked_contacts_and_addresses:
 				linked_doc = frappe.get_doc(row.doctype, row.name)
-				if not linked_doc.has_link('Customer', self.name):
-					linked_doc.append('links', dict(link_doctype='Customer', link_name=self.name))
+				if not linked_doc.has_link("Customer", self.name):
+					linked_doc.append("links", dict(link_doctype="Customer", link_name=self.name))
 					linked_doc.save(ignore_permissions=self.flags.ignore_permissions)
 
 	def validate_name_with_customer_group(self):
 		if frappe.db.exists("Customer Group", self.name):
-			frappe.throw(_("A Customer Group exists with same name please change the Customer name or rename the Customer Group"), frappe.NameError)
+			frappe.throw(
+				_(
+					"A Customer Group exists with same name please change the Customer name or rename the Customer Group"
+				),
+				frappe.NameError,
+			)
 
 	def validate_credit_limit_on_change(self):
 		if self.get("__islocal") or not self.credit_limits:
 			return
 
-		past_credit_limits = [d.credit_limit
-			for d in frappe.db.get_all("Customer Credit Limit", filters={'parent': self.name}, fields=["credit_limit"], order_by="company")]
+		past_credit_limits = [
+			d.credit_limit
+			for d in frappe.db.get_all(
+				"Customer Credit Limit",
+				filters={"parent": self.name},
+				fields=["credit_limit"],
+				order_by="company",
+			)
+		]
 
-		current_credit_limits = [d.credit_limit for d in sorted(self.credit_limits, key=lambda k: k.company)]
+		current_credit_limits = [
+			d.credit_limit for d in sorted(self.credit_limits, key=lambda k: k.company)
+		]
 
 		if past_credit_limits == current_credit_limits:
 			return
@@ -214,7 +253,9 @@
 		company_record = []
 		for limit in self.credit_limits:
 			if limit.company in company_record:
-				frappe.throw(_("Credit limit is already defined for the Company {0}").format(limit.company, self.name))
+				frappe.throw(
+					_("Credit limit is already defined for the Company {0}").format(limit.company, self.name)
+				)
 			else:
 				company_record.append(limit.company)
 
@@ -222,11 +263,16 @@
 				self.name, limit.company, ignore_outstanding_sales_order=limit.bypass_credit_limit_check
 			)
 			if flt(limit.credit_limit) < outstanding_amt:
-				frappe.throw(_("""New credit limit is less than current outstanding amount for the customer. Credit limit has to be atleast {0}""").format(outstanding_amt))
+				frappe.throw(
+					_(
+						"""New credit limit is less than current outstanding amount for the customer. Credit limit has to be atleast {0}"""
+					).format(outstanding_amt)
+				)
 
 	def on_trash(self):
 		if self.customer_primary_contact:
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				UPDATE `tabCustomer`
 				SET
 					customer_primary_contact=null,
@@ -234,14 +280,16 @@
 					mobile_no=null,
 					email_id=null,
 					primary_address=null
-				WHERE name=%(name)s""", {"name": self.name})
+				WHERE name=%(name)s""",
+				{"name": self.name},
+			)
 
-		delete_contact_and_address('Customer', self.name)
+		delete_contact_and_address("Customer", self.name)
 		if self.lead_name:
 			frappe.db.sql("update `tabLead` set status='Interested' where name=%s", self.lead_name)
 
 	def after_rename(self, olddn, newdn, merge=False):
-		if frappe.defaults.get_global_default('cust_master_name') == 'Customer Name':
+		if frappe.defaults.get_global_default("cust_master_name") == "Customer Name":
 			frappe.db.set(self, "customer_name", newdn)
 
 	def set_loyalty_program(self):
@@ -256,43 +304,49 @@
 			self.loyalty_program = loyalty_program[0]
 		else:
 			frappe.msgprint(
-				_("Multiple Loyalty Programs found for Customer {}. Please select manually.")
-				.format(frappe.bold(self.customer_name))
+				_("Multiple Loyalty Programs found for Customer {}. Please select manually.").format(
+					frappe.bold(self.customer_name)
+				)
 			)
 
+
 def create_contact(contact, party_type, party, email):
 	"""Create contact based on given contact name"""
-	contact = contact.split(' ')
+	contact = contact.split(" ")
 
-	contact = frappe.get_doc({
-		'doctype': 'Contact',
-		'first_name': contact[0],
-		'last_name': len(contact) > 1 and contact[1] or ""
-	})
-	contact.append('email_ids', dict(email_id=email, is_primary=1))
-	contact.append('links', dict(link_doctype=party_type, link_name=party))
+	contact = frappe.get_doc(
+		{
+			"doctype": "Contact",
+			"first_name": contact[0],
+			"last_name": len(contact) > 1 and contact[1] or "",
+		}
+	)
+	contact.append("email_ids", dict(email_id=email, is_primary=1))
+	contact.append("links", dict(link_doctype=party_type, link_name=party))
 	contact.insert()
 
+
 @frappe.whitelist()
 def make_quotation(source_name, target_doc=None):
-
 	def set_missing_values(source, target):
 		_set_missing_values(source, target)
 
-	target_doc = get_mapped_doc("Customer", source_name,
-		{"Customer": {
-			"doctype": "Quotation",
-			"field_map": {
-				"name":"party_name"
-			}
-		}}, target_doc, set_missing_values)
+	target_doc = get_mapped_doc(
+		"Customer",
+		source_name,
+		{"Customer": {"doctype": "Quotation", "field_map": {"name": "party_name"}}},
+		target_doc,
+		set_missing_values,
+	)
 
 	target_doc.quotation_to = "Customer"
 	target_doc.run_method("set_missing_values")
 	target_doc.run_method("set_other_charges")
 	target_doc.run_method("calculate_taxes_and_totals")
 
-	price_list, currency = frappe.db.get_value("Customer", {'name': source_name}, ['default_price_list', 'default_currency'])
+	price_list, currency = frappe.db.get_value(
+		"Customer", {"name": source_name}, ["default_price_list", "default_currency"]
+	)
 	if price_list:
 		target_doc.selling_price_list = price_list
 	if currency:
@@ -300,34 +354,53 @@
 
 	return target_doc
 
+
 @frappe.whitelist()
 def make_opportunity(source_name, target_doc=None):
 	def set_missing_values(source, target):
 		_set_missing_values(source, target)
 
-	target_doc = get_mapped_doc("Customer", source_name,
-		{"Customer": {
-			"doctype": "Opportunity",
-			"field_map": {
-				"name": "party_name",
-				"doctype": "opportunity_from",
+	target_doc = get_mapped_doc(
+		"Customer",
+		source_name,
+		{
+			"Customer": {
+				"doctype": "Opportunity",
+				"field_map": {
+					"name": "party_name",
+					"doctype": "opportunity_from",
+				},
 			}
-		}}, target_doc, set_missing_values)
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return target_doc
 
-def _set_missing_values(source, target):
-	address = frappe.get_all('Dynamic Link', {
-			'link_doctype': source.doctype,
-			'link_name': source.name,
-			'parenttype': 'Address',
-		}, ['parent'], limit=1)
 
-	contact = frappe.get_all('Dynamic Link', {
-			'link_doctype': source.doctype,
-			'link_name': source.name,
-			'parenttype': 'Contact',
-		}, ['parent'], limit=1)
+def _set_missing_values(source, target):
+	address = frappe.get_all(
+		"Dynamic Link",
+		{
+			"link_doctype": source.doctype,
+			"link_name": source.name,
+			"parenttype": "Address",
+		},
+		["parent"],
+		limit=1,
+	)
+
+	contact = frappe.get_all(
+		"Dynamic Link",
+		{
+			"link_doctype": source.doctype,
+			"link_name": source.name,
+			"parenttype": "Contact",
+		},
+		["parent"],
+		limit=1,
+	)
 
 	if address:
 		target.customer_address = address[0].parent
@@ -335,35 +408,41 @@
 	if contact:
 		target.contact_person = contact[0].parent
 
+
 @frappe.whitelist()
 def get_loyalty_programs(doc):
-	''' returns applicable loyalty programs for a customer '''
+	"""returns applicable loyalty programs for a customer"""
 
 	lp_details = []
-	loyalty_programs = frappe.get_all("Loyalty Program",
+	loyalty_programs = frappe.get_all(
+		"Loyalty Program",
 		fields=["name", "customer_group", "customer_territory"],
-		filters={"auto_opt_in": 1, "from_date": ["<=", today()],
-			"ifnull(to_date, '2500-01-01')": [">=", today()]})
+		filters={
+			"auto_opt_in": 1,
+			"from_date": ["<=", today()],
+			"ifnull(to_date, '2500-01-01')": [">=", today()],
+		},
+	)
 
 	for loyalty_program in loyalty_programs:
 		if (
-			(not loyalty_program.customer_group
-			or doc.customer_group in get_nested_links(
-				"Customer Group",
-				loyalty_program.customer_group,
-				doc.flags.ignore_permissions
-			))
-			and (not loyalty_program.customer_territory
-			or doc.territory in get_nested_links(
-				"Territory",
-				loyalty_program.customer_territory,
-				doc.flags.ignore_permissions
-			))
+			not loyalty_program.customer_group
+			or doc.customer_group
+			in get_nested_links(
+				"Customer Group", loyalty_program.customer_group, doc.flags.ignore_permissions
+			)
+		) and (
+			not loyalty_program.customer_territory
+			or doc.territory
+			in get_nested_links(
+				"Territory", loyalty_program.customer_territory, doc.flags.ignore_permissions
+			)
 		):
 			lp_details.append(loyalty_program.name)
 
 	return lp_details
 
+
 def get_nested_links(link_doctype, link_name, ignore_permissions=False):
 	from frappe.desk.treeview import _get_children
 
@@ -373,10 +452,12 @@
 
 	return links
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_customer_list(doctype, txt, searchfield, start, page_len, filters=None):
 	from erpnext.controllers.queries import get_fields
+
 	fields = ["name", "customer_name", "customer_group", "territory"]
 
 	if frappe.db.get_default("cust_master_name") == "Customer Name":
@@ -391,7 +472,8 @@
 		filter_conditions = get_filters_cond(doctype, filters, [])
 		match_conditions += "{}".format(filter_conditions)
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select %s
 		from `tabCustomer`
 		where docstatus < 2
@@ -401,8 +483,12 @@
 			case when name like %s then 0 else 1 end,
 			case when customer_name like %s then 0 else 1 end,
 			name, customer_name limit %s, %s
-		""".format(match_conditions=match_conditions) % (", ".join(fields), searchfield, "%s", "%s", "%s", "%s", "%s", "%s"),
-		("%%%s%%" % txt, "%%%s%%" % txt, "%%%s%%" % txt, "%%%s%%" % txt, start, page_len))
+		""".format(
+			match_conditions=match_conditions
+		)
+		% (", ".join(fields), searchfield, "%s", "%s", "%s", "%s", "%s", "%s"),
+		("%%%s%%" % txt, "%%%s%%" % txt, "%%%s%%" % txt, "%%%s%%" % txt, start, page_len),
+	)
 
 
 def check_credit_limit(customer, company, ignore_outstanding_sales_order=False, extra_amount=0):
@@ -415,63 +501,87 @@
 		customer_outstanding += flt(extra_amount)
 
 	if credit_limit > 0 and flt(customer_outstanding) > credit_limit:
-		msgprint(_("Credit limit has been crossed for customer {0} ({1}/{2})")
-			.format(customer, customer_outstanding, credit_limit))
+		msgprint(
+			_("Credit limit has been crossed for customer {0} ({1}/{2})").format(
+				customer, customer_outstanding, credit_limit
+			)
+		)
 
 		# If not authorized person raise exception
-		credit_controller_role = frappe.db.get_single_value('Accounts Settings', 'credit_controller')
+		credit_controller_role = frappe.db.get_single_value("Accounts Settings", "credit_controller")
 		if not credit_controller_role or credit_controller_role not in frappe.get_roles():
 			# form a list of emails for the credit controller users
 			credit_controller_users = get_users_with_role(credit_controller_role or "Sales Master Manager")
 
 			# form a list of emails and names to show to the user
-			credit_controller_users_formatted = [get_formatted_email(user).replace("<", "(").replace(">", ")") for user in credit_controller_users]
+			credit_controller_users_formatted = [
+				get_formatted_email(user).replace("<", "(").replace(">", ")")
+				for user in credit_controller_users
+			]
 			if not credit_controller_users_formatted:
-				frappe.throw(_("Please contact your administrator to extend the credit limits for {0}.").format(customer))
+				frappe.throw(
+					_("Please contact your administrator to extend the credit limits for {0}.").format(customer)
+				)
 
 			message = """Please contact any of the following users to extend the credit limits for {0}:
-				<br><br><ul><li>{1}</li></ul>""".format(customer, '<li>'.join(credit_controller_users_formatted))
+				<br><br><ul><li>{1}</li></ul>""".format(
+				customer, "<li>".join(credit_controller_users_formatted)
+			)
 
 			# if the current user does not have permissions to override credit limit,
 			# prompt them to send out an email to the controller users
-			frappe.msgprint(message,
+			frappe.msgprint(
+				message,
 				title="Notify",
 				raise_exception=1,
 				primary_action={
-					'label': 'Send Email',
-					'server_action': 'erpnext.selling.doctype.customer.customer.send_emails',
-					'args': {
-						'customer': customer,
-						'customer_outstanding': customer_outstanding,
-						'credit_limit': credit_limit,
-						'credit_controller_users_list': credit_controller_users
-					}
-				}
+					"label": "Send Email",
+					"server_action": "erpnext.selling.doctype.customer.customer.send_emails",
+					"args": {
+						"customer": customer,
+						"customer_outstanding": customer_outstanding,
+						"credit_limit": credit_limit,
+						"credit_controller_users_list": credit_controller_users,
+					},
+				},
 			)
 
+
 @frappe.whitelist()
 def send_emails(args):
 	args = json.loads(args)
-	subject = (_("Credit limit reached for customer {0}").format(args.get('customer')))
-	message = (_("Credit limit has been crossed for customer {0} ({1}/{2})")
-			.format(args.get('customer'), args.get('customer_outstanding'), args.get('credit_limit')))
-	frappe.sendmail(recipients=args.get('credit_controller_users_list'), subject=subject, message=message)
+	subject = _("Credit limit reached for customer {0}").format(args.get("customer"))
+	message = _("Credit limit has been crossed for customer {0} ({1}/{2})").format(
+		args.get("customer"), args.get("customer_outstanding"), args.get("credit_limit")
+	)
+	frappe.sendmail(
+		recipients=args.get("credit_controller_users_list"), subject=subject, message=message
+	)
 
-def get_customer_outstanding(customer, company, ignore_outstanding_sales_order=False, cost_center=None):
+
+def get_customer_outstanding(
+	customer, company, ignore_outstanding_sales_order=False, cost_center=None
+):
 	# Outstanding based on GL Entries
 
 	cond = ""
 	if cost_center:
-		lft, rgt = frappe.get_cached_value("Cost Center",
-			cost_center, ['lft', 'rgt'])
+		lft, rgt = frappe.get_cached_value("Cost Center", cost_center, ["lft", "rgt"])
 
 		cond = """ and cost_center in (select name from `tabCost Center` where
-			lft >= {0} and rgt <= {1})""".format(lft, rgt)
+			lft >= {0} and rgt <= {1})""".format(
+			lft, rgt
+		)
 
-	outstanding_based_on_gle = frappe.db.sql("""
+	outstanding_based_on_gle = frappe.db.sql(
+		"""
 		select sum(debit) - sum(credit)
 		from `tabGL Entry` where party_type = 'Customer'
-		and party = %s and company=%s {0}""".format(cond), (customer, company))
+		and party = %s and company=%s {0}""".format(
+			cond
+		),
+		(customer, company),
+	)
 
 	outstanding_based_on_gle = flt(outstanding_based_on_gle[0][0]) if outstanding_based_on_gle else 0
 
@@ -481,18 +591,22 @@
 	# if credit limit check is bypassed at sales order level,
 	# we should not consider outstanding Sales Orders, when customer credit balance report is run
 	if not ignore_outstanding_sales_order:
-		outstanding_based_on_so = frappe.db.sql("""
+		outstanding_based_on_so = frappe.db.sql(
+			"""
 			select sum(base_grand_total*(100 - per_billed)/100)
 			from `tabSales Order`
 			where customer=%s and docstatus = 1 and company=%s
-			and per_billed < 100 and status != 'Closed'""", (customer, company))
+			and per_billed < 100 and status != 'Closed'""",
+			(customer, company),
+		)
 
 		outstanding_based_on_so = flt(outstanding_based_on_so[0][0]) if outstanding_based_on_so else 0
 
 	# Outstanding based on Delivery Note, which are not created against Sales Order
 	outstanding_based_on_dn = 0
 
-	unmarked_delivery_note_items = frappe.db.sql("""select
+	unmarked_delivery_note_items = frappe.db.sql(
+		"""select
 			dn_item.name, dn_item.amount, dn.base_net_total, dn.base_grand_total
 		from `tabDelivery Note` dn, `tabDelivery Note Item` dn_item
 		where
@@ -501,21 +615,24 @@
 			and dn.docstatus = 1 and dn.status not in ('Closed', 'Stopped')
 			and ifnull(dn_item.against_sales_order, '') = ''
 			and ifnull(dn_item.against_sales_invoice, '') = ''
-		""", (customer, company), as_dict=True)
+		""",
+		(customer, company),
+		as_dict=True,
+	)
 
 	if not unmarked_delivery_note_items:
 		return outstanding_based_on_gle + outstanding_based_on_so
 
-	si_amounts = frappe.db.sql("""
+	si_amounts = frappe.db.sql(
+		"""
 		SELECT
 			dn_detail, sum(amount) from `tabSales Invoice Item`
 		WHERE
 			docstatus = 1
 			and dn_detail in ({})
-		GROUP BY dn_detail""".format(", ".join(
-			frappe.db.escape(dn_item.name)
-			for dn_item in unmarked_delivery_note_items
-		))
+		GROUP BY dn_detail""".format(
+			", ".join(frappe.db.escape(dn_item.name) for dn_item in unmarked_delivery_note_items)
+		)
 	)
 
 	si_amounts = {si_item[0]: si_item[1] for si_item in si_amounts}
@@ -525,8 +642,9 @@
 		si_amount = flt(si_amounts.get(dn_item.name))
 
 		if dn_amount > si_amount and dn_item.base_net_total:
-			outstanding_based_on_dn += ((dn_amount - si_amount)
-				/ dn_item.base_net_total) * dn_item.base_grand_total
+			outstanding_based_on_dn += (
+				(dn_amount - si_amount) / dn_item.base_net_total
+			) * dn_item.base_grand_total
 
 	return outstanding_based_on_gle + outstanding_based_on_so + outstanding_based_on_dn
 
@@ -535,75 +653,84 @@
 	credit_limit = None
 
 	if customer:
-		credit_limit = frappe.db.get_value("Customer Credit Limit",
-			{'parent': customer, 'parenttype': 'Customer', 'company': company}, 'credit_limit')
+		credit_limit = frappe.db.get_value(
+			"Customer Credit Limit",
+			{"parent": customer, "parenttype": "Customer", "company": company},
+			"credit_limit",
+		)
 
 		if not credit_limit:
-			customer_group = frappe.get_cached_value("Customer", customer, 'customer_group')
-			credit_limit = frappe.db.get_value("Customer Credit Limit",
-				{'parent': customer_group, 'parenttype': 'Customer Group', 'company': company}, 'credit_limit')
+			customer_group = frappe.get_cached_value("Customer", customer, "customer_group")
+			credit_limit = frappe.db.get_value(
+				"Customer Credit Limit",
+				{"parent": customer_group, "parenttype": "Customer Group", "company": company},
+				"credit_limit",
+			)
 
 	if not credit_limit:
-		credit_limit = frappe.get_cached_value('Company',  company,  "credit_limit")
+		credit_limit = frappe.get_cached_value("Company", company, "credit_limit")
 
 	return flt(credit_limit)
 
+
 def make_contact(args, is_primary_contact=1):
-	contact = frappe.get_doc({
-		'doctype': 'Contact',
-		'first_name': args.get('name'),
-		'is_primary_contact': is_primary_contact,
-		'links': [{
-			'link_doctype': args.get('doctype'),
-			'link_name': args.get('name')
-		}]
-	})
-	if args.get('email_id'):
-		contact.add_email(args.get('email_id'), is_primary=True)
-	if args.get('mobile_no'):
-		contact.add_phone(args.get('mobile_no'), is_primary_mobile_no=True)
+	contact = frappe.get_doc(
+		{
+			"doctype": "Contact",
+			"first_name": args.get("name"),
+			"is_primary_contact": is_primary_contact,
+			"links": [{"link_doctype": args.get("doctype"), "link_name": args.get("name")}],
+		}
+	)
+	if args.get("email_id"):
+		contact.add_email(args.get("email_id"), is_primary=True)
+	if args.get("mobile_no"):
+		contact.add_phone(args.get("mobile_no"), is_primary_mobile_no=True)
 	contact.insert()
 
 	return contact
 
+
 def make_address(args, is_primary_address=1):
 	reqd_fields = []
-	for field in ['city', 'country']:
+	for field in ["city", "country"]:
 		if not args.get(field):
-			reqd_fields.append( '<li>' + field.title() + '</li>')
+			reqd_fields.append("<li>" + field.title() + "</li>")
 
 	if reqd_fields:
 		msg = _("Following fields are mandatory to create address:")
-		frappe.throw("{0} <br><br> <ul>{1}</ul>".format(msg, '\n'.join(reqd_fields)),
-			title = _("Missing Values Required"))
+		frappe.throw(
+			"{0} <br><br> <ul>{1}</ul>".format(msg, "\n".join(reqd_fields)),
+			title=_("Missing Values Required"),
+		)
 
-	address = frappe.get_doc({
-		'doctype': 'Address',
-		'address_title': args.get('name'),
-		'address_line1': args.get('address_line1'),
-		'address_line2': args.get('address_line2'),
-		'city': args.get('city'),
-		'state': args.get('state'),
-		'pincode': args.get('pincode'),
-		'country': args.get('country'),
-		'links': [{
-			'link_doctype': args.get('doctype'),
-			'link_name': args.get('name')
-		}]
-	}).insert()
+	address = frappe.get_doc(
+		{
+			"doctype": "Address",
+			"address_title": args.get("name"),
+			"address_line1": args.get("address_line1"),
+			"address_line2": args.get("address_line2"),
+			"city": args.get("city"),
+			"state": args.get("state"),
+			"pincode": args.get("pincode"),
+			"country": args.get("country"),
+			"links": [{"link_doctype": args.get("doctype"), "link_name": args.get("name")}],
+		}
+	).insert()
 
 	return address
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_customer_primary_contact(doctype, txt, searchfield, start, page_len, filters):
-	customer = filters.get('customer')
-	return frappe.db.sql("""
+	customer = filters.get("customer")
+	return frappe.db.sql(
+		"""
 		select `tabContact`.name from `tabContact`, `tabDynamic Link`
 			where `tabContact`.name = `tabDynamic Link`.parent and `tabDynamic Link`.link_name = %(customer)s
 			and `tabDynamic Link`.link_doctype = 'Customer'
 			and `tabContact`.name like %(txt)s
-		""", {
-			'customer': customer,
-			'txt': '%%%s%%' % txt
-		})
+		""",
+		{"customer": customer, "txt": "%%%s%%" % txt},
+	)
diff --git a/erpnext/selling/doctype/customer/customer_dashboard.py b/erpnext/selling/doctype/customer/customer_dashboard.py
index 58394d0..1b22963 100644
--- a/erpnext/selling/doctype/customer/customer_dashboard.py
+++ b/erpnext/selling/doctype/customer/customer_dashboard.py
@@ -3,47 +3,29 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on transactions against this Customer. See timeline below for details'),
-		'fieldname': 'customer',
-		'non_standard_fieldnames': {
-			'Payment Entry': 'party',
-			'Quotation': 'party_name',
-			'Opportunity': 'party_name',
-			'Bank Account': 'party',
-			'Subscription': 'party'
+		"heatmap": True,
+		"heatmap_message": _(
+			"This is based on transactions against this Customer. See timeline below for details"
+		),
+		"fieldname": "customer",
+		"non_standard_fieldnames": {
+			"Payment Entry": "party",
+			"Quotation": "party_name",
+			"Opportunity": "party_name",
+			"Bank Account": "party",
+			"Subscription": "party",
 		},
-		'dynamic_links': {
-			'party_name': ['Customer', 'quotation_to']
-		},
-		'transactions': [
+		"dynamic_links": {"party_name": ["Customer", "quotation_to"]},
+		"transactions": [
+			{"label": _("Pre Sales"), "items": ["Opportunity", "Quotation"]},
+			{"label": _("Orders"), "items": ["Sales Order", "Delivery Note", "Sales Invoice"]},
+			{"label": _("Payments"), "items": ["Payment Entry", "Bank Account"]},
 			{
-				'label': _('Pre Sales'),
-				'items': ['Opportunity', 'Quotation']
+				"label": _("Support"),
+				"items": ["Issue", "Maintenance Visit", "Installation Note", "Warranty Claim"],
 			},
-			{
-				'label': _('Orders'),
-				'items': ['Sales Order', 'Delivery Note', 'Sales Invoice']
-			},
-			{
-				'label': _('Payments'),
-				'items': ['Payment Entry', 'Bank Account']
-			},
-			{
-				'label': _('Support'),
-				'items': ['Issue', 'Maintenance Visit', 'Installation Note', 'Warranty Claim']
-			},
-			{
-				'label': _('Projects'),
-				'items': ['Project']
-			},
-			{
-				'label': _('Pricing'),
-				'items': ['Pricing Rule']
-			},
-			{
-				'label': _('Subscriptions'),
-				'items': ['Subscription']
-			}
-		]
+			{"label": _("Projects"), "items": ["Project"]},
+			{"label": _("Pricing"), "items": ["Pricing Rule"]},
+			{"label": _("Subscriptions"), "items": ["Subscription"]},
+		],
 	}
diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py
index 165ee81..4027d2e 100644
--- a/erpnext/selling/doctype/customer/test_customer.py
+++ b/erpnext/selling/doctype/customer/test_customer.py
@@ -13,18 +13,17 @@
 from erpnext.tests.utils import create_test_contact_and_address
 
 test_ignore = ["Price List"]
-test_dependencies = ['Payment Term', 'Payment Terms Template']
-test_records = frappe.get_test_records('Customer')
-
+test_dependencies = ["Payment Term", "Payment Terms Template"]
+test_records = frappe.get_test_records("Customer")
 
 
 class TestCustomer(FrappeTestCase):
 	def setUp(self):
-		if not frappe.get_value('Item', '_Test Item'):
-			make_test_records('Item')
+		if not frappe.get_value("Item", "_Test Item"):
+			make_test_records("Item")
 
 	def tearDown(self):
-		set_credit_limit('_Test Customer', '_Test Company', 0)
+		set_credit_limit("_Test Customer", "_Test Company", 0)
 
 	def test_get_customer_group_details(self):
 		doc = frappe.new_doc("Customer Group")
@@ -37,10 +36,7 @@
 			"company": "_Test Company",
 			"account": "Creditors - _TC",
 		}
-		test_credit_limits = {
-			"company": "_Test Company",
-			"credit_limit": 350000
-		}
+		test_credit_limits = {"company": "_Test Company", "credit_limit": 350000}
 		doc.append("accounts", test_account_details)
 		doc.append("credit_limits", test_credit_limits)
 		doc.insert()
@@ -49,7 +45,7 @@
 		c_doc.customer_name = "Testing Customer"
 		c_doc.customer_group = "_Testing Customer Group"
 		c_doc.payment_terms = c_doc.default_price_list = ""
-		c_doc.accounts = c_doc.credit_limits= []
+		c_doc.accounts = c_doc.credit_limits = []
 		c_doc.insert()
 		c_doc.get_customer_group_details()
 		self.assertEqual(c_doc.payment_terms, "_Test Payment Term Template 3")
@@ -66,25 +62,26 @@
 		from erpnext.accounts.party import get_party_details
 
 		to_check = {
-			'selling_price_list': None,
-			'customer_group': '_Test Customer Group',
-			'contact_designation': None,
-			'customer_address': '_Test Address for Customer-Office',
-			'contact_department': None,
-			'contact_email': 'test_contact_customer@example.com',
-			'contact_mobile': None,
-			'sales_team': [],
-			'contact_display': '_Test Contact for _Test Customer',
-			'contact_person': '_Test Contact for _Test Customer-_Test Customer',
-			'territory': u'_Test Territory',
-			'contact_phone': '+91 0000000000',
-			'customer_name': '_Test Customer'
+			"selling_price_list": None,
+			"customer_group": "_Test Customer Group",
+			"contact_designation": None,
+			"customer_address": "_Test Address for Customer-Office",
+			"contact_department": None,
+			"contact_email": "test_contact_customer@example.com",
+			"contact_mobile": None,
+			"sales_team": [],
+			"contact_display": "_Test Contact for _Test Customer",
+			"contact_person": "_Test Contact for _Test Customer-_Test Customer",
+			"territory": "_Test Territory",
+			"contact_phone": "+91 0000000000",
+			"customer_name": "_Test Customer",
 		}
 
 		create_test_contact_and_address()
 
-		frappe.db.set_value("Contact", "_Test Contact for _Test Customer-_Test Customer",
-			"is_primary_contact", 1)
+		frappe.db.set_value(
+			"Contact", "_Test Contact for _Test Customer-_Test Customer", "is_primary_contact", 1
+		)
 
 		details = get_party_details("_Test Customer")
 
@@ -105,32 +102,30 @@
 		details = get_party_details("_Test Customer With Tax Category")
 		self.assertEqual(details.tax_category, "_Test Tax Category 1")
 
-		billing_address = frappe.get_doc(dict(
-			doctype='Address',
-			address_title='_Test Address With Tax Category',
-			tax_category='_Test Tax Category 2',
-			address_type='Billing',
-			address_line1='Station Road',
-			city='_Test City',
-			country='India',
-			links=[dict(
-				link_doctype='Customer',
-				link_name='_Test Customer With Tax Category'
-			)]
-		)).insert()
-		shipping_address = frappe.get_doc(dict(
-			doctype='Address',
-			address_title='_Test Address With Tax Category',
-			tax_category='_Test Tax Category 3',
-			address_type='Shipping',
-			address_line1='Station Road',
-			city='_Test City',
-			country='India',
-			links=[dict(
-				link_doctype='Customer',
-				link_name='_Test Customer With Tax Category'
-			)]
-		)).insert()
+		billing_address = frappe.get_doc(
+			dict(
+				doctype="Address",
+				address_title="_Test Address With Tax Category",
+				tax_category="_Test Tax Category 2",
+				address_type="Billing",
+				address_line1="Station Road",
+				city="_Test City",
+				country="India",
+				links=[dict(link_doctype="Customer", link_name="_Test Customer With Tax Category")],
+			)
+		).insert()
+		shipping_address = frappe.get_doc(
+			dict(
+				doctype="Address",
+				address_title="_Test Address With Tax Category",
+				tax_category="_Test Tax Category 3",
+				address_type="Shipping",
+				address_line1="Station Road",
+				city="_Test City",
+				country="India",
+				links=[dict(link_doctype="Customer", link_name="_Test Customer With Tax Category")],
+			)
+		).insert()
 
 		settings = frappe.get_single("Accounts Settings")
 		rollback_setting = settings.determine_address_tax_category_from
@@ -158,12 +153,16 @@
 
 		new_name = "_Test Customer 1 Renamed"
 		for name in ("_Test Customer 1", new_name):
-			frappe.db.sql("""delete from `tabComment`
+			frappe.db.sql(
+				"""delete from `tabComment`
 				where reference_doctype=%s and reference_name=%s""",
-				("Customer", name))
+				("Customer", name),
+			)
 
 		# add comments
-		comment = frappe.get_doc("Customer", "_Test Customer 1").add_comment("Comment", "Test Comment for Rename")
+		comment = frappe.get_doc("Customer", "_Test Customer 1").add_comment(
+			"Comment", "Test Comment for Rename"
+		)
 
 		# rename
 		frappe.rename_doc("Customer", "_Test Customer 1", new_name)
@@ -173,11 +172,17 @@
 		self.assertFalse(frappe.db.exists("Customer", "_Test Customer 1"))
 
 		# test that comment gets linked to renamed doc
-		self.assertEqual(frappe.db.get_value("Comment", {
-			"reference_doctype": "Customer",
-			"reference_name": new_name,
-			"content": "Test Comment for Rename"
-		}), comment.name)
+		self.assertEqual(
+			frappe.db.get_value(
+				"Comment",
+				{
+					"reference_doctype": "Customer",
+					"reference_name": new_name,
+					"content": "Test Comment for Rename",
+				},
+			),
+			comment.name,
+		)
 
 		# rename back to original
 		frappe.rename_doc("Customer", new_name, "_Test Customer 1")
@@ -191,7 +196,7 @@
 
 		from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
 
-		so = make_sales_order(do_not_save= True)
+		so = make_sales_order(do_not_save=True)
 
 		self.assertRaises(PartyFrozen, so.save)
 
@@ -200,13 +205,14 @@
 		so.save()
 
 	def test_delete_customer_contact(self):
-		customer = frappe.get_doc(
-			get_customer_dict('_Test Customer for delete')).insert(ignore_permissions=True)
+		customer = frappe.get_doc(get_customer_dict("_Test Customer for delete")).insert(
+			ignore_permissions=True
+		)
 
 		customer.mobile_no = "8989889890"
 		customer.save()
 		self.assertTrue(customer.customer_primary_contact)
-		frappe.delete_doc('Customer', customer.name)
+		frappe.delete_doc("Customer", customer.name)
 
 	def test_disabled_customer(self):
 		make_test_records("Item")
@@ -227,13 +233,15 @@
 		frappe.db.sql("delete from `tabCustomer` where customer_name='_Test Customer 1'")
 
 		if not frappe.db.get_value("Customer", "_Test Customer 1"):
-			test_customer_1 = frappe.get_doc(
-				get_customer_dict('_Test Customer 1')).insert(ignore_permissions=True)
+			test_customer_1 = frappe.get_doc(get_customer_dict("_Test Customer 1")).insert(
+				ignore_permissions=True
+			)
 		else:
 			test_customer_1 = frappe.get_doc("Customer", "_Test Customer 1")
 
-		duplicate_customer = frappe.get_doc(
-			get_customer_dict('_Test Customer 1')).insert(ignore_permissions=True)
+		duplicate_customer = frappe.get_doc(get_customer_dict("_Test Customer 1")).insert(
+			ignore_permissions=True
+		)
 
 		self.assertEqual("_Test Customer 1", test_customer_1.name)
 		self.assertEqual("_Test Customer 1 - 1", duplicate_customer.name)
@@ -241,15 +249,16 @@
 
 	def get_customer_outstanding_amount(self):
 		from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
-		outstanding_amt = get_customer_outstanding('_Test Customer', '_Test Company')
+
+		outstanding_amt = get_customer_outstanding("_Test Customer", "_Test Company")
 
 		# If outstanding is negative make a transaction to get positive outstanding amount
 		if outstanding_amt > 0.0:
 			return outstanding_amt
 
-		item_qty = int((abs(outstanding_amt) + 200)/100)
+		item_qty = int((abs(outstanding_amt) + 200) / 100)
 		make_sales_order(qty=item_qty)
-		return get_customer_outstanding('_Test Customer', '_Test Company')
+		return get_customer_outstanding("_Test Customer", "_Test Company")
 
 	def test_customer_credit_limit(self):
 		from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
@@ -258,14 +267,14 @@
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 
 		outstanding_amt = self.get_customer_outstanding_amount()
-		credit_limit = get_credit_limit('_Test Customer', '_Test Company')
+		credit_limit = get_credit_limit("_Test Customer", "_Test Company")
 
 		if outstanding_amt <= 0.0:
-			item_qty = int((abs(outstanding_amt) + 200)/100)
+			item_qty = int((abs(outstanding_amt) + 200) / 100)
 			make_sales_order(qty=item_qty)
 
 		if not credit_limit:
-			set_credit_limit('_Test Customer', '_Test Company', outstanding_amt - 50)
+			set_credit_limit("_Test Customer", "_Test Company", outstanding_amt - 50)
 
 		# Sales Order
 		so = make_sales_order(do_not_submit=True)
@@ -280,7 +289,7 @@
 		self.assertRaises(frappe.ValidationError, si.submit)
 
 		if credit_limit > outstanding_amt:
-			set_credit_limit('_Test Customer', '_Test Company', credit_limit)
+			set_credit_limit("_Test Customer", "_Test Company", credit_limit)
 
 		# Makes Sales invoice from Sales Order
 		so.save(ignore_permissions=True)
@@ -290,16 +299,21 @@
 
 	def test_customer_credit_limit_on_change(self):
 		outstanding_amt = self.get_customer_outstanding_amount()
-		customer = frappe.get_doc("Customer", '_Test Customer')
-		customer.append('credit_limits', {'credit_limit': flt(outstanding_amt - 100), 'company': '_Test Company'})
+		customer = frappe.get_doc("Customer", "_Test Customer")
+		customer.append(
+			"credit_limits", {"credit_limit": flt(outstanding_amt - 100), "company": "_Test Company"}
+		)
 
-		''' define new credit limit for same company '''
-		customer.append('credit_limits', {'credit_limit': flt(outstanding_amt - 100), 'company': '_Test Company'})
+		""" define new credit limit for same company """
+		customer.append(
+			"credit_limits", {"credit_limit": flt(outstanding_amt - 100), "company": "_Test Company"}
+		)
 		self.assertRaises(frappe.ValidationError, customer.save)
 
 	def test_customer_payment_terms(self):
 		frappe.db.set_value(
-			"Customer", "_Test Customer With Template", "payment_terms", "_Test Payment Term Template 3")
+			"Customer", "_Test Customer With Template", "payment_terms", "_Test Payment Term Template 3"
+		)
 
 		due_date = get_due_date("2016-01-22", "Customer", "_Test Customer With Template")
 		self.assertEqual(due_date, "2016-02-21")
@@ -308,7 +322,8 @@
 		self.assertEqual(due_date, "2017-02-21")
 
 		frappe.db.set_value(
-			"Customer", "_Test Customer With Template", "payment_terms", "_Test Payment Term Template 1")
+			"Customer", "_Test Customer With Template", "payment_terms", "_Test Payment Term Template 1"
+		)
 
 		due_date = get_due_date("2016-01-22", "Customer", "_Test Customer With Template")
 		self.assertEqual(due_date, "2016-02-29")
@@ -328,13 +343,14 @@
 
 def get_customer_dict(customer_name):
 	return {
-		 "customer_group": "_Test Customer Group",
-		 "customer_name": customer_name,
-		 "customer_type": "Individual",
-		 "doctype": "Customer",
-		 "territory": "_Test Territory"
+		"customer_group": "_Test Customer Group",
+		"customer_name": customer_name,
+		"customer_type": "Individual",
+		"doctype": "Customer",
+		"territory": "_Test Territory",
 	}
 
+
 def set_credit_limit(customer, company, credit_limit):
 	customer = frappe.get_doc("Customer", customer)
 	existing_row = None
@@ -346,27 +362,25 @@
 			break
 
 	if not existing_row:
-		customer.append('credit_limits', {
-			'company': company,
-			'credit_limit': credit_limit
-		})
+		customer.append("credit_limits", {"company": company, "credit_limit": credit_limit})
 		customer.credit_limits[-1].db_insert()
 
+
 def create_internal_customer(customer_name, represents_company, allowed_to_interact_with):
 	if not frappe.db.exists("Customer", customer_name):
-		customer = frappe.get_doc({
-			"doctype": "Customer",
-			"customer_group": "_Test Customer Group",
-			"customer_name": customer_name,
-			"customer_type": "Individual",
-			"territory": "_Test Territory",
-			"is_internal_customer": 1,
-			"represents_company": represents_company
-		})
+		customer = frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_group": "_Test Customer Group",
+				"customer_name": customer_name,
+				"customer_type": "Individual",
+				"territory": "_Test Territory",
+				"is_internal_customer": 1,
+				"represents_company": represents_company,
+			}
+		)
 
-		customer.append("companies", {
-			"company": allowed_to_interact_with
-		})
+		customer.append("companies", {"company": allowed_to_interact_with})
 
 		customer.insert()
 		customer_name = customer.name
diff --git a/erpnext/selling/doctype/industry_type/test_industry_type.py b/erpnext/selling/doctype/industry_type/test_industry_type.py
index 250c2be..eb5f905 100644
--- a/erpnext/selling/doctype/industry_type/test_industry_type.py
+++ b/erpnext/selling/doctype/industry_type/test_industry_type.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Industry Type')
+test_records = frappe.get_test_records("Industry Type")
diff --git a/erpnext/selling/doctype/installation_note/installation_note.py b/erpnext/selling/doctype/installation_note/installation_note.py
index 36acdbe..dd0b1e8 100644
--- a/erpnext/selling/doctype/installation_note/installation_note.py
+++ b/erpnext/selling/doctype/installation_note/installation_note.py
@@ -13,26 +13,29 @@
 class InstallationNote(TransactionBase):
 	def __init__(self, *args, **kwargs):
 		super(InstallationNote, self).__init__(*args, **kwargs)
-		self.status_updater = [{
-			'source_dt': 'Installation Note Item',
-			'target_dt': 'Delivery Note Item',
-			'target_field': 'installed_qty',
-			'target_ref_field': 'qty',
-			'join_field': 'prevdoc_detail_docname',
-			'target_parent_dt': 'Delivery Note',
-			'target_parent_field': 'per_installed',
-			'source_field': 'qty',
-			'percent_join_field': 'prevdoc_docname',
-			'status_field': 'installation_status',
-			'keyword': 'Installed',
-			'overflow_type': 'installation'
-		}]
+		self.status_updater = [
+			{
+				"source_dt": "Installation Note Item",
+				"target_dt": "Delivery Note Item",
+				"target_field": "installed_qty",
+				"target_ref_field": "qty",
+				"join_field": "prevdoc_detail_docname",
+				"target_parent_dt": "Delivery Note",
+				"target_parent_field": "per_installed",
+				"source_field": "qty",
+				"percent_join_field": "prevdoc_docname",
+				"status_field": "installation_status",
+				"keyword": "Installed",
+				"overflow_type": "installation",
+			}
+		]
 
 	def validate(self):
 		self.validate_installation_date()
 		self.check_item_table()
 
 		from erpnext.controllers.selling_controller import set_default_income_account_for_item
+
 		set_default_income_account_for_item(self)
 
 	def is_serial_no_added(self, item_code, serial_no):
@@ -48,18 +51,19 @@
 				frappe.throw(_("Serial No {0} does not exist").format(x))
 
 	def get_prevdoc_serial_no(self, prevdoc_detail_docname):
-		serial_nos = frappe.db.get_value("Delivery Note Item",
-			prevdoc_detail_docname, "serial_no")
+		serial_nos = frappe.db.get_value("Delivery Note Item", prevdoc_detail_docname, "serial_no")
 		return get_valid_serial_nos(serial_nos)
 
 	def is_serial_no_match(self, cur_s_no, prevdoc_s_no, prevdoc_docname):
 		for sr in cur_s_no:
 			if sr not in prevdoc_s_no:
-				frappe.throw(_("Serial No {0} does not belong to Delivery Note {1}").format(sr, prevdoc_docname))
+				frappe.throw(
+					_("Serial No {0} does not belong to Delivery Note {1}").format(sr, prevdoc_docname)
+				)
 
 	def validate_serial_no(self):
 		prevdoc_s_no, sr_list = [], []
-		for d in self.get('items'):
+		for d in self.get("items"):
 			self.is_serial_no_added(d.item_code, d.serial_no)
 			if d.serial_no:
 				sr_list = get_valid_serial_nos(d.serial_no, d.qty, d.item_code)
@@ -69,26 +73,27 @@
 				if prevdoc_s_no:
 					self.is_serial_no_match(sr_list, prevdoc_s_no, d.prevdoc_docname)
 
-
 	def validate_installation_date(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.prevdoc_docname:
 				d_date = frappe.db.get_value("Delivery Note", d.prevdoc_docname, "posting_date")
 				if d_date > getdate(self.inst_date):
-					frappe.throw(_("Installation date cannot be before delivery date for Item {0}").format(d.item_code))
+					frappe.throw(
+						_("Installation date cannot be before delivery date for Item {0}").format(d.item_code)
+					)
 
 	def check_item_table(self):
-		if not(self.get('items')):
+		if not (self.get("items")):
 			frappe.throw(_("Please pull items from Delivery Note"))
 
 	def on_update(self):
-		frappe.db.set(self, 'status', 'Draft')
+		frappe.db.set(self, "status", "Draft")
 
 	def on_submit(self):
 		self.validate_serial_no()
 		self.update_prevdoc_status()
-		frappe.db.set(self, 'status', 'Submitted')
+		frappe.db.set(self, "status", "Submitted")
 
 	def on_cancel(self):
 		self.update_prevdoc_status()
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
diff --git a/erpnext/selling/doctype/installation_note/test_installation_note.py b/erpnext/selling/doctype/installation_note/test_installation_note.py
index d3c8be5..56e0fe1 100644
--- a/erpnext/selling/doctype/installation_note/test_installation_note.py
+++ b/erpnext/selling/doctype/installation_note/test_installation_note.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Installation Note')
 
+
 class TestInstallationNote(unittest.TestCase):
 	pass
diff --git a/erpnext/selling/doctype/party_specific_item/party_specific_item.py b/erpnext/selling/doctype/party_specific_item/party_specific_item.py
index a408af5..0aef7d3 100644
--- a/erpnext/selling/doctype/party_specific_item/party_specific_item.py
+++ b/erpnext/selling/doctype/party_specific_item/party_specific_item.py
@@ -8,12 +8,14 @@
 
 class PartySpecificItem(Document):
 	def validate(self):
-		exists = frappe.db.exists({
-			'doctype': 'Party Specific Item',
-			'party_type': self.party_type,
-			'party': self.party,
-			'restrict_based_on': self.restrict_based_on,
-			'based_on': self.based_on_value,
-		})
+		exists = frappe.db.exists(
+			{
+				"doctype": "Party Specific Item",
+				"party_type": self.party_type,
+				"party": self.party,
+				"restrict_based_on": self.restrict_based_on,
+				"based_on": self.based_on_value,
+			}
+		)
 		if exists:
 			frappe.throw(_("This item filter has already been applied for the {0}").format(self.party_type))
diff --git a/erpnext/selling/doctype/party_specific_item/test_party_specific_item.py b/erpnext/selling/doctype/party_specific_item/test_party_specific_item.py
index 9b672b4..f98cbd7 100644
--- a/erpnext/selling/doctype/party_specific_item/test_party_specific_item.py
+++ b/erpnext/selling/doctype/party_specific_item/test_party_specific_item.py
@@ -6,16 +6,18 @@
 
 from erpnext.controllers.queries import item_query
 
-test_dependencies = ['Item', 'Customer', 'Supplier']
+test_dependencies = ["Item", "Customer", "Supplier"]
+
 
 def create_party_specific_item(**args):
 	psi = frappe.new_doc("Party Specific Item")
-	psi.party_type = args.get('party_type')
-	psi.party = args.get('party')
-	psi.restrict_based_on = args.get('restrict_based_on')
-	psi.based_on_value = args.get('based_on_value')
+	psi.party_type = args.get("party_type")
+	psi.party = args.get("party")
+	psi.restrict_based_on = args.get("restrict_based_on")
+	psi.based_on_value = args.get("based_on_value")
 	psi.insert()
 
+
 class TestPartySpecificItem(FrappeTestCase):
 	def setUp(self):
 		self.customer = frappe.get_last_doc("Customer")
@@ -23,15 +25,29 @@
 		self.item = frappe.get_last_doc("Item")
 
 	def test_item_query_for_customer(self):
-		create_party_specific_item(party_type='Customer', party=self.customer.name, restrict_based_on='Item', based_on_value=self.item.name)
-		filters = {'is_sales_item': 1, 'customer': self.customer.name}
-		items = item_query(doctype= 'Item', txt= '', searchfield= 'name', start= 0, page_len= 20,filters=filters, as_dict= False)
+		create_party_specific_item(
+			party_type="Customer",
+			party=self.customer.name,
+			restrict_based_on="Item",
+			based_on_value=self.item.name,
+		)
+		filters = {"is_sales_item": 1, "customer": self.customer.name}
+		items = item_query(
+			doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters=filters, as_dict=False
+		)
 		for item in items:
 			self.assertEqual(item[0], self.item.name)
 
 	def test_item_query_for_supplier(self):
-		create_party_specific_item(party_type='Supplier', party=self.supplier.name, restrict_based_on='Item Group', based_on_value=self.item.item_group)
-		filters = {'supplier': self.supplier.name, 'is_purchase_item': 1}
-		items = item_query(doctype= 'Item', txt= '', searchfield= 'name', start= 0, page_len= 20,filters=filters, as_dict= False)
+		create_party_specific_item(
+			party_type="Supplier",
+			party=self.supplier.name,
+			restrict_based_on="Item Group",
+			based_on_value=self.item.item_group,
+		)
+		filters = {"supplier": self.supplier.name, "is_purchase_item": 1}
+		items = item_query(
+			doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters=filters, as_dict=False
+		)
 		for item in items:
 			self.assertEqual(item[2], self.item.item_group)
diff --git a/erpnext/selling/doctype/product_bundle/product_bundle.py b/erpnext/selling/doctype/product_bundle/product_bundle.py
index 2bb876e..575b956 100644
--- a/erpnext/selling/doctype/product_bundle/product_bundle.py
+++ b/erpnext/selling/doctype/product_bundle/product_bundle.py
@@ -16,11 +16,22 @@
 		self.validate_main_item()
 		self.validate_child_items()
 		from erpnext.utilities.transaction_base import validate_uom_is_integer
+
 		validate_uom_is_integer(self, "uom", "qty")
 
 	def on_trash(self):
-		linked_doctypes = ["Delivery Note", "Sales Invoice", "POS Invoice", "Purchase Receipt", "Purchase Invoice",
-			"Stock Entry", "Stock Reconciliation", "Sales Order", "Purchase Order", "Material Request"]
+		linked_doctypes = [
+			"Delivery Note",
+			"Sales Invoice",
+			"POS Invoice",
+			"Purchase Receipt",
+			"Purchase Invoice",
+			"Stock Entry",
+			"Stock Reconciliation",
+			"Sales Order",
+			"Purchase Order",
+			"Material Request",
+		]
 
 		invoice_links = []
 		for doctype in linked_doctypes:
@@ -29,15 +40,20 @@
 			if doctype == "Stock Entry":
 				item_doctype = doctype + " Detail"
 
-			invoices = frappe.db.get_all(item_doctype, {"item_code": self.new_item_code, "docstatus": 1}, ["parent"])
+			invoices = frappe.db.get_all(
+				item_doctype, {"item_code": self.new_item_code, "docstatus": 1}, ["parent"]
+			)
 
 			for invoice in invoices:
-				invoice_links.append(get_link_to_form(doctype, invoice['parent']))
+				invoice_links.append(get_link_to_form(doctype, invoice["parent"]))
 
 		if len(invoice_links):
 			frappe.throw(
-				"This Product Bundle is linked with {0}. You will have to cancel these documents in order to delete this Product Bundle"
-				.format(", ".join(invoice_links)), title=_("Not Allowed"))
+				"This Product Bundle is linked with {0}. You will have to cancel these documents in order to delete this Product Bundle".format(
+					", ".join(invoice_links)
+				),
+				title=_("Not Allowed"),
+			)
 
 	def validate_main_item(self):
 		"""Validates, main Item is not a stock item"""
@@ -47,15 +63,22 @@
 	def validate_child_items(self):
 		for item in self.items:
 			if frappe.db.exists("Product Bundle", item.item_code):
-				frappe.throw(_("Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save").format(item.idx, frappe.bold(item.item_code)))
+				frappe.throw(
+					_(
+						"Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save"
+					).format(item.idx, frappe.bold(item.item_code))
+				)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_new_item_code(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
 
-	return frappe.db.sql("""select name, item_name, description from tabItem
+	return frappe.db.sql(
+		"""select name, item_name, description from tabItem
 		where is_stock_item=0 and name not in (select name from `tabProduct Bundle`)
-		and %s like %s %s limit %s, %s""" % (searchfield, "%s",
-		get_match_cond(doctype),"%s", "%s"),
-		("%%%s%%" % txt, start, page_len))
+		and %s like %s %s limit %s, %s"""
+		% (searchfield, "%s", get_match_cond(doctype), "%s", "%s"),
+		("%%%s%%" % txt, start, page_len),
+	)
diff --git a/erpnext/selling/doctype/product_bundle/test_product_bundle.py b/erpnext/selling/doctype/product_bundle/test_product_bundle.py
index c1e2fde..82fe892 100644
--- a/erpnext/selling/doctype/product_bundle/test_product_bundle.py
+++ b/erpnext/selling/doctype/product_bundle/test_product_bundle.py
@@ -3,16 +3,14 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Product Bundle')
+test_records = frappe.get_test_records("Product Bundle")
+
 
 def make_product_bundle(parent, items, qty=None):
 	if frappe.db.exists("Product Bundle", parent):
 		return frappe.get_doc("Product Bundle", parent)
 
-	product_bundle = frappe.get_doc({
-		"doctype": "Product Bundle",
-		"new_item_code": parent
-	})
+	product_bundle = frappe.get_doc({"doctype": "Product Bundle", "new_item_code": parent})
 
 	for item in items:
 		product_bundle.append("items", {"item_code": item, "qty": qty or 1})
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index d602f0c..61c0b8a 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -10,18 +10,17 @@
 from erpnext.controllers.selling_controller import SellingController
 from erpnext.crm.utils import add_link_in_communication, copy_comments
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class Quotation(SellingController):
 	def set_indicator(self):
-		if self.docstatus==1:
-			self.indicator_color = 'blue'
-			self.indicator_title = 'Submitted'
+		if self.docstatus == 1:
+			self.indicator_color = "blue"
+			self.indicator_title = "Submitted"
 		if self.valid_till and getdate(self.valid_till) < getdate(nowdate()):
-			self.indicator_color = 'gray'
-			self.indicator_title = 'Expired'
+			self.indicator_color = "gray"
+			self.indicator_title = "Expired"
 
 	def validate(self):
 		super(Quotation, self).validate()
@@ -33,6 +32,7 @@
 			self.with_items = 1
 
 		from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
+
 		make_packing_list(self)
 
 	def after_insert(self):
@@ -57,10 +57,12 @@
 			frappe.get_doc("Lead", self.party_name).set_status(update=True)
 
 	def set_customer_name(self):
-		if self.party_name and self.quotation_to == 'Customer':
+		if self.party_name and self.quotation_to == "Customer":
 			self.customer_name = frappe.db.get_value("Customer", self.party_name, "customer_name")
-		elif self.party_name and self.quotation_to == 'Lead':
-			lead_name, company_name = frappe.db.get_value("Lead", self.party_name, ["lead_name", "company_name"])
+		elif self.party_name and self.quotation_to == "Lead":
+			lead_name, company_name = frappe.db.get_value(
+				"Lead", self.party_name, ["lead_name", "company_name"]
+			)
 			self.customer_name = company_name or lead_name
 
 	def update_opportunity(self, status):
@@ -81,24 +83,27 @@
 	@frappe.whitelist()
 	def declare_enquiry_lost(self, lost_reasons_list, competitors, detailed_reason=None):
 		if not self.has_sales_order():
-			get_lost_reasons = frappe.get_list('Quotation Lost Reason',
-			fields = ["name"])
-			lost_reasons_lst = [reason.get('name') for reason in get_lost_reasons]
-			frappe.db.set(self, 'status', 'Lost')
+			get_lost_reasons = frappe.get_list("Quotation Lost Reason", fields=["name"])
+			lost_reasons_lst = [reason.get("name") for reason in get_lost_reasons]
+			frappe.db.set(self, "status", "Lost")
 
 			if detailed_reason:
-				frappe.db.set(self, 'order_lost_reason', detailed_reason)
+				frappe.db.set(self, "order_lost_reason", detailed_reason)
 
 			for reason in lost_reasons_list:
-				if reason.get('lost_reason') in lost_reasons_lst:
-					self.append('lost_reasons', reason)
+				if reason.get("lost_reason") in lost_reasons_lst:
+					self.append("lost_reasons", reason)
 				else:
-					frappe.throw(_("Invalid lost reason {0}, please create a new lost reason").format(frappe.bold(reason.get('lost_reason'))))
+					frappe.throw(
+						_("Invalid lost reason {0}, please create a new lost reason").format(
+							frappe.bold(reason.get("lost_reason"))
+						)
+					)
 
 			for competitor in competitors:
-				self.append('competitors', competitor)
+				self.append("competitors", competitor)
 
-			self.update_opportunity('Lost')
+			self.update_opportunity("Lost")
 			self.update_lead()
 			self.save()
 
@@ -107,11 +112,12 @@
 
 	def on_submit(self):
 		# Check for Approving Authority
-		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
-			self.company, self.base_grand_total, self)
+		frappe.get_doc("Authorization Control").validate_approving_authority(
+			self.doctype, self.company, self.base_grand_total, self
+		)
 
-		#update enquiry status
-		self.update_opportunity('Quotation')
+		# update enquiry status
+		self.update_opportunity("Quotation")
 		self.update_lead()
 
 	def on_cancel(self):
@@ -119,14 +125,14 @@
 			self.lost_reasons = []
 		super(Quotation, self).on_cancel()
 
-		#update enquiry status
+		# update enquiry status
 		self.set_status(update=True)
-		self.update_opportunity('Open')
+		self.update_opportunity("Open")
 		self.update_lead()
 
-	def print_other_charges(self,docname):
+	def print_other_charges(self, docname):
 		print_lst = []
-		for d in self.get('taxes'):
+		for d in self.get("taxes"):
 			lst1 = []
 			lst1.append(d.description)
 			lst1.append(d.total)
@@ -136,25 +142,35 @@
 	def on_recurring(self, reference_doc, auto_repeat_doc):
 		self.valid_till = None
 
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Quotations'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Quotations"),
+		}
+	)
 
 	return list_context
 
+
 @frappe.whitelist()
 def make_sales_order(source_name, target_doc=None):
-	quotation = frappe.db.get_value("Quotation", source_name, ["transaction_date", "valid_till"], as_dict = 1)
-	if quotation.valid_till and (quotation.valid_till < quotation.transaction_date or quotation.valid_till < getdate(nowdate())):
+	quotation = frappe.db.get_value(
+		"Quotation", source_name, ["transaction_date", "valid_till"], as_dict=1
+	)
+	if quotation.valid_till and (
+		quotation.valid_till < quotation.transaction_date or quotation.valid_till < getdate(nowdate())
+	):
 		frappe.throw(_("Validity period of this quotation has ended."))
 	return _make_sales_order(source_name, target_doc)
 
+
 def _make_sales_order(source_name, target_doc=None, ignore_permissions=False):
 	customer = _make_customer(source_name, ignore_permissions)
 
@@ -163,8 +179,10 @@
 			target.customer = customer.name
 			target.customer_name = customer.customer_name
 		if source.referral_sales_partner:
-			target.sales_partner=source.referral_sales_partner
-			target.commission_rate=frappe.get_value('Sales Partner', source.referral_sales_partner, 'commission_rate')
+			target.sales_partner = source.referral_sales_partner
+			target.commission_rate = frappe.get_value(
+				"Sales Partner", source.referral_sales_partner, "commission_rate"
+			)
 		target.flags.ignore_permissions = ignore_permissions
 		target.run_method("set_missing_values")
 		target.run_method("calculate_taxes_and_totals")
@@ -177,39 +195,31 @@
 			target.blanket_order = obj.blanket_order
 			target.blanket_order_rate = obj.blanket_order_rate
 
-	doclist = get_mapped_doc("Quotation", source_name, {
-			"Quotation": {
-				"doctype": "Sales Order",
-				"validation": {
-					"docstatus": ["=", 1]
-				}
-			},
+	doclist = get_mapped_doc(
+		"Quotation",
+		source_name,
+		{
+			"Quotation": {"doctype": "Sales Order", "validation": {"docstatus": ["=", 1]}},
 			"Quotation Item": {
 				"doctype": "Sales Order Item",
-				"field_map": {
-					"parent": "prevdoc_docname"
-				},
-				"postprocess": update_item
+				"field_map": {"parent": "prevdoc_docname"},
+				"postprocess": update_item,
 			},
-			"Sales Taxes and Charges": {
-				"doctype": "Sales Taxes and Charges",
-				"add_if_empty": True
-			},
-			"Sales Team": {
-				"doctype": "Sales Team",
-				"add_if_empty": True
-			},
-			"Payment Schedule": {
-				"doctype": "Payment Schedule",
-				"add_if_empty": True
-			}
-		}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
+			"Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "add_if_empty": True},
+			"Sales Team": {"doctype": "Sales Team", "add_if_empty": True},
+			"Payment Schedule": {"doctype": "Payment Schedule", "add_if_empty": True},
+		},
+		target_doc,
+		set_missing_values,
+		ignore_permissions=ignore_permissions,
+	)
 
 	# postprocess: fetch shipping address, set missing values
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 
 	return doclist
 
+
 def set_expired_status():
 	# filter out submitted non expired quotations whose validity has been ended
 	cond = "qo.docstatus = 1 and qo.status != 'Expired' and qo.valid_till < %s"
@@ -224,15 +234,18 @@
 
 	# if not exists any SO, set status as Expired
 	frappe.db.sql(
-		"""UPDATE `tabQuotation` qo SET qo.status = 'Expired' WHERE {cond} and not exists({so_against_quo})"""
-			.format(cond=cond, so_against_quo=so_against_quo),
-			(nowdate())
-		)
+		"""UPDATE `tabQuotation` qo SET qo.status = 'Expired' WHERE {cond} and not exists({so_against_quo})""".format(
+			cond=cond, so_against_quo=so_against_quo
+		),
+		(nowdate()),
+	)
+
 
 @frappe.whitelist()
 def make_sales_invoice(source_name, target_doc=None):
 	return _make_sales_invoice(source_name, target_doc)
 
+
 def _make_sales_invoice(source_name, target_doc=None, ignore_permissions=False):
 	customer = _make_customer(source_name, ignore_permissions)
 
@@ -249,54 +262,52 @@
 		target.cost_center = None
 		target.stock_qty = flt(obj.qty) * flt(obj.conversion_factor)
 
-	doclist = get_mapped_doc("Quotation", source_name, {
-			"Quotation": {
-				"doctype": "Sales Invoice",
-				"validation": {
-					"docstatus": ["=", 1]
-				}
-			},
-			"Quotation Item": {
-				"doctype": "Sales Invoice Item",
-				"postprocess": update_item
-			},
-			"Sales Taxes and Charges": {
-				"doctype": "Sales Taxes and Charges",
-				"add_if_empty": True
-			},
-			"Sales Team": {
-				"doctype": "Sales Team",
-				"add_if_empty": True
-			}
-		}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
+	doclist = get_mapped_doc(
+		"Quotation",
+		source_name,
+		{
+			"Quotation": {"doctype": "Sales Invoice", "validation": {"docstatus": ["=", 1]}},
+			"Quotation Item": {"doctype": "Sales Invoice Item", "postprocess": update_item},
+			"Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "add_if_empty": True},
+			"Sales Team": {"doctype": "Sales Team", "add_if_empty": True},
+		},
+		target_doc,
+		set_missing_values,
+		ignore_permissions=ignore_permissions,
+	)
 
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 
 	return doclist
 
-def _make_customer(source_name, ignore_permissions=False):
-	quotation = frappe.db.get_value("Quotation",
-		source_name, ["order_type", "party_name", "customer_name"], as_dict=1)
 
-	if quotation and quotation.get('party_name'):
+def _make_customer(source_name, ignore_permissions=False):
+	quotation = frappe.db.get_value(
+		"Quotation", source_name, ["order_type", "party_name", "customer_name"], as_dict=1
+	)
+
+	if quotation and quotation.get("party_name"):
 		if not frappe.db.exists("Customer", quotation.get("party_name")):
 			lead_name = quotation.get("party_name")
-			customer_name = frappe.db.get_value("Customer", {"lead_name": lead_name},
-				["name", "customer_name"], as_dict=True)
+			customer_name = frappe.db.get_value(
+				"Customer", {"lead_name": lead_name}, ["name", "customer_name"], as_dict=True
+			)
 			if not customer_name:
 				from erpnext.crm.doctype.lead.lead import _make_customer
+
 				customer_doclist = _make_customer(lead_name, ignore_permissions=ignore_permissions)
 				customer = frappe.get_doc(customer_doclist)
 				customer.flags.ignore_permissions = ignore_permissions
 				if quotation.get("party_name") == "Shopping Cart":
-					customer.customer_group = frappe.db.get_value("E Commerce Settings", None,
-						"default_customer_group")
+					customer.customer_group = frappe.db.get_value(
+						"E Commerce Settings", None, "default_customer_group"
+					)
 
 				try:
 					customer.insert()
 					return customer
 				except frappe.NameError:
-					if frappe.defaults.get_global_default('cust_master_name') == "Customer Name":
+					if frappe.defaults.get_global_default("cust_master_name") == "Customer Name":
 						customer.run_method("autoname")
 						customer.name += "-" + lead_name
 						customer.insert()
@@ -304,12 +315,14 @@
 					else:
 						raise
 				except frappe.MandatoryError as e:
-					mandatory_fields = e.args[0].split(':')[1].split(',')
+					mandatory_fields = e.args[0].split(":")[1].split(",")
 					mandatory_fields = [customer.meta.get_label(field.strip()) for field in mandatory_fields]
 
 					frappe.local.message_log = []
 					lead_link = frappe.utils.get_link_to_form("Lead", lead_name)
-					message = _("Could not auto create Customer due to the following missing mandatory field(s):") + "<br>"
+					message = (
+						_("Could not auto create Customer due to the following missing mandatory field(s):") + "<br>"
+					)
 					message += "<br><ul><li>" + "</li><li>".join(mandatory_fields) + "</li></ul>"
 					message += _("Please create Customer from Lead {0}.").format(lead_link)
 
diff --git a/erpnext/selling/doctype/quotation/quotation_dashboard.py b/erpnext/selling/doctype/quotation/quotation_dashboard.py
index 0a1aad7..7bfa034 100644
--- a/erpnext/selling/doctype/quotation/quotation_dashboard.py
+++ b/erpnext/selling/doctype/quotation/quotation_dashboard.py
@@ -3,18 +3,12 @@
 
 def get_data():
 	return {
-		'fieldname': 'prevdoc_docname',
-		'non_standard_fieldnames': {
-			'Auto Repeat': 'reference_document',
+		"fieldname": "prevdoc_docname",
+		"non_standard_fieldnames": {
+			"Auto Repeat": "reference_document",
 		},
-		'transactions': [
-			{
-				'label': _('Sales Order'),
-				'items': ['Sales Order']
-			},
-			{
-				'label': _('Subscription'),
-				'items': ['Auto Repeat']
-			},
-		]
+		"transactions": [
+			{"label": _("Sales Order"), "items": ["Sales Order"]},
+			{"label": _("Subscription"), "items": ["Auto Repeat"]},
+		],
 	}
diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py
index a749d9e..b44fa5e 100644
--- a/erpnext/selling/doctype/quotation/test_quotation.py
+++ b/erpnext/selling/doctype/quotation/test_quotation.py
@@ -11,7 +11,7 @@
 class TestQuotation(FrappeTestCase):
 	def test_make_quotation_without_terms(self):
 		quotation = make_quotation(do_not_save=1)
-		self.assertFalse(quotation.get('payment_schedule'))
+		self.assertFalse(quotation.get("payment_schedule"))
 
 		quotation.insert()
 
@@ -28,7 +28,7 @@
 
 		sales_order = make_sales_order(quotation.name)
 
-		self.assertTrue(sales_order.get('payment_schedule'))
+		self.assertTrue(sales_order.get("payment_schedule"))
 
 	def test_make_sales_order_with_different_currency(self):
 		from erpnext.selling.doctype.quotation.quotation import make_sales_order
@@ -80,9 +80,7 @@
 		quotation = frappe.copy_doc(test_records[0])
 		quotation.transaction_date = nowdate()
 		quotation.valid_till = add_months(quotation.transaction_date, 1)
-		quotation.update(
-			{"payment_terms_template": "_Test Payment Term Template"}
-		)
+		quotation.update({"payment_terms_template": "_Test Payment Term Template"})
 		quotation.insert()
 
 		self.assertRaises(frappe.ValidationError, make_sales_order, quotation.name)
@@ -92,7 +90,9 @@
 		self.assertEqual(quotation.payment_schedule[0].payment_amount, 8906.00)
 		self.assertEqual(quotation.payment_schedule[0].due_date, quotation.transaction_date)
 		self.assertEqual(quotation.payment_schedule[1].payment_amount, 8906.00)
-		self.assertEqual(quotation.payment_schedule[1].due_date, add_days(quotation.transaction_date, 30))
+		self.assertEqual(
+			quotation.payment_schedule[1].due_date, add_days(quotation.transaction_date, 30)
+		)
 
 		sales_order = make_sales_order(quotation.name)
 
@@ -108,7 +108,7 @@
 		sales_order.insert()
 
 		# Remove any unknown taxes if applied
-		sales_order.set('taxes', [])
+		sales_order.set("taxes", [])
 		sales_order.save()
 
 		self.assertEqual(sales_order.payment_schedule[0].payment_amount, 8906.00)
@@ -137,11 +137,11 @@
 			make_sales_invoice,
 		)
 
-		rate_with_margin = flt((1500*18.75)/100 + 1500)
+		rate_with_margin = flt((1500 * 18.75) / 100 + 1500)
 
-		test_records[0]['items'][0]['price_list_rate'] = 1500
-		test_records[0]['items'][0]['margin_type'] = 'Percentage'
-		test_records[0]['items'][0]['margin_rate_or_amount'] = 18.75
+		test_records[0]["items"][0]["price_list_rate"] = 1500
+		test_records[0]["items"][0]["margin_type"] = "Percentage"
+		test_records[0]["items"][0]["margin_rate_or_amount"] = 18.75
 
 		quotation = frappe.copy_doc(test_records[0])
 		quotation.transaction_date = nowdate()
@@ -174,11 +174,9 @@
 	def test_create_two_quotations(self):
 		from erpnext.stock.doctype.item.test_item import make_item
 
-		first_item = make_item("_Test Laptop",
-							{"is_stock_item": 1})
+		first_item = make_item("_Test Laptop", {"is_stock_item": 1})
 
-		second_item = make_item("_Test CPU",
-							{"is_stock_item": 1})
+		second_item = make_item("_Test CPU", {"is_stock_item": 1})
 
 		qo_item1 = [
 			{
@@ -187,7 +185,7 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			}
 		]
 
@@ -197,7 +195,7 @@
 				"warehouse": "_Test Warehouse - _TC",
 				"qty": 2,
 				"rate": 300,
-				"conversion_factor": 1.0
+				"conversion_factor": 1.0,
 			}
 		]
 
@@ -209,17 +207,12 @@
 	def test_quotation_expiry(self):
 		from erpnext.selling.doctype.quotation.quotation import set_expired_status
 
-		quotation_item = [
-			{
-				"item_code": "_Test Item",
-				"warehouse":"",
-				"qty": 1,
-				"rate": 500
-			}
-		]
+		quotation_item = [{"item_code": "_Test Item", "warehouse": "", "qty": 1, "rate": 500}]
 
 		yesterday = add_days(nowdate(), -1)
-		expired_quotation = make_quotation(item_list=quotation_item, transaction_date=yesterday, do_not_submit=True)
+		expired_quotation = make_quotation(
+			item_list=quotation_item, transaction_date=yesterday, do_not_submit=True
+		)
 		expired_quotation.valid_till = yesterday
 		expired_quotation.save()
 		expired_quotation.submit()
@@ -236,24 +229,49 @@
 		make_item("_Test Bundle Item 1", {"is_stock_item": 1})
 		make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
 
 		quotation = make_quotation(item_code="_Test Product Bundle", qty=1, rate=100)
 		sales_order = make_sales_order(quotation.name)
 
-		quotation_item = [quotation.items[0].item_code, quotation.items[0].rate, quotation.items[0].qty, quotation.items[0].amount]
-		so_item = [sales_order.items[0].item_code, sales_order.items[0].rate, sales_order.items[0].qty, sales_order.items[0].amount]
+		quotation_item = [
+			quotation.items[0].item_code,
+			quotation.items[0].rate,
+			quotation.items[0].qty,
+			quotation.items[0].amount,
+		]
+		so_item = [
+			sales_order.items[0].item_code,
+			sales_order.items[0].rate,
+			sales_order.items[0].qty,
+			sales_order.items[0].amount,
+		]
 
 		self.assertEqual(quotation_item, so_item)
 
 		quotation_packed_items = [
-			[quotation.packed_items[0].parent_item, quotation.packed_items[0].item_code, quotation.packed_items[0].qty],
-			[quotation.packed_items[1].parent_item, quotation.packed_items[1].item_code, quotation.packed_items[1].qty]
+			[
+				quotation.packed_items[0].parent_item,
+				quotation.packed_items[0].item_code,
+				quotation.packed_items[0].qty,
+			],
+			[
+				quotation.packed_items[1].parent_item,
+				quotation.packed_items[1].item_code,
+				quotation.packed_items[1].qty,
+			],
 		]
 		so_packed_items = [
-			[sales_order.packed_items[0].parent_item, sales_order.packed_items[0].item_code, sales_order.packed_items[0].qty],
-			[sales_order.packed_items[1].parent_item, sales_order.packed_items[1].item_code, sales_order.packed_items[1].qty]
+			[
+				sales_order.packed_items[0].parent_item,
+				sales_order.packed_items[0].item_code,
+				sales_order.packed_items[0].qty,
+			],
+			[
+				sales_order.packed_items[1].parent_item,
+				sales_order.packed_items[1].item_code,
+				sales_order.packed_items[1].qty,
+			],
 		]
 
 		self.assertEqual(quotation_packed_items, so_packed_items)
@@ -266,8 +284,7 @@
 		bundle_item1 = make_item("_Test Bundle Item 1", {"is_stock_item": 1})
 		bundle_item2 = make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
 
 		bundle_item1.valuation_rate = 100
 		bundle_item1.save()
@@ -286,8 +303,7 @@
 		make_item("_Test Bundle Item 1", {"is_stock_item": 1})
 		make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
 
 		enable_calculate_bundle_price()
 
@@ -301,7 +317,9 @@
 
 		enable_calculate_bundle_price(enable=0)
 
-	def test_product_bundle_price_calculation_for_multiple_product_bundles_when_calculate_bundle_price_is_checked(self):
+	def test_product_bundle_price_calculation_for_multiple_product_bundles_when_calculate_bundle_price_is_checked(
+		self,
+	):
 		from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle
 		from erpnext.stock.doctype.item.test_item import make_item
 
@@ -311,10 +329,8 @@
 		make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 		make_item("_Test Bundle Item 3", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle 1",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
-		make_product_bundle("_Test Product Bundle 2",
-			["_Test Bundle Item 2", "_Test Bundle Item 3"])
+		make_product_bundle("_Test Product Bundle 1", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle 2", ["_Test Bundle Item 2", "_Test Bundle Item 3"])
 
 		enable_calculate_bundle_price()
 
@@ -325,7 +341,7 @@
 				"qty": 1,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			},
 			{
 				"item_code": "_Test Product Bundle 2",
@@ -333,8 +349,8 @@
 				"qty": 1,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
-			}
+				"supplier": "_Test Supplier",
+			},
 		]
 
 		quotation = make_quotation(item_list=item_list, do_not_submit=1)
@@ -347,7 +363,7 @@
 		expected_values = [300, 500]
 
 		for item in quotation.items:
-			self.assertEqual(item.amount, expected_values[item.idx-1])
+			self.assertEqual(item.amount, expected_values[item.idx - 1])
 
 		enable_calculate_bundle_price(enable=0)
 
@@ -362,12 +378,9 @@
 		make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 		make_item("_Test Bundle Item 3", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle 1",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
-		make_product_bundle("_Test Product Bundle 2",
-			["_Test Bundle Item 2", "_Test Bundle Item 3"])
-		make_product_bundle("_Test Product Bundle 3",
-			["_Test Bundle Item 3", "_Test Bundle Item 1"])
+		make_product_bundle("_Test Product Bundle 1", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle 2", ["_Test Bundle Item 2", "_Test Bundle Item 3"])
+		make_product_bundle("_Test Product Bundle 3", ["_Test Bundle Item 3", "_Test Bundle Item 1"])
 
 		item_list = [
 			{
@@ -376,7 +389,7 @@
 				"qty": 1,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			},
 			{
 				"item_code": "_Test Product Bundle 2",
@@ -384,7 +397,7 @@
 				"qty": 1,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			},
 			{
 				"item_code": "_Test Product Bundle 3",
@@ -392,8 +405,8 @@
 				"qty": 1,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
-			}
+				"supplier": "_Test Supplier",
+			},
 		]
 
 		quotation = make_quotation(item_list=item_list, do_not_submit=1)
@@ -404,29 +417,26 @@
 			expected_index = id + 1
 			self.assertEqual(item.idx, expected_index)
 
-test_records = frappe.get_test_records('Quotation')
+
+test_records = frappe.get_test_records("Quotation")
+
 
 def enable_calculate_bundle_price(enable=1):
 	selling_settings = frappe.get_doc("Selling Settings")
 	selling_settings.editable_bundle_item_rates = enable
 	selling_settings.save()
 
+
 def get_quotation_dict(party_name=None, item_code=None):
 	if not party_name:
-		party_name = '_Test Customer'
+		party_name = "_Test Customer"
 	if not item_code:
-		item_code = '_Test Item'
+		item_code = "_Test Item"
 
 	return {
-		'doctype': 'Quotation',
-		'party_name': party_name,
-		'items': [
-			{
-				'item_code': item_code,
-				'qty': 1,
-				'rate': 100
-			}
-		]
+		"doctype": "Quotation",
+		"party_name": party_name,
+		"items": [{"item_code": item_code, "qty": 1, "rate": 100}],
 	}
 
 
@@ -450,13 +460,16 @@
 			qo.append("items", item)
 
 	else:
-		qo.append("items", {
-			"item_code": args.item or args.item_code or "_Test Item",
-			"warehouse": args.warehouse,
-			"qty": args.qty or 10,
-			"uom": args.uom or None,
-			"rate": args.rate or 100
-		})
+		qo.append(
+			"items",
+			{
+				"item_code": args.item or args.item_code or "_Test Item",
+				"warehouse": args.warehouse,
+				"qty": args.qty or 10,
+				"uom": args.uom or None,
+				"rate": args.rate or 100,
+			},
+		)
 
 	qo.delivery_date = add_days(qo.transaction_date, 10)
 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index b906ec0..d3b4286 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -27,11 +27,12 @@
 from erpnext.stock.doctype.item.item import get_item_defaults
 from erpnext.stock.stock_balance import get_reserved_qty, update_bin_qty
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
 
-class WarehouseRequired(frappe.ValidationError): pass
+
+class WarehouseRequired(frappe.ValidationError):
+	pass
+
 
 class SalesOrder(SellingController):
 	def __init__(self, *args, **kwargs):
@@ -48,20 +49,26 @@
 		self.validate_warehouse()
 		self.validate_drop_ship()
 		self.validate_serial_no_based_delivery()
-		validate_inter_company_party(self.doctype, self.customer, self.company, self.inter_company_order_reference)
+		validate_inter_company_party(
+			self.doctype, self.customer, self.company, self.inter_company_order_reference
+		)
 
 		if self.coupon_code:
 			from erpnext.accounts.doctype.pricing_rule.utils import validate_coupon_code
+
 			validate_coupon_code(self.coupon_code)
 
 		from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
+
 		make_packing_list(self)
 
 		self.validate_with_previous_doc()
 		self.set_status()
 
-		if not self.billing_status: self.billing_status = 'Not Billed'
-		if not self.delivery_status: self.delivery_status = 'Not Delivered'
+		if not self.billing_status:
+			self.billing_status = "Not Billed"
+		if not self.delivery_status:
+			self.delivery_status = "Not Delivered"
 
 		self.reset_default_field_value("set_warehouse", "items", "warehouse")
 
@@ -70,55 +77,82 @@
 		if self.po_date and not self.skip_delivery_note:
 			for d in self.get("items"):
 				if d.delivery_date and getdate(self.po_date) > getdate(d.delivery_date):
-					frappe.throw(_("Row #{0}: Expected Delivery Date cannot be before Purchase Order Date")
-						.format(d.idx))
+					frappe.throw(
+						_("Row #{0}: Expected Delivery Date cannot be before Purchase Order Date").format(d.idx)
+					)
 
 		if self.po_no and self.customer and not self.skip_delivery_note:
-			so = frappe.db.sql("select name from `tabSales Order` \
+			so = frappe.db.sql(
+				"select name from `tabSales Order` \
 				where ifnull(po_no, '') = %s and name != %s and docstatus < 2\
-				and customer = %s", (self.po_no, self.name, self.customer))
-			if so and so[0][0] and not cint(frappe.db.get_single_value("Selling Settings",
-				"allow_against_multiple_purchase_orders")):
-				frappe.msgprint(_("Warning: Sales Order {0} already exists against Customer's Purchase Order {1}").format(so[0][0], self.po_no))
+				and customer = %s",
+				(self.po_no, self.name, self.customer),
+			)
+			if (
+				so
+				and so[0][0]
+				and not cint(
+					frappe.db.get_single_value("Selling Settings", "allow_against_multiple_purchase_orders")
+				)
+			):
+				frappe.msgprint(
+					_("Warning: Sales Order {0} already exists against Customer's Purchase Order {1}").format(
+						so[0][0], self.po_no
+					)
+				)
 
 	def validate_for_items(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 
 			# used for production plan
 			d.transaction_date = self.transaction_date
 
-			tot_avail_qty = frappe.db.sql("select projected_qty from `tabBin` \
-				where item_code = %s and warehouse = %s", (d.item_code, d.warehouse))
+			tot_avail_qty = frappe.db.sql(
+				"select projected_qty from `tabBin` \
+				where item_code = %s and warehouse = %s",
+				(d.item_code, d.warehouse),
+			)
 			d.projected_qty = tot_avail_qty and flt(tot_avail_qty[0][0]) or 0
 
 	def product_bundle_has_stock_item(self, product_bundle):
 		"""Returns true if product bundle has stock item"""
-		ret = len(frappe.db.sql("""select i.name from tabItem i, `tabProduct Bundle Item` pbi
-			where pbi.parent = %s and pbi.item_code = i.name and i.is_stock_item = 1""", product_bundle))
+		ret = len(
+			frappe.db.sql(
+				"""select i.name from tabItem i, `tabProduct Bundle Item` pbi
+			where pbi.parent = %s and pbi.item_code = i.name and i.is_stock_item = 1""",
+				product_bundle,
+			)
+		)
 		return ret
 
 	def validate_sales_mntc_quotation(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.prevdoc_docname:
-				res = frappe.db.sql("select name from `tabQuotation` where name=%s and order_type = %s",
-					(d.prevdoc_docname, self.order_type))
+				res = frappe.db.sql(
+					"select name from `tabQuotation` where name=%s and order_type = %s",
+					(d.prevdoc_docname, self.order_type),
+				)
 				if not res:
-					frappe.msgprint(_("Quotation {0} not of type {1}")
-						.format(d.prevdoc_docname, self.order_type))
+					frappe.msgprint(_("Quotation {0} not of type {1}").format(d.prevdoc_docname, self.order_type))
 
 	def validate_delivery_date(self):
-		if self.order_type == 'Sales' and not self.skip_delivery_note:
+		if self.order_type == "Sales" and not self.skip_delivery_note:
 			delivery_date_list = [d.delivery_date for d in self.get("items") if d.delivery_date]
 			max_delivery_date = max(delivery_date_list) if delivery_date_list else None
-			if (max_delivery_date and not self.delivery_date) or (max_delivery_date and getdate(self.delivery_date) != getdate(max_delivery_date)):
+			if (max_delivery_date and not self.delivery_date) or (
+				max_delivery_date and getdate(self.delivery_date) != getdate(max_delivery_date)
+			):
 				self.delivery_date = max_delivery_date
 			if self.delivery_date:
 				for d in self.get("items"):
 					if not d.delivery_date:
 						d.delivery_date = self.delivery_date
 					if getdate(self.transaction_date) > getdate(d.delivery_date):
-						frappe.msgprint(_("Expected Delivery Date should be after Sales Order Date"),
-							indicator='orange', title=_('Warning'))
+						frappe.msgprint(
+							_("Expected Delivery Date should be after Sales Order Date"),
+							indicator="orange",
+							title=_("Warning"),
+						)
 			else:
 				frappe.throw(_("Please enter Delivery Date"))
 
@@ -126,47 +160,56 @@
 
 	def validate_proj_cust(self):
 		if self.project and self.customer_name:
-			res = frappe.db.sql("""select name from `tabProject` where name = %s
+			res = frappe.db.sql(
+				"""select name from `tabProject` where name = %s
 				and (customer = %s or ifnull(customer,'')='')""",
-					(self.project, self.customer))
+				(self.project, self.customer),
+			)
 			if not res:
-				frappe.throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project))
+				frappe.throw(
+					_("Customer {0} does not belong to project {1}").format(self.customer, self.project)
+				)
 
 	def validate_warehouse(self):
 		super(SalesOrder, self).validate_warehouse()
 
 		for d in self.get("items"):
-			if (frappe.get_cached_value("Item", d.item_code, "is_stock_item") == 1 or
-				(self.has_product_bundle(d.item_code) and self.product_bundle_has_stock_item(d.item_code))) \
-				and not d.warehouse and not cint(d.delivered_by_supplier):
-				frappe.throw(_("Delivery warehouse required for stock item {0}").format(d.item_code),
-					WarehouseRequired)
+			if (
+				(
+					frappe.get_cached_value("Item", d.item_code, "is_stock_item") == 1
+					or (self.has_product_bundle(d.item_code) and self.product_bundle_has_stock_item(d.item_code))
+				)
+				and not d.warehouse
+				and not cint(d.delivered_by_supplier)
+			):
+				frappe.throw(
+					_("Delivery warehouse required for stock item {0}").format(d.item_code), WarehouseRequired
+				)
 
 	def validate_with_previous_doc(self):
-		super(SalesOrder, self).validate_with_previous_doc({
-			"Quotation": {
-				"ref_dn_field": "prevdoc_docname",
-				"compare_fields": [["company", "="]]
-			}
-		})
-
+		super(SalesOrder, self).validate_with_previous_doc(
+			{"Quotation": {"ref_dn_field": "prevdoc_docname", "compare_fields": [["company", "="]]}}
+		)
 
 	def update_enquiry_status(self, prevdoc, flag):
-		enq = frappe.db.sql("select t2.prevdoc_docname from `tabQuotation` t1, `tabQuotation Item` t2 where t2.parent = t1.name and t1.name=%s", prevdoc)
+		enq = frappe.db.sql(
+			"select t2.prevdoc_docname from `tabQuotation` t1, `tabQuotation Item` t2 where t2.parent = t1.name and t1.name=%s",
+			prevdoc,
+		)
 		if enq:
-			frappe.db.sql("update `tabOpportunity` set status = %s where name=%s",(flag,enq[0][0]))
+			frappe.db.sql("update `tabOpportunity` set status = %s where name=%s", (flag, enq[0][0]))
 
 	def update_prevdoc_status(self, flag=None):
 		for quotation in set(d.prevdoc_docname for d in self.get("items")):
 			if quotation:
 				doc = frappe.get_doc("Quotation", quotation)
-				if doc.docstatus==2:
+				if doc.docstatus == 2:
 					frappe.throw(_("Quotation {0} is cancelled").format(quotation))
 
 				doc.set_status(update=True)
 
 	def validate_drop_ship(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.delivered_by_supplier and not d.supplier:
 				frappe.throw(_("Row #{0}: Set Supplier for item {1}").format(d.idx, d.item_code))
 
@@ -174,41 +217,47 @@
 		self.check_credit_limit()
 		self.update_reserved_qty()
 
-		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype, self.company, self.base_grand_total, self)
+		frappe.get_doc("Authorization Control").validate_approving_authority(
+			self.doctype, self.company, self.base_grand_total, self
+		)
 		self.update_project()
-		self.update_prevdoc_status('submit')
+		self.update_prevdoc_status("submit")
 
 		self.update_blanket_order()
 
 		update_linked_doc(self.doctype, self.name, self.inter_company_order_reference)
 		if self.coupon_code:
 			from erpnext.accounts.doctype.pricing_rule.utils import update_coupon_code_count
-			update_coupon_code_count(self.coupon_code,'used')
+
+			update_coupon_code_count(self.coupon_code, "used")
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
 		super(SalesOrder, self).on_cancel()
 
 		# Cannot cancel closed SO
-		if self.status == 'Closed':
+		if self.status == "Closed":
 			frappe.throw(_("Closed order cannot be cancelled. Unclose to cancel."))
 
 		self.check_nextdoc_docstatus()
 		self.update_reserved_qty()
 		self.update_project()
-		self.update_prevdoc_status('cancel')
+		self.update_prevdoc_status("cancel")
 
-		frappe.db.set(self, 'status', 'Cancelled')
+		frappe.db.set(self, "status", "Cancelled")
 
 		self.update_blanket_order()
 
 		unlink_inter_company_doc(self.doctype, self.name, self.inter_company_order_reference)
 		if self.coupon_code:
 			from erpnext.accounts.doctype.pricing_rule.utils import update_coupon_code_count
-			update_coupon_code_count(self.coupon_code,'cancelled')
+
+			update_coupon_code_count(self.coupon_code, "cancelled")
 
 	def update_project(self):
-		if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') != "Each Transaction":
+		if (
+			frappe.db.get_single_value("Selling Settings", "sales_update_frequency") != "Each Transaction"
+		):
 			return
 
 		if self.project:
@@ -219,26 +268,34 @@
 	def check_credit_limit(self):
 		# if bypass credit limit check is set to true (1) at sales order level,
 		# then we need not to check credit limit and vise versa
-		if not cint(frappe.db.get_value("Customer Credit Limit",
-			{'parent': self.customer, 'parenttype': 'Customer', 'company': self.company},
-			"bypass_credit_limit_check")):
+		if not cint(
+			frappe.db.get_value(
+				"Customer Credit Limit",
+				{"parent": self.customer, "parenttype": "Customer", "company": self.company},
+				"bypass_credit_limit_check",
+			)
+		):
 			check_credit_limit(self.customer, self.company)
 
 	def check_nextdoc_docstatus(self):
-		linked_invoices = frappe.db.sql_list("""select distinct t1.name
+		linked_invoices = frappe.db.sql_list(
+			"""select distinct t1.name
 			from `tabSales Invoice` t1,`tabSales Invoice Item` t2
 			where t1.name = t2.parent and t2.sales_order = %s and t1.docstatus = 0""",
-			self.name)
+			self.name,
+		)
 
 		if linked_invoices:
 			linked_invoices = [get_link_to_form("Sales Invoice", si) for si in linked_invoices]
-			frappe.throw(_("Sales Invoice {0} must be deleted before cancelling this Sales Order")
-				.format(", ".join(linked_invoices)))
+			frappe.throw(
+				_("Sales Invoice {0} must be deleted before cancelling this Sales Order").format(
+					", ".join(linked_invoices)
+				)
+			)
 
 	def check_modified_date(self):
 		mod_db = frappe.db.get_value("Sales Order", self.name, "modified")
-		date_diff = frappe.db.sql("select TIMEDIFF('%s', '%s')" %
-			( mod_db, cstr(self.modified)))
+		date_diff = frappe.db.sql("select TIMEDIFF('%s', '%s')" % (mod_db, cstr(self.modified)))
 		if date_diff and date_diff[0][0]:
 			frappe.throw(_("{0} {1} has been modified. Please refresh.").format(self.doctype, self.name))
 
@@ -252,10 +309,15 @@
 	def update_reserved_qty(self, so_item_rows=None):
 		"""update requested qty (before ordered_qty is updated)"""
 		item_wh_list = []
+
 		def _valid_for_reserve(item_code, warehouse):
-			if item_code and warehouse and [item_code, warehouse] not in item_wh_list \
-				and frappe.get_cached_value("Item", item_code, "is_stock_item"):
-					item_wh_list.append([item_code, warehouse])
+			if (
+				item_code
+				and warehouse
+				and [item_code, warehouse] not in item_wh_list
+				and frappe.get_cached_value("Item", item_code, "is_stock_item")
+			):
+				item_wh_list.append([item_code, warehouse])
 
 		for d in self.get("items"):
 			if (not so_item_rows or d.name in so_item_rows) and not d.delivered_by_supplier:
@@ -267,9 +329,7 @@
 					_valid_for_reserve(d.item_code, d.warehouse)
 
 		for item_code, warehouse in item_wh_list:
-			update_bin_qty(item_code, warehouse, {
-				"reserved_qty": get_reserved_qty(item_code, warehouse)
-			})
+			update_bin_qty(item_code, warehouse, {"reserved_qty": get_reserved_qty(item_code, warehouse)})
 
 	def on_update(self):
 		pass
@@ -286,13 +346,18 @@
 
 		for item in self.items:
 			if item.supplier:
-				supplier = frappe.db.get_value("Sales Order Item", {"parent": self.name, "item_code": item.item_code},
-					"supplier")
+				supplier = frappe.db.get_value(
+					"Sales Order Item", {"parent": self.name, "item_code": item.item_code}, "supplier"
+				)
 				if item.ordered_qty > 0.0 and item.supplier != supplier:
-					exc_list.append(_("Row #{0}: Not allowed to change Supplier as Purchase Order already exists").format(item.idx))
+					exc_list.append(
+						_("Row #{0}: Not allowed to change Supplier as Purchase Order already exists").format(
+							item.idx
+						)
+					)
 
 		if exc_list:
-			frappe.throw('\n'.join(exc_list))
+			frappe.throw("\n".join(exc_list))
 
 	def update_delivery_status(self):
 		"""Update delivery status from Purchase Order for drop shipping"""
@@ -300,13 +365,16 @@
 
 		for item in self.items:
 			if item.delivered_by_supplier:
-				item_delivered_qty  = frappe.db.sql("""select sum(qty)
+				item_delivered_qty = frappe.db.sql(
+					"""select sum(qty)
 					from `tabPurchase Order Item` poi, `tabPurchase Order` po
 					where poi.sales_order_item = %s
 						and poi.item_code = %s
 						and poi.parent = po.name
 						and po.docstatus = 1
-						and po.status = 'Delivered'""", (item.name, item.item_code))
+						and po.status = 'Delivered'""",
+					(item.name, item.item_code),
+				)
 
 				item_delivered_qty = item_delivered_qty[0][0] if item_delivered_qty else 0
 				item.db_set("delivered_qty", flt(item_delivered_qty), update_modified=False)
@@ -315,9 +383,7 @@
 			tot_qty += item.qty
 
 		if tot_qty != 0:
-			self.db_set("per_delivered", flt(delivered_qty/tot_qty) * 100,
-				update_modified=False)
-
+			self.db_set("per_delivered", flt(delivered_qty / tot_qty) * 100, update_modified=False)
 
 	def set_indicator(self):
 		"""Set indicator for portal"""
@@ -335,49 +401,62 @@
 
 	@frappe.whitelist()
 	def get_work_order_items(self, for_raw_material_request=0):
-		'''Returns items with BOM that already do not have a linked work order'''
+		"""Returns items with BOM that already do not have a linked work order"""
 		items = []
 		item_codes = [i.item_code for i in self.items]
-		product_bundle_parents = [pb.new_item_code for pb in frappe.get_all("Product Bundle", {"new_item_code": ["in", item_codes]}, ["new_item_code"])]
+		product_bundle_parents = [
+			pb.new_item_code
+			for pb in frappe.get_all(
+				"Product Bundle", {"new_item_code": ["in", item_codes]}, ["new_item_code"]
+			)
+		]
 
 		for table in [self.items, self.packed_items]:
 			for i in table:
 				bom = get_default_bom_item(i.item_code)
-				stock_qty = i.qty if i.doctype == 'Packed Item' else i.stock_qty
+				stock_qty = i.qty if i.doctype == "Packed Item" else i.stock_qty
 				if not for_raw_material_request:
-					total_work_order_qty = flt(frappe.db.sql('''select sum(qty) from `tabWork Order`
-						where production_item=%s and sales_order=%s and sales_order_item = %s and docstatus<2''', (i.item_code, self.name, i.name))[0][0])
+					total_work_order_qty = flt(
+						frappe.db.sql(
+							"""select sum(qty) from `tabWork Order`
+						where production_item=%s and sales_order=%s and sales_order_item = %s and docstatus<2""",
+							(i.item_code, self.name, i.name),
+						)[0][0]
+					)
 					pending_qty = stock_qty - total_work_order_qty
 				else:
 					pending_qty = stock_qty
 
 				if pending_qty and i.item_code not in product_bundle_parents:
 					if bom:
-						items.append(dict(
-							name= i.name,
-							item_code= i.item_code,
-							description= i.description,
-							bom = bom,
-							warehouse = i.warehouse,
-							pending_qty = pending_qty,
-							required_qty = pending_qty if for_raw_material_request else 0,
-							sales_order_item = i.name
-						))
+						items.append(
+							dict(
+								name=i.name,
+								item_code=i.item_code,
+								description=i.description,
+								bom=bom,
+								warehouse=i.warehouse,
+								pending_qty=pending_qty,
+								required_qty=pending_qty if for_raw_material_request else 0,
+								sales_order_item=i.name,
+							)
+						)
 					else:
-						items.append(dict(
-							name= i.name,
-							item_code= i.item_code,
-							description= i.description,
-							bom = '',
-							warehouse = i.warehouse,
-							pending_qty = pending_qty,
-							required_qty = pending_qty if for_raw_material_request else 0,
-							sales_order_item = i.name
-						))
+						items.append(
+							dict(
+								name=i.name,
+								item_code=i.item_code,
+								description=i.description,
+								bom="",
+								warehouse=i.warehouse,
+								pending_qty=pending_qty,
+								required_qty=pending_qty if for_raw_material_request else 0,
+								sales_order_item=i.name,
+							)
+						)
 		return items
 
 	def on_recurring(self, reference_doc, auto_repeat_doc):
-
 		def _get_delivery_date(ref_doc_delivery_date, red_doc_transaction_date, transaction_date):
 			delivery_date = auto_repeat_doc.get_next_schedule_date(schedule_date=ref_doc_delivery_date)
 
@@ -387,15 +466,26 @@
 
 			return delivery_date
 
-		self.set("delivery_date", _get_delivery_date(reference_doc.delivery_date,
-			reference_doc.transaction_date, self.transaction_date ))
+		self.set(
+			"delivery_date",
+			_get_delivery_date(
+				reference_doc.delivery_date, reference_doc.transaction_date, self.transaction_date
+			),
+		)
 
 		for d in self.get("items"):
-			reference_delivery_date = frappe.db.get_value("Sales Order Item",
-				{"parent": reference_doc.name, "item_code": d.item_code, "idx": d.idx}, "delivery_date")
+			reference_delivery_date = frappe.db.get_value(
+				"Sales Order Item",
+				{"parent": reference_doc.name, "item_code": d.item_code, "idx": d.idx},
+				"delivery_date",
+			)
 
-			d.set("delivery_date", _get_delivery_date(reference_delivery_date,
-				reference_doc.transaction_date, self.transaction_date))
+			d.set(
+				"delivery_date",
+				_get_delivery_date(
+					reference_delivery_date, reference_doc.transaction_date, self.transaction_date
+				),
+			)
 
 	def validate_serial_no_based_delivery(self):
 		reserved_items = []
@@ -403,32 +493,52 @@
 		for item in self.items:
 			if item.ensure_delivery_based_on_produced_serial_no:
 				if item.item_code in normal_items:
-					frappe.throw(_("Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No.").format(item.item_code))
+					frappe.throw(
+						_(
+							"Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No."
+						).format(item.item_code)
+					)
 				if item.item_code not in reserved_items:
 					if not frappe.get_cached_value("Item", item.item_code, "has_serial_no"):
-						frappe.throw(_("Item {0} has no Serial No. Only serilialized items can have delivery based on Serial No").format(item.item_code))
+						frappe.throw(
+							_(
+								"Item {0} has no Serial No. Only serilialized items can have delivery based on Serial No"
+							).format(item.item_code)
+						)
 					if not frappe.db.exists("BOM", {"item": item.item_code, "is_active": 1}):
-						frappe.throw(_("No active BOM found for item {0}. Delivery by Serial No cannot be ensured").format(item.item_code))
+						frappe.throw(
+							_("No active BOM found for item {0}. Delivery by Serial No cannot be ensured").format(
+								item.item_code
+							)
+						)
 				reserved_items.append(item.item_code)
 			else:
 				normal_items.append(item.item_code)
 
-			if not item.ensure_delivery_based_on_produced_serial_no and \
-				item.item_code in reserved_items:
-				frappe.throw(_("Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No.").format(item.item_code))
+			if not item.ensure_delivery_based_on_produced_serial_no and item.item_code in reserved_items:
+				frappe.throw(
+					_(
+						"Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No."
+					).format(item.item_code)
+				)
+
 
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Orders'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Orders"),
+		}
+	)
 
 	return list_context
 
+
 @frappe.whitelist()
 def close_or_unclose_sales_orders(names, status):
 	if not frappe.has_permission("Sales Order", "write"):
@@ -439,23 +549,32 @@
 		so = frappe.get_doc("Sales Order", name)
 		if so.docstatus == 1:
 			if status == "Closed":
-				if so.status not in ("Cancelled", "Closed") and (so.per_delivered < 100 or so.per_billed < 100):
+				if so.status not in ("Cancelled", "Closed") and (
+					so.per_delivered < 100 or so.per_billed < 100
+				):
 					so.update_status(status)
 			else:
 				if so.status == "Closed":
-					so.update_status('Draft')
+					so.update_status("Draft")
 			so.update_blanket_order()
 
 	frappe.local.message_log = []
 
+
 def get_requested_item_qty(sales_order):
-	return frappe._dict(frappe.db.sql("""
+	return frappe._dict(
+		frappe.db.sql(
+			"""
 		select sales_order_item, sum(qty)
 		from `tabMaterial Request Item`
 		where docstatus = 1
 			and sales_order = %s
 		group by sales_order_item
-	""", sales_order))
+	""",
+			sales_order,
+		)
+	)
+
 
 @frappe.whitelist()
 def make_material_request(source_name, target_doc=None):
@@ -468,55 +587,56 @@
 		target.qty = qty - requested_item_qty.get(source.name, 0)
 		target.stock_qty = flt(target.qty) * flt(target.conversion_factor)
 
-	doc = get_mapped_doc("Sales Order", source_name, {
-		"Sales Order": {
-			"doctype": "Material Request",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Packed Item": {
-			"doctype": "Material Request Item",
-			"field_map": {
-				"parent": "sales_order",
-				"uom": "stock_uom"
+	doc = get_mapped_doc(
+		"Sales Order",
+		source_name,
+		{
+			"Sales Order": {"doctype": "Material Request", "validation": {"docstatus": ["=", 1]}},
+			"Packed Item": {
+				"doctype": "Material Request Item",
+				"field_map": {"parent": "sales_order", "uom": "stock_uom"},
+				"postprocess": update_item,
 			},
-			"postprocess": update_item
-		},
-		"Sales Order Item": {
-			"doctype": "Material Request Item",
-			"field_map": {
-				"name": "sales_order_item",
-				"parent": "sales_order"
+			"Sales Order Item": {
+				"doctype": "Material Request Item",
+				"field_map": {"name": "sales_order_item", "parent": "sales_order"},
+				"condition": lambda doc: not frappe.db.exists("Product Bundle", doc.item_code)
+				and doc.stock_qty > requested_item_qty.get(doc.name, 0),
+				"postprocess": update_item,
 			},
-			"condition": lambda doc: not frappe.db.exists('Product Bundle', doc.item_code) and doc.stock_qty > requested_item_qty.get(doc.name, 0),
-			"postprocess": update_item
-		}
-	}, target_doc)
+		},
+		target_doc,
+	)
 
 	return doc
 
+
 @frappe.whitelist()
 def make_project(source_name, target_doc=None):
 	def postprocess(source, doc):
 		doc.project_type = "External"
 		doc.project_name = source.name
 
-	doc = get_mapped_doc("Sales Order", source_name, {
-		"Sales Order": {
-			"doctype": "Project",
-			"validation": {
-				"docstatus": ["=", 1]
+	doc = get_mapped_doc(
+		"Sales Order",
+		source_name,
+		{
+			"Sales Order": {
+				"doctype": "Project",
+				"validation": {"docstatus": ["=", 1]},
+				"field_map": {
+					"name": "sales_order",
+					"base_grand_total": "estimated_costing",
+				},
 			},
-			"field_map":{
-				"name" : "sales_order",
-				"base_grand_total" : "estimated_costing",
-			}
 		},
-	}, target_doc, postprocess)
+		target_doc,
+		postprocess,
+	)
 
 	return doc
 
+
 @frappe.whitelist()
 def make_delivery_note(source_name, target_doc=None, skip_item_mapping=False):
 	def set_missing_values(source, target):
@@ -525,13 +645,13 @@
 		target.run_method("calculate_taxes_and_totals")
 
 		if source.company_address:
-			target.update({'company_address': source.company_address})
+			target.update({"company_address": source.company_address})
 		else:
 			# set company address
 			target.update(get_company_address(target.company))
 
 		if target.company_address:
-			target.update(get_fetch_values("Delivery Note", 'company_address', target.company_address))
+			target.update(get_fetch_values("Delivery Note", "company_address", target.company_address))
 
 	def update_item(source, target, source_parent):
 		target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate)
@@ -542,34 +662,26 @@
 		item_group = get_item_group_defaults(target.item_code, source_parent.company)
 
 		if item:
-			target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") \
-				or item.get("buying_cost_center") \
+			target.cost_center = (
+				frappe.db.get_value("Project", source_parent.project, "cost_center")
+				or item.get("buying_cost_center")
 				or item_group.get("buying_cost_center")
+			)
 
 	mapper = {
-		"Sales Order": {
-			"doctype": "Delivery Note",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Sales Taxes and Charges": {
-			"doctype": "Sales Taxes and Charges",
-			"add_if_empty": True
-		},
-		"Sales Team": {
-			"doctype": "Sales Team",
-			"add_if_empty": True
-		}
+		"Sales Order": {"doctype": "Delivery Note", "validation": {"docstatus": ["=", 1]}},
+		"Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "add_if_empty": True},
+		"Sales Team": {"doctype": "Sales Team", "add_if_empty": True},
 	}
 
 	if not skip_item_mapping:
+
 		def condition(doc):
 			# make_mapped_doc sets js `args` into `frappe.flags.args`
 			if frappe.flags.args and frappe.flags.args.delivery_dates:
 				if cstr(doc.delivery_date) not in frappe.flags.args.delivery_dates:
 					return False
-			return abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
+			return abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier != 1
 
 		mapper["Sales Order Item"] = {
 			"doctype": "Delivery Note Item",
@@ -579,20 +691,21 @@
 				"parent": "against_sales_order",
 			},
 			"postprocess": update_item,
-			"condition": condition
+			"condition": condition,
 		}
 
 	target_doc = get_mapped_doc("Sales Order", source_name, mapper, target_doc, set_missing_values)
 
-	target_doc.set_onload('ignore_price_list', True)
+	target_doc.set_onload("ignore_price_list", True)
 
 	return target_doc
 
+
 @frappe.whitelist()
 def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False):
 	def postprocess(source, target):
 		set_missing_values(source, target)
-		#Get the advance paid Journal Entries in Sales Invoice Advance
+		# Get the advance paid Journal Entries in Sales Invoice Advance
 		if target.get("allocate_advances_automatically"):
 			target.set_advances()
 
@@ -603,13 +716,13 @@
 		target.run_method("calculate_taxes_and_totals")
 
 		if source.company_address:
-			target.update({'company_address': source.company_address})
+			target.update({"company_address": source.company_address})
 		else:
 			# set company address
 			target.update(get_company_address(target.company))
 
 		if target.company_address:
-			target.update(get_fetch_values("Sales Invoice", 'company_address', target.company_address))
+			target.update(get_fetch_values("Sales Invoice", "company_address", target.company_address))
 
 		# set the redeem loyalty points if provided via shopping cart
 		if source.loyalty_points and source.order_type == "Shopping Cart":
@@ -618,108 +731,117 @@
 	def update_item(source, target, source_parent):
 		target.amount = flt(source.amount) - flt(source.billed_amt)
 		target.base_amount = target.amount * flt(source_parent.conversion_rate)
-		target.qty = target.amount / flt(source.rate) if (source.rate and source.billed_amt) else source.qty - source.returned_qty
+		target.qty = (
+			target.amount / flt(source.rate)
+			if (source.rate and source.billed_amt)
+			else source.qty - source.returned_qty
+		)
 
 		if source_parent.project:
 			target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center")
 		if target.item_code:
 			item = get_item_defaults(target.item_code, source_parent.company)
 			item_group = get_item_group_defaults(target.item_code, source_parent.company)
-			cost_center = item.get("selling_cost_center") \
-				or item_group.get("selling_cost_center")
+			cost_center = item.get("selling_cost_center") or item_group.get("selling_cost_center")
 
 			if cost_center:
 				target.cost_center = cost_center
 
-	doclist = get_mapped_doc("Sales Order", source_name, {
-		"Sales Order": {
-			"doctype": "Sales Invoice",
-			"field_map": {
-				"party_account_currency": "party_account_currency",
-				"payment_terms_template": "payment_terms_template"
+	doclist = get_mapped_doc(
+		"Sales Order",
+		source_name,
+		{
+			"Sales Order": {
+				"doctype": "Sales Invoice",
+				"field_map": {
+					"party_account_currency": "party_account_currency",
+					"payment_terms_template": "payment_terms_template",
+				},
+				"field_no_map": ["payment_terms_template"],
+				"validation": {"docstatus": ["=", 1]},
 			},
-			"field_no_map": ["payment_terms_template"],
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Sales Order Item": {
-			"doctype": "Sales Invoice Item",
-			"field_map": {
-				"name": "so_detail",
-				"parent": "sales_order",
+			"Sales Order Item": {
+				"doctype": "Sales Invoice Item",
+				"field_map": {
+					"name": "so_detail",
+					"parent": "sales_order",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: doc.qty
+				and (doc.base_amount == 0 or abs(doc.billed_amt) < abs(doc.amount)),
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: doc.qty and (doc.base_amount==0 or abs(doc.billed_amt) < abs(doc.amount))
+			"Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "add_if_empty": True},
+			"Sales Team": {"doctype": "Sales Team", "add_if_empty": True},
 		},
-		"Sales Taxes and Charges": {
-			"doctype": "Sales Taxes and Charges",
-			"add_if_empty": True
-		},
-		"Sales Team": {
-			"doctype": "Sales Team",
-			"add_if_empty": True
-		}
-	}, target_doc, postprocess, ignore_permissions=ignore_permissions)
+		target_doc,
+		postprocess,
+		ignore_permissions=ignore_permissions,
+	)
 
-	automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+	automatically_fetch_payment_terms = cint(
+		frappe.db.get_single_value("Accounts Settings", "automatically_fetch_payment_terms")
+	)
 	if automatically_fetch_payment_terms:
 		doclist.set_payment_schedule()
 
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_maintenance_schedule(source_name, target_doc=None):
-	maint_schedule = frappe.db.sql("""select t1.name
+	maint_schedule = frappe.db.sql(
+		"""select t1.name
 		from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2
-		where t2.parent=t1.name and t2.sales_order=%s and t1.docstatus=1""", source_name)
+		where t2.parent=t1.name and t2.sales_order=%s and t1.docstatus=1""",
+		source_name,
+	)
 
 	if not maint_schedule:
-		doclist = get_mapped_doc("Sales Order", source_name, {
-			"Sales Order": {
-				"doctype": "Maintenance Schedule",
-				"validation": {
-					"docstatus": ["=", 1]
-				}
+		doclist = get_mapped_doc(
+			"Sales Order",
+			source_name,
+			{
+				"Sales Order": {"doctype": "Maintenance Schedule", "validation": {"docstatus": ["=", 1]}},
+				"Sales Order Item": {
+					"doctype": "Maintenance Schedule Item",
+					"field_map": {"parent": "sales_order"},
+				},
 			},
-			"Sales Order Item": {
-				"doctype": "Maintenance Schedule Item",
-				"field_map": {
-					"parent": "sales_order"
-				}
-			}
-		}, target_doc)
+			target_doc,
+		)
 
 		return doclist
 
+
 @frappe.whitelist()
 def make_maintenance_visit(source_name, target_doc=None):
-	visit = frappe.db.sql("""select t1.name
+	visit = frappe.db.sql(
+		"""select t1.name
 		from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2
 		where t2.parent=t1.name and t2.prevdoc_docname=%s
-		and t1.docstatus=1 and t1.completion_status='Fully Completed'""", source_name)
+		and t1.docstatus=1 and t1.completion_status='Fully Completed'""",
+		source_name,
+	)
 
 	if not visit:
-		doclist = get_mapped_doc("Sales Order", source_name, {
-			"Sales Order": {
-				"doctype": "Maintenance Visit",
-				"validation": {
-					"docstatus": ["=", 1]
-				}
+		doclist = get_mapped_doc(
+			"Sales Order",
+			source_name,
+			{
+				"Sales Order": {"doctype": "Maintenance Visit", "validation": {"docstatus": ["=", 1]}},
+				"Sales Order Item": {
+					"doctype": "Maintenance Visit Purpose",
+					"field_map": {"parent": "prevdoc_docname", "parenttype": "prevdoc_doctype"},
+				},
 			},
-			"Sales Order Item": {
-				"doctype": "Maintenance Visit Purpose",
-				"field_map": {
-					"parent": "prevdoc_docname",
-					"parenttype": "prevdoc_doctype"
-				}
-			}
-		}, target_doc)
+			target_doc,
+		)
 
 		return doclist
 
+
 @frappe.whitelist()
 def get_events(start, end, filters=None):
 	"""Returns events for Gantt / Calendar view rendering.
@@ -729,9 +851,11 @@
 	:param filters: Filters (JSON).
 	"""
 	from frappe.desk.calendar import get_event_conditions
+
 	conditions = get_event_conditions("Sales Order", filters)
 
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		select
 			distinct `tabSales Order`.name, `tabSales Order`.customer_name, `tabSales Order`.status,
 			`tabSales Order`.delivery_status, `tabSales Order`.billing_status,
@@ -744,16 +868,21 @@
 			and (`tabSales Order Item`.delivery_date between %(start)s and %(end)s)
 			and `tabSales Order`.docstatus < 2
 			{conditions}
-		""".format(conditions=conditions), {
-			"start": start,
-			"end": end
-		}, as_dict=True, update={"allDay": 0})
+		""".format(
+			conditions=conditions
+		),
+		{"start": start, "end": end},
+		as_dict=True,
+		update={"allDay": 0},
+	)
 	return data
 
+
 @frappe.whitelist()
 def make_purchase_order_for_default_supplier(source_name, selected_items=None, target_doc=None):
 	"""Creates Purchase Order for each Supplier. Returns a list of doc objects."""
-	if not selected_items: return
+	if not selected_items:
+		return
 
 	if isinstance(selected_items, str):
 		selected_items = json.loads(selected_items)
@@ -769,7 +898,7 @@
 		if default_price_list:
 			target.buying_price_list = default_price_list
 
-		if any( item.delivered_by_supplier==1 for item in source.items):
+		if any(item.delivered_by_supplier == 1 for item in source.items):
 			if source.shipping_address_name:
 				target.shipping_address = source.shipping_address_name
 				target.shipping_address_display = source.shipping_address
@@ -792,59 +921,67 @@
 	def update_item(source, target, source_parent):
 		target.schedule_date = source.delivery_date
 		target.qty = flt(source.qty) - (flt(source.ordered_qty) / flt(source.conversion_factor))
-		target.stock_qty = (flt(source.stock_qty) - flt(source.ordered_qty))
+		target.stock_qty = flt(source.stock_qty) - flt(source.ordered_qty)
 		target.project = source_parent.project
 
-	suppliers = [item.get('supplier') for item in selected_items if item.get('supplier')]
-	suppliers = list(dict.fromkeys(suppliers)) # remove duplicates while preserving order
+	suppliers = [item.get("supplier") for item in selected_items if item.get("supplier")]
+	suppliers = list(dict.fromkeys(suppliers))  # remove duplicates while preserving order
 
-	items_to_map = [item.get('item_code') for item in selected_items if item.get('item_code')]
+	items_to_map = [item.get("item_code") for item in selected_items if item.get("item_code")]
 	items_to_map = list(set(items_to_map))
 
 	if not suppliers:
-		frappe.throw(_("Please set a Supplier against the Items to be considered in the Purchase Order."))
+		frappe.throw(
+			_("Please set a Supplier against the Items to be considered in the Purchase Order.")
+		)
 
 	purchase_orders = []
 	for supplier in suppliers:
-		doc = get_mapped_doc("Sales Order", source_name, {
-			"Sales Order": {
-				"doctype": "Purchase Order",
-				"field_no_map": [
-					"address_display",
-					"contact_display",
-					"contact_mobile",
-					"contact_email",
-					"contact_person",
-					"taxes_and_charges",
-					"shipping_address",
-					"terms"
-				],
-				"validation": {
-					"docstatus": ["=", 1]
-				}
+		doc = get_mapped_doc(
+			"Sales Order",
+			source_name,
+			{
+				"Sales Order": {
+					"doctype": "Purchase Order",
+					"field_no_map": [
+						"address_display",
+						"contact_display",
+						"contact_mobile",
+						"contact_email",
+						"contact_person",
+						"taxes_and_charges",
+						"shipping_address",
+						"terms",
+					],
+					"validation": {"docstatus": ["=", 1]},
+				},
+				"Sales Order Item": {
+					"doctype": "Purchase Order Item",
+					"field_map": [
+						["name", "sales_order_item"],
+						["parent", "sales_order"],
+						["stock_uom", "stock_uom"],
+						["uom", "uom"],
+						["conversion_factor", "conversion_factor"],
+						["delivery_date", "schedule_date"],
+					],
+					"field_no_map": [
+						"rate",
+						"price_list_rate",
+						"item_tax_template",
+						"discount_percentage",
+						"discount_amount",
+						"pricing_rules",
+					],
+					"postprocess": update_item,
+					"condition": lambda doc: doc.ordered_qty < doc.stock_qty
+					and doc.supplier == supplier
+					and doc.item_code in items_to_map,
+				},
 			},
-			"Sales Order Item": {
-				"doctype": "Purchase Order Item",
-				"field_map":  [
-					["name", "sales_order_item"],
-					["parent", "sales_order"],
-					["stock_uom", "stock_uom"],
-					["uom", "uom"],
-					["conversion_factor", "conversion_factor"],
-					["delivery_date", "schedule_date"]
-				],
-				"field_no_map": [
-					"rate",
-					"price_list_rate",
-					"item_tax_template",
-					"discount_percentage",
-					"discount_amount",
-					"pricing_rules"
-				],
-				"postprocess": update_item,
-				"condition": lambda doc: doc.ordered_qty < doc.stock_qty and doc.supplier == supplier and doc.item_code in items_to_map
-			}
-		}, target_doc, set_missing_values)
+			target_doc,
+			set_missing_values,
+		)
 
 		doc.insert()
 		frappe.db.commit()
@@ -852,14 +989,20 @@
 
 	return purchase_orders
 
+
 @frappe.whitelist()
 def make_purchase_order(source_name, selected_items=None, target_doc=None):
-	if not selected_items: return
+	if not selected_items:
+		return
 
 	if isinstance(selected_items, str):
 		selected_items = json.loads(selected_items)
 
-	items_to_map = [item.get('item_code') for item in selected_items if item.get('item_code') and item.get('item_code')]
+	items_to_map = [
+		item.get("item_code")
+		for item in selected_items
+		if item.get("item_code") and item.get("item_code")
+	]
 	items_to_map = list(set(items_to_map))
 
 	def set_missing_values(source, target):
@@ -876,86 +1019,89 @@
 	def update_item(source, target, source_parent):
 		target.schedule_date = source.delivery_date
 		target.qty = flt(source.qty) - (flt(source.ordered_qty) / flt(source.conversion_factor))
-		target.stock_qty = (flt(source.stock_qty) - flt(source.ordered_qty))
+		target.stock_qty = flt(source.stock_qty) - flt(source.ordered_qty)
 		target.project = source_parent.project
 
 	def update_item_for_packed_item(source, target, source_parent):
 		target.qty = flt(source.qty) - flt(source.ordered_qty)
 
 	# po = frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")})
-	doc = get_mapped_doc("Sales Order", source_name, {
-		"Sales Order": {
-			"doctype": "Purchase Order",
-			"field_no_map": [
-				"address_display",
-				"contact_display",
-				"contact_mobile",
-				"contact_email",
-				"contact_person",
-				"taxes_and_charges",
-				"shipping_address",
-				"terms"
-			],
-			"validation": {
-				"docstatus": ["=", 1]
-			}
+	doc = get_mapped_doc(
+		"Sales Order",
+		source_name,
+		{
+			"Sales Order": {
+				"doctype": "Purchase Order",
+				"field_no_map": [
+					"address_display",
+					"contact_display",
+					"contact_mobile",
+					"contact_email",
+					"contact_person",
+					"taxes_and_charges",
+					"shipping_address",
+					"terms",
+				],
+				"validation": {"docstatus": ["=", 1]},
+			},
+			"Sales Order Item": {
+				"doctype": "Purchase Order Item",
+				"field_map": [
+					["name", "sales_order_item"],
+					["parent", "sales_order"],
+					["stock_uom", "stock_uom"],
+					["uom", "uom"],
+					["conversion_factor", "conversion_factor"],
+					["delivery_date", "schedule_date"],
+				],
+				"field_no_map": [
+					"rate",
+					"price_list_rate",
+					"item_tax_template",
+					"discount_percentage",
+					"discount_amount",
+					"supplier",
+					"pricing_rules",
+				],
+				"postprocess": update_item,
+				"condition": lambda doc: doc.ordered_qty < doc.stock_qty
+				and doc.item_code in items_to_map
+				and not is_product_bundle(doc.item_code),
+			},
+			"Packed Item": {
+				"doctype": "Purchase Order Item",
+				"field_map": [
+					["name", "sales_order_packed_item"],
+					["parent", "sales_order"],
+					["uom", "uom"],
+					["conversion_factor", "conversion_factor"],
+					["parent_item", "product_bundle"],
+					["rate", "rate"],
+				],
+				"field_no_map": [
+					"price_list_rate",
+					"item_tax_template",
+					"discount_percentage",
+					"discount_amount",
+					"supplier",
+					"pricing_rules",
+				],
+				"postprocess": update_item_for_packed_item,
+				"condition": lambda doc: doc.parent_item in items_to_map,
+			},
 		},
-		"Sales Order Item": {
-			"doctype": "Purchase Order Item",
-			"field_map":  [
-				["name", "sales_order_item"],
-				["parent", "sales_order"],
-				["stock_uom", "stock_uom"],
-				["uom", "uom"],
-				["conversion_factor", "conversion_factor"],
-				["delivery_date", "schedule_date"]
-			],
-			"field_no_map": [
-				"rate",
-				"price_list_rate",
-				"item_tax_template",
-				"discount_percentage",
-				"discount_amount",
-				"supplier",
-				"pricing_rules"
-			],
-			"postprocess": update_item,
-			"condition": lambda doc: doc.ordered_qty < doc.stock_qty and doc.item_code in items_to_map and not is_product_bundle(doc.item_code)
-		},
-		"Packed Item": {
-			"doctype": "Purchase Order Item",
-			"field_map":  [
-				["name", "sales_order_packed_item"],
-				["parent", "sales_order"],
-				["uom", "uom"],
-				["conversion_factor", "conversion_factor"],
-				["parent_item", "product_bundle"],
-				["rate", "rate"]
-			],
-			"field_no_map": [
-				"price_list_rate",
-				"item_tax_template",
-				"discount_percentage",
-				"discount_amount",
-				"supplier",
-				"pricing_rules"
-			],
-			"postprocess": update_item_for_packed_item,
-			"condition": lambda doc: doc.parent_item in items_to_map
-		}
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
 	set_delivery_date(doc.items, source_name)
 
 	return doc
 
+
 def set_delivery_date(items, sales_order):
 	delivery_dates = frappe.get_all(
-		'Sales Order Item',
-		filters = {
-			'parent': sales_order
-		},
-		fields = ['delivery_date', 'item_code']
+		"Sales Order Item", filters={"parent": sales_order}, fields=["delivery_date", "item_code"]
 	)
 
 	delivery_by_item = frappe._dict()
@@ -966,13 +1112,15 @@
 		if item.product_bundle:
 			item.schedule_date = delivery_by_item[item.product_bundle]
 
+
 def is_product_bundle(item_code):
-	return frappe.db.exists('Product Bundle', item_code)
+	return frappe.db.exists("Product Bundle", item_code)
+
 
 @frappe.whitelist()
 def make_work_orders(items, sales_order, company, project=None):
-	'''Make Work Orders against the given Sales Order for the given `items`'''
-	items = json.loads(items).get('items')
+	"""Make Work Orders against the given Sales Order for the given `items`"""
+	items = json.loads(items).get("items")
 	out = []
 
 	for i in items:
@@ -981,18 +1129,20 @@
 		if not i.get("pending_qty"):
 			frappe.throw(_("Please select Qty against item {0}").format(i.get("item_code")))
 
-		work_order = frappe.get_doc(dict(
-			doctype='Work Order',
-			production_item=i['item_code'],
-			bom_no=i.get('bom'),
-			qty=i['pending_qty'],
-			company=company,
-			sales_order=sales_order,
-			sales_order_item=i['sales_order_item'],
-			project=project,
-			fg_warehouse=i['warehouse'],
-			description=i['description']
-		)).insert()
+		work_order = frappe.get_doc(
+			dict(
+				doctype="Work Order",
+				production_item=i["item_code"],
+				bom_no=i.get("bom"),
+				qty=i["pending_qty"],
+				company=company,
+				sales_order=sales_order,
+				sales_order_item=i["sales_order_item"],
+				project=project,
+				fg_warehouse=i["warehouse"],
+				description=i["description"],
+			)
+		).insert()
 		work_order.set_work_order_operations()
 		work_order.flags.ignore_mandatory = True
 		work_order.save()
@@ -1000,18 +1150,20 @@
 
 	return [p.name for p in out]
 
+
 @frappe.whitelist()
 def update_status(status, name):
 	so = frappe.get_doc("Sales Order", name)
 	so.update_status(status)
 
+
 def get_default_bom_item(item_code):
-	bom = frappe.get_all('BOM', dict(item=item_code, is_active=True),
-			order_by='is_default desc')
+	bom = frappe.get_all("BOM", dict(item=item_code, is_active=True), order_by="is_default desc")
 	bom = bom[0].name if bom else None
 
 	return bom
 
+
 @frappe.whitelist()
 def make_raw_material_request(items, company, sales_order, project=None):
 	if not frappe.has_permission("Sales Order", "write"):
@@ -1020,43 +1172,49 @@
 	if isinstance(items, str):
 		items = frappe._dict(json.loads(items))
 
-	for item in items.get('items'):
-		item["include_exploded_items"] = items.get('include_exploded_items')
-		item["ignore_existing_ordered_qty"] = items.get('ignore_existing_ordered_qty')
-		item["include_raw_materials_from_sales_order"] = items.get('include_raw_materials_from_sales_order')
+	for item in items.get("items"):
+		item["include_exploded_items"] = items.get("include_exploded_items")
+		item["ignore_existing_ordered_qty"] = items.get("ignore_existing_ordered_qty")
+		item["include_raw_materials_from_sales_order"] = items.get(
+			"include_raw_materials_from_sales_order"
+		)
 
-	items.update({
-		'company': company,
-		'sales_order': sales_order
-	})
+	items.update({"company": company, "sales_order": sales_order})
 
 	raw_materials = get_items_for_material_requests(items)
 	if not raw_materials:
-		frappe.msgprint(_("Material Request not created, as quantity for Raw Materials already available."))
+		frappe.msgprint(
+			_("Material Request not created, as quantity for Raw Materials already available.")
+		)
 		return
 
-	material_request = frappe.new_doc('Material Request')
-	material_request.update(dict(
-		doctype = 'Material Request',
-		transaction_date = nowdate(),
-		company = company,
-		material_request_type = 'Purchase'
-	))
+	material_request = frappe.new_doc("Material Request")
+	material_request.update(
+		dict(
+			doctype="Material Request",
+			transaction_date=nowdate(),
+			company=company,
+			material_request_type="Purchase",
+		)
+	)
 	for item in raw_materials:
-		item_doc = frappe.get_cached_doc('Item', item.get('item_code'))
+		item_doc = frappe.get_cached_doc("Item", item.get("item_code"))
 
 		schedule_date = add_days(nowdate(), cint(item_doc.lead_time_days))
-		row = material_request.append('items', {
-			'item_code': item.get('item_code'),
-			'qty': item.get('quantity'),
-			'schedule_date': schedule_date,
-			'warehouse': item.get('warehouse'),
-			'sales_order': sales_order,
-			'project': project
-		})
+		row = material_request.append(
+			"items",
+			{
+				"item_code": item.get("item_code"),
+				"qty": item.get("quantity"),
+				"schedule_date": schedule_date,
+				"warehouse": item.get("warehouse"),
+				"sales_order": sales_order,
+				"project": project,
+			},
+		)
 
 		if not (strip_html(item.get("description")) and strip_html(item_doc.description)):
-			row.description = item_doc.item_name or item.get('item_code')
+			row.description = item_doc.item_name or item.get("item_code")
 
 	material_request.insert()
 	material_request.flags.ignore_permissions = 1
@@ -1064,53 +1222,56 @@
 	material_request.submit()
 	return material_request
 
+
 @frappe.whitelist()
 def make_inter_company_purchase_order(source_name, target_doc=None):
 	from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction
+
 	return make_inter_company_transaction("Sales Order", source_name, target_doc)
 
+
 @frappe.whitelist()
 def create_pick_list(source_name, target_doc=None):
 	def update_item_quantity(source, target, source_parent):
 		target.qty = flt(source.qty) - flt(source.delivered_qty)
 		target.stock_qty = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.conversion_factor)
 
-	doc = get_mapped_doc('Sales Order', source_name, {
-		'Sales Order': {
-			'doctype': 'Pick List',
-			'validation': {
-				'docstatus': ['=', 1]
-			}
-		},
-		'Sales Order Item': {
-			'doctype': 'Pick List Item',
-			'field_map': {
-				'parent': 'sales_order',
-				'name': 'sales_order_item'
+	doc = get_mapped_doc(
+		"Sales Order",
+		source_name,
+		{
+			"Sales Order": {"doctype": "Pick List", "validation": {"docstatus": ["=", 1]}},
+			"Sales Order Item": {
+				"doctype": "Pick List Item",
+				"field_map": {"parent": "sales_order", "name": "sales_order_item"},
+				"postprocess": update_item_quantity,
+				"condition": lambda doc: abs(doc.delivered_qty) < abs(doc.qty)
+				and doc.delivered_by_supplier != 1,
 			},
-			'postprocess': update_item_quantity,
-			'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
 		},
-	}, target_doc)
+		target_doc,
+	)
 
-	doc.purpose = 'Delivery'
+	doc.purpose = "Delivery"
 
 	doc.set_item_locations()
 
 	return doc
 
+
 def update_produced_qty_in_so_item(sales_order, sales_order_item):
-	#for multiple work orders against same sales order item
-	linked_wo_with_so_item = frappe.db.get_all('Work Order', ['produced_qty'], {
-		'sales_order_item': sales_order_item,
-		'sales_order': sales_order,
-		'docstatus': 1
-	})
+	# for multiple work orders against same sales order item
+	linked_wo_with_so_item = frappe.db.get_all(
+		"Work Order",
+		["produced_qty"],
+		{"sales_order_item": sales_order_item, "sales_order": sales_order, "docstatus": 1},
+	)
 
 	total_produced_qty = 0
 	for wo in linked_wo_with_so_item:
-		total_produced_qty += flt(wo.get('produced_qty'))
+		total_produced_qty += flt(wo.get("produced_qty"))
 
-	if not total_produced_qty and frappe.flags.in_patch: return
+	if not total_produced_qty and frappe.flags.in_patch:
+		return
 
-	frappe.db.set_value('Sales Order Item', sales_order_item, 'produced_qty', total_produced_qty)
+	frappe.db.set_value("Sales Order Item", sales_order_item, "produced_qty", total_produced_qty)
diff --git a/erpnext/selling/doctype/sales_order/sales_order_dashboard.py b/erpnext/selling/doctype/sales_order/sales_order_dashboard.py
index 1e616b8..ace2e29 100644
--- a/erpnext/selling/doctype/sales_order/sales_order_dashboard.py
+++ b/erpnext/selling/doctype/sales_order/sales_order_dashboard.py
@@ -3,42 +3,25 @@
 
 def get_data():
 	return {
-		'fieldname': 'sales_order',
-		'non_standard_fieldnames': {
-			'Delivery Note': 'against_sales_order',
-			'Journal Entry': 'reference_name',
-			'Payment Entry': 'reference_name',
-			'Payment Request': 'reference_name',
-			'Auto Repeat': 'reference_document',
-			'Maintenance Visit': 'prevdoc_docname'
+		"fieldname": "sales_order",
+		"non_standard_fieldnames": {
+			"Delivery Note": "against_sales_order",
+			"Journal Entry": "reference_name",
+			"Payment Entry": "reference_name",
+			"Payment Request": "reference_name",
+			"Auto Repeat": "reference_document",
+			"Maintenance Visit": "prevdoc_docname",
 		},
-		'internal_links': {
-			'Quotation': ['items', 'prevdoc_docname']
-		},
-		'transactions': [
+		"internal_links": {"Quotation": ["items", "prevdoc_docname"]},
+		"transactions": [
 			{
-				'label': _('Fulfillment'),
-				'items': ['Sales Invoice', 'Pick List', 'Delivery Note', 'Maintenance Visit']
+				"label": _("Fulfillment"),
+				"items": ["Sales Invoice", "Pick List", "Delivery Note", "Maintenance Visit"],
 			},
-			{
-				'label': _('Purchasing'),
-				'items': ['Material Request', 'Purchase Order']
-			},
-			{
-				'label': _('Projects'),
-				'items': ['Project']
-			},
-			{
-				'label': _('Manufacturing'),
-				'items': ['Work Order']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Quotation', 'Auto Repeat']
-			},
-			{
-				'label': _('Payment'),
-				'items': ['Payment Entry', 'Payment Request', 'Journal Entry']
-			},
-		]
+			{"label": _("Purchasing"), "items": ["Material Request", "Purchase Order"]},
+			{"label": _("Projects"), "items": ["Project"]},
+			{"label": _("Manufacturing"), "items": ["Work Order"]},
+			{"label": _("Reference"), "items": ["Quotation", "Auto Repeat"]},
+			{"label": _("Payment"), "items": ["Payment Entry", "Payment Request", "Journal Entry"]},
+		],
 	}
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py
index 86a0882..acae37f 100644
--- a/erpnext/selling/doctype/sales_order/test_sales_order.py
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.py
@@ -31,18 +31,24 @@
 
 
 class TestSalesOrder(FrappeTestCase):
-
 	@classmethod
 	def setUpClass(cls):
 		super().setUpClass()
-		cls.unlink_setting = int(frappe.db.get_value("Accounts Settings", "Accounts Settings",
-			"unlink_advance_payment_on_cancelation_of_order"))
+		cls.unlink_setting = int(
+			frappe.db.get_value(
+				"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order"
+			)
+		)
 
 	@classmethod
 	def tearDownClass(cls) -> None:
 		# reset config to previous state
-		frappe.db.set_value("Accounts Settings", "Accounts Settings",
-			"unlink_advance_payment_on_cancelation_of_order", cls.unlink_setting)
+		frappe.db.set_value(
+			"Accounts Settings",
+			"Accounts Settings",
+			"unlink_advance_payment_on_cancelation_of_order",
+			cls.unlink_setting,
+		)
 		super().tearDownClass()
 
 	def tearDown(self):
@@ -89,6 +95,7 @@
 
 	def test_so_billed_amount_against_return_entry(self):
 		from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_sales_return
+
 		so = make_sales_order(do_not_submit=True)
 		so.submit()
 
@@ -117,7 +124,7 @@
 		self.assertEqual(len(si.get("items")), 1)
 
 		si.insert()
-		si.set('taxes', [])
+		si.set("taxes", [])
 		si.save()
 
 		self.assertEqual(si.payment_schedule[0].payment_amount, 500.0)
@@ -185,16 +192,16 @@
 		dn1.items[0].so_detail = so.items[0].name
 		dn1.submit()
 
-		si1 = create_sales_invoice(is_return=1, return_against=si2.name, qty=-1, update_stock=1, do_not_submit=True)
+		si1 = create_sales_invoice(
+			is_return=1, return_against=si2.name, qty=-1, update_stock=1, do_not_submit=True
+		)
 		si1.items[0].sales_order = so.name
 		si1.items[0].so_detail = so.items[0].name
 		si1.submit()
 
-
 		so.load_from_db()
 		self.assertEqual(so.get("items")[0].delivered_qty, 5)
 
-
 	def test_reserved_qty_for_partial_delivery(self):
 		make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
 		existing_reserved_qty = get_reserved_qty()
@@ -212,7 +219,7 @@
 
 		# unclose so
 		so.load_from_db()
-		so.update_status('Draft')
+		so.update_status("Draft")
 		self.assertEqual(get_reserved_qty(), existing_reserved_qty + 5)
 
 		dn.cancel()
@@ -226,7 +233,7 @@
 	def test_reserved_qty_for_over_delivery(self):
 		make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
 		# set over-delivery allowance
-		frappe.db.set_value('Item', "_Test Item", 'over_delivery_receipt_allowance', 50)
+		frappe.db.set_value("Item", "_Test Item", "over_delivery_receipt_allowance", 50)
 
 		existing_reserved_qty = get_reserved_qty()
 
@@ -243,8 +250,8 @@
 		make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
 
 		# set over-delivery allowance
-		frappe.db.set_value('Item', "_Test Item", 'over_delivery_receipt_allowance', 50)
-		frappe.db.set_value('Item', "_Test Item", 'over_billing_allowance', 20)
+		frappe.db.set_value("Item", "_Test Item", "over_delivery_receipt_allowance", 50)
+		frappe.db.set_value("Item", "_Test Item", "over_billing_allowance", 20)
 
 		existing_reserved_qty = get_reserved_qty()
 
@@ -272,7 +279,9 @@
 
 	def test_reserved_qty_for_partial_delivery_with_packing_list(self):
 		make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
-		make_stock_entry(item="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=10, rate=100)
+		make_stock_entry(
+			item="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=10, rate=100
+		)
 
 		existing_reserved_qty_item1 = get_reserved_qty("_Test Item")
 		existing_reserved_qty_item2 = get_reserved_qty("_Test Item Home Desktop 100")
@@ -280,14 +289,16 @@
 		so = make_sales_order(item_code="_Test Product Bundle Item")
 
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 50)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2 + 20)
+		self.assertEqual(
+			get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2 + 20
+		)
 
 		dn = create_dn_against_so(so.name)
 
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 25)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2 + 10)
+		self.assertEqual(
+			get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2 + 10
+		)
 
 		# close so
 		so.load_from_db()
@@ -298,16 +309,18 @@
 
 		# unclose so
 		so.load_from_db()
-		so.update_status('Draft')
+		so.update_status("Draft")
 
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 25)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2 + 10)
+		self.assertEqual(
+			get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2 + 10
+		)
 
 		dn.cancel()
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 50)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2 + 20)
+		self.assertEqual(
+			get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2 + 20
+		)
 
 		so.load_from_db()
 		so.cancel()
@@ -316,17 +329,19 @@
 
 	def test_sales_order_on_hold(self):
 		so = make_sales_order(item_code="_Test Product Bundle Item")
-		so.db_set('Status', "On Hold")
+		so.db_set("Status", "On Hold")
 		si = make_sales_invoice(so.name)
 		self.assertRaises(frappe.ValidationError, create_dn_against_so, so.name)
 		self.assertRaises(frappe.ValidationError, si.submit)
 
 	def test_reserved_qty_for_over_delivery_with_packing_list(self):
 		make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
-		make_stock_entry(item="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=10, rate=100)
+		make_stock_entry(
+			item="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=10, rate=100
+		)
 
 		# set over-delivery allowance
-		frappe.db.set_value('Item', "_Test Product Bundle Item", 'over_delivery_receipt_allowance', 50)
+		frappe.db.set_value("Item", "_Test Product Bundle Item", "over_delivery_receipt_allowance", 50)
 
 		existing_reserved_qty_item1 = get_reserved_qty("_Test Item")
 		existing_reserved_qty_item2 = get_reserved_qty("_Test Item Home Desktop 100")
@@ -334,22 +349,23 @@
 		so = make_sales_order(item_code="_Test Product Bundle Item")
 
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 50)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2 + 20)
+		self.assertEqual(
+			get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2 + 20
+		)
 
 		dn = create_dn_against_so(so.name, 15)
 
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2)
+		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2)
 
 		dn.cancel()
 		self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 50)
-		self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
-			existing_reserved_qty_item2 + 20)
+		self.assertEqual(
+			get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2 + 20
+		)
 
 	def test_update_child_adding_new_item(self):
-		so = make_sales_order(item_code= "_Test Item", qty=4)
+		so = make_sales_order(item_code="_Test Item", qty=4)
 		create_dn_against_so(so.name, 4)
 		make_sales_invoice(so.name)
 
@@ -360,38 +376,38 @@
 		reserved_qty_for_second_item = get_reserved_qty("_Test Item 2")
 
 		first_item_of_so = so.get("items")[0]
-		trans_item = json.dumps([
-			{'item_code' : first_item_of_so.item_code, 'rate' : first_item_of_so.rate, \
-				'qty' : first_item_of_so.qty, 'docname': first_item_of_so.name},
-			{'item_code' : '_Test Item 2', 'rate' : 200, 'qty' : 7}
-		])
-		update_child_qty_rate('Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[
+				{
+					"item_code": first_item_of_so.item_code,
+					"rate": first_item_of_so.rate,
+					"qty": first_item_of_so.qty,
+					"docname": first_item_of_so.name,
+				},
+				{"item_code": "_Test Item 2", "rate": 200, "qty": 7},
+			]
+		)
+		update_child_qty_rate("Sales Order", trans_item, so.name)
 
 		so.reload()
-		self.assertEqual(so.get("items")[-1].item_code, '_Test Item 2')
+		self.assertEqual(so.get("items")[-1].item_code, "_Test Item 2")
 		self.assertEqual(so.get("items")[-1].rate, 200)
 		self.assertEqual(so.get("items")[-1].qty, 7)
 		self.assertEqual(so.get("items")[-1].amount, 1400)
 
 		# reserved qty should increase after adding row
-		self.assertEqual(get_reserved_qty('_Test Item 2'), reserved_qty_for_second_item + 7)
+		self.assertEqual(get_reserved_qty("_Test Item 2"), reserved_qty_for_second_item + 7)
 
-		self.assertEqual(so.status, 'To Deliver and Bill')
+		self.assertEqual(so.status, "To Deliver and Bill")
 
 		updated_total = so.get("base_total")
 		updated_total_in_words = so.get("base_in_words")
 
-		self.assertEqual(updated_total, prev_total+1400)
+		self.assertEqual(updated_total, prev_total + 1400)
 		self.assertNotEqual(updated_total_in_words, prev_total_in_words)
 
 	def test_update_child_removing_item(self):
-		so = make_sales_order(**{
-			"item_list": [{
-				"item_code": '_Test Item',
-				"qty": 5,
-				"rate":1000
-			}]
-		})
+		so = make_sales_order(**{"item_list": [{"item_code": "_Test Item", "qty": 5, "rate": 1000}]})
 		create_dn_against_so(so.name, 2)
 		make_sales_invoice(so.name)
 
@@ -399,64 +415,67 @@
 		reserved_qty_for_second_item = get_reserved_qty("_Test Item 2")
 
 		# add an item so as to try removing items
-		trans_item = json.dumps([
-			{"item_code": '_Test Item', "qty": 5, "rate":1000, "docname": so.get("items")[0].name},
-			{"item_code": '_Test Item 2', "qty": 2, "rate":500}
-		])
-		update_child_qty_rate('Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[
+				{"item_code": "_Test Item", "qty": 5, "rate": 1000, "docname": so.get("items")[0].name},
+				{"item_code": "_Test Item 2", "qty": 2, "rate": 500},
+			]
+		)
+		update_child_qty_rate("Sales Order", trans_item, so.name)
 		so.reload()
 		self.assertEqual(len(so.get("items")), 2)
 
 		# reserved qty should increase after adding row
-		self.assertEqual(get_reserved_qty('_Test Item 2'), reserved_qty_for_second_item + 2)
+		self.assertEqual(get_reserved_qty("_Test Item 2"), reserved_qty_for_second_item + 2)
 
 		# check if delivered items can be removed
-		trans_item = json.dumps([{
-			"item_code": '_Test Item 2',
-			"qty": 2,
-			"rate":500,
-			"docname": so.get("items")[1].name
-		}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate, 'Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item 2", "qty": 2, "rate": 500, "docname": so.get("items")[1].name}]
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name
+		)
 
-		#remove last added item
-		trans_item = json.dumps([{
-			"item_code": '_Test Item',
-			"qty": 5,
-			"rate":1000,
-			"docname": so.get("items")[0].name
-		}])
-		update_child_qty_rate('Sales Order', trans_item, so.name)
+		# remove last added item
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "qty": 5, "rate": 1000, "docname": so.get("items")[0].name}]
+		)
+		update_child_qty_rate("Sales Order", trans_item, so.name)
 
 		so.reload()
 		self.assertEqual(len(so.get("items")), 1)
 
 		# reserved qty should decrease (back to initial) after deleting row
-		self.assertEqual(get_reserved_qty('_Test Item 2'), reserved_qty_for_second_item)
+		self.assertEqual(get_reserved_qty("_Test Item 2"), reserved_qty_for_second_item)
 
-		self.assertEqual(so.status, 'To Deliver and Bill')
-
+		self.assertEqual(so.status, "To Deliver and Bill")
 
 	def test_update_child(self):
-		so = make_sales_order(item_code= "_Test Item", qty=4)
+		so = make_sales_order(item_code="_Test Item", qty=4)
 		create_dn_against_so(so.name, 4)
 		make_sales_invoice(so.name)
 
 		existing_reserved_qty = get_reserved_qty()
 
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': so.items[0].name}])
-		update_child_qty_rate('Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": so.items[0].name}]
+		)
+		update_child_qty_rate("Sales Order", trans_item, so.name)
 
 		so.reload()
 		self.assertEqual(so.get("items")[0].rate, 200)
 		self.assertEqual(so.get("items")[0].qty, 7)
 		self.assertEqual(so.get("items")[0].amount, 1400)
-		self.assertEqual(so.status, 'To Deliver and Bill')
+		self.assertEqual(so.status, "To Deliver and Bill")
 
 		self.assertEqual(get_reserved_qty(), existing_reserved_qty + 3)
 
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 2, 'docname': so.items[0].name}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200, "qty": 2, "docname": so.items[0].name}]
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name
+		)
 
 	def test_update_child_with_precision(self):
 		from frappe.custom.doctype.property_setter.property_setter import make_property_setter
@@ -465,48 +484,60 @@
 		precision = get_field_precision(frappe.get_meta("Sales Order Item").get_field("rate"))
 
 		make_property_setter("Sales Order Item", "rate", "precision", 7, "Currency")
-		so = make_sales_order(item_code= "_Test Item", qty=4, rate=200.34664)
+		so = make_sales_order(item_code="_Test Item", qty=4, rate=200.34664)
 
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200.34669, 'qty' : 4, 'docname': so.items[0].name}])
-		update_child_qty_rate('Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200.34669, "qty": 4, "docname": so.items[0].name}]
+		)
+		update_child_qty_rate("Sales Order", trans_item, so.name)
 
 		so.reload()
 		self.assertEqual(so.items[0].rate, 200.34669)
 		make_property_setter("Sales Order Item", "rate", "precision", precision, "Currency")
 
 	def test_update_child_perm(self):
-		so = make_sales_order(item_code= "_Test Item", qty=4)
+		so = make_sales_order(item_code="_Test Item", qty=4)
 
 		test_user = create_user("test_so_child_perms@example.com", "Accounts User")
 		frappe.set_user(test_user.name)
 
 		# update qty
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': so.items[0].name}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": so.items[0].name}]
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name
+		)
 
 		# add new item
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name)
+		trans_item = json.dumps([{"item_code": "_Test Item", "rate": 100, "qty": 2}])
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name
+		)
 
 	def test_update_child_qty_rate_with_workflow(self):
 		from frappe.model.workflow import apply_workflow
 
 		workflow = make_sales_order_workflow()
-		so = make_sales_order(item_code= "_Test Item", qty=1, rate=150, do_not_submit=1)
-		apply_workflow(so, 'Approve')
+		so = make_sales_order(item_code="_Test Item", qty=1, rate=150, do_not_submit=1)
+		apply_workflow(so, "Approve")
 
-		user = 'test@example.com'
-		test_user = frappe.get_doc('User', user)
+		user = "test@example.com"
+		test_user = frappe.get_doc("User", user)
 		test_user.add_roles("Sales User", "Test Junior Approver")
 		frappe.set_user(user)
 
 		# user shouldn't be able to edit since grand_total will become > 200 if qty is doubled
-		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 150, 'qty' : 2, 'docname': so.items[0].name}])
-		self.assertRaises(frappe.ValidationError, update_child_qty_rate, 'Sales Order', trans_item, so.name)
+		trans_item = json.dumps(
+			[{"item_code": "_Test Item", "rate": 150, "qty": 2, "docname": so.items[0].name}]
+		)
+		self.assertRaises(
+			frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name
+		)
 
 		frappe.set_user("Administrator")
-		user2 = 'test2@example.com'
-		test_user2 = frappe.get_doc('User', user2)
+		user2 = "test2@example.com"
+		test_user2 = frappe.get_doc("User", user2)
 		test_user2.add_roles("Sales User", "Test Approver")
 		frappe.set_user(user2)
 
@@ -525,21 +556,21 @@
 		# test Update Items with product bundle
 		if not frappe.db.exists("Item", "_Product Bundle Item"):
 			bundle_item = make_item("_Product Bundle Item", {"is_stock_item": 0})
-			bundle_item.append("item_defaults", {
-					"company": "_Test Company",
-					"default_warehouse": "_Test Warehouse - _TC"})
+			bundle_item.append(
+				"item_defaults", {"company": "_Test Company", "default_warehouse": "_Test Warehouse - _TC"}
+			)
 			bundle_item.save(ignore_permissions=True)
 
 		make_item("_Packed Item", {"is_stock_item": 1})
 		make_product_bundle("_Product Bundle Item", ["_Packed Item"], 2)
 
-		so = make_sales_order(item_code = "_Test Item", warehouse=None)
+		so = make_sales_order(item_code="_Test Item", warehouse=None)
 
 		# get reserved qty of packed item
 		existing_reserved_qty = get_reserved_qty("_Packed Item")
 
-		added_item = json.dumps([{"item_code" : "_Product Bundle Item", "rate" : 200, 'qty' : 2}])
-		update_child_qty_rate('Sales Order', added_item, so.name)
+		added_item = json.dumps([{"item_code": "_Product Bundle Item", "rate": 200, "qty": 2}])
+		update_child_qty_rate("Sales Order", added_item, so.name)
 
 		so.reload()
 		self.assertEqual(so.packed_items[0].qty, 4)
@@ -548,15 +579,19 @@
 		self.assertEqual(get_reserved_qty("_Packed Item"), existing_reserved_qty + 4)
 
 		# test uom and conversion factor change
-		update_uom_conv_factor = json.dumps([{
-			'item_code': so.get("items")[0].item_code,
-			'rate': so.get("items")[0].rate,
-			'qty': so.get("items")[0].qty,
-			'uom': "_Test UOM 1",
-			'conversion_factor': 2,
-			'docname': so.get("items")[0].name
-		}])
-		update_child_qty_rate('Sales Order', update_uom_conv_factor, so.name)
+		update_uom_conv_factor = json.dumps(
+			[
+				{
+					"item_code": so.get("items")[0].item_code,
+					"rate": so.get("items")[0].rate,
+					"qty": so.get("items")[0].qty,
+					"uom": "_Test UOM 1",
+					"conversion_factor": 2,
+					"docname": so.get("items")[0].name,
+				}
+			]
+		)
+		update_child_qty_rate("Sales Order", update_uom_conv_factor, so.name)
 
 		so.reload()
 		self.assertEqual(so.packed_items[0].qty, 8)
@@ -566,61 +601,67 @@
 
 	def test_update_child_with_tax_template(self):
 		"""
-			Test Action: Create a SO with one item having its tax account head already in the SO.
-			Add the same item + new item with tax template via Update Items.
-			Expected result: First Item's tax row is updated. New tax row is added for second Item.
+		Test Action: Create a SO with one item having its tax account head already in the SO.
+		Add the same item + new item with tax template via Update Items.
+		Expected result: First Item's tax row is updated. New tax row is added for second Item.
 		"""
 		if not frappe.db.exists("Item", "Test Item with Tax"):
-			make_item("Test Item with Tax", {
-				'is_stock_item': 1,
-			})
+			make_item(
+				"Test Item with Tax",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		if not frappe.db.exists("Item Tax Template", {"title": 'Test Update Items Template'}):
-			frappe.get_doc({
-				'doctype': 'Item Tax Template',
-				'title': 'Test Update Items Template',
-				'company': '_Test Company',
-				'taxes': [
-					{
-						'tax_type': "_Test Account Service Tax - _TC",
-						'tax_rate': 10,
-					}
-				]
-			}).insert()
+		if not frappe.db.exists("Item Tax Template", {"title": "Test Update Items Template"}):
+			frappe.get_doc(
+				{
+					"doctype": "Item Tax Template",
+					"title": "Test Update Items Template",
+					"company": "_Test Company",
+					"taxes": [
+						{
+							"tax_type": "_Test Account Service Tax - _TC",
+							"tax_rate": 10,
+						}
+					],
+				}
+			).insert()
 
 		new_item_with_tax = frappe.get_doc("Item", "Test Item with Tax")
 
-		new_item_with_tax.append("taxes", {
-			"item_tax_template": "Test Update Items Template - _TC",
-			"valid_from": nowdate()
-		})
+		new_item_with_tax.append(
+			"taxes", {"item_tax_template": "Test Update Items Template - _TC", "valid_from": nowdate()}
+		)
 		new_item_with_tax.save()
 
 		tax_template = "_Test Account Excise Duty @ 10 - _TC"
-		item =  "_Test Item Home Desktop 100"
-		if not frappe.db.exists("Item Tax", {"parent":item, "item_tax_template":tax_template}):
+		item = "_Test Item Home Desktop 100"
+		if not frappe.db.exists("Item Tax", {"parent": item, "item_tax_template": tax_template}):
 			item_doc = frappe.get_doc("Item", item)
-			item_doc.append("taxes", {
-				"item_tax_template": tax_template,
-				"valid_from": nowdate()
-			})
+			item_doc.append("taxes", {"item_tax_template": tax_template, "valid_from": nowdate()})
 			item_doc.save()
 		else:
 			# update valid from
-			frappe.db.sql("""UPDATE `tabItem Tax` set valid_from = CURDATE()
+			frappe.db.sql(
+				"""UPDATE `tabItem Tax` set valid_from = CURDATE()
 				where parent = %(item)s and item_tax_template = %(tax)s""",
-					{"item": item, "tax": tax_template})
+				{"item": item, "tax": tax_template},
+			)
 
 		so = make_sales_order(item_code=item, qty=1, do_not_save=1)
 
-		so.append("taxes", {
-			"account_head": "_Test Account Excise Duty - _TC",
-			"charge_type": "On Net Total",
-			"cost_center": "_Test Cost Center - _TC",
-			"description": "Excise Duty",
-			"doctype": "Sales Taxes and Charges",
-			"rate": 10
-		})
+		so.append(
+			"taxes",
+			{
+				"account_head": "_Test Account Excise Duty - _TC",
+				"charge_type": "On Net Total",
+				"cost_center": "_Test Cost Center - _TC",
+				"description": "Excise Duty",
+				"doctype": "Sales Taxes and Charges",
+				"rate": 10,
+			},
+		)
 		so.insert()
 		so.submit()
 
@@ -630,12 +671,22 @@
 		old_stock_settings_value = frappe.db.get_single_value("Stock Settings", "default_warehouse")
 		frappe.db.set_value("Stock Settings", None, "default_warehouse", "_Test Warehouse - _TC")
 
-		items = json.dumps([
-			{'item_code' : item, 'rate' : 100, 'qty' : 1, 'docname': so.items[0].name},
-			{'item_code' : item, 'rate' : 200, 'qty' : 1}, # added item whose tax account head already exists in PO
-			{'item_code' : new_item_with_tax.name, 'rate' : 100, 'qty' : 1} # added item whose tax account head  is missing in PO
-		])
-		update_child_qty_rate('Sales Order', items, so.name)
+		items = json.dumps(
+			[
+				{"item_code": item, "rate": 100, "qty": 1, "docname": so.items[0].name},
+				{
+					"item_code": item,
+					"rate": 200,
+					"qty": 1,
+				},  # added item whose tax account head already exists in PO
+				{
+					"item_code": new_item_with_tax.name,
+					"rate": 100,
+					"qty": 1,
+				},  # added item whose tax account head  is missing in PO
+			]
+		)
+		update_child_qty_rate("Sales Order", items, so.name)
 
 		so.reload()
 		self.assertEqual(so.taxes[0].tax_amount, 40)
@@ -645,8 +696,11 @@
 		self.assertEqual(so.taxes[1].total, 480)
 
 		# teardown
-		frappe.db.sql("""UPDATE `tabItem Tax` set valid_from = NULL
-			where parent = %(item)s and item_tax_template = %(tax)s""", {"item": item, "tax": tax_template})
+		frappe.db.sql(
+			"""UPDATE `tabItem Tax` set valid_from = NULL
+			where parent = %(item)s and item_tax_template = %(tax)s""",
+			{"item": item, "tax": tax_template},
+		)
 		so.cancel()
 		so.delete()
 		new_item_with_tax.delete()
@@ -666,8 +720,12 @@
 
 		frappe.set_user(test_user.name)
 
-		so = make_sales_order(company="_Test Company 1", customer="_Test Customer 1",
-			warehouse="_Test Warehouse 2 - _TC1", do_not_save=True)
+		so = make_sales_order(
+			company="_Test Company 1",
+			customer="_Test Customer 1",
+			warehouse="_Test Warehouse 2 - _TC1",
+			do_not_save=True,
+		)
 		so.conversion_rate = 0.02
 		so.plc_conversion_rate = 0.02
 		self.assertRaises(frappe.PermissionError, so.insert)
@@ -677,7 +735,9 @@
 
 		frappe.set_user("Administrator")
 		frappe.permissions.remove_user_permission("Warehouse", "_Test Warehouse 1 - _TC", test_user.name)
-		frappe.permissions.remove_user_permission("Warehouse", "_Test Warehouse 2 - _TC1", test_user_2.name)
+		frappe.permissions.remove_user_permission(
+			"Warehouse", "_Test Warehouse 2 - _TC1", test_user_2.name
+		)
 		frappe.permissions.remove_user_permission("Company", "_Test Company 1", test_user_2.name)
 
 	def test_block_delivery_note_against_cancelled_sales_order(self):
@@ -697,10 +757,12 @@
 		make_item("_Test Service Product Bundle Item 1", {"is_stock_item": 0})
 		make_item("_Test Service Product Bundle Item 2", {"is_stock_item": 0})
 
-		make_product_bundle("_Test Service Product Bundle",
-			["_Test Service Product Bundle Item 1", "_Test Service Product Bundle Item 2"])
+		make_product_bundle(
+			"_Test Service Product Bundle",
+			["_Test Service Product Bundle Item 1", "_Test Service Product Bundle Item 2"],
+		)
 
-		so = make_sales_order(item_code = "_Test Service Product Bundle", warehouse=None)
+		so = make_sales_order(item_code="_Test Service Product Bundle", warehouse=None)
 
 		self.assertTrue("_Test Service Product Bundle Item 1" in [d.item_code for d in so.packed_items])
 		self.assertTrue("_Test Service Product Bundle Item 2" in [d.item_code for d in so.packed_items])
@@ -710,38 +772,59 @@
 		make_item("_Test Mix Product Bundle Item 1", {"is_stock_item": 1})
 		make_item("_Test Mix Product Bundle Item 2", {"is_stock_item": 0})
 
-		make_product_bundle("_Test Mix Product Bundle",
-			["_Test Mix Product Bundle Item 1", "_Test Mix Product Bundle Item 2"])
+		make_product_bundle(
+			"_Test Mix Product Bundle",
+			["_Test Mix Product Bundle Item 1", "_Test Mix Product Bundle Item 2"],
+		)
 
-		self.assertRaises(WarehouseRequired, make_sales_order, item_code = "_Test Mix Product Bundle", warehouse="")
+		self.assertRaises(
+			WarehouseRequired, make_sales_order, item_code="_Test Mix Product Bundle", warehouse=""
+		)
 
 	def test_auto_insert_price(self):
 		make_item("_Test Item for Auto Price List", {"is_stock_item": 0})
 		frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 1)
 
-		item_price = frappe.db.get_value("Item Price", {"price_list": "_Test Price List",
-			"item_code": "_Test Item for Auto Price List"})
+		item_price = frappe.db.get_value(
+			"Item Price", {"price_list": "_Test Price List", "item_code": "_Test Item for Auto Price List"}
+		)
 		if item_price:
 			frappe.delete_doc("Item Price", item_price)
 
-		make_sales_order(item_code = "_Test Item for Auto Price List", selling_price_list="_Test Price List", rate=100)
+		make_sales_order(
+			item_code="_Test Item for Auto Price List", selling_price_list="_Test Price List", rate=100
+		)
 
-		self.assertEqual(frappe.db.get_value("Item Price",
-			{"price_list": "_Test Price List", "item_code": "_Test Item for Auto Price List"}, "price_list_rate"), 100)
-
+		self.assertEqual(
+			frappe.db.get_value(
+				"Item Price",
+				{"price_list": "_Test Price List", "item_code": "_Test Item for Auto Price List"},
+				"price_list_rate",
+			),
+			100,
+		)
 
 		# do not update price list
 		frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 0)
 
-		item_price = frappe.db.get_value("Item Price", {"price_list": "_Test Price List",
-			"item_code": "_Test Item for Auto Price List"})
+		item_price = frappe.db.get_value(
+			"Item Price", {"price_list": "_Test Price List", "item_code": "_Test Item for Auto Price List"}
+		)
 		if item_price:
 			frappe.delete_doc("Item Price", item_price)
 
-		make_sales_order(item_code = "_Test Item for Auto Price List", selling_price_list="_Test Price List", rate=100)
+		make_sales_order(
+			item_code="_Test Item for Auto Price List", selling_price_list="_Test Price List", rate=100
+		)
 
-		self.assertEqual(frappe.db.get_value("Item Price",
-			{"price_list": "_Test Price List", "item_code": "_Test Item for Auto Price List"}, "price_list_rate"), None)
+		self.assertEqual(
+			frappe.db.get_value(
+				"Item Price",
+				{"price_list": "_Test Price List", "item_code": "_Test Item for Auto Price List"},
+				"price_list_rate",
+			),
+			None,
+		)
 
 		frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 1)
 
@@ -753,7 +836,9 @@
 		from erpnext.selling.doctype.sales_order.sales_order import update_status as so_update_status
 
 		# make items
-		po_item = make_item("_Test Item for Drop Shipping", {"is_stock_item": 1, "delivered_by_supplier": 1})
+		po_item = make_item(
+			"_Test Item for Drop Shipping", {"is_stock_item": 1, "delivered_by_supplier": 1}
+		)
 		dn_item = make_item("_Test Regular Item", {"is_stock_item": 1})
 
 		so_items = [
@@ -763,21 +848,21 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			},
 			{
 				"item_code": dn_item.item_code,
 				"warehouse": "_Test Warehouse - _TC",
 				"qty": 2,
 				"rate": 300,
-				"conversion_factor": 1.0
-			}
+				"conversion_factor": 1.0,
+			},
 		]
 
-		if frappe.db.get_value("Item", "_Test Regular Item", "is_stock_item")==1:
+		if frappe.db.get_value("Item", "_Test Regular Item", "is_stock_item") == 1:
 			make_stock_entry(item="_Test Regular Item", target="_Test Warehouse - _TC", qty=2, rate=100)
 
-		#create so, po and dn
+		# create so, po and dn
 		so = make_sales_order(item_list=so_items, do_not_submit=True)
 		so.submit()
 
@@ -790,12 +875,15 @@
 		self.assertEqual(po.items[0].sales_order, so.name)
 		self.assertEqual(po.items[0].item_code, po_item.item_code)
 		self.assertEqual(dn.items[0].item_code, dn_item.item_code)
-		#test po_item length
+		# test po_item length
 		self.assertEqual(len(po.items), 1)
 
 		# test ordered_qty and reserved_qty for drop ship item
-		bin_po_item = frappe.get_all("Bin", filters={"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"},
-			fields=["ordered_qty", "reserved_qty"])
+		bin_po_item = frappe.get_all(
+			"Bin",
+			filters={"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"},
+			fields=["ordered_qty", "reserved_qty"],
+		)
 
 		ordered_qty = bin_po_item[0].ordered_qty if bin_po_item else 0.0
 		reserved_qty = bin_po_item[0].reserved_qty if bin_po_item else 0.0
@@ -810,12 +898,15 @@
 		po.load_from_db()
 
 		# test after closing so
-		so.db_set('status', "Closed")
+		so.db_set("status", "Closed")
 		so.update_reserved_qty()
 
 		# test ordered_qty and reserved_qty for drop ship item after closing so
-		bin_po_item = frappe.get_all("Bin", filters={"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"},
-			fields=["ordered_qty", "reserved_qty"])
+		bin_po_item = frappe.get_all(
+			"Bin",
+			filters={"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"},
+			fields=["ordered_qty", "reserved_qty"],
+		)
 
 		ordered_qty = bin_po_item[0].ordered_qty if bin_po_item else 0.0
 		reserved_qty = bin_po_item[0].reserved_qty if bin_po_item else 0.0
@@ -838,8 +929,12 @@
 		from erpnext.selling.doctype.sales_order.sales_order import update_status as so_update_status
 
 		# make items
-		po_item1 = make_item("_Test Item for Drop Shipping 1", {"is_stock_item": 1, "delivered_by_supplier": 1})
-		po_item2 = make_item("_Test Item for Drop Shipping 2", {"is_stock_item": 1, "delivered_by_supplier": 1})
+		po_item1 = make_item(
+			"_Test Item for Drop Shipping 1", {"is_stock_item": 1, "delivered_by_supplier": 1}
+		)
+		po_item2 = make_item(
+			"_Test Item for Drop Shipping 2", {"is_stock_item": 1, "delivered_by_supplier": 1}
+		)
 
 		so_items = [
 			{
@@ -848,7 +943,7 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			},
 			{
 				"item_code": po_item2.item_code,
@@ -856,8 +951,8 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
-			}
+				"supplier": "_Test Supplier",
+			},
 		]
 
 		# create so and po
@@ -871,7 +966,7 @@
 		self.assertEqual(so.customer, po1.customer)
 		self.assertEqual(po1.items[0].sales_order, so.name)
 		self.assertEqual(po1.items[0].item_code, po_item1.item_code)
-		#test po item length
+		# test po item length
 		self.assertEqual(len(po1.items), 1)
 
 		# create po for remaining item
@@ -905,7 +1000,7 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			},
 			{
 				"item_code": "_Test Item for Drop Shipping 2",
@@ -913,8 +1008,8 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier 1'
-			}
+				"supplier": "_Test Supplier 1",
+			},
 		]
 
 		# create so and po
@@ -924,13 +1019,13 @@
 		purchase_orders = make_purchase_order_for_default_supplier(so.name, selected_items=so_items)
 
 		self.assertEqual(len(purchase_orders), 2)
-		self.assertEqual(purchase_orders[0].supplier, '_Test Supplier')
-		self.assertEqual(purchase_orders[1].supplier, '_Test Supplier 1')
+		self.assertEqual(purchase_orders[0].supplier, "_Test Supplier")
+		self.assertEqual(purchase_orders[1].supplier, "_Test Supplier 1")
 
 	def test_product_bundles_in_so_are_replaced_with_bundle_items_in_po(self):
 		"""
-			Tests if the the Product Bundles in the Items table of Sales Orders are replaced with
-			their child items(from the Packed Items table) on creating a Purchase Order from it.
+		Tests if the the Product Bundles in the Items table of Sales Orders are replaced with
+		their child items(from the Packed Items table) on creating a Purchase Order from it.
 		"""
 		from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order
 
@@ -938,8 +1033,7 @@
 		make_item("_Test Bundle Item 1", {"is_stock_item": 1})
 		make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
 
 		so_items = [
 			{
@@ -948,7 +1042,7 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			}
 		]
 
@@ -961,7 +1055,7 @@
 
 	def test_purchase_order_updates_packed_item_ordered_qty(self):
 		"""
-			Tests if the packed item's `ordered_qty` is updated with the quantity of the Purchase Order
+		Tests if the packed item's `ordered_qty` is updated with the quantity of the Purchase Order
 		"""
 		from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order
 
@@ -969,8 +1063,7 @@
 		make_item("_Test Bundle Item 1", {"is_stock_item": 1})
 		make_item("_Test Bundle Item 2", {"is_stock_item": 1})
 
-		make_product_bundle("_Test Product Bundle",
-			["_Test Bundle Item 1", "_Test Bundle Item 2"])
+		make_product_bundle("_Test Product Bundle", ["_Test Bundle Item 1", "_Test Bundle Item 2"])
 
 		so_items = [
 			{
@@ -979,7 +1072,7 @@
 				"qty": 2,
 				"rate": 400,
 				"delivered_by_supplier": 1,
-				"supplier": '_Test Supplier'
+				"supplier": "_Test Supplier",
 			}
 		]
 
@@ -996,145 +1089,163 @@
 		self.assertEqual(so.packed_items[1].ordered_qty, 2)
 
 	def test_reserved_qty_for_closing_so(self):
-		bin = frappe.get_all("Bin", filters={"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
-			fields=["reserved_qty"])
+		bin = frappe.get_all(
+			"Bin",
+			filters={"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
+			fields=["reserved_qty"],
+		)
 
 		existing_reserved_qty = bin[0].reserved_qty if bin else 0.0
 
 		so = make_sales_order(item_code="_Test Item", qty=1)
 
-		self.assertEqual(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty+1)
+		self.assertEqual(
+			get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"),
+			existing_reserved_qty + 1,
+		)
 
 		so.update_status("Closed")
 
-		self.assertEqual(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty)
+		self.assertEqual(
+			get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"),
+			existing_reserved_qty,
+		)
 
 	def test_create_so_with_margin(self):
 		so = make_sales_order(item_code="_Test Item", qty=1, do_not_submit=True)
 		so.items[0].price_list_rate = price_list_rate = 100
-		so.items[0].margin_type = 'Percentage'
+		so.items[0].margin_type = "Percentage"
 		so.items[0].margin_rate_or_amount = 25
 		so.save()
 
 		new_so = frappe.copy_doc(so)
 		new_so.save(ignore_permissions=True)
 
-		self.assertEqual(new_so.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate))
+		self.assertEqual(
+			new_so.get("items")[0].rate, flt((price_list_rate * 25) / 100 + price_list_rate)
+		)
 		new_so.items[0].margin_rate_or_amount = 25
 		new_so.payment_schedule = []
 		new_so.save()
 		new_so.submit()
 
-		self.assertEqual(new_so.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate))
+		self.assertEqual(
+			new_so.get("items")[0].rate, flt((price_list_rate * 25) / 100 + price_list_rate)
+		)
 
 	def test_terms_auto_added(self):
 		so = make_sales_order(do_not_save=1)
 
-		self.assertFalse(so.get('payment_schedule'))
+		self.assertFalse(so.get("payment_schedule"))
 
 		so.insert()
 
-		self.assertTrue(so.get('payment_schedule'))
+		self.assertTrue(so.get("payment_schedule"))
 
 	def test_terms_not_copied(self):
 		so = make_sales_order()
-		self.assertTrue(so.get('payment_schedule'))
+		self.assertTrue(so.get("payment_schedule"))
 
 		si = make_sales_invoice(so.name)
-		self.assertFalse(si.get('payment_schedule'))
+		self.assertFalse(si.get("payment_schedule"))
 
 	def test_terms_copied(self):
 		so = make_sales_order(do_not_copy=1, do_not_save=1)
-		so.payment_terms_template = '_Test Payment Term Template'
+		so.payment_terms_template = "_Test Payment Term Template"
 		so.insert()
 		so.submit()
-		self.assertTrue(so.get('payment_schedule'))
+		self.assertTrue(so.get("payment_schedule"))
 
 		si = make_sales_invoice(so.name)
 		si.insert()
-		self.assertTrue(si.get('payment_schedule'))
+		self.assertTrue(si.get("payment_schedule"))
 
 	def test_make_work_order(self):
 		# Make a new Sales Order
-		so = make_sales_order(**{
-			"item_list": [{
-				"item_code": "_Test FG Item",
-				"qty": 10,
-				"rate":100
-			},
-			{
-				"item_code": "_Test FG Item",
-				"qty": 20,
-				"rate":200
-			}]
-		})
+		so = make_sales_order(
+			**{
+				"item_list": [
+					{"item_code": "_Test FG Item", "qty": 10, "rate": 100},
+					{"item_code": "_Test FG Item", "qty": 20, "rate": 200},
+				]
+			}
+		)
 
 		# Raise Work Orders
-		po_items= []
-		so_item_name= {}
+		po_items = []
+		so_item_name = {}
 		for item in so.get_work_order_items():
-			po_items.append({
-				"warehouse": item.get("warehouse"),
-				"item_code": item.get("item_code"),
-				"pending_qty": item.get("pending_qty"),
-				"sales_order_item": item.get("sales_order_item"),
-				"bom": item.get("bom"),
-				"description": item.get("description")
-			})
-			so_item_name[item.get("sales_order_item")]= item.get("pending_qty")
-		make_work_orders(json.dumps({"items":po_items}), so.name, so.company)
+			po_items.append(
+				{
+					"warehouse": item.get("warehouse"),
+					"item_code": item.get("item_code"),
+					"pending_qty": item.get("pending_qty"),
+					"sales_order_item": item.get("sales_order_item"),
+					"bom": item.get("bom"),
+					"description": item.get("description"),
+				}
+			)
+			so_item_name[item.get("sales_order_item")] = item.get("pending_qty")
+		make_work_orders(json.dumps({"items": po_items}), so.name, so.company)
 
 		# Check if Work Orders were raised
 		for item in so_item_name:
-			wo_qty = frappe.db.sql("select sum(qty) from `tabWork Order` where sales_order=%s and sales_order_item=%s", (so.name, item))
+			wo_qty = frappe.db.sql(
+				"select sum(qty) from `tabWork Order` where sales_order=%s and sales_order_item=%s",
+				(so.name, item),
+			)
 			self.assertEqual(wo_qty[0][0], so_item_name.get(item))
 
 	def test_serial_no_based_delivery(self):
 		frappe.set_value("Stock Settings", None, "automatically_set_serial_nos_based_on_fifo", 1)
-		item = make_item("_Reserved_Serialized_Item", {"is_stock_item": 1,
-					"maintain_stock": 1,
-					"has_serial_no": 1,
-					"serial_no_series": "SI.####",
-					"valuation_rate": 500,
-					"item_defaults": [
-						{
-							"default_warehouse": "_Test Warehouse - _TC",
-							"company": "_Test Company"
-						}]
-					})
+		item = make_item(
+			"_Reserved_Serialized_Item",
+			{
+				"is_stock_item": 1,
+				"maintain_stock": 1,
+				"has_serial_no": 1,
+				"serial_no_series": "SI.####",
+				"valuation_rate": 500,
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+			},
+		)
 		frappe.db.sql("""delete from `tabSerial No` where item_code=%s""", (item.item_code))
-		make_item("_Test Item A", {"maintain_stock": 1,
-					"valuation_rate": 100,
-					"item_defaults": [
-						{
-							"default_warehouse": "_Test Warehouse - _TC",
-							"company": "_Test Company"
-						}]
-					})
-		make_item("_Test Item B", {"maintain_stock": 1,
-					"valuation_rate": 200,
-					"item_defaults": [
-						{
-							"default_warehouse": "_Test Warehouse - _TC",
-							"company": "_Test Company"
-						}]
-					})
+		make_item(
+			"_Test Item A",
+			{
+				"maintain_stock": 1,
+				"valuation_rate": 100,
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+			},
+		)
+		make_item(
+			"_Test Item B",
+			{
+				"maintain_stock": 1,
+				"valuation_rate": 200,
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+			},
+		)
 		from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
-		make_bom(item=item.item_code, rate=1000,
-			raw_materials = ['_Test Item A', '_Test Item B'])
 
-		so = make_sales_order(**{
-			"item_list": [{
-				"item_code": item.item_code,
-				"ensure_delivery_based_on_produced_serial_no": 1,
-				"qty": 1,
-				"rate":1000
-			}]
-		})
+		make_bom(item=item.item_code, rate=1000, raw_materials=["_Test Item A", "_Test Item B"])
+
+		so = make_sales_order(
+			**{
+				"item_list": [
+					{
+						"item_code": item.item_code,
+						"ensure_delivery_based_on_produced_serial_no": 1,
+						"qty": 1,
+						"rate": 1000,
+					}
+				]
+			}
+		)
 		so.submit()
 		from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record
-		work_order = make_wo_order_test_record(item=item.item_code,
-			qty=1, do_not_save=True)
+
+		work_order = make_wo_order_test_record(item=item.item_code, qty=1, do_not_save=True)
 		work_order.fg_warehouse = "_Test Warehouse - _TC"
 		work_order.sales_order = so.name
 		work_order.submit()
@@ -1143,6 +1254,7 @@
 		from erpnext.manufacturing.doctype.work_order.work_order import (
 			make_stock_entry as make_production_stock_entry,
 		)
+
 		se = frappe.get_doc(make_production_stock_entry(work_order.name, "Manufacture", 1))
 		se.submit()
 		reserved_serial_no = se.get("items")[2].serial_no
@@ -1154,7 +1266,7 @@
 		item_line = dn.get("items")[0]
 		item_line.serial_no = item_serial_no.name
 		item_line = dn.get("items")[0]
-		item_line.serial_no =  reserved_serial_no
+		item_line.serial_no = reserved_serial_no
 		dn.submit()
 		dn.load_from_db()
 		dn.cancel()
@@ -1177,6 +1289,7 @@
 		from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
 			make_delivery_note as make_delivery_note_from_invoice,
 		)
+
 		dn = make_delivery_note_from_invoice(si.name)
 		dn.save()
 		dn.submit()
@@ -1191,8 +1304,10 @@
 
 	def test_advance_payment_entry_unlink_against_sales_order(self):
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
-		frappe.db.set_value("Accounts Settings", "Accounts Settings",
-			"unlink_advance_payment_on_cancelation_of_order", 0)
+
+		frappe.db.set_value(
+			"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 0
+		)
 
 		so = make_sales_order()
 
@@ -1207,7 +1322,7 @@
 		pe.save(ignore_permissions=True)
 		pe.submit()
 
-		so_doc = frappe.get_doc('Sales Order', so.name)
+		so_doc = frappe.get_doc("Sales Order", so.name)
 
 		self.assertRaises(frappe.LinkExistsError, so_doc.cancel)
 
@@ -1218,8 +1333,9 @@
 		so = make_sales_order()
 
 		# disable unlinking of payment entry
-		frappe.db.set_value("Accounts Settings", "Accounts Settings",
-			"unlink_advance_payment_on_cancelation_of_order", 0)
+		frappe.db.set_value(
+			"Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order", 0
+		)
 
 		# create a payment entry against sales order
 		pe = get_payment_entry("Sales Order", so.name, bank_account="_Test Bank - _TC")
@@ -1239,81 +1355,77 @@
 
 		# Cancel sales order
 		try:
-			so_doc = frappe.get_doc('Sales Order', so.name)
+			so_doc = frappe.get_doc("Sales Order", so.name)
 			so_doc.cancel()
 		except Exception:
 			self.fail("Can not cancel sales order with linked cancelled payment entry")
 
 	def test_request_for_raw_materials(self):
-		item = make_item("_Test Finished Item", {"is_stock_item": 1,
-			"maintain_stock": 1,
-			"valuation_rate": 500,
-			"item_defaults": [
-				{
-					"default_warehouse": "_Test Warehouse - _TC",
-					"company": "_Test Company"
-				}]
-			})
-		make_item("_Test Raw Item A", {"maintain_stock": 1,
-					"valuation_rate": 100,
-					"item_defaults": [
-						{
-							"default_warehouse": "_Test Warehouse - _TC",
-							"company": "_Test Company"
-						}]
-					})
-		make_item("_Test Raw Item B", {"maintain_stock": 1,
-					"valuation_rate": 200,
-					"item_defaults": [
-						{
-							"default_warehouse": "_Test Warehouse - _TC",
-							"company": "_Test Company"
-						}]
-					})
+		item = make_item(
+			"_Test Finished Item",
+			{
+				"is_stock_item": 1,
+				"maintain_stock": 1,
+				"valuation_rate": 500,
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+			},
+		)
+		make_item(
+			"_Test Raw Item A",
+			{
+				"maintain_stock": 1,
+				"valuation_rate": 100,
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+			},
+		)
+		make_item(
+			"_Test Raw Item B",
+			{
+				"maintain_stock": 1,
+				"valuation_rate": 200,
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+			},
+		)
 		from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
-		make_bom(item=item.item_code, rate=1000,
-			raw_materials = ['_Test Raw Item A', '_Test Raw Item B'])
 
-		so = make_sales_order(**{
-			"item_list": [{
-				"item_code": item.item_code,
-				"qty": 1,
-				"rate":1000
-			}]
-		})
+		make_bom(item=item.item_code, rate=1000, raw_materials=["_Test Raw Item A", "_Test Raw Item B"])
+
+		so = make_sales_order(**{"item_list": [{"item_code": item.item_code, "qty": 1, "rate": 1000}]})
 		so.submit()
 		mr_dict = frappe._dict()
 		items = so.get_work_order_items(1)
-		mr_dict['items'] = items
-		mr_dict['include_exploded_items'] = 0
-		mr_dict['ignore_existing_ordered_qty'] = 1
+		mr_dict["items"] = items
+		mr_dict["include_exploded_items"] = 0
+		mr_dict["ignore_existing_ordered_qty"] = 1
 		make_raw_material_request(mr_dict, so.company, so.name)
-		mr = frappe.db.sql("""select name from `tabMaterial Request` ORDER BY creation DESC LIMIT 1""", as_dict=1)[0]
-		mr_doc = frappe.get_doc('Material Request',mr.get('name'))
+		mr = frappe.db.sql(
+			"""select name from `tabMaterial Request` ORDER BY creation DESC LIMIT 1""", as_dict=1
+		)[0]
+		mr_doc = frappe.get_doc("Material Request", mr.get("name"))
 		self.assertEqual(mr_doc.items[0].sales_order, so.name)
 
 	def test_so_optional_blanket_order(self):
 		"""
-			Expected result: Blanket order Ordered Quantity should only be affected on Sales Order with against_blanket_order = 1.
-			Second Sales Order should not add on to Blanket Orders Ordered Quantity.
+		Expected result: Blanket order Ordered Quantity should only be affected on Sales Order with against_blanket_order = 1.
+		Second Sales Order should not add on to Blanket Orders Ordered Quantity.
 		"""
 
-		bo = make_blanket_order(blanket_order_type = "Selling", quantity = 10, rate = 10)
+		bo = make_blanket_order(blanket_order_type="Selling", quantity=10, rate=10)
 
-		so = make_sales_order(item_code= "_Test Item", qty = 5, against_blanket_order = 1)
-		so_doc = frappe.get_doc('Sales Order', so.get('name'))
+		so = make_sales_order(item_code="_Test Item", qty=5, against_blanket_order=1)
+		so_doc = frappe.get_doc("Sales Order", so.get("name"))
 		# To test if the SO has a Blanket Order
 		self.assertTrue(so_doc.items[0].blanket_order)
 
-		so = make_sales_order(item_code= "_Test Item", qty = 5, against_blanket_order = 0)
-		so_doc = frappe.get_doc('Sales Order', so.get('name'))
+		so = make_sales_order(item_code="_Test Item", qty=5, against_blanket_order=0)
+		so_doc = frappe.get_doc("Sales Order", so.get("name"))
 		# To test if the SO does NOT have a Blanket Order
 		self.assertEqual(so_doc.items[0].blanket_order, None)
 
 	def test_so_cancellation_when_si_drafted(self):
 		"""
-			Test to check if Sales Order gets cancelled if Sales Invoice is in Draft state
-			Expected result: sales order should not get cancelled
+		Test to check if Sales Order gets cancelled if Sales Invoice is in Draft state
+		Expected result: sales order should not get cancelled
 		"""
 		so = make_sales_order()
 		so.submit()
@@ -1324,8 +1436,8 @@
 
 	def test_so_cancellation_after_si_submission(self):
 		"""
-			Test to check if Sales Order gets cancelled when linked Sales Invoice has been Submitted
-			Expected result: Sales Order should not get cancelled
+		Test to check if Sales Order gets cancelled when linked Sales Invoice has been Submitted
+		Expected result: Sales Order should not get cancelled
 		"""
 		so = make_sales_order()
 		so.submit()
@@ -1337,8 +1449,8 @@
 
 	def test_so_cancellation_after_dn_submission(self):
 		"""
-			Test to check if Sales Order gets cancelled when linked Delivery Note has been Submitted
-			Expected result: Sales Order should not get cancelled
+		Test to check if Sales Order gets cancelled when linked Delivery Note has been Submitted
+		Expected result: Sales Order should not get cancelled
 		"""
 		so = make_sales_order()
 		so.submit()
@@ -1350,7 +1462,7 @@
 
 	def test_so_cancellation_after_maintenance_schedule_submission(self):
 		"""
-			Expected result: Sales Order should not get cancelled
+		Expected result: Sales Order should not get cancelled
 		"""
 		so = make_sales_order()
 		so.submit()
@@ -1363,7 +1475,7 @@
 
 	def test_so_cancellation_after_maintenance_visit_submission(self):
 		"""
-			Expected result: Sales Order should not get cancelled
+		Expected result: Sales Order should not get cancelled
 		"""
 		so = make_sales_order()
 		so.submit()
@@ -1377,7 +1489,7 @@
 
 	def test_so_cancellation_after_work_order_submission(self):
 		"""
-			Expected result: Sales Order should not get cancelled
+		Expected result: Sales Order should not get cancelled
 		"""
 		from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record
 
@@ -1398,7 +1510,7 @@
 
 		so = make_sales_order(uom="Nos", do_not_save=1)
 		create_payment_terms_template()
-		so.payment_terms_template = 'Test Receivable Template'
+		so.payment_terms_template = "Test Receivable Template"
 		so.submit()
 
 		si = create_sales_invoice(qty=10, do_not_save=1)
@@ -1420,10 +1532,10 @@
 		so.submit()
 
 		self.assertEqual(so.net_total, 0)
-		self.assertEqual(so.billing_status, 'Not Billed')
+		self.assertEqual(so.billing_status, "Not Billed")
 
 		si = create_sales_invoice(qty=10, do_not_save=1)
-		si.price_list = '_Test Price List'
+		si.price_list = "_Test Price List"
 		si.items[0].rate = 0
 		si.items[0].price_list_rate = 0
 		si.items[0].sales_order = so.name
@@ -1433,7 +1545,7 @@
 
 		self.assertEqual(si.net_total, 0)
 		so.load_from_db()
-		self.assertEqual(so.billing_status, 'Fully Billed')
+		self.assertEqual(so.billing_status, "Fully Billed")
 
 	def test_so_back_updated_from_wo_via_mr(self):
 		"SO -> MR (Manufacture) -> WO. Test if WO Qty is updated in SO."
@@ -1442,7 +1554,7 @@
 		)
 		from erpnext.stock.doctype.material_request.material_request import raise_work_orders
 
-		so = make_sales_order(item_list=[{"item_code": "_Test FG Item","qty": 2, "rate":100}])
+		so = make_sales_order(item_list=[{"item_code": "_Test FG Item", "qty": 2, "rate": 100}])
 
 		mr = make_material_request(so.name)
 		mr.material_request_type = "Manufacture"
@@ -1459,17 +1571,18 @@
 		self.assertEqual(wo.sales_order_item, so.items[0].name)
 
 		wo.submit()
-		make_stock_entry(item_code="_Test Item", # Stock RM
-			target="Work In Progress - _TC",
-			qty=4, basic_rate=100
+		make_stock_entry(
+			item_code="_Test Item", target="Work In Progress - _TC", qty=4, basic_rate=100  # Stock RM
 		)
-		make_stock_entry(item_code="_Test Item Home Desktop 100", # Stock RM
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100",  # Stock RM
 			target="Work In Progress - _TC",
-			qty=4, basic_rate=100
+			qty=4,
+			basic_rate=100,
 		)
 
 		se = frappe.get_doc(make_se_from_wo(wo.name, "Manufacture", 2))
-		se.submit() # Finish WO
+		se.submit()  # Finish WO
 
 		mr.reload()
 		wo.reload()
@@ -1479,7 +1592,10 @@
 
 	def test_sales_order_with_shipping_rule(self):
 		from erpnext.accounts.doctype.shipping_rule.test_shipping_rule import create_shipping_rule
-		shipping_rule = create_shipping_rule(shipping_rule_type = "Selling", shipping_rule_name = "Shipping Rule - Sales Invoice Test")
+
+		shipping_rule = create_shipping_rule(
+			shipping_rule_type="Selling", shipping_rule_name="Shipping Rule - Sales Invoice Test"
+		)
 		sales_order = make_sales_order(do_not_save=True)
 		sales_order.shipping_rule = shipping_rule.name
 
@@ -1499,29 +1615,32 @@
 		sales_order.save()
 		self.assertEqual(sales_order.taxes[0].tax_amount, 0)
 
+
 def automatically_fetch_payment_terms(enable=1):
 	accounts_settings = frappe.get_doc("Accounts Settings")
 	accounts_settings.automatically_fetch_payment_terms = enable
 	accounts_settings.save()
 
+
 def compare_payment_schedules(doc, doc1, doc2):
-	for index, schedule in enumerate(doc1.get('payment_schedule')):
+	for index, schedule in enumerate(doc1.get("payment_schedule")):
 		doc.assertEqual(schedule.payment_term, doc2.payment_schedule[index].payment_term)
 		doc.assertEqual(getdate(schedule.due_date), doc2.payment_schedule[index].due_date)
 		doc.assertEqual(schedule.invoice_portion, doc2.payment_schedule[index].invoice_portion)
 		doc.assertEqual(schedule.payment_amount, doc2.payment_schedule[index].payment_amount)
 
+
 def make_sales_order(**args):
 	so = frappe.new_doc("Sales Order")
 	args = frappe._dict(args)
 	if args.transaction_date:
 		so.transaction_date = args.transaction_date
 
-	so.set_warehouse = "" # no need to test set_warehouse permission since it only affects the client
+	so.set_warehouse = ""  # no need to test set_warehouse permission since it only affects the client
 	so.company = args.company or "_Test Company"
 	so.customer = args.customer or "_Test Customer"
 	so.currency = args.currency or "INR"
-	so.po_no = args.po_no or '12345'
+	so.po_no = args.po_no or "12345"
 	if args.selling_price_list:
 		so.selling_price_list = args.selling_price_list
 
@@ -1533,14 +1652,17 @@
 			so.append("items", item)
 
 	else:
-		so.append("items", {
-			"item_code": args.item or args.item_code or "_Test Item",
-			"warehouse": args.warehouse,
-			"qty": args.qty or 10,
-			"uom": args.uom or None,
-			"rate": args.rate or 100,
-			"against_blanket_order": args.against_blanket_order
-		})
+		so.append(
+			"items",
+			{
+				"item_code": args.item or args.item_code or "_Test Item",
+				"warehouse": args.warehouse,
+				"qty": args.qty or 10,
+				"uom": args.uom or None,
+				"rate": args.rate or 100,
+				"against_blanket_order": args.against_blanket_order,
+			},
+		)
 
 	so.delivery_date = add_days(so.transaction_date, 10)
 
@@ -1555,6 +1677,7 @@
 
 	return so
 
+
 def create_dn_against_so(so, delivered_qty=0):
 	frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
 
@@ -1564,41 +1687,63 @@
 	dn.submit()
 	return dn
 
+
 def get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"):
-	return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
-		"reserved_qty"))
+	return flt(
+		frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "reserved_qty")
+	)
+
 
 test_dependencies = ["Currency Exchange"]
 
+
 def make_sales_order_workflow():
-	if frappe.db.exists('Workflow', 'SO Test Workflow'):
+	if frappe.db.exists("Workflow", "SO Test Workflow"):
 		doc = frappe.get_doc("Workflow", "SO Test Workflow")
 		doc.set("is_active", 1)
 		doc.save()
 		return doc
 
-	frappe.get_doc(dict(doctype='Role', role_name='Test Junior Approver')).insert(ignore_if_duplicate=True)
-	frappe.get_doc(dict(doctype='Role', role_name='Test Approver')).insert(ignore_if_duplicate=True)
-	frappe.cache().hdel('roles', frappe.session.user)
+	frappe.get_doc(dict(doctype="Role", role_name="Test Junior Approver")).insert(
+		ignore_if_duplicate=True
+	)
+	frappe.get_doc(dict(doctype="Role", role_name="Test Approver")).insert(ignore_if_duplicate=True)
+	frappe.cache().hdel("roles", frappe.session.user)
 
-	workflow = frappe.get_doc({
-		"doctype": "Workflow",
-		"workflow_name": "SO Test Workflow",
-		"document_type": "Sales Order",
-		"workflow_state_field": "workflow_state",
-		"is_active": 1,
-		"send_email_alert": 0,
-	})
-	workflow.append('states', dict( state = 'Pending', allow_edit = 'All' ))
-	workflow.append('states', dict( state = 'Approved', allow_edit = 'Test Approver', doc_status = 1 ))
-	workflow.append('transitions', dict(
-		state = 'Pending', action = 'Approve', next_state = 'Approved', allowed = 'Test Junior Approver', allow_self_approval = 1,
-		condition = 'doc.grand_total < 200'
-	))
-	workflow.append('transitions', dict(
-		state = 'Pending', action = 'Approve', next_state = 'Approved', allowed = 'Test Approver', allow_self_approval = 1,
-		 condition = 'doc.grand_total > 200'
-	))
+	workflow = frappe.get_doc(
+		{
+			"doctype": "Workflow",
+			"workflow_name": "SO Test Workflow",
+			"document_type": "Sales Order",
+			"workflow_state_field": "workflow_state",
+			"is_active": 1,
+			"send_email_alert": 0,
+		}
+	)
+	workflow.append("states", dict(state="Pending", allow_edit="All"))
+	workflow.append("states", dict(state="Approved", allow_edit="Test Approver", doc_status=1))
+	workflow.append(
+		"transitions",
+		dict(
+			state="Pending",
+			action="Approve",
+			next_state="Approved",
+			allowed="Test Junior Approver",
+			allow_self_approval=1,
+			condition="doc.grand_total < 200",
+		),
+	)
+	workflow.append(
+		"transitions",
+		dict(
+			state="Pending",
+			action="Approve",
+			next_state="Approved",
+			allowed="Test Approver",
+			allow_self_approval=1,
+			condition="doc.grand_total > 200",
+		),
+	)
 	workflow.insert(ignore_permissions=True)
 
 	return workflow
diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.py b/erpnext/selling/doctype/sales_order_item/sales_order_item.py
index 441a6ac..83d3f3b 100644
--- a/erpnext/selling/doctype/sales_order_item/sales_order_item.py
+++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.py
@@ -9,5 +9,6 @@
 class SalesOrderItem(Document):
 	pass
 
+
 def on_doctype_update():
 	frappe.db.add_index("Sales Order Item", ["item_code", "warehouse"])
diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py
index e1ef635..29e4712 100644
--- a/erpnext/selling/doctype/selling_settings/selling_settings.py
+++ b/erpnext/selling/doctype/selling_settings/selling_settings.py
@@ -16,23 +16,45 @@
 		self.toggle_editable_rate_for_bundle_items()
 
 	def validate(self):
-		for key in ["cust_master_name", "customer_group", "territory",
-			"maintain_same_sales_rate", "editable_price_list_rate", "selling_price_list"]:
-				frappe.db.set_default(key, self.get(key, ""))
+		for key in [
+			"cust_master_name",
+			"customer_group",
+			"territory",
+			"maintain_same_sales_rate",
+			"editable_price_list_rate",
+			"selling_price_list",
+		]:
+			frappe.db.set_default(key, self.get(key, ""))
 
 		from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series
-		set_by_naming_series("Customer", "customer_name",
-			self.get("cust_master_name")=="Naming Series", hide_name_field=False)
+
+		set_by_naming_series(
+			"Customer",
+			"customer_name",
+			self.get("cust_master_name") == "Naming Series",
+			hide_name_field=False,
+		)
 
 	def toggle_hide_tax_id(self):
 		self.hide_tax_id = cint(self.hide_tax_id)
 
 		# Make property setters to hide tax_id fields
 		for doctype in ("Sales Order", "Sales Invoice", "Delivery Note"):
-			make_property_setter(doctype, "tax_id", "hidden", self.hide_tax_id, "Check", validate_fields_for_doctype=False)
-			make_property_setter(doctype, "tax_id", "print_hide", self.hide_tax_id, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype, "tax_id", "hidden", self.hide_tax_id, "Check", validate_fields_for_doctype=False
+			)
+			make_property_setter(
+				doctype, "tax_id", "print_hide", self.hide_tax_id, "Check", validate_fields_for_doctype=False
+			)
 
 	def toggle_editable_rate_for_bundle_items(self):
 		editable_bundle_item_rates = cint(self.editable_bundle_item_rates)
 
-		make_property_setter("Packed Item", "rate", "read_only", not(editable_bundle_item_rates), "Check", validate_fields_for_doctype=False)
+		make_property_setter(
+			"Packed Item",
+			"rate",
+			"read_only",
+			not (editable_bundle_item_rates),
+			"Check",
+			validate_fields_for_doctype=False,
+		)
diff --git a/erpnext/selling/doctype/sms_center/sms_center.py b/erpnext/selling/doctype/sms_center/sms_center.py
index d192457..cdc7397 100644
--- a/erpnext/selling/doctype/sms_center/sms_center.py
+++ b/erpnext/selling/doctype/sms_center/sms_center.py
@@ -12,59 +12,80 @@
 class SMSCenter(Document):
 	@frappe.whitelist()
 	def create_receiver_list(self):
-		rec, where_clause = '', ''
-		if self.send_to == 'All Customer Contact':
+		rec, where_clause = "", ""
+		if self.send_to == "All Customer Contact":
 			where_clause = " and dl.link_doctype = 'Customer'"
 			if self.customer:
-				where_clause += " and dl.link_name = '%s'" % \
-					self.customer.replace("'", "\'") or " and ifnull(dl.link_name, '') != ''"
-		if self.send_to == 'All Supplier Contact':
+				where_clause += (
+					" and dl.link_name = '%s'" % self.customer.replace("'", "'")
+					or " and ifnull(dl.link_name, '') != ''"
+				)
+		if self.send_to == "All Supplier Contact":
 			where_clause = " and dl.link_doctype = 'Supplier'"
 			if self.supplier:
-				where_clause += " and dl.link_name = '%s'" % \
-					self.supplier.replace("'", "\'") or " and ifnull(dl.link_name, '') != ''"
-		if self.send_to == 'All Sales Partner Contact':
+				where_clause += (
+					" and dl.link_name = '%s'" % self.supplier.replace("'", "'")
+					or " and ifnull(dl.link_name, '') != ''"
+				)
+		if self.send_to == "All Sales Partner Contact":
 			where_clause = " and dl.link_doctype = 'Sales Partner'"
 			if self.sales_partner:
-				where_clause += "and dl.link_name = '%s'" % \
-					self.sales_partner.replace("'", "\'") or " and ifnull(dl.link_name, '') != ''"
-		if self.send_to in ['All Contact', 'All Customer Contact', 'All Supplier Contact', 'All Sales Partner Contact']:
-			rec = frappe.db.sql("""select CONCAT(ifnull(c.first_name,''), ' ', ifnull(c.last_name,'')),
+				where_clause += (
+					"and dl.link_name = '%s'" % self.sales_partner.replace("'", "'")
+					or " and ifnull(dl.link_name, '') != ''"
+				)
+		if self.send_to in [
+			"All Contact",
+			"All Customer Contact",
+			"All Supplier Contact",
+			"All Sales Partner Contact",
+		]:
+			rec = frappe.db.sql(
+				"""select CONCAT(ifnull(c.first_name,''), ' ', ifnull(c.last_name,'')),
 				c.mobile_no from `tabContact` c, `tabDynamic Link` dl  where ifnull(c.mobile_no,'')!='' and
-				c.docstatus != 2 and dl.parent = c.name%s""" % where_clause)
+				c.docstatus != 2 and dl.parent = c.name%s"""
+				% where_clause
+			)
 
-		elif self.send_to == 'All Lead (Open)':
-			rec = frappe.db.sql("""select lead_name, mobile_no from `tabLead` where
-				ifnull(mobile_no,'')!='' and docstatus != 2 and status='Open'""")
+		elif self.send_to == "All Lead (Open)":
+			rec = frappe.db.sql(
+				"""select lead_name, mobile_no from `tabLead` where
+				ifnull(mobile_no,'')!='' and docstatus != 2 and status='Open'"""
+			)
 
-		elif self.send_to == 'All Employee (Active)':
-			where_clause = self.department and " and department = '%s'" % \
-				self.department.replace("'", "\'") or ""
-			where_clause += self.branch and " and branch = '%s'" % \
-				self.branch.replace("'", "\'") or ""
+		elif self.send_to == "All Employee (Active)":
+			where_clause = (
+				self.department and " and department = '%s'" % self.department.replace("'", "'") or ""
+			)
+			where_clause += self.branch and " and branch = '%s'" % self.branch.replace("'", "'") or ""
 
-			rec = frappe.db.sql("""select employee_name, cell_number from
+			rec = frappe.db.sql(
+				"""select employee_name, cell_number from
 				`tabEmployee` where status = 'Active' and docstatus < 2 and
-				ifnull(cell_number,'')!='' %s""" % where_clause)
+				ifnull(cell_number,'')!='' %s"""
+				% where_clause
+			)
 
-		elif self.send_to == 'All Sales Person':
-			rec = frappe.db.sql("""select sales_person_name,
+		elif self.send_to == "All Sales Person":
+			rec = frappe.db.sql(
+				"""select sales_person_name,
 				tabEmployee.cell_number from `tabSales Person` left join tabEmployee
 				on `tabSales Person`.employee = tabEmployee.name
-				where ifnull(tabEmployee.cell_number,'')!=''""")
+				where ifnull(tabEmployee.cell_number,'')!=''"""
+			)
 
-		rec_list = ''
+		rec_list = ""
 		for d in rec:
-			rec_list += d[0] + ' - ' + d[1] + '\n'
+			rec_list += d[0] + " - " + d[1] + "\n"
 		self.receiver_list = rec_list
 
 	def get_receiver_nos(self):
 		receiver_nos = []
 		if self.receiver_list:
-			for d in self.receiver_list.split('\n'):
+			for d in self.receiver_list.split("\n"):
 				receiver_no = d
-				if '-' in d:
-					receiver_no = receiver_no.split('-')[1]
+				if "-" in d:
+					receiver_no = receiver_no.split("-")[1]
 				if receiver_no.strip():
 					receiver_nos.append(cstr(receiver_no).strip())
 		else:
diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.py b/erpnext/selling/page/point_of_sale/point_of_sale.py
index 67948d7..bf62982 100644
--- a/erpnext/selling/page/point_of_sale/point_of_sale.py
+++ b/erpnext/selling/page/point_of_sale/point_of_sale.py
@@ -20,31 +20,46 @@
 	barcode = result.get("barcode") or ""
 
 	if result:
-		item_info = frappe.db.get_value("Item", item_code,
-			["name as item_code", "item_name", "description", "stock_uom", "image as item_image", "is_stock_item"],
-			as_dict=1)
+		item_info = frappe.db.get_value(
+			"Item",
+			item_code,
+			[
+				"name as item_code",
+				"item_name",
+				"description",
+				"stock_uom",
+				"image as item_image",
+				"is_stock_item",
+			],
+			as_dict=1,
+		)
 
 		item_stock_qty, is_stock_item = get_stock_availability(item_code, warehouse)
-		price_list_rate, currency = frappe.db.get_value('Item Price', {
-			'price_list': price_list,
-			'item_code': item_code
-		}, ["price_list_rate", "currency"]) or [None, None]
+		price_list_rate, currency = frappe.db.get_value(
+			"Item Price",
+			{"price_list": price_list, "item_code": item_code},
+			["price_list_rate", "currency"],
+		) or [None, None]
 
-		item_info.update({
-			'serial_no': serial_no,
-			'batch_no': batch_no,
-			'barcode': barcode,
-			'price_list_rate': price_list_rate,
-			'currency': currency,
-			'actual_qty': item_stock_qty
-		})
+		item_info.update(
+			{
+				"serial_no": serial_no,
+				"batch_no": batch_no,
+				"barcode": barcode,
+				"price_list_rate": price_list_rate,
+				"currency": currency,
+				"actual_qty": item_stock_qty,
+			}
+		)
 
-		return {'items': [item_info]}
+		return {"items": [item_info]}
+
 
 @frappe.whitelist()
 def get_items(start, page_length, price_list, item_group, pos_profile, search_term=""):
 	warehouse, hide_unavailable_items = frappe.db.get_value(
-		'POS Profile', pos_profile, ['warehouse', 'hide_unavailable_items'])
+		"POS Profile", pos_profile, ["warehouse", "hide_unavailable_items"]
+	)
 
 	result = []
 
@@ -53,20 +68,23 @@
 		if result:
 			return result
 
-	if not frappe.db.exists('Item Group', item_group):
-		item_group = get_root_of('Item Group')
+	if not frappe.db.exists("Item Group", item_group):
+		item_group = get_root_of("Item Group")
 
 	condition = get_conditions(search_term)
 	condition += get_item_group_condition(pos_profile)
 
-	lft, rgt = frappe.db.get_value('Item Group', item_group, ['lft', 'rgt'])
+	lft, rgt = frappe.db.get_value("Item Group", item_group, ["lft", "rgt"])
 
 	bin_join_selection, bin_join_condition = "", ""
 	if hide_unavailable_items:
 		bin_join_selection = ", `tabBin` bin"
-		bin_join_condition = "AND bin.warehouse = %(warehouse)s AND bin.item_code = item.name AND bin.actual_qty > 0"
+		bin_join_condition = (
+			"AND bin.warehouse = %(warehouse)s AND bin.item_code = item.name AND bin.actual_qty > 0"
+		)
 
-	items_data = frappe.db.sql("""
+	items_data = frappe.db.sql(
+		"""
 		SELECT
 			item.name AS item_code,
 			item.item_name,
@@ -87,22 +105,26 @@
 		ORDER BY
 			item.name asc
 		LIMIT
-			{start}, {page_length}"""
-		.format(
+			{start}, {page_length}""".format(
 			start=start,
 			page_length=page_length,
 			lft=lft,
 			rgt=rgt,
 			condition=condition,
 			bin_join_selection=bin_join_selection,
-			bin_join_condition=bin_join_condition
-		), {'warehouse': warehouse}, as_dict=1)
+			bin_join_condition=bin_join_condition,
+		),
+		{"warehouse": warehouse},
+		as_dict=1,
+	)
 
 	if items_data:
 		items = [d.item_code for d in items_data]
-		item_prices_data = frappe.get_all("Item Price",
-			fields = ["item_code", "price_list_rate", "currency"],
-			filters = {'price_list': price_list, 'item_code': ['in', items]})
+		item_prices_data = frappe.get_all(
+			"Item Price",
+			fields=["item_code", "price_list_rate", "currency"],
+			filters={"price_list": price_list, "item_code": ["in", items]},
+		)
 
 		item_prices = {}
 		for d in item_prices_data:
@@ -115,176 +137,204 @@
 
 			row = {}
 			row.update(item)
-			row.update({
-				'price_list_rate': item_price.get('price_list_rate'),
-				'currency': item_price.get('currency'),
-				'actual_qty': item_stock_qty,
-			})
+			row.update(
+				{
+					"price_list_rate": item_price.get("price_list_rate"),
+					"currency": item_price.get("currency"),
+					"actual_qty": item_stock_qty,
+				}
+			)
 			result.append(row)
 
-	return {'items': result}
+	return {"items": result}
+
 
 @frappe.whitelist()
 def search_for_serial_or_batch_or_barcode_number(search_value):
 	# search barcode no
-	barcode_data = frappe.db.get_value('Item Barcode', {'barcode': search_value}, ['barcode', 'parent as item_code'], as_dict=True)
+	barcode_data = frappe.db.get_value(
+		"Item Barcode", {"barcode": search_value}, ["barcode", "parent as item_code"], as_dict=True
+	)
 	if barcode_data:
 		return barcode_data
 
 	# search serial no
-	serial_no_data = frappe.db.get_value('Serial No', search_value, ['name as serial_no', 'item_code'], as_dict=True)
+	serial_no_data = frappe.db.get_value(
+		"Serial No", search_value, ["name as serial_no", "item_code"], as_dict=True
+	)
 	if serial_no_data:
 		return serial_no_data
 
 	# search batch no
-	batch_no_data = frappe.db.get_value('Batch', search_value, ['name as batch_no', 'item as item_code'], as_dict=True)
+	batch_no_data = frappe.db.get_value(
+		"Batch", search_value, ["name as batch_no", "item as item_code"], as_dict=True
+	)
 	if batch_no_data:
 		return batch_no_data
 
 	return {}
 
+
 def get_conditions(search_term):
 	condition = "("
 	condition += """item.name like {search_term}
-		or item.item_name like {search_term}""".format(search_term=frappe.db.escape('%' + search_term + '%'))
+		or item.item_name like {search_term}""".format(
+		search_term=frappe.db.escape("%" + search_term + "%")
+	)
 	condition += add_search_fields_condition(search_term)
 	condition += ")"
 
 	return condition
 
+
 def add_search_fields_condition(search_term):
-	condition = ''
-	search_fields = frappe.get_all('POS Search Fields', fields = ['fieldname'])
+	condition = ""
+	search_fields = frappe.get_all("POS Search Fields", fields=["fieldname"])
 	if search_fields:
 		for field in search_fields:
-			condition += " or item.`{0}` like {1}".format(field['fieldname'], frappe.db.escape('%' + search_term + '%'))
+			condition += " or item.`{0}` like {1}".format(
+				field["fieldname"], frappe.db.escape("%" + search_term + "%")
+			)
 	return condition
 
+
 def get_item_group_condition(pos_profile):
 	cond = "and 1=1"
 	item_groups = get_item_groups(pos_profile)
 	if item_groups:
-		cond = "and item.item_group in (%s)"%(', '.join(['%s']*len(item_groups)))
+		cond = "and item.item_group in (%s)" % (", ".join(["%s"] * len(item_groups)))
 
 	return cond % tuple(item_groups)
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def item_group_query(doctype, txt, searchfield, start, page_len, filters):
 	item_groups = []
 	cond = "1=1"
-	pos_profile= filters.get('pos_profile')
+	pos_profile = filters.get("pos_profile")
 
 	if pos_profile:
 		item_groups = get_item_groups(pos_profile)
 
 		if item_groups:
-			cond = "name in (%s)"%(', '.join(['%s']*len(item_groups)))
+			cond = "name in (%s)" % (", ".join(["%s"] * len(item_groups)))
 			cond = cond % tuple(item_groups)
 
-	return frappe.db.sql(""" select distinct name from `tabItem Group`
-			where {condition} and (name like %(txt)s) limit {start}, {page_len}"""
-		.format(condition = cond, start=start, page_len= page_len),
-			{'txt': '%%%s%%' % txt})
+	return frappe.db.sql(
+		""" select distinct name from `tabItem Group`
+			where {condition} and (name like %(txt)s) limit {start}, {page_len}""".format(
+			condition=cond, start=start, page_len=page_len
+		),
+		{"txt": "%%%s%%" % txt},
+	)
+
 
 @frappe.whitelist()
 def check_opening_entry(user):
-	open_vouchers = frappe.db.get_all("POS Opening Entry",
-		filters = {
-			"user": user,
-			"pos_closing_entry": ["in", ["", None]],
-			"docstatus": 1
-		},
-		fields = ["name", "company", "pos_profile", "period_start_date"],
-		order_by = "period_start_date desc"
+	open_vouchers = frappe.db.get_all(
+		"POS Opening Entry",
+		filters={"user": user, "pos_closing_entry": ["in", ["", None]], "docstatus": 1},
+		fields=["name", "company", "pos_profile", "period_start_date"],
+		order_by="period_start_date desc",
 	)
 
 	return open_vouchers
 
+
 @frappe.whitelist()
 def create_opening_voucher(pos_profile, company, balance_details):
 	balance_details = json.loads(balance_details)
 
-	new_pos_opening = frappe.get_doc({
-		'doctype': 'POS Opening Entry',
-		"period_start_date": frappe.utils.get_datetime(),
-		"posting_date": frappe.utils.getdate(),
-		"user": frappe.session.user,
-		"pos_profile": pos_profile,
-		"company": company,
-	})
+	new_pos_opening = frappe.get_doc(
+		{
+			"doctype": "POS Opening Entry",
+			"period_start_date": frappe.utils.get_datetime(),
+			"posting_date": frappe.utils.getdate(),
+			"user": frappe.session.user,
+			"pos_profile": pos_profile,
+			"company": company,
+		}
+	)
 	new_pos_opening.set("balance_details", balance_details)
 	new_pos_opening.submit()
 
 	return new_pos_opening.as_dict()
 
+
 @frappe.whitelist()
 def get_past_order_list(search_term, status, limit=20):
-	fields = ['name', 'grand_total', 'currency', 'customer', 'posting_time', 'posting_date']
+	fields = ["name", "grand_total", "currency", "customer", "posting_time", "posting_date"]
 	invoice_list = []
 
 	if search_term and status:
-		invoices_by_customer = frappe.db.get_all('POS Invoice', filters={
-			'customer': ['like', '%{}%'.format(search_term)],
-			'status': status
-		}, fields=fields)
-		invoices_by_name = frappe.db.get_all('POS Invoice', filters={
-			'name': ['like', '%{}%'.format(search_term)],
-			'status': status
-		}, fields=fields)
+		invoices_by_customer = frappe.db.get_all(
+			"POS Invoice",
+			filters={"customer": ["like", "%{}%".format(search_term)], "status": status},
+			fields=fields,
+		)
+		invoices_by_name = frappe.db.get_all(
+			"POS Invoice",
+			filters={"name": ["like", "%{}%".format(search_term)], "status": status},
+			fields=fields,
+		)
 
 		invoice_list = invoices_by_customer + invoices_by_name
 	elif status:
-		invoice_list = frappe.db.get_all('POS Invoice', filters={
-			'status': status
-		}, fields=fields)
+		invoice_list = frappe.db.get_all("POS Invoice", filters={"status": status}, fields=fields)
 
 	return invoice_list
 
+
 @frappe.whitelist()
 def set_customer_info(fieldname, customer, value=""):
-	if fieldname == 'loyalty_program':
-		frappe.db.set_value('Customer', customer, 'loyalty_program', value)
+	if fieldname == "loyalty_program":
+		frappe.db.set_value("Customer", customer, "loyalty_program", value)
 
-	contact = frappe.get_cached_value('Customer', customer, 'customer_primary_contact')
+	contact = frappe.get_cached_value("Customer", customer, "customer_primary_contact")
 	if not contact:
-		contact = frappe.db.sql("""
+		contact = frappe.db.sql(
+			"""
 			SELECT parent FROM `tabDynamic Link`
 			WHERE
 				parenttype = 'Contact' AND
 				parentfield = 'links' AND
 				link_doctype = 'Customer' AND
 				link_name = %s
-			""", (customer), as_dict=1)
-		contact = contact[0].get('parent') if contact else None
+			""",
+			(customer),
+			as_dict=1,
+		)
+		contact = contact[0].get("parent") if contact else None
 
 	if not contact:
-		new_contact = frappe.new_doc('Contact')
+		new_contact = frappe.new_doc("Contact")
 		new_contact.is_primary_contact = 1
 		new_contact.first_name = customer
-		new_contact.set('links', [{'link_doctype': 'Customer', 'link_name': customer}])
+		new_contact.set("links", [{"link_doctype": "Customer", "link_name": customer}])
 		new_contact.save()
 		contact = new_contact.name
-		frappe.db.set_value('Customer', customer, 'customer_primary_contact', contact)
+		frappe.db.set_value("Customer", customer, "customer_primary_contact", contact)
 
-	contact_doc = frappe.get_doc('Contact', contact)
-	if fieldname == 'email_id':
-		contact_doc.set('email_ids', [{ 'email_id': value, 'is_primary': 1}])
-		frappe.db.set_value('Customer', customer, 'email_id', value)
-	elif fieldname == 'mobile_no':
-		contact_doc.set('phone_nos', [{ 'phone': value, 'is_primary_mobile_no': 1}])
-		frappe.db.set_value('Customer', customer, 'mobile_no', value)
+	contact_doc = frappe.get_doc("Contact", contact)
+	if fieldname == "email_id":
+		contact_doc.set("email_ids", [{"email_id": value, "is_primary": 1}])
+		frappe.db.set_value("Customer", customer, "email_id", value)
+	elif fieldname == "mobile_no":
+		contact_doc.set("phone_nos", [{"phone": value, "is_primary_mobile_no": 1}])
+		frappe.db.set_value("Customer", customer, "mobile_no", value)
 	contact_doc.save()
 
+
 @frappe.whitelist()
 def get_pos_profile_data(pos_profile):
-	pos_profile = frappe.get_doc('POS Profile', pos_profile)
+	pos_profile = frappe.get_doc("POS Profile", pos_profile)
 	pos_profile = pos_profile.as_dict()
 
 	_customer_groups_with_children = []
 	for row in pos_profile.customer_groups:
-		children = get_child_nodes('Customer Group', row.customer_group)
+		children = get_child_nodes("Customer Group", row.customer_group)
 		_customer_groups_with_children.extend(children)
 
 	pos_profile.customer_groups = _customer_groups_with_children
-	return pos_profile
\ No newline at end of file
+	return pos_profile
diff --git a/erpnext/selling/page/sales_funnel/sales_funnel.py b/erpnext/selling/page/sales_funnel/sales_funnel.py
index a75108e..c626f5b 100644
--- a/erpnext/selling/page/sales_funnel/sales_funnel.py
+++ b/erpnext/selling/page/sales_funnel/sales_funnel.py
@@ -16,86 +16,153 @@
 	if not company:
 		frappe.throw(_("Please Select a Company"))
 
+
 @frappe.whitelist()
 def get_funnel_data(from_date, to_date, company):
 	validate_filters(from_date, to_date, company)
 
-	active_leads = frappe.db.sql("""select count(*) from `tabLead`
+	active_leads = frappe.db.sql(
+		"""select count(*) from `tabLead`
 		where (date(`creation`) between %s and %s)
-		and company=%s""", (from_date, to_date, company))[0][0]
+		and company=%s""",
+		(from_date, to_date, company),
+	)[0][0]
 
-	opportunities = frappe.db.sql("""select count(*) from `tabOpportunity`
+	opportunities = frappe.db.sql(
+		"""select count(*) from `tabOpportunity`
 		where (date(`creation`) between %s and %s)
-		and opportunity_from='Lead' and company=%s""", (from_date, to_date, company))[0][0]
+		and opportunity_from='Lead' and company=%s""",
+		(from_date, to_date, company),
+	)[0][0]
 
-	quotations = frappe.db.sql("""select count(*) from `tabQuotation`
+	quotations = frappe.db.sql(
+		"""select count(*) from `tabQuotation`
 		where docstatus = 1 and (date(`creation`) between %s and %s)
-		and (opportunity!="" or quotation_to="Lead") and company=%s""", (from_date, to_date, company))[0][0]
+		and (opportunity!="" or quotation_to="Lead") and company=%s""",
+		(from_date, to_date, company),
+	)[0][0]
 
-	converted = frappe.db.sql("""select count(*) from `tabCustomer`
+	converted = frappe.db.sql(
+		"""select count(*) from `tabCustomer`
 		JOIN `tabLead` ON `tabLead`.name = `tabCustomer`.lead_name
 		WHERE (date(`tabCustomer`.creation) between %s and %s)
-		and `tabLead`.company=%s""", (from_date, to_date, company))[0][0]
-
+		and `tabLead`.company=%s""",
+		(from_date, to_date, company),
+	)[0][0]
 
 	return [
-		{ "title": _("Active Leads"), "value": active_leads, "color": "#B03B46" },
-		{ "title": _("Opportunities"), "value": opportunities, "color": "#F09C00" },
-		{ "title": _("Quotations"), "value": quotations, "color": "#006685" },
-		{ "title": _("Converted"), "value": converted, "color": "#00AD65" }
+		{"title": _("Active Leads"), "value": active_leads, "color": "#B03B46"},
+		{"title": _("Opportunities"), "value": opportunities, "color": "#F09C00"},
+		{"title": _("Quotations"), "value": quotations, "color": "#006685"},
+		{"title": _("Converted"), "value": converted, "color": "#00AD65"},
 	]
 
+
 @frappe.whitelist()
 def get_opp_by_lead_source(from_date, to_date, company):
 	validate_filters(from_date, to_date, company)
 
-	opportunities = frappe.get_all("Opportunity", filters=[['status', 'in', ['Open', 'Quotation', 'Replied']], ['company', '=', company], ['transaction_date', 'Between', [from_date, to_date]]], fields=['currency', 'sales_stage', 'opportunity_amount', 'probability', 'source'])
+	opportunities = frappe.get_all(
+		"Opportunity",
+		filters=[
+			["status", "in", ["Open", "Quotation", "Replied"]],
+			["company", "=", company],
+			["transaction_date", "Between", [from_date, to_date]],
+		],
+		fields=["currency", "sales_stage", "opportunity_amount", "probability", "source"],
+	)
 
 	if opportunities:
-		default_currency = frappe.get_cached_value('Global Defaults', 'None',  'default_currency')
+		default_currency = frappe.get_cached_value("Global Defaults", "None", "default_currency")
 
-		cp_opportunities = [dict(x, **{'compound_amount': (convert(x['opportunity_amount'], x['currency'], default_currency, to_date) * x['probability']/100)}) for x in opportunities]
+		cp_opportunities = [
+			dict(
+				x,
+				**{
+					"compound_amount": (
+						convert(x["opportunity_amount"], x["currency"], default_currency, to_date)
+						* x["probability"]
+						/ 100
+					)
+				}
+			)
+			for x in opportunities
+		]
 
-		df = pd.DataFrame(cp_opportunities).groupby(['source', 'sales_stage'], as_index=False).agg({'compound_amount': 'sum'})
+		df = (
+			pd.DataFrame(cp_opportunities)
+			.groupby(["source", "sales_stage"], as_index=False)
+			.agg({"compound_amount": "sum"})
+		)
 
 		result = {}
-		result['labels'] = list(set(df.source.values))
-		result['datasets'] = []
+		result["labels"] = list(set(df.source.values))
+		result["datasets"] = []
 
 		for s in set(df.sales_stage.values):
-			result['datasets'].append({'name': s, 'values': [0]*len(result['labels']), 'chartType': 'bar'})
+			result["datasets"].append(
+				{"name": s, "values": [0] * len(result["labels"]), "chartType": "bar"}
+			)
 
 		for row in df.itertuples():
-			source_index = result['labels'].index(row.source)
+			source_index = result["labels"].index(row.source)
 
-			for dataset in result['datasets']:
-				if dataset['name'] == row.sales_stage:
-					dataset['values'][source_index] = row.compound_amount
+			for dataset in result["datasets"]:
+				if dataset["name"] == row.sales_stage:
+					dataset["values"][source_index] = row.compound_amount
 
 		return result
 
 	else:
-		return 'empty'
+		return "empty"
+
 
 @frappe.whitelist()
 def get_pipeline_data(from_date, to_date, company):
 	validate_filters(from_date, to_date, company)
 
-	opportunities = frappe.get_all("Opportunity", filters=[['status', 'in', ['Open', 'Quotation', 'Replied']], ['company', '=', company], ['transaction_date', 'Between', [from_date, to_date]]], fields=['currency', 'sales_stage', 'opportunity_amount', 'probability'])
+	opportunities = frappe.get_all(
+		"Opportunity",
+		filters=[
+			["status", "in", ["Open", "Quotation", "Replied"]],
+			["company", "=", company],
+			["transaction_date", "Between", [from_date, to_date]],
+		],
+		fields=["currency", "sales_stage", "opportunity_amount", "probability"],
+	)
 
 	if opportunities:
-		default_currency = frappe.get_cached_value('Global Defaults', 'None',  'default_currency')
+		default_currency = frappe.get_cached_value("Global Defaults", "None", "default_currency")
 
-		cp_opportunities = [dict(x, **{'compound_amount': (convert(x['opportunity_amount'], x['currency'], default_currency, to_date) * x['probability']/100)}) for x in opportunities]
+		cp_opportunities = [
+			dict(
+				x,
+				**{
+					"compound_amount": (
+						convert(x["opportunity_amount"], x["currency"], default_currency, to_date)
+						* x["probability"]
+						/ 100
+					)
+				}
+			)
+			for x in opportunities
+		]
 
-		df = pd.DataFrame(cp_opportunities).groupby(['sales_stage'], as_index=True).agg({'compound_amount': 'sum'}).to_dict()
+		df = (
+			pd.DataFrame(cp_opportunities)
+			.groupby(["sales_stage"], as_index=True)
+			.agg({"compound_amount": "sum"})
+			.to_dict()
+		)
 
 		result = {}
-		result['labels'] = df['compound_amount'].keys()
-		result['datasets'] = []
-		result['datasets'].append({'name': _("Total Amount"), 'values': df['compound_amount'].values(), 'chartType': 'bar'})
+		result["labels"] = df["compound_amount"].keys()
+		result["datasets"] = []
+		result["datasets"].append(
+			{"name": _("Total Amount"), "values": df["compound_amount"].values(), "chartType": "bar"}
+		)
 
 		return result
 
 	else:
-		return 'empty'
+		return "empty"
diff --git a/erpnext/selling/report/address_and_contacts/address_and_contacts.py b/erpnext/selling/report/address_and_contacts/address_and_contacts.py
index 915f8dc..9a1cfda 100644
--- a/erpnext/selling/report/address_and_contacts/address_and_contacts.py
+++ b/erpnext/selling/report/address_and_contacts/address_and_contacts.py
@@ -5,20 +5,30 @@
 import frappe
 
 field_map = {
-	"Contact": [ "first_name", "last_name", "phone", "mobile_no", "email_id", "is_primary_contact" ],
-	"Address": [ "address_line1", "address_line2", "city", "state", "pincode", "country", "is_primary_address" ]
+	"Contact": ["first_name", "last_name", "phone", "mobile_no", "email_id", "is_primary_contact"],
+	"Address": [
+		"address_line1",
+		"address_line2",
+		"city",
+		"state",
+		"pincode",
+		"country",
+		"is_primary_address",
+	],
 }
 
+
 def execute(filters=None):
 	columns, data = get_columns(filters), get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
 	party_type = filters.get("party_type")
 	party_type_value = get_party_group(party_type)
 	return [
 		"{party_type}:Link/{party_type}".format(party_type=party_type),
-		"{party_value_type}::150".format(party_value_type = frappe.unscrub(str(party_type_value))),
+		"{party_value_type}::150".format(party_value_type=frappe.unscrub(str(party_type_value))),
 		"Address Line 1",
 		"Address Line 2",
 		"City",
@@ -31,9 +41,10 @@
 		"Phone",
 		"Mobile No",
 		"Email Id",
-		"Is Primary Contact:Check"
+		"Is Primary Contact:Check",
 	]
 
+
 def get_data(filters):
 	party_type = filters.get("party_type")
 	party = filters.get("party_name")
@@ -41,6 +52,7 @@
 
 	return get_party_addresses_and_contact(party_type, party, party_group)
 
+
 def get_party_addresses_and_contact(party_type, party, party_group):
 	data = []
 	filters = None
@@ -50,9 +62,11 @@
 		return []
 
 	if party:
-		filters = { "name": party }
+		filters = {"name": party}
 
-	fetch_party_list = frappe.get_list(party_type, filters=filters, fields=["name", party_group], as_list=True)
+	fetch_party_list = frappe.get_list(
+		party_type, filters=filters, fields=["name", party_group], as_list=True
+	)
 	party_list = [d[0] for d in fetch_party_list]
 	party_groups = {}
 	for d in fetch_party_list:
@@ -66,7 +80,7 @@
 
 	for party, details in party_details.items():
 		addresses = details.get("address", [])
-		contacts  = details.get("contact", [])
+		contacts = details.get("contact", [])
 		if not any([addresses, contacts]):
 			result = [party]
 			result.append(party_groups[party])
@@ -89,10 +103,11 @@
 				data.append(result)
 	return data
 
+
 def get_party_details(party_type, party_list, doctype, party_details):
-	filters =  [
+	filters = [
 		["Dynamic Link", "link_doctype", "=", party_type],
-		["Dynamic Link", "link_name", "in", party_list]
+		["Dynamic Link", "link_name", "in", party_list],
 	]
 	fields = ["`tabDynamic Link`.link_name"] + field_map.get(doctype, [])
 
@@ -103,15 +118,18 @@
 
 	return party_details
 
+
 def add_blank_columns_for(doctype):
 	return ["" for field in field_map.get(doctype, [])]
 
+
 def get_party_group(party_type):
-	if not party_type: return
+	if not party_type:
+		return
 	group = {
 		"Customer": "customer_group",
 		"Supplier": "supplier_group",
-		"Sales Partner": "partner_type"
+		"Sales Partner": "partner_type",
 	}
 
 	return group[party_type]
diff --git a/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py b/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py
index e702a51..5e763bb 100644
--- a/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py
+++ b/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py
@@ -7,7 +7,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns()
 	iwq_map = get_item_warehouse_quantity_map()
@@ -20,32 +21,49 @@
 		for wh, item_qty in warehouse.items():
 			total += 1
 			if item_map.get(sbom):
-				row = [sbom, item_map.get(sbom).item_name, item_map.get(sbom).description,
-						item_map.get(sbom).stock_uom, wh]
+				row = [
+					sbom,
+					item_map.get(sbom).item_name,
+					item_map.get(sbom).description,
+					item_map.get(sbom).stock_uom,
+					wh,
+				]
 				available_qty = item_qty
 				total_qty += flt(available_qty)
 				row += [available_qty]
 
 				if available_qty:
 					data.append(row)
-					if (total == len(warehouse)):
+					if total == len(warehouse):
 						row = ["", "", "Total", "", "", total_qty]
 						data.append(row)
 	return columns, data
 
+
 def get_columns():
-	columns = ["Item Code:Link/Item:100", "Item Name::100", "Description::120", \
-				"UOM:Link/UOM:80", "Warehouse:Link/Warehouse:100", "Quantity::100"]
+	columns = [
+		"Item Code:Link/Item:100",
+		"Item Name::100",
+		"Description::120",
+		"UOM:Link/UOM:80",
+		"Warehouse:Link/Warehouse:100",
+		"Quantity::100",
+	]
 
 	return columns
 
+
 def get_item_details():
 	item_map = {}
-	for item in frappe.db.sql("""SELECT name, item_name, description, stock_uom
-								from `tabItem`""", as_dict=1):
+	for item in frappe.db.sql(
+		"""SELECT name, item_name, description, stock_uom
+								from `tabItem`""",
+		as_dict=1,
+	):
 		item_map.setdefault(item.name, item)
 	return item_map
 
+
 def get_item_warehouse_quantity_map():
 	query = """SELECT parent, warehouse, MIN(qty) AS qty
 			   FROM (SELECT b.parent, bi.item_code, bi.warehouse,
diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py
index 2426cbb..33badc3 100644
--- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py
+++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py
@@ -12,178 +12,177 @@
 def execute(filters=None):
 	common_columns = [
 		{
-			'label': _('New Customers'),
-			'fieldname': 'new_customers',
-			'fieldtype': 'Int',
-			'default': 0,
-			'width': 125
+			"label": _("New Customers"),
+			"fieldname": "new_customers",
+			"fieldtype": "Int",
+			"default": 0,
+			"width": 125,
 		},
 		{
-			'label': _('Repeat Customers'),
-			'fieldname': 'repeat_customers',
-			'fieldtype': 'Int',
-			'default': 0,
-			'width': 125
+			"label": _("Repeat Customers"),
+			"fieldname": "repeat_customers",
+			"fieldtype": "Int",
+			"default": 0,
+			"width": 125,
+		},
+		{"label": _("Total"), "fieldname": "total", "fieldtype": "Int", "default": 0, "width": 100},
+		{
+			"label": _("New Customer Revenue"),
+			"fieldname": "new_customer_revenue",
+			"fieldtype": "Currency",
+			"default": 0.0,
+			"width": 175,
 		},
 		{
-			'label': _('Total'),
-			'fieldname': 'total',
-			'fieldtype': 'Int',
-			'default': 0,
-			'width': 100
+			"label": _("Repeat Customer Revenue"),
+			"fieldname": "repeat_customer_revenue",
+			"fieldtype": "Currency",
+			"default": 0.0,
+			"width": 175,
 		},
 		{
-			'label': _('New Customer Revenue'),
-			'fieldname': 'new_customer_revenue',
-			'fieldtype': 'Currency',
-			'default': 0.0,
-			'width': 175
+			"label": _("Total Revenue"),
+			"fieldname": "total_revenue",
+			"fieldtype": "Currency",
+			"default": 0.0,
+			"width": 175,
 		},
-		{
-			'label': _('Repeat Customer Revenue'),
-			'fieldname': 'repeat_customer_revenue',
-			'fieldtype': 'Currency',
-			'default': 0.0,
-			'width': 175
-		},
-		{
-			'label': _('Total Revenue'),
-			'fieldname': 'total_revenue',
-			'fieldtype': 'Currency',
-			'default': 0.0,
-			'width': 175
-		}
 	]
-	if filters.get('view_type') == 'Monthly':
+	if filters.get("view_type") == "Monthly":
 		return get_data_by_time(filters, common_columns)
 	else:
 		return get_data_by_territory(filters, common_columns)
 
+
 def get_data_by_time(filters, common_columns):
 	# key yyyy-mm
 	columns = [
-		{
-			'label': _('Year'),
-			'fieldname': 'year',
-			'fieldtype': 'Data',
-			'width': 100
-		},
-		{
-			'label': _('Month'),
-			'fieldname': 'month',
-			'fieldtype': 'Data',
-			'width': 100
-		},
+		{"label": _("Year"), "fieldname": "year", "fieldtype": "Data", "width": 100},
+		{"label": _("Month"), "fieldname": "month", "fieldtype": "Data", "width": 100},
 	]
 	columns += common_columns
 
 	customers_in = get_customer_stats(filters)
 
 	# time series
-	from_year, from_month, temp = filters.get('from_date').split('-')
-	to_year, to_month, temp = filters.get('to_date').split('-')
+	from_year, from_month, temp = filters.get("from_date").split("-")
+	to_year, to_month, temp = filters.get("to_date").split("-")
 
-	from_year, from_month, to_year, to_month = \
-		cint(from_year), cint(from_month), cint(to_year), cint(to_month)
+	from_year, from_month, to_year, to_month = (
+		cint(from_year),
+		cint(from_month),
+		cint(to_year),
+		cint(to_month),
+	)
 
 	out = []
-	for year in range(from_year, to_year+1):
-		for month in range(from_month if year==from_year else 1, (to_month+1) if year==to_year else 13):
-			key = '{year}-{month:02d}'.format(year=year, month=month)
+	for year in range(from_year, to_year + 1):
+		for month in range(
+			from_month if year == from_year else 1, (to_month + 1) if year == to_year else 13
+		):
+			key = "{year}-{month:02d}".format(year=year, month=month)
 			data = customers_in.get(key)
-			new = data['new'] if data else [0, 0.0]
-			repeat = data['repeat'] if data else [0, 0.0]
-			out.append({
-				'year': cstr(year),
-				'month': calendar.month_name[month],
-				'new_customers': new[0],
-				'repeat_customers': repeat[0],
-				'total': new[0] + repeat[0],
-				'new_customer_revenue': new[1],
-				'repeat_customer_revenue': repeat[1],
-				'total_revenue': new[1] + repeat[1]
-			})
+			new = data["new"] if data else [0, 0.0]
+			repeat = data["repeat"] if data else [0, 0.0]
+			out.append(
+				{
+					"year": cstr(year),
+					"month": calendar.month_name[month],
+					"new_customers": new[0],
+					"repeat_customers": repeat[0],
+					"total": new[0] + repeat[0],
+					"new_customer_revenue": new[1],
+					"repeat_customer_revenue": repeat[1],
+					"total_revenue": new[1] + repeat[1],
+				}
+			)
 	return columns, out
 
+
 def get_data_by_territory(filters, common_columns):
-	columns = [{
-		'label': 'Territory',
-		'fieldname': 'territory',
-		'fieldtype': 'Link',
-		'options': 'Territory',
-		'width': 150
-	}]
+	columns = [
+		{
+			"label": "Territory",
+			"fieldname": "territory",
+			"fieldtype": "Link",
+			"options": "Territory",
+			"width": 150,
+		}
+	]
 	columns += common_columns
 
 	customers_in = get_customer_stats(filters, tree_view=True)
 
 	territory_dict = {}
-	for t in frappe.db.sql('''SELECT name, lft, parent_territory, is_group FROM `tabTerritory` ORDER BY lft''', as_dict=1):
-		territory_dict.update({
-			t.name: {
-				'parent': t.parent_territory,
-				'is_group': t.is_group
-			}
-		})
+	for t in frappe.db.sql(
+		"""SELECT name, lft, parent_territory, is_group FROM `tabTerritory` ORDER BY lft""", as_dict=1
+	):
+		territory_dict.update({t.name: {"parent": t.parent_territory, "is_group": t.is_group}})
 
 	depth_map = frappe._dict()
 	for name, info in territory_dict.items():
-		default = depth_map.get(info['parent']) + 1 if info['parent'] else 0
+		default = depth_map.get(info["parent"]) + 1 if info["parent"] else 0
 		depth_map.setdefault(name, default)
 
 	data = []
 	for name, indent in depth_map.items():
 		condition = customers_in.get(name)
-		new = customers_in[name]['new'] if condition else [0, 0.0]
-		repeat = customers_in[name]['repeat'] if condition else [0, 0.0]
+		new = customers_in[name]["new"] if condition else [0, 0.0]
+		repeat = customers_in[name]["repeat"] if condition else [0, 0.0]
 		temp = {
-			'territory': name,
-			'parent_territory': territory_dict[name]['parent'],
-			'indent': indent,
-			'new_customers': new[0],
-			'repeat_customers': repeat[0],
-			'total': new[0] + repeat[0],
-			'new_customer_revenue': new[1],
-			'repeat_customer_revenue': repeat[1],
-			'total_revenue': new[1] + repeat[1],
-			'bold': 0 if indent else 1
+			"territory": name,
+			"parent_territory": territory_dict[name]["parent"],
+			"indent": indent,
+			"new_customers": new[0],
+			"repeat_customers": repeat[0],
+			"total": new[0] + repeat[0],
+			"new_customer_revenue": new[1],
+			"repeat_customer_revenue": repeat[1],
+			"total_revenue": new[1] + repeat[1],
+			"bold": 0 if indent else 1,
 		}
 		data.append(temp)
 
-	loop_data = sorted(data, key=lambda k: k['indent'], reverse=True)
+	loop_data = sorted(data, key=lambda k: k["indent"], reverse=True)
 
 	for ld in loop_data:
-		if ld['parent_territory']:
-			parent_data = [x for x in data if x['territory'] == ld['parent_territory']][0]
+		if ld["parent_territory"]:
+			parent_data = [x for x in data if x["territory"] == ld["parent_territory"]][0]
 			for key in parent_data.keys():
-				if key not in  ['indent', 'territory', 'parent_territory', 'bold']:
+				if key not in ["indent", "territory", "parent_territory", "bold"]:
 					parent_data[key] += ld[key]
 
 	return columns, data, None, None, None, 1
 
+
 def get_customer_stats(filters, tree_view=False):
-	""" Calculates number of new and repeated customers and revenue. """
-	company_condition = ''
-	if filters.get('company'):
-		company_condition = ' and company=%(company)s'
+	"""Calculates number of new and repeated customers and revenue."""
+	company_condition = ""
+	if filters.get("company"):
+		company_condition = " and company=%(company)s"
 
 	customers = []
 	customers_in = {}
 
-	for si in frappe.db.sql('''select territory, posting_date, customer, base_grand_total from `tabSales Invoice`
+	for si in frappe.db.sql(
+		"""select territory, posting_date, customer, base_grand_total from `tabSales Invoice`
 		where docstatus=1 and posting_date <= %(to_date)s
-		{company_condition} order by posting_date'''.format(company_condition=company_condition),
-		filters, as_dict=1):
+		{company_condition} order by posting_date""".format(
+			company_condition=company_condition
+		),
+		filters,
+		as_dict=1,
+	):
 
-		key = si.territory if tree_view else si.posting_date.strftime('%Y-%m')
-		new_or_repeat = 'new' if si.customer not in customers else 'repeat'
-		customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]})
+		key = si.territory if tree_view else si.posting_date.strftime("%Y-%m")
+		new_or_repeat = "new" if si.customer not in customers else "repeat"
+		customers_in.setdefault(key, {"new": [0, 0.0], "repeat": [0, 0.0]})
 
 		# if filters.from_date <= si.posting_date.strftime('%Y-%m-%d'):
 		if getdate(filters.from_date) <= getdate(si.posting_date):
-				customers_in[key][new_or_repeat][0] += 1
-				customers_in[key][new_or_repeat][1] += si.base_grand_total
-		if new_or_repeat == 'new':
+			customers_in[key][new_or_repeat][0] += 1
+			customers_in[key][new_or_repeat][1] += si.base_grand_total
+		if new_or_repeat == "new":
 			customers.append(si.customer)
 
 	return customers_in
diff --git a/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py b/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
index dd49f13..1c10a37 100644
--- a/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
+++ b/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
@@ -10,8 +10,9 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
-	#Check if customer id is according to naming series or customer name
+	if not filters:
+		filters = {}
+	# Check if customer id is according to naming series or customer name
 	customer_naming_type = frappe.db.get_value("Selling Settings", None, "cust_master_name")
 	columns = get_columns(customer_naming_type)
 
@@ -22,8 +23,9 @@
 	for d in customer_list:
 		row = []
 
-		outstanding_amt = get_customer_outstanding(d.name, filters.get("company"),
-			ignore_outstanding_sales_order=d.bypass_credit_limit_check)
+		outstanding_amt = get_customer_outstanding(
+			d.name, filters.get("company"), ignore_outstanding_sales_order=d.bypass_credit_limit_check
+		)
 
 		credit_limit = get_credit_limit(d.name, filters.get("company"))
 
@@ -31,15 +33,24 @@
 
 		if customer_naming_type == "Naming Series":
 			row = [
-				d.name, d.customer_name, credit_limit,
-				outstanding_amt, bal, d.bypass_credit_limit_check,
-				d.is_frozen, d.disabled
+				d.name,
+				d.customer_name,
+				credit_limit,
+				outstanding_amt,
+				bal,
+				d.bypass_credit_limit_check,
+				d.is_frozen,
+				d.disabled,
 			]
 		else:
 			row = [
-				d.name, credit_limit, outstanding_amt, bal,
-				d.bypass_credit_limit_check, d.is_frozen,
-				d.disabled
+				d.name,
+				credit_limit,
+				outstanding_amt,
+				bal,
+				d.bypass_credit_limit_check,
+				d.is_frozen,
+				d.disabled,
 			]
 
 		if credit_limit:
@@ -47,6 +58,7 @@
 
 	return columns, data
 
+
 def get_columns(customer_naming_type):
 	columns = [
 		_("Customer") + ":Link/Customer:120",
@@ -63,6 +75,7 @@
 
 	return columns
 
+
 def get_details(filters):
 
 	sql_query = """SELECT
diff --git a/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py b/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py
index e5f9354..a58f403 100644
--- a/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py
+++ b/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py
@@ -30,32 +30,23 @@
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"label": _("Selling Rate"),
-			"fieldname": "selling_rate",
-			"fieldtype": "Currency"
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 200},
+		{"label": _("Selling Rate"), "fieldname": "selling_rate", "fieldtype": "Currency"},
 		{
 			"label": _("Available Stock"),
 			"fieldname": "available_stock",
 			"fieldtype": "Float",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Price List"),
 			"fieldname": "price_list",
 			"fieldtype": "Link",
 			"options": "Price List",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
 
@@ -64,30 +55,33 @@
 	customer_details = get_customer_details(filters)
 
 	items = get_selling_items(filters)
-	item_stock_map = frappe.get_all("Bin", fields=["item_code", "sum(actual_qty) AS available"], group_by="item_code")
+	item_stock_map = frappe.get_all(
+		"Bin", fields=["item_code", "sum(actual_qty) AS available"], group_by="item_code"
+	)
 	item_stock_map = {item.item_code: item.available for item in item_stock_map}
 
 	for item in items:
 		price_list_rate = get_price_list_rate_for(customer_details, item.item_code) or 0.0
 		available_stock = item_stock_map.get(item.item_code)
 
-		data.append({
-			"item_code": item.item_code,
-			"item_name": item.item_name,
-			"selling_rate": price_list_rate,
-			"price_list": customer_details.get("price_list"),
-			"available_stock": available_stock,
-		})
+		data.append(
+			{
+				"item_code": item.item_code,
+				"item_name": item.item_name,
+				"selling_rate": price_list_rate,
+				"price_list": customer_details.get("price_list"),
+				"available_stock": available_stock,
+			}
+		)
 
 	return data
 
 
 def get_customer_details(filters):
 	customer_details = get_party_details(party=filters.get("customer"), party_type="Customer")
-	customer_details.update({
-		"company": get_default_company(),
-		"price_list": customer_details.get("selling_price_list")
-	})
+	customer_details.update(
+		{"company": get_default_company(), "price_list": customer_details.get("selling_price_list")}
+	)
 
 	return customer_details
 
@@ -98,6 +92,8 @@
 	else:
 		item_filters = {"is_sales_item": 1, "disabled": 0}
 
-	items = frappe.get_all("Item", filters=item_filters, fields=["item_code", "item_name"], order_by="item_name")
+	items = frappe.get_all(
+		"Item", filters=item_filters, fields=["item_code", "item_name"], order_by="item_name"
+	)
 
 	return items
diff --git a/erpnext/selling/report/inactive_customers/inactive_customers.py b/erpnext/selling/report/inactive_customers/inactive_customers.py
index d97e1c6..1b337fc 100644
--- a/erpnext/selling/report/inactive_customers/inactive_customers.py
+++ b/erpnext/selling/report/inactive_customers/inactive_customers.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 
 	days_since_last_order = filters.get("days_since_last_order")
 	doctype = filters.get("doctype")
@@ -22,10 +23,11 @@
 	data = []
 	for cust in customers:
 		if cint(cust[8]) >= cint(days_since_last_order):
-			cust.insert(7,get_last_sales_amt(cust[0], doctype))
+			cust.insert(7, get_last_sales_amt(cust[0], doctype))
 			data.append(cust)
 	return columns, data
 
+
 def get_sales_details(doctype):
 	cond = """sum(so.base_net_total) as 'total_order_considered',
 			max(so.posting_date) as 'last_order_date',
@@ -37,7 +39,8 @@
 			max(so.transaction_date) as 'last_order_date',
 			DATEDIFF(CURDATE(), max(so.transaction_date)) as 'days_since_last_order'"""
 
-	return frappe.db.sql("""select
+	return frappe.db.sql(
+		"""select
 			cust.name,
 			cust.customer_name,
 			cust.territory,
@@ -47,18 +50,29 @@
 		from `tabCustomer` cust, `tab{1}` so
 		where cust.name = so.customer and so.docstatus = 1
 		group by cust.name
-		order by 'days_since_last_order' desc """.format(cond, doctype), as_list=1)
+		order by 'days_since_last_order' desc """.format(
+			cond, doctype
+		),
+		as_list=1,
+	)
+
 
 def get_last_sales_amt(customer, doctype):
 	cond = "posting_date"
-	if doctype =="Sales Order":
+	if doctype == "Sales Order":
 		cond = "transaction_date"
-	res =  frappe.db.sql("""select base_net_total from `tab{0}`
+	res = frappe.db.sql(
+		"""select base_net_total from `tab{0}`
 		where customer = %s and docstatus = 1 order by {1} desc
-		limit 1""".format(doctype, cond), customer)
+		limit 1""".format(
+			doctype, cond
+		),
+		customer,
+	)
 
 	return res and res[0][0] or 0
 
+
 def get_columns():
 	return [
 		_("Customer") + ":Link/Customer:120",
@@ -70,5 +84,5 @@
 		_("Total Order Considered") + ":Currency:160",
 		_("Last Order Amount") + ":Currency:160",
 		_("Last Order Date") + ":Date:160",
-		_("Days Since Last Order") + "::160"
+		_("Days Since Last Order") + "::160",
 	]
diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
index 56e1eb5..da00984 100644
--- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
+++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
@@ -20,6 +20,7 @@
 
 	return columns, data, None, chart_data
 
+
 def get_columns(filters):
 	return [
 		{
@@ -27,120 +28,85 @@
 			"fieldtype": "Link",
 			"fieldname": "item_code",
 			"options": "Item",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldtype": "Data",
-			"fieldname": "item_name",
-			"width": 140
-		},
+		{"label": _("Item Name"), "fieldtype": "Data", "fieldname": "item_name", "width": 140},
 		{
 			"label": _("Item Group"),
 			"fieldtype": "Link",
 			"fieldname": "item_group",
 			"options": "Item Group",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Description"),
-			"fieldtype": "Data",
-			"fieldname": "description",
-			"width": 150
-		},
-		{
-			"label": _("Quantity"),
-			"fieldtype": "Float",
-			"fieldname": "quantity",
-			"width": 150
-		},
-		{
-			"label": _("UOM"),
-			"fieldtype": "Link",
-			"fieldname": "uom",
-			"options": "UOM",
-			"width": 100
-		},
-		{
-			"label": _("Rate"),
-			"fieldname": "rate",
-			"options": "Currency",
-			"width": 120
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"options": "Currency",
-			"width": 120
-		},
+		{"label": _("Description"), "fieldtype": "Data", "fieldname": "description", "width": 150},
+		{"label": _("Quantity"), "fieldtype": "Float", "fieldname": "quantity", "width": 150},
+		{"label": _("UOM"), "fieldtype": "Link", "fieldname": "uom", "options": "UOM", "width": 100},
+		{"label": _("Rate"), "fieldname": "rate", "options": "Currency", "width": 120},
+		{"label": _("Amount"), "fieldname": "amount", "options": "Currency", "width": 120},
 		{
 			"label": _("Sales Order"),
 			"fieldtype": "Link",
 			"fieldname": "sales_order",
 			"options": "Sales Order",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Transaction Date"),
 			"fieldtype": "Date",
 			"fieldname": "transaction_date",
-			"width": 90
+			"width": 90,
 		},
 		{
 			"label": _("Customer"),
 			"fieldtype": "Link",
 			"fieldname": "customer",
 			"options": "Customer",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Customer Name"),
-			"fieldtype": "Data",
-			"fieldname": "customer_name",
-			"width": 140
-		},
+		{"label": _("Customer Name"), "fieldtype": "Data", "fieldname": "customer_name", "width": 140},
 		{
 			"label": _("Customer Group"),
 			"fieldtype": "Link",
 			"fieldname": "customer_group",
 			"options": "Customer Group",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Territory"),
 			"fieldtype": "Link",
 			"fieldname": "territory",
 			"options": "Territory",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Project"),
 			"fieldtype": "Link",
 			"fieldname": "project",
 			"options": "Project",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Delivered Quantity"),
 			"fieldtype": "Float",
 			"fieldname": "delivered_quantity",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Billed Amount"),
 			"fieldtype": "currency",
 			"fieldname": "billed_amount",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Company"),
 			"fieldtype": "Link",
 			"fieldname": "company",
 			"options": "Company",
-			"width": 100
-		}
+			"width": 100,
+		},
 	]
 
+
 def get_data(filters):
 
 	data = []
@@ -156,74 +122,75 @@
 		customer_record = customer_details.get(record.customer)
 		item_record = item_details.get(record.item_code)
 		row = {
-			"item_code": record.get('item_code'),
-			"item_name": item_record.get('item_name'),
-			"item_group": item_record.get('item_group'),
-			"description": record.get('description'),
-			"quantity": record.get('qty'),
-			"uom": record.get('uom'),
-			"rate": record.get('base_rate'),
-			"amount": record.get('base_amount'),
-			"sales_order": record.get('name'),
-			"transaction_date": record.get('transaction_date'),
-			"customer": record.get('customer'),
-			"customer_name": customer_record.get('customer_name'),
-			"customer_group": customer_record.get('customer_group'),
-			"territory": record.get('territory'),
-			"project": record.get('project'),
-			"delivered_quantity": flt(record.get('delivered_qty')),
-			"billed_amount": flt(record.get('billed_amt')),
-			"company": record.get('company')
+			"item_code": record.get("item_code"),
+			"item_name": item_record.get("item_name"),
+			"item_group": item_record.get("item_group"),
+			"description": record.get("description"),
+			"quantity": record.get("qty"),
+			"uom": record.get("uom"),
+			"rate": record.get("base_rate"),
+			"amount": record.get("base_amount"),
+			"sales_order": record.get("name"),
+			"transaction_date": record.get("transaction_date"),
+			"customer": record.get("customer"),
+			"customer_name": customer_record.get("customer_name"),
+			"customer_group": customer_record.get("customer_group"),
+			"territory": record.get("territory"),
+			"project": record.get("project"),
+			"delivered_quantity": flt(record.get("delivered_qty")),
+			"billed_amount": flt(record.get("billed_amt")),
+			"company": record.get("company"),
 		}
 		data.append(row)
 
 	return data
 
+
 def get_conditions(filters):
-	conditions = ''
-	if filters.get('item_group'):
-		conditions += "AND so_item.item_group = %s" %frappe.db.escape(filters.item_group)
+	conditions = ""
+	if filters.get("item_group"):
+		conditions += "AND so_item.item_group = %s" % frappe.db.escape(filters.item_group)
 
-	if filters.get('from_date'):
-		conditions += "AND so.transaction_date >= '%s'" %filters.from_date
+	if filters.get("from_date"):
+		conditions += "AND so.transaction_date >= '%s'" % filters.from_date
 
-	if filters.get('to_date'):
-		conditions += "AND so.transaction_date <= '%s'" %filters.to_date
+	if filters.get("to_date"):
+		conditions += "AND so.transaction_date <= '%s'" % filters.to_date
 
 	if filters.get("item_code"):
-		conditions += "AND so_item.item_code = %s" %frappe.db.escape(filters.item_code)
+		conditions += "AND so_item.item_code = %s" % frappe.db.escape(filters.item_code)
 
 	if filters.get("customer"):
-		conditions += "AND so.customer = %s" %frappe.db.escape(filters.customer)
+		conditions += "AND so.customer = %s" % frappe.db.escape(filters.customer)
 
 	return conditions
 
+
 def get_customer_details():
-	details = frappe.get_all("Customer",
-		fields=["name", "customer_name", "customer_group"])
+	details = frappe.get_all("Customer", fields=["name", "customer_name", "customer_group"])
 	customer_details = {}
 	for d in details:
-		customer_details.setdefault(d.name, frappe._dict({
-			"customer_name": d.customer_name,
-			"customer_group": d.customer_group
-		}))
+		customer_details.setdefault(
+			d.name, frappe._dict({"customer_name": d.customer_name, "customer_group": d.customer_group})
+		)
 	return customer_details
 
+
 def get_item_details():
-	details = frappe.db.get_all("Item",
-		fields=["item_code", "item_name", "item_group"])
+	details = frappe.db.get_all("Item", fields=["item_code", "item_name", "item_group"])
 	item_details = {}
 	for d in details:
-		item_details.setdefault(d.item_code, frappe._dict({
-			"item_name": d.item_name,
-			"item_group": d.item_group
-		}))
+		item_details.setdefault(
+			d.item_code, frappe._dict({"item_name": d.item_name, "item_group": d.item_group})
+		)
 	return item_details
 
+
 def get_sales_order_details(company_list, filters):
 	conditions = get_conditions(filters)
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			so_item.item_code, so_item.description, so_item.qty,
 			so_item.uom, so_item.base_rate, so_item.base_amount,
@@ -236,7 +203,13 @@
 			so.name = so_item.parent
 			AND so.company in ({0})
 			AND so.docstatus = 1 {1}
-	""".format(','.join(["%s"] * len(company_list)), conditions), tuple(company_list), as_dict=1)
+	""".format(
+			",".join(["%s"] * len(company_list)), conditions
+		),
+		tuple(company_list),
+		as_dict=1,
+	)
+
 
 def get_chart_data(data):
 	item_wise_sales_map = {}
@@ -250,21 +223,19 @@
 
 		item_wise_sales_map[item_key] = flt(item_wise_sales_map[item_key]) + flt(row.get("amount"))
 
-	item_wise_sales_map = { item: value for item, value in (sorted(item_wise_sales_map.items(), key = lambda i: i[1], reverse=True))}
+	item_wise_sales_map = {
+		item: value
+		for item, value in (sorted(item_wise_sales_map.items(), key=lambda i: i[1], reverse=True))
+	}
 
 	for key in item_wise_sales_map:
 		labels.append(key)
 		datapoints.append(item_wise_sales_map[key])
 
 	return {
-		"data" : {
-			"labels" : labels[:30], # show max of 30 items in chart
-			"datasets" : [
-				{
-					"name" : _(" Total Sales Amount"),
-					"values" : datapoints[:30]
-				}
-			]
+		"data": {
+			"labels": labels[:30],  # show max of 30 items in chart
+			"datasets": [{"name": _(" Total Sales Amount"), "values": datapoints[:30]}],
 		},
-		"type" : "bar"
+		"type": "bar",
 	}
diff --git a/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py b/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
index e6a56ee..7f797f6 100644
--- a/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
+++ b/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
@@ -62,12 +62,7 @@
 			"fieldname": "status",
 			"fieldtype": "Data",
 		},
-		{
-			"label": _("Currency"),
-			"fieldname": "currency",
-			"fieldtype": "Currency",
-			"hidden": 1
-		}
+		{"label": _("Currency"), "fieldname": "currency", "fieldtype": "Currency", "hidden": 1},
 	]
 	return columns
 
@@ -156,7 +151,7 @@
 	"""
 
 	for so in sales_orders:
-		so.currency = frappe.get_cached_value('Company', filters.get('company'), 'default_currency')
+		so.currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
 		so.invoices = ""
 		for inv in [x for x in invoices if x.sales_order == so.name and x.invoice_amount > 0]:
 			if so.base_payment_amount - so.paid_amount > 0:
@@ -182,8 +177,14 @@
 			"data": {
 				"labels": [term.payment_term for term in s_orders],
 				"datasets": [
-					{"name": "Payment Amount", "values": [x.base_payment_amount for x in s_orders],},
-					{"name": "Paid Amount", "values": [x.paid_amount for x in s_orders],},
+					{
+						"name": "Payment Amount",
+						"values": [x.base_payment_amount for x in s_orders],
+					},
+					{
+						"name": "Paid Amount",
+						"values": [x.paid_amount for x in s_orders],
+					},
 				],
 			},
 			"type": "bar",
diff --git a/erpnext/selling/report/payment_terms_status_for_sales_order/test_payment_terms_status_for_sales_order.py b/erpnext/selling/report/payment_terms_status_for_sales_order/test_payment_terms_status_for_sales_order.py
index f7f8a5d..89940a6 100644
--- a/erpnext/selling/report/payment_terms_status_for_sales_order/test_payment_terms_status_for_sales_order.py
+++ b/erpnext/selling/report/payment_terms_status_for_sales_order/test_payment_terms_status_for_sales_order.py
@@ -94,7 +94,7 @@
 				"currency": "INR",
 				"base_payment_amount": 500000.0,
 				"paid_amount": 500000.0,
-				"invoices": ","+sinv.name,
+				"invoices": "," + sinv.name,
 			},
 			{
 				"name": so.name,
@@ -107,25 +107,29 @@
 				"currency": "INR",
 				"base_payment_amount": 500000.0,
 				"paid_amount": 100000.0,
-				"invoices": ","+sinv.name,
+				"invoices": "," + sinv.name,
 			},
 		]
 		self.assertEqual(data, expected_value)
 
 	def create_exchange_rate(self, date):
 		# make an entry in Currency Exchange list. serves as a static exchange rate
-		if frappe.db.exists({'doctype': "Currency Exchange",'date': date,'from_currency': 'USD', 'to_currency':'INR'}):
+		if frappe.db.exists(
+			{"doctype": "Currency Exchange", "date": date, "from_currency": "USD", "to_currency": "INR"}
+		):
 			return
 		else:
-			doc = frappe.get_doc({
-				'doctype': "Currency Exchange",
-				'date': date,
-				'from_currency': 'USD',
-				'to_currency': frappe.get_cached_value("Company", '_Test Company','default_currency'),
-				'exchange_rate': 70,
-				'for_buying': True,
-				'for_selling': True
-			})
+			doc = frappe.get_doc(
+				{
+					"doctype": "Currency Exchange",
+					"date": date,
+					"from_currency": "USD",
+					"to_currency": frappe.get_cached_value("Company", "_Test Company", "default_currency"),
+					"exchange_rate": 70,
+					"for_buying": True,
+					"for_selling": True,
+				}
+			)
 			doc.insert()
 
 	def test_alternate_currency(self):
@@ -176,10 +180,10 @@
 				"description": "_Test 50-50",
 				"due_date": datetime.date(2021, 6, 30),
 				"invoice_portion": 50.0,
-				"currency": frappe.get_cached_value("Company", '_Test Company','default_currency'),
+				"currency": frappe.get_cached_value("Company", "_Test Company", "default_currency"),
 				"base_payment_amount": 3500000.0,
 				"paid_amount": 3500000.0,
-				"invoices": ","+sinv.name,
+				"invoices": "," + sinv.name,
 			},
 			{
 				"name": so.name,
@@ -189,10 +193,10 @@
 				"description": "_Test 50-50",
 				"due_date": datetime.date(2021, 7, 15),
 				"invoice_portion": 50.0,
-				"currency": frappe.get_cached_value("Company", '_Test Company','default_currency'),
+				"currency": frappe.get_cached_value("Company", "_Test Company", "default_currency"),
 				"base_payment_amount": 3500000.0,
 				"paid_amount": 700000.0,
-				"invoices": ","+sinv.name,
+				"invoices": "," + sinv.name,
 			},
 		]
 		self.assertEqual(data, expected_value)
diff --git a/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py b/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py
index 01421e8..cc1055c 100644
--- a/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py
+++ b/erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py
@@ -12,6 +12,7 @@
 	data = get_data()
 	return columns, data
 
+
 def get_columns():
 	columns = [
 		{
@@ -19,80 +20,37 @@
 			"options": "Item",
 			"fieldname": "item_code",
 			"fieldtype": "Link",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"label": _("Description"),
-			"fieldname": "description",
-			"fieldtype": "Data",
-			"width": 140
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 200},
+		{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 140},
 		{
 			"label": _("S.O. No."),
 			"options": "Sales Order",
 			"fieldname": "sales_order_no",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Date"),
-			"fieldname": "date",
-			"fieldtype": "Date",
-			"width": 140
-		},
+		{"label": _("Date"), "fieldname": "date", "fieldtype": "Date", "width": 140},
 		{
 			"label": _("Material Request"),
 			"fieldname": "material_request",
 			"fieldtype": "Data",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Customer"),
-			"fieldname": "customer",
-			"fieldtype": "Data",
-			"width": 140
-		},
-		{
-			"label": _("Territory"),
-			"fieldname": "territory",
-			"fieldtype": "Data",
-			"width": 140
-		},
-		{
-			"label": _("SO Qty"),
-			"fieldname": "so_qty",
-			"fieldtype": "Float",
-			"width": 140
-		},
-		{
-			"label": _("Requested Qty"),
-			"fieldname": "requested_qty",
-			"fieldtype": "Float",
-			"width": 140
-		},
-		{
-			"label": _("Pending Qty"),
-			"fieldname": "pending_qty",
-			"fieldtype": "Float",
-			"width": 140
-		},
-		{
-			"label": _("Company"),
-			"fieldname": "company",
-			"fieldtype": "Data",
-			"width": 140
-		}
+		{"label": _("Customer"), "fieldname": "customer", "fieldtype": "Data", "width": 140},
+		{"label": _("Territory"), "fieldname": "territory", "fieldtype": "Data", "width": 140},
+		{"label": _("SO Qty"), "fieldname": "so_qty", "fieldtype": "Float", "width": 140},
+		{"label": _("Requested Qty"), "fieldname": "requested_qty", "fieldtype": "Float", "width": 140},
+		{"label": _("Pending Qty"), "fieldname": "pending_qty", "fieldtype": "Float", "width": 140},
+		{"label": _("Company"), "fieldname": "company", "fieldtype": "Data", "width": 140},
 	]
 	return columns
 
+
 def get_data():
-	sales_order_entry = frappe.db.sql("""
+	sales_order_entry = frappe.db.sql(
+		"""
 		SELECT
 			so_item.item_code,
 			so_item.item_name,
@@ -110,88 +68,94 @@
 			and so.status not in  ("Closed","Completed","Cancelled")
 		GROUP BY
 			so.name,so_item.item_code
-		""", as_dict = 1)
+		""",
+		as_dict=1,
+	)
 
 	sales_orders = [row.name for row in sales_order_entry]
-	mr_records = frappe.get_all("Material Request Item",
+	mr_records = frappe.get_all(
+		"Material Request Item",
 		{"sales_order": ("in", sales_orders), "docstatus": 1},
-		["parent", "qty", "sales_order", "item_code"])
+		["parent", "qty", "sales_order", "item_code"],
+	)
 
 	bundled_item_map = get_packed_items(sales_orders)
 
-	item_with_product_bundle = get_items_with_product_bundle([row.item_code for row in sales_order_entry])
+	item_with_product_bundle = get_items_with_product_bundle(
+		[row.item_code for row in sales_order_entry]
+	)
 
 	materials_request_dict = {}
 
 	for record in mr_records:
 		key = (record.sales_order, record.item_code)
 		if key not in materials_request_dict:
-			materials_request_dict.setdefault(key, {
-				'qty': 0,
-				'material_requests': [record.parent]
-			})
+			materials_request_dict.setdefault(key, {"qty": 0, "material_requests": [record.parent]})
 
 		details = materials_request_dict.get(key)
-		details['qty'] += record.qty
+		details["qty"] += record.qty
 
-		if record.parent not in details.get('material_requests'):
-			details['material_requests'].append(record.parent)
+		if record.parent not in details.get("material_requests"):
+			details["material_requests"].append(record.parent)
 
 	pending_so = []
 	for so in sales_order_entry:
 		if so.item_code not in item_with_product_bundle:
 			material_requests_against_so = materials_request_dict.get((so.name, so.item_code)) or {}
 			# check for pending sales order
-			if flt(so.total_qty) > flt(material_requests_against_so.get('qty')):
+			if flt(so.total_qty) > flt(material_requests_against_so.get("qty")):
 				so_record = {
 					"item_code": so.item_code,
 					"item_name": so.item_name,
 					"description": so.description,
 					"sales_order_no": so.name,
 					"date": so.transaction_date,
-					"material_request": ','.join(material_requests_against_so.get('material_requests', [])),
+					"material_request": ",".join(material_requests_against_so.get("material_requests", [])),
 					"customer": so.customer,
 					"territory": so.territory,
 					"so_qty": so.total_qty,
-					"requested_qty": material_requests_against_so.get('qty'),
-					"pending_qty": so.total_qty - flt(material_requests_against_so.get('qty')),
-					"company": so.company
+					"requested_qty": material_requests_against_so.get("qty"),
+					"pending_qty": so.total_qty - flt(material_requests_against_so.get("qty")),
+					"company": so.company,
 				}
 				pending_so.append(so_record)
 		else:
 			for item in bundled_item_map.get((so.name, so.item_code), []):
 				material_requests_against_so = materials_request_dict.get((so.name, item.item_code)) or {}
-				if flt(item.qty) > flt(material_requests_against_so.get('qty')):
+				if flt(item.qty) > flt(material_requests_against_so.get("qty")):
 					so_record = {
 						"item_code": item.item_code,
 						"item_name": item.item_name,
 						"description": item.description,
 						"sales_order_no": so.name,
 						"date": so.transaction_date,
-						"material_request": ','.join(material_requests_against_so.get('material_requests', [])),
+						"material_request": ",".join(material_requests_against_so.get("material_requests", [])),
 						"customer": so.customer,
 						"territory": so.territory,
 						"so_qty": item.qty,
-						"requested_qty": material_requests_against_so.get('qty', 0),
-						"pending_qty": item.qty - flt(material_requests_against_so.get('qty', 0)),
-						"company": so.company
+						"requested_qty": material_requests_against_so.get("qty", 0),
+						"pending_qty": item.qty - flt(material_requests_against_so.get("qty", 0)),
+						"company": so.company,
 					}
 					pending_so.append(so_record)
 
-
 	return pending_so
 
+
 def get_items_with_product_bundle(item_list):
-	bundled_items = frappe.get_all("Product Bundle", filters = [
-		("new_item_code", "IN", item_list)
-	], fields = ["new_item_code"])
+	bundled_items = frappe.get_all(
+		"Product Bundle", filters=[("new_item_code", "IN", item_list)], fields=["new_item_code"]
+	)
 
 	return [d.new_item_code for d in bundled_items]
 
+
 def get_packed_items(sales_order_list):
-	packed_items = frappe.get_all("Packed Item", filters = [
-		("parent", "IN", sales_order_list)
-	], fields = ["parent_item", "item_code", "qty", "item_name", "description", "parent"])
+	packed_items = frappe.get_all(
+		"Packed Item",
+		filters=[("parent", "IN", sales_order_list)],
+		fields=["parent_item", "item_code", "qty", "item_name", "description", "parent"],
+	)
 
 	bundled_item_map = frappe._dict()
 	for d in packed_items:
diff --git a/erpnext/selling/report/pending_so_items_for_purchase_request/test_pending_so_items_for_purchase_request.py b/erpnext/selling/report/pending_so_items_for_purchase_request/test_pending_so_items_for_purchase_request.py
index 16162ac..e4ad5c6 100644
--- a/erpnext/selling/report/pending_so_items_for_purchase_request/test_pending_so_items_for_purchase_request.py
+++ b/erpnext/selling/report/pending_so_items_for_purchase_request/test_pending_so_items_for_purchase_request.py
@@ -13,18 +13,18 @@
 
 
 class TestPendingSOItemsForPurchaseRequest(FrappeTestCase):
-    def test_result_for_partial_material_request(self):
-        so = make_sales_order()
-        mr=make_material_request(so.name)
-        mr.items[0].qty = 4
-        mr.schedule_date = add_months(nowdate(),1)
-        mr.submit()
-        report = execute()
-        l = len(report[1])
-        self.assertEqual((so.items[0].qty - mr.items[0].qty), report[1][l-1]['pending_qty'])
+	def test_result_for_partial_material_request(self):
+		so = make_sales_order()
+		mr = make_material_request(so.name)
+		mr.items[0].qty = 4
+		mr.schedule_date = add_months(nowdate(), 1)
+		mr.submit()
+		report = execute()
+		l = len(report[1])
+		self.assertEqual((so.items[0].qty - mr.items[0].qty), report[1][l - 1]["pending_qty"])
 
-    def test_result_for_so_item(self):
-        so = make_sales_order()
-        report = execute()
-        l = len(report[1])
-        self.assertEqual(so.items[0].qty, report[1][l-1]['pending_qty'])
+	def test_result_for_so_item(self):
+		so = make_sales_order()
+		report = execute()
+		l = len(report[1])
+		self.assertEqual(so.items[0].qty, report[1][l - 1]["pending_qty"])
diff --git a/erpnext/selling/report/quotation_trends/quotation_trends.py b/erpnext/selling/report/quotation_trends/quotation_trends.py
index 047b090..dfcec22 100644
--- a/erpnext/selling/report/quotation_trends/quotation_trends.py
+++ b/erpnext/selling/report/quotation_trends/quotation_trends.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Quotation")
 	data = get_data(filters, conditions)
@@ -17,6 +18,7 @@
 
 	return conditions["columns"], data, None, chart_data
 
+
 def get_chart_data(data, conditions, filters):
 	if not (data and conditions):
 		return []
@@ -29,32 +31,27 @@
 
 	# fetch only periodic columns as labels
 	columns = conditions.get("columns")[start:-2][1::2]
-	labels = [column.split(':')[0] for column in columns]
+	labels = [column.split(":")[0] for column in columns]
 	datapoints = [0] * len(labels)
 
 	for row in data:
 		# If group by filter, don't add first row of group (it's already summed)
-		if not row[start-1]:
+		if not row[start - 1]:
 			continue
 		# Remove None values and compute only periodic data
 		row = [x if x else 0 for x in row[start:-2]]
-		row  = row[1::2]
+		row = row[1::2]
 
 		for i in range(len(row)):
 			datapoints[i] += row[i]
 
 	return {
-		"data" : {
-			"labels" : labels,
-			"datasets" : [
-				{
-					"name" : _("{0}").format(filters.get("period")) + _(" Quoted Amount"),
-					"values" : datapoints
-				}
-			]
+		"data": {
+			"labels": labels,
+			"datasets": [
+				{"name": _("{0}").format(filters.get("period")) + _(" Quoted Amount"), "values": datapoints}
+			],
 		},
-		"type" : "line",
-		"lineOptions": {
-			"regionFill": 1
-		}
+		"type": "line",
+		"lineOptions": {"regionFill": 1},
 	}
diff --git a/erpnext/selling/report/sales_analytics/sales_analytics.py b/erpnext/selling/report/sales_analytics/sales_analytics.py
index 83588c3..1a2476a 100644
--- a/erpnext/selling/report/sales_analytics/sales_analytics.py
+++ b/erpnext/selling/report/sales_analytics/sales_analytics.py
@@ -12,12 +12,29 @@
 def execute(filters=None):
 	return Analytics(filters).run()
 
+
 class Analytics(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
-		self.date_field = 'transaction_date' \
-			if self.filters.doc_type in ['Sales Order', 'Purchase Order'] else 'posting_date'
-		self.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+		self.date_field = (
+			"transaction_date"
+			if self.filters.doc_type in ["Sales Order", "Purchase Order"]
+			else "posting_date"
+		)
+		self.months = [
+			"Jan",
+			"Feb",
+			"Mar",
+			"Apr",
+			"May",
+			"Jun",
+			"Jul",
+			"Aug",
+			"Sep",
+			"Oct",
+			"Nov",
+			"Dec",
+		]
 		self.get_period_date_ranges()
 
 	def run(self):
@@ -34,52 +51,52 @@
 		return self.columns, self.data, None, self.chart, None, skip_total_row
 
 	def get_columns(self):
-		self.columns = [{
+		self.columns = [
+			{
 				"label": _(self.filters.tree_type),
 				"options": self.filters.tree_type if self.filters.tree_type != "Order Type" else "",
 				"fieldname": "entity",
 				"fieldtype": "Link" if self.filters.tree_type != "Order Type" else "Data",
-				"width": 140 if self.filters.tree_type != "Order Type" else 200
-			}]
+				"width": 140 if self.filters.tree_type != "Order Type" else 200,
+			}
+		]
 		if self.filters.tree_type in ["Customer", "Supplier", "Item"]:
-			self.columns.append({
-				"label": _(self.filters.tree_type + " Name"),
-				"fieldname": "entity_name",
-				"fieldtype": "Data",
-				"width": 140
-			})
+			self.columns.append(
+				{
+					"label": _(self.filters.tree_type + " Name"),
+					"fieldname": "entity_name",
+					"fieldtype": "Data",
+					"width": 140,
+				}
+			)
 
 		if self.filters.tree_type == "Item":
-			self.columns.append({
-				"label": _("UOM"),
-				"fieldname": 'stock_uom',
-				"fieldtype": "Link",
-				"options": "UOM",
-				"width": 100
-			})
+			self.columns.append(
+				{
+					"label": _("UOM"),
+					"fieldname": "stock_uom",
+					"fieldtype": "Link",
+					"options": "UOM",
+					"width": 100,
+				}
+			)
 
 		for end_date in self.periodic_daterange:
 			period = self.get_period(end_date)
-			self.columns.append({
-				"label": _(period),
-				"fieldname": scrub(period),
-				"fieldtype": "Float",
-				"width": 120
-			})
+			self.columns.append(
+				{"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120}
+			)
 
-		self.columns.append({
-			"label": _("Total"),
-			"fieldname": "total",
-			"fieldtype": "Float",
-			"width": 120
-		})
+		self.columns.append(
+			{"label": _("Total"), "fieldname": "total", "fieldtype": "Float", "width": 120}
+		)
 
 	def get_data(self):
 		if self.filters.tree_type in ["Customer", "Supplier"]:
 			self.get_sales_transactions_based_on_customers_or_suppliers()
 			self.get_rows()
 
-		elif self.filters.tree_type == 'Item':
+		elif self.filters.tree_type == "Item":
 			self.get_sales_transactions_based_on_items()
 			self.get_rows()
 
@@ -87,7 +104,7 @@
 			self.get_sales_transactions_based_on_customer_or_territory_group()
 			self.get_rows_by_group()
 
-		elif self.filters.tree_type == 'Item Group':
+		elif self.filters.tree_type == "Item Group":
 			self.get_sales_transactions_based_on_item_group()
 			self.get_rows_by_group()
 
@@ -103,40 +120,45 @@
 			self.get_rows()
 
 	def get_sales_transactions_based_on_order_type(self):
-		if self.filters["value_quantity"] == 'Value':
+		if self.filters["value_quantity"] == "Value":
 			value_field = "base_net_total"
 		else:
 			value_field = "total_qty"
 
-		self.entries = frappe.db.sql(""" select s.order_type as entity, s.{value_field} as value_field, s.{date_field}
+		self.entries = frappe.db.sql(
+			""" select s.order_type as entity, s.{value_field} as value_field, s.{date_field}
 			from `tab{doctype}` s where s.docstatus = 1 and s.company = %s and s.{date_field} between %s and %s
 			and ifnull(s.order_type, '') != '' order by s.order_type
-		"""
-		.format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
-		(self.filters.company, self.filters.from_date, self.filters.to_date), as_dict=1)
+		""".format(
+				date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type
+			),
+			(self.filters.company, self.filters.from_date, self.filters.to_date),
+			as_dict=1,
+		)
 
 		self.get_teams()
 
 	def get_sales_transactions_based_on_customers_or_suppliers(self):
-		if self.filters["value_quantity"] == 'Value':
+		if self.filters["value_quantity"] == "Value":
 			value_field = "base_net_total as value_field"
 		else:
 			value_field = "total_qty as value_field"
 
-		if self.filters.tree_type == 'Customer':
+		if self.filters.tree_type == "Customer":
 			entity = "customer as entity"
 			entity_name = "customer_name as entity_name"
 		else:
 			entity = "supplier as entity"
 			entity_name = "supplier_name as entity_name"
 
-		self.entries = frappe.get_all(self.filters.doc_type,
+		self.entries = frappe.get_all(
+			self.filters.doc_type,
 			fields=[entity, entity_name, value_field, self.date_field],
 			filters={
 				"docstatus": 1,
 				"company": self.filters.company,
-				self.date_field: ('between', [self.filters.from_date, self.filters.to_date])
-			}
+				self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
+			},
 		)
 
 		self.entity_names = {}
@@ -145,80 +167,91 @@
 
 	def get_sales_transactions_based_on_items(self):
 
-		if self.filters["value_quantity"] == 'Value':
-			value_field = 'base_amount'
+		if self.filters["value_quantity"] == "Value":
+			value_field = "base_amount"
 		else:
-			value_field = 'stock_qty'
+			value_field = "stock_qty"
 
-		self.entries = frappe.db.sql("""
+		self.entries = frappe.db.sql(
+			"""
 			select i.item_code as entity, i.item_name as entity_name, i.stock_uom, i.{value_field} as value_field, s.{date_field}
 			from `tab{doctype} Item` i , `tab{doctype}` s
 			where s.name = i.parent and i.docstatus = 1 and s.company = %s
 			and s.{date_field} between %s and %s
-		"""
-		.format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
-		(self.filters.company, self.filters.from_date, self.filters.to_date), as_dict=1)
+		""".format(
+				date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type
+			),
+			(self.filters.company, self.filters.from_date, self.filters.to_date),
+			as_dict=1,
+		)
 
 		self.entity_names = {}
 		for d in self.entries:
 			self.entity_names.setdefault(d.entity, d.entity_name)
 
 	def get_sales_transactions_based_on_customer_or_territory_group(self):
-		if self.filters["value_quantity"] == 'Value':
+		if self.filters["value_quantity"] == "Value":
 			value_field = "base_net_total as value_field"
 		else:
 			value_field = "total_qty as value_field"
 
-		if self.filters.tree_type == 'Customer Group':
-			entity_field = 'customer_group as entity'
-		elif self.filters.tree_type == 'Supplier Group':
+		if self.filters.tree_type == "Customer Group":
+			entity_field = "customer_group as entity"
+		elif self.filters.tree_type == "Supplier Group":
 			entity_field = "supplier as entity"
 			self.get_supplier_parent_child_map()
 		else:
 			entity_field = "territory as entity"
 
-		self.entries = frappe.get_all(self.filters.doc_type,
+		self.entries = frappe.get_all(
+			self.filters.doc_type,
 			fields=[entity_field, value_field, self.date_field],
 			filters={
 				"docstatus": 1,
 				"company": self.filters.company,
-				self.date_field: ('between', [self.filters.from_date, self.filters.to_date])
-			}
+				self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
+			},
 		)
 		self.get_groups()
 
 	def get_sales_transactions_based_on_item_group(self):
-		if self.filters["value_quantity"] == 'Value':
+		if self.filters["value_quantity"] == "Value":
 			value_field = "base_amount"
 		else:
 			value_field = "qty"
 
-		self.entries = frappe.db.sql("""
+		self.entries = frappe.db.sql(
+			"""
 			select i.item_group as entity, i.{value_field} as value_field, s.{date_field}
 			from `tab{doctype} Item` i , `tab{doctype}` s
 			where s.name = i.parent and i.docstatus = 1 and s.company = %s
 			and s.{date_field} between %s and %s
-		""".format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
-		(self.filters.company, self.filters.from_date, self.filters.to_date), as_dict=1)
+		""".format(
+				date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type
+			),
+			(self.filters.company, self.filters.from_date, self.filters.to_date),
+			as_dict=1,
+		)
 
 		self.get_groups()
 
 	def get_sales_transactions_based_on_project(self):
-		if self.filters["value_quantity"] == 'Value':
+		if self.filters["value_quantity"] == "Value":
 			value_field = "base_net_total as value_field"
 		else:
 			value_field = "total_qty as value_field"
 
 		entity = "project as entity"
 
-		self.entries = frappe.get_all(self.filters.doc_type,
+		self.entries = frappe.get_all(
+			self.filters.doc_type,
 			fields=[entity, value_field, self.date_field],
 			filters={
 				"docstatus": 1,
 				"company": self.filters.company,
 				"project": ["!=", ""],
-				self.date_field: ('between', [self.filters.from_date, self.filters.to_date])
-			}
+				self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
+			},
 		)
 
 	def get_rows(self):
@@ -228,7 +261,7 @@
 		for entity, period_data in self.entity_periodic_data.items():
 			row = {
 				"entity": entity,
-				"entity_name": self.entity_names.get(entity) if hasattr(self, 'entity_names') else None
+				"entity_name": self.entity_names.get(entity) if hasattr(self, "entity_names") else None,
 			}
 			total = 0
 			for end_date in self.periodic_daterange:
@@ -249,10 +282,7 @@
 		out = []
 
 		for d in reversed(self.group_entries):
-			row = {
-				"entity": d.name,
-				"indent": self.depth_map.get(d.name)
-			}
+			row = {"entity": d.name, "indent": self.depth_map.get(d.name)}
 			total = 0
 			for end_date in self.periodic_daterange:
 				period = self.get_period(end_date)
@@ -279,14 +309,14 @@
 			self.entity_periodic_data[d.entity][period] += flt(d.value_field)
 
 			if self.filters.tree_type == "Item":
-				self.entity_periodic_data[d.entity]['stock_uom'] = d.stock_uom
+				self.entity_periodic_data[d.entity]["stock_uom"] = d.stock_uom
 
 	def get_period(self, posting_date):
-		if self.filters.range == 'Weekly':
+		if self.filters.range == "Weekly":
 			period = "Week " + str(posting_date.isocalendar()[1]) + " " + str(posting_date.year)
-		elif self.filters.range == 'Monthly':
+		elif self.filters.range == "Monthly":
 			period = str(self.months[posting_date.month - 1]) + " " + str(posting_date.year)
-		elif self.filters.range == 'Quarterly':
+		elif self.filters.range == "Quarterly":
 			period = "Quarter " + str(((posting_date.month - 1) // 3) + 1) + " " + str(posting_date.year)
 		else:
 			year = get_fiscal_year(posting_date, company=self.filters.company)
@@ -295,16 +325,14 @@
 
 	def get_period_date_ranges(self):
 		from dateutil.relativedelta import MO, relativedelta
+
 		from_date, to_date = getdate(self.filters.from_date), getdate(self.filters.to_date)
 
-		increment = {
-			"Monthly": 1,
-			"Quarterly": 3,
-			"Half-Yearly": 6,
-			"Yearly": 12
-		}.get(self.filters.range, 1)
+		increment = {"Monthly": 1, "Quarterly": 3, "Half-Yearly": 6, "Yearly": 12}.get(
+			self.filters.range, 1
+		)
 
-		if self.filters.range in ['Monthly', 'Quarterly']:
+		if self.filters.range in ["Monthly", "Quarterly"]:
 			from_date = from_date.replace(day=1)
 		elif self.filters.range == "Yearly":
 			from_date = get_fiscal_year(from_date)[1]
@@ -329,19 +357,23 @@
 
 	def get_groups(self):
 		if self.filters.tree_type == "Territory":
-			parent = 'parent_territory'
+			parent = "parent_territory"
 		if self.filters.tree_type == "Customer Group":
-			parent = 'parent_customer_group'
+			parent = "parent_customer_group"
 		if self.filters.tree_type == "Item Group":
-			parent = 'parent_item_group'
+			parent = "parent_item_group"
 		if self.filters.tree_type == "Supplier Group":
-			parent = 'parent_supplier_group'
+			parent = "parent_supplier_group"
 
 		self.depth_map = frappe._dict()
 
-		self.group_entries = frappe.db.sql("""select name, lft, rgt , {parent} as parent
-			from `tab{tree}` order by lft"""
-		.format(tree=self.filters.tree_type, parent=parent), as_dict=1)
+		self.group_entries = frappe.db.sql(
+			"""select name, lft, rgt , {parent} as parent
+			from `tab{tree}` order by lft""".format(
+				tree=self.filters.tree_type, parent=parent
+			),
+			as_dict=1,
+		)
 
 		for d in self.group_entries:
 			if d.parent:
@@ -352,11 +384,15 @@
 	def get_teams(self):
 		self.depth_map = frappe._dict()
 
-		self.group_entries = frappe.db.sql(""" select * from (select "Order Types" as name, 0 as lft,
+		self.group_entries = frappe.db.sql(
+			""" select * from (select "Order Types" as name, 0 as lft,
 			2 as rgt, '' as parent union select distinct order_type as name, 1 as lft, 1 as rgt, "Order Types" as parent
 			from `tab{doctype}` where ifnull(order_type, '') != '') as b order by lft, name
-		"""
-		.format(doctype=self.filters.doc_type), as_dict=1)
+		""".format(
+				doctype=self.filters.doc_type
+			),
+			as_dict=1,
+		)
 
 		for d in self.group_entries:
 			if d.parent:
@@ -365,21 +401,17 @@
 				self.depth_map.setdefault(d.name, 0)
 
 	def get_supplier_parent_child_map(self):
-		self.parent_child_map = frappe._dict(frappe.db.sql(""" select name, supplier_group from `tabSupplier`"""))
+		self.parent_child_map = frappe._dict(
+			frappe.db.sql(""" select name, supplier_group from `tabSupplier`""")
+		)
 
 	def get_chart_data(self):
 		length = len(self.columns)
 
 		if self.filters.tree_type in ["Customer", "Supplier"]:
-			labels = [d.get("label") for d in self.columns[2:length - 1]]
+			labels = [d.get("label") for d in self.columns[2 : length - 1]]
 		elif self.filters.tree_type == "Item":
-			labels = [d.get("label") for d in self.columns[3:length - 1]]
+			labels = [d.get("label") for d in self.columns[3 : length - 1]]
 		else:
-			labels = [d.get("label") for d in self.columns[1:length - 1]]
-		self.chart = {
-			"data": {
-				'labels': labels,
-				'datasets': []
-			},
-			"type": "line"
-		}
+			labels = [d.get("label") for d in self.columns[1 : length - 1]]
+		self.chart = {"data": {"labels": labels, "datasets": []}, "type": "line"}
diff --git a/erpnext/selling/report/sales_analytics/test_analytics.py b/erpnext/selling/report/sales_analytics/test_analytics.py
index 564f48f..15f06d9 100644
--- a/erpnext/selling/report/sales_analytics/test_analytics.py
+++ b/erpnext/selling/report/sales_analytics/test_analytics.py
@@ -19,16 +19,15 @@
 		self.compare_result_for_customer_group()
 		self.compare_result_for_customer_based_on_quantity()
 
-
 	def compare_result_for_customer(self):
 		filters = {
-			'doc_type': 'Sales Order',
-			'range': 'Monthly',
-			'to_date': '2018-03-31',
-			'tree_type': 'Customer',
-			'company': '_Test Company 2',
-			'from_date': '2017-04-01',
-			'value_quantity': 'Value'
+			"doc_type": "Sales Order",
+			"range": "Monthly",
+			"to_date": "2018-03-31",
+			"tree_type": "Customer",
+			"company": "_Test Company 2",
+			"from_date": "2017-04-01",
+			"value_quantity": "Value",
 		}
 
 		report = execute(filters)
@@ -49,7 +48,7 @@
 				"jan_2018": 0.0,
 				"feb_2018": 2000.0,
 				"mar_2018": 0.0,
-				"total":2000.0
+				"total": 2000.0,
 			},
 			{
 				"entity": "_Test Customer 2",
@@ -66,7 +65,7 @@
 				"jan_2018": 0.0,
 				"feb_2018": 0.0,
 				"mar_2018": 0.0,
-				"total":2500.0
+				"total": 2500.0,
 			},
 			{
 				"entity": "_Test Customer 3",
@@ -83,21 +82,21 @@
 				"jan_2018": 0.0,
 				"feb_2018": 0.0,
 				"mar_2018": 0.0,
-				"total": 3000.0
-			}
+				"total": 3000.0,
+			},
 		]
-		result = sorted(report[1], key=lambda k: k['entity'])
+		result = sorted(report[1], key=lambda k: k["entity"])
 		self.assertEqual(expected_data, result)
 
 	def compare_result_for_customer_group(self):
 		filters = {
-			'doc_type': 'Sales Order',
-			'range': 'Monthly',
-			'to_date': '2018-03-31',
-			'tree_type': 'Customer Group',
-			'company': '_Test Company 2',
-			'from_date': '2017-04-01',
-			'value_quantity': 'Value'
+			"doc_type": "Sales Order",
+			"range": "Monthly",
+			"to_date": "2018-03-31",
+			"tree_type": "Customer Group",
+			"company": "_Test Company 2",
+			"from_date": "2017-04-01",
+			"value_quantity": "Value",
 		}
 
 		report = execute(filters)
@@ -117,19 +116,19 @@
 			"jan_2018": 0.0,
 			"feb_2018": 2000.0,
 			"mar_2018": 0.0,
-			"total":7500.0
+			"total": 7500.0,
 		}
 		self.assertEqual(expected_first_row, report[1][0])
 
 	def compare_result_for_customer_based_on_quantity(self):
 		filters = {
-			'doc_type': 'Sales Order',
-			'range': 'Monthly',
-			'to_date': '2018-03-31',
-			'tree_type': 'Customer',
-			'company': '_Test Company 2',
-			'from_date': '2017-04-01',
-			'value_quantity': 'Quantity'
+			"doc_type": "Sales Order",
+			"range": "Monthly",
+			"to_date": "2018-03-31",
+			"tree_type": "Customer",
+			"company": "_Test Company 2",
+			"from_date": "2017-04-01",
+			"value_quantity": "Quantity",
 		}
 
 		report = execute(filters)
@@ -150,7 +149,7 @@
 				"jan_2018": 0.0,
 				"feb_2018": 20.0,
 				"mar_2018": 0.0,
-				"total":20.0
+				"total": 20.0,
 			},
 			{
 				"entity": "_Test Customer 2",
@@ -167,7 +166,7 @@
 				"jan_2018": 0.0,
 				"feb_2018": 0.0,
 				"mar_2018": 0.0,
-				"total":25.0
+				"total": 25.0,
 			},
 			{
 				"entity": "_Test Customer 3",
@@ -184,47 +183,66 @@
 				"jan_2018": 0.0,
 				"feb_2018": 0.0,
 				"mar_2018": 0.0,
-				"total": 30.0
-			}
+				"total": 30.0,
+			},
 		]
-		result = sorted(report[1], key=lambda k: k['entity'])
+		result = sorted(report[1], key=lambda k: k["entity"])
 		self.assertEqual(expected_data, result)
 
+
 def create_sales_orders():
 	frappe.set_user("Administrator")
 
-	make_sales_order(company="_Test Company 2", qty=10,
-		customer = "_Test Customer 1",
-		transaction_date = '2018-02-10',
-		warehouse = 'Finished Goods - _TC2',
-		currency = 'EUR')
+	make_sales_order(
+		company="_Test Company 2",
+		qty=10,
+		customer="_Test Customer 1",
+		transaction_date="2018-02-10",
+		warehouse="Finished Goods - _TC2",
+		currency="EUR",
+	)
 
-	make_sales_order(company="_Test Company 2",
-		qty=10, customer = "_Test Customer 1",
-		transaction_date = '2018-02-15',
-		warehouse = 'Finished Goods - _TC2',
-		currency = 'EUR')
+	make_sales_order(
+		company="_Test Company 2",
+		qty=10,
+		customer="_Test Customer 1",
+		transaction_date="2018-02-15",
+		warehouse="Finished Goods - _TC2",
+		currency="EUR",
+	)
 
-	make_sales_order(company = "_Test Company 2",
-		qty=10, customer = "_Test Customer 2",
-		transaction_date = '2017-10-10',
-		warehouse='Finished Goods - _TC2',
-		currency = 'EUR')
+	make_sales_order(
+		company="_Test Company 2",
+		qty=10,
+		customer="_Test Customer 2",
+		transaction_date="2017-10-10",
+		warehouse="Finished Goods - _TC2",
+		currency="EUR",
+	)
 
-	make_sales_order(company="_Test Company 2",
-		qty=15, customer = "_Test Customer 2",
-		transaction_date='2017-09-23',
-		warehouse='Finished Goods - _TC2',
-		currency = 'EUR')
+	make_sales_order(
+		company="_Test Company 2",
+		qty=15,
+		customer="_Test Customer 2",
+		transaction_date="2017-09-23",
+		warehouse="Finished Goods - _TC2",
+		currency="EUR",
+	)
 
-	make_sales_order(company="_Test Company 2",
-		qty=20, customer = "_Test Customer 3",
-		transaction_date='2017-06-15',
-		warehouse='Finished Goods - _TC2',
-		currency = 'EUR')
+	make_sales_order(
+		company="_Test Company 2",
+		qty=20,
+		customer="_Test Customer 3",
+		transaction_date="2017-06-15",
+		warehouse="Finished Goods - _TC2",
+		currency="EUR",
+	)
 
-	make_sales_order(company="_Test Company 2",
-		qty=10, customer = "_Test Customer 3",
-		transaction_date='2017-07-10',
-		warehouse='Finished Goods - _TC2',
-		currency = 'EUR')
+	make_sales_order(
+		company="_Test Company 2",
+		qty=10,
+		customer="_Test Customer 3",
+		transaction_date="2017-07-10",
+		warehouse="Finished Goods - _TC2",
+		currency="EUR",
+	)
diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
index 3e22d0f..a410513 100644
--- a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
+++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
@@ -26,6 +26,7 @@
 
 	return columns, data, None, chart_data
 
+
 def validate_filters(filters):
 	from_date, to_date = filters.get("from_date"), filters.get("to_date")
 
@@ -34,6 +35,7 @@
 	elif date_diff(to_date, from_date) < 0:
 		frappe.throw(_("To Date cannot be before From Date."))
 
+
 def get_conditions(filters):
 	conditions = ""
 	if filters.get("from_date") and filters.get("to_date"):
@@ -50,8 +52,10 @@
 
 	return conditions
 
+
 def get_data(conditions, filters):
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		SELECT
 			so.transaction_date as date,
 			soi.delivery_date as delivery_date,
@@ -86,10 +90,16 @@
 			{conditions}
 		GROUP BY soi.name
 		ORDER BY so.transaction_date ASC, soi.item_code ASC
-	""".format(conditions=conditions), filters, as_dict=1)
+	""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return data
 
+
 def prepare_data(data, filters):
 	completed, pending = 0, 0
 
@@ -119,8 +129,17 @@
 				so_row["delay"] = min(so_row["delay"], row["delay"])
 
 				# sum numeric columns
-				fields = ["qty", "delivered_qty", "pending_qty", "billed_qty", "qty_to_bill", "amount",
-					"delivered_qty_amount", "billed_amount", "pending_amount"]
+				fields = [
+					"qty",
+					"delivered_qty",
+					"pending_qty",
+					"billed_qty",
+					"qty_to_bill",
+					"amount",
+					"delivered_qty_amount",
+					"billed_amount",
+					"pending_amount",
+				]
 				for field in fields:
 					so_row[field] = flt(row[field]) + flt(so_row[field])
 
@@ -134,166 +153,148 @@
 
 	return data, chart_data
 
+
 def prepare_chart_data(pending, completed):
 	labels = ["Amount to Bill", "Billed Amount"]
 
 	return {
-		"data" : {
-			"labels": labels,
-			"datasets": [
-				{"values": [pending, completed]}
-				]
-		},
-		"type": 'donut',
-		"height": 300
+		"data": {"labels": labels, "datasets": [{"values": [pending, completed]}]},
+		"type": "donut",
+		"height": 300,
 	}
 
+
 def get_columns(filters):
 	columns = [
-		{
-			"label":_("Date"),
-			"fieldname": "date",
-			"fieldtype": "Date",
-			"width": 90
-		},
+		{"label": _("Date"), "fieldname": "date", "fieldtype": "Date", "width": 90},
 		{
 			"label": _("Sales Order"),
 			"fieldname": "sales_order",
 			"fieldtype": "Link",
 			"options": "Sales Order",
-			"width": 160
+			"width": 160,
 		},
-		{
-			"label":_("Status"),
-			"fieldname": "status",
-			"fieldtype": "Data",
-			"width": 130
-		},
+		{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 130},
 		{
 			"label": _("Customer"),
 			"fieldname": "customer",
 			"fieldtype": "Link",
 			"options": "Customer",
-			"width": 130
-		}]
-
-	if not filters.get("group_by_so"):
-		columns.append({
-			"label":_("Item Code"),
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 100
-		})
-		columns.append({
-			"label":_("Description"),
-			"fieldname": "description",
-			"fieldtype": "Small Text",
-			"width": 100
-		})
-
-	columns.extend([
-		{
-			"label": _("Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Delivered Qty"),
-			"fieldname": "delivered_qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Qty to Deliver"),
-			"fieldname": "pending_qty",
-			"fieldtype": "Float",
-			"width": 120,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Billed Qty"),
-			"fieldname": "billed_qty",
-			"fieldtype": "Float",
-			"width": 80,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Qty to Bill"),
-			"fieldname": "qty_to_bill",
-			"fieldtype": "Float",
-			"width": 80,
-			"convertible": "qty"
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 110,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label": _("Billed Amount"),
-			"fieldname": "billed_amount",
-			"fieldtype": "Currency",
-			"width": 110,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label": _("Pending Amount"),
-			"fieldname": "pending_amount",
-			"fieldtype": "Currency",
 			"width": 130,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
 		},
-		{
-			"label": _("Amount Delivered"),
-			"fieldname": "delivered_qty_amount",
-			"fieldtype": "Currency",
-			"width": 100,
-			"options": "Company:company:default_currency",
-			"convertible": "rate"
-		},
-		{
-			"label":_("Delivery Date"),
-			"fieldname": "delivery_date",
-			"fieldtype": "Date",
-			"width": 120
-		},
-		{
-			"label": _("Delay (in Days)"),
-			"fieldname": "delay",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Time Taken to Deliver"),
-			"fieldname": "time_taken_to_deliver",
-			"fieldtype": "Duration",
-			"width": 100
-		}
-	])
+	]
+
 	if not filters.get("group_by_so"):
-		columns.append({
-			"label": _("Warehouse"),
-			"fieldname": "warehouse",
-			"fieldtype": "Link",
-			"options": "Warehouse",
-			"width": 100
-		})
-	columns.append({
+		columns.append(
+			{
+				"label": _("Item Code"),
+				"fieldname": "item_code",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 100,
+			}
+		)
+		columns.append(
+			{"label": _("Description"), "fieldname": "description", "fieldtype": "Small Text", "width": 100}
+		)
+
+	columns.extend(
+		[
+			{
+				"label": _("Qty"),
+				"fieldname": "qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Delivered Qty"),
+				"fieldname": "delivered_qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Qty to Deliver"),
+				"fieldname": "pending_qty",
+				"fieldtype": "Float",
+				"width": 120,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Billed Qty"),
+				"fieldname": "billed_qty",
+				"fieldtype": "Float",
+				"width": 80,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Qty to Bill"),
+				"fieldname": "qty_to_bill",
+				"fieldtype": "Float",
+				"width": 80,
+				"convertible": "qty",
+			},
+			{
+				"label": _("Amount"),
+				"fieldname": "amount",
+				"fieldtype": "Currency",
+				"width": 110,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Billed Amount"),
+				"fieldname": "billed_amount",
+				"fieldtype": "Currency",
+				"width": 110,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Pending Amount"),
+				"fieldname": "pending_amount",
+				"fieldtype": "Currency",
+				"width": 130,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{
+				"label": _("Amount Delivered"),
+				"fieldname": "delivered_qty_amount",
+				"fieldtype": "Currency",
+				"width": 100,
+				"options": "Company:company:default_currency",
+				"convertible": "rate",
+			},
+			{"label": _("Delivery Date"), "fieldname": "delivery_date", "fieldtype": "Date", "width": 120},
+			{"label": _("Delay (in Days)"), "fieldname": "delay", "fieldtype": "Data", "width": 100},
+			{
+				"label": _("Time Taken to Deliver"),
+				"fieldname": "time_taken_to_deliver",
+				"fieldtype": "Duration",
+				"width": 100,
+			},
+		]
+	)
+	if not filters.get("group_by_so"):
+		columns.append(
+			{
+				"label": _("Warehouse"),
+				"fieldname": "warehouse",
+				"fieldtype": "Link",
+				"options": "Warehouse",
+				"width": 100,
+			}
+		)
+	columns.append(
+		{
 			"label": _("Company"),
 			"fieldname": "company",
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 100
-		})
-
+			"width": 100,
+		}
+	)
 
 	return columns
diff --git a/erpnext/selling/report/sales_order_trends/sales_order_trends.py b/erpnext/selling/report/sales_order_trends/sales_order_trends.py
index 5a71171..93707bd 100644
--- a/erpnext/selling/report/sales_order_trends/sales_order_trends.py
+++ b/erpnext/selling/report/sales_order_trends/sales_order_trends.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Sales Order")
 	data = get_data(filters, conditions)
@@ -16,6 +17,7 @@
 
 	return conditions["columns"], data, None, chart_data
 
+
 def get_chart_data(data, conditions, filters):
 	if not (data and conditions):
 		return []
@@ -28,32 +30,27 @@
 
 	# fetch only periodic columns as labels
 	columns = conditions.get("columns")[start:-2][1::2]
-	labels = [column.split(':')[0] for column in columns]
+	labels = [column.split(":")[0] for column in columns]
 	datapoints = [0] * len(labels)
 
 	for row in data:
 		# If group by filter, don't add first row of group (it's already summed)
-		if not row[start-1]:
+		if not row[start - 1]:
 			continue
 		# Remove None values and compute only periodic data
 		row = [x if x else 0 for x in row[start:-2]]
-		row  = row[1::2]
+		row = row[1::2]
 
 		for i in range(len(row)):
 			datapoints[i] += row[i]
 
 	return {
-		"data" : {
-			"labels" : labels,
-			"datasets" : [
-				{
-					"name" : _("{0}").format(filters.get("period")) + _(" Sales Value"),
-					"values" : datapoints
-				}
-			]
+		"data": {
+			"labels": labels,
+			"datasets": [
+				{"name": _("{0}").format(filters.get("period")) + _(" Sales Value"), "values": datapoints}
+			],
 		},
-		"type" : "line",
-		"lineOptions": {
-			"regionFill": 1
-		}
+		"type": "line",
+		"lineOptions": {"regionFill": 1},
 	}
diff --git a/erpnext/selling/report/sales_partner_commission_summary/sales_partner_commission_summary.py b/erpnext/selling/report/sales_partner_commission_summary/sales_partner_commission_summary.py
index b775907..cf9ea21 100644
--- a/erpnext/selling/report/sales_partner_commission_summary/sales_partner_commission_summary.py
+++ b/erpnext/selling/report/sales_partner_commission_summary/sales_partner_commission_summary.py
@@ -7,80 +7,73 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns(filters)
 	data = get_entries(filters)
 
 	return columns, data
 
+
 def get_columns(filters):
 	if not filters.get("doctype"):
 		msgprint(_("Please select the document type first"), raise_exception=1)
 
-	columns =[
+	columns = [
 		{
 			"label": _(filters["doctype"]),
 			"options": filters["doctype"],
 			"fieldname": "name",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Customer"),
 			"options": "Customer",
 			"fieldname": "customer",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Territory"),
 			"options": "Territory",
 			"fieldname": "territory",
 			"fieldtype": "Link",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
+		{"label": _("Amount"), "fieldname": "amount", "fieldtype": "Currency", "width": 120},
 		{
 			"label": _("Sales Partner"),
 			"options": "Sales Partner",
 			"fieldname": "sales_partner",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Commission Rate %"),
 			"fieldname": "commission_rate",
 			"fieldtype": "Data",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Total Commission"),
 			"fieldname": "total_commission",
 			"fieldtype": "Currency",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
 	return columns
 
+
 def get_entries(filters):
-	date_field = ("transaction_date" if filters.get('doctype') == "Sales Order"
-		else "posting_date")
+	date_field = "transaction_date" if filters.get("doctype") == "Sales Order" else "posting_date"
 
 	conditions = get_conditions(filters, date_field)
-	entries = frappe.db.sql("""
+	entries = frappe.db.sql(
+		"""
 		SELECT
 			name, customer, territory, {0} as posting_date, base_net_total as amount,
 			sales_partner, commission_rate, total_commission
@@ -89,10 +82,16 @@
 		WHERE
 			{2} and docstatus = 1 and sales_partner is not null
 			and sales_partner != '' order by name desc, sales_partner
-		""".format(date_field, filters.get('doctype'), conditions), filters, as_dict=1)
+		""".format(
+			date_field, filters.get("doctype"), conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return entries
 
+
 def get_conditions(filters, date_field):
 	conditions = "1=1"
 
diff --git a/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py b/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py
index a647eb4..f34f3e3 100644
--- a/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py
+++ b/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py
@@ -14,8 +14,15 @@
 
 def get_data_column(filters, partner_doctype):
 	data = []
-	period_list = get_period_list(filters.fiscal_year, filters.fiscal_year, '', '',
-		'Fiscal Year', filters.period, company=filters.company)
+	period_list = get_period_list(
+		filters.fiscal_year,
+		filters.fiscal_year,
+		"",
+		"",
+		"Fiscal Year",
+		filters.period,
+		company=filters.company,
+	)
 
 	rows = get_data(filters, period_list, partner_doctype)
 	columns = get_columns(filters, period_list, partner_doctype)
@@ -24,20 +31,19 @@
 		return columns, data
 
 	for key, value in rows.items():
-		value.update({
-			frappe.scrub(partner_doctype): key[0],
-			'item_group': key[1]
-		})
+		value.update({frappe.scrub(partner_doctype): key[0], "item_group": key[1]})
 
 		data.append(value)
 
 	return columns, data
 
+
 def get_data(filters, period_list, partner_doctype):
 	sales_field = frappe.scrub(partner_doctype)
 	sales_users_data = get_parents_data(filters, partner_doctype)
 
-	if not sales_users_data: return
+	if not sales_users_data:
+		return
 	sales_users, item_groups = [], []
 
 	for d in sales_users_data:
@@ -47,99 +53,110 @@
 		if d.item_group not in item_groups:
 			item_groups.append(d.item_group)
 
-	date_field = ("transaction_date"
-		if filters.get('doctype') == "Sales Order" else "posting_date")
+	date_field = "transaction_date" if filters.get("doctype") == "Sales Order" else "posting_date"
 
 	actual_data = get_actual_data(filters, item_groups, sales_users, date_field, sales_field)
 
-	return prepare_data(filters, sales_users_data,
-		actual_data, date_field, period_list, sales_field)
+	return prepare_data(filters, sales_users_data, actual_data, date_field, period_list, sales_field)
+
 
 def get_columns(filters, period_list, partner_doctype):
 	fieldtype, options = "Currency", "currency"
 
-	if filters.get("target_on") == 'Quantity':
+	if filters.get("target_on") == "Quantity":
 		fieldtype, options = "Float", ""
 
-	columns = [{
-		"fieldname": frappe.scrub(partner_doctype),
-		"label": _(partner_doctype),
-		"fieldtype": "Link",
-		"options": partner_doctype,
-		"width": 150
-	}, {
-		"fieldname": "item_group",
-		"label": _("Item Group"),
-		"fieldtype": "Link",
-		"options": "Item Group",
-		"width": 150
-	}]
+	columns = [
+		{
+			"fieldname": frappe.scrub(partner_doctype),
+			"label": _(partner_doctype),
+			"fieldtype": "Link",
+			"options": partner_doctype,
+			"width": 150,
+		},
+		{
+			"fieldname": "item_group",
+			"label": _("Item Group"),
+			"fieldtype": "Link",
+			"options": "Item Group",
+			"width": 150,
+		},
+	]
 
 	for period in period_list:
-		target_key = 'target_{}'.format(period.key)
-		variance_key = 'variance_{}'.format(period.key)
+		target_key = "target_{}".format(period.key)
+		variance_key = "variance_{}".format(period.key)
 
-		columns.extend([{
-			"fieldname": target_key,
-			"label": _("Target ({})").format(period.label),
-			"fieldtype": fieldtype,
-			"options": options,
-			"width": 150
-		}, {
-			"fieldname": period.key,
-			"label": _("Achieved ({})").format(period.label),
-			"fieldtype": fieldtype,
-			"options": options,
-			"width": 150
-		}, {
-			"fieldname": variance_key,
-			"label": _("Variance ({})").format(period.label),
-			"fieldtype": fieldtype,
-			"options": options,
-			"width": 150
-		}])
+		columns.extend(
+			[
+				{
+					"fieldname": target_key,
+					"label": _("Target ({})").format(period.label),
+					"fieldtype": fieldtype,
+					"options": options,
+					"width": 150,
+				},
+				{
+					"fieldname": period.key,
+					"label": _("Achieved ({})").format(period.label),
+					"fieldtype": fieldtype,
+					"options": options,
+					"width": 150,
+				},
+				{
+					"fieldname": variance_key,
+					"label": _("Variance ({})").format(period.label),
+					"fieldtype": fieldtype,
+					"options": options,
+					"width": 150,
+				},
+			]
+		)
 
-	columns.extend([{
-		"fieldname": "total_target",
-		"label": _("Total Target"),
-		"fieldtype": fieldtype,
-		"options": options,
-		"width": 150
-	}, {
-		"fieldname": "total_achieved",
-		"label": _("Total Achieved"),
-		"fieldtype": fieldtype,
-		"options": options,
-		"width": 150
-	}, {
-		"fieldname": "total_variance",
-		"label": _("Total Variance"),
-		"fieldtype": fieldtype,
-		"options": options,
-		"width": 150
-	}])
+	columns.extend(
+		[
+			{
+				"fieldname": "total_target",
+				"label": _("Total Target"),
+				"fieldtype": fieldtype,
+				"options": options,
+				"width": 150,
+			},
+			{
+				"fieldname": "total_achieved",
+				"label": _("Total Achieved"),
+				"fieldtype": fieldtype,
+				"options": options,
+				"width": 150,
+			},
+			{
+				"fieldname": "total_variance",
+				"label": _("Total Variance"),
+				"fieldtype": fieldtype,
+				"options": options,
+				"width": 150,
+			},
+		]
+	)
 
 	return columns
 
+
 def prepare_data(filters, sales_users_data, actual_data, date_field, period_list, sales_field):
 	rows = {}
 
-	target_qty_amt_field = ("target_qty"
-		if filters.get("target_on") == 'Quantity' else "target_amount")
+	target_qty_amt_field = "target_qty" if filters.get("target_on") == "Quantity" else "target_amount"
 
-	qty_or_amount_field = ("stock_qty"
-		if filters.get("target_on") == 'Quantity' else "base_net_amount")
+	qty_or_amount_field = "stock_qty" if filters.get("target_on") == "Quantity" else "base_net_amount"
 
 	for d in sales_users_data:
 		key = (d.parent, d.item_group)
-		dist_data = get_periodwise_distribution_data(d.distribution_id, period_list, filters.get("period"))
+		dist_data = get_periodwise_distribution_data(
+			d.distribution_id, period_list, filters.get("period")
+		)
 
 		if key not in rows:
-			rows.setdefault(key,{
-				'total_target': 0,
-				'total_achieved': 0,
-				'total_variance': 0
-			})
+			rows.setdefault(key, {"total_target": 0, "total_achieved": 0, "total_variance": 0})
 
 		details = rows[key]
 		for period in period_list:
@@ -147,15 +164,19 @@
 			if p_key not in details:
 				details[p_key] = 0
 
-			target_key = 'target_{}'.format(p_key)
-			variance_key = 'variance_{}'.format(p_key)
+			target_key = "target_{}".format(p_key)
+			variance_key = "variance_{}".format(p_key)
 			details[target_key] = (d.get(target_qty_amt_field) * dist_data.get(p_key)) / 100
 			details[variance_key] = 0
 			details["total_target"] += details[target_key]
 
 			for r in actual_data:
-				if (r.get(sales_field) == d.parent and r.item_group == d.item_group and
-					period.from_date <= r.get(date_field) and r.get(date_field) <= period.to_date):
+				if (
+					r.get(sales_field) == d.parent
+					and r.item_group == d.item_group
+					and period.from_date <= r.get(date_field)
+					and r.get(date_field) <= period.to_date
+				):
 					details[p_key] += r.get(qty_or_amount_field, 0)
 					details[variance_key] = details.get(p_key) - details.get(target_key)
 
@@ -164,24 +185,28 @@
 
 	return rows
 
+
 def get_actual_data(filters, item_groups, sales_users_or_territory_data, date_field, sales_field):
 	fiscal_year = get_fiscal_year(fiscal_year=filters.get("fiscal_year"), as_dict=1)
 	dates = [fiscal_year.year_start_date, fiscal_year.year_end_date]
 
 	select_field = "`tab{0}`.{1}".format(filters.get("doctype"), sales_field)
-	child_table = "`tab{0}`".format(filters.get("doctype") + ' Item')
+	child_table = "`tab{0}`".format(filters.get("doctype") + " Item")
 
-	if sales_field == 'sales_person':
+	if sales_field == "sales_person":
 		select_field = "`tabSales Team`.sales_person"
-		child_table = "`tab{0}`, `tabSales Team`".format(filters.get("doctype") + ' Item')
+		child_table = "`tab{0}`, `tabSales Team`".format(filters.get("doctype") + " Item")
 		cond = """`tabSales Team`.parent = `tab{0}`.name and
-			`tabSales Team`.sales_person in ({1}) """.format(filters.get("doctype"),
-			','.join(['%s'] * len(sales_users_or_territory_data)))
+			`tabSales Team`.sales_person in ({1}) """.format(
+			filters.get("doctype"), ",".join(["%s"] * len(sales_users_or_territory_data))
+		)
 	else:
-		cond = "`tab{0}`.{1} in ({2})".format(filters.get("doctype"), sales_field,
-			','.join(['%s'] * len(sales_users_or_territory_data)))
+		cond = "`tab{0}`.{1} in ({2})".format(
+			filters.get("doctype"), sales_field, ",".join(["%s"] * len(sales_users_or_territory_data))
+		)
 
-	return frappe.db.sql(""" SELECT `tab{child_doc}`.item_group,
+	return frappe.db.sql(
+		""" SELECT `tab{child_doc}`.item_group,
 			`tab{child_doc}`.stock_qty, `tab{child_doc}`.base_net_amount,
 			{select_field}, `tab{parent_doc}`.{date_field}
 		FROM `tab{parent_doc}`, {child_table}
@@ -189,26 +214,30 @@
 			`tab{child_doc}`.parent = `tab{parent_doc}`.name
 			and `tab{parent_doc}`.docstatus = 1 and {cond}
 			and `tab{child_doc}`.item_group in ({item_groups})
-			and `tab{parent_doc}`.{date_field} between %s and %s"""
-			.format(
-				cond = cond,
-				date_field = date_field,
-				select_field = select_field,
-				child_table = child_table,
-				parent_doc = filters.get("doctype"),
-				child_doc = filters.get("doctype") + ' Item',
-				item_groups = ','.join(['%s'] * len(item_groups))
-			), tuple(sales_users_or_territory_data + item_groups + dates), as_dict=1)
+			and `tab{parent_doc}`.{date_field} between %s and %s""".format(
+			cond=cond,
+			date_field=date_field,
+			select_field=select_field,
+			child_table=child_table,
+			parent_doc=filters.get("doctype"),
+			child_doc=filters.get("doctype") + " Item",
+			item_groups=",".join(["%s"] * len(item_groups)),
+		),
+		tuple(sales_users_or_territory_data + item_groups + dates),
+		as_dict=1,
+	)
+
 
 def get_parents_data(filters, partner_doctype):
-	filters_dict = {'parenttype': partner_doctype}
+	filters_dict = {"parenttype": partner_doctype}
 
-	target_qty_amt_field = ("target_qty"
-		if filters.get("target_on") == 'Quantity' else "target_amount")
+	target_qty_amt_field = "target_qty" if filters.get("target_on") == "Quantity" else "target_amount"
 
 	if filters.get("fiscal_year"):
 		filters_dict["fiscal_year"] = filters.get("fiscal_year")
 
-	return frappe.get_all('Target Detail',
-		filters = filters_dict,
-		fields = ["parent", "item_group", target_qty_amt_field, "fiscal_year", "distribution_id"])
+	return frappe.get_all(
+		"Target Detail",
+		filters=filters_dict,
+		fields=["parent", "item_group", target_qty_amt_field, "fiscal_year", "distribution_id"],
+	)
diff --git a/erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py b/erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py
index c64555b..2049520 100644
--- a/erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py
+++ b/erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py
@@ -7,120 +7,98 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns(filters)
 	data = get_entries(filters)
 
 	return columns, data
 
+
 def get_columns(filters):
 	if not filters.get("doctype"):
 		msgprint(_("Please select the document type first"), raise_exception=1)
 
-	columns =[
+	columns = [
 		{
 			"label": _(filters["doctype"]),
 			"options": filters["doctype"],
 			"fieldname": "name",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Customer"),
 			"options": "Customer",
 			"fieldname": "customer",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Territory"),
 			"options": "Territory",
 			"fieldname": "territory",
 			"fieldtype": "Link",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
 		{
 			"label": _("Item Code"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Item Group"),
 			"fieldname": "item_group",
 			"fieldtype": "Link",
 			"options": "Item Group",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Brand"),
 			"fieldname": "brand",
 			"fieldtype": "Link",
 			"options": "Brand",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Quantity"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"label": _("Rate"),
-			"fieldname": "rate",
-			"fieldtype": "Currency",
-			"width": 120
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"label": _("Quantity"), "fieldname": "qty", "fieldtype": "Float", "width": 120},
+		{"label": _("Rate"), "fieldname": "rate", "fieldtype": "Currency", "width": 120},
+		{"label": _("Amount"), "fieldname": "amount", "fieldtype": "Currency", "width": 120},
 		{
 			"label": _("Sales Partner"),
 			"options": "Sales Partner",
 			"fieldname": "sales_partner",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Commission Rate %"),
 			"fieldname": "commission_rate",
 			"fieldtype": "Data",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Commission"),
-			"fieldname": "commission",
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"label": _("Commission"), "fieldname": "commission", "fieldtype": "Currency", "width": 120},
 		{
 			"label": _("Currency"),
 			"fieldname": "currency",
 			"fieldtype": "Link",
 			"options": "Currency",
-			"width": 120
-		}
+			"width": 120,
+		},
 	]
 
 	return columns
 
+
 def get_entries(filters):
-	date_field = ("transaction_date" if filters.get('doctype') == "Sales Order"
-		else "posting_date")
+	date_field = "transaction_date" if filters.get("doctype") == "Sales Order" else "posting_date"
 
 	conditions = get_conditions(filters, date_field)
-	entries = frappe.db.sql("""
+	entries = frappe.db.sql(
+		"""
 		SELECT
 			dt.name, dt.customer, dt.territory, dt.{date_field} as posting_date, dt.currency,
 			dt_item.base_net_rate as rate, dt_item.qty, dt_item.base_net_amount as amount,
@@ -132,11 +110,16 @@
 			{cond} and dt.name = dt_item.parent and dt.docstatus = 1
 			and dt.sales_partner is not null and dt.sales_partner != ''
 			order by dt.name desc, dt.sales_partner
-		""".format(date_field=date_field, doctype=filters.get('doctype'),
-			cond=conditions), filters, as_dict=1)
+		""".format(
+			date_field=date_field, doctype=filters.get("doctype"), cond=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return entries
 
+
 def get_conditions(filters, date_field):
 	conditions = "1=1"
 
@@ -150,18 +133,19 @@
 	if filters.get("to_date"):
 		conditions += " and dt.{0} <= %(to_date)s".format(date_field)
 
-	if not filters.get('show_return_entries'):
+	if not filters.get("show_return_entries"):
 		conditions += " and dt_item.qty > 0.0"
 
-	if filters.get('brand'):
+	if filters.get("brand"):
 		conditions += " and dt_item.brand = %(brand)s"
 
-	if filters.get('item_group'):
-		lft, rgt = frappe.get_cached_value('Item Group',
-			filters.get('item_group'), ['lft', 'rgt'])
+	if filters.get("item_group"):
+		lft, rgt = frappe.get_cached_value("Item Group", filters.get("item_group"), ["lft", "rgt"])
 
 		conditions += """ and dt_item.item_group in (select name from
-			`tabItem Group` where lft >= %s and rgt <= %s)""" % (lft, rgt)
-
+			`tabItem Group` where lft >= %s and rgt <= %s)""" % (
+			lft,
+			rgt,
+		)
 
 	return conditions
diff --git a/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py b/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py
index 1542e31..a8df530 100644
--- a/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py
+++ b/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py
@@ -7,102 +7,101 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns(filters)
 	entries = get_entries(filters)
 	data = []
 
 	for d in entries:
-		data.append([
-			d.name, d.customer, d.territory, d.posting_date,
-			d.base_net_amount, d.sales_person, d.allocated_percentage, d.commission_rate, d.allocated_amount,d.incentives
-		])
+		data.append(
+			[
+				d.name,
+				d.customer,
+				d.territory,
+				d.posting_date,
+				d.base_net_amount,
+				d.sales_person,
+				d.allocated_percentage,
+				d.commission_rate,
+				d.allocated_amount,
+				d.incentives,
+			]
+		)
 
 	if data:
-		total_row = [""]*len(data[0])
+		total_row = [""] * len(data[0])
 		data.append(total_row)
 
 	return columns, data
 
+
 def get_columns(filters):
 	if not filters.get("doc_type"):
 		msgprint(_("Please select the document type first"), raise_exception=1)
 
-	columns =[
+	columns = [
 		{
 			"label": _(filters["doc_type"]),
 			"options": filters["doc_type"],
-			"fieldname": filters['doc_type'],
+			"fieldname": filters["doc_type"],
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Customer"),
 			"options": "Customer",
 			"fieldname": "customer",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Territory"),
 			"options": "Territory",
 			"fieldname": "territory",
 			"fieldtype": "Link",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100},
+		{"label": _("Amount"), "fieldname": "amount", "fieldtype": "Currency", "width": 120},
 		{
 			"label": _("Sales Person"),
 			"options": "Sales Person",
 			"fieldname": "sales_person",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Contribution %"),
 			"fieldname": "contribution_percentage",
 			"fieldtype": "Data",
-			"width": 110
+			"width": 110,
 		},
 		{
 			"label": _("Commission Rate %"),
 			"fieldname": "commission_rate",
 			"fieldtype": "Data",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Contribution Amount"),
 			"fieldname": "contribution_amount",
 			"fieldtype": "Currency",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Incentives"),
-			"fieldname": "incentives",
-			"fieldtype": "Currency",
-			"width": 120
-		}
+		{"label": _("Incentives"), "fieldname": "incentives", "fieldtype": "Currency", "width": 120},
 	]
 
 	return columns
 
+
 def get_entries(filters):
 	date_field = filters["doc_type"] == "Sales Order" and "transaction_date" or "posting_date"
 
 	conditions, values = get_conditions(filters, date_field)
-	entries = frappe.db.sql("""
+	entries = frappe.db.sql(
+		"""
 		select
 			dt.name, dt.customer, dt.territory, dt.%s as posting_date,dt.base_net_total as base_net_amount,
 			st.commission_rate,st.sales_person, st.allocated_percentage, st.allocated_amount, st.incentives
@@ -111,11 +110,15 @@
 		where
 			st.parent = dt.name and st.parenttype = %s
 			and dt.docstatus = 1 %s order by dt.name desc,st.sales_person
-		""" %(date_field, filters["doc_type"], '%s', conditions),
-			tuple([filters["doc_type"]] + values), as_dict=1)
+		"""
+		% (date_field, filters["doc_type"], "%s", conditions),
+		tuple([filters["doc_type"]] + values),
+		as_dict=1,
+	)
 
 	return entries
 
+
 def get_conditions(filters, date_field):
 	conditions = [""]
 	values = []
diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
index c621be8..cb6e8a1 100644
--- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
+++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
@@ -9,7 +9,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns(filters)
 	entries = get_entries(filters)
@@ -19,19 +20,33 @@
 	company_currency = get_company_currency(filters.get("company"))
 
 	for d in entries:
-		if d.stock_qty > 0 or filters.get('show_return_entries', 0):
-			data.append([
-				d.name, d.customer, d.territory, d.warehouse, d.posting_date, d.item_code,
-				item_details.get(d.item_code, {}).get("item_group"), item_details.get(d.item_code, {}).get("brand"),
-				d.stock_qty, d.base_net_amount, d.sales_person, d.allocated_percentage, d.contribution_amt, company_currency
-			])
+		if d.stock_qty > 0 or filters.get("show_return_entries", 0):
+			data.append(
+				[
+					d.name,
+					d.customer,
+					d.territory,
+					d.warehouse,
+					d.posting_date,
+					d.item_code,
+					item_details.get(d.item_code, {}).get("item_group"),
+					item_details.get(d.item_code, {}).get("brand"),
+					d.stock_qty,
+					d.base_net_amount,
+					d.sales_person,
+					d.allocated_percentage,
+					d.contribution_amt,
+					company_currency,
+				]
+			)
 
 	if data:
-		total_row = [""]*len(data[0])
+		total_row = [""] * len(data[0])
 		data.append(total_row)
 
 	return columns, data
 
+
 def get_columns(filters):
 	if not filters.get("doc_type"):
 		msgprint(_("Please select the document type first"), raise_exception=1)
@@ -40,102 +55,88 @@
 		{
 			"label": _(filters["doc_type"]),
 			"options": filters["doc_type"],
-			"fieldname": frappe.scrub(filters['doc_type']),
+			"fieldname": frappe.scrub(filters["doc_type"]),
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Customer"),
 			"options": "Customer",
 			"fieldname": "customer",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Territory"),
 			"options": "Territory",
 			"fieldname": "territory",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Warehouse"),
 			"options": "Warehouse",
 			"fieldname": "warehouse",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 140
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 140},
 		{
 			"label": _("Item Code"),
 			"options": "Item",
 			"fieldname": "item_code",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Item Group"),
 			"options": "Item Group",
 			"fieldname": "item_group",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Brand"),
 			"options": "Brand",
 			"fieldname": "brand",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 140
-		},
+		{"label": _("Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 140},
 		{
 			"label": _("Amount"),
 			"options": "currency",
 			"fieldname": "amount",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Sales Person"),
 			"options": "Sales Person",
 			"fieldname": "sales_person",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Contribution %"),
-			"fieldname": "contribution",
-			"fieldtype": "Float",
-			"width": 140
-		},
+		{"label": _("Contribution %"), "fieldname": "contribution", "fieldtype": "Float", "width": 140},
 		{
 			"label": _("Contribution Amount"),
 			"options": "currency",
 			"fieldname": "contribution_amt",
 			"fieldtype": "Currency",
-			"width": 140
+			"width": 140,
 		},
 		{
-			"label":_("Currency"),
+			"label": _("Currency"),
 			"options": "Currency",
-			"fieldname":"currency",
-			"fieldtype":"Link",
-			"hidden" : 1
-		}
+			"fieldname": "currency",
+			"fieldtype": "Link",
+			"hidden": 1,
+		},
 	]
 
 	return columns
 
+
 def get_entries(filters):
 	date_field = filters["doc_type"] == "Sales Order" and "transaction_date" or "posting_date"
 	if filters["doc_type"] == "Sales Order":
@@ -144,7 +145,8 @@
 		qty_field = "qty"
 	conditions, values = get_conditions(filters, date_field)
 
-	entries = frappe.db.sql("""
+	entries = frappe.db.sql(
+		"""
 		SELECT
 			dt.name, dt.customer, dt.territory, dt.%s as posting_date, dt_item.item_code,
 			st.sales_person, st.allocated_percentage, dt_item.warehouse,
@@ -165,11 +167,24 @@
 		WHERE
 			st.parent = dt.name and dt.name = dt_item.parent and st.parenttype = %s
 			and dt.docstatus = 1 %s order by st.sales_person, dt.name desc
-		""" %(date_field, qty_field, qty_field, qty_field, filters["doc_type"], filters["doc_type"], '%s', conditions),
-			tuple([filters["doc_type"]] + values), as_dict=1)
+		"""
+		% (
+			date_field,
+			qty_field,
+			qty_field,
+			qty_field,
+			filters["doc_type"],
+			filters["doc_type"],
+			"%s",
+			conditions,
+		),
+		tuple([filters["doc_type"]] + values),
+		as_dict=1,
+	)
 
 	return entries
 
+
 def get_conditions(filters, date_field):
 	conditions = [""]
 	values = []
@@ -181,7 +196,11 @@
 
 	if filters.get("sales_person"):
 		lft, rgt = frappe.get_value("Sales Person", filters.get("sales_person"), ["lft", "rgt"])
-		conditions.append("exists(select name from `tabSales Person` where lft >= {0} and rgt <= {1} and name=st.sales_person)".format(lft, rgt))
+		conditions.append(
+			"exists(select name from `tabSales Person` where lft >= {0} and rgt <= {1} and name=st.sales_person)".format(
+				lft, rgt
+			)
+		)
 
 	if filters.get("from_date"):
 		conditions.append("dt.{0}>=%s".format(date_field))
@@ -193,23 +212,29 @@
 
 	items = get_items(filters)
 	if items:
-		conditions.append("dt_item.item_code in (%s)" % ', '.join(['%s']*len(items)))
+		conditions.append("dt_item.item_code in (%s)" % ", ".join(["%s"] * len(items)))
 		values += items
 
 	return " and ".join(conditions), values
 
+
 def get_items(filters):
-	if filters.get("item_group"): key = "item_group"
-	elif filters.get("brand"): key = "brand"
-	else: key = ""
+	if filters.get("item_group"):
+		key = "item_group"
+	elif filters.get("brand"):
+		key = "brand"
+	else:
+		key = ""
 
 	items = []
 	if key:
-		items = frappe.db.sql_list("""select name from tabItem where %s = %s""" %
-			(key, '%s'), (filters[key]))
+		items = frappe.db.sql_list(
+			"""select name from tabItem where %s = %s""" % (key, "%s"), (filters[key])
+		)
 
 	return items
 
+
 def get_item_details():
 	item_details = {}
 	for d in frappe.db.sql("""SELECT `name`, `item_group`, `brand` FROM `tabItem`""", as_dict=1):
diff --git a/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py b/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py
index b7b4d3a..5dfc1db 100644
--- a/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py
+++ b/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py
@@ -23,38 +23,39 @@
 			"fieldname": "territory",
 			"fieldtype": "Link",
 			"options": "Territory",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Opportunity Amount"),
 			"fieldname": "opportunity_amount",
 			"fieldtype": "Currency",
 			"options": currency,
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Quotation Amount"),
 			"fieldname": "quotation_amount",
 			"fieldtype": "Currency",
 			"options": currency,
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Order Amount"),
 			"fieldname": "order_amount",
 			"fieldtype": "Currency",
 			"options": currency,
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Billing Amount"),
 			"fieldname": "billing_amount",
 			"fieldtype": "Currency",
 			"options": currency,
-			"width": 150
-		}
+			"width": 150,
+		},
 	]
 
+
 def get_data(filters=None):
 	data = []
 
@@ -84,26 +85,32 @@
 		if territory_orders:
 			t_order_names = [t.name for t in territory_orders]
 
-		territory_invoices = list(filter(lambda x: x.sales_order in t_order_names, sales_invoices)) if t_order_names and sales_invoices else []
+		territory_invoices = (
+			list(filter(lambda x: x.sales_order in t_order_names, sales_invoices))
+			if t_order_names and sales_invoices
+			else []
+		)
 
 		territory_data = {
 			"territory": territory.name,
 			"opportunity_amount": _get_total(territory_opportunities, "opportunity_amount"),
 			"quotation_amount": _get_total(territory_quotations),
 			"order_amount": _get_total(territory_orders),
-			"billing_amount": _get_total(territory_invoices)
+			"billing_amount": _get_total(territory_invoices),
 		}
 		data.append(territory_data)
 
 	return data
 
+
 def get_opportunities(filters):
 	conditions = ""
 
-	if filters.get('transaction_date'):
+	if filters.get("transaction_date"):
 		conditions = " WHERE transaction_date between {0} and {1}".format(
-			frappe.db.escape(filters['transaction_date'][0]),
-			frappe.db.escape(filters['transaction_date'][1]))
+			frappe.db.escape(filters["transaction_date"][0]),
+			frappe.db.escape(filters["transaction_date"][1]),
+		)
 
 	if filters.company:
 		if conditions:
@@ -112,11 +119,17 @@
 			conditions += " WHERE"
 		conditions += " company = %(company)s"
 
-
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT name, territory, opportunity_amount
 		FROM `tabOpportunity` {0}
-	""".format(conditions), filters, as_dict=1) #nosec
+	""".format(
+			conditions
+		),
+		filters,
+		as_dict=1,
+	)  # nosec
+
 
 def get_quotations(opportunities):
 	if not opportunities:
@@ -124,11 +137,18 @@
 
 	opportunity_names = [o.name for o in opportunities]
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT `name`,`base_grand_total`, `opportunity`
 		FROM `tabQuotation`
 		WHERE docstatus=1 AND opportunity in ({0})
-	""".format(', '.join(["%s"]*len(opportunity_names))), tuple(opportunity_names), as_dict=1) #nosec
+	""".format(
+			", ".join(["%s"] * len(opportunity_names))
+		),
+		tuple(opportunity_names),
+		as_dict=1,
+	)  # nosec
+
 
 def get_sales_orders(quotations):
 	if not quotations:
@@ -136,11 +156,18 @@
 
 	quotation_names = [q.name for q in quotations]
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 	SELECT so.`name`, so.`base_grand_total`, soi.prevdoc_docname as quotation
 	FROM `tabSales Order` so, `tabSales Order Item` soi
 	WHERE so.docstatus=1 AND so.name = soi.parent AND soi.prevdoc_docname in ({0})
-	""".format(', '.join(["%s"]*len(quotation_names))), tuple(quotation_names), as_dict=1) #nosec
+	""".format(
+			", ".join(["%s"] * len(quotation_names))
+		),
+		tuple(quotation_names),
+		as_dict=1,
+	)  # nosec
+
 
 def get_sales_invoice(sales_orders):
 	if not sales_orders:
@@ -148,11 +175,18 @@
 
 	so_names = [so.name for so in sales_orders]
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 	SELECT si.name, si.base_grand_total, sii.sales_order
 	FROM `tabSales Invoice` si, `tabSales Invoice Item` sii
 	WHERE si.docstatus=1 AND si.name = sii.parent AND sii.sales_order in ({0})
-	""".format(', '.join(["%s"]*len(so_names))), tuple(so_names), as_dict=1) #nosec
+	""".format(
+			", ".join(["%s"] * len(so_names))
+		),
+		tuple(so_names),
+		as_dict=1,
+	)  # nosec
+
 
 def _get_total(doclist, amount_field="base_grand_total"):
 	if not doclist:
diff --git a/erpnext/setup/default_energy_point_rules.py b/erpnext/setup/default_energy_point_rules.py
index 1ce06b8..b7fe197 100644
--- a/erpnext/setup/default_energy_point_rules.py
+++ b/erpnext/setup/default_energy_point_rules.py
@@ -1,56 +1,48 @@
 from frappe import _
 
 doctype_rule_map = {
-	'Item': {
-		'points': 5,
-		'for_doc_event': 'New'
+	"Item": {"points": 5, "for_doc_event": "New"},
+	"Customer": {"points": 5, "for_doc_event": "New"},
+	"Supplier": {"points": 5, "for_doc_event": "New"},
+	"Lead": {"points": 2, "for_doc_event": "New"},
+	"Opportunity": {
+		"points": 10,
+		"for_doc_event": "Custom",
+		"condition": 'doc.status=="Converted"',
+		"rule_name": _("On Converting Opportunity"),
+		"user_field": "converted_by",
 	},
-	'Customer': {
-		'points': 5,
-		'for_doc_event': 'New'
+	"Sales Order": {
+		"points": 10,
+		"for_doc_event": "Submit",
+		"rule_name": _("On Sales Order Submission"),
+		"user_field": "modified_by",
 	},
-	'Supplier': {
-		'points': 5,
-		'for_doc_event': 'New'
+	"Purchase Order": {
+		"points": 10,
+		"for_doc_event": "Submit",
+		"rule_name": _("On Purchase Order Submission"),
+		"user_field": "modified_by",
 	},
-	'Lead': {
-		'points': 2,
-		'for_doc_event': 'New'
+	"Task": {
+		"points": 5,
+		"condition": 'doc.status == "Completed"',
+		"rule_name": _("On Task Completion"),
+		"user_field": "completed_by",
 	},
-	'Opportunity': {
-		'points': 10,
-		'for_doc_event': 'Custom',
-		'condition': 'doc.status=="Converted"',
-		'rule_name': _('On Converting Opportunity'),
-		'user_field': 'converted_by'
-	},
-	'Sales Order': {
-		'points': 10,
-		'for_doc_event': 'Submit',
-		'rule_name': _('On Sales Order Submission'),
-		'user_field': 'modified_by'
-	},
-	'Purchase Order': {
-		'points': 10,
-		'for_doc_event': 'Submit',
-		'rule_name': _('On Purchase Order Submission'),
-		'user_field': 'modified_by'
-	},
-	'Task': {
-		'points': 5,
-		'condition': 'doc.status == "Completed"',
-		'rule_name': _('On Task Completion'),
-		'user_field': 'completed_by'
-	}
 }
 
+
 def get_default_energy_point_rules():
-	return [{
-		'doctype': 'Energy Point Rule',
-		'reference_doctype': doctype,
-		'for_doc_event': rule.get('for_doc_event') or 'Custom',
-		'condition': rule.get('condition'),
-		'rule_name': rule.get('rule_name') or _('On {0} Creation').format(doctype),
-		'points': rule.get('points'),
-		'user_field': rule.get('user_field') or 'owner'
-	} for doctype, rule in doctype_rule_map.items()]
+	return [
+		{
+			"doctype": "Energy Point Rule",
+			"reference_doctype": doctype,
+			"for_doc_event": rule.get("for_doc_event") or "Custom",
+			"condition": rule.get("condition"),
+			"rule_name": rule.get("rule_name") or _("On {0} Creation").format(doctype),
+			"points": rule.get("points"),
+			"user_field": rule.get("user_field") or "owner",
+		}
+		for doctype, rule in doctype_rule_map.items()
+	]
diff --git a/erpnext/setup/default_success_action.py b/erpnext/setup/default_success_action.py
index a1f48df..2b9e75c 100644
--- a/erpnext/setup/default_success_action.py
+++ b/erpnext/setup/default_success_action.py
@@ -1,25 +1,31 @@
 from frappe import _
 
 doctype_list = [
-	'Purchase Receipt',
-	'Purchase Invoice',
-	'Quotation',
-	'Sales Order',
-	'Delivery Note',
-	'Sales Invoice'
+	"Purchase Receipt",
+	"Purchase Invoice",
+	"Quotation",
+	"Sales Order",
+	"Delivery Note",
+	"Sales Invoice",
 ]
 
+
 def get_message(doctype):
 	return _("{0} has been submitted successfully").format(_(doctype))
 
+
 def get_first_success_message(doctype):
 	return get_message(doctype)
 
+
 def get_default_success_action():
-	return [{
-		'doctype': 'Success Action',
-		'ref_doctype': doctype,
-		'message': get_message(doctype),
-		'first_success_message': get_first_success_message(doctype),
-		'next_actions': 'new\nprint\nemail'
-	} for doctype in doctype_list]
+	return [
+		{
+			"doctype": "Success Action",
+			"ref_doctype": doctype,
+			"message": get_message(doctype),
+			"first_success_message": get_first_success_message(doctype),
+			"next_actions": "new\nprint\nemail",
+		}
+		for doctype in doctype_list
+	]
diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index 2a0d785..309658d 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -12,90 +12,121 @@
 class AuthorizationControl(TransactionBase):
 	def get_appr_user_role(self, det, doctype_name, total, based_on, condition, item, company):
 		amt_list, appr_users, appr_roles = [], [], []
-		users, roles = '',''
+		users, roles = "", ""
 		if det:
 			for x in det:
 				amt_list.append(flt(x[0]))
 			max_amount = max(amt_list)
 
-			app_dtl = frappe.db.sql("""select approving_user, approving_role from `tabAuthorization Rule`
+			app_dtl = frappe.db.sql(
+				"""select approving_user, approving_role from `tabAuthorization Rule`
 				where transaction = %s and (value = %s or value > %s)
-				and docstatus != 2 and based_on = %s and company = %s %s""" %
-				('%s', '%s', '%s', '%s', '%s', condition),
-				(doctype_name, flt(max_amount), total, based_on, company))
+				and docstatus != 2 and based_on = %s and company = %s %s"""
+				% ("%s", "%s", "%s", "%s", "%s", condition),
+				(doctype_name, flt(max_amount), total, based_on, company),
+			)
 
 			if not app_dtl:
-				app_dtl = frappe.db.sql("""select approving_user, approving_role from `tabAuthorization Rule`
+				app_dtl = frappe.db.sql(
+					"""select approving_user, approving_role from `tabAuthorization Rule`
 					where transaction = %s and (value = %s or value > %s) and docstatus != 2
-					and based_on = %s and ifnull(company,'') = '' %s""" %
-					('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on))
+					and based_on = %s and ifnull(company,'') = '' %s"""
+					% ("%s", "%s", "%s", "%s", condition),
+					(doctype_name, flt(max_amount), total, based_on),
+				)
 
 			for d in app_dtl:
-				if(d[0]): appr_users.append(d[0])
-				if(d[1]): appr_roles.append(d[1])
+				if d[0]:
+					appr_users.append(d[0])
+				if d[1]:
+					appr_roles.append(d[1])
 
-			if not has_common(appr_roles, frappe.get_roles()) and not has_common(appr_users, [session['user']]):
+			if not has_common(appr_roles, frappe.get_roles()) and not has_common(
+				appr_users, [session["user"]]
+			):
 				frappe.msgprint(_("Not authroized since {0} exceeds limits").format(_(based_on)))
 				frappe.throw(_("Can be approved by {0}").format(comma_or(appr_roles + appr_users)))
 
-	def validate_auth_rule(self, doctype_name, total, based_on, cond, company, item = ''):
+	def validate_auth_rule(self, doctype_name, total, based_on, cond, company, item=""):
 		chk = 1
-		add_cond1,add_cond2	= '',''
-		if based_on == 'Itemwise Discount':
+		add_cond1, add_cond2 = "", ""
+		if based_on == "Itemwise Discount":
 			add_cond1 += " and master_name = " + frappe.db.escape(cstr(item))
-			itemwise_exists = frappe.db.sql("""select value from `tabAuthorization Rule`
+			itemwise_exists = frappe.db.sql(
+				"""select value from `tabAuthorization Rule`
 				where transaction = %s and value <= %s
-				and based_on = %s and company = %s and docstatus != 2 %s %s""" %
-				('%s', '%s', '%s', '%s', cond, add_cond1), (doctype_name, total, based_on, company))
+				and based_on = %s and company = %s and docstatus != 2 %s %s"""
+				% ("%s", "%s", "%s", "%s", cond, add_cond1),
+				(doctype_name, total, based_on, company),
+			)
 
 			if not itemwise_exists:
-				itemwise_exists = frappe.db.sql("""select value from `tabAuthorization Rule`
+				itemwise_exists = frappe.db.sql(
+					"""select value from `tabAuthorization Rule`
 					where transaction = %s and value <= %s and based_on = %s
-					and ifnull(company,'') = ''	and docstatus != 2 %s %s""" %
-					('%s', '%s', '%s', cond, add_cond1), (doctype_name, total, based_on))
+					and ifnull(company,'') = ''	and docstatus != 2 %s %s"""
+					% ("%s", "%s", "%s", cond, add_cond1),
+					(doctype_name, total, based_on),
+				)
 
 			if itemwise_exists:
-				self.get_appr_user_role(itemwise_exists, doctype_name, total, based_on, cond+add_cond1, item,company)
+				self.get_appr_user_role(
+					itemwise_exists, doctype_name, total, based_on, cond + add_cond1, item, company
+				)
 				chk = 0
 		if chk == 1:
-			if based_on == 'Itemwise Discount':
+			if based_on == "Itemwise Discount":
 				add_cond2 += " and ifnull(master_name,'') = ''"
 
-			appr = frappe.db.sql("""select value from `tabAuthorization Rule`
+			appr = frappe.db.sql(
+				"""select value from `tabAuthorization Rule`
 				where transaction = %s and value <= %s and based_on = %s
-				and company = %s and docstatus != 2 %s %s""" %
-				('%s', '%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on, company))
+				and company = %s and docstatus != 2 %s %s"""
+				% ("%s", "%s", "%s", "%s", cond, add_cond2),
+				(doctype_name, total, based_on, company),
+			)
 
 			if not appr:
-				appr = frappe.db.sql("""select value from `tabAuthorization Rule`
+				appr = frappe.db.sql(
+					"""select value from `tabAuthorization Rule`
 					where transaction = %s and value <= %s and based_on = %s
-					and ifnull(company,'') = '' and docstatus != 2 %s %s""" %
-					('%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on))
+					and ifnull(company,'') = '' and docstatus != 2 %s %s"""
+					% ("%s", "%s", "%s", cond, add_cond2),
+					(doctype_name, total, based_on),
+				)
 
-			self.get_appr_user_role(appr, doctype_name, total, based_on, cond+add_cond2, item, company)
+			self.get_appr_user_role(appr, doctype_name, total, based_on, cond + add_cond2, item, company)
 
 	def bifurcate_based_on_type(self, doctype_name, total, av_dis, based_on, doc_obj, val, company):
-		add_cond = ''
+		add_cond = ""
 		auth_value = av_dis
 
-		if val == 1: add_cond += " and system_user = {}".format(frappe.db.escape(session['user']))
-		elif val == 2: add_cond += " and system_role IN %s" % ("('"+"','".join(frappe.get_roles())+"')")
-		else: add_cond += " and ifnull(system_user,'') = '' and ifnull(system_role,'') = ''"
+		if val == 1:
+			add_cond += " and system_user = {}".format(frappe.db.escape(session["user"]))
+		elif val == 2:
+			add_cond += " and system_role IN %s" % ("('" + "','".join(frappe.get_roles()) + "')")
+		else:
+			add_cond += " and ifnull(system_user,'') = '' and ifnull(system_role,'') = ''"
 
-		if based_on == 'Grand Total': auth_value = total
-		elif based_on == 'Customerwise Discount':
+		if based_on == "Grand Total":
+			auth_value = total
+		elif based_on == "Customerwise Discount":
 			if doc_obj:
-				if doc_obj.doctype == 'Sales Invoice': customer = doc_obj.customer
-				else: customer = doc_obj.customer_name
+				if doc_obj.doctype == "Sales Invoice":
+					customer = doc_obj.customer
+				else:
+					customer = doc_obj.customer_name
 				add_cond = " and master_name = {}".format(frappe.db.escape(customer))
-		if based_on == 'Itemwise Discount':
+		if based_on == "Itemwise Discount":
 			if doc_obj:
 				for t in doc_obj.get("items"):
-					self.validate_auth_rule(doctype_name, t.discount_percentage, based_on, add_cond, company,t.item_code )
+					self.validate_auth_rule(
+						doctype_name, t.discount_percentage, based_on, add_cond, company, t.item_code
+					)
 		else:
 			self.validate_auth_rule(doctype_name, auth_value, based_on, add_cond, company)
 
-	def validate_approving_authority(self, doctype_name,company, total, doc_obj = ''):
+	def validate_approving_authority(self, doctype_name, company, total, doc_obj=""):
 		if not frappe.db.count("Authorization Rule"):
 			return
 
@@ -109,56 +140,85 @@
 			if doc_obj.get("discount_amount"):
 				base_rate -= flt(doc_obj.discount_amount)
 
-			if price_list_rate: av_dis = 100 - flt(base_rate * 100 / price_list_rate)
+			if price_list_rate:
+				av_dis = 100 - flt(base_rate * 100 / price_list_rate)
 
-		final_based_on = ['Grand Total','Average Discount','Customerwise Discount','Itemwise Discount']
+		final_based_on = [
+			"Grand Total",
+			"Average Discount",
+			"Customerwise Discount",
+			"Itemwise Discount",
+		]
 
 		# Check for authorization set for individual user
-		based_on = [x[0] for x in frappe.db.sql("""select distinct based_on from `tabAuthorization Rule`
+		based_on = [
+			x[0]
+			for x in frappe.db.sql(
+				"""select distinct based_on from `tabAuthorization Rule`
 			where transaction = %s and system_user = %s
 			and (company = %s or ifnull(company,'')='') and docstatus != 2""",
-			(doctype_name, session['user'], company))]
+				(doctype_name, session["user"], company),
+			)
+		]
 
 		for d in based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 1, company)
 
 		# Remove user specific rules from global authorization rules
 		for r in based_on:
-			if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
+			if r in final_based_on and r != "Itemwise Discount":
+				final_based_on.remove(r)
 
 		# Check for authorization set on particular roles
-		based_on = [x[0] for x in frappe.db.sql("""select based_on
+		based_on = [
+			x[0]
+			for x in frappe.db.sql(
+				"""select based_on
 			from `tabAuthorization Rule`
 			where transaction = %s and system_role IN (%s) and based_on IN (%s)
 			and (company = %s or ifnull(company,'')='')
 			and docstatus != 2
-		""" % ('%s', "'"+"','".join(frappe.get_roles())+"'", "'"+"','".join(final_based_on)+"'", '%s'), (doctype_name, company))]
+		"""
+				% (
+					"%s",
+					"'" + "','".join(frappe.get_roles()) + "'",
+					"'" + "','".join(final_based_on) + "'",
+					"%s",
+				),
+				(doctype_name, company),
+			)
+		]
 
 		for d in based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 2, company)
 
 		# Remove role specific rules from global authorization rules
 		for r in based_on:
-			if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
+			if r in final_based_on and r != "Itemwise Discount":
+				final_based_on.remove(r)
 
 		# Check for global authorization
 		for g in final_based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, g, doc_obj, 0, company)
 
-	def get_value_based_rule(self,doctype_name,employee,total_claimed_amount,company):
-		val_lst =[]
-		val = frappe.db.sql("""select value from `tabAuthorization Rule`
+	def get_value_based_rule(self, doctype_name, employee, total_claimed_amount, company):
+		val_lst = []
+		val = frappe.db.sql(
+			"""select value from `tabAuthorization Rule`
 			where transaction=%s and (to_emp=%s or
 				to_designation IN (select designation from `tabEmployee` where name=%s))
 			and ifnull(value,0)< %s and company = %s and docstatus!=2""",
-			(doctype_name,employee,employee,total_claimed_amount,company))
+			(doctype_name, employee, employee, total_claimed_amount, company),
+		)
 
 		if not val:
-			val = frappe.db.sql("""select value from `tabAuthorization Rule`
+			val = frappe.db.sql(
+				"""select value from `tabAuthorization Rule`
 				where transaction=%s and (to_emp=%s or
 					to_designation IN (select designation from `tabEmployee` where name=%s))
 				and ifnull(value,0)< %s and ifnull(company,'') = '' and docstatus!=2""",
-				(doctype_name, employee, employee, total_claimed_amount))
+				(doctype_name, employee, employee, total_claimed_amount),
+			)
 
 		if val:
 			val_lst = [y[0] for y in val]
@@ -166,64 +226,83 @@
 			val_lst.append(0)
 
 		max_val = max(val_lst)
-		rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+		rule = frappe.db.sql(
+			"""select name, to_emp, to_designation, approving_role, approving_user
 			from `tabAuthorization Rule`
 			where transaction=%s and company = %s
 			and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s))
 			and ifnull(value,0)= %s and docstatus!=2""",
-			(doctype_name,company,employee,employee,flt(max_val)), as_dict=1)
+			(doctype_name, company, employee, employee, flt(max_val)),
+			as_dict=1,
+		)
 
 		if not rule:
-			rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+			rule = frappe.db.sql(
+				"""select name, to_emp, to_designation, approving_role, approving_user
 				from `tabAuthorization Rule`
 				where transaction=%s and ifnull(company,'') = ''
 				and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s))
 				and ifnull(value,0)= %s and docstatus!=2""",
-				(doctype_name,employee,employee,flt(max_val)), as_dict=1)
+				(doctype_name, employee, employee, flt(max_val)),
+				as_dict=1,
+			)
 
 		return rule
 
 	# related to payroll module only
-	def get_approver_name(self, doctype_name, total, doc_obj=''):
-		app_user=[]
-		app_specific_user =[]
-		rule ={}
+	def get_approver_name(self, doctype_name, total, doc_obj=""):
+		app_user = []
+		app_specific_user = []
+		rule = {}
 
 		if doc_obj:
-			if doctype_name == 'Expense Claim':
-				rule = self.get_value_based_rule(doctype_name, doc_obj.employee,
-					doc_obj.total_claimed_amount, doc_obj.company)
-			elif doctype_name == 'Appraisal':
-				rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+			if doctype_name == "Expense Claim":
+				rule = self.get_value_based_rule(
+					doctype_name, doc_obj.employee, doc_obj.total_claimed_amount, doc_obj.company
+				)
+			elif doctype_name == "Appraisal":
+				rule = frappe.db.sql(
+					"""select name, to_emp, to_designation, approving_role, approving_user
 					from `tabAuthorization Rule` where transaction=%s
 					and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s))
 					and company = %s and docstatus!=2""",
-					(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)
+					(doctype_name, doc_obj.employee, doc_obj.employee, doc_obj.company),
+					as_dict=1,
+				)
 
 				if not rule:
-					rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+					rule = frappe.db.sql(
+						"""select name, to_emp, to_designation, approving_role, approving_user
 						from `tabAuthorization Rule`
 						where transaction=%s and (to_emp=%s or
 							to_designation IN (select designation from `tabEmployee` where name=%s))
 							and ifnull(company,'') = '' and docstatus!=2""",
-							(doctype_name,doc_obj.employee, doc_obj.employee), as_dict=1)
+						(doctype_name, doc_obj.employee, doc_obj.employee),
+						as_dict=1,
+					)
 
 			if rule:
 				for m in rule:
-					if m['to_emp'] or m['to_designation']:
-						if m['approving_user']:
-							app_specific_user.append(m['approving_user'])
-						elif m['approving_role']:
-							user_lst = [z[0] for z in frappe.db.sql("""select distinct t1.name
+					if m["to_emp"] or m["to_designation"]:
+						if m["approving_user"]:
+							app_specific_user.append(m["approving_user"])
+						elif m["approving_role"]:
+							user_lst = [
+								z[0]
+								for z in frappe.db.sql(
+									"""select distinct t1.name
 								from `tabUser` t1, `tabHas Role` t2 where t2.role=%s
 								and t2.parent=t1.name and t1.name !='Administrator'
-								and t1.name != 'Guest' and t1.docstatus !=2""", m['approving_role'])]
+								and t1.name != 'Guest' and t1.docstatus !=2""",
+									m["approving_role"],
+								)
+							]
 
 							for x in user_lst:
 								if not x in app_user:
 									app_user.append(x)
 
-			if len(app_specific_user) >0:
+			if len(app_specific_user) > 0:
 				return app_specific_user
 			else:
 				return app_user
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.py b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
index e07de3b..faecd5a 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.py
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
@@ -10,40 +10,58 @@
 
 class AuthorizationRule(Document):
 	def check_duplicate_entry(self):
-		exists = frappe.db.sql("""select name, docstatus from `tabAuthorization Rule`
+		exists = frappe.db.sql(
+			"""select name, docstatus from `tabAuthorization Rule`
 			where transaction = %s and based_on = %s and system_user = %s
 			and system_role = %s and approving_user = %s and approving_role = %s
 			and to_emp =%s and to_designation=%s and name != %s""",
-			(self.transaction, self.based_on, cstr(self.system_user),
-				cstr(self.system_role), cstr(self.approving_user),
-				cstr(self.approving_role), cstr(self.to_emp),
-				cstr(self.to_designation), self.name))
-		auth_exists = exists and exists[0][0] or ''
+			(
+				self.transaction,
+				self.based_on,
+				cstr(self.system_user),
+				cstr(self.system_role),
+				cstr(self.approving_user),
+				cstr(self.approving_role),
+				cstr(self.to_emp),
+				cstr(self.to_designation),
+				self.name,
+			),
+		)
+		auth_exists = exists and exists[0][0] or ""
 		if auth_exists:
 			frappe.throw(_("Duplicate Entry. Please check Authorization Rule {0}").format(auth_exists))
 
-
 	def validate_rule(self):
-		if self.transaction != 'Appraisal':
+		if self.transaction != "Appraisal":
 			if not self.approving_role and not self.approving_user:
 				frappe.throw(_("Please enter Approving Role or Approving User"))
 			elif self.system_user and self.system_user == self.approving_user:
 				frappe.throw(_("Approving User cannot be same as user the rule is Applicable To"))
 			elif self.system_role and self.system_role == self.approving_role:
 				frappe.throw(_("Approving Role cannot be same as role the rule is Applicable To"))
-			elif self.transaction in ['Purchase Order', 'Purchase Receipt', \
-					'Purchase Invoice', 'Stock Entry'] and self.based_on \
-					in ['Average Discount', 'Customerwise Discount', 'Itemwise Discount']:
-				frappe.throw(_("Cannot set authorization on basis of Discount for {0}").format(self.transaction))
-			elif self.based_on == 'Average Discount' and flt(self.value) > 100.00:
+			elif self.transaction in [
+				"Purchase Order",
+				"Purchase Receipt",
+				"Purchase Invoice",
+				"Stock Entry",
+			] and self.based_on in [
+				"Average Discount",
+				"Customerwise Discount",
+				"Itemwise Discount",
+			]:
+				frappe.throw(
+					_("Cannot set authorization on basis of Discount for {0}").format(self.transaction)
+				)
+			elif self.based_on == "Average Discount" and flt(self.value) > 100.00:
 				frappe.throw(_("Discount must be less than 100"))
-			elif self.based_on == 'Customerwise Discount' and not self.master_name:
+			elif self.based_on == "Customerwise Discount" and not self.master_name:
 				frappe.throw(_("Customer required for 'Customerwise Discount'"))
 		else:
-			if self.transaction == 'Appraisal':
+			if self.transaction == "Appraisal":
 				self.based_on = "Not Applicable"
 
 	def validate(self):
 		self.check_duplicate_entry()
 		self.validate_rule()
-		if not self.value: self.value = 0.0
+		if not self.value:
+			self.value = 0.0
diff --git a/erpnext/setup/doctype/authorization_rule/test_authorization_rule.py b/erpnext/setup/doctype/authorization_rule/test_authorization_rule.py
index 7d3d5d4..55c1bbb 100644
--- a/erpnext/setup/doctype/authorization_rule/test_authorization_rule.py
+++ b/erpnext/setup/doctype/authorization_rule/test_authorization_rule.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Authorization Rule')
 
+
 class TestAuthorizationRule(unittest.TestCase):
 	pass
diff --git a/erpnext/setup/doctype/brand/brand.py b/erpnext/setup/doctype/brand/brand.py
index 9b91b45..1bb6fc9 100644
--- a/erpnext/setup/doctype/brand/brand.py
+++ b/erpnext/setup/doctype/brand/brand.py
@@ -11,6 +11,7 @@
 class Brand(Document):
 	pass
 
+
 def get_brand_defaults(item, company):
 	item = frappe.get_cached_doc("Item", item)
 	if item.brand:
diff --git a/erpnext/setup/doctype/brand/test_brand.py b/erpnext/setup/doctype/brand/test_brand.py
index 1c71448..2e030b0 100644
--- a/erpnext/setup/doctype/brand/test_brand.py
+++ b/erpnext/setup/doctype/brand/test_brand.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Brand')
+test_records = frappe.get_test_records("Brand")
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index 36ad8fe..c116458 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -18,7 +18,7 @@
 
 
 class Company(NestedSet):
-	nsm_parent_field = 'parent_company'
+	nsm_parent_field = "parent_company"
 
 	def onload(self):
 		load_address_and_contact(self, "company")
@@ -26,12 +26,24 @@
 	@frappe.whitelist()
 	def check_if_transactions_exist(self):
 		exists = False
-		for doctype in ["Sales Invoice", "Delivery Note", "Sales Order", "Quotation",
-			"Purchase Invoice", "Purchase Receipt", "Purchase Order", "Supplier Quotation"]:
-				if frappe.db.sql("""select name from `tab%s` where company=%s and docstatus=1
-					limit 1""" % (doctype, "%s"), self.name):
-						exists = True
-						break
+		for doctype in [
+			"Sales Invoice",
+			"Delivery Note",
+			"Sales Order",
+			"Quotation",
+			"Purchase Invoice",
+			"Purchase Receipt",
+			"Purchase Order",
+			"Supplier Quotation",
+		]:
+			if frappe.db.sql(
+				"""select name from `tab%s` where company=%s and docstatus=1
+					limit 1"""
+				% (doctype, "%s"),
+				self.name,
+			):
+				exists = True
+				break
 
 		return exists
 
@@ -53,7 +65,7 @@
 
 	def validate_abbr(self):
 		if not self.abbr:
-			self.abbr = ''.join(c[0] for c in self.company_name.split()).upper()
+			self.abbr = "".join(c[0] for c in self.company_name.split()).upper()
 
 		self.abbr = self.abbr.strip()
 
@@ -63,7 +75,9 @@
 		if not self.abbr.strip():
 			frappe.throw(_("Abbreviation is mandatory"))
 
-		if frappe.db.sql("select abbr from tabCompany where name!=%s and abbr=%s", (self.name, self.abbr)):
+		if frappe.db.sql(
+			"select abbr from tabCompany where name!=%s and abbr=%s", (self.name, self.abbr)
+		):
 			frappe.throw(_("Abbreviation already used for another company"))
 
 	@frappe.whitelist()
@@ -72,37 +86,57 @@
 
 	def validate_default_accounts(self):
 		accounts = [
-			["Default Bank Account", "default_bank_account"], ["Default Cash Account", "default_cash_account"],
-			["Default Receivable Account", "default_receivable_account"], ["Default Payable Account", "default_payable_account"],
-			["Default Expense Account", "default_expense_account"], ["Default Income Account", "default_income_account"],
-			["Stock Received But Not Billed Account", "stock_received_but_not_billed"], ["Stock Adjustment Account", "stock_adjustment_account"],
-			["Expense Included In Valuation Account", "expenses_included_in_valuation"], ["Default Payroll Payable Account", "default_payroll_payable_account"]
+			["Default Bank Account", "default_bank_account"],
+			["Default Cash Account", "default_cash_account"],
+			["Default Receivable Account", "default_receivable_account"],
+			["Default Payable Account", "default_payable_account"],
+			["Default Expense Account", "default_expense_account"],
+			["Default Income Account", "default_income_account"],
+			["Stock Received But Not Billed Account", "stock_received_but_not_billed"],
+			["Stock Adjustment Account", "stock_adjustment_account"],
+			["Expense Included In Valuation Account", "expenses_included_in_valuation"],
+			["Default Payroll Payable Account", "default_payroll_payable_account"],
 		]
 
 		for account in accounts:
 			if self.get(account[1]):
 				for_company = frappe.db.get_value("Account", self.get(account[1]), "company")
 				if for_company != self.name:
-					frappe.throw(_("Account {0} does not belong to company: {1}").format(self.get(account[1]), self.name))
+					frappe.throw(
+						_("Account {0} does not belong to company: {1}").format(self.get(account[1]), self.name)
+					)
 
 				if get_account_currency(self.get(account[1])) != self.default_currency:
-					error_message = _("{0} currency must be same as company's default currency. Please select another account.") \
-						.format(frappe.bold(account[0]))
+					error_message = _(
+						"{0} currency must be same as company's default currency. Please select another account."
+					).format(frappe.bold(account[0]))
 					frappe.throw(error_message)
 
 	def validate_currency(self):
 		if self.is_new():
 			return
-		self.previous_default_currency = frappe.get_cached_value('Company',  self.name,  "default_currency")
-		if self.default_currency and self.previous_default_currency and \
-			self.default_currency != self.previous_default_currency and \
-			self.check_if_transactions_exist():
-				frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency."))
+		self.previous_default_currency = frappe.get_cached_value(
+			"Company", self.name, "default_currency"
+		)
+		if (
+			self.default_currency
+			and self.previous_default_currency
+			and self.default_currency != self.previous_default_currency
+			and self.check_if_transactions_exist()
+		):
+			frappe.throw(
+				_(
+					"Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency."
+				)
+			)
 
 	def on_update(self):
 		NestedSet.on_update(self)
-		if not frappe.db.sql("""select name from tabAccount
-				where company=%s and docstatus<2 limit 1""", self.name):
+		if not frappe.db.sql(
+			"""select name from tabAccount
+				where company=%s and docstatus<2 limit 1""",
+			self.name,
+		):
 			if not frappe.local.flags.ignore_chart_of_accounts:
 				frappe.flags.country_change = True
 				self.create_default_accounts()
@@ -117,7 +151,8 @@
 
 		if not frappe.db.get_value("Department", {"company": self.name}):
 			from erpnext.setup.setup_wizard.operations.install_fixtures import install_post_company_fixtures
-			install_post_company_fixtures(frappe._dict({'company_name': self.name}))
+
+			install_post_company_fixtures(frappe._dict({"company_name": self.name}))
 
 		if not frappe.local.flags.ignore_chart_of_accounts:
 			self.set_default_accounts()
@@ -127,12 +162,15 @@
 		if self.default_currency:
 			frappe.db.set_value("Currency", self.default_currency, "enabled", 1)
 
-		if hasattr(frappe.local, 'enable_perpetual_inventory') and \
-			self.name in frappe.local.enable_perpetual_inventory:
+		if (
+			hasattr(frappe.local, "enable_perpetual_inventory")
+			and self.name in frappe.local.enable_perpetual_inventory
+		):
 			frappe.local.enable_perpetual_inventory[self.name] = self.enable_perpetual_inventory
 
 		if frappe.flags.parent_company_changed:
 			from frappe.utils.nestedset import rebuild_tree
+
 			rebuild_tree("Company", "parent_company")
 
 		frappe.clear_cache()
@@ -143,31 +181,48 @@
 			{"warehouse_name": _("Stores"), "is_group": 0},
 			{"warehouse_name": _("Work In Progress"), "is_group": 0},
 			{"warehouse_name": _("Finished Goods"), "is_group": 0},
-			{"warehouse_name": _("Goods In Transit"), "is_group": 0, "warehouse_type": "Transit"}]:
+			{"warehouse_name": _("Goods In Transit"), "is_group": 0, "warehouse_type": "Transit"},
+		]:
 
-			if not frappe.db.exists("Warehouse", "{0} - {1}".format(wh_detail["warehouse_name"], self.abbr)):
-				warehouse = frappe.get_doc({
-					"doctype":"Warehouse",
-					"warehouse_name": wh_detail["warehouse_name"],
-					"is_group": wh_detail["is_group"],
-					"company": self.name,
-					"parent_warehouse": "{0} - {1}".format(_("All Warehouses"), self.abbr) \
-						if not wh_detail["is_group"] else "",
-					"warehouse_type" : wh_detail["warehouse_type"] if "warehouse_type" in wh_detail else None
-				})
+			if not frappe.db.exists(
+				"Warehouse", "{0} - {1}".format(wh_detail["warehouse_name"], self.abbr)
+			):
+				warehouse = frappe.get_doc(
+					{
+						"doctype": "Warehouse",
+						"warehouse_name": wh_detail["warehouse_name"],
+						"is_group": wh_detail["is_group"],
+						"company": self.name,
+						"parent_warehouse": "{0} - {1}".format(_("All Warehouses"), self.abbr)
+						if not wh_detail["is_group"]
+						else "",
+						"warehouse_type": wh_detail["warehouse_type"] if "warehouse_type" in wh_detail else None,
+					}
+				)
 				warehouse.flags.ignore_permissions = True
 				warehouse.flags.ignore_mandatory = True
 				warehouse.insert()
 
 	def create_default_accounts(self):
 		from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import create_charts
+
 		frappe.local.flags.ignore_root_company_validation = True
 		create_charts(self.name, self.chart_of_accounts, self.existing_company)
 
-		frappe.db.set(self, "default_receivable_account", frappe.db.get_value("Account",
-			{"company": self.name, "account_type": "Receivable", "is_group": 0}))
-		frappe.db.set(self, "default_payable_account", frappe.db.get_value("Account",
-			{"company": self.name, "account_type": "Payable", "is_group": 0}))
+		frappe.db.set(
+			self,
+			"default_receivable_account",
+			frappe.db.get_value(
+				"Account", {"company": self.name, "account_type": "Receivable", "is_group": 0}
+			),
+		)
+		frappe.db.set(
+			self,
+			"default_payable_account",
+			frappe.db.get_value(
+				"Account", {"company": self.name, "account_type": "Payable", "is_group": 0}
+			),
+		)
 
 	def validate_coa_input(self):
 		if self.create_chart_of_accounts_based_on == "Existing Company":
@@ -184,34 +239,46 @@
 	def validate_perpetual_inventory(self):
 		if not self.get("__islocal"):
 			if cint(self.enable_perpetual_inventory) == 1 and not self.default_inventory_account:
-				frappe.msgprint(_("Set default inventory account for perpetual inventory"),
-					alert=True, indicator='orange')
+				frappe.msgprint(
+					_("Set default inventory account for perpetual inventory"), alert=True, indicator="orange"
+				)
 
 	def validate_provisional_account_for_non_stock_items(self):
 		if not self.get("__islocal"):
-			if cint(self.enable_provisional_accounting_for_non_stock_items) == 1 and not self.default_provisional_account:
-				frappe.throw(_("Set default {0} account for non stock items").format(
-					frappe.bold('Provisional Account')))
+			if (
+				cint(self.enable_provisional_accounting_for_non_stock_items) == 1
+				and not self.default_provisional_account
+			):
+				frappe.throw(
+					_("Set default {0} account for non stock items").format(frappe.bold("Provisional Account"))
+				)
 
-			make_property_setter("Purchase Receipt", "provisional_expense_account", "hidden",
-				not self.enable_provisional_accounting_for_non_stock_items, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				"Purchase Receipt",
+				"provisional_expense_account",
+				"hidden",
+				not self.enable_provisional_accounting_for_non_stock_items,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
 
 	def check_country_change(self):
 		frappe.flags.country_change = False
 
-		if not self.is_new() and \
-			self.country != frappe.get_cached_value('Company',  self.name,  'country'):
+		if not self.is_new() and self.country != frappe.get_cached_value(
+			"Company", self.name, "country"
+		):
 			frappe.flags.country_change = True
 
 	def set_chart_of_accounts(self):
-		''' If parent company is set, chart of accounts will be based on that company '''
+		"""If parent company is set, chart of accounts will be based on that company"""
 		if self.parent_company:
 			self.create_chart_of_accounts_based_on = "Existing Company"
 			self.existing_company = self.parent_company
 
 	def validate_parent_company(self):
 		if self.parent_company:
-			is_group = frappe.get_value('Company', self.parent_company, 'is_group')
+			is_group = frappe.get_value("Company", self.parent_company, "is_group")
 
 			if not is_group:
 				frappe.throw(_("Parent Company must be a group company"))
@@ -225,29 +292,33 @@
 			"depreciation_expense_account": "Depreciation",
 			"capital_work_in_progress_account": "Capital Work in Progress",
 			"asset_received_but_not_billed": "Asset Received But Not Billed",
-			"expenses_included_in_asset_valuation": "Expenses Included In Asset Valuation"
+			"expenses_included_in_asset_valuation": "Expenses Included In Asset Valuation",
 		}
 
 		if self.enable_perpetual_inventory:
-			default_accounts.update({
-				"stock_received_but_not_billed": "Stock Received But Not Billed",
-				"default_inventory_account": "Stock",
-				"stock_adjustment_account": "Stock Adjustment",
-				"expenses_included_in_valuation": "Expenses Included In Valuation",
-				"default_expense_account": "Cost of Goods Sold"
-			})
+			default_accounts.update(
+				{
+					"stock_received_but_not_billed": "Stock Received But Not Billed",
+					"default_inventory_account": "Stock",
+					"stock_adjustment_account": "Stock Adjustment",
+					"expenses_included_in_valuation": "Expenses Included In Valuation",
+					"default_expense_account": "Cost of Goods Sold",
+				}
+			)
 
 		if self.update_default_account:
 			for default_account in default_accounts:
 				self._set_default_account(default_account, default_accounts.get(default_account))
 
 		if not self.default_income_account:
-			income_account = frappe.db.get_value("Account",
-				{"account_name": _("Sales"), "company": self.name, "is_group": 0})
+			income_account = frappe.db.get_value(
+				"Account", {"account_name": _("Sales"), "company": self.name, "is_group": 0}
+			)
 
 			if not income_account:
-				income_account = frappe.db.get_value("Account",
-					{"account_name": _("Sales Account"), "company": self.name})
+				income_account = frappe.db.get_value(
+					"Account", {"account_name": _("Sales Account"), "company": self.name}
+				)
 
 			self.db_set("default_income_account", income_account)
 
@@ -255,32 +326,38 @@
 			self.db_set("default_payable_account", self.default_payable_account)
 
 		if not self.default_payroll_payable_account:
-			payroll_payable_account = frappe.db.get_value("Account",
-				{"account_name": _("Payroll Payable"), "company": self.name, "is_group": 0})
+			payroll_payable_account = frappe.db.get_value(
+				"Account", {"account_name": _("Payroll Payable"), "company": self.name, "is_group": 0}
+			)
 
 			self.db_set("default_payroll_payable_account", payroll_payable_account)
 
 		if not self.default_employee_advance_account:
-			employe_advance_account = frappe.db.get_value("Account",
-				{"account_name": _("Employee Advances"), "company": self.name, "is_group": 0})
+			employe_advance_account = frappe.db.get_value(
+				"Account", {"account_name": _("Employee Advances"), "company": self.name, "is_group": 0}
+			)
 
 			self.db_set("default_employee_advance_account", employe_advance_account)
 
 		if not self.write_off_account:
-			write_off_acct = frappe.db.get_value("Account",
-				{"account_name": _("Write Off"), "company": self.name, "is_group": 0})
+			write_off_acct = frappe.db.get_value(
+				"Account", {"account_name": _("Write Off"), "company": self.name, "is_group": 0}
+			)
 
 			self.db_set("write_off_account", write_off_acct)
 
 		if not self.exchange_gain_loss_account:
-			exchange_gain_loss_acct = frappe.db.get_value("Account",
-				{"account_name": _("Exchange Gain/Loss"), "company": self.name, "is_group": 0})
+			exchange_gain_loss_acct = frappe.db.get_value(
+				"Account", {"account_name": _("Exchange Gain/Loss"), "company": self.name, "is_group": 0}
+			)
 
 			self.db_set("exchange_gain_loss_account", exchange_gain_loss_acct)
 
 		if not self.disposal_account:
-			disposal_acct = frappe.db.get_value("Account",
-				{"account_name": _("Gain/Loss on Asset Disposal"), "company": self.name, "is_group": 0})
+			disposal_acct = frappe.db.get_value(
+				"Account",
+				{"account_name": _("Gain/Loss on Asset Disposal"), "company": self.name, "is_group": 0},
+			)
 
 			self.db_set("disposal_account", disposal_acct)
 
@@ -288,35 +365,39 @@
 		if self.get(fieldname):
 			return
 
-		account = frappe.db.get_value("Account", {"account_type": account_type, "is_group": 0, "company": self.name})
+		account = frappe.db.get_value(
+			"Account", {"account_type": account_type, "is_group": 0, "company": self.name}
+		)
 
 		if account:
 			self.db_set(fieldname, account)
 
 	def set_mode_of_payment_account(self):
-		cash = frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name')
-		if cash and self.default_cash_account \
-			and not frappe.db.get_value('Mode of Payment Account', {'company': self.name, 'parent': cash}):
-			mode_of_payment = frappe.get_doc('Mode of Payment', cash, for_update=True)
-			mode_of_payment.append('accounts', {
-				'company': self.name,
-				'default_account': self.default_cash_account
-			})
+		cash = frappe.db.get_value("Mode of Payment", {"type": "Cash"}, "name")
+		if (
+			cash
+			and self.default_cash_account
+			and not frappe.db.get_value("Mode of Payment Account", {"company": self.name, "parent": cash})
+		):
+			mode_of_payment = frappe.get_doc("Mode of Payment", cash, for_update=True)
+			mode_of_payment.append(
+				"accounts", {"company": self.name, "default_account": self.default_cash_account}
+			)
 			mode_of_payment.save(ignore_permissions=True)
 
 	def create_default_cost_center(self):
 		cc_list = [
 			{
-				'cost_center_name': self.name,
-				'company':self.name,
-				'is_group': 1,
-				'parent_cost_center':None
+				"cost_center_name": self.name,
+				"company": self.name,
+				"is_group": 1,
+				"parent_cost_center": None,
 			},
 			{
-				'cost_center_name':_('Main'),
-				'company':self.name,
-				'is_group':0,
-				'parent_cost_center':self.name + ' - ' + self.abbr
+				"cost_center_name": _("Main"),
+				"company": self.name,
+				"is_group": 0,
+				"parent_cost_center": self.name + " - " + self.abbr,
 			},
 		]
 		for cc in cc_list:
@@ -335,26 +416,32 @@
 	def after_rename(self, olddn, newdn, merge=False):
 		frappe.db.set(self, "company_name", newdn)
 
-		frappe.db.sql("""update `tabDefaultValue` set defvalue=%s
-			where defkey='Company' and defvalue=%s""", (newdn, olddn))
+		frappe.db.sql(
+			"""update `tabDefaultValue` set defvalue=%s
+			where defkey='Company' and defvalue=%s""",
+			(newdn, olddn),
+		)
 
 		clear_defaults_cache()
 
 	def abbreviate(self):
-		self.abbr = ''.join(c[0].upper() for c in self.company_name.split())
+		self.abbr = "".join(c[0].upper() for c in self.company_name.split())
 
 	def on_trash(self):
 		"""
-			Trash accounts and cost centers for this company if no gl entry exists
+		Trash accounts and cost centers for this company if no gl entry exists
 		"""
 		NestedSet.validate_if_child_exists(self)
 		frappe.utils.nestedset.update_nsm(self)
 
 		rec = frappe.db.sql("SELECT name from `tabGL Entry` where company = %s", self.name)
 		if not rec:
-			frappe.db.sql("""delete from `tabBudget Account`
+			frappe.db.sql(
+				"""delete from `tabBudget Account`
 				where exists(select name from tabBudget
-					where name=`tabBudget Account`.parent and company = %s)""", self.name)
+					where name=`tabBudget Account`.parent and company = %s)""",
+				self.name,
+			)
 
 			for doctype in ["Account", "Cost Center", "Budget", "Party Account"]:
 				frappe.db.sql("delete from `tab{0}` where company = %s".format(doctype), self.name)
@@ -369,26 +456,37 @@
 		# clear default accounts, warehouses from item
 		warehouses = frappe.db.sql_list("select name from tabWarehouse where company=%s", self.name)
 		if warehouses:
-			frappe.db.sql("""delete from `tabItem Reorder` where warehouse in (%s)"""
-				% ', '.join(['%s']*len(warehouses)), tuple(warehouses))
+			frappe.db.sql(
+				"""delete from `tabItem Reorder` where warehouse in (%s)"""
+				% ", ".join(["%s"] * len(warehouses)),
+				tuple(warehouses),
+			)
 
 		# reset default company
-		frappe.db.sql("""update `tabSingles` set value=""
+		frappe.db.sql(
+			"""update `tabSingles` set value=""
 			where doctype='Global Defaults' and field='default_company'
-			and value=%s""", self.name)
+			and value=%s""",
+			self.name,
+		)
 
 		# reset default company
-		frappe.db.sql("""update `tabSingles` set value=""
+		frappe.db.sql(
+			"""update `tabSingles` set value=""
 			where doctype='Chart of Accounts Importer' and field='company'
-			and value=%s""", self.name)
+			and value=%s""",
+			self.name,
+		)
 
 		# delete BOMs
 		boms = frappe.db.sql_list("select name from tabBOM where company=%s", self.name)
 		if boms:
 			frappe.db.sql("delete from tabBOM where company=%s", self.name)
 			for dt in ("BOM Operation", "BOM Item", "BOM Scrap Item", "BOM Explosion Item"):
-				frappe.db.sql("delete from `tab%s` where parent in (%s)"""
-					% (dt, ', '.join(['%s']*len(boms))), tuple(boms))
+				frappe.db.sql(
+					"delete from `tab%s` where parent in (%s)" "" % (dt, ", ".join(["%s"] * len(boms))),
+					tuple(boms),
+				)
 
 		frappe.db.sql("delete from tabEmployee where company=%s", self.name)
 		frappe.db.sql("delete from tabDepartment where company=%s", self.name)
@@ -401,18 +499,20 @@
 		frappe.db.sql("delete from `tabItem Tax Template` where company=%s", self.name)
 
 		# delete Process Deferred Accounts if no GL Entry found
-		if not frappe.db.get_value('GL Entry', {'company': self.name}):
+		if not frappe.db.get_value("GL Entry", {"company": self.name}):
 			frappe.db.sql("delete from `tabProcess Deferred Accounting` where company=%s", self.name)
 
 	def check_parent_changed(self):
 		frappe.flags.parent_company_changed = False
 
-		if not self.is_new() and \
-			self.parent_company != frappe.db.get_value("Company",  self.name,  "parent_company"):
+		if not self.is_new() and self.parent_company != frappe.db.get_value(
+			"Company", self.name, "parent_company"
+		):
 			frappe.flags.parent_company_changed = True
 
+
 def get_name_with_abbr(name, company):
-	company_abbr = frappe.get_cached_value('Company',  company,  "abbr")
+	company_abbr = frappe.get_cached_value("Company", company, "abbr")
 	parts = name.split(" - ")
 
 	if parts[-1].lower() != company_abbr.lower():
@@ -420,6 +520,7 @@
 
 	return " - ".join(parts)
 
+
 def install_country_fixtures(company, country):
 	try:
 		module_name = f"erpnext.regional.{frappe.scrub(country)}.setup.setup"
@@ -428,13 +529,18 @@
 		pass
 	except Exception:
 		frappe.log_error()
-		frappe.throw(_("Failed to setup defaults for country {0}. Please contact support.").format(frappe.bold(country)))
+		frappe.throw(
+			_("Failed to setup defaults for country {0}. Please contact support.").format(
+				frappe.bold(country)
+			)
+		)
 
 
 def update_company_current_month_sales(company):
 	current_month_year = formatdate(today(), "MM-yyyy")
 
-	results = frappe.db.sql('''
+	results = frappe.db.sql(
+		"""
 		SELECT
 			SUM(base_grand_total) AS total,
 			DATE_FORMAT(`posting_date`, '%m-%Y') AS month_year
@@ -446,44 +552,58 @@
 			AND company = {company}
 		GROUP BY
 			month_year
-	'''.format(current_month_year=current_month_year, company=frappe.db.escape(company)),
-		as_dict = True)
+	""".format(
+			current_month_year=current_month_year, company=frappe.db.escape(company)
+		),
+		as_dict=True,
+	)
 
-	monthly_total = results[0]['total'] if len(results) > 0 else 0
+	monthly_total = results[0]["total"] if len(results) > 0 else 0
 
 	frappe.db.set_value("Company", company, "total_monthly_sales", monthly_total)
 
+
 def update_company_monthly_sales(company):
-	'''Cache past year monthly sales of every company based on sales invoices'''
+	"""Cache past year monthly sales of every company based on sales invoices"""
 	import json
 
 	from frappe.utils.goal import get_monthly_results
-	filter_str = "company = {0} and status != 'Draft' and docstatus=1".format(frappe.db.escape(company))
-	month_to_value_dict = get_monthly_results("Sales Invoice", "base_grand_total",
-		"posting_date", filter_str, "sum")
+
+	filter_str = "company = {0} and status != 'Draft' and docstatus=1".format(
+		frappe.db.escape(company)
+	)
+	month_to_value_dict = get_monthly_results(
+		"Sales Invoice", "base_grand_total", "posting_date", filter_str, "sum"
+	)
 
 	frappe.db.set_value("Company", company, "sales_monthly_history", json.dumps(month_to_value_dict))
 
+
 def update_transactions_annual_history(company, commit=False):
 	transactions_history = get_all_transactions_annual_history(company)
-	frappe.db.set_value("Company", company, "transactions_annual_history", json.dumps(transactions_history))
+	frappe.db.set_value(
+		"Company", company, "transactions_annual_history", json.dumps(transactions_history)
+	)
 
 	if commit:
 		frappe.db.commit()
 
+
 def cache_companies_monthly_sales_history():
-	companies = [d['name'] for d in frappe.get_list("Company")]
+	companies = [d["name"] for d in frappe.get_list("Company")]
 	for company in companies:
 		update_company_monthly_sales(company)
 		update_transactions_annual_history(company)
 	frappe.db.commit()
 
+
 @frappe.whitelist()
 def get_children(doctype, parent=None, company=None, is_root=False):
 	if parent == None or parent == "All Companies":
 		parent = ""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			name as value,
 			is_group as expandable
@@ -492,25 +612,30 @@
 		where
 			ifnull(parent_company, "")={parent}
 		""".format(
-			doctype = doctype,
-			parent=frappe.db.escape(parent)
-		), as_dict=1)
+			doctype=doctype, parent=frappe.db.escape(parent)
+		),
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def add_node():
 	from frappe.desk.treeview import make_tree_args
+
 	args = frappe.form_dict
 	args = make_tree_args(**args)
 
-	if args.parent_company == 'All Companies':
+	if args.parent_company == "All Companies":
 		args.parent_company = None
 
 	frappe.get_doc(args).insert()
 
+
 def get_all_transactions_annual_history(company):
 	out = {}
 
-	items = frappe.db.sql('''
+	items = frappe.db.sql(
+		"""
 		select transaction_date, count(*) as count
 
 		from (
@@ -550,46 +675,55 @@
 
 		group by
 			transaction_date
-			''', (company), as_dict=True)
+			""",
+		(company),
+		as_dict=True,
+	)
 
 	for d in items:
 		timestamp = get_timestamp(d["transaction_date"])
-		out.update({ timestamp: d["count"] })
+		out.update({timestamp: d["count"]})
 
 	return out
 
+
 def get_timeline_data(doctype, name):
-	'''returns timeline data based on linked records in dashboard'''
+	"""returns timeline data based on linked records in dashboard"""
 	out = {}
 	date_to_value_dict = {}
 
-	history = frappe.get_cached_value('Company',  name,  "transactions_annual_history")
+	history = frappe.get_cached_value("Company", name, "transactions_annual_history")
 
 	try:
-		date_to_value_dict = json.loads(history) if history and '{' in history else None
+		date_to_value_dict = json.loads(history) if history and "{" in history else None
 	except ValueError:
 		date_to_value_dict = None
 
 	if date_to_value_dict is None:
 		update_transactions_annual_history(name, True)
-		history = frappe.get_cached_value('Company',  name,  "transactions_annual_history")
-		return json.loads(history) if history and '{' in history else {}
+		history = frappe.get_cached_value("Company", name, "transactions_annual_history")
+		return json.loads(history) if history and "{" in history else {}
 
 	return date_to_value_dict
 
+
 @frappe.whitelist()
-def get_default_company_address(name, sort_key='is_primary_address', existing_address=None):
-	if sort_key not in ['is_shipping_address', 'is_primary_address']:
+def get_default_company_address(name, sort_key="is_primary_address", existing_address=None):
+	if sort_key not in ["is_shipping_address", "is_primary_address"]:
 		return None
 
-	out = frappe.db.sql(""" SELECT
+	out = frappe.db.sql(
+		""" SELECT
 			addr.name, addr.%s
 		FROM
 			`tabAddress` addr, `tabDynamic Link` dl
 		WHERE
 			dl.parent = addr.name and dl.link_doctype = 'Company' and
 			dl.link_name = %s and ifnull(addr.disabled, 0) = 0
-		""" %(sort_key, '%s'), (name)) #nosec
+		"""
+		% (sort_key, "%s"),
+		(name),
+	)  # nosec
 
 	if existing_address:
 		if existing_address in [d[0] for d in out]:
@@ -600,11 +734,9 @@
 	else:
 		return None
 
+
 @frappe.whitelist()
 def create_transaction_deletion_request(company):
-	tdr = frappe.get_doc({
-		'doctype': 'Transaction Deletion Record',
-		'company': company
-	})
+	tdr = frappe.get_doc({"doctype": "Transaction Deletion Record", "company": company})
 	tdr.insert()
 	tdr.submit()
diff --git a/erpnext/setup/doctype/company/company_dashboard.py b/erpnext/setup/doctype/company/company_dashboard.py
index 7cb0b12..ff1e7f1 100644
--- a/erpnext/setup/doctype/company/company_dashboard.py
+++ b/erpnext/setup/doctype/company/company_dashboard.py
@@ -3,38 +3,25 @@
 
 def get_data():
 	return {
-		'graph': True,
-		'graph_method': "frappe.utils.goal.get_monthly_goal_graph_data",
-		'graph_method_args': {
-			'title': _('Sales'),
-			'goal_value_field': 'monthly_sales_target',
-			'goal_total_field': 'total_monthly_sales',
-			'goal_history_field': 'sales_monthly_history',
-			'goal_doctype': 'Sales Invoice',
-			'goal_doctype_link': 'company',
-			'goal_field': 'base_grand_total',
-			'date_field': 'posting_date',
-			'filter_str': "docstatus = 1 and is_opening != 'Yes'",
-			'aggregation': 'sum'
+		"graph": True,
+		"graph_method": "frappe.utils.goal.get_monthly_goal_graph_data",
+		"graph_method_args": {
+			"title": _("Sales"),
+			"goal_value_field": "monthly_sales_target",
+			"goal_total_field": "total_monthly_sales",
+			"goal_history_field": "sales_monthly_history",
+			"goal_doctype": "Sales Invoice",
+			"goal_doctype_link": "company",
+			"goal_field": "base_grand_total",
+			"date_field": "posting_date",
+			"filter_str": "docstatus = 1 and is_opening != 'Yes'",
+			"aggregation": "sum",
 		},
-
-		'fieldname': 'company',
-		'transactions': [
-			{
-				'label': _('Pre Sales'),
-				'items': ['Quotation']
-			},
-			{
-				'label': _('Orders'),
-				'items': ['Sales Order', 'Delivery Note', 'Sales Invoice']
-			},
-			{
-				'label': _('Support'),
-				'items': ['Issue']
-			},
-			{
-				'label': _('Projects'),
-				'items': ['Project']
-			}
-		]
+		"fieldname": "company",
+		"transactions": [
+			{"label": _("Pre Sales"), "items": ["Quotation"]},
+			{"label": _("Orders"), "items": ["Sales Order", "Delivery Note", "Sales Invoice"]},
+			{"label": _("Support"), "items": ["Issue"]},
+			{"label": _("Projects"), "items": ["Project"]},
+		],
 	}
diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py
index e175c54..29e056e 100644
--- a/erpnext/setup/doctype/company/test_company.py
+++ b/erpnext/setup/doctype/company/test_company.py
@@ -14,7 +14,8 @@
 
 test_ignore = ["Account", "Cost Center", "Payment Terms Template", "Salary Component", "Warehouse"]
 test_dependencies = ["Fiscal Year"]
-test_records = frappe.get_test_records('Company')
+test_records = frappe.get_test_records("Company")
+
 
 class TestCompany(unittest.TestCase):
 	def test_coa_based_on_existing_company(self):
@@ -37,8 +38,8 @@
 				"account_type": "Cash",
 				"is_group": 0,
 				"root_type": "Asset",
-				"parent_account": "Cash In Hand - CFEC"
-			}
+				"parent_account": "Cash In Hand - CFEC",
+			},
 		}
 
 		for account, acc_property in expected_results.items():
@@ -69,15 +70,22 @@
 					company.chart_of_accounts = template
 					company.save()
 
-					account_types = ["Cost of Goods Sold", "Depreciation",
-						"Expenses Included In Valuation", "Fixed Asset", "Payable", "Receivable",
-						"Stock Adjustment", "Stock Received But Not Billed", "Bank", "Cash", "Stock"]
+					account_types = [
+						"Cost of Goods Sold",
+						"Depreciation",
+						"Expenses Included In Valuation",
+						"Fixed Asset",
+						"Payable",
+						"Receivable",
+						"Stock Adjustment",
+						"Stock Received But Not Billed",
+						"Bank",
+						"Cash",
+						"Stock",
+					]
 
 					for account_type in account_types:
-						filters = {
-							"company": template,
-							"account_type": account_type
-						}
+						filters = {"company": template, "account_type": account_type}
 						if account_type in ["Bank", "Cash"]:
 							filters["is_group"] = 1
 
@@ -90,8 +98,11 @@
 					frappe.delete_doc("Company", template)
 
 	def delete_mode_of_payment(self, company):
-		frappe.db.sql(""" delete from `tabMode of Payment Account`
-			where company =%s """, (company))
+		frappe.db.sql(
+			""" delete from `tabMode of Payment Account`
+			where company =%s """,
+			(company),
+		)
 
 	def test_basic_tree(self, records=None):
 		min_lft = 1
@@ -101,12 +112,12 @@
 			records = test_records[2:]
 
 		for company in records:
-			lft, rgt, parent_company = frappe.db.get_value("Company", company["company_name"],
-				["lft", "rgt", "parent_company"])
+			lft, rgt, parent_company = frappe.db.get_value(
+				"Company", company["company_name"], ["lft", "rgt", "parent_company"]
+			)
 
 			if parent_company:
-				parent_lft, parent_rgt = frappe.db.get_value("Company", parent_company,
-					["lft", "rgt"])
+				parent_lft, parent_rgt = frappe.db.get_value("Company", parent_company, ["lft", "rgt"])
 			else:
 				# root
 				parent_lft = min_lft - 1
@@ -125,8 +136,11 @@
 		def get_no_of_children(companies, no_of_children):
 			children = []
 			for company in companies:
-				children += frappe.db.sql_list("""select name from `tabCompany`
-				where ifnull(parent_company, '')=%s""", company or '')
+				children += frappe.db.sql_list(
+					"""select name from `tabCompany`
+				where ifnull(parent_company, '')=%s""",
+					company or "",
+				)
 
 			if len(children):
 				return get_no_of_children(children, no_of_children + len(children))
@@ -148,40 +162,45 @@
 		child_company.save()
 		self.test_basic_tree()
 
+
 def create_company_communication(doctype, docname):
-	comm = frappe.get_doc({
+	comm = frappe.get_doc(
+		{
 			"doctype": "Communication",
 			"communication_type": "Communication",
 			"content": "Deduplication of Links",
 			"communication_medium": "Email",
-			"reference_doctype":doctype,
-			"reference_name":docname
-		})
+			"reference_doctype": doctype,
+			"reference_name": docname,
+		}
+	)
 	comm.insert()
 
+
 def create_child_company():
 	child_company = frappe.db.exists("Company", "Test Company")
 	if not child_company:
-		child_company = frappe.get_doc({
-			"doctype":"Company",
-			"company_name":"Test Company",
-			"abbr":"test_company",
-			"default_currency":"INR"
-		})
+		child_company = frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": "Test Company",
+				"abbr": "test_company",
+				"default_currency": "INR",
+			}
+		)
 		child_company.insert()
 	else:
 		child_company = frappe.get_doc("Company", child_company)
 
 	return child_company.name
 
+
 def create_test_lead_in_company(company):
 	lead = frappe.db.exists("Lead", "Test Lead in new company")
 	if not lead:
-		lead = frappe.get_doc({
-			"doctype": "Lead",
-			"lead_name": "Test Lead in new company",
-			"scompany": company
-		})
+		lead = frappe.get_doc(
+			{"doctype": "Lead", "lead_name": "Test Lead in new company", "scompany": company}
+		)
 		lead.insert()
 	else:
 		lead = frappe.get_doc("Lead", lead)
diff --git a/erpnext/setup/doctype/currency_exchange/currency_exchange.py b/erpnext/setup/doctype/currency_exchange/currency_exchange.py
index 4191935..f9f3b3a 100644
--- a/erpnext/setup/doctype/currency_exchange/currency_exchange.py
+++ b/erpnext/setup/doctype/currency_exchange/currency_exchange.py
@@ -17,13 +17,17 @@
 
 		# If both selling and buying enabled
 		purpose = "Selling-Buying"
-		if cint(self.for_buying)==0 and cint(self.for_selling)==1:
+		if cint(self.for_buying) == 0 and cint(self.for_selling) == 1:
 			purpose = "Selling"
-		if cint(self.for_buying)==1 and cint(self.for_selling)==0:
+		if cint(self.for_buying) == 1 and cint(self.for_selling) == 0:
 			purpose = "Buying"
 
-		self.name = '{0}-{1}-{2}{3}'.format(formatdate(get_datetime_str(self.date), "yyyy-MM-dd"),
-			self.from_currency, self.to_currency, ("-" + purpose) if purpose else "")
+		self.name = "{0}-{1}-{2}{3}".format(
+			formatdate(get_datetime_str(self.date), "yyyy-MM-dd"),
+			self.from_currency,
+			self.to_currency,
+			("-" + purpose) if purpose else "",
+		)
 
 	def validate(self):
 		self.validate_value("exchange_rate", ">", 0)
diff --git a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
index 06a79b4..e3d281a 100644
--- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
+++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
@@ -9,20 +9,27 @@
 
 from erpnext.setup.utils import get_exchange_rate
 
-test_records = frappe.get_test_records('Currency Exchange')
+test_records = frappe.get_test_records("Currency Exchange")
+
 
 def save_new_records(test_records):
 	for record in test_records:
 		# If both selling and buying enabled
 		purpose = "Selling-Buying"
 
-		if cint(record.get("for_buying"))==0 and cint(record.get("for_selling"))==1:
+		if cint(record.get("for_buying")) == 0 and cint(record.get("for_selling")) == 1:
 			purpose = "Selling"
-		if cint(record.get("for_buying"))==1 and cint(record.get("for_selling"))==0:
+		if cint(record.get("for_buying")) == 1 and cint(record.get("for_selling")) == 0:
 			purpose = "Buying"
 		kwargs = dict(
 			doctype=record.get("doctype"),
-			docname=record.get("date") + '-' + record.get("from_currency") + '-' + record.get("to_currency") + '-' + purpose,
+			docname=record.get("date")
+			+ "-"
+			+ record.get("from_currency")
+			+ "-"
+			+ record.get("to_currency")
+			+ "-"
+			+ purpose,
 			fieldname="exchange_rate",
 			value=record.get("exchange_rate"),
 		)
@@ -39,10 +46,8 @@
 			curr_exchange.for_selling = record["for_selling"]
 			curr_exchange.insert()
 
-test_exchange_values = {
-	'2015-12-15': '66.999',
-	'2016-01-15': '65.1'
-}
+
+test_exchange_values = {"2015-12-15": "66.999", "2016-01-15": "65.1"}
 
 # Removing API call from get_exchange_rate
 def patched_requests_get(*args, **kwargs):
@@ -58,19 +63,22 @@
 		def json(self):
 			return self.json_data
 
-	if args[0] == "https://api.exchangerate.host/convert" and kwargs.get('params'):
-		if kwargs['params'].get('date') and kwargs['params'].get('from') and kwargs['params'].get('to'):
-			if test_exchange_values.get(kwargs['params']['date']):
-				return PatchResponse({'result': test_exchange_values[kwargs['params']['date']]}, 200)
-	elif args[0].startswith("https://frankfurter.app") and kwargs.get('params'):
-		if kwargs['params'].get('base') and kwargs['params'].get('symbols'):
+	if args[0] == "https://api.exchangerate.host/convert" and kwargs.get("params"):
+		if kwargs["params"].get("date") and kwargs["params"].get("from") and kwargs["params"].get("to"):
+			if test_exchange_values.get(kwargs["params"]["date"]):
+				return PatchResponse({"result": test_exchange_values[kwargs["params"]["date"]]}, 200)
+	elif args[0].startswith("https://frankfurter.app") and kwargs.get("params"):
+		if kwargs["params"].get("base") and kwargs["params"].get("symbols"):
 			date = args[0].replace("https://frankfurter.app/", "")
 			if test_exchange_values.get(date):
-				return PatchResponse({'rates': {kwargs['params'].get('symbols'): test_exchange_values.get(date)}}, 200)
+				return PatchResponse(
+					{"rates": {kwargs["params"].get("symbols"): test_exchange_values.get(date)}}, 200
+				)
 
-	return PatchResponse({'rates': None}, 404)
+	return PatchResponse({"rates": None}, 404)
 
-@mock.patch('requests.get', side_effect=patched_requests_get)
+
+@mock.patch("requests.get", side_effect=patched_requests_get)
 class TestCurrencyExchange(unittest.TestCase):
 	def clear_cache(self):
 		cache = frappe.cache()
@@ -112,7 +120,7 @@
 
 		# Update Currency Exchange Rate
 		settings = frappe.get_single("Currency Exchange Settings")
-		settings.service_provider = 'exchangerate.host'
+		settings.service_provider = "exchangerate.host"
 		settings.save()
 
 		# Update exchange
@@ -139,7 +147,7 @@
 		self.assertEqual(flt(exchange_rate, 3), 65.1)
 
 		settings = frappe.get_single("Currency Exchange Settings")
-		settings.service_provider = 'frankfurter.app'
+		settings.service_provider = "frankfurter.app"
 		settings.save()
 
 	def test_exchange_rate_strict(self, mock_get):
diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py
index 5b91726..246cc19 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.py
+++ b/erpnext/setup/doctype/customer_group/customer_group.py
@@ -8,7 +8,8 @@
 
 
 class CustomerGroup(NestedSet):
-	nsm_parent_field = 'parent_customer_group'
+	nsm_parent_field = "parent_customer_group"
+
 	def validate(self):
 		if not self.parent_customer_group:
 			self.parent_customer_group = get_root_of("Customer Group")
@@ -22,12 +23,18 @@
 		if frappe.db.exists("Customer", self.name):
 			frappe.msgprint(_("A customer with the same name already exists"), raise_exception=1)
 
-def get_parent_customer_groups(customer_group):
-	lft, rgt = frappe.db.get_value("Customer Group", customer_group, ['lft', 'rgt'])
 
-	return frappe.db.sql("""select name from `tabCustomer Group`
+def get_parent_customer_groups(customer_group):
+	lft, rgt = frappe.db.get_value("Customer Group", customer_group, ["lft", "rgt"])
+
+	return frappe.db.sql(
+		"""select name from `tabCustomer Group`
 		where lft <= %s and rgt >= %s
-		order by lft asc""", (lft, rgt), as_dict=True)
+		order by lft asc""",
+		(lft, rgt),
+		as_dict=True,
+	)
+
 
 def on_doctype_update():
 	frappe.db.add_index("Customer Group", ["lft", "rgt"])
diff --git a/erpnext/setup/doctype/customer_group/test_customer_group.py b/erpnext/setup/doctype/customer_group/test_customer_group.py
index f02ae09..8876270 100644
--- a/erpnext/setup/doctype/customer_group/test_customer_group.py
+++ b/erpnext/setup/doctype/customer_group/test_customer_group.py
@@ -4,7 +4,6 @@
 test_ignore = ["Price List"]
 
 
-
 import frappe
 
-test_records = frappe.get_test_records('Customer Group')
+test_records = frappe.get_test_records("Customer Group")
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 02f9156..cdfea77 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -36,16 +36,22 @@
 		self.from_date, self.to_date = self.get_from_to_date()
 		self.set_dates()
 		self._accounts = {}
-		self.currency = frappe.db.get_value('Company',  self.company,  "default_currency")
+		self.currency = frappe.db.get_value("Company", self.company, "default_currency")
 
 	@frappe.whitelist()
 	def get_users(self):
 		"""get list of users"""
-		user_list = frappe.db.sql("""
+		user_list = frappe.db.sql(
+			"""
 			select name, enabled from tabUser
 			where name not in ({})
 			and user_type != "Website User"
-			order by enabled desc, name asc""".format(", ".join(["%s"]*len(STANDARD_USERS))), STANDARD_USERS, as_dict=1)
+			order by enabled desc, name asc""".format(
+				", ".join(["%s"] * len(STANDARD_USERS))
+			),
+			STANDARD_USERS,
+			as_dict=1,
+		)
 
 		if self.recipient_list:
 			recipient_list = self.recipient_list.split("\n")
@@ -54,13 +60,18 @@
 		for p in user_list:
 			p["checked"] = p["name"] in recipient_list and 1 or 0
 
-		frappe.response['user_list'] = user_list
+		frappe.response["user_list"] = user_list
 
 	@frappe.whitelist()
 	def send(self):
 		# send email only to enabled users
-		valid_users = [p[0] for p in frappe.db.sql("""select name from `tabUser`
-			where enabled=1""")]
+		valid_users = [
+			p[0]
+			for p in frappe.db.sql(
+				"""select name from `tabUser`
+			where enabled=1"""
+			)
+		]
 
 		if self.recipients:
 			for row in self.recipients:
@@ -70,9 +81,10 @@
 						recipients=row.recipient,
 						subject=_("{0} Digest").format(self.frequency),
 						message=msg_for_this_recipient,
-						reference_doctype = self.doctype,
-						reference_name = self.name,
-						unsubscribe_message = _("Unsubscribe from this Email Digest"))
+						reference_doctype=self.doctype,
+						reference_name=self.name,
+						unsubscribe_message=_("Unsubscribe from this Email Digest"),
+					)
 
 	def get_msg_html(self):
 		"""Build email digest content"""
@@ -104,7 +116,10 @@
 		context.quote = {"text": quote[0], "author": quote[1]}
 
 		if self.get("purchase_orders_items_overdue"):
-			context.purchase_order_list, context.purchase_orders_items_overdue_list = self.get_purchase_orders_items_overdue_list()
+			(
+				context.purchase_order_list,
+				context.purchase_orders_items_overdue_list,
+			) = self.get_purchase_orders_items_overdue_list()
 			if not context.purchase_order_list:
 				frappe.throw(_("No items to be received are overdue"))
 
@@ -114,49 +129,54 @@
 		frappe.flags.ignore_account_permission = False
 
 		# style
-		return frappe.render_template("erpnext/setup/doctype/email_digest/templates/default.html",
-			context, is_path=True)
+		return frappe.render_template(
+			"erpnext/setup/doctype/email_digest/templates/default.html", context, is_path=True
+		)
 
 	def set_title(self, context):
 		"""Set digest title"""
-		if self.frequency=="Daily":
+		if self.frequency == "Daily":
 			context.title = _("Daily Reminders")
 			context.subtitle = _("Pending activities for today")
-		elif self.frequency=="Weekly":
+		elif self.frequency == "Weekly":
 			context.title = _("This Week's Summary")
 			context.subtitle = _("Summary for this week and pending activities")
-		elif self.frequency=="Monthly":
+		elif self.frequency == "Monthly":
 			context.title = _("This Month's Summary")
 			context.subtitle = _("Summary for this month and pending activities")
 
 	def set_style(self, context):
 		"""Set standard digest style"""
-		context.text_muted = '#8D99A6'
-		context.text_color = '#36414C'
-		context.h1 = 'margin-bottom: 30px; margin-top: 40px; font-weight: 400; font-size: 30px;'
-		context.h2 = 'margin-bottom: 30px; margin-top: -20px; font-weight: 400; font-size: 20px;'
-		context.label_css = '''display: inline-block; color: {text_muted};
-			padding: 3px 7px; margin-right: 7px;'''.format(text_muted = context.text_muted)
-		context.section_head = 'margin-top: 60px; font-size: 16px;'
-		context.line_item  = 'padding: 5px 0px; margin: 0; border-bottom: 1px solid #d1d8dd;'
-		context.link_css = 'color: {text_color}; text-decoration: none;'.format(text_color = context.text_color)
-
+		context.text_muted = "#8D99A6"
+		context.text_color = "#36414C"
+		context.h1 = "margin-bottom: 30px; margin-top: 40px; font-weight: 400; font-size: 30px;"
+		context.h2 = "margin-bottom: 30px; margin-top: -20px; font-weight: 400; font-size: 20px;"
+		context.label_css = """display: inline-block; color: {text_muted};
+			padding: 3px 7px; margin-right: 7px;""".format(
+			text_muted=context.text_muted
+		)
+		context.section_head = "margin-top: 60px; font-size: 16px;"
+		context.line_item = "padding: 5px 0px; margin: 0; border-bottom: 1px solid #d1d8dd;"
+		context.link_css = "color: {text_color}; text-decoration: none;".format(
+			text_color=context.text_color
+		)
 
 	def get_notifications(self):
 		"""Get notifications for user"""
 		notifications = frappe.desk.notifications.get_notifications()
 
-		notifications = sorted(notifications.get("open_count_doctype", {}).items(),
-			key=lambda a: a[1])
+		notifications = sorted(notifications.get("open_count_doctype", {}).items(), key=lambda a: a[1])
 
-		notifications = [{"key": n[0], "value": n[1],
-			"link": get_url_to_list(n[0])} for n in notifications if n[1]]
+		notifications = [
+			{"key": n[0], "value": n[1], "link": get_url_to_list(n[0])} for n in notifications if n[1]
+		]
 
 		return notifications
 
 	def get_calendar_events(self):
 		"""Get calendar events for given user"""
 		from frappe.desk.doctype.event.event import get_events
+
 		from_date, to_date = get_future_date_for_calendaer_event(self.frequency)
 
 		events = get_events(from_date, to_date)
@@ -176,10 +196,13 @@
 		if not user_id:
 			user_id = frappe.session.user
 
-		todo_list = frappe.db.sql("""select *
+		todo_list = frappe.db.sql(
+			"""select *
 			from `tabToDo` where (owner=%s or assigned_by=%s) and status="Open"
 			order by field(priority, 'High', 'Medium', 'Low') asc, date asc limit 20""",
-			(user_id, user_id), as_dict=True)
+			(user_id, user_id),
+			as_dict=True,
+		)
 
 		for t in todo_list:
 			t.link = get_url_to_form("ToDo", t.name)
@@ -191,9 +214,11 @@
 		if not user_id:
 			user_id = frappe.session.user
 
-		return frappe.db.sql("""select count(*) from `tabToDo`
+		return frappe.db.sql(
+			"""select count(*) from `tabToDo`
 			where status='Open' and (owner=%s or assigned_by=%s)""",
-			(user_id, user_id))[0][0]
+			(user_id, user_id),
+		)[0][0]
 
 	def get_issue_list(self, user_id=None):
 		"""Get issue list"""
@@ -205,9 +230,12 @@
 		if not role_permissions.get("read"):
 			return None
 
-		issue_list = frappe.db.sql("""select *
+		issue_list = frappe.db.sql(
+			"""select *
 			from `tabIssue` where status in ("Replied","Open")
-			order by modified asc limit 10""", as_dict=True)
+			order by modified asc limit 10""",
+			as_dict=True,
+		)
 
 		for t in issue_list:
 			t.link = get_url_to_form("Issue", t.name)
@@ -216,17 +244,22 @@
 
 	def get_issue_count(self):
 		"""Get count of Issue"""
-		return frappe.db.sql("""select count(*) from `tabIssue`
-			where status in ('Open','Replied') """)[0][0]
+		return frappe.db.sql(
+			"""select count(*) from `tabIssue`
+			where status in ('Open','Replied') """
+		)[0][0]
 
 	def get_project_list(self, user_id=None):
 		"""Get project list"""
 		if not user_id:
 			user_id = frappe.session.user
 
-		project_list = frappe.db.sql("""select *
+		project_list = frappe.db.sql(
+			"""select *
 			from `tabProject` where status='Open' and project_type='External'
-			order by modified asc limit 10""", as_dict=True)
+			order by modified asc limit 10""",
+			as_dict=True,
+		)
 
 		for t in project_list:
 			t.link = get_url_to_form("Issue", t.name)
@@ -235,22 +268,41 @@
 
 	def get_project_count(self):
 		"""Get count of Project"""
-		return frappe.db.sql("""select count(*) from `tabProject`
-			where status='Open' and project_type='External'""")[0][0]
+		return frappe.db.sql(
+			"""select count(*) from `tabProject`
+			where status='Open' and project_type='External'"""
+		)[0][0]
 
 	def set_accounting_cards(self, context):
 		"""Create accounting cards if checked"""
 
 		cache = frappe.cache()
 		context.cards = []
-		for key in ("income", "expenses_booked", "income_year_to_date", "expense_year_to_date",
-					"bank_balance", "credit_balance", "invoiced_amount", "payables",
-					"sales_orders_to_bill", "purchase_orders_to_bill", "sales_order", "purchase_order",
-					"sales_orders_to_deliver", "purchase_orders_to_receive", "sales_invoice", "purchase_invoice",
-					"new_quotations", "pending_quotations"):
+		for key in (
+			"income",
+			"expenses_booked",
+			"income_year_to_date",
+			"expense_year_to_date",
+			"bank_balance",
+			"credit_balance",
+			"invoiced_amount",
+			"payables",
+			"sales_orders_to_bill",
+			"purchase_orders_to_bill",
+			"sales_order",
+			"purchase_order",
+			"sales_orders_to_deliver",
+			"purchase_orders_to_receive",
+			"sales_invoice",
+			"purchase_invoice",
+			"new_quotations",
+			"pending_quotations",
+		):
 
 			if self.get(key):
-				cache_key = "email_digest:card:{0}:{1}:{2}:{3}".format(self.company, self.frequency, key, self.from_date)
+				cache_key = "email_digest:card:{0}:{1}:{2}:{3}".format(
+					self.company, self.frequency, key, self.from_date
+				)
 				card = cache.get(cache_key)
 
 				if card:
@@ -271,8 +323,9 @@
 
 						if key == "credit_balance":
 							card.last_value = card.last_value * -1
-						card.last_value = self.fmt_money(card.last_value,False if key in ("bank_balance", "credit_balance") else True)
-
+						card.last_value = self.fmt_money(
+							card.last_value, False if key in ("bank_balance", "credit_balance") else True
+						)
 
 					if card.billed_value:
 						card.billed = int(flt(card.billed_value) / card.value * 100)
@@ -285,9 +338,11 @@
 						else:
 							card.delivered = "% Received " + str(card.delivered)
 
-					if key =="credit_balance":
-						card.value = card.value *-1
-					card.value = self.fmt_money(card.value,False if key in ("bank_balance", "credit_balance") else True)
+					if key == "credit_balance":
+						card.value = card.value * -1
+					card.value = self.fmt_money(
+						card.value, False if key in ("bank_balance", "credit_balance") else True
+					)
 
 					cache.set_value(cache_key, card, expires_in_sec=24 * 60 * 60)
 
@@ -295,30 +350,25 @@
 
 	def get_income(self):
 		"""Get income for given period"""
-		income, past_income, count = self.get_period_amounts(self.get_roots("income"),'income')
+		income, past_income, count = self.get_period_amounts(self.get_roots("income"), "income")
 
-		income_account = frappe.db.get_all('Account',
+		income_account = frappe.db.get_all(
+			"Account",
 			fields=["name"],
-			filters={
-				"root_type":"Income",
-				"parent_account":'',
-				"company": self.company
-			})
+			filters={"root_type": "Income", "parent_account": "", "company": self.company},
+		)
 
-		label = get_link_to_report("General Ledger",self.meta.get_label("income"),
+		label = get_link_to_report(
+			"General Ledger",
+			self.meta.get_label("income"),
 			filters={
 				"from_date": self.future_from_date,
 				"to_date": self.future_to_date,
 				"account": income_account[0].name,
-				"company": self.company
-			}
+				"company": self.company,
+			},
 		)
-		return {
-			"label": label,
-			"value": income,
-			"last_value": past_income,
-			"count": count
-		}
+		return {"label": label, "value": income, "last_value": past_income, "count": count}
 
 	def get_income_year_to_date(self):
 		"""Get income to date"""
@@ -326,7 +376,7 @@
 
 	def get_expense_year_to_date(self):
 		"""Get income to date"""
-		return self.get_year_to_date_balance("expense","expenses_booked")
+		return self.get_year_to_date_balance("expense", "expenses_booked")
 
 	def get_year_to_date_balance(self, root_type, fieldname):
 		"""Get income to date"""
@@ -334,67 +384,63 @@
 		count = 0
 
 		for account in self.get_root_type_accounts(root_type):
-			balance += get_balance_on(account, date = self.future_to_date)
-			count += get_count_on(account, fieldname, date = self.future_to_date)
+			balance += get_balance_on(account, date=self.future_to_date)
+			count += get_count_on(account, fieldname, date=self.future_to_date)
 
-		if fieldname == 'income':
-			filters = {
-				"currency": self.currency
-			}
-			label = get_link_to_report('Profit and Loss Statement', label=self.meta.get_label(root_type + "_year_to_date"), filters=filters)
+		if fieldname == "income":
+			filters = {"currency": self.currency}
+			label = get_link_to_report(
+				"Profit and Loss Statement",
+				label=self.meta.get_label(root_type + "_year_to_date"),
+				filters=filters,
+			)
 
-		elif fieldname == 'expenses_booked':
-			filters = {
-				"currency": self.currency
-			}
-			label = get_link_to_report('Profit and Loss Statement', label=self.meta.get_label(root_type + "_year_to_date"), filters=filters)
+		elif fieldname == "expenses_booked":
+			filters = {"currency": self.currency}
+			label = get_link_to_report(
+				"Profit and Loss Statement",
+				label=self.meta.get_label(root_type + "_year_to_date"),
+				filters=filters,
+			)
 
-		return {
-			"label": label,
-			"value": balance,
-			"count": count
-		}
+		return {"label": label, "value": balance, "count": count}
 
 	def get_bank_balance(self):
 		# account is of type "Bank" and root_type is Asset
-		return self.get_type_balance('bank_balance', 'Bank', root_type='Asset')
+		return self.get_type_balance("bank_balance", "Bank", root_type="Asset")
 
 	def get_credit_balance(self):
 		# account is of type "Bank" and root_type is Liability
-		return self.get_type_balance('credit_balance', 'Bank', root_type='Liability')
+		return self.get_type_balance("credit_balance", "Bank", root_type="Liability")
 
 	def get_payables(self):
-		return self.get_type_balance('payables', 'Payable')
+		return self.get_type_balance("payables", "Payable")
 
 	def get_invoiced_amount(self):
-		return self.get_type_balance('invoiced_amount', 'Receivable')
+		return self.get_type_balance("invoiced_amount", "Receivable")
 
 	def get_expenses_booked(self):
-		expenses, past_expenses, count = self.get_period_amounts(self.get_roots("expense"), 'expenses_booked')
-
-		expense_account = frappe.db.get_all('Account',
-			fields=["name"],
-			filters={
-				"root_type": "Expense",
-				"parent_account": '',
-				"company": self.company
-				}
-			)
-
-		label = get_link_to_report("General Ledger",self.meta.get_label("expenses_booked"),
-			filters={
-				"company":self.company,
-				"from_date":self.future_from_date,
-				"to_date":self.future_to_date,
-				"account": expense_account[0].name
-			}
+		expenses, past_expenses, count = self.get_period_amounts(
+			self.get_roots("expense"), "expenses_booked"
 		)
-		return {
-			"label": label,
-			"value": expenses,
-			"last_value": past_expenses,
-			"count": count
-		}
+
+		expense_account = frappe.db.get_all(
+			"Account",
+			fields=["name"],
+			filters={"root_type": "Expense", "parent_account": "", "company": self.company},
+		)
+
+		label = get_link_to_report(
+			"General Ledger",
+			self.meta.get_label("expenses_booked"),
+			filters={
+				"company": self.company,
+				"from_date": self.future_from_date,
+				"to_date": self.future_to_date,
+				"account": expense_account[0].name,
+			},
+		)
+		return {"label": label, "value": expenses, "last_value": past_expenses, "count": count}
 
 	def get_period_amounts(self, accounts, fieldname):
 		"""Get amounts for current and past periods"""
@@ -410,113 +456,129 @@
 	def get_sales_orders_to_bill(self):
 		"""Get value not billed"""
 
-		value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0),
+		value, count = frappe.db.sql(
+			"""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0),
                     count(*) from `tabSales Order`
 					where (transaction_date <= %(to_date)s) and billing_status != "Fully Billed" and company = %(company)s
-					and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
+					and status not in ('Closed','Cancelled', 'Completed') """,
+			{"to_date": self.future_to_date, "company": self.company},
+		)[0]
 
-		label = get_link_to_report('Sales Order', label=self.meta.get_label("sales_orders_to_bill"),
+		label = get_link_to_report(
+			"Sales Order",
+			label=self.meta.get_label("sales_orders_to_bill"),
 			report_type="Report Builder",
 			doctype="Sales Order",
-			filters = {
-				"status": [['!=', "Closed"], ['!=', "Cancelled"]],
-				"per_billed": [['<', 100]],
-				"transaction_date": [['<=', self.future_to_date]],
-				"company": self.company
-			}
+			filters={
+				"status": [["!=", "Closed"], ["!=", "Cancelled"]],
+				"per_billed": [["<", 100]],
+				"transaction_date": [["<=", self.future_to_date]],
+				"company": self.company,
+			},
 		)
 
-		return {
-			"label": label,
-			"value": value,
-			"count": count
-		}
+		return {"label": label, "value": value, "count": count}
 
 	def get_sales_orders_to_deliver(self):
 		"""Get value not delivered"""
 
-		value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_delivered/100)),0),
+		value, count = frappe.db.sql(
+			"""select ifnull((sum(grand_total)) - (sum(grand_total*per_delivered/100)),0),
 					count(*) from `tabSales Order`
 					where (transaction_date <= %(to_date)s) and delivery_status != "Fully Delivered" and company = %(company)s
-					and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
+					and status not in ('Closed','Cancelled', 'Completed') """,
+			{"to_date": self.future_to_date, "company": self.company},
+		)[0]
 
-		label = get_link_to_report('Sales Order', label=self.meta.get_label("sales_orders_to_deliver"),
+		label = get_link_to_report(
+			"Sales Order",
+			label=self.meta.get_label("sales_orders_to_deliver"),
 			report_type="Report Builder",
 			doctype="Sales Order",
-			filters = {
-				"status": [['!=', "Closed"], ['!=', "Cancelled"], ['!=', "Completed"]],
-				"delivery_status": [['!=', "Fully Delivered"]],
-				"transaction_date": [['<=', self.future_to_date]],
-				"company": self.company
-			}
+			filters={
+				"status": [["!=", "Closed"], ["!=", "Cancelled"], ["!=", "Completed"]],
+				"delivery_status": [["!=", "Fully Delivered"]],
+				"transaction_date": [["<=", self.future_to_date]],
+				"company": self.company,
+			},
 		)
 
-		return {
-			"label": label,
-			"value": value,
-			"count": count
-		}
+		return {"label": label, "value": value, "count": count}
 
 	def get_purchase_orders_to_receive(self):
 		"""Get value not received"""
 
-		value, count = frappe.db.sql("""select ifnull((sum(grand_total))-(sum(grand_total*per_received/100)),0),
+		value, count = frappe.db.sql(
+			"""select ifnull((sum(grand_total))-(sum(grand_total*per_received/100)),0),
                     count(*) from `tabPurchase Order`
 					where (transaction_date <= %(to_date)s) and per_received < 100 and company = %(company)s
-					and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
+					and status not in ('Closed','Cancelled', 'Completed') """,
+			{"to_date": self.future_to_date, "company": self.company},
+		)[0]
 
-		label = get_link_to_report('Purchase Order', label=self.meta.get_label("purchase_orders_to_receive"),
+		label = get_link_to_report(
+			"Purchase Order",
+			label=self.meta.get_label("purchase_orders_to_receive"),
 			report_type="Report Builder",
 			doctype="Purchase Order",
-			filters = {
-				"status": [['!=', "Closed"], ['!=', "Cancelled"], ['!=', "Completed"]],
-				"per_received": [['<', 100]],
-				"transaction_date": [['<=', self.future_to_date]],
-				"company": self.company
-			}
+			filters={
+				"status": [["!=", "Closed"], ["!=", "Cancelled"], ["!=", "Completed"]],
+				"per_received": [["<", 100]],
+				"transaction_date": [["<=", self.future_to_date]],
+				"company": self.company,
+			},
 		)
 
-		return {
-			"label": label,
-			"value": value,
-			"count": count
-		}
+		return {"label": label, "value": value, "count": count}
 
 	def get_purchase_orders_to_bill(self):
 		"""Get purchase not billed"""
 
-		value, count = frappe.db.sql("""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0),
+		value, count = frappe.db.sql(
+			"""select ifnull((sum(grand_total)) - (sum(grand_total*per_billed/100)),0),
                     count(*) from `tabPurchase Order`
 					where (transaction_date <= %(to_date)s) and per_billed < 100 and company = %(company)s
-					and status not in ('Closed','Cancelled', 'Completed') """, {"to_date": self.future_to_date, "company": self.company})[0]
+					and status not in ('Closed','Cancelled', 'Completed') """,
+			{"to_date": self.future_to_date, "company": self.company},
+		)[0]
 
-		label = get_link_to_report('Purchase Order', label=self.meta.get_label("purchase_orders_to_bill"),
+		label = get_link_to_report(
+			"Purchase Order",
+			label=self.meta.get_label("purchase_orders_to_bill"),
 			report_type="Report Builder",
 			doctype="Purchase Order",
-			filters = {
-				"status": [['!=', "Closed"], ['!=', "Cancelled"], ['!=', "Completed"]],
-				"per_received": [['<', 100]],
-				"transaction_date": [['<=', self.future_to_date]],
-				"company": self.company
-			}
+			filters={
+				"status": [["!=", "Closed"], ["!=", "Cancelled"], ["!=", "Completed"]],
+				"per_received": [["<", 100]],
+				"transaction_date": [["<=", self.future_to_date]],
+				"company": self.company,
+			},
 		)
 
-		return {
-			"label": label,
-			"value": value,
-			"count": count
-		}
+		return {"label": label, "value": value, "count": count}
 
 	def get_type_balance(self, fieldname, account_type, root_type=None):
 
 		if root_type:
-			accounts = [d.name for d in \
-				frappe.db.get_all("Account", filters={"account_type": account_type,
-				"company": self.company, "is_group": 0, "root_type": root_type})]
+			accounts = [
+				d.name
+				for d in frappe.db.get_all(
+					"Account",
+					filters={
+						"account_type": account_type,
+						"company": self.company,
+						"is_group": 0,
+						"root_type": root_type,
+					},
+				)
+			]
 		else:
-			accounts = [d.name for d in \
-				frappe.db.get_all("Account", filters={"account_type": account_type,
-				"company": self.company, "is_group": 0})]
+			accounts = [
+				d.name
+				for d in frappe.db.get_all(
+					"Account", filters={"account_type": account_type, "company": self.company, "is_group": 0}
+				)
+			]
 
 		balance = prev_balance = 0.0
 		count = 0
@@ -525,92 +587,99 @@
 			count += get_count_on(account, fieldname, date=self.future_to_date)
 			prev_balance += get_balance_on(account, date=self.past_to_date, in_account_currency=False)
 
-		if fieldname in ("bank_balance","credit_balance"):
+		if fieldname in ("bank_balance", "credit_balance"):
 			label = ""
 			if fieldname == "bank_balance":
 				filters = {
 					"root_type": "Asset",
 					"account_type": "Bank",
 					"report_date": self.future_to_date,
-					"company": self.company
+					"company": self.company,
 				}
-				label = get_link_to_report('Account Balance', label=self.meta.get_label(fieldname), filters=filters)
+				label = get_link_to_report(
+					"Account Balance", label=self.meta.get_label(fieldname), filters=filters
+				)
 			else:
 				filters = {
 					"root_type": "Liability",
 					"account_type": "Bank",
 					"report_date": self.future_to_date,
-					"company": self.company
+					"company": self.company,
 				}
-				label = get_link_to_report('Account Balance', label=self.meta.get_label(fieldname), filters=filters)
+				label = get_link_to_report(
+					"Account Balance", label=self.meta.get_label(fieldname), filters=filters
+				)
 
-			return {
-				'label': label,
-				'value': balance,
-				'last_value': prev_balance
-			}
+			return {"label": label, "value": balance, "last_value": prev_balance}
 		else:
-			if account_type == 'Payable':
-				label = get_link_to_report('Accounts Payable', label=self.meta.get_label(fieldname),
-					filters={
-						"report_date": self.future_to_date,
-						"company": self.company
-					} )
-			elif account_type == 'Receivable':
-				label = get_link_to_report('Accounts Receivable', label=self.meta.get_label(fieldname),
-					filters={
-						"report_date": self.future_to_date,
-						"company": self.company
-					})
+			if account_type == "Payable":
+				label = get_link_to_report(
+					"Accounts Payable",
+					label=self.meta.get_label(fieldname),
+					filters={"report_date": self.future_to_date, "company": self.company},
+				)
+			elif account_type == "Receivable":
+				label = get_link_to_report(
+					"Accounts Receivable",
+					label=self.meta.get_label(fieldname),
+					filters={"report_date": self.future_to_date, "company": self.company},
+				)
 			else:
 				label = self.meta.get_label(fieldname)
 
-			return {
-				'label': label,
-				'value': balance,
-				'last_value': prev_balance,
-				'count': count
-			}
+			return {"label": label, "value": balance, "last_value": prev_balance, "count": count}
 
 	def get_roots(self, root_type):
-		return [d.name for d in frappe.db.get_all("Account",
-			filters={"root_type": root_type.title(), "company": self.company,
-				"is_group": 1, "parent_account": ["in", ("", None)]})]
+		return [
+			d.name
+			for d in frappe.db.get_all(
+				"Account",
+				filters={
+					"root_type": root_type.title(),
+					"company": self.company,
+					"is_group": 1,
+					"parent_account": ["in", ("", None)],
+				},
+			)
+		]
 
 	def get_root_type_accounts(self, root_type):
 		if not root_type in self._accounts:
-			self._accounts[root_type] = [d.name for d in \
-				frappe.db.get_all("Account", filters={"root_type": root_type.title(),
-					"company": self.company, "is_group": 0})]
+			self._accounts[root_type] = [
+				d.name
+				for d in frappe.db.get_all(
+					"Account", filters={"root_type": root_type.title(), "company": self.company, "is_group": 0}
+				)
+			]
 		return self._accounts[root_type]
 
 	def get_purchase_order(self):
 
-		return self.get_summary_of_doc("Purchase Order","purchase_order")
+		return self.get_summary_of_doc("Purchase Order", "purchase_order")
 
 	def get_sales_order(self):
 
-		return self.get_summary_of_doc("Sales Order","sales_order")
+		return self.get_summary_of_doc("Sales Order", "sales_order")
 
 	def get_pending_purchase_orders(self):
 
-		return self.get_summary_of_pending("Purchase Order","pending_purchase_orders","per_received")
+		return self.get_summary_of_pending("Purchase Order", "pending_purchase_orders", "per_received")
 
 	def get_pending_sales_orders(self):
 
-		return self.get_summary_of_pending("Sales Order","pending_sales_orders","per_delivered")
+		return self.get_summary_of_pending("Sales Order", "pending_sales_orders", "per_delivered")
 
 	def get_sales_invoice(self):
 
-		return self.get_summary_of_doc("Sales Invoice","sales_invoice")
+		return self.get_summary_of_doc("Sales Invoice", "sales_invoice")
 
 	def get_purchase_invoice(self):
 
-		return self.get_summary_of_doc("Purchase Invoice","purchase_invoice")
+		return self.get_summary_of_doc("Purchase Invoice", "purchase_invoice")
 
 	def get_new_quotations(self):
 
-		return self.get_summary_of_doc("Quotation","new_quotations")
+		return self.get_summary_of_doc("Quotation", "new_quotations")
 
 	def get_pending_quotations(self):
 
@@ -618,89 +687,104 @@
 
 	def get_summary_of_pending(self, doc_type, fieldname, getfield):
 
-		value, count, billed_value, delivered_value = frappe.db.sql("""select ifnull(sum(grand_total),0), count(*),
+		value, count, billed_value, delivered_value = frappe.db.sql(
+			"""select ifnull(sum(grand_total),0), count(*),
 			ifnull(sum(grand_total*per_billed/100),0), ifnull(sum(grand_total*{0}/100),0)  from `tab{1}`
 			where (transaction_date <= %(to_date)s)
 			and status not in ('Closed','Cancelled', 'Completed')
-			and company = %(company)s """.format(getfield, doc_type),
-			{"to_date": self.future_to_date, "company": self.company})[0]
+			and company = %(company)s """.format(
+				getfield, doc_type
+			),
+			{"to_date": self.future_to_date, "company": self.company},
+		)[0]
 
 		return {
 			"label": self.meta.get_label(fieldname),
 			"value": value,
 			"billed_value": billed_value,
 			"delivered_value": delivered_value,
-			"count": count
+			"count": count,
 		}
 
 	def get_summary_of_pending_quotations(self, fieldname):
 
-		value, count = frappe.db.sql("""select ifnull(sum(grand_total),0), count(*) from `tabQuotation`
+		value, count = frappe.db.sql(
+			"""select ifnull(sum(grand_total),0), count(*) from `tabQuotation`
 			where (transaction_date <= %(to_date)s)
 			and company = %(company)s
-			and status not in ('Ordered','Cancelled', 'Lost') """,{"to_date": self.future_to_date, "company": self.company})[0]
+			and status not in ('Ordered','Cancelled', 'Lost') """,
+			{"to_date": self.future_to_date, "company": self.company},
+		)[0]
 
-		last_value = frappe.db.sql("""select ifnull(sum(grand_total),0) from `tabQuotation`
+		last_value = frappe.db.sql(
+			"""select ifnull(sum(grand_total),0) from `tabQuotation`
 			where (transaction_date <= %(to_date)s)
 			and company = %(company)s
-			and status not in ('Ordered','Cancelled', 'Lost') """,{"to_date": self.past_to_date, "company": self.company})[0][0]
+			and status not in ('Ordered','Cancelled', 'Lost') """,
+			{"to_date": self.past_to_date, "company": self.company},
+		)[0][0]
 
-		label = get_link_to_report('Quotation', label=self.meta.get_label(fieldname),
+		label = get_link_to_report(
+			"Quotation",
+			label=self.meta.get_label(fieldname),
 			report_type="Report Builder",
 			doctype="Quotation",
-			filters = {
-				"status": [['!=', "Ordered"], ['!=', "Cancelled"], ['!=', "Lost"]],
-				"per_received": [['<', 100]],
-				"transaction_date": [['<=', self.future_to_date]],
-				"company": self.company
-			}
+			filters={
+				"status": [["!=", "Ordered"], ["!=", "Cancelled"], ["!=", "Lost"]],
+				"per_received": [["<", 100]],
+				"transaction_date": [["<=", self.future_to_date]],
+				"company": self.company,
+			},
 		)
 
-		return {
-			"label": label,
-			"value": value,
-			"last_value": last_value,
-			"count": count
-		}
+		return {"label": label, "value": value, "last_value": last_value, "count": count}
 
 	def get_summary_of_doc(self, doc_type, fieldname):
 
-		date_field = 'posting_date' if doc_type in ['Sales Invoice', 'Purchase Invoice'] \
-			else 'transaction_date'
+		date_field = (
+			"posting_date" if doc_type in ["Sales Invoice", "Purchase Invoice"] else "transaction_date"
+		)
 
-		value = flt(self.get_total_on(doc_type, self.future_from_date, self.future_to_date)[0].grand_total)
+		value = flt(
+			self.get_total_on(doc_type, self.future_from_date, self.future_to_date)[0].grand_total
+		)
 		count = self.get_total_on(doc_type, self.future_from_date, self.future_to_date)[0].count
 
-		last_value = flt(self.get_total_on(doc_type, self.past_from_date, self.past_to_date)[0].grand_total)
+		last_value = flt(
+			self.get_total_on(doc_type, self.past_from_date, self.past_to_date)[0].grand_total
+		)
 
 		filters = {
-			date_field: [['>=', self.future_from_date], ['<=', self.future_to_date]],
-			"status": [['!=','Cancelled']],
-			"company": self.company
+			date_field: [[">=", self.future_from_date], ["<=", self.future_to_date]],
+			"status": [["!=", "Cancelled"]],
+			"company": self.company,
 		}
 
-		label = get_link_to_report(doc_type,label=self.meta.get_label(fieldname),
-			report_type="Report Builder", filters=filters, doctype=doc_type)
+		label = get_link_to_report(
+			doc_type,
+			label=self.meta.get_label(fieldname),
+			report_type="Report Builder",
+			filters=filters,
+			doctype=doc_type,
+		)
 
-		return {
-			"label": label,
-			"value": value,
-			"last_value": last_value,
-			"count": count
-		}
+		return {"label": label, "value": value, "last_value": last_value, "count": count}
 
 	def get_total_on(self, doc_type, from_date, to_date):
 
-		date_field = 'posting_date' if doc_type in ['Sales Invoice', 'Purchase Invoice'] \
-			else 'transaction_date'
+		date_field = (
+			"posting_date" if doc_type in ["Sales Invoice", "Purchase Invoice"] else "transaction_date"
+		)
 
-		return frappe.get_all(doc_type,
+		return frappe.get_all(
+			doc_type,
 			filters={
-				date_field: ['between', (from_date, to_date)],
-				'status': ['not in', ('Cancelled')],
-				'company': self.company
+				date_field: ["between", (from_date, to_date)],
+				"status": ["not in", ("Cancelled")],
+				"company": self.company,
 			},
-			fields=['count(*) as count', 'sum(grand_total) as grand_total'])
+			fields=["count(*) as count", "sum(grand_total) as grand_total"],
+		)
 
 	def get_from_to_date(self):
 		today = now_datetime().date()
@@ -717,7 +801,7 @@
 			to_date = from_date + timedelta(days=6)
 		else:
 			# from date is the 1st day of the previous month
-			from_date = today - relativedelta(days=today.day-1, months=1)
+			from_date = today - relativedelta(days=today.day - 1, months=1)
 			# to date is the last day of the previous month
 			to_date = today - relativedelta(days=today.day)
 
@@ -728,7 +812,7 @@
 
 		# decide from date based on email digest frequency
 		if self.frequency == "Daily":
-			self.past_from_date = self.past_to_date = self.future_from_date - relativedelta(days = 1)
+			self.past_from_date = self.past_to_date = self.future_from_date - relativedelta(days=1)
 
 		elif self.frequency == "Weekly":
 			self.past_from_date = self.future_from_date - relativedelta(weeks=1)
@@ -755,27 +839,33 @@
 	def onload(self):
 		self.get_next_sending()
 
-	def fmt_money(self, value,absol=True):
+	def fmt_money(self, value, absol=True):
 		if absol:
-			return fmt_money(abs(value), currency = self.currency)
+			return fmt_money(abs(value), currency=self.currency)
 		else:
 			return fmt_money(value, currency=self.currency)
 
 	def get_purchase_orders_items_overdue_list(self):
 		fields_po = "distinct `tabPurchase Order Item`.parent as po"
-		fields_poi = "`tabPurchase Order Item`.parent, `tabPurchase Order Item`.schedule_date, item_code," \
-		             "received_qty, qty - received_qty as missing_qty, rate, amount"
+		fields_poi = (
+			"`tabPurchase Order Item`.parent, `tabPurchase Order Item`.schedule_date, item_code,"
+			"received_qty, qty - received_qty as missing_qty, rate, amount"
+		)
 
 		sql_po = """select {fields} from `tabPurchase Order Item`
 			left join `tabPurchase Order` on `tabPurchase Order`.name = `tabPurchase Order Item`.parent
 			where status<>'Closed' and `tabPurchase Order Item`.docstatus=1 and curdate() > `tabPurchase Order Item`.schedule_date
 			and received_qty < qty order by `tabPurchase Order Item`.parent DESC,
-			`tabPurchase Order Item`.schedule_date DESC""".format(fields=fields_po)
+			`tabPurchase Order Item`.schedule_date DESC""".format(
+			fields=fields_po
+		)
 
 		sql_poi = """select {fields} from `tabPurchase Order Item`
 			left join `tabPurchase Order` on `tabPurchase Order`.name = `tabPurchase Order Item`.parent
 			where status<>'Closed' and `tabPurchase Order Item`.docstatus=1 and curdate() > `tabPurchase Order Item`.schedule_date
-			and received_qty < qty order by `tabPurchase Order Item`.idx""".format(fields=fields_poi)
+			and received_qty < qty order by `tabPurchase Order Item`.idx""".format(
+			fields=fields_poi
+		)
 		purchase_order_list = frappe.db.sql(sql_po, as_dict=True)
 		purchase_order_items_overdue_list = frappe.db.sql(sql_poi, as_dict=True)
 
@@ -785,37 +875,44 @@
 			t.amount = fmt_money(t.amount, 2, t.currency)
 		return purchase_order_list, purchase_order_items_overdue_list
 
+
 def send():
 	now_date = now_datetime().date()
 
-	for ed in frappe.db.sql("""select name from `tabEmail Digest`
-			where enabled=1 and docstatus<2""", as_list=1):
-		ed_obj = frappe.get_doc('Email Digest', ed[0])
-		if (now_date == ed_obj.get_next_sending()):
+	for ed in frappe.db.sql(
+		"""select name from `tabEmail Digest`
+			where enabled=1 and docstatus<2""",
+		as_list=1,
+	):
+		ed_obj = frappe.get_doc("Email Digest", ed[0])
+		if now_date == ed_obj.get_next_sending():
 			ed_obj.send()
 
+
 @frappe.whitelist()
 def get_digest_msg(name):
 	return frappe.get_doc("Email Digest", name).get_msg_html()
 
+
 def get_incomes_expenses_for_period(account, from_date, to_date):
-		"""Get amounts for current and past periods"""
+	"""Get amounts for current and past periods"""
 
-		val = 0.0
-		balance_on_to_date = get_balance_on(account, date = to_date)
-		balance_before_from_date = get_balance_on(account, date = from_date - timedelta(days=1))
+	val = 0.0
+	balance_on_to_date = get_balance_on(account, date=to_date)
+	balance_before_from_date = get_balance_on(account, date=from_date - timedelta(days=1))
 
-		fy_start_date = get_fiscal_year(to_date)[1]
+	fy_start_date = get_fiscal_year(to_date)[1]
 
-		if from_date == fy_start_date:
-			val = balance_on_to_date
-		elif from_date > fy_start_date:
-			val = balance_on_to_date - balance_before_from_date
-		else:
-			last_year_closing_balance = get_balance_on(account, date=fy_start_date - timedelta(days=1))
-			val = balance_on_to_date + (last_year_closing_balance - balance_before_from_date)
+	if from_date == fy_start_date:
+		val = balance_on_to_date
+	elif from_date > fy_start_date:
+		val = balance_on_to_date - balance_before_from_date
+	else:
+		last_year_closing_balance = get_balance_on(account, date=fy_start_date - timedelta(days=1))
+		val = balance_on_to_date + (last_year_closing_balance - balance_before_from_date)
 
-		return val
+	return val
+
 
 def get_count_for_period(account, fieldname, from_date, to_date):
 	count = 0.0
@@ -833,6 +930,7 @@
 
 	return count
 
+
 def get_future_date_for_calendaer_event(frequency):
 	from_date = to_date = today()
 
diff --git a/erpnext/setup/doctype/email_digest/quotes.py b/erpnext/setup/doctype/email_digest/quotes.py
index fbd2d94..8c077a5 100644
--- a/erpnext/setup/doctype/email_digest/quotes.py
+++ b/erpnext/setup/doctype/email_digest/quotes.py
@@ -3,31 +3,63 @@
 
 def get_random_quote():
 	quotes = [
-		("Start by doing what's necessary; then do what's possible; and suddenly you are doing the impossible.", "Francis of Assisi"),
-		("The best and most beautiful things in the world cannot be seen or even touched - they must be felt with the heart.", "Hellen Keller"),
-		("I can't change the direction of the wind, but I can adjust my sails to always reach my destination.", "Jimmy Dean"),
+		(
+			"Start by doing what's necessary; then do what's possible; and suddenly you are doing the impossible.",
+			"Francis of Assisi",
+		),
+		(
+			"The best and most beautiful things in the world cannot be seen or even touched - they must be felt with the heart.",
+			"Hellen Keller",
+		),
+		(
+			"I can't change the direction of the wind, but I can adjust my sails to always reach my destination.",
+			"Jimmy Dean",
+		),
 		("We know what we are, but know not what we may be.", "William Shakespeare"),
-		("There are only two mistakes one can make along the road to truth; not going all the way, and not starting.", "Buddha"),
+		(
+			"There are only two mistakes one can make along the road to truth; not going all the way, and not starting.",
+			"Buddha",
+		),
 		("Always remember that you are absolutely unique. Just like everyone else.", "Margaret Mead"),
-		("You have to learn the rules of the game. And then you have to play better than anyone else.", "Albert Einstein"),
+		(
+			"You have to learn the rules of the game. And then you have to play better than anyone else.",
+			"Albert Einstein",
+		),
 		("Once we accept our limits, we go beyond them.", "Albert Einstein"),
 		("Quality is not an act, it is a habit.", "Aristotle"),
-		("The more that you read, the more things you will know. The more that you learn, the more places you'll go.", "Dr. Seuss"),
+		(
+			"The more that you read, the more things you will know. The more that you learn, the more places you'll go.",
+			"Dr. Seuss",
+		),
 		("From there to here, and here to there, funny things are everywhere.", "Dr. Seuss"),
 		("The secret of getting ahead is getting started.", "Mark Twain"),
 		("All generalizations are false, including this one.", "Mark Twain"),
 		("Don't let schooling interfere with your education.", "Mark Twain"),
 		("Cauliflower is nothing but cabbage with a college education.", "Mark Twain"),
-		("It's not the size of the dog in the fight, it's the size of the fight in the dog.", "Mark Twain"),
+		(
+			"It's not the size of the dog in the fight, it's the size of the fight in the dog.",
+			"Mark Twain",
+		),
 		("Climate is what we expect, weather is what we get.", "Mark Twain"),
 		("There are lies, damned lies and statistics.", "Mark Twain"),
-		("Happiness is when what you think, what you say, and what you do are in harmony.", "Mahatma Gandhi"),
-		("First they ignore you, then they laugh at you, then they fight you, then you win.", "Mahatma Gandhi"),
+		(
+			"Happiness is when what you think, what you say, and what you do are in harmony.",
+			"Mahatma Gandhi",
+		),
+		(
+			"First they ignore you, then they laugh at you, then they fight you, then you win.",
+			"Mahatma Gandhi",
+		),
 		("There is more to life than increasing its speed.", "Mahatma Gandhi"),
-		("A small body of determined spirits fired by an unquenchable faith in their mission can alter the course of history.", "Mahatma Gandhi"),
+		(
+			"A small body of determined spirits fired by an unquenchable faith in their mission can alter the course of history.",
+			"Mahatma Gandhi",
+		),
 		("If two wrongs don't make a right, try three.", "Laurence J. Peter"),
 		("Inspiration exists, but it has to find you working.", "Pablo Picasso"),
-		("The world’s first speeding ticket was given to a man going 4 times the speed limit! Walter Arnold was traveling at a breakneck 8 miles an hour in a 2mph zone, and was caught by a policeman on bicycle and fined one shilling!"),
+		(
+			"The world’s first speeding ticket was given to a man going 4 times the speed limit! Walter Arnold was traveling at a breakneck 8 miles an hour in a 2mph zone, and was caught by a policeman on bicycle and fined one shilling!"
+		),
 	]
 
 	return random.choice(quotes)
diff --git a/erpnext/setup/doctype/email_digest/test_email_digest.py b/erpnext/setup/doctype/email_digest/test_email_digest.py
index 3fdf168..dae28b8 100644
--- a/erpnext/setup/doctype/email_digest/test_email_digest.py
+++ b/erpnext/setup/doctype/email_digest/test_email_digest.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Email Digest')
 
+
 class TestEmailDigest(unittest.TestCase):
 	pass
diff --git a/erpnext/setup/doctype/global_defaults/global_defaults.py b/erpnext/setup/doctype/global_defaults/global_defaults.py
index f0b720a..984bab4 100644
--- a/erpnext/setup/doctype/global_defaults/global_defaults.py
+++ b/erpnext/setup/doctype/global_defaults/global_defaults.py
@@ -11,35 +11,37 @@
 keydict = {
 	# "key in defaults": "key in Global Defaults"
 	"fiscal_year": "current_fiscal_year",
-	'company': 'default_company',
-	'currency': 'default_currency',
+	"company": "default_company",
+	"currency": "default_currency",
 	"country": "country",
-	'hide_currency_symbol':'hide_currency_symbol',
-	'account_url':'account_url',
-	'disable_rounded_total': 'disable_rounded_total',
-	'disable_in_words': 'disable_in_words',
+	"hide_currency_symbol": "hide_currency_symbol",
+	"account_url": "account_url",
+	"disable_rounded_total": "disable_rounded_total",
+	"disable_in_words": "disable_in_words",
 }
 
 from frappe.model.document import Document
 
 
 class GlobalDefaults(Document):
-
 	def on_update(self):
 		"""update defaults"""
 		for key in keydict:
-			frappe.db.set_default(key, self.get(keydict[key], ''))
+			frappe.db.set_default(key, self.get(keydict[key], ""))
 
 		# update year start date and year end date from fiscal_year
-		year_start_end_date = frappe.db.sql("""select year_start_date, year_end_date
-			from `tabFiscal Year` where name=%s""", self.current_fiscal_year)
+		year_start_end_date = frappe.db.sql(
+			"""select year_start_date, year_end_date
+			from `tabFiscal Year` where name=%s""",
+			self.current_fiscal_year,
+		)
 		if year_start_end_date:
-			ysd = year_start_end_date[0][0] or ''
-			yed = year_start_end_date[0][1] or ''
+			ysd = year_start_end_date[0][0] or ""
+			yed = year_start_end_date[0][1] or ""
 
 			if ysd and yed:
-				frappe.db.set_default('year_start_date', ysd.strftime('%Y-%m-%d'))
-				frappe.db.set_default('year_end_date', yed.strftime('%Y-%m-%d'))
+				frappe.db.set_default("year_start_date", ysd.strftime("%Y-%m-%d"))
+				frappe.db.set_default("year_end_date", yed.strftime("%Y-%m-%d"))
 
 		# enable default currency
 		if self.default_currency:
@@ -59,21 +61,81 @@
 		self.disable_rounded_total = cint(self.disable_rounded_total)
 
 		# Make property setters to hide rounded total fields
-		for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note",
-			"Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt"):
-			make_property_setter(doctype, "base_rounded_total", "hidden", self.disable_rounded_total, "Check", validate_fields_for_doctype=False)
-			make_property_setter(doctype, "base_rounded_total", "print_hide", 1, "Check", validate_fields_for_doctype=False)
+		for doctype in (
+			"Quotation",
+			"Sales Order",
+			"Sales Invoice",
+			"Delivery Note",
+			"Supplier Quotation",
+			"Purchase Order",
+			"Purchase Invoice",
+			"Purchase Receipt",
+		):
+			make_property_setter(
+				doctype,
+				"base_rounded_total",
+				"hidden",
+				self.disable_rounded_total,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
+			make_property_setter(
+				doctype, "base_rounded_total", "print_hide", 1, "Check", validate_fields_for_doctype=False
+			)
 
-			make_property_setter(doctype, "rounded_total", "hidden", self.disable_rounded_total, "Check", validate_fields_for_doctype=False)
-			make_property_setter(doctype, "rounded_total", "print_hide", self.disable_rounded_total, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype,
+				"rounded_total",
+				"hidden",
+				self.disable_rounded_total,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
+			make_property_setter(
+				doctype,
+				"rounded_total",
+				"print_hide",
+				self.disable_rounded_total,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
 
-			make_property_setter(doctype, "disable_rounded_total", "default", cint(self.disable_rounded_total), "Text", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype,
+				"disable_rounded_total",
+				"default",
+				cint(self.disable_rounded_total),
+				"Text",
+				validate_fields_for_doctype=False,
+			)
 
 	def toggle_in_words(self):
 		self.disable_in_words = cint(self.disable_in_words)
 
 		# Make property setters to hide in words fields
-		for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note",
-				"Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt"):
-			make_property_setter(doctype, "in_words", "hidden", self.disable_in_words, "Check", validate_fields_for_doctype=False)
-			make_property_setter(doctype, "in_words", "print_hide", self.disable_in_words, "Check", validate_fields_for_doctype=False)
+		for doctype in (
+			"Quotation",
+			"Sales Order",
+			"Sales Invoice",
+			"Delivery Note",
+			"Supplier Quotation",
+			"Purchase Order",
+			"Purchase Invoice",
+			"Purchase Receipt",
+		):
+			make_property_setter(
+				doctype,
+				"in_words",
+				"hidden",
+				self.disable_in_words,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
+			make_property_setter(
+				doctype,
+				"in_words",
+				"print_hide",
+				self.disable_in_words,
+				"Check",
+				validate_fields_for_doctype=False,
+			)
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 2c53246..35557a5 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -15,12 +15,12 @@
 
 
 class ItemGroup(NestedSet, WebsiteGenerator):
-	nsm_parent_field = 'parent_item_group'
+	nsm_parent_field = "parent_item_group"
 	website = frappe._dict(
-		condition_field = "show_in_website",
-		template = "templates/generators/item_group.html",
-		no_cache = 1,
-		no_breadcrumbs = 1
+		condition_field="show_in_website",
+		template="templates/generators/item_group.html",
+		no_cache=1,
+		no_breadcrumbs=1,
 	)
 
 	def autoname(self):
@@ -30,8 +30,8 @@
 		super(ItemGroup, self).validate()
 
 		if not self.parent_item_group and not frappe.flags.in_test:
-			if frappe.db.exists("Item Group", _('All Item Groups')):
-				self.parent_item_group = _('All Item Groups')
+			if frappe.db.exists("Item Group", _("All Item Groups")):
+				self.parent_item_group = _("All Item Groups")
 
 		self.make_route()
 		self.validate_item_group_defaults()
@@ -43,15 +43,15 @@
 		self.delete_child_item_groups_key()
 
 	def make_route(self):
-		'''Make website route'''
+		"""Make website route"""
 		if not self.route:
-			self.route = ''
+			self.route = ""
 			if self.parent_item_group:
-				parent_item_group = frappe.get_doc('Item Group', self.parent_item_group)
+				parent_item_group = frappe.get_doc("Item Group", self.parent_item_group)
 
 				# make parent route only if not root
 				if parent_item_group.parent_item_group and parent_item_group.route:
-					self.route = parent_item_group.route + '/'
+					self.route = parent_item_group.route + "/"
 
 			self.route += self.scrub(self.item_group_name)
 
@@ -65,28 +65,22 @@
 	def get_context(self, context):
 		context.show_search = True
 		context.body_class = "product-page"
-		context.page_length = cint(frappe.db.get_single_value('E Commerce Settings', 'products_per_page')) or 6
-		context.search_link = '/product_search'
+		context.page_length = (
+			cint(frappe.db.get_single_value("E Commerce Settings", "products_per_page")) or 6
+		)
+		context.search_link = "/product_search"
 
 		filter_engine = ProductFiltersBuilder(self.name)
 
 		context.field_filters = filter_engine.get_field_filters()
 		context.attribute_filters = filter_engine.get_attribute_filters()
 
-		context.update({
-			"parents": get_parent_item_groups(self.parent_item_group),
-			"title": self.name
-		})
+		context.update({"parents": get_parent_item_groups(self.parent_item_group), "title": self.name})
 
 		if self.slideshow:
-			values = {
-				'show_indicators': 1,
-				'show_controls': 0,
-				'rounded': 1,
-				'slider_name': self.slideshow
-			}
+			values = {"show_indicators": 1, "show_controls": 0, "rounded": 1, "slider_name": self.slideshow}
 			slideshow = frappe.get_doc("Website Slideshow", self.slideshow)
-			slides = slideshow.get({"doctype":"Website Slideshow Item"})
+			slides = slideshow.get({"doctype": "Website Slideshow Item"})
 			for index, slide in enumerate(slides):
 				values[f"slide_{index + 1}_image"] = slide.image
 				values[f"slide_{index + 1}_title"] = slide.heading
@@ -109,68 +103,64 @@
 
 	def validate_item_group_defaults(self):
 		from erpnext.stock.doctype.item.item import validate_item_default_company_links
+
 		validate_item_default_company_links(self.item_group_defaults)
 
+
 def get_child_groups_for_website(item_group_name, immediate=False, include_self=False):
 	"""Returns child item groups *excluding* passed group."""
 	item_group = frappe.get_cached_value("Item Group", item_group_name, ["lft", "rgt"], as_dict=1)
-	filters = {
-		"lft": [">", item_group.lft],
-		"rgt": ["<", item_group.rgt],
-		"show_in_website": 1
-	}
+	filters = {"lft": [">", item_group.lft], "rgt": ["<", item_group.rgt], "show_in_website": 1}
 
 	if immediate:
 		filters["parent_item_group"] = item_group_name
 
 	if include_self:
-		filters.update({
-			"lft": [">=", item_group.lft],
-			"rgt": ["<=", item_group.rgt]
-		})
+		filters.update({"lft": [">=", item_group.lft], "rgt": ["<=", item_group.rgt]})
 
-	return frappe.get_all(
-		"Item Group",
-		filters=filters,
-		fields=["name", "route"],
-		order_by="name"
-	)
+	return frappe.get_all("Item Group", filters=filters, fields=["name", "route"], order_by="name")
+
 
 def get_child_item_groups(item_group_name):
-	item_group = frappe.get_cached_value("Item Group",
-		item_group_name, ["lft", "rgt"], as_dict=1)
+	item_group = frappe.get_cached_value("Item Group", item_group_name, ["lft", "rgt"], as_dict=1)
 
-	child_item_groups = [d.name for d in frappe.get_all('Item Group',
-		filters= {'lft': ('>=', item_group.lft),'rgt': ('<=', item_group.rgt)})]
+	child_item_groups = [
+		d.name
+		for d in frappe.get_all(
+			"Item Group", filters={"lft": (">=", item_group.lft), "rgt": ("<=", item_group.rgt)}
+		)
+	]
 
 	return child_item_groups or {}
 
+
 def get_item_for_list_in_html(context):
 	# add missing absolute link in files
 	# user may forget it during upload
 	if (context.get("website_image") or "").startswith("files/"):
 		context["website_image"] = "/" + quote(context["website_image"])
 
-	context["show_availability_status"] = cint(frappe.db.get_single_value('E Commerce Settings',
-		'show_availability_status'))
+	context["show_availability_status"] = cint(
+		frappe.db.get_single_value("E Commerce Settings", "show_availability_status")
+	)
 
-	products_template = 'templates/includes/products_as_list.html'
+	products_template = "templates/includes/products_as_list.html"
 
 	return frappe.get_template(products_template).render(context)
 
 
 def get_parent_item_groups(item_group_name, from_item=False):
-	base_nav_page = {"name": _("Shop by Category"), "route":"/shop-by-category"}
+	base_nav_page = {"name": _("Shop by Category"), "route": "/shop-by-category"}
 
 	if from_item and frappe.request.environ.get("HTTP_REFERER"):
 		# base page after 'Home' will vary on Item page
-		last_page = frappe.request.environ["HTTP_REFERER"].split('/')[-1]
+		last_page = frappe.request.environ["HTTP_REFERER"].split("/")[-1]
 		if last_page and last_page in ("shop-by-category", "all-products"):
 			base_nav_page_title = " ".join(last_page.split("-")).title()
-			base_nav_page = {"name": _(base_nav_page_title), "route":"/"+last_page}
+			base_nav_page = {"name": _(base_nav_page_title), "route": "/" + last_page}
 
 	base_parents = [
-		{"name": _("Home"), "route":"/"},
+		{"name": _("Home"), "route": "/"},
 		base_nav_page,
 	]
 
@@ -178,21 +168,27 @@
 		return base_parents
 
 	item_group = frappe.db.get_value("Item Group", item_group_name, ["lft", "rgt"], as_dict=1)
-	parent_groups = frappe.db.sql("""select name, route from `tabItem Group`
+	parent_groups = frappe.db.sql(
+		"""select name, route from `tabItem Group`
 		where lft <= %s and rgt >= %s
 		and show_in_website=1
-		order by lft asc""", (item_group.lft, item_group.rgt), as_dict=True)
+		order by lft asc""",
+		(item_group.lft, item_group.rgt),
+		as_dict=True,
+	)
 
 	return base_parents + parent_groups
 
+
 def invalidate_cache_for(doc, item_group=None):
 	if not item_group:
 		item_group = doc.name
 
 	for d in get_parent_item_groups(item_group):
-		item_group_name = frappe.db.get_value("Item Group", d.get('name'))
+		item_group_name = frappe.db.get_value("Item Group", d.get("name"))
 		if item_group_name:
-			clear_cache(frappe.db.get_value('Item Group', item_group_name, 'route'))
+			clear_cache(frappe.db.get_value("Item Group", item_group_name, "route"))
+
 
 def get_item_group_defaults(item, company):
 	item = frappe.get_cached_doc("Item", item)
diff --git a/erpnext/setup/doctype/item_group/test_item_group.py b/erpnext/setup/doctype/item_group/test_item_group.py
index f6e9ed4..11bc9b9 100644
--- a/erpnext/setup/doctype/item_group/test_item_group.py
+++ b/erpnext/setup/doctype/item_group/test_item_group.py
@@ -14,7 +14,8 @@
 	rebuild_tree,
 )
 
-test_records = frappe.get_test_records('Item Group')
+test_records = frappe.get_test_records("Item Group")
+
 
 class TestItem(unittest.TestCase):
 	def test_basic_tree(self, records=None):
@@ -25,12 +26,12 @@
 			records = test_records[2:]
 
 		for item_group in records:
-			lft, rgt, parent_item_group = frappe.db.get_value("Item Group", item_group["item_group_name"],
-				["lft", "rgt", "parent_item_group"])
+			lft, rgt, parent_item_group = frappe.db.get_value(
+				"Item Group", item_group["item_group_name"], ["lft", "rgt", "parent_item_group"]
+			)
 
 			if parent_item_group:
-				parent_lft, parent_rgt = frappe.db.get_value("Item Group", parent_item_group,
-					["lft", "rgt"])
+				parent_lft, parent_rgt = frappe.db.get_value("Item Group", parent_item_group, ["lft", "rgt"])
 			else:
 				# root
 				parent_lft = min_lft - 1
@@ -55,8 +56,11 @@
 		def get_no_of_children(item_groups, no_of_children):
 			children = []
 			for ig in item_groups:
-				children += frappe.db.sql_list("""select name from `tabItem Group`
-				where ifnull(parent_item_group, '')=%s""", ig or '')
+				children += frappe.db.sql_list(
+					"""select name from `tabItem Group`
+				where ifnull(parent_item_group, '')=%s""",
+					ig or "",
+				)
 
 			if len(children):
 				return get_no_of_children(children, no_of_children + len(children))
@@ -119,7 +123,10 @@
 
 	def print_tree(self):
 		import json
-		print(json.dumps(frappe.db.sql("select name, lft, rgt from `tabItem Group` order by lft"), indent=1))
+
+		print(
+			json.dumps(frappe.db.sql("select name, lft, rgt from `tabItem Group` order by lft"), indent=1)
+		)
 
 	def test_move_leaf_into_another_group(self):
 		# before move
@@ -149,12 +156,20 @@
 
 	def test_delete_leaf(self):
 		# for checking later
-		parent_item_group = frappe.db.get_value("Item Group", "_Test Item Group B - 3", "parent_item_group")
+		parent_item_group = frappe.db.get_value(
+			"Item Group", "_Test Item Group B - 3", "parent_item_group"
+		)
 		rgt = frappe.db.get_value("Item Group", parent_item_group, "rgt")
 
 		ancestors = get_ancestors_of("Item Group", "_Test Item Group B - 3")
-		ancestors = frappe.db.sql("""select name, rgt from `tabItem Group`
-			where name in ({})""".format(", ".join(["%s"]*len(ancestors))), tuple(ancestors), as_dict=True)
+		ancestors = frappe.db.sql(
+			"""select name, rgt from `tabItem Group`
+			where name in ({})""".format(
+				", ".join(["%s"] * len(ancestors))
+			),
+			tuple(ancestors),
+			as_dict=True,
+		)
 
 		frappe.delete_doc("Item Group", "_Test Item Group B - 3")
 		records_to_test = test_records[2:]
@@ -173,7 +188,9 @@
 
 	def test_delete_group(self):
 		# cannot delete group with child, but can delete leaf
-		self.assertRaises(NestedSetChildExistsError, frappe.delete_doc, "Item Group", "_Test Item Group B")
+		self.assertRaises(
+			NestedSetChildExistsError, frappe.delete_doc, "Item Group", "_Test Item Group B"
+		)
 
 	def test_merge_groups(self):
 		frappe.rename_doc("Item Group", "_Test Item Group B", "_Test Item Group C", merge=True)
@@ -186,8 +203,10 @@
 		self.test_basic_tree()
 
 		# move its children back
-		for name in frappe.db.sql_list("""select name from `tabItem Group`
-			where parent_item_group='_Test Item Group C'"""):
+		for name in frappe.db.sql_list(
+			"""select name from `tabItem Group`
+			where parent_item_group='_Test Item Group C'"""
+		):
 
 			doc = frappe.get_doc("Item Group", name)
 			doc.parent_item_group = "_Test Item Group B"
@@ -206,9 +225,21 @@
 		self.test_basic_tree()
 
 	def test_merge_leaf_into_group(self):
-		self.assertRaises(NestedSetInvalidMergeError, frappe.rename_doc, "Item Group", "_Test Item Group B - 3",
-			"_Test Item Group B", merge=True)
+		self.assertRaises(
+			NestedSetInvalidMergeError,
+			frappe.rename_doc,
+			"Item Group",
+			"_Test Item Group B - 3",
+			"_Test Item Group B",
+			merge=True,
+		)
 
 	def test_merge_group_into_leaf(self):
-		self.assertRaises(NestedSetInvalidMergeError, frappe.rename_doc, "Item Group", "_Test Item Group B",
-			"_Test Item Group B - 3", merge=True)
+		self.assertRaises(
+			NestedSetInvalidMergeError,
+			frappe.rename_doc,
+			"Item Group",
+			"_Test Item Group B",
+			"_Test Item Group B - 3",
+			merge=True,
+		)
diff --git a/erpnext/setup/doctype/naming_series/naming_series.py b/erpnext/setup/doctype/naming_series/naming_series.py
index 986b4e8..4fba776 100644
--- a/erpnext/setup/doctype/naming_series/naming_series.py
+++ b/erpnext/setup/doctype/naming_series/naming_series.py
@@ -11,15 +11,25 @@
 from frappe.utils import cint, cstr
 
 
-class NamingSeriesNotSetError(frappe.ValidationError): pass
+class NamingSeriesNotSetError(frappe.ValidationError):
+	pass
+
 
 class NamingSeries(Document):
 	@frappe.whitelist()
 	def get_transactions(self, arg=None):
-		doctypes = list(set(frappe.db.sql_list("""select parent
-				from `tabDocField` df where fieldname='naming_series'""")
-			+ frappe.db.sql_list("""select dt from `tabCustom Field`
-				where fieldname='naming_series'""")))
+		doctypes = list(
+			set(
+				frappe.db.sql_list(
+					"""select parent
+				from `tabDocField` df where fieldname='naming_series'"""
+				)
+				+ frappe.db.sql_list(
+					"""select dt from `tabCustom Field`
+				where fieldname='naming_series'"""
+				)
+			)
+		)
 
 		doctypes = list(set(get_doctypes_with_read()).intersection(set(doctypes)))
 		prefixes = ""
@@ -28,8 +38,8 @@
 			try:
 				options = self.get_options(d)
 			except frappe.DoesNotExistError:
-				frappe.msgprint(_('Unable to find DocType {0}').format(d))
-				#frappe.pass_does_not_exist_error()
+				frappe.msgprint(_("Unable to find DocType {0}").format(d))
+				# frappe.pass_does_not_exist_error()
 				continue
 
 			if options:
@@ -37,17 +47,21 @@
 		prefixes.replace("\n\n", "\n")
 		prefixes = prefixes.split("\n")
 
-		custom_prefixes = frappe.get_all('DocType', fields=["autoname"],
-			filters={"name": ('not in', doctypes), "autoname":('like', '%.#%'), 'module': ('not in', ['Core'])})
+		custom_prefixes = frappe.get_all(
+			"DocType",
+			fields=["autoname"],
+			filters={
+				"name": ("not in", doctypes),
+				"autoname": ("like", "%.#%"),
+				"module": ("not in", ["Core"]),
+			},
+		)
 		if custom_prefixes:
-			prefixes = prefixes + [d.autoname.rsplit('.', 1)[0] for d in custom_prefixes]
+			prefixes = prefixes + [d.autoname.rsplit(".", 1)[0] for d in custom_prefixes]
 
 		prefixes = "\n".join(sorted(prefixes))
 
-		return {
-			"transactions": "\n".join([''] + sorted(doctypes)),
-			"prefixes": prefixes
-		}
+		return {"transactions": "\n".join([""] + sorted(doctypes)), "prefixes": prefixes}
 
 	def scrub_options_list(self, ol):
 		options = list(filter(lambda x: x, [cstr(n).strip() for n in ol]))
@@ -64,7 +78,7 @@
 		self.set_series_for(self.select_doc_for_series, series_list)
 
 		# create series
-		map(self.insert_series, [d.split('.')[0] for d in series_list if d.strip()])
+		map(self.insert_series, [d.split(".")[0] for d in series_list if d.strip()])
 
 		msgprint(_("Series Updated"))
 
@@ -82,32 +96,35 @@
 			self.validate_series_name(i)
 
 		if options and self.user_must_always_select:
-			options = [''] + options
+			options = [""] + options
 
-		default = options[0] if options else ''
+		default = options[0] if options else ""
 
 		# update in property setter
-		prop_dict = {'options': "\n".join(options), 'default': default}
+		prop_dict = {"options": "\n".join(options), "default": default}
 
 		for prop in prop_dict:
-			ps_exists = frappe.db.get_value("Property Setter",
-				{"field_name": 'naming_series', 'doc_type': doctype, 'property': prop})
+			ps_exists = frappe.db.get_value(
+				"Property Setter", {"field_name": "naming_series", "doc_type": doctype, "property": prop}
+			)
 
 			if ps_exists:
-				ps = frappe.get_doc('Property Setter', ps_exists)
+				ps = frappe.get_doc("Property Setter", ps_exists)
 				ps.value = prop_dict[prop]
 				ps.save()
 			else:
-				ps = frappe.get_doc({
-					'doctype': 'Property Setter',
-					'doctype_or_field': 'DocField',
-					'doc_type': doctype,
-					'field_name': 'naming_series',
-					'property': prop,
-					'value': prop_dict[prop],
-					'property_type': 'Text',
-					'__islocal': 1
-				})
+				ps = frappe.get_doc(
+					{
+						"doctype": "Property Setter",
+						"doctype_or_field": "DocField",
+						"doc_type": doctype,
+						"field_name": "naming_series",
+						"property": prop,
+						"value": prop_dict[prop],
+						"property_type": "Text",
+						"__islocal": 1,
+					}
+				)
 				ps.save()
 
 		self.set_options = "\n".join(options)
@@ -115,16 +132,22 @@
 		frappe.clear_cache(doctype=doctype)
 
 	def check_duplicate(self):
-		parent = list(set(
-			frappe.db.sql_list("""select dt.name
+		parent = list(
+			set(
+				frappe.db.sql_list(
+					"""select dt.name
 				from `tabDocField` df, `tabDocType` dt
 				where dt.name = df.parent and df.fieldname='naming_series' and dt.name != %s""",
-				self.select_doc_for_series)
-			+ frappe.db.sql_list("""select dt.name
+					self.select_doc_for_series,
+				)
+				+ frappe.db.sql_list(
+					"""select dt.name
 				from `tabCustom Field` df, `tabDocType` dt
 				where dt.name = df.dt and df.fieldname='naming_series' and dt.name != %s""",
-				self.select_doc_for_series)
-			))
+					self.select_doc_for_series,
+				)
+			)
+		)
 		sr = [[frappe.get_meta(p).get_field("naming_series").options, p] for p in parent]
 		dt = frappe.get_doc("DocType", self.select_doc_for_series)
 		options = self.scrub_options_list(self.set_options.split("\n"))
@@ -132,14 +155,17 @@
 			validate_series(dt, series)
 			for i in sr:
 				if i[0]:
-					existing_series = [d.split('.')[0] for d in i[0].split("\n")]
+					existing_series = [d.split(".")[0] for d in i[0].split("\n")]
 					if series.split(".")[0] in existing_series:
-						frappe.throw(_("Series {0} already used in {1}").format(series,i[1]))
+						frappe.throw(_("Series {0} already used in {1}").format(series, i[1]))
 
 	def validate_series_name(self, n):
 		import re
+
 		if not re.match(r"^[\w\- \/.#{}]+$", n, re.UNICODE):
-			throw(_('Special Characters except "-", "#", ".", "/", "{" and "}" not allowed in naming series'))
+			throw(
+				_('Special Characters except "-", "#", ".", "/", "{" and "}" not allowed in naming series')
+			)
 
 	@frappe.whitelist()
 	def get_options(self, arg=None):
@@ -151,12 +177,11 @@
 		"""get series current"""
 		if self.prefix:
 			prefix = self.parse_naming_series()
-			self.current_value = frappe.db.get_value("Series",
-				prefix, "current", order_by = "name")
+			self.current_value = frappe.db.get_value("Series", prefix, "current", order_by="name")
 
 	def insert_series(self, series):
 		"""insert series if missing"""
-		if frappe.db.get_value('Series', series, 'name', order_by="name") == None:
+		if frappe.db.get_value("Series", series, "name", order_by="name") == None:
 			frappe.db.sql("insert into tabSeries (name, current) values (%s, 0)", (series))
 
 	@frappe.whitelist()
@@ -164,14 +189,15 @@
 		if self.prefix:
 			prefix = self.parse_naming_series()
 			self.insert_series(prefix)
-			frappe.db.sql("update `tabSeries` set current = %s where name = %s",
-				(cint(self.current_value), prefix))
+			frappe.db.sql(
+				"update `tabSeries` set current = %s where name = %s", (cint(self.current_value), prefix)
+			)
 			msgprint(_("Series Updated Successfully"))
 		else:
 			msgprint(_("Please select prefix first"))
 
 	def parse_naming_series(self):
-		parts = self.prefix.split('.')
+		parts = self.prefix.split(".")
 
 		# Remove ### from the end of series
 		if parts[-1] == "#" * len(parts[-1]):
@@ -180,34 +206,59 @@
 		prefix = parse_naming_series(parts)
 		return prefix
 
-def set_by_naming_series(doctype, fieldname, naming_series, hide_name_field=True, make_mandatory=1):
+
+def set_by_naming_series(
+	doctype, fieldname, naming_series, hide_name_field=True, make_mandatory=1
+):
 	from frappe.custom.doctype.property_setter.property_setter import make_property_setter
+
 	if naming_series:
-		make_property_setter(doctype, "naming_series", "hidden", 0, "Check", validate_fields_for_doctype=False)
-		make_property_setter(doctype, "naming_series", "reqd", make_mandatory, "Check", validate_fields_for_doctype=False)
+		make_property_setter(
+			doctype, "naming_series", "hidden", 0, "Check", validate_fields_for_doctype=False
+		)
+		make_property_setter(
+			doctype, "naming_series", "reqd", make_mandatory, "Check", validate_fields_for_doctype=False
+		)
 
 		# set values for mandatory
 		try:
-			frappe.db.sql("""update `tab{doctype}` set naming_series={s} where
-				ifnull(naming_series, '')=''""".format(doctype=doctype, s="%s"),
-				get_default_naming_series(doctype))
+			frappe.db.sql(
+				"""update `tab{doctype}` set naming_series={s} where
+				ifnull(naming_series, '')=''""".format(
+					doctype=doctype, s="%s"
+				),
+				get_default_naming_series(doctype),
+			)
 		except NamingSeriesNotSetError:
 			pass
 
 		if hide_name_field:
 			make_property_setter(doctype, fieldname, "reqd", 0, "Check", validate_fields_for_doctype=False)
-			make_property_setter(doctype, fieldname, "hidden", 1, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype, fieldname, "hidden", 1, "Check", validate_fields_for_doctype=False
+			)
 	else:
-		make_property_setter(doctype, "naming_series", "reqd", 0, "Check", validate_fields_for_doctype=False)
-		make_property_setter(doctype, "naming_series", "hidden", 1, "Check", validate_fields_for_doctype=False)
+		make_property_setter(
+			doctype, "naming_series", "reqd", 0, "Check", validate_fields_for_doctype=False
+		)
+		make_property_setter(
+			doctype, "naming_series", "hidden", 1, "Check", validate_fields_for_doctype=False
+		)
 
 		if hide_name_field:
-			make_property_setter(doctype, fieldname, "hidden", 0, "Check", validate_fields_for_doctype=False)
+			make_property_setter(
+				doctype, fieldname, "hidden", 0, "Check", validate_fields_for_doctype=False
+			)
 			make_property_setter(doctype, fieldname, "reqd", 1, "Check", validate_fields_for_doctype=False)
 
 			# set values for mandatory
-			frappe.db.sql("""update `tab{doctype}` set `{fieldname}`=`name` where
-				ifnull({fieldname}, '')=''""".format(doctype=doctype, fieldname=fieldname))
+			frappe.db.sql(
+				"""update `tab{doctype}` set `{fieldname}`=`name` where
+				ifnull({fieldname}, '')=''""".format(
+					doctype=doctype, fieldname=fieldname
+				)
+			)
+
 
 def get_default_naming_series(doctype):
 	naming_series = frappe.get_meta(doctype).get_field("naming_series").options or ""
@@ -215,7 +266,9 @@
 	out = naming_series[0] or (naming_series[1] if len(naming_series) > 1 else None)
 
 	if not out:
-		frappe.throw(_("Please set Naming Series for {0} via Setup > Settings > Naming Series").format(doctype),
-			NamingSeriesNotSetError)
+		frappe.throw(
+			_("Please set Naming Series for {0} via Setup > Settings > Naming Series").format(doctype),
+			NamingSeriesNotSetError,
+		)
 	else:
 		return out
diff --git a/erpnext/setup/doctype/party_type/party_type.py b/erpnext/setup/doctype/party_type/party_type.py
index d0d2946..d07ab08 100644
--- a/erpnext/setup/doctype/party_type/party_type.py
+++ b/erpnext/setup/doctype/party_type/party_type.py
@@ -9,18 +9,20 @@
 class PartyType(Document):
 	pass
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_party_type(doctype, txt, searchfield, start, page_len, filters):
-	cond = ''
-	if filters and filters.get('account'):
-		account_type = frappe.db.get_value('Account', filters.get('account'), 'account_type')
+	cond = ""
+	if filters and filters.get("account"):
+		account_type = frappe.db.get_value("Account", filters.get("account"), "account_type")
 		cond = "and account_type = '%s'" % account_type
 
-	return frappe.db.sql("""select name from `tabParty Type`
+	return frappe.db.sql(
+		"""select name from `tabParty Type`
 			where `{key}` LIKE %(txt)s {cond}
-			order by name limit %(start)s, %(page_len)s"""
-			.format(key=searchfield, cond=cond), {
-				'txt': '%' + txt + '%',
-				'start': start, 'page_len': page_len
-			})
+			order by name limit %(start)s, %(page_len)s""".format(
+			key=searchfield, cond=cond
+		),
+		{"txt": "%" + txt + "%", "start": start, "page_len": page_len},
+	)
diff --git a/erpnext/setup/doctype/party_type/test_party_type.py b/erpnext/setup/doctype/party_type/test_party_type.py
index a9a3db8..ab92ee1 100644
--- a/erpnext/setup/doctype/party_type/test_party_type.py
+++ b/erpnext/setup/doctype/party_type/test_party_type.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Party Type')
 
+
 class TestPartyType(unittest.TestCase):
 	pass
diff --git a/erpnext/setup/doctype/print_heading/test_print_heading.py b/erpnext/setup/doctype/print_heading/test_print_heading.py
index 04de08d..f0e4c76 100644
--- a/erpnext/setup/doctype/print_heading/test_print_heading.py
+++ b/erpnext/setup/doctype/print_heading/test_print_heading.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Print Heading')
+test_records = frappe.get_test_records("Print Heading")
diff --git a/erpnext/setup/doctype/quotation_lost_reason/test_quotation_lost_reason.py b/erpnext/setup/doctype/quotation_lost_reason/test_quotation_lost_reason.py
index 9330ba8..891864a 100644
--- a/erpnext/setup/doctype/quotation_lost_reason/test_quotation_lost_reason.py
+++ b/erpnext/setup/doctype/quotation_lost_reason/test_quotation_lost_reason.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Quotation Lost Reason')
+test_records = frappe.get_test_records("Quotation Lost Reason")
diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.py b/erpnext/setup/doctype/sales_partner/sales_partner.py
index d2ec49d..c313671 100644
--- a/erpnext/setup/doctype/sales_partner/sales_partner.py
+++ b/erpnext/setup/doctype/sales_partner/sales_partner.py
@@ -10,9 +10,9 @@
 
 class SalesPartner(WebsiteGenerator):
 	website = frappe._dict(
-		page_title_field = "partner_name",
-		condition_field = "show_in_website",
-		template = "templates/generators/sales_partner.html"
+		page_title_field="partner_name",
+		condition_field="show_in_website",
+		template="templates/generators/sales_partner.html",
 	)
 
 	def onload(self):
@@ -30,18 +30,25 @@
 			self.partner_website = "http://" + self.partner_website
 
 	def get_context(self, context):
-		address = frappe.db.get_value("Address",
-			{"sales_partner": self.name, "is_primary_address": 1},
-			"*", as_dict=True)
+		address = frappe.db.get_value(
+			"Address", {"sales_partner": self.name, "is_primary_address": 1}, "*", as_dict=True
+		)
 		if address:
 			city_state = ", ".join(filter(None, [address.city, address.state]))
-			address_rows = [address.address_line1, address.address_line2,
-				city_state, address.pincode, address.country]
+			address_rows = [
+				address.address_line1,
+				address.address_line2,
+				city_state,
+				address.pincode,
+				address.country,
+			]
 
-			context.update({
-				"email": address.email_id,
-				"partner_address": filter_strip_join(address_rows, "\n<br>"),
-				"phone": filter_strip_join(cstr(address.phone).split(","), "\n<br>")
-			})
+			context.update(
+				{
+					"email": address.email_id,
+					"partner_address": filter_strip_join(address_rows, "\n<br>"),
+					"phone": filter_strip_join(cstr(address.phone).split(","), "\n<br>"),
+				}
+			)
 
 		return context
diff --git a/erpnext/setup/doctype/sales_partner/test_sales_partner.py b/erpnext/setup/doctype/sales_partner/test_sales_partner.py
index 80ef368..933f68d 100644
--- a/erpnext/setup/doctype/sales_partner/test_sales_partner.py
+++ b/erpnext/setup/doctype/sales_partner/test_sales_partner.py
@@ -3,6 +3,6 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Sales Partner')
+test_records = frappe.get_test_records("Sales Partner")
 
 test_ignore = ["Item Group"]
diff --git a/erpnext/setup/doctype/sales_person/sales_person.py b/erpnext/setup/doctype/sales_person/sales_person.py
index 6af1b31..0082c70 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.py
+++ b/erpnext/setup/doctype/sales_person/sales_person.py
@@ -11,13 +11,13 @@
 
 
 class SalesPerson(NestedSet):
-	nsm_parent_field = 'parent_sales_person'
+	nsm_parent_field = "parent_sales_person"
 
 	def validate(self):
 		if not self.parent_sales_person:
 			self.parent_sales_person = get_root_of("Sales Person")
 
-		for d in self.get('targets') or []:
+		for d in self.get("targets") or []:
 			if not flt(d.target_qty) and not flt(d.target_amount):
 				frappe.throw(_("Either target qty or target amount is mandatory."))
 		self.validate_employee_id()
@@ -28,20 +28,28 @@
 	def load_dashboard_info(self):
 		company_default_currency = get_default_currency()
 
-		allocated_amount_against_order = flt(frappe.db.get_value('Sales Team',
-			{'docstatus': 1, 'parenttype': 'Sales Order', 'sales_person': self.sales_person_name},
-			'sum(allocated_amount)'))
+		allocated_amount_against_order = flt(
+			frappe.db.get_value(
+				"Sales Team",
+				{"docstatus": 1, "parenttype": "Sales Order", "sales_person": self.sales_person_name},
+				"sum(allocated_amount)",
+			)
+		)
 
-		allocated_amount_against_invoice = flt(frappe.db.get_value('Sales Team',
-			{'docstatus': 1, 'parenttype': 'Sales Invoice', 'sales_person': self.sales_person_name},
-			'sum(allocated_amount)'))
+		allocated_amount_against_invoice = flt(
+			frappe.db.get_value(
+				"Sales Team",
+				{"docstatus": 1, "parenttype": "Sales Invoice", "sales_person": self.sales_person_name},
+				"sum(allocated_amount)",
+			)
+		)
 
 		info = {}
 		info["allocated_amount_against_order"] = allocated_amount_against_order
 		info["allocated_amount_against_invoice"] = allocated_amount_against_invoice
 		info["currency"] = company_default_currency
 
-		self.set_onload('dashboard_info', info)
+		self.set_onload("dashboard_info", info)
 
 	def on_update(self):
 		super(SalesPerson, self).on_update()
@@ -60,30 +68,46 @@
 			sales_person = frappe.db.get_value("Sales Person", {"employee": self.employee})
 
 			if sales_person and sales_person != self.name:
-				frappe.throw(_("Another Sales Person {0} exists with the same Employee id").format(sales_person))
+				frappe.throw(
+					_("Another Sales Person {0} exists with the same Employee id").format(sales_person)
+				)
+
 
 def on_doctype_update():
 	frappe.db.add_index("Sales Person", ["lft", "rgt"])
 
+
 def get_timeline_data(doctype, name):
 
 	out = {}
 
-	out.update(dict(frappe.db.sql('''select
+	out.update(
+		dict(
+			frappe.db.sql(
+				"""select
 			unix_timestamp(dt.transaction_date), count(st.parenttype)
 		from
 			`tabSales Order` dt, `tabSales Team` st
 		where
 			st.sales_person = %s and st.parent = dt.name and dt.transaction_date > date_sub(curdate(), interval 1 year)
-			group by dt.transaction_date ''', name)))
+			group by dt.transaction_date """,
+				name,
+			)
+		)
+	)
 
-	sales_invoice = dict(frappe.db.sql('''select
+	sales_invoice = dict(
+		frappe.db.sql(
+			"""select
 			unix_timestamp(dt.posting_date), count(st.parenttype)
 		from
 			`tabSales Invoice` dt, `tabSales Team` st
 		where
 			st.sales_person = %s and st.parent = dt.name and dt.posting_date > date_sub(curdate(), interval 1 year)
-			group by dt.posting_date ''', name))
+			group by dt.posting_date """,
+			name,
+		)
+	)
 
 	for key in sales_invoice:
 		if out.get(key):
@@ -91,13 +115,18 @@
 		else:
 			out[key] = sales_invoice[key]
 
-	delivery_note = dict(frappe.db.sql('''select
+	delivery_note = dict(
+		frappe.db.sql(
+			"""select
 			unix_timestamp(dt.posting_date), count(st.parenttype)
 		from
 			`tabDelivery Note` dt, `tabSales Team` st
 		where
 			st.sales_person = %s and st.parent = dt.name and dt.posting_date > date_sub(curdate(), interval 1 year)
-			group by dt.posting_date ''', name))
+			group by dt.posting_date """,
+			name,
+		)
+	)
 
 	for key in delivery_note:
 		if out.get(key):
diff --git a/erpnext/setup/doctype/sales_person/sales_person_dashboard.py b/erpnext/setup/doctype/sales_person/sales_person_dashboard.py
index e946406..2ec2002 100644
--- a/erpnext/setup/doctype/sales_person/sales_person_dashboard.py
+++ b/erpnext/setup/doctype/sales_person/sales_person_dashboard.py
@@ -3,13 +3,12 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on transactions against this Sales Person. See timeline below for details'),
-		'fieldname': 'sales_person',
-		'transactions': [
-			{
-				'label': _('Sales'),
-				'items': ['Sales Order', 'Delivery Note', 'Sales Invoice']
-			},
-		]
+		"heatmap": True,
+		"heatmap_message": _(
+			"This is based on transactions against this Sales Person. See timeline below for details"
+		),
+		"fieldname": "sales_person",
+		"transactions": [
+			{"label": _("Sales"), "items": ["Sales Order", "Delivery Note", "Sales Invoice"]},
+		],
 	}
diff --git a/erpnext/setup/doctype/sales_person/test_sales_person.py b/erpnext/setup/doctype/sales_person/test_sales_person.py
index 786d2ca..6ff1888 100644
--- a/erpnext/setup/doctype/sales_person/test_sales_person.py
+++ b/erpnext/setup/doctype/sales_person/test_sales_person.py
@@ -5,6 +5,6 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Sales Person')
+test_records = frappe.get_test_records("Sales Person")
 
 test_ignore = ["Item Group"]
diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.py b/erpnext/setup/doctype/supplier_group/supplier_group.py
index 381e125..9d2b733 100644
--- a/erpnext/setup/doctype/supplier_group/supplier_group.py
+++ b/erpnext/setup/doctype/supplier_group/supplier_group.py
@@ -7,7 +7,7 @@
 
 
 class SupplierGroup(NestedSet):
-	nsm_parent_field = 'parent_supplier_group'
+	nsm_parent_field = "parent_supplier_group"
 
 	def validate(self):
 		if not self.parent_supplier_group:
diff --git a/erpnext/setup/doctype/supplier_group/test_supplier_group.py b/erpnext/setup/doctype/supplier_group/test_supplier_group.py
index 283b3bf..97ba705 100644
--- a/erpnext/setup/doctype/supplier_group/test_supplier_group.py
+++ b/erpnext/setup/doctype/supplier_group/test_supplier_group.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Supplier Group')
+test_records = frappe.get_test_records("Supplier Group")
diff --git a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py
index 658f286..344f6c6 100644
--- a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py
+++ b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py
@@ -15,9 +15,15 @@
 	def validate(self):
 		if self.terms:
 			validate_template(self.terms)
-		if not cint(self.buying) and not cint(self.selling) and not cint(self.hr) and not cint(self.disabled):
+		if (
+			not cint(self.buying)
+			and not cint(self.selling)
+			and not cint(self.hr)
+			and not cint(self.disabled)
+		):
 			throw(_("At least one of the Applicable Modules should be selected"))
 
+
 @frappe.whitelist()
 def get_terms_and_conditions(template_name, doc):
 	if isinstance(doc, str):
diff --git a/erpnext/setup/doctype/terms_and_conditions/test_terms_and_conditions.py b/erpnext/setup/doctype/terms_and_conditions/test_terms_and_conditions.py
index ca9e6c1..171840a 100644
--- a/erpnext/setup/doctype/terms_and_conditions/test_terms_and_conditions.py
+++ b/erpnext/setup/doctype/terms_and_conditions/test_terms_and_conditions.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Terms and Conditions')
+test_records = frappe.get_test_records("Terms and Conditions")
diff --git a/erpnext/setup/doctype/territory/territory.py b/erpnext/setup/doctype/territory/territory.py
index 4c47d82..9bb5569 100644
--- a/erpnext/setup/doctype/territory/territory.py
+++ b/erpnext/setup/doctype/territory/territory.py
@@ -9,13 +9,13 @@
 
 
 class Territory(NestedSet):
-	nsm_parent_field = 'parent_territory'
+	nsm_parent_field = "parent_territory"
 
 	def validate(self):
 		if not self.parent_territory:
 			self.parent_territory = get_root_of("Territory")
 
-		for d in self.get('targets') or []:
+		for d in self.get("targets") or []:
 			if not flt(d.target_qty) and not flt(d.target_amount):
 				frappe.throw(_("Either target qty or target amount is mandatory"))
 
@@ -23,5 +23,6 @@
 		super(Territory, self).on_update()
 		self.validate_one_root()
 
+
 def on_doctype_update():
 	frappe.db.add_index("Territory", ["lft", "rgt"])
diff --git a/erpnext/setup/doctype/territory/test_territory.py b/erpnext/setup/doctype/territory/test_territory.py
index a18b7bf..4ec695d 100644
--- a/erpnext/setup/doctype/territory/test_territory.py
+++ b/erpnext/setup/doctype/territory/test_territory.py
@@ -3,6 +3,6 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Territory')
+test_records = frappe.get_test_records("Territory")
 
 test_ignore = ["Item Group"]
diff --git a/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py
index 095c3d0..319d435 100644
--- a/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py
+++ b/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py
@@ -8,61 +8,51 @@
 
 class TestTransactionDeletionRecord(unittest.TestCase):
 	def setUp(self):
-		create_company('Dunder Mifflin Paper Co')
+		create_company("Dunder Mifflin Paper Co")
 
 	def tearDown(self):
 		frappe.db.rollback()
 
 	def test_doctypes_contain_company_field(self):
-		tdr = create_transaction_deletion_request('Dunder Mifflin Paper Co')
+		tdr = create_transaction_deletion_request("Dunder Mifflin Paper Co")
 		for doctype in tdr.doctypes:
 			contains_company = False
-			doctype_fields = frappe.get_meta(doctype.doctype_name).as_dict()['fields']
+			doctype_fields = frappe.get_meta(doctype.doctype_name).as_dict()["fields"]
 			for doctype_field in doctype_fields:
-				if doctype_field['fieldtype'] == 'Link' and doctype_field['options'] == 'Company':
+				if doctype_field["fieldtype"] == "Link" and doctype_field["options"] == "Company":
 					contains_company = True
 					break
 			self.assertTrue(contains_company)
 
 	def test_no_of_docs_is_correct(self):
 		for i in range(5):
-			create_task('Dunder Mifflin Paper Co')
-		tdr = create_transaction_deletion_request('Dunder Mifflin Paper Co')
+			create_task("Dunder Mifflin Paper Co")
+		tdr = create_transaction_deletion_request("Dunder Mifflin Paper Co")
 		for doctype in tdr.doctypes:
-			if doctype.doctype_name == 'Task':
+			if doctype.doctype_name == "Task":
 				self.assertEqual(doctype.no_of_docs, 5)
 
 	def test_deletion_is_successful(self):
-		create_task('Dunder Mifflin Paper Co')
-		create_transaction_deletion_request('Dunder Mifflin Paper Co')
-		tasks_containing_company = frappe.get_all('Task',
-		filters = {
-			'company' : 'Dunder Mifflin Paper Co'
-		})
+		create_task("Dunder Mifflin Paper Co")
+		create_transaction_deletion_request("Dunder Mifflin Paper Co")
+		tasks_containing_company = frappe.get_all("Task", filters={"company": "Dunder Mifflin Paper Co"})
 		self.assertEqual(tasks_containing_company, [])
 
+
 def create_company(company_name):
-	company = frappe.get_doc({
-		'doctype': 'Company',
-		'company_name': company_name,
-		'default_currency': 'INR'
-	})
-	company.insert(ignore_if_duplicate = True)
+	company = frappe.get_doc(
+		{"doctype": "Company", "company_name": company_name, "default_currency": "INR"}
+	)
+	company.insert(ignore_if_duplicate=True)
+
 
 def create_transaction_deletion_request(company):
-	tdr = frappe.get_doc({
-		'doctype': 'Transaction Deletion Record',
-		'company': company
-	})
+	tdr = frappe.get_doc({"doctype": "Transaction Deletion Record", "company": company})
 	tdr.insert()
 	tdr.submit()
 	return tdr
 
 
 def create_task(company):
-	task = frappe.get_doc({
-		'doctype': 'Task',
-		'company': company,
-		'subject': 'Delete'
-	})
+	task = frappe.get_doc({"doctype": "Task", "company": company, "subject": "Delete"})
 	task.insert()
diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
index 83ce042..78b3939 100644
--- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
+++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
@@ -11,15 +11,19 @@
 
 class TransactionDeletionRecord(Document):
 	def validate(self):
-		frappe.only_for('System Manager')
+		frappe.only_for("System Manager")
 		self.validate_doctypes_to_be_ignored()
 
 	def validate_doctypes_to_be_ignored(self):
 		doctypes_to_be_ignored_list = get_doctypes_to_be_ignored()
 		for doctype in self.doctypes_to_be_ignored:
 			if doctype.doctype_name not in doctypes_to_be_ignored_list:
-				frappe.throw(_("DocTypes should not be added manually to the 'Excluded DocTypes' table. You are only allowed to remove entries from it."),
-					title=_("Not Allowed"))
+				frappe.throw(
+					_(
+						"DocTypes should not be added manually to the 'Excluded DocTypes' table. You are only allowed to remove entries from it."
+					),
+					title=_("Not Allowed"),
+				)
 
 	def before_submit(self):
 		if not self.doctypes_to_be_ignored:
@@ -34,38 +38,55 @@
 	def populate_doctypes_to_be_ignored_table(self):
 		doctypes_to_be_ignored_list = get_doctypes_to_be_ignored()
 		for doctype in doctypes_to_be_ignored_list:
-			self.append('doctypes_to_be_ignored', {
-						'doctype_name' : doctype
-					})
+			self.append("doctypes_to_be_ignored", {"doctype_name": doctype})
 
 	def delete_bins(self):
-		frappe.db.sql("""delete from tabBin where warehouse in
-				(select name from tabWarehouse where company=%s)""", self.company)
+		frappe.db.sql(
+			"""delete from tabBin where warehouse in
+				(select name from tabWarehouse where company=%s)""",
+			self.company,
+		)
 
 	def delete_lead_addresses(self):
 		"""Delete addresses to which leads are linked"""
-		leads = frappe.get_all('Lead', filters={'company': self.company})
+		leads = frappe.get_all("Lead", filters={"company": self.company})
 		leads = ["'%s'" % row.get("name") for row in leads]
 		addresses = []
 		if leads:
-			addresses = frappe.db.sql_list("""select parent from `tabDynamic Link` where link_name
-				in ({leads})""".format(leads=",".join(leads)))
+			addresses = frappe.db.sql_list(
+				"""select parent from `tabDynamic Link` where link_name
+				in ({leads})""".format(
+					leads=",".join(leads)
+				)
+			)
 
 			if addresses:
 				addresses = ["%s" % frappe.db.escape(addr) for addr in addresses]
 
-				frappe.db.sql("""delete from tabAddress where name in ({addresses}) and
+				frappe.db.sql(
+					"""delete from tabAddress where name in ({addresses}) and
 					name not in (select distinct dl1.parent from `tabDynamic Link` dl1
 					inner join `tabDynamic Link` dl2 on dl1.parent=dl2.parent
-					and dl1.link_doctype<>dl2.link_doctype)""".format(addresses=",".join(addresses)))
+					and dl1.link_doctype<>dl2.link_doctype)""".format(
+						addresses=",".join(addresses)
+					)
+				)
 
-				frappe.db.sql("""delete from `tabDynamic Link` where link_doctype='Lead'
-					and parenttype='Address' and link_name in ({leads})""".format(leads=",".join(leads)))
+				frappe.db.sql(
+					"""delete from `tabDynamic Link` where link_doctype='Lead'
+					and parenttype='Address' and link_name in ({leads})""".format(
+						leads=",".join(leads)
+					)
+				)
 
-			frappe.db.sql("""update tabCustomer set lead_name=NULL where lead_name in ({leads})""".format(leads=",".join(leads)))
+			frappe.db.sql(
+				"""update tabCustomer set lead_name=NULL where lead_name in ({leads})""".format(
+					leads=",".join(leads)
+				)
+			)
 
 	def reset_company_values(self):
-		company_obj = frappe.get_doc('Company', self.company)
+		company_obj = frappe.get_doc("Company", self.company)
 		company_obj.total_monthly_sales = 0
 		company_obj.sales_monthly_history = None
 		company_obj.save()
@@ -76,24 +97,26 @@
 
 		tables = self.get_all_child_doctypes()
 		for docfield in docfields:
-			if docfield['parent'] != self.doctype:
-				no_of_docs = self.get_number_of_docs_linked_with_specified_company(docfield['parent'], docfield['fieldname'])
+			if docfield["parent"] != self.doctype:
+				no_of_docs = self.get_number_of_docs_linked_with_specified_company(
+					docfield["parent"], docfield["fieldname"]
+				)
 
 				if no_of_docs > 0:
-					self.delete_version_log(docfield['parent'], docfield['fieldname'])
-					self.delete_communications(docfield['parent'], docfield['fieldname'])
-					self.populate_doctypes_table(tables, docfield['parent'], no_of_docs)
+					self.delete_version_log(docfield["parent"], docfield["fieldname"])
+					self.delete_communications(docfield["parent"], docfield["fieldname"])
+					self.populate_doctypes_table(tables, docfield["parent"], no_of_docs)
 
-					self.delete_child_tables(docfield['parent'], docfield['fieldname'])
-					self.delete_docs_linked_with_specified_company(docfield['parent'], docfield['fieldname'])
+					self.delete_child_tables(docfield["parent"], docfield["fieldname"])
+					self.delete_docs_linked_with_specified_company(docfield["parent"], docfield["fieldname"])
 
-					naming_series = frappe.db.get_value('DocType', docfield['parent'], 'autoname')
+					naming_series = frappe.db.get_value("DocType", docfield["parent"], "autoname")
 					if naming_series:
-						if '#' in naming_series:
-							self.update_naming_series(naming_series, docfield['parent'])
+						if "#" in naming_series:
+							self.update_naming_series(naming_series, docfield["parent"])
 
 	def get_doctypes_to_be_ignored_list(self):
-		singles = frappe.get_all('DocType', filters = {'issingle': 1}, pluck = 'name')
+		singles = frappe.get_all("DocType", filters={"issingle": 1}, pluck="name")
 		doctypes_to_be_ignored_list = singles
 		for doctype in self.doctypes_to_be_ignored:
 			doctypes_to_be_ignored_list.append(doctype.doctype_name)
@@ -101,81 +124,104 @@
 		return doctypes_to_be_ignored_list
 
 	def get_doctypes_with_company_field(self, doctypes_to_be_ignored_list):
-		docfields = frappe.get_all('DocField',
-			filters = {
-				'fieldtype': 'Link',
-				'options': 'Company',
-				'parent': ['not in', doctypes_to_be_ignored_list]},
-			fields=['parent', 'fieldname'])
+		docfields = frappe.get_all(
+			"DocField",
+			filters={
+				"fieldtype": "Link",
+				"options": "Company",
+				"parent": ["not in", doctypes_to_be_ignored_list],
+			},
+			fields=["parent", "fieldname"],
+		)
 
 		return docfields
 
 	def get_all_child_doctypes(self):
-		return frappe.get_all('DocType', filters = {'istable': 1}, pluck = 'name')
+		return frappe.get_all("DocType", filters={"istable": 1}, pluck="name")
 
 	def get_number_of_docs_linked_with_specified_company(self, doctype, company_fieldname):
-		return frappe.db.count(doctype, {company_fieldname : self.company})
+		return frappe.db.count(doctype, {company_fieldname: self.company})
 
 	def populate_doctypes_table(self, tables, doctype, no_of_docs):
 		if doctype not in tables:
-			self.append('doctypes', {
-				'doctype_name' : doctype,
-				'no_of_docs' : no_of_docs
-			})
+			self.append("doctypes", {"doctype_name": doctype, "no_of_docs": no_of_docs})
 
 	def delete_child_tables(self, doctype, company_fieldname):
-		parent_docs_to_be_deleted = frappe.get_all(doctype, {
-			company_fieldname : self.company
-		}, pluck = 'name')
+		parent_docs_to_be_deleted = frappe.get_all(
+			doctype, {company_fieldname: self.company}, pluck="name"
+		)
 
-		child_tables = frappe.get_all('DocField', filters = {
-			'fieldtype': 'Table',
-			'parent': doctype
-		}, pluck = 'options')
+		child_tables = frappe.get_all(
+			"DocField", filters={"fieldtype": "Table", "parent": doctype}, pluck="options"
+		)
 
 		for table in child_tables:
-			frappe.db.delete(table, {
-				'parent': ['in', parent_docs_to_be_deleted]
-			})
+			frappe.db.delete(table, {"parent": ["in", parent_docs_to_be_deleted]})
 
 	def delete_docs_linked_with_specified_company(self, doctype, company_fieldname):
-		frappe.db.delete(doctype, {
-			company_fieldname : self.company
-		})
+		frappe.db.delete(doctype, {company_fieldname: self.company})
 
 	def update_naming_series(self, naming_series, doctype_name):
-		if '.' in naming_series:
-			prefix, hashes = naming_series.rsplit('.', 1)
+		if "." in naming_series:
+			prefix, hashes = naming_series.rsplit(".", 1)
 		else:
-			prefix, hashes = naming_series.rsplit('{', 1)
-		last = frappe.db.sql("""select max(name) from `tab{0}`
-						where name like %s""".format(doctype_name), prefix + '%')
+			prefix, hashes = naming_series.rsplit("{", 1)
+		last = frappe.db.sql(
+			"""select max(name) from `tab{0}`
+						where name like %s""".format(
+				doctype_name
+			),
+			prefix + "%",
+		)
 		if last and last[0][0]:
-			last = cint(last[0][0].replace(prefix, ''))
+			last = cint(last[0][0].replace(prefix, ""))
 		else:
 			last = 0
 
 		frappe.db.sql("""update tabSeries set current = %s where name=%s""", (last, prefix))
 
 	def delete_version_log(self, doctype, company_fieldname):
-		frappe.db.sql("""delete from `tabVersion` where ref_doctype=%s and docname in
-			(select name from `tab{0}` where `{1}`=%s)""".format(doctype,
-				company_fieldname), (doctype, self.company))
+		frappe.db.sql(
+			"""delete from `tabVersion` where ref_doctype=%s and docname in
+			(select name from `tab{0}` where `{1}`=%s)""".format(
+				doctype, company_fieldname
+			),
+			(doctype, self.company),
+		)
 
 	def delete_communications(self, doctype, company_fieldname):
-		reference_docs = frappe.get_all(doctype, filters={company_fieldname:self.company})
+		reference_docs = frappe.get_all(doctype, filters={company_fieldname: self.company})
 		reference_doc_names = [r.name for r in reference_docs]
 
-		communications = frappe.get_all('Communication', filters={'reference_doctype':doctype,'reference_name':['in', reference_doc_names]})
+		communications = frappe.get_all(
+			"Communication",
+			filters={"reference_doctype": doctype, "reference_name": ["in", reference_doc_names]},
+		)
 		communication_names = [c.name for c in communications]
 
-		frappe.delete_doc('Communication', communication_names, ignore_permissions=True)
+		frappe.delete_doc("Communication", communication_names, ignore_permissions=True)
+
 
 @frappe.whitelist()
 def get_doctypes_to_be_ignored():
-	doctypes_to_be_ignored_list = ['Account', 'Cost Center', 'Warehouse', 'Budget',
-		'Party Account', 'Employee', 'Sales Taxes and Charges Template',
-		'Purchase Taxes and Charges Template', 'POS Profile', 'BOM',
-		'Company', 'Bank Account', 'Item Tax Template', 'Mode of Payment',
-		'Item Default', 'Customer', 'Supplier', 'GST Account']
+	doctypes_to_be_ignored_list = [
+		"Account",
+		"Cost Center",
+		"Warehouse",
+		"Budget",
+		"Party Account",
+		"Employee",
+		"Sales Taxes and Charges Template",
+		"Purchase Taxes and Charges Template",
+		"POS Profile",
+		"BOM",
+		"Company",
+		"Bank Account",
+		"Item Tax Template",
+		"Mode of Payment",
+		"Item Default",
+		"Customer",
+		"Supplier",
+		"GST Account",
+	]
 	return doctypes_to_be_ignored_list
diff --git a/erpnext/setup/doctype/uom/test_uom.py b/erpnext/setup/doctype/uom/test_uom.py
index feb4329..3278d4e 100644
--- a/erpnext/setup/doctype/uom/test_uom.py
+++ b/erpnext/setup/doctype/uom/test_uom.py
@@ -3,4 +3,4 @@
 
 import frappe
 
-test_records = frappe.get_test_records('UOM')
+test_records = frappe.get_test_records("UOM")
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index 1d95ddb..2b055d2 100644
--- a/erpnext/setup/install.py
+++ b/erpnext/setup/install.py
@@ -19,7 +19,7 @@
 
 
 def after_install():
-	frappe.get_doc({'doctype': "Role", "role_name": "Analytics"}).insert()
+	frappe.get_doc({"doctype": "Role", "role_name": "Analytics"}).insert()
 	set_single_defaults()
 	create_print_setting_custom_fields()
 	add_all_roles_to("Administrator")
@@ -34,17 +34,26 @@
 
 
 def check_setup_wizard_not_completed():
-	if cint(frappe.db.get_single_value('System Settings', 'setup_complete') or 0):
+	if cint(frappe.db.get_single_value("System Settings", "setup_complete") or 0):
 		message = """ERPNext can only be installed on a fresh site where the setup wizard is not completed.
 You can reinstall this site (after saving your data) using: bench --site [sitename] reinstall"""
-		frappe.throw(message)   # nosemgrep
+		frappe.throw(message)  # nosemgrep
 
 
 def set_single_defaults():
-	for dt in ('Accounts Settings', 'Print Settings', 'HR Settings', 'Buying Settings',
-		'Selling Settings', 'Stock Settings'):
-		default_values = frappe.db.sql("""select fieldname, `default` from `tabDocField`
-			where parent=%s""", dt)
+	for dt in (
+		"Accounts Settings",
+		"Print Settings",
+		"HR Settings",
+		"Buying Settings",
+		"Selling Settings",
+		"Stock Settings",
+	):
+		default_values = frappe.db.sql(
+			"""select fieldname, `default` from `tabDocField`
+			where parent=%s""",
+			dt,
+		)
 		if default_values:
 			try:
 				b = frappe.get_doc(dt, dt)
@@ -60,121 +69,140 @@
 
 	setup_currency_exchange()
 
+
 def setup_currency_exchange():
-	ces = frappe.get_single('Currency Exchange Settings')
+	ces = frappe.get_single("Currency Exchange Settings")
 	try:
-		ces.set('result_key', [])
-		ces.set('req_params', [])
+		ces.set("result_key", [])
+		ces.set("req_params", [])
 
 		ces.api_endpoint = "https://frankfurter.app/{transaction_date}"
-		ces.append('result_key', {'key': 'rates'})
-		ces.append('result_key', {'key': '{to_currency}'})
-		ces.append('req_params', {'key': 'base', 'value': '{from_currency}'})
-		ces.append('req_params', {'key': 'symbols', 'value': '{to_currency}'})
+		ces.append("result_key", {"key": "rates"})
+		ces.append("result_key", {"key": "{to_currency}"})
+		ces.append("req_params", {"key": "base", "value": "{from_currency}"})
+		ces.append("req_params", {"key": "symbols", "value": "{to_currency}"})
 		ces.save()
 	except frappe.ValidationError:
 		pass
 
+
 def create_print_setting_custom_fields():
-	create_custom_field('Print Settings', {
-		'label': _('Compact Item Print'),
-		'fieldname': 'compact_item_print',
-		'fieldtype': 'Check',
-		'default': 1,
-		'insert_after': 'with_letterhead'
-	})
-	create_custom_field('Print Settings', {
-		'label': _('Print UOM after Quantity'),
-		'fieldname': 'print_uom_after_quantity',
-		'fieldtype': 'Check',
-		'default': 0,
-		'insert_after': 'compact_item_print'
-	})
-	create_custom_field('Print Settings', {
-		'label': _('Print taxes with zero amount'),
-		'fieldname': 'print_taxes_with_zero_amount',
-		'fieldtype': 'Check',
-		'default': 0,
-		'insert_after': 'allow_print_for_cancelled'
-	})
+	create_custom_field(
+		"Print Settings",
+		{
+			"label": _("Compact Item Print"),
+			"fieldname": "compact_item_print",
+			"fieldtype": "Check",
+			"default": 1,
+			"insert_after": "with_letterhead",
+		},
+	)
+	create_custom_field(
+		"Print Settings",
+		{
+			"label": _("Print UOM after Quantity"),
+			"fieldname": "print_uom_after_quantity",
+			"fieldtype": "Check",
+			"default": 0,
+			"insert_after": "compact_item_print",
+		},
+	)
+	create_custom_field(
+		"Print Settings",
+		{
+			"label": _("Print taxes with zero amount"),
+			"fieldname": "print_taxes_with_zero_amount",
+			"fieldtype": "Check",
+			"default": 0,
+			"insert_after": "allow_print_for_cancelled",
+		},
+	)
 
 
 def create_default_cash_flow_mapper_templates():
 	for mapper in DEFAULT_MAPPERS:
-		if not frappe.db.exists('Cash Flow Mapper', mapper['section_name']):
+		if not frappe.db.exists("Cash Flow Mapper", mapper["section_name"]):
 			doc = frappe.get_doc(mapper)
 			doc.insert(ignore_permissions=True)
 
+
 def create_default_success_action():
 	for success_action in get_default_success_action():
-		if not frappe.db.exists('Success Action', success_action.get("ref_doctype")):
+		if not frappe.db.exists("Success Action", success_action.get("ref_doctype")):
 			doc = frappe.get_doc(success_action)
 			doc.insert(ignore_permissions=True)
 
+
 def create_default_energy_point_rules():
 
 	for rule in get_default_energy_point_rules():
 		# check if any rule for ref. doctype exists
-		rule_exists = frappe.db.exists('Energy Point Rule', {
-			'reference_doctype': rule.get('reference_doctype')
-		})
-		if rule_exists: continue
+		rule_exists = frappe.db.exists(
+			"Energy Point Rule", {"reference_doctype": rule.get("reference_doctype")}
+		)
+		if rule_exists:
+			continue
 		doc = frappe.get_doc(rule)
 		doc.insert(ignore_permissions=True)
 
+
 def add_company_to_session_defaults():
 	settings = frappe.get_single("Session Default Settings")
-	settings.append("session_defaults", {
-		"ref_doctype": "Company"
-	})
+	settings.append("session_defaults", {"ref_doctype": "Company"})
 	settings.save()
 
+
 def add_standard_navbar_items():
 	navbar_settings = frappe.get_single("Navbar Settings")
 
 	erpnext_navbar_items = [
 		{
-			'item_label': 'Documentation',
-			'item_type': 'Route',
-			'route': 'https://erpnext.com/docs/user/manual',
-			'is_standard': 1
+			"item_label": "Documentation",
+			"item_type": "Route",
+			"route": "https://erpnext.com/docs/user/manual",
+			"is_standard": 1,
 		},
 		{
-			'item_label': 'User Forum',
-			'item_type': 'Route',
-			'route': 'https://discuss.erpnext.com',
-			'is_standard': 1
+			"item_label": "User Forum",
+			"item_type": "Route",
+			"route": "https://discuss.erpnext.com",
+			"is_standard": 1,
 		},
 		{
-			'item_label': 'Report an Issue',
-			'item_type': 'Route',
-			'route': 'https://github.com/frappe/erpnext/issues',
-			'is_standard': 1
-		}
+			"item_label": "Report an Issue",
+			"item_type": "Route",
+			"route": "https://github.com/frappe/erpnext/issues",
+			"is_standard": 1,
+		},
 	]
 
 	current_navbar_items = navbar_settings.help_dropdown
-	navbar_settings.set('help_dropdown', [])
+	navbar_settings.set("help_dropdown", [])
 
 	for item in erpnext_navbar_items:
-		current_labels = [item.get('item_label') for item in current_navbar_items]
-		if not item.get('item_label') in current_labels:
-			navbar_settings.append('help_dropdown', item)
+		current_labels = [item.get("item_label") for item in current_navbar_items]
+		if not item.get("item_label") in current_labels:
+			navbar_settings.append("help_dropdown", item)
 
 	for item in current_navbar_items:
-		navbar_settings.append('help_dropdown', {
-			'item_label': item.item_label,
-			'item_type': item.item_type,
-			'route': item.route,
-			'action': item.action,
-			'is_standard': item.is_standard,
-			'hidden': item.hidden
-		})
+		navbar_settings.append(
+			"help_dropdown",
+			{
+				"item_label": item.item_label,
+				"item_type": item.item_type,
+				"route": item.route,
+				"action": item.action,
+				"is_standard": item.is_standard,
+				"hidden": item.hidden,
+			},
+		)
 
 	navbar_settings.save()
 
+
 def add_app_name():
-	frappe.db.set_value('System Settings', None, 'app_name', 'ERPNext')
+	frappe.db.set_value("System Settings", None, "app_name", "ERPNext")
+
 
 def add_non_standard_user_types():
 	user_types = get_user_types_data()
@@ -183,91 +211,95 @@
 	for user_type, data in user_types.items():
 		user_type_limit.setdefault(frappe.scrub(user_type), 20)
 
-	update_site_config('user_type_doctype_limit', user_type_limit)
+	update_site_config("user_type_doctype_limit", user_type_limit)
 
 	for user_type, data in user_types.items():
 		create_custom_role(data)
 		create_user_type(user_type, data)
 
+
 def get_user_types_data():
 	return {
-		'Employee Self Service': {
-			'role': 'Employee Self Service',
-			'apply_user_permission_on': 'Employee',
-			'user_id_field': 'user_id',
-			'doctypes': {
+		"Employee Self Service": {
+			"role": "Employee Self Service",
+			"apply_user_permission_on": "Employee",
+			"user_id_field": "user_id",
+			"doctypes": {
 				# masters
-				'Holiday List': ['read'],
-				'Employee': ['read', 'write'],
+				"Holiday List": ["read"],
+				"Employee": ["read", "write"],
 				# payroll
-				'Salary Slip': ['read'],
-				'Employee Benefit Application': ['read', 'write', 'create', 'delete'],
+				"Salary Slip": ["read"],
+				"Employee Benefit Application": ["read", "write", "create", "delete"],
 				# expenses
-				'Expense Claim': ['read', 'write', 'create', 'delete'],
-				'Employee Advance': ['read', 'write', 'create', 'delete'],
+				"Expense Claim": ["read", "write", "create", "delete"],
+				"Employee Advance": ["read", "write", "create", "delete"],
 				# leave and attendance
-				'Leave Application': ['read', 'write', 'create', 'delete'],
-				'Attendance Request': ['read', 'write', 'create', 'delete'],
-				'Compensatory Leave Request': ['read', 'write', 'create', 'delete'],
+				"Leave Application": ["read", "write", "create", "delete"],
+				"Attendance Request": ["read", "write", "create", "delete"],
+				"Compensatory Leave Request": ["read", "write", "create", "delete"],
 				# tax
-				'Employee Tax Exemption Declaration': ['read', 'write', 'create', 'delete'],
-				'Employee Tax Exemption Proof Submission': ['read', 'write', 'create', 'delete'],
+				"Employee Tax Exemption Declaration": ["read", "write", "create", "delete"],
+				"Employee Tax Exemption Proof Submission": ["read", "write", "create", "delete"],
 				# projects
-				'Timesheet': ['read', 'write', 'create', 'delete', 'submit', 'cancel', 'amend'],
+				"Timesheet": ["read", "write", "create", "delete", "submit", "cancel", "amend"],
 				# trainings
-				'Training Program': ['read'],
-				'Training Feedback': ['read', 'write', 'create', 'delete', 'submit', 'cancel', 'amend'],
+				"Training Program": ["read"],
+				"Training Feedback": ["read", "write", "create", "delete", "submit", "cancel", "amend"],
 				# shifts
-				'Shift Request': ['read', 'write', 'create', 'delete', 'submit', 'cancel', 'amend'],
+				"Shift Request": ["read", "write", "create", "delete", "submit", "cancel", "amend"],
 				# misc
-				'Employee Grievance': ['read', 'write', 'create', 'delete'],
-				'Employee Referral': ['read', 'write', 'create', 'delete'],
-				'Travel Request': ['read', 'write', 'create', 'delete']
-			}
+				"Employee Grievance": ["read", "write", "create", "delete"],
+				"Employee Referral": ["read", "write", "create", "delete"],
+				"Travel Request": ["read", "write", "create", "delete"],
+			},
 		}
 	}
 
+
 def create_custom_role(data):
-	if data.get('role') and not frappe.db.exists('Role', data.get('role')):
-		frappe.get_doc({
-			'doctype': 'Role',
-			'role_name': data.get('role'),
-			'desk_access': 1,
-			'is_custom': 1
-		}).insert(ignore_permissions=True)
+	if data.get("role") and not frappe.db.exists("Role", data.get("role")):
+		frappe.get_doc(
+			{"doctype": "Role", "role_name": data.get("role"), "desk_access": 1, "is_custom": 1}
+		).insert(ignore_permissions=True)
+
 
 def create_user_type(user_type, data):
-	if frappe.db.exists('User Type', user_type):
-		doc = frappe.get_cached_doc('User Type', user_type)
+	if frappe.db.exists("User Type", user_type):
+		doc = frappe.get_cached_doc("User Type", user_type)
 		doc.user_doctypes = []
 	else:
-		doc = frappe.new_doc('User Type')
-		doc.update({
-			'name': user_type,
-			'role': data.get('role'),
-			'user_id_field': data.get('user_id_field'),
-			'apply_user_permission_on': data.get('apply_user_permission_on')
-		})
+		doc = frappe.new_doc("User Type")
+		doc.update(
+			{
+				"name": user_type,
+				"role": data.get("role"),
+				"user_id_field": data.get("user_id_field"),
+				"apply_user_permission_on": data.get("apply_user_permission_on"),
+			}
+		)
 
 	create_role_permissions_for_doctype(doc, data)
 	doc.save(ignore_permissions=True)
 
+
 def create_role_permissions_for_doctype(doc, data):
-	for doctype, perms in data.get('doctypes').items():
-		args = {'document_type': doctype}
+	for doctype, perms in data.get("doctypes").items():
+		args = {"document_type": doctype}
 		for perm in perms:
 			args[perm] = 1
 
-		doc.append('user_doctypes', args)
+		doc.append("user_doctypes", args)
+
 
 def update_select_perm_after_install():
 	if not frappe.flags.update_select_perm_after_migrate:
 		return
 
 	frappe.flags.ignore_select_perm = False
-	for row in frappe.get_all('User Type', filters= {'is_standard': 0}):
-		print('Updating user type :- ', row.name)
-		doc = frappe.get_doc('User Type', row.name)
+	for row in frappe.get_all("User Type", filters={"is_standard": 0}):
+		print("Updating user type :- ", row.name)
+		doc = frappe.get_doc("User Type", row.name)
 		doc.save()
 
 	frappe.flags.update_select_perm_after_migrate = False
diff --git a/erpnext/setup/setup_wizard/data/dashboard_charts.py b/erpnext/setup/setup_wizard/data/dashboard_charts.py
index 6cb15b2..83b5038 100644
--- a/erpnext/setup/setup_wizard/data/dashboard_charts.py
+++ b/erpnext/setup/setup_wizard/data/dashboard_charts.py
@@ -13,6 +13,7 @@
 			return company_list[0].name
 	return None
 
+
 def get_default_dashboards():
 	company = frappe.get_doc("Company", get_company_for_dashboards())
 	income_account = company.default_income_account or get_account("Income Account", company.name)
@@ -25,20 +26,18 @@
 				"doctype": "Dashboard",
 				"dashboard_name": "Accounts",
 				"charts": [
-					{ "chart": "Outgoing Bills (Sales Invoice)" },
-					{ "chart": "Incoming Bills (Purchase Invoice)" },
-					{ "chart": "Bank Balance" },
-					{ "chart": "Income" },
-					{ "chart": "Expenses" },
-					{ "chart": "Patient Appointments" }
-				]
+					{"chart": "Outgoing Bills (Sales Invoice)"},
+					{"chart": "Incoming Bills (Purchase Invoice)"},
+					{"chart": "Bank Balance"},
+					{"chart": "Income"},
+					{"chart": "Expenses"},
+					{"chart": "Patient Appointments"},
+				],
 			},
 			{
 				"doctype": "Dashboard",
 				"dashboard_name": "Project",
-				"charts": [
-					{ "chart": "Project Summary", "width": "Full" }
-				]
+				"charts": [{"chart": "Project Summary", "width": "Full"}],
 			},
 		],
 		"Charts": [
@@ -54,7 +53,7 @@
 				"timeseries": 1,
 				"owner": "Administrator",
 				"type": "Line",
-				"width": "Half"
+				"width": "Half",
 			},
 			{
 				"doctype": "Dashboard Chart",
@@ -68,7 +67,7 @@
 				"timeseries": 1,
 				"owner": "Administrator",
 				"type": "Line",
-				"width": "Half"
+				"width": "Half",
 			},
 			{
 				"doctype": "Dashboard Chart",
@@ -82,7 +81,7 @@
 				"timeseries": 1,
 				"owner": "Administrator",
 				"type": "Line",
-				"width": "Half"
+				"width": "Half",
 			},
 			{
 				"doctype": "Dashboard Chart",
@@ -98,7 +97,7 @@
 				"owner": "Administrator",
 				"document_type": "Purchase Invoice",
 				"type": "Bar",
-				"width": "Half"
+				"width": "Half",
 			},
 			{
 				"doctype": "Dashboard Chart",
@@ -114,18 +113,18 @@
 				"owner": "Administrator",
 				"document_type": "Sales Invoice",
 				"type": "Bar",
-				"width": "Half"
+				"width": "Half",
 			},
 			{
-				'doctype': 'Dashboard Chart',
-				'name': 'Project Summary',
-				'chart_name': 'Project Summary',
-				'chart_type': 'Report',
-				'report_name': 'Project Summary',
-				'is_public': 1,
-				'filters_json': json.dumps({"company": company.name, "status": "Open"}),
-				'type': 'Bar',
-				'custom_options': '{"type": "bar", "colors": ["#fc4f51", "#78d6ff", "#7575ff"], "axisOptions": { "shortenYAxisNumbers": 1}, "barOptions": { "stacked": 1 }}',
+				"doctype": "Dashboard Chart",
+				"name": "Project Summary",
+				"chart_name": "Project Summary",
+				"chart_type": "Report",
+				"report_name": "Project Summary",
+				"is_public": 1,
+				"filters_json": json.dumps({"company": company.name, "status": "Open"}),
+				"type": "Bar",
+				"custom_options": '{"type": "bar", "colors": ["#fc4f51", "#78d6ff", "#7575ff"], "axisOptions": { "shortenYAxisNumbers": 1}, "barOptions": { "stacked": 1 }}',
 			},
 			{
 				"doctype": "Dashboard Chart",
@@ -140,11 +139,12 @@
 				"owner": "Administrator",
 				"document_type": "Patient Appointment",
 				"type": "Line",
-				"width": "Half"
-			}
-		]
+				"width": "Half",
+			},
+		],
 	}
 
+
 def get_account(account_type, company):
 	accounts = frappe.get_list("Account", filters={"account_type": account_type, "company": company})
 	if accounts:
diff --git a/erpnext/setup/setup_wizard/data/industry_type.py b/erpnext/setup/setup_wizard/data/industry_type.py
index ecd8b00..0bc3f32 100644
--- a/erpnext/setup/setup_wizard/data/industry_type.py
+++ b/erpnext/setup/setup_wizard/data/industry_type.py
@@ -3,55 +3,55 @@
 
 def get_industry_types():
 	return [
-		_('Accounting'),
-		_('Advertising'),
-		_('Aerospace'),
-		_('Agriculture'),
-		_('Airline'),
-		_('Apparel & Accessories'),
-		_('Automotive'),
-		_('Banking'),
-		_('Biotechnology'),
-		_('Broadcasting'),
-		_('Brokerage'),
-		_('Chemical'),
-		_('Computer'),
-		_('Consulting'),
-		_('Consumer Products'),
-		_('Cosmetics'),
-		_('Defense'),
-		_('Department Stores'),
-		_('Education'),
-		_('Electronics'),
-		_('Energy'),
-		_('Entertainment & Leisure'),
-		_('Executive Search'),
-		_('Financial Services'),
-		_('Food, Beverage & Tobacco'),
-		_('Grocery'),
-		_('Health Care'),
-		_('Internet Publishing'),
-		_('Investment Banking'),
-		_('Legal'),
-		_('Manufacturing'),
-		_('Motion Picture & Video'),
-		_('Music'),
-		_('Newspaper Publishers'),
-		_('Online Auctions'),
-		_('Pension Funds'),
-		_('Pharmaceuticals'),
-		_('Private Equity'),
-		_('Publishing'),
-		_('Real Estate'),
-		_('Retail & Wholesale'),
-		_('Securities & Commodity Exchanges'),
-		_('Service'),
-		_('Soap & Detergent'),
-		_('Software'),
-		_('Sports'),
-		_('Technology'),
-		_('Telecommunications'),
-		_('Television'),
-		_('Transportation'),
-		_('Venture Capital')
+		_("Accounting"),
+		_("Advertising"),
+		_("Aerospace"),
+		_("Agriculture"),
+		_("Airline"),
+		_("Apparel & Accessories"),
+		_("Automotive"),
+		_("Banking"),
+		_("Biotechnology"),
+		_("Broadcasting"),
+		_("Brokerage"),
+		_("Chemical"),
+		_("Computer"),
+		_("Consulting"),
+		_("Consumer Products"),
+		_("Cosmetics"),
+		_("Defense"),
+		_("Department Stores"),
+		_("Education"),
+		_("Electronics"),
+		_("Energy"),
+		_("Entertainment & Leisure"),
+		_("Executive Search"),
+		_("Financial Services"),
+		_("Food, Beverage & Tobacco"),
+		_("Grocery"),
+		_("Health Care"),
+		_("Internet Publishing"),
+		_("Investment Banking"),
+		_("Legal"),
+		_("Manufacturing"),
+		_("Motion Picture & Video"),
+		_("Music"),
+		_("Newspaper Publishers"),
+		_("Online Auctions"),
+		_("Pension Funds"),
+		_("Pharmaceuticals"),
+		_("Private Equity"),
+		_("Publishing"),
+		_("Real Estate"),
+		_("Retail & Wholesale"),
+		_("Securities & Commodity Exchanges"),
+		_("Service"),
+		_("Soap & Detergent"),
+		_("Software"),
+		_("Sports"),
+		_("Technology"),
+		_("Telecommunications"),
+		_("Television"),
+		_("Transportation"),
+		_("Venture Capital"),
 	]
diff --git a/erpnext/setup/setup_wizard/operations/company_setup.py b/erpnext/setup/setup_wizard/operations/company_setup.py
index 74c1bd8..36dd661 100644
--- a/erpnext/setup/setup_wizard/operations/company_setup.py
+++ b/erpnext/setup/setup_wizard/operations/company_setup.py
@@ -6,42 +6,52 @@
 from frappe.utils import cstr, getdate
 from .default_website import website_maker
 
+
 def create_fiscal_year_and_company(args):
-	if (args.get('fy_start_date')):
-		curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date'))
-		frappe.get_doc({
-			"doctype":"Fiscal Year",
-			'year': curr_fiscal_year,
-			'year_start_date': args.get('fy_start_date'),
-			'year_end_date': args.get('fy_end_date'),
-		}).insert()
+	if args.get("fy_start_date"):
+		curr_fiscal_year = get_fy_details(args.get("fy_start_date"), args.get("fy_end_date"))
+		frappe.get_doc(
+			{
+				"doctype": "Fiscal Year",
+				"year": curr_fiscal_year,
+				"year_start_date": args.get("fy_start_date"),
+				"year_end_date": args.get("fy_end_date"),
+			}
+		).insert()
 
-	if (args.get('company_name')):
-		frappe.get_doc({
-			"doctype":"Company",
-			'company_name':args.get('company_name'),
-			'enable_perpetual_inventory': 1,
-			'abbr':args.get('company_abbr'),
-			'default_currency':args.get('currency'),
-			'country': args.get('country'),
-			'create_chart_of_accounts_based_on': 'Standard Template',
-			'chart_of_accounts': args.get('chart_of_accounts'),
-			'domain': args.get('domains')[0]
-		}).insert()
+	if args.get("company_name"):
+		frappe.get_doc(
+			{
+				"doctype": "Company",
+				"company_name": args.get("company_name"),
+				"enable_perpetual_inventory": 1,
+				"abbr": args.get("company_abbr"),
+				"default_currency": args.get("currency"),
+				"country": args.get("country"),
+				"create_chart_of_accounts_based_on": "Standard Template",
+				"chart_of_accounts": args.get("chart_of_accounts"),
+				"domain": args.get("domains")[0],
+			}
+		).insert()
 
-def enable_shopping_cart(args): # nosemgrep
+
+def enable_shopping_cart(args):  # nosemgrep
 	# Needs price_lists
-	frappe.get_doc({
-		"doctype": "E Commerce Settings",
-		"enabled": 1,
-		'company': args.get('company_name')	,
-		'price_list': frappe.db.get_value("Price List", {"selling": 1}),
-		'default_customer_group': _("Individual"),
-		'quotation_series': "QTN-",
-	}).insert()
+	frappe.get_doc(
+		{
+			"doctype": "E Commerce Settings",
+			"enabled": 1,
+			"company": args.get("company_name"),
+			"price_list": frappe.db.get_value("Price List", {"selling": 1}),
+			"default_customer_group": _("Individual"),
+			"quotation_series": "QTN-",
+		}
+	).insert()
+
 
 def create_email_digest():
 	from frappe.utils.user import get_system_managers
+
 	system_managers = get_system_managers(only_name=True)
 
 	if not system_managers:
@@ -49,20 +59,20 @@
 
 	recipients = []
 	for d in system_managers:
-		recipients.append({
-			'recipient': d
-		})
+		recipients.append({"recipient": d})
 
 	companies = frappe.db.sql_list("select name FROM `tabCompany`")
 	for company in companies:
 		if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company):
-			edigest = frappe.get_doc({
-				"doctype": "Email Digest",
-				"name": "Default Weekly Digest - " + company,
-				"company": company,
-				"frequency": "Weekly",
-				"recipients": recipients
-			})
+			edigest = frappe.get_doc(
+				{
+					"doctype": "Email Digest",
+					"name": "Default Weekly Digest - " + company,
+					"company": company,
+					"frequency": "Weekly",
+					"recipients": recipients,
+				}
+			)
 
 			for df in edigest.meta.get("fields", {"fieldtype": "Check"}):
 				if df.fieldname != "scheduler_errors":
@@ -73,39 +83,53 @@
 	# scheduler errors digest
 	if companies:
 		edigest = frappe.new_doc("Email Digest")
-		edigest.update({
-			"name": "Scheduler Errors",
-			"company": companies[0],
-			"frequency": "Daily",
-			"recipients": recipients,
-			"scheduler_errors": 1,
-			"enabled": 1
-		})
+		edigest.update(
+			{
+				"name": "Scheduler Errors",
+				"company": companies[0],
+				"frequency": "Daily",
+				"recipients": recipients,
+				"scheduler_errors": 1,
+				"enabled": 1,
+			}
+		)
 		edigest.insert()
 
+
 def create_logo(args):
 	if args.get("attach_logo"):
 		attach_logo = args.get("attach_logo").split(",")
-		if len(attach_logo)==3:
+		if len(attach_logo) == 3:
 			filename, filetype, content = attach_logo
-			_file = frappe.get_doc({
-				"doctype": "File",
-				"file_name": filename,
-				"attached_to_doctype": "Website Settings",
-				"attached_to_name": "Website Settings",
-				"decode": True})
+			_file = frappe.get_doc(
+				{
+					"doctype": "File",
+					"file_name": filename,
+					"attached_to_doctype": "Website Settings",
+					"attached_to_name": "Website Settings",
+					"decode": True,
+				}
+			)
 			_file.save()
 			fileurl = _file.file_url
-			frappe.db.set_value("Website Settings", "Website Settings", "brand_html",
-				"<img src='{0}' style='max-width: 40px; max-height: 25px;'> {1}".format(fileurl, args.get("company_name")))
+			frappe.db.set_value(
+				"Website Settings",
+				"Website Settings",
+				"brand_html",
+				"<img src='{0}' style='max-width: 40px; max-height: 25px;'> {1}".format(
+					fileurl, args.get("company_name")
+				),
+			)
+
 
 def create_website(args):
 	website_maker(args)
 
+
 def get_fy_details(fy_start_date, fy_end_date):
 	start_year = getdate(fy_start_date).year
 	if start_year == getdate(fy_end_date).year:
 		fy = cstr(start_year)
 	else:
-		fy = cstr(start_year) + '-' + cstr(start_year + 1)
+		fy = cstr(start_year) + "-" + cstr(start_year + 1)
 	return fy
diff --git a/erpnext/setup/setup_wizard/operations/default_website.py b/erpnext/setup/setup_wizard/operations/default_website.py
index c11910b..40b02b3 100644
--- a/erpnext/setup/setup_wizard/operations/default_website.py
+++ b/erpnext/setup/setup_wizard/operations/default_website.py
@@ -12,14 +12,14 @@
 		self.args = args
 		self.company = args.company_name
 		self.tagline = args.company_tagline
-		self.user = args.get('email')
+		self.user = args.get("email")
 		self.make_web_page()
 		self.make_website_settings()
 		self.make_blog()
 
 	def make_web_page(self):
 		# home page
-		homepage = frappe.get_doc('Homepage', 'Homepage')
+		homepage = frappe.get_doc("Homepage", "Homepage")
 		homepage.company = self.company
 		homepage.tag_line = self.tagline
 		homepage.setup_items()
@@ -28,34 +28,25 @@
 	def make_website_settings(self):
 		# update in home page in settings
 		website_settings = frappe.get_doc("Website Settings", "Website Settings")
-		website_settings.home_page = 'home'
+		website_settings.home_page = "home"
 		website_settings.brand_html = self.company
 		website_settings.copyright = self.company
 		website_settings.top_bar_items = []
-		website_settings.append("top_bar_items", {
-			"doctype": "Top Bar Item",
-			"label":"Contact",
-			"url": "/contact"
-		})
-		website_settings.append("top_bar_items", {
-			"doctype": "Top Bar Item",
-			"label":"Blog",
-			"url": "/blog"
-		})
-		website_settings.append("top_bar_items", {
-			"doctype": "Top Bar Item",
-			"label": _("Products"),
-			"url": "/all-products"
-		})
+		website_settings.append(
+			"top_bar_items", {"doctype": "Top Bar Item", "label": "Contact", "url": "/contact"}
+		)
+		website_settings.append(
+			"top_bar_items", {"doctype": "Top Bar Item", "label": "Blog", "url": "/blog"}
+		)
+		website_settings.append(
+			"top_bar_items", {"doctype": "Top Bar Item", "label": _("Products"), "url": "/all-products"}
+		)
 		website_settings.save()
 
 	def make_blog(self):
-		blog_category = frappe.get_doc({
-			"doctype": "Blog Category",
-			"category_name": "general",
-			"published": 1,
-			"title": _("General")
-		}).insert()
+		blog_category = frappe.get_doc(
+			{"doctype": "Blog Category", "category_name": "general", "published": 1, "title": _("General")}
+		).insert()
 
 		if not self.user:
 			# Admin setup
@@ -69,21 +60,30 @@
 		blogger.avatar = user.user_image
 		blogger.insert()
 
-		frappe.get_doc({
-			"doctype": "Blog Post",
-			"title": "Welcome",
-			"published": 1,
-			"published_on": nowdate(),
-			"blogger": blogger.name,
-			"blog_category": blog_category.name,
-			"blog_intro": "My First Blog",
-			"content": frappe.get_template("setup/setup_wizard/data/sample_blog_post.html").render(),
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Blog Post",
+				"title": "Welcome",
+				"published": 1,
+				"published_on": nowdate(),
+				"blogger": blogger.name,
+				"blog_category": blog_category.name,
+				"blog_intro": "My First Blog",
+				"content": frappe.get_template("setup/setup_wizard/data/sample_blog_post.html").render(),
+			}
+		).insert()
+
 
 def test():
 	frappe.delete_doc("Web Page", "test-company")
 	frappe.delete_doc("Blog Post", "welcome")
 	frappe.delete_doc("Blogger", "administrator")
 	frappe.delete_doc("Blog Category", "general")
-	website_maker({'company':"Test Company", 'company_tagline': "Better Tools for Everyone", 'name': "Administrator"})
+	website_maker(
+		{
+			"company": "Test Company",
+			"company_tagline": "Better Tools for Everyone",
+			"name": "Administrator",
+		}
+	)
 	frappe.db.commit()
diff --git a/erpnext/setup/setup_wizard/operations/defaults_setup.py b/erpnext/setup/setup_wizard/operations/defaults_setup.py
index ca1f57e..07321ed 100644
--- a/erpnext/setup/setup_wizard/operations/defaults_setup.py
+++ b/erpnext/setup/setup_wizard/operations/defaults_setup.py
@@ -5,17 +5,20 @@
 from frappe import _
 from frappe.utils import cstr, getdate
 
+
 def set_default_settings(args):
 	# enable default currency
 	frappe.db.set_value("Currency", args.get("currency"), "enabled", 1)
 
 	global_defaults = frappe.get_doc("Global Defaults", "Global Defaults")
-	global_defaults.update({
-		'current_fiscal_year': get_fy_details(args.get('fy_start_date'), args.get('fy_end_date')),
-		'default_currency': args.get('currency'),
-		'default_company':args.get('company_name')	,
-		"country": args.get("country"),
-	})
+	global_defaults.update(
+		{
+			"current_fiscal_year": get_fy_details(args.get("fy_start_date"), args.get("fy_end_date")),
+			"default_currency": args.get("currency"),
+			"default_company": args.get("company_name"),
+			"country": args.get("country"),
+		}
+	)
 
 	global_defaults.save()
 
@@ -23,13 +26,15 @@
 	system_settings.email_footer_address = args.get("company_name")
 	system_settings.save()
 
-	domain_settings = frappe.get_single('Domain Settings')
-	domain_settings.set_active_domains(args.get('domains'))
+	domain_settings = frappe.get_single("Domain Settings")
+	domain_settings.set_active_domains(args.get("domains"))
 
 	stock_settings = frappe.get_doc("Stock Settings")
 	stock_settings.item_naming_by = "Item Code"
 	stock_settings.valuation_method = "FIFO"
-	stock_settings.default_warehouse = frappe.db.get_value('Warehouse', {'warehouse_name': _('Stores')})
+	stock_settings.default_warehouse = frappe.db.get_value(
+		"Warehouse", {"warehouse_name": _("Stores")}
+	)
 	stock_settings.stock_uom = _("Nos")
 	stock_settings.auto_indent = 1
 	stock_settings.auto_insert_price_list_rate_if_missing = 1
@@ -72,61 +77,74 @@
 	hr_settings.exit_questionnaire_notification_template = _("Exit Questionnaire Notification")
 	hr_settings.save()
 
+
 def set_no_copy_fields_in_variant_settings():
 	# set no copy fields of an item doctype to item variant settings
-	doc = frappe.get_doc('Item Variant Settings')
+	doc = frappe.get_doc("Item Variant Settings")
 	doc.set_default_fields()
 	doc.save()
 
+
 def create_price_lists(args):
 	for pl_type, pl_name in (("Selling", _("Standard Selling")), ("Buying", _("Standard Buying"))):
-		frappe.get_doc({
-			"doctype": "Price List",
-			"price_list_name": pl_name,
-			"enabled": 1,
-			"buying": 1 if pl_type == "Buying" else 0,
-			"selling": 1 if pl_type == "Selling" else 0,
-			"currency": args["currency"]
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Price List",
+				"price_list_name": pl_name,
+				"enabled": 1,
+				"buying": 1 if pl_type == "Buying" else 0,
+				"selling": 1 if pl_type == "Selling" else 0,
+				"currency": args["currency"],
+			}
+		).insert()
+
 
 def create_employee_for_self(args):
-	if frappe.session.user == 'Administrator':
+	if frappe.session.user == "Administrator":
 		return
 
 	# create employee for self
-	emp = frappe.get_doc({
-		"doctype": "Employee",
-		"employee_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])),
-		"user_id": frappe.session.user,
-		"status": "Active",
-		"company": args.get("company_name")
-	})
+	emp = frappe.get_doc(
+		{
+			"doctype": "Employee",
+			"employee_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])),
+			"user_id": frappe.session.user,
+			"status": "Active",
+			"company": args.get("company_name"),
+		}
+	)
 	emp.flags.ignore_mandatory = True
-	emp.insert(ignore_permissions = True)
+	emp.insert(ignore_permissions=True)
+
 
 def create_territories():
 	"""create two default territories, one for home country and one named Rest of the World"""
 	from frappe.utils.nestedset import get_root_of
+
 	country = frappe.db.get_default("country")
 	root_territory = get_root_of("Territory")
 
 	for name in (country, _("Rest Of The World")):
 		if name and not frappe.db.exists("Territory", name):
-			frappe.get_doc({
-				"doctype": "Territory",
-				"territory_name": name.replace("'", ""),
-				"parent_territory": root_territory,
-				"is_group": "No"
-			}).insert()
+			frappe.get_doc(
+				{
+					"doctype": "Territory",
+					"territory_name": name.replace("'", ""),
+					"parent_territory": root_territory,
+					"is_group": "No",
+				}
+			).insert()
+
 
 def create_feed_and_todo():
 	"""update Activity feed and create todo for creation of item, customer, vendor"""
 	return
 
+
 def get_fy_details(fy_start_date, fy_end_date):
 	start_year = getdate(fy_start_date).year
 	if start_year == getdate(fy_end_date).year:
 		fy = cstr(start_year)
 	else:
-		fy = cstr(start_year) + '-' + cstr(start_year + 1)
+		fy = cstr(start_year) + "-" + cstr(start_year + 1)
 	return fy
diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py
index cefa0f3..a0056e2 100644
--- a/erpnext/setup/setup_wizard/operations/install_fixtures.py
+++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py
@@ -17,195 +17,372 @@
 from erpnext.accounts.doctype.account.account import RootNotEditable
 from erpnext.regional.address_template.setup import set_up_address_templates
 
-default_lead_sources = ["Existing Customer", "Reference", "Advertisement",
-	"Cold Calling", "Exhibition", "Supplier Reference", "Mass Mailing",
-	"Customer's Vendor", "Campaign", "Walk In"]
+default_lead_sources = [
+	"Existing Customer",
+	"Reference",
+	"Advertisement",
+	"Cold Calling",
+	"Exhibition",
+	"Supplier Reference",
+	"Mass Mailing",
+	"Customer's Vendor",
+	"Campaign",
+	"Walk In",
+]
 
-default_sales_partner_type = ["Channel Partner", "Distributor", "Dealer", "Agent",
-	"Retailer", "Implementation Partner", "Reseller"]
+default_sales_partner_type = [
+	"Channel Partner",
+	"Distributor",
+	"Dealer",
+	"Agent",
+	"Retailer",
+	"Implementation Partner",
+	"Reseller",
+]
+
 
 def install(country=None):
 	records = [
 		# domains
-		{ 'doctype': 'Domain', 'domain': 'Distribution'},
-		{ 'doctype': 'Domain', 'domain': 'Manufacturing'},
-		{ 'doctype': 'Domain', 'domain': 'Retail'},
-		{ 'doctype': 'Domain', 'domain': 'Services'},
-		{ 'doctype': 'Domain', 'domain': 'Education'},
-		{ 'doctype': 'Domain', 'domain': 'Healthcare'},
-		{ 'doctype': 'Domain', 'domain': 'Non Profit'},
-
+		{"doctype": "Domain", "domain": "Distribution"},
+		{"doctype": "Domain", "domain": "Manufacturing"},
+		{"doctype": "Domain", "domain": "Retail"},
+		{"doctype": "Domain", "domain": "Services"},
+		{"doctype": "Domain", "domain": "Education"},
+		{"doctype": "Domain", "domain": "Healthcare"},
+		{"doctype": "Domain", "domain": "Non Profit"},
 		# ensure at least an empty Address Template exists for this Country
-		{'doctype':"Address Template", "country": country},
-
+		{"doctype": "Address Template", "country": country},
 		# item group
-		{'doctype': 'Item Group', 'item_group_name': _('All Item Groups'),
-			'is_group': 1, 'parent_item_group': ''},
-		{'doctype': 'Item Group', 'item_group_name': _('Products'),
-			'is_group': 0, 'parent_item_group': _('All Item Groups'), "show_in_website": 1 },
-		{'doctype': 'Item Group', 'item_group_name': _('Raw Material'),
-			'is_group': 0, 'parent_item_group': _('All Item Groups') },
-		{'doctype': 'Item Group', 'item_group_name': _('Services'),
-			'is_group': 0, 'parent_item_group': _('All Item Groups') },
-		{'doctype': 'Item Group', 'item_group_name': _('Sub Assemblies'),
-			'is_group': 0, 'parent_item_group': _('All Item Groups') },
-		{'doctype': 'Item Group', 'item_group_name': _('Consumable'),
-			'is_group': 0, 'parent_item_group': _('All Item Groups') },
-
+		{
+			"doctype": "Item Group",
+			"item_group_name": _("All Item Groups"),
+			"is_group": 1,
+			"parent_item_group": "",
+		},
+		{
+			"doctype": "Item Group",
+			"item_group_name": _("Products"),
+			"is_group": 0,
+			"parent_item_group": _("All Item Groups"),
+			"show_in_website": 1,
+		},
+		{
+			"doctype": "Item Group",
+			"item_group_name": _("Raw Material"),
+			"is_group": 0,
+			"parent_item_group": _("All Item Groups"),
+		},
+		{
+			"doctype": "Item Group",
+			"item_group_name": _("Services"),
+			"is_group": 0,
+			"parent_item_group": _("All Item Groups"),
+		},
+		{
+			"doctype": "Item Group",
+			"item_group_name": _("Sub Assemblies"),
+			"is_group": 0,
+			"parent_item_group": _("All Item Groups"),
+		},
+		{
+			"doctype": "Item Group",
+			"item_group_name": _("Consumable"),
+			"is_group": 0,
+			"parent_item_group": _("All Item Groups"),
+		},
 		# salary component
-		{'doctype': 'Salary Component', 'salary_component': _('Income Tax'), 'description': _('Income Tax'), 'type': 'Deduction', 'is_income_tax_component': 1},
-		{'doctype': 'Salary Component', 'salary_component': _('Basic'), 'description': _('Basic'), 'type': 'Earning'},
-		{'doctype': 'Salary Component', 'salary_component': _('Arrear'), 'description': _('Arrear'), 'type': 'Earning'},
-		{'doctype': 'Salary Component', 'salary_component': _('Leave Encashment'), 'description': _('Leave Encashment'), 'type': 'Earning'},
-
-
+		{
+			"doctype": "Salary Component",
+			"salary_component": _("Income Tax"),
+			"description": _("Income Tax"),
+			"type": "Deduction",
+			"is_income_tax_component": 1,
+		},
+		{
+			"doctype": "Salary Component",
+			"salary_component": _("Basic"),
+			"description": _("Basic"),
+			"type": "Earning",
+		},
+		{
+			"doctype": "Salary Component",
+			"salary_component": _("Arrear"),
+			"description": _("Arrear"),
+			"type": "Earning",
+		},
+		{
+			"doctype": "Salary Component",
+			"salary_component": _("Leave Encashment"),
+			"description": _("Leave Encashment"),
+			"type": "Earning",
+		},
 		# expense claim type
-		{'doctype': 'Expense Claim Type', 'name': _('Calls'), 'expense_type': _('Calls')},
-		{'doctype': 'Expense Claim Type', 'name': _('Food'), 'expense_type': _('Food')},
-		{'doctype': 'Expense Claim Type', 'name': _('Medical'), 'expense_type': _('Medical')},
-		{'doctype': 'Expense Claim Type', 'name': _('Others'), 'expense_type': _('Others')},
-		{'doctype': 'Expense Claim Type', 'name': _('Travel'), 'expense_type': _('Travel')},
-
+		{"doctype": "Expense Claim Type", "name": _("Calls"), "expense_type": _("Calls")},
+		{"doctype": "Expense Claim Type", "name": _("Food"), "expense_type": _("Food")},
+		{"doctype": "Expense Claim Type", "name": _("Medical"), "expense_type": _("Medical")},
+		{"doctype": "Expense Claim Type", "name": _("Others"), "expense_type": _("Others")},
+		{"doctype": "Expense Claim Type", "name": _("Travel"), "expense_type": _("Travel")},
 		# leave type
-		{'doctype': 'Leave Type', 'leave_type_name': _('Casual Leave'), 'name': _('Casual Leave'),
-			'allow_encashment': 1, 'is_carry_forward': 1, 'max_continuous_days_allowed': '3', 'include_holiday': 1},
-		{'doctype': 'Leave Type', 'leave_type_name': _('Compensatory Off'), 'name': _('Compensatory Off'),
-			'allow_encashment': 0, 'is_carry_forward': 0, 'include_holiday': 1, 'is_compensatory':1 },
-		{'doctype': 'Leave Type', 'leave_type_name': _('Sick Leave'), 'name': _('Sick Leave'),
-			'allow_encashment': 0, 'is_carry_forward': 0, 'include_holiday': 1},
-		{'doctype': 'Leave Type', 'leave_type_name': _('Privilege Leave'), 'name': _('Privilege Leave'),
-			'allow_encashment': 0, 'is_carry_forward': 0, 'include_holiday': 1},
-		{'doctype': 'Leave Type', 'leave_type_name': _('Leave Without Pay'), 'name': _('Leave Without Pay'),
-			'allow_encashment': 0, 'is_carry_forward': 0, 'is_lwp':1, 'include_holiday': 1},
-
+		{
+			"doctype": "Leave Type",
+			"leave_type_name": _("Casual Leave"),
+			"name": _("Casual Leave"),
+			"allow_encashment": 1,
+			"is_carry_forward": 1,
+			"max_continuous_days_allowed": "3",
+			"include_holiday": 1,
+		},
+		{
+			"doctype": "Leave Type",
+			"leave_type_name": _("Compensatory Off"),
+			"name": _("Compensatory Off"),
+			"allow_encashment": 0,
+			"is_carry_forward": 0,
+			"include_holiday": 1,
+			"is_compensatory": 1,
+		},
+		{
+			"doctype": "Leave Type",
+			"leave_type_name": _("Sick Leave"),
+			"name": _("Sick Leave"),
+			"allow_encashment": 0,
+			"is_carry_forward": 0,
+			"include_holiday": 1,
+		},
+		{
+			"doctype": "Leave Type",
+			"leave_type_name": _("Privilege Leave"),
+			"name": _("Privilege Leave"),
+			"allow_encashment": 0,
+			"is_carry_forward": 0,
+			"include_holiday": 1,
+		},
+		{
+			"doctype": "Leave Type",
+			"leave_type_name": _("Leave Without Pay"),
+			"name": _("Leave Without Pay"),
+			"allow_encashment": 0,
+			"is_carry_forward": 0,
+			"is_lwp": 1,
+			"include_holiday": 1,
+		},
 		# Employment Type
-		{'doctype': 'Employment Type', 'employee_type_name': _('Full-time')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Part-time')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Probation')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Contract')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Commission')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Piecework')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Intern')},
-		{'doctype': 'Employment Type', 'employee_type_name': _('Apprentice')},
-
-
+		{"doctype": "Employment Type", "employee_type_name": _("Full-time")},
+		{"doctype": "Employment Type", "employee_type_name": _("Part-time")},
+		{"doctype": "Employment Type", "employee_type_name": _("Probation")},
+		{"doctype": "Employment Type", "employee_type_name": _("Contract")},
+		{"doctype": "Employment Type", "employee_type_name": _("Commission")},
+		{"doctype": "Employment Type", "employee_type_name": _("Piecework")},
+		{"doctype": "Employment Type", "employee_type_name": _("Intern")},
+		{"doctype": "Employment Type", "employee_type_name": _("Apprentice")},
 		# Stock Entry Type
-		{'doctype': 'Stock Entry Type', 'name': 'Material Issue', 'purpose': 'Material Issue'},
-		{'doctype': 'Stock Entry Type', 'name': 'Material Receipt', 'purpose': 'Material Receipt'},
-		{'doctype': 'Stock Entry Type', 'name': 'Material Transfer', 'purpose': 'Material Transfer'},
-		{'doctype': 'Stock Entry Type', 'name': 'Manufacture', 'purpose': 'Manufacture'},
-		{'doctype': 'Stock Entry Type', 'name': 'Repack', 'purpose': 'Repack'},
-		{'doctype': 'Stock Entry Type', 'name': 'Send to Subcontractor', 'purpose': 'Send to Subcontractor'},
-		{'doctype': 'Stock Entry Type', 'name': 'Material Transfer for Manufacture', 'purpose': 'Material Transfer for Manufacture'},
-		{'doctype': 'Stock Entry Type', 'name': 'Material Consumption for Manufacture', 'purpose': 'Material Consumption for Manufacture'},
-
+		{"doctype": "Stock Entry Type", "name": "Material Issue", "purpose": "Material Issue"},
+		{"doctype": "Stock Entry Type", "name": "Material Receipt", "purpose": "Material Receipt"},
+		{"doctype": "Stock Entry Type", "name": "Material Transfer", "purpose": "Material Transfer"},
+		{"doctype": "Stock Entry Type", "name": "Manufacture", "purpose": "Manufacture"},
+		{"doctype": "Stock Entry Type", "name": "Repack", "purpose": "Repack"},
+		{
+			"doctype": "Stock Entry Type",
+			"name": "Send to Subcontractor",
+			"purpose": "Send to Subcontractor",
+		},
+		{
+			"doctype": "Stock Entry Type",
+			"name": "Material Transfer for Manufacture",
+			"purpose": "Material Transfer for Manufacture",
+		},
+		{
+			"doctype": "Stock Entry Type",
+			"name": "Material Consumption for Manufacture",
+			"purpose": "Material Consumption for Manufacture",
+		},
 		# Designation
-		{'doctype': 'Designation', 'designation_name': _('CEO')},
-		{'doctype': 'Designation', 'designation_name': _('Manager')},
-		{'doctype': 'Designation', 'designation_name': _('Analyst')},
-		{'doctype': 'Designation', 'designation_name': _('Engineer')},
-		{'doctype': 'Designation', 'designation_name': _('Accountant')},
-		{'doctype': 'Designation', 'designation_name': _('Secretary')},
-		{'doctype': 'Designation', 'designation_name': _('Associate')},
-		{'doctype': 'Designation', 'designation_name': _('Administrative Officer')},
-		{'doctype': 'Designation', 'designation_name': _('Business Development Manager')},
-		{'doctype': 'Designation', 'designation_name': _('HR Manager')},
-		{'doctype': 'Designation', 'designation_name': _('Project Manager')},
-		{'doctype': 'Designation', 'designation_name': _('Head of Marketing and Sales')},
-		{'doctype': 'Designation', 'designation_name': _('Software Developer')},
-		{'doctype': 'Designation', 'designation_name': _('Designer')},
-		{'doctype': 'Designation', 'designation_name': _('Researcher')},
-
+		{"doctype": "Designation", "designation_name": _("CEO")},
+		{"doctype": "Designation", "designation_name": _("Manager")},
+		{"doctype": "Designation", "designation_name": _("Analyst")},
+		{"doctype": "Designation", "designation_name": _("Engineer")},
+		{"doctype": "Designation", "designation_name": _("Accountant")},
+		{"doctype": "Designation", "designation_name": _("Secretary")},
+		{"doctype": "Designation", "designation_name": _("Associate")},
+		{"doctype": "Designation", "designation_name": _("Administrative Officer")},
+		{"doctype": "Designation", "designation_name": _("Business Development Manager")},
+		{"doctype": "Designation", "designation_name": _("HR Manager")},
+		{"doctype": "Designation", "designation_name": _("Project Manager")},
+		{"doctype": "Designation", "designation_name": _("Head of Marketing and Sales")},
+		{"doctype": "Designation", "designation_name": _("Software Developer")},
+		{"doctype": "Designation", "designation_name": _("Designer")},
+		{"doctype": "Designation", "designation_name": _("Researcher")},
 		# territory: with two default territories, one for home country and one named Rest of the World
-		{'doctype': 'Territory', 'territory_name': _('All Territories'), 'is_group': 1, 'name': _('All Territories'), 'parent_territory': ''},
-		{'doctype': 'Territory', 'territory_name': country.replace("'", ""), 'is_group': 0, 'parent_territory': _('All Territories')},
-		{'doctype': 'Territory', 'territory_name': _("Rest Of The World"), 'is_group': 0, 'parent_territory': _('All Territories')},
-
+		{
+			"doctype": "Territory",
+			"territory_name": _("All Territories"),
+			"is_group": 1,
+			"name": _("All Territories"),
+			"parent_territory": "",
+		},
+		{
+			"doctype": "Territory",
+			"territory_name": country.replace("'", ""),
+			"is_group": 0,
+			"parent_territory": _("All Territories"),
+		},
+		{
+			"doctype": "Territory",
+			"territory_name": _("Rest Of The World"),
+			"is_group": 0,
+			"parent_territory": _("All Territories"),
+		},
 		# customer group
-		{'doctype': 'Customer Group', 'customer_group_name': _('All Customer Groups'), 'is_group': 1, 	'name': _('All Customer Groups'), 'parent_customer_group': ''},
-		{'doctype': 'Customer Group', 'customer_group_name': _('Individual'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')},
-		{'doctype': 'Customer Group', 'customer_group_name': _('Commercial'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')},
-		{'doctype': 'Customer Group', 'customer_group_name': _('Non Profit'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')},
-		{'doctype': 'Customer Group', 'customer_group_name': _('Government'), 'is_group': 0, 'parent_customer_group': _('All Customer Groups')},
-
+		{
+			"doctype": "Customer Group",
+			"customer_group_name": _("All Customer Groups"),
+			"is_group": 1,
+			"name": _("All Customer Groups"),
+			"parent_customer_group": "",
+		},
+		{
+			"doctype": "Customer Group",
+			"customer_group_name": _("Individual"),
+			"is_group": 0,
+			"parent_customer_group": _("All Customer Groups"),
+		},
+		{
+			"doctype": "Customer Group",
+			"customer_group_name": _("Commercial"),
+			"is_group": 0,
+			"parent_customer_group": _("All Customer Groups"),
+		},
+		{
+			"doctype": "Customer Group",
+			"customer_group_name": _("Non Profit"),
+			"is_group": 0,
+			"parent_customer_group": _("All Customer Groups"),
+		},
+		{
+			"doctype": "Customer Group",
+			"customer_group_name": _("Government"),
+			"is_group": 0,
+			"parent_customer_group": _("All Customer Groups"),
+		},
 		# supplier group
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('All Supplier Groups'), 'is_group': 1, 'name': _('All Supplier Groups'), 'parent_supplier_group': ''},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Services'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Local'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Raw Material'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Electrical'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Hardware'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Pharmaceutical'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-		{'doctype': 'Supplier Group', 'supplier_group_name': _('Distributor'), 'is_group': 0, 'parent_supplier_group': _('All Supplier Groups')},
-
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("All Supplier Groups"),
+			"is_group": 1,
+			"name": _("All Supplier Groups"),
+			"parent_supplier_group": "",
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Services"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Local"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Raw Material"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Electrical"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Hardware"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Pharmaceutical"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
+		{
+			"doctype": "Supplier Group",
+			"supplier_group_name": _("Distributor"),
+			"is_group": 0,
+			"parent_supplier_group": _("All Supplier Groups"),
+		},
 		# Sales Person
-		{'doctype': 'Sales Person', 'sales_person_name': _('Sales Team'), 'is_group': 1, "parent_sales_person": ""},
-
+		{
+			"doctype": "Sales Person",
+			"sales_person_name": _("Sales Team"),
+			"is_group": 1,
+			"parent_sales_person": "",
+		},
 		# Mode of Payment
-		{'doctype': 'Mode of Payment',
-			'mode_of_payment': 'Check' if country=="United States" else _('Cheque'),
-			'type': 'Bank'},
-		{'doctype': 'Mode of Payment', 'mode_of_payment': _('Cash'),
-			'type': 'Cash'},
-		{'doctype': 'Mode of Payment', 'mode_of_payment': _('Credit Card'),
-			'type': 'Bank'},
-		{'doctype': 'Mode of Payment', 'mode_of_payment': _('Wire Transfer'),
-			'type': 'Bank'},
-		{'doctype': 'Mode of Payment', 'mode_of_payment': _('Bank Draft'),
-			'type': 'Bank'},
-
+		{
+			"doctype": "Mode of Payment",
+			"mode_of_payment": "Check" if country == "United States" else _("Cheque"),
+			"type": "Bank",
+		},
+		{"doctype": "Mode of Payment", "mode_of_payment": _("Cash"), "type": "Cash"},
+		{"doctype": "Mode of Payment", "mode_of_payment": _("Credit Card"), "type": "Bank"},
+		{"doctype": "Mode of Payment", "mode_of_payment": _("Wire Transfer"), "type": "Bank"},
+		{"doctype": "Mode of Payment", "mode_of_payment": _("Bank Draft"), "type": "Bank"},
 		# Activity Type
-		{'doctype': 'Activity Type', 'activity_type': _('Planning')},
-		{'doctype': 'Activity Type', 'activity_type': _('Research')},
-		{'doctype': 'Activity Type', 'activity_type': _('Proposal Writing')},
-		{'doctype': 'Activity Type', 'activity_type': _('Execution')},
-		{'doctype': 'Activity Type', 'activity_type': _('Communication')},
-
-		{'doctype': "Item Attribute", "attribute_name": _("Size"), "item_attribute_values": [
-			{"attribute_value": _("Extra Small"), "abbr": "XS"},
-			{"attribute_value": _("Small"), "abbr": "S"},
-			{"attribute_value": _("Medium"), "abbr": "M"},
-			{"attribute_value": _("Large"), "abbr": "L"},
-			{"attribute_value": _("Extra Large"), "abbr": "XL"}
-		]},
-
-		{'doctype': "Item Attribute", "attribute_name": _("Colour"), "item_attribute_values": [
-			{"attribute_value": _("Red"), "abbr": "RED"},
-			{"attribute_value": _("Green"), "abbr": "GRE"},
-			{"attribute_value": _("Blue"), "abbr": "BLU"},
-			{"attribute_value": _("Black"), "abbr": "BLA"},
-			{"attribute_value": _("White"), "abbr": "WHI"}
-		]},
-
+		{"doctype": "Activity Type", "activity_type": _("Planning")},
+		{"doctype": "Activity Type", "activity_type": _("Research")},
+		{"doctype": "Activity Type", "activity_type": _("Proposal Writing")},
+		{"doctype": "Activity Type", "activity_type": _("Execution")},
+		{"doctype": "Activity Type", "activity_type": _("Communication")},
+		{
+			"doctype": "Item Attribute",
+			"attribute_name": _("Size"),
+			"item_attribute_values": [
+				{"attribute_value": _("Extra Small"), "abbr": "XS"},
+				{"attribute_value": _("Small"), "abbr": "S"},
+				{"attribute_value": _("Medium"), "abbr": "M"},
+				{"attribute_value": _("Large"), "abbr": "L"},
+				{"attribute_value": _("Extra Large"), "abbr": "XL"},
+			],
+		},
+		{
+			"doctype": "Item Attribute",
+			"attribute_name": _("Colour"),
+			"item_attribute_values": [
+				{"attribute_value": _("Red"), "abbr": "RED"},
+				{"attribute_value": _("Green"), "abbr": "GRE"},
+				{"attribute_value": _("Blue"), "abbr": "BLU"},
+				{"attribute_value": _("Black"), "abbr": "BLA"},
+				{"attribute_value": _("White"), "abbr": "WHI"},
+			],
+		},
 		# Issue Priority
-		{'doctype': 'Issue Priority', 'name': _('Low')},
-		{'doctype': 'Issue Priority', 'name': _('Medium')},
-		{'doctype': 'Issue Priority', 'name': _('High')},
-
-		#Job Applicant Source
-		{'doctype': 'Job Applicant Source', 'source_name': _('Website Listing')},
-		{'doctype': 'Job Applicant Source', 'source_name': _('Walk In')},
-		{'doctype': 'Job Applicant Source', 'source_name': _('Employee Referral')},
-		{'doctype': 'Job Applicant Source', 'source_name': _('Campaign')},
-
-		{'doctype': "Email Account", "email_id": "sales@example.com", "append_to": "Opportunity"},
-		{'doctype': "Email Account", "email_id": "support@example.com", "append_to": "Issue"},
-		{'doctype': "Email Account", "email_id": "jobs@example.com", "append_to": "Job Applicant"},
-
-		{'doctype': "Party Type", "party_type": "Customer", "account_type": "Receivable"},
-		{'doctype': "Party Type", "party_type": "Supplier", "account_type": "Payable"},
-		{'doctype': "Party Type", "party_type": "Employee", "account_type": "Payable"},
-		{'doctype': "Party Type", "party_type": "Shareholder", "account_type": "Payable"},
-		{'doctype': "Party Type", "party_type": "Student", "account_type": "Receivable"},
-
-		{'doctype': "Opportunity Type", "name": _("Sales")},
-		{'doctype': "Opportunity Type", "name": _("Support")},
-		{'doctype': "Opportunity Type", "name": _("Maintenance")},
-
-		{'doctype': "Project Type", "project_type": "Internal"},
-		{'doctype': "Project Type", "project_type": "External"},
-		{'doctype': "Project Type", "project_type": "Other"},
-
+		{"doctype": "Issue Priority", "name": _("Low")},
+		{"doctype": "Issue Priority", "name": _("Medium")},
+		{"doctype": "Issue Priority", "name": _("High")},
+		# Job Applicant Source
+		{"doctype": "Job Applicant Source", "source_name": _("Website Listing")},
+		{"doctype": "Job Applicant Source", "source_name": _("Walk In")},
+		{"doctype": "Job Applicant Source", "source_name": _("Employee Referral")},
+		{"doctype": "Job Applicant Source", "source_name": _("Campaign")},
+		{"doctype": "Email Account", "email_id": "sales@example.com", "append_to": "Opportunity"},
+		{"doctype": "Email Account", "email_id": "support@example.com", "append_to": "Issue"},
+		{"doctype": "Email Account", "email_id": "jobs@example.com", "append_to": "Job Applicant"},
+		{"doctype": "Party Type", "party_type": "Customer", "account_type": "Receivable"},
+		{"doctype": "Party Type", "party_type": "Supplier", "account_type": "Payable"},
+		{"doctype": "Party Type", "party_type": "Employee", "account_type": "Payable"},
+		{"doctype": "Party Type", "party_type": "Shareholder", "account_type": "Payable"},
+		{"doctype": "Party Type", "party_type": "Student", "account_type": "Receivable"},
+		{"doctype": "Opportunity Type", "name": _("Sales")},
+		{"doctype": "Opportunity Type", "name": _("Support")},
+		{"doctype": "Opportunity Type", "name": _("Maintenance")},
+		{"doctype": "Project Type", "project_type": "Internal"},
+		{"doctype": "Project Type", "project_type": "External"},
+		{"doctype": "Project Type", "project_type": "Other"},
 		{"doctype": "Offer Term", "offer_term": _("Date of Joining")},
 		{"doctype": "Offer Term", "offer_term": _("Annual Salary")},
 		{"doctype": "Offer Term", "offer_term": _("Probationary Period")},
@@ -218,23 +395,22 @@
 		{"doctype": "Offer Term", "offer_term": _("Leaves per Year")},
 		{"doctype": "Offer Term", "offer_term": _("Notice Period")},
 		{"doctype": "Offer Term", "offer_term": _("Incentives")},
-
-		{'doctype': "Print Heading", 'print_heading': _("Credit Note")},
-		{'doctype': "Print Heading", 'print_heading': _("Debit Note")},
-
+		{"doctype": "Print Heading", "print_heading": _("Credit Note")},
+		{"doctype": "Print Heading", "print_heading": _("Debit Note")},
 		# Assessment Group
-		{'doctype': 'Assessment Group', 'assessment_group_name': _('All Assessment Groups'),
-			'is_group': 1, 'parent_assessment_group': ''},
-
+		{
+			"doctype": "Assessment Group",
+			"assessment_group_name": _("All Assessment Groups"),
+			"is_group": 1,
+			"parent_assessment_group": "",
+		},
 		# Share Management
 		{"doctype": "Share Type", "title": _("Equity")},
 		{"doctype": "Share Type", "title": _("Preference")},
-
 		# Market Segments
 		{"doctype": "Market Segment", "market_segment": _("Lower Income")},
 		{"doctype": "Market Segment", "market_segment": _("Middle Income")},
 		{"doctype": "Market Segment", "market_segment": _("Upper Income")},
-
 		# Sales Stages
 		{"doctype": "Sales Stage", "stage_name": _("Prospecting")},
 		{"doctype": "Sales Stage", "stage_name": _("Qualification")},
@@ -244,47 +420,101 @@
 		{"doctype": "Sales Stage", "stage_name": _("Perception Analysis")},
 		{"doctype": "Sales Stage", "stage_name": _("Proposal/Price Quote")},
 		{"doctype": "Sales Stage", "stage_name": _("Negotiation/Review")},
-
 		# Warehouse Type
-		{'doctype': 'Warehouse Type', 'name': 'Transit'},
+		{"doctype": "Warehouse Type", "name": "Transit"},
 	]
 
 	from erpnext.setup.setup_wizard.data.industry_type import get_industry_types
-	records += [{"doctype":"Industry Type", "industry": d} for d in get_industry_types()]
-	# records += [{"doctype":"Operation", "operation": d} for d in get_operations()]
-	records += [{'doctype': 'Lead Source', 'source_name': _(d)} for d in default_lead_sources]
 
-	records += [{'doctype': 'Sales Partner Type', 'sales_partner_type': _(d)} for d in default_sales_partner_type]
+	records += [{"doctype": "Industry Type", "industry": d} for d in get_industry_types()]
+	# records += [{"doctype":"Operation", "operation": d} for d in get_operations()]
+	records += [{"doctype": "Lead Source", "source_name": _(d)} for d in default_lead_sources]
+
+	records += [
+		{"doctype": "Sales Partner Type", "sales_partner_type": _(d)} for d in default_sales_partner_type
+	]
 
 	base_path = frappe.get_app_path("erpnext", "hr", "doctype")
-	response = frappe.read_file(os.path.join(base_path, "leave_application/leave_application_email_template.html"))
+	response = frappe.read_file(
+		os.path.join(base_path, "leave_application/leave_application_email_template.html")
+	)
 
-	records += [{'doctype': 'Email Template', 'name': _("Leave Approval Notification"), 'response': response,
-		'subject': _("Leave Approval Notification"), 'owner': frappe.session.user}]
+	records += [
+		{
+			"doctype": "Email Template",
+			"name": _("Leave Approval Notification"),
+			"response": response,
+			"subject": _("Leave Approval Notification"),
+			"owner": frappe.session.user,
+		}
+	]
 
-	records += [{'doctype': 'Email Template', 'name': _("Leave Status Notification"), 'response': response,
-		'subject': _("Leave Status Notification"), 'owner': frappe.session.user}]
+	records += [
+		{
+			"doctype": "Email Template",
+			"name": _("Leave Status Notification"),
+			"response": response,
+			"subject": _("Leave Status Notification"),
+			"owner": frappe.session.user,
+		}
+	]
 
-	response = frappe.read_file(os.path.join(base_path, "interview/interview_reminder_notification_template.html"))
+	response = frappe.read_file(
+		os.path.join(base_path, "interview/interview_reminder_notification_template.html")
+	)
 
-	records += [{'doctype': 'Email Template', 'name': _('Interview Reminder'), 'response': response,
-		'subject': _('Interview Reminder'), 'owner': frappe.session.user}]
+	records += [
+		{
+			"doctype": "Email Template",
+			"name": _("Interview Reminder"),
+			"response": response,
+			"subject": _("Interview Reminder"),
+			"owner": frappe.session.user,
+		}
+	]
 
-	response = frappe.read_file(os.path.join(base_path, "interview/interview_feedback_reminder_template.html"))
+	response = frappe.read_file(
+		os.path.join(base_path, "interview/interview_feedback_reminder_template.html")
+	)
 
-	records += [{'doctype': 'Email Template', 'name': _('Interview Feedback Reminder'), 'response': response,
-		'subject': _('Interview Feedback Reminder'), 'owner': frappe.session.user}]
+	records += [
+		{
+			"doctype": "Email Template",
+			"name": _("Interview Feedback Reminder"),
+			"response": response,
+			"subject": _("Interview Feedback Reminder"),
+			"owner": frappe.session.user,
+		}
+	]
 
-	response = frappe.read_file(os.path.join(base_path, 'exit_interview/exit_questionnaire_notification_template.html'))
+	response = frappe.read_file(
+		os.path.join(base_path, "exit_interview/exit_questionnaire_notification_template.html")
+	)
 
-	records += [{'doctype': 'Email Template', 'name': _('Exit Questionnaire Notification'), 'response': response,
-		'subject': _('Exit Questionnaire Notification'), 'owner': frappe.session.user}]
+	records += [
+		{
+			"doctype": "Email Template",
+			"name": _("Exit Questionnaire Notification"),
+			"response": response,
+			"subject": _("Exit Questionnaire Notification"),
+			"owner": frappe.session.user,
+		}
+	]
 
 	base_path = frappe.get_app_path("erpnext", "stock", "doctype")
-	response = frappe.read_file(os.path.join(base_path, "delivery_trip/dispatch_notification_template.html"))
+	response = frappe.read_file(
+		os.path.join(base_path, "delivery_trip/dispatch_notification_template.html")
+	)
 
-	records += [{'doctype': 'Email Template', 'name': _("Dispatch Notification"), 'response': response,
-		'subject': _("Your order is out for delivery!"), 'owner': frappe.session.user}]
+	records += [
+		{
+			"doctype": "Email Template",
+			"name": _("Dispatch Notification"),
+			"response": response,
+			"subject": _("Your order is out for delivery!"),
+			"owner": frappe.session.user,
+		}
+	]
 
 	# Records for the Supplier Scorecard
 	from erpnext.buying.doctype.supplier_scorecard.supplier_scorecard import make_default_records
@@ -295,6 +525,7 @@
 	set_more_defaults()
 	update_global_search_doctypes()
 
+
 def set_more_defaults():
 	# Do more setup stuff that can be done here with no dependencies
 	update_selling_defaults()
@@ -303,6 +534,7 @@
 	add_uom_data()
 	update_item_variant_settings()
 
+
 def update_selling_defaults():
 	selling_settings = frappe.get_doc("Selling Settings")
 	selling_settings.cust_master_name = "Customer Name"
@@ -312,6 +544,7 @@
 	selling_settings.sales_update_frequency = "Each Transaction"
 	selling_settings.save()
 
+
 def update_buying_defaults():
 	buying_settings = frappe.get_doc("Buying Settings")
 	buying_settings.supp_master_name = "Supplier Name"
@@ -321,6 +554,7 @@
 	buying_settings.allow_multiple_items = 1
 	buying_settings.save()
 
+
 def update_hr_defaults():
 	hr_settings = frappe.get_doc("HR Settings")
 	hr_settings.emp_created_by = "Naming Series"
@@ -336,53 +570,66 @@
 
 	hr_settings.save()
 
+
 def update_item_variant_settings():
 	# set no copy fields of an item doctype to item variant settings
-	doc = frappe.get_doc('Item Variant Settings')
+	doc = frappe.get_doc("Item Variant Settings")
 	doc.set_default_fields()
 	doc.save()
 
+
 def add_uom_data():
 	# add UOMs
-	uoms = json.loads(open(frappe.get_app_path("erpnext", "setup", "setup_wizard", "data", "uom_data.json")).read())
+	uoms = json.loads(
+		open(frappe.get_app_path("erpnext", "setup", "setup_wizard", "data", "uom_data.json")).read()
+	)
 	for d in uoms:
-		if not frappe.db.exists('UOM', _(d.get("uom_name"))):
-			uom_doc = frappe.get_doc({
-				"doctype": "UOM",
-				"uom_name": _(d.get("uom_name")),
-				"name": _(d.get("uom_name")),
-				"must_be_whole_number": d.get("must_be_whole_number"),
-				"enabled": 1,
-			}).db_insert()
+		if not frappe.db.exists("UOM", _(d.get("uom_name"))):
+			uom_doc = frappe.get_doc(
+				{
+					"doctype": "UOM",
+					"uom_name": _(d.get("uom_name")),
+					"name": _(d.get("uom_name")),
+					"must_be_whole_number": d.get("must_be_whole_number"),
+					"enabled": 1,
+				}
+			).db_insert()
 
 	# bootstrap uom conversion factors
-	uom_conversions = json.loads(open(frappe.get_app_path("erpnext", "setup", "setup_wizard", "data", "uom_conversion_data.json")).read())
+	uom_conversions = json.loads(
+		open(
+			frappe.get_app_path("erpnext", "setup", "setup_wizard", "data", "uom_conversion_data.json")
+		).read()
+	)
 	for d in uom_conversions:
 		if not frappe.db.exists("UOM Category", _(d.get("category"))):
-			frappe.get_doc({
-				"doctype": "UOM Category",
-				"category_name": _(d.get("category"))
-			}).db_insert()
+			frappe.get_doc({"doctype": "UOM Category", "category_name": _(d.get("category"))}).db_insert()
 
-		if not frappe.db.exists("UOM Conversion Factor", {"from_uom": _(d.get("from_uom")), "to_uom": _(d.get("to_uom"))}):
-			uom_conversion = frappe.get_doc({
-				"doctype": "UOM Conversion Factor",
-				"category": _(d.get("category")),
-				"from_uom": _(d.get("from_uom")),
-				"to_uom": _(d.get("to_uom")),
-				"value": d.get("value")
-			}).insert(ignore_permissions=True)
+		if not frappe.db.exists(
+			"UOM Conversion Factor", {"from_uom": _(d.get("from_uom")), "to_uom": _(d.get("to_uom"))}
+		):
+			uom_conversion = frappe.get_doc(
+				{
+					"doctype": "UOM Conversion Factor",
+					"category": _(d.get("category")),
+					"from_uom": _(d.get("from_uom")),
+					"to_uom": _(d.get("to_uom")),
+					"value": d.get("value"),
+				}
+			).insert(ignore_permissions=True)
+
 
 def add_market_segments():
 	records = [
 		# Market Segments
 		{"doctype": "Market Segment", "market_segment": _("Lower Income")},
 		{"doctype": "Market Segment", "market_segment": _("Middle Income")},
-		{"doctype": "Market Segment", "market_segment": _("Upper Income")}
+		{"doctype": "Market Segment", "market_segment": _("Upper Income")},
 	]
 
 	make_records(records)
 
+
 def add_sale_stages():
 	# Sale Stages
 	records = [
@@ -393,33 +640,33 @@
 		{"doctype": "Sales Stage", "stage_name": _("Identifying Decision Makers")},
 		{"doctype": "Sales Stage", "stage_name": _("Perception Analysis")},
 		{"doctype": "Sales Stage", "stage_name": _("Proposal/Price Quote")},
-		{"doctype": "Sales Stage", "stage_name": _("Negotiation/Review")}
+		{"doctype": "Sales Stage", "stage_name": _("Negotiation/Review")},
 	]
 	for sales_stage in records:
 		frappe.get_doc(sales_stage).db_insert()
 
+
 def install_company(args):
 	records = [
 		# Fiscal Year
 		{
-			'doctype': "Fiscal Year",
-			'year': get_fy_details(args.fy_start_date, args.fy_end_date),
-			'year_start_date': args.fy_start_date,
-			'year_end_date': args.fy_end_date
+			"doctype": "Fiscal Year",
+			"year": get_fy_details(args.fy_start_date, args.fy_end_date),
+			"year_start_date": args.fy_start_date,
+			"year_end_date": args.fy_end_date,
 		},
-
 		# Company
 		{
-			"doctype":"Company",
-			'company_name': args.company_name,
-			'enable_perpetual_inventory': 1,
-			'abbr': args.company_abbr,
-			'default_currency': args.currency,
-			'country': args.country,
-			'create_chart_of_accounts_based_on': 'Standard Template',
-			'chart_of_accounts': args.chart_of_accounts,
-			'domain': args.domain
-		}
+			"doctype": "Company",
+			"company_name": args.company_name,
+			"enable_perpetual_inventory": 1,
+			"abbr": args.company_abbr,
+			"default_currency": args.currency,
+			"country": args.country,
+			"create_chart_of_accounts_based_on": "Standard Template",
+			"chart_of_accounts": args.chart_of_accounts,
+			"domain": args.domain,
+		},
 	]
 
 	make_records(records)
@@ -428,20 +675,90 @@
 def install_post_company_fixtures(args=None):
 	records = [
 		# Department
-		{'doctype': 'Department', 'department_name': _('All Departments'), 'is_group': 1, 'parent_department': ''},
-		{'doctype': 'Department', 'department_name': _('Accounts'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Marketing'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Sales'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Purchase'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Operations'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Production'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Dispatch'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Customer Service'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Human Resources'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Management'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Quality Management'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Research & Development'), 'parent_department': _('All Departments'), 'company': args.company_name},
-		{'doctype': 'Department', 'department_name': _('Legal'), 'parent_department': _('All Departments'), 'company': args.company_name},
+		{
+			"doctype": "Department",
+			"department_name": _("All Departments"),
+			"is_group": 1,
+			"parent_department": "",
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Accounts"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Marketing"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Sales"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Purchase"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Operations"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Production"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Dispatch"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Customer Service"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Human Resources"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Management"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Quality Management"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Research & Development"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
+		{
+			"doctype": "Department",
+			"department_name": _("Legal"),
+			"parent_department": _("All Departments"),
+			"company": args.company_name,
+		},
 	]
 
 	# Make root department with NSM updation
@@ -456,8 +773,22 @@
 def install_defaults(args=None):
 	records = [
 		# Price Lists
-		{ "doctype": "Price List", "price_list_name": _("Standard Buying"), "enabled": 1, "buying": 1, "selling": 0, "currency": args.currency },
-		{ "doctype": "Price List", "price_list_name": _("Standard Selling"), "enabled": 1, "buying": 0, "selling": 1, "currency": args.currency },
+		{
+			"doctype": "Price List",
+			"price_list_name": _("Standard Buying"),
+			"enabled": 1,
+			"buying": 1,
+			"selling": 0,
+			"currency": args.currency,
+		},
+		{
+			"doctype": "Price List",
+			"price_list_name": _("Standard Selling"),
+			"enabled": 1,
+			"buying": 0,
+			"selling": 1,
+			"currency": args.currency,
+		},
 	]
 
 	make_records(records)
@@ -474,27 +805,34 @@
 	args.update({"set_default": 1})
 	create_bank_account(args)
 
+
 def set_global_defaults(args):
 	global_defaults = frappe.get_doc("Global Defaults", "Global Defaults")
 	current_fiscal_year = frappe.get_all("Fiscal Year")[0]
 
-	global_defaults.update({
-		'current_fiscal_year': current_fiscal_year.name,
-		'default_currency': args.get('currency'),
-		'default_company':args.get('company_name')	,
-		"country": args.get("country"),
-	})
+	global_defaults.update(
+		{
+			"current_fiscal_year": current_fiscal_year.name,
+			"default_currency": args.get("currency"),
+			"default_company": args.get("company_name"),
+			"country": args.get("country"),
+		}
+	)
 
 	global_defaults.save()
 
+
 def set_active_domains(args):
-	frappe.get_single('Domain Settings').set_active_domains(args.get('domains'))
+	frappe.get_single("Domain Settings").set_active_domains(args.get("domains"))
+
 
 def update_stock_settings():
 	stock_settings = frappe.get_doc("Stock Settings")
 	stock_settings.item_naming_by = "Item Code"
 	stock_settings.valuation_method = "FIFO"
-	stock_settings.default_warehouse = frappe.db.get_value('Warehouse', {'warehouse_name': _('Stores')})
+	stock_settings.default_warehouse = frappe.db.get_value(
+		"Warehouse", {"warehouse_name": _("Stores")}
+	)
 	stock_settings.stock_uom = _("Nos")
 	stock_settings.auto_indent = 1
 	stock_settings.auto_insert_price_list_rate_if_missing = 1
@@ -502,52 +840,65 @@
 	stock_settings.set_qty_in_transactions_based_on_serial_no_input = 1
 	stock_settings.save()
 
+
 def create_bank_account(args):
-	if not args.get('bank_account'):
+	if not args.get("bank_account"):
 		return
 
-	company_name = args.get('company_name')
-	bank_account_group =  frappe.db.get_value("Account",
-		{"account_type": "Bank", "is_group": 1, "root_type": "Asset",
-			"company": company_name})
+	company_name = args.get("company_name")
+	bank_account_group = frappe.db.get_value(
+		"Account", {"account_type": "Bank", "is_group": 1, "root_type": "Asset", "company": company_name}
+	)
 	if bank_account_group:
-		bank_account = frappe.get_doc({
-			"doctype": "Account",
-			'account_name': args.get('bank_account'),
-			'parent_account': bank_account_group,
-			'is_group':0,
-			'company': company_name,
-			"account_type": "Bank",
-		})
+		bank_account = frappe.get_doc(
+			{
+				"doctype": "Account",
+				"account_name": args.get("bank_account"),
+				"parent_account": bank_account_group,
+				"is_group": 0,
+				"company": company_name,
+				"account_type": "Bank",
+			}
+		)
 		try:
 			doc = bank_account.insert()
 
-			if args.get('set_default'):
-				frappe.db.set_value("Company", args.get('company_name'), "default_bank_account", bank_account.name, update_modified=False)
+			if args.get("set_default"):
+				frappe.db.set_value(
+					"Company",
+					args.get("company_name"),
+					"default_bank_account",
+					bank_account.name,
+					update_modified=False,
+				)
 
 			return doc
 
 		except RootNotEditable:
-			frappe.throw(_("Bank account cannot be named as {0}").format(args.get('bank_account')))
+			frappe.throw(_("Bank account cannot be named as {0}").format(args.get("bank_account")))
 		except frappe.DuplicateEntryError:
 			# bank account same as a CoA entry
 			pass
 
-def update_shopping_cart_settings(args): # nosemgrep
+
+def update_shopping_cart_settings(args):  # nosemgrep
 	shopping_cart = frappe.get_doc("E Commerce Settings")
-	shopping_cart.update({
-		"enabled": 1,
-		'company': args.company_name,
-		'price_list': frappe.db.get_value("Price List", {"selling": 1}),
-		'default_customer_group': _("Individual"),
-		'quotation_series': "QTN-",
-	})
+	shopping_cart.update(
+		{
+			"enabled": 1,
+			"company": args.company_name,
+			"price_list": frappe.db.get_value("Price List", {"selling": 1}),
+			"default_customer_group": _("Individual"),
+			"quotation_series": "QTN-",
+		}
+	)
 	shopping_cart.update_single(shopping_cart.get_valid_dict())
 
+
 def get_fy_details(fy_start_date, fy_end_date):
 	start_year = getdate(fy_start_date).year
 	if start_year == getdate(fy_end_date).year:
 		fy = cstr(start_year)
 	else:
-		fy = cstr(start_year) + '-' + cstr(start_year + 1)
+		fy = cstr(start_year) + "-" + cstr(start_year + 1)
 	return fy
diff --git a/erpnext/setup/setup_wizard/operations/taxes_setup.py b/erpnext/setup/setup_wizard/operations/taxes_setup.py
index 289ffa5..39dc7e3 100644
--- a/erpnext/setup/setup_wizard/operations/taxes_setup.py
+++ b/erpnext/setup/setup_wizard/operations/taxes_setup.py
@@ -10,11 +10,11 @@
 
 
 def setup_taxes_and_charges(company_name: str, country: str):
-	if not frappe.db.exists('Company', company_name):
-		frappe.throw(_('Company {} does not exist yet. Taxes setup aborted.').format(company_name))
+	if not frappe.db.exists("Company", company_name):
+		frappe.throw(_("Company {} does not exist yet. Taxes setup aborted.").format(company_name))
 
-	file_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'country_wise_tax.json')
-	with open(file_path, 'r') as json_file:
+	file_path = os.path.join(os.path.dirname(__file__), "..", "data", "country_wise_tax.json")
+	with open(file_path, "r") as json_file:
 		tax_data = json.load(json_file)
 
 	country_wise_tax = tax_data.get(country)
@@ -22,7 +22,7 @@
 	if not country_wise_tax:
 		return
 
-	if 'chart_of_accounts' not in country_wise_tax:
+	if "chart_of_accounts" not in country_wise_tax:
 		country_wise_tax = simple_to_detailed(country_wise_tax)
 
 	from_detailed_data(company_name, country_wise_tax)
@@ -36,39 +36,44 @@
 	Example input:
 
 	{
-		"France VAT 20%": {
-			"account_name": "VAT 20%",
-			"tax_rate": 20,
-			"default": 1
-		},
-		"France VAT 10%": {
-			"account_name": "VAT 10%",
-			"tax_rate": 10
-		}
+	        "France VAT 20%": {
+	                "account_name": "VAT 20%",
+	                "tax_rate": 20,
+	                "default": 1
+	        },
+	        "France VAT 10%": {
+	                "account_name": "VAT 10%",
+	                "tax_rate": 10
+	        }
 	}
 	"""
 	return {
-		'chart_of_accounts': {
-			'*': {
-				'item_tax_templates': [{
-					'title': title,
-					'taxes': [{
-						'tax_type': {
-							'account_name': data.get('account_name'),
-							'tax_rate': data.get('tax_rate')
-						}
-					}]
-				} for title, data in templates.items()],
-				'*': [{
-					'title': title,
-					'is_default': data.get('default', 0),
-					'taxes': [{
-						'account_head': {
-							'account_name': data.get('account_name'),
-							'tax_rate': data.get('tax_rate')
-						}
-					}]
-				} for title, data in templates.items()]
+		"chart_of_accounts": {
+			"*": {
+				"item_tax_templates": [
+					{
+						"title": title,
+						"taxes": [
+							{"tax_type": {"account_name": data.get("account_name"), "tax_rate": data.get("tax_rate")}}
+						],
+					}
+					for title, data in templates.items()
+				],
+				"*": [
+					{
+						"title": title,
+						"is_default": data.get("default", 0),
+						"taxes": [
+							{
+								"account_head": {
+									"account_name": data.get("account_name"),
+									"tax_rate": data.get("tax_rate"),
+								}
+							}
+						],
+					}
+					for title, data in templates.items()
+				],
 			}
 		}
 	}
@@ -76,13 +81,13 @@
 
 def from_detailed_data(company_name, data):
 	"""Create Taxes and Charges Templates from detailed data."""
-	coa_name = frappe.db.get_value('Company', company_name, 'chart_of_accounts')
-	coa_data = data.get('chart_of_accounts', {})
-	tax_templates = coa_data.get(coa_name) or coa_data.get('*', {})
-	tax_categories = data.get('tax_categories')
-	sales_tax_templates = tax_templates.get('sales_tax_templates') or tax_templates.get('*', {})
-	purchase_tax_templates = tax_templates.get('purchase_tax_templates') or tax_templates.get('*', {})
-	item_tax_templates = tax_templates.get('item_tax_templates') or tax_templates.get('*', {})
+	coa_name = frappe.db.get_value("Company", company_name, "chart_of_accounts")
+	coa_data = data.get("chart_of_accounts", {})
+	tax_templates = coa_data.get(coa_name) or coa_data.get("*", {})
+	tax_categories = data.get("tax_categories")
+	sales_tax_templates = tax_templates.get("sales_tax_templates") or tax_templates.get("*", {})
+	purchase_tax_templates = tax_templates.get("purchase_tax_templates") or tax_templates.get("*", {})
+	item_tax_templates = tax_templates.get("item_tax_templates") or tax_templates.get("*", {})
 
 	if tax_categories:
 		for tax_category in tax_categories:
@@ -90,11 +95,11 @@
 
 	if sales_tax_templates:
 		for template in sales_tax_templates:
-			make_taxes_and_charges_template(company_name, 'Sales Taxes and Charges Template', template)
+			make_taxes_and_charges_template(company_name, "Sales Taxes and Charges Template", template)
 
 	if purchase_tax_templates:
 		for template in purchase_tax_templates:
-			make_taxes_and_charges_template(company_name, 'Purchase Taxes and Charges Template', template)
+			make_taxes_and_charges_template(company_name, "Purchase Taxes and Charges Template", template)
 
 	if item_tax_templates:
 		for template in item_tax_templates:
@@ -102,40 +107,45 @@
 
 
 def update_regional_tax_settings(country, company):
-	path = frappe.get_app_path('erpnext', 'regional', frappe.scrub(country))
+	path = frappe.get_app_path("erpnext", "regional", frappe.scrub(country))
 	if os.path.exists(path.encode("utf-8")):
 		try:
-			module_name = "erpnext.regional.{0}.setup.update_regional_tax_settings".format(frappe.scrub(country))
+			module_name = "erpnext.regional.{0}.setup.update_regional_tax_settings".format(
+				frappe.scrub(country)
+			)
 			frappe.get_attr(module_name)(country, company)
 		except Exception as e:
 			# Log error and ignore if failed to setup regional tax settings
 			frappe.log_error()
 			pass
 
-def make_taxes_and_charges_template(company_name, doctype, template):
-	template['company'] = company_name
-	template['doctype'] = doctype
 
-	if frappe.db.exists(doctype, {'title': template.get('title'), 'company': company_name}):
+def make_taxes_and_charges_template(company_name, doctype, template):
+	template["company"] = company_name
+	template["doctype"] = doctype
+
+	if frappe.db.exists(doctype, {"title": template.get("title"), "company": company_name}):
 		return
 
-	for tax_row in template.get('taxes'):
-		account_data = tax_row.get('account_head')
+	for tax_row in template.get("taxes"):
+		account_data = tax_row.get("account_head")
 		tax_row_defaults = {
-			'category': 'Total',
-			'charge_type': 'On Net Total',
-			'cost_center': frappe.db.get_value('Company', company_name, 'cost_center')
+			"category": "Total",
+			"charge_type": "On Net Total",
+			"cost_center": frappe.db.get_value("Company", company_name, "cost_center"),
 		}
 
-		if doctype == 'Purchase Taxes and Charges Template':
-			tax_row_defaults['add_deduct_tax'] = 'Add'
+		if doctype == "Purchase Taxes and Charges Template":
+			tax_row_defaults["add_deduct_tax"] = "Add"
 
 		# if account_head is a dict, search or create the account and get it's name
 		if isinstance(account_data, dict):
-			tax_row_defaults['description'] = '{0} @ {1}'.format(account_data.get('account_name'), account_data.get('tax_rate'))
-			tax_row_defaults['rate'] = account_data.get('tax_rate')
+			tax_row_defaults["description"] = "{0} @ {1}".format(
+				account_data.get("account_name"), account_data.get("tax_rate")
+			)
+			tax_row_defaults["rate"] = account_data.get("tax_rate")
 			account = get_or_create_account(company_name, account_data)
-			tax_row['account_head'] = account.name
+			tax_row["account_head"] = account.name
 
 		# use the default value if nothing other is specified
 		for fieldname, default_value in tax_row_defaults.items():
@@ -151,28 +161,29 @@
 	doc.insert(ignore_permissions=True)
 	return doc
 
+
 def make_item_tax_template(company_name, template):
 	"""Create an Item Tax Template.
 
 	This requires a separate method because Item Tax Template is structured
 	differently from Sales and Purchase Tax Templates.
 	"""
-	doctype = 'Item Tax Template'
-	template['company'] = company_name
-	template['doctype'] = doctype
+	doctype = "Item Tax Template"
+	template["company"] = company_name
+	template["doctype"] = doctype
 
-	if frappe.db.exists(doctype, {'title': template.get('title'), 'company': company_name}):
+	if frappe.db.exists(doctype, {"title": template.get("title"), "company": company_name}):
 		return
 
-	for tax_row in template.get('taxes'):
-		account_data = tax_row.get('tax_type')
+	for tax_row in template.get("taxes"):
+		account_data = tax_row.get("tax_type")
 
 		# if tax_type is a dict, search or create the account and get it's name
 		if isinstance(account_data, dict):
 			account = get_or_create_account(company_name, account_data)
-			tax_row['tax_type'] = account.name
-			if 'tax_rate' not in tax_row:
-				tax_row['tax_rate'] = account_data.get('tax_rate')
+			tax_row["tax_type"] = account.name
+			if "tax_rate" not in tax_row:
+				tax_row["tax_rate"] = account_data.get("tax_rate")
 
 	doc = frappe.get_doc(template)
 
@@ -183,36 +194,36 @@
 	doc.insert(ignore_permissions=True)
 	return doc
 
+
 def get_or_create_account(company_name, account):
 	"""
 	Check if account already exists. If not, create it.
 	Return a tax account or None.
 	"""
-	default_root_type = 'Liability'
-	root_type = account.get('root_type', default_root_type)
+	default_root_type = "Liability"
+	root_type = account.get("root_type", default_root_type)
 
-	existing_accounts = frappe.get_all('Account',
-		filters={
-			'company': company_name,
-			'root_type': root_type
-		},
+	existing_accounts = frappe.get_all(
+		"Account",
+		filters={"company": company_name, "root_type": root_type},
 		or_filters={
-			'account_name': account.get('account_name'),
-			'account_number': account.get('account_number')
-		})
+			"account_name": account.get("account_name"),
+			"account_number": account.get("account_number"),
+		},
+	)
 
 	if existing_accounts:
-		return frappe.get_doc('Account', existing_accounts[0].name)
+		return frappe.get_doc("Account", existing_accounts[0].name)
 
 	tax_group = get_or_create_tax_group(company_name, root_type)
 
-	account['doctype'] = 'Account'
-	account['company'] = company_name
-	account['parent_account'] = tax_group
-	account['report_type'] = 'Balance Sheet'
-	account['account_type'] = 'Tax'
-	account['root_type'] = root_type
-	account['is_group'] = 0
+	account["doctype"] = "Account"
+	account["company"] = company_name
+	account["parent_account"] = tax_group
+	account["report_type"] = "Balance Sheet"
+	account["account_type"] = "Tax"
+	account["root_type"] = root_type
+	account["is_group"] = 0
 
 	doc = frappe.get_doc(account)
 	doc.flags.ignore_links = True
@@ -220,50 +231,53 @@
 	doc.insert(ignore_permissions=True, ignore_mandatory=True)
 	return doc
 
+
 def get_or_create_tax_group(company_name, root_type):
 	# Look for a group account of type 'Tax'
-	tax_group_name = frappe.db.get_value('Account', {
-		'is_group': 1,
-		'root_type': root_type,
-		'account_type': 'Tax',
-		'company': company_name
-	})
+	tax_group_name = frappe.db.get_value(
+		"Account",
+		{"is_group": 1, "root_type": root_type, "account_type": "Tax", "company": company_name},
+	)
 
 	if tax_group_name:
 		return tax_group_name
 
 	# Look for a group account named 'Duties and Taxes' or 'Tax Assets'
-	account_name = _('Duties and Taxes') if root_type == 'Liability' else _('Tax Assets')
-	tax_group_name = frappe.db.get_value('Account', {
-		'is_group': 1,
-		'root_type': root_type,
-		'account_name': account_name,
-		'company': company_name
-	})
+	account_name = _("Duties and Taxes") if root_type == "Liability" else _("Tax Assets")
+	tax_group_name = frappe.db.get_value(
+		"Account",
+		{"is_group": 1, "root_type": root_type, "account_name": account_name, "company": company_name},
+	)
 
 	if tax_group_name:
 		return tax_group_name
 
 	# Create a new group account named 'Duties and Taxes' or 'Tax Assets' just
 	# below the root account
-	root_account = frappe.get_all('Account', {
-		'is_group': 1,
-		'root_type': root_type,
-		'company': company_name,
-		'report_type': 'Balance Sheet',
-		'parent_account': ('is', 'not set')
-	}, limit=1)[0]
+	root_account = frappe.get_all(
+		"Account",
+		{
+			"is_group": 1,
+			"root_type": root_type,
+			"company": company_name,
+			"report_type": "Balance Sheet",
+			"parent_account": ("is", "not set"),
+		},
+		limit=1,
+	)[0]
 
-	tax_group_account = frappe.get_doc({
-		'doctype': 'Account',
-		'company': company_name,
-		'is_group': 1,
-		'report_type': 'Balance Sheet',
-		'root_type': root_type,
-		'account_type': 'Tax',
-		'account_name': account_name,
-		'parent_account': root_account.name
-	})
+	tax_group_account = frappe.get_doc(
+		{
+			"doctype": "Account",
+			"company": company_name,
+			"is_group": 1,
+			"report_type": "Balance Sheet",
+			"root_type": root_type,
+			"account_type": "Tax",
+			"account_name": account_name,
+			"parent_account": root_account.name,
+		}
+	)
 
 	tax_group_account.flags.ignore_links = True
 	tax_group_account.flags.ignore_validate = True
@@ -275,11 +289,11 @@
 
 
 def make_tax_category(tax_category):
-	doctype = 'Tax Category'
+	doctype = "Tax Category"
 	if isinstance(tax_category, str):
-		tax_category = {'title': tax_category}
+		tax_category = {"title": tax_category}
 
-	tax_category['doctype'] = doctype
-	if not frappe.db.exists(doctype, tax_category['title']):
+	tax_category["doctype"] = doctype
+	if not frappe.db.exists(doctype, tax_category["title"]):
 		doc = frappe.get_doc(tax_category)
 		doc.insert(ignore_permissions=True)
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index 239e145..4cae519 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -13,91 +13,60 @@
 	if frappe.db.sql("select name from tabCompany"):
 		stages = [
 			{
-				'status': _('Wrapping up'),
-				'fail_msg': _('Failed to login'),
-				'tasks': [
-					{
-						'fn': fin,
-						'args': args,
-						'fail_msg': _("Failed to login")
-					}
-				]
+				"status": _("Wrapping up"),
+				"fail_msg": _("Failed to login"),
+				"tasks": [{"fn": fin, "args": args, "fail_msg": _("Failed to login")}],
 			}
 		]
 	else:
 		stages = [
 			{
-				'status': _('Installing presets'),
-				'fail_msg': _('Failed to install presets'),
-				'tasks': [
-					{
-						'fn': stage_fixtures,
-						'args': args,
-						'fail_msg': _("Failed to install presets")
-					}
-				]
+				"status": _("Installing presets"),
+				"fail_msg": _("Failed to install presets"),
+				"tasks": [{"fn": stage_fixtures, "args": args, "fail_msg": _("Failed to install presets")}],
 			},
 			{
-				'status': _('Setting up company'),
-				'fail_msg': _('Failed to setup company'),
-				'tasks': [
-					{
-						'fn': setup_company,
-						'args': args,
-						'fail_msg': _("Failed to setup company")
-					}
-				]
+				"status": _("Setting up company"),
+				"fail_msg": _("Failed to setup company"),
+				"tasks": [{"fn": setup_company, "args": args, "fail_msg": _("Failed to setup company")}],
 			},
 			{
-				'status': _('Setting defaults'),
-				'fail_msg': 'Failed to set defaults',
-				'tasks': [
-					{
-						'fn': setup_defaults,
-						'args': args,
-						'fail_msg': _("Failed to setup defaults")
-					},
-					{
-						'fn': stage_four,
-						'args': args,
-						'fail_msg': _("Failed to create website")
-					},
-					{
-						'fn': set_active_domains,
-						'args': args,
-						'fail_msg': _("Failed to add Domain")
-					},
-				]
+				"status": _("Setting defaults"),
+				"fail_msg": "Failed to set defaults",
+				"tasks": [
+					{"fn": setup_defaults, "args": args, "fail_msg": _("Failed to setup defaults")},
+					{"fn": stage_four, "args": args, "fail_msg": _("Failed to create website")},
+					{"fn": set_active_domains, "args": args, "fail_msg": _("Failed to add Domain")},
+				],
 			},
 			{
-				'status': _('Wrapping up'),
-				'fail_msg': _('Failed to login'),
-				'tasks': [
-					{
-						'fn': fin,
-						'args': args,
-						'fail_msg': _("Failed to login")
-					}
-				]
-			}
+				"status": _("Wrapping up"),
+				"fail_msg": _("Failed to login"),
+				"tasks": [{"fn": fin, "args": args, "fail_msg": _("Failed to login")}],
+			},
 		]
 
 	return stages
 
+
 def stage_fixtures(args):
-	fixtures.install(args.get('country'))
+	fixtures.install(args.get("country"))
+
 
 def setup_company(args):
 	fixtures.install_company(args)
 
+
 def setup_defaults(args):
 	fixtures.install_defaults(frappe._dict(args))
 
+
 def stage_four(args):
 	company_setup.create_website(args)
 	company_setup.create_email_digest()
 	company_setup.create_logo(args)
 
+
 def fin(args):
 	frappe.local.message_log = []
 	login_as_first_user(args)
@@ -116,6 +85,7 @@
 	stage_four(args)
 	fin(args)
 
+
 def set_active_domains(args):
-	domain_settings = frappe.get_single('Domain Settings')
-	domain_settings.set_active_domains(args.get('domains'))
+	domain_settings = frappe.get_single("Domain Settings")
+	domain_settings.set_active_domains(args.get("domains"))
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 01884d9..2200e6c 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -17,23 +17,25 @@
 
 	if not frappe.db.a_row_exists("Company"):
 		current_year = now_datetime().year
-		setup_complete({
-			"currency"          :"USD",
-			"full_name"         :"Test User",
-			"company_name"      :"Wind Power LLC",
-			"timezone"          :"America/New_York",
-			"company_abbr"      :"WP",
-			"industry"          :"Manufacturing",
-			"country"           :"United States",
-			"fy_start_date"     :f"{current_year}-01-01",
-			"fy_end_date"       :f"{current_year}-12-31",
-			"language"          :"english",
-			"company_tagline"   :"Testing",
-			"email"             :"test@erpnext.com",
-			"password"          :"test",
-			"chart_of_accounts" : "Standard",
-			"domains"           : ["Manufacturing"],
-		})
+		setup_complete(
+			{
+				"currency": "USD",
+				"full_name": "Test User",
+				"company_name": "Wind Power LLC",
+				"timezone": "America/New_York",
+				"company_abbr": "WP",
+				"industry": "Manufacturing",
+				"country": "United States",
+				"fy_start_date": f"{current_year}-01-01",
+				"fy_end_date": f"{current_year}-12-31",
+				"language": "english",
+				"company_tagline": "Testing",
+				"email": "test@erpnext.com",
+				"password": "test",
+				"chart_of_accounts": "Standard",
+				"domains": ["Manufacturing"],
+			}
+		)
 		_enable_all_domains()
 
 	frappe.db.sql("delete from `tabLeave Allocation`")
@@ -47,6 +49,7 @@
 
 	frappe.db.commit()
 
+
 @frappe.whitelist()
 def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=None):
 	if not (from_currency and to_currency):
@@ -63,7 +66,7 @@
 	filters = [
 		["date", "<=", get_datetime_str(transaction_date)],
 		["from_currency", "=", from_currency],
-		["to_currency", "=", to_currency]
+		["to_currency", "=", to_currency],
 	]
 
 	if args == "for_buying":
@@ -78,8 +81,8 @@
 
 	# cksgb 19/09/2016: get last entry in Currency Exchange with from_currency and to_currency.
 	entries = frappe.get_all(
-		"Currency Exchange", fields=["exchange_rate"], filters=filters, order_by="date desc",
-		limit=1)
+		"Currency Exchange", fields=["exchange_rate"], filters=filters, order_by="date desc", limit=1
+	)
 	if entries:
 		return flt(entries[0].exchange_rate)
 
@@ -90,11 +93,12 @@
 
 		if not value:
 			import requests
-			settings = frappe.get_cached_doc('Currency Exchange Settings')
+
+			settings = frappe.get_cached_doc("Currency Exchange Settings")
 			req_params = {
 				"transaction_date": transaction_date,
 				"from_currency": from_currency,
-				"to_currency": to_currency
+				"to_currency": to_currency,
 			}
 			params = {}
 			for row in settings.req_params:
@@ -109,18 +113,24 @@
 		return flt(value)
 	except Exception:
 		frappe.log_error(title="Get Exchange Rate")
-		frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}. Please create a Currency Exchange record manually").format(from_currency, to_currency, transaction_date))
+		frappe.msgprint(
+			_(
+				"Unable to find exchange rate for {0} to {1} for key date {2}. Please create a Currency Exchange record manually"
+			).format(from_currency, to_currency, transaction_date)
+		)
 		return 0.0
 
+
 def format_ces_api(data, param):
 	return data.format(
 		transaction_date=param.get("transaction_date"),
 		to_currency=param.get("to_currency"),
-		from_currency=param.get("from_currency")
+		from_currency=param.get("from_currency"),
 	)
 
+
 def enable_all_roles_and_domains():
-	""" enable all roles and domain for testing """
+	"""enable all roles and domain for testing"""
 	_enable_all_domains()
 	_enable_all_roles_for_admin()
 
@@ -129,18 +139,19 @@
 	domains = frappe.get_all("Domain", pluck="name")
 	if not domains:
 		return
-	frappe.get_single('Domain Settings').set_active_domains(domains)
+	frappe.get_single("Domain Settings").set_active_domains(domains)
 
 
 def _enable_all_roles_for_admin():
 	from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
 
 	all_roles = set(frappe.db.get_values("Role", pluck="name"))
-	admin_roles = set(frappe.db.get_values("Has Role",
-		{"parent": "Administrator"}, fieldname="role", pluck="role"))
+	admin_roles = set(
+		frappe.db.get_values("Has Role", {"parent": "Administrator"}, fieldname="role", pluck="role")
+	)
 
 	if all_roles.difference(admin_roles):
-		add_all_roles_to('Administrator')
+		add_all_roles_to("Administrator")
 
 
 def set_defaults_for_tests():
@@ -150,7 +161,7 @@
 	}
 	frappe.db.set_single_value("Selling Settings", defaults)
 	for key, value in defaults.items():
-			frappe.db.set_default(key, value)
+		frappe.db.set_default(key, value)
 	frappe.db.set_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing", 0)
 
 
@@ -159,6 +170,7 @@
 
 	make_records(records)
 
+
 def welcome_email():
 	site_name = get_default_company() or "ERPNext"
 	title = _("Welcome to {0}").format(site_name)
diff --git a/erpnext/startup/__init__.py b/erpnext/startup/__init__.py
index dd1b401..489e244 100644
--- a/erpnext/startup/__init__.py
+++ b/erpnext/startup/__init__.py
@@ -17,7 +17,4 @@
 # default settings that can be made for a user.
 
 product_name = "ERPNext"
-user_defaults = {
-	"Company": "company",
-	"Territory": "territory"
-}
+user_defaults = {"Company": "company", "Territory": "territory"}
diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py
index 0da45a5..c3445ab 100644
--- a/erpnext/startup/boot.py
+++ b/erpnext/startup/boot.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt"
 
 
-
 import frappe
 from frappe.utils import cint
 
@@ -10,69 +9,72 @@
 def boot_session(bootinfo):
 	"""boot session - send website info if guest"""
 
-	bootinfo.custom_css = frappe.db.get_value('Style Settings', None, 'custom_css') or ''
+	bootinfo.custom_css = frappe.db.get_value("Style Settings", None, "custom_css") or ""
 
-	if frappe.session['user']!='Guest':
+	if frappe.session["user"] != "Guest":
 		update_page_info(bootinfo)
 
 		load_country_and_currency(bootinfo)
-		bootinfo.sysdefaults.territory = frappe.db.get_single_value('Selling Settings',
-			'territory')
-		bootinfo.sysdefaults.customer_group = frappe.db.get_single_value('Selling Settings',
-			'customer_group')
-		bootinfo.sysdefaults.allow_stale = cint(frappe.db.get_single_value('Accounts Settings',
-			'allow_stale'))
-		bootinfo.sysdefaults.quotation_valid_till = cint(frappe.db.get_single_value('CRM Settings',
-			'default_valid_till'))
+		bootinfo.sysdefaults.territory = frappe.db.get_single_value("Selling Settings", "territory")
+		bootinfo.sysdefaults.customer_group = frappe.db.get_single_value(
+			"Selling Settings", "customer_group"
+		)
+		bootinfo.sysdefaults.allow_stale = cint(
+			frappe.db.get_single_value("Accounts Settings", "allow_stale")
+		)
+		bootinfo.sysdefaults.quotation_valid_till = cint(
+			frappe.db.get_single_value("CRM Settings", "default_valid_till")
+		)
 
 		# if no company, show a dialog box to create a new company
 		bootinfo.customer_count = frappe.db.sql("""SELECT count(*) FROM `tabCustomer`""")[0][0]
 
 		if not bootinfo.customer_count:
-			bootinfo.setup_complete = frappe.db.sql("""SELECT `name`
+			bootinfo.setup_complete = (
+				frappe.db.sql(
+					"""SELECT `name`
 				FROM `tabCompany`
-				LIMIT 1""") and 'Yes' or 'No'
+				LIMIT 1"""
+				)
+				and "Yes"
+				or "No"
+			)
 
-		bootinfo.docs += frappe.db.sql("""select name, default_currency, cost_center, default_selling_terms, default_buying_terms,
+		bootinfo.docs += frappe.db.sql(
+			"""select name, default_currency, cost_center, default_selling_terms, default_buying_terms,
 			default_letter_head, default_bank_account, enable_perpetual_inventory, country from `tabCompany`""",
-			as_dict=1, update={"doctype":":Company"})
+			as_dict=1,
+			update={"doctype": ":Company"},
+		)
 
-		party_account_types = frappe.db.sql(""" select name, ifnull(account_type, '') from `tabParty Type`""")
+		party_account_types = frappe.db.sql(
+			""" select name, ifnull(account_type, '') from `tabParty Type`"""
+		)
 		bootinfo.party_account_types = frappe._dict(party_account_types)
 
+
 def load_country_and_currency(bootinfo):
 	country = frappe.db.get_default("country")
 	if country and frappe.db.exists("Country", country):
 		bootinfo.docs += [frappe.get_doc("Country", country)]
 
-	bootinfo.docs += frappe.db.sql("""select name, fraction, fraction_units,
+	bootinfo.docs += frappe.db.sql(
+		"""select name, fraction, fraction_units,
 		number_format, smallest_currency_fraction_value, symbol from tabCurrency
-		where enabled=1""", as_dict=1, update={"doctype":":Currency"})
+		where enabled=1""",
+		as_dict=1,
+		update={"doctype": ":Currency"},
+	)
+
 
 def update_page_info(bootinfo):
-	bootinfo.page_info.update({
-		"Chart of Accounts": {
-			"title": "Chart of Accounts",
-			"route": "Tree/Account"
-		},
-		"Chart of Cost Centers": {
-			"title": "Chart of Cost Centers",
-			"route": "Tree/Cost Center"
-		},
-		"Item Group Tree": {
-			"title": "Item Group Tree",
-			"route": "Tree/Item Group"
-		},
-		"Customer Group Tree": {
-			"title": "Customer Group Tree",
-			"route": "Tree/Customer Group"
-		},
-		"Territory Tree": {
-			"title": "Territory Tree",
-			"route": "Tree/Territory"
-		},
-		"Sales Person Tree": {
-			"title": "Sales Person Tree",
-			"route": "Tree/Sales Person"
+	bootinfo.page_info.update(
+		{
+			"Chart of Accounts": {"title": "Chart of Accounts", "route": "Tree/Account"},
+			"Chart of Cost Centers": {"title": "Chart of Cost Centers", "route": "Tree/Cost Center"},
+			"Item Group Tree": {"title": "Item Group Tree", "route": "Tree/Item Group"},
+			"Customer Group Tree": {"title": "Customer Group Tree", "route": "Tree/Customer Group"},
+			"Territory Tree": {"title": "Territory Tree", "route": "Tree/Territory"},
+			"Sales Person Tree": {"title": "Sales Person Tree", "route": "Tree/Sales Person"},
 		}
-	})
+	)
diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py
index 8ae70d2..da7edbf 100644
--- a/erpnext/startup/leaderboard.py
+++ b/erpnext/startup/leaderboard.py
@@ -6,66 +6,66 @@
 	leaderboards = {
 		"Customer": {
 			"fields": [
-				{'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
-				'total_qty_sold',
-				{'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
+				{"fieldname": "total_sales_amount", "fieldtype": "Currency"},
+				"total_qty_sold",
+				{"fieldname": "outstanding_amount", "fieldtype": "Currency"},
 			],
 			"method": "erpnext.startup.leaderboard.get_all_customers",
-			"icon": "customer"
+			"icon": "customer",
 		},
 		"Item": {
 			"fields": [
-				{'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
-				'total_qty_sold',
-				{'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
-				'total_qty_purchased',
-				'available_stock_qty',
-				{'fieldname': 'available_stock_value', 'fieldtype': 'Currency'}
+				{"fieldname": "total_sales_amount", "fieldtype": "Currency"},
+				"total_qty_sold",
+				{"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
+				"total_qty_purchased",
+				"available_stock_qty",
+				{"fieldname": "available_stock_value", "fieldtype": "Currency"},
 			],
 			"method": "erpnext.startup.leaderboard.get_all_items",
-			"icon": "stock"
+			"icon": "stock",
 		},
 		"Supplier": {
 			"fields": [
-				{'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
-				'total_qty_purchased',
-				{'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
+				{"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
+				"total_qty_purchased",
+				{"fieldname": "outstanding_amount", "fieldtype": "Currency"},
 			],
 			"method": "erpnext.startup.leaderboard.get_all_suppliers",
-			"icon": "buying"
+			"icon": "buying",
 		},
 		"Sales Partner": {
 			"fields": [
-				{'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
-				{'fieldname': 'total_commission', 'fieldtype': 'Currency'}
+				{"fieldname": "total_sales_amount", "fieldtype": "Currency"},
+				{"fieldname": "total_commission", "fieldtype": "Currency"},
 			],
 			"method": "erpnext.startup.leaderboard.get_all_sales_partner",
-			"icon": "hr"
+			"icon": "hr",
 		},
 		"Sales Person": {
-			"fields": [
-				{'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}
-			],
+			"fields": [{"fieldname": "total_sales_amount", "fieldtype": "Currency"}],
 			"method": "erpnext.startup.leaderboard.get_all_sales_person",
-			"icon": "customer"
-		}
+			"icon": "customer",
+		},
 	}
 
 	return leaderboards
 
+
 @frappe.whitelist()
-def get_all_customers(date_range, company, field, limit = None):
+def get_all_customers(date_range, company, field, limit=None):
 	if field == "outstanding_amount":
-		filters = [['docstatus', '=', '1'], ['company', '=', company]]
+		filters = [["docstatus", "=", "1"], ["company", "=", company]]
 		if date_range:
 			date_range = frappe.parse_json(date_range)
-			filters.append(['posting_date', '>=', 'between', [date_range[0], date_range[1]]])
-		return frappe.db.get_all('Sales Invoice',
-			fields = ['customer as name', 'sum(outstanding_amount) as value'],
-			filters = filters,
-			group_by = 'customer',
-			order_by = 'value desc',
-			limit = limit
+			filters.append(["posting_date", ">=", "between", [date_range[0], date_range[1]]])
+		return frappe.db.get_all(
+			"Sales Invoice",
+			fields=["customer as name", "sum(outstanding_amount) as value"],
+			filters=filters,
+			group_by="customer",
+			order_by="value desc",
+			limit=limit,
 		)
 	else:
 		if field == "total_sales_amount":
@@ -73,9 +73,10 @@
 		elif field == "total_qty_sold":
 			select_field = "sum(so_item.stock_qty)"
 
-		date_condition = get_date_condition(date_range, 'so.transaction_date')
+		date_condition = get_date_condition(date_range, "so.transaction_date")
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select so.customer as name, {0} as value
 			FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
 				ON so.name = so_item.parent
@@ -83,17 +84,24 @@
 			group by so.customer
 			order by value DESC
 			limit %s
-		""".format(select_field, date_condition), (company, cint(limit)), as_dict=1)
+		""".format(
+				select_field, date_condition
+			),
+			(company, cint(limit)),
+			as_dict=1,
+		)
+
 
 @frappe.whitelist()
-def get_all_items(date_range, company, field, limit = None):
+def get_all_items(date_range, company, field, limit=None):
 	if field in ("available_stock_qty", "available_stock_value"):
-		select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"
-		return frappe.db.get_all('Bin',
-			fields = ['item_code as name', '{0} as value'.format(select_field)],
-			group_by = 'item_code',
-			order_by = 'value desc',
-			limit = limit
+		select_field = "sum(actual_qty)" if field == "available_stock_qty" else "sum(stock_value)"
+		return frappe.db.get_all(
+			"Bin",
+			fields=["item_code as name", "{0} as value".format(select_field)],
+			group_by="item_code",
+			order_by="value desc",
+			limit=limit,
 		)
 	else:
 		if field == "total_sales_amount":
@@ -109,9 +117,10 @@
 			select_field = "sum(order_item.stock_qty)"
 			select_doctype = "Purchase Order"
 
-		date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
+		date_condition = get_date_condition(date_range, "sales_order.transaction_date")
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select order_item.item_code as name, {0} as value
 			from `tab{1}` sales_order join `tab{1} Item` as order_item
 				on sales_order.name = order_item.parent
@@ -120,21 +129,28 @@
 			group by order_item.item_code
 			order by value desc
 			limit %s
-		""".format(select_field, select_doctype, date_condition), (company, cint(limit)), as_dict=1) #nosec
+		""".format(
+				select_field, select_doctype, date_condition
+			),
+			(company, cint(limit)),
+			as_dict=1,
+		)  # nosec
+
 
 @frappe.whitelist()
-def get_all_suppliers(date_range, company, field, limit = None):
+def get_all_suppliers(date_range, company, field, limit=None):
 	if field == "outstanding_amount":
-		filters = [['docstatus', '=', '1'], ['company', '=', company]]
+		filters = [["docstatus", "=", "1"], ["company", "=", company]]
 		if date_range:
 			date_range = frappe.parse_json(date_range)
-			filters.append(['posting_date', 'between', [date_range[0], date_range[1]]])
-		return frappe.db.get_all('Purchase Invoice',
-			fields = ['supplier as name', 'sum(outstanding_amount) as value'],
-			filters = filters,
-			group_by = 'supplier',
-			order_by = 'value desc',
-			limit = limit
+			filters.append(["posting_date", "between", [date_range[0], date_range[1]]])
+		return frappe.db.get_all(
+			"Purchase Invoice",
+			fields=["supplier as name", "sum(outstanding_amount) as value"],
+			filters=filters,
+			group_by="supplier",
+			order_by="value desc",
+			limit=limit,
 		)
 	else:
 		if field == "total_purchase_amount":
@@ -142,9 +158,10 @@
 		elif field == "total_qty_purchased":
 			select_field = "sum(purchase_order_item.stock_qty)"
 
-		date_condition = get_date_condition(date_range, 'purchase_order.modified')
+		date_condition = get_date_condition(date_range, "purchase_order.modified")
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select purchase_order.supplier as name, {0} as value
 			FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
 				as purchase_order_item ON purchase_order.name = purchase_order_item.parent
@@ -154,34 +171,45 @@
 				and  purchase_order.company = %s
 			group by purchase_order.supplier
 			order by value DESC
-			limit %s""".format(select_field, date_condition), (company, cint(limit)), as_dict=1) #nosec
+			limit %s""".format(
+				select_field, date_condition
+			),
+			(company, cint(limit)),
+			as_dict=1,
+		)  # nosec
+
 
 @frappe.whitelist()
-def get_all_sales_partner(date_range, company, field, limit = None):
+def get_all_sales_partner(date_range, company, field, limit=None):
 	if field == "total_sales_amount":
 		select_field = "sum(`base_net_total`)"
 	elif field == "total_commission":
 		select_field = "sum(`total_commission`)"
 
-	filters = {
-		'sales_partner': ['!=', ''],
-		'docstatus': 1,
-		'company': company
-	}
+	filters = {"sales_partner": ["!=", ""], "docstatus": 1, "company": company}
 	if date_range:
 		date_range = frappe.parse_json(date_range)
-		filters['transaction_date'] = ['between', [date_range[0], date_range[1]]]
+		filters["transaction_date"] = ["between", [date_range[0], date_range[1]]]
 
-	return frappe.get_list('Sales Order', fields=[
-		'`sales_partner` as name',
-		'{} as value'.format(select_field),
-	], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit)
+	return frappe.get_list(
+		"Sales Order",
+		fields=[
+			"`sales_partner` as name",
+			"{} as value".format(select_field),
+		],
+		filters=filters,
+		group_by="sales_partner",
+		order_by="value DESC",
+		limit=limit,
+	)
+
 
 @frappe.whitelist()
-def get_all_sales_person(date_range, company, field = None, limit = 0):
-	date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
+def get_all_sales_person(date_range, company, field=None, limit=0):
+	date_condition = get_date_condition(date_range, "sales_order.transaction_date")
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
 		from `tabSales Order` as sales_order join `tabSales Team` as sales_team
 			on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
@@ -191,10 +219,16 @@
 		group by sales_team.sales_person
 		order by value DESC
 		limit %s
-	""".format(date_condition=date_condition), (company, cint(limit)), as_dict=1)
+	""".format(
+			date_condition=date_condition
+		),
+		(company, cint(limit)),
+		as_dict=1,
+	)
+
 
 def get_date_condition(date_range, field):
-	date_condition = ''
+	date_condition = ""
 	if date_range:
 		date_range = frappe.parse_json(date_range)
 		from_date, to_date = date_range
diff --git a/erpnext/startup/notifications.py b/erpnext/startup/notifications.py
index 0965ead..76cb91a 100644
--- a/erpnext/startup/notifications.py
+++ b/erpnext/startup/notifications.py
@@ -6,8 +6,8 @@
 
 
 def get_notification_config():
-	notifications =  { "for_doctype":
-		{
+	notifications = {
+		"for_doctype": {
 			"Issue": {"status": "Open"},
 			"Warranty Claim": {"status": "Open"},
 			"Task": {"status": ("in", ("Open", "Overdue"))},
@@ -16,66 +16,46 @@
 			"Contact": {"status": "Open"},
 			"Opportunity": {"status": "Open"},
 			"Quotation": {"docstatus": 0},
-			"Sales Order": {
-				"status": ("not in", ("Completed", "Closed")),
-				"docstatus": ("<", 2)
-			},
+			"Sales Order": {"status": ("not in", ("Completed", "Closed")), "docstatus": ("<", 2)},
 			"Journal Entry": {"docstatus": 0},
-			"Sales Invoice": {
-				"outstanding_amount": (">", 0),
-				"docstatus": ("<", 2)
-			},
-			"Purchase Invoice": {
-				"outstanding_amount": (">", 0),
-				"docstatus": ("<", 2)
-			},
+			"Sales Invoice": {"outstanding_amount": (">", 0), "docstatus": ("<", 2)},
+			"Purchase Invoice": {"outstanding_amount": (">", 0), "docstatus": ("<", 2)},
 			"Payment Entry": {"docstatus": 0},
 			"Leave Application": {"docstatus": 0},
 			"Expense Claim": {"docstatus": 0},
 			"Job Applicant": {"status": "Open"},
-			"Delivery Note": {
-				"status": ("not in", ("Completed", "Closed")),
-				"docstatus": ("<", 2)
-			},
+			"Delivery Note": {"status": ("not in", ("Completed", "Closed")), "docstatus": ("<", 2)},
 			"Stock Entry": {"docstatus": 0},
 			"Material Request": {
 				"docstatus": ("<", 2),
 				"status": ("not in", ("Stopped",)),
-				"per_ordered": ("<", 100)
+				"per_ordered": ("<", 100),
 			},
-			"Request for Quotation": { "docstatus": 0 },
+			"Request for Quotation": {"docstatus": 0},
 			"Supplier Quotation": {"docstatus": 0},
-			"Purchase Order": {
-				"status": ("not in", ("Completed", "Closed")),
-				"docstatus": ("<", 2)
-			},
-			"Purchase Receipt": {
-				"status": ("not in", ("Completed", "Closed")),
-				"docstatus": ("<", 2)
-			},
-			"Work Order": { "status": ("in", ("Draft", "Not Started", "In Process")) },
+			"Purchase Order": {"status": ("not in", ("Completed", "Closed")), "docstatus": ("<", 2)},
+			"Purchase Receipt": {"status": ("not in", ("Completed", "Closed")), "docstatus": ("<", 2)},
+			"Work Order": {"status": ("in", ("Draft", "Not Started", "In Process"))},
 			"BOM": {"docstatus": 0},
-
 			"Timesheet": {"status": "Draft"},
-
 			"Lab Test": {"docstatus": 0},
 			"Sample Collection": {"docstatus": 0},
 			"Patient Appointment": {"status": "Open"},
-			"Patient Encounter": {"docstatus": 0}
+			"Patient Encounter": {"docstatus": 0},
 		},
-
 		"targets": {
 			"Company": {
-				"filters" : { "monthly_sales_target": ( ">", 0 ) },
-				"target_field" : "monthly_sales_target",
-				"value_field" : "total_monthly_sales"
+				"filters": {"monthly_sales_target": (">", 0)},
+				"target_field": "monthly_sales_target",
+				"value_field": "total_monthly_sales",
 			}
-		}
+		},
 	}
 
-	doctype = [d for d in notifications.get('for_doctype')]
-	for doc in frappe.get_all('DocType',
-		fields= ["name"], filters = {"name": ("not in", doctype), 'is_submittable': 1}):
+	doctype = [d for d in notifications.get("for_doctype")]
+	for doc in frappe.get_all(
+		"DocType", fields=["name"], filters={"name": ("not in", doctype), "is_submittable": 1}
+	):
 		notifications["for_doctype"][doc.name] = {"docstatus": 0}
 
 	return notifications
diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py
index 65b48bf..f8c1b6c 100644
--- a/erpnext/startup/report_data_map.py
+++ b/erpnext/startup/report_data_map.py
@@ -6,90 +6,98 @@
 # "remember to add indexes!"
 
 data_map = {
-	"Company": {
-		"columns": ["name"],
-		"conditions": ["docstatus < 2"]
-	},
+	"Company": {"columns": ["name"], "conditions": ["docstatus < 2"]},
 	"Fiscal Year": {
 		"columns": ["name", "year_start_date", "year_end_date"],
 		"conditions": ["docstatus < 2"],
 	},
-
 	# Accounts
 	"Account": {
-		"columns": ["name", "parent_account", "lft", "rgt", "report_type",
-			"company", "is_group"],
+		"columns": ["name", "parent_account", "lft", "rgt", "report_type", "company", "is_group"],
 		"conditions": ["docstatus < 2"],
 		"order_by": "lft",
 		"links": {
 			"company": ["Company", "name"],
-		}
-
+		},
 	},
 	"Cost Center": {
 		"columns": ["name", "lft", "rgt"],
 		"conditions": ["docstatus < 2"],
-		"order_by": "lft"
+		"order_by": "lft",
 	},
 	"GL Entry": {
-		"columns": ["name", "account", "posting_date", "cost_center", "debit", "credit",
-			"is_opening", "company", "voucher_type", "voucher_no", "remarks"],
+		"columns": [
+			"name",
+			"account",
+			"posting_date",
+			"cost_center",
+			"debit",
+			"credit",
+			"is_opening",
+			"company",
+			"voucher_type",
+			"voucher_no",
+			"remarks",
+		],
 		"order_by": "posting_date, account",
 		"links": {
 			"account": ["Account", "name"],
 			"company": ["Company", "name"],
-			"cost_center": ["Cost Center", "name"]
-		}
+			"cost_center": ["Cost Center", "name"],
+		},
 	},
-
 	# Stock
 	"Item": {
-		"columns": ["name", "if(item_name=name, '', item_name) as item_name", "description",
-			"item_group as parent_item_group", "stock_uom", "brand", "valuation_method"],
+		"columns": [
+			"name",
+			"if(item_name=name, '', item_name) as item_name",
+			"description",
+			"item_group as parent_item_group",
+			"stock_uom",
+			"brand",
+			"valuation_method",
+		],
 		# "conditions": ["docstatus < 2"],
 		"order_by": "name",
-		"links": {
-			"parent_item_group": ["Item Group", "name"],
-			"brand": ["Brand", "name"]
-		}
+		"links": {"parent_item_group": ["Item Group", "name"], "brand": ["Brand", "name"]},
 	},
 	"Item Group": {
 		"columns": ["name", "parent_item_group"],
 		# "conditions": ["docstatus < 2"],
-		"order_by": "lft"
+		"order_by": "lft",
 	},
-	"Brand": {
-		"columns": ["name"],
-		"conditions": ["docstatus < 2"],
-		"order_by": "name"
-	},
-	"Project": {
-		"columns": ["name"],
-		"conditions": ["docstatus < 2"],
-		"order_by": "name"
-	},
-	"Warehouse": {
-		"columns": ["name"],
-		"conditions": ["docstatus < 2"],
-		"order_by": "name"
-	},
+	"Brand": {"columns": ["name"], "conditions": ["docstatus < 2"], "order_by": "name"},
+	"Project": {"columns": ["name"], "conditions": ["docstatus < 2"], "order_by": "name"},
+	"Warehouse": {"columns": ["name"], "conditions": ["docstatus < 2"], "order_by": "name"},
 	"Stock Ledger Entry": {
-		"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse",
-			"actual_qty as qty", "voucher_type", "voucher_no", "project",
-			"incoming_rate as incoming_rate", "stock_uom", "serial_no",
-			"qty_after_transaction", "valuation_rate"],
+		"columns": [
+			"name",
+			"posting_date",
+			"posting_time",
+			"item_code",
+			"warehouse",
+			"actual_qty as qty",
+			"voucher_type",
+			"voucher_no",
+			"project",
+			"incoming_rate as incoming_rate",
+			"stock_uom",
+			"serial_no",
+			"qty_after_transaction",
+			"valuation_rate",
+		],
 		"order_by": "posting_date, posting_time, creation",
 		"links": {
 			"item_code": ["Item", "name"],
 			"warehouse": ["Warehouse", "name"],
-			"project": ["Project", "name"]
+			"project": ["Project", "name"],
 		},
-		"force_index": "posting_sort_index"
+		"force_index": "posting_sort_index",
 	},
 	"Serial No": {
 		"columns": ["name", "purchase_rate as incoming_rate"],
 		"conditions": ["docstatus < 2"],
-		"order_by": "name"
+		"order_by": "name",
 	},
 	"Stock Entry": {
 		"columns": ["name", "purpose"],
@@ -97,227 +105,223 @@
 		"order_by": "posting_date, posting_time, name",
 	},
 	"Material Request Item": {
-		"columns": ["item.name as name", "item_code", "warehouse",
-			"(qty - ordered_qty) as qty"],
+		"columns": ["item.name as name", "item_code", "warehouse", "(qty - ordered_qty) as qty"],
 		"from": "`tabMaterial Request Item` item, `tabMaterial Request` main",
-		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",
-			"ifnull(warehouse, '')!=''", "qty > ordered_qty"],
-		"links": {
-			"item_code": ["Item", "name"],
-			"warehouse": ["Warehouse", "name"]
-		},
+		"conditions": [
+			"item.parent = main.name",
+			"main.docstatus=1",
+			"main.status != 'Stopped'",
+			"ifnull(warehouse, '')!=''",
+			"qty > ordered_qty",
+		],
+		"links": {"item_code": ["Item", "name"], "warehouse": ["Warehouse", "name"]},
 	},
 	"Purchase Order Item": {
-		"columns": ["item.name as name", "item_code", "warehouse",
-			"(qty - received_qty)*conversion_factor as qty"],
+		"columns": [
+			"item.name as name",
+			"item_code",
+			"warehouse",
+			"(qty - received_qty)*conversion_factor as qty",
+		],
 		"from": "`tabPurchase Order Item` item, `tabPurchase Order` main",
-		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",
-			"ifnull(warehouse, '')!=''", "qty > received_qty"],
-		"links": {
-			"item_code": ["Item", "name"],
-			"warehouse": ["Warehouse", "name"]
-		},
+		"conditions": [
+			"item.parent = main.name",
+			"main.docstatus=1",
+			"main.status != 'Stopped'",
+			"ifnull(warehouse, '')!=''",
+			"qty > received_qty",
+		],
+		"links": {"item_code": ["Item", "name"], "warehouse": ["Warehouse", "name"]},
 	},
-
 	"Sales Order Item": {
-		"columns": ["item.name as name", "item_code", "(qty - delivered_qty)*conversion_factor as qty", "warehouse"],
+		"columns": [
+			"item.name as name",
+			"item_code",
+			"(qty - delivered_qty)*conversion_factor as qty",
+			"warehouse",
+		],
 		"from": "`tabSales Order Item` item, `tabSales Order` main",
-		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",
-			"ifnull(warehouse, '')!=''", "qty > delivered_qty"],
-		"links": {
-			"item_code": ["Item", "name"],
-			"warehouse": ["Warehouse", "name"]
-		},
+		"conditions": [
+			"item.parent = main.name",
+			"main.docstatus=1",
+			"main.status != 'Stopped'",
+			"ifnull(warehouse, '')!=''",
+			"qty > delivered_qty",
+		],
+		"links": {"item_code": ["Item", "name"], "warehouse": ["Warehouse", "name"]},
 	},
-
 	# Sales
 	"Customer": {
-		"columns": ["name", "if(customer_name=name, '', customer_name) as customer_name",
-			"customer_group as parent_customer_group", "territory as parent_territory"],
+		"columns": [
+			"name",
+			"if(customer_name=name, '', customer_name) as customer_name",
+			"customer_group as parent_customer_group",
+			"territory as parent_territory",
+		],
 		"conditions": ["docstatus < 2"],
 		"order_by": "name",
 		"links": {
 			"parent_customer_group": ["Customer Group", "name"],
 			"parent_territory": ["Territory", "name"],
-		}
+		},
 	},
 	"Customer Group": {
 		"columns": ["name", "parent_customer_group"],
 		"conditions": ["docstatus < 2"],
-		"order_by": "lft"
+		"order_by": "lft",
 	},
 	"Territory": {
 		"columns": ["name", "parent_territory"],
 		"conditions": ["docstatus < 2"],
-		"order_by": "lft"
+		"order_by": "lft",
 	},
 	"Sales Invoice": {
 		"columns": ["name", "customer", "posting_date", "company"],
 		"conditions": ["docstatus=1"],
 		"order_by": "posting_date",
-		"links": {
-			"customer": ["Customer", "name"],
-			"company":["Company", "name"]
-		}
+		"links": {"customer": ["Customer", "name"], "company": ["Company", "name"]},
 	},
 	"Sales Invoice Item": {
 		"columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"],
 		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
 		"order_by": "parent",
-		"links": {
-			"parent": ["Sales Invoice", "name"],
-			"item_code": ["Item", "name"]
-		}
+		"links": {"parent": ["Sales Invoice", "name"], "item_code": ["Item", "name"]},
 	},
 	"Sales Order": {
 		"columns": ["name", "customer", "transaction_date as posting_date", "company"],
 		"conditions": ["docstatus=1"],
 		"order_by": "transaction_date",
-		"links": {
-			"customer": ["Customer", "name"],
-			"company":["Company", "name"]
-		}
+		"links": {"customer": ["Customer", "name"], "company": ["Company", "name"]},
 	},
 	"Sales Order Item[Sales Analytics]": {
 		"columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"],
 		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
 		"order_by": "parent",
-		"links": {
-			"parent": ["Sales Order", "name"],
-			"item_code": ["Item", "name"]
-		}
+		"links": {"parent": ["Sales Order", "name"], "item_code": ["Item", "name"]},
 	},
 	"Delivery Note": {
 		"columns": ["name", "customer", "posting_date", "company"],
 		"conditions": ["docstatus=1"],
 		"order_by": "posting_date",
-		"links": {
-			"customer": ["Customer", "name"],
-			"company":["Company", "name"]
-		}
+		"links": {"customer": ["Customer", "name"], "company": ["Company", "name"]},
 	},
 	"Delivery Note Item[Sales Analytics]": {
 		"columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"],
 		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
 		"order_by": "parent",
-		"links": {
-			"parent": ["Delivery Note", "name"],
-			"item_code": ["Item", "name"]
-		}
+		"links": {"parent": ["Delivery Note", "name"], "item_code": ["Item", "name"]},
 	},
 	"Supplier": {
-		"columns": ["name", "if(supplier_name=name, '', supplier_name) as supplier_name",
-			"supplier_group as parent_supplier_group"],
+		"columns": [
+			"name",
+			"if(supplier_name=name, '', supplier_name) as supplier_name",
+			"supplier_group as parent_supplier_group",
+		],
 		"conditions": ["docstatus < 2"],
 		"order_by": "name",
 		"links": {
 			"parent_supplier_group": ["Supplier Group", "name"],
-		}
+		},
 	},
 	"Supplier Group": {
 		"columns": ["name", "parent_supplier_group"],
 		"conditions": ["docstatus < 2"],
-		"order_by": "name"
+		"order_by": "name",
 	},
 	"Purchase Invoice": {
 		"columns": ["name", "supplier", "posting_date", "company"],
 		"conditions": ["docstatus=1"],
 		"order_by": "posting_date",
-		"links": {
-			"supplier": ["Supplier", "name"],
-			"company":["Company", "name"]
-		}
+		"links": {"supplier": ["Supplier", "name"], "company": ["Company", "name"]},
 	},
 	"Purchase Invoice Item": {
 		"columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"],
 		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
 		"order_by": "parent",
-		"links": {
-			"parent": ["Purchase Invoice", "name"],
-			"item_code": ["Item", "name"]
-		}
+		"links": {"parent": ["Purchase Invoice", "name"], "item_code": ["Item", "name"]},
 	},
 	"Purchase Order": {
 		"columns": ["name", "supplier", "transaction_date as posting_date", "company"],
 		"conditions": ["docstatus=1"],
 		"order_by": "posting_date",
-		"links": {
-			"supplier": ["Supplier", "name"],
-			"company":["Company", "name"]
-		}
+		"links": {"supplier": ["Supplier", "name"], "company": ["Company", "name"]},
 	},
 	"Purchase Order Item[Purchase Analytics]": {
 		"columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"],
 		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
 		"order_by": "parent",
-		"links": {
-			"parent": ["Purchase Order", "name"],
-			"item_code": ["Item", "name"]
-		}
+		"links": {"parent": ["Purchase Order", "name"], "item_code": ["Item", "name"]},
 	},
 	"Purchase Receipt": {
 		"columns": ["name", "supplier", "posting_date", "company"],
 		"conditions": ["docstatus=1"],
 		"order_by": "posting_date",
-		"links": {
-			"supplier": ["Supplier", "name"],
-			"company":["Company", "name"]
-		}
+		"links": {"supplier": ["Supplier", "name"], "company": ["Company", "name"]},
 	},
 	"Purchase Receipt Item[Purchase Analytics]": {
 		"columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"],
 		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
 		"order_by": "parent",
-		"links": {
-			"parent": ["Purchase Receipt", "name"],
-			"item_code": ["Item", "name"]
-		}
+		"links": {"parent": ["Purchase Receipt", "name"], "item_code": ["Item", "name"]},
 	},
 	# Support
 	"Issue": {
-		"columns": ["name","status","creation","resolution_date","first_responded_on"],
+		"columns": ["name", "status", "creation", "resolution_date", "first_responded_on"],
 		"conditions": ["docstatus < 2"],
-		"order_by": "creation"
+		"order_by": "creation",
 	},
-
 	# Manufacturing
 	"Work Order": {
-		"columns": ["name","status","creation","planned_start_date","planned_end_date","status","actual_start_date","actual_end_date", "modified"],
+		"columns": [
+			"name",
+			"status",
+			"creation",
+			"planned_start_date",
+			"planned_end_date",
+			"status",
+			"actual_start_date",
+			"actual_end_date",
+			"modified",
+		],
 		"conditions": ["docstatus = 1"],
-		"order_by": "creation"
+		"order_by": "creation",
 	},
-
-	#Medical
+	# Medical
 	"Patient": {
-		"columns": ["name", "creation", "owner", "if(patient_name=name, '', patient_name) as patient_name"],
+		"columns": [
+			"name",
+			"creation",
+			"owner",
+			"if(patient_name=name, '', patient_name) as patient_name",
+		],
 		"conditions": ["docstatus < 2"],
 		"order_by": "name",
-		"links": {
-			"owner" : ["User", "name"]
-		}
+		"links": {"owner": ["User", "name"]},
 	},
 	"Patient Appointment": {
-		"columns": ["name", "appointment_type", "patient", "practitioner", "appointment_date", "department", "status", "company"],
+		"columns": [
+			"name",
+			"appointment_type",
+			"patient",
+			"practitioner",
+			"appointment_date",
+			"department",
+			"status",
+			"company",
+		],
 		"order_by": "name",
 		"links": {
 			"practitioner": ["Healthcare Practitioner", "name"],
-			"appointment_type": ["Appointment Type", "name"]
-		}
+			"appointment_type": ["Appointment Type", "name"],
+		},
 	},
 	"Healthcare Practitioner": {
 		"columns": ["name", "department"],
 		"order_by": "name",
 		"links": {
 			"department": ["Department", "name"],
-		}
-
+		},
 	},
-	"Appointment Type": {
-		"columns": ["name"],
-		"order_by": "name"
-	},
-	"Medical Department": {
-		"columns": ["name"],
-		"order_by": "name"
-	}
+	"Appointment Type": {"columns": ["name"], "order_by": "name"},
+	"Medical Department": {"columns": ["name"], "order_by": "name"},
 }
diff --git a/erpnext/stock/__init__.py b/erpnext/stock/__init__.py
index e8b2804..45bf012 100644
--- a/erpnext/stock/__init__.py
+++ b/erpnext/stock/__init__.py
@@ -2,17 +2,24 @@
 from frappe import _
 
 install_docs = [
-	{"doctype":"Role", "role_name":"Stock Manager", "name":"Stock Manager"},
-	{"doctype":"Role", "role_name":"Item Manager", "name":"Item Manager"},
-	{"doctype":"Role", "role_name":"Stock User", "name":"Stock User"},
-	{"doctype":"Role", "role_name":"Quality Manager", "name":"Quality Manager"},
-	{"doctype":"Item Group", "item_group_name":"All Item Groups", "is_group": 1},
-	{"doctype":"Item Group", "item_group_name":"Default",
-		"parent_item_group":"All Item Groups", "is_group": 0},
+	{"doctype": "Role", "role_name": "Stock Manager", "name": "Stock Manager"},
+	{"doctype": "Role", "role_name": "Item Manager", "name": "Item Manager"},
+	{"doctype": "Role", "role_name": "Stock User", "name": "Stock User"},
+	{"doctype": "Role", "role_name": "Quality Manager", "name": "Quality Manager"},
+	{"doctype": "Item Group", "item_group_name": "All Item Groups", "is_group": 1},
+	{
+		"doctype": "Item Group",
+		"item_group_name": "Default",
+		"parent_item_group": "All Item Groups",
+		"is_group": 0,
+	},
 ]
 
+
 def get_warehouse_account_map(company=None):
-	company_warehouse_account_map = company and frappe.flags.setdefault('warehouse_account_map', {}).get(company)
+	company_warehouse_account_map = company and frappe.flags.setdefault(
+		"warehouse_account_map", {}
+	).get(company)
 	warehouse_account_map = frappe.flags.warehouse_account_map
 
 	if not warehouse_account_map or not company_warehouse_account_map or frappe.flags.in_test:
@@ -20,18 +27,20 @@
 
 		filters = {}
 		if company:
-			filters['company'] = company
-			frappe.flags.setdefault('warehouse_account_map', {}).setdefault(company, {})
+			filters["company"] = company
+			frappe.flags.setdefault("warehouse_account_map", {}).setdefault(company, {})
 
-		for d in frappe.get_all('Warehouse',
-			fields = ["name", "account", "parent_warehouse", "company", "is_group"],
-			filters = filters,
-			order_by="lft, rgt"):
+		for d in frappe.get_all(
+			"Warehouse",
+			fields=["name", "account", "parent_warehouse", "company", "is_group"],
+			filters=filters,
+			order_by="lft, rgt",
+		):
 			if not d.account:
 				d.account = get_warehouse_account(d, warehouse_account)
 
 			if d.account:
-				d.account_currency = frappe.db.get_value('Account', d.account, 'account_currency', cache=True)
+				d.account_currency = frappe.db.get_value("Account", d.account, "account_currency", cache=True)
 				warehouse_account.setdefault(d.name, d)
 		if company:
 			frappe.flags.warehouse_account_map[company] = warehouse_account
@@ -40,6 +49,7 @@
 
 	return frappe.flags.warehouse_account_map.get(company) or frappe.flags.warehouse_account_map
 
+
 def get_warehouse_account(warehouse, warehouse_account=None):
 	account = warehouse.account
 	if not account and warehouse.parent_warehouse:
@@ -48,15 +58,20 @@
 				account = warehouse_account.get(warehouse.parent_warehouse).account
 			else:
 				from frappe.utils.nestedset import rebuild_tree
+
 				rebuild_tree("Warehouse", "parent_warehouse")
 		else:
-			account = frappe.db.sql("""
+			account = frappe.db.sql(
+				"""
 				select
 					account from `tabWarehouse`
 				where
 					lft <= %s and rgt >= %s and company = %s
 					and account is not null and ifnull(account, '') !=''
-				order by lft desc limit 1""", (warehouse.lft, warehouse.rgt, warehouse.company), as_list=1)
+				order by lft desc limit 1""",
+				(warehouse.lft, warehouse.rgt, warehouse.company),
+				as_list=1,
+			)
 
 			account = account[0][0] if account else None
 
@@ -64,13 +79,18 @@
 		account = get_company_default_inventory_account(warehouse.company)
 
 	if not account and warehouse.company:
-		account = frappe.db.get_value('Account',
-			{'account_type': 'Stock', 'is_group': 0, 'company': warehouse.company}, 'name')
+		account = frappe.db.get_value(
+			"Account", {"account_type": "Stock", "is_group": 0, "company": warehouse.company}, "name"
+		)
 
 	if not account and warehouse.company and not warehouse.is_group:
-		frappe.throw(_("Please set Account in Warehouse {0} or Default Inventory Account in Company {1}")
-			.format(warehouse.name, warehouse.company))
+		frappe.throw(
+			_("Please set Account in Warehouse {0} or Default Inventory Account in Company {1}").format(
+				warehouse.name, warehouse.company
+			)
+		)
 	return account
 
+
 def get_company_default_inventory_account(company):
-	return frappe.get_cached_value('Company',  company, 'default_inventory_account')
+	return frappe.get_cached_value("Company", company, "default_inventory_account")
diff --git a/erpnext/stock/dashboard/item_dashboard.py b/erpnext/stock/dashboard/item_dashboard.py
index 75aa1d3..8fbb56c 100644
--- a/erpnext/stock/dashboard/item_dashboard.py
+++ b/erpnext/stock/dashboard/item_dashboard.py
@@ -4,55 +4,72 @@
 
 
 @frappe.whitelist()
-def get_data(item_code=None, warehouse=None, item_group=None,
-	start=0, sort_by='actual_qty', sort_order='desc'):
-	'''Return data to render the item dashboard'''
+def get_data(
+	item_code=None, warehouse=None, item_group=None, start=0, sort_by="actual_qty", sort_order="desc"
+):
+	"""Return data to render the item dashboard"""
 	filters = []
 	if item_code:
-		filters.append(['item_code', '=', item_code])
+		filters.append(["item_code", "=", item_code])
 	if warehouse:
-		filters.append(['warehouse', '=', warehouse])
+		filters.append(["warehouse", "=", warehouse])
 	if item_group:
 		lft, rgt = frappe.db.get_value("Item Group", item_group, ["lft", "rgt"])
-		items = frappe.db.sql_list("""
+		items = frappe.db.sql_list(
+			"""
 			select i.name from `tabItem` i
 			where exists(select name from `tabItem Group`
 				where name=i.item_group and lft >=%s and rgt<=%s)
-		""", (lft, rgt))
-		filters.append(['item_code', 'in', items])
+		""",
+			(lft, rgt),
+		)
+		filters.append(["item_code", "in", items])
 	try:
 		# check if user has any restrictions based on user permissions on warehouse
-		if DatabaseQuery('Warehouse', user=frappe.session.user).build_match_conditions():
-			filters.append(['warehouse', 'in', [w.name for w in frappe.get_list('Warehouse')]])
+		if DatabaseQuery("Warehouse", user=frappe.session.user).build_match_conditions():
+			filters.append(["warehouse", "in", [w.name for w in frappe.get_list("Warehouse")]])
 	except frappe.PermissionError:
 		# user does not have access on warehouse
 		return []
 
-	items = frappe.db.get_all('Bin', fields=['item_code', 'warehouse', 'projected_qty',
-			'reserved_qty', 'reserved_qty_for_production', 'reserved_qty_for_sub_contract', 'actual_qty', 'valuation_rate'],
+	items = frappe.db.get_all(
+		"Bin",
+		fields=[
+			"item_code",
+			"warehouse",
+			"projected_qty",
+			"reserved_qty",
+			"reserved_qty_for_production",
+			"reserved_qty_for_sub_contract",
+			"actual_qty",
+			"valuation_rate",
+		],
 		or_filters={
-			'projected_qty': ['!=', 0],
-			'reserved_qty': ['!=', 0],
-			'reserved_qty_for_production': ['!=', 0],
-			'reserved_qty_for_sub_contract': ['!=', 0],
-			'actual_qty': ['!=', 0],
+			"projected_qty": ["!=", 0],
+			"reserved_qty": ["!=", 0],
+			"reserved_qty_for_production": ["!=", 0],
+			"reserved_qty_for_sub_contract": ["!=", 0],
+			"actual_qty": ["!=", 0],
 		},
 		filters=filters,
-		order_by=sort_by + ' ' + sort_order,
+		order_by=sort_by + " " + sort_order,
 		limit_start=start,
-		limit_page_length=21)
+		limit_page_length=21,
+	)
 
 	precision = cint(frappe.db.get_single_value("System Settings", "float_precision"))
 
 	for item in items:
-		item.update({
-			'item_name': frappe.get_cached_value("Item", item.item_code, 'item_name'),
-			'disable_quick_entry': frappe.get_cached_value( "Item", item.item_code, 'has_batch_no')
-							or frappe.get_cached_value( "Item", item.item_code, 'has_serial_no'),
-			'projected_qty': flt(item.projected_qty, precision),
-			'reserved_qty': flt(item.reserved_qty, precision),
-			'reserved_qty_for_production': flt(item.reserved_qty_for_production, precision),
-			'reserved_qty_for_sub_contract': flt(item.reserved_qty_for_sub_contract, precision),
-			'actual_qty': flt(item.actual_qty, precision),
-		})
+		item.update(
+			{
+				"item_name": frappe.get_cached_value("Item", item.item_code, "item_name"),
+				"disable_quick_entry": frappe.get_cached_value("Item", item.item_code, "has_batch_no")
+				or frappe.get_cached_value("Item", item.item_code, "has_serial_no"),
+				"projected_qty": flt(item.projected_qty, precision),
+				"reserved_qty": flt(item.reserved_qty, precision),
+				"reserved_qty_for_production": flt(item.reserved_qty_for_production, precision),
+				"reserved_qty_for_sub_contract": flt(item.reserved_qty_for_sub_contract, precision),
+				"actual_qty": flt(item.actual_qty, precision),
+			}
+		)
 	return items
diff --git a/erpnext/stock/dashboard/warehouse_capacity_dashboard.py b/erpnext/stock/dashboard/warehouse_capacity_dashboard.py
index c0666cf..24e0ef1 100644
--- a/erpnext/stock/dashboard/warehouse_capacity_dashboard.py
+++ b/erpnext/stock/dashboard/warehouse_capacity_dashboard.py
@@ -6,8 +6,15 @@
 
 
 @frappe.whitelist()
-def get_data(item_code=None, warehouse=None, parent_warehouse=None,
-	company=None, start=0, sort_by="stock_capacity", sort_order="desc"):
+def get_data(
+	item_code=None,
+	warehouse=None,
+	parent_warehouse=None,
+	company=None,
+	start=0,
+	sort_by="stock_capacity",
+	sort_order="desc",
+):
 	"""Return data to render the warehouse capacity dashboard."""
 	filters = get_filters(item_code, warehouse, parent_warehouse, company)
 
@@ -18,51 +25,59 @@
 	capacity_data = get_warehouse_capacity_data(filters, start)
 
 	asc_desc = -1 if sort_order == "desc" else 1
-	capacity_data = sorted(capacity_data, key = lambda i: (i[sort_by] * asc_desc))
+	capacity_data = sorted(capacity_data, key=lambda i: (i[sort_by] * asc_desc))
 
 	return capacity_data
 
-def get_filters(item_code=None, warehouse=None, parent_warehouse=None,
-	company=None):
-	filters = [['disable', '=', 0]]
+
+def get_filters(item_code=None, warehouse=None, parent_warehouse=None, company=None):
+	filters = [["disable", "=", 0]]
 	if item_code:
-		filters.append(['item_code', '=', item_code])
+		filters.append(["item_code", "=", item_code])
 	if warehouse:
-		filters.append(['warehouse', '=', warehouse])
+		filters.append(["warehouse", "=", warehouse])
 	if company:
-		filters.append(['company', '=', company])
+		filters.append(["company", "=", company])
 	if parent_warehouse:
 		lft, rgt = frappe.db.get_value("Warehouse", parent_warehouse, ["lft", "rgt"])
-		warehouses = frappe.db.sql_list("""
+		warehouses = frappe.db.sql_list(
+			"""
 			select name from `tabWarehouse`
 			where lft >=%s and rgt<=%s
-		""", (lft, rgt))
-		filters.append(['warehouse', 'in', warehouses])
+		""",
+			(lft, rgt),
+		)
+		filters.append(["warehouse", "in", warehouses])
 	return filters
 
+
 def get_warehouse_filter_based_on_permissions(filters):
 	try:
 		# check if user has any restrictions based on user permissions on warehouse
-		if DatabaseQuery('Warehouse', user=frappe.session.user).build_match_conditions():
-			filters.append(['warehouse', 'in', [w.name for w in frappe.get_list('Warehouse')]])
+		if DatabaseQuery("Warehouse", user=frappe.session.user).build_match_conditions():
+			filters.append(["warehouse", "in", [w.name for w in frappe.get_list("Warehouse")]])
 		return False, filters
 	except frappe.PermissionError:
 		# user does not have access on warehouse
 		return True, []
 
+
 def get_warehouse_capacity_data(filters, start):
-	capacity_data = frappe.db.get_all('Putaway Rule',
-		fields=['item_code', 'warehouse','stock_capacity', 'company'],
+	capacity_data = frappe.db.get_all(
+		"Putaway Rule",
+		fields=["item_code", "warehouse", "stock_capacity", "company"],
 		filters=filters,
 		limit_start=start,
-		limit_page_length='11'
+		limit_page_length="11",
 	)
 
 	for entry in capacity_data:
 		balance_qty = get_stock_balance(entry.item_code, entry.warehouse, nowdate()) or 0
-		entry.update({
-			'actual_qty': balance_qty,
-			'percent_occupied': flt((flt(balance_qty) / flt(entry.stock_capacity)) * 100, 0)
-		})
+		entry.update(
+			{
+				"actual_qty": balance_qty,
+				"percent_occupied": flt((flt(balance_qty) / flt(entry.stock_capacity)) * 100, 0),
+			}
+		)
 
 	return capacity_data
diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
index d835420..dbf6cf0 100644
--- a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
+++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
@@ -11,27 +11,38 @@
 
 @frappe.whitelist()
 @cache_source
-def get(chart_name = None, chart = None, no_cache = None, filters = None, from_date = None,
-	to_date = None, timespan = None, time_interval = None, heatmap_year = None):
+def get(
+	chart_name=None,
+	chart=None,
+	no_cache=None,
+	filters=None,
+	from_date=None,
+	to_date=None,
+	timespan=None,
+	time_interval=None,
+	heatmap_year=None,
+):
 	labels, datapoints = [], []
 	filters = frappe.parse_json(filters)
 
-	warehouse_filters = [['is_group', '=', 0]]
+	warehouse_filters = [["is_group", "=", 0]]
 	if filters and filters.get("company"):
-		warehouse_filters.append(['company', '=', filters.get("company")])
+		warehouse_filters.append(["company", "=", filters.get("company")])
 
-	warehouses = frappe.get_list("Warehouse", fields=['name'], filters=warehouse_filters, order_by='name')
+	warehouses = frappe.get_list(
+		"Warehouse", fields=["name"], filters=warehouse_filters, order_by="name"
+	)
 
 	for wh in warehouses:
 		balance = get_stock_value_from_bin(warehouse=wh.name)
 		wh["balance"] = balance[0][0]
 
-	warehouses  = [x for x in warehouses if not (x.get('balance') == None)]
+	warehouses = [x for x in warehouses if not (x.get("balance") == None)]
 
 	if not warehouses:
 		return []
 
-	sorted_warehouse_map = sorted(warehouses, key = lambda i: i['balance'], reverse=True)
+	sorted_warehouse_map = sorted(warehouses, key=lambda i: i["balance"], reverse=True)
 
 	if len(sorted_warehouse_map) > 10:
 		sorted_warehouse_map = sorted_warehouse_map[:10]
@@ -40,11 +51,8 @@
 		labels.append(_(warehouse.get("name")))
 		datapoints.append(warehouse.get("balance"))
 
-	return{
+	return {
 		"labels": labels,
-		"datasets": [{
-			"name": _("Stock Value"),
-			"values": datapoints
-		}],
-		"type": "bar"
+		"datasets": [{"name": _("Stock Value"), "values": datapoints}],
+		"type": "bar",
 	}
diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py
index c9b4c14..aac6cd3 100644
--- a/erpnext/stock/doctype/batch/batch.py
+++ b/erpnext/stock/doctype/batch/batch.py
@@ -23,7 +23,7 @@
 	temp = None
 	while not temp:
 		temp = frappe.generate_hash()[:7].upper()
-		if frappe.db.exists('Batch', temp):
+		if frappe.db.exists("Batch", temp):
 			temp = None
 
 	return temp
@@ -34,7 +34,7 @@
 	Verify if the Batch is to be named using a naming series
 	:return: bool
 	"""
-	use_naming_series = cint(frappe.db.get_single_value('Stock Settings', 'use_naming_series'))
+	use_naming_series = cint(frappe.db.get_single_value("Stock Settings", "use_naming_series"))
 	return bool(use_naming_series)
 
 
@@ -46,9 +46,9 @@
 	is set to use naming series.
 	:return: The naming series.
 	"""
-	naming_series_prefix = frappe.db.get_single_value('Stock Settings', 'naming_series_prefix')
+	naming_series_prefix = frappe.db.get_single_value("Stock Settings", "naming_series_prefix")
 	if not naming_series_prefix:
-		naming_series_prefix = 'BATCH-'
+		naming_series_prefix = "BATCH-"
 
 	return naming_series_prefix
 
@@ -62,9 +62,9 @@
 	:return: The derived key. If no prefix is given, an empty string is returned
 	"""
 	if not str(prefix):
-		return ''
+		return ""
 	else:
-		return prefix.upper() + '.#####'
+		return prefix.upper() + ".#####"
 
 
 def get_batch_naming_series():
@@ -74,7 +74,7 @@
 	Naming series key is in the format [prefix].[#####]
 	:return: The naming series or empty string if not available
 	"""
-	series = ''
+	series = ""
 	if batch_uses_naming_series():
 		prefix = _get_batch_prefix()
 		key = _make_naming_series_key(prefix)
@@ -87,8 +87,9 @@
 	def autoname(self):
 		"""Generate random ID for batch if not specified"""
 		if not self.batch_id:
-			create_new_batch, batch_number_series = frappe.db.get_value('Item', self.item,
-				['create_new_batch', 'batch_number_series'])
+			create_new_batch, batch_number_series = frappe.db.get_value(
+				"Item", self.item, ["create_new_batch", "batch_number_series"]
+			)
 
 			if create_new_batch:
 				if batch_number_series:
@@ -98,12 +99,12 @@
 				else:
 					self.batch_id = get_name_from_hash()
 			else:
-				frappe.throw(_('Batch ID is mandatory'), frappe.MandatoryError)
+				frappe.throw(_("Batch ID is mandatory"), frappe.MandatoryError)
 
 		self.name = self.batch_id
 
 	def onload(self):
-		self.image = frappe.db.get_value('Item', self.item, 'image')
+		self.image = frappe.db.get_value("Item", self.item, "image")
 
 	def after_delete(self):
 		revert_series_if_last(get_batch_naming_series(), self.name)
@@ -123,16 +124,21 @@
 			self.use_batchwise_valuation = 1
 
 	def before_save(self):
-		has_expiry_date, shelf_life_in_days = frappe.db.get_value('Item', self.item, ['has_expiry_date', 'shelf_life_in_days'])
+		has_expiry_date, shelf_life_in_days = frappe.db.get_value(
+			"Item", self.item, ["has_expiry_date", "shelf_life_in_days"]
+		)
 		if not self.expiry_date and has_expiry_date and shelf_life_in_days:
 			self.expiry_date = add_days(self.manufacturing_date, shelf_life_in_days)
 
 		if has_expiry_date and not self.expiry_date:
-			frappe.throw(msg=_("Please set {0} for Batched Item {1}, which is used to set {2} on Submit.") \
-				.format(frappe.bold("Shelf Life in Days"),
+			frappe.throw(
+				msg=_("Please set {0} for Batched Item {1}, which is used to set {2} on Submit.").format(
+					frappe.bold("Shelf Life in Days"),
 					get_link_to_form("Item", self.item),
-					frappe.bold("Batch Expiry Date")),
-				title=_("Expiry Date Mandatory"))
+					frappe.bold("Batch Expiry Date"),
+				),
+				title=_("Expiry Date Mandatory"),
+			)
 
 	def get_name_from_naming_series(self):
 		"""
@@ -149,9 +155,11 @@
 
 
 @frappe.whitelist()
-def get_batch_qty(batch_no=None, warehouse=None, item_code=None, posting_date=None, posting_time=None):
+def get_batch_qty(
+	batch_no=None, warehouse=None, item_code=None, posting_date=None, posting_time=None
+):
 	"""Returns batch actual qty if warehouse is passed,
-		or returns dict of qty by warehouse if warehouse is None
+	        or returns dict of qty by warehouse if warehouse is None
 
 	The user must pass either batch_no or batch_no + warehouse or item_code + warehouse
 
@@ -163,25 +171,41 @@
 	if batch_no and warehouse:
 		cond = ""
 		if posting_date and posting_time:
-			cond = " and timestamp(posting_date, posting_time) <= timestamp('{0}', '{1}')".format(posting_date,
-				posting_time)
+			cond = " and timestamp(posting_date, posting_time) <= timestamp('{0}', '{1}')".format(
+				posting_date, posting_time
+			)
 
-		out = float(frappe.db.sql("""select sum(actual_qty)
+		out = float(
+			frappe.db.sql(
+				"""select sum(actual_qty)
 			from `tabStock Ledger Entry`
-			where is_cancelled = 0 and warehouse=%s and batch_no=%s {0}""".format(cond),
-			(warehouse, batch_no))[0][0] or 0)
+			where is_cancelled = 0 and warehouse=%s and batch_no=%s {0}""".format(
+					cond
+				),
+				(warehouse, batch_no),
+			)[0][0]
+			or 0
+		)
 
 	if batch_no and not warehouse:
-		out = frappe.db.sql('''select warehouse, sum(actual_qty) as qty
+		out = frappe.db.sql(
+			"""select warehouse, sum(actual_qty) as qty
 			from `tabStock Ledger Entry`
 			where is_cancelled = 0 and batch_no=%s
-			group by warehouse''', batch_no, as_dict=1)
+			group by warehouse""",
+			batch_no,
+			as_dict=1,
+		)
 
 	if not batch_no and item_code and warehouse:
-		out = frappe.db.sql('''select batch_no, sum(actual_qty) as qty
+		out = frappe.db.sql(
+			"""select batch_no, sum(actual_qty) as qty
 			from `tabStock Ledger Entry`
 			where is_cancelled = 0 and item_code = %s and warehouse=%s
-			group by batch_no''', (item_code, warehouse), as_dict=1)
+			group by batch_no""",
+			(item_code, warehouse),
+			as_dict=1,
+		)
 
 	return out
 
@@ -190,7 +214,9 @@
 def get_batches_by_oldest(item_code, warehouse):
 	"""Returns the oldest batch and qty for the given item_code and warehouse"""
 	batches = get_batch_qty(item_code=item_code, warehouse=warehouse)
-	batches_dates = [[batch, frappe.get_value('Batch', batch.batch_no, 'expiry_date')] for batch in batches]
+	batches_dates = [
+		[batch, frappe.get_value("Batch", batch.batch_no, "expiry_date")] for batch in batches
+	]
 	batches_dates.sort(key=lambda tup: tup[1])
 	return batches_dates
 
@@ -198,33 +224,25 @@
 @frappe.whitelist()
 def split_batch(batch_no, item_code, warehouse, qty, new_batch_id=None):
 	"""Split the batch into a new batch"""
-	batch = frappe.get_doc(dict(doctype='Batch', item=item_code, batch_id=new_batch_id)).insert()
+	batch = frappe.get_doc(dict(doctype="Batch", item=item_code, batch_id=new_batch_id)).insert()
 
-	company = frappe.db.get_value('Stock Ledger Entry', dict(
-			item_code=item_code,
-			batch_no=batch_no,
-			warehouse=warehouse
-		), ['company'])
+	company = frappe.db.get_value(
+		"Stock Ledger Entry",
+		dict(item_code=item_code, batch_no=batch_no, warehouse=warehouse),
+		["company"],
+	)
 
-	stock_entry = frappe.get_doc(dict(
-		doctype='Stock Entry',
-		purpose='Repack',
-		company=company,
-		items=[
-			dict(
-				item_code=item_code,
-				qty=float(qty or 0),
-				s_warehouse=warehouse,
-				batch_no=batch_no
-			),
-			dict(
-				item_code=item_code,
-				qty=float(qty or 0),
-				t_warehouse=warehouse,
-				batch_no=batch.name
-			),
-		]
-	))
+	stock_entry = frappe.get_doc(
+		dict(
+			doctype="Stock Entry",
+			purpose="Repack",
+			company=company,
+			items=[
+				dict(item_code=item_code, qty=float(qty or 0), s_warehouse=warehouse, batch_no=batch_no),
+				dict(item_code=item_code, qty=float(qty or 0), t_warehouse=warehouse, batch_no=batch.name),
+			],
+		)
+	)
 	stock_entry.set_stock_entry_type()
 	stock_entry.insert()
 	stock_entry.submit()
@@ -235,15 +253,20 @@
 def set_batch_nos(doc, warehouse_field, throw=False, child_table="items"):
 	"""Automatically select `batch_no` for outgoing items in item table"""
 	for d in doc.get(child_table):
-		qty = d.get('stock_qty') or d.get('transfer_qty') or d.get('qty') or 0
+		qty = d.get("stock_qty") or d.get("transfer_qty") or d.get("qty") or 0
 		warehouse = d.get(warehouse_field, None)
-		if warehouse and qty > 0 and frappe.db.get_value('Item', d.item_code, 'has_batch_no'):
+		if warehouse and qty > 0 and frappe.db.get_value("Item", d.item_code, "has_batch_no"):
 			if not d.batch_no:
 				d.batch_no = get_batch_no(d.item_code, warehouse, qty, throw, d.serial_no)
 			else:
 				batch_qty = get_batch_qty(batch_no=d.batch_no, warehouse=warehouse)
 				if flt(batch_qty, d.precision("qty")) < flt(qty, d.precision("qty")):
-					frappe.throw(_("Row #{0}: The batch {1} has only {2} qty. Please select another batch which has {3} qty available or split the row into multiple rows, to deliver/issue from multiple batches").format(d.idx, d.batch_no, batch_qty, qty))
+					frappe.throw(
+						_(
+							"Row #{0}: The batch {1} has only {2} qty. Please select another batch which has {3} qty available or split the row into multiple rows, to deliver/issue from multiple batches"
+						).format(d.idx, d.batch_no, batch_qty, qty)
+					)
+
 
 @frappe.whitelist()
 def get_batch_no(item_code, warehouse, qty=1, throw=False, serial_no=None):
@@ -264,7 +287,11 @@
 			break
 
 	if not batch_no:
-		frappe.msgprint(_('Please select a Batch for Item {0}. Unable to find a single batch that fulfills this requirement').format(frappe.bold(item_code)))
+		frappe.msgprint(
+			_(
+				"Please select a Batch for Item {0}. Unable to find a single batch that fulfills this requirement"
+			).format(frappe.bold(item_code))
+		)
 		if throw:
 			raise UnableToSelectBatchError
 
@@ -273,16 +300,14 @@
 
 def get_batches(item_code, warehouse, qty=1, throw=False, serial_no=None):
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
-	cond = ''
-	if serial_no and frappe.get_cached_value('Item', item_code, 'has_batch_no'):
+
+	cond = ""
+	if serial_no and frappe.get_cached_value("Item", item_code, "has_batch_no"):
 		serial_nos = get_serial_nos(serial_no)
-		batch = frappe.get_all("Serial No",
-			fields = ["distinct batch_no"],
-			filters= {
-				"item_code": item_code,
-				"warehouse": warehouse,
-				"name": ("in", serial_nos)
-			}
+		batch = frappe.get_all(
+			"Serial No",
+			fields=["distinct batch_no"],
+			filters={"item_code": item_code, "warehouse": warehouse, "name": ("in", serial_nos)},
 		)
 
 		if not batch:
@@ -291,9 +316,10 @@
 		if batch and len(batch) > 1:
 			return []
 
-		cond = " and `tabBatch`.name = %s" %(frappe.db.escape(batch[0].batch_no))
+		cond = " and `tabBatch`.name = %s" % (frappe.db.escape(batch[0].batch_no))
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select batch_id, sum(`tabStock Ledger Entry`.actual_qty) as qty
 		from `tabBatch`
 			join `tabStock Ledger Entry` ignore index (item_code, warehouse)
@@ -303,24 +329,34 @@
 			and (`tabBatch`.expiry_date >= CURDATE() or `tabBatch`.expiry_date IS NULL) {0}
 		group by batch_id
 		order by `tabBatch`.expiry_date ASC, `tabBatch`.creation ASC
-	""".format(cond), (item_code, warehouse), as_dict=True)
+	""".format(
+			cond
+		),
+		(item_code, warehouse),
+		as_dict=True,
+	)
+
 
 def validate_serial_no_with_batch(serial_nos, item_code):
 	if frappe.get_cached_value("Serial No", serial_nos[0], "item_code") != item_code:
-		frappe.throw(_("The serial no {0} does not belong to item {1}")
-			.format(get_link_to_form("Serial No", serial_nos[0]), get_link_to_form("Item", item_code)))
+		frappe.throw(
+			_("The serial no {0} does not belong to item {1}").format(
+				get_link_to_form("Serial No", serial_nos[0]), get_link_to_form("Item", item_code)
+			)
+		)
 
-	serial_no_link = ','.join(get_link_to_form("Serial No", sn) for sn in serial_nos)
+	serial_no_link = ",".join(get_link_to_form("Serial No", sn) for sn in serial_nos)
 
 	message = "Serial Nos" if len(serial_nos) > 1 else "Serial No"
-	frappe.throw(_("There is no batch found against the {0}: {1}")
-		.format(message, serial_no_link))
+	frappe.throw(_("There is no batch found against the {0}: {1}").format(message, serial_no_link))
+
 
 def make_batch(args):
 	if frappe.db.get_value("Item", args.item, "has_batch_no"):
 		args.doctype = "Batch"
 		frappe.get_doc(args).insert().name
 
+
 @frappe.whitelist()
 def get_pos_reserved_batch_qty(filters):
 	import json
@@ -332,16 +368,22 @@
 	item = frappe.qb.DocType("POS Invoice Item").as_("item")
 	sum_qty = frappe.query_builder.functions.Sum(item.qty).as_("qty")
 
-	reserved_batch_qty = frappe.qb.from_(p).from_(item).select(sum_qty).where(
-		(p.name == item.parent) &
-		(p.consolidated_invoice.isnull()) &
-		(p.status != "Consolidated") &
-		(p.docstatus == 1) &
-		(item.docstatus == 1) &
-		(item.item_code == filters.get('item_code')) &
-		(item.warehouse == filters.get('warehouse')) &
-		(item.batch_no == filters.get('batch_no'))
-	).run()
+	reserved_batch_qty = (
+		frappe.qb.from_(p)
+		.from_(item)
+		.select(sum_qty)
+		.where(
+			(p.name == item.parent)
+			& (p.consolidated_invoice.isnull())
+			& (p.status != "Consolidated")
+			& (p.docstatus == 1)
+			& (item.docstatus == 1)
+			& (item.item_code == filters.get("item_code"))
+			& (item.warehouse == filters.get("warehouse"))
+			& (item.batch_no == filters.get("batch_no"))
+		)
+		.run()
+	)
 
 	flt_reserved_batch_qty = flt(reserved_batch_qty[0][0])
 	return flt_reserved_batch_qty
diff --git a/erpnext/stock/doctype/batch/batch_dashboard.py b/erpnext/stock/doctype/batch/batch_dashboard.py
index 725365b..84b64f3 100644
--- a/erpnext/stock/doctype/batch/batch_dashboard.py
+++ b/erpnext/stock/doctype/batch/batch_dashboard.py
@@ -3,23 +3,11 @@
 
 def get_data():
 	return {
-		'fieldname': 'batch_no',
-		'transactions': [
-			{
-				'label': _('Buy'),
-				'items': ['Purchase Invoice', 'Purchase Receipt']
-			},
-			{
-				'label': _('Sell'),
-				'items': ['Sales Invoice', 'Delivery Note']
-			},
-			{
-				'label': _('Move'),
-				'items': ['Stock Entry']
-			},
-			{
-				'label': _('Quality'),
-				'items': ['Quality Inspection']
-			}
-		]
+		"fieldname": "batch_no",
+		"transactions": [
+			{"label": _("Buy"), "items": ["Purchase Invoice", "Purchase Receipt"]},
+			{"label": _("Sell"), "items": ["Sales Invoice", "Delivery Note"]},
+			{"label": _("Move"), "items": ["Stock Entry"]},
+			{"label": _("Quality"), "items": ["Quality Inspection"]},
+		],
 	}
diff --git a/erpnext/stock/doctype/batch/test_batch.py b/erpnext/stock/doctype/batch/test_batch.py
index 5763753..c76da62 100644
--- a/erpnext/stock/doctype/batch/test_batch.py
+++ b/erpnext/stock/doctype/batch/test_batch.py
@@ -21,134 +21,127 @@
 
 class TestBatch(FrappeTestCase):
 	def test_item_has_batch_enabled(self):
-		self.assertRaises(ValidationError, frappe.get_doc({
-			"doctype": "Batch",
-			"name": "_test Batch",
-			"item": "_Test Item"
-		}).save)
+		self.assertRaises(
+			ValidationError,
+			frappe.get_doc({"doctype": "Batch", "name": "_test Batch", "item": "_Test Item"}).save,
+		)
 
 	@classmethod
 	def make_batch_item(cls, item_name):
 		from erpnext.stock.doctype.item.test_item import make_item
+
 		if not frappe.db.exists(item_name):
-			return make_item(item_name, dict(has_batch_no = 1, create_new_batch = 1, is_stock_item=1))
+			return make_item(item_name, dict(has_batch_no=1, create_new_batch=1, is_stock_item=1))
 
-	def test_purchase_receipt(self, batch_qty = 100):
-		'''Test automated batch creation from Purchase Receipt'''
-		self.make_batch_item('ITEM-BATCH-1')
+	def test_purchase_receipt(self, batch_qty=100):
+		"""Test automated batch creation from Purchase Receipt"""
+		self.make_batch_item("ITEM-BATCH-1")
 
-		receipt = frappe.get_doc(dict(
-			doctype='Purchase Receipt',
-			supplier='_Test Supplier',
-			company='_Test Company',
-			items=[
-				dict(
-					item_code='ITEM-BATCH-1',
-					qty=batch_qty,
-					rate=10,
-					warehouse= 'Stores - _TC'
-				)
-			]
-		)).insert()
+		receipt = frappe.get_doc(
+			dict(
+				doctype="Purchase Receipt",
+				supplier="_Test Supplier",
+				company="_Test Company",
+				items=[dict(item_code="ITEM-BATCH-1", qty=batch_qty, rate=10, warehouse="Stores - _TC")],
+			)
+		).insert()
 		receipt.submit()
 
 		self.assertTrue(receipt.items[0].batch_no)
-		self.assertEqual(get_batch_qty(receipt.items[0].batch_no,
-			receipt.items[0].warehouse), batch_qty)
+		self.assertEqual(get_batch_qty(receipt.items[0].batch_no, receipt.items[0].warehouse), batch_qty)
 
 		return receipt
 
 	def test_stock_entry_incoming(self):
-		'''Test batch creation via Stock Entry (Work Order)'''
+		"""Test batch creation via Stock Entry (Work Order)"""
 
-		self.make_batch_item('ITEM-BATCH-1')
+		self.make_batch_item("ITEM-BATCH-1")
 
-		stock_entry = frappe.get_doc(dict(
-			doctype = 'Stock Entry',
-			purpose = 'Material Receipt',
-			company = '_Test Company',
-			items = [
-				dict(
-					item_code = 'ITEM-BATCH-1',
-					qty = 90,
-					t_warehouse = '_Test Warehouse - _TC',
-					cost_center = 'Main - _TC',
-					rate = 10
-				)
-			]
-		))
+		stock_entry = frappe.get_doc(
+			dict(
+				doctype="Stock Entry",
+				purpose="Material Receipt",
+				company="_Test Company",
+				items=[
+					dict(
+						item_code="ITEM-BATCH-1",
+						qty=90,
+						t_warehouse="_Test Warehouse - _TC",
+						cost_center="Main - _TC",
+						rate=10,
+					)
+				],
+			)
+		)
 
 		stock_entry.set_stock_entry_type()
 		stock_entry.insert()
 		stock_entry.submit()
 
 		self.assertTrue(stock_entry.items[0].batch_no)
-		self.assertEqual(get_batch_qty(stock_entry.items[0].batch_no, stock_entry.items[0].t_warehouse), 90)
+		self.assertEqual(
+			get_batch_qty(stock_entry.items[0].batch_no, stock_entry.items[0].t_warehouse), 90
+		)
 
 	def test_delivery_note(self):
-		'''Test automatic batch selection for outgoing items'''
+		"""Test automatic batch selection for outgoing items"""
 		batch_qty = 15
 		receipt = self.test_purchase_receipt(batch_qty)
-		item_code = 'ITEM-BATCH-1'
+		item_code = "ITEM-BATCH-1"
 
-		delivery_note = frappe.get_doc(dict(
-			doctype='Delivery Note',
-			customer='_Test Customer',
-			company=receipt.company,
-			items=[
-				dict(
-					item_code=item_code,
-					qty=batch_qty,
-					rate=10,
-					warehouse=receipt.items[0].warehouse
-				)
-			]
-		)).insert()
+		delivery_note = frappe.get_doc(
+			dict(
+				doctype="Delivery Note",
+				customer="_Test Customer",
+				company=receipt.company,
+				items=[
+					dict(item_code=item_code, qty=batch_qty, rate=10, warehouse=receipt.items[0].warehouse)
+				],
+			)
+		).insert()
 		delivery_note.submit()
 
 		# shipped from FEFO batch
 		self.assertEqual(
-			delivery_note.items[0].batch_no,
-			get_batch_no(item_code, receipt.items[0].warehouse, batch_qty)
+			delivery_note.items[0].batch_no, get_batch_no(item_code, receipt.items[0].warehouse, batch_qty)
 		)
 
 	def test_delivery_note_fail(self):
-		'''Test automatic batch selection for outgoing items'''
+		"""Test automatic batch selection for outgoing items"""
 		receipt = self.test_purchase_receipt(100)
-		delivery_note = frappe.get_doc(dict(
-			doctype = 'Delivery Note',
-			customer = '_Test Customer',
-			company = receipt.company,
-			items = [
-				dict(
-					item_code = 'ITEM-BATCH-1',
-					qty = 5000,
-					rate = 10,
-					warehouse = receipt.items[0].warehouse
-				)
-			]
-		))
+		delivery_note = frappe.get_doc(
+			dict(
+				doctype="Delivery Note",
+				customer="_Test Customer",
+				company=receipt.company,
+				items=[
+					dict(item_code="ITEM-BATCH-1", qty=5000, rate=10, warehouse=receipt.items[0].warehouse)
+				],
+			)
+		)
 		self.assertRaises(UnableToSelectBatchError, delivery_note.insert)
 
 	def test_stock_entry_outgoing(self):
-		'''Test automatic batch selection for outgoing stock entry'''
+		"""Test automatic batch selection for outgoing stock entry"""
 
 		batch_qty = 16
 		receipt = self.test_purchase_receipt(batch_qty)
-		item_code = 'ITEM-BATCH-1'
+		item_code = "ITEM-BATCH-1"
 
-		stock_entry = frappe.get_doc(dict(
-			doctype='Stock Entry',
-			purpose='Material Issue',
-			company=receipt.company,
-			items=[
-				dict(
-					item_code=item_code,
-					qty=batch_qty,
-					s_warehouse=receipt.items[0].warehouse,
-				)
-			]
-		))
+		stock_entry = frappe.get_doc(
+			dict(
+				doctype="Stock Entry",
+				purpose="Material Issue",
+				company=receipt.company,
+				items=[
+					dict(
+						item_code=item_code,
+						qty=batch_qty,
+						s_warehouse=receipt.items[0].warehouse,
+					)
+				],
+			)
+		)
 
 		stock_entry.set_stock_entry_type()
 		stock_entry.insert()
@@ -156,35 +149,38 @@
 
 		# assert same batch is selected
 		self.assertEqual(
-			stock_entry.items[0].batch_no,
-			get_batch_no(item_code, receipt.items[0].warehouse, batch_qty)
+			stock_entry.items[0].batch_no, get_batch_no(item_code, receipt.items[0].warehouse, batch_qty)
 		)
 
 	def test_batch_split(self):
-		'''Test batch splitting'''
+		"""Test batch splitting"""
 		receipt = self.test_purchase_receipt()
 		from erpnext.stock.doctype.batch.batch import split_batch
 
-		new_batch = split_batch(receipt.items[0].batch_no, 'ITEM-BATCH-1', receipt.items[0].warehouse, 22)
+		new_batch = split_batch(
+			receipt.items[0].batch_no, "ITEM-BATCH-1", receipt.items[0].warehouse, 22
+		)
 
 		self.assertEqual(get_batch_qty(receipt.items[0].batch_no, receipt.items[0].warehouse), 78)
 		self.assertEqual(get_batch_qty(new_batch, receipt.items[0].warehouse), 22)
 
 	def test_get_batch_qty(self):
-		'''Test getting batch quantities by batch_numbers, item_code or warehouse'''
-		self.make_batch_item('ITEM-BATCH-2')
-		self.make_new_batch_and_entry('ITEM-BATCH-2', 'batch a', '_Test Warehouse - _TC')
-		self.make_new_batch_and_entry('ITEM-BATCH-2', 'batch b', '_Test Warehouse - _TC')
+		"""Test getting batch quantities by batch_numbers, item_code or warehouse"""
+		self.make_batch_item("ITEM-BATCH-2")
+		self.make_new_batch_and_entry("ITEM-BATCH-2", "batch a", "_Test Warehouse - _TC")
+		self.make_new_batch_and_entry("ITEM-BATCH-2", "batch b", "_Test Warehouse - _TC")
 
-		self.assertEqual(get_batch_qty(item_code = 'ITEM-BATCH-2', warehouse = '_Test Warehouse - _TC'),
-			[{'batch_no': u'batch a', 'qty': 90.0}, {'batch_no': u'batch b', 'qty': 90.0}])
+		self.assertEqual(
+			get_batch_qty(item_code="ITEM-BATCH-2", warehouse="_Test Warehouse - _TC"),
+			[{"batch_no": "batch a", "qty": 90.0}, {"batch_no": "batch b", "qty": 90.0}],
+		)
 
-		self.assertEqual(get_batch_qty('batch a', '_Test Warehouse - _TC'), 90)
+		self.assertEqual(get_batch_qty("batch a", "_Test Warehouse - _TC"), 90)
 
 	def test_total_batch_qty(self):
-		self.make_batch_item('ITEM-BATCH-3')
+		self.make_batch_item("ITEM-BATCH-3")
 		existing_batch_qty = flt(frappe.db.get_value("Batch", "B100", "batch_qty"))
-		stock_entry = self.make_new_batch_and_entry('ITEM-BATCH-3', 'B100', '_Test Warehouse - _TC')
+		stock_entry = self.make_new_batch_and_entry("ITEM-BATCH-3", "B100", "_Test Warehouse - _TC")
 
 		current_batch_qty = flt(frappe.db.get_value("Batch", "B100", "batch_qty"))
 		self.assertEqual(current_batch_qty, existing_batch_qty + 90)
@@ -195,32 +191,32 @@
 
 	@classmethod
 	def make_new_batch_and_entry(cls, item_name, batch_name, warehouse):
-		'''Make a new stock entry for given target warehouse and batch name of item'''
+		"""Make a new stock entry for given target warehouse and batch name of item"""
 
 		if not frappe.db.exists("Batch", batch_name):
-			batch = frappe.get_doc(dict(
-				doctype = 'Batch',
-				item = item_name,
-				batch_id = batch_name
-			)).insert(ignore_permissions=True)
+			batch = frappe.get_doc(dict(doctype="Batch", item=item_name, batch_id=batch_name)).insert(
+				ignore_permissions=True
+			)
 			batch.save()
 
-		stock_entry = frappe.get_doc(dict(
-			doctype = 'Stock Entry',
-			purpose = 'Material Receipt',
-			company = '_Test Company',
-			items = [
-				dict(
-					item_code = item_name,
-					qty = 90,
-					t_warehouse = warehouse,
-					cost_center = 'Main - _TC',
-					rate = 10,
-					batch_no = batch_name,
-					allow_zero_valuation_rate = 1
-				)
-			]
-		))
+		stock_entry = frappe.get_doc(
+			dict(
+				doctype="Stock Entry",
+				purpose="Material Receipt",
+				company="_Test Company",
+				items=[
+					dict(
+						item_code=item_name,
+						qty=90,
+						t_warehouse=warehouse,
+						cost_center="Main - _TC",
+						rate=10,
+						batch_no=batch_name,
+						allow_zero_valuation_rate=1,
+					)
+				],
+			)
+		)
 
 		stock_entry.set_stock_entry_type()
 		stock_entry.insert()
@@ -229,28 +225,28 @@
 		return stock_entry
 
 	def test_batch_name_with_naming_series(self):
-		stock_settings = frappe.get_single('Stock Settings')
+		stock_settings = frappe.get_single("Stock Settings")
 		use_naming_series = cint(stock_settings.use_naming_series)
 
 		if not use_naming_series:
-			frappe.set_value('Stock Settings', 'Stock Settings', 'use_naming_series', 1)
+			frappe.set_value("Stock Settings", "Stock Settings", "use_naming_series", 1)
 
-		batch = self.make_new_batch('_Test Stock Item For Batch Test1')
+		batch = self.make_new_batch("_Test Stock Item For Batch Test1")
 		batch_name = batch.name
 
-		self.assertTrue(batch_name.startswith('BATCH-'))
+		self.assertTrue(batch_name.startswith("BATCH-"))
 
 		batch.delete()
-		batch = self.make_new_batch('_Test Stock Item For Batch Test2')
+		batch = self.make_new_batch("_Test Stock Item For Batch Test2")
 
 		self.assertEqual(batch_name, batch.name)
 
 		# reset Stock Settings
 		if not use_naming_series:
-			frappe.set_value('Stock Settings', 'Stock Settings', 'use_naming_series', 0)
+			frappe.set_value("Stock Settings", "Stock Settings", "use_naming_series", 0)
 
 	def make_new_batch(self, item_name, batch_id=None, do_not_insert=0):
-		batch = frappe.new_doc('Batch')
+		batch = frappe.new_doc("Batch")
 		item = self.make_batch_item(item_name)
 		batch.item = item.name
 
@@ -263,53 +259,56 @@
 		return batch
 
 	def test_batch_wise_item_price(self):
-		if not frappe.db.get_value('Item', '_Test Batch Price Item'):
-			frappe.get_doc({
-				'doctype': 'Item',
-				'is_stock_item': 1,
-				'item_code': '_Test Batch Price Item',
-				'item_group': 'Products',
-				'has_batch_no': 1,
-				'create_new_batch': 1
-			}).insert(ignore_permissions=True)
+		if not frappe.db.get_value("Item", "_Test Batch Price Item"):
+			frappe.get_doc(
+				{
+					"doctype": "Item",
+					"is_stock_item": 1,
+					"item_code": "_Test Batch Price Item",
+					"item_group": "Products",
+					"has_batch_no": 1,
+					"create_new_batch": 1,
+				}
+			).insert(ignore_permissions=True)
 
-		batch1 = create_batch('_Test Batch Price Item', 200, 1)
-		batch2 = create_batch('_Test Batch Price Item', 300, 1)
-		batch3 = create_batch('_Test Batch Price Item', 400, 0)
+		batch1 = create_batch("_Test Batch Price Item", 200, 1)
+		batch2 = create_batch("_Test Batch Price Item", 300, 1)
+		batch3 = create_batch("_Test Batch Price Item", 400, 0)
 
 		company = "_Test Company with perpetual inventory"
-		currency = frappe.get_cached_value("Company",  company,  "default_currency")
+		currency = frappe.get_cached_value("Company", company, "default_currency")
 
-		args = frappe._dict({
-			"item_code": "_Test Batch Price Item",
-			"company": company,
-			"price_list": "_Test Price List",
-			"currency": currency,
-			"doctype": "Sales Invoice",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"customer": "_Test Customer",
-			"name": None
-		})
+		args = frappe._dict(
+			{
+				"item_code": "_Test Batch Price Item",
+				"company": company,
+				"price_list": "_Test Price List",
+				"currency": currency,
+				"doctype": "Sales Invoice",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"customer": "_Test Customer",
+				"name": None,
+			}
+		)
 
-		#test price for batch1
-		args.update({'batch_no': batch1})
+		# test price for batch1
+		args.update({"batch_no": batch1})
 		details = get_item_details(args)
-		self.assertEqual(details.get('price_list_rate'), 200)
+		self.assertEqual(details.get("price_list_rate"), 200)
 
-		#test price for batch2
-		args.update({'batch_no': batch2})
+		# test price for batch2
+		args.update({"batch_no": batch2})
 		details = get_item_details(args)
-		self.assertEqual(details.get('price_list_rate'), 300)
+		self.assertEqual(details.get("price_list_rate"), 300)
 
-		#test price for batch3
-		args.update({'batch_no': batch3})
+		# test price for batch3
+		args.update({"batch_no": batch3})
 		details = get_item_details(args)
-		self.assertEqual(details.get('price_list_rate'), 400)
+		self.assertEqual(details.get("price_list_rate"), 400)
 
-
-	def test_basic_batch_wise_valuation(self, batch_qty = 100):
+	def test_basic_batch_wise_valuation(self, batch_qty=100):
 		item_code = "_TestBatchWiseVal"
 		warehouse = "_Test Warehouse - _TC"
 		self.make_batch_item(item_code)
@@ -358,7 +357,9 @@
 		self.make_batch_item(item_code)
 
 		def assertValuation(expected):
-			actual = get_valuation_rate(item_code, warehouse, "voucher_type", "voucher_no", batch_no=batch_no)
+			actual = get_valuation_rate(
+				item_code, warehouse, "voucher_type", "voucher_no", batch_no=batch_no
+			)
 			self.assertAlmostEqual(actual, expected)
 
 		se = make_stock_entry(item_code=item_code, qty=100, rate=10, target=warehouse)
@@ -381,13 +382,14 @@
 		assertValuation(15)
 
 		# reset rate with stock reconiliation
-		create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=10, rate=25, batch_no=batch_no)
+		create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=10, rate=25, batch_no=batch_no
+		)
 		assertValuation(25)
 
 		make_stock_entry(item_code=item_code, qty=20, rate=20, target=warehouse, batch_no=batch_no)
 		assertValuation((20 * 20 + 10 * 25) / (10 + 20))
 
-
 	def test_update_batch_properties(self):
 		item_code = "_TestBatchWiseVal"
 		self.make_batch_item(item_code)
@@ -406,13 +408,17 @@
 		self.assertEqual(getdate(batch.expiry_date), getdate(expiry_date))
 
 
-
 def create_batch(item_code, rate, create_item_price_for_batch):
-	pi = make_purchase_invoice(company="_Test Company",
-		warehouse= "Stores - _TC", cost_center = "Main - _TC", update_stock=1,
-		expense_account ="_Test Account Cost for Goods Sold - _TC", item_code=item_code)
+	pi = make_purchase_invoice(
+		company="_Test Company",
+		warehouse="Stores - _TC",
+		cost_center="Main - _TC",
+		update_stock=1,
+		expense_account="_Test Account Cost for Goods Sold - _TC",
+		item_code=item_code,
+	)
 
-	batch = frappe.db.get_value('Batch', {'item': item_code, 'reference_name': pi.name})
+	batch = frappe.db.get_value("Batch", {"item": item_code, "reference_name": pi.name})
 
 	if not create_item_price_for_batch:
 		create_price_list_for_batch(item_code, None, rate)
@@ -421,14 +427,18 @@
 
 	return batch
 
+
 def create_price_list_for_batch(item_code, batch, rate):
-	frappe.get_doc({
-		'doctype': 'Item Price',
-		'item_code': '_Test Batch Price Item',
-		'price_list': '_Test Price List',
-		'batch_no': batch,
-		'price_list_rate': rate
-	}).insert()
+	frappe.get_doc(
+		{
+			"doctype": "Item Price",
+			"item_code": "_Test Batch Price Item",
+			"price_list": "_Test Price List",
+			"batch_no": batch,
+			"price_list_rate": rate,
+		}
+	).insert()
+
 
 def make_new_batch(**args):
 	args = frappe._dict(args)
@@ -436,10 +446,12 @@
 	if frappe.db.exists("Batch", args.batch_id):
 		batch = frappe.get_doc("Batch", args.batch_id)
 	else:
-		batch = frappe.get_doc({
-			"doctype": "Batch",
-			"batch_id": args.batch_id,
-			"item": args.item_code,
-		}).insert()
+		batch = frappe.get_doc(
+			{
+				"doctype": "Batch",
+				"batch_id": args.batch_id,
+				"item": args.item_code,
+			}
+		).insert()
 
 	return batch
diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py
index 3bc15a8..6cb9f7e 100644
--- a/erpnext/stock/doctype/bin/bin.py
+++ b/erpnext/stock/doctype/bin/bin.py
@@ -12,93 +12,109 @@
 class Bin(Document):
 	def before_save(self):
 		if self.get("__islocal") or not self.stock_uom:
-			self.stock_uom = frappe.get_cached_value('Item', self.item_code, 'stock_uom')
+			self.stock_uom = frappe.get_cached_value("Item", self.item_code, "stock_uom")
 		self.set_projected_qty()
 
 	def set_projected_qty(self):
-		self.projected_qty = (flt(self.actual_qty) + flt(self.ordered_qty)
-			+ flt(self.indented_qty) + flt(self.planned_qty) - flt(self.reserved_qty)
-			- flt(self.reserved_qty_for_production) - flt(self.reserved_qty_for_sub_contract))
+		self.projected_qty = (
+			flt(self.actual_qty)
+			+ flt(self.ordered_qty)
+			+ flt(self.indented_qty)
+			+ flt(self.planned_qty)
+			- flt(self.reserved_qty)
+			- flt(self.reserved_qty_for_production)
+			- flt(self.reserved_qty_for_sub_contract)
+		)
 
 	def update_reserved_qty_for_production(self):
-		'''Update qty reserved for production from Production Item tables
-			in open work orders'''
+		"""Update qty reserved for production from Production Item tables
+		in open work orders"""
 		from erpnext.manufacturing.doctype.work_order.work_order import get_reserved_qty_for_production
 
-		self.reserved_qty_for_production = get_reserved_qty_for_production(self.item_code, self.warehouse)
+		self.reserved_qty_for_production = get_reserved_qty_for_production(
+			self.item_code, self.warehouse
+		)
 
 		self.set_projected_qty()
 
-		self.db_set('reserved_qty_for_production', flt(self.reserved_qty_for_production))
-		self.db_set('projected_qty', self.projected_qty)
+		self.db_set("reserved_qty_for_production", flt(self.reserved_qty_for_production))
+		self.db_set("projected_qty", self.projected_qty)
 
 	def update_reserved_qty_for_sub_contracting(self):
-		#reserved qty
+		# reserved qty
 
 		po = frappe.qb.DocType("Purchase Order")
 		supplied_item = frappe.qb.DocType("Purchase Order Item Supplied")
 
 		reserved_qty_for_sub_contract = (
-				frappe.qb
-					.from_(po)
-					.from_(supplied_item)
-					.select(Sum(Coalesce(supplied_item.required_qty, 0)))
-					.where(
-						(supplied_item.rm_item_code == self.item_code)
-						& (po.name == supplied_item.parent)
-						& (po.docstatus == 1)
-						& (po.is_subcontracted == "Yes")
-						& (po.status != "Closed")
-						& (po.per_received < 100)
-						& (supplied_item.reserve_warehouse == self.warehouse)
-					)
-				).run()[0][0] or 0.0
+			frappe.qb.from_(po)
+			.from_(supplied_item)
+			.select(Sum(Coalesce(supplied_item.required_qty, 0)))
+			.where(
+				(supplied_item.rm_item_code == self.item_code)
+				& (po.name == supplied_item.parent)
+				& (po.docstatus == 1)
+				& (po.is_subcontracted == "Yes")
+				& (po.status != "Closed")
+				& (po.per_received < 100)
+				& (supplied_item.reserve_warehouse == self.warehouse)
+			)
+		).run()[0][0] or 0.0
 
 		se = frappe.qb.DocType("Stock Entry")
 		se_item = frappe.qb.DocType("Stock Entry Detail")
 
 		materials_transferred = (
-				frappe.qb
-					.from_(se)
-					.from_(se_item)
-					.from_(po)
-					.select(Sum(
-						Case()
-							.when(se.is_return == 1, se_item.transfer_qty * -1)
-							.else_(se_item.transfer_qty)
-						))
-					.where(
-						(se.docstatus == 1)
-						& (se.purpose == "Send to Subcontractor")
-						& (Coalesce(se.purchase_order, "") != "")
-						& ((se_item.item_code == self.item_code)
-							| (se_item.original_item == self.item_code))
-						& (se.name == se_item.parent)
-						& (po.name == se.purchase_order)
-						& (po.docstatus == 1)
-						& (po.is_subcontracted == "Yes")
-						& (po.status != "Closed")
-						& (po.per_received < 100)
-					)
-				).run()[0][0] or 0.0
+			frappe.qb.from_(se)
+			.from_(se_item)
+			.from_(po)
+			.select(
+				Sum(Case().when(se.is_return == 1, se_item.transfer_qty * -1).else_(se_item.transfer_qty))
+			)
+			.where(
+				(se.docstatus == 1)
+				& (se.purpose == "Send to Subcontractor")
+				& (Coalesce(se.purchase_order, "") != "")
+				& ((se_item.item_code == self.item_code) | (se_item.original_item == self.item_code))
+				& (se.name == se_item.parent)
+				& (po.name == se.purchase_order)
+				& (po.docstatus == 1)
+				& (po.is_subcontracted == "Yes")
+				& (po.status != "Closed")
+				& (po.per_received < 100)
+			)
+		).run()[0][0] or 0.0
 
 		if reserved_qty_for_sub_contract > materials_transferred:
 			reserved_qty_for_sub_contract = reserved_qty_for_sub_contract - materials_transferred
 		else:
 			reserved_qty_for_sub_contract = 0
 
-		self.db_set('reserved_qty_for_sub_contract', reserved_qty_for_sub_contract)
+		self.db_set("reserved_qty_for_sub_contract", reserved_qty_for_sub_contract)
 		self.set_projected_qty()
-		self.db_set('projected_qty', self.projected_qty)
+		self.db_set("projected_qty", self.projected_qty)
+
 
 def on_doctype_update():
 	frappe.db.add_unique("Bin", ["item_code", "warehouse"], constraint_name="unique_item_warehouse")
 
 
 def get_bin_details(bin_name):
-	return frappe.db.get_value('Bin', bin_name, ['actual_qty', 'ordered_qty',
-	'reserved_qty', 'indented_qty', 'planned_qty', 'reserved_qty_for_production',
-	'reserved_qty_for_sub_contract'], as_dict=1)
+	return frappe.db.get_value(
+		"Bin",
+		bin_name,
+		[
+			"actual_qty",
+			"ordered_qty",
+			"reserved_qty",
+			"indented_qty",
+			"planned_qty",
+			"reserved_qty_for_production",
+			"reserved_qty_for_sub_contract",
+		],
+		as_dict=1,
+	)
+
 
 def update_qty(bin_name, args):
 	from erpnext.controllers.stock_controller import future_sle_exists
@@ -109,32 +125,45 @@
 
 	# actual qty is not up to date in case of backdated transaction
 	if future_sle_exists(args):
-		actual_qty = frappe.db.get_value("Stock Ledger Entry",
+		actual_qty = (
+			frappe.db.get_value(
+				"Stock Ledger Entry",
 				filters={
 					"item_code": args.get("item_code"),
 					"warehouse": args.get("warehouse"),
-					"is_cancelled": 0
+					"is_cancelled": 0,
 				},
 				fieldname="qty_after_transaction",
 				order_by="posting_date desc, posting_time desc, creation desc",
-			) or 0.0
+			)
+			or 0.0
+		)
 
 	ordered_qty = flt(bin_details.ordered_qty) + flt(args.get("ordered_qty"))
 	reserved_qty = flt(bin_details.reserved_qty) + flt(args.get("reserved_qty"))
 	indented_qty = flt(bin_details.indented_qty) + flt(args.get("indented_qty"))
 	planned_qty = flt(bin_details.planned_qty) + flt(args.get("planned_qty"))
 
-
 	# compute projected qty
-	projected_qty = (flt(actual_qty) + flt(ordered_qty)
-		+ flt(indented_qty) + flt(planned_qty) - flt(reserved_qty)
-		- flt(bin_details.reserved_qty_for_production) - flt(bin_details.reserved_qty_for_sub_contract))
+	projected_qty = (
+		flt(actual_qty)
+		+ flt(ordered_qty)
+		+ flt(indented_qty)
+		+ flt(planned_qty)
+		- flt(reserved_qty)
+		- flt(bin_details.reserved_qty_for_production)
+		- flt(bin_details.reserved_qty_for_sub_contract)
+	)
 
-	frappe.db.set_value('Bin', bin_name, {
-		'actual_qty': actual_qty,
-		'ordered_qty': ordered_qty,
-		'reserved_qty': reserved_qty,
-		'indented_qty': indented_qty,
-		'planned_qty': planned_qty,
-		'projected_qty': projected_qty
-	})
+	frappe.db.set_value(
+		"Bin",
+		bin_name,
+		{
+			"actual_qty": actual_qty,
+			"ordered_qty": ordered_qty,
+			"reserved_qty": reserved_qty,
+			"indented_qty": indented_qty,
+			"planned_qty": planned_qty,
+			"projected_qty": projected_qty,
+		},
+	)
diff --git a/erpnext/stock/doctype/bin/test_bin.py b/erpnext/stock/doctype/bin/test_bin.py
index ec0d8a8..b79dee8 100644
--- a/erpnext/stock/doctype/bin/test_bin.py
+++ b/erpnext/stock/doctype/bin/test_bin.py
@@ -9,10 +9,8 @@
 
 
 class TestBin(FrappeTestCase):
-
-
 	def test_concurrent_inserts(self):
-		""" Ensure no duplicates are possible in case of concurrent inserts"""
+		"""Ensure no duplicates are possible in case of concurrent inserts"""
 		item_code = "_TestConcurrentBin"
 		make_item(item_code)
 		warehouse = "_Test Warehouse - _TC"
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 492f90b..69e052b 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -15,72 +15,76 @@
 from erpnext.stock.doctype.batch.batch import set_batch_nos
 from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class DeliveryNote(SellingController):
 	def __init__(self, *args, **kwargs):
 		super(DeliveryNote, self).__init__(*args, **kwargs)
-		self.status_updater = [{
-			'source_dt': 'Delivery Note Item',
-			'target_dt': 'Sales Order Item',
-			'join_field': 'so_detail',
-			'target_field': 'delivered_qty',
-			'target_parent_dt': 'Sales Order',
-			'target_parent_field': 'per_delivered',
-			'target_ref_field': 'qty',
-			'source_field': 'qty',
-			'percent_join_field': 'against_sales_order',
-			'status_field': 'delivery_status',
-			'keyword': 'Delivered',
-			'second_source_dt': 'Sales Invoice Item',
-			'second_source_field': 'qty',
-			'second_join_field': 'so_detail',
-			'overflow_type': 'delivery',
-			'second_source_extra_cond': """ and exists(select name from `tabSales Invoice`
-				where name=`tabSales Invoice Item`.parent and update_stock = 1)"""
-		},
-		{
-			'source_dt': 'Delivery Note Item',
-			'target_dt': 'Sales Invoice Item',
-			'join_field': 'si_detail',
-			'target_field': 'delivered_qty',
-			'target_parent_dt': 'Sales Invoice',
-			'target_ref_field': 'qty',
-			'source_field': 'qty',
-			'percent_join_field': 'against_sales_invoice',
-			'overflow_type': 'delivery',
-			'no_allowance': 1
-		}]
-		if cint(self.is_return):
-			self.status_updater.extend([{
-				'source_dt': 'Delivery Note Item',
-				'target_dt': 'Sales Order Item',
-				'join_field': 'so_detail',
-				'target_field': 'returned_qty',
-				'target_parent_dt': 'Sales Order',
-				'source_field': '-1 * qty',
-				'second_source_dt': 'Sales Invoice Item',
-				'second_source_field': '-1 * qty',
-				'second_join_field': 'so_detail',
-				'extra_cond': """ and exists (select name from `tabDelivery Note`
-					where name=`tabDelivery Note Item`.parent and is_return=1)""",
-				'second_source_extra_cond': """ and exists (select name from `tabSales Invoice`
-					where name=`tabSales Invoice Item`.parent and is_return=1 and update_stock=1)"""
+		self.status_updater = [
+			{
+				"source_dt": "Delivery Note Item",
+				"target_dt": "Sales Order Item",
+				"join_field": "so_detail",
+				"target_field": "delivered_qty",
+				"target_parent_dt": "Sales Order",
+				"target_parent_field": "per_delivered",
+				"target_ref_field": "qty",
+				"source_field": "qty",
+				"percent_join_field": "against_sales_order",
+				"status_field": "delivery_status",
+				"keyword": "Delivered",
+				"second_source_dt": "Sales Invoice Item",
+				"second_source_field": "qty",
+				"second_join_field": "so_detail",
+				"overflow_type": "delivery",
+				"second_source_extra_cond": """ and exists(select name from `tabSales Invoice`
+				where name=`tabSales Invoice Item`.parent and update_stock = 1)""",
 			},
 			{
-				'source_dt': 'Delivery Note Item',
-				'target_dt': 'Delivery Note Item',
-				'join_field': 'dn_detail',
-				'target_field': 'returned_qty',
-				'target_parent_dt': 'Delivery Note',
-				'target_parent_field': 'per_returned',
-				'target_ref_field': 'stock_qty',
-				'source_field': '-1 * stock_qty',
-				'percent_join_field_parent': 'return_against'
-			}
-		])
+				"source_dt": "Delivery Note Item",
+				"target_dt": "Sales Invoice Item",
+				"join_field": "si_detail",
+				"target_field": "delivered_qty",
+				"target_parent_dt": "Sales Invoice",
+				"target_ref_field": "qty",
+				"source_field": "qty",
+				"percent_join_field": "against_sales_invoice",
+				"overflow_type": "delivery",
+				"no_allowance": 1,
+			},
+		]
+		if cint(self.is_return):
+			self.status_updater.extend(
+				[
+					{
+						"source_dt": "Delivery Note Item",
+						"target_dt": "Sales Order Item",
+						"join_field": "so_detail",
+						"target_field": "returned_qty",
+						"target_parent_dt": "Sales Order",
+						"source_field": "-1 * qty",
+						"second_source_dt": "Sales Invoice Item",
+						"second_source_field": "-1 * qty",
+						"second_join_field": "so_detail",
+						"extra_cond": """ and exists (select name from `tabDelivery Note`
+					where name=`tabDelivery Note Item`.parent and is_return=1)""",
+						"second_source_extra_cond": """ and exists (select name from `tabSales Invoice`
+					where name=`tabSales Invoice Item`.parent and is_return=1 and update_stock=1)""",
+					},
+					{
+						"source_dt": "Delivery Note Item",
+						"target_dt": "Delivery Note Item",
+						"join_field": "dn_detail",
+						"target_field": "returned_qty",
+						"target_parent_dt": "Delivery Note",
+						"target_parent_field": "per_returned",
+						"target_ref_field": "stock_qty",
+						"source_field": "-1 * stock_qty",
+						"percent_join_field_parent": "return_against",
+					},
+				]
+			)
 
 	def before_print(self, settings=None):
 		def toggle_print_hide(meta, fieldname):
@@ -93,7 +97,7 @@
 		item_meta = frappe.get_meta("Delivery Note Item")
 		print_hide_fields = {
 			"parent": ["grand_total", "rounded_total", "in_words", "currency", "total", "taxes"],
-			"items": ["rate", "amount", "discount_amount", "price_list_rate", "discount_percentage"]
+			"items": ["rate", "amount", "discount_amount", "price_list_rate", "discount_percentage"],
 		}
 
 		for key, fieldname in print_hide_fields.items():
@@ -103,16 +107,19 @@
 		super(DeliveryNote, self).before_print(settings)
 
 	def set_actual_qty(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.item_code and d.warehouse:
-				actual_qty = frappe.db.sql("""select actual_qty from `tabBin`
-					where item_code = %s and warehouse = %s""", (d.item_code, d.warehouse))
+				actual_qty = frappe.db.sql(
+					"""select actual_qty from `tabBin`
+					where item_code = %s and warehouse = %s""",
+					(d.item_code, d.warehouse),
+				)
 				d.actual_qty = actual_qty and flt(actual_qty[0][0]) or 0
 
 	def so_required(self):
 		"""check in manage account if sales order required or not"""
-		if frappe.db.get_value("Selling Settings", None, 'so_required') == 'Yes':
-			for d in self.get('items'):
+		if frappe.db.get_value("Selling Settings", None, "so_required") == "Yes":
+			for d in self.get("items"):
 				if not d.against_sales_order:
 					frappe.throw(_("Sales Order required for Item {0}").format(d.item_code))
 
@@ -129,71 +136,91 @@
 		self.validate_with_previous_doc()
 
 		from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
+
 		make_packing_list(self)
 
-		if self._action != 'submit' and not self.is_return:
-			set_batch_nos(self, 'warehouse', throw=True)
-			set_batch_nos(self, 'warehouse', throw=True, child_table="packed_items")
+		if self._action != "submit" and not self.is_return:
+			set_batch_nos(self, "warehouse", throw=True)
+			set_batch_nos(self, "warehouse", throw=True, child_table="packed_items")
 
 		self.update_current_stock()
 
-		if not self.installation_status: self.installation_status = 'Not Installed'
+		if not self.installation_status:
+			self.installation_status = "Not Installed"
 		self.reset_default_field_value("set_warehouse", "items", "warehouse")
 
 	def validate_with_previous_doc(self):
-		super(DeliveryNote, self).validate_with_previous_doc({
-			"Sales Order": {
-				"ref_dn_field": "against_sales_order",
-				"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]]
-			},
-			"Sales Order Item": {
-				"ref_dn_field": "so_detail",
-				"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
-				"is_child_table": True,
-				"allow_duplicate_prev_row_id": True
-			},
-			"Sales Invoice": {
-				"ref_dn_field": "against_sales_invoice",
-				"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]]
-			},
-			"Sales Invoice Item": {
-				"ref_dn_field": "si_detail",
-				"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
-				"is_child_table": True,
-				"allow_duplicate_prev_row_id": True
-			},
-		})
+		super(DeliveryNote, self).validate_with_previous_doc(
+			{
+				"Sales Order": {
+					"ref_dn_field": "against_sales_order",
+					"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]],
+				},
+				"Sales Order Item": {
+					"ref_dn_field": "so_detail",
+					"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
+					"is_child_table": True,
+					"allow_duplicate_prev_row_id": True,
+				},
+				"Sales Invoice": {
+					"ref_dn_field": "against_sales_invoice",
+					"compare_fields": [["customer", "="], ["company", "="], ["project", "="], ["currency", "="]],
+				},
+				"Sales Invoice Item": {
+					"ref_dn_field": "si_detail",
+					"compare_fields": [["item_code", "="], ["uom", "="], ["conversion_factor", "="]],
+					"is_child_table": True,
+					"allow_duplicate_prev_row_id": True,
+				},
+			}
+		)
 
-		if cint(frappe.db.get_single_value('Selling Settings', 'maintain_same_sales_rate')) \
-				and not self.is_return:
-			self.validate_rate_with_reference_doc([["Sales Order", "against_sales_order", "so_detail"],
-				["Sales Invoice", "against_sales_invoice", "si_detail"]])
+		if (
+			cint(frappe.db.get_single_value("Selling Settings", "maintain_same_sales_rate"))
+			and not self.is_return
+		):
+			self.validate_rate_with_reference_doc(
+				[
+					["Sales Order", "against_sales_order", "so_detail"],
+					["Sales Invoice", "against_sales_invoice", "si_detail"],
+				]
+			)
 
 	def validate_proj_cust(self):
 		"""check for does customer belong to same project as entered.."""
 		if self.project and self.customer:
-			res = frappe.db.sql("""select name from `tabProject`
+			res = frappe.db.sql(
+				"""select name from `tabProject`
 				where name = %s and (customer = %s or
-					ifnull(customer,'')='')""", (self.project, self.customer))
+					ifnull(customer,'')='')""",
+				(self.project, self.customer),
+			)
 			if not res:
-				frappe.throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project))
+				frappe.throw(
+					_("Customer {0} does not belong to project {1}").format(self.customer, self.project)
+				)
 
 	def validate_warehouse(self):
 		super(DeliveryNote, self).validate_warehouse()
 
 		for d in self.get_item_list():
-			if not d['warehouse'] and frappe.db.get_value("Item", d['item_code'], "is_stock_item") == 1:
+			if not d["warehouse"] and frappe.db.get_value("Item", d["item_code"], "is_stock_item") == 1:
 				frappe.throw(_("Warehouse required for stock Item {0}").format(d["item_code"]))
 
 	def update_current_stock(self):
 		if self.get("_action") and self._action != "update_after_submit":
-			for d in self.get('items'):
-				d.actual_qty = frappe.db.get_value("Bin", {"item_code": d.item_code,
-					"warehouse": d.warehouse}, "actual_qty")
+			for d in self.get("items"):
+				d.actual_qty = frappe.db.get_value(
+					"Bin", {"item_code": d.item_code, "warehouse": d.warehouse}, "actual_qty"
+				)
 
-			for d in self.get('packed_items'):
-				bin_qty = frappe.db.get_value("Bin", {"item_code": d.item_code,
-					"warehouse": d.warehouse}, ["actual_qty", "projected_qty"], as_dict=True)
+			for d in self.get("packed_items"):
+				bin_qty = frappe.db.get_value(
+					"Bin",
+					{"item_code": d.item_code, "warehouse": d.warehouse},
+					["actual_qty", "projected_qty"],
+					as_dict=True,
+				)
 				if bin_qty:
 					d.actual_qty = flt(bin_qty.actual_qty)
 					d.projected_qty = flt(bin_qty.projected_qty)
@@ -202,7 +229,9 @@
 		self.validate_packed_qty()
 
 		# Check for Approving Authority
-		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype, self.company, self.base_grand_total, self)
+		frappe.get_doc("Authorization Control").validate_approving_authority(
+			self.doctype, self.company, self.base_grand_total, self
+		)
 
 		# update delivered qty in sales order
 		self.update_prevdoc_status()
@@ -235,16 +264,20 @@
 
 		self.make_gl_entries_on_cancel()
 		self.repost_future_sle_and_gle()
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry', 'Repost Item Valuation')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
 
 	def check_credit_limit(self):
 		from erpnext.selling.doctype.customer.customer import check_credit_limit
 
 		extra_amount = 0
 		validate_against_credit_limit = False
-		bypass_credit_limit_check_at_sales_order = cint(frappe.db.get_value("Customer Credit Limit",
-			filters={'parent': self.customer, 'parenttype': 'Customer', 'company': self.company},
-			fieldname="bypass_credit_limit_check"))
+		bypass_credit_limit_check_at_sales_order = cint(
+			frappe.db.get_value(
+				"Customer Credit Limit",
+				filters={"parent": self.customer, "parenttype": "Customer", "company": self.company},
+				fieldname="bypass_credit_limit_check",
+			)
+		)
 
 		if bypass_credit_limit_check_at_sales_order:
 			validate_against_credit_limit = True
@@ -256,48 +289,58 @@
 					break
 
 		if validate_against_credit_limit:
-			check_credit_limit(self.customer, self.company,
-				bypass_credit_limit_check_at_sales_order, extra_amount)
+			check_credit_limit(
+				self.customer, self.company, bypass_credit_limit_check_at_sales_order, extra_amount
+			)
 
 	def validate_packed_qty(self):
 		"""
-			Validate that if packed qty exists, it should be equal to qty
+		Validate that if packed qty exists, it should be equal to qty
 		"""
-		if not any(flt(d.get('packed_qty')) for d in self.get("items")):
+		if not any(flt(d.get("packed_qty")) for d in self.get("items")):
 			return
 		has_error = False
 		for d in self.get("items"):
-			if flt(d.get('qty')) != flt(d.get('packed_qty')):
-				frappe.msgprint(_("Packed quantity must equal quantity for Item {0} in row {1}").format(d.item_code, d.idx))
+			if flt(d.get("qty")) != flt(d.get("packed_qty")):
+				frappe.msgprint(
+					_("Packed quantity must equal quantity for Item {0} in row {1}").format(d.item_code, d.idx)
+				)
 				has_error = True
 		if has_error:
 			raise frappe.ValidationError
 
 	def check_next_docstatus(self):
-		submit_rv = frappe.db.sql("""select t1.name
+		submit_rv = frappe.db.sql(
+			"""select t1.name
 			from `tabSales Invoice` t1,`tabSales Invoice Item` t2
 			where t1.name = t2.parent and t2.delivery_note = %s and t1.docstatus = 1""",
-			(self.name))
+			(self.name),
+		)
 		if submit_rv:
 			frappe.throw(_("Sales Invoice {0} has already been submitted").format(submit_rv[0][0]))
 
-		submit_in = frappe.db.sql("""select t1.name
+		submit_in = frappe.db.sql(
+			"""select t1.name
 			from `tabInstallation Note` t1, `tabInstallation Note Item` t2
 			where t1.name = t2.parent and t2.prevdoc_docname = %s and t1.docstatus = 1""",
-			(self.name))
+			(self.name),
+		)
 		if submit_in:
 			frappe.throw(_("Installation Note {0} has already been submitted").format(submit_in[0][0]))
 
 	def cancel_packing_slips(self):
 		"""
-			Cancel submitted packing slips related to this delivery note
+		Cancel submitted packing slips related to this delivery note
 		"""
-		res = frappe.db.sql("""SELECT name FROM `tabPacking Slip` WHERE delivery_note = %s
-			AND docstatus = 1""", self.name)
+		res = frappe.db.sql(
+			"""SELECT name FROM `tabPacking Slip` WHERE delivery_note = %s
+			AND docstatus = 1""",
+			self.name,
+		)
 
 		if res:
 			for r in res:
-				ps = frappe.get_doc('Packing Slip', r[0])
+				ps = frappe.get_doc("Packing Slip", r[0])
 				ps.cancel()
 			frappe.msgprint(_("Packing Slip(s) cancelled"))
 
@@ -310,7 +353,7 @@
 		updated_delivery_notes = [self.name]
 		for d in self.get("items"):
 			if d.si_detail and not d.so_detail:
-				d.db_set('billed_amt', d.amount, update_modified=update_modified)
+				d.db_set("billed_amt", d.amount, update_modified=update_modified)
 			elif d.so_detail:
 				updated_delivery_notes += update_billed_amount_based_on_so(d.so_detail, update_modified)
 
@@ -327,11 +370,16 @@
 			return_invoice.save()
 			return_invoice.submit()
 
-			credit_note_link = frappe.utils.get_link_to_form('Sales Invoice', return_invoice.name)
+			credit_note_link = frappe.utils.get_link_to_form("Sales Invoice", return_invoice.name)
 
 			frappe.msgprint(_("Credit Note {0} has been created automatically").format(credit_note_link))
 		except Exception:
-			frappe.throw(_("Could not create Credit Note automatically, please uncheck 'Issue Credit Note' and submit again"))
+			frappe.throw(
+				_(
+					"Could not create Credit Note automatically, please uncheck 'Issue Credit Note' and submit again"
+				)
+			)
+
 
 def update_billed_amount_based_on_so(so_detail, update_modified=True):
 	from frappe.query_builder.functions import Sum
@@ -340,25 +388,35 @@
 	si_item = frappe.qb.DocType("Sales Invoice Item").as_("si_item")
 	sum_amount = Sum(si_item.amount).as_("amount")
 
-	billed_against_so = frappe.qb.from_(si_item).select(sum_amount).where(
-		(si_item.so_detail == so_detail) &
-		((si_item.dn_detail.isnull()) | (si_item.dn_detail == '')) &
-		(si_item.docstatus == 1)
-	).run()
+	billed_against_so = (
+		frappe.qb.from_(si_item)
+		.select(sum_amount)
+		.where(
+			(si_item.so_detail == so_detail)
+			& ((si_item.dn_detail.isnull()) | (si_item.dn_detail == ""))
+			& (si_item.docstatus == 1)
+		)
+		.run()
+	)
 	billed_against_so = billed_against_so and billed_against_so[0][0] or 0
 
 	# Get all Delivery Note Item rows against the Sales Order Item row
 	dn = frappe.qb.DocType("Delivery Note").as_("dn")
 	dn_item = frappe.qb.DocType("Delivery Note Item").as_("dn_item")
 
-	dn_details = frappe.qb.from_(dn).from_(dn_item).select(dn_item.name, dn_item.amount, dn_item.si_detail, dn_item.parent).where(
-		(dn.name == dn_item.parent) &
-		(dn_item.so_detail == so_detail) &
-		(dn.docstatus == 1) &
-		(dn.is_return == 0)
-	).orderby(
-		dn.posting_date, dn.posting_time, dn.name
-	).run(as_dict=True)
+	dn_details = (
+		frappe.qb.from_(dn)
+		.from_(dn_item)
+		.select(dn_item.name, dn_item.amount, dn_item.si_detail, dn_item.parent)
+		.where(
+			(dn.name == dn_item.parent)
+			& (dn_item.so_detail == so_detail)
+			& (dn.docstatus == 1)
+			& (dn.is_return == 0)
+		)
+		.orderby(dn.posting_date, dn.posting_time, dn.name)
+		.run(as_dict=True)
+	)
 
 	updated_dn = []
 	for dnd in dn_details:
@@ -370,8 +428,11 @@
 			billed_against_so -= billed_amt_agianst_dn
 		else:
 			# Get billed amount directly against Delivery Note
-			billed_amt_agianst_dn = frappe.db.sql("""select sum(amount) from `tabSales Invoice Item`
-				where dn_detail=%s and docstatus=1""", dnd.name)
+			billed_amt_agianst_dn = frappe.db.sql(
+				"""select sum(amount) from `tabSales Invoice Item`
+				where dn_detail=%s and docstatus=1""",
+				dnd.name,
+			)
 			billed_amt_agianst_dn = billed_amt_agianst_dn and billed_amt_agianst_dn[0][0] or 0
 
 		# Distribute billed amount directly against SO between DNs based on FIFO
@@ -384,50 +445,71 @@
 				billed_amt_agianst_dn += billed_against_so
 				billed_against_so = 0
 
-		frappe.db.set_value("Delivery Note Item", dnd.name, "billed_amt", billed_amt_agianst_dn, update_modified=update_modified)
+		frappe.db.set_value(
+			"Delivery Note Item",
+			dnd.name,
+			"billed_amt",
+			billed_amt_agianst_dn,
+			update_modified=update_modified,
+		)
 
 		updated_dn.append(dnd.parent)
 
 	return updated_dn
 
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Shipments'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Shipments"),
+		}
+	)
 	return list_context
 
+
 def get_invoiced_qty_map(delivery_note):
 	"""returns a map: {dn_detail: invoiced_qty}"""
 	invoiced_qty_map = {}
 
-	for dn_detail, qty in frappe.db.sql("""select dn_detail, qty from `tabSales Invoice Item`
-		where delivery_note=%s and docstatus=1""", delivery_note):
-			if not invoiced_qty_map.get(dn_detail):
-				invoiced_qty_map[dn_detail] = 0
-			invoiced_qty_map[dn_detail] += qty
+	for dn_detail, qty in frappe.db.sql(
+		"""select dn_detail, qty from `tabSales Invoice Item`
+		where delivery_note=%s and docstatus=1""",
+		delivery_note,
+	):
+		if not invoiced_qty_map.get(dn_detail):
+			invoiced_qty_map[dn_detail] = 0
+		invoiced_qty_map[dn_detail] += qty
 
 	return invoiced_qty_map
 
+
 def get_returned_qty_map(delivery_note):
 	"""returns a map: {so_detail: returned_qty}"""
-	returned_qty_map = frappe._dict(frappe.db.sql("""select dn_item.dn_detail, abs(dn_item.qty) as qty
+	returned_qty_map = frappe._dict(
+		frappe.db.sql(
+			"""select dn_item.dn_detail, abs(dn_item.qty) as qty
 		from `tabDelivery Note Item` dn_item, `tabDelivery Note` dn
 		where dn.name = dn_item.parent
 			and dn.docstatus = 1
 			and dn.is_return = 1
 			and dn.return_against = %s
-	""", delivery_note))
+	""",
+			delivery_note,
+		)
+	)
 
 	return returned_qty_map
 
+
 @frappe.whitelist()
 def make_sales_invoice(source_name, target_doc=None):
-	doc = frappe.get_doc('Delivery Note', source_name)
+	doc = frappe.get_doc("Delivery Note", source_name)
 
 	to_make_invoice_qty_map = {}
 	returned_qty_map = get_returned_qty_map(source_name)
@@ -444,20 +526,21 @@
 
 		# set company address
 		if source.company_address:
-			target.update({'company_address': source.company_address})
+			target.update({"company_address": source.company_address})
 		else:
 			# set company address
 			target.update(get_company_address(target.company))
 
 		if target.company_address:
-			target.update(get_fetch_values("Sales Invoice", 'company_address', target.company_address))
+			target.update(get_fetch_values("Sales Invoice", "company_address", target.company_address))
 
 	def update_item(source_doc, target_doc, source_parent):
 		target_doc.qty = to_make_invoice_qty_map[source_doc.name]
 
 		if source_doc.serial_no and source_parent.per_billed > 0 and not source_parent.is_return:
-			target_doc.serial_no = get_delivery_note_serial_no(source_doc.item_code,
-				target_doc.qty, source_parent.name)
+			target_doc.serial_no = get_delivery_note_serial_no(
+				source_doc.item_code, target_doc.qty, source_parent.name
+			)
 
 	def get_pending_qty(item_row):
 		pending_qty = item_row.qty - invoiced_qty_map.get(item_row.name, 0)
@@ -479,50 +562,52 @@
 
 		return pending_qty
 
-	doc = get_mapped_doc("Delivery Note", source_name, {
-		"Delivery Note": {
-			"doctype": "Sales Invoice",
-			"field_map": {
-				"is_return": "is_return"
+	doc = get_mapped_doc(
+		"Delivery Note",
+		source_name,
+		{
+			"Delivery Note": {
+				"doctype": "Sales Invoice",
+				"field_map": {"is_return": "is_return"},
+				"validation": {"docstatus": ["=", 1]},
 			},
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Delivery Note Item": {
-			"doctype": "Sales Invoice Item",
-			"field_map": {
-				"name": "dn_detail",
-				"parent": "delivery_note",
-				"so_detail": "so_detail",
-				"against_sales_order": "sales_order",
-				"serial_no": "serial_no",
-				"cost_center": "cost_center"
+			"Delivery Note Item": {
+				"doctype": "Sales Invoice Item",
+				"field_map": {
+					"name": "dn_detail",
+					"parent": "delivery_note",
+					"so_detail": "so_detail",
+					"against_sales_order": "sales_order",
+					"serial_no": "serial_no",
+					"cost_center": "cost_center",
+				},
+				"postprocess": update_item,
+				"filter": lambda d: get_pending_qty(d) <= 0
+				if not doc.get("is_return")
+				else get_pending_qty(d) > 0,
 			},
-			"postprocess": update_item,
-			"filter": lambda d: get_pending_qty(d) <= 0 if not doc.get("is_return") else get_pending_qty(d) > 0
-		},
-		"Sales Taxes and Charges": {
-			"doctype": "Sales Taxes and Charges",
-			"add_if_empty": True
-		},
-		"Sales Team": {
-			"doctype": "Sales Team",
-			"field_map": {
-				"incentives": "incentives"
+			"Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "add_if_empty": True},
+			"Sales Team": {
+				"doctype": "Sales Team",
+				"field_map": {"incentives": "incentives"},
+				"add_if_empty": True,
 			},
-			"add_if_empty": True
-		}
-	}, target_doc, set_missing_values)
+		},
+		target_doc,
+		set_missing_values,
+	)
 
-	automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+	automatically_fetch_payment_terms = cint(
+		frappe.db.get_single_value("Accounts Settings", "automatically_fetch_payment_terms")
+	)
 	if automatically_fetch_payment_terms:
 		doc.set_payment_schedule()
 
-	doc.set_onload('ignore_price_list', True)
+	doc.set_onload("ignore_price_list", True)
 
 	return doc
 
+
 @frappe.whitelist()
 def make_delivery_trip(source_name, target_doc=None):
 	def update_stop_details(source_doc, target_doc, source_parent):
@@ -538,107 +623,110 @@
 
 	delivery_notes = []
 
-	doclist = get_mapped_doc("Delivery Note", source_name, {
-		"Delivery Note": {
-			"doctype": "Delivery Trip",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Delivery Note Item": {
-			"doctype": "Delivery Stop",
-			"field_map": {
-				"parent": "delivery_note"
+	doclist = get_mapped_doc(
+		"Delivery Note",
+		source_name,
+		{
+			"Delivery Note": {"doctype": "Delivery Trip", "validation": {"docstatus": ["=", 1]}},
+			"Delivery Note Item": {
+				"doctype": "Delivery Stop",
+				"field_map": {"parent": "delivery_note"},
+				"condition": lambda item: item.parent not in delivery_notes,
+				"postprocess": update_stop_details,
 			},
-			"condition": lambda item: item.parent not in delivery_notes,
-			"postprocess": update_stop_details
-		}
-	}, target_doc)
+		},
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_installation_note(source_name, target_doc=None):
 	def update_item(obj, target, source_parent):
 		target.qty = flt(obj.qty) - flt(obj.installed_qty)
 		target.serial_no = obj.serial_no
 
-	doclist = get_mapped_doc("Delivery Note", source_name, 	{
-		"Delivery Note": {
-			"doctype": "Installation Note",
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Delivery Note Item": {
-			"doctype": "Installation Note Item",
-			"field_map": {
-				"name": "prevdoc_detail_docname",
-				"parent": "prevdoc_docname",
-				"parenttype": "prevdoc_doctype",
+	doclist = get_mapped_doc(
+		"Delivery Note",
+		source_name,
+		{
+			"Delivery Note": {"doctype": "Installation Note", "validation": {"docstatus": ["=", 1]}},
+			"Delivery Note Item": {
+				"doctype": "Installation Note Item",
+				"field_map": {
+					"name": "prevdoc_detail_docname",
+					"parent": "prevdoc_docname",
+					"parenttype": "prevdoc_doctype",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: doc.installed_qty < doc.qty,
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: doc.installed_qty < doc.qty
-		}
-	}, target_doc)
+		},
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_packing_slip(source_name, target_doc=None):
-	doclist = get_mapped_doc("Delivery Note", source_name, 	{
-		"Delivery Note": {
-			"doctype": "Packing Slip",
-			"field_map": {
-				"name": "delivery_note",
-				"letter_head": "letter_head"
+	doclist = get_mapped_doc(
+		"Delivery Note",
+		source_name,
+		{
+			"Delivery Note": {
+				"doctype": "Packing Slip",
+				"field_map": {"name": "delivery_note", "letter_head": "letter_head"},
+				"validation": {"docstatus": ["=", 0]},
 			},
-			"validation": {
-				"docstatus": ["=", 0]
-			}
+			"Delivery Note Item": {
+				"doctype": "Packing Slip Item",
+				"field_map": {
+					"item_code": "item_code",
+					"item_name": "item_name",
+					"description": "description",
+					"qty": "qty",
+				},
+			},
 		},
-
-		"Delivery Note Item": {
-			"doctype": "Packing Slip Item",
-			"field_map": {
-				"item_code": "item_code",
-				"item_name": "item_name",
-				"description": "description",
-				"qty": "qty",
-			}
-		}
-
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_shipment(source_name, target_doc=None):
 	def postprocess(source, target):
-		user = frappe.db.get_value("User", frappe.session.user, ['email', 'full_name', 'phone', 'mobile_no'], as_dict=1)
+		user = frappe.db.get_value(
+			"User", frappe.session.user, ["email", "full_name", "phone", "mobile_no"], as_dict=1
+		)
 		target.pickup_contact_email = user.email
-		pickup_contact_display = '{}'.format(user.full_name)
+		pickup_contact_display = "{}".format(user.full_name)
 		if user:
 			if user.email:
-				pickup_contact_display += '<br>' + user.email
+				pickup_contact_display += "<br>" + user.email
 			if user.phone:
-				pickup_contact_display += '<br>' + user.phone
+				pickup_contact_display += "<br>" + user.phone
 			if user.mobile_no and not user.phone:
-				pickup_contact_display += '<br>' + user.mobile_no
+				pickup_contact_display += "<br>" + user.mobile_no
 		target.pickup_contact = pickup_contact_display
 
 		# As we are using session user details in the pickup_contact then pickup_contact_person will be session user
 		target.pickup_contact_person = frappe.session.user
 
-		contact = frappe.db.get_value("Contact", source.contact_person, ['email_id', 'phone', 'mobile_no'], as_dict=1)
-		delivery_contact_display = '{}'.format(source.contact_display)
+		contact = frappe.db.get_value(
+			"Contact", source.contact_person, ["email_id", "phone", "mobile_no"], as_dict=1
+		)
+		delivery_contact_display = "{}".format(source.contact_display)
 		if contact:
 			if contact.email_id:
-				delivery_contact_display += '<br>' + contact.email_id
+				delivery_contact_display += "<br>" + contact.email_id
 			if contact.phone:
-				delivery_contact_display += '<br>' + contact.phone
+				delivery_contact_display += "<br>" + contact.phone
 			if contact.mobile_no and not contact.phone:
-				delivery_contact_display += '<br>' + contact.mobile_no
+				delivery_contact_display += "<br>" + contact.mobile_no
 		target.delivery_contact = delivery_contact_display
 
 		if source.shipping_address_name:
@@ -648,38 +736,44 @@
 			target.delivery_address_name = source.customer_address
 			target.delivery_address = source.address_display
 
-	doclist = get_mapped_doc("Delivery Note", source_name, 	{
-		"Delivery Note": {
-			"doctype": "Shipment",
-			"field_map": {
-				"grand_total": "value_of_goods",
-				"company": "pickup_company",
-				"company_address": "pickup_address_name",
-				"company_address_display": "pickup_address",
-				"customer": "delivery_customer",
-				"contact_person": "delivery_contact_name",
-				"contact_email": "delivery_contact_email"
+	doclist = get_mapped_doc(
+		"Delivery Note",
+		source_name,
+		{
+			"Delivery Note": {
+				"doctype": "Shipment",
+				"field_map": {
+					"grand_total": "value_of_goods",
+					"company": "pickup_company",
+					"company_address": "pickup_address_name",
+					"company_address_display": "pickup_address",
+					"customer": "delivery_customer",
+					"contact_person": "delivery_contact_name",
+					"contact_email": "delivery_contact_email",
+				},
+				"validation": {"docstatus": ["=", 1]},
 			},
-			"validation": {
-				"docstatus": ["=", 1]
-			}
+			"Delivery Note Item": {
+				"doctype": "Shipment Delivery Note",
+				"field_map": {
+					"name": "prevdoc_detail_docname",
+					"parent": "prevdoc_docname",
+					"parenttype": "prevdoc_doctype",
+					"base_amount": "grand_total",
+				},
+			},
 		},
-		"Delivery Note Item": {
-			"doctype": "Shipment Delivery Note",
-			"field_map": {
-				"name": "prevdoc_detail_docname",
-				"parent": "prevdoc_docname",
-				"parenttype": "prevdoc_doctype",
-				"base_amount": "grand_total"
-			}
-		}
-	}, target_doc, postprocess)
+		target_doc,
+		postprocess,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_sales_return(source_name, target_doc=None):
 	from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 	return make_return_doc("Delivery Note", source_name, target_doc)
 
 
@@ -688,10 +782,12 @@
 	dn = frappe.get_doc("Delivery Note", docname)
 	dn.update_status(status)
 
+
 @frappe.whitelist()
 def make_inter_company_purchase_receipt(source_name, target_doc=None):
 	return make_inter_company_transaction("Delivery Note", source_name, target_doc)
 
+
 def make_inter_company_transaction(doctype, source_name, target_doc=None):
 	from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
 		get_inter_company_details,
@@ -701,16 +797,16 @@
 		validate_inter_company_transaction,
 	)
 
-	if doctype == 'Delivery Note':
+	if doctype == "Delivery Note":
 		source_doc = frappe.get_doc(doctype, source_name)
 		target_doctype = "Purchase Receipt"
-		source_document_warehouse_field = 'target_warehouse'
-		target_document_warehouse_field = 'from_warehouse'
+		source_document_warehouse_field = "target_warehouse"
+		target_document_warehouse_field = "from_warehouse"
 	else:
 		source_doc = frappe.get_doc(doctype, source_name)
-		target_doctype = 'Delivery Note'
-		source_document_warehouse_field = 'from_warehouse'
-		target_document_warehouse_field = 'target_warehouse'
+		target_doctype = "Delivery Note"
+		source_document_warehouse_field = "from_warehouse"
+		target_document_warehouse_field = "target_warehouse"
 
 	validate_inter_company_transaction(source_doc, doctype)
 	details = get_inter_company_details(source_doc, doctype)
@@ -719,18 +815,18 @@
 		target.run_method("set_missing_values")
 		set_purchase_references(target)
 
-		if target.doctype == 'Purchase Receipt':
-			master_doctype = 'Purchase Taxes and Charges Template'
+		if target.doctype == "Purchase Receipt":
+			master_doctype = "Purchase Taxes and Charges Template"
 		else:
-			master_doctype = 'Sales Taxes and Charges Template'
+			master_doctype = "Sales Taxes and Charges Template"
 
-		if not target.get('taxes') and target.get('taxes_and_charges'):
-			for tax in get_taxes_and_charges(master_doctype, target.get('taxes_and_charges')):
-				target.append('taxes', tax)
+		if not target.get("taxes") and target.get("taxes_and_charges"):
+			for tax in get_taxes_and_charges(master_doctype, target.get("taxes_and_charges")):
+				target.append("taxes", tax)
 
 	def update_details(source_doc, target_doc, source_parent):
 		target_doc.inter_company_invoice_reference = source_doc.name
-		if target_doc.doctype == 'Purchase Receipt':
+		if target_doc.doctype == "Purchase Receipt":
 			target_doc.company = details.get("company")
 			target_doc.supplier = details.get("party")
 			target_doc.buying_price_list = source_doc.selling_price_list
@@ -738,12 +834,20 @@
 			target_doc.inter_company_reference = source_doc.name
 
 			# Invert the address on target doc creation
-			update_address(target_doc, 'supplier_address', 'address_display', source_doc.company_address)
-			update_address(target_doc, 'shipping_address', 'shipping_address_display', source_doc.customer_address)
+			update_address(target_doc, "supplier_address", "address_display", source_doc.company_address)
+			update_address(
+				target_doc, "shipping_address", "shipping_address_display", source_doc.customer_address
+			)
 
-			update_taxes(target_doc, party=target_doc.supplier, party_type='Supplier', company=target_doc.company,
-				doctype=target_doc.doctype, party_address=target_doc.supplier_address,
-				company_address=target_doc.shipping_address)
+			update_taxes(
+				target_doc,
+				party=target_doc.supplier,
+				party_type="Supplier",
+				company=target_doc.company,
+				doctype=target_doc.doctype,
+				party_address=target_doc.supplier_address,
+				company_address=target_doc.shipping_address,
+			)
 		else:
 			target_doc.company = details.get("company")
 			target_doc.customer = details.get("party")
@@ -753,39 +857,52 @@
 			target_doc.inter_company_reference = source_doc.name
 
 			# Invert the address on target doc creation
-			update_address(target_doc, 'company_address', 'company_address_display', source_doc.supplier_address)
-			update_address(target_doc, 'shipping_address_name', 'shipping_address', source_doc.shipping_address)
-			update_address(target_doc, 'customer_address', 'address_display', source_doc.shipping_address)
+			update_address(
+				target_doc, "company_address", "company_address_display", source_doc.supplier_address
+			)
+			update_address(
+				target_doc, "shipping_address_name", "shipping_address", source_doc.shipping_address
+			)
+			update_address(target_doc, "customer_address", "address_display", source_doc.shipping_address)
 
-			update_taxes(target_doc, party=target_doc.customer, party_type='Customer', company=target_doc.company,
-				doctype=target_doc.doctype, party_address=target_doc.customer_address,
-				company_address=target_doc.company_address, shipping_address_name=target_doc.shipping_address_name)
+			update_taxes(
+				target_doc,
+				party=target_doc.customer,
+				party_type="Customer",
+				company=target_doc.company,
+				doctype=target_doc.doctype,
+				party_address=target_doc.customer_address,
+				company_address=target_doc.company_address,
+				shipping_address_name=target_doc.shipping_address_name,
+			)
 
-	doclist = get_mapped_doc(doctype, source_name, {
-		doctype: {
-			"doctype": target_doctype,
-			"postprocess": update_details,
-			"field_no_map": [
-				"taxes_and_charges",
-				"set_warehouse"
-			]
-		},
-		doctype +" Item": {
-			"doctype": target_doctype + " Item",
-			"field_map": {
-				source_document_warehouse_field: target_document_warehouse_field,
-				'name': 'delivery_note_item',
-				'batch_no': 'batch_no',
-				'serial_no': 'serial_no'
+	doclist = get_mapped_doc(
+		doctype,
+		source_name,
+		{
+			doctype: {
+				"doctype": target_doctype,
+				"postprocess": update_details,
+				"field_no_map": ["taxes_and_charges", "set_warehouse"],
 			},
-			"field_no_map": [
-				"warehouse"
-			]
-		}
-
-	}, target_doc, set_missing_values)
+			doctype
+			+ " Item": {
+				"doctype": target_doctype + " Item",
+				"field_map": {
+					source_document_warehouse_field: target_document_warehouse_field,
+					"name": "delivery_note_item",
+					"batch_no": "batch_no",
+					"serial_no": "serial_no",
+				},
+				"field_no_map": ["warehouse"],
+			},
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 def on_doctype_update():
 	frappe.db.add_index("Delivery Note", ["customer", "is_return", "return_against"])
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py
index ca61a36..fd44e9c 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py
@@ -3,31 +3,19 @@
 
 def get_data():
 	return {
-		'fieldname': 'delivery_note',
-		'non_standard_fieldnames': {
-			'Stock Entry': 'delivery_note_no',
-			'Quality Inspection': 'reference_name',
-			'Auto Repeat': 'reference_document',
+		"fieldname": "delivery_note",
+		"non_standard_fieldnames": {
+			"Stock Entry": "delivery_note_no",
+			"Quality Inspection": "reference_name",
+			"Auto Repeat": "reference_document",
 		},
-		'internal_links': {
-			'Sales Order': ['items', 'against_sales_order'],
+		"internal_links": {
+			"Sales Order": ["items", "against_sales_order"],
 		},
-		'transactions': [
-			{
-				'label': _('Related'),
-				'items': ['Sales Invoice', 'Packing Slip', 'Delivery Trip']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Sales Order', 'Shipment', 'Quality Inspection']
-			},
-			{
-				'label': _('Returns'),
-				'items': ['Stock Entry']
-			},
-			{
-				'label': _('Subscription'),
-				'items': ['Auto Repeat']
-			},
-		]
+		"transactions": [
+			{"label": _("Related"), "items": ["Sales Invoice", "Packing Slip", "Delivery Trip"]},
+			{"label": _("Reference"), "items": ["Sales Order", "Shipment", "Quality Inspection"]},
+			{"label": _("Returns"), "items": ["Stock Entry"]},
+			{"label": _("Subscription"), "items": ["Auto Repeat"]},
+		],
 	}
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index 82f4e7d..b5a4557 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import json
 
 import frappe
@@ -54,21 +53,28 @@
 		self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)
 
 	def test_delivery_note_no_gl_entry(self):
-		company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company')
+		company = frappe.db.get_value("Warehouse", "_Test Warehouse - _TC", "company")
 		make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100)
 
-		stock_queue = json.loads(get_previous_sle({
-			"item_code": "_Test Item",
-			"warehouse": "_Test Warehouse - _TC",
-			"posting_date": nowdate(),
-			"posting_time": nowtime()
-		}).stock_queue or "[]")
+		stock_queue = json.loads(
+			get_previous_sle(
+				{
+					"item_code": "_Test Item",
+					"warehouse": "_Test Warehouse - _TC",
+					"posting_date": nowdate(),
+					"posting_time": nowtime(),
+				}
+			).stock_queue
+			or "[]"
+		)
 
 		dn = create_delivery_note()
 
-		sle = frappe.get_doc("Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name})
+		sle = frappe.get_doc(
+			"Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name}
+		)
 
-		self.assertEqual(sle.stock_value_difference, flt(-1*stock_queue[0][1], 2))
+		self.assertEqual(sle.stock_value_difference, flt(-1 * stock_queue[0][1], 2))
 
 		self.assertFalse(get_gl_entries("Delivery Note", dn.name))
 
@@ -123,24 +129,43 @@
 	# 	set_perpetual_inventory(0, company)
 
 	def test_delivery_note_gl_entry_packing_item(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
 		make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=10, basic_rate=100)
-		make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="Stores - TCP1", qty=10, basic_rate=100)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="Stores - TCP1", qty=10, basic_rate=100
+		)
 
-		stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
+		stock_in_hand_account = get_inventory_account("_Test Company with perpetual inventory")
 		prev_bal = get_balance_on(stock_in_hand_account)
 
-		dn = create_delivery_note(item_code="_Test Product Bundle Item", company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1")
+		dn = create_delivery_note(
+			item_code="_Test Product Bundle Item",
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+		)
 
-		stock_value_diff_rm1 = abs(frappe.db.get_value("Stock Ledger Entry",
-			{"voucher_type": "Delivery Note", "voucher_no": dn.name, "item_code": "_Test Item"},
-			"stock_value_difference"))
+		stock_value_diff_rm1 = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name, "item_code": "_Test Item"},
+				"stock_value_difference",
+			)
+		)
 
-		stock_value_diff_rm2 = abs(frappe.db.get_value("Stock Ledger Entry",
-			{"voucher_type": "Delivery Note", "voucher_no": dn.name,
-				"item_code": "_Test Item Home Desktop 100"}, "stock_value_difference"))
+		stock_value_diff_rm2 = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{
+					"voucher_type": "Delivery Note",
+					"voucher_no": dn.name,
+					"item_code": "_Test Item Home Desktop 100",
+				},
+				"stock_value_difference",
+			)
+		)
 
 		stock_value_diff = stock_value_diff_rm1 + stock_value_diff_rm2
 
@@ -149,7 +174,7 @@
 
 		expected_values = {
 			stock_in_hand_account: [0.0, stock_value_diff],
-			"Cost of Goods Sold - TCP1": [stock_value_diff, 0.0]
+			"Cost of Goods Sold - TCP1": [stock_value_diff, 0.0],
 		}
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
@@ -166,10 +191,7 @@
 
 		dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no)
 
-		self.check_serial_no_values(serial_no, {
-			"warehouse": "",
-			"delivery_document_no": dn.name
-		})
+		self.check_serial_no_values(serial_no, {"warehouse": "", "delivery_document_no": dn.name})
 
 		si = make_sales_invoice(dn.name)
 		si.insert(ignore_permissions=True)
@@ -177,17 +199,18 @@
 
 		dn.cancel()
 
-		self.check_serial_no_values(serial_no, {
-			"warehouse": "_Test Warehouse - _TC",
-			"delivery_document_no": ""
-		})
+		self.check_serial_no_values(
+			serial_no, {"warehouse": "_Test Warehouse - _TC", "delivery_document_no": ""}
+		)
 
 	def test_serialized_partial_sales_invoice(self):
 		se = make_serialized_item()
 		serial_no = get_serial_nos(se.get("items")[0].serial_no)
-		serial_no = '\n'.join(serial_no)
+		serial_no = "\n".join(serial_no)
 
-		dn = create_delivery_note(item_code="_Test Serialized Item With Series", qty=2, serial_no=serial_no)
+		dn = create_delivery_note(
+			item_code="_Test Serialized Item With Series", qty=2, serial_no=serial_no
+		)
 
 		si = make_sales_invoice(dn.name)
 		si.items[0].qty = 1
@@ -200,15 +223,19 @@
 
 	def test_serialize_status(self):
 		from frappe.model.naming import make_autoname
-		serial_no = frappe.get_doc({
-			"doctype": "Serial No",
-			"item_code": "_Test Serialized Item With Series",
-			"serial_no": make_autoname("SR", "Serial No")
-		})
+
+		serial_no = frappe.get_doc(
+			{
+				"doctype": "Serial No",
+				"item_code": "_Test Serialized Item With Series",
+				"serial_no": make_autoname("SR", "Serial No"),
+			}
+		)
 		serial_no.save()
 
-		dn = create_delivery_note(item_code="_Test Serialized Item With Series",
-			serial_no=serial_no.name, do_not_submit=True)
+		dn = create_delivery_note(
+			item_code="_Test Serialized Item With Series", serial_no=serial_no.name, do_not_submit=True
+		)
 
 		self.assertRaises(SerialNoWarehouseError, dn.submit)
 
@@ -218,26 +245,46 @@
 			self.assertEqual(cstr(serial_no.get(field)), value)
 
 	def test_sales_return_for_non_bundled_items_partial(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
 		make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100)
 
 		actual_qty_0 = get_qty_after_transaction(warehouse="Stores - TCP1")
 
-		dn = create_delivery_note(qty=5, rate=500, warehouse="Stores - TCP1", company=company,
-			expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
+		dn = create_delivery_note(
+			qty=5,
+			rate=500,
+			warehouse="Stores - TCP1",
+			company=company,
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
 		actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1")
 		self.assertEqual(actual_qty_0 - 5, actual_qty_1)
 
 		# outgoing_rate
-		outgoing_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn.name}, "stock_value_difference") / 5
+		outgoing_rate = (
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name},
+				"stock_value_difference",
+			)
+			/ 5
+		)
 
 		# return entry
-		dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500,
-			company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1",
-			cost_center="Main - TCP1", do_not_submit=1)
+		dn1 = create_delivery_note(
+			is_return=1,
+			return_against=dn.name,
+			qty=-2,
+			rate=500,
+			company=company,
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			do_not_submit=1,
+		)
 		dn1.items[0].dn_detail = dn.items[0].name
 		dn1.submit()
 
@@ -245,15 +292,20 @@
 
 		self.assertEqual(actual_qty_1 + 2, actual_qty_2)
 
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": dn1.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
 		stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse)
 
-		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
+		gle_warehouse_amount = frappe.db.get_value(
+			"GL Entry",
+			{"voucher_type": "Delivery Note", "voucher_no": dn1.name, "account": stock_in_hand_account},
+			"debit",
+		)
 
 		self.assertEqual(gle_warehouse_amount, stock_value_difference)
 
@@ -267,6 +319,7 @@
 		self.assertEqual(dn.per_returned, 40)
 
 		from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 		return_dn_2 = make_return_doc("Delivery Note", dn.name)
 
 		# Check if unreturned amount is mapped in 2nd return
@@ -281,7 +334,7 @@
 		# DN should be completed on billing all unreturned amount
 		self.assertEqual(dn.items[0].billed_amt, 1500)
 		self.assertEqual(dn.per_billed, 100)
-		self.assertEqual(dn.status, 'Completed')
+		self.assertEqual(dn.status, "Completed")
 
 		si.load_from_db()
 		si.cancel()
@@ -293,19 +346,35 @@
 		dn.cancel()
 
 	def test_sales_return_for_non_bundled_items_full(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
-		make_item("Box", {'is_stock_item': 1})
+		make_item("Box", {"is_stock_item": 1})
 
 		make_stock_entry(item_code="Box", target="Stores - TCP1", qty=10, basic_rate=100)
 
-		dn = create_delivery_note(item_code="Box", qty=5, rate=500, warehouse="Stores - TCP1", company=company,
-			expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
+		dn = create_delivery_note(
+			item_code="Box",
+			qty=5,
+			rate=500,
+			warehouse="Stores - TCP1",
+			company=company,
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
-		#return entry
-		dn1 = create_delivery_note(item_code="Box", is_return=1, return_against=dn.name, qty=-5, rate=500,
-			company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1",
-			cost_center="Main - TCP1", do_not_submit=1)
+		# return entry
+		dn1 = create_delivery_note(
+			item_code="Box",
+			is_return=1,
+			return_against=dn.name,
+			qty=-5,
+			rate=500,
+			company=company,
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			do_not_submit=1,
+		)
 		dn1.items[0].dn_detail = dn.items[0].name
 		dn1.submit()
 
@@ -317,93 +386,157 @@
 		# Check if Original DN updated
 		self.assertEqual(dn.items[0].returned_qty, 5)
 		self.assertEqual(dn.per_returned, 100)
-		self.assertEqual(dn.status, 'Return Issued')
+		self.assertEqual(dn.status, "Return Issued")
 
 	def test_return_single_item_from_bundled_items(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
-		create_stock_reconciliation(item_code="_Test Item",
-			warehouse="Stores - TCP1", qty=50, rate=100,
-			company=company, expense_account = "Stock Adjustment - TCP1")
-		create_stock_reconciliation(item_code="_Test Item Home Desktop 100",
-			warehouse="Stores - TCP1", qty=50, rate=100,
-			company=company, expense_account = "Stock Adjustment - TCP1")
+		create_stock_reconciliation(
+			item_code="_Test Item",
+			warehouse="Stores - TCP1",
+			qty=50,
+			rate=100,
+			company=company,
+			expense_account="Stock Adjustment - TCP1",
+		)
+		create_stock_reconciliation(
+			item_code="_Test Item Home Desktop 100",
+			warehouse="Stores - TCP1",
+			qty=50,
+			rate=100,
+			company=company,
+			expense_account="Stock Adjustment - TCP1",
+		)
 
-		dn = create_delivery_note(item_code="_Test Product Bundle Item", qty=5, rate=500,
-			company=company, warehouse="Stores - TCP1",
-			expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
+		dn = create_delivery_note(
+			item_code="_Test Product Bundle Item",
+			qty=5,
+			rate=500,
+			company=company,
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
 		# Qty after delivery
 		actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1")
-		self.assertEqual(actual_qty_1,  25)
+		self.assertEqual(actual_qty_1, 25)
 
 		# outgoing_rate
-		outgoing_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn.name, "item_code": "_Test Item"}, "stock_value_difference") / 25
+		outgoing_rate = (
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name, "item_code": "_Test Item"},
+				"stock_value_difference",
+			)
+			/ 25
+		)
 
 		# return 'test item' from packed items
-		dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-10, rate=500,
-			company=company, warehouse="Stores - TCP1",
-			expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
+		dn1 = create_delivery_note(
+			is_return=1,
+			return_against=dn.name,
+			qty=-10,
+			rate=500,
+			company=company,
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
 		# qty after return
 		actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1")
 		self.assertEqual(actual_qty_2, 35)
 
 		# Check incoming rate for return entry
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": dn1.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
 		stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse)
 
 		# Check gl entry for warehouse
-		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
+		gle_warehouse_amount = frappe.db.get_value(
+			"GL Entry",
+			{"voucher_type": "Delivery Note", "voucher_no": dn1.name, "account": stock_in_hand_account},
+			"debit",
+		)
 
 		self.assertEqual(gle_warehouse_amount, stock_value_difference)
 
-
 	def test_return_entire_bundled_items(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
-		create_stock_reconciliation(item_code="_Test Item",
-			warehouse="Stores - TCP1", qty=50, rate=100,
-			company=company, expense_account = "Stock Adjustment - TCP1")
-		create_stock_reconciliation(item_code="_Test Item Home Desktop 100",
-			warehouse="Stores - TCP1", qty=50, rate=100,
-			company=company, expense_account = "Stock Adjustment - TCP1")
+		create_stock_reconciliation(
+			item_code="_Test Item",
+			warehouse="Stores - TCP1",
+			qty=50,
+			rate=100,
+			company=company,
+			expense_account="Stock Adjustment - TCP1",
+		)
+		create_stock_reconciliation(
+			item_code="_Test Item Home Desktop 100",
+			warehouse="Stores - TCP1",
+			qty=50,
+			rate=100,
+			company=company,
+			expense_account="Stock Adjustment - TCP1",
+		)
 
 		actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
 		self.assertEqual(actual_qty, 50)
 
-		dn = create_delivery_note(item_code="_Test Product Bundle Item",
-			qty=5, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
+		dn = create_delivery_note(
+			item_code="_Test Product Bundle Item",
+			qty=5,
+			rate=500,
+			company=company,
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
 		# qty after return
 		actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
 		self.assertEqual(actual_qty, 25)
 
 		#  return bundled item
-		dn1 = create_delivery_note(item_code='_Test Product Bundle Item', is_return=1,
-			return_against=dn.name, qty=-2, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
+		dn1 = create_delivery_note(
+			item_code="_Test Product Bundle Item",
+			is_return=1,
+			return_against=dn.name,
+			qty=-2,
+			rate=500,
+			company=company,
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+		)
 
 		# qty after return
 		actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
 		self.assertEqual(actual_qty, 35)
 
 		# Check incoming rate for return entry
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": dn1.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(incoming_rate, 100)
-		stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse)
+		stock_in_hand_account = get_inventory_account("_Test Company", dn1.items[0].warehouse)
 
 		# Check gl entry for warehouse
-		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
+		gle_warehouse_amount = frappe.db.get_value(
+			"GL Entry",
+			{"voucher_type": "Delivery Note", "voucher_no": dn1.name, "account": stock_in_hand_account},
+			"debit",
+		)
 
 		self.assertEqual(gle_warehouse_amount, 1400)
 
@@ -411,69 +544,88 @@
 		se = make_serialized_item()
 		serial_no = get_serial_nos(se.get("items")[0].serial_no)[0]
 
-		dn = create_delivery_note(item_code="_Test Serialized Item With Series", rate=500, serial_no=serial_no)
+		dn = create_delivery_note(
+			item_code="_Test Serialized Item With Series", rate=500, serial_no=serial_no
+		)
 
-		self.check_serial_no_values(serial_no, {
-			"warehouse": "",
-			"delivery_document_no": dn.name
-		})
+		self.check_serial_no_values(serial_no, {"warehouse": "", "delivery_document_no": dn.name})
 
 		# return entry
-		dn1 = create_delivery_note(item_code="_Test Serialized Item With Series",
-			is_return=1, return_against=dn.name, qty=-1, rate=500, serial_no=serial_no)
+		dn1 = create_delivery_note(
+			item_code="_Test Serialized Item With Series",
+			is_return=1,
+			return_against=dn.name,
+			qty=-1,
+			rate=500,
+			serial_no=serial_no,
+		)
 
-		self.check_serial_no_values(serial_no, {
-			"warehouse": "_Test Warehouse - _TC",
-			"delivery_document_no": ""
-		})
+		self.check_serial_no_values(
+			serial_no, {"warehouse": "_Test Warehouse - _TC", "delivery_document_no": ""}
+		)
 
 		dn1.cancel()
 
-		self.check_serial_no_values(serial_no, {
-			"warehouse": "",
-			"delivery_document_no": dn.name
-		})
+		self.check_serial_no_values(serial_no, {"warehouse": "", "delivery_document_no": dn.name})
 
 		dn.cancel()
 
-		self.check_serial_no_values(serial_no, {
-			"warehouse": "_Test Warehouse - _TC",
-			"delivery_document_no": "",
-			"purchase_document_no": se.name
-		})
+		self.check_serial_no_values(
+			serial_no,
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"delivery_document_no": "",
+				"purchase_document_no": se.name,
+			},
+		)
 
 	def test_delivery_of_bundled_items_to_target_warehouse(self):
 		from erpnext.selling.doctype.customer.test_customer import create_internal_customer
 
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 		customer_name = create_internal_customer(
 			customer_name="_Test Internal Customer 2",
 			represents_company="_Test Company with perpetual inventory",
-			allowed_to_interact_with="_Test Company with perpetual inventory"
+			allowed_to_interact_with="_Test Company with perpetual inventory",
 		)
 
 		set_valuation_method("_Test Item", "FIFO")
 		set_valuation_method("_Test Item Home Desktop 100", "FIFO")
 
-		target_warehouse = get_warehouse(company=company, abbr="TCP1",
-			warehouse_name="_Test Customer Warehouse").name
+		target_warehouse = get_warehouse(
+			company=company, abbr="TCP1", warehouse_name="_Test Customer Warehouse"
+		).name
 
 		for warehouse in ("Stores - TCP1", target_warehouse):
-			create_stock_reconciliation(item_code="_Test Item", warehouse=warehouse, company = company,
-				expense_account = "Stock Adjustment - TCP1", qty=500, rate=100)
-			create_stock_reconciliation(item_code="_Test Item Home Desktop 100", company = company,
-				expense_account = "Stock Adjustment - TCP1", warehouse=warehouse, qty=500, rate=100)
+			create_stock_reconciliation(
+				item_code="_Test Item",
+				warehouse=warehouse,
+				company=company,
+				expense_account="Stock Adjustment - TCP1",
+				qty=500,
+				rate=100,
+			)
+			create_stock_reconciliation(
+				item_code="_Test Item Home Desktop 100",
+				company=company,
+				expense_account="Stock Adjustment - TCP1",
+				warehouse=warehouse,
+				qty=500,
+				rate=100,
+			)
 
 		dn = create_delivery_note(
 			item_code="_Test Product Bundle Item",
 			company="_Test Company with perpetual inventory",
 			customer=customer_name,
-			cost_center = 'Main - TCP1',
-			expense_account = "Cost of Goods Sold - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
 			do_not_submit=True,
-			qty=5, rate=500,
+			qty=5,
+			rate=500,
 			warehouse="Stores - TCP1",
-			target_warehouse=target_warehouse)
+			target_warehouse=target_warehouse,
+		)
 
 		dn.submit()
 
@@ -485,16 +637,28 @@
 		self.assertEqual(actual_qty_at_target, 525)
 
 		# stock value diff for source warehouse for "_Test Item"
-		stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
-			{"voucher_type": "Delivery Note", "voucher_no": dn.name,
-				"item_code": "_Test Item", "warehouse": "Stores - TCP1"},
-			"stock_value_difference")
+		stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
+				"voucher_type": "Delivery Note",
+				"voucher_no": dn.name,
+				"item_code": "_Test Item",
+				"warehouse": "Stores - TCP1",
+			},
+			"stock_value_difference",
+		)
 
 		# stock value diff for target warehouse
-		stock_value_difference1 = frappe.db.get_value("Stock Ledger Entry",
-			{"voucher_type": "Delivery Note", "voucher_no": dn.name,
-				"item_code": "_Test Item", "warehouse": target_warehouse},
-			"stock_value_difference")
+		stock_value_difference1 = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
+				"voucher_type": "Delivery Note",
+				"voucher_no": dn.name,
+				"item_code": "_Test Item",
+				"warehouse": target_warehouse,
+			},
+			"stock_value_difference",
+		)
 
 		self.assertEqual(abs(stock_value_difference), stock_value_difference1)
 
@@ -502,13 +666,18 @@
 		gl_entries = get_gl_entries("Delivery Note", dn.name)
 		self.assertTrue(gl_entries)
 
-		stock_value_difference = abs(frappe.db.sql("""select sum(stock_value_difference)
+		stock_value_difference = abs(
+			frappe.db.sql(
+				"""select sum(stock_value_difference)
 			from `tabStock Ledger Entry` where voucher_type='Delivery Note' and voucher_no=%s
-			and warehouse='Stores - TCP1'""", dn.name)[0][0])
+			and warehouse='Stores - TCP1'""",
+				dn.name,
+			)[0][0]
+		)
 
 		expected_values = {
 			"Stock In Hand - TCP1": [0.0, stock_value_difference],
-			target_warehouse: [stock_value_difference, 0.0]
+			target_warehouse: [stock_value_difference, 0.0],
 		}
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account))
@@ -521,8 +690,13 @@
 
 		make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100)
 
-		dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1',
-			cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1", do_not_submit=True)
+		dn = create_delivery_note(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			do_not_submit=True,
+		)
 
 		dn.submit()
 
@@ -599,6 +773,7 @@
 		from erpnext.selling.doctype.sales_order.sales_order import (
 			make_sales_invoice as make_sales_invoice_from_so,
 		)
+
 		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
 
 		so = make_sales_order()
@@ -672,28 +847,33 @@
 
 	def test_delivery_note_with_cost_center(self):
 		from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
-		cost_center = "_Test Cost Center for BS Account - TCP1"
-		create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company with perpetual inventory")
 
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		cost_center = "_Test Cost Center for BS Account - TCP1"
+		create_cost_center(
+			cost_center_name="_Test Cost Center for BS Account",
+			company="_Test Company with perpetual inventory",
+		)
+
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
 		set_valuation_method("_Test Item", "FIFO")
 
 		make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100)
 
-		stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
-		dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1',  expense_account = "Cost of Goods Sold - TCP1", cost_center=cost_center)
+		stock_in_hand_account = get_inventory_account("_Test Company with perpetual inventory")
+		dn = create_delivery_note(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			cost_center=cost_center,
+		)
 
 		gl_entries = get_gl_entries("Delivery Note", dn.name)
 		self.assertTrue(gl_entries)
 
 		expected_values = {
-			"Cost of Goods Sold - TCP1": {
-				"cost_center": cost_center
-			},
-			stock_in_hand_account: {
-				"cost_center": cost_center
-			}
+			"Cost of Goods Sold - TCP1": {"cost_center": cost_center},
+			stock_in_hand_account: {"cost_center": cost_center},
 		}
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
@@ -701,29 +881,30 @@
 	def test_delivery_note_cost_center_with_balance_sheet_account(self):
 		cost_center = "Main - TCP1"
 
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
 		set_valuation_method("_Test Item", "FIFO")
 
 		make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100)
 
-		stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory')
-		dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1",
-			do_not_submit=1)
+		stock_in_hand_account = get_inventory_account("_Test Company with perpetual inventory")
+		dn = create_delivery_note(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+			do_not_submit=1,
+		)
 
-		dn.get('items')[0].cost_center = None
+		dn.get("items")[0].cost_center = None
 		dn.submit()
 
 		gl_entries = get_gl_entries("Delivery Note", dn.name)
 
 		self.assertTrue(gl_entries)
 		expected_values = {
-			"Cost of Goods Sold - TCP1": {
-				"cost_center": cost_center
-			},
-			stock_in_hand_account: {
-				"cost_center": cost_center
-			}
+			"Cost of Goods Sold - TCP1": {"cost_center": cost_center},
+			stock_in_hand_account: {"cost_center": cost_center},
 		}
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
@@ -751,15 +932,18 @@
 		from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice
 
 		dn = create_delivery_note(qty=8, do_not_submit=True)
-		dn.append("items", {
-			"item_code": "_Test Item",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 1,
-			"rate": 100,
-			"conversion_factor": 1.0,
-			"expense_account": "Cost of Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC"
-		})
+		dn.append(
+			"items",
+			{
+				"item_code": "_Test Item",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 1,
+				"rate": 100,
+				"conversion_factor": 1.0,
+				"expense_account": "Cost of Goods Sold - _TC",
+				"cost_center": "_Test Cost Center - _TC",
+			},
+		)
 		dn.submit()
 
 		si1 = make_sales_invoice(dn.name)
@@ -776,14 +960,21 @@
 		self.assertEqual(si2.items[0].qty, 2)
 		self.assertEqual(si2.items[1].qty, 1)
 
-
 	def test_delivery_note_bundle_with_batched_item(self):
 		batched_bundle = make_item("_Test Batched bundle", {"is_stock_item": 0})
-		batched_item = make_item("_Test Batched Item",
-				{"is_stock_item": 1, "has_batch_no": 1, "create_new_batch": 1, "batch_number_series": "TESTBATCH.#####"}
-				)
+		batched_item = make_item(
+			"_Test Batched Item",
+			{
+				"is_stock_item": 1,
+				"has_batch_no": 1,
+				"create_new_batch": 1,
+				"batch_number_series": "TESTBATCH.#####",
+			},
+		)
 		make_product_bundle(parent=batched_bundle.name, items=[batched_item.name])
-		make_stock_entry(item_code=batched_item.name, target="_Test Warehouse - _TC", qty=10, basic_rate=42)
+		make_stock_entry(
+			item_code=batched_item.name, target="_Test Warehouse - _TC", qty=10, basic_rate=42
+		)
 
 		try:
 			dn = create_delivery_note(item_code=batched_bundle.name, qty=1)
@@ -792,7 +983,9 @@
 				self.fail("Batch numbers not getting added to bundled items in DN.")
 			raise e
 
-		self.assertTrue("TESTBATCH" in dn.packed_items[0].batch_no, "Batch number not added in packed item")
+		self.assertTrue(
+			"TESTBATCH" in dn.packed_items[0].batch_no, "Batch number not added in packed item"
+		)
 
 	def test_payment_terms_are_fetched_when_creating_sales_invoice(self):
 		from erpnext.accounts.doctype.payment_entry.test_payment_entry import (
@@ -804,13 +997,13 @@
 
 		so = make_sales_order(uom="Nos", do_not_save=1)
 		create_payment_terms_template()
-		so.payment_terms_template = 'Test Receivable Template'
+		so.payment_terms_template = "Test Receivable Template"
 		so.submit()
 
 		dn = create_dn_against_so(so.name, delivered_qty=10)
 
 		si = create_sales_invoice(qty=10, do_not_save=1)
-		si.items[0].delivery_note= dn.name
+		si.items[0].delivery_note = dn.name
 		si.items[0].dn_detail = dn.items[0].name
 		si.items[0].sales_order = so.name
 		si.items[0].so_detail = so.items[0].name
@@ -823,6 +1016,7 @@
 
 		automatically_fetch_payment_terms(enable=0)
 
+
 def create_delivery_note(**args):
 	dn = frappe.new_doc("Delivery Note")
 	args = frappe._dict(args)
@@ -836,18 +1030,21 @@
 	dn.is_return = args.is_return
 	dn.return_against = args.return_against
 
-	dn.append("items", {
-		"item_code": args.item or args.item_code or "_Test Item",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty or 1,
-		"rate": args.rate if args.get("rate") is not None else 100,
-		"conversion_factor": 1.0,
-		"allow_zero_valuation_rate": args.allow_zero_valuation_rate or 1,
-		"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC",
-		"serial_no": args.serial_no,
-		"target_warehouse": args.target_warehouse
-	})
+	dn.append(
+		"items",
+		{
+			"item_code": args.item or args.item_code or "_Test Item",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty or 1,
+			"rate": args.rate if args.get("rate") is not None else 100,
+			"conversion_factor": 1.0,
+			"allow_zero_valuation_rate": args.allow_zero_valuation_rate or 1,
+			"expense_account": args.expense_account or "Cost of Goods Sold - _TC",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+			"serial_no": args.serial_no,
+			"target_warehouse": args.target_warehouse,
+		},
+	)
 
 	if not args.do_not_save:
 		dn.insert()
@@ -855,4 +1052,5 @@
 			dn.submit()
 	return dn
 
+
 test_dependencies = ["Product Bundle"]
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index c749b2e..73b250d 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -17,9 +17,12 @@
 		super(DeliveryTrip, self).__init__(*args, **kwargs)
 
 		# Google Maps returns distances in meters by default
-		self.default_distance_uom = frappe.db.get_single_value("Global Defaults", "default_distance_unit") or "Meter"
-		self.uom_conversion_factor = frappe.db.get_value("UOM Conversion Factor",
-			{"from_uom": "Meter", "to_uom": self.default_distance_uom}, "value")
+		self.default_distance_uom = (
+			frappe.db.get_single_value("Global Defaults", "default_distance_unit") or "Meter"
+		)
+		self.uom_conversion_factor = frappe.db.get_value(
+			"UOM Conversion Factor", {"from_uom": "Meter", "to_uom": self.default_distance_uom}, "value"
+		)
 
 	def validate(self):
 		self.validate_stop_addresses()
@@ -41,11 +44,7 @@
 				stop.customer_address = get_address_display(frappe.get_doc("Address", stop.address).as_dict())
 
 	def update_status(self):
-		status = {
-			0: "Draft",
-			1: "Scheduled",
-			2: "Cancelled"
-		}[self.docstatus]
+		status = {0: "Draft", 1: "Scheduled", 2: "Cancelled"}[self.docstatus]
 
 		if self.docstatus == 1:
 			visited_stops = [stop.visited for stop in self.delivery_stops]
@@ -63,17 +62,19 @@
 		are removed.
 
 		Args:
-			delete (bool, optional): Defaults to `False`. `True` if driver details need to be emptied, else `False`.
+		        delete (bool, optional): Defaults to `False`. `True` if driver details need to be emptied, else `False`.
 		"""
 
-		delivery_notes = list(set(stop.delivery_note for stop in self.delivery_stops if stop.delivery_note))
+		delivery_notes = list(
+			set(stop.delivery_note for stop in self.delivery_stops if stop.delivery_note)
+		)
 
 		update_fields = {
 			"driver": self.driver,
 			"driver_name": self.driver_name,
 			"vehicle_no": self.vehicle,
 			"lr_no": self.name,
-			"lr_date": self.departure_time
+			"lr_date": self.departure_time,
 		}
 
 		for delivery_note in delivery_notes:
@@ -97,7 +98,7 @@
 		on the optimized order, before estimating the arrival times.
 
 		Args:
-			optimize (bool): True if route needs to be optimized, else False
+		        optimize (bool): True if route needs to be optimized, else False
 		"""
 
 		departure_datetime = get_datetime(self.departure_time)
@@ -134,8 +135,9 @@
 
 				# Include last leg in the final distance calculation
 				self.uom = self.default_distance_uom
-				total_distance = sum(leg.get("distance", {}).get("value", 0.0)
-					for leg in directions.get("legs"))  # in meters
+				total_distance = sum(
+					leg.get("distance", {}).get("value", 0.0) for leg in directions.get("legs")
+				)  # in meters
 				self.total_distance = total_distance * self.uom_conversion_factor
 			else:
 				idx += len(route) - 1
@@ -149,10 +151,10 @@
 		split into sublists at the specified lock position(s).
 
 		Args:
-			optimize (bool): `True` if route needs to be optimized, else `False`
+		        optimize (bool): `True` if route needs to be optimized, else `False`
 
 		Returns:
-			(list of list of str): List of address routes split at locks, if optimize is `True`
+		        (list of list of str): List of address routes split at locks, if optimize is `True`
 		"""
 		if not self.driver_address:
 			frappe.throw(_("Cannot Calculate Arrival Time as Driver Address is Missing."))
@@ -186,8 +188,8 @@
 		for vehicle routing problems.
 
 		Args:
-			optimized_order (list of int): The index-based optimized order of the route
-			start (int): The index at which to start the rearrangement
+		        optimized_order (list of int): The index-based optimized order of the route
+		        start (int): The index at which to start the rearrangement
 		"""
 
 		stops_order = []
@@ -200,7 +202,7 @@
 			self.delivery_stops[old_idx].idx = new_idx
 			stops_order.append(self.delivery_stops[old_idx])
 
-		self.delivery_stops[start:start + len(stops_order)] = stops_order
+		self.delivery_stops[start : start + len(stops_order)] = stops_order
 
 	def get_directions(self, route, optimize):
 		"""
@@ -212,11 +214,11 @@
 		but it only works for routes without any waypoints.
 
 		Args:
-			route (list of str): Route addresses (origin -> waypoint(s), if any -> destination)
-			optimize (bool): `True` if route needs to be optimized, else `False`
+		        route (list of str): Route addresses (origin -> waypoint(s), if any -> destination)
+		        optimize (bool): `True` if route needs to be optimized, else `False`
 
 		Returns:
-			(dict): Route legs and, if `optimize` is `True`, optimized waypoint order
+		        (dict): Route legs and, if `optimize` is `True`, optimized waypoint order
 		"""
 		if not frappe.db.get_single_value("Google Settings", "api_key"):
 			frappe.throw(_("Enter API key in Google Settings."))
@@ -231,8 +233,8 @@
 		directions_data = {
 			"origin": route[0],
 			"destination": route[-1],
-			"waypoints": route[1: -1],
-			"optimize_waypoints": optimize
+			"waypoints": route[1:-1],
+			"optimize_waypoints": optimize,
 		}
 
 		try:
@@ -243,7 +245,6 @@
 		return directions[0] if directions else False
 
 
-
 @frappe.whitelist()
 def get_contact_and_address(name):
 	out = frappe._dict()
@@ -265,7 +266,10 @@
 				dl.link_doctype="Customer"
 				AND dl.link_name=%s
 				AND dl.parenttype = "Contact"
-		""", (name), as_dict=1)
+		""",
+		(name),
+		as_dict=1,
+	)
 
 	if contact_persons:
 		for out.contact_person in contact_persons:
@@ -288,7 +292,10 @@
 				dl.link_doctype="Customer"
 				AND dl.link_name=%s
 				AND dl.parenttype = "Address"
-		""", (name), as_dict=1)
+		""",
+		(name),
+		as_dict=1,
+	)
 
 	if shipping_addresses:
 		for out.shipping_address in shipping_addresses:
@@ -303,16 +310,18 @@
 @frappe.whitelist()
 def get_contact_display(contact):
 	contact_info = frappe.db.get_value(
-		"Contact", contact,
-		["first_name", "last_name", "phone", "mobile_no"],
-		as_dict=1)
+		"Contact", contact, ["first_name", "last_name", "phone", "mobile_no"], as_dict=1
+	)
 
-	contact_info.html = """ <b>%(first_name)s %(last_name)s</b> <br> %(phone)s <br> %(mobile_no)s""" % {
-		"first_name": contact_info.first_name,
-		"last_name": contact_info.last_name or "",
-		"phone": contact_info.phone or "",
-		"mobile_no": contact_info.mobile_no or ""
-	}
+	contact_info.html = (
+		""" <b>%(first_name)s %(last_name)s</b> <br> %(phone)s <br> %(mobile_no)s"""
+		% {
+			"first_name": contact_info.first_name,
+			"last_name": contact_info.last_name or "",
+			"phone": contact_info.phone or "",
+			"mobile_no": contact_info.mobile_no or "",
+		}
+	)
 
 	return contact_info.html
 
@@ -322,19 +331,19 @@
 	Remove HTML breaks in a given address
 
 	Args:
-		address (str): Address to be sanitized
+	        address (str): Address to be sanitized
 
 	Returns:
-		(str): Sanitized address
+	        (str): Sanitized address
 	"""
 
 	if not address:
 		return
 
-	address = address.split('<br>')
+	address = address.split("<br>")
 
 	# Only get the first 3 blocks of the address
-	return ', '.join(address[:3])
+	return ", ".join(address[:3])
 
 
 @frappe.whitelist()
@@ -349,11 +358,15 @@
 	email_recipients = []
 
 	for stop in delivery_trip.delivery_stops:
-		contact_info = frappe.db.get_value("Contact", stop.contact, ["first_name", "last_name", "email_id"], as_dict=1)
+		contact_info = frappe.db.get_value(
+			"Contact", stop.contact, ["first_name", "last_name", "email_id"], as_dict=1
+		)
 
 		context.update({"items": []})
 		if stop.delivery_note:
-			items = frappe.get_all("Delivery Note Item", filters={"parent": stop.delivery_note, "docstatus": 1}, fields=["*"])
+			items = frappe.get_all(
+				"Delivery Note Item", filters={"parent": stop.delivery_note, "docstatus": 1}, fields=["*"]
+			)
 			context.update({"items": items})
 
 		if contact_info and contact_info.email_id:
@@ -363,10 +376,12 @@
 			dispatch_template_name = frappe.db.get_single_value("Delivery Settings", "dispatch_template")
 			dispatch_template = frappe.get_doc("Email Template", dispatch_template_name)
 
-			frappe.sendmail(recipients=contact_info.email_id,
+			frappe.sendmail(
+				recipients=contact_info.email_id,
 				subject=dispatch_template.subject,
 				message=frappe.render_template(dispatch_template.response, context),
-				attachments=get_attachments(stop))
+				attachments=get_attachments(stop),
+			)
 
 			stop.db_set("email_sent_to", contact_info.email_id)
 			email_recipients.append(contact_info.email_id)
@@ -379,29 +394,37 @@
 
 
 def get_attachments(delivery_stop):
-	if not (frappe.db.get_single_value("Delivery Settings", "send_with_attachment") and delivery_stop.delivery_note):
+	if not (
+		frappe.db.get_single_value("Delivery Settings", "send_with_attachment")
+		and delivery_stop.delivery_note
+	):
 		return []
 
 	dispatch_attachment = frappe.db.get_single_value("Delivery Settings", "dispatch_attachment")
-	attachments = frappe.attach_print("Delivery Note", delivery_stop.delivery_note,
-		file_name="Delivery Note", print_format=dispatch_attachment)
+	attachments = frappe.attach_print(
+		"Delivery Note",
+		delivery_stop.delivery_note,
+		file_name="Delivery Note",
+		print_format=dispatch_attachment,
+	)
 
 	return [attachments]
 
+
 @frappe.whitelist()
 def get_driver_email(driver):
 	employee = frappe.db.get_value("Driver", driver, "employee")
 	email = frappe.db.get_value("Employee", employee, "prefered_email")
 	return {"email": email}
 
+
 @frappe.whitelist()
 def make_expense_claim(source_name, target_doc=None):
-	doc = get_mapped_doc("Delivery Trip", source_name,
-		{"Delivery Trip": {
-			"doctype": "Expense Claim",
-			"field_map": {
-				"name" : "delivery_trip"
-			}
-		}}, target_doc)
+	doc = get_mapped_doc(
+		"Delivery Trip",
+		source_name,
+		{"Delivery Trip": {"doctype": "Expense Claim", "field_map": {"name": "delivery_trip"}}},
+		target_doc,
+	)
 
 	return doc
diff --git a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
index dcdff4a..555361a 100644
--- a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
@@ -106,23 +106,21 @@
 		self.delivery_trip.save()
 		self.assertEqual(self.delivery_trip.status, "Completed")
 
+
 def create_address(driver):
 	if not frappe.db.exists("Address", {"address_title": "_Test Address for Driver"}):
-		address = frappe.get_doc({
-			"doctype": "Address",
-			"address_title": "_Test Address for Driver",
-			"address_type": "Office",
-			"address_line1": "Station Road",
-			"city": "_Test City",
-			"state": "Test State",
-			"country": "India",
-			"links":[
-				{
-					"link_doctype": "Driver",
-					"link_name": driver.name
-				}
-			]
-		}).insert(ignore_permissions=True)
+		address = frappe.get_doc(
+			{
+				"doctype": "Address",
+				"address_title": "_Test Address for Driver",
+				"address_type": "Office",
+				"address_line1": "Station Road",
+				"city": "_Test City",
+				"state": "Test State",
+				"country": "India",
+				"links": [{"link_doctype": "Driver", "link_name": driver.name}],
+			}
+		).insert(ignore_permissions=True)
 
 		frappe.db.set_value("Driver", driver.name, "address", address.name)
 
@@ -130,49 +128,57 @@
 
 	return frappe.get_doc("Address", {"address_title": "_Test Address for Driver"})
 
+
 def create_driver():
 	if not frappe.db.exists("Driver", {"full_name": "Newton Scmander"}):
-		driver = frappe.get_doc({
-			"doctype": "Driver",
-			"full_name": "Newton Scmander",
-			"cell_number": "98343424242",
-			"license_number": "B809",
-		}).insert(ignore_permissions=True)
+		driver = frappe.get_doc(
+			{
+				"doctype": "Driver",
+				"full_name": "Newton Scmander",
+				"cell_number": "98343424242",
+				"license_number": "B809",
+			}
+		).insert(ignore_permissions=True)
 
 		return driver
 
 	return frappe.get_doc("Driver", {"full_name": "Newton Scmander"})
 
+
 def create_delivery_notification():
 	if not frappe.db.exists("Email Template", "Delivery Notification"):
-		dispatch_template = frappe.get_doc({
-			'doctype': 'Email Template',
-			'name': 'Delivery Notification',
-			'response': 'Test Delivery Trip',
-			'subject': 'Test Subject',
-			'owner': frappe.session.user
-		})
+		dispatch_template = frappe.get_doc(
+			{
+				"doctype": "Email Template",
+				"name": "Delivery Notification",
+				"response": "Test Delivery Trip",
+				"subject": "Test Subject",
+				"owner": frappe.session.user,
+			}
+		)
 		dispatch_template.insert()
 
 	delivery_settings = frappe.get_single("Delivery Settings")
-	delivery_settings.dispatch_template = 'Delivery Notification'
+	delivery_settings.dispatch_template = "Delivery Notification"
 	delivery_settings.save()
 
 
 def create_vehicle():
 	if not frappe.db.exists("Vehicle", "JB 007"):
-		vehicle = frappe.get_doc({
-			"doctype": "Vehicle",
-			"license_plate": "JB 007",
-			"make": "Maruti",
-			"model": "PCM",
-			"last_odometer": 5000,
-			"acquisition_date": nowdate(),
-			"location": "Mumbai",
-			"chassis_no": "1234ABCD",
-			"uom": "Litre",
-			"vehicle_value": flt(500000)
-		})
+		vehicle = frappe.get_doc(
+			{
+				"doctype": "Vehicle",
+				"license_plate": "JB 007",
+				"make": "Maruti",
+				"model": "PCM",
+				"last_odometer": 5000,
+				"acquisition_date": nowdate(),
+				"location": "Mumbai",
+				"chassis_no": "1234ABCD",
+				"uom": "Litre",
+				"vehicle_value": flt(500000),
+			}
+		)
 		vehicle.insert()
 
 
@@ -180,23 +186,27 @@
 	if not contact:
 		contact = get_contact_and_address("_Test Customer")
 
-	delivery_trip = frappe.get_doc({
-		"doctype": "Delivery Trip",
-		"company": erpnext.get_default_company(),
-		"departure_time": add_days(now_datetime(), 5),
-		"driver": driver.name,
-		"driver_address": address.name,
-		"vehicle": "JB 007",
-		"delivery_stops": [{
-			"customer": "_Test Customer",
-			"address": contact.shipping_address.parent,
-			"contact": contact.contact_person.parent
-		},
+	delivery_trip = frappe.get_doc(
 		{
-			"customer": "_Test Customer",
-			"address": contact.shipping_address.parent,
-			"contact": contact.contact_person.parent
-		}]
-	}).insert(ignore_permissions=True)
+			"doctype": "Delivery Trip",
+			"company": erpnext.get_default_company(),
+			"departure_time": add_days(now_datetime(), 5),
+			"driver": driver.name,
+			"driver_address": address.name,
+			"vehicle": "JB 007",
+			"delivery_stops": [
+				{
+					"customer": "_Test Customer",
+					"address": contact.shipping_address.parent,
+					"contact": contact.contact_person.parent,
+				},
+				{
+					"customer": "_Test Customer",
+					"address": contact.shipping_address.parent,
+					"contact": contact.contact_person.parent,
+				},
+			],
+		}
+	).insert(ignore_permissions=True)
 
 	return delivery_trip
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 3abeecd..9d7c22f 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -44,13 +44,15 @@
 class InvalidBarcode(frappe.ValidationError):
 	pass
 
+
 class DataValidationError(frappe.ValidationError):
 	pass
 
+
 class Item(Document):
 	def onload(self):
-		self.set_onload('stock_exists', self.stock_ledger_created())
-		self.set_onload('asset_naming_series', get_asset_naming_series())
+		self.set_onload("stock_exists", self.stock_ledger_created())
+		self.set_onload("asset_naming_series", get_asset_naming_series())
 
 	def autoname(self):
 		if frappe.db.get_default("item_naming_by") == "Naming Series":
@@ -60,6 +62,7 @@
 					make_variant_item_code(self.variant_of, template_item_name, self)
 			else:
 				from frappe.model.naming import set_name_by_naming_series
+
 				set_name_by_naming_series(self)
 				self.item_code = self.name
 
@@ -70,9 +73,8 @@
 		if not self.description:
 			self.description = self.item_name
 
-
 	def after_insert(self):
-		'''set opening stock and item price'''
+		"""set opening stock and item price"""
 		if self.standard_rate:
 			for default in self.item_defaults or [frappe._dict()]:
 				self.add_price(default.default_price_list)
@@ -128,8 +130,8 @@
 		self.update_website_item()
 
 	def validate_description(self):
-		'''Clean HTML description if set'''
-		if cint(frappe.db.get_single_value('Stock Settings', 'clean_description_html')):
+		"""Clean HTML description if set"""
+		if cint(frappe.db.get_single_value("Stock Settings", "clean_description_html")):
 			self.description = clean_html(self.description)
 
 	def validate_customer_provided_part(self):
@@ -141,24 +143,27 @@
 			self.default_material_request_type = "Customer Provided"
 
 	def add_price(self, price_list=None):
-		'''Add a new price'''
+		"""Add a new price"""
 		if not price_list:
-			price_list = (frappe.db.get_single_value('Selling Settings', 'selling_price_list')
-						or frappe.db.get_value('Price List', _('Standard Selling')))
+			price_list = frappe.db.get_single_value(
+				"Selling Settings", "selling_price_list"
+			) or frappe.db.get_value("Price List", _("Standard Selling"))
 		if price_list:
-			item_price = frappe.get_doc({
-				"doctype": "Item Price",
-				"price_list": price_list,
-				"item_code": self.name,
-				"uom": self.stock_uom,
-				"brand": self.brand,
-				"currency": erpnext.get_default_currency(),
-				"price_list_rate": self.standard_rate
-			})
+			item_price = frappe.get_doc(
+				{
+					"doctype": "Item Price",
+					"price_list": price_list,
+					"item_code": self.name,
+					"uom": self.stock_uom,
+					"brand": self.brand,
+					"currency": erpnext.get_default_currency(),
+					"price_list_rate": self.standard_rate,
+				}
+			)
 			item_price.insert()
 
 	def set_opening_stock(self):
-		'''set opening stock'''
+		"""set opening stock"""
 		if not self.is_stock_item or self.has_serial_no or self.has_batch_no:
 			return
 
@@ -171,19 +176,30 @@
 		from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
 
 		# default warehouse, or Stores
-		for default in self.item_defaults or [frappe._dict({'company': frappe.defaults.get_defaults().company})]:
-			default_warehouse = (default.default_warehouse
-					or frappe.db.get_single_value('Stock Settings', 'default_warehouse'))
+		for default in self.item_defaults or [
+			frappe._dict({"company": frappe.defaults.get_defaults().company})
+		]:
+			default_warehouse = default.default_warehouse or frappe.db.get_single_value(
+				"Stock Settings", "default_warehouse"
+			)
 			if default_warehouse:
 				warehouse_company = frappe.db.get_value("Warehouse", default_warehouse, "company")
 
 			if not default_warehouse or warehouse_company != default.company:
-				default_warehouse = frappe.db.get_value('Warehouse',
-					{'warehouse_name': _('Stores'), 'company': default.company})
+				default_warehouse = frappe.db.get_value(
+					"Warehouse", {"warehouse_name": _("Stores"), "company": default.company}
+				)
 
 			if default_warehouse:
-				stock_entry = make_stock_entry(item_code=self.name, target=default_warehouse, qty=self.opening_stock,
-					rate=self.valuation_rate, company=default.company, posting_date=getdate(), posting_time=nowtime())
+				stock_entry = make_stock_entry(
+					item_code=self.name,
+					target=default_warehouse,
+					qty=self.opening_stock,
+					rate=self.valuation_rate,
+					company=default.company,
+					posting_date=getdate(),
+					posting_time=nowtime(),
+				)
 
 				stock_entry.add_comment("Comment", _("Opening Stock"))
 
@@ -201,14 +217,21 @@
 		if not self.is_fixed_asset:
 			asset = frappe.db.get_all("Asset", filters={"item_code": self.name, "docstatus": 1}, limit=1)
 			if asset:
-				frappe.throw(_('"Is Fixed Asset" cannot be unchecked, as Asset record exists against the item'))
+				frappe.throw(
+					_('"Is Fixed Asset" cannot be unchecked, as Asset record exists against the item')
+				)
 
 	def validate_retain_sample(self):
-		if self.retain_sample and not frappe.db.get_single_value('Stock Settings', 'sample_retention_warehouse'):
+		if self.retain_sample and not frappe.db.get_single_value(
+			"Stock Settings", "sample_retention_warehouse"
+		):
 			frappe.throw(_("Please select Sample Retention Warehouse in Stock Settings first"))
 		if self.retain_sample and not self.has_batch_no:
-			frappe.throw(_("{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item").format(
-				self.item_code))
+			frappe.throw(
+				_(
+					"{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item"
+				).format(self.item_code)
+			)
 
 	def clear_retain_sample(self):
 		if not self.has_batch_no:
@@ -228,10 +251,7 @@
 		uoms_list = [d.uom for d in self.get("uoms")]
 
 		if self.stock_uom not in uoms_list:
-			self.append("uoms", {
-				"uom": self.stock_uom,
-				"conversion_factor": 1
-			})
+			self.append("uoms", {"uom": self.stock_uom, "conversion_factor": 1})
 
 	def update_website_item(self):
 		"""Update Website Item if change in Item impacts it."""
@@ -239,8 +259,7 @@
 
 		if web_item:
 			changed = {}
-			editable_fields = ["item_name", "item_group", "stock_uom", "brand", "description",
-				"disabled"]
+			editable_fields = ["item_name", "item_group", "stock_uom", "brand", "description", "disabled"]
 			doc_before_save = self.get_doc_before_save()
 
 			for field in editable_fields:
@@ -258,7 +277,7 @@
 			web_item_doc.save()
 
 	def validate_item_tax_net_rate_range(self):
-		for tax in self.get('taxes'):
+		for tax in self.get("taxes"):
 			if flt(tax.maximum_net_rate) < flt(tax.minimum_net_rate):
 				frappe.throw(_("Row #{0}: Maximum Net Rate cannot be greater than Minimum Net Rate"))
 
@@ -273,23 +292,31 @@
 		if not self.get("reorder_levels"):
 			for d in template.get("reorder_levels"):
 				n = {}
-				for k in ("warehouse", "warehouse_reorder_level",
-					"warehouse_reorder_qty", "material_request_type"):
+				for k in (
+					"warehouse",
+					"warehouse_reorder_level",
+					"warehouse_reorder_qty",
+					"material_request_type",
+				):
 					n[k] = d.get(k)
 				self.append("reorder_levels", n)
 
 	def validate_conversion_factor(self):
 		check_list = []
-		for d in self.get('uoms'):
+		for d in self.get("uoms"):
 			if cstr(d.uom) in check_list:
 				frappe.throw(
-					_("Unit of Measure {0} has been entered more than once in Conversion Factor Table").format(d.uom))
+					_("Unit of Measure {0} has been entered more than once in Conversion Factor Table").format(
+						d.uom
+					)
+				)
 			else:
 				check_list.append(cstr(d.uom))
 
 			if d.uom and cstr(d.uom) == cstr(self.stock_uom) and flt(d.conversion_factor) != 1:
 				frappe.throw(
-					_("Conversion factor for default Unit of Measure must be 1 in row {0}").format(d.idx))
+					_("Conversion factor for default Unit of Measure must be 1 in row {0}").format(d.idx)
+				)
 
 	def validate_item_type(self):
 		if self.has_serial_no == 1 and self.is_stock_item == 0 and not self.is_fixed_asset:
@@ -302,28 +329,32 @@
 		for field in ["serial_no_series", "batch_number_series"]:
 			series = self.get(field)
 			if series and "#" in series and "." not in series:
-				frappe.throw(_("Invalid naming series (. missing) for {0}")
-					.format(frappe.bold(self.meta.get_field(field).label)))
+				frappe.throw(
+					_("Invalid naming series (. missing) for {0}").format(
+						frappe.bold(self.meta.get_field(field).label)
+					)
+				)
 
 	def check_for_active_boms(self):
 		if self.default_bom:
 			bom_item = frappe.db.get_value("BOM", self.default_bom, "item")
 			if bom_item not in (self.name, self.variant_of):
 				frappe.throw(
-					_("Default BOM ({0}) must be active for this item or its template").format(bom_item))
+					_("Default BOM ({0}) must be active for this item or its template").format(bom_item)
+				)
 
 	def fill_customer_code(self):
 		"""
-			Append all the customer codes and insert into "customer_code" field of item table.
-			Used to search Item by customer code.
+		Append all the customer codes and insert into "customer_code" field of item table.
+		Used to search Item by customer code.
 		"""
 		customer_codes = set(d.ref_code for d in self.get("customer_items", []))
-		self.customer_code = ','.join(customer_codes)
+		self.customer_code = ",".join(customer_codes)
 
 	def check_item_tax(self):
 		"""Check whether Tax Rate is not entered twice for same Tax Type"""
 		check_list = []
-		for d in self.get('taxes'):
+		for d in self.get("taxes"):
 			if d.item_tax_template:
 				if d.item_tax_template in check_list:
 					frappe.throw(_("{0} entered twice in Item Tax").format(d.item_tax_template))
@@ -332,24 +363,39 @@
 
 	def validate_barcode(self):
 		from stdnum import ean
+
 		if len(self.barcodes) > 0:
 			for item_barcode in self.barcodes:
-				options = frappe.get_meta("Item Barcode").get_options("barcode_type").split('\n')
+				options = frappe.get_meta("Item Barcode").get_options("barcode_type").split("\n")
 				if item_barcode.barcode:
 					duplicate = frappe.db.sql(
-						"""select parent from `tabItem Barcode` where barcode = %s and parent != %s""", (item_barcode.barcode, self.name))
+						"""select parent from `tabItem Barcode` where barcode = %s and parent != %s""",
+						(item_barcode.barcode, self.name),
+					)
 					if duplicate:
-						frappe.throw(_("Barcode {0} already used in Item {1}").format(
-							item_barcode.barcode, duplicate[0][0]))
+						frappe.throw(
+							_("Barcode {0} already used in Item {1}").format(item_barcode.barcode, duplicate[0][0])
+						)
 
-					item_barcode.barcode_type = "" if item_barcode.barcode_type not in options else item_barcode.barcode_type
-					if item_barcode.barcode_type and item_barcode.barcode_type.upper() in ('EAN', 'UPC-A', 'EAN-13', 'EAN-8'):
+					item_barcode.barcode_type = (
+						"" if item_barcode.barcode_type not in options else item_barcode.barcode_type
+					)
+					if item_barcode.barcode_type and item_barcode.barcode_type.upper() in (
+						"EAN",
+						"UPC-A",
+						"EAN-13",
+						"EAN-8",
+					):
 						if not ean.is_valid(item_barcode.barcode):
-							frappe.throw(_("Barcode {0} is not a valid {1} code").format(
-								item_barcode.barcode, item_barcode.barcode_type), InvalidBarcode)
+							frappe.throw(
+								_("Barcode {0} is not a valid {1} code").format(
+									item_barcode.barcode, item_barcode.barcode_type
+								),
+								InvalidBarcode,
+							)
 
 	def validate_warehouse_for_reorder(self):
-		'''Validate Reorder level table for duplicate and conditional mandatory'''
+		"""Validate Reorder level table for duplicate and conditional mandatory"""
 		warehouse = []
 		for d in self.get("reorder_levels"):
 			if not d.warehouse_group:
@@ -357,20 +403,30 @@
 			if d.get("warehouse") and d.get("warehouse") not in warehouse:
 				warehouse += [d.get("warehouse")]
 			else:
-				frappe.throw(_("Row {0}: An Reorder entry already exists for this warehouse {1}")
-									.format(d.idx, d.warehouse), DuplicateReorderRows)
+				frappe.throw(
+					_("Row {0}: An Reorder entry already exists for this warehouse {1}").format(
+						d.idx, d.warehouse
+					),
+					DuplicateReorderRows,
+				)
 
 			if d.warehouse_reorder_level and not d.warehouse_reorder_qty:
 				frappe.throw(_("Row #{0}: Please set reorder quantity").format(d.idx))
 
 	def stock_ledger_created(self):
-		if not hasattr(self, '_stock_ledger_created'):
-			self._stock_ledger_created = len(frappe.db.sql("""select name from `tabStock Ledger Entry`
-				where item_code = %s and is_cancelled = 0 limit 1""", self.name))
+		if not hasattr(self, "_stock_ledger_created"):
+			self._stock_ledger_created = len(
+				frappe.db.sql(
+					"""select name from `tabStock Ledger Entry`
+				where item_code = %s and is_cancelled = 0 limit 1""",
+					self.name,
+				)
+			)
 		return self._stock_ledger_created
 
 	def update_item_price(self):
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 				UPDATE `tabItem Price`
 				SET
 					item_name=%(item_name)s,
@@ -382,8 +438,8 @@
 				item_name=self.item_name,
 				item_description=self.description,
 				brand=self.brand,
-				item_code=self.name
-			)
+				item_code=self.name,
+			),
 		)
 
 	def on_trash(self):
@@ -405,8 +461,11 @@
 	def after_rename(self, old_name, new_name, merge):
 		if merge:
 			self.validate_duplicate_item_in_stock_reconciliation(old_name, new_name)
-			frappe.msgprint(_("It can take upto few hours for accurate stock values to be visible after merging items."),
-					indicator="orange", title="Note")
+			frappe.msgprint(
+				_("It can take upto few hours for accurate stock values to be visible after merging items."),
+				indicator="orange",
+				title="Note",
+			)
 
 		if self.published_in_website:
 			invalidate_cache_for_item(self)
@@ -418,39 +477,54 @@
 			self.recalculate_bin_qty(new_name)
 
 		for dt in ("Sales Taxes and Charges", "Purchase Taxes and Charges"):
-			for d in frappe.db.sql("""select name, item_wise_tax_detail from `tab{0}`
-					where ifnull(item_wise_tax_detail, '') != ''""".format(dt), as_dict=1):
+			for d in frappe.db.sql(
+				"""select name, item_wise_tax_detail from `tab{0}`
+					where ifnull(item_wise_tax_detail, '') != ''""".format(
+					dt
+				),
+				as_dict=1,
+			):
 
 				item_wise_tax_detail = json.loads(d.item_wise_tax_detail)
 				if isinstance(item_wise_tax_detail, dict) and old_name in item_wise_tax_detail:
 					item_wise_tax_detail[new_name] = item_wise_tax_detail[old_name]
 					item_wise_tax_detail.pop(old_name)
 
-					frappe.db.set_value(dt, d.name, "item_wise_tax_detail",
-											json.dumps(item_wise_tax_detail), update_modified=False)
+					frappe.db.set_value(
+						dt, d.name, "item_wise_tax_detail", json.dumps(item_wise_tax_detail), update_modified=False
+					)
 
 	def delete_old_bins(self, old_name):
 		frappe.db.delete("Bin", {"item_code": old_name})
 
 	def validate_duplicate_item_in_stock_reconciliation(self, old_name, new_name):
-		records = frappe.db.sql(""" SELECT parent, COUNT(*) as records
+		records = frappe.db.sql(
+			""" SELECT parent, COUNT(*) as records
 			FROM `tabStock Reconciliation Item`
 			WHERE item_code = %s and docstatus = 1
 			GROUP By item_code, warehouse, parent
 			HAVING records > 1
-		""", new_name, as_dict=1)
+		""",
+			new_name,
+			as_dict=1,
+		)
 
-		if not records: return
+		if not records:
+			return
 		document = _("Stock Reconciliation") if len(records) == 1 else _("Stock Reconciliations")
 
 		msg = _("The items {0} and {1} are present in the following {2} :").format(
-			frappe.bold(old_name), frappe.bold(new_name), document)
+			frappe.bold(old_name), frappe.bold(new_name), document
+		)
 
-		msg += ' <br>'
-		msg += ', '.join([get_link_to_form("Stock Reconciliation", d.parent) for d in records]) + "<br><br>"
+		msg += " <br>"
+		msg += (
+			", ".join([get_link_to_form("Stock Reconciliation", d.parent) for d in records]) + "<br><br>"
+		)
 
-		msg += _("Note: To merge the items, create a separate Stock Reconciliation for the old item {0}").format(
-			frappe.bold(old_name))
+		msg += _(
+			"Note: To merge the items, create a separate Stock Reconciliation for the old item {0}"
+		).format(frappe.bold(old_name))
 
 		frappe.throw(_(msg), title=_("Cannot Merge"), exc=DataValidationError)
 
@@ -469,8 +543,8 @@
 
 	def validate_duplicate_product_bundles_before_merge(self, old_name, new_name):
 		"Block merge if both old and new items have product bundles."
-		old_bundle = frappe.get_value("Product Bundle",filters={"new_item_code": old_name})
-		new_bundle = frappe.get_value("Product Bundle",filters={"new_item_code": new_name})
+		old_bundle = frappe.get_value("Product Bundle", filters={"new_item_code": old_name})
+		new_bundle = frappe.get_value("Product Bundle", filters={"new_item_code": new_name})
 
 		if old_bundle and new_bundle:
 			bundle_link = get_link_to_form("Product Bundle", old_bundle)
@@ -483,15 +557,14 @@
 
 	def validate_duplicate_website_item_before_merge(self, old_name, new_name):
 		"""
-			Block merge if both old and new items have website items against them.
-			This is to avoid duplicate website items after merging.
+		Block merge if both old and new items have website items against them.
+		This is to avoid duplicate website items after merging.
 		"""
 		web_items = frappe.get_all(
 			"Website Item",
-			filters={
-				"item_code": ["in", [old_name, new_name]]
-			},
-			fields=["item_code", "name"])
+			filters={"item_code": ["in", [old_name, new_name]]},
+			fields=["item_code", "name"],
+		)
 
 		if len(web_items) <= 1:
 			return
@@ -509,11 +582,19 @@
 
 	def recalculate_bin_qty(self, new_name):
 		from erpnext.stock.stock_balance import repost_stock
-		existing_allow_negative_stock = frappe.db.get_value("Stock Settings", None, "allow_negative_stock")
+
+		existing_allow_negative_stock = frappe.db.get_value(
+			"Stock Settings", None, "allow_negative_stock"
+		)
 		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
 
-		repost_stock_for_warehouses = frappe.get_all("Stock Ledger Entry",
-				"warehouse", filters={"item_code": new_name}, pluck="warehouse", distinct=True)
+		repost_stock_for_warehouses = frappe.get_all(
+			"Stock Ledger Entry",
+			"warehouse",
+			filters={"item_code": new_name},
+			pluck="warehouse",
+			distinct=True,
+		)
 
 		# Delete all existing bins to avoid duplicate bins for the same item and warehouse
 		frappe.db.delete("Bin", {"item_code": new_name})
@@ -521,30 +602,41 @@
 		for warehouse in repost_stock_for_warehouses:
 			repost_stock(new_name, warehouse)
 
-		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock)
+		frappe.db.set_value(
+			"Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock
+		)
 
 	def update_bom_item_desc(self):
 		if self.is_new():
 			return
 
-		if self.db_get('description') != self.description:
-			frappe.db.sql("""
+		if self.db_get("description") != self.description:
+			frappe.db.sql(
+				"""
 				update `tabBOM`
 				set description = %s
 				where item = %s and docstatus < 2
-			""", (self.description, self.name))
+			""",
+				(self.description, self.name),
+			)
 
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				update `tabBOM Item`
 				set description = %s
 				where item_code = %s and docstatus < 2
-			""", (self.description, self.name))
+			""",
+				(self.description, self.name),
+			)
 
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				update `tabBOM Explosion Item`
 				set description = %s
 				where item_code = %s and docstatus < 2
-			""", (self.description, self.name))
+			""",
+				(self.description, self.name),
+			)
 
 	def validate_item_defaults(self):
 		companies = {row.company for row in self.item_defaults}
@@ -554,41 +646,61 @@
 
 		validate_item_default_company_links(self.item_defaults)
 
-
 	def update_defaults_from_item_group(self):
 		"""Get defaults from Item Group"""
 		if self.item_defaults or not self.item_group:
 			return
 
-		item_defaults = frappe.db.get_values("Item Default", {"parent": self.item_group},
-			['company', 'default_warehouse','default_price_list','buying_cost_center','default_supplier',
-			'expense_account','selling_cost_center','income_account'], as_dict = 1)
+		item_defaults = frappe.db.get_values(
+			"Item Default",
+			{"parent": self.item_group},
+			[
+				"company",
+				"default_warehouse",
+				"default_price_list",
+				"buying_cost_center",
+				"default_supplier",
+				"expense_account",
+				"selling_cost_center",
+				"income_account",
+			],
+			as_dict=1,
+		)
 		if item_defaults:
 			for item in item_defaults:
-				self.append('item_defaults', {
-					'company': item.company,
-					'default_warehouse': item.default_warehouse,
-					'default_price_list': item.default_price_list,
-					'buying_cost_center': item.buying_cost_center,
-					'default_supplier': item.default_supplier,
-					'expense_account': item.expense_account,
-					'selling_cost_center': item.selling_cost_center,
-					'income_account': item.income_account
-				})
+				self.append(
+					"item_defaults",
+					{
+						"company": item.company,
+						"default_warehouse": item.default_warehouse,
+						"default_price_list": item.default_price_list,
+						"buying_cost_center": item.buying_cost_center,
+						"default_supplier": item.default_supplier,
+						"expense_account": item.expense_account,
+						"selling_cost_center": item.selling_cost_center,
+						"income_account": item.income_account,
+					},
+				)
 		else:
 			defaults = frappe.defaults.get_defaults() or {}
 
 			# To check default warehouse is belong to the default company
-			if defaults.get("default_warehouse") and defaults.company and frappe.db.exists("Warehouse",
-				{'name': defaults.default_warehouse, 'company': defaults.company}):
-					self.append("item_defaults", {
-						"company": defaults.get("company"),
-						"default_warehouse": defaults.default_warehouse
-					})
+			if (
+				defaults.get("default_warehouse")
+				and defaults.company
+				and frappe.db.exists(
+					"Warehouse", {"name": defaults.default_warehouse, "company": defaults.company}
+				)
+			):
+				self.append(
+					"item_defaults",
+					{"company": defaults.get("company"), "default_warehouse": defaults.default_warehouse},
+				)
 
 	def update_variants(self):
-		if self.flags.dont_update_variants or \
-						frappe.db.get_single_value('Item Variant Settings', 'do_not_update_variants'):
+		if self.flags.dont_update_variants or frappe.db.get_single_value(
+			"Item Variant Settings", "do_not_update_variants"
+		):
 			return
 		if self.has_variants:
 			variants = frappe.db.get_all("Item", fields=["item_code"], filters={"variant_of": self.name})
@@ -597,8 +709,13 @@
 					update_variants(variants, self, publish_progress=False)
 					frappe.msgprint(_("Item Variants updated"))
 				else:
-					frappe.enqueue("erpnext.stock.doctype.item.item.update_variants",
-						variants=variants, template=self, now=frappe.flags.in_test, timeout=600)
+					frappe.enqueue(
+						"erpnext.stock.doctype.item.item.update_variants",
+						variants=variants,
+						template=self,
+						now=frappe.flags.in_test,
+						timeout=600,
+					)
 
 	def validate_has_variants(self):
 		if not self.has_variants and frappe.db.get_value("Item", self.name, "has_variants"):
@@ -630,11 +747,8 @@
 		# fetch all attributes of these items
 		item_attributes = frappe.get_all(
 			"Item Variant Attribute",
-			filters={
-				"parent": ["in", items],
-				"attribute": ["in", deleted_attribute]
-			},
-			fields=["attribute", "parent"]
+			filters={"parent": ["in", items], "attribute": ["in", deleted_attribute]},
+			fields=["attribute", "parent"],
 		)
 		not_included = defaultdict(list)
 
@@ -653,14 +767,18 @@
 			return """<tr>
 				<td>{0}</td>
 				<td>{1}</td>
-			</tr>""".format(title, body)
+			</tr>""".format(
+				title, body
+			)
 
-		rows = ''
+		rows = ""
 		for docname, attr_list in not_included.items():
 			link = "<a href='/app/Form/Item/{0}'>{0}</a>".format(frappe.bold(_(docname)))
 			rows += table_row(link, body(attr_list))
 
-		error_description = _('The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template.')
+		error_description = _(
+			"The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template."
+		)
 
 		message = """
 			<div>{0}</div><br>
@@ -671,25 +789,37 @@
 				</thead>
 				{3}
 			</table>
-		""".format(error_description, _('Variant Items'), _('Attributes'), rows)
+		""".format(
+			error_description, _("Variant Items"), _("Attributes"), rows
+		)
 
 		frappe.throw(message, title=_("Variant Attribute Error"), is_minimizable=True, wide=True)
 
-
 	def validate_stock_exists_for_template_item(self):
 		if self.stock_ledger_created() and self._doc_before_save:
-			if (cint(self._doc_before_save.has_variants) != cint(self.has_variants)
-				or self._doc_before_save.variant_of != self.variant_of):
-				frappe.throw(_("Cannot change Variant properties after stock transaction. You will have to make a new Item to do this.").format(self.name),
-					StockExistsForTemplate)
+			if (
+				cint(self._doc_before_save.has_variants) != cint(self.has_variants)
+				or self._doc_before_save.variant_of != self.variant_of
+			):
+				frappe.throw(
+					_(
+						"Cannot change Variant properties after stock transaction. You will have to make a new Item to do this."
+					).format(self.name),
+					StockExistsForTemplate,
+				)
 
 			if self.has_variants or self.variant_of:
-				if not self.is_child_table_same('attributes'):
+				if not self.is_child_table_same("attributes"):
 					frappe.throw(
-						_('Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item'))
+						_(
+							"Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item"
+						)
+					)
 
 	def validate_variant_based_on_change(self):
-		if not self.is_new() and (self.variant_of or (self.has_variants and frappe.get_all("Item", {"variant_of": self.name}))):
+		if not self.is_new() and (
+			self.variant_of or (self.has_variants and frappe.get_all("Item", {"variant_of": self.name}))
+		):
 			if self.variant_based_on != frappe.db.get_value("Item", self.name, "variant_based_on"):
 				frappe.throw(_("Variant Based On cannot be changed"))
 
@@ -702,8 +832,11 @@
 		if self.variant_of:
 			template_uom = frappe.db.get_value("Item", self.variant_of, "stock_uom")
 			if template_uom != self.stock_uom:
-				frappe.throw(_("Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'")
-									.format(self.stock_uom, template_uom))
+				frappe.throw(
+					_("Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'").format(
+						self.stock_uom, template_uom
+					)
+				)
 
 	def validate_uom_conversion_factor(self):
 		if self.uoms:
@@ -717,21 +850,22 @@
 			return
 
 		if not self.variant_based_on:
-			self.variant_based_on = 'Item Attribute'
+			self.variant_based_on = "Item Attribute"
 
-		if self.variant_based_on == 'Item Attribute':
+		if self.variant_based_on == "Item Attribute":
 			attributes = []
 			if not self.attributes:
 				frappe.throw(_("Attribute table is mandatory"))
 			for d in self.attributes:
 				if d.attribute in attributes:
 					frappe.throw(
-						_("Attribute {0} selected multiple times in Attributes Table").format(d.attribute))
+						_("Attribute {0} selected multiple times in Attributes Table").format(d.attribute)
+					)
 				else:
 					attributes.append(d.attribute)
 
 	def validate_variant_attributes(self):
-		if self.is_new() and self.variant_of and self.variant_based_on == 'Item Attribute':
+		if self.is_new() and self.variant_of and self.variant_based_on == "Item Attribute":
 			# remove attributes with no attribute_value set
 			self.attributes = [d for d in self.attributes if cstr(d.attribute_value).strip()]
 
@@ -742,8 +876,9 @@
 
 			variant = get_variant(self.variant_of, args, self.name)
 			if variant:
-				frappe.throw(_("Item variant {0} exists with same attributes")
-					.format(variant), ItemVariantExistsError)
+				frappe.throw(
+					_("Item variant {0} exists with same attributes").format(variant), ItemVariantExistsError
+				)
 
 			validate_item_variant_attributes(self, args)
 
@@ -758,31 +893,52 @@
 		fields = ("has_serial_no", "is_stock_item", "valuation_method", "has_batch_no")
 
 		values = frappe.db.get_value("Item", self.name, fields, as_dict=True)
-		if not values.get('valuation_method') and self.get('valuation_method'):
-			values['valuation_method'] = frappe.db.get_single_value("Stock Settings", "valuation_method") or "FIFO"
+		if not values.get("valuation_method") and self.get("valuation_method"):
+			values["valuation_method"] = (
+				frappe.db.get_single_value("Stock Settings", "valuation_method") or "FIFO"
+			)
 
 		if values:
 			for field in fields:
 				if cstr(self.get(field)) != cstr(values.get(field)):
 					if self.check_if_linked_document_exists(field):
-						frappe.throw(_("As there are existing transactions against item {0}, you can not change the value of {1}").format(self.name, frappe.bold(self.meta.get_label(field))))
+						frappe.throw(
+							_(
+								"As there are existing transactions against item {0}, you can not change the value of {1}"
+							).format(self.name, frappe.bold(self.meta.get_label(field)))
+						)
 
 	def check_if_linked_document_exists(self, field):
-		linked_doctypes = ["Delivery Note Item", "Sales Invoice Item", "POS Invoice Item", "Purchase Receipt Item",
-			"Purchase Invoice Item", "Stock Entry Detail", "Stock Reconciliation Item"]
+		linked_doctypes = [
+			"Delivery Note Item",
+			"Sales Invoice Item",
+			"POS Invoice Item",
+			"Purchase Receipt Item",
+			"Purchase Invoice Item",
+			"Stock Entry Detail",
+			"Stock Reconciliation Item",
+		]
 
 		# For "Is Stock Item", following doctypes is important
 		# because reserved_qty, ordered_qty and requested_qty updated from these doctypes
 		if field == "is_stock_item":
-			linked_doctypes += ["Sales Order Item", "Purchase Order Item", "Material Request Item", "Product Bundle"]
+			linked_doctypes += [
+				"Sales Order Item",
+				"Purchase Order Item",
+				"Material Request Item",
+				"Product Bundle",
+			]
 
 		for doctype in linked_doctypes:
-			filters={"item_code": self.name, "docstatus": 1}
+			filters = {"item_code": self.name, "docstatus": 1}
 
 			if doctype == "Product Bundle":
-				filters={"new_item_code": self.name}
+				filters = {"new_item_code": self.name}
 
-			if doctype in ("Purchase Invoice Item", "Sales Invoice Item",):
+			if doctype in (
+				"Purchase Invoice Item",
+				"Sales Invoice Item",
+			):
 				# If Invoice has Stock impact, only then consider it.
 				if self.stock_ledger_created():
 					return True
@@ -792,37 +948,48 @@
 
 	def validate_auto_reorder_enabled_in_stock_settings(self):
 		if self.reorder_levels:
-			enabled = frappe.db.get_single_value('Stock Settings', 'auto_indent')
+			enabled = frappe.db.get_single_value("Stock Settings", "auto_indent")
 			if not enabled:
-				frappe.msgprint(msg=_("You have to enable auto re-order in Stock Settings to maintain re-order levels."), title=_("Enable Auto Re-Order"), indicator="orange")
+				frappe.msgprint(
+					msg=_("You have to enable auto re-order in Stock Settings to maintain re-order levels."),
+					title=_("Enable Auto Re-Order"),
+					indicator="orange",
+				)
 
 
 def make_item_price(item, price_list_name, item_price):
-	frappe.get_doc({
-		'doctype': 'Item Price',
-		'price_list': price_list_name,
-		'item_code': item,
-		'price_list_rate': item_price
-	}).insert()
+	frappe.get_doc(
+		{
+			"doctype": "Item Price",
+			"price_list": price_list_name,
+			"item_code": item,
+			"price_list_rate": item_price,
+		}
+	).insert()
+
 
 def get_timeline_data(doctype, name):
 	"""get timeline data based on Stock Ledger Entry. This is displayed as heatmap on the item page."""
 
-	items = frappe.db.sql("""select unix_timestamp(posting_date), count(*)
+	items = frappe.db.sql(
+		"""select unix_timestamp(posting_date), count(*)
 							from `tabStock Ledger Entry`
 							where item_code=%s and posting_date > date_sub(curdate(), interval 1 year)
-							group by posting_date""", name)
+							group by posting_date""",
+		name,
+	)
 
 	return dict(items)
 
 
-
 def validate_end_of_life(item_code, end_of_life=None, disabled=None):
 	if (not end_of_life) or (disabled is None):
 		end_of_life, disabled = frappe.db.get_value("Item", item_code, ["end_of_life", "disabled"])
 
 	if end_of_life and end_of_life != "0000-00-00" and getdate(end_of_life) <= now_datetime().date():
-		frappe.throw(_("Item {0} has reached its end of life on {1}").format(item_code, formatdate(end_of_life)))
+		frappe.throw(
+			_("Item {0} has reached its end of life on {1}").format(item_code, formatdate(end_of_life))
+		)
 
 	if disabled:
 		frappe.throw(_("Item {0} is disabled").format(item_code))
@@ -843,11 +1010,13 @@
 	if docstatus == 2:
 		frappe.throw(_("Item {0} is cancelled").format(item_code))
 
+
 def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
 	"""returns last purchase details in stock uom"""
 	# get last purchase order item details
 
-	last_purchase_order = frappe.db.sql("""\
+	last_purchase_order = frappe.db.sql(
+		"""\
 		select po.name, po.transaction_date, po.conversion_rate,
 			po_item.conversion_factor, po_item.base_price_list_rate,
 			po_item.discount_percentage, po_item.base_rate, po_item.base_net_rate
@@ -855,11 +1024,14 @@
 		where po.docstatus = 1 and po_item.item_code = %s and po.name != %s and
 			po.name = po_item.parent
 		order by po.transaction_date desc, po.name desc
-		limit 1""", (item_code, cstr(doc_name)), as_dict=1)
-
+		limit 1""",
+		(item_code, cstr(doc_name)),
+		as_dict=1,
+	)
 
 	# get last purchase receipt item details
-	last_purchase_receipt = frappe.db.sql("""\
+	last_purchase_receipt = frappe.db.sql(
+		"""\
 		select pr.name, pr.posting_date, pr.posting_time, pr.conversion_rate,
 			pr_item.conversion_factor, pr_item.base_price_list_rate, pr_item.discount_percentage,
 			pr_item.base_rate, pr_item.base_net_rate
@@ -867,20 +1039,29 @@
 		where pr.docstatus = 1 and pr_item.item_code = %s and pr.name != %s and
 			pr.name = pr_item.parent
 		order by pr.posting_date desc, pr.posting_time desc, pr.name desc
-		limit 1""", (item_code, cstr(doc_name)), as_dict=1)
+		limit 1""",
+		(item_code, cstr(doc_name)),
+		as_dict=1,
+	)
 
-	purchase_order_date = getdate(last_purchase_order and last_purchase_order[0].transaction_date
-							   or "1900-01-01")
-	purchase_receipt_date = getdate(last_purchase_receipt and
-								 last_purchase_receipt[0].posting_date or "1900-01-01")
+	purchase_order_date = getdate(
+		last_purchase_order and last_purchase_order[0].transaction_date or "1900-01-01"
+	)
+	purchase_receipt_date = getdate(
+		last_purchase_receipt and last_purchase_receipt[0].posting_date or "1900-01-01"
+	)
 
-	if last_purchase_order and (purchase_order_date >= purchase_receipt_date or not last_purchase_receipt):
+	if last_purchase_order and (
+		purchase_order_date >= purchase_receipt_date or not last_purchase_receipt
+	):
 		# use purchase order
 
 		last_purchase = last_purchase_order[0]
 		purchase_date = purchase_order_date
 
-	elif last_purchase_receipt and (purchase_receipt_date > purchase_order_date or not last_purchase_order):
+	elif last_purchase_receipt and (
+		purchase_receipt_date > purchase_order_date or not last_purchase_order
+	):
 		# use purchase receipt
 		last_purchase = last_purchase_receipt[0]
 		purchase_date = purchase_receipt_date
@@ -889,22 +1070,25 @@
 		return frappe._dict()
 
 	conversion_factor = flt(last_purchase.conversion_factor)
-	out = frappe._dict({
-		"base_price_list_rate": flt(last_purchase.base_price_list_rate) / conversion_factor,
-		"base_rate": flt(last_purchase.base_rate) / conversion_factor,
-		"base_net_rate": flt(last_purchase.base_net_rate) / conversion_factor,
-		"discount_percentage": flt(last_purchase.discount_percentage),
-		"purchase_date": purchase_date
-	})
-
+	out = frappe._dict(
+		{
+			"base_price_list_rate": flt(last_purchase.base_price_list_rate) / conversion_factor,
+			"base_rate": flt(last_purchase.base_rate) / conversion_factor,
+			"base_net_rate": flt(last_purchase.base_net_rate) / conversion_factor,
+			"discount_percentage": flt(last_purchase.discount_percentage),
+			"purchase_date": purchase_date,
+		}
+	)
 
 	conversion_rate = flt(conversion_rate) or 1.0
-	out.update({
-		"price_list_rate": out.base_price_list_rate / conversion_rate,
-		"rate": out.base_rate / conversion_rate,
-		"base_rate": out.base_rate,
-		"base_net_rate": out.base_net_rate
-	})
+	out.update(
+		{
+			"price_list_rate": out.base_price_list_rate / conversion_rate,
+			"rate": out.base_rate / conversion_rate,
+			"base_rate": out.base_rate,
+			"base_net_rate": out.base_net_rate,
+		}
+	)
 
 	return out
 
@@ -927,39 +1111,51 @@
 	is_web_item = doc.get("published_in_website") or doc.get("published")
 	if doc.has_variants and is_web_item:
 		item_code = doc.item_code
-	elif doc.variant_of and frappe.db.get_value('Item', doc.variant_of, 'published_in_website'):
+	elif doc.variant_of and frappe.db.get_value("Item", doc.variant_of, "published_in_website"):
 		item_code = doc.variant_of
 
 	if item_code:
 		item_cache = ItemVariantsCacheManager(item_code)
 		item_cache.rebuild_cache()
 
+
 def check_stock_uom_with_bin(item, stock_uom):
 	if stock_uom == frappe.db.get_value("Item", item, "stock_uom"):
 		return
 
-	ref_uom = frappe.db.get_value("Stock Ledger Entry",
-							   {"item_code": item}, "stock_uom")
+	ref_uom = frappe.db.get_value("Stock Ledger Entry", {"item_code": item}, "stock_uom")
 
 	if ref_uom:
 		if cstr(ref_uom) != cstr(stock_uom):
-			frappe.throw(_("Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM.").format(item))
+			frappe.throw(
+				_(
+					"Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM."
+				).format(item)
+			)
 
-	bin_list = frappe.db.sql("""
+	bin_list = frappe.db.sql(
+		"""
 			select * from tabBin where item_code = %s
 				and (reserved_qty > 0 or ordered_qty > 0 or indented_qty > 0 or planned_qty > 0)
 				and stock_uom != %s
-			""", (item, stock_uom), as_dict=1)
+			""",
+		(item, stock_uom),
+		as_dict=1,
+	)
 
 	if bin_list:
-		frappe.throw(_("Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item.").format(item))
+		frappe.throw(
+			_(
+				"Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item."
+			).format(item)
+		)
 
 	# No SLE or documents against item. Bin UOM can be changed safely.
 	frappe.db.sql("""update tabBin set stock_uom=%s where item_code=%s""", (stock_uom, item))
 
 
 def get_item_defaults(item_code, company):
-	item = frappe.get_cached_doc('Item', item_code)
+	item = frappe.get_cached_doc("Item", item_code)
 
 	out = item.as_dict()
 
@@ -970,8 +1166,9 @@
 			out.update(row)
 	return out
 
+
 def set_item_default(item_code, company, fieldname, value):
-	item = frappe.get_cached_doc('Item', item_code)
+	item = frappe.get_cached_doc("Item", item_code)
 
 	for d in item.item_defaults:
 		if d.company == company:
@@ -980,10 +1177,11 @@
 			return
 
 	# no row found, add a new row for the company
-	d = item.append('item_defaults', {fieldname: value, "company": company})
+	d = item.append("item_defaults", {fieldname: value, "company": company})
 	d.db_insert()
 	item.clear_cache()
 
+
 @frappe.whitelist()
 def get_item_details(item_code, company=None):
 	out = frappe._dict()
@@ -995,30 +1193,36 @@
 
 	return out
 
+
 @frappe.whitelist()
 def get_uom_conv_factor(uom, stock_uom):
-	""" Get UOM conversion factor from uom to stock_uom
-		e.g. uom = "Kg", stock_uom = "Gram" then returns 1000.0
+	"""Get UOM conversion factor from uom to stock_uom
+	e.g. uom = "Kg", stock_uom = "Gram" then returns 1000.0
 	"""
 	if uom == stock_uom:
 		return 1.0
 
-	from_uom, to_uom = uom, stock_uom	# renaming for readability
+	from_uom, to_uom = uom, stock_uom  # renaming for readability
 
-	exact_match = frappe.db.get_value("UOM Conversion Factor", {"to_uom": to_uom, "from_uom": from_uom}, ["value"], as_dict=1)
+	exact_match = frappe.db.get_value(
+		"UOM Conversion Factor", {"to_uom": to_uom, "from_uom": from_uom}, ["value"], as_dict=1
+	)
 	if exact_match:
 		return exact_match.value
 
-	inverse_match = frappe.db.get_value("UOM Conversion Factor", {"to_uom": from_uom, "from_uom": to_uom}, ["value"], as_dict=1)
+	inverse_match = frappe.db.get_value(
+		"UOM Conversion Factor", {"to_uom": from_uom, "from_uom": to_uom}, ["value"], as_dict=1
+	)
 	if inverse_match:
 		return 1 / inverse_match.value
 
 	# This attempts to try and get conversion from intermediate UOM.
 	# case:
-	#			 g -> mg = 1000
-	#			 g -> kg = 0.001
+	# 			 g -> mg = 1000
+	# 			 g -> kg = 0.001
 	# therefore	 kg -> mg = 1000  / 0.001 = 1,000,000
-	intermediate_match = frappe.db.sql("""
+	intermediate_match = frappe.db.sql(
+		"""
 			select (first.value / second.value) as value
 			from `tabUOM Conversion Factor` first
 			join `tabUOM Conversion Factor` second
@@ -1027,7 +1231,10 @@
 				first.to_uom = %(to_uom)s
 				and second.to_uom = %(from_uom)s
 			limit 1
-			""", {"to_uom": to_uom, "from_uom": from_uom}, as_dict=1)
+			""",
+		{"to_uom": to_uom, "from_uom": from_uom},
+		as_dict=1,
+	)
 
 	if intermediate_match:
 		return intermediate_match[0].value
@@ -1039,8 +1246,12 @@
 	if not frappe.has_permission("Item"):
 		frappe.throw(_("No Permission"))
 
-	return frappe.get_all("Item Attribute Value", fields = ["attribute_value"],
-		filters = {'parent': parent, 'attribute_value': ("like", f"%{attribute_value}%")})
+	return frappe.get_all(
+		"Item Attribute Value",
+		fields=["attribute_value"],
+		filters={"parent": parent, "attribute_value": ("like", f"%{attribute_value}%")},
+	)
+
 
 def update_variants(variants, template, publish_progress=True):
 	total = len(variants)
@@ -1051,6 +1262,7 @@
 		if publish_progress:
 			frappe.publish_progress(count / total * 100, title=_("Updating Variants..."))
 
+
 @erpnext.allow_regional
 def set_item_tax_from_hsn_code(item):
 	pass
@@ -1059,23 +1271,25 @@
 def validate_item_default_company_links(item_defaults: List[ItemDefault]) -> None:
 	for item_default in item_defaults:
 		for doctype, field in [
-			['Warehouse', 'default_warehouse'],
-			['Cost Center', 'buying_cost_center'],
-			['Cost Center', 'selling_cost_center'],
-			['Account', 'expense_account'],
-			['Account', 'income_account']
+			["Warehouse", "default_warehouse"],
+			["Cost Center", "buying_cost_center"],
+			["Cost Center", "selling_cost_center"],
+			["Account", "expense_account"],
+			["Account", "income_account"],
 		]:
 			if item_default.get(field):
-				company = frappe.db.get_value(doctype, item_default.get(field), 'company', cache=True)
+				company = frappe.db.get_value(doctype, item_default.get(field), "company", cache=True)
 				if company and company != item_default.company:
-					frappe.throw(_("Row #{}: {} {} doesn't belong to Company {}. Please select valid {}.")
-						.format(
+					frappe.throw(
+						_("Row #{}: {} {} doesn't belong to Company {}. Please select valid {}.").format(
 							item_default.idx,
 							doctype,
 							frappe.bold(item_default.get(field)),
 							frappe.bold(item_default.company),
-							frappe.bold(frappe.unscrub(field))
-						), title=_("Invalid Item Defaults"))
+							frappe.bold(frappe.unscrub(field)),
+						),
+						title=_("Invalid Item Defaults"),
+					)
 
 
 @frappe.whitelist()
@@ -1083,4 +1297,3 @@
 	from erpnext.assets.doctype.asset.asset import get_asset_naming_series
 
 	return get_asset_naming_series()
-
diff --git a/erpnext/stock/doctype/item/item_dashboard.py b/erpnext/stock/doctype/item/item_dashboard.py
index e16f5bb..33acf4b 100644
--- a/erpnext/stock/doctype/item/item_dashboard.py
+++ b/erpnext/stock/doctype/item/item_dashboard.py
@@ -3,45 +3,34 @@
 
 def get_data():
 	return {
-		'heatmap': True,
-		'heatmap_message': _('This is based on stock movement. See {0} for details')\
-			.format('<a href="#query-report/Stock Ledger">' + _('Stock Ledger') + '</a>'),
-		'fieldname': 'item_code',
-		'non_standard_fieldnames': {
-			'Work Order': 'production_item',
-			'Product Bundle': 'new_item_code',
-			'BOM': 'item',
-			'Batch': 'item'
+		"heatmap": True,
+		"heatmap_message": _("This is based on stock movement. See {0} for details").format(
+			'<a href="#query-report/Stock Ledger">' + _("Stock Ledger") + "</a>"
+		),
+		"fieldname": "item_code",
+		"non_standard_fieldnames": {
+			"Work Order": "production_item",
+			"Product Bundle": "new_item_code",
+			"BOM": "item",
+			"Batch": "item",
 		},
-		'transactions': [
+		"transactions": [
+			{"label": _("Groups"), "items": ["BOM", "Product Bundle", "Item Alternative"]},
+			{"label": _("Pricing"), "items": ["Item Price", "Pricing Rule"]},
+			{"label": _("Sell"), "items": ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]},
 			{
-				'label': _('Groups'),
-				'items': ['BOM', 'Product Bundle', 'Item Alternative']
+				"label": _("Buy"),
+				"items": [
+					"Material Request",
+					"Supplier Quotation",
+					"Request for Quotation",
+					"Purchase Order",
+					"Purchase Receipt",
+					"Purchase Invoice",
+				],
 			},
-			{
-				'label': _('Pricing'),
-				'items': ['Item Price', 'Pricing Rule']
-			},
-			{
-				'label': _('Sell'),
-				'items': ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']
-			},
-			{
-				'label': _('Buy'),
-				'items': ['Material Request', 'Supplier Quotation', 'Request for Quotation',
-					'Purchase Order', 'Purchase Receipt', 'Purchase Invoice']
-			},
-			{
-				'label': _('Manufacture'),
-				'items': ['Production Plan', 'Work Order', 'Item Manufacturer']
-			},
-			{
-				'label': _('Traceability'),
-				'items': ['Serial No', 'Batch']
-			},
-			{
-				'label': _('Move'),
-				'items': ['Stock Entry']
-			}
-		]
+			{"label": _("Manufacture"), "items": ["Production Plan", "Work Order", "Item Manufacturer"]},
+			{"label": _("Traceability"), "items": ["Serial No", "Batch"]},
+			{"label": _("Move"), "items": ["Stock Entry"]},
+		],
 	}
diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py
index 05e6e76..328d937 100644
--- a/erpnext/stock/doctype/item/test_item.py
+++ b/erpnext/stock/doctype/item/test_item.py
@@ -30,6 +30,7 @@
 test_ignore = ["BOM"]
 test_dependencies = ["Warehouse", "Item Group", "Item Tax Template", "Brand", "Item Attribute"]
 
+
 def make_item(item_code=None, properties=None):
 	if not item_code:
 		item_code = frappe.generate_hash(length=16)
@@ -37,13 +38,15 @@
 	if frappe.db.exists("Item", item_code):
 		return frappe.get_doc("Item", item_code)
 
-	item = frappe.get_doc({
-		"doctype": "Item",
-		"item_code": item_code,
-		"item_name": item_code,
-		"description": item_code,
-		"item_group": "Products"
-	})
+	item = frappe.get_doc(
+		{
+			"doctype": "Item",
+			"item_code": item_code,
+			"item_name": item_code,
+			"description": item_code,
+			"item_group": "Products",
+		}
+	)
 
 	if properties:
 		item.update(properties)
@@ -56,6 +59,7 @@
 
 	return item
 
+
 class TestItem(FrappeTestCase):
 	def setUp(self):
 		super().setUp()
@@ -98,56 +102,91 @@
 		make_test_objects("Item Price")
 
 		company = "_Test Company"
-		currency = frappe.get_cached_value("Company",  company,  "default_currency")
+		currency = frappe.get_cached_value("Company", company, "default_currency")
 
-		details = get_item_details({
-			"item_code": "_Test Item",
-			"company": company,
-			"price_list": "_Test Price List",
-			"currency": currency,
-			"doctype": "Sales Order",
-			"conversion_rate": 1,
-			"price_list_currency": currency,
-			"plc_conversion_rate": 1,
-			"order_type": "Sales",
-			"customer": "_Test Customer",
-			"conversion_factor": 1,
-			"price_list_uom_dependant": 1,
-			"ignore_pricing_rule": 1
-		})
+		details = get_item_details(
+			{
+				"item_code": "_Test Item",
+				"company": company,
+				"price_list": "_Test Price List",
+				"currency": currency,
+				"doctype": "Sales Order",
+				"conversion_rate": 1,
+				"price_list_currency": currency,
+				"plc_conversion_rate": 1,
+				"order_type": "Sales",
+				"customer": "_Test Customer",
+				"conversion_factor": 1,
+				"price_list_uom_dependant": 1,
+				"ignore_pricing_rule": 1,
+			}
+		)
 
 		for key, value in to_check.items():
 			self.assertEqual(value, details.get(key))
 
 	def test_item_tax_template(self):
 		expected_item_tax_template = [
-			{"item_code": "_Test Item With Item Tax Template", "tax_category": "",
-				"item_tax_template": "_Test Account Excise Duty @ 10 - _TC"},
-			{"item_code": "_Test Item With Item Tax Template", "tax_category": "_Test Tax Category 1",
-				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC"},
-			{"item_code": "_Test Item With Item Tax Template", "tax_category": "_Test Tax Category 2",
-				"item_tax_template": None},
-
-			{"item_code": "_Test Item Inherit Group Item Tax Template 1", "tax_category": "",
-				"item_tax_template": "_Test Account Excise Duty @ 10 - _TC"},
-			{"item_code": "_Test Item Inherit Group Item Tax Template 1", "tax_category": "_Test Tax Category 1",
-				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC"},
-			{"item_code": "_Test Item Inherit Group Item Tax Template 1", "tax_category": "_Test Tax Category 2",
-				"item_tax_template": None},
-
-			{"item_code": "_Test Item Inherit Group Item Tax Template 2", "tax_category": "",
-				"item_tax_template": "_Test Account Excise Duty @ 15 - _TC"},
-			{"item_code": "_Test Item Inherit Group Item Tax Template 2", "tax_category": "_Test Tax Category 1",
-				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC"},
-			{"item_code": "_Test Item Inherit Group Item Tax Template 2", "tax_category": "_Test Tax Category 2",
-				"item_tax_template": None},
-
-			{"item_code": "_Test Item Override Group Item Tax Template", "tax_category": "",
-				"item_tax_template": "_Test Account Excise Duty @ 20 - _TC"},
-			{"item_code": "_Test Item Override Group Item Tax Template", "tax_category": "_Test Tax Category 1",
-				"item_tax_template": "_Test Item Tax Template 1 - _TC"},
-			{"item_code": "_Test Item Override Group Item Tax Template", "tax_category": "_Test Tax Category 2",
-				"item_tax_template": None},
+			{
+				"item_code": "_Test Item With Item Tax Template",
+				"tax_category": "",
+				"item_tax_template": "_Test Account Excise Duty @ 10 - _TC",
+			},
+			{
+				"item_code": "_Test Item With Item Tax Template",
+				"tax_category": "_Test Tax Category 1",
+				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC",
+			},
+			{
+				"item_code": "_Test Item With Item Tax Template",
+				"tax_category": "_Test Tax Category 2",
+				"item_tax_template": None,
+			},
+			{
+				"item_code": "_Test Item Inherit Group Item Tax Template 1",
+				"tax_category": "",
+				"item_tax_template": "_Test Account Excise Duty @ 10 - _TC",
+			},
+			{
+				"item_code": "_Test Item Inherit Group Item Tax Template 1",
+				"tax_category": "_Test Tax Category 1",
+				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC",
+			},
+			{
+				"item_code": "_Test Item Inherit Group Item Tax Template 1",
+				"tax_category": "_Test Tax Category 2",
+				"item_tax_template": None,
+			},
+			{
+				"item_code": "_Test Item Inherit Group Item Tax Template 2",
+				"tax_category": "",
+				"item_tax_template": "_Test Account Excise Duty @ 15 - _TC",
+			},
+			{
+				"item_code": "_Test Item Inherit Group Item Tax Template 2",
+				"tax_category": "_Test Tax Category 1",
+				"item_tax_template": "_Test Account Excise Duty @ 12 - _TC",
+			},
+			{
+				"item_code": "_Test Item Inherit Group Item Tax Template 2",
+				"tax_category": "_Test Tax Category 2",
+				"item_tax_template": None,
+			},
+			{
+				"item_code": "_Test Item Override Group Item Tax Template",
+				"tax_category": "",
+				"item_tax_template": "_Test Account Excise Duty @ 20 - _TC",
+			},
+			{
+				"item_code": "_Test Item Override Group Item Tax Template",
+				"tax_category": "_Test Tax Category 1",
+				"item_tax_template": "_Test Item Tax Template 1 - _TC",
+			},
+			{
+				"item_code": "_Test Item Override Group Item Tax Template",
+				"tax_category": "_Test Tax Category 2",
+				"item_tax_template": None,
+			},
 		]
 
 		expected_item_tax_map = {
@@ -156,43 +195,55 @@
 			"_Test Account Excise Duty @ 12 - _TC": {"_Test Account Excise Duty - _TC": 12},
 			"_Test Account Excise Duty @ 15 - _TC": {"_Test Account Excise Duty - _TC": 15},
 			"_Test Account Excise Duty @ 20 - _TC": {"_Test Account Excise Duty - _TC": 20},
-			"_Test Item Tax Template 1 - _TC": {"_Test Account Excise Duty - _TC": 5, "_Test Account Education Cess - _TC": 10,
-				"_Test Account S&H Education Cess - _TC": 15}
+			"_Test Item Tax Template 1 - _TC": {
+				"_Test Account Excise Duty - _TC": 5,
+				"_Test Account Education Cess - _TC": 10,
+				"_Test Account S&H Education Cess - _TC": 15,
+			},
 		}
 
 		for data in expected_item_tax_template:
-			details = get_item_details({
-				"item_code": data['item_code'],
-				"tax_category": data['tax_category'],
-				"company": "_Test Company",
-				"price_list": "_Test Price List",
-				"currency": "_Test Currency",
-				"doctype": "Sales Order",
-				"conversion_rate": 1,
-				"price_list_currency": "_Test Currency",
-				"plc_conversion_rate": 1,
-				"order_type": "Sales",
-				"customer": "_Test Customer",
-				"conversion_factor": 1,
-				"price_list_uom_dependant": 1,
-				"ignore_pricing_rule": 1
-			})
+			details = get_item_details(
+				{
+					"item_code": data["item_code"],
+					"tax_category": data["tax_category"],
+					"company": "_Test Company",
+					"price_list": "_Test Price List",
+					"currency": "_Test Currency",
+					"doctype": "Sales Order",
+					"conversion_rate": 1,
+					"price_list_currency": "_Test Currency",
+					"plc_conversion_rate": 1,
+					"order_type": "Sales",
+					"customer": "_Test Customer",
+					"conversion_factor": 1,
+					"price_list_uom_dependant": 1,
+					"ignore_pricing_rule": 1,
+				}
+			)
 
-			self.assertEqual(details.item_tax_template, data['item_tax_template'])
-			self.assertEqual(json.loads(details.item_tax_rate), expected_item_tax_map[details.item_tax_template])
+			self.assertEqual(details.item_tax_template, data["item_tax_template"])
+			self.assertEqual(
+				json.loads(details.item_tax_rate), expected_item_tax_map[details.item_tax_template]
+			)
 
 	def test_item_defaults(self):
 		frappe.delete_doc_if_exists("Item", "Test Item With Defaults", force=1)
-		make_item("Test Item With Defaults", {
-			"item_group": "_Test Item Group",
-			"brand": "_Test Brand With Item Defaults",
-			"item_defaults": [{
-				"company": "_Test Company",
-				"default_warehouse": "_Test Warehouse 2 - _TC",  # no override
-				"expense_account": "_Test Account Stock Expenses - _TC",  # override brand default
-				"buying_cost_center": "_Test Write Off Cost Center - _TC",  # override item group default
-			}]
-		})
+		make_item(
+			"Test Item With Defaults",
+			{
+				"item_group": "_Test Item Group",
+				"brand": "_Test Brand With Item Defaults",
+				"item_defaults": [
+					{
+						"company": "_Test Company",
+						"default_warehouse": "_Test Warehouse 2 - _TC",  # no override
+						"expense_account": "_Test Account Stock Expenses - _TC",  # override brand default
+						"buying_cost_center": "_Test Write Off Cost Center - _TC",  # override item group default
+					}
+				],
+			},
+		)
 
 		sales_item_check = {
 			"item_code": "Test Item With Defaults",
@@ -201,17 +252,19 @@
 			"expense_account": "_Test Account Stock Expenses - _TC",  # from item
 			"cost_center": "_Test Cost Center 2 - _TC",  # from item group
 		}
-		sales_item_details = get_item_details({
-			"item_code": "Test Item With Defaults",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Sales Invoice",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"customer": "_Test Customer",
-		})
+		sales_item_details = get_item_details(
+			{
+				"item_code": "Test Item With Defaults",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Sales Invoice",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"customer": "_Test Customer",
+			}
+		)
 		for key, value in sales_item_check.items():
 			self.assertEqual(value, sales_item_details.get(key))
 
@@ -220,38 +273,47 @@
 			"warehouse": "_Test Warehouse 2 - _TC",  # from item
 			"expense_account": "_Test Account Stock Expenses - _TC",  # from item
 			"income_account": "_Test Account Sales - _TC",  # from brand
-			"cost_center": "_Test Write Off Cost Center - _TC"  # from item
+			"cost_center": "_Test Write Off Cost Center - _TC",  # from item
 		}
-		purchase_item_details = get_item_details({
-			"item_code": "Test Item With Defaults",
-			"company": "_Test Company",
-			"price_list": "_Test Price List",
-			"currency": "_Test Currency",
-			"doctype": "Purchase Invoice",
-			"conversion_rate": 1,
-			"price_list_currency": "_Test Currency",
-			"plc_conversion_rate": 1,
-			"supplier": "_Test Supplier",
-		})
+		purchase_item_details = get_item_details(
+			{
+				"item_code": "Test Item With Defaults",
+				"company": "_Test Company",
+				"price_list": "_Test Price List",
+				"currency": "_Test Currency",
+				"doctype": "Purchase Invoice",
+				"conversion_rate": 1,
+				"price_list_currency": "_Test Currency",
+				"plc_conversion_rate": 1,
+				"supplier": "_Test Supplier",
+			}
+		)
 		for key, value in purchase_item_check.items():
 			self.assertEqual(value, purchase_item_details.get(key))
 
 	def test_item_default_validations(self):
 
 		with self.assertRaises(frappe.ValidationError) as ve:
-			make_item("Bad Item defaults", {
-				"item_group": "_Test Item Group",
-				"item_defaults": [{
-					"company": "_Test Company 1",
-					"default_warehouse": "_Test Warehouse - _TC",
-					"expense_account": "Stock In Hand - _TC",
-					"buying_cost_center": "_Test Cost Center - _TC",
-					"selling_cost_center": "_Test Cost Center - _TC",
-				}]
-			})
+			make_item(
+				"Bad Item defaults",
+				{
+					"item_group": "_Test Item Group",
+					"item_defaults": [
+						{
+							"company": "_Test Company 1",
+							"default_warehouse": "_Test Warehouse - _TC",
+							"expense_account": "Stock In Hand - _TC",
+							"buying_cost_center": "_Test Cost Center - _TC",
+							"selling_cost_center": "_Test Cost Center - _TC",
+						}
+					],
+				},
+			)
 
-		self.assertTrue("belong to company" in str(ve.exception).lower(),
-				msg="Mismatching company entities in item defaults should not be allowed.")
+		self.assertTrue(
+			"belong to company" in str(ve.exception).lower(),
+			msg="Mismatching company entities in item defaults should not be allowed.",
+		)
 
 	def test_item_attribute_change_after_variant(self):
 		frappe.delete_doc_if_exists("Item", "_Test Variant Item-L", force=1)
@@ -259,7 +321,7 @@
 		variant = create_variant("_Test Variant Item", {"Test Size": "Large"})
 		variant.save()
 
-		attribute = frappe.get_doc('Item Attribute', 'Test Size')
+		attribute = frappe.get_doc("Item Attribute", "Test Size")
 		attribute.item_attribute_values = []
 
 		# reset flags
@@ -282,20 +344,18 @@
 	def test_copy_fields_from_template_to_variants(self):
 		frappe.delete_doc_if_exists("Item", "_Test Variant Item-XL", force=1)
 
-		fields = [{'field_name': 'item_group'}, {'field_name': 'is_stock_item'}]
-		allow_fields = [d.get('field_name') for d in fields]
+		fields = [{"field_name": "item_group"}, {"field_name": "is_stock_item"}]
+		allow_fields = [d.get("field_name") for d in fields]
 		set_item_variant_settings(fields)
 
-		if not frappe.db.get_value('Item Attribute Value',
-			{'parent': 'Test Size', 'attribute_value': 'Extra Large'}, 'name'):
-			item_attribute = frappe.get_doc('Item Attribute', 'Test Size')
-			item_attribute.append('item_attribute_values', {
-				'attribute_value' : 'Extra Large',
-				'abbr': 'XL'
-			})
+		if not frappe.db.get_value(
+			"Item Attribute Value", {"parent": "Test Size", "attribute_value": "Extra Large"}, "name"
+		):
+			item_attribute = frappe.get_doc("Item Attribute", "Test Size")
+			item_attribute.append("item_attribute_values", {"attribute_value": "Extra Large", "abbr": "XL"})
 			item_attribute.save()
 
-		template = frappe.get_doc('Item', '_Test Variant Item')
+		template = frappe.get_doc("Item", "_Test Variant Item")
 		template.item_group = "_Test Item Group D"
 		template.save()
 
@@ -304,70 +364,71 @@
 		variant.item_name = "_Test Variant Item-XL"
 		variant.save()
 
-		variant = frappe.get_doc('Item', '_Test Variant Item-XL')
+		variant = frappe.get_doc("Item", "_Test Variant Item-XL")
 		for fieldname in allow_fields:
 			self.assertEqual(template.get(fieldname), variant.get(fieldname))
 
-		template = frappe.get_doc('Item', '_Test Variant Item')
+		template = frappe.get_doc("Item", "_Test Variant Item")
 		template.item_group = "_Test Item Group Desktops"
 		template.save()
 
 	def test_make_item_variant_with_numeric_values(self):
 		# cleanup
-		for d in frappe.db.get_all('Item', filters={'variant_of':
-				'_Test Numeric Template Item'}):
+		for d in frappe.db.get_all("Item", filters={"variant_of": "_Test Numeric Template Item"}):
 			frappe.delete_doc_if_exists("Item", d.name)
 
 		frappe.delete_doc_if_exists("Item", "_Test Numeric Template Item")
 		frappe.delete_doc_if_exists("Item Attribute", "Test Item Length")
 
-		frappe.db.sql('''delete from `tabItem Variant Attribute`
-			where attribute="Test Item Length"''')
+		frappe.db.sql(
+			'''delete from `tabItem Variant Attribute`
+			where attribute="Test Item Length"'''
+		)
 
 		frappe.flags.attribute_values = None
 
 		# make item attribute
-		frappe.get_doc({
-			"doctype": "Item Attribute",
-			"attribute_name": "Test Item Length",
-			"numeric_values": 1,
-			"from_range": 0.0,
-			"to_range": 100.0,
-			"increment": 0.5
-		}).insert()
+		frappe.get_doc(
+			{
+				"doctype": "Item Attribute",
+				"attribute_name": "Test Item Length",
+				"numeric_values": 1,
+				"from_range": 0.0,
+				"to_range": 100.0,
+				"increment": 0.5,
+			}
+		).insert()
 
 		# make template item
-		make_item("_Test Numeric Template Item", {
-			"attributes": [
-				{
-					"attribute": "Test Size"
-				},
-				{
-					"attribute": "Test Item Length",
-					"numeric_values": 1,
-					"from_range": 0.0,
-					"to_range": 100.0,
-					"increment": 0.5
-				}
-			],
-			"item_defaults": [
-				{
-					"default_warehouse": "_Test Warehouse - _TC",
-					"company": "_Test Company"
-				}
-			],
-			"has_variants": 1
-		})
+		make_item(
+			"_Test Numeric Template Item",
+			{
+				"attributes": [
+					{"attribute": "Test Size"},
+					{
+						"attribute": "Test Item Length",
+						"numeric_values": 1,
+						"from_range": 0.0,
+						"to_range": 100.0,
+						"increment": 0.5,
+					},
+				],
+				"item_defaults": [{"default_warehouse": "_Test Warehouse - _TC", "company": "_Test Company"}],
+				"has_variants": 1,
+			},
+		)
 
-		variant = create_variant("_Test Numeric Template Item",
-			{"Test Size": "Large", "Test Item Length": 1.1})
+		variant = create_variant(
+			"_Test Numeric Template Item", {"Test Size": "Large", "Test Item Length": 1.1}
+		)
 		self.assertEqual(variant.item_code, "_Test Numeric Template Item-L-1.1")
 		variant.item_code = "_Test Numeric Variant-L-1.1"
 		variant.item_name = "_Test Numeric Variant Large 1.1m"
 		self.assertRaises(InvalidItemAttributeValueError, variant.save)
 
-		variant = create_variant("_Test Numeric Template Item",
-			{"Test Size": "Large", "Test Item Length": 1.5})
+		variant = create_variant(
+			"_Test Numeric Template Item", {"Test Size": "Large", "Test Item Length": 1.5}
+		)
 		self.assertEqual(variant.item_code, "_Test Numeric Template Item-L-1.5")
 		variant.item_code = "_Test Numeric Variant-L-1.5"
 		variant.item_name = "_Test Numeric Variant Large 1.5m"
@@ -377,21 +438,20 @@
 		old = create_item(frappe.generate_hash(length=20)).name
 		new = create_item(frappe.generate_hash(length=20)).name
 
-		make_stock_entry(item_code=old, target="_Test Warehouse - _TC",
-			qty=1, rate=100)
-		make_stock_entry(item_code=old, target="_Test Warehouse 1 - _TC",
-			qty=1, rate=100)
-		make_stock_entry(item_code=new, target="_Test Warehouse 1 - _TC",
-			qty=1, rate=100)
+		make_stock_entry(item_code=old, target="_Test Warehouse - _TC", qty=1, rate=100)
+		make_stock_entry(item_code=old, target="_Test Warehouse 1 - _TC", qty=1, rate=100)
+		make_stock_entry(item_code=new, target="_Test Warehouse 1 - _TC", qty=1, rate=100)
 
 		frappe.rename_doc("Item", old, new, merge=True)
 
 		self.assertFalse(frappe.db.exists("Item", old))
 
-		self.assertTrue(frappe.db.get_value("Bin",
-			{"item_code": new, "warehouse": "_Test Warehouse - _TC"}))
-		self.assertTrue(frappe.db.get_value("Bin",
-			{"item_code": new, "warehouse": "_Test Warehouse 1 - _TC"}))
+		self.assertTrue(
+			frappe.db.get_value("Bin", {"item_code": new, "warehouse": "_Test Warehouse - _TC"})
+		)
+		self.assertTrue(
+			frappe.db.get_value("Bin", {"item_code": new, "warehouse": "_Test Warehouse 1 - _TC"})
+		)
 
 	def test_item_merging_with_product_bundle(self):
 		from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle
@@ -414,13 +474,12 @@
 		self.assertFalse(frappe.db.exists("Item", "Test Item Bundle Item 1"))
 
 	def test_uom_conversion_factor(self):
-		if frappe.db.exists('Item', 'Test Item UOM'):
-			frappe.delete_doc('Item', 'Test Item UOM')
+		if frappe.db.exists("Item", "Test Item UOM"):
+			frappe.delete_doc("Item", "Test Item UOM")
 
-		item_doc = make_item("Test Item UOM", {
-			"stock_uom": "Gram",
-			"uoms": [dict(uom='Carat'), dict(uom='Kg')]
-		})
+		item_doc = make_item(
+			"Test Item UOM", {"stock_uom": "Gram", "uoms": [dict(uom="Carat"), dict(uom="Kg")]}
+		)
 
 		for d in item_doc.uoms:
 			value = get_uom_conv_factor(d.uom, item_doc.stock_uom)
@@ -440,48 +499,46 @@
 		self.assertEqual(factor, 1.0)
 
 	def test_item_variant_by_manufacturer(self):
-		fields = [{'field_name': 'description'}, {'field_name': 'variant_based_on'}]
+		fields = [{"field_name": "description"}, {"field_name": "variant_based_on"}]
 		set_item_variant_settings(fields)
 
-		if frappe.db.exists('Item', '_Test Variant Mfg'):
-			frappe.delete_doc('Item', '_Test Variant Mfg')
-		if frappe.db.exists('Item', '_Test Variant Mfg-1'):
-			frappe.delete_doc('Item', '_Test Variant Mfg-1')
-		if frappe.db.exists('Manufacturer', 'MSG1'):
-			frappe.delete_doc('Manufacturer', 'MSG1')
+		if frappe.db.exists("Item", "_Test Variant Mfg"):
+			frappe.delete_doc("Item", "_Test Variant Mfg")
+		if frappe.db.exists("Item", "_Test Variant Mfg-1"):
+			frappe.delete_doc("Item", "_Test Variant Mfg-1")
+		if frappe.db.exists("Manufacturer", "MSG1"):
+			frappe.delete_doc("Manufacturer", "MSG1")
 
-		template = frappe.get_doc(dict(
-			doctype='Item',
-			item_code='_Test Variant Mfg',
-			has_variant=1,
-			item_group='Products',
-			variant_based_on='Manufacturer'
-		)).insert()
+		template = frappe.get_doc(
+			dict(
+				doctype="Item",
+				item_code="_Test Variant Mfg",
+				has_variant=1,
+				item_group="Products",
+				variant_based_on="Manufacturer",
+			)
+		).insert()
 
-		manufacturer = frappe.get_doc(dict(
-			doctype='Manufacturer',
-			short_name='MSG1'
-		)).insert()
+		manufacturer = frappe.get_doc(dict(doctype="Manufacturer", short_name="MSG1")).insert()
 
 		variant = get_variant(template.name, manufacturer=manufacturer.name)
-		self.assertEqual(variant.item_code, '_Test Variant Mfg-1')
-		self.assertEqual(variant.description, '_Test Variant Mfg')
-		self.assertEqual(variant.manufacturer, 'MSG1')
+		self.assertEqual(variant.item_code, "_Test Variant Mfg-1")
+		self.assertEqual(variant.description, "_Test Variant Mfg")
+		self.assertEqual(variant.manufacturer, "MSG1")
 		variant.insert()
 
-		variant = get_variant(template.name, manufacturer=manufacturer.name,
-			manufacturer_part_no='007')
-		self.assertEqual(variant.item_code, '_Test Variant Mfg-2')
-		self.assertEqual(variant.description, '_Test Variant Mfg')
-		self.assertEqual(variant.manufacturer, 'MSG1')
-		self.assertEqual(variant.manufacturer_part_no, '007')
+		variant = get_variant(template.name, manufacturer=manufacturer.name, manufacturer_part_no="007")
+		self.assertEqual(variant.item_code, "_Test Variant Mfg-2")
+		self.assertEqual(variant.description, "_Test Variant Mfg")
+		self.assertEqual(variant.manufacturer, "MSG1")
+		self.assertEqual(variant.manufacturer_part_no, "007")
 
 	def test_stock_exists_against_template_item(self):
-		stock_item = frappe.get_all('Stock Ledger Entry', fields = ["item_code"], limit=1)
+		stock_item = frappe.get_all("Stock Ledger Entry", fields=["item_code"], limit=1)
 		if stock_item:
 			item_code = stock_item[0].item_code
 
-			item_doc = frappe.get_doc('Item', item_code)
+			item_doc = frappe.get_doc("Item", item_code)
 			item_doc.has_variants = 1
 			self.assertRaises(StockExistsForTemplate, item_doc.save)
 
@@ -494,37 +551,27 @@
 
 		# Create new item and add barcodes
 		barcode_properties_list = [
-			{
-				"barcode": "0012345678905",
-				"barcode_type": "EAN"
-			},
-			{
-				"barcode": "012345678905",
-				"barcode_type": "UAN"
-			},
+			{"barcode": "0012345678905", "barcode_type": "EAN"},
+			{"barcode": "012345678905", "barcode_type": "UAN"},
 			{
 				"barcode": "ARBITRARY_TEXT",
-			}
+			},
 		]
 		create_item(item_code)
 		for barcode_properties in barcode_properties_list:
-			item_doc = frappe.get_doc('Item', item_code)
-			new_barcode = item_doc.append('barcodes')
+			item_doc = frappe.get_doc("Item", item_code)
+			new_barcode = item_doc.append("barcodes")
 			new_barcode.update(barcode_properties)
 			item_doc.save()
 
 		# Check values saved correctly
 		barcodes = frappe.get_all(
-			'Item Barcode',
-			fields=['barcode', 'barcode_type'],
-			filters={'parent': item_code})
+			"Item Barcode", fields=["barcode", "barcode_type"], filters={"parent": item_code}
+		)
 
 		for barcode_properties in barcode_properties_list:
-			barcode_to_find = barcode_properties['barcode']
-			matching_barcodes = [
-				x for x in barcodes
-				if x['barcode'] == barcode_to_find
-			]
+			barcode_to_find = barcode_properties["barcode"]
+			matching_barcodes = [x for x in barcodes if x["barcode"] == barcode_to_find]
 		self.assertEqual(len(matching_barcodes), 1)
 		details = matching_barcodes[0]
 
@@ -532,20 +579,21 @@
 			self.assertEqual(value, details.get(key))
 
 		# Add barcode again - should cause DuplicateEntryError
-		item_doc = frappe.get_doc('Item', item_code)
-		new_barcode = item_doc.append('barcodes')
+		item_doc = frappe.get_doc("Item", item_code)
+		new_barcode = item_doc.append("barcodes")
 		new_barcode.update(barcode_properties_list[0])
 		self.assertRaises(frappe.UniqueValidationError, item_doc.save)
 
 		# Add invalid barcode - should cause InvalidBarcode
-		item_doc = frappe.get_doc('Item', item_code)
-		new_barcode = item_doc.append('barcodes')
-		new_barcode.barcode = '9999999999999'
-		new_barcode.barcode_type = 'EAN'
+		item_doc = frappe.get_doc("Item", item_code)
+		new_barcode = item_doc.append("barcodes")
+		new_barcode.barcode = "9999999999999"
+		new_barcode.barcode_type = "EAN"
 		self.assertRaises(InvalidBarcode, item_doc.save)
 
 	def test_heatmap_data(self):
 		import time
+
 		data = get_timeline_data("Item", "_Test Item")
 		self.assertTrue(isinstance(data, dict))
 
@@ -588,20 +636,17 @@
 
 	def test_check_stock_uom_with_bin_no_sle(self):
 		from erpnext.stock.stock_balance import update_bin_qty
+
 		item = create_item("_Item with bin qty")
 		item.stock_uom = "Gram"
 		item.save()
 
-		update_bin_qty(item.item_code, "_Test Warehouse - _TC", {
-			"reserved_qty": 10
-		})
+		update_bin_qty(item.item_code, "_Test Warehouse - _TC", {"reserved_qty": 10})
 
 		item.stock_uom = "Kilometer"
 		self.assertRaises(frappe.ValidationError, item.save)
 
-		update_bin_qty(item.item_code, "_Test Warehouse - _TC", {
-			"reserved_qty": 0
-		})
+		update_bin_qty(item.item_code, "_Test Warehouse - _TC", {"reserved_qty": 0})
 
 		item.load_from_db()
 		item.stock_uom = "Kilometer"
@@ -636,7 +681,7 @@
 
 	@change_settings("Stock Settings", {"allow_negative_stock": 0})
 	def test_item_wise_negative_stock(self):
-		""" When global settings are disabled check that item that allows
+		"""When global settings are disabled check that item that allows
 		negative stock can still consume material in all known stock
 		transactions that consume inventory."""
 		from erpnext.stock.stock_ledger import is_negative_stock_allowed
@@ -648,17 +693,22 @@
 
 	@change_settings("Stock Settings", {"allow_negative_stock": 0})
 	def test_backdated_negative_stock(self):
-		""" same as test above but backdated entries """
+		"""same as test above but backdated entries"""
 		from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
+
 		item = make_item("_TestNegativeItemSetting", {"allow_negative_stock": 1, "valuation_rate": 100})
 
 		# create a future entry so all new entries are backdated
-		make_stock_entry(qty=1, item_code=item.name, target="_Test Warehouse - _TC", posting_date = add_days(today(), 5))
+		make_stock_entry(
+			qty=1, item_code=item.name, target="_Test Warehouse - _TC", posting_date=add_days(today(), 5)
+		)
 		self.consume_item_code_with_differet_stock_transactions(item_code=item.name)
 
 	@change_settings("Stock Settings", {"sample_retention_warehouse": "_Test Warehouse - _TC"})
 	def test_retain_sample(self):
-		item = make_item("_TestRetainSample", {'has_batch_no': 1, 'retain_sample': 1, 'sample_quantity': 1})
+		item = make_item(
+			"_TestRetainSample", {"has_batch_no": 1, "retain_sample": 1, "sample_quantity": 1}
+		)
 
 		self.assertEqual(item.has_batch_no, 1)
 		self.assertEqual(item.retain_sample, 1)
@@ -670,7 +720,9 @@
 		self.assertEqual(item.sample_quantity, None)
 		item.delete()
 
-	def consume_item_code_with_differet_stock_transactions(self, item_code, warehouse="_Test Warehouse - _TC"):
+	def consume_item_code_with_differet_stock_transactions(
+		self, item_code, warehouse="_Test Warehouse - _TC"
+	):
 		from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 		from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
@@ -694,10 +746,11 @@
 
 
 def set_item_variant_settings(fields):
-	doc = frappe.get_doc('Item Variant Settings')
-	doc.set('fields', fields)
+	doc = frappe.get_doc("Item Variant Settings")
+	doc.set("fields", fields)
 	doc.save()
 
+
 def make_item_variant():
 	if not frappe.db.exists("Item", "_Test Variant Item-S"):
 		variant = create_variant("_Test Variant Item", """{"Test Size": "Small"}""")
@@ -705,11 +758,23 @@
 		variant.item_name = "_Test Variant Item-S"
 		variant.save()
 
-test_records = frappe.get_test_records('Item')
 
-def create_item(item_code, is_stock_item=1, valuation_rate=0, warehouse="_Test Warehouse - _TC",
-		is_customer_provided_item=None, customer=None, is_purchase_item=None, opening_stock=0, is_fixed_asset=0,
-		asset_category=None, company="_Test Company"):
+test_records = frappe.get_test_records("Item")
+
+
+def create_item(
+	item_code,
+	is_stock_item=1,
+	valuation_rate=0,
+	warehouse="_Test Warehouse - _TC",
+	is_customer_provided_item=None,
+	customer=None,
+	is_purchase_item=None,
+	opening_stock=0,
+	is_fixed_asset=0,
+	asset_category=None,
+	company="_Test Company",
+):
 	if not frappe.db.exists("Item", item_code):
 		item = frappe.new_doc("Item")
 		item.item_code = item_code
@@ -723,11 +788,8 @@
 		item.valuation_rate = valuation_rate
 		item.is_purchase_item = is_purchase_item
 		item.is_customer_provided_item = is_customer_provided_item
-		item.customer = customer or ''
-		item.append("item_defaults", {
-			"default_warehouse": warehouse,
-			"company": company
-		})
+		item.customer = customer or ""
+		item.append("item_defaults", {"default_warehouse": warehouse, "company": company})
 		item.save()
 	else:
 		item = frappe.get_doc("Item", item_code)
diff --git a/erpnext/stock/doctype/item_alternative/item_alternative.py b/erpnext/stock/doctype/item_alternative/item_alternative.py
index 766647b..0f93bb9 100644
--- a/erpnext/stock/doctype/item_alternative/item_alternative.py
+++ b/erpnext/stock/doctype/item_alternative/item_alternative.py
@@ -14,8 +14,7 @@
 		self.validate_duplicate()
 
 	def has_alternative_item(self):
-		if (self.item_code and
-			not frappe.db.get_value('Item', self.item_code, 'allow_alternative_item')):
+		if self.item_code and not frappe.db.get_value("Item", self.item_code, "allow_alternative_item"):
 			frappe.throw(_("Not allow to set alternative item for the item {0}").format(self.item_code))
 
 	def validate_alternative_item(self):
@@ -23,19 +22,32 @@
 			frappe.throw(_("Alternative item must not be same as item code"))
 
 		item_meta = frappe.get_meta("Item")
-		fields = ["is_stock_item", "include_item_in_manufacturing","has_serial_no", "has_batch_no", "allow_alternative_item"]
+		fields = [
+			"is_stock_item",
+			"include_item_in_manufacturing",
+			"has_serial_no",
+			"has_batch_no",
+			"allow_alternative_item",
+		]
 		item_data = frappe.db.get_value("Item", self.item_code, fields, as_dict=1)
-		alternative_item_data = frappe.db.get_value("Item", self.alternative_item_code, fields, as_dict=1)
+		alternative_item_data = frappe.db.get_value(
+			"Item", self.alternative_item_code, fields, as_dict=1
+		)
 
 		for field in fields:
-			if  item_data.get(field) != alternative_item_data.get(field):
+			if item_data.get(field) != alternative_item_data.get(field):
 				raise_exception, alert = [1, False] if field == "is_stock_item" else [0, True]
 
-				frappe.msgprint(_("The value of {0} differs between Items {1} and {2}") \
-					.format(frappe.bold(item_meta.get_label(field)),
-							frappe.bold(self.alternative_item_code),
-							frappe.bold(self.item_code)),
-					alert=alert, raise_exception=raise_exception, indicator="Orange")
+				frappe.msgprint(
+					_("The value of {0} differs between Items {1} and {2}").format(
+						frappe.bold(item_meta.get_label(field)),
+						frappe.bold(self.alternative_item_code),
+						frappe.bold(self.item_code),
+					),
+					alert=alert,
+					raise_exception=raise_exception,
+					indicator="Orange",
+				)
 
 		alternate_item_check_msg = _("Allow Alternative Item must be checked on Item {}")
 
@@ -44,24 +56,30 @@
 		if self.two_way and not alternative_item_data.allow_alternative_item:
 			frappe.throw(alternate_item_check_msg.format(self.item_code))
 
-
-
-
 	def validate_duplicate(self):
-		if frappe.db.get_value("Item Alternative", {'item_code': self.item_code,
-			'alternative_item_code': self.alternative_item_code, 'name': ('!=', self.name)}):
+		if frappe.db.get_value(
+			"Item Alternative",
+			{
+				"item_code": self.item_code,
+				"alternative_item_code": self.alternative_item_code,
+				"name": ("!=", self.name),
+			},
+		):
 			frappe.throw(_("Already record exists for the item {0}").format(self.item_code))
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_alternative_items(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.sql(""" (select alternative_item_code from `tabItem Alternative`
+	return frappe.db.sql(
+		""" (select alternative_item_code from `tabItem Alternative`
 			where item_code = %(item_code)s and alternative_item_code like %(txt)s)
 		union
 			(select item_code from `tabItem Alternative`
 			where alternative_item_code = %(item_code)s and item_code like %(txt)s
 			and two_way = 1) limit {0}, {1}
-		""".format(start, page_len), {
-			"item_code": filters.get('item_code'),
-			"txt": '%' + txt + '%'
-		})
+		""".format(
+			start, page_len
+		),
+		{"item_code": filters.get("item_code"), "txt": "%" + txt + "%"},
+	)
diff --git a/erpnext/stock/doctype/item_alternative/test_item_alternative.py b/erpnext/stock/doctype/item_alternative/test_item_alternative.py
index 501c1c1..d829b2c 100644
--- a/erpnext/stock/doctype/item_alternative/test_item_alternative.py
+++ b/erpnext/stock/doctype/item_alternative/test_item_alternative.py
@@ -27,121 +27,181 @@
 		make_items()
 
 	def test_alternative_item_for_subcontract_rm(self):
-		frappe.db.set_value('Buying Settings', None,
-			'backflush_raw_materials_of_subcontract_based_on', 'BOM')
+		frappe.db.set_value(
+			"Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", "BOM"
+		)
 
-		create_stock_reconciliation(item_code='Alternate Item For A RW 1', warehouse='_Test Warehouse - _TC',
-			qty=5, rate=2000)
-		create_stock_reconciliation(item_code='Test FG A RW 2', warehouse='_Test Warehouse - _TC',
-			qty=5, rate=2000)
+		create_stock_reconciliation(
+			item_code="Alternate Item For A RW 1", warehouse="_Test Warehouse - _TC", qty=5, rate=2000
+		)
+		create_stock_reconciliation(
+			item_code="Test FG A RW 2", warehouse="_Test Warehouse - _TC", qty=5, rate=2000
+		)
 
 		supplier_warehouse = "Test Supplier Warehouse - _TC"
-		po = create_purchase_order(item = "Test Finished Goods - A",
-			is_subcontracted='Yes', qty=5, rate=3000, supplier_warehouse=supplier_warehouse)
+		po = create_purchase_order(
+			item="Test Finished Goods - A",
+			is_subcontracted="Yes",
+			qty=5,
+			rate=3000,
+			supplier_warehouse=supplier_warehouse,
+		)
 
-		rm_item = [{"item_code": "Test Finished Goods - A", "rm_item_code": "Test FG A RW 1", "item_name":"Test FG A RW 1",
-					"qty":5, "warehouse":"_Test Warehouse - _TC", "rate":2000, "amount":10000, "stock_uom":"Nos"},
-					{"item_code": "Test Finished Goods - A", "rm_item_code": "Test FG A RW 2", "item_name":"Test FG A RW 2",
-					"qty":5, "warehouse":"_Test Warehouse - _TC", "rate":2000, "amount":10000, "stock_uom":"Nos"}]
+		rm_item = [
+			{
+				"item_code": "Test Finished Goods - A",
+				"rm_item_code": "Test FG A RW 1",
+				"item_name": "Test FG A RW 1",
+				"qty": 5,
+				"warehouse": "_Test Warehouse - _TC",
+				"rate": 2000,
+				"amount": 10000,
+				"stock_uom": "Nos",
+			},
+			{
+				"item_code": "Test Finished Goods - A",
+				"rm_item_code": "Test FG A RW 2",
+				"item_name": "Test FG A RW 2",
+				"qty": 5,
+				"warehouse": "_Test Warehouse - _TC",
+				"rate": 2000,
+				"amount": 10000,
+				"stock_uom": "Nos",
+			},
+		]
 
 		rm_item_string = json.dumps(rm_item)
-		reserved_qty_for_sub_contract = frappe.db.get_value('Bin',
-			{'item_code': 'Test FG A RW 1', 'warehouse': '_Test Warehouse - _TC'}, 'reserved_qty_for_sub_contract')
+		reserved_qty_for_sub_contract = frappe.db.get_value(
+			"Bin",
+			{"item_code": "Test FG A RW 1", "warehouse": "_Test Warehouse - _TC"},
+			"reserved_qty_for_sub_contract",
+		)
 
 		se = frappe.get_doc(make_rm_stock_entry(po.name, rm_item_string))
 		se.to_warehouse = supplier_warehouse
 		se.insert()
 
-		doc = frappe.get_doc('Stock Entry', se.name)
+		doc = frappe.get_doc("Stock Entry", se.name)
 		for item in doc.items:
-			if item.item_code == 'Test FG A RW 1':
-				item.item_code = 'Alternate Item For A RW 1'
-				item.item_name = 'Alternate Item For A RW 1'
-				item.description = 'Alternate Item For A RW 1'
-				item.original_item = 'Test FG A RW 1'
+			if item.item_code == "Test FG A RW 1":
+				item.item_code = "Alternate Item For A RW 1"
+				item.item_name = "Alternate Item For A RW 1"
+				item.description = "Alternate Item For A RW 1"
+				item.original_item = "Test FG A RW 1"
 
 		doc.save()
 		doc.submit()
-		after_transfer_reserved_qty_for_sub_contract = frappe.db.get_value('Bin',
-			{'item_code': 'Test FG A RW 1', 'warehouse': '_Test Warehouse - _TC'}, 'reserved_qty_for_sub_contract')
+		after_transfer_reserved_qty_for_sub_contract = frappe.db.get_value(
+			"Bin",
+			{"item_code": "Test FG A RW 1", "warehouse": "_Test Warehouse - _TC"},
+			"reserved_qty_for_sub_contract",
+		)
 
-		self.assertEqual(after_transfer_reserved_qty_for_sub_contract, flt(reserved_qty_for_sub_contract - 5))
+		self.assertEqual(
+			after_transfer_reserved_qty_for_sub_contract, flt(reserved_qty_for_sub_contract - 5)
+		)
 
 		pr = make_purchase_receipt(po.name)
 		pr.save()
 
-		pr = frappe.get_doc('Purchase Receipt', pr.name)
+		pr = frappe.get_doc("Purchase Receipt", pr.name)
 		status = False
 		for d in pr.supplied_items:
-			if d.rm_item_code == 'Alternate Item For A RW 1':
+			if d.rm_item_code == "Alternate Item For A RW 1":
 				status = True
 
 		self.assertEqual(status, True)
-		frappe.db.set_value('Buying Settings', None,
-			'backflush_raw_materials_of_subcontract_based_on', 'Material Transferred for Subcontract')
+		frappe.db.set_value(
+			"Buying Settings",
+			None,
+			"backflush_raw_materials_of_subcontract_based_on",
+			"Material Transferred for Subcontract",
+		)
 
 	def test_alternative_item_for_production_rm(self):
-		create_stock_reconciliation(item_code='Alternate Item For A RW 1',
-			warehouse='_Test Warehouse - _TC',qty=5, rate=2000)
-		create_stock_reconciliation(item_code='Test FG A RW 2', warehouse='_Test Warehouse - _TC',
-			qty=5, rate=2000)
-		pro_order = make_wo_order_test_record(production_item='Test Finished Goods - A',
-			qty=5, source_warehouse='_Test Warehouse - _TC', wip_warehouse='Test Supplier Warehouse - _TC')
+		create_stock_reconciliation(
+			item_code="Alternate Item For A RW 1", warehouse="_Test Warehouse - _TC", qty=5, rate=2000
+		)
+		create_stock_reconciliation(
+			item_code="Test FG A RW 2", warehouse="_Test Warehouse - _TC", qty=5, rate=2000
+		)
+		pro_order = make_wo_order_test_record(
+			production_item="Test Finished Goods - A",
+			qty=5,
+			source_warehouse="_Test Warehouse - _TC",
+			wip_warehouse="Test Supplier Warehouse - _TC",
+		)
 
-		reserved_qty_for_production = frappe.db.get_value('Bin',
-			{'item_code': 'Test FG A RW 1', 'warehouse': '_Test Warehouse - _TC'}, 'reserved_qty_for_production')
+		reserved_qty_for_production = frappe.db.get_value(
+			"Bin",
+			{"item_code": "Test FG A RW 1", "warehouse": "_Test Warehouse - _TC"},
+			"reserved_qty_for_production",
+		)
 
 		ste = frappe.get_doc(make_stock_entry(pro_order.name, "Material Transfer for Manufacture", 5))
 		ste.insert()
 
 		for item in ste.items:
-			if item.item_code == 'Test FG A RW 1':
-				item.item_code = 'Alternate Item For A RW 1'
-				item.item_name = 'Alternate Item For A RW 1'
-				item.description = 'Alternate Item For A RW 1'
-				item.original_item = 'Test FG A RW 1'
+			if item.item_code == "Test FG A RW 1":
+				item.item_code = "Alternate Item For A RW 1"
+				item.item_name = "Alternate Item For A RW 1"
+				item.description = "Alternate Item For A RW 1"
+				item.original_item = "Test FG A RW 1"
 
 		ste.submit()
-		reserved_qty_for_production_after_transfer = frappe.db.get_value('Bin',
-			{'item_code': 'Test FG A RW 1', 'warehouse': '_Test Warehouse - _TC'}, 'reserved_qty_for_production')
+		reserved_qty_for_production_after_transfer = frappe.db.get_value(
+			"Bin",
+			{"item_code": "Test FG A RW 1", "warehouse": "_Test Warehouse - _TC"},
+			"reserved_qty_for_production",
+		)
 
-		self.assertEqual(reserved_qty_for_production_after_transfer, flt(reserved_qty_for_production - 5))
+		self.assertEqual(
+			reserved_qty_for_production_after_transfer, flt(reserved_qty_for_production - 5)
+		)
 		ste1 = frappe.get_doc(make_stock_entry(pro_order.name, "Manufacture", 5))
 
 		status = False
 		for d in ste1.items:
-			if d.item_code == 'Alternate Item For A RW 1':
+			if d.item_code == "Alternate Item For A RW 1":
 				status = True
 
 		self.assertEqual(status, True)
 		ste1.submit()
 
+
 def make_items():
-	items = ['Test Finished Goods - A', 'Test FG A RW 1', 'Test FG A RW 2', 'Alternate Item For A RW 1']
+	items = [
+		"Test Finished Goods - A",
+		"Test FG A RW 1",
+		"Test FG A RW 2",
+		"Alternate Item For A RW 1",
+	]
 	for item_code in items:
-		if not frappe.db.exists('Item', item_code):
+		if not frappe.db.exists("Item", item_code):
 			create_item(item_code)
 
-	create_stock_reconciliation(item_code="Test FG A RW 1",
-		warehouse='_Test Warehouse - _TC', qty=10, rate=2000)
+	create_stock_reconciliation(
+		item_code="Test FG A RW 1", warehouse="_Test Warehouse - _TC", qty=10, rate=2000
+	)
 
-	if frappe.db.exists('Item', 'Test FG A RW 1'):
-		doc = frappe.get_doc('Item', 'Test FG A RW 1')
+	if frappe.db.exists("Item", "Test FG A RW 1"):
+		doc = frappe.get_doc("Item", "Test FG A RW 1")
 		doc.allow_alternative_item = 1
 		doc.save()
 
-	if frappe.db.exists('Item', 'Test Finished Goods - A'):
-		doc = frappe.get_doc('Item', 'Test Finished Goods - A')
+	if frappe.db.exists("Item", "Test Finished Goods - A"):
+		doc = frappe.get_doc("Item", "Test Finished Goods - A")
 		doc.is_sub_contracted_item = 1
 		doc.save()
 
-	if not frappe.db.get_value('BOM',
-		{'item': 'Test Finished Goods - A', 'docstatus': 1}):
-		make_bom(item = 'Test Finished Goods - A', raw_materials = ['Test FG A RW 1', 'Test FG A RW 2'])
+	if not frappe.db.get_value("BOM", {"item": "Test Finished Goods - A", "docstatus": 1}):
+		make_bom(item="Test Finished Goods - A", raw_materials=["Test FG A RW 1", "Test FG A RW 2"])
 
-	if not frappe.db.get_value('Warehouse', {'warehouse_name': 'Test Supplier Warehouse'}):
-		frappe.get_doc({
-			'doctype': 'Warehouse',
-			'warehouse_name': 'Test Supplier Warehouse',
-			'company': '_Test Company'
-		}).insert(ignore_permissions=True)
+	if not frappe.db.get_value("Warehouse", {"warehouse_name": "Test Supplier Warehouse"}):
+		frappe.get_doc(
+			{
+				"doctype": "Warehouse",
+				"warehouse_name": "Test Supplier Warehouse",
+				"company": "_Test Company",
+			}
+		).insert(ignore_permissions=True)
diff --git a/erpnext/stock/doctype/item_attribute/item_attribute.py b/erpnext/stock/doctype/item_attribute/item_attribute.py
index 5a28a9e..391ff06 100644
--- a/erpnext/stock/doctype/item_attribute/item_attribute.py
+++ b/erpnext/stock/doctype/item_attribute/item_attribute.py
@@ -14,7 +14,9 @@
 )
 
 
-class ItemAttributeIncrementError(frappe.ValidationError): pass
+class ItemAttributeIncrementError(frappe.ValidationError):
+	pass
+
 
 class ItemAttribute(Document):
 	def __setup__(self):
@@ -29,11 +31,12 @@
 		self.validate_exising_items()
 
 	def validate_exising_items(self):
-		'''Validate that if there are existing items with attributes, they are valid'''
+		"""Validate that if there are existing items with attributes, they are valid"""
 		attributes_list = [d.attribute_value for d in self.item_attribute_values]
 
 		# Get Item Variant Attribute details of variant items
-		items = frappe.db.sql("""
+		items = frappe.db.sql(
+			"""
 			select
 				i.name, iva.attribute_value as value
 			from
@@ -41,13 +44,18 @@
 			where
 				iva.attribute = %(attribute)s
 				and iva.parent = i.name and
-				i.variant_of is not null and i.variant_of != ''""", {"attribute" : self.name}, as_dict=1)
+				i.variant_of is not null and i.variant_of != ''""",
+			{"attribute": self.name},
+			as_dict=1,
+		)
 
 		for item in items:
 			if self.numeric_values:
 				validate_is_incremental(self, self.name, item.value, item.name)
 			else:
-				validate_item_attribute_value(attributes_list, self.name, item.value, item.name, from_variant=False)
+				validate_item_attribute_value(
+					attributes_list, self.name, item.value, item.name, from_variant=False
+				)
 
 	def validate_numeric(self):
 		if self.numeric_values:
diff --git a/erpnext/stock/doctype/item_attribute/test_item_attribute.py b/erpnext/stock/doctype/item_attribute/test_item_attribute.py
index 055c22e..a30f0e9 100644
--- a/erpnext/stock/doctype/item_attribute/test_item_attribute.py
+++ b/erpnext/stock/doctype/item_attribute/test_item_attribute.py
@@ -4,7 +4,7 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Item Attribute')
+test_records = frappe.get_test_records("Item Attribute")
 
 from frappe.tests.utils import FrappeTestCase
 
@@ -18,14 +18,16 @@
 			frappe.delete_doc("Item Attribute", "_Test_Length")
 
 	def test_numeric_item_attribute(self):
-		item_attribute = frappe.get_doc({
-			"doctype": "Item Attribute",
-			"attribute_name": "_Test_Length",
-			"numeric_values": 1,
-			"from_range": 0.0,
-			"to_range": 100.0,
-			"increment": 0
-		})
+		item_attribute = frappe.get_doc(
+			{
+				"doctype": "Item Attribute",
+				"attribute_name": "_Test_Length",
+				"numeric_values": 1,
+				"from_range": 0.0,
+				"to_range": 100.0,
+				"increment": 0,
+			}
+		)
 
 		self.assertRaises(ItemAttributeIncrementError, item_attribute.save)
 
diff --git a/erpnext/stock/doctype/item_barcode/item_barcode.py b/erpnext/stock/doctype/item_barcode/item_barcode.py
index 64c39da..c2c0421 100644
--- a/erpnext/stock/doctype/item_barcode/item_barcode.py
+++ b/erpnext/stock/doctype/item_barcode/item_barcode.py
@@ -6,4 +6,4 @@
 
 
 class ItemBarcode(Document):
-    pass
+	pass
diff --git a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py
index 469ccd8..b65ba98 100644
--- a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py
+++ b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py
@@ -18,14 +18,17 @@
 	def validate_duplicate_entry(self):
 		if self.is_new():
 			filters = {
-				'item_code': self.item_code,
-				'manufacturer': self.manufacturer,
-				'manufacturer_part_no': self.manufacturer_part_no
+				"item_code": self.item_code,
+				"manufacturer": self.manufacturer,
+				"manufacturer_part_no": self.manufacturer_part_no,
 			}
 
 			if frappe.db.exists("Item Manufacturer", filters):
-				frappe.throw(_("Duplicate entry against the item code {0} and manufacturer {1}")
-					.format(self.item_code, self.manufacturer))
+				frappe.throw(
+					_("Duplicate entry against the item code {0} and manufacturer {1}").format(
+						self.item_code, self.manufacturer
+					)
+				)
 
 	def manage_default_item_manufacturer(self, delete=False):
 		from frappe.model.utils import set_default
@@ -37,11 +40,9 @@
 		if not self.is_default:
 			# if unchecked and default in Item master, clear it.
 			if default_manufacturer == self.manufacturer and default_part_no == self.manufacturer_part_no:
-				frappe.db.set_value("Item", item.name,
-					{
-						"default_item_manufacturer": None,
-						"default_manufacturer_part_no": None
-					})
+				frappe.db.set_value(
+					"Item", item.name, {"default_item_manufacturer": None, "default_manufacturer_part_no": None}
+				)
 
 		elif self.is_default:
 			set_default(self, "item_code")
@@ -50,18 +51,26 @@
 			if delete:
 				manufacturer, manufacturer_part_no = None, None
 
-			elif (default_manufacturer != self.manufacturer) or \
-				(default_manufacturer == self.manufacturer and default_part_no != self.manufacturer_part_no):
+			elif (default_manufacturer != self.manufacturer) or (
+				default_manufacturer == self.manufacturer and default_part_no != self.manufacturer_part_no
+			):
 				manufacturer = self.manufacturer
 				manufacturer_part_no = self.manufacturer_part_no
 
-			frappe.db.set_value("Item", item.name,
-					{
-						"default_item_manufacturer": manufacturer,
-						"default_manufacturer_part_no": manufacturer_part_no
-					})
+			frappe.db.set_value(
+				"Item",
+				item.name,
+				{
+					"default_item_manufacturer": manufacturer,
+					"default_manufacturer_part_no": manufacturer_part_no,
+				},
+			)
+
 
 @frappe.whitelist()
 def get_item_manufacturer_part_no(item_code, manufacturer):
-	return frappe.db.get_value("Item Manufacturer",
-		{'item_code': item_code, 'manufacturer': manufacturer}, 'manufacturer_part_no')
+	return frappe.db.get_value(
+		"Item Manufacturer",
+		{"item_code": item_code, "manufacturer": manufacturer},
+		"manufacturer_part_no",
+	)
diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py
index 010e01a..562f7b9 100644
--- a/erpnext/stock/doctype/item_price/item_price.py
+++ b/erpnext/stock/doctype/item_price/item_price.py
@@ -13,7 +13,6 @@
 
 
 class ItemPrice(Document):
-
 	def validate(self):
 		self.validate_item()
 		self.validate_dates()
@@ -32,22 +31,26 @@
 
 	def update_price_list_details(self):
 		if self.price_list:
-			price_list_details = frappe.db.get_value("Price List",
-				{"name": self.price_list, "enabled": 1},
-				["buying", "selling", "currency"])
+			price_list_details = frappe.db.get_value(
+				"Price List", {"name": self.price_list, "enabled": 1}, ["buying", "selling", "currency"]
+			)
 
 			if not price_list_details:
-				link = frappe.utils.get_link_to_form('Price List', self.price_list)
+				link = frappe.utils.get_link_to_form("Price List", self.price_list)
 				frappe.throw("The price list {0} does not exist or is disabled".format(link))
 
 			self.buying, self.selling, self.currency = price_list_details
 
 	def update_item_details(self):
 		if self.item_code:
-			self.item_name, self.item_description = frappe.db.get_value("Item", self.item_code,["item_name", "description"])
+			self.item_name, self.item_description = frappe.db.get_value(
+				"Item", self.item_code, ["item_name", "description"]
+			)
 
 	def check_duplicates(self):
-		conditions = """where item_code = %(item_code)s and price_list = %(price_list)s and name != %(name)s"""
+		conditions = (
+			"""where item_code = %(item_code)s and price_list = %(price_list)s and name != %(name)s"""
+		)
 
 		for field in [
 			"uom",
@@ -56,21 +59,31 @@
 			"packing_unit",
 			"customer",
 			"supplier",
-			"batch_no"]:
+			"batch_no",
+		]:
 			if self.get(field):
 				conditions += " and {0} = %({0})s ".format(field)
 			else:
 				conditions += "and (isnull({0}) or {0} = '')".format(field)
 
-		price_list_rate = frappe.db.sql("""
+		price_list_rate = frappe.db.sql(
+			"""
 				select price_list_rate
 				from `tabItem Price`
 				{conditions}
-			""".format(conditions=conditions),
-			self.as_dict(),)
+			""".format(
+				conditions=conditions
+			),
+			self.as_dict(),
+		)
 
 		if price_list_rate:
-			frappe.throw(_("Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates."), ItemPriceDuplicateItem,)
+			frappe.throw(
+				_(
+					"Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates."
+				),
+				ItemPriceDuplicateItem,
+			)
 
 	def before_save(self):
 		if self.selling:
diff --git a/erpnext/stock/doctype/item_price/test_item_price.py b/erpnext/stock/doctype/item_price/test_item_price.py
index 6ceba3f..30d933e 100644
--- a/erpnext/stock/doctype/item_price/test_item_price.py
+++ b/erpnext/stock/doctype/item_price/test_item_price.py
@@ -23,8 +23,14 @@
 	def test_addition_of_new_fields(self):
 		# Based on https://github.com/frappe/erpnext/issues/8456
 		test_fields_existance = [
-			'supplier', 'customer', 'uom', 'lead_time_days',
-			'packing_unit', 'valid_from', 'valid_upto', 'note'
+			"supplier",
+			"customer",
+			"uom",
+			"lead_time_days",
+			"packing_unit",
+			"valid_from",
+			"valid_upto",
+			"note",
 		]
 		doc_fields = frappe.copy_doc(test_records[1]).__dict__.keys()
 
@@ -45,10 +51,10 @@
 
 		args = {
 			"price_list": doc.price_list,
-            "customer": doc.customer,
-            "uom": "_Test UOM",
-            "transaction_date": '2017-04-18',
-            "qty": 10
+			"customer": doc.customer,
+			"uom": "_Test UOM",
+			"transaction_date": "2017-04-18",
+			"qty": 10,
 		}
 
 		price = get_price_list_rate_for(process_args(args), doc.item_code)
@@ -61,13 +67,12 @@
 			"price_list": doc.price_list,
 			"customer": doc.customer,
 			"uom": "_Test UOM",
-            "transaction_date": '2017-04-18',
+			"transaction_date": "2017-04-18",
 		}
 
 		price = get_price_list_rate_for(args, doc.item_code)
 		self.assertEqual(price, None)
 
-
 	def test_prices_at_date(self):
 		# Check correct price at first date
 		doc = frappe.copy_doc(test_records[2])
@@ -76,35 +81,35 @@
 			"price_list": doc.price_list,
 			"customer": "_Test Customer",
 			"uom": "_Test UOM",
-			"transaction_date": '2017-04-18',
-			"qty": 7
+			"transaction_date": "2017-04-18",
+			"qty": 7,
 		}
 
 		price = get_price_list_rate_for(args, doc.item_code)
 		self.assertEqual(price, 20)
 
 	def test_prices_at_invalid_date(self):
-		#Check correct price at invalid date
+		# Check correct price at invalid date
 		doc = frappe.copy_doc(test_records[3])
 
 		args = {
 			"price_list": doc.price_list,
 			"qty": 7,
 			"uom": "_Test UOM",
-			"transaction_date": "01-15-2019"
+			"transaction_date": "01-15-2019",
 		}
 
 		price = get_price_list_rate_for(args, doc.item_code)
 		self.assertEqual(price, None)
 
 	def test_prices_outside_of_date(self):
-		#Check correct price when outside of the date
+		# Check correct price when outside of the date
 		doc = frappe.copy_doc(test_records[4])
 
 		args = {
 			"price_list": doc.price_list,
-            "customer": "_Test Customer",
-            "uom": "_Test UOM",
+			"customer": "_Test Customer",
+			"uom": "_Test UOM",
 			"transaction_date": "2017-04-25",
 			"qty": 7,
 		}
@@ -113,7 +118,7 @@
 		self.assertEqual(price, None)
 
 	def test_lowest_price_when_no_date_provided(self):
-		#Check lowest price when no date provided
+		# Check lowest price when no date provided
 		doc = frappe.copy_doc(test_records[1])
 
 		args = {
@@ -125,7 +130,6 @@
 		price = get_price_list_rate_for(args, doc.item_code)
 		self.assertEqual(price, 10)
 
-
 	def test_invalid_item(self):
 		doc = frappe.copy_doc(test_records[1])
 		# Enter invalid item code
@@ -150,8 +154,8 @@
 		args = {
 			"price_list": doc.price_list,
 			"uom": "_Test UOM",
-			"transaction_date": '2017-04-18',
-			"qty": 7
+			"transaction_date": "2017-04-18",
+			"qty": 7,
 		}
 
 		price = get_price_list_rate_for(args, doc.item_code)
@@ -159,4 +163,5 @@
 
 		self.assertEqual(price, 21)
 
-test_records = frappe.get_test_records('Item Price')
+
+test_records = frappe.get_test_records("Item Price")
diff --git a/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py b/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py
index be1517e..cec5e21 100644
--- a/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py
+++ b/erpnext/stock/doctype/item_variant_settings/item_variant_settings.py
@@ -8,29 +8,46 @@
 
 
 class ItemVariantSettings(Document):
-	invalid_fields_for_copy_fields_in_variants = ['barcodes']
+	invalid_fields_for_copy_fields_in_variants = ["barcodes"]
 
 	def set_default_fields(self):
 		self.fields = []
-		fields = frappe.get_meta('Item').fields
-		exclude_fields = {"naming_series", "item_code", "item_name", "published_in_website",
-			"standard_rate", "opening_stock", "image", "description",
-			"variant_of", "valuation_rate", "description", "barcodes",
-			"has_variants", "attributes"}
+		fields = frappe.get_meta("Item").fields
+		exclude_fields = {
+			"naming_series",
+			"item_code",
+			"item_name",
+			"published_in_website",
+			"standard_rate",
+			"opening_stock",
+			"image",
+			"description",
+			"variant_of",
+			"valuation_rate",
+			"description",
+			"barcodes",
+			"has_variants",
+			"attributes",
+		}
 
 		for d in fields:
-			if not d.no_copy and d.fieldname not in exclude_fields and \
-				d.fieldtype not in ['HTML', 'Section Break', 'Column Break', 'Button', 'Read Only']:
-				self.append('fields', {
-					'field_name': d.fieldname
-				})
+			if (
+				not d.no_copy
+				and d.fieldname not in exclude_fields
+				and d.fieldtype not in ["HTML", "Section Break", "Column Break", "Button", "Read Only"]
+			):
+				self.append("fields", {"field_name": d.fieldname})
 
 	def remove_invalid_fields_for_copy_fields_in_variants(self):
-		fields = [row for row in self.fields if row.field_name not in self.invalid_fields_for_copy_fields_in_variants]
+		fields = [
+			row
+			for row in self.fields
+			if row.field_name not in self.invalid_fields_for_copy_fields_in_variants
+		]
 		self.fields = fields
 		self.save()
 
 	def validate(self):
 		for d in self.fields:
 			if d.field_name in self.invalid_fields_for_copy_fields_in_variants:
-				frappe.throw(_('Cannot set the field <b>{0}</b> for copying in variants').format(d.field_name))
+				frappe.throw(_("Cannot set the field <b>{0}</b> for copying in variants").format(d.field_name))
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index 7aff95d..b3af309 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -19,13 +19,19 @@
 		self.set("items", [])
 		for pr in self.get("purchase_receipts"):
 			if pr.receipt_document_type and pr.receipt_document:
-				pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description,
+				pr_items = frappe.db.sql(
+					"""select pr_item.item_code, pr_item.description,
 					pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name,
 					pr_item.cost_center, pr_item.is_fixed_asset
 					from `tab{doctype} Item` pr_item where parent = %s
 					and exists(select name from tabItem
 						where name = pr_item.item_code and (is_stock_item = 1 or is_fixed_asset=1))
-					""".format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True)
+					""".format(
+						doctype=pr.receipt_document_type
+					),
+					pr.receipt_document,
+					as_dict=True,
+				)
 
 				for d in pr_items:
 					item = self.append("items")
@@ -33,8 +39,7 @@
 					item.description = d.description
 					item.qty = d.qty
 					item.rate = d.base_rate
-					item.cost_center = d.cost_center or \
-						erpnext.get_default_cost_center(self.company)
+					item.cost_center = d.cost_center or erpnext.get_default_cost_center(self.company)
 					item.amount = d.base_amount
 					item.receipt_document_type = pr.receipt_document_type
 					item.receipt_document = pr.receipt_document
@@ -52,26 +57,30 @@
 		self.set_applicable_charges_on_item()
 		self.validate_applicable_charges_for_item()
 
-
 	def check_mandatory(self):
 		if not self.get("purchase_receipts"):
 			frappe.throw(_("Please enter Receipt Document"))
 
-
 	def validate_receipt_documents(self):
 		receipt_documents = []
 
 		for d in self.get("purchase_receipts"):
 			docstatus = frappe.db.get_value(d.receipt_document_type, d.receipt_document, "docstatus")
 			if docstatus != 1:
-				msg = f"Row {d.idx}: {d.receipt_document_type} {frappe.bold(d.receipt_document)} must be submitted"
+				msg = (
+					f"Row {d.idx}: {d.receipt_document_type} {frappe.bold(d.receipt_document)} must be submitted"
+				)
 				frappe.throw(_(msg), title=_("Invalid Document"))
 
 			if d.receipt_document_type == "Purchase Invoice":
 				update_stock = frappe.db.get_value(d.receipt_document_type, d.receipt_document, "update_stock")
 				if not update_stock:
-					msg = _("Row {0}: Purchase Invoice {1} has no stock impact.").format(d.idx, frappe.bold(d.receipt_document))
-					msg += "<br>" + _("Please create Landed Cost Vouchers against Invoices that have 'Update Stock' enabled.")
+					msg = _("Row {0}: Purchase Invoice {1} has no stock impact.").format(
+						d.idx, frappe.bold(d.receipt_document)
+					)
+					msg += "<br>" + _(
+						"Please create Landed Cost Vouchers against Invoices that have 'Update Stock' enabled."
+					)
 					frappe.throw(msg, title=_("Incorrect Invoice"))
 
 			receipt_documents.append(d.receipt_document)
@@ -81,52 +90,64 @@
 				frappe.throw(_("Item must be added using 'Get Items from Purchase Receipts' button"))
 
 			elif item.receipt_document not in receipt_documents:
-				frappe.throw(_("Item Row {0}: {1} {2} does not exist in above '{1}' table")
-					.format(item.idx, item.receipt_document_type, item.receipt_document))
+				frappe.throw(
+					_("Item Row {0}: {1} {2} does not exist in above '{1}' table").format(
+						item.idx, item.receipt_document_type, item.receipt_document
+					)
+				)
 
 			if not item.cost_center:
-				frappe.throw(_("Row {0}: Cost center is required for an item {1}")
-					.format(item.idx, item.item_code))
+				frappe.throw(
+					_("Row {0}: Cost center is required for an item {1}").format(item.idx, item.item_code)
+				)
 
 	def set_total_taxes_and_charges(self):
 		self.total_taxes_and_charges = sum(flt(d.base_amount) for d in self.get("taxes"))
 
 	def set_applicable_charges_on_item(self):
-		if self.get('taxes') and self.distribute_charges_based_on != 'Distribute Manually':
+		if self.get("taxes") and self.distribute_charges_based_on != "Distribute Manually":
 			total_item_cost = 0.0
 			total_charges = 0.0
 			item_count = 0
 			based_on_field = frappe.scrub(self.distribute_charges_based_on)
 
-			for item in self.get('items'):
+			for item in self.get("items"):
 				total_item_cost += item.get(based_on_field)
 
-			for item in self.get('items'):
-				item.applicable_charges = flt(flt(item.get(based_on_field)) * (flt(self.total_taxes_and_charges) / flt(total_item_cost)),
-					item.precision('applicable_charges'))
+			for item in self.get("items"):
+				item.applicable_charges = flt(
+					flt(item.get(based_on_field)) * (flt(self.total_taxes_and_charges) / flt(total_item_cost)),
+					item.precision("applicable_charges"),
+				)
 				total_charges += item.applicable_charges
 				item_count += 1
 
 			if total_charges != self.total_taxes_and_charges:
 				diff = self.total_taxes_and_charges - total_charges
-				self.get('items')[item_count - 1].applicable_charges += diff
+				self.get("items")[item_count - 1].applicable_charges += diff
 
 	def validate_applicable_charges_for_item(self):
 		based_on = self.distribute_charges_based_on.lower()
 
-		if based_on != 'distribute manually':
+		if based_on != "distribute manually":
 			total = sum(flt(d.get(based_on)) for d in self.get("items"))
 		else:
 			# consider for proportion while distributing manually
-			total = sum(flt(d.get('applicable_charges')) for d in self.get("items"))
+			total = sum(flt(d.get("applicable_charges")) for d in self.get("items"))
 
 		if not total:
-			frappe.throw(_("Total {0} for all items is zero, may be you should change 'Distribute Charges Based On'").format(based_on))
+			frappe.throw(
+				_(
+					"Total {0} for all items is zero, may be you should change 'Distribute Charges Based On'"
+				).format(based_on)
+			)
 
 		total_applicable_charges = sum(flt(d.applicable_charges) for d in self.get("items"))
 
-		precision = get_field_precision(frappe.get_meta("Landed Cost Item").get_field("applicable_charges"),
-		currency=frappe.get_cached_value('Company',  self.company,  "default_currency"))
+		precision = get_field_precision(
+			frappe.get_meta("Landed Cost Item").get_field("applicable_charges"),
+			currency=frappe.get_cached_value("Company", self.company, "default_currency"),
+		)
 
 		diff = flt(self.total_taxes_and_charges) - flt(total_applicable_charges)
 		diff = flt(diff, precision)
@@ -134,7 +155,11 @@
 		if abs(diff) < (2.0 / (10**precision)):
 			self.items[-1].applicable_charges += diff
 		else:
-			frappe.throw(_("Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges"))
+			frappe.throw(
+				_(
+					"Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges"
+				)
+			)
 
 	def on_submit(self):
 		self.update_landed_cost()
@@ -177,25 +202,41 @@
 			doc.repost_future_sle_and_gle()
 
 	def validate_asset_qty_and_status(self, receipt_document_type, receipt_document):
-		for item in self.get('items'):
+		for item in self.get("items"):
 			if item.is_fixed_asset:
-				receipt_document_type = 'purchase_invoice' if item.receipt_document_type == 'Purchase Invoice' \
-						else 'purchase_receipt'
-				docs = frappe.db.get_all('Asset', filters={ receipt_document_type: item.receipt_document,
-					'item_code': item.item_code }, fields=['name', 'docstatus'])
+				receipt_document_type = (
+					"purchase_invoice" if item.receipt_document_type == "Purchase Invoice" else "purchase_receipt"
+				)
+				docs = frappe.db.get_all(
+					"Asset",
+					filters={receipt_document_type: item.receipt_document, "item_code": item.item_code},
+					fields=["name", "docstatus"],
+				)
 				if not docs or len(docs) != item.qty:
-					frappe.throw(_('There are not enough asset created or linked to {0}. Please create or link {1} Assets with respective document.').format(
-						item.receipt_document, item.qty))
+					frappe.throw(
+						_(
+							"There are not enough asset created or linked to {0}. Please create or link {1} Assets with respective document."
+						).format(item.receipt_document, item.qty)
+					)
 				if docs:
 					for d in docs:
 						if d.docstatus == 1:
-							frappe.throw(_('{2} <b>{0}</b> has submitted Assets. Remove Item <b>{1}</b> from table to continue.').format(
-									item.receipt_document, item.item_code, item.receipt_document_type))
+							frappe.throw(
+								_(
+									"{2} <b>{0}</b> has submitted Assets. Remove Item <b>{1}</b> from table to continue."
+								).format(
+									item.receipt_document, item.item_code, item.receipt_document_type
+								)
+							)
 
 	def update_rate_in_serial_no_for_non_asset_items(self, receipt_document):
 		for item in receipt_document.get("items"):
 			if not item.is_fixed_asset and item.serial_no:
 				serial_nos = get_serial_nos(item.serial_no)
 				if serial_nos:
-					frappe.db.sql("update `tabSerial No` set purchase_rate=%s where name in ({0})"
-						.format(", ".join(["%s"]*len(serial_nos))), tuple([item.valuation_rate] + serial_nos))
+					frappe.db.sql(
+						"update `tabSerial No` set purchase_rate=%s where name in ({0})".format(
+							", ".join(["%s"] * len(serial_nos))
+						),
+						tuple([item.valuation_rate] + serial_nos),
+					)
diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
index 6dc4fee..1af9953 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import frappe
 from frappe.tests.utils import FrappeTestCase
 from frappe.utils import add_to_date, flt, now
@@ -22,34 +21,50 @@
 	def test_landed_cost_voucher(self):
 		frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
 
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1",
-			get_multiple_items = True, get_taxes_and_charges = True)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
+			get_multiple_items=True,
+			get_taxes_and_charges=True,
+		)
 
-		last_sle = frappe.db.get_value("Stock Ledger Entry", {
+		last_sle = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
 				"voucher_type": pr.doctype,
 				"voucher_no": pr.name,
 				"item_code": "_Test Item",
 				"warehouse": "Stores - TCP1",
 				"is_cancelled": 0,
 			},
-			fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
+			fieldname=["qty_after_transaction", "stock_value"],
+			as_dict=1,
+		)
 
 		create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company)
 
-		pr_lc_value = frappe.db.get_value("Purchase Receipt Item", {"parent": pr.name}, "landed_cost_voucher_amount")
+		pr_lc_value = frappe.db.get_value(
+			"Purchase Receipt Item", {"parent": pr.name}, "landed_cost_voucher_amount"
+		)
 		self.assertEqual(pr_lc_value, 25.0)
 
-		last_sle_after_landed_cost = frappe.db.get_value("Stock Ledger Entry", {
+		last_sle_after_landed_cost = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
 				"voucher_type": pr.doctype,
 				"voucher_no": pr.name,
 				"item_code": "_Test Item",
 				"warehouse": "Stores - TCP1",
 				"is_cancelled": 0,
 			},
-			fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
+			fieldname=["qty_after_transaction", "stock_value"],
+			as_dict=1,
+		)
 
-		self.assertEqual(last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction)
+		self.assertEqual(
+			last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction
+		)
 		self.assertEqual(last_sle_after_landed_cost.stock_value - last_sle.stock_value, 25.0)
 
 		# assert after submit
@@ -57,24 +72,20 @@
 
 		# Mess up cancelled SLE modified timestamp to check
 		# if they aren't effective in any business logic.
-		frappe.db.set_value("Stock Ledger Entry",
-			{
-				"is_cancelled": 1,
-				"voucher_type": pr.doctype,
-				"voucher_no": pr.name
-			},
-			"is_cancelled", 1,
-			modified=add_to_date(now(), hours=1, as_datetime=True, as_string=True)
+		frappe.db.set_value(
+			"Stock Ledger Entry",
+			{"is_cancelled": 1, "voucher_type": pr.doctype, "voucher_no": pr.name},
+			"is_cancelled",
+			1,
+			modified=add_to_date(now(), hours=1, as_datetime=True, as_string=True),
 		)
 
 		items, warehouses = pr.get_items_and_warehouses()
-		update_gl_entries_after(pr.posting_date, pr.posting_time,
-			warehouses, items, company=pr.company)
+		update_gl_entries_after(pr.posting_date, pr.posting_time, warehouses, items, company=pr.company)
 
 		# reassert after reposting
 		self.assertPurchaseReceiptLCVGLEntries(pr)
 
-
 	def assertPurchaseReceiptLCVGLEntries(self, pr):
 
 		gl_entries = get_gl_entries("Purchase Receipt", pr.name)
@@ -90,54 +101,74 @@
 				"Stock Received But Not Billed - TCP1": [0.0, 500.0],
 				"Expenses Included In Valuation - TCP1": [0.0, 50.0],
 				"_Test Account Customs Duty - TCP1": [0.0, 150],
-				"_Test Account Shipping Charges - TCP1": [0.0, 100.00]
+				"_Test Account Shipping Charges - TCP1": [0.0, 100.00],
 			}
 		else:
 			expected_values = {
 				stock_in_hand_account: [400.0, 0.0],
 				fixed_asset_account: [400.0, 0.0],
 				"Stock Received But Not Billed - TCP1": [0.0, 500.0],
-				"Expenses Included In Valuation - TCP1": [0.0, 300.0]
+				"Expenses Included In Valuation - TCP1": [0.0, 300.0],
 			}
 
 		for gle in gl_entries:
-			if not gle.get('is_cancelled'):
-				self.assertEqual(expected_values[gle.account][0], gle.debit, msg=f"incorrect debit for {gle.account}")
-				self.assertEqual(expected_values[gle.account][1], gle.credit, msg=f"incorrect credit for {gle.account}")
-
+			if not gle.get("is_cancelled"):
+				self.assertEqual(
+					expected_values[gle.account][0], gle.debit, msg=f"incorrect debit for {gle.account}"
+				)
+				self.assertEqual(
+					expected_values[gle.account][1], gle.credit, msg=f"incorrect credit for {gle.account}"
+				)
 
 	def test_landed_cost_voucher_against_purchase_invoice(self):
 
-		pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(),
-			posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1",
-			company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1",
-			warehouse= "Stores - TCP1", cost_center = "Main - TCP1",
-			expense_account ="_Test Account Cost for Goods Sold - TCP1")
+		pi = make_purchase_invoice(
+			update_stock=1,
+			posting_date=frappe.utils.nowdate(),
+			posting_time=frappe.utils.nowtime(),
+			cash_bank_account="Cash - TCP1",
+			company="_Test Company with perpetual inventory",
+			supplier_warehouse="Work In Progress - TCP1",
+			warehouse="Stores - TCP1",
+			cost_center="Main - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+		)
 
-		last_sle = frappe.db.get_value("Stock Ledger Entry", {
+		last_sle = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
 				"voucher_type": pi.doctype,
 				"voucher_no": pi.name,
 				"item_code": "_Test Item",
-				"warehouse": "Stores - TCP1"
+				"warehouse": "Stores - TCP1",
 			},
-			fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
+			fieldname=["qty_after_transaction", "stock_value"],
+			as_dict=1,
+		)
 
 		create_landed_cost_voucher("Purchase Invoice", pi.name, pi.company)
 
-		pi_lc_value = frappe.db.get_value("Purchase Invoice Item", {"parent": pi.name},
-			"landed_cost_voucher_amount")
+		pi_lc_value = frappe.db.get_value(
+			"Purchase Invoice Item", {"parent": pi.name}, "landed_cost_voucher_amount"
+		)
 
 		self.assertEqual(pi_lc_value, 50.0)
 
-		last_sle_after_landed_cost = frappe.db.get_value("Stock Ledger Entry", {
+		last_sle_after_landed_cost = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
 				"voucher_type": pi.doctype,
 				"voucher_no": pi.name,
 				"item_code": "_Test Item",
-				"warehouse": "Stores - TCP1"
+				"warehouse": "Stores - TCP1",
 			},
-			fieldname=["qty_after_transaction", "stock_value"], as_dict=1)
+			fieldname=["qty_after_transaction", "stock_value"],
+			as_dict=1,
+		)
 
-		self.assertEqual(last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction)
+		self.assertEqual(
+			last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction
+		)
 
 		self.assertEqual(last_sle_after_landed_cost.stock_value - last_sle.stock_value, 50.0)
 
@@ -149,20 +180,26 @@
 		expected_values = {
 			stock_in_hand_account: [300.0, 0.0],
 			"Creditors - TCP1": [0.0, 250.0],
-			"Expenses Included In Valuation - TCP1": [0.0, 50.0]
+			"Expenses Included In Valuation - TCP1": [0.0, 50.0],
 		}
 
 		for gle in gl_entries:
-			if not gle.get('is_cancelled'):
+			if not gle.get("is_cancelled"):
 				self.assertEqual(expected_values[gle.account][0], gle.debit)
 				self.assertEqual(expected_values[gle.account][1], gle.credit)
 
-
 	def test_landed_cost_voucher_for_serialized_item(self):
-		frappe.db.sql("delete from `tabSerial No` where name in ('SN001', 'SN002', 'SN003', 'SN004', 'SN005')")
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1",
-		supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True,
-		get_taxes_and_charges = True, do_not_submit = True)
+		frappe.db.sql(
+			"delete from `tabSerial No` where name in ('SN001', 'SN002', 'SN003', 'SN004', 'SN005')"
+		)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
+			get_multiple_items=True,
+			get_taxes_and_charges=True,
+			do_not_submit=True,
+		)
 
 		pr.items[0].item_code = "_Test Serialized Item"
 		pr.items[0].serial_no = "SN001\nSN002\nSN003\nSN004\nSN005"
@@ -172,8 +209,7 @@
 
 		create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company)
 
-		serial_no = frappe.db.get_value("Serial No", "SN001",
-			["warehouse", "purchase_rate"], as_dict=1)
+		serial_no = frappe.db.get_value("Serial No", "SN001", ["warehouse", "purchase_rate"], as_dict=1)
 
 		self.assertEqual(serial_no.purchase_rate - serial_no_rate, 5.0)
 		self.assertEqual(serial_no.warehouse, "Stores - TCP1")
@@ -183,60 +219,82 @@
 		landed costs, this should be allowed for serial nos too.
 
 		Case:
-			- receipt a serial no @ X rate
-			- delivery the serial no @ X rate
-			- add LCV to receipt X + Y
-			- LCV should be successful
-			- delivery should reflect X+Y valuation.
+		        - receipt a serial no @ X rate
+		        - delivery the serial no @ X rate
+		        - add LCV to receipt X + Y
+		        - LCV should be successful
+		        - delivery should reflect X+Y valuation.
 		"""
 		serial_no = "LCV_TEST_SR_NO"
 		item_code = "_Test Serialized Item"
 		warehouse = "Stores - TCP1"
 
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory",
-				warehouse=warehouse, qty=1, rate=200,
-				item_code=item_code, serial_no=serial_no)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse=warehouse,
+			qty=1,
+			rate=200,
+			item_code=item_code,
+			serial_no=serial_no,
+		)
 
 		serial_no_rate = frappe.db.get_value("Serial No", serial_no, "purchase_rate")
 
 		# deliver it before creating LCV
-		dn = create_delivery_note(item_code=item_code,
-				company='_Test Company with perpetual inventory', warehouse='Stores - TCP1',
-				serial_no=serial_no, qty=1, rate=500,
-				cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1")
+		dn = create_delivery_note(
+			item_code=item_code,
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			serial_no=serial_no,
+			qty=1,
+			rate=500,
+			cost_center="Main - TCP1",
+			expense_account="Cost of Goods Sold - TCP1",
+		)
 
 		charges = 10
 		create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company, charges=charges)
 
 		new_purchase_rate = serial_no_rate + charges
 
-		serial_no = frappe.db.get_value("Serial No", serial_no,
-			["warehouse", "purchase_rate"], as_dict=1)
+		serial_no = frappe.db.get_value(
+			"Serial No", serial_no, ["warehouse", "purchase_rate"], as_dict=1
+		)
 
 		self.assertEqual(serial_no.purchase_rate, new_purchase_rate)
 
-		stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
-				filters={
-					"voucher_no": dn.name,
-					"voucher_type": dn.doctype,
-					"is_cancelled": 0  # LCV cancels with same name.
-				},
-				fieldname="stock_value_difference")
+		stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
+			filters={
+				"voucher_no": dn.name,
+				"voucher_type": dn.doctype,
+				"is_cancelled": 0,  # LCV cancels with same name.
+			},
+			fieldname="stock_value_difference",
+		)
 
 		# reposting should update the purchase rate in future delivery
 		self.assertEqual(stock_value_difference, -new_purchase_rate)
 
-	def test_landed_cost_voucher_for_odd_numbers (self):
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", do_not_save=True)
+	def test_landed_cost_voucher_for_odd_numbers(self):
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
+			do_not_save=True,
+		)
 		pr.items[0].cost_center = "Main - TCP1"
 		for x in range(2):
-			pr.append("items", {
-				"item_code": "_Test Item",
-				"warehouse": "Stores - TCP1",
-				"cost_center": "Main - TCP1",
-				"qty": 5,
-				"rate": 50
-			})
+			pr.append(
+				"items",
+				{
+					"item_code": "_Test Item",
+					"warehouse": "Stores - TCP1",
+					"cost_center": "Main - TCP1",
+					"qty": 5,
+					"rate": 50,
+				},
+			)
 		pr.submit()
 
 		lcv = create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company, 123.22)
@@ -245,37 +303,50 @@
 		self.assertEqual(flt(lcv.items[2].applicable_charges, 2), 41.08)
 
 	def test_multiple_landed_cost_voucher_against_pr(self):
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1",
-			supplier_warehouse = "Stores - TCP1", do_not_save=True)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Stores - TCP1",
+			do_not_save=True,
+		)
 
-		pr.append("items", {
-			"item_code": "_Test Item",
-			"warehouse": "Stores - TCP1",
-			"cost_center": "Main - TCP1",
-			"qty": 5,
-			"rate": 100
-		})
+		pr.append(
+			"items",
+			{
+				"item_code": "_Test Item",
+				"warehouse": "Stores - TCP1",
+				"cost_center": "Main - TCP1",
+				"qty": 5,
+				"rate": 100,
+			},
+		)
 
 		pr.submit()
 
-		lcv1 = make_landed_cost_voucher(company = pr.company, receipt_document_type = 'Purchase Receipt',
-			receipt_document=pr.name, charges=100, do_not_save=True)
+		lcv1 = make_landed_cost_voucher(
+			company=pr.company,
+			receipt_document_type="Purchase Receipt",
+			receipt_document=pr.name,
+			charges=100,
+			do_not_save=True,
+		)
 
 		lcv1.insert()
-		lcv1.set('items', [
-			lcv1.get('items')[0]
-		])
+		lcv1.set("items", [lcv1.get("items")[0]])
 		distribute_landed_cost_on_items(lcv1)
 
 		lcv1.submit()
 
-		lcv2 = make_landed_cost_voucher(company = pr.company, receipt_document_type = 'Purchase Receipt',
-			receipt_document=pr.name, charges=100, do_not_save=True)
+		lcv2 = make_landed_cost_voucher(
+			company=pr.company,
+			receipt_document_type="Purchase Receipt",
+			receipt_document=pr.name,
+			charges=100,
+			do_not_save=True,
+		)
 
 		lcv2.insert()
-		lcv2.set('items', [
-			lcv2.get('items')[1]
-		])
+		lcv2.set("items", [lcv2.get("items")[1]])
 		distribute_landed_cost_on_items(lcv2)
 
 		lcv2.submit()
@@ -294,22 +365,31 @@
 		save_new_records(test_records)
 
 		## Create USD Shipping charges_account
-		usd_shipping = create_account(account_name="Shipping Charges USD",
-			parent_account="Duties and Taxes - TCP1", company="_Test Company with perpetual inventory",
-			account_currency="USD")
+		usd_shipping = create_account(
+			account_name="Shipping Charges USD",
+			parent_account="Duties and Taxes - TCP1",
+			company="_Test Company with perpetual inventory",
+			account_currency="USD",
+		)
 
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1",
-			supplier_warehouse = "Stores - TCP1")
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Stores - TCP1",
+		)
 		pr.submit()
 
-		lcv = make_landed_cost_voucher(company = pr.company, receipt_document_type = "Purchase Receipt",
-			receipt_document=pr.name, charges=100, do_not_save=True)
+		lcv = make_landed_cost_voucher(
+			company=pr.company,
+			receipt_document_type="Purchase Receipt",
+			receipt_document=pr.name,
+			charges=100,
+			do_not_save=True,
+		)
 
-		lcv.append("taxes", {
-			"description": "Shipping Charges",
-			"expense_account": usd_shipping,
-			"amount": 10
-		})
+		lcv.append(
+			"taxes", {"description": "Shipping Charges", "expense_account": usd_shipping, "amount": 10}
+		)
 
 		lcv.save()
 		lcv.submit()
@@ -319,12 +399,18 @@
 		self.assertEqual(lcv.total_taxes_and_charges, 729)
 		self.assertEqual(pr.items[0].landed_cost_voucher_amount, 729)
 
-		gl_entries = frappe.get_all("GL Entry", fields=["account", "credit", "credit_in_account_currency"],
-			filters={"voucher_no": pr.name, "account": ("in", ["Shipping Charges USD - TCP1", "Expenses Included In Valuation - TCP1"])})
+		gl_entries = frappe.get_all(
+			"GL Entry",
+			fields=["account", "credit", "credit_in_account_currency"],
+			filters={
+				"voucher_no": pr.name,
+				"account": ("in", ["Shipping Charges USD - TCP1", "Expenses Included In Valuation - TCP1"]),
+			},
+		)
 
 		expected_gl_entries = {
 			"Shipping Charges USD - TCP1": [629, 10],
-			"Expenses Included In Valuation - TCP1": [100, 100]
+			"Expenses Included In Valuation - TCP1": [100, 100],
 		}
 
 		for entry in gl_entries:
@@ -334,7 +420,9 @@
 
 	def test_asset_lcv(self):
 		"Check if LCV for an Asset updates the Assets Gross Purchase Amount correctly."
-		frappe.db.set_value("Company", "_Test Company", "capital_work_in_progress_account", "CWIP Account - _TC")
+		frappe.db.set_value(
+			"Company", "_Test Company", "capital_work_in_progress_account", "CWIP Account - _TC"
+		)
 
 		if not frappe.db.exists("Asset Category", "Computers"):
 			create_asset_category()
@@ -345,15 +433,16 @@
 		pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=50000)
 
 		# check if draft asset was created
-		assets = frappe.db.get_all('Asset', filters={'purchase_receipt': pr.name})
+		assets = frappe.db.get_all("Asset", filters={"purchase_receipt": pr.name})
 		self.assertEqual(len(assets), 1)
 
 		lcv = make_landed_cost_voucher(
-			company = pr.company,
-			receipt_document_type = "Purchase Receipt",
+			company=pr.company,
+			receipt_document_type="Purchase Receipt",
 			receipt_document=pr.name,
 			charges=80,
-			expense_account="Expenses Included In Valuation - _TC")
+			expense_account="Expenses Included In Valuation - _TC",
+		)
 
 		lcv.save()
 		lcv.submit()
@@ -365,27 +454,38 @@
 		lcv.cancel()
 		pr.cancel()
 
-def make_landed_cost_voucher(** args):
+
+def make_landed_cost_voucher(**args):
 	args = frappe._dict(args)
 	ref_doc = frappe.get_doc(args.receipt_document_type, args.receipt_document)
 
-	lcv = frappe.new_doc('Landed Cost Voucher')
-	lcv.company = args.company or '_Test Company'
-	lcv.distribute_charges_based_on = 'Amount'
+	lcv = frappe.new_doc("Landed Cost Voucher")
+	lcv.company = args.company or "_Test Company"
+	lcv.distribute_charges_based_on = "Amount"
 
-	lcv.set('purchase_receipts', [{
-		"receipt_document_type": args.receipt_document_type,
-		"receipt_document": args.receipt_document,
-		"supplier": ref_doc.supplier,
-		"posting_date": ref_doc.posting_date,
-		"grand_total": ref_doc.grand_total
-	}])
+	lcv.set(
+		"purchase_receipts",
+		[
+			{
+				"receipt_document_type": args.receipt_document_type,
+				"receipt_document": args.receipt_document,
+				"supplier": ref_doc.supplier,
+				"posting_date": ref_doc.posting_date,
+				"grand_total": ref_doc.grand_total,
+			}
+		],
+	)
 
-	lcv.set("taxes", [{
-		"description": "Shipping Charges",
-		"expense_account": args.expense_account or "Expenses Included In Valuation - TCP1",
-		"amount": args.charges
-	}])
+	lcv.set(
+		"taxes",
+		[
+			{
+				"description": "Shipping Charges",
+				"expense_account": args.expense_account or "Expenses Included In Valuation - TCP1",
+				"amount": args.charges,
+			}
+		],
+	)
 
 	if not args.do_not_save:
 		lcv.insert()
@@ -400,21 +500,31 @@
 
 	lcv = frappe.new_doc("Landed Cost Voucher")
 	lcv.company = company
-	lcv.distribute_charges_based_on = 'Amount'
+	lcv.distribute_charges_based_on = "Amount"
 
-	lcv.set("purchase_receipts", [{
-		"receipt_document_type": receipt_document_type,
-		"receipt_document": receipt_document,
-		"supplier": ref_doc.supplier,
-		"posting_date": ref_doc.posting_date,
-		"grand_total": ref_doc.base_grand_total
-	}])
+	lcv.set(
+		"purchase_receipts",
+		[
+			{
+				"receipt_document_type": receipt_document_type,
+				"receipt_document": receipt_document,
+				"supplier": ref_doc.supplier,
+				"posting_date": ref_doc.posting_date,
+				"grand_total": ref_doc.base_grand_total,
+			}
+		],
+	)
 
-	lcv.set("taxes", [{
-		"description": "Insurance Charges",
-		"expense_account": "Expenses Included In Valuation - TCP1",
-		"amount": charges
-	}])
+	lcv.set(
+		"taxes",
+		[
+			{
+				"description": "Insurance Charges",
+				"expense_account": "Expenses Included In Valuation - TCP1",
+				"amount": charges,
+			}
+		],
+	)
 
 	lcv.insert()
 
@@ -424,6 +534,7 @@
 
 	return lcv
 
+
 def distribute_landed_cost_on_items(lcv):
 	based_on = lcv.distribute_charges_based_on.lower()
 	total = sum(flt(d.get(based_on)) for d in lcv.get("items"))
@@ -432,4 +543,5 @@
 		item.applicable_charges = flt(item.get(based_on)) * flt(lcv.total_taxes_and_charges) / flt(total)
 		item.applicable_charges = flt(item.applicable_charges, lcv.precision("applicable_charges", item))
 
-test_records = frappe.get_test_records('Landed Cost Voucher')
+
+test_records = frappe.get_test_records("Landed Cost Voucher")
diff --git a/erpnext/stock/doctype/manufacturer/test_manufacturer.py b/erpnext/stock/doctype/manufacturer/test_manufacturer.py
index 6632347..e176b28 100644
--- a/erpnext/stock/doctype/manufacturer/test_manufacturer.py
+++ b/erpnext/stock/doctype/manufacturer/test_manufacturer.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('Manufacturer')
 
+
 class TestManufacturer(unittest.TestCase):
 	pass
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 49fefae..4524914 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -18,9 +18,8 @@
 from erpnext.stock.doctype.item.item import get_item_defaults
 from erpnext.stock.stock_balance import get_indented_qty, update_bin_qty
 
-form_grid_templates = {
-	"items": "templates/form_grid/material_request_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/material_request_grid.html"}
+
 
 class MaterialRequest(BuyingController):
 	def get_feed(self):
@@ -30,8 +29,8 @@
 		pass
 
 	def validate_qty_against_so(self):
-		so_items = {} # Format --> {'SO/00001': {'Item/001': 120, 'Item/002': 24}}
-		for d in self.get('items'):
+		so_items = {}  # Format --> {'SO/00001': {'Item/001': 120, 'Item/002': 24}}
+		for d in self.get("items"):
 			if d.sales_order:
 				if not d.sales_order in so_items:
 					so_items[d.sales_order] = {d.item_code: flt(d.qty)}
@@ -43,24 +42,34 @@
 
 		for so_no in so_items.keys():
 			for item in so_items[so_no].keys():
-				already_indented = frappe.db.sql("""select sum(qty)
+				already_indented = frappe.db.sql(
+					"""select sum(qty)
 					from `tabMaterial Request Item`
 					where item_code = %s and sales_order = %s and
-					docstatus = 1 and parent != %s""", (item, so_no, self.name))
+					docstatus = 1 and parent != %s""",
+					(item, so_no, self.name),
+				)
 				already_indented = already_indented and flt(already_indented[0][0]) or 0
 
-				actual_so_qty = frappe.db.sql("""select sum(stock_qty) from `tabSales Order Item`
-					where parent = %s and item_code = %s and docstatus = 1""", (so_no, item))
+				actual_so_qty = frappe.db.sql(
+					"""select sum(stock_qty) from `tabSales Order Item`
+					where parent = %s and item_code = %s and docstatus = 1""",
+					(so_no, item),
+				)
 				actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0
 
 				if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty):
-					frappe.throw(_("Material Request of maximum {0} can be made for Item {1} against Sales Order {2}").format(actual_so_qty - already_indented, item, so_no))
+					frappe.throw(
+						_("Material Request of maximum {0} can be made for Item {1} against Sales Order {2}").format(
+							actual_so_qty - already_indented, item, so_no
+						)
+					)
 
 	def validate(self):
 		super(MaterialRequest, self).validate()
 
 		self.validate_schedule_date()
-		self.check_for_on_hold_or_closed_status('Sales Order', 'sales_order')
+		self.check_for_on_hold_or_closed_status("Sales Order", "sales_order")
 		self.validate_uom_is_integer("uom", "qty")
 		self.validate_material_request_type()
 
@@ -68,9 +77,22 @@
 			self.status = "Draft"
 
 		from erpnext.controllers.status_updater import validate_status
-		validate_status(self.status,
-			["Draft", "Submitted", "Stopped", "Cancelled", "Pending",
-			"Partially Ordered", "Ordered", "Issued", "Transferred", "Received"])
+
+		validate_status(
+			self.status,
+			[
+				"Draft",
+				"Submitted",
+				"Stopped",
+				"Cancelled",
+				"Pending",
+				"Partially Ordered",
+				"Ordered",
+				"Issued",
+				"Transferred",
+				"Received",
+			],
+		)
 
 		validate_for_items(self)
 
@@ -86,22 +108,22 @@
 		self.validate_schedule_date()
 
 	def validate_material_request_type(self):
-		""" Validate fields in accordance with selected type """
+		"""Validate fields in accordance with selected type"""
 
 		if self.material_request_type != "Customer Provided":
 			self.customer = None
 
 	def set_title(self):
-		'''Set title as comma separated list of items'''
+		"""Set title as comma separated list of items"""
 		if not self.title:
-			items = ', '.join([d.item_name for d in self.items][:3])
-			self.title = _('{0} Request for {1}').format(self.material_request_type, items)[:100]
+			items = ", ".join([d.item_name for d in self.items][:3])
+			self.title = _("{0} Request for {1}").format(self.material_request_type, items)[:100]
 
 	def on_submit(self):
 		# frappe.db.set(self, 'status', 'Submitted')
 		self.update_requested_qty()
 		self.update_requested_qty_in_production_plan()
-		if self.material_request_type == 'Purchase':
+		if self.material_request_type == "Purchase":
 			self.validate_budget()
 
 	def before_save(self):
@@ -114,13 +136,15 @@
 		# if MRQ is already closed, no point saving the document
 		check_on_hold_or_closed_status(self.doctype, self.name)
 
-		self.set_status(update=True, status='Cancelled')
+		self.set_status(update=True, status="Cancelled")
 
 	def check_modified_date(self):
-		mod_db = frappe.db.sql("""select modified from `tabMaterial Request` where name = %s""",
-			self.name)
-		date_diff = frappe.db.sql("""select TIMEDIFF('%s', '%s')"""
-			% (mod_db[0][0], cstr(self.modified)))
+		mod_db = frappe.db.sql(
+			"""select modified from `tabMaterial Request` where name = %s""", self.name
+		)
+		date_diff = frappe.db.sql(
+			"""select TIMEDIFF('%s', '%s')""" % (mod_db[0][0], cstr(self.modified))
+		)
 
 		if date_diff and date_diff[0][0]:
 			frappe.throw(_("{0} {1} has been modified. Please refresh.").format(_(self.doctype), self.name))
@@ -136,22 +160,24 @@
 		validates that `status` is acceptable for the present controller status
 		and throws an Exception if otherwise.
 		"""
-		if self.status and self.status == 'Cancelled':
+		if self.status and self.status == "Cancelled":
 			# cancelled documents cannot change
 			if status != self.status:
 				frappe.throw(
-					_("{0} {1} is cancelled so the action cannot be completed").
-						format(_(self.doctype), self.name),
-					frappe.InvalidStatusError
+					_("{0} {1} is cancelled so the action cannot be completed").format(
+						_(self.doctype), self.name
+					),
+					frappe.InvalidStatusError,
 				)
 
-		elif self.status and self.status == 'Draft':
+		elif self.status and self.status == "Draft":
 			# draft document to pending only
-			if status != 'Pending':
+			if status != "Pending":
 				frappe.throw(
-					_("{0} {1} has not been submitted so the action cannot be completed").
-						format(_(self.doctype), self.name),
-					frappe.InvalidStatusError
+					_("{0} {1} has not been submitted so the action cannot be completed").format(
+						_(self.doctype), self.name
+					),
+					frappe.InvalidStatusError,
 				)
 
 	def on_cancel(self):
@@ -168,67 +194,90 @@
 		for d in self.get("items"):
 			if d.name in mr_items:
 				if self.material_request_type in ("Material Issue", "Material Transfer", "Customer Provided"):
-					d.ordered_qty =  flt(frappe.db.sql("""select sum(transfer_qty)
+					d.ordered_qty = flt(
+						frappe.db.sql(
+							"""select sum(transfer_qty)
 						from `tabStock Entry Detail` where material_request = %s
 						and material_request_item = %s and docstatus = 1""",
-						(self.name, d.name))[0][0])
-					mr_qty_allowance = frappe.db.get_single_value('Stock Settings', 'mr_qty_allowance')
+							(self.name, d.name),
+						)[0][0]
+					)
+					mr_qty_allowance = frappe.db.get_single_value("Stock Settings", "mr_qty_allowance")
 
 					if mr_qty_allowance:
-						allowed_qty = d.qty + (d.qty * (mr_qty_allowance/100))
+						allowed_qty = d.qty + (d.qty * (mr_qty_allowance / 100))
 						if d.ordered_qty and d.ordered_qty > allowed_qty:
-							frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1}  \
-								cannot be greater than allowed requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, allowed_qty, d.item_code))
+							frappe.throw(
+								_(
+									"The total Issue / Transfer quantity {0} in Material Request {1}  \
+								cannot be greater than allowed requested quantity {2} for Item {3}"
+								).format(d.ordered_qty, d.parent, allowed_qty, d.item_code)
+							)
 
 					elif d.ordered_qty and d.ordered_qty > d.stock_qty:
-						frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1}  \
-							cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
+						frappe.throw(
+							_(
+								"The total Issue / Transfer quantity {0} in Material Request {1}  \
+							cannot be greater than requested quantity {2} for Item {3}"
+							).format(d.ordered_qty, d.parent, d.qty, d.item_code)
+						)
 
 				elif self.material_request_type == "Manufacture":
-					d.ordered_qty = flt(frappe.db.sql("""select sum(qty)
+					d.ordered_qty = flt(
+						frappe.db.sql(
+							"""select sum(qty)
 						from `tabWork Order` where material_request = %s
 						and material_request_item = %s and docstatus = 1""",
-						(self.name, d.name))[0][0])
+							(self.name, d.name),
+						)[0][0]
+					)
 
 				frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
 
-		self._update_percent_field({
-			"target_dt": "Material Request Item",
-			"target_parent_dt": self.doctype,
-			"target_parent_field": "per_ordered",
-			"target_ref_field": "stock_qty",
-			"target_field": "ordered_qty",
-			"name": self.name,
-		}, update_modified)
+		self._update_percent_field(
+			{
+				"target_dt": "Material Request Item",
+				"target_parent_dt": self.doctype,
+				"target_parent_field": "per_ordered",
+				"target_ref_field": "stock_qty",
+				"target_field": "ordered_qty",
+				"name": self.name,
+			},
+			update_modified,
+		)
 
 	def update_requested_qty(self, mr_item_rows=None):
 		"""update requested qty (before ordered_qty is updated)"""
 		item_wh_list = []
 		for d in self.get("items"):
-			if (not mr_item_rows or d.name in mr_item_rows) and [d.item_code, d.warehouse] not in item_wh_list \
-					and d.warehouse and frappe.db.get_value("Item", d.item_code, "is_stock_item") == 1 :
+			if (
+				(not mr_item_rows or d.name in mr_item_rows)
+				and [d.item_code, d.warehouse] not in item_wh_list
+				and d.warehouse
+				and frappe.db.get_value("Item", d.item_code, "is_stock_item") == 1
+			):
 				item_wh_list.append([d.item_code, d.warehouse])
 
 		for item_code, warehouse in item_wh_list:
-			update_bin_qty(item_code, warehouse, {
-				"indented_qty": get_indented_qty(item_code, warehouse)
-			})
+			update_bin_qty(item_code, warehouse, {"indented_qty": get_indented_qty(item_code, warehouse)})
 
 	def update_requested_qty_in_production_plan(self):
 		production_plans = []
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.production_plan and d.material_request_plan_item:
 				qty = d.qty if self.docstatus == 1 else 0
-				frappe.db.set_value('Material Request Plan Item',
-					d.material_request_plan_item, 'requested_qty', qty)
+				frappe.db.set_value(
+					"Material Request Plan Item", d.material_request_plan_item, "requested_qty", qty
+				)
 
 				if d.production_plan not in production_plans:
 					production_plans.append(d.production_plan)
 
 		for production_plan in production_plans:
-			doc = frappe.get_doc('Production Plan', production_plan)
+			doc = frappe.get_doc("Production Plan", production_plan)
 			doc.set_status()
-			doc.db_set('status', doc.status)
+			doc.db_set("status", doc.status)
+
 
 def update_completed_and_requested_qty(stock_entry, method):
 	if stock_entry.doctype == "Stock Entry":
@@ -243,43 +292,55 @@
 				mr_obj = frappe.get_doc("Material Request", mr)
 
 				if mr_obj.status in ["Stopped", "Cancelled"]:
-					frappe.throw(_("{0} {1} is cancelled or stopped").format(_("Material Request"), mr),
-						frappe.InvalidStatusError)
+					frappe.throw(
+						_("{0} {1} is cancelled or stopped").format(_("Material Request"), mr),
+						frappe.InvalidStatusError,
+					)
 
 				mr_obj.update_completed_qty(mr_item_rows)
 				mr_obj.update_requested_qty(mr_item_rows)
 
+
 def set_missing_values(source, target_doc):
-	if target_doc.doctype == "Purchase Order" and getdate(target_doc.schedule_date) <  getdate(nowdate()):
+	if target_doc.doctype == "Purchase Order" and getdate(target_doc.schedule_date) < getdate(
+		nowdate()
+	):
 		target_doc.schedule_date = None
 	target_doc.run_method("set_missing_values")
 	target_doc.run_method("calculate_taxes_and_totals")
 
+
 def update_item(obj, target, source_parent):
 	target.conversion_factor = obj.conversion_factor
-	target.qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty))/ target.conversion_factor
-	target.stock_qty = (target.qty * target.conversion_factor)
+	target.qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty)) / target.conversion_factor
+	target.stock_qty = target.qty * target.conversion_factor
 	if getdate(target.schedule_date) < getdate(nowdate()):
 		target.schedule_date = None
 
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
+
 	list_context = get_list_context(context)
-	list_context.update({
-		'show_sidebar': True,
-		'show_search': True,
-		'no_breadcrumbs': True,
-		'title': _('Material Request'),
-	})
+	list_context.update(
+		{
+			"show_sidebar": True,
+			"show_search": True,
+			"no_breadcrumbs": True,
+			"title": _("Material Request"),
+		}
+	)
 
 	return list_context
 
+
 @frappe.whitelist()
 def update_status(name, status):
-	material_request = frappe.get_doc('Material Request', name)
-	material_request.check_permission('write')
+	material_request = frappe.get_doc("Material Request", name)
+	material_request.check_permission("write")
 	material_request.update_status(status)
 
+
 @frappe.whitelist()
 def make_purchase_order(source_name, target_doc=None, args=None):
 	if args is None:
@@ -292,7 +353,7 @@
 			# items only for given default supplier
 			supplier_items = []
 			for d in target_doc.items:
-				default_supplier = get_item_defaults(d.item_code, target_doc.company).get('default_supplier')
+				default_supplier = get_item_defaults(d.item_code, target_doc.company).get("default_supplier")
 				if frappe.flags.args.default_supplier == default_supplier:
 					supplier_items.append(d)
 			target_doc.items = supplier_items
@@ -300,58 +361,65 @@
 		set_missing_values(source, target_doc)
 
 	def select_item(d):
-		filtered_items = args.get('filtered_children', [])
+		filtered_items = args.get("filtered_children", [])
 		child_filter = d.name in filtered_items if filtered_items else True
 
 		return d.ordered_qty < d.stock_qty and child_filter
 
-	doclist = get_mapped_doc("Material Request", source_name, {
-		"Material Request": {
-			"doctype": "Purchase Order",
-			"validation": {
-				"docstatus": ["=", 1],
-				"material_request_type": ["=", "Purchase"]
-			}
+	doclist = get_mapped_doc(
+		"Material Request",
+		source_name,
+		{
+			"Material Request": {
+				"doctype": "Purchase Order",
+				"validation": {"docstatus": ["=", 1], "material_request_type": ["=", "Purchase"]},
+			},
+			"Material Request Item": {
+				"doctype": "Purchase Order Item",
+				"field_map": [
+					["name", "material_request_item"],
+					["parent", "material_request"],
+					["uom", "stock_uom"],
+					["uom", "uom"],
+					["sales_order", "sales_order"],
+					["sales_order_item", "sales_order_item"],
+				],
+				"postprocess": update_item,
+				"condition": select_item,
+			},
 		},
-		"Material Request Item": {
-			"doctype": "Purchase Order Item",
-			"field_map": [
-				["name", "material_request_item"],
-				["parent", "material_request"],
-				["uom", "stock_uom"],
-				["uom", "uom"],
-				["sales_order", "sales_order"],
-				["sales_order_item", "sales_order_item"]
-			],
-			"postprocess": update_item,
-			"condition": select_item
-		}
-	}, target_doc, postprocess)
+		target_doc,
+		postprocess,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_request_for_quotation(source_name, target_doc=None):
-	doclist = get_mapped_doc("Material Request", source_name, {
-		"Material Request": {
-			"doctype": "Request for Quotation",
-			"validation": {
-				"docstatus": ["=", 1],
-				"material_request_type": ["=", "Purchase"]
-			}
+	doclist = get_mapped_doc(
+		"Material Request",
+		source_name,
+		{
+			"Material Request": {
+				"doctype": "Request for Quotation",
+				"validation": {"docstatus": ["=", 1], "material_request_type": ["=", "Purchase"]},
+			},
+			"Material Request Item": {
+				"doctype": "Request for Quotation Item",
+				"field_map": [
+					["name", "material_request_item"],
+					["parent", "material_request"],
+					["uom", "uom"],
+				],
+			},
 		},
-		"Material Request Item": {
-			"doctype": "Request for Quotation Item",
-			"field_map": [
-				["name", "material_request_item"],
-				["parent", "material_request"],
-				["uom", "uom"]
-			]
-		}
-	}, target_doc)
+		target_doc,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_purchase_order_based_on_supplier(source_name, target_doc=None, args=None):
 	mr = source_name
@@ -362,43 +430,59 @@
 		target_doc.supplier = args.get("supplier")
 		if getdate(target_doc.schedule_date) < getdate(nowdate()):
 			target_doc.schedule_date = None
-		target_doc.set("items", [d for d in target_doc.get("items")
-			if d.get("item_code") in supplier_items and d.get("qty") > 0])
+		target_doc.set(
+			"items",
+			[
+				d for d in target_doc.get("items") if d.get("item_code") in supplier_items and d.get("qty") > 0
+			],
+		)
 
 		set_missing_values(source, target_doc)
 
-	target_doc = get_mapped_doc("Material Request", mr, {
-		"Material Request": {
-			"doctype": "Purchase Order",
+	target_doc = get_mapped_doc(
+		"Material Request",
+		mr,
+		{
+			"Material Request": {
+				"doctype": "Purchase Order",
+			},
+			"Material Request Item": {
+				"doctype": "Purchase Order Item",
+				"field_map": [
+					["name", "material_request_item"],
+					["parent", "material_request"],
+					["uom", "stock_uom"],
+					["uom", "uom"],
+				],
+				"postprocess": update_item,
+				"condition": lambda doc: doc.ordered_qty < doc.qty,
+			},
 		},
-		"Material Request Item": {
-			"doctype": "Purchase Order Item",
-			"field_map": [
-				["name", "material_request_item"],
-				["parent", "material_request"],
-				["uom", "stock_uom"],
-				["uom", "uom"]
-			],
-			"postprocess": update_item,
-			"condition": lambda doc: doc.ordered_qty < doc.qty
-		}
-	}, target_doc, postprocess)
+		target_doc,
+		postprocess,
+	)
 
 	return target_doc
 
+
 @frappe.whitelist()
 def get_items_based_on_default_supplier(supplier):
-	supplier_items = [d.parent for d in frappe.db.get_all("Item Default",
-		{"default_supplier": supplier, "parenttype": "Item"}, 'parent')]
+	supplier_items = [
+		d.parent
+		for d in frappe.db.get_all(
+			"Item Default", {"default_supplier": supplier, "parenttype": "Item"}, "parent"
+		)
+	]
 
 	return supplier_items
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_material_requests_based_on_supplier(doctype, txt, searchfield, start, page_len, filters):
 	conditions = ""
 	if txt:
-		conditions += "and mr.name like '%%"+txt+"%%' "
+		conditions += "and mr.name like '%%" + txt + "%%' "
 
 	if filters.get("transaction_date"):
 		date = filters.get("transaction_date")[1]
@@ -410,7 +494,8 @@
 	if not supplier_items:
 		frappe.throw(_("{0} is not the default supplier for any items.").format(supplier))
 
-	material_requests = frappe.db.sql("""select distinct mr.name, transaction_date,company
+	material_requests = frappe.db.sql(
+		"""select distinct mr.name, transaction_date,company
 		from `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
 		where mr.name = mr_item.parent
 			and mr_item.item_code in ({0})
@@ -421,12 +506,16 @@
 			and mr.company = '{1}'
 			{2}
 		order by mr_item.item_code ASC
-		limit {3} offset {4} """ \
-		.format(', '.join(['%s']*len(supplier_items)), filters.get("company"), conditions, page_len, start),
-		tuple(supplier_items), as_dict=1)
+		limit {3} offset {4} """.format(
+			", ".join(["%s"] * len(supplier_items)), filters.get("company"), conditions, page_len, start
+		),
+		tuple(supplier_items),
+		as_dict=1,
+	)
 
 	return material_requests
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def get_default_supplier_query(doctype, txt, searchfield, start, page_len, filters):
@@ -435,47 +524,63 @@
 	for d in doc.items:
 		item_list.append(d.item_code)
 
-	return frappe.db.sql("""select default_supplier
+	return frappe.db.sql(
+		"""select default_supplier
 		from `tabItem Default`
 		where parent in ({0}) and
 		default_supplier IS NOT NULL
-		""".format(', '.join(['%s']*len(item_list))),tuple(item_list))
+		""".format(
+			", ".join(["%s"] * len(item_list))
+		),
+		tuple(item_list),
+	)
+
 
 @frappe.whitelist()
 def make_supplier_quotation(source_name, target_doc=None):
 	def postprocess(source, target_doc):
 		set_missing_values(source, target_doc)
 
-	doclist = get_mapped_doc("Material Request", source_name, {
-		"Material Request": {
-			"doctype": "Supplier Quotation",
-			"validation": {
-				"docstatus": ["=", 1],
-				"material_request_type": ["=", "Purchase"]
-			}
+	doclist = get_mapped_doc(
+		"Material Request",
+		source_name,
+		{
+			"Material Request": {
+				"doctype": "Supplier Quotation",
+				"validation": {"docstatus": ["=", 1], "material_request_type": ["=", "Purchase"]},
+			},
+			"Material Request Item": {
+				"doctype": "Supplier Quotation Item",
+				"field_map": {
+					"name": "material_request_item",
+					"parent": "material_request",
+					"sales_order": "sales_order",
+				},
+			},
 		},
-		"Material Request Item": {
-			"doctype": "Supplier Quotation Item",
-			"field_map": {
-				"name": "material_request_item",
-				"parent": "material_request",
-				"sales_order": "sales_order"
-			}
-		}
-	}, target_doc, postprocess)
+		target_doc,
+		postprocess,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_stock_entry(source_name, target_doc=None):
 	def update_item(obj, target, source_parent):
-		qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty))/ target.conversion_factor \
-			if flt(obj.stock_qty) > flt(obj.ordered_qty) else 0
+		qty = (
+			flt(flt(obj.stock_qty) - flt(obj.ordered_qty)) / target.conversion_factor
+			if flt(obj.stock_qty) > flt(obj.ordered_qty)
+			else 0
+		)
 		target.qty = qty
 		target.transfer_qty = qty * obj.conversion_factor
 		target.conversion_factor = obj.conversion_factor
 
-		if source_parent.material_request_type == "Material Transfer" or source_parent.material_request_type == "Customer Provided":
+		if (
+			source_parent.material_request_type == "Material Transfer"
+			or source_parent.material_request_type == "Customer Provided"
+		):
 			target.t_warehouse = obj.warehouse
 		else:
 			target.s_warehouse = obj.warehouse
@@ -489,7 +594,7 @@
 	def set_missing_values(source, target):
 		target.purpose = source.material_request_type
 		if source.job_card:
-			target.purpose = 'Material Transfer for Manufacture'
+			target.purpose = "Material Transfer for Manufacture"
 
 		if source.material_request_type == "Customer Provided":
 			target.purpose = "Material Receipt"
@@ -498,101 +603,119 @@
 		target.set_stock_entry_type()
 		target.set_job_card_data()
 
-	doclist = get_mapped_doc("Material Request", source_name, {
-		"Material Request": {
-			"doctype": "Stock Entry",
-			"validation": {
-				"docstatus": ["=", 1],
-				"material_request_type": ["in", ["Material Transfer", "Material Issue", "Customer Provided"]]
-			}
-		},
-		"Material Request Item": {
-			"doctype": "Stock Entry Detail",
-			"field_map": {
-				"name": "material_request_item",
-				"parent": "material_request",
-				"uom": "stock_uom",
-				"job_card_item": "job_card_item"
+	doclist = get_mapped_doc(
+		"Material Request",
+		source_name,
+		{
+			"Material Request": {
+				"doctype": "Stock Entry",
+				"validation": {
+					"docstatus": ["=", 1],
+					"material_request_type": ["in", ["Material Transfer", "Material Issue", "Customer Provided"]],
+				},
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: doc.ordered_qty < doc.stock_qty
-		}
-	}, target_doc, set_missing_values)
+			"Material Request Item": {
+				"doctype": "Stock Entry Detail",
+				"field_map": {
+					"name": "material_request_item",
+					"parent": "material_request",
+					"uom": "stock_uom",
+					"job_card_item": "job_card_item",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: doc.ordered_qty < doc.stock_qty,
+			},
+		},
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def raise_work_orders(material_request):
-	mr= frappe.get_doc("Material Request", material_request)
-	errors =[]
+	mr = frappe.get_doc("Material Request", material_request)
+	errors = []
 	work_orders = []
-	default_wip_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_wip_warehouse")
+	default_wip_warehouse = frappe.db.get_single_value(
+		"Manufacturing Settings", "default_wip_warehouse"
+	)
 
 	for d in mr.items:
 		if (d.stock_qty - d.ordered_qty) > 0:
 			if frappe.db.exists("BOM", {"item": d.item_code, "is_default": 1}):
 				wo_order = frappe.new_doc("Work Order")
-				wo_order.update({
-					"production_item": d.item_code,
-					"qty": d.stock_qty - d.ordered_qty,
-					"fg_warehouse": d.warehouse,
-					"wip_warehouse": default_wip_warehouse,
-					"description": d.description,
-					"stock_uom": d.stock_uom,
-					"expected_delivery_date": d.schedule_date,
-					"sales_order": d.sales_order,
-					"sales_order_item": d.get("sales_order_item"),
-					"bom_no": get_item_details(d.item_code).bom_no,
-					"material_request": mr.name,
-					"material_request_item": d.name,
-					"planned_start_date": mr.transaction_date,
-					"company": mr.company
-				})
+				wo_order.update(
+					{
+						"production_item": d.item_code,
+						"qty": d.stock_qty - d.ordered_qty,
+						"fg_warehouse": d.warehouse,
+						"wip_warehouse": default_wip_warehouse,
+						"description": d.description,
+						"stock_uom": d.stock_uom,
+						"expected_delivery_date": d.schedule_date,
+						"sales_order": d.sales_order,
+						"sales_order_item": d.get("sales_order_item"),
+						"bom_no": get_item_details(d.item_code).bom_no,
+						"material_request": mr.name,
+						"material_request_item": d.name,
+						"planned_start_date": mr.transaction_date,
+						"company": mr.company,
+					}
+				)
 
 				wo_order.set_work_order_operations()
 				wo_order.save()
 
 				work_orders.append(wo_order.name)
 			else:
-				errors.append(_("Row {0}: Bill of Materials not found for the Item {1}")
-					.format(d.idx, get_link_to_form("Item", d.item_code)))
+				errors.append(
+					_("Row {0}: Bill of Materials not found for the Item {1}").format(
+						d.idx, get_link_to_form("Item", d.item_code)
+					)
+				)
 
 	if work_orders:
 		work_orders_list = [get_link_to_form("Work Order", d) for d in work_orders]
 
 		if len(work_orders) > 1:
-			msgprint(_("The following {0} were created: {1}")
-				.format(frappe.bold(_("Work Orders")), '<br>' + ', '.join(work_orders_list)))
+			msgprint(
+				_("The following {0} were created: {1}").format(
+					frappe.bold(_("Work Orders")), "<br>" + ", ".join(work_orders_list)
+				)
+			)
 		else:
-			msgprint(_("The {0} {1} created sucessfully")
-				.format(frappe.bold(_("Work Order")), work_orders_list[0]))
+			msgprint(
+				_("The {0} {1} created sucessfully").format(frappe.bold(_("Work Order")), work_orders_list[0])
+			)
 
 	if errors:
-		frappe.throw(_("Work Order cannot be created for following reason: <br> {0}")
-			.format(new_line_sep(errors)))
+		frappe.throw(
+			_("Work Order cannot be created for following reason: <br> {0}").format(new_line_sep(errors))
+		)
 
 	return work_orders
 
+
 @frappe.whitelist()
 def create_pick_list(source_name, target_doc=None):
-	doc = get_mapped_doc('Material Request', source_name, {
-		'Material Request': {
-			'doctype': 'Pick List',
-			'field_map': {
-				'material_request_type': 'purpose'
+	doc = get_mapped_doc(
+		"Material Request",
+		source_name,
+		{
+			"Material Request": {
+				"doctype": "Pick List",
+				"field_map": {"material_request_type": "purpose"},
+				"validation": {"docstatus": ["=", 1]},
 			},
-			'validation': {
-				'docstatus': ['=', 1]
-			}
-		},
-		'Material Request Item': {
-			'doctype': 'Pick List Item',
-			'field_map': {
-				'name': 'material_request_item',
-				'qty': 'stock_qty'
+			"Material Request Item": {
+				"doctype": "Pick List Item",
+				"field_map": {"name": "material_request_item", "qty": "stock_qty"},
 			},
 		},
-	}, target_doc)
+		target_doc,
+	)
 
 	doc.set_item_locations()
 
diff --git a/erpnext/stock/doctype/material_request/material_request_dashboard.py b/erpnext/stock/doctype/material_request/material_request_dashboard.py
index c1ce0a9..b073e6a 100644
--- a/erpnext/stock/doctype/material_request/material_request_dashboard.py
+++ b/erpnext/stock/doctype/material_request/material_request_dashboard.py
@@ -3,20 +3,13 @@
 
 def get_data():
 	return {
-		'fieldname': 'material_request',
-		'transactions': [
+		"fieldname": "material_request",
+		"transactions": [
 			{
-				'label': _('Reference'),
-				'items': ['Request for Quotation', 'Supplier Quotation', 'Purchase Order']
+				"label": _("Reference"),
+				"items": ["Request for Quotation", "Supplier Quotation", "Purchase Order"],
 			},
-			{
-				'label': _('Stock'),
-				'items': ['Stock Entry', 'Purchase Receipt', 'Pick List']
-
-			},
-			{
-				'label': _('Manufacturing'),
-				'items': ['Work Order']
-			}
-		]
+			{"label": _("Stock"), "items": ["Stock Entry", "Purchase Receipt", "Pick List"]},
+			{"label": _("Manufacturing"), "items": ["Work Order"]},
+		],
 	}
diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py
index 866f3ab..78af153 100644
--- a/erpnext/stock/doctype/material_request/test_material_request.py
+++ b/erpnext/stock/doctype/material_request/test_material_request.py
@@ -22,8 +22,7 @@
 	def test_make_purchase_order(self):
 		mr = frappe.copy_doc(test_records[0]).insert()
 
-		self.assertRaises(frappe.ValidationError, make_purchase_order,
-			mr.name)
+		self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name)
 
 		mr = frappe.get_doc("Material Request", mr.name)
 		mr.submit()
@@ -44,7 +43,6 @@
 		self.assertEqual(sq.doctype, "Supplier Quotation")
 		self.assertEqual(len(sq.get("items")), len(mr.get("items")))
 
-
 	def test_make_stock_entry(self):
 		mr = frappe.copy_doc(test_records[0]).insert()
 
@@ -58,42 +56,44 @@
 		self.assertEqual(se.doctype, "Stock Entry")
 		self.assertEqual(len(se.get("items")), len(mr.get("items")))
 
-	def _insert_stock_entry(self, qty1, qty2, warehouse = None ):
-		se = frappe.get_doc({
-			"company": "_Test Company",
-			"doctype": "Stock Entry",
-			"posting_date": "2013-03-01",
-			"posting_time": "00:00:00",
-			"purpose": "Material Receipt",
-			"items": [
-				{
-					"conversion_factor": 1.0,
-					"doctype": "Stock Entry Detail",
-					"item_code": "_Test Item Home Desktop 100",
-					"parentfield": "items",
-					"basic_rate": 100,
-					"qty": qty1,
-					"stock_uom": "_Test UOM 1",
-					"transfer_qty": qty1,
-					"uom": "_Test UOM 1",
-					"t_warehouse": warehouse or "_Test Warehouse 1 - _TC",
-					"cost_center": "_Test Cost Center - _TC"
-				},
-				{
-					"conversion_factor": 1.0,
-					"doctype": "Stock Entry Detail",
-					"item_code": "_Test Item Home Desktop 200",
-					"parentfield": "items",
-					"basic_rate": 100,
-					"qty": qty2,
-					"stock_uom": "_Test UOM 1",
-					"transfer_qty": qty2,
-					"uom": "_Test UOM 1",
-					"t_warehouse": warehouse or "_Test Warehouse 1 - _TC",
-					"cost_center": "_Test Cost Center - _TC"
-				}
-			]
-		})
+	def _insert_stock_entry(self, qty1, qty2, warehouse=None):
+		se = frappe.get_doc(
+			{
+				"company": "_Test Company",
+				"doctype": "Stock Entry",
+				"posting_date": "2013-03-01",
+				"posting_time": "00:00:00",
+				"purpose": "Material Receipt",
+				"items": [
+					{
+						"conversion_factor": 1.0,
+						"doctype": "Stock Entry Detail",
+						"item_code": "_Test Item Home Desktop 100",
+						"parentfield": "items",
+						"basic_rate": 100,
+						"qty": qty1,
+						"stock_uom": "_Test UOM 1",
+						"transfer_qty": qty1,
+						"uom": "_Test UOM 1",
+						"t_warehouse": warehouse or "_Test Warehouse 1 - _TC",
+						"cost_center": "_Test Cost Center - _TC",
+					},
+					{
+						"conversion_factor": 1.0,
+						"doctype": "Stock Entry Detail",
+						"item_code": "_Test Item Home Desktop 200",
+						"parentfield": "items",
+						"basic_rate": 100,
+						"qty": qty2,
+						"stock_uom": "_Test UOM 1",
+						"transfer_qty": qty2,
+						"uom": "_Test UOM 1",
+						"t_warehouse": warehouse or "_Test Warehouse 1 - _TC",
+						"cost_center": "_Test Cost Center - _TC",
+					},
+				],
+			}
+		)
 
 		se.set_stock_entry_type()
 		se.insert()
@@ -106,19 +106,19 @@
 
 		mr.load_from_db()
 		mr.cancel()
-		self.assertRaises(frappe.ValidationError, mr.update_status, 'Stopped')
+		self.assertRaises(frappe.ValidationError, mr.update_status, "Stopped")
 
 	def test_mr_changes_from_stopped_to_pending_after_reopen(self):
 		mr = frappe.copy_doc(test_records[0])
 		mr.insert()
 		mr.submit()
-		self.assertEqual('Pending', mr.status)
+		self.assertEqual("Pending", mr.status)
 
-		mr.update_status('Stopped')
-		self.assertEqual('Stopped', mr.status)
+		mr.update_status("Stopped")
+		self.assertEqual("Stopped", mr.status)
 
-		mr.update_status('Submitted')
-		self.assertEqual('Pending', mr.status)
+		mr.update_status("Submitted")
+		self.assertEqual("Pending", mr.status)
 
 	def test_cannot_submit_cancelled_mr(self):
 		mr = frappe.copy_doc(test_records[0])
@@ -133,7 +133,7 @@
 		mr.insert()
 		mr.submit()
 		mr.cancel()
-		self.assertEqual('Cancelled', mr.status)
+		self.assertEqual("Cancelled", mr.status)
 
 	def test_cannot_change_cancelled_mr(self):
 		mr = frappe.copy_doc(test_records[0])
@@ -142,12 +142,12 @@
 		mr.load_from_db()
 		mr.cancel()
 
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Draft')
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Stopped')
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Ordered')
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Issued')
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Transferred')
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Pending')
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Draft")
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Stopped")
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Ordered")
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Issued")
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Transferred")
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Pending")
 
 	def test_cannot_submit_deleted_material_request(self):
 		mr = frappe.copy_doc(test_records[0])
@@ -169,9 +169,9 @@
 		mr.submit()
 		mr.load_from_db()
 
-		mr.update_status('Stopped')
-		mr.update_status('Submitted')
-		self.assertEqual(mr.status, 'Pending')
+		mr.update_status("Stopped")
+		mr.update_status("Submitted")
+		self.assertEqual(mr.status, "Pending")
 
 	def test_pending_mr_changes_to_stopped_after_stop(self):
 		mr = frappe.copy_doc(test_records[0])
@@ -179,17 +179,21 @@
 		mr.submit()
 		mr.load_from_db()
 
-		mr.update_status('Stopped')
-		self.assertEqual(mr.status, 'Stopped')
+		mr.update_status("Stopped")
+		self.assertEqual(mr.status, "Stopped")
 
 	def test_cannot_stop_unsubmitted_mr(self):
 		mr = frappe.copy_doc(test_records[0])
 		mr.insert()
-		self.assertRaises(frappe.InvalidStatusError, mr.update_status, 'Stopped')
+		self.assertRaises(frappe.InvalidStatusError, mr.update_status, "Stopped")
 
 	def test_completed_qty_for_purchase(self):
-		existing_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		existing_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		existing_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		existing_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		# submit material request of type Purchase
 		mr = frappe.copy_doc(test_records[0])
@@ -206,19 +210,18 @@
 		po_doc.get("items")[0].schedule_date = "2013-07-09"
 		po_doc.get("items")[1].schedule_date = "2013-07-09"
 
-
 		# check for stopped status of Material Request
 		po = frappe.copy_doc(po_doc)
 		po.insert()
 		po.load_from_db()
-		mr.update_status('Stopped')
+		mr.update_status("Stopped")
 		self.assertRaises(frappe.InvalidStatusError, po.submit)
 		frappe.db.set(po, "docstatus", 1)
 		self.assertRaises(frappe.InvalidStatusError, po.cancel)
 
 		# resubmit and check for per complete
 		mr.load_from_db()
-		mr.update_status('Submitted')
+		mr.update_status("Submitted")
 		po = frappe.copy_doc(po_doc)
 		po.insert()
 		po.submit()
@@ -229,8 +232,12 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 27.0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 1.5)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 27.0)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 1.5)
@@ -242,15 +249,23 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 0)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 54.0)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 3.0)
 
 	def test_completed_qty_for_transfer(self):
-		existing_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		existing_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		existing_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		existing_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		# submit material request of type Purchase
 		mr = frappe.copy_doc(test_records[0])
@@ -264,31 +279,31 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 0)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 54.0)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 3.0)
 
 		# map a stock entry
 		se_doc = make_stock_entry(mr.name)
-		se_doc.update({
-			"posting_date": "2013-03-01",
-			"posting_time": "01:00",
-			"fiscal_year": "_Test Fiscal Year 2013",
-		})
-		se_doc.get("items")[0].update({
-			"qty": 27.0,
-			"transfer_qty": 27.0,
-			"s_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
-		se_doc.get("items")[1].update({
-			"qty": 1.5,
-			"transfer_qty": 1.5,
-			"s_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
+		se_doc.update(
+			{
+				"posting_date": "2013-03-01",
+				"posting_time": "01:00",
+				"fiscal_year": "_Test Fiscal Year 2013",
+			}
+		)
+		se_doc.get("items")[0].update(
+			{"qty": 27.0, "transfer_qty": 27.0, "s_warehouse": "_Test Warehouse 1 - _TC", "basic_rate": 1.0}
+		)
+		se_doc.get("items")[1].update(
+			{"qty": 1.5, "transfer_qty": 1.5, "s_warehouse": "_Test Warehouse 1 - _TC", "basic_rate": 1.0}
+		)
 
 		# make available the qty in _Test Warehouse 1 before transfer
 		self._insert_stock_entry(27.0, 1.5)
@@ -296,17 +311,17 @@
 		# check for stopped status of Material Request
 		se = frappe.copy_doc(se_doc)
 		se.insert()
-		mr.update_status('Stopped')
+		mr.update_status("Stopped")
 		self.assertRaises(frappe.InvalidStatusError, se.submit)
 
-		mr.update_status('Submitted')
+		mr.update_status("Submitted")
 
 		se.flags.ignore_validate_update_after_submit = True
 		se.submit()
-		mr.update_status('Stopped')
+		mr.update_status("Stopped")
 		self.assertRaises(frappe.InvalidStatusError, se.cancel)
 
-		mr.update_status('Submitted')
+		mr.update_status("Submitted")
 		se = frappe.copy_doc(se_doc)
 		se.insert()
 		se.submit()
@@ -317,8 +332,12 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 27.0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 1.5)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 27.0)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 1.5)
@@ -330,56 +349,70 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 0)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 54.0)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 3.0)
 
 	def test_over_transfer_qty_allowance(self):
-		mr = frappe.new_doc('Material Request')
+		mr = frappe.new_doc("Material Request")
 		mr.company = "_Test Company"
 		mr.scheduled_date = today()
-		mr.append('items',{
-			"item_code": "_Test FG Item",
-			"item_name": "_Test FG Item",
-			"qty": 10,
-			"schedule_date": today(),
-			"uom": "_Test UOM 1",
-			"warehouse": "_Test Warehouse - _TC"
-		})
+		mr.append(
+			"items",
+			{
+				"item_code": "_Test FG Item",
+				"item_name": "_Test FG Item",
+				"qty": 10,
+				"schedule_date": today(),
+				"uom": "_Test UOM 1",
+				"warehouse": "_Test Warehouse - _TC",
+			},
+		)
 
 		mr.material_request_type = "Material Transfer"
 		mr.insert()
 		mr.submit()
 
-		frappe.db.set_value('Stock Settings', None, 'mr_qty_allowance', 20)
+		frappe.db.set_value("Stock Settings", None, "mr_qty_allowance", 20)
 
 		# map a stock entry
 
 		se_doc = make_stock_entry(mr.name)
-		se_doc.update({
-			"posting_date": today(),
-			"posting_time": "00:00",
-		})
-		se_doc.get("items")[0].update({
-			"qty": 13,
-			"transfer_qty": 12.0,
-			"s_warehouse": "_Test Warehouse - _TC",
-			"t_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
+		se_doc.update(
+			{
+				"posting_date": today(),
+				"posting_time": "00:00",
+			}
+		)
+		se_doc.get("items")[0].update(
+			{
+				"qty": 13,
+				"transfer_qty": 12.0,
+				"s_warehouse": "_Test Warehouse - _TC",
+				"t_warehouse": "_Test Warehouse 1 - _TC",
+				"basic_rate": 1.0,
+			}
+		)
 
 		# make available the qty in _Test Warehouse 1 before transfer
 		sr = frappe.new_doc("Stock Reconciliation")
 		sr.company = "_Test Company"
 		sr.purpose = "Opening Stock"
-		sr.append('items', {
-			"item_code": "_Test FG Item",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 20,
-			"valuation_rate": 0.01
-		})
+		sr.append(
+			"items",
+			{
+				"item_code": "_Test FG Item",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 20,
+				"valuation_rate": 0.01,
+			},
+		)
 		sr.insert()
 		sr.submit()
 		se = frappe.copy_doc(se_doc)
@@ -389,8 +422,12 @@
 		se.submit()
 
 	def test_completed_qty_for_over_transfer(self):
-		existing_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		existing_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		existing_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		existing_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		# submit material request of type Purchase
 		mr = frappe.copy_doc(test_records[0])
@@ -401,23 +438,19 @@
 		# map a stock entry
 
 		se_doc = make_stock_entry(mr.name)
-		se_doc.update({
-			"posting_date": "2013-03-01",
-			"posting_time": "00:00",
-			"fiscal_year": "_Test Fiscal Year 2013",
-		})
-		se_doc.get("items")[0].update({
-			"qty": 54.0,
-			"transfer_qty": 54.0,
-			"s_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
-		se_doc.get("items")[1].update({
-			"qty": 3.0,
-			"transfer_qty": 3.0,
-			"s_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
+		se_doc.update(
+			{
+				"posting_date": "2013-03-01",
+				"posting_time": "00:00",
+				"fiscal_year": "_Test Fiscal Year 2013",
+			}
+		)
+		se_doc.get("items")[0].update(
+			{"qty": 54.0, "transfer_qty": 54.0, "s_warehouse": "_Test Warehouse 1 - _TC", "basic_rate": 1.0}
+		)
+		se_doc.get("items")[1].update(
+			{"qty": 3.0, "transfer_qty": 3.0, "s_warehouse": "_Test Warehouse 1 - _TC", "basic_rate": 1.0}
+		)
 
 		# make available the qty in _Test Warehouse 1 before transfer
 		self._insert_stock_entry(60.0, 3.0)
@@ -426,11 +459,11 @@
 		se = frappe.copy_doc(se_doc)
 		se.set_stock_entry_type()
 		se.insert()
-		mr.update_status('Stopped')
+		mr.update_status("Stopped")
 		self.assertRaises(frappe.InvalidStatusError, se.submit)
 		self.assertRaises(frappe.InvalidStatusError, se.cancel)
 
-		mr.update_status('Submitted')
+		mr.update_status("Submitted")
 		se = frappe.copy_doc(se_doc)
 		se.set_stock_entry_type()
 		se.insert()
@@ -443,8 +476,12 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 54.0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 3.0)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2)
@@ -456,8 +493,12 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 0)
 
-		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
-		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")
+		current_requested_qty_item1 = self._get_requested_qty(
+			"_Test Item Home Desktop 100", "_Test Warehouse - _TC"
+		)
+		current_requested_qty_item2 = self._get_requested_qty(
+			"_Test Item Home Desktop 200", "_Test Warehouse - _TC"
+		)
 
 		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 54.0)
 		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 3.0)
@@ -470,25 +511,31 @@
 		mr.submit()
 
 		se_doc = make_stock_entry(mr.name)
-		se_doc.update({
-			"posting_date": "2013-03-01",
-			"posting_time": "00:00",
-			"fiscal_year": "_Test Fiscal Year 2013",
-		})
-		se_doc.get("items")[0].update({
-			"qty": 60.0,
-			"transfer_qty": 60.0,
-			"s_warehouse": "_Test Warehouse - _TC",
-			"t_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
-		se_doc.get("items")[1].update({
-			"item_code": "_Test Item Home Desktop 100",
-			"qty": 3.0,
-			"transfer_qty": 3.0,
-			"s_warehouse": "_Test Warehouse 1 - _TC",
-			"basic_rate": 1.0
-		})
+		se_doc.update(
+			{
+				"posting_date": "2013-03-01",
+				"posting_time": "00:00",
+				"fiscal_year": "_Test Fiscal Year 2013",
+			}
+		)
+		se_doc.get("items")[0].update(
+			{
+				"qty": 60.0,
+				"transfer_qty": 60.0,
+				"s_warehouse": "_Test Warehouse - _TC",
+				"t_warehouse": "_Test Warehouse 1 - _TC",
+				"basic_rate": 1.0,
+			}
+		)
+		se_doc.get("items")[1].update(
+			{
+				"item_code": "_Test Item Home Desktop 100",
+				"qty": 3.0,
+				"transfer_qty": 3.0,
+				"s_warehouse": "_Test Warehouse 1 - _TC",
+				"basic_rate": 1.0,
+			}
+		)
 
 		# check for stopped status of Material Request
 		se = frappe.copy_doc(se_doc)
@@ -505,18 +552,20 @@
 
 	def test_warehouse_company_validation(self):
 		from erpnext.stock.utils import InvalidWarehouseCompany
+
 		mr = frappe.copy_doc(test_records[0])
 		mr.company = "_Test Company 1"
 		self.assertRaises(InvalidWarehouseCompany, mr.insert)
 
 	def _get_requested_qty(self, item_code, warehouse):
-		return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty"))
+		return flt(
+			frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty")
+		)
 
 	def test_make_stock_entry_for_material_issue(self):
 		mr = frappe.copy_doc(test_records[0]).insert()
 
-		self.assertRaises(frappe.ValidationError, make_stock_entry,
-			mr.name)
+		self.assertRaises(frappe.ValidationError, make_stock_entry, mr.name)
 
 		mr = frappe.get_doc("Material Request", mr.name)
 		mr.material_request_type = "Material Issue"
@@ -528,8 +577,13 @@
 
 	def test_completed_qty_for_issue(self):
 		def _get_requested_qty():
-			return flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 100",
-				"warehouse": "_Test Warehouse - _TC"}, "indented_qty"))
+			return flt(
+				frappe.db.get_value(
+					"Bin",
+					{"item_code": "_Test Item Home Desktop 100", "warehouse": "_Test Warehouse - _TC"},
+					"indented_qty",
+				)
+			)
 
 		existing_requested_qty = _get_requested_qty()
 
@@ -537,7 +591,7 @@
 		mr.material_request_type = "Material Issue"
 		mr.submit()
 
-		#testing bin value after material request is submitted
+		# testing bin value after material request is submitted
 		self.assertEqual(_get_requested_qty(), existing_requested_qty - 54.0)
 
 		# receive items to allow issue
@@ -556,7 +610,7 @@
 		self.assertEqual(mr.get("items")[0].ordered_qty, 54.0)
 		self.assertEqual(mr.get("items")[1].ordered_qty, 3.0)
 
-		#testing bin requested qty after issuing stock against material request
+		# testing bin requested qty after issuing stock against material request
 		self.assertEqual(_get_requested_qty(), existing_requested_qty)
 
 	def test_material_request_type_manufacture(self):
@@ -564,8 +618,11 @@
 		mr = frappe.get_doc("Material Request", mr.name)
 		mr.submit()
 		completed_qty = mr.items[0].ordered_qty
-		requested_qty = frappe.db.sql("""select indented_qty from `tabBin` where \
-			item_code= %s and warehouse= %s """, (mr.items[0].item_code, mr.items[0].warehouse))[0][0]
+		requested_qty = frappe.db.sql(
+			"""select indented_qty from `tabBin` where \
+			item_code= %s and warehouse= %s """,
+			(mr.items[0].item_code, mr.items[0].warehouse),
+		)[0][0]
 
 		prod_order = raise_work_orders(mr.name)
 		po = frappe.get_doc("Work Order", prod_order[0])
@@ -575,8 +632,11 @@
 		mr = frappe.get_doc("Material Request", mr.name)
 		self.assertEqual(completed_qty + po.qty, mr.items[0].ordered_qty)
 
-		new_requested_qty = frappe.db.sql("""select indented_qty from `tabBin` where \
-			item_code= %s and warehouse= %s """, (mr.items[0].item_code, mr.items[0].warehouse))[0][0]
+		new_requested_qty = frappe.db.sql(
+			"""select indented_qty from `tabBin` where \
+			item_code= %s and warehouse= %s """,
+			(mr.items[0].item_code, mr.items[0].warehouse),
+		)[0][0]
 
 		self.assertEqual(requested_qty - po.qty, new_requested_qty)
 
@@ -585,17 +645,24 @@
 		mr = frappe.get_doc("Material Request", mr.name)
 		self.assertEqual(completed_qty, mr.items[0].ordered_qty)
 
-		new_requested_qty = frappe.db.sql("""select indented_qty from `tabBin` where \
-			item_code= %s and warehouse= %s """, (mr.items[0].item_code, mr.items[0].warehouse))[0][0]
+		new_requested_qty = frappe.db.sql(
+			"""select indented_qty from `tabBin` where \
+			item_code= %s and warehouse= %s """,
+			(mr.items[0].item_code, mr.items[0].warehouse),
+		)[0][0]
 		self.assertEqual(requested_qty, new_requested_qty)
 
 	def test_requested_qty_multi_uom(self):
-		existing_requested_qty = self._get_requested_qty('_Test FG Item', '_Test Warehouse - _TC')
+		existing_requested_qty = self._get_requested_qty("_Test FG Item", "_Test Warehouse - _TC")
 
-		mr = make_material_request(item_code='_Test FG Item', material_request_type='Manufacture',
-			uom="_Test UOM 1", conversion_factor=12)
+		mr = make_material_request(
+			item_code="_Test FG Item",
+			material_request_type="Manufacture",
+			uom="_Test UOM 1",
+			conversion_factor=12,
+		)
 
-		requested_qty = self._get_requested_qty('_Test FG Item', '_Test Warehouse - _TC')
+		requested_qty = self._get_requested_qty("_Test FG Item", "_Test Warehouse - _TC")
 
 		self.assertEqual(requested_qty, existing_requested_qty + 120)
 
@@ -605,42 +672,36 @@
 		wo.wip_warehouse = "_Test Warehouse 1 - _TC"
 		wo.submit()
 
-		requested_qty = self._get_requested_qty('_Test FG Item', '_Test Warehouse - _TC')
+		requested_qty = self._get_requested_qty("_Test FG Item", "_Test Warehouse - _TC")
 		self.assertEqual(requested_qty, existing_requested_qty + 70)
 
 		wo.cancel()
 
-		requested_qty = self._get_requested_qty('_Test FG Item', '_Test Warehouse - _TC')
+		requested_qty = self._get_requested_qty("_Test FG Item", "_Test Warehouse - _TC")
 		self.assertEqual(requested_qty, existing_requested_qty + 120)
 
 		mr.reload()
 		mr.cancel()
-		requested_qty = self._get_requested_qty('_Test FG Item', '_Test Warehouse - _TC')
+		requested_qty = self._get_requested_qty("_Test FG Item", "_Test Warehouse - _TC")
 		self.assertEqual(requested_qty, existing_requested_qty)
 
-
 	def test_multi_uom_for_purchase(self):
 		mr = frappe.copy_doc(test_records[0])
-		mr.material_request_type = 'Purchase'
+		mr.material_request_type = "Purchase"
 		item = mr.items[0]
 		mr.schedule_date = today()
 
-		if not frappe.db.get_value('UOM Conversion Detail',
-			{'parent': item.item_code, 'uom': 'Kg'}):
-			item_doc = frappe.get_doc('Item', item.item_code)
-			item_doc.append('uoms', {
-				'uom': 'Kg',
-				'conversion_factor': 5
-			})
+		if not frappe.db.get_value("UOM Conversion Detail", {"parent": item.item_code, "uom": "Kg"}):
+			item_doc = frappe.get_doc("Item", item.item_code)
+			item_doc.append("uoms", {"uom": "Kg", "conversion_factor": 5})
 			item_doc.save(ignore_permissions=True)
 
-		item.uom = 'Kg'
+		item.uom = "Kg"
 		for item in mr.items:
 			item.schedule_date = mr.schedule_date
 
 		mr.insert()
-		self.assertRaises(frappe.ValidationError, make_purchase_order,
-			mr.name)
+		self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name)
 
 		mr = frappe.get_doc("Material Request", mr.name)
 		mr.submit()
@@ -654,17 +715,19 @@
 		self.assertEqual(po.doctype, "Purchase Order")
 		self.assertEqual(len(po.get("items")), len(mr.get("items")))
 
-		po.supplier = '_Test Supplier'
+		po.supplier = "_Test Supplier"
 		po.insert()
 		po.submit()
 		mr = frappe.get_doc("Material Request", mr.name)
 		self.assertEqual(mr.per_ordered, 100)
 
 	def test_customer_provided_parts_mr(self):
-		create_item('CUST-0987', is_customer_provided_item = 1, customer = '_Test Customer', is_purchase_item = 0)
+		create_item(
+			"CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
+		)
 		existing_requested_qty = self._get_requested_qty("_Test Customer", "_Test Warehouse - _TC")
 
-		mr = make_material_request(item_code='CUST-0987', material_request_type='Customer Provided')
+		mr = make_material_request(item_code="CUST-0987", material_request_type="Customer Provided")
 		se = make_stock_entry(mr.name)
 		se.insert()
 		se.submit()
@@ -677,25 +740,30 @@
 		self.assertEqual(mr.per_ordered, 100)
 		self.assertEqual(existing_requested_qty, current_requested_qty)
 
+
 def make_material_request(**args):
 	args = frappe._dict(args)
 	mr = frappe.new_doc("Material Request")
 	mr.material_request_type = args.material_request_type or "Purchase"
 	mr.company = args.company or "_Test Company"
-	mr.customer = args.customer or '_Test Customer'
-	mr.append("items", {
-		"item_code": args.item_code or "_Test Item",
-		"qty": args.qty or 10,
-		"uom": args.uom or "_Test UOM",
-		"conversion_factor": args.conversion_factor or 1,
-		"schedule_date": args.schedule_date or today(),
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"cost_center": args.cost_center or "_Test Cost Center - _TC"
-	})
+	mr.customer = args.customer or "_Test Customer"
+	mr.append(
+		"items",
+		{
+			"item_code": args.item_code or "_Test Item",
+			"qty": args.qty or 10,
+			"uom": args.uom or "_Test UOM",
+			"conversion_factor": args.conversion_factor or 1,
+			"schedule_date": args.schedule_date or today(),
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"cost_center": args.cost_center or "_Test Cost Center - _TC",
+		},
+	)
 	mr.insert()
 	if not args.do_not_submit:
 		mr.submit()
 	return mr
 
+
 test_dependencies = ["Currency Exchange", "BOM"]
-test_records = frappe.get_test_records('Material Request')
+test_records = frappe.get_test_records("Material Request")
diff --git a/erpnext/stock/doctype/material_request_item/material_request_item.py b/erpnext/stock/doctype/material_request_item/material_request_item.py
index 32407d0..08c9ed2 100644
--- a/erpnext/stock/doctype/material_request_item/material_request_item.py
+++ b/erpnext/stock/doctype/material_request_item/material_request_item.py
@@ -11,5 +11,6 @@
 class MaterialRequestItem(Document):
 	pass
 
+
 def on_doctype_update():
 	frappe.db.add_index("Material Request Item", ["item_code", "warehouse"])
diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py
index f9c00c5..026dd4e 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.py
+++ b/erpnext/stock/doctype/packed_item/packed_item.py
@@ -23,7 +23,9 @@
 		return
 
 	parent_items_price, reset = {}, False
-	set_price_from_children = frappe.db.get_single_value("Selling Settings", "editable_bundle_item_rates")
+	set_price_from_children = frappe.db.get_single_value(
+		"Selling Settings", "editable_bundle_item_rates"
+	)
 
 	stale_packed_items_table = get_indexed_packed_items_table(doc)
 
@@ -33,9 +35,11 @@
 		if frappe.db.exists("Product Bundle", {"new_item_code": item_row.item_code}):
 			for bundle_item in get_product_bundle_items(item_row.item_code):
 				pi_row = add_packed_item_row(
-					doc=doc, packing_item=bundle_item,
-					main_item_row=item_row, packed_items_table=stale_packed_items_table,
-					reset=reset
+					doc=doc,
+					packing_item=bundle_item,
+					main_item_row=item_row,
+					packed_items_table=stale_packed_items_table,
+					reset=reset,
 				)
 				item_data = get_packed_item_details(bundle_item.item_code, doc.company)
 				update_packed_item_basic_data(item_row, pi_row, bundle_item, item_data)
@@ -43,18 +47,19 @@
 				update_packed_item_price_data(pi_row, item_data, doc)
 				update_packed_item_from_cancelled_doc(item_row, bundle_item, pi_row, doc)
 
-				if set_price_from_children: # create/update bundle item wise price dict
+				if set_price_from_children:  # create/update bundle item wise price dict
 					update_product_bundle_rate(parent_items_price, pi_row)
 
 	if parent_items_price:
-		set_product_bundle_rate_amount(doc, parent_items_price) # set price in bundle item
+		set_product_bundle_rate_amount(doc, parent_items_price)  # set price in bundle item
+
 
 def get_indexed_packed_items_table(doc):
 	"""
-		Create dict from stale packed items table like:
-		{(Parent Item 1, Bundle Item 1, ae4b5678): {...}, (key): {value}}
+	Create dict from stale packed items table like:
+	{(Parent Item 1, Bundle Item 1, ae4b5678): {...}, (key): {value}}
 
-		Use: to quickly retrieve/check if row existed in table instead of looping n times
+	Use: to quickly retrieve/check if row existed in table instead of looping n times
 	"""
 	indexed_table = {}
 	for packed_item in doc.get("packed_items"):
@@ -63,6 +68,7 @@
 
 	return indexed_table
 
+
 def reset_packing_list(doc):
 	"Conditionally reset the table and return if it was reset or not."
 	reset_table = False
@@ -86,33 +92,34 @@
 		doc.set("packed_items", [])
 	return reset_table
 
+
 def get_product_bundle_items(item_code):
 	product_bundle = frappe.qb.DocType("Product Bundle")
 	product_bundle_item = frappe.qb.DocType("Product Bundle Item")
 
 	query = (
 		frappe.qb.from_(product_bundle_item)
-		.join(product_bundle).on(product_bundle_item.parent == product_bundle.name)
+		.join(product_bundle)
+		.on(product_bundle_item.parent == product_bundle.name)
 		.select(
 			product_bundle_item.item_code,
 			product_bundle_item.qty,
 			product_bundle_item.uom,
-			product_bundle_item.description
-		).where(
-			product_bundle.new_item_code == item_code
-		).orderby(
-			product_bundle_item.idx
+			product_bundle_item.description,
 		)
+		.where(product_bundle.new_item_code == item_code)
+		.orderby(product_bundle_item.idx)
 	)
 	return query.run(as_dict=True)
 
+
 def add_packed_item_row(doc, packing_item, main_item_row, packed_items_table, reset):
 	"""Add and return packed item row.
-		doc: Transaction document
-		packing_item (dict): Packed Item details
-		main_item_row (dict): Items table row corresponding to packed item
-		packed_items_table (dict): Packed Items table before save (indexed)
-		reset (bool): State if table is reset or preserved as is
+	doc: Transaction document
+	packing_item (dict): Packed Item details
+	main_item_row (dict): Items table row corresponding to packed item
+	packed_items_table (dict): Packed Items table before save (indexed)
+	reset (bool): State if table is reset or preserved as is
 	"""
 	exists, pi_row = False, {}
 
@@ -122,33 +129,34 @@
 		pi_row, exists = packed_items_table.get(key), True
 
 	if not exists:
-		pi_row = doc.append('packed_items', {})
-	elif reset: # add row if row exists but table is reset
+		pi_row = doc.append("packed_items", {})
+	elif reset:  # add row if row exists but table is reset
 		pi_row.idx, pi_row.name = None, None
-		pi_row = doc.append('packed_items', pi_row)
+		pi_row = doc.append("packed_items", pi_row)
 
 	return pi_row
 
+
 def get_packed_item_details(item_code, company):
 	item = frappe.qb.DocType("Item")
 	item_default = frappe.qb.DocType("Item Default")
 	query = (
 		frappe.qb.from_(item)
 		.left_join(item_default)
-		.on(
-			(item_default.parent == item.name)
-			& (item_default.company == company)
-		).select(
-			item.item_name, item.is_stock_item,
-			item.description, item.stock_uom,
+		.on((item_default.parent == item.name) & (item_default.company == company))
+		.select(
+			item.item_name,
+			item.is_stock_item,
+			item.description,
+			item.stock_uom,
 			item.valuation_rate,
-			item_default.default_warehouse
-		).where(
-			item.name == item_code
+			item_default.default_warehouse,
 		)
+		.where(item.name == item_code)
 	)
 	return query.run(as_dict=True)[0]
 
+
 def update_packed_item_basic_data(main_item_row, pi_row, packing_item, item_data):
 	pi_row.parent_item = main_item_row.item_code
 	pi_row.parent_detail_docname = main_item_row.name
@@ -161,12 +169,16 @@
 	if not pi_row.description:
 		pi_row.description = packing_item.get("description")
 
+
 def update_packed_item_stock_data(main_item_row, pi_row, packing_item, item_data, doc):
 	# TODO batch_no, actual_batch_qty, incoming_rate
 	if not pi_row.warehouse and not doc.amended_from:
-		fetch_warehouse = (doc.get('is_pos') or item_data.is_stock_item or not item_data.default_warehouse)
-		pi_row.warehouse = (main_item_row.warehouse if (fetch_warehouse and main_item_row.warehouse)
-			else item_data.default_warehouse)
+		fetch_warehouse = doc.get("is_pos") or item_data.is_stock_item or not item_data.default_warehouse
+		pi_row.warehouse = (
+			main_item_row.warehouse
+			if (fetch_warehouse and main_item_row.warehouse)
+			else item_data.default_warehouse
+		)
 
 	if not pi_row.target_warehouse:
 		pi_row.target_warehouse = main_item_row.get("target_warehouse")
@@ -175,6 +187,7 @@
 	pi_row.actual_qty = flt(bin.get("actual_qty"))
 	pi_row.projected_qty = flt(bin.get("projected_qty"))
 
+
 def update_packed_item_price_data(pi_row, item_data, doc):
 	"Set price as per price list or from the Item master."
 	if pi_row.rate:
@@ -182,50 +195,60 @@
 
 	item_doc = frappe.get_cached_doc("Item", pi_row.item_code)
 	row_data = pi_row.as_dict().copy()
-	row_data.update({
-		"company": doc.get("company"),
-		"price_list": doc.get("selling_price_list"),
-		"currency": doc.get("currency"),
-		"conversion_rate": doc.get("conversion_rate"),
-	})
+	row_data.update(
+		{
+			"company": doc.get("company"),
+			"price_list": doc.get("selling_price_list"),
+			"currency": doc.get("currency"),
+			"conversion_rate": doc.get("conversion_rate"),
+		}
+	)
 	rate = get_price_list_rate(row_data, item_doc).get("price_list_rate")
 
 	pi_row.rate = rate or item_data.get("valuation_rate") or 0.0
 
+
 def update_packed_item_from_cancelled_doc(main_item_row, packing_item, pi_row, doc):
 	"Update packed item row details from cancelled doc into amended doc."
 	prev_doc_packed_items_map = None
 	if doc.amended_from:
 		prev_doc_packed_items_map = get_cancelled_doc_packed_item_details(doc.packed_items)
 
-	if prev_doc_packed_items_map and prev_doc_packed_items_map.get((packing_item.item_code, main_item_row.item_code)):
+	if prev_doc_packed_items_map and prev_doc_packed_items_map.get(
+		(packing_item.item_code, main_item_row.item_code)
+	):
 		prev_doc_row = prev_doc_packed_items_map.get((packing_item.item_code, main_item_row.item_code))
 		pi_row.batch_no = prev_doc_row[0].batch_no
 		pi_row.serial_no = prev_doc_row[0].serial_no
 		pi_row.warehouse = prev_doc_row[0].warehouse
 
+
 def get_packed_item_bin_qty(item, warehouse):
 	bin_data = frappe.db.get_values(
 		"Bin",
 		fieldname=["actual_qty", "projected_qty"],
 		filters={"item_code": item, "warehouse": warehouse},
-		as_dict=True
+		as_dict=True,
 	)
 
 	return bin_data[0] if bin_data else {}
 
+
 def get_cancelled_doc_packed_item_details(old_packed_items):
 	prev_doc_packed_items_map = {}
 	for items in old_packed_items:
-		prev_doc_packed_items_map.setdefault((items.item_code ,items.parent_item), []).append(items.as_dict())
+		prev_doc_packed_items_map.setdefault((items.item_code, items.parent_item), []).append(
+			items.as_dict()
+		)
 	return prev_doc_packed_items_map
 
+
 def update_product_bundle_rate(parent_items_price, pi_row):
 	"""
-		Update the price dict of Product Bundles based on the rates of the Items in the bundle.
+	Update the price dict of Product Bundles based on the rates of the Items in the bundle.
 
-		Stucture:
-		{(Bundle Item 1, ae56fgji): 150.0, (Bundle Item 2, bc78fkjo): 200.0}
+	Stucture:
+	{(Bundle Item 1, ae56fgji): 150.0, (Bundle Item 2, bc78fkjo): 200.0}
 	"""
 	key = (pi_row.parent_item, pi_row.parent_detail_docname)
 	rate = parent_items_price.get(key)
@@ -234,6 +257,7 @@
 
 	parent_items_price[key] += flt(pi_row.rate)
 
+
 def set_product_bundle_rate_amount(doc, parent_items_price):
 	"Set cumulative rate and amount in bundle item."
 	for item in doc.get("items"):
@@ -242,6 +266,7 @@
 			item.rate = bundle_rate
 			item.amount = flt(bundle_rate * item.qty)
 
+
 def on_doctype_update():
 	frappe.db.add_index("Packed Item", ["item_code", "warehouse"])
 
@@ -252,10 +277,7 @@
 
 	bundled_items = get_product_bundle_items(row["item_code"])
 	for item in bundled_items:
-		row.update({
-			"item_code": item.item_code,
-			"qty": flt(row["quantity"]) * flt(item.qty)
-		})
+		row.update({"item_code": item.item_code, "qty": flt(row["quantity"]) * flt(item.qty)})
 		items.append(get_item_details(row))
 
 	return items
diff --git a/erpnext/stock/doctype/packed_item/test_packed_item.py b/erpnext/stock/doctype/packed_item/test_packed_item.py
index 5f1b954..fe1b0d9 100644
--- a/erpnext/stock/doctype/packed_item/test_packed_item.py
+++ b/erpnext/stock/doctype/packed_item/test_packed_item.py
@@ -14,6 +14,7 @@
 
 class TestPackedItem(FrappeTestCase):
 	"Test impact on Packed Items table in various scenarios."
+
 	@classmethod
 	def setUpClass(cls) -> None:
 		super().setUpClass()
@@ -39,8 +40,7 @@
 
 	def test_adding_bundle_item(self):
 		"Test impact on packed items if bundle item row is added."
-		so = make_sales_order(item_code = self.bundle, qty=1,
-			do_not_submit=True)
+		so = make_sales_order(item_code=self.bundle, qty=1, do_not_submit=True)
 
 		self.assertEqual(so.items[0].qty, 1)
 		self.assertEqual(len(so.packed_items), 2)
@@ -51,7 +51,7 @@
 		"Test impact on packed items if bundle item row is updated."
 		so = make_sales_order(item_code=self.bundle, qty=1, do_not_submit=True)
 
-		so.items[0].qty = 2 # change qty
+		so.items[0].qty = 2  # change qty
 		so.save()
 
 		self.assertEqual(so.packed_items[0].qty, 4)
@@ -67,12 +67,9 @@
 		"Test impact on packed items if same bundle item is added and removed."
 		so_items = []
 		for qty in [2, 4, 6, 8]:
-			so_items.append({
-				"item_code": self.bundle,
-				"qty": qty,
-				"rate": 400,
-				"warehouse": "_Test Warehouse - _TC"
-			})
+			so_items.append(
+				{"item_code": self.bundle, "qty": qty, "rate": 400, "warehouse": "_Test Warehouse - _TC"}
+			)
 
 		# create SO with recurring bundle item
 		so = make_sales_order(item_list=so_items, do_not_submit=True)
@@ -120,18 +117,15 @@
 		"Test impact on packed items in newly mapped DN from SO."
 		so_items = []
 		for qty in [2, 4]:
-			so_items.append({
-				"item_code": self.bundle,
-				"qty": qty,
-				"rate": 400,
-				"warehouse": "_Test Warehouse - _TC"
-			})
+			so_items.append(
+				{"item_code": self.bundle, "qty": qty, "rate": 400, "warehouse": "_Test Warehouse - _TC"}
+			)
 
 		# create SO with recurring bundle item
 		so = make_sales_order(item_list=so_items)
 
 		dn = make_delivery_note(so.name)
-		dn.items[1].qty = 3 # change second row qty for inserting doc
+		dn.items[1].qty = 3  # change second row qty for inserting doc
 		dn.save()
 
 		self.assertEqual(len(dn.packed_items), 4)
@@ -148,7 +142,7 @@
 		for item in self.bundle_items:
 			make_stock_entry(item_code=item, to_warehouse=warehouse, qty=10, rate=100, posting_date=today)
 
-		so = make_sales_order(item_code = self.bundle, qty=1, company=company, warehouse=warehouse)
+		so = make_sales_order(item_code=self.bundle, qty=1, company=company, warehouse=warehouse)
 
 		dn = make_delivery_note(so.name)
 		dn.save()
@@ -159,7 +153,9 @@
 
 		# backdated stock entry
 		for item in self.bundle_items:
-			make_stock_entry(item_code=item, to_warehouse=warehouse, qty=10, rate=200, posting_date=yesterday)
+			make_stock_entry(
+				item_code=item, to_warehouse=warehouse, qty=10, rate=200, posting_date=yesterday
+			)
 
 		# assert correct reposting
 		gles = get_gl_entries(dn.doctype, dn.name)
@@ -173,8 +169,7 @@
 		sort_function = lambda p: (p.parent_item, p.item_code, p.qty)
 
 		for sent, returned in zip(
-			sorted(original, key=sort_function),
-			sorted(returned, key=sort_function)
+			sorted(original, key=sort_function), sorted(returned, key=sort_function)
 		):
 			self.assertEqual(sent.item_code, returned.item_code)
 			self.assertEqual(sent.parent_item, returned.parent_item)
@@ -195,7 +190,7 @@
 				"warehouse": self.warehouse,
 				"qty": 1,
 				"rate": 100,
-			}
+			},
 		]
 		so = make_sales_order(item_list=item_list, warehouse=self.warehouse)
 
@@ -224,7 +219,7 @@
 				"warehouse": self.warehouse,
 				"qty": 1,
 				"rate": 100,
-			}
+			},
 		]
 		so = make_sales_order(item_list=item_list, warehouse=self.warehouse)
 
@@ -246,11 +241,10 @@
 		expected_returns = [d for d in dn.packed_items if d.parent_item == self.bundle]
 		self.assertReturns(expected_returns, dn_ret.packed_items)
 
-
 	def test_returning_partial_bundle_qty(self):
 		from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return
 
-		so = make_sales_order(item_code=self.bundle, warehouse=self.warehouse, qty = 2)
+		so = make_sales_order(item_code=self.bundle, warehouse=self.warehouse, qty=2)
 
 		dn = make_delivery_note(so.name)
 		dn.save()
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py
index b092862..e9ccf5f 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.py
@@ -10,14 +10,13 @@
 
 
 class PackingSlip(Document):
-
 	def validate(self):
 		"""
-			* Validate existence of submitted Delivery Note
-			* Case nos do not overlap
-			* Check if packed qty doesn't exceed actual qty of delivery note
+		* Validate existence of submitted Delivery Note
+		* Case nos do not overlap
+		* Check if packed qty doesn't exceed actual qty of delivery note
 
-			It is necessary to validate case nos before checking quantity
+		It is necessary to validate case nos before checking quantity
 		"""
 		self.validate_delivery_note()
 		self.validate_items_mandatory()
@@ -25,12 +24,13 @@
 		self.validate_qty()
 
 		from erpnext.utilities.transaction_base import validate_uom_is_integer
+
 		validate_uom_is_integer(self, "stock_uom", "qty")
 		validate_uom_is_integer(self, "weight_uom", "net_weight")
 
 	def validate_delivery_note(self):
 		"""
-			Validates if delivery note has status as draft
+		Validates if delivery note has status as draft
 		"""
 		if cint(frappe.db.get_value("Delivery Note", self.delivery_note, "docstatus")) != 0:
 			frappe.throw(_("Delivery Note {0} must not be submitted").format(self.delivery_note))
@@ -42,27 +42,33 @@
 
 	def validate_case_nos(self):
 		"""
-			Validate if case nos overlap. If they do, recommend next case no.
+		Validate if case nos overlap. If they do, recommend next case no.
 		"""
 		if not cint(self.from_case_no):
 			frappe.msgprint(_("Please specify a valid 'From Case No.'"), raise_exception=1)
 		elif not self.to_case_no:
 			self.to_case_no = self.from_case_no
 		elif cint(self.from_case_no) > cint(self.to_case_no):
-			frappe.msgprint(_("'To Case No.' cannot be less than 'From Case No.'"),
-				raise_exception=1)
+			frappe.msgprint(_("'To Case No.' cannot be less than 'From Case No.'"), raise_exception=1)
 
-		res = frappe.db.sql("""SELECT name FROM `tabPacking Slip`
+		res = frappe.db.sql(
+			"""SELECT name FROM `tabPacking Slip`
 			WHERE delivery_note = %(delivery_note)s AND docstatus = 1 AND
 			((from_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s)
 			OR (to_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s)
 			OR (%(from_case_no)s BETWEEN from_case_no AND to_case_no))
-			""", {"delivery_note":self.delivery_note,
-				"from_case_no":self.from_case_no,
-				"to_case_no":self.to_case_no})
+			""",
+			{
+				"delivery_note": self.delivery_note,
+				"from_case_no": self.from_case_no,
+				"to_case_no": self.to_case_no,
+			},
+		)
 
 		if res:
-			frappe.throw(_("""Case No(s) already in use. Try from Case No {0}""").format(self.get_recommended_case_no()))
+			frappe.throw(
+				_("""Case No(s) already in use. Try from Case No {0}""").format(self.get_recommended_case_no())
+			)
 
 	def validate_qty(self):
 		"""Check packed qty across packing slips and delivery note"""
@@ -70,36 +76,37 @@
 		dn_details, ps_item_qty, no_of_cases = self.get_details_for_packing()
 
 		for item in dn_details:
-			new_packed_qty = (flt(ps_item_qty[item['item_code']]) * no_of_cases) + \
-			 	flt(item['packed_qty'])
-			if new_packed_qty > flt(item['qty']) and no_of_cases:
+			new_packed_qty = (flt(ps_item_qty[item["item_code"]]) * no_of_cases) + flt(item["packed_qty"])
+			if new_packed_qty > flt(item["qty"]) and no_of_cases:
 				self.recommend_new_qty(item, ps_item_qty, no_of_cases)
 
-
 	def get_details_for_packing(self):
 		"""
-			Returns
-			* 'Delivery Note Items' query result as a list of dict
-			* Item Quantity dict of current packing slip doc
-			* No. of Cases of this packing slip
+		Returns
+		* 'Delivery Note Items' query result as a list of dict
+		* Item Quantity dict of current packing slip doc
+		* No. of Cases of this packing slip
 		"""
 
 		rows = [d.item_code for d in self.get("items")]
 
 		# also pick custom fields from delivery note
-		custom_fields = ', '.join('dni.`{0}`'.format(d.fieldname)
+		custom_fields = ", ".join(
+			"dni.`{0}`".format(d.fieldname)
 			for d in frappe.get_meta("Delivery Note Item").get_custom_fields()
-			if d.fieldtype not in no_value_fields)
+			if d.fieldtype not in no_value_fields
+		)
 
 		if custom_fields:
-			custom_fields = ', ' + custom_fields
+			custom_fields = ", " + custom_fields
 
 		condition = ""
 		if rows:
-			condition = " and item_code in (%s)" % (", ".join(["%s"]*len(rows)))
+			condition = " and item_code in (%s)" % (", ".join(["%s"] * len(rows)))
 
 		# gets item code, qty per item code, latest packed qty per item code and stock uom
-		res = frappe.db.sql("""select item_code, sum(qty) as qty,
+		res = frappe.db.sql(
+			"""select item_code, sum(qty) as qty,
 			(select sum(psi.qty * (abs(ps.to_case_no - ps.from_case_no) + 1))
 				from `tabPacking Slip` ps, `tabPacking Slip Item` psi
 				where ps.name = psi.parent and ps.docstatus = 1
@@ -107,47 +114,57 @@
 			stock_uom, item_name, description, dni.batch_no {custom_fields}
 			from `tabDelivery Note Item` dni
 			where parent=%s {condition}
-			group by item_code""".format(condition=condition, custom_fields=custom_fields),
-			tuple([self.delivery_note] + rows), as_dict=1)
+			group by item_code""".format(
+				condition=condition, custom_fields=custom_fields
+			),
+			tuple([self.delivery_note] + rows),
+			as_dict=1,
+		)
 
 		ps_item_qty = dict([[d.item_code, d.qty] for d in self.get("items")])
 		no_of_cases = cint(self.to_case_no) - cint(self.from_case_no) + 1
 
 		return res, ps_item_qty, no_of_cases
 
-
 	def recommend_new_qty(self, item, ps_item_qty, no_of_cases):
 		"""
-			Recommend a new quantity and raise a validation exception
+		Recommend a new quantity and raise a validation exception
 		"""
-		item['recommended_qty'] = (flt(item['qty']) - flt(item['packed_qty'])) / no_of_cases
-		item['specified_qty'] = flt(ps_item_qty[item['item_code']])
-		if not item['packed_qty']: item['packed_qty'] = 0
+		item["recommended_qty"] = (flt(item["qty"]) - flt(item["packed_qty"])) / no_of_cases
+		item["specified_qty"] = flt(ps_item_qty[item["item_code"]])
+		if not item["packed_qty"]:
+			item["packed_qty"] = 0
 
-		frappe.throw(_("Quantity for Item {0} must be less than {1}").format(item.get("item_code"), item.get("recommended_qty")))
+		frappe.throw(
+			_("Quantity for Item {0} must be less than {1}").format(
+				item.get("item_code"), item.get("recommended_qty")
+			)
+		)
 
 	def update_item_details(self):
 		"""
-			Fill empty columns in Packing Slip Item
+		Fill empty columns in Packing Slip Item
 		"""
 		if not self.from_case_no:
 			self.from_case_no = self.get_recommended_case_no()
 
 		for d in self.get("items"):
-			res = frappe.db.get_value("Item", d.item_code,
-				["weight_per_unit", "weight_uom"], as_dict=True)
+			res = frappe.db.get_value("Item", d.item_code, ["weight_per_unit", "weight_uom"], as_dict=True)
 
-			if res and len(res)>0:
+			if res and len(res) > 0:
 				d.net_weight = res["weight_per_unit"]
 				d.weight_uom = res["weight_uom"]
 
 	def get_recommended_case_no(self):
 		"""
-			Returns the next case no. for a new packing slip for a delivery
-			note
+		Returns the next case no. for a new packing slip for a delivery
+		note
 		"""
-		recommended_case_no = frappe.db.sql("""SELECT MAX(to_case_no) FROM `tabPacking Slip`
-			WHERE delivery_note = %s AND docstatus=1""", self.delivery_note)
+		recommended_case_no = frappe.db.sql(
+			"""SELECT MAX(to_case_no) FROM `tabPacking Slip`
+			WHERE delivery_note = %s AND docstatus=1""",
+			self.delivery_note,
+		)
 
 		return cint(recommended_case_no[0][0]) + 1
 
@@ -160,7 +177,7 @@
 		dn_details = self.get_details_for_packing()[0]
 		for item in dn_details:
 			if flt(item.qty) > flt(item.packed_qty):
-				ch = self.append('items', {})
+				ch = self.append("items", {})
 				ch.item_code = item.item_code
 				ch.item_name = item.item_name
 				ch.stock_uom = item.stock_uom
@@ -175,14 +192,18 @@
 
 		self.update_item_details()
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def item_details(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
-	return frappe.db.sql("""select name, item_name, description from `tabItem`
+
+	return frappe.db.sql(
+		"""select name, item_name, description from `tabItem`
 				where name in ( select item_code FROM `tabDelivery Note Item`
 	 						where parent= %s)
 	 			and %s like "%s" %s
-	 			limit  %s, %s """ % ("%s", searchfield, "%s",
-	 			get_match_cond(doctype), "%s", "%s"),
-	 			((filters or {}).get("delivery_note"), "%%%s%%" % txt, start, page_len))
+	 			limit  %s, %s """
+		% ("%s", searchfield, "%s", get_match_cond(doctype), "%s", "%s"),
+		((filters or {}).get("delivery_note"), "%%%s%%" % txt, start, page_len),
+	)
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index 35cbc2f..7061ee1 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -19,6 +19,7 @@
 
 # TODO: Prioritize SO or WO group warehouse
 
+
 class PickList(Document):
 	def validate(self):
 		self.validate_for_qty()
@@ -27,8 +28,11 @@
 		self.set_item_locations()
 
 		# set percentage picked in SO
-		for location in self.get('locations'):
-			if location.sales_order and frappe.db.get_value("Sales Order",location.sales_order,"per_picked") == 100:
+		for location in self.get("locations"):
+			if (
+				location.sales_order
+				and frappe.db.get_value("Sales Order", location.sales_order, "per_picked") == 100
+			):
 				frappe.throw("Row " + str(location.idx) + " has been picked already!")
 
 	def before_submit(self):
@@ -39,44 +43,62 @@
 
 			if item.sales_order_item:
 				# update the picked_qty in SO Item
-				self.update_so(item.sales_order_item,item.picked_qty,item.item_code)
+				self.update_so(item.sales_order_item, item.picked_qty, item.item_code)
 
-			if not frappe.get_cached_value('Item', item.item_code, 'has_serial_no'):
+			if not frappe.get_cached_value("Item", item.item_code, "has_serial_no"):
 				continue
 			if not item.serial_no:
-				frappe.throw(_("Row #{0}: {1} does not have any available serial numbers in {2}").format(
-					frappe.bold(item.idx), frappe.bold(item.item_code), frappe.bold(item.warehouse)),
-					title=_("Serial Nos Required"))
-			if len(item.serial_no.split('\n')) == item.picked_qty:
+				frappe.throw(
+					_("Row #{0}: {1} does not have any available serial numbers in {2}").format(
+						frappe.bold(item.idx), frappe.bold(item.item_code), frappe.bold(item.warehouse)
+					),
+					title=_("Serial Nos Required"),
+				)
+			if len(item.serial_no.split("\n")) == item.picked_qty:
 				continue
-			frappe.throw(_('For item {0} at row {1}, count of serial numbers does not match with the picked quantity')
-				.format(frappe.bold(item.item_code), frappe.bold(item.idx)), title=_("Quantity Mismatch"))
+			frappe.throw(
+				_(
+					"For item {0} at row {1}, count of serial numbers does not match with the picked quantity"
+				).format(frappe.bold(item.item_code), frappe.bold(item.idx)),
+				title=_("Quantity Mismatch"),
+			)
 
 	def before_cancel(self):
-		#update picked_qty in SO Item on cancel of PL
-		for item in self.get('locations'):
+		# update picked_qty in SO Item on cancel of PL
+		for item in self.get("locations"):
 			if item.sales_order_item:
 				self.update_so(item.sales_order_item, -1 * item.picked_qty, item.item_code)
 
-	def update_so(self,so_item,picked_qty,item_code):
-		so_doc = frappe.get_doc("Sales Order",frappe.db.get_value("Sales Order Item",so_item,"parent"))
-		already_picked,actual_qty = frappe.db.get_value("Sales Order Item",so_item,["picked_qty","qty"])
+	def update_so(self, so_item, picked_qty, item_code):
+		so_doc = frappe.get_doc(
+			"Sales Order", frappe.db.get_value("Sales Order Item", so_item, "parent")
+		)
+		already_picked, actual_qty = frappe.db.get_value(
+			"Sales Order Item", so_item, ["picked_qty", "qty"]
+		)
 
 		if self.docstatus == 1:
-			if (((already_picked + picked_qty)/ actual_qty)*100) > (100 + flt(frappe.db.get_single_value('Stock Settings', 'over_delivery_receipt_allowance'))):
-				frappe.throw('You are picking more than required quantity for ' + item_code + '. Check if there is any other pick list created for '+so_doc.name)
+			if (((already_picked + picked_qty) / actual_qty) * 100) > (
+				100 + flt(frappe.db.get_single_value("Stock Settings", "over_delivery_receipt_allowance"))
+			):
+				frappe.throw(
+					"You are picking more than required quantity for "
+					+ item_code
+					+ ". Check if there is any other pick list created for "
+					+ so_doc.name
+				)
 
-		frappe.db.set_value("Sales Order Item",so_item,"picked_qty",already_picked+picked_qty)
+		frappe.db.set_value("Sales Order Item", so_item, "picked_qty", already_picked + picked_qty)
 
 		total_picked_qty = 0
 		total_so_qty = 0
-		for item in so_doc.get('items'):
+		for item in so_doc.get("items"):
 			total_picked_qty += flt(item.picked_qty)
 			total_so_qty += flt(item.stock_qty)
-		total_picked_qty=total_picked_qty + picked_qty
-		per_picked = total_picked_qty/total_so_qty * 100
+		total_picked_qty = total_picked_qty + picked_qty
+		per_picked = total_picked_qty / total_so_qty * 100
 
-		so_doc.db_set("per_picked", flt(per_picked) ,update_modified=False)
+		so_doc.db_set("per_picked", flt(per_picked), update_modified=False)
 
 	@frappe.whitelist()
 	def set_item_locations(self, save=False):
@@ -86,20 +108,26 @@
 
 		from_warehouses = None
 		if self.parent_warehouse:
-			from_warehouses = frappe.db.get_descendants('Warehouse', self.parent_warehouse)
+			from_warehouses = frappe.db.get_descendants("Warehouse", self.parent_warehouse)
 
 		# Create replica before resetting, to handle empty table on update after submit.
-		locations_replica  = self.get('locations')
+		locations_replica = self.get("locations")
 
 		# reset
-		self.delete_key('locations')
+		self.delete_key("locations")
 		for item_doc in items:
 			item_code = item_doc.item_code
 
-			self.item_location_map.setdefault(item_code,
-				get_available_item_locations(item_code, from_warehouses, self.item_count_map.get(item_code), self.company))
+			self.item_location_map.setdefault(
+				item_code,
+				get_available_item_locations(
+					item_code, from_warehouses, self.item_count_map.get(item_code), self.company
+				),
+			)
 
-			locations = get_items_with_location_and_quantity(item_doc, self.item_location_map, self.docstatus)
+			locations = get_items_with_location_and_quantity(
+				item_doc, self.item_location_map, self.docstatus
+			)
 
 			item_doc.idx = None
 			item_doc.name = None
@@ -107,23 +135,28 @@
 			for row in locations:
 				location = item_doc.as_dict()
 				location.update(row)
-				self.append('locations', location)
+				self.append("locations", location)
 
 		# If table is empty on update after submit, set stock_qty, picked_qty to 0 so that indicator is red
 		# and give feedback to the user. This is to avoid empty Pick Lists.
-		if not self.get('locations') and self.docstatus == 1:
+		if not self.get("locations") and self.docstatus == 1:
 			for location in locations_replica:
 				location.stock_qty = 0
 				location.picked_qty = 0
-				self.append('locations', location)
-			frappe.msgprint(_("Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List."),
-				 title=_("Out of Stock"), indicator="red")
+				self.append("locations", location)
+			frappe.msgprint(
+				_(
+					"Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List."
+				),
+				title=_("Out of Stock"),
+				indicator="red",
+			)
 
 		if save:
 			self.save()
 
 	def aggregate_item_qty(self):
-		locations = self.get('locations')
+		locations = self.get("locations")
 		self.item_count_map = {}
 		# aggregate qty for same item
 		item_map = OrderedDict()
@@ -150,8 +183,9 @@
 		return item_map.values()
 
 	def validate_for_qty(self):
-		if self.purpose == "Material Transfer for Manufacture" \
-				and (self.for_qty is None or self.for_qty == 0):
+		if self.purpose == "Material Transfer for Manufacture" and (
+			self.for_qty is None or self.for_qty == 0
+		):
 			frappe.throw(_("Qty of Finished Goods Item should be greater than 0."))
 
 	def before_print(self, settings=None):
@@ -163,7 +197,7 @@
 		group_picked_qty = defaultdict(float)
 
 		for item in self.locations:
-			group_item_qty[(item.item_code, item.warehouse)] +=  item.qty
+			group_item_qty[(item.item_code, item.warehouse)] += item.qty
 			group_picked_qty[(item.item_code, item.warehouse)] += item.picked_qty
 
 		duplicate_list = []
@@ -187,37 +221,47 @@
 	if not pick_list.locations:
 		frappe.throw(_("Add items in the Item Locations table"))
 
+
 def get_items_with_location_and_quantity(item_doc, item_location_map, docstatus):
 	available_locations = item_location_map.get(item_doc.item_code)
 	locations = []
 
 	# if stock qty is zero on submitted entry, show positive remaining qty to recalculate in case of restock.
-	remaining_stock_qty = item_doc.qty if (docstatus == 1 and item_doc.stock_qty == 0) else item_doc.stock_qty
+	remaining_stock_qty = (
+		item_doc.qty if (docstatus == 1 and item_doc.stock_qty == 0) else item_doc.stock_qty
+	)
 
 	while remaining_stock_qty > 0 and available_locations:
 		item_location = available_locations.pop(0)
 		item_location = frappe._dict(item_location)
 
-		stock_qty = remaining_stock_qty if item_location.qty >= remaining_stock_qty else item_location.qty
+		stock_qty = (
+			remaining_stock_qty if item_location.qty >= remaining_stock_qty else item_location.qty
+		)
 		qty = stock_qty / (item_doc.conversion_factor or 1)
 
-		uom_must_be_whole_number = frappe.db.get_value('UOM', item_doc.uom, 'must_be_whole_number')
+		uom_must_be_whole_number = frappe.db.get_value("UOM", item_doc.uom, "must_be_whole_number")
 		if uom_must_be_whole_number:
 			qty = floor(qty)
 			stock_qty = qty * item_doc.conversion_factor
-			if not stock_qty: break
+			if not stock_qty:
+				break
 
 		serial_nos = None
 		if item_location.serial_no:
-			serial_nos = '\n'.join(item_location.serial_no[0: cint(stock_qty)])
+			serial_nos = "\n".join(item_location.serial_no[0 : cint(stock_qty)])
 
-		locations.append(frappe._dict({
-			'qty': qty,
-			'stock_qty': stock_qty,
-			'warehouse': item_location.warehouse,
-			'serial_no': serial_nos,
-			'batch_no': item_location.batch_no
-		}))
+		locations.append(
+			frappe._dict(
+				{
+					"qty": qty,
+					"stock_qty": stock_qty,
+					"warehouse": item_location.warehouse,
+					"serial_no": serial_nos,
+					"batch_no": item_location.batch_no,
+				}
+			)
+		)
 
 		remaining_stock_qty -= stock_qty
 
@@ -227,55 +271,69 @@
 			item_location.qty = qty_diff
 			if item_location.serial_no:
 				# set remaining serial numbers
-				item_location.serial_no = item_location.serial_no[-int(qty_diff):]
+				item_location.serial_no = item_location.serial_no[-int(qty_diff) :]
 			available_locations = [item_location] + available_locations
 
 	# update available locations for the item
 	item_location_map[item_doc.item_code] = available_locations
 	return locations
 
-def get_available_item_locations(item_code, from_warehouses, required_qty, company, ignore_validation=False):
+
+def get_available_item_locations(
+	item_code, from_warehouses, required_qty, company, ignore_validation=False
+):
 	locations = []
-	has_serial_no  = frappe.get_cached_value('Item', item_code, 'has_serial_no')
-	has_batch_no = frappe.get_cached_value('Item', item_code, 'has_batch_no')
+	has_serial_no = frappe.get_cached_value("Item", item_code, "has_serial_no")
+	has_batch_no = frappe.get_cached_value("Item", item_code, "has_batch_no")
 
 	if has_batch_no and has_serial_no:
-		locations = get_available_item_locations_for_serial_and_batched_item(item_code, from_warehouses, required_qty, company)
+		locations = get_available_item_locations_for_serial_and_batched_item(
+			item_code, from_warehouses, required_qty, company
+		)
 	elif has_serial_no:
-		locations = get_available_item_locations_for_serialized_item(item_code, from_warehouses, required_qty, company)
+		locations = get_available_item_locations_for_serialized_item(
+			item_code, from_warehouses, required_qty, company
+		)
 	elif has_batch_no:
-		locations = get_available_item_locations_for_batched_item(item_code, from_warehouses, required_qty, company)
+		locations = get_available_item_locations_for_batched_item(
+			item_code, from_warehouses, required_qty, company
+		)
 	else:
-		locations = get_available_item_locations_for_other_item(item_code, from_warehouses, required_qty, company)
+		locations = get_available_item_locations_for_other_item(
+			item_code, from_warehouses, required_qty, company
+		)
 
-	total_qty_available = sum(location.get('qty') for location in locations)
+	total_qty_available = sum(location.get("qty") for location in locations)
 
 	remaining_qty = required_qty - total_qty_available
 
 	if remaining_qty > 0 and not ignore_validation:
-		frappe.msgprint(_('{0} units of Item {1} is not available.')
-			.format(remaining_qty, frappe.get_desk_link('Item', item_code)),
-			title=_("Insufficient Stock"))
+		frappe.msgprint(
+			_("{0} units of Item {1} is not available.").format(
+				remaining_qty, frappe.get_desk_link("Item", item_code)
+			),
+			title=_("Insufficient Stock"),
+		)
 
 	return locations
 
 
-def get_available_item_locations_for_serialized_item(item_code, from_warehouses, required_qty, company):
-	filters = frappe._dict({
-		'item_code': item_code,
-		'company': company,
-		'warehouse': ['!=', '']
-	})
+def get_available_item_locations_for_serialized_item(
+	item_code, from_warehouses, required_qty, company
+):
+	filters = frappe._dict({"item_code": item_code, "company": company, "warehouse": ["!=", ""]})
 
 	if from_warehouses:
-		filters.warehouse = ['in', from_warehouses]
+		filters.warehouse = ["in", from_warehouses]
 
-	serial_nos = frappe.get_all('Serial No',
-		fields=['name', 'warehouse'],
+	serial_nos = frappe.get_all(
+		"Serial No",
+		fields=["name", "warehouse"],
 		filters=filters,
 		limit=required_qty,
-		order_by='purchase_date',
-		as_list=1)
+		order_by="purchase_date",
+		as_list=1,
+	)
 
 	warehouse_serial_nos_map = frappe._dict()
 	for serial_no, warehouse in serial_nos:
@@ -283,17 +341,17 @@
 
 	locations = []
 	for warehouse, serial_nos in warehouse_serial_nos_map.items():
-		locations.append({
-			'qty': len(serial_nos),
-			'warehouse': warehouse,
-			'serial_no': serial_nos
-		})
+		locations.append({"qty": len(serial_nos), "warehouse": warehouse, "serial_no": serial_nos})
 
 	return locations
 
-def get_available_item_locations_for_batched_item(item_code, from_warehouses, required_qty, company):
-	warehouse_condition = 'and warehouse in %(warehouses)s' if from_warehouses else ''
-	batch_locations = frappe.db.sql("""
+
+def get_available_item_locations_for_batched_item(
+	item_code, from_warehouses, required_qty, company
+):
+	warehouse_condition = "and warehouse in %(warehouses)s" if from_warehouses else ""
+	batch_locations = frappe.db.sql(
+		"""
 		SELECT
 			sle.`warehouse`,
 			sle.`batch_no`,
@@ -314,84 +372,94 @@
 			sle.`item_code`
 		HAVING `qty` > 0
 		ORDER BY IFNULL(batch.`expiry_date`, '2200-01-01'), batch.`creation`
-	""".format(warehouse_condition=warehouse_condition), { #nosec
-		'item_code': item_code,
-		'company': company,
-		'today': today(),
-		'warehouses': from_warehouses
-	}, as_dict=1)
+	""".format(
+			warehouse_condition=warehouse_condition
+		),
+		{  # nosec
+			"item_code": item_code,
+			"company": company,
+			"today": today(),
+			"warehouses": from_warehouses,
+		},
+		as_dict=1,
+	)
 
 	return batch_locations
 
-def get_available_item_locations_for_serial_and_batched_item(item_code, from_warehouses, required_qty, company):
-	# Get batch nos by FIFO
-	locations = get_available_item_locations_for_batched_item(item_code, from_warehouses, required_qty, company)
 
-	filters = frappe._dict({
-		'item_code': item_code,
-		'company': company,
-		'warehouse': ['!=', ''],
-		'batch_no': ''
-	})
+def get_available_item_locations_for_serial_and_batched_item(
+	item_code, from_warehouses, required_qty, company
+):
+	# Get batch nos by FIFO
+	locations = get_available_item_locations_for_batched_item(
+		item_code, from_warehouses, required_qty, company
+	)
+
+	filters = frappe._dict(
+		{"item_code": item_code, "company": company, "warehouse": ["!=", ""], "batch_no": ""}
+	)
 
 	# Get Serial Nos by FIFO for Batch No
 	for location in locations:
 		filters.batch_no = location.batch_no
 		filters.warehouse = location.warehouse
-		location.qty = required_qty if location.qty > required_qty else location.qty # if extra qty in batch
+		location.qty = (
+			required_qty if location.qty > required_qty else location.qty
+		)  # if extra qty in batch
 
-		serial_nos = frappe.get_list('Serial No',
-			fields=['name'],
-			filters=filters,
-			limit=location.qty,
-			order_by='purchase_date')
+		serial_nos = frappe.get_list(
+			"Serial No", fields=["name"], filters=filters, limit=location.qty, order_by="purchase_date"
+		)
 
 		serial_nos = [sn.name for sn in serial_nos]
 		location.serial_no = serial_nos
 
 	return locations
 
+
 def get_available_item_locations_for_other_item(item_code, from_warehouses, required_qty, company):
 	# gets all items available in different warehouses
-	warehouses = [x.get('name') for x in frappe.get_list("Warehouse", {'company': company}, "name")]
+	warehouses = [x.get("name") for x in frappe.get_list("Warehouse", {"company": company}, "name")]
 
-	filters = frappe._dict({
-		'item_code': item_code,
-		'warehouse': ['in', warehouses],
-		'actual_qty': ['>', 0]
-	})
+	filters = frappe._dict(
+		{"item_code": item_code, "warehouse": ["in", warehouses], "actual_qty": [">", 0]}
+	)
 
 	if from_warehouses:
-		filters.warehouse = ['in', from_warehouses]
+		filters.warehouse = ["in", from_warehouses]
 
-	item_locations = frappe.get_all('Bin',
-		fields=['warehouse', 'actual_qty as qty'],
+	item_locations = frappe.get_all(
+		"Bin",
+		fields=["warehouse", "actual_qty as qty"],
 		filters=filters,
 		limit=required_qty,
-		order_by='creation')
+		order_by="creation",
+	)
 
 	return item_locations
 
 
 @frappe.whitelist()
 def create_delivery_note(source_name, target_doc=None):
-	pick_list = frappe.get_doc('Pick List', source_name)
+	pick_list = frappe.get_doc("Pick List", source_name)
 	validate_item_locations(pick_list)
 	sales_dict = dict()
 	sales_orders = []
 	delivery_note = None
 	for location in pick_list.locations:
 		if location.sales_order:
-			sales_orders.append([frappe.db.get_value("Sales Order",location.sales_order,'customer'),location.sales_order])
+			sales_orders.append(
+				[frappe.db.get_value("Sales Order", location.sales_order, "customer"), location.sales_order]
+			)
 	# Group sales orders by customer
-	for key,keydata in groupby(sales_orders,key=itemgetter(0)):
+	for key, keydata in groupby(sales_orders, key=itemgetter(0)):
 		sales_dict[key] = set([d[1] for d in keydata])
 
 	if sales_dict:
-		delivery_note = create_dn_with_so(sales_dict,pick_list)
+		delivery_note = create_dn_with_so(sales_dict, pick_list)
 
 	is_item_wo_so = 0
-	for location in pick_list.locations :
+	for location in pick_list.locations:
 		if not location.sales_order:
 			is_item_wo_so = 1
 			break
@@ -399,64 +467,69 @@
 		# Create a DN for items without sales orders as well
 		delivery_note = create_dn_wo_so(pick_list)
 
-	frappe.msgprint(_('Delivery Note(s) created for the Pick List'))
+	frappe.msgprint(_("Delivery Note(s) created for the Pick List"))
 	return delivery_note
 
+
 def create_dn_wo_so(pick_list):
-		delivery_note = frappe.new_doc("Delivery Note")
+	delivery_note = frappe.new_doc("Delivery Note")
 
-		item_table_mapper_without_so = {
-			'doctype': 'Delivery Note Item',
-			'field_map': {
-				'rate': 'rate',
-				'name': 'name',
-				'parent': '',
-			}
-		}
-		map_pl_locations(pick_list,item_table_mapper_without_so,delivery_note)
-		delivery_note.insert(ignore_mandatory = True)
+	item_table_mapper_without_so = {
+		"doctype": "Delivery Note Item",
+		"field_map": {
+			"rate": "rate",
+			"name": "name",
+			"parent": "",
+		},
+	}
+	map_pl_locations(pick_list, item_table_mapper_without_so, delivery_note)
+	delivery_note.insert(ignore_mandatory=True)
 
-		return delivery_note
+	return delivery_note
 
 
-def create_dn_with_so(sales_dict,pick_list):
+def create_dn_with_so(sales_dict, pick_list):
 	delivery_note = None
 
 	for customer in sales_dict:
 		for so in sales_dict[customer]:
 			delivery_note = None
-			delivery_note = create_delivery_note_from_sales_order(so,
-				delivery_note, skip_item_mapping=True)
+			delivery_note = create_delivery_note_from_sales_order(so, delivery_note, skip_item_mapping=True)
 
 			item_table_mapper = {
-				'doctype': 'Delivery Note Item',
-				'field_map': {
-					'rate': 'rate',
-					'name': 'so_detail',
-					'parent': 'against_sales_order',
+				"doctype": "Delivery Note Item",
+				"field_map": {
+					"rate": "rate",
+					"name": "so_detail",
+					"parent": "against_sales_order",
 				},
-				'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
+				"condition": lambda doc: abs(doc.delivered_qty) < abs(doc.qty)
+				and doc.delivered_by_supplier != 1,
 			}
 			break
 		if delivery_note:
 			# map all items of all sales orders of that customer
 			for so in sales_dict[customer]:
-				map_pl_locations(pick_list,item_table_mapper,delivery_note,so)
-			delivery_note.insert(ignore_mandatory = True)
+				map_pl_locations(pick_list, item_table_mapper, delivery_note, so)
+			delivery_note.insert(ignore_mandatory=True)
 
 	return delivery_note
 
-def map_pl_locations(pick_list,item_mapper,delivery_note,sales_order = None):
+
+def map_pl_locations(pick_list, item_mapper, delivery_note, sales_order=None):
 
 	for location in pick_list.locations:
 		if location.sales_order == sales_order:
 			if location.sales_order_item:
-				sales_order_item = frappe.get_cached_doc('Sales Order Item', {'name':location.sales_order_item})
+				sales_order_item = frappe.get_cached_doc(
+					"Sales Order Item", {"name": location.sales_order_item}
+				)
 			else:
 				sales_order_item = None
 
-			source_doc, table_mapper = [sales_order_item, item_mapper] if sales_order_item \
-				else [location, item_mapper]
+			source_doc, table_mapper = (
+				[sales_order_item, item_mapper] if sales_order_item else [location, item_mapper]
+			)
 
 			dn_item = map_child_doc(source_doc, delivery_note, table_mapper)
 
@@ -471,7 +544,7 @@
 
 	delivery_note.pick_list = pick_list.name
 	delivery_note.company = pick_list.company
-	delivery_note.customer = frappe.get_value("Sales Order",sales_order,"customer")
+	delivery_note.customer = frappe.get_value("Sales Order", sales_order, "customer")
 
 
 @frappe.whitelist()
@@ -479,17 +552,17 @@
 	pick_list = frappe.get_doc(json.loads(pick_list))
 	validate_item_locations(pick_list)
 
-	if stock_entry_exists(pick_list.get('name')):
-		return frappe.msgprint(_('Stock Entry has been already created against this Pick List'))
+	if stock_entry_exists(pick_list.get("name")):
+		return frappe.msgprint(_("Stock Entry has been already created against this Pick List"))
 
-	stock_entry = frappe.new_doc('Stock Entry')
-	stock_entry.pick_list = pick_list.get('name')
-	stock_entry.purpose = pick_list.get('purpose')
+	stock_entry = frappe.new_doc("Stock Entry")
+	stock_entry.pick_list = pick_list.get("name")
+	stock_entry.purpose = pick_list.get("purpose")
 	stock_entry.set_stock_entry_type()
 
-	if pick_list.get('work_order'):
+	if pick_list.get("work_order"):
 		stock_entry = update_stock_entry_based_on_work_order(pick_list, stock_entry)
-	elif pick_list.get('material_request'):
+	elif pick_list.get("material_request"):
 		stock_entry = update_stock_entry_based_on_material_request(pick_list, stock_entry)
 	else:
 		stock_entry = update_stock_entry_items_with_no_reference(pick_list, stock_entry)
@@ -499,9 +572,11 @@
 
 	return stock_entry.as_dict()
 
+
 @frappe.whitelist()
 def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filters, as_dict):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			`name`, `company`, `planned_start_date`
 		FROM
@@ -517,25 +592,27 @@
 		LIMIT
 			%(start)s, %(page_length)s""",
 		{
-			'txt': "%%%s%%" % txt,
-			'_txt': txt.replace('%', ''),
-			'start': start,
-			'page_length': frappe.utils.cint(page_length),
-			'company': filters.get('company')
-		}, as_dict=as_dict)
+			"txt": "%%%s%%" % txt,
+			"_txt": txt.replace("%", ""),
+			"start": start,
+			"page_length": frappe.utils.cint(page_length),
+			"company": filters.get("company"),
+		},
+		as_dict=as_dict,
+	)
+
 
 @frappe.whitelist()
 def target_document_exists(pick_list_name, purpose):
-	if purpose == 'Delivery':
-		return frappe.db.exists('Delivery Note', {
-			'pick_list': pick_list_name
-		})
+	if purpose == "Delivery":
+		return frappe.db.exists("Delivery Note", {"pick_list": pick_list_name})
 
 	return stock_entry_exists(pick_list_name)
 
+
 @frappe.whitelist()
 def get_item_details(item_code, uom=None):
-	details = frappe.db.get_value('Item', item_code, ['stock_uom', 'name'], as_dict=1)
+	details = frappe.db.get_value("Item", item_code, ["stock_uom", "name"], as_dict=1)
 	details.uom = uom or details.stock_uom
 	if uom:
 		details.update(get_conversion_factor(item_code, uom))
@@ -544,37 +621,37 @@
 
 
 def update_delivery_note_item(source, target, delivery_note):
-	cost_center = frappe.db.get_value('Project', delivery_note.project, 'cost_center')
+	cost_center = frappe.db.get_value("Project", delivery_note.project, "cost_center")
 	if not cost_center:
-		cost_center = get_cost_center(source.item_code, 'Item', delivery_note.company)
+		cost_center = get_cost_center(source.item_code, "Item", delivery_note.company)
 
 	if not cost_center:
-		cost_center = get_cost_center(source.item_group, 'Item Group', delivery_note.company)
+		cost_center = get_cost_center(source.item_group, "Item Group", delivery_note.company)
 
 	target.cost_center = cost_center
 
+
 def get_cost_center(for_item, from_doctype, company):
-	'''Returns Cost Center for Item or Item Group'''
-	return frappe.db.get_value('Item Default',
-		fieldname=['buying_cost_center'],
-		filters={
-			'parent': for_item,
-			'parenttype': from_doctype,
-			'company': company
-		})
+	"""Returns Cost Center for Item or Item Group"""
+	return frappe.db.get_value(
+		"Item Default",
+		fieldname=["buying_cost_center"],
+		filters={"parent": for_item, "parenttype": from_doctype, "company": company},
+	)
+
 
 def set_delivery_note_missing_values(target):
-	target.run_method('set_missing_values')
-	target.run_method('set_po_nos')
-	target.run_method('calculate_taxes_and_totals')
+	target.run_method("set_missing_values")
+	target.run_method("set_po_nos")
+	target.run_method("calculate_taxes_and_totals")
+
 
 def stock_entry_exists(pick_list_name):
-	return frappe.db.exists('Stock Entry', {
-		'pick_list': pick_list_name
-	})
+	return frappe.db.exists("Stock Entry", {"pick_list": pick_list_name})
+
 
 def update_stock_entry_based_on_work_order(pick_list, stock_entry):
-	work_order = frappe.get_doc("Work Order", pick_list.get('work_order'))
+	work_order = frappe.get_doc("Work Order", pick_list.get("work_order"))
 
 	stock_entry.work_order = work_order.name
 	stock_entry.company = work_order.company
@@ -583,10 +660,11 @@
 	stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
 	stock_entry.fg_completed_qty = pick_list.for_qty
 	if work_order.bom_no:
-		stock_entry.inspection_required = frappe.db.get_value('BOM',
-			work_order.bom_no, 'inspection_required')
+		stock_entry.inspection_required = frappe.db.get_value(
+			"BOM", work_order.bom_no, "inspection_required"
+		)
 
-	is_wip_warehouse_group = frappe.db.get_value('Warehouse', work_order.wip_warehouse, 'is_group')
+	is_wip_warehouse_group = frappe.db.get_value("Warehouse", work_order.wip_warehouse, "is_group")
 	if not (is_wip_warehouse_group and work_order.skip_transfer):
 		wip_warehouse = work_order.wip_warehouse
 	else:
@@ -600,32 +678,36 @@
 		update_common_item_properties(item, location)
 		item.t_warehouse = wip_warehouse
 
-		stock_entry.append('items', item)
+		stock_entry.append("items", item)
 
 	return stock_entry
 
+
 def update_stock_entry_based_on_material_request(pick_list, stock_entry):
 	for location in pick_list.locations:
 		target_warehouse = None
 		if location.material_request_item:
-			target_warehouse = frappe.get_value('Material Request Item',
-				location.material_request_item, 'warehouse')
+			target_warehouse = frappe.get_value(
+				"Material Request Item", location.material_request_item, "warehouse"
+			)
 		item = frappe._dict()
 		update_common_item_properties(item, location)
 		item.t_warehouse = target_warehouse
-		stock_entry.append('items', item)
+		stock_entry.append("items", item)
 
 	return stock_entry
 
+
 def update_stock_entry_items_with_no_reference(pick_list, stock_entry):
 	for location in pick_list.locations:
 		item = frappe._dict()
 		update_common_item_properties(item, location)
 
-		stock_entry.append('items', item)
+		stock_entry.append("items", item)
 
 	return stock_entry
 
+
 def update_common_item_properties(item, location):
 	item.item_code = location.item_code
 	item.s_warehouse = location.warehouse
diff --git a/erpnext/stock/doctype/pick_list/pick_list_dashboard.py b/erpnext/stock/doctype/pick_list/pick_list_dashboard.py
index ec3047e..92e57be 100644
--- a/erpnext/stock/doctype/pick_list/pick_list_dashboard.py
+++ b/erpnext/stock/doctype/pick_list/pick_list_dashboard.py
@@ -1,9 +1,7 @@
 def get_data():
 	return {
-		'fieldname': 'pick_list',
-		'transactions': [
-			{
-				'items': ['Stock Entry', 'Delivery Note']
-			},
-		]
+		"fieldname": "pick_list",
+		"transactions": [
+			{"items": ["Stock Entry", "Delivery Note"]},
+		],
 	}
diff --git a/erpnext/stock/doctype/pick_list/test_pick_list.py b/erpnext/stock/doctype/pick_list/test_pick_list.py
index f60104c..7496b6b 100644
--- a/erpnext/stock/doctype/pick_list/test_pick_list.py
+++ b/erpnext/stock/doctype/pick_list/test_pick_list.py
@@ -4,7 +4,7 @@
 import frappe
 from frappe import _dict
 
-test_dependencies = ['Item', 'Sales Invoice', 'Stock Entry', 'Batch']
+test_dependencies = ["Item", "Sales Invoice", "Stock Entry", "Batch"]
 
 from frappe.tests.utils import FrappeTestCase
 
@@ -19,146 +19,174 @@
 class TestPickList(FrappeTestCase):
 	def test_pick_list_picks_warehouse_for_each_item(self):
 		try:
-			frappe.get_doc({
-				'doctype': 'Stock Reconciliation',
-				'company': '_Test Company',
-				'purpose': 'Opening Stock',
-				'expense_account': 'Temporary Opening - _TC',
-				'items': [{
-					'item_code': '_Test Item',
-					'warehouse': '_Test Warehouse - _TC',
-					'valuation_rate': 100,
-					'qty': 5
-				}]
-			}).submit()
+			frappe.get_doc(
+				{
+					"doctype": "Stock Reconciliation",
+					"company": "_Test Company",
+					"purpose": "Opening Stock",
+					"expense_account": "Temporary Opening - _TC",
+					"items": [
+						{
+							"item_code": "_Test Item",
+							"warehouse": "_Test Warehouse - _TC",
+							"valuation_rate": 100,
+							"qty": 5,
+						}
+					],
+				}
+			).submit()
 		except EmptyStockReconciliationItemsError:
 			pass
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'customer': '_Test Customer',
-			'items_based_on': 'Sales Order',
-			'purpose': 'Delivery',
-			'locations': [{
-				'item_code': '_Test Item',
-				'qty': 5,
-				'stock_qty': 5,
-				'conversion_factor': 1,
-				'sales_order': '_T-Sales Order-1',
-				'sales_order_item': '_T-Sales Order-1_item',
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"customer": "_Test Customer",
+				"items_based_on": "Sales Order",
+				"purpose": "Delivery",
+				"locations": [
+					{
+						"item_code": "_Test Item",
+						"qty": 5,
+						"stock_qty": 5,
+						"conversion_factor": 1,
+						"sales_order": "_T-Sales Order-1",
+						"sales_order_item": "_T-Sales Order-1_item",
+					}
+				],
+			}
+		)
 		pick_list.set_item_locations()
 
-		self.assertEqual(pick_list.locations[0].item_code, '_Test Item')
-		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
+		self.assertEqual(pick_list.locations[0].item_code, "_Test Item")
+		self.assertEqual(pick_list.locations[0].warehouse, "_Test Warehouse - _TC")
 		self.assertEqual(pick_list.locations[0].qty, 5)
 
 	def test_pick_list_splits_row_according_to_warehouse_availability(self):
 		try:
-			frappe.get_doc({
-				'doctype': 'Stock Reconciliation',
-				'company': '_Test Company',
-				'purpose': 'Opening Stock',
-				'expense_account': 'Temporary Opening - _TC',
-				'items': [{
-					'item_code': '_Test Item Warehouse Group Wise Reorder',
-					'warehouse': '_Test Warehouse Group-C1 - _TC',
-					'valuation_rate': 100,
-					'qty': 5
-				}]
-			}).submit()
+			frappe.get_doc(
+				{
+					"doctype": "Stock Reconciliation",
+					"company": "_Test Company",
+					"purpose": "Opening Stock",
+					"expense_account": "Temporary Opening - _TC",
+					"items": [
+						{
+							"item_code": "_Test Item Warehouse Group Wise Reorder",
+							"warehouse": "_Test Warehouse Group-C1 - _TC",
+							"valuation_rate": 100,
+							"qty": 5,
+						}
+					],
+				}
+			).submit()
 		except EmptyStockReconciliationItemsError:
 			pass
 
 		try:
-			frappe.get_doc({
-				'doctype': 'Stock Reconciliation',
-				'company': '_Test Company',
-				'purpose': 'Opening Stock',
-				'expense_account': 'Temporary Opening - _TC',
-				'items': [{
-					'item_code': '_Test Item Warehouse Group Wise Reorder',
-					'warehouse': '_Test Warehouse 2 - _TC',
-					'valuation_rate': 400,
-					'qty': 10
-				}]
-			}).submit()
+			frappe.get_doc(
+				{
+					"doctype": "Stock Reconciliation",
+					"company": "_Test Company",
+					"purpose": "Opening Stock",
+					"expense_account": "Temporary Opening - _TC",
+					"items": [
+						{
+							"item_code": "_Test Item Warehouse Group Wise Reorder",
+							"warehouse": "_Test Warehouse 2 - _TC",
+							"valuation_rate": 400,
+							"qty": 10,
+						}
+					],
+				}
+			).submit()
 		except EmptyStockReconciliationItemsError:
 			pass
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'customer': '_Test Customer',
-			'items_based_on': 'Sales Order',
-			'purpose': 'Delivery',
-			'locations': [{
-				'item_code': '_Test Item Warehouse Group Wise Reorder',
-				'qty': 1000,
-				'stock_qty': 1000,
-				'conversion_factor': 1,
-				'sales_order': '_T-Sales Order-1',
-				'sales_order_item': '_T-Sales Order-1_item',
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"customer": "_Test Customer",
+				"items_based_on": "Sales Order",
+				"purpose": "Delivery",
+				"locations": [
+					{
+						"item_code": "_Test Item Warehouse Group Wise Reorder",
+						"qty": 1000,
+						"stock_qty": 1000,
+						"conversion_factor": 1,
+						"sales_order": "_T-Sales Order-1",
+						"sales_order_item": "_T-Sales Order-1_item",
+					}
+				],
+			}
+		)
 
 		pick_list.set_item_locations()
 
-		self.assertEqual(pick_list.locations[0].item_code, '_Test Item Warehouse Group Wise Reorder')
-		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse Group-C1 - _TC')
+		self.assertEqual(pick_list.locations[0].item_code, "_Test Item Warehouse Group Wise Reorder")
+		self.assertEqual(pick_list.locations[0].warehouse, "_Test Warehouse Group-C1 - _TC")
 		self.assertEqual(pick_list.locations[0].qty, 5)
 
-		self.assertEqual(pick_list.locations[1].item_code, '_Test Item Warehouse Group Wise Reorder')
-		self.assertEqual(pick_list.locations[1].warehouse, '_Test Warehouse 2 - _TC')
+		self.assertEqual(pick_list.locations[1].item_code, "_Test Item Warehouse Group Wise Reorder")
+		self.assertEqual(pick_list.locations[1].warehouse, "_Test Warehouse 2 - _TC")
 		self.assertEqual(pick_list.locations[1].qty, 10)
 
 	def test_pick_list_shows_serial_no_for_serialized_item(self):
 
-		stock_reconciliation = frappe.get_doc({
-			'doctype': 'Stock Reconciliation',
-			'purpose': 'Stock Reconciliation',
-			'company': '_Test Company',
-			'items': [{
-				'item_code': '_Test Serialized Item',
-				'warehouse': '_Test Warehouse - _TC',
-				'valuation_rate': 100,
-				'qty': 5,
-				'serial_no': '123450\n123451\n123452\n123453\n123454'
-			}]
-		})
+		stock_reconciliation = frappe.get_doc(
+			{
+				"doctype": "Stock Reconciliation",
+				"purpose": "Stock Reconciliation",
+				"company": "_Test Company",
+				"items": [
+					{
+						"item_code": "_Test Serialized Item",
+						"warehouse": "_Test Warehouse - _TC",
+						"valuation_rate": 100,
+						"qty": 5,
+						"serial_no": "123450\n123451\n123452\n123453\n123454",
+					}
+				],
+			}
+		)
 
 		try:
 			stock_reconciliation.submit()
 		except EmptyStockReconciliationItemsError:
 			pass
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'customer': '_Test Customer',
-			'items_based_on': 'Sales Order',
-			'purpose': 'Delivery',
-			'locations': [{
-				'item_code': '_Test Serialized Item',
-				'qty': 1000,
-				'stock_qty': 1000,
-				'conversion_factor': 1,
-				'sales_order': '_T-Sales Order-1',
-				'sales_order_item': '_T-Sales Order-1_item',
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"customer": "_Test Customer",
+				"items_based_on": "Sales Order",
+				"purpose": "Delivery",
+				"locations": [
+					{
+						"item_code": "_Test Serialized Item",
+						"qty": 1000,
+						"stock_qty": 1000,
+						"conversion_factor": 1,
+						"sales_order": "_T-Sales Order-1",
+						"sales_order_item": "_T-Sales Order-1_item",
+					}
+				],
+			}
+		)
 
 		pick_list.set_item_locations()
-		self.assertEqual(pick_list.locations[0].item_code, '_Test Serialized Item')
-		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
+		self.assertEqual(pick_list.locations[0].item_code, "_Test Serialized Item")
+		self.assertEqual(pick_list.locations[0].warehouse, "_Test Warehouse - _TC")
 		self.assertEqual(pick_list.locations[0].qty, 5)
-		self.assertEqual(pick_list.locations[0].serial_no, '123450\n123451\n123452\n123453\n123454')
+		self.assertEqual(pick_list.locations[0].serial_no, "123450\n123451\n123452\n123453\n123454")
 
 	def test_pick_list_shows_batch_no_for_batched_item(self):
 		# check if oldest batch no is picked
-		item = frappe.db.exists("Item", {'item_name': 'Batched Item'})
+		item = frappe.db.exists("Item", {"item_name": "Batched Item"})
 		if not item:
 			item = create_item("Batched Item")
 			item.has_batch_no = 1
@@ -166,7 +194,7 @@
 			item.batch_number_series = "B-BATCH-.##"
 			item.save()
 		else:
-			item = frappe.get_doc("Item", {'item_name': 'Batched Item'})
+			item = frappe.get_doc("Item", {"item_name": "Batched Item"})
 
 		pr1 = make_purchase_receipt(item_code="Batched Item", qty=1, rate=100.0)
 
@@ -175,27 +203,30 @@
 
 		pr2 = make_purchase_receipt(item_code="Batched Item", qty=2, rate=100.0)
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'purpose': 'Material Transfer',
-			'locations': [{
-				'item_code': 'Batched Item',
-				'qty': 1,
-				'stock_qty': 1,
-				'conversion_factor': 1,
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"purpose": "Material Transfer",
+				"locations": [
+					{
+						"item_code": "Batched Item",
+						"qty": 1,
+						"stock_qty": 1,
+						"conversion_factor": 1,
+					}
+				],
+			}
+		)
 		pick_list.set_item_locations()
 		self.assertEqual(pick_list.locations[0].batch_no, oldest_batch_no)
 
 		pr1.cancel()
 		pr2.cancel()
 
-
 	def test_pick_list_for_batched_and_serialised_item(self):
 		# check if oldest batch no and serial nos are picked
-		item = frappe.db.exists("Item", {'item_name': 'Batched and Serialised Item'})
+		item = frappe.db.exists("Item", {"item_name": "Batched and Serialised Item"})
 		if not item:
 			item = create_item("Batched and Serialised Item")
 			item.has_batch_no = 1
@@ -205,7 +236,7 @@
 			item.serial_no_series = "S-.####"
 			item.save()
 		else:
-			item = frappe.get_doc("Item", {'item_name': 'Batched and Serialised Item'})
+			item = frappe.get_doc("Item", {"item_name": "Batched and Serialised Item"})
 
 		pr1 = make_purchase_receipt(item_code="Batched and Serialised Item", qty=2, rate=100.0)
 
@@ -215,17 +246,21 @@
 
 		pr2 = make_purchase_receipt(item_code="Batched and Serialised Item", qty=2, rate=100.0)
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'purpose': 'Material Transfer',
-			'locations': [{
-				'item_code': 'Batched and Serialised Item',
-				'qty': 2,
-				'stock_qty': 2,
-				'conversion_factor': 1,
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"purpose": "Material Transfer",
+				"locations": [
+					{
+						"item_code": "Batched and Serialised Item",
+						"qty": 2,
+						"stock_qty": 2,
+						"conversion_factor": 1,
+					}
+				],
+			}
+		)
 		pick_list.set_item_locations()
 
 		self.assertEqual(pick_list.locations[0].batch_no, oldest_batch_no)
@@ -236,64 +271,71 @@
 
 	def test_pick_list_for_items_from_multiple_sales_orders(self):
 		try:
-			frappe.get_doc({
-				'doctype': 'Stock Reconciliation',
-				'company': '_Test Company',
-				'purpose': 'Opening Stock',
-				'expense_account': 'Temporary Opening - _TC',
-				'items': [{
-					'item_code': '_Test Item',
-					'warehouse': '_Test Warehouse - _TC',
-					'valuation_rate': 100,
-					'qty': 10
-				}]
-			}).submit()
+			frappe.get_doc(
+				{
+					"doctype": "Stock Reconciliation",
+					"company": "_Test Company",
+					"purpose": "Opening Stock",
+					"expense_account": "Temporary Opening - _TC",
+					"items": [
+						{
+							"item_code": "_Test Item",
+							"warehouse": "_Test Warehouse - _TC",
+							"valuation_rate": 100,
+							"qty": 10,
+						}
+					],
+				}
+			).submit()
 		except EmptyStockReconciliationItemsError:
 			pass
 
-		sales_order = frappe.get_doc({
-				'doctype': "Sales Order",
-				'customer': '_Test Customer',
-				'company': '_Test Company',
-				'items': [{
-					'item_code': '_Test Item',
-					'qty': 10,
-					'delivery_date': frappe.utils.today()
-				}],
-			})
+		sales_order = frappe.get_doc(
+			{
+				"doctype": "Sales Order",
+				"customer": "_Test Customer",
+				"company": "_Test Company",
+				"items": [{"item_code": "_Test Item", "qty": 10, "delivery_date": frappe.utils.today()}],
+			}
+		)
 		sales_order.submit()
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'customer': '_Test Customer',
-			'items_based_on': 'Sales Order',
-			'purpose': 'Delivery',
-			'locations': [{
-				'item_code': '_Test Item',
-				'qty': 5,
-				'stock_qty': 5,
-				'conversion_factor': 1,
-				'sales_order': '_T-Sales Order-1',
-				'sales_order_item': '_T-Sales Order-1_item',
-			}, {
-				'item_code': '_Test Item',
-				'qty': 5,
-				'stock_qty': 5,
-				'conversion_factor': 1,
-				'sales_order': sales_order.name,
-				'sales_order_item': sales_order.items[0].name,
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"customer": "_Test Customer",
+				"items_based_on": "Sales Order",
+				"purpose": "Delivery",
+				"locations": [
+					{
+						"item_code": "_Test Item",
+						"qty": 5,
+						"stock_qty": 5,
+						"conversion_factor": 1,
+						"sales_order": "_T-Sales Order-1",
+						"sales_order_item": "_T-Sales Order-1_item",
+					},
+					{
+						"item_code": "_Test Item",
+						"qty": 5,
+						"stock_qty": 5,
+						"conversion_factor": 1,
+						"sales_order": sales_order.name,
+						"sales_order_item": sales_order.items[0].name,
+					},
+				],
+			}
+		)
 		pick_list.set_item_locations()
 
-		self.assertEqual(pick_list.locations[0].item_code, '_Test Item')
-		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
+		self.assertEqual(pick_list.locations[0].item_code, "_Test Item")
+		self.assertEqual(pick_list.locations[0].warehouse, "_Test Warehouse - _TC")
 		self.assertEqual(pick_list.locations[0].qty, 5)
-		self.assertEqual(pick_list.locations[0].sales_order_item, '_T-Sales Order-1_item')
+		self.assertEqual(pick_list.locations[0].sales_order_item, "_T-Sales Order-1_item")
 
-		self.assertEqual(pick_list.locations[1].item_code, '_Test Item')
-		self.assertEqual(pick_list.locations[1].warehouse, '_Test Warehouse - _TC')
+		self.assertEqual(pick_list.locations[1].item_code, "_Test Item")
+		self.assertEqual(pick_list.locations[1].warehouse, "_Test Warehouse - _TC")
 		self.assertEqual(pick_list.locations[1].qty, 5)
 		self.assertEqual(pick_list.locations[1].sales_order_item, sales_order.items[0].name)
 
@@ -301,47 +343,57 @@
 		purchase_receipt = make_purchase_receipt(item_code="_Test Item", qty=10)
 		purchase_receipt.submit()
 
-		sales_order = frappe.get_doc({
-				'doctype': 'Sales Order',
-				'customer': '_Test Customer',
-				'company': '_Test Company',
-				'items': [{
-					'item_code': '_Test Item',
-					'qty': 1,
-					'conversion_factor': 5,
-					'stock_qty':5,
-					'delivery_date': frappe.utils.today()
-				}, {
-					'item_code': '_Test Item',
-					'qty': 1,
-					'conversion_factor': 1,
-					'delivery_date': frappe.utils.today()
-				}],
-			}).insert()
+		sales_order = frappe.get_doc(
+			{
+				"doctype": "Sales Order",
+				"customer": "_Test Customer",
+				"company": "_Test Company",
+				"items": [
+					{
+						"item_code": "_Test Item",
+						"qty": 1,
+						"conversion_factor": 5,
+						"stock_qty": 5,
+						"delivery_date": frappe.utils.today(),
+					},
+					{
+						"item_code": "_Test Item",
+						"qty": 1,
+						"conversion_factor": 1,
+						"delivery_date": frappe.utils.today(),
+					},
+				],
+			}
+		).insert()
 		sales_order.submit()
 
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'customer': '_Test Customer',
-			'items_based_on': 'Sales Order',
-			'purpose': 'Delivery',
-			'locations': [{
-				'item_code': '_Test Item',
-				'qty': 2,
-				'stock_qty': 1,
-				'conversion_factor': 0.5,
-				'sales_order': sales_order.name,
-				'sales_order_item': sales_order.items[0].name ,
-			}, {
-				'item_code': '_Test Item',
-				'qty': 1,
-				'stock_qty': 1,
-				'conversion_factor': 1,
-				'sales_order': sales_order.name,
-				'sales_order_item': sales_order.items[1].name ,
-			}]
-		})
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"customer": "_Test Customer",
+				"items_based_on": "Sales Order",
+				"purpose": "Delivery",
+				"locations": [
+					{
+						"item_code": "_Test Item",
+						"qty": 2,
+						"stock_qty": 1,
+						"conversion_factor": 0.5,
+						"sales_order": sales_order.name,
+						"sales_order_item": sales_order.items[0].name,
+					},
+					{
+						"item_code": "_Test Item",
+						"qty": 1,
+						"stock_qty": 1,
+						"conversion_factor": 1,
+						"sales_order": sales_order.name,
+						"sales_order_item": sales_order.items[1].name,
+					},
+				],
+			}
+		)
 		pick_list.set_item_locations()
 		pick_list.submit()
 
@@ -349,7 +401,9 @@
 
 		self.assertEqual(pick_list.locations[0].qty, delivery_note.items[0].qty)
 		self.assertEqual(pick_list.locations[1].qty, delivery_note.items[1].qty)
-		self.assertEqual(sales_order.items[0].conversion_factor, delivery_note.items[0].conversion_factor)
+		self.assertEqual(
+			sales_order.items[0].conversion_factor, delivery_note.items[0].conversion_factor
+		)
 
 		pick_list.cancel()
 		sales_order.cancel()
@@ -362,22 +416,30 @@
 				self.assertEqual(b.get(key), value, msg=f"{key} doesn't match")
 
 		# nothing should be grouped
-		pl = frappe.get_doc(doctype="Pick List", group_same_items=True, locations=[
-			_dict(item_code="A", warehouse="X", qty=1, picked_qty=2),
-			_dict(item_code="B", warehouse="X", qty=1, picked_qty=2),
-			_dict(item_code="A", warehouse="Y", qty=1, picked_qty=2),
-			_dict(item_code="B", warehouse="Y", qty=1, picked_qty=2),
-		])
+		pl = frappe.get_doc(
+			doctype="Pick List",
+			group_same_items=True,
+			locations=[
+				_dict(item_code="A", warehouse="X", qty=1, picked_qty=2),
+				_dict(item_code="B", warehouse="X", qty=1, picked_qty=2),
+				_dict(item_code="A", warehouse="Y", qty=1, picked_qty=2),
+				_dict(item_code="B", warehouse="Y", qty=1, picked_qty=2),
+			],
+		)
 		pl.before_print()
 		self.assertEqual(len(pl.locations), 4)
 
 		# grouping should halve the number of items
-		pl = frappe.get_doc(doctype="Pick List", group_same_items=True, locations=[
-			_dict(item_code="A", warehouse="X", qty=5, picked_qty=1),
-			_dict(item_code="B", warehouse="Y", qty=4, picked_qty=2),
-			_dict(item_code="A", warehouse="X", qty=3, picked_qty=2),
-			_dict(item_code="B", warehouse="Y", qty=2, picked_qty=2),
-		])
+		pl = frappe.get_doc(
+			doctype="Pick List",
+			group_same_items=True,
+			locations=[
+				_dict(item_code="A", warehouse="X", qty=5, picked_qty=1),
+				_dict(item_code="B", warehouse="Y", qty=4, picked_qty=2),
+				_dict(item_code="A", warehouse="X", qty=3, picked_qty=2),
+				_dict(item_code="B", warehouse="Y", qty=2, picked_qty=2),
+			],
+		)
 		pl.before_print()
 		self.assertEqual(len(pl.locations), 2)
 
@@ -389,93 +451,118 @@
 			_compare_dicts(expected_item, created_item)
 
 	def test_multiple_dn_creation(self):
-		sales_order_1 = frappe.get_doc({
-				'doctype': 'Sales Order',
-				'customer': '_Test Customer',
-				'company': '_Test Company',
-				'items': [{
-					'item_code': '_Test Item',
-					'qty': 1,
-					'conversion_factor': 1,
-					'delivery_date': frappe.utils.today()
-				}],
-			}).insert()
-		sales_order_1.submit()
-		sales_order_2 = frappe.get_doc({
-				'doctype': 'Sales Order',
-				'customer': '_Test Customer 1',
-				'company': '_Test Company',
-				'items': [{
-					'item_code': '_Test Item 2',
-					'qty': 1,
-					'conversion_factor': 1,
-					'delivery_date': frappe.utils.today()
-				},
+		sales_order_1 = frappe.get_doc(
+			{
+				"doctype": "Sales Order",
+				"customer": "_Test Customer",
+				"company": "_Test Company",
+				"items": [
+					{
+						"item_code": "_Test Item",
+						"qty": 1,
+						"conversion_factor": 1,
+						"delivery_date": frappe.utils.today(),
+					}
 				],
-			}).insert()
-		sales_order_2.submit()
-		pick_list = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'items_based_on': 'Sales Order',
-			'purpose': 'Delivery',
-			'picker':'P001',
-			'locations': [{
-				'item_code': '_Test Item ',
-				'qty': 1,
-				'stock_qty': 1,
-				'conversion_factor': 1,
-				'sales_order': sales_order_1.name,
-				'sales_order_item': sales_order_1.items[0].name ,
-			}, {
-				'item_code': '_Test Item 2',
-				'qty': 1,
-				'stock_qty': 1,
-				'conversion_factor': 1,
-				'sales_order': sales_order_2.name,
-				'sales_order_item': sales_order_2.items[0].name ,
 			}
-			]
-		})
+		).insert()
+		sales_order_1.submit()
+		sales_order_2 = frappe.get_doc(
+			{
+				"doctype": "Sales Order",
+				"customer": "_Test Customer 1",
+				"company": "_Test Company",
+				"items": [
+					{
+						"item_code": "_Test Item 2",
+						"qty": 1,
+						"conversion_factor": 1,
+						"delivery_date": frappe.utils.today(),
+					},
+				],
+			}
+		).insert()
+		sales_order_2.submit()
+		pick_list = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"items_based_on": "Sales Order",
+				"purpose": "Delivery",
+				"picker": "P001",
+				"locations": [
+					{
+						"item_code": "_Test Item ",
+						"qty": 1,
+						"stock_qty": 1,
+						"conversion_factor": 1,
+						"sales_order": sales_order_1.name,
+						"sales_order_item": sales_order_1.items[0].name,
+					},
+					{
+						"item_code": "_Test Item 2",
+						"qty": 1,
+						"stock_qty": 1,
+						"conversion_factor": 1,
+						"sales_order": sales_order_2.name,
+						"sales_order_item": sales_order_2.items[0].name,
+					},
+				],
+			}
+		)
 		pick_list.set_item_locations()
 		pick_list.submit()
 		create_delivery_note(pick_list.name)
-		for dn in frappe.get_all("Delivery Note",filters={"pick_list":pick_list.name,"customer":"_Test Customer"},fields={"name"}):
-			for dn_item in frappe.get_doc("Delivery Note",dn.name).get("items"):
-				self.assertEqual(dn_item.item_code, '_Test Item')
-				self.assertEqual(dn_item.against_sales_order,sales_order_1.name)
-		for dn in frappe.get_all("Delivery Note",filters={"pick_list":pick_list.name,"customer":"_Test Customer 1"},fields={"name"}):
-			for dn_item in frappe.get_doc("Delivery Note",dn.name).get("items"):
-				self.assertEqual(dn_item.item_code, '_Test Item 2')
-				self.assertEqual(dn_item.against_sales_order,sales_order_2.name)
-		#test DN creation without so
-		pick_list_1 = frappe.get_doc({
-			'doctype': 'Pick List',
-			'company': '_Test Company',
-			'purpose': 'Delivery',
-			'picker':'P001',
-			'locations': [{
-				'item_code': '_Test Item ',
-				'qty': 1,
-				'stock_qty': 1,
-				'conversion_factor': 1,
-			}, {
-				'item_code': '_Test Item 2',
-				'qty': 2,
-				'stock_qty': 2,
-				'conversion_factor': 1,
+		for dn in frappe.get_all(
+			"Delivery Note",
+			filters={"pick_list": pick_list.name, "customer": "_Test Customer"},
+			fields={"name"},
+		):
+			for dn_item in frappe.get_doc("Delivery Note", dn.name).get("items"):
+				self.assertEqual(dn_item.item_code, "_Test Item")
+				self.assertEqual(dn_item.against_sales_order, sales_order_1.name)
+		for dn in frappe.get_all(
+			"Delivery Note",
+			filters={"pick_list": pick_list.name, "customer": "_Test Customer 1"},
+			fields={"name"},
+		):
+			for dn_item in frappe.get_doc("Delivery Note", dn.name).get("items"):
+				self.assertEqual(dn_item.item_code, "_Test Item 2")
+				self.assertEqual(dn_item.against_sales_order, sales_order_2.name)
+		# test DN creation without so
+		pick_list_1 = frappe.get_doc(
+			{
+				"doctype": "Pick List",
+				"company": "_Test Company",
+				"purpose": "Delivery",
+				"picker": "P001",
+				"locations": [
+					{
+						"item_code": "_Test Item ",
+						"qty": 1,
+						"stock_qty": 1,
+						"conversion_factor": 1,
+					},
+					{
+						"item_code": "_Test Item 2",
+						"qty": 2,
+						"stock_qty": 2,
+						"conversion_factor": 1,
+					},
+				],
 			}
-			]
-		})
+		)
 		pick_list_1.set_item_locations()
 		pick_list_1.submit()
 		create_delivery_note(pick_list_1.name)
-		for dn in frappe.get_all("Delivery Note",filters={"pick_list":pick_list_1.name},fields={"name"}):
-			for dn_item in frappe.get_doc("Delivery Note",dn.name).get("items"):
-				if dn_item.item_code == '_Test Item':
-					self.assertEqual(dn_item.qty,1)
-				if dn_item.item_code == '_Test Item 2':
-					self.assertEqual(dn_item.qty,2)
+		for dn in frappe.get_all(
+			"Delivery Note", filters={"pick_list": pick_list_1.name}, fields={"name"}
+		):
+			for dn_item in frappe.get_doc("Delivery Note", dn.name).get("items"):
+				if dn_item.item_code == "_Test Item":
+					self.assertEqual(dn_item.qty, 1)
+				if dn_item.item_code == "_Test Item 2":
+					self.assertEqual(dn_item.qty, 2)
 
 	# def test_pick_list_skips_items_in_expired_batch(self):
 	# 	pass
diff --git a/erpnext/stock/doctype/price_list/price_list.py b/erpnext/stock/doctype/price_list/price_list.py
index 8a3172e..554055f 100644
--- a/erpnext/stock/doctype/price_list/price_list.py
+++ b/erpnext/stock/doctype/price_list/price_list.py
@@ -31,9 +31,11 @@
 				frappe.set_value("Buying Settings", "Buying Settings", "buying_price_list", self.name)
 
 	def update_item_price(self):
-		frappe.db.sql("""update `tabItem Price` set currency=%s,
+		frappe.db.sql(
+			"""update `tabItem Price` set currency=%s,
 			buying=%s, selling=%s, modified=NOW() where price_list=%s""",
-			(self.currency, cint(self.buying), cint(self.selling), self.name))
+			(self.currency, cint(self.buying), cint(self.selling), self.name),
+		)
 
 	def check_impact_on_shopping_cart(self):
 		"Check if Price List currency change impacts E Commerce Cart."
@@ -66,12 +68,14 @@
 	def delete_price_list_details_key(self):
 		frappe.cache().hdel("price_list_details", self.name)
 
+
 def get_price_list_details(price_list):
 	price_list_details = frappe.cache().hget("price_list_details", price_list)
 
 	if not price_list_details:
-		price_list_details = frappe.get_cached_value("Price List", price_list,
-			["currency", "price_not_uom_dependent", "enabled"], as_dict=1)
+		price_list_details = frappe.get_cached_value(
+			"Price List", price_list, ["currency", "price_not_uom_dependent", "enabled"], as_dict=1
+		)
 
 		if not price_list_details or not price_list_details.get("enabled"):
 			throw(_("Price List {0} is disabled or does not exist").format(price_list))
diff --git a/erpnext/stock/doctype/price_list/test_price_list.py b/erpnext/stock/doctype/price_list/test_price_list.py
index b8218b9..9366093 100644
--- a/erpnext/stock/doctype/price_list/test_price_list.py
+++ b/erpnext/stock/doctype/price_list/test_price_list.py
@@ -6,4 +6,4 @@
 
 # test_ignore = ["Item"]
 
-test_records = frappe.get_test_records('Price List')
+test_records = frappe.get_test_records("Price List")
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 4bf37fe..1e1c0b9 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -16,82 +16,85 @@
 from erpnext.controllers.buying_controller import BuyingController
 from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_transaction
 
-form_grid_templates = {
-	"items": "templates/form_grid/item_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/item_grid.html"}
+
 
 class PurchaseReceipt(BuyingController):
 	def __init__(self, *args, **kwargs):
 		super(PurchaseReceipt, self).__init__(*args, **kwargs)
-		self.status_updater = [{
-			'target_dt': 'Purchase Order Item',
-			'join_field': 'purchase_order_item',
-			'target_field': 'received_qty',
-			'target_parent_dt': 'Purchase Order',
-			'target_parent_field': 'per_received',
-			'target_ref_field': 'qty',
-			'source_dt': 'Purchase Receipt Item',
-			'source_field': 'received_qty',
-			'second_source_dt': 'Purchase Invoice Item',
-			'second_source_field': 'received_qty',
-			'second_join_field': 'po_detail',
-			'percent_join_field': 'purchase_order',
-			'overflow_type': 'receipt',
-			'second_source_extra_cond': """ and exists(select name from `tabPurchase Invoice`
-				where name=`tabPurchase Invoice Item`.parent and update_stock = 1)"""
-		},
-		{
-			'source_dt': 'Purchase Receipt Item',
-			'target_dt': 'Material Request Item',
-			'join_field': 'material_request_item',
-			'target_field': 'received_qty',
-			'target_parent_dt': 'Material Request',
-			'target_parent_field': 'per_received',
-			'target_ref_field': 'stock_qty',
-			'source_field': 'stock_qty',
-			'percent_join_field': 'material_request'
-		},
-		{
-			'source_dt': 'Purchase Receipt Item',
-			'target_dt': 'Purchase Invoice Item',
-			'join_field': 'purchase_invoice_item',
-			'target_field': 'received_qty',
-			'target_parent_dt': 'Purchase Invoice',
-			'target_parent_field': 'per_received',
-			'target_ref_field': 'qty',
-			'source_field': 'received_qty',
-			'percent_join_field': 'purchase_invoice',
-			'overflow_type': 'receipt'
-		}]
+		self.status_updater = [
+			{
+				"target_dt": "Purchase Order Item",
+				"join_field": "purchase_order_item",
+				"target_field": "received_qty",
+				"target_parent_dt": "Purchase Order",
+				"target_parent_field": "per_received",
+				"target_ref_field": "qty",
+				"source_dt": "Purchase Receipt Item",
+				"source_field": "received_qty",
+				"second_source_dt": "Purchase Invoice Item",
+				"second_source_field": "received_qty",
+				"second_join_field": "po_detail",
+				"percent_join_field": "purchase_order",
+				"overflow_type": "receipt",
+				"second_source_extra_cond": """ and exists(select name from `tabPurchase Invoice`
+				where name=`tabPurchase Invoice Item`.parent and update_stock = 1)""",
+			},
+			{
+				"source_dt": "Purchase Receipt Item",
+				"target_dt": "Material Request Item",
+				"join_field": "material_request_item",
+				"target_field": "received_qty",
+				"target_parent_dt": "Material Request",
+				"target_parent_field": "per_received",
+				"target_ref_field": "stock_qty",
+				"source_field": "stock_qty",
+				"percent_join_field": "material_request",
+			},
+			{
+				"source_dt": "Purchase Receipt Item",
+				"target_dt": "Purchase Invoice Item",
+				"join_field": "purchase_invoice_item",
+				"target_field": "received_qty",
+				"target_parent_dt": "Purchase Invoice",
+				"target_parent_field": "per_received",
+				"target_ref_field": "qty",
+				"source_field": "received_qty",
+				"percent_join_field": "purchase_invoice",
+				"overflow_type": "receipt",
+			},
+		]
 
 		if cint(self.is_return):
-			self.status_updater.extend([
-				{
-					'source_dt': 'Purchase Receipt Item',
-					'target_dt': 'Purchase Order Item',
-					'join_field': 'purchase_order_item',
-					'target_field': 'returned_qty',
-					'source_field': '-1 * qty',
-					'second_source_dt': 'Purchase Invoice Item',
-					'second_source_field': '-1 * qty',
-					'second_join_field': 'po_detail',
-					'extra_cond': """ and exists (select name from `tabPurchase Receipt`
+			self.status_updater.extend(
+				[
+					{
+						"source_dt": "Purchase Receipt Item",
+						"target_dt": "Purchase Order Item",
+						"join_field": "purchase_order_item",
+						"target_field": "returned_qty",
+						"source_field": "-1 * qty",
+						"second_source_dt": "Purchase Invoice Item",
+						"second_source_field": "-1 * qty",
+						"second_join_field": "po_detail",
+						"extra_cond": """ and exists (select name from `tabPurchase Receipt`
 						where name=`tabPurchase Receipt Item`.parent and is_return=1)""",
-					'second_source_extra_cond': """ and exists (select name from `tabPurchase Invoice`
-						where name=`tabPurchase Invoice Item`.parent and is_return=1 and update_stock=1)"""
-				},
-				{
-					'source_dt': 'Purchase Receipt Item',
-					'target_dt': 'Purchase Receipt Item',
-					'join_field': 'purchase_receipt_item',
-					'target_field': 'returned_qty',
-					'target_parent_dt': 'Purchase Receipt',
-					'target_parent_field': 'per_returned',
-					'target_ref_field': 'received_stock_qty',
-					'source_field': '-1 * received_stock_qty',
-					'percent_join_field_parent': 'return_against'
-				}
-			])
+						"second_source_extra_cond": """ and exists (select name from `tabPurchase Invoice`
+						where name=`tabPurchase Invoice Item`.parent and is_return=1 and update_stock=1)""",
+					},
+					{
+						"source_dt": "Purchase Receipt Item",
+						"target_dt": "Purchase Receipt Item",
+						"join_field": "purchase_receipt_item",
+						"target_field": "returned_qty",
+						"target_parent_dt": "Purchase Receipt",
+						"target_parent_field": "per_returned",
+						"target_ref_field": "received_stock_qty",
+						"source_field": "-1 * received_stock_qty",
+						"percent_join_field_parent": "return_against",
+					},
+				]
+			)
 
 	def before_validate(self):
 		from erpnext.stock.doctype.putaway_rule.putaway_rule import apply_putaway_rule
@@ -103,8 +106,8 @@
 		self.validate_posting_time()
 		super(PurchaseReceipt, self).validate()
 
-		if self._action=="submit":
-			self.make_batches('warehouse')
+		if self._action == "submit":
+			self.make_batches("warehouse")
 		else:
 			self.set_status()
 
@@ -124,20 +127,23 @@
 		self.reset_default_field_value("rejected_warehouse", "items", "rejected_warehouse")
 		self.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
 
-
 	def validate_cwip_accounts(self):
-		for item in self.get('items'):
+		for item in self.get("items"):
 			if item.is_fixed_asset and is_cwip_accounting_enabled(item.asset_category):
 				# check cwip accounts before making auto assets
 				# Improves UX by not giving messages of "Assets Created" before throwing error of not finding arbnb account
 				arbnb_account = self.get_company_default("asset_received_but_not_billed")
-				cwip_account = get_asset_account("capital_work_in_progress_account", asset_category = item.asset_category, \
-					company = self.company)
+				cwip_account = get_asset_account(
+					"capital_work_in_progress_account", asset_category=item.asset_category, company=self.company
+				)
 				break
 
 	def validate_provisional_expense_account(self):
-		provisional_accounting_for_non_stock_items = \
-			cint(frappe.db.get_value('Company', self.company, 'enable_provisional_accounting_for_non_stock_items'))
+		provisional_accounting_for_non_stock_items = cint(
+			frappe.db.get_value(
+				"Company", self.company, "enable_provisional_accounting_for_non_stock_items"
+			)
+		)
 
 		if provisional_accounting_for_non_stock_items:
 			default_provisional_account = self.get_company_default("default_provisional_account")
@@ -145,56 +151,68 @@
 				self.provisional_expense_account = default_provisional_account
 
 	def validate_with_previous_doc(self):
-		super(PurchaseReceipt, self).validate_with_previous_doc({
-			"Purchase Order": {
-				"ref_dn_field": "purchase_order",
-				"compare_fields": [["supplier", "="], ["company", "="],	["currency", "="]],
-			},
-			"Purchase Order Item": {
-				"ref_dn_field": "purchase_order_item",
-				"compare_fields": [["project", "="], ["uom", "="], ["item_code", "="]],
-				"is_child_table": True,
-				"allow_duplicate_prev_row_id": True
+		super(PurchaseReceipt, self).validate_with_previous_doc(
+			{
+				"Purchase Order": {
+					"ref_dn_field": "purchase_order",
+					"compare_fields": [["supplier", "="], ["company", "="], ["currency", "="]],
+				},
+				"Purchase Order Item": {
+					"ref_dn_field": "purchase_order_item",
+					"compare_fields": [["project", "="], ["uom", "="], ["item_code", "="]],
+					"is_child_table": True,
+					"allow_duplicate_prev_row_id": True,
+				},
 			}
-		})
+		)
 
-		if cint(frappe.db.get_single_value('Buying Settings', 'maintain_same_rate')) and not self.is_return:
-			self.validate_rate_with_reference_doc([["Purchase Order", "purchase_order", "purchase_order_item"]])
+		if (
+			cint(frappe.db.get_single_value("Buying Settings", "maintain_same_rate")) and not self.is_return
+		):
+			self.validate_rate_with_reference_doc(
+				[["Purchase Order", "purchase_order", "purchase_order_item"]]
+			)
 
 	def po_required(self):
-		if frappe.db.get_value("Buying Settings", None, "po_required") == 'Yes':
-			for d in self.get('items'):
+		if frappe.db.get_value("Buying Settings", None, "po_required") == "Yes":
+			for d in self.get("items"):
 				if not d.purchase_order:
 					frappe.throw(_("Purchase Order number required for Item {0}").format(d.item_code))
 
 	def get_already_received_qty(self, po, po_detail):
-		qty = frappe.db.sql("""select sum(qty) from `tabPurchase Receipt Item`
+		qty = frappe.db.sql(
+			"""select sum(qty) from `tabPurchase Receipt Item`
 			where purchase_order_item = %s and docstatus = 1
 			and purchase_order=%s
-			and parent != %s""", (po_detail, po, self.name))
+			and parent != %s""",
+			(po_detail, po, self.name),
+		)
 		return qty and flt(qty[0][0]) or 0.0
 
 	def get_po_qty_and_warehouse(self, po_detail):
-		po_qty, po_warehouse = frappe.db.get_value("Purchase Order Item", po_detail,
-			["qty", "warehouse"])
+		po_qty, po_warehouse = frappe.db.get_value(
+			"Purchase Order Item", po_detail, ["qty", "warehouse"]
+		)
 		return po_qty, po_warehouse
 
 	# Check for Closed status
 	def check_on_hold_or_closed_status(self):
-		check_list =[]
-		for d in self.get('items'):
-			if (d.meta.get_field('purchase_order') and d.purchase_order
-				and d.purchase_order not in check_list):
+		check_list = []
+		for d in self.get("items"):
+			if (
+				d.meta.get_field("purchase_order") and d.purchase_order and d.purchase_order not in check_list
+			):
 				check_list.append(d.purchase_order)
-				check_on_hold_or_closed_status('Purchase Order', d.purchase_order)
+				check_on_hold_or_closed_status("Purchase Order", d.purchase_order)
 
 	# on submit
 	def on_submit(self):
 		super(PurchaseReceipt, self).on_submit()
 
 		# Check for Approving Authority
-		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
-			self.company, self.base_grand_total)
+		frappe.get_doc("Authorization Control").validate_approving_authority(
+			self.doctype, self.company, self.base_grand_total
+		)
 
 		self.update_prevdoc_status()
 		if flt(self.per_billed) < 100:
@@ -202,13 +220,13 @@
 		else:
 			self.db_set("status", "Completed")
 
-
 		# Updating stock ledger should always be called after updating prevdoc status,
 		# because updating ordered qty, reserved_qty_for_subcontract in bin
 		# depends upon updated ordered qty in PO
 		self.update_stock_ledger()
 
 		from erpnext.stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
+
 		update_serial_nos_after_submit(self, "items")
 
 		self.make_gl_entries()
@@ -216,10 +234,12 @@
 		self.set_consumed_qty_in_po()
 
 	def check_next_docstatus(self):
-		submit_rv = frappe.db.sql("""select t1.name
+		submit_rv = frappe.db.sql(
+			"""select t1.name
 			from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
 			where t1.name = t2.parent and t2.purchase_receipt = %s and t1.docstatus = 1""",
-			(self.name))
+			(self.name),
+		)
 		if submit_rv:
 			frappe.throw(_("Purchase Invoice {0} is already submitted").format(self.submit_rv[0][0]))
 
@@ -228,10 +248,12 @@
 
 		self.check_on_hold_or_closed_status()
 		# Check if Purchase Invoice has been submitted against current Purchase Order
-		submitted = frappe.db.sql("""select t1.name
+		submitted = frappe.db.sql(
+			"""select t1.name
 			from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
 			where t1.name = t2.parent and t2.purchase_receipt = %s and t1.docstatus = 1""",
-			self.name)
+			self.name,
+		)
 		if submitted:
 			frappe.throw(_("Purchase Invoice {0} is already submitted").format(submitted[0][0]))
 
@@ -243,19 +265,24 @@
 		self.update_stock_ledger()
 		self.make_gl_entries_on_cancel()
 		self.repost_future_sle_and_gle()
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry', 'Repost Item Valuation')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
 		self.delete_auto_created_batches()
 		self.set_consumed_qty_in_po()
 
 	@frappe.whitelist()
 	def get_current_stock(self):
-		for d in self.get('supplied_items'):
+		for d in self.get("supplied_items"):
 			if self.supplier_warehouse:
-				bin = frappe.db.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.supplier_warehouse), as_dict = 1)
-				d.current_stock = bin and flt(bin[0]['actual_qty']) or 0
+				bin = frappe.db.sql(
+					"select actual_qty from `tabBin` where item_code = %s and warehouse = %s",
+					(d.rm_item_code, self.supplier_warehouse),
+					as_dict=1,
+				)
+				d.current_stock = bin and flt(bin[0]["actual_qty"]) or 0
 
 	def get_gl_entries(self, warehouse_account=None):
 		from erpnext.accounts.general_ledger import process_gl_map
+
 		gl_entries = []
 
 		self.make_item_gl_entries(gl_entries, warehouse_account=warehouse_account)
@@ -276,31 +303,46 @@
 
 		warehouse_with_no_account = []
 		stock_items = self.get_stock_items()
-		provisional_accounting_for_non_stock_items = \
-				cint(frappe.db.get_value('Company', self.company, 'enable_provisional_accounting_for_non_stock_items'))
+		provisional_accounting_for_non_stock_items = cint(
+			frappe.db.get_value(
+				"Company", self.company, "enable_provisional_accounting_for_non_stock_items"
+			)
+		)
 
 		exchange_rate_map, net_rate_map = get_purchase_document_details(self)
 
 		for d in self.get("items"):
 			if d.item_code in stock_items and flt(d.valuation_rate) and flt(d.qty):
 				if warehouse_account.get(d.warehouse):
-					stock_value_diff = frappe.db.get_value("Stock Ledger Entry",
-						{"voucher_type": "Purchase Receipt", "voucher_no": self.name,
-						"voucher_detail_no": d.name, "warehouse": d.warehouse, "is_cancelled": 0}, "stock_value_difference")
+					stock_value_diff = frappe.db.get_value(
+						"Stock Ledger Entry",
+						{
+							"voucher_type": "Purchase Receipt",
+							"voucher_no": self.name,
+							"voucher_detail_no": d.name,
+							"warehouse": d.warehouse,
+							"is_cancelled": 0,
+						},
+						"stock_value_difference",
+					)
 
 					warehouse_account_name = warehouse_account[d.warehouse]["account"]
 					warehouse_account_currency = warehouse_account[d.warehouse]["account_currency"]
 					supplier_warehouse_account = warehouse_account.get(self.supplier_warehouse, {}).get("account")
-					supplier_warehouse_account_currency = warehouse_account.get(self.supplier_warehouse, {}).get("account_currency")
+					supplier_warehouse_account_currency = warehouse_account.get(self.supplier_warehouse, {}).get(
+						"account_currency"
+					)
 					remarks = self.get("remarks") or _("Accounting Entry for Stock")
 
 					# If PR is sub-contracted and fg item rate is zero
 					# in that case if account for source and target warehouse are same,
 					# then GL entries should not be posted
-					if flt(stock_value_diff) == flt(d.rm_supp_cost) \
-						and warehouse_account.get(self.supplier_warehouse) \
-						and warehouse_account_name == supplier_warehouse_account:
-							continue
+					if (
+						flt(stock_value_diff) == flt(d.rm_supp_cost)
+						and warehouse_account.get(self.supplier_warehouse)
+						and warehouse_account_name == supplier_warehouse_account
+					):
+						continue
 
 					self.add_gl_entry(
 						gl_entries=gl_entries,
@@ -311,18 +353,24 @@
 						remarks=remarks,
 						against_account=stock_rbnb,
 						account_currency=warehouse_account_currency,
-						item=d)
+						item=d,
+					)
 
 					# GL Entry for from warehouse or Stock Received but not billed
 					# Intentionally passed negative debit amount to avoid incorrect GL Entry validation
-					credit_currency = get_account_currency(warehouse_account[d.from_warehouse]['account']) \
-						if d.from_warehouse else get_account_currency(stock_rbnb)
+					credit_currency = (
+						get_account_currency(warehouse_account[d.from_warehouse]["account"])
+						if d.from_warehouse
+						else get_account_currency(stock_rbnb)
+					)
 
-					credit_amount = flt(d.base_net_amount, d.precision("base_net_amount")) \
-						if credit_currency == self.company_currency else flt(d.net_amount, d.precision("net_amount"))
+					credit_amount = (
+						flt(d.base_net_amount, d.precision("base_net_amount"))
+						if credit_currency == self.company_currency
+						else flt(d.net_amount, d.precision("net_amount"))
+					)
 					if credit_amount:
-						account = warehouse_account[d.from_warehouse]['account'] \
-								if d.from_warehouse else stock_rbnb
+						account = warehouse_account[d.from_warehouse]["account"] if d.from_warehouse else stock_rbnb
 
 						self.add_gl_entry(
 							gl_entries=gl_entries,
@@ -334,16 +382,20 @@
 							against_account=warehouse_account_name,
 							debit_in_account_currency=-1 * credit_amount,
 							account_currency=credit_currency,
-							item=d)
+							item=d,
+						)
 
 						# check if the exchange rate has changed
-						if d.get('purchase_invoice'):
-							if exchange_rate_map[d.purchase_invoice] and \
-								self.conversion_rate != exchange_rate_map[d.purchase_invoice] and \
-								d.net_rate == net_rate_map[d.purchase_invoice_item]:
+						if d.get("purchase_invoice"):
+							if (
+								exchange_rate_map[d.purchase_invoice]
+								and self.conversion_rate != exchange_rate_map[d.purchase_invoice]
+								and d.net_rate == net_rate_map[d.purchase_invoice_item]
+							):
 
-								discrepancy_caused_by_exchange_rate_difference = (d.qty * d.net_rate) * \
-									(exchange_rate_map[d.purchase_invoice] - self.conversion_rate)
+								discrepancy_caused_by_exchange_rate_difference = (d.qty * d.net_rate) * (
+									exchange_rate_map[d.purchase_invoice] - self.conversion_rate
+								)
 
 								self.add_gl_entry(
 									gl_entries=gl_entries,
@@ -355,7 +407,8 @@
 									against_account=self.supplier,
 									debit_in_account_currency=-1 * discrepancy_caused_by_exchange_rate_difference,
 									account_currency=credit_currency,
-									item=d)
+									item=d,
+								)
 
 								self.add_gl_entry(
 									gl_entries=gl_entries,
@@ -367,14 +420,18 @@
 									against_account=self.supplier,
 									debit_in_account_currency=-1 * discrepancy_caused_by_exchange_rate_difference,
 									account_currency=credit_currency,
-									item=d)
+									item=d,
+								)
 
 					# Amount added through landed-cos-voucher
 					if d.landed_cost_voucher_amount and landed_cost_entries:
 						for account, amount in landed_cost_entries[(d.item_code, d.name)].items():
 							account_currency = get_account_currency(account)
-							credit_amount = (flt(amount["base_amount"]) if (amount["base_amount"] or
-								account_currency!=self.company_currency) else flt(amount["amount"]))
+							credit_amount = (
+								flt(amount["base_amount"])
+								if (amount["base_amount"] or account_currency != self.company_currency)
+								else flt(amount["amount"])
+							)
 
 							self.add_gl_entry(
 								gl_entries=gl_entries,
@@ -387,7 +444,8 @@
 								credit_in_account_currency=flt(amount["amount"]),
 								account_currency=account_currency,
 								project=d.project,
-								item=d)
+								item=d,
+							)
 
 					# sub-contracting warehouse
 					if flt(d.rm_supp_cost) and warehouse_account.get(self.supplier_warehouse):
@@ -400,22 +458,32 @@
 							remarks=remarks,
 							against_account=warehouse_account_name,
 							account_currency=supplier_warehouse_account_currency,
-							item=d)
+							item=d,
+						)
 
 					# divisional loss adjustment
-					valuation_amount_as_per_doc = flt(d.base_net_amount, d.precision("base_net_amount")) + \
-						flt(d.landed_cost_voucher_amount) + flt(d.rm_supp_cost) + flt(d.item_tax_amount)
+					valuation_amount_as_per_doc = (
+						flt(d.base_net_amount, d.precision("base_net_amount"))
+						+ flt(d.landed_cost_voucher_amount)
+						+ flt(d.rm_supp_cost)
+						+ flt(d.item_tax_amount)
+					)
 
-					divisional_loss = flt(valuation_amount_as_per_doc - stock_value_diff,
-						d.precision("base_net_amount"))
+					divisional_loss = flt(
+						valuation_amount_as_per_doc - stock_value_diff, d.precision("base_net_amount")
+					)
 
 					if divisional_loss:
 						if self.is_return or flt(d.item_tax_amount):
 							loss_account = expenses_included_in_valuation
 						else:
-							loss_account = self.get_company_default("default_expense_account", ignore_validation=True) or stock_rbnb
+							loss_account = (
+								self.get_company_default("default_expense_account", ignore_validation=True) or stock_rbnb
+							)
 
-						cost_center = d.cost_center or frappe.get_cached_value("Company", self.company, "cost_center")
+						cost_center = d.cost_center or frappe.get_cached_value(
+							"Company", self.company, "cost_center"
+						)
 
 						self.add_gl_entry(
 							gl_entries=gl_entries,
@@ -427,20 +495,31 @@
 							against_account=warehouse_account_name,
 							account_currency=credit_currency,
 							project=d.project,
-							item=d)
+							item=d,
+						)
 
-				elif d.warehouse not in warehouse_with_no_account or \
-					d.rejected_warehouse not in warehouse_with_no_account:
-						warehouse_with_no_account.append(d.warehouse)
-			elif d.item_code not in stock_items and not d.is_fixed_asset and flt(d.qty) and provisional_accounting_for_non_stock_items:
+				elif (
+					d.warehouse not in warehouse_with_no_account
+					or d.rejected_warehouse not in warehouse_with_no_account
+				):
+					warehouse_with_no_account.append(d.warehouse)
+			elif (
+				d.item_code not in stock_items
+				and not d.is_fixed_asset
+				and flt(d.qty)
+				and provisional_accounting_for_non_stock_items
+			):
 				self.add_provisional_gl_entry(d, gl_entries, self.posting_date)
 
 		if warehouse_with_no_account:
-			frappe.msgprint(_("No accounting entries for the following warehouses") + ": \n" +
-				"\n".join(warehouse_with_no_account))
+			frappe.msgprint(
+				_("No accounting entries for the following warehouses")
+				+ ": \n"
+				+ "\n".join(warehouse_with_no_account)
+			)
 
 	def add_provisional_gl_entry(self, item, gl_entries, posting_date, reverse=0):
-		provisional_expense_account = self.get('provisional_expense_account')
+		provisional_expense_account = self.get("provisional_expense_account")
 		credit_currency = get_account_currency(provisional_expense_account)
 		debit_currency = get_account_currency(item.expense_account)
 		expense_account = item.expense_account
@@ -449,7 +528,9 @@
 
 		if reverse:
 			multiplication_factor = -1
-			expense_account = frappe.db.get_value('Purchase Receipt Item', {'name': item.get('pr_detail')}, ['expense_account'])
+			expense_account = frappe.db.get_value(
+				"Purchase Receipt Item", {"name": item.get("pr_detail")}, ["expense_account"]
+			)
 
 		self.add_gl_entry(
 			gl_entries=gl_entries,
@@ -463,7 +544,8 @@
 			project=item.project,
 			voucher_detail_no=item.name,
 			item=item,
-			posting_date=posting_date)
+			posting_date=posting_date,
+		)
 
 		self.add_gl_entry(
 			gl_entries=gl_entries,
@@ -473,27 +555,35 @@
 			credit=0.0,
 			remarks=remarks,
 			against_account=provisional_expense_account,
-			account_currency = debit_currency,
+			account_currency=debit_currency,
 			project=item.project,
 			voucher_detail_no=item.name,
 			item=item,
-			posting_date=posting_date)
+			posting_date=posting_date,
+		)
 
 	def make_tax_gl_entries(self, gl_entries):
 
 		if erpnext.is_perpetual_inventory_enabled(self.company):
 			expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
 
-		negative_expense_to_be_booked = sum([flt(d.item_tax_amount) for d in self.get('items')])
+		negative_expense_to_be_booked = sum([flt(d.item_tax_amount) for d in self.get("items")])
 		# Cost center-wise amount breakup for other charges included for valuation
 		valuation_tax = {}
 		for tax in self.get("taxes"):
-			if tax.category in ("Valuation", "Valuation and Total") and flt(tax.base_tax_amount_after_discount_amount):
+			if tax.category in ("Valuation", "Valuation and Total") and flt(
+				tax.base_tax_amount_after_discount_amount
+			):
 				if not tax.cost_center:
-					frappe.throw(_("Cost Center is required in row {0} in Taxes table for type {1}").format(tax.idx, _(tax.category)))
+					frappe.throw(
+						_("Cost Center is required in row {0} in Taxes table for type {1}").format(
+							tax.idx, _(tax.category)
+						)
+					)
 				valuation_tax.setdefault(tax.name, 0)
-				valuation_tax[tax.name] += \
-					(tax.add_deduct_tax == "Add" and 1 or -1) * flt(tax.base_tax_amount_after_discount_amount)
+				valuation_tax[tax.name] += (tax.add_deduct_tax == "Add" and 1 or -1) * flt(
+					tax.base_tax_amount_after_discount_amount
+				)
 
 		if negative_expense_to_be_booked and valuation_tax:
 			# Backward compatibility:
@@ -502,10 +592,13 @@
 			# post valuation related charges on "Stock Received But Not Billed"
 			# introduced in 2014 for backward compatibility of expenses already booked in expenses_included_in_valuation account
 
-			negative_expense_booked_in_pi = frappe.db.sql("""select name from `tabPurchase Invoice Item` pi
+			negative_expense_booked_in_pi = frappe.db.sql(
+				"""select name from `tabPurchase Invoice Item` pi
 				where docstatus = 1 and purchase_receipt=%s
 				and exists(select name from `tabGL Entry` where voucher_type='Purchase Invoice'
-					and voucher_no=pi.parent and account=%s)""", (self.name, expenses_included_in_valuation))
+					and voucher_no=pi.parent and account=%s)""",
+				(self.name, expenses_included_in_valuation),
+			)
 
 			against_account = ", ".join([d.account for d in gl_entries if flt(d.debit) > 0])
 			total_valuation_amount = sum(valuation_tax.values())
@@ -523,7 +616,9 @@
 					if i == len(valuation_tax):
 						applicable_amount = amount_including_divisional_loss
 					else:
-						applicable_amount = negative_expense_to_be_booked * (valuation_tax[tax.name] / total_valuation_amount)
+						applicable_amount = negative_expense_to_be_booked * (
+							valuation_tax[tax.name] / total_valuation_amount
+						)
 						amount_including_divisional_loss -= applicable_amount
 
 					self.add_gl_entry(
@@ -534,13 +629,28 @@
 						credit=applicable_amount,
 						remarks=self.remarks or _("Accounting Entry for Stock"),
 						against_account=against_account,
-						item=tax)
+						item=tax,
+					)
 
 					i += 1
 
-	def add_gl_entry(self, gl_entries, account, cost_center, debit, credit, remarks, against_account,
-		debit_in_account_currency=None, credit_in_account_currency=None, account_currency=None,
-		project=None, voucher_detail_no=None, item=None, posting_date=None):
+	def add_gl_entry(
+		self,
+		gl_entries,
+		account,
+		cost_center,
+		debit,
+		credit,
+		remarks,
+		against_account,
+		debit_in_account_currency=None,
+		credit_in_account_currency=None,
+		account_currency=None,
+		project=None,
+		voucher_detail_no=None,
+		item=None,
+		posting_date=None,
+	):
 
 		gl_entry = {
 			"account": account,
@@ -580,17 +690,19 @@
 	def add_asset_gl_entries(self, item, gl_entries):
 		arbnb_account = self.get_company_default("asset_received_but_not_billed")
 		# This returns category's cwip account if not then fallback to company's default cwip account
-		cwip_account = get_asset_account("capital_work_in_progress_account", asset_category = item.asset_category, \
-			company = self.company)
+		cwip_account = get_asset_account(
+			"capital_work_in_progress_account", asset_category=item.asset_category, company=self.company
+		)
 
-		asset_amount = flt(item.net_amount) + flt(item.item_tax_amount/self.conversion_rate)
+		asset_amount = flt(item.net_amount) + flt(item.item_tax_amount / self.conversion_rate)
 		base_asset_amount = flt(item.base_net_amount + item.item_tax_amount)
 		remarks = self.get("remarks") or _("Accounting Entry for Asset")
 
 		cwip_account_currency = get_account_currency(cwip_account)
 		# debit cwip account
-		debit_in_account_currency = (base_asset_amount
-			if cwip_account_currency == self.company_currency else asset_amount)
+		debit_in_account_currency = (
+			base_asset_amount if cwip_account_currency == self.company_currency else asset_amount
+		)
 
 		self.add_gl_entry(
 			gl_entries=gl_entries,
@@ -601,12 +713,14 @@
 			remarks=remarks,
 			against_account=arbnb_account,
 			debit_in_account_currency=debit_in_account_currency,
-			item=item)
+			item=item,
+		)
 
 		asset_rbnb_currency = get_account_currency(arbnb_account)
 		# credit arbnb account
-		credit_in_account_currency = (base_asset_amount
-			if asset_rbnb_currency == self.company_currency else asset_amount)
+		credit_in_account_currency = (
+			base_asset_amount if asset_rbnb_currency == self.company_currency else asset_amount
+		)
 
 		self.add_gl_entry(
 			gl_entries=gl_entries,
@@ -617,13 +731,17 @@
 			remarks=remarks,
 			against_account=cwip_account,
 			credit_in_account_currency=credit_in_account_currency,
-			item=item)
+			item=item,
+		)
 
 	def add_lcv_gl_entries(self, item, gl_entries):
-		expenses_included_in_asset_valuation = self.get_company_default("expenses_included_in_asset_valuation")
+		expenses_included_in_asset_valuation = self.get_company_default(
+			"expenses_included_in_asset_valuation"
+		)
 		if not is_cwip_accounting_enabled(item.asset_category):
-			asset_account = get_asset_category_account(asset_category=item.asset_category, \
-					fieldname='fixed_asset_account', company=self.company)
+			asset_account = get_asset_category_account(
+				asset_category=item.asset_category, fieldname="fixed_asset_account", company=self.company
+			)
 		else:
 			# This returns company's default cwip account
 			asset_account = get_asset_account("capital_work_in_progress_account", company=self.company)
@@ -639,7 +757,8 @@
 			remarks=remarks,
 			against_account=asset_account,
 			project=item.project,
-			item=item)
+			item=item,
+		)
 
 		self.add_gl_entry(
 			gl_entries=gl_entries,
@@ -650,11 +769,12 @@
 			remarks=remarks,
 			against_account=expenses_included_in_asset_valuation,
 			project=item.project,
-			item=item)
+			item=item,
+		)
 
 	def update_assets(self, item, valuation_rate):
-		assets = frappe.db.get_all('Asset',
-			filters={ 'purchase_receipt': self.name, 'item_code': item.item_code }
+		assets = frappe.db.get_all(
+			"Asset", filters={"purchase_receipt": self.name, "item_code": item.item_code}
 		)
 
 		for asset in assets:
@@ -670,7 +790,7 @@
 		updated_pr = [self.name]
 		for d in self.get("items"):
 			if d.get("purchase_invoice") and d.get("purchase_invoice_item"):
-				d.db_set('billed_amt', d.amount, update_modified=update_modified)
+				d.db_set("billed_amt", d.amount, update_modified=update_modified)
 			elif d.purchase_order_item:
 				updated_pr += update_billed_amount_based_on_po(d.purchase_order_item, update_modified)
 
@@ -680,24 +800,35 @@
 
 		self.load_from_db()
 
+
 def update_billed_amount_based_on_po(po_detail, update_modified=True):
 	# Billed against Sales Order directly
-	billed_against_po = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item`
-		where po_detail=%s and (pr_detail is null or pr_detail = '') and docstatus=1""", po_detail)
+	billed_against_po = frappe.db.sql(
+		"""select sum(amount) from `tabPurchase Invoice Item`
+		where po_detail=%s and (pr_detail is null or pr_detail = '') and docstatus=1""",
+		po_detail,
+	)
 	billed_against_po = billed_against_po and billed_against_po[0][0] or 0
 
 	# Get all Purchase Receipt Item rows against the Purchase Order Item row
-	pr_details = frappe.db.sql("""select pr_item.name, pr_item.amount, pr_item.parent
+	pr_details = frappe.db.sql(
+		"""select pr_item.name, pr_item.amount, pr_item.parent
 		from `tabPurchase Receipt Item` pr_item, `tabPurchase Receipt` pr
 		where pr.name=pr_item.parent and pr_item.purchase_order_item=%s
 			and pr.docstatus=1 and pr.is_return = 0
-		order by pr.posting_date asc, pr.posting_time asc, pr.name asc""", po_detail, as_dict=1)
+		order by pr.posting_date asc, pr.posting_time asc, pr.name asc""",
+		po_detail,
+		as_dict=1,
+	)
 
 	updated_pr = []
 	for pr_item in pr_details:
 		# Get billed amount directly against Purchase Receipt
-		billed_amt_agianst_pr = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item`
-			where pr_detail=%s and docstatus=1""", pr_item.name)
+		billed_amt_agianst_pr = frappe.db.sql(
+			"""select sum(amount) from `tabPurchase Invoice Item`
+			where pr_detail=%s and docstatus=1""",
+			pr_item.name,
+		)
 		billed_amt_agianst_pr = billed_amt_agianst_pr and billed_amt_agianst_pr[0][0] or 0
 
 		# Distribute billed amount directly against PO between PRs based on FIFO
@@ -710,12 +841,19 @@
 				billed_amt_agianst_pr += billed_against_po
 				billed_against_po = 0
 
-		frappe.db.set_value("Purchase Receipt Item", pr_item.name, "billed_amt", billed_amt_agianst_pr, update_modified=update_modified)
+		frappe.db.set_value(
+			"Purchase Receipt Item",
+			pr_item.name,
+			"billed_amt",
+			billed_amt_agianst_pr,
+			update_modified=update_modified,
+		)
 
 		updated_pr.append(pr_item.parent)
 
 	return updated_pr
 
+
 def update_billing_percentage(pr_doc, update_modified=True):
 	# Reload as billed amount was set in db directly
 	pr_doc.load_from_db()
@@ -723,15 +861,15 @@
 	# Update Billing % based on pending accepted qty
 	total_amount, total_billed_amount = 0, 0
 	for item in pr_doc.items:
-		return_data = frappe.db.get_list("Purchase Receipt",
-			fields = [
-				"sum(abs(`tabPurchase Receipt Item`.qty)) as qty"
-			],
-			filters = [
+		return_data = frappe.db.get_list(
+			"Purchase Receipt",
+			fields=["sum(abs(`tabPurchase Receipt Item`.qty)) as qty"],
+			filters=[
 				["Purchase Receipt", "docstatus", "=", 1],
 				["Purchase Receipt", "is_return", "=", 1],
-				["Purchase Receipt Item", "purchase_receipt_item", "=", item.name]
-		])
+				["Purchase Receipt Item", "purchase_receipt_item", "=", item.name],
+			],
+		)
 
 		returned_qty = return_data[0].qty if return_data else 0
 		returned_amount = flt(returned_qty) * flt(item.rate)
@@ -749,11 +887,12 @@
 		pr_doc.set_status(update=True)
 		pr_doc.notify_update()
 
+
 @frappe.whitelist()
 def make_purchase_invoice(source_name, target_doc=None):
 	from erpnext.accounts.party import get_payment_terms_template
 
-	doc = frappe.get_doc('Purchase Receipt', source_name)
+	doc = frappe.get_doc("Purchase Receipt", source_name)
 	returned_qty_map = get_returned_qty_map(source_name)
 	invoiced_qty_map = get_invoiced_qty_map(source_name)
 
@@ -762,7 +901,9 @@
 			frappe.throw(_("All items have already been Invoiced/Returned"))
 
 		doc = frappe.get_doc(target)
-		doc.payment_terms_template = get_payment_terms_template(source.supplier, "Supplier", source.company)
+		doc.payment_terms_template = get_payment_terms_template(
+			source.supplier, "Supplier", source.company
+		)
 		doc.run_method("onload")
 		doc.run_method("set_missing_values")
 		doc.run_method("calculate_taxes_and_totals")
@@ -770,14 +911,20 @@
 
 	def update_item(source_doc, target_doc, source_parent):
 		target_doc.qty, returned_qty = get_pending_qty(source_doc)
-		if frappe.db.get_single_value("Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"):
+		if frappe.db.get_single_value(
+			"Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"
+		):
 			target_doc.rejected_qty = 0
-		target_doc.stock_qty = flt(target_doc.qty) * flt(target_doc.conversion_factor, target_doc.precision("conversion_factor"))
+		target_doc.stock_qty = flt(target_doc.qty) * flt(
+			target_doc.conversion_factor, target_doc.precision("conversion_factor")
+		)
 		returned_qty_map[source_doc.name] = returned_qty
 
 	def get_pending_qty(item_row):
 		qty = item_row.qty
-		if frappe.db.get_single_value("Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"):
+		if frappe.db.get_single_value(
+			"Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice"
+		):
 			qty = item_row.received_qty
 		pending_qty = qty - invoiced_qty_map.get(item_row.name, 0)
 		returned_qty = flt(returned_qty_map.get(item_row.name, 0))
@@ -790,69 +937,85 @@
 				returned_qty = 0
 		return pending_qty, returned_qty
 
-
-	doclist = get_mapped_doc("Purchase Receipt", source_name,	{
-		"Purchase Receipt": {
-			"doctype": "Purchase Invoice",
-			"field_map": {
-				"supplier_warehouse":"supplier_warehouse",
-				"is_return": "is_return",
-				"bill_date": "bill_date"
+	doclist = get_mapped_doc(
+		"Purchase Receipt",
+		source_name,
+		{
+			"Purchase Receipt": {
+				"doctype": "Purchase Invoice",
+				"field_map": {
+					"supplier_warehouse": "supplier_warehouse",
+					"is_return": "is_return",
+					"bill_date": "bill_date",
+				},
+				"validation": {
+					"docstatus": ["=", 1],
+				},
 			},
-			"validation": {
-				"docstatus": ["=", 1],
+			"Purchase Receipt Item": {
+				"doctype": "Purchase Invoice Item",
+				"field_map": {
+					"name": "pr_detail",
+					"parent": "purchase_receipt",
+					"purchase_order_item": "po_detail",
+					"purchase_order": "purchase_order",
+					"is_fixed_asset": "is_fixed_asset",
+					"asset_location": "asset_location",
+					"asset_category": "asset_category",
+				},
+				"postprocess": update_item,
+				"filter": lambda d: get_pending_qty(d)[0] <= 0
+				if not doc.get("is_return")
+				else get_pending_qty(d)[0] > 0,
 			},
+			"Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges", "add_if_empty": True},
 		},
-		"Purchase Receipt Item": {
-			"doctype": "Purchase Invoice Item",
-			"field_map": {
-				"name": "pr_detail",
-				"parent": "purchase_receipt",
-				"purchase_order_item": "po_detail",
-				"purchase_order": "purchase_order",
-				"is_fixed_asset": "is_fixed_asset",
-				"asset_location": "asset_location",
-				"asset_category": 'asset_category'
-			},
-			"postprocess": update_item,
-			"filter": lambda d: get_pending_qty(d)[0] <= 0 if not doc.get("is_return") else get_pending_qty(d)[0] > 0
-		},
-		"Purchase Taxes and Charges": {
-			"doctype": "Purchase Taxes and Charges",
-			"add_if_empty": True
-		}
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
-	doclist.set_onload('ignore_price_list', True)
+	doclist.set_onload("ignore_price_list", True)
 	return doclist
 
+
 def get_invoiced_qty_map(purchase_receipt):
 	"""returns a map: {pr_detail: invoiced_qty}"""
 	invoiced_qty_map = {}
 
-	for pr_detail, qty in frappe.db.sql("""select pr_detail, qty from `tabPurchase Invoice Item`
-		where purchase_receipt=%s and docstatus=1""", purchase_receipt):
-			if not invoiced_qty_map.get(pr_detail):
-				invoiced_qty_map[pr_detail] = 0
-			invoiced_qty_map[pr_detail] += qty
+	for pr_detail, qty in frappe.db.sql(
+		"""select pr_detail, qty from `tabPurchase Invoice Item`
+		where purchase_receipt=%s and docstatus=1""",
+		purchase_receipt,
+	):
+		if not invoiced_qty_map.get(pr_detail):
+			invoiced_qty_map[pr_detail] = 0
+		invoiced_qty_map[pr_detail] += qty
 
 	return invoiced_qty_map
 
+
 def get_returned_qty_map(purchase_receipt):
 	"""returns a map: {so_detail: returned_qty}"""
-	returned_qty_map = frappe._dict(frappe.db.sql("""select pr_item.purchase_receipt_item, abs(pr_item.qty) as qty
+	returned_qty_map = frappe._dict(
+		frappe.db.sql(
+			"""select pr_item.purchase_receipt_item, abs(pr_item.qty) as qty
 		from `tabPurchase Receipt Item` pr_item, `tabPurchase Receipt` pr
 		where pr.name = pr_item.parent
 			and pr.docstatus = 1
 			and pr.is_return = 1
 			and pr.return_against = %s
-	""", purchase_receipt))
+	""",
+			purchase_receipt,
+		)
+	)
 
 	return returned_qty_map
 
+
 @frappe.whitelist()
 def make_purchase_return(source_name, target_doc=None):
 	from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 	return make_return_doc("Purchase Receipt", source_name, target_doc)
 
 
@@ -861,35 +1024,47 @@
 	pr = frappe.get_doc("Purchase Receipt", docname)
 	pr.update_status(status)
 
+
 @frappe.whitelist()
-def make_stock_entry(source_name,target_doc=None):
+def make_stock_entry(source_name, target_doc=None):
 	def set_missing_values(source, target):
 		target.stock_entry_type = "Material Transfer"
-		target.purpose =  "Material Transfer"
+		target.purpose = "Material Transfer"
 
-	doclist = get_mapped_doc("Purchase Receipt", source_name,{
-		"Purchase Receipt": {
-			"doctype": "Stock Entry",
-		},
-		"Purchase Receipt Item": {
-			"doctype": "Stock Entry Detail",
-			"field_map": {
-				"warehouse": "s_warehouse",
-				"parent": "reference_purchase_receipt",
-				"batch_no": "batch_no"
+	doclist = get_mapped_doc(
+		"Purchase Receipt",
+		source_name,
+		{
+			"Purchase Receipt": {
+				"doctype": "Stock Entry",
+			},
+			"Purchase Receipt Item": {
+				"doctype": "Stock Entry Detail",
+				"field_map": {
+					"warehouse": "s_warehouse",
+					"parent": "reference_purchase_receipt",
+					"batch_no": "batch_no",
+				},
 			},
 		},
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def make_inter_company_delivery_note(source_name, target_doc=None):
 	return make_inter_company_transaction("Purchase Receipt", source_name, target_doc)
 
+
 def get_item_account_wise_additional_cost(purchase_document):
-	landed_cost_vouchers = frappe.get_all("Landed Cost Purchase Receipt", fields=["parent"],
-		filters = {"receipt_document": purchase_document, "docstatus": 1})
+	landed_cost_vouchers = frappe.get_all(
+		"Landed Cost Purchase Receipt",
+		fields=["parent"],
+		filters={"receipt_document": purchase_document, "docstatus": 1},
+	)
 
 	if not landed_cost_vouchers:
 		return
@@ -899,9 +1074,9 @@
 	for lcv in landed_cost_vouchers:
 		landed_cost_voucher_doc = frappe.get_doc("Landed Cost Voucher", lcv.parent)
 
-		#Use amount field for total item cost for manually cost distributed LCVs
-		if landed_cost_voucher_doc.distribute_charges_based_on == 'Distribute Manually':
-			based_on_field = 'amount'
+		# Use amount field for total item cost for manually cost distributed LCVs
+		if landed_cost_voucher_doc.distribute_charges_based_on == "Distribute Manually":
+			based_on_field = "amount"
 		else:
 			based_on_field = frappe.scrub(landed_cost_voucher_doc.distribute_charges_based_on)
 
@@ -914,18 +1089,20 @@
 			if item.receipt_document == purchase_document:
 				for account in landed_cost_voucher_doc.taxes:
 					item_account_wise_cost.setdefault((item.item_code, item.purchase_receipt_item), {})
-					item_account_wise_cost[(item.item_code, item.purchase_receipt_item)].setdefault(account.expense_account, {
-						"amount": 0.0,
-						"base_amount": 0.0
-					})
+					item_account_wise_cost[(item.item_code, item.purchase_receipt_item)].setdefault(
+						account.expense_account, {"amount": 0.0, "base_amount": 0.0}
+					)
 
-					item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][account.expense_account]["amount"] += \
-						account.amount * item.get(based_on_field) / total_item_cost
+					item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][account.expense_account][
+						"amount"
+					] += (account.amount * item.get(based_on_field) / total_item_cost)
 
-					item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][account.expense_account]["base_amount"] += \
-						account.base_amount * item.get(based_on_field) / total_item_cost
+					item_account_wise_cost[(item.item_code, item.purchase_receipt_item)][account.expense_account][
+						"base_amount"
+					] += (account.base_amount * item.get(based_on_field) / total_item_cost)
 
 	return item_account_wise_cost
 
+
 def on_doctype_update():
 	frappe.db.add_index("Purchase Receipt", ["supplier", "is_return", "return_against"])
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py
index bdc5435..06ba936 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py
@@ -3,35 +3,23 @@
 
 def get_data():
 	return {
-		'fieldname': 'purchase_receipt_no',
-		'non_standard_fieldnames': {
-			'Purchase Invoice': 'purchase_receipt',
-			'Asset': 'purchase_receipt',
-			'Landed Cost Voucher': 'receipt_document',
-			'Auto Repeat': 'reference_document',
-			'Purchase Receipt': 'return_against'
+		"fieldname": "purchase_receipt_no",
+		"non_standard_fieldnames": {
+			"Purchase Invoice": "purchase_receipt",
+			"Asset": "purchase_receipt",
+			"Landed Cost Voucher": "receipt_document",
+			"Auto Repeat": "reference_document",
+			"Purchase Receipt": "return_against",
 		},
-		'internal_links': {
-			'Purchase Order': ['items', 'purchase_order'],
-			'Project': ['items', 'project'],
-			'Quality Inspection': ['items', 'quality_inspection'],
+		"internal_links": {
+			"Purchase Order": ["items", "purchase_order"],
+			"Project": ["items", "project"],
+			"Quality Inspection": ["items", "quality_inspection"],
 		},
-		'transactions': [
-			{
-				'label': _('Related'),
-				'items': ['Purchase Invoice', 'Landed Cost Voucher', 'Asset']
-			},
-			{
-				'label': _('Reference'),
-				'items': ['Purchase Order', 'Quality Inspection', 'Project']
-			},
-			{
-				'label': _('Returns'),
-				'items': ['Purchase Receipt']
-			},
-			{
-				'label': _('Subscription'),
-				'items': ['Auto Repeat']
-			},
-		]
+		"transactions": [
+			{"label": _("Related"), "items": ["Purchase Invoice", "Landed Cost Voucher", "Asset"]},
+			{"label": _("Reference"), "items": ["Purchase Order", "Quality Inspection", "Project"]},
+			{"label": _("Returns"), "items": ["Purchase Receipt"]},
+			{"label": _("Subscription"), "items": ["Auto Repeat"]},
+		],
 	}
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 0017fa7..a6f82b0 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -26,15 +26,11 @@
 
 	def test_purchase_receipt_received_qty(self):
 		"""
-			1. Test if received qty is validated against accepted + rejected
-			2. Test if received qty is auto set on save
+		1. Test if received qty is validated against accepted + rejected
+		2. Test if received qty is auto set on save
 		"""
 		pr = make_purchase_receipt(
-			qty=1,
-			rejected_qty=1,
-			received_qty=3,
-			item_code="_Test Item Home Desktop 200",
-			do_not_save=True
+			qty=1, rejected_qty=1, received_qty=3, item_code="_Test Item Home Desktop 200", do_not_save=True
 		)
 		self.assertRaises(QtyMismatchError, pr.save)
 
@@ -51,11 +47,8 @@
 
 		sl_entry = frappe.db.get_all(
 			"Stock Ledger Entry",
-			{
-				"voucher_type": "Purchase Receipt",
-				"voucher_no": pr.name
-			},
-			['actual_qty']
+			{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
+			["actual_qty"],
 		)
 
 		self.assertEqual(len(sl_entry), 1)
@@ -65,47 +58,44 @@
 
 		sl_entry_cancelled = frappe.db.get_all(
 			"Stock Ledger Entry",
-			{
-				"voucher_type": "Purchase Receipt",
-				"voucher_no": pr.name
-			},
-			['actual_qty'],
-			order_by='creation'
+			{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
+			["actual_qty"],
+			order_by="creation",
 		)
 
 		self.assertEqual(len(sl_entry_cancelled), 2)
 		self.assertEqual(sl_entry_cancelled[1].actual_qty, -0.5)
 
 	def test_make_purchase_invoice(self):
-		if not frappe.db.exists('Payment Terms Template', '_Test Payment Terms Template For Purchase Invoice'):
-			frappe.get_doc({
-				'doctype': 'Payment Terms Template',
-				'template_name': '_Test Payment Terms Template For Purchase Invoice',
-				'allocate_payment_based_on_payment_terms': 1,
-				'terms': [
-					{
-						'doctype': 'Payment Terms Template Detail',
-						'invoice_portion': 50.00,
-						'credit_days_based_on': 'Day(s) after invoice date',
-						'credit_days': 00
-					},
-					{
-						'doctype': 'Payment Terms Template Detail',
-						'invoice_portion': 50.00,
-						'credit_days_based_on': 'Day(s) after invoice date',
-						'credit_days': 30
-					}]
-			}).insert()
+		if not frappe.db.exists(
+			"Payment Terms Template", "_Test Payment Terms Template For Purchase Invoice"
+		):
+			frappe.get_doc(
+				{
+					"doctype": "Payment Terms Template",
+					"template_name": "_Test Payment Terms Template For Purchase Invoice",
+					"allocate_payment_based_on_payment_terms": 1,
+					"terms": [
+						{
+							"doctype": "Payment Terms Template Detail",
+							"invoice_portion": 50.00,
+							"credit_days_based_on": "Day(s) after invoice date",
+							"credit_days": 00,
+						},
+						{
+							"doctype": "Payment Terms Template Detail",
+							"invoice_portion": 50.00,
+							"credit_days_based_on": "Day(s) after invoice date",
+							"credit_days": 30,
+						},
+					],
+				}
+			).insert()
 
 		template = frappe.db.get_value(
-			"Payment Terms Template",
-			"_Test Payment Terms Template For Purchase Invoice"
+			"Payment Terms Template", "_Test Payment Terms Template For Purchase Invoice"
 		)
-		old_template_in_supplier = frappe.db.get_value(
-			"Supplier",
-			"_Test Supplier",
-			"payment_terms"
-		)
+		old_template_in_supplier = frappe.db.get_value("Supplier", "_Test Supplier", "payment_terms")
 		frappe.db.set_value("Supplier", "_Test Supplier", "payment_terms", template)
 
 		pr = make_purchase_receipt(do_not_save=True)
@@ -123,23 +113,17 @@
 
 		# test if payment terms are fetched and set in PI
 		self.assertEqual(pi.payment_terms_template, template)
-		self.assertEqual(pi.payment_schedule[0].payment_amount, flt(pi.grand_total)/2)
+		self.assertEqual(pi.payment_schedule[0].payment_amount, flt(pi.grand_total) / 2)
 		self.assertEqual(pi.payment_schedule[0].invoice_portion, 50)
-		self.assertEqual(pi.payment_schedule[1].payment_amount, flt(pi.grand_total)/2)
+		self.assertEqual(pi.payment_schedule[1].payment_amount, flt(pi.grand_total) / 2)
 		self.assertEqual(pi.payment_schedule[1].invoice_portion, 50)
 
 		# teardown
-		pi.delete() # draft PI
+		pi.delete()  # draft PI
 		pr.cancel()
-		frappe.db.set_value(
-			"Supplier",
-			"_Test Supplier",
-			"payment_terms",
-			old_template_in_supplier
-		)
+		frappe.db.set_value("Supplier", "_Test Supplier", "payment_terms", old_template_in_supplier)
 		frappe.get_doc(
-			"Payment Terms Template",
-			"_Test Payment Terms Template For Purchase Invoice"
+			"Payment Terms Template", "_Test Payment Terms Template For Purchase Invoice"
 		).delete()
 
 	def test_purchase_receipt_no_gl_entry(self):
@@ -147,27 +131,19 @@
 
 		existing_bin_qty, existing_bin_stock_value = frappe.db.get_value(
 			"Bin",
-			{
-				"item_code": "_Test Item",
-				"warehouse": "_Test Warehouse - _TC"
-			},
-			["actual_qty", "stock_value"]
+			{"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
+			["actual_qty", "stock_value"],
 		)
 
 		if existing_bin_qty < 0:
 			make_stock_entry(
-				item_code="_Test Item",
-				target="_Test Warehouse - _TC",
-				qty=abs(existing_bin_qty)
+				item_code="_Test Item", target="_Test Warehouse - _TC", qty=abs(existing_bin_qty)
 			)
 
 		existing_bin_qty, existing_bin_stock_value = frappe.db.get_value(
 			"Bin",
-			{
-				"item_code": "_Test Item",
-				"warehouse": "_Test Warehouse - _TC"
-			},
-			["actual_qty", "stock_value"]
+			{"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
+			["actual_qty", "stock_value"],
 		)
 
 		pr = make_purchase_receipt()
@@ -178,20 +154,15 @@
 				"voucher_type": "Purchase Receipt",
 				"voucher_no": pr.name,
 				"item_code": "_Test Item",
-				"warehouse": "_Test Warehouse - _TC"
+				"warehouse": "_Test Warehouse - _TC",
 			},
-			"stock_value_difference"
+			"stock_value_difference",
 		)
 
 		self.assertEqual(stock_value_difference, 250)
 
 		current_bin_stock_value = frappe.db.get_value(
-			"Bin",
-			{
-				"item_code": "_Test Item",
-				"warehouse": "_Test Warehouse - _TC"
-			},
-			"stock_value"
+			"Bin", {"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, "stock_value"
 		)
 		self.assertEqual(current_bin_stock_value, existing_bin_stock_value + 250)
 
@@ -200,7 +171,7 @@
 		pr.cancel()
 
 	def test_batched_serial_no_purchase(self):
-		item = frappe.db.exists("Item", {'item_name': 'Batched Serialized Item'})
+		item = frappe.db.exists("Item", {"item_name": "Batched Serialized Item"})
 		if not item:
 			item = create_item("Batched Serialized Item")
 			item.has_batch_no = 1
@@ -210,34 +181,30 @@
 			item.serial_no_series = "BS-.####"
 			item.save()
 		else:
-			item = frappe.get_doc("Item", {'item_name': 'Batched Serialized Item'})
+			item = frappe.get_doc("Item", {"item_name": "Batched Serialized Item"})
 
 		pr = make_purchase_receipt(item_code=item.name, qty=5, rate=500)
 
-		self.assertTrue(
-			frappe.db.get_value('Batch', {'item': item.name, 'reference_name': pr.name})
-		)
+		self.assertTrue(frappe.db.get_value("Batch", {"item": item.name, "reference_name": pr.name}))
 
 		pr.load_from_db()
 		batch_no = pr.items[0].batch_no
 		pr.cancel()
 
-		self.assertFalse(
-			frappe.db.get_value('Batch', {'item': item.name, 'reference_name': pr.name})
-		)
-		self.assertFalse(frappe.db.get_all('Serial No', {'batch_no': batch_no}))
+		self.assertFalse(frappe.db.get_value("Batch", {"item": item.name, "reference_name": pr.name}))
+		self.assertFalse(frappe.db.get_all("Serial No", {"batch_no": batch_no}))
 
 	def test_duplicate_serial_nos(self):
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 
-		item = frappe.db.exists("Item", {'item_name': 'Test Serialized Item 123'})
+		item = frappe.db.exists("Item", {"item_name": "Test Serialized Item 123"})
 		if not item:
 			item = create_item("Test Serialized Item 123")
 			item.has_serial_no = 1
 			item.serial_no_series = "TSI123-.####"
 			item.save()
 		else:
-			item = frappe.get_doc("Item", {'item_name': 'Test Serialized Item 123'})
+			item = frappe.get_doc("Item", {"item_name": "Test Serialized Item 123"})
 
 		# First make purchase receipt
 		pr = make_purchase_receipt(item_code=item.name, qty=2, rate=500)
@@ -245,12 +212,8 @@
 
 		serial_nos = frappe.db.get_value(
 			"Stock Ledger Entry",
-			{
-				"voucher_type": "Purchase Receipt",
-				"voucher_no": pr.name,
-				"item_code": item.name
-			},
-			"serial_no"
+			{"voucher_type": "Purchase Receipt", "voucher_no": pr.name, "item_code": item.name},
+			"serial_no",
 		)
 
 		serial_nos = get_serial_nos(serial_nos)
@@ -262,21 +225,16 @@
 			item_code=item.name,
 			qty=2,
 			rate=500,
-			serial_no='\n'.join(serial_nos),
-			company='_Test Company 1',
+			serial_no="\n".join(serial_nos),
+			company="_Test Company 1",
 			do_not_submit=True,
-			warehouse = 'Stores - _TC1'
+			warehouse="Stores - _TC1",
 		)
 
 		self.assertRaises(SerialNoDuplicateError, pr_different_company.submit)
 
 		# Then made delivery note to remove the serial nos from stock
-		dn = create_delivery_note(
-			item_code=item.name,
-			qty=2,
-			rate=1500,
-			serial_no='\n'.join(serial_nos)
-		)
+		dn = create_delivery_note(item_code=item.name, qty=2, rate=1500, serial_no="\n".join(serial_nos))
 		dn.load_from_db()
 		self.assertEquals(get_serial_nos(dn.items[0].serial_no), serial_nos)
 
@@ -288,8 +246,8 @@
 			qty=2,
 			rate=500,
 			posting_date=posting_date,
-			serial_no='\n'.join(serial_nos),
-			do_not_submit=True
+			serial_no="\n".join(serial_nos),
+			do_not_submit=True,
 		)
 
 		self.assertRaises(SerialNoExistsInFutureTransaction, pr1.submit)
@@ -300,29 +258,28 @@
 			qty=2,
 			rate=500,
 			posting_date=posting_date,
-			serial_no='\n'.join(serial_nos),
+			serial_no="\n".join(serial_nos),
 			company="_Test Company 1",
 			do_not_submit=True,
-			warehouse="Stores - _TC1"
+			warehouse="Stores - _TC1",
 		)
 
 		self.assertRaises(SerialNoExistsInFutureTransaction, pr2.submit)
 
 		# Receive the same serial nos after the delivery note posting date and time
-		make_purchase_receipt(
-			item_code=item.name,
-			qty=2,
-			rate=500,
-			serial_no='\n'.join(serial_nos)
-		)
+		make_purchase_receipt(item_code=item.name, qty=2, rate=500, serial_no="\n".join(serial_nos))
 
 		# Raise the error for backdated deliver note entry cancel
 		self.assertRaises(SerialNoExistsInFutureTransaction, dn.cancel)
 
 	def test_purchase_receipt_gl_entry(self):
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1",
-			get_multiple_items = True, get_taxes_and_charges = True)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
+			get_multiple_items=True,
+			get_taxes_and_charges=True,
+		)
 
 		self.assertEqual(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1)
 
@@ -338,14 +295,14 @@
 				stock_in_hand_account: [750.0, 0.0],
 				"Stock Received But Not Billed - TCP1": [0.0, 500.0],
 				"_Test Account Shipping Charges - TCP1": [0.0, 100.0],
-				"_Test Account Customs Duty - TCP1": [0.0, 150.0]
+				"_Test Account Customs Duty - TCP1": [0.0, 150.0],
 			}
 		else:
 			expected_values = {
 				stock_in_hand_account: [375.0, 0.0],
 				fixed_asset_account: [375.0, 0.0],
 				"Stock Received But Not Billed - TCP1": [0.0, 500.0],
-				"_Test Account Shipping Charges - TCP1": [0.0, 250.0]
+				"_Test Account Shipping Charges - TCP1": [0.0, 250.0],
 			}
 		for gle in gl_entries:
 			self.assertEqual(expected_values[gle.account][0], gle.debit)
@@ -358,22 +315,19 @@
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
 
 		frappe.db.set_value(
-			"Buying Settings", None,
-			"backflush_raw_materials_of_subcontract_based_on", "BOM"
+			"Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", "BOM"
 		)
 
 		make_stock_entry(
-			item_code="_Test Item", qty=100,
-			target="_Test Warehouse 1 - _TC", basic_rate=100
+			item_code="_Test Item", qty=100, target="_Test Warehouse 1 - _TC", basic_rate=100
 		)
 		make_stock_entry(
-			item_code="_Test Item Home Desktop 100", qty=100,
-			target="_Test Warehouse 1 - _TC", basic_rate=100
+			item_code="_Test Item Home Desktop 100",
+			qty=100,
+			target="_Test Warehouse 1 - _TC",
+			basic_rate=100,
 		)
-		pr = make_purchase_receipt(
-			item_code="_Test FG Item", qty=10,
-			rate=500, is_subcontracted="Yes"
-		)
+		pr = make_purchase_receipt(item_code="_Test FG Item", qty=10, rate=500, is_subcontracted="Yes")
 		self.assertEqual(len(pr.get("supplied_items")), 2)
 
 		rm_supp_cost = sum(d.amount for d in pr.get("supplied_items"))
@@ -383,32 +337,35 @@
 
 	def test_subcontracting_gle_fg_item_rate_zero(self):
 		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
+
 		frappe.db.set_value(
-			"Buying Settings", None,
-			"backflush_raw_materials_of_subcontract_based_on", "BOM"
+			"Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", "BOM"
 		)
 
 		se1 = make_stock_entry(
 			item_code="_Test Item",
 			target="Work In Progress - TCP1",
-			qty=100, basic_rate=100,
-			company="_Test Company with perpetual inventory"
+			qty=100,
+			basic_rate=100,
+			company="_Test Company with perpetual inventory",
 		)
 
 		se2 = make_stock_entry(
 			item_code="_Test Item Home Desktop 100",
 			target="Work In Progress - TCP1",
-			qty=100, basic_rate=100,
-			company="_Test Company with perpetual inventory"
+			qty=100,
+			basic_rate=100,
+			company="_Test Company with perpetual inventory",
 		)
 
 		pr = make_purchase_receipt(
 			item_code="_Test FG Item",
-			qty=10, rate=0,
+			qty=10,
+			rate=0,
 			is_subcontracted="Yes",
 			company="_Test Company with perpetual inventory",
 			warehouse="Stores - TCP1",
-			supplier_warehouse="Work In Progress - TCP1"
+			supplier_warehouse="Work In Progress - TCP1",
 		)
 
 		gl_entries = get_gl_entries("Purchase Receipt", pr.name)
@@ -421,9 +378,9 @@
 
 	def test_subcontracting_over_receipt(self):
 		"""
-			Behaviour: Raise multiple PRs against one PO that in total
-				receive more than the required qty in the PO.
-			Expected Result: Error Raised for Over Receipt against PO.
+		Behaviour: Raise multiple PRs against one PO that in total
+		        receive more than the required qty in the PO.
+		Expected Result: Error Raised for Over Receipt against PO.
 		"""
 		from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt
 		from erpnext.buying.doctype.purchase_order.purchase_order import (
@@ -440,24 +397,23 @@
 		item_code = "_Test Subcontracted FG Item 1"
 		make_subcontracted_item(item_code=item_code)
 
-		po = create_purchase_order(item_code=item_code, qty=1, include_exploded_items=0,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			item_code=item_code,
+			qty=1,
+			include_exploded_items=0,
+			is_subcontracted="Yes",
+			supplier_warehouse="_Test Warehouse 1 - _TC",
+		)
 
 		# stock raw materials in a warehouse before transfer
 		make_stock_entry(
-			target="_Test Warehouse - _TC",
-			item_code = "Test Extra Item 1",
-			qty=10, basic_rate=100
+			target="_Test Warehouse - _TC", item_code="Test Extra Item 1", qty=10, basic_rate=100
 		)
 		make_stock_entry(
-			target="_Test Warehouse - _TC",
-			item_code = "_Test FG Item",
-			qty=1, basic_rate=100
+			target="_Test Warehouse - _TC", item_code="_Test FG Item", qty=1, basic_rate=100
 		)
 		make_stock_entry(
-			target="_Test Warehouse - _TC",
-			item_code = "Test Extra Item 2",
-			qty=1, basic_rate=100
+			target="_Test Warehouse - _TC", item_code="Test Extra Item 2", qty=1, basic_rate=100
 		)
 
 		rm_items = [
@@ -467,7 +423,7 @@
 				"item_name": "_Test FG Item",
 				"qty": po.supplied_items[0].required_qty,
 				"warehouse": "_Test Warehouse - _TC",
-				"stock_uom": "Nos"
+				"stock_uom": "Nos",
 			},
 			{
 				"item_code": item_code,
@@ -475,8 +431,8 @@
 				"item_name": "Test Extra Item 1",
 				"qty": po.supplied_items[1].required_qty,
 				"warehouse": "_Test Warehouse - _TC",
-				"stock_uom": "Nos"
-			}
+				"stock_uom": "Nos",
+			},
 		]
 		rm_item_string = json.dumps(rm_items)
 		se = frappe.get_doc(make_subcontract_transfer_entry(po.name, rm_item_string))
@@ -495,15 +451,10 @@
 		pr = make_purchase_receipt(item_code="_Test Serialized Item With Series", qty=1)
 		pr_row_1_serial_no = pr.get("items")[0].serial_no
 
-		self.assertEqual(
-			frappe.db.get_value("Serial No", pr_row_1_serial_no, "supplier"),
-			pr.supplier
-		)
+		self.assertEqual(frappe.db.get_value("Serial No", pr_row_1_serial_no, "supplier"), pr.supplier)
 
 		pr.cancel()
-		self.assertFalse(
-			frappe.db.get_value("Serial No", pr_row_1_serial_no, "warehouse")
-		)
+		self.assertFalse(frappe.db.get_value("Serial No", pr_row_1_serial_no, "warehouse"))
 
 	def test_rejected_serial_no(self):
 		pr = frappe.copy_doc(test_records[0])
@@ -518,32 +469,34 @@
 		accepted_serial_nos = pr.get("items")[0].serial_no.split("\n")
 		self.assertEqual(len(accepted_serial_nos), 3)
 		for serial_no in accepted_serial_nos:
-			self.assertEqual(frappe.db.get_value("Serial No", serial_no, "warehouse"),
-				pr.get("items")[0].warehouse)
+			self.assertEqual(
+				frappe.db.get_value("Serial No", serial_no, "warehouse"), pr.get("items")[0].warehouse
+			)
 
 		rejected_serial_nos = pr.get("items")[0].rejected_serial_no.split("\n")
 		self.assertEqual(len(rejected_serial_nos), 2)
 		for serial_no in rejected_serial_nos:
-			self.assertEqual(frappe.db.get_value("Serial No", serial_no, "warehouse"),
-				pr.get("items")[0].rejected_warehouse)
+			self.assertEqual(
+				frappe.db.get_value("Serial No", serial_no, "warehouse"), pr.get("items")[0].rejected_warehouse
+			)
 
 		pr.cancel()
 
 	def test_purchase_return_partial(self):
 		pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1"
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 		)
 
 		return_pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 			is_return=1,
 			return_against=pr.name,
 			qty=-2,
-			do_not_submit=1
+			do_not_submit=1,
 		)
 		return_pr.items[0].purchase_receipt_item = pr.items[0].name
 		return_pr.submit()
@@ -551,16 +504,12 @@
 		# check sle
 		outgoing_rate = frappe.db.get_value(
 			"Stock Ledger Entry",
-			{
-				"voucher_type": "Purchase Receipt",
-				"voucher_no": return_pr.name
-			},
-			"outgoing_rate"
+			{"voucher_type": "Purchase Receipt", "voucher_no": return_pr.name},
+			"outgoing_rate",
 		)
 
 		self.assertEqual(outgoing_rate, 50)
 
-
 		# check gl entries for return
 		gl_entries = get_gl_entries("Purchase Receipt", return_pr.name)
 
@@ -586,6 +535,7 @@
 		self.assertEqual(pr.per_returned, 40)
 
 		from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 		return_pr_2 = make_return_doc("Purchase Receipt", pr.name)
 
 		# Check if unreturned amount is mapped in 2nd return
@@ -608,7 +558,7 @@
 		# PR should be completed on billing all unreturned amount
 		self.assertEqual(pr.items[0].billed_amt, 150)
 		self.assertEqual(pr.per_billed, 100)
-		self.assertEqual(pr.status, 'Completed')
+		self.assertEqual(pr.status, "Completed")
 
 		pi.load_from_db()
 		pi.cancel()
@@ -622,18 +572,18 @@
 	def test_purchase_return_full(self):
 		pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1"
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 		)
 
 		return_pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 			is_return=1,
 			return_against=pr.name,
 			qty=-5,
-			do_not_submit=1
+			do_not_submit=1,
 		)
 		return_pr.items[0].purchase_receipt_item = pr.items[0].name
 		return_pr.submit()
@@ -646,7 +596,7 @@
 		# Check if Original PR updated
 		self.assertEqual(pr.items[0].returned_qty, 5)
 		self.assertEqual(pr.per_returned, 100)
-		self.assertEqual(pr.status, 'Return Issued')
+		self.assertEqual(pr.status, "Return Issued")
 
 		return_pr.cancel()
 		pr.cancel()
@@ -654,32 +604,32 @@
 	def test_purchase_return_for_rejected_qty(self):
 		from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse
 
-		rejected_warehouse="_Test Rejected Warehouse - TCP1"
+		rejected_warehouse = "_Test Rejected Warehouse - TCP1"
 		if not frappe.db.exists("Warehouse", rejected_warehouse):
 			get_warehouse(
-				company = "_Test Company with perpetual inventory",
-				abbr = " - TCP1",
-				warehouse_name = "_Test Rejected Warehouse"
+				company="_Test Company with perpetual inventory",
+				abbr=" - TCP1",
+				warehouse_name="_Test Rejected Warehouse",
 			).name
 
 		pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 			qty=2,
 			rejected_qty=2,
-			rejected_warehouse=rejected_warehouse
+			rejected_warehouse=rejected_warehouse,
 		)
 
 		return_pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1",
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 			is_return=1,
 			return_against=pr.name,
 			qty=-2,
-			rejected_qty = -2,
-			rejected_warehouse=rejected_warehouse
+			rejected_qty=-2,
+			rejected_warehouse=rejected_warehouse,
 		)
 
 		actual_qty = frappe.db.get_value(
@@ -687,9 +637,9 @@
 			{
 				"voucher_type": "Purchase Receipt",
 				"voucher_no": return_pr.name,
-				"warehouse": return_pr.items[0].rejected_warehouse
+				"warehouse": return_pr.items[0].rejected_warehouse,
 			},
-			"actual_qty"
+			"actual_qty",
 		)
 
 		self.assertEqual(actual_qty, -2)
@@ -697,7 +647,6 @@
 		return_pr.cancel()
 		pr.cancel()
 
-
 	def test_purchase_return_for_serialized_items(self):
 		def _check_serial_no_values(serial_no, field_values):
 			serial_no = frappe.get_doc("Serial No", serial_no)
@@ -710,24 +659,22 @@
 
 		serial_no = get_serial_nos(pr.get("items")[0].serial_no)[0]
 
-		_check_serial_no_values(serial_no, {
-			"warehouse": "_Test Warehouse - _TC",
-			"purchase_document_no": pr.name
-		})
+		_check_serial_no_values(
+			serial_no, {"warehouse": "_Test Warehouse - _TC", "purchase_document_no": pr.name}
+		)
 
 		return_pr = make_purchase_receipt(
 			item_code="_Test Serialized Item With Series",
 			qty=-1,
 			is_return=1,
 			return_against=pr.name,
-			serial_no=serial_no
+			serial_no=serial_no,
 		)
 
-		_check_serial_no_values(serial_no, {
-			"warehouse": "",
-			"purchase_document_no": pr.name,
-			"delivery_document_no": return_pr.name
-		})
+		_check_serial_no_values(
+			serial_no,
+			{"warehouse": "", "purchase_document_no": pr.name, "delivery_document_no": return_pr.name},
+		)
 
 		return_pr.cancel()
 		pr.reload()
@@ -735,20 +682,12 @@
 
 	def test_purchase_return_for_multi_uom(self):
 		item_code = "_Test Purchase Return For Multi-UOM"
-		if not frappe.db.exists('Item', item_code):
-			item = make_item(item_code, {'stock_uom': 'Box'})
-			row = item.append('uoms', {
-				'uom': 'Unit',
-				'conversion_factor': 0.1
-			})
+		if not frappe.db.exists("Item", item_code):
+			item = make_item(item_code, {"stock_uom": "Box"})
+			row = item.append("uoms", {"uom": "Unit", "conversion_factor": 0.1})
 			row.db_update()
 
-		pr = make_purchase_receipt(
-			item_code=item_code,
-			qty=1,
-			uom="Box",
-			conversion_factor=1.0
-		)
+		pr = make_purchase_receipt(item_code=item_code, qty=1, uom="Box", conversion_factor=1.0)
 		return_pr = make_purchase_receipt(
 			item_code=item_code,
 			qty=-10,
@@ -756,7 +695,7 @@
 			stock_uom="Box",
 			conversion_factor=0.1,
 			is_return=1,
-			return_against=pr.name
+			return_against=pr.name,
 		)
 
 		self.assertEqual(abs(return_pr.items[0].stock_qty), 1.0)
@@ -772,18 +711,16 @@
 		pr = make_purchase_receipt()
 
 		update_purchase_receipt_status(pr.name, "Closed")
-		self.assertEqual(
-			frappe.db.get_value("Purchase Receipt", pr.name, "status"), "Closed"
-		)
+		self.assertEqual(frappe.db.get_value("Purchase Receipt", pr.name, "status"), "Closed")
 
 		pr.reload()
 		pr.cancel()
 
 	def test_pr_billing_status(self):
 		"""Flow:
-			1. PO -> PR1 -> PI
-			2. PO -> PI
-			3. PO -> PR2.
+		1. PO -> PR1 -> PI
+		2. PO -> PI
+		3. PO -> PR2.
 		"""
 		from erpnext.buying.doctype.purchase_order.purchase_order import (
 			make_purchase_invoice as make_purchase_invoice_from_po,
@@ -845,19 +782,15 @@
 			item = make_item(item_code, dict(has_serial_no=1))
 
 		serial_no = "12903812901"
-		pr_doc = make_purchase_receipt(item_code=item_code,
-			qty=1, serial_no = serial_no)
+		pr_doc = make_purchase_receipt(item_code=item_code, qty=1, serial_no=serial_no)
 
 		self.assertEqual(
 			serial_no,
 			frappe.db.get_value(
 				"Serial No",
-				{
-					"purchase_document_type": "Purchase Receipt",
-					"purchase_document_no": pr_doc.name
-				},
-				"name"
-			)
+				{"purchase_document_type": "Purchase Receipt", "purchase_document_no": pr_doc.name},
+				"name",
+			),
 		)
 
 		pr_doc.cancel()
@@ -874,12 +807,9 @@
 			serial_no,
 			frappe.db.get_value(
 				"Serial No",
-				{
-					"purchase_document_type": "Purchase Receipt",
-					"purchase_document_no": new_pr_doc.name
-				},
-				"name"
-			)
+				{"purchase_document_type": "Purchase Receipt", "purchase_document_no": new_pr_doc.name},
+				"name",
+			),
 		)
 
 		new_pr_doc.cancel()
@@ -887,40 +817,52 @@
 	def test_auto_asset_creation(self):
 		asset_item = "Test Asset Item"
 
-		if not frappe.db.exists('Item', asset_item):
-			asset_category = frappe.get_all('Asset Category')
+		if not frappe.db.exists("Item", asset_item):
+			asset_category = frappe.get_all("Asset Category")
 
 			if asset_category:
 				asset_category = asset_category[0].name
 
 			if not asset_category:
-				doc = frappe.get_doc({
-					'doctype': 'Asset Category',
-					'asset_category_name': 'Test Asset Category',
-					'depreciation_method': 'Straight Line',
-					'total_number_of_depreciations': 12,
-					'frequency_of_depreciation': 1,
-					'accounts': [{
-						'company_name': '_Test Company',
-						'fixed_asset_account': '_Test Fixed Asset - _TC',
-						'accumulated_depreciation_account': '_Test Accumulated Depreciations - _TC',
-						'depreciation_expense_account': '_Test Depreciations - _TC'
-					}]
-				}).insert()
+				doc = frappe.get_doc(
+					{
+						"doctype": "Asset Category",
+						"asset_category_name": "Test Asset Category",
+						"depreciation_method": "Straight Line",
+						"total_number_of_depreciations": 12,
+						"frequency_of_depreciation": 1,
+						"accounts": [
+							{
+								"company_name": "_Test Company",
+								"fixed_asset_account": "_Test Fixed Asset - _TC",
+								"accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC",
+								"depreciation_expense_account": "_Test Depreciations - _TC",
+							}
+						],
+					}
+				).insert()
 
 				asset_category = doc.name
 
-			item_data = make_item(asset_item, {'is_stock_item':0,
-				'stock_uom': 'Box', 'is_fixed_asset': 1, 'auto_create_assets': 1,
-				'asset_category': asset_category, 'asset_naming_series': 'ABC.###'})
+			item_data = make_item(
+				asset_item,
+				{
+					"is_stock_item": 0,
+					"stock_uom": "Box",
+					"is_fixed_asset": 1,
+					"auto_create_assets": 1,
+					"asset_category": asset_category,
+					"asset_naming_series": "ABC.###",
+				},
+			)
 			asset_item = item_data.item_code
 
 		pr = make_purchase_receipt(item_code=asset_item, qty=3)
-		assets = frappe.db.get_all('Asset', filters={'purchase_receipt': pr.name})
+		assets = frappe.db.get_all("Asset", filters={"purchase_receipt": pr.name})
 
 		self.assertEqual(len(assets), 3)
 
-		location = frappe.db.get_value('Asset', assets[0].name, 'location')
+		location = frappe.db.get_value("Asset", assets[0].name, "location")
 		self.assertEqual(location, "Test Location")
 
 		pr.cancel()
@@ -930,17 +872,18 @@
 
 		pr = make_purchase_receipt(item_code="Test Asset Item", qty=1)
 
-		asset = frappe.get_doc("Asset", {
-			'purchase_receipt': pr.name
-		})
+		asset = frappe.get_doc("Asset", {"purchase_receipt": pr.name})
 		asset.available_for_use_date = frappe.utils.nowdate()
 		asset.gross_purchase_amount = 50.0
-		asset.append("finance_books", {
-			"expected_value_after_useful_life": 10,
-			"depreciation_method": "Straight Line",
-			"total_number_of_depreciations": 3,
-			"frequency_of_depreciation": 1
-		})
+		asset.append(
+			"finance_books",
+			{
+				"expected_value_after_useful_life": 10,
+				"depreciation_method": "Straight Line",
+				"total_number_of_depreciations": 3,
+				"frequency_of_depreciation": 1,
+			},
+		)
 		asset.submit()
 
 		pr_return = make_purchase_return(pr.name)
@@ -960,36 +903,27 @@
 		cost_center = "_Test Cost Center for BS Account - TCP1"
 		create_cost_center(
 			cost_center_name="_Test Cost Center for BS Account",
-			company="_Test Company with perpetual inventory"
+			company="_Test Company with perpetual inventory",
 		)
 
-		if not frappe.db.exists('Location', 'Test Location'):
-			frappe.get_doc({
-				'doctype': 'Location',
-				'location_name': 'Test Location'
-			}).insert()
+		if not frappe.db.exists("Location", "Test Location"):
+			frappe.get_doc({"doctype": "Location", "location_name": "Test Location"}).insert()
 
 		pr = make_purchase_receipt(
 			cost_center=cost_center,
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1"
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 		)
 
-		stock_in_hand_account = get_inventory_account(
-			pr.company, pr.get("items")[0].warehouse
-		)
+		stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
 		gl_entries = get_gl_entries("Purchase Receipt", pr.name)
 
 		self.assertTrue(gl_entries)
 
 		expected_values = {
-			"Stock Received But Not Billed - TCP1": {
-				"cost_center": cost_center
-			},
-			stock_in_hand_account: {
-				"cost_center": cost_center
-			}
+			"Stock Received But Not Billed - TCP1": {"cost_center": cost_center},
+			stock_in_hand_account: {"cost_center": cost_center},
 		}
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
@@ -997,33 +931,24 @@
 		pr.cancel()
 
 	def test_purchase_receipt_cost_center_with_balance_sheet_account(self):
-		if not frappe.db.exists('Location', 'Test Location'):
-			frappe.get_doc({
-				'doctype': 'Location',
-				'location_name': 'Test Location'
-			}).insert()
+		if not frappe.db.exists("Location", "Test Location"):
+			frappe.get_doc({"doctype": "Location", "location_name": "Test Location"}).insert()
 
 		pr = make_purchase_receipt(
 			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			supplier_warehouse = "Work in Progress - TCP1"
+			warehouse="Stores - TCP1",
+			supplier_warehouse="Work in Progress - TCP1",
 		)
 
-		stock_in_hand_account = get_inventory_account(
-			pr.company, pr.get("items")[0].warehouse
-		)
+		stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
 		gl_entries = get_gl_entries("Purchase Receipt", pr.name)
 
 		self.assertTrue(gl_entries)
-		cost_center = pr.get('items')[0].cost_center
+		cost_center = pr.get("items")[0].cost_center
 
 		expected_values = {
-			"Stock Received But Not Billed - TCP1": {
-				"cost_center": cost_center
-			},
-			stock_in_hand_account: {
-				"cost_center": cost_center
-			}
+			"Stock Received But Not Billed - TCP1": {"cost_center": cost_center},
+			stock_in_hand_account: {"cost_center": cost_center},
 		}
 		for i, gle in enumerate(gl_entries):
 			self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
@@ -1039,11 +964,7 @@
 		po = create_purchase_order()
 		pr = create_pr_against_po(po.name)
 
-		pr1 = make_purchase_receipt(
-			qty=-1,
-			is_return=1, return_against=pr.name,
-			do_not_submit=True
-		)
+		pr1 = make_purchase_receipt(qty=-1, is_return=1, return_against=pr.name, do_not_submit=True)
 		pr1.items[0].purchase_order = po.name
 		pr1.items[0].purchase_order_item = po.items[0].name
 		pr1.items[0].purchase_receipt_item = pr.items[0].name
@@ -1060,14 +981,17 @@
 
 	def test_make_purchase_invoice_from_pr_with_returned_qty_duplicate_items(self):
 		pr1 = make_purchase_receipt(qty=8, do_not_submit=True)
-		pr1.append("items", {
-			"item_code": "_Test Item",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 1,
-			"received_qty": 1,
-			"rate": 100,
-			"conversion_factor": 1.0,
-		})
+		pr1.append(
+			"items",
+			{
+				"item_code": "_Test Item",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 1,
+				"received_qty": 1,
+				"rate": 100,
+				"conversion_factor": 1.0,
+			},
+		)
 		pr1.submit()
 
 		pi1 = make_purchase_invoice(pr1.name)
@@ -1076,11 +1000,7 @@
 		pi1.save()
 		pi1.submit()
 
-		pr2 = make_purchase_receipt(
-			qty=-2,
-			is_return=1, return_against=pr1.name,
-			do_not_submit=True
-		)
+		pr2 = make_purchase_receipt(qty=-2, is_return=1, return_against=pr1.name, do_not_submit=True)
 		pr2.items[0].purchase_receipt_item = pr1.items[0].name
 		pr2.submit()
 
@@ -1094,26 +1014,25 @@
 		pr1.cancel()
 
 	def test_stock_transfer_from_purchase_receipt(self):
-		pr1 = make_purchase_receipt(warehouse = 'Work In Progress - TCP1',
-			company="_Test Company with perpetual inventory")
+		pr1 = make_purchase_receipt(
+			warehouse="Work In Progress - TCP1", company="_Test Company with perpetual inventory"
+		)
 
-		pr = make_purchase_receipt(company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1", do_not_save=1)
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory", warehouse="Stores - TCP1", do_not_save=1
+		)
 
-		pr.supplier_warehouse = ''
-		pr.items[0].from_warehouse = 'Work In Progress - TCP1'
+		pr.supplier_warehouse = ""
+		pr.items[0].from_warehouse = "Work In Progress - TCP1"
 
 		pr.submit()
 
-		gl_entries = get_gl_entries('Purchase Receipt', pr.name)
-		sl_entries = get_sl_entries('Purchase Receipt', pr.name)
+		gl_entries = get_gl_entries("Purchase Receipt", pr.name)
+		sl_entries = get_sl_entries("Purchase Receipt", pr.name)
 
 		self.assertFalse(gl_entries)
 
-		expected_sle = {
-			'Work In Progress - TCP1': -5,
-			'Stores - TCP1': 5
-		}
+		expected_sle = {"Work In Progress - TCP1": -5, "Stores - TCP1": 5}
 
 		for sle in sl_entries:
 			self.assertEqual(expected_sle[sle.warehouse], sle.actual_qty)
@@ -1125,48 +1044,45 @@
 		create_warehouse(
 			"_Test Warehouse for Valuation",
 			company="_Test Company with perpetual inventory",
-			properties={"account": '_Test Account Stock In Hand - TCP1'}
+			properties={"account": "_Test Account Stock In Hand - TCP1"},
 		)
 
 		pr1 = make_purchase_receipt(
-			warehouse = '_Test Warehouse for Valuation - TCP1',
-			company="_Test Company with perpetual inventory"
+			warehouse="_Test Warehouse for Valuation - TCP1",
+			company="_Test Company with perpetual inventory",
 		)
 
 		pr = make_purchase_receipt(
-			company="_Test Company with perpetual inventory",
-			warehouse = "Stores - TCP1",
-			do_not_save=1
+			company="_Test Company with perpetual inventory", warehouse="Stores - TCP1", do_not_save=1
 		)
 
-		pr.items[0].from_warehouse = '_Test Warehouse for Valuation - TCP1'
-		pr.supplier_warehouse = ''
+		pr.items[0].from_warehouse = "_Test Warehouse for Valuation - TCP1"
+		pr.supplier_warehouse = ""
 
-
-		pr.append('taxes', {
-			'charge_type': 'On Net Total',
-			'account_head': '_Test Account Shipping Charges - TCP1',
-			'category': 'Valuation and Total',
-			'cost_center': 'Main - TCP1',
-			'description': 'Test',
-			'rate': 9
-		})
+		pr.append(
+			"taxes",
+			{
+				"charge_type": "On Net Total",
+				"account_head": "_Test Account Shipping Charges - TCP1",
+				"category": "Valuation and Total",
+				"cost_center": "Main - TCP1",
+				"description": "Test",
+				"rate": 9,
+			},
+		)
 
 		pr.submit()
 
-		gl_entries = get_gl_entries('Purchase Receipt', pr.name)
-		sl_entries = get_sl_entries('Purchase Receipt', pr.name)
+		gl_entries = get_gl_entries("Purchase Receipt", pr.name)
+		sl_entries = get_sl_entries("Purchase Receipt", pr.name)
 
 		expected_gle = [
-			['Stock In Hand - TCP1', 272.5, 0.0],
-			['_Test Account Stock In Hand - TCP1', 0.0, 250.0],
-			['_Test Account Shipping Charges - TCP1', 0.0, 22.5]
+			["Stock In Hand - TCP1", 272.5, 0.0],
+			["_Test Account Stock In Hand - TCP1", 0.0, 250.0],
+			["_Test Account Shipping Charges - TCP1", 0.0, 22.5],
 		]
 
-		expected_sle = {
-			'_Test Warehouse for Valuation - TCP1': -5,
-			'Stores - TCP1': 5
-		}
+		expected_sle = {"_Test Warehouse for Valuation - TCP1": -5, "Stores - TCP1": 5}
 
 		for sle in sl_entries:
 			self.assertEqual(expected_sle[sle.warehouse], sle.actual_qty)
@@ -1179,7 +1095,6 @@
 		pr.cancel()
 		pr1.cancel()
 
-
 	def test_subcontracted_pr_for_multi_transfer_batches(self):
 		from erpnext.buying.doctype.purchase_order.purchase_order import (
 			make_purchase_receipt,
@@ -1194,49 +1109,57 @@
 		update_backflush_based_on("Material Transferred for Subcontract")
 		item_code = "_Test Subcontracted FG Item 3"
 
-		make_item('Sub Contracted Raw Material 3', {
-			'is_stock_item': 1,
-			'is_sub_contracted_item': 1,
-			'has_batch_no': 1,
-			'create_new_batch': 1
-		})
+		make_item(
+			"Sub Contracted Raw Material 3",
+			{"is_stock_item": 1, "is_sub_contracted_item": 1, "has_batch_no": 1, "create_new_batch": 1},
+		)
 
-		create_subcontracted_item(item_code=item_code, has_batch_no=1,
-			raw_materials=["Sub Contracted Raw Material 3"])
+		create_subcontracted_item(
+			item_code=item_code, has_batch_no=1, raw_materials=["Sub Contracted Raw Material 3"]
+		)
 
 		order_qty = 500
-		po = create_purchase_order(item_code=item_code, qty=order_qty,
-			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			item_code=item_code,
+			qty=order_qty,
+			is_subcontracted="Yes",
+			supplier_warehouse="_Test Warehouse 1 - _TC",
+		)
 
-		ste1=make_stock_entry(target="_Test Warehouse - _TC",
-			item_code = "Sub Contracted Raw Material 3", qty=300, basic_rate=100)
-		ste2=make_stock_entry(target="_Test Warehouse - _TC",
-			item_code = "Sub Contracted Raw Material 3", qty=200, basic_rate=100)
+		ste1 = make_stock_entry(
+			target="_Test Warehouse - _TC",
+			item_code="Sub Contracted Raw Material 3",
+			qty=300,
+			basic_rate=100,
+		)
+		ste2 = make_stock_entry(
+			target="_Test Warehouse - _TC",
+			item_code="Sub Contracted Raw Material 3",
+			qty=200,
+			basic_rate=100,
+		)
 
-		transferred_batch = {
-			ste1.items[0].batch_no : 300,
-			ste2.items[0].batch_no : 200
-		}
+		transferred_batch = {ste1.items[0].batch_no: 300, ste2.items[0].batch_no: 200}
 
 		rm_items = [
 			{
-				"item_code":item_code,
-				"rm_item_code":"Sub Contracted Raw Material 3",
-				"item_name":"_Test Item",
-				"qty":300,
-				"warehouse":"_Test Warehouse - _TC",
-				"stock_uom":"Nos",
-				"name": po.supplied_items[0].name
+				"item_code": item_code,
+				"rm_item_code": "Sub Contracted Raw Material 3",
+				"item_name": "_Test Item",
+				"qty": 300,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
+				"name": po.supplied_items[0].name,
 			},
 			{
-				"item_code":item_code,
-				"rm_item_code":"Sub Contracted Raw Material 3",
-				"item_name":"_Test Item",
-				"qty":200,
-				"warehouse":"_Test Warehouse - _TC",
-				"stock_uom":"Nos",
-				"name": po.supplied_items[0].name
-			}
+				"item_code": item_code,
+				"rm_item_code": "Sub Contracted Raw Material 3",
+				"item_name": "_Test Item",
+				"qty": 200,
+				"warehouse": "_Test Warehouse - _TC",
+				"stock_uom": "Nos",
+				"name": po.supplied_items[0].name,
+			},
 		]
 
 		rm_item_string = json.dumps(rm_items)
@@ -1248,11 +1171,8 @@
 
 		supplied_qty = frappe.db.get_value(
 			"Purchase Order Item Supplied",
-			{
-				"parent": po.name,
-				"rm_item_code": "Sub Contracted Raw Material 3"
-			},
-			"supplied_qty"
+			{"parent": po.name, "rm_item_code": "Sub Contracted Raw Material 3"},
+			"supplied_qty",
 		)
 
 		self.assertEqual(supplied_qty, 500.00)
@@ -1272,12 +1192,11 @@
 		ste1.cancel()
 		po.cancel()
 
-
 	def test_po_to_pi_and_po_to_pr_worflow_full(self):
 		"""Test following behaviour:
-			- Create PO
-			- Create PI from PO and submit
-			- Create PR from PO and submit
+		- Create PO
+		- Create PI from PO and submit
+		- Create PR from PO and submit
 		"""
 		from erpnext.buying.doctype.purchase_order import purchase_order, test_purchase_order
 
@@ -1296,16 +1215,16 @@
 
 	def test_po_to_pi_and_po_to_pr_worflow_partial(self):
 		"""Test following behaviour:
-			- Create PO
-			- Create partial PI from PO and submit
-			- Create PR from PO and submit
+		- Create PO
+		- Create partial PI from PO and submit
+		- Create PR from PO and submit
 		"""
 		from erpnext.buying.doctype.purchase_order import purchase_order, test_purchase_order
 
 		po = test_purchase_order.create_purchase_order()
 
 		pi = purchase_order.make_purchase_invoice(po.name)
-		pi.items[0].qty /= 2   # roughly 50%, ^ this function only creates PI with 1 item.
+		pi.items[0].qty /= 2  # roughly 50%, ^ this function only creates PI with 1 item.
 		pi.submit()
 
 		pr = purchase_order.make_purchase_receipt(po.name)
@@ -1329,11 +1248,14 @@
 			make_purchase_invoice as create_purchase_invoice,
 		)
 
-		pi = create_purchase_invoice(company="_Test Company with perpetual inventory",
-			cost_center = "Main - TCP1",
-			warehouse = "Stores - TCP1",
-			expense_account ="_Test Account Cost for Goods Sold - TCP1",
-			currency = "USD", conversion_rate = 70)
+		pi = create_purchase_invoice(
+			company="_Test Company with perpetual inventory",
+			cost_center="Main - TCP1",
+			warehouse="Stores - TCP1",
+			expense_account="_Test Account Cost for Goods Sold - TCP1",
+			currency="USD",
+			conversion_rate=70,
+		)
 
 		pr = create_purchase_receipt(pi.name)
 		pr.conversion_rate = 80
@@ -1345,19 +1267,16 @@
 
 		# Get exchnage gain and loss account
 		exchange_gain_loss_account = frappe.db.get_value(
-			'Company', pr.company, 'exchange_gain_loss_account'
+			"Company", pr.company, "exchange_gain_loss_account"
 		)
 
 		# fetching the latest GL Entry with exchange gain and loss account account
 		amount = frappe.db.get_value(
-			'GL Entry',
-			{
-				'account': exchange_gain_loss_account,
-				'voucher_no': pr.name
-			},
-			'credit'
+			"GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pr.name}, "credit"
 		)
-		discrepancy_caused_by_exchange_rate_diff = abs(pi.items[0].base_net_amount - pr.items[0].base_net_amount)
+		discrepancy_caused_by_exchange_rate_diff = abs(
+			pi.items[0].base_net_amount - pr.items[0].base_net_amount
+		)
 
 		self.assertEqual(discrepancy_caused_by_exchange_rate_diff, amount)
 
@@ -1379,7 +1298,7 @@
 
 		po = create_purchase_order(qty=10, rate=100, do_not_save=1)
 		create_payment_terms_template()
-		po.payment_terms_template = 'Test Receivable Template'
+		po.payment_terms_template = "Test Receivable Template"
 		po.submit()
 
 		pr = make_pr_against_po(po.name, received_qty=10)
@@ -1406,7 +1325,9 @@
 		account = "Stock Received But Not Billed - TCP1"
 
 		make_item(item_code)
-		se = make_stock_entry(item_code=item_code, from_warehouse=warehouse, qty=50, do_not_save=True, rate=0)
+		se = make_stock_entry(
+			item_code=item_code, from_warehouse=warehouse, qty=50, do_not_save=True, rate=0
+		)
 		se.items[0].allow_zero_valuation_rate = 1
 		se.save()
 		se.submit()
@@ -1427,93 +1348,112 @@
 
 
 def get_sl_entries(voucher_type, voucher_no):
-	return frappe.db.sql(""" select actual_qty, warehouse, stock_value_difference
+	return frappe.db.sql(
+		""" select actual_qty, warehouse, stock_value_difference
 		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s
-		order by posting_time desc""", (voucher_type, voucher_no), as_dict=1)
+		order by posting_time desc""",
+		(voucher_type, voucher_no),
+		as_dict=1,
+	)
+
 
 def get_gl_entries(voucher_type, voucher_no):
-	return frappe.db.sql("""select account, debit, credit, cost_center, is_cancelled
+	return frappe.db.sql(
+		"""select account, debit, credit, cost_center, is_cancelled
 		from `tabGL Entry` where voucher_type=%s and voucher_no=%s
-		order by account desc""", (voucher_type, voucher_no), as_dict=1)
+		order by account desc""",
+		(voucher_type, voucher_no),
+		as_dict=1,
+	)
+
 
 def get_taxes(**args):
 
 	args = frappe._dict(args)
 
-	return [{'account_head': '_Test Account Shipping Charges - TCP1',
-			'add_deduct_tax': 'Add',
-			'category': 'Valuation and Total',
-			'charge_type': 'Actual',
-			'cost_center': args.cost_center or 'Main - TCP1',
-			'description': 'Shipping Charges',
-			'doctype': 'Purchase Taxes and Charges',
-			'parentfield': 'taxes',
-			'rate': 100.0,
-			'tax_amount': 100.0},
-		{'account_head': '_Test Account VAT - TCP1',
-			'add_deduct_tax': 'Add',
-			'category': 'Total',
-			'charge_type': 'Actual',
-			'cost_center': args.cost_center or 'Main - TCP1',
-			'description': 'VAT',
-			'doctype': 'Purchase Taxes and Charges',
-			'parentfield': 'taxes',
-			'rate': 120.0,
-			'tax_amount': 120.0},
-		{'account_head': '_Test Account Customs Duty - TCP1',
-			'add_deduct_tax': 'Add',
-			'category': 'Valuation',
-			'charge_type': 'Actual',
-			'cost_center': args.cost_center or 'Main - TCP1',
-			'description': 'Customs Duty',
-			'doctype': 'Purchase Taxes and Charges',
-			'parentfield': 'taxes',
-			'rate': 150.0,
-			'tax_amount': 150.0}]
+	return [
+		{
+			"account_head": "_Test Account Shipping Charges - TCP1",
+			"add_deduct_tax": "Add",
+			"category": "Valuation and Total",
+			"charge_type": "Actual",
+			"cost_center": args.cost_center or "Main - TCP1",
+			"description": "Shipping Charges",
+			"doctype": "Purchase Taxes and Charges",
+			"parentfield": "taxes",
+			"rate": 100.0,
+			"tax_amount": 100.0,
+		},
+		{
+			"account_head": "_Test Account VAT - TCP1",
+			"add_deduct_tax": "Add",
+			"category": "Total",
+			"charge_type": "Actual",
+			"cost_center": args.cost_center or "Main - TCP1",
+			"description": "VAT",
+			"doctype": "Purchase Taxes and Charges",
+			"parentfield": "taxes",
+			"rate": 120.0,
+			"tax_amount": 120.0,
+		},
+		{
+			"account_head": "_Test Account Customs Duty - TCP1",
+			"add_deduct_tax": "Add",
+			"category": "Valuation",
+			"charge_type": "Actual",
+			"cost_center": args.cost_center or "Main - TCP1",
+			"description": "Customs Duty",
+			"doctype": "Purchase Taxes and Charges",
+			"parentfield": "taxes",
+			"rate": 150.0,
+			"tax_amount": 150.0,
+		},
+	]
+
 
 def get_items(**args):
 	args = frappe._dict(args)
-	return [{
-	"base_amount": 250.0,
-	"conversion_factor": 1.0,
-	"description": "_Test Item",
-	"doctype": "Purchase Receipt Item",
-	"item_code": "_Test Item",
-	"item_name": "_Test Item",
-	"parentfield": "items",
-	"qty": 5.0,
-	"rate": 50.0,
-	"received_qty": 5.0,
-	"rejected_qty": 0.0,
-	"stock_uom": "_Test UOM",
-	"uom": "_Test UOM",
-	"warehouse": args.warehouse or "_Test Warehouse - _TC",
-	"cost_center": args.cost_center or "Main - _TC"
-	},
-	{
-	"base_amount": 250.0,
-	"conversion_factor": 1.0,
-	"description": "_Test Item Home Desktop 100",
-	"doctype": "Purchase Receipt Item",
-	"item_code": "_Test Item Home Desktop 100",
-	"item_name": "_Test Item Home Desktop 100",
-	"parentfield": "items",
-	"qty": 5.0,
-	"rate": 50.0,
-	"received_qty": 5.0,
-	"rejected_qty": 0.0,
-	"stock_uom": "_Test UOM",
-	"uom": "_Test UOM",
-	"warehouse": args.warehouse or "_Test Warehouse 1 - _TC",
-	"cost_center": args.cost_center or "Main - _TC"
-	}]
+	return [
+		{
+			"base_amount": 250.0,
+			"conversion_factor": 1.0,
+			"description": "_Test Item",
+			"doctype": "Purchase Receipt Item",
+			"item_code": "_Test Item",
+			"item_name": "_Test Item",
+			"parentfield": "items",
+			"qty": 5.0,
+			"rate": 50.0,
+			"received_qty": 5.0,
+			"rejected_qty": 0.0,
+			"stock_uom": "_Test UOM",
+			"uom": "_Test UOM",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"cost_center": args.cost_center or "Main - _TC",
+		},
+		{
+			"base_amount": 250.0,
+			"conversion_factor": 1.0,
+			"description": "_Test Item Home Desktop 100",
+			"doctype": "Purchase Receipt Item",
+			"item_code": "_Test Item Home Desktop 100",
+			"item_name": "_Test Item Home Desktop 100",
+			"parentfield": "items",
+			"qty": 5.0,
+			"rate": 50.0,
+			"received_qty": 5.0,
+			"rejected_qty": 0.0,
+			"stock_uom": "_Test UOM",
+			"uom": "_Test UOM",
+			"warehouse": args.warehouse or "_Test Warehouse 1 - _TC",
+			"cost_center": args.cost_center or "Main - _TC",
+		},
+	]
+
 
 def make_purchase_receipt(**args):
-	if not frappe.db.exists('Location', 'Test Location'):
-		frappe.get_doc({
-			'doctype': 'Location',
-			'location_name': 'Test Location'
-		}).insert()
+	if not frappe.db.exists("Location", "Test Location"):
+		frappe.get_doc({"doctype": "Location", "location_name": "Test Location"}).insert()
 
 	frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1)
 	pr = frappe.new_doc("Purchase Receipt")
@@ -1537,28 +1477,34 @@
 
 	item_code = args.item or args.item_code or "_Test Item"
 	uom = args.uom or frappe.db.get_value("Item", item_code, "stock_uom") or "_Test UOM"
-	pr.append("items", {
-		"item_code": item_code,
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": qty,
-		"received_qty": received_qty,
-		"rejected_qty": rejected_qty,
-		"rejected_warehouse": args.rejected_warehouse or "_Test Rejected Warehouse - _TC" if rejected_qty != 0 else "",
-		"rate": args.rate if args.rate != None else 50,
-		"conversion_factor": args.conversion_factor or 1.0,
-		"stock_qty": flt(qty) * (flt(args.conversion_factor) or 1.0),
-		"serial_no": args.serial_no,
-		"batch_no": args.batch_no,
-		"stock_uom": args.stock_uom or "_Test UOM",
-		"uom": uom,
-		"cost_center": args.cost_center or frappe.get_cached_value('Company',  pr.company,  'cost_center'),
-		"asset_location": args.location or "Test Location"
-	})
+	pr.append(
+		"items",
+		{
+			"item_code": item_code,
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": qty,
+			"received_qty": received_qty,
+			"rejected_qty": rejected_qty,
+			"rejected_warehouse": args.rejected_warehouse or "_Test Rejected Warehouse - _TC"
+			if rejected_qty != 0
+			else "",
+			"rate": args.rate if args.rate != None else 50,
+			"conversion_factor": args.conversion_factor or 1.0,
+			"stock_qty": flt(qty) * (flt(args.conversion_factor) or 1.0),
+			"serial_no": args.serial_no,
+			"batch_no": args.batch_no,
+			"stock_uom": args.stock_uom or "_Test UOM",
+			"uom": uom,
+			"cost_center": args.cost_center
+			or frappe.get_cached_value("Company", pr.company, "cost_center"),
+			"asset_location": args.location or "Test Location",
+		},
+	)
 
 	if args.get_multiple_items:
 		pr.items = []
 
-		company_cost_center = frappe.get_cached_value('Company', pr.company, 'cost_center')
+		company_cost_center = frappe.get_cached_value("Company", pr.company, "cost_center")
 		cost_center = args.cost_center or company_cost_center
 
 		for item in get_items(warehouse=args.warehouse, cost_center=cost_center):
@@ -1574,33 +1520,44 @@
 			pr.submit()
 	return pr
 
+
 def create_subcontracted_item(**args):
 	from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
 
 	args = frappe._dict(args)
 
-	if not frappe.db.exists('Item', args.item_code):
-		make_item(args.item_code, {
-			'is_stock_item': 1,
-			'is_sub_contracted_item': 1,
-			'has_batch_no': args.get("has_batch_no") or 0
-		})
+	if not frappe.db.exists("Item", args.item_code):
+		make_item(
+			args.item_code,
+			{
+				"is_stock_item": 1,
+				"is_sub_contracted_item": 1,
+				"has_batch_no": args.get("has_batch_no") or 0,
+			},
+		)
 
 	if not args.raw_materials:
-		if not frappe.db.exists('Item', "Test Extra Item 1"):
-			make_item("Test Extra Item 1", {
-				'is_stock_item': 1,
-			})
+		if not frappe.db.exists("Item", "Test Extra Item 1"):
+			make_item(
+				"Test Extra Item 1",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		if not frappe.db.exists('Item', "Test Extra Item 2"):
-			make_item("Test Extra Item 2", {
-				'is_stock_item': 1,
-			})
+		if not frappe.db.exists("Item", "Test Extra Item 2"):
+			make_item(
+				"Test Extra Item 2",
+				{
+					"is_stock_item": 1,
+				},
+			)
 
-		args.raw_materials = ['_Test FG Item', 'Test Extra Item 1']
+		args.raw_materials = ["_Test FG Item", "Test Extra Item 1"]
 
-	if not frappe.db.get_value('BOM', {'item': args.item_code}, 'name'):
-		make_bom(item = args.item_code, raw_materials = args.get("raw_materials"))
+	if not frappe.db.get_value("BOM", {"item": args.item_code}, "name"):
+		make_bom(item=args.item_code, raw_materials=args.get("raw_materials"))
+
 
 test_dependencies = ["BOM", "Item Price", "Location"]
-test_records = frappe.get_test_records('Purchase Receipt')
+test_records = frappe.get_test_records("Purchase Receipt")
diff --git a/erpnext/stock/doctype/putaway_rule/putaway_rule.py b/erpnext/stock/doctype/putaway_rule/putaway_rule.py
index 4e472a9..623fbde 100644
--- a/erpnext/stock/doctype/putaway_rule/putaway_rule.py
+++ b/erpnext/stock/doctype/putaway_rule/putaway_rule.py
@@ -24,11 +24,16 @@
 		self.set_stock_capacity()
 
 	def validate_duplicate_rule(self):
-		existing_rule = frappe.db.exists("Putaway Rule", {"item_code": self.item_code, "warehouse": self.warehouse})
+		existing_rule = frappe.db.exists(
+			"Putaway Rule", {"item_code": self.item_code, "warehouse": self.warehouse}
+		)
 		if existing_rule and existing_rule != self.name:
-			frappe.throw(_("Putaway Rule already exists for Item {0} in Warehouse {1}.")
-				.format(frappe.bold(self.item_code), frappe.bold(self.warehouse)),
-				title=_("Duplicate"))
+			frappe.throw(
+				_("Putaway Rule already exists for Item {0} in Warehouse {1}.").format(
+					frappe.bold(self.item_code), frappe.bold(self.warehouse)
+				),
+				title=_("Duplicate"),
+			)
 
 	def validate_priority(self):
 		if self.priority < 1:
@@ -37,18 +42,24 @@
 	def validate_warehouse_and_company(self):
 		company = frappe.db.get_value("Warehouse", self.warehouse, "company")
 		if company != self.company:
-			frappe.throw(_("Warehouse {0} does not belong to Company {1}.")
-				.format(frappe.bold(self.warehouse), frappe.bold(self.company)),
-				title=_("Invalid Warehouse"))
+			frappe.throw(
+				_("Warehouse {0} does not belong to Company {1}.").format(
+					frappe.bold(self.warehouse), frappe.bold(self.company)
+				),
+				title=_("Invalid Warehouse"),
+			)
 
 	def validate_capacity(self):
 		stock_uom = frappe.db.get_value("Item", self.item_code, "stock_uom")
 		balance_qty = get_stock_balance(self.item_code, self.warehouse, nowdate())
 
 		if flt(self.stock_capacity) < flt(balance_qty):
-			frappe.throw(_("Warehouse Capacity for Item '{0}' must be greater than the existing stock level of {1} {2}.")
-				.format(self.item_code, frappe.bold(balance_qty), stock_uom),
-				title=_("Insufficient Capacity"))
+			frappe.throw(
+				_(
+					"Warehouse Capacity for Item '{0}' must be greater than the existing stock level of {1} {2}."
+				).format(self.item_code, frappe.bold(balance_qty), stock_uom),
+				title=_("Insufficient Capacity"),
+			)
 
 		if not self.capacity:
 			frappe.throw(_("Capacity must be greater than 0"), title=_("Invalid"))
@@ -56,23 +67,26 @@
 	def set_stock_capacity(self):
 		self.stock_capacity = (flt(self.conversion_factor) or 1) * flt(self.capacity)
 
+
 @frappe.whitelist()
 def get_available_putaway_capacity(rule):
-	stock_capacity, item_code, warehouse = frappe.db.get_value("Putaway Rule", rule,
-		["stock_capacity", "item_code", "warehouse"])
+	stock_capacity, item_code, warehouse = frappe.db.get_value(
+		"Putaway Rule", rule, ["stock_capacity", "item_code", "warehouse"]
+	)
 	balance_qty = get_stock_balance(item_code, warehouse, nowdate())
 	free_space = flt(stock_capacity) - flt(balance_qty)
 	return free_space if free_space > 0 else 0
 
+
 @frappe.whitelist()
 def apply_putaway_rule(doctype, items, company, sync=None, purpose=None):
-	""" Applies Putaway Rule on line items.
+	"""Applies Putaway Rule on line items.
 
-		items: List of Purchase Receipt/Stock Entry Items
-		company: Company in the Purchase Receipt/Stock Entry
-		doctype: Doctype to apply rule on
-		purpose: Purpose of Stock Entry
-		sync (optional): Sync with client side only for client side calls
+	items: List of Purchase Receipt/Stock Entry Items
+	company: Company in the Purchase Receipt/Stock Entry
+	doctype: Doctype to apply rule on
+	purpose: Purpose of Stock Entry
+	sync (optional): Sync with client side only for client side calls
 	"""
 	if isinstance(items, str):
 		items = json.loads(items)
@@ -89,16 +103,18 @@
 		item.conversion_factor = flt(item.conversion_factor) or 1.0
 		pending_qty, item_code = flt(item.qty), item.item_code
 		pending_stock_qty = flt(item.transfer_qty) if doctype == "Stock Entry" else flt(item.stock_qty)
-		uom_must_be_whole_number = frappe.db.get_value('UOM', item.uom, 'must_be_whole_number')
+		uom_must_be_whole_number = frappe.db.get_value("UOM", item.uom, "must_be_whole_number")
 
 		if not pending_qty or not item_code:
 			updated_table = add_row(item, pending_qty, source_warehouse or item.warehouse, updated_table)
 			continue
 
-		at_capacity, rules = get_ordered_putaway_rules(item_code, company, source_warehouse=source_warehouse)
+		at_capacity, rules = get_ordered_putaway_rules(
+			item_code, company, source_warehouse=source_warehouse
+		)
 
 		if not rules:
-			warehouse = source_warehouse or item.get('warehouse')
+			warehouse = source_warehouse or item.get("warehouse")
 			if at_capacity:
 				# rules available, but no free space
 				items_not_accomodated.append([item_code, pending_qty])
@@ -117,23 +133,28 @@
 
 		for rule in item_wise_rules[key]:
 			if pending_stock_qty > 0 and rule.free_space:
-				stock_qty_to_allocate = flt(rule.free_space) if pending_stock_qty >= flt(rule.free_space) else pending_stock_qty
+				stock_qty_to_allocate = (
+					flt(rule.free_space) if pending_stock_qty >= flt(rule.free_space) else pending_stock_qty
+				)
 				qty_to_allocate = stock_qty_to_allocate / item.conversion_factor
 
 				if uom_must_be_whole_number:
 					qty_to_allocate = floor(qty_to_allocate)
 					stock_qty_to_allocate = qty_to_allocate * item.conversion_factor
 
-				if not qty_to_allocate: break
+				if not qty_to_allocate:
+					break
 
-				updated_table = add_row(item, qty_to_allocate, rule.warehouse, updated_table,
-					rule.name, serial_nos=serial_nos)
+				updated_table = add_row(
+					item, qty_to_allocate, rule.warehouse, updated_table, rule.name, serial_nos=serial_nos
+				)
 
 				pending_stock_qty -= stock_qty_to_allocate
 				pending_qty -= qty_to_allocate
 				rule["free_space"] -= stock_qty_to_allocate
 
-				if not pending_stock_qty > 0: break
+				if not pending_stock_qty > 0:
+					break
 
 		# if pending qty after applying all rules, add row without warehouse
 		if pending_stock_qty > 0:
@@ -146,13 +167,14 @@
 		items[:] = updated_table
 		frappe.msgprint(_("Applied putaway rules."), alert=True)
 
-	if sync and json.loads(sync): # sync with client side
+	if sync and json.loads(sync):  # sync with client side
 		return items
 
-def _items_changed(old, new, doctype: str) -> bool:
-	""" Check if any items changed by application of putaway rules.
 
-		If not, changing item table can have side effects since `name` items also changes.
+def _items_changed(old, new, doctype: str) -> bool:
+	"""Check if any items changed by application of putaway rules.
+
+	If not, changing item table can have side effects since `name` items also changes.
 	"""
 	if len(old) != len(new):
 		return True
@@ -161,13 +183,22 @@
 
 	if doctype == "Stock Entry":
 		compare_keys = ("item_code", "t_warehouse", "transfer_qty", "serial_no")
-		sort_key = lambda item: (item.item_code, cstr(item.t_warehouse),  # noqa
-				flt(item.transfer_qty), cstr(item.serial_no))
+		sort_key = lambda item: (  # noqa
+			item.item_code,
+			cstr(item.t_warehouse),
+			flt(item.transfer_qty),
+			cstr(item.serial_no),
+		)
 	else:
 		# purchase receipt / invoice
 		compare_keys = ("item_code", "warehouse", "stock_qty", "received_qty", "serial_no")
-		sort_key = lambda item: (item.item_code, cstr(item.warehouse),  # noqa
-				flt(item.stock_qty), flt(item.received_qty), cstr(item.serial_no))
+		sort_key = lambda item: (  # noqa
+			item.item_code,
+			cstr(item.warehouse),
+			flt(item.stock_qty),
+			flt(item.received_qty),
+			cstr(item.serial_no),
+		)
 
 	old_sorted = sorted(old, key=sort_key)
 	new_sorted = sorted(new, key=sort_key)
@@ -182,18 +213,16 @@
 
 def get_ordered_putaway_rules(item_code, company, source_warehouse=None):
 	"""Returns an ordered list of putaway rules to apply on an item."""
-	filters = {
-		"item_code": item_code,
-		"company": company,
-		"disable": 0
-	}
+	filters = {"item_code": item_code, "company": company, "disable": 0}
 	if source_warehouse:
 		filters.update({"warehouse": ["!=", source_warehouse]})
 
-	rules = frappe.get_all("Putaway Rule",
+	rules = frappe.get_all(
+		"Putaway Rule",
 		fields=["name", "item_code", "stock_capacity", "priority", "warehouse"],
 		filters=filters,
-		order_by="priority asc, capacity desc")
+		order_by="priority asc, capacity desc",
+	)
 
 	if not rules:
 		return False, None
@@ -211,10 +240,11 @@
 		# then there is not enough space left in any rule
 		return True, None
 
-	vacant_rules = sorted(vacant_rules, key = lambda i: (i['priority'], -i['free_space']))
+	vacant_rules = sorted(vacant_rules, key=lambda i: (i["priority"], -i["free_space"]))
 
 	return False, vacant_rules
 
+
 def add_row(item, to_allocate, warehouse, updated_table, rule=None, serial_nos=None):
 	new_updated_table_row = copy.deepcopy(item)
 	new_updated_table_row.idx = 1 if not updated_table else cint(updated_table[-1].idx) + 1
@@ -223,7 +253,9 @@
 
 	if item.doctype == "Stock Entry Detail":
 		new_updated_table_row.t_warehouse = warehouse
-		new_updated_table_row.transfer_qty = flt(to_allocate) * flt(new_updated_table_row.conversion_factor)
+		new_updated_table_row.transfer_qty = flt(to_allocate) * flt(
+			new_updated_table_row.conversion_factor
+		)
 	else:
 		new_updated_table_row.stock_qty = flt(to_allocate) * flt(new_updated_table_row.conversion_factor)
 		new_updated_table_row.warehouse = warehouse
@@ -238,6 +270,7 @@
 	updated_table.append(new_updated_table_row)
 	return updated_table
 
+
 def show_unassigned_items_message(items_not_accomodated):
 	msg = _("The following Items, having Putaway Rules, could not be accomodated:") + "<br><br>"
 	formatted_item_rows = ""
@@ -247,7 +280,9 @@
 		formatted_item_rows += """
 			<td>{0}</td>
 			<td>{1}</td>
-		</tr>""".format(item_link, frappe.bold(entry[1]))
+		</tr>""".format(
+			item_link, frappe.bold(entry[1])
+		)
 
 	msg += """
 		<table class="table">
@@ -257,13 +292,17 @@
 			</thead>
 			{2}
 		</table>
-	""".format(_("Item"), _("Unassigned Qty"), formatted_item_rows)
+	""".format(
+		_("Item"), _("Unassigned Qty"), formatted_item_rows
+	)
 
 	frappe.msgprint(msg, title=_("Insufficient Capacity"), is_minimizable=True, wide=True)
 
+
 def get_serial_nos_to_allocate(serial_nos, to_allocate):
 	if serial_nos:
-		allocated_serial_nos = serial_nos[0: cint(to_allocate)]
-		serial_nos[:] = serial_nos[cint(to_allocate):] # pop out allocated serial nos and modify list
+		allocated_serial_nos = serial_nos[0 : cint(to_allocate)]
+		serial_nos[:] = serial_nos[cint(to_allocate) :]  # pop out allocated serial nos and modify list
 		return "\n".join(allocated_serial_nos) if allocated_serial_nos else ""
-	else: return ""
+	else:
+		return ""
diff --git a/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py b/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
index 0ec812c..ab0ca10 100644
--- a/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
+++ b/erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
@@ -15,12 +15,9 @@
 class TestPutawayRule(FrappeTestCase):
 	def setUp(self):
 		if not frappe.db.exists("Item", "_Rice"):
-			make_item("_Rice", {
-				'is_stock_item': 1,
-				'has_batch_no' : 1,
-				'create_new_batch': 1,
-				'stock_uom': 'Kg'
-			})
+			make_item(
+				"_Rice", {"is_stock_item": 1, "has_batch_no": 1, "create_new_batch": 1, "stock_uom": "Kg"}
+			)
 
 		if not frappe.db.exists("Warehouse", {"warehouse_name": "Rack 1"}):
 			create_warehouse("Rack 1")
@@ -36,10 +33,10 @@
 			new_uom.save()
 
 	def assertUnchangedItemsOnResave(self, doc):
-		""" Check if same items remain even after reapplication of rules.
+		"""Check if same items remain even after reapplication of rules.
 
-			This is required since some business logic like subcontracting
-			depends on `name` of items to be same if item isn't changed.
+		This is required since some business logic like subcontracting
+		depends on `name` of items to be same if item isn't changed.
 		"""
 		doc.reload()
 		old_items = {d.name for d in doc.items}
@@ -49,13 +46,14 @@
 
 	def test_putaway_rules_priority(self):
 		"""Test if rule is applied by priority, irrespective of free space."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200,
-			uom="Kg")
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=300,
-			uom="Kg", priority=2)
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
+		)
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=300, uom="Kg", priority=2
+		)
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=300, apply_putaway_rule=1,
-			do_not_submit=1)
+		pr = make_purchase_receipt(item_code="_Rice", qty=300, apply_putaway_rule=1, do_not_submit=1)
 		self.assertEqual(len(pr.items), 2)
 		self.assertEqual(pr.items[0].qty, 200)
 		self.assertEqual(pr.items[0].warehouse, self.warehouse_1)
@@ -71,16 +69,19 @@
 	def test_putaway_rules_with_same_priority(self):
 		"""Test if rule with more free space is applied,
 		among two rules with same priority and capacity."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=500,
-			uom="Kg")
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=500,
-			uom="Kg")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=500, uom="Kg"
+		)
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=500, uom="Kg"
+		)
 
 		# out of 500 kg capacity, occupy 100 kg in warehouse_1
-		stock_receipt = make_stock_entry(item_code="_Rice", target=self.warehouse_1, qty=100, basic_rate=50)
+		stock_receipt = make_stock_entry(
+			item_code="_Rice", target=self.warehouse_1, qty=100, basic_rate=50
+		)
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=700, apply_putaway_rule=1,
-			do_not_submit=1)
+		pr = make_purchase_receipt(item_code="_Rice", qty=700, apply_putaway_rule=1, do_not_submit=1)
 		self.assertEqual(len(pr.items), 2)
 		self.assertEqual(pr.items[0].qty, 500)
 		# warehouse_2 has 500 kg free space, it is given priority
@@ -96,13 +97,14 @@
 
 	def test_putaway_rules_with_insufficient_capacity(self):
 		"""Test if qty exceeding capacity, is handled."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=100,
-			uom="Kg")
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=200,
-			uom="Kg")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=100, uom="Kg"
+		)
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=200, uom="Kg"
+		)
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=350, apply_putaway_rule=1,
-			do_not_submit=1)
+		pr = make_purchase_receipt(item_code="_Rice", qty=350, apply_putaway_rule=1, do_not_submit=1)
 		self.assertEqual(len(pr.items), 2)
 		self.assertEqual(pr.items[0].qty, 200)
 		self.assertEqual(pr.items[0].warehouse, self.warehouse_2)
@@ -118,24 +120,32 @@
 		"""Test rules applied on uom other than stock uom."""
 		item = frappe.get_doc("Item", "_Rice")
 		if not frappe.db.get_value("UOM Conversion Detail", {"parent": "_Rice", "uom": "Bag"}):
-			item.append("uoms", {
-				"uom": "Bag",
-				"conversion_factor": 1000
-			})
+			item.append("uoms", {"uom": "Bag", "conversion_factor": 1000})
 			item.save()
 
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=3,
-			uom="Bag")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=3, uom="Bag"
+		)
 		self.assertEqual(rule_1.stock_capacity, 3000)
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=4,
-			uom="Bag")
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=4, uom="Bag"
+		)
 		self.assertEqual(rule_2.stock_capacity, 4000)
 
 		# populate 'Rack 1' with 1 Bag, making the free space 2 Bags
-		stock_receipt = make_stock_entry(item_code="_Rice", target=self.warehouse_1, qty=1000, basic_rate=50)
+		stock_receipt = make_stock_entry(
+			item_code="_Rice", target=self.warehouse_1, qty=1000, basic_rate=50
+		)
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=6, uom="Bag", stock_uom="Kg",
-			conversion_factor=1000, apply_putaway_rule=1, do_not_submit=1)
+		pr = make_purchase_receipt(
+			item_code="_Rice",
+			qty=6,
+			uom="Bag",
+			stock_uom="Kg",
+			conversion_factor=1000,
+			apply_putaway_rule=1,
+			do_not_submit=1,
+		)
 		self.assertEqual(len(pr.items), 2)
 		self.assertEqual(pr.items[0].qty, 4)
 		self.assertEqual(pr.items[0].warehouse, self.warehouse_2)
@@ -151,25 +161,30 @@
 		"""Test if whole UOMs are handled."""
 		item = frappe.get_doc("Item", "_Rice")
 		if not frappe.db.get_value("UOM Conversion Detail", {"parent": "_Rice", "uom": "Bag"}):
-			item.append("uoms", {
-				"uom": "Bag",
-				"conversion_factor": 1000
-			})
+			item.append("uoms", {"uom": "Bag", "conversion_factor": 1000})
 			item.save()
 
 		frappe.db.set_value("UOM", "Bag", "must_be_whole_number", 1)
 
 		# Putaway Rule in different UOM
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=1,
-			uom="Bag")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=1, uom="Bag"
+		)
 		self.assertEqual(rule_1.stock_capacity, 1000)
 		# Putaway Rule in Stock UOM
 		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=500)
 		self.assertEqual(rule_2.stock_capacity, 500)
 		# total capacity is 1500 Kg
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=2, uom="Bag", stock_uom="Kg",
-			conversion_factor=1000, apply_putaway_rule=1, do_not_submit=1)
+		pr = make_purchase_receipt(
+			item_code="_Rice",
+			qty=2,
+			uom="Bag",
+			stock_uom="Kg",
+			conversion_factor=1000,
+			apply_putaway_rule=1,
+			do_not_submit=1,
+		)
 		self.assertEqual(len(pr.items), 1)
 		self.assertEqual(pr.items[0].qty, 1)
 		self.assertEqual(pr.items[0].warehouse, self.warehouse_1)
@@ -184,23 +199,26 @@
 
 	def test_putaway_rules_with_reoccurring_item(self):
 		"""Test rules on same item entered multiple times with different rate."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200,
-			uom="Kg")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
+		)
 		# total capacity is 200 Kg
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=100, apply_putaway_rule=1,
-			do_not_submit=1)
-		pr.append("items", {
-			"item_code": "_Rice",
-			"warehouse": "_Test Warehouse - _TC",
-			"qty": 200,
-			"uom": "Kg",
-			"stock_uom": "Kg",
-			"stock_qty": 200,
-			"received_qty": 200,
-			"rate": 100,
-			"conversion_factor": 1.0,
-		}) # same item entered again in PR but with different rate
+		pr = make_purchase_receipt(item_code="_Rice", qty=100, apply_putaway_rule=1, do_not_submit=1)
+		pr.append(
+			"items",
+			{
+				"item_code": "_Rice",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 200,
+				"uom": "Kg",
+				"stock_uom": "Kg",
+				"stock_qty": 200,
+				"received_qty": 200,
+				"rate": 100,
+				"conversion_factor": 1.0,
+			},
+		)  # same item entered again in PR but with different rate
 		pr.save()
 		self.assertEqual(len(pr.items), 2)
 		self.assertEqual(pr.items[0].qty, 100)
@@ -208,7 +226,7 @@
 		self.assertEqual(pr.items[0].putaway_rule, rule_1.name)
 		# same rule applied to second item row
 		# with previous assignment considered
-		self.assertEqual(pr.items[1].qty, 100) # 100 unassigned in second row from 200
+		self.assertEqual(pr.items[1].qty, 100)  # 100 unassigned in second row from 200
 		self.assertEqual(pr.items[1].warehouse, self.warehouse_1)
 		self.assertEqual(pr.items[1].putaway_rule, rule_1.name)
 
@@ -219,13 +237,13 @@
 
 	def test_validate_over_receipt_in_warehouse(self):
 		"""Test if overreceipt is blocked in the presence of putaway rules."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200,
-			uom="Kg")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
+		)
 
-		pr = make_purchase_receipt(item_code="_Rice", qty=300, apply_putaway_rule=1,
-			do_not_submit=1)
+		pr = make_purchase_receipt(item_code="_Rice", qty=300, apply_putaway_rule=1, do_not_submit=1)
 		self.assertEqual(len(pr.items), 1)
-		self.assertEqual(pr.items[0].qty, 200) # 100 is unassigned fro 300 Kg
+		self.assertEqual(pr.items[0].qty, 200)  # 100 is unassigned fro 300 Kg
 		self.assertEqual(pr.items[0].warehouse, self.warehouse_1)
 		self.assertEqual(pr.items[0].putaway_rule, rule_1.name)
 
@@ -240,21 +258,29 @@
 
 	def test_putaway_rule_on_stock_entry_material_transfer(self):
 		"""Test if source warehouse is considered while applying rules."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200,
-			uom="Kg") # higher priority
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=100,
-			uom="Kg", priority=2)
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
+		)  # higher priority
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=100, uom="Kg", priority=2
+		)
 
-		stock_entry = make_stock_entry(item_code="_Rice", source=self.warehouse_1, qty=200,
-			target="_Test Warehouse - _TC", purpose="Material Transfer",
-			apply_putaway_rule=1, do_not_submit=1)
+		stock_entry = make_stock_entry(
+			item_code="_Rice",
+			source=self.warehouse_1,
+			qty=200,
+			target="_Test Warehouse - _TC",
+			purpose="Material Transfer",
+			apply_putaway_rule=1,
+			do_not_submit=1,
+		)
 
 		stock_entry_item = stock_entry.get("items")[0]
 
 		# since source warehouse is Rack 1, rule 1 (for Rack 1) will be avoided
 		# even though it has more free space and higher priority
 		self.assertEqual(stock_entry_item.t_warehouse, self.warehouse_2)
-		self.assertEqual(stock_entry_item.qty, 100) # unassigned 100 out of 200 Kg
+		self.assertEqual(stock_entry_item.qty, 100)  # unassigned 100 out of 200 Kg
 		self.assertEqual(stock_entry_item.putaway_rule, rule_2.name)
 
 		self.assertUnchangedItemsOnResave(stock_entry)
@@ -265,37 +291,48 @@
 
 	def test_putaway_rule_on_stock_entry_material_transfer_reoccuring_item(self):
 		"""Test if reoccuring item is correctly considered."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=300,
-			uom="Kg")
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=600,
-			uom="Kg", priority=2)
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=300, uom="Kg"
+		)
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=600, uom="Kg", priority=2
+		)
 
 		# create SE with first row having source warehouse as Rack 2
-		stock_entry = make_stock_entry(item_code="_Rice", source=self.warehouse_2, qty=200,
-			target="_Test Warehouse - _TC", purpose="Material Transfer",
-			apply_putaway_rule=1, do_not_submit=1)
+		stock_entry = make_stock_entry(
+			item_code="_Rice",
+			source=self.warehouse_2,
+			qty=200,
+			target="_Test Warehouse - _TC",
+			purpose="Material Transfer",
+			apply_putaway_rule=1,
+			do_not_submit=1,
+		)
 
 		# Add rows with source warehouse as Rack 1
-		stock_entry.extend("items", [
-			{
-				"item_code": "_Rice",
-				"s_warehouse": self.warehouse_1,
-				"t_warehouse": "_Test Warehouse - _TC",
-				"qty": 100,
-				"basic_rate": 50,
-				"conversion_factor": 1.0,
-				"transfer_qty": 100
-			},
-			{
-				"item_code": "_Rice",
-				"s_warehouse": self.warehouse_1,
-				"t_warehouse": "_Test Warehouse - _TC",
-				"qty": 200,
-				"basic_rate": 60,
-				"conversion_factor": 1.0,
-				"transfer_qty": 200
-			}
-		])
+		stock_entry.extend(
+			"items",
+			[
+				{
+					"item_code": "_Rice",
+					"s_warehouse": self.warehouse_1,
+					"t_warehouse": "_Test Warehouse - _TC",
+					"qty": 100,
+					"basic_rate": 50,
+					"conversion_factor": 1.0,
+					"transfer_qty": 100,
+				},
+				{
+					"item_code": "_Rice",
+					"s_warehouse": self.warehouse_1,
+					"t_warehouse": "_Test Warehouse - _TC",
+					"qty": 200,
+					"basic_rate": 60,
+					"conversion_factor": 1.0,
+					"transfer_qty": 200,
+				},
+			],
+		)
 
 		stock_entry.save()
 
@@ -323,19 +360,24 @@
 	def test_putaway_rule_on_stock_entry_material_transfer_batch_serial_item(self):
 		"""Test if batch and serial items are split correctly."""
 		if not frappe.db.exists("Item", "Water Bottle"):
-			make_item("Water Bottle", {
-				"is_stock_item": 1,
-				"has_batch_no" : 1,
-				"create_new_batch": 1,
-				"has_serial_no": 1,
-				"serial_no_series": "BOTTL-.####",
-				"stock_uom": "Nos"
-			})
+			make_item(
+				"Water Bottle",
+				{
+					"is_stock_item": 1,
+					"has_batch_no": 1,
+					"create_new_batch": 1,
+					"has_serial_no": 1,
+					"serial_no_series": "BOTTL-.####",
+					"stock_uom": "Nos",
+				},
+			)
 
-		rule_1 = create_putaway_rule(item_code="Water Bottle", warehouse=self.warehouse_1, capacity=3,
-			uom="Nos")
-		rule_2 = create_putaway_rule(item_code="Water Bottle", warehouse=self.warehouse_2, capacity=2,
-		uom="Nos")
+		rule_1 = create_putaway_rule(
+			item_code="Water Bottle", warehouse=self.warehouse_1, capacity=3, uom="Nos"
+		)
+		rule_2 = create_putaway_rule(
+			item_code="Water Bottle", warehouse=self.warehouse_2, capacity=2, uom="Nos"
+		)
 
 		make_new_batch(batch_id="BOTTL-BATCH-1", item_code="Water Bottle")
 
@@ -344,12 +386,20 @@
 		pr.save()
 		pr.submit()
 
-		serial_nos = frappe.get_list("Serial No", filters={"purchase_document_no": pr.name, "status": "Active"})
+		serial_nos = frappe.get_list(
+			"Serial No", filters={"purchase_document_no": pr.name, "status": "Active"}
+		)
 		serial_nos = [d.name for d in serial_nos]
 
-		stock_entry = make_stock_entry(item_code="Water Bottle", source="_Test Warehouse - _TC", qty=5,
-			target="Finished Goods - _TC", purpose="Material Transfer",
-			apply_putaway_rule=1, do_not_save=1)
+		stock_entry = make_stock_entry(
+			item_code="Water Bottle",
+			source="_Test Warehouse - _TC",
+			qty=5,
+			target="Finished Goods - _TC",
+			purpose="Material Transfer",
+			apply_putaway_rule=1,
+			do_not_save=1,
+		)
 		stock_entry.items[0].batch_no = "BOTTL-BATCH-1"
 		stock_entry.items[0].serial_no = "\n".join(serial_nos)
 		stock_entry.save()
@@ -375,14 +425,21 @@
 
 	def test_putaway_rule_on_stock_entry_material_receipt(self):
 		"""Test if rules are applied in Stock Entry of type Receipt."""
-		rule_1 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_1, capacity=200,
-			uom="Kg") # more capacity
-		rule_2 = create_putaway_rule(item_code="_Rice", warehouse=self.warehouse_2, capacity=100,
-			uom="Kg")
+		rule_1 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_1, capacity=200, uom="Kg"
+		)  # more capacity
+		rule_2 = create_putaway_rule(
+			item_code="_Rice", warehouse=self.warehouse_2, capacity=100, uom="Kg"
+		)
 
-		stock_entry = make_stock_entry(item_code="_Rice", qty=100,
-			target="_Test Warehouse - _TC", purpose="Material Receipt",
-			apply_putaway_rule=1, do_not_submit=1)
+		stock_entry = make_stock_entry(
+			item_code="_Rice",
+			qty=100,
+			target="_Test Warehouse - _TC",
+			purpose="Material Receipt",
+			apply_putaway_rule=1,
+			do_not_submit=1,
+		)
 
 		stock_entry_item = stock_entry.get("items")[0]
 
@@ -400,8 +457,7 @@
 		from erpnext.stock.dashboard.warehouse_capacity_dashboard import get_data
 
 		item = "_Rice"
-		rule = create_putaway_rule(item_code=item, warehouse=self.warehouse_1, capacity=500,
-			uom="Kg")
+		rule = create_putaway_rule(item_code=item, warehouse=self.warehouse_1, capacity=500, uom="Kg")
 
 		capacities = get_data(warehouse=self.warehouse_1)
 		for capacity in capacities:
@@ -411,6 +467,7 @@
 		get_data(warehouse=self.warehouse_1)
 		rule.delete()
 
+
 def create_putaway_rule(**args):
 	args = frappe._dict(args)
 	putaway = frappe.new_doc("Putaway Rule")
@@ -423,7 +480,9 @@
 	putaway.capacity = args.capacity or 1
 	putaway.stock_uom = frappe.db.get_value("Item", putaway.item_code, "stock_uom")
 	putaway.uom = args.uom or putaway.stock_uom
-	putaway.conversion_factor = get_conversion_factor(putaway.item_code, putaway.uom)['conversion_factor']
+	putaway.conversion_factor = get_conversion_factor(putaway.item_code, putaway.uom)[
+		"conversion_factor"
+	]
 
 	if not args.do_not_save:
 		putaway.save()
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 4e3b80a..331d3e8 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -18,8 +18,8 @@
 		if not self.readings and self.item_code:
 			self.get_item_specification_details()
 
-		if self.inspection_type=="In Process" and self.reference_type=="Job Card":
-			item_qi_template = frappe.db.get_value("Item", self.item_code, 'quality_inspection_template')
+		if self.inspection_type == "In Process" and self.reference_type == "Job Card":
+			item_qi_template = frappe.db.get_value("Item", self.item_code, "quality_inspection_template")
 			parameters = get_template_details(item_qi_template)
 			for reading in self.readings:
 				for d in parameters:
@@ -33,26 +33,28 @@
 	@frappe.whitelist()
 	def get_item_specification_details(self):
 		if not self.quality_inspection_template:
-			self.quality_inspection_template = frappe.db.get_value('Item',
-				self.item_code, 'quality_inspection_template')
+			self.quality_inspection_template = frappe.db.get_value(
+				"Item", self.item_code, "quality_inspection_template"
+			)
 
-		if not self.quality_inspection_template: return
+		if not self.quality_inspection_template:
+			return
 
-		self.set('readings', [])
+		self.set("readings", [])
 		parameters = get_template_details(self.quality_inspection_template)
 		for d in parameters:
-			child = self.append('readings', {})
+			child = self.append("readings", {})
 			child.update(d)
 			child.status = "Accepted"
 
 	@frappe.whitelist()
 	def get_quality_inspection_template(self):
-		template = ''
+		template = ""
 		if self.bom_no:
-			template = frappe.db.get_value('BOM', self.bom_no, 'quality_inspection_template')
+			template = frappe.db.get_value("BOM", self.bom_no, "quality_inspection_template")
 
 		if not template:
-			template = frappe.db.get_value('BOM', self.item_code, 'quality_inspection_template')
+			template = frappe.db.get_value("BOM", self.item_code, "quality_inspection_template")
 
 		self.quality_inspection_template = template
 		self.get_item_specification_details()
@@ -66,21 +68,25 @@
 	def update_qc_reference(self):
 		quality_inspection = self.name if self.docstatus == 1 else ""
 
-		if self.reference_type == 'Job Card':
+		if self.reference_type == "Job Card":
 			if self.reference_name:
-				frappe.db.sql("""
+				frappe.db.sql(
+					"""
 					UPDATE `tab{doctype}`
 					SET quality_inspection = %s, modified = %s
 					WHERE name = %s and production_item = %s
-				""".format(doctype=self.reference_type),
-					(quality_inspection, self.modified, self.reference_name, self.item_code))
+				""".format(
+						doctype=self.reference_type
+					),
+					(quality_inspection, self.modified, self.reference_name, self.item_code),
+				)
 
 		else:
 			args = [quality_inspection, self.modified, self.reference_name, self.item_code]
-			doctype = self.reference_type + ' Item'
+			doctype = self.reference_type + " Item"
 
-			if self.reference_type == 'Stock Entry':
-				doctype = 'Stock Entry Detail'
+			if self.reference_type == "Stock Entry":
+				doctype = "Stock Entry Detail"
 
 			if self.reference_type and self.reference_name:
 				conditions = ""
@@ -88,11 +94,12 @@
 					conditions += " and t1.batch_no = %s"
 					args.append(self.batch_no)
 
-				if self.docstatus == 2: # if cancel, then remove qi link wherever same name
+				if self.docstatus == 2:  # if cancel, then remove qi link wherever same name
 					conditions += " and t1.quality_inspection = %s"
 					args.append(self.name)
 
-				frappe.db.sql("""
+				frappe.db.sql(
+					"""
 					UPDATE
 						`tab{child_doc}` t1, `tab{parent_doc}` t2
 					SET
@@ -102,12 +109,15 @@
 						and t1.item_code = %s
 						and t1.parent = t2.name
 						{conditions}
-				""".format(parent_doc=self.reference_type, child_doc=doctype, conditions=conditions),
-					args)
+				""".format(
+						parent_doc=self.reference_type, child_doc=doctype, conditions=conditions
+					),
+					args,
+				)
 
 	def inspect_and_set_status(self):
 		for reading in self.readings:
-			if not reading.manual_inspection: # dont auto set status if manual
+			if not reading.manual_inspection:  # dont auto set status if manual
 				if reading.formula_based_criteria:
 					self.set_status_based_on_acceptance_formula(reading)
 				else:
@@ -129,13 +139,16 @@
 			reading_value = reading.get("reading_" + str(i))
 			if reading_value is not None and reading_value.strip():
 				result = flt(reading.get("min_value")) <= flt(reading_value) <= flt(reading.get("max_value"))
-				if not result: return False
+				if not result:
+					return False
 		return True
 
 	def set_status_based_on_acceptance_formula(self, reading):
 		if not reading.acceptance_formula:
-			frappe.throw(_("Row #{0}: Acceptance Criteria Formula is required.").format(reading.idx),
-				title=_("Missing Formula"))
+			frappe.throw(
+				_("Row #{0}: Acceptance Criteria Formula is required.").format(reading.idx),
+				title=_("Missing Formula"),
+			)
 
 		condition = reading.acceptance_formula
 		data = self.get_formula_evaluation_data(reading)
@@ -145,12 +158,17 @@
 			reading.status = "Accepted" if result else "Rejected"
 		except NameError as e:
 			field = frappe.bold(e.args[0].split()[1])
-			frappe.throw(_("Row #{0}: {1} is not a valid reading field. Please refer to the field description.")
-				.format(reading.idx, field),
-				title=_("Invalid Formula"))
+			frappe.throw(
+				_("Row #{0}: {1} is not a valid reading field. Please refer to the field description.").format(
+					reading.idx, field
+				),
+				title=_("Invalid Formula"),
+			)
 		except Exception:
-			frappe.throw(_("Row #{0}: Acceptance Criteria Formula is incorrect.").format(reading.idx),
-				title=_("Invalid Formula"))
+			frappe.throw(
+				_("Row #{0}: Acceptance Criteria Formula is incorrect.").format(reading.idx),
+				title=_("Invalid Formula"),
+			)
 
 	def get_formula_evaluation_data(self, reading):
 		data = {}
@@ -168,6 +186,7 @@
 	def calculate_mean(self, reading):
 		"""Calculate mean of all non-empty readings."""
 		from statistics import mean
+
 		readings_list = []
 
 		for i in range(1, 11):
@@ -178,65 +197,90 @@
 		actual_mean = mean(readings_list) if readings_list else 0
 		return actual_mean
 
+
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def item_query(doctype, txt, searchfield, start, page_len, filters):
 	if filters.get("from"):
 		from frappe.desk.reportview import get_match_cond
+
 		mcond = get_match_cond(filters["from"])
 		cond, qi_condition = "", "and (quality_inspection is null or quality_inspection = '')"
 
 		if filters.get("parent"):
-			if filters.get('from') in ['Purchase Invoice Item', 'Purchase Receipt Item']\
-					and filters.get("inspection_type") != "In Process":
+			if (
+				filters.get("from") in ["Purchase Invoice Item", "Purchase Receipt Item"]
+				and filters.get("inspection_type") != "In Process"
+			):
 				cond = """and item_code in (select name from `tabItem` where
 					inspection_required_before_purchase = 1)"""
-			elif filters.get('from') in ['Sales Invoice Item', 'Delivery Note Item']\
-					and filters.get("inspection_type") != "In Process":
+			elif (
+				filters.get("from") in ["Sales Invoice Item", "Delivery Note Item"]
+				and filters.get("inspection_type") != "In Process"
+			):
 				cond = """and item_code in (select name from `tabItem` where
 					inspection_required_before_delivery = 1)"""
-			elif filters.get('from') == 'Stock Entry Detail':
+			elif filters.get("from") == "Stock Entry Detail":
 				cond = """and s_warehouse is null"""
 
-			if filters.get('from') in ['Supplier Quotation Item']:
+			if filters.get("from") in ["Supplier Quotation Item"]:
 				qi_condition = ""
 
-			return frappe.db.sql("""
+			return frappe.db.sql(
+				"""
 					SELECT item_code
 					FROM `tab{doc}`
 					WHERE parent=%(parent)s and docstatus < 2 and item_code like %(txt)s
 					{qi_condition} {cond} {mcond}
 					ORDER BY item_code limit {start}, {page_len}
-				""".format(doc=filters.get('from'),
-					cond = cond, mcond = mcond, start = start,
-					page_len = page_len, qi_condition = qi_condition),
-					{'parent': filters.get('parent'), 'txt': "%%%s%%" % txt})
+				""".format(
+					doc=filters.get("from"),
+					cond=cond,
+					mcond=mcond,
+					start=start,
+					page_len=page_len,
+					qi_condition=qi_condition,
+				),
+				{"parent": filters.get("parent"), "txt": "%%%s%%" % txt},
+			)
 
 		elif filters.get("reference_name"):
-			return frappe.db.sql("""
+			return frappe.db.sql(
+				"""
 					SELECT production_item
 					FROM `tab{doc}`
 					WHERE name = %(reference_name)s and docstatus < 2 and production_item like %(txt)s
 					{qi_condition} {cond} {mcond}
 					ORDER BY production_item
 					LIMIT {start}, {page_len}
-				""".format(doc=filters.get("from"),
-					cond = cond, mcond = mcond, start = start,
-					page_len = page_len, qi_condition = qi_condition),
-					{'reference_name': filters.get('reference_name'), 'txt': "%%%s%%" % txt})
+				""".format(
+					doc=filters.get("from"),
+					cond=cond,
+					mcond=mcond,
+					start=start,
+					page_len=page_len,
+					qi_condition=qi_condition,
+				),
+				{"reference_name": filters.get("reference_name"), "txt": "%%%s%%" % txt},
+			)
+
 
 @frappe.whitelist()
 @frappe.validate_and_sanitize_search_inputs
 def quality_inspection_query(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.get_all('Quality Inspection',
+	return frappe.get_all(
+		"Quality Inspection",
 		limit_start=start,
 		limit_page_length=page_len,
-		filters = {
-			'docstatus': 1,
-			'name': ('like', '%%%s%%' % txt),
-			'item_code': filters.get("item_code"),
-			'reference_name': ('in', [filters.get("reference_name", ''), ''])
-		}, as_list=1)
+		filters={
+			"docstatus": 1,
+			"name": ("like", "%%%s%%" % txt),
+			"item_code": filters.get("item_code"),
+			"reference_name": ("in", [filters.get("reference_name", ""), ""]),
+		},
+		as_list=1,
+	)
+
 
 @frappe.whitelist()
 def make_quality_inspection(source_name, target_doc=None):
@@ -244,19 +288,18 @@
 		doc.inspected_by = frappe.session.user
 		doc.get_quality_inspection_template()
 
-	doc = get_mapped_doc("BOM", source_name, {
-		'BOM': {
-			"doctype": "Quality Inspection",
-			"validation": {
-				"docstatus": ["=", 1]
-			},
-			"field_map": {
-				"name": "bom_no",
-				"item": "item_code",
-				"stock_uom": "uom",
-				"stock_qty": "qty"
-			},
-		}
-	}, target_doc, postprocess)
+	doc = get_mapped_doc(
+		"BOM",
+		source_name,
+		{
+			"BOM": {
+				"doctype": "Quality Inspection",
+				"validation": {"docstatus": ["=", 1]},
+				"field_map": {"name": "bom_no", "item": "item_code", "stock_uom": "uom", "stock_qty": "qty"},
+			}
+		},
+		target_doc,
+		postprocess,
+	)
 
 	return doc
diff --git a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
index 601ca05..144f138 100644
--- a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
@@ -22,16 +22,11 @@
 	def setUp(self):
 		super().setUp()
 		create_item("_Test Item with QA")
-		frappe.db.set_value(
-			"Item", "_Test Item with QA", "inspection_required_before_delivery", 1
-		)
+		frappe.db.set_value("Item", "_Test Item with QA", "inspection_required_before_delivery", 1)
 
 	def test_qa_for_delivery(self):
 		make_stock_entry(
-			item_code="_Test Item with QA",
-			target="_Test Warehouse - _TC",
-			qty=1,
-			basic_rate=100
+			item_code="_Test Item with QA", target="_Test Warehouse - _TC", qty=1, basic_rate=100
 		)
 		dn = create_delivery_note(item_code="_Test Item with QA", do_not_submit=True)
 
@@ -71,21 +66,18 @@
 				"specification": "Iron Content",  # numeric reading
 				"min_value": 0.1,
 				"max_value": 0.9,
-				"reading_1": "0.4"
+				"reading_1": "0.4",
 			},
 			{
 				"specification": "Particle Inspection Needed",  # non-numeric reading
 				"numeric": 0,
 				"value": "Yes",
-				"reading_value": "Yes"
-			}
+				"reading_value": "Yes",
+			},
 		]
 
 		qa = create_quality_inspection(
-			reference_type="Delivery Note",
-			reference_name=dn.name,
-			readings=readings,
-			do_not_save=True
+			reference_type="Delivery Note", reference_name=dn.name, readings=readings, do_not_save=True
 		)
 
 		qa.save()
@@ -104,13 +96,13 @@
 				"specification": "Iron Content",  # numeric reading
 				"formula_based_criteria": 1,
 				"acceptance_formula": "reading_1 > 0.35 and reading_1 < 0.50",
-				"reading_1": "0.4"
+				"reading_1": "0.4",
 			},
 			{
 				"specification": "Calcium Content",  # numeric reading
 				"formula_based_criteria": 1,
 				"acceptance_formula": "reading_1 > 0.20 and reading_1 < 0.50",
-				"reading_1": "0.7"
+				"reading_1": "0.7",
 			},
 			{
 				"specification": "Mg Content",  # numeric reading
@@ -118,22 +110,19 @@
 				"acceptance_formula": "mean < 0.9",
 				"reading_1": "0.5",
 				"reading_2": "0.7",
-				"reading_3": "random text"  # check if random string input causes issues
+				"reading_3": "random text",  # check if random string input causes issues
 			},
 			{
 				"specification": "Calcium Content",  # non-numeric reading
 				"formula_based_criteria": 1,
 				"numeric": 0,
 				"acceptance_formula": "reading_value in ('Grade A', 'Grade B', 'Grade C')",
-				"reading_value": "Grade B"
-			}
+				"reading_value": "Grade B",
+			},
 		]
 
 		qa = create_quality_inspection(
-			reference_type="Delivery Note",
-			reference_name=dn.name,
-			readings=readings,
-			do_not_save=True
+			reference_type="Delivery Note", reference_name=dn.name, readings=readings, do_not_save=True
 		)
 
 		qa.save()
@@ -167,32 +156,26 @@
 			qty=1,
 			basic_rate=100,
 			inspection_required=True,
-			do_not_submit=True
+			do_not_submit=True,
 		)
 
 		readings = [
-			{
-				"specification": "Iron Content",
-				"min_value": 0.1,
-				"max_value": 0.9,
-				"reading_1": "0.4"
-			}
+			{"specification": "Iron Content", "min_value": 0.1, "max_value": 0.9, "reading_1": "0.4"}
 		]
 
 		qa = create_quality_inspection(
-			reference_type="Stock Entry",
-			reference_name=se.name,
-			readings=readings,
-			status="Rejected"
+			reference_type="Stock Entry", reference_name=se.name, readings=readings, status="Rejected"
 		)
 
 		frappe.db.set_value("Stock Settings", None, "action_if_quality_inspection_is_rejected", "Stop")
 		se.reload()
-		self.assertRaises(QualityInspectionRejectedError, se.submit) # when blocked in Stock settings, block rejected QI
+		self.assertRaises(
+			QualityInspectionRejectedError, se.submit
+		)  # when blocked in Stock settings, block rejected QI
 
 		frappe.db.set_value("Stock Settings", None, "action_if_quality_inspection_is_rejected", "Warn")
 		se.reload()
-		se.submit() # when allowed in Stock settings, allow rejected QI
+		se.submit()  # when allowed in Stock settings, allow rejected QI
 
 		# teardown
 		qa.reload()
@@ -201,6 +184,7 @@
 		se.cancel()
 		frappe.db.set_value("Stock Settings", None, "action_if_quality_inspection_is_rejected", "Stop")
 
+
 def create_quality_inspection(**args):
 	args = frappe._dict(args)
 	qa = frappe.new_doc("Quality Inspection")
@@ -238,8 +222,6 @@
 
 def create_quality_inspection_parameter(parameter):
 	if not frappe.db.exists("Quality Inspection Parameter", parameter):
-		frappe.get_doc({
-			"doctype": "Quality Inspection Parameter",
-			"parameter": parameter,
-			"description": parameter
-		}).insert()
+		frappe.get_doc(
+			{"doctype": "Quality Inspection Parameter", "parameter": parameter, "description": parameter}
+		).insert()
diff --git a/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py b/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py
index 7f8c871..9b8f5d6 100644
--- a/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py
+++ b/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py
@@ -9,11 +9,22 @@
 class QualityInspectionTemplate(Document):
 	pass
 
-def get_template_details(template):
-	if not template: return []
 
-	return frappe.get_all('Item Quality Inspection Parameter',
-		fields=["specification", "value", "acceptance_formula",
-			"numeric", "formula_based_criteria", "min_value", "max_value"],
-		filters={'parenttype': 'Quality Inspection Template', 'parent': template},
-		order_by="idx")
+def get_template_details(template):
+	if not template:
+		return []
+
+	return frappe.get_all(
+		"Item Quality Inspection Parameter",
+		fields=[
+			"specification",
+			"value",
+			"acceptance_formula",
+			"numeric",
+			"formula_based_criteria",
+			"min_value",
+			"max_value",
+		],
+		filters={"parenttype": "Quality Inspection Template", "parent": template},
+		order_by="idx",
+	)
diff --git a/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py b/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py
index 7a0f5d0..846be0b 100644
--- a/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py
+++ b/erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py
@@ -12,24 +12,25 @@
 class QuickStockBalance(Document):
 	pass
 
+
 @frappe.whitelist()
 def get_stock_item_details(warehouse, date, item=None, barcode=None):
 	out = {}
 	if barcode:
 		out["item"] = frappe.db.get_value(
-			"Item Barcode", filters={"barcode": barcode}, fieldname=["parent"])
+			"Item Barcode", filters={"barcode": barcode}, fieldname=["parent"]
+		)
 		if not out["item"]:
-			frappe.throw(
-				_("Invalid Barcode. There is no Item attached to this barcode."))
+			frappe.throw(_("Invalid Barcode. There is no Item attached to this barcode."))
 	else:
 		out["item"] = item
 
-	barcodes = frappe.db.get_values("Item Barcode", filters={"parent": out["item"]},
-		fieldname=["barcode"])
+	barcodes = frappe.db.get_values(
+		"Item Barcode", filters={"parent": out["item"]}, fieldname=["barcode"]
+	)
 
 	out["barcodes"] = [x[0] for x in barcodes]
 	out["qty"] = get_stock_balance(out["item"], warehouse, date)
 	out["value"] = get_stock_value_on(warehouse, date, out["item"])
-	out["image"] = frappe.db.get_value("Item",
-		filters={"name": out["item"]}, fieldname=["image"])
+	out["image"] = frappe.db.get_value("Item", filters={"name": out["item"]}, fieldname=["image"])
 	return out
diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
index f8ec784..ec1d140 100644
--- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
@@ -23,7 +23,7 @@
 		self.set_company()
 
 	def reset_field_values(self):
-		if self.based_on == 'Transaction':
+		if self.based_on == "Transaction":
 			self.item_code = None
 			self.warehouse = None
 
@@ -38,20 +38,20 @@
 	def set_status(self, status=None, write=True):
 		status = status or self.status
 		if not status:
-			self.status = 'Queued'
+			self.status = "Queued"
 		else:
 			self.status = status
 		if write:
-			self.db_set('status', self.status)
+			self.db_set("status", self.status)
 
 	def on_submit(self):
 		"""During tests reposts are executed immediately.
 
 		Exceptions:
-			1. "Repost Item Valuation" document has self.flags.dont_run_in_test
-			2. global flag frappe.flags.dont_execute_stock_reposts is set
+		        1. "Repost Item Valuation" document has self.flags.dont_run_in_test
+		        2. global flag frappe.flags.dont_execute_stock_reposts is set
 
-			These flags are useful for asserting real time behaviour like quantity updates.
+		        These flags are useful for asserting real time behaviour like quantity updates.
 		"""
 
 		if not frappe.flags.in_test:
@@ -63,14 +63,14 @@
 
 	@frappe.whitelist()
 	def restart_reposting(self):
-		self.set_status('Queued', write=False)
+		self.set_status("Queued", write=False)
 		self.current_index = 0
 		self.distinct_item_and_warehouse = None
 		self.items_to_be_repost = None
 		self.db_update()
 
 	def deduplicate_similar_repost(self):
-		""" Deduplicate similar reposts based on item-warehouse-posting combination."""
+		"""Deduplicate similar reposts based on item-warehouse-posting combination."""
 		if self.based_on != "Item and Warehouse":
 			return
 
@@ -82,7 +82,8 @@
 			"posting_time": self.posting_time,
 		}
 
-		frappe.db.sql("""
+		frappe.db.sql(
+			"""
 			update `tabRepost Item Valuation`
 			set status = 'Skipped'
 			WHERE item_code = %(item_code)s
@@ -93,9 +94,10 @@
 				and status = 'Queued'
 				and based_on = 'Item and Warehouse'
 				""",
-			filters
+			filters,
 		)
 
+
 def on_doctype_update():
 	frappe.db.add_index("Repost Item Valuation", ["warehouse", "item_code"], "item_warehouse")
 
@@ -105,14 +107,14 @@
 		if not frappe.db.exists("Repost Item Valuation", doc.name):
 			return
 
-		doc.set_status('In Progress')
+		doc.set_status("In Progress")
 		if not frappe.flags.in_test:
 			frappe.db.commit()
 
 		repost_sl_entries(doc)
 		repost_gl_entries(doc)
 
-		doc.set_status('Completed')
+		doc.set_status("Completed")
 
 	except (Exception, JobTimeoutException):
 		frappe.db.rollback()
@@ -122,32 +124,47 @@
 		message = frappe.message_log.pop()
 		if traceback:
 			message += "<br>" + "Traceback: <br>" + traceback
-		frappe.db.set_value(doc.doctype, doc.name, 'error_log', message)
+		frappe.db.set_value(doc.doctype, doc.name, "error_log", message)
 
 		notify_error_to_stock_managers(doc, message)
-		doc.set_status('Failed')
+		doc.set_status("Failed")
 		raise
 	finally:
 		if not frappe.flags.in_test:
 			frappe.db.commit()
 
+
 def repost_sl_entries(doc):
-	if doc.based_on == 'Transaction':
-		repost_future_sle(voucher_type=doc.voucher_type, voucher_no=doc.voucher_no,
-			allow_negative_stock=doc.allow_negative_stock, via_landed_cost_voucher=doc.via_landed_cost_voucher, doc=doc)
+	if doc.based_on == "Transaction":
+		repost_future_sle(
+			voucher_type=doc.voucher_type,
+			voucher_no=doc.voucher_no,
+			allow_negative_stock=doc.allow_negative_stock,
+			via_landed_cost_voucher=doc.via_landed_cost_voucher,
+			doc=doc,
+		)
 	else:
-		repost_future_sle(args=[frappe._dict({
-			"item_code": doc.item_code,
-			"warehouse": doc.warehouse,
-			"posting_date": doc.posting_date,
-			"posting_time": doc.posting_time
-		})], allow_negative_stock=doc.allow_negative_stock, via_landed_cost_voucher=doc.via_landed_cost_voucher)
+		repost_future_sle(
+			args=[
+				frappe._dict(
+					{
+						"item_code": doc.item_code,
+						"warehouse": doc.warehouse,
+						"posting_date": doc.posting_date,
+						"posting_time": doc.posting_time,
+					}
+				)
+			],
+			allow_negative_stock=doc.allow_negative_stock,
+			via_landed_cost_voucher=doc.via_landed_cost_voucher,
+		)
+
 
 def repost_gl_entries(doc):
 	if not cint(erpnext.is_perpetual_inventory_enabled(doc.company)):
 		return
 
-	if doc.based_on == 'Transaction':
+	if doc.based_on == "Transaction":
 		ref_doc = frappe.get_doc(doc.voucher_type, doc.voucher_no)
 		doc_items, doc_warehouses = ref_doc.get_items_and_warehouses()
 
@@ -161,8 +178,14 @@
 		items = [doc.item_code]
 		warehouses = [doc.warehouse]
 
-	update_gl_entries_after(doc.posting_date, doc.posting_time,
-		for_warehouses=warehouses, for_items=items, company=doc.company)
+	update_gl_entries_after(
+		doc.posting_date,
+		doc.posting_time,
+		for_warehouses=warehouses,
+		for_items=items,
+		company=doc.company,
+	)
+
 
 def notify_error_to_stock_managers(doc, traceback):
 	recipients = get_users_with_role("Stock Manager")
@@ -170,13 +193,20 @@
 		get_users_with_role("System Manager")
 
 	subject = _("Error while reposting item valuation")
-	message = (_("Hi,") + "<br>"
-		+ _("An error has been appeared while reposting item valuation via {0}")
-			.format(get_link_to_form(doc.doctype, doc.name)) + "<br>"
-		+ _("Please check the error message and take necessary actions to fix the error and then restart the reposting again.")
+	message = (
+		_("Hi,")
+		+ "<br>"
+		+ _("An error has been appeared while reposting item valuation via {0}").format(
+			get_link_to_form(doc.doctype, doc.name)
+		)
+		+ "<br>"
+		+ _(
+			"Please check the error message and take necessary actions to fix the error and then restart the reposting again."
+		)
 	)
 	frappe.sendmail(recipients=recipients, subject=subject, message=message)
 
+
 def repost_entries():
 	if not in_configured_timeslot():
 		return
@@ -184,8 +214,8 @@
 	riv_entries = get_repost_item_valuation_entries()
 
 	for row in riv_entries:
-		doc = frappe.get_doc('Repost Item Valuation', row.name)
-		if doc.status in ('Queued', 'In Progress'):
+		doc = frappe.get_doc("Repost Item Valuation", row.name)
+		if doc.status in ("Queued", "In Progress"):
 			repost(doc)
 			doc.deduplicate_similar_repost()
 
@@ -193,14 +223,19 @@
 	if riv_entries:
 		return
 
-	for d in frappe.get_all('Company', filters= {'enable_perpetual_inventory': 1}):
+	for d in frappe.get_all("Company", filters={"enable_perpetual_inventory": 1}):
 		check_if_stock_and_account_balance_synced(today(), d.name)
 
+
 def get_repost_item_valuation_entries():
-	return frappe.db.sql(""" SELECT name from `tabRepost Item Valuation`
+	return frappe.db.sql(
+		""" SELECT name from `tabRepost Item Valuation`
 		WHERE status in ('Queued', 'In Progress') and creation <= %s and docstatus = 1
 		ORDER BY timestamp(posting_date, posting_time) asc, creation asc
-	""", now(), as_dict=1)
+	""",
+		now(),
+		as_dict=1,
+	)
 
 
 def in_configured_timeslot(repost_settings=None, current_time=None):
diff --git a/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
index 78b432d..f3bebad 100644
--- a/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
@@ -153,7 +153,7 @@
 			posting_date=today,
 			posting_time="00:01:00",
 		)
-		riv.flags.dont_run_in_test = True # keep it queued
+		riv.flags.dont_run_in_test = True  # keep it queued
 		riv.submit()
 
 		stock_settings = frappe.get_doc("Stock Settings")
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 2808c21..316c897 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -24,16 +24,45 @@
 from erpnext.stock.get_item_details import get_reserved_qty_for_so
 
 
-class SerialNoCannotCreateDirectError(ValidationError): pass
-class SerialNoCannotCannotChangeError(ValidationError): pass
-class SerialNoNotRequiredError(ValidationError): pass
-class SerialNoRequiredError(ValidationError): pass
-class SerialNoQtyError(ValidationError): pass
-class SerialNoItemError(ValidationError): pass
-class SerialNoWarehouseError(ValidationError): pass
-class SerialNoBatchError(ValidationError): pass
-class SerialNoNotExistsError(ValidationError): pass
-class SerialNoDuplicateError(ValidationError): pass
+class SerialNoCannotCreateDirectError(ValidationError):
+	pass
+
+
+class SerialNoCannotCannotChangeError(ValidationError):
+	pass
+
+
+class SerialNoNotRequiredError(ValidationError):
+	pass
+
+
+class SerialNoRequiredError(ValidationError):
+	pass
+
+
+class SerialNoQtyError(ValidationError):
+	pass
+
+
+class SerialNoItemError(ValidationError):
+	pass
+
+
+class SerialNoWarehouseError(ValidationError):
+	pass
+
+
+class SerialNoBatchError(ValidationError):
+	pass
+
+
+class SerialNoNotExistsError(ValidationError):
+	pass
+
+
+class SerialNoDuplicateError(ValidationError):
+	pass
+
 
 class SerialNo(StockController):
 	def __init__(self, *args, **kwargs):
@@ -42,7 +71,12 @@
 
 	def validate(self):
 		if self.get("__islocal") and self.warehouse and not self.via_stock_ledger:
-			frappe.throw(_("New Serial No cannot have Warehouse. Warehouse must be set by Stock Entry or Purchase Receipt"), SerialNoCannotCreateDirectError)
+			frappe.throw(
+				_(
+					"New Serial No cannot have Warehouse. Warehouse must be set by Stock Entry or Purchase Receipt"
+				),
+				SerialNoCannotCreateDirectError,
+			)
 
 		self.set_maintenance_status()
 		self.validate_warehouse()
@@ -77,22 +111,21 @@
 
 	def validate_warehouse(self):
 		if not self.get("__islocal"):
-			item_code, warehouse = frappe.db.get_value("Serial No",
-				self.name, ["item_code", "warehouse"])
+			item_code, warehouse = frappe.db.get_value("Serial No", self.name, ["item_code", "warehouse"])
 			if not self.via_stock_ledger and item_code != self.item_code:
-				frappe.throw(_("Item Code cannot be changed for Serial No."),
-					SerialNoCannotCannotChangeError)
+				frappe.throw(_("Item Code cannot be changed for Serial No."), SerialNoCannotCannotChangeError)
 			if not self.via_stock_ledger and warehouse != self.warehouse:
-				frappe.throw(_("Warehouse cannot be changed for Serial No."),
-					SerialNoCannotCannotChangeError)
+				frappe.throw(_("Warehouse cannot be changed for Serial No."), SerialNoCannotCannotChangeError)
 
 	def validate_item(self):
 		"""
-			Validate whether serial no is required for this item
+		Validate whether serial no is required for this item
 		"""
 		item = frappe.get_cached_doc("Item", self.item_code)
-		if item.has_serial_no!=1:
-			frappe.throw(_("Item {0} is not setup for Serial Nos. Check Item master").format(self.item_code))
+		if item.has_serial_no != 1:
+			frappe.throw(
+				_("Item {0} is not setup for Serial Nos. Check Item master").format(self.item_code)
+			)
 
 		self.item_group = item.item_group
 		self.description = item.description
@@ -108,17 +141,24 @@
 			self.purchase_time = purchase_sle.posting_time
 			self.purchase_rate = purchase_sle.incoming_rate
 			if purchase_sle.voucher_type in ("Purchase Receipt", "Purchase Invoice"):
-				self.supplier, self.supplier_name = \
-					frappe.db.get_value(purchase_sle.voucher_type, purchase_sle.voucher_no,
-						["supplier", "supplier_name"])
+				self.supplier, self.supplier_name = frappe.db.get_value(
+					purchase_sle.voucher_type, purchase_sle.voucher_no, ["supplier", "supplier_name"]
+				)
 
 			# If sales return entry
-			if self.purchase_document_type == 'Delivery Note':
+			if self.purchase_document_type == "Delivery Note":
 				self.sales_invoice = None
 		else:
-			for fieldname in ("purchase_document_type", "purchase_document_no",
-				"purchase_date", "purchase_time", "purchase_rate", "supplier", "supplier_name"):
-					self.set(fieldname, None)
+			for fieldname in (
+				"purchase_document_type",
+				"purchase_document_no",
+				"purchase_date",
+				"purchase_time",
+				"purchase_rate",
+				"supplier",
+				"supplier_name",
+			):
+				self.set(fieldname, None)
 
 	def set_sales_details(self, delivery_sle):
 		if delivery_sle:
@@ -126,18 +166,25 @@
 			self.delivery_document_no = delivery_sle.voucher_no
 			self.delivery_date = delivery_sle.posting_date
 			self.delivery_time = delivery_sle.posting_time
-			if delivery_sle.voucher_type  in ("Delivery Note", "Sales Invoice"):
-				self.customer, self.customer_name = \
-					frappe.db.get_value(delivery_sle.voucher_type, delivery_sle.voucher_no,
-						["customer", "customer_name"])
+			if delivery_sle.voucher_type in ("Delivery Note", "Sales Invoice"):
+				self.customer, self.customer_name = frappe.db.get_value(
+					delivery_sle.voucher_type, delivery_sle.voucher_no, ["customer", "customer_name"]
+				)
 			if self.warranty_period:
-				self.warranty_expiry_date	= add_days(cstr(delivery_sle.posting_date),
-					cint(self.warranty_period))
+				self.warranty_expiry_date = add_days(
+					cstr(delivery_sle.posting_date), cint(self.warranty_period)
+				)
 		else:
-			for fieldname in ("delivery_document_type", "delivery_document_no",
-				"delivery_date", "delivery_time", "customer", "customer_name",
-				"warranty_expiry_date"):
-					self.set(fieldname, None)
+			for fieldname in (
+				"delivery_document_type",
+				"delivery_document_no",
+				"delivery_date",
+				"delivery_time",
+				"customer",
+				"customer_name",
+				"warranty_expiry_date",
+			):
+				self.set(fieldname, None)
 
 	def get_last_sle(self, serial_no=None):
 		entries = {}
@@ -159,7 +206,8 @@
 		if not serial_no:
 			serial_no = self.name
 
-		for sle in frappe.db.sql("""
+		for sle in frappe.db.sql(
+			"""
 			SELECT voucher_type, voucher_no,
 				posting_date, posting_time, incoming_rate, actual_qty, serial_no
 			FROM
@@ -175,25 +223,30 @@
 			ORDER BY
 				posting_date desc, posting_time desc, creation desc""",
 			(
-				self.item_code, self.company,
+				self.item_code,
+				self.company,
 				serial_no,
-				serial_no+'\n%',
-				'%\n'+serial_no,
-				'%\n'+serial_no+'\n%'
+				serial_no + "\n%",
+				"%\n" + serial_no,
+				"%\n" + serial_no + "\n%",
 			),
-			as_dict=1):
-				if serial_no.upper() in get_serial_nos(sle.serial_no):
-					if cint(sle.actual_qty) > 0:
-						sle_dict.setdefault("incoming", []).append(sle)
-					else:
-						sle_dict.setdefault("outgoing", []).append(sle)
+			as_dict=1,
+		):
+			if serial_no.upper() in get_serial_nos(sle.serial_no):
+				if cint(sle.actual_qty) > 0:
+					sle_dict.setdefault("incoming", []).append(sle)
+				else:
+					sle_dict.setdefault("outgoing", []).append(sle)
 
 		return sle_dict
 
 	def on_trash(self):
-		sl_entries = frappe.db.sql("""select serial_no from `tabStock Ledger Entry`
+		sl_entries = frappe.db.sql(
+			"""select serial_no from `tabStock Ledger Entry`
 			where serial_no like %s and item_code=%s and is_cancelled=0""",
-			("%%%s%%" % self.name, self.item_code), as_dict=True)
+			("%%%s%%" % self.name, self.item_code),
+			as_dict=True,
+		)
 
 		# Find the exact match
 		sle_exists = False
@@ -203,7 +256,9 @@
 				break
 
 		if sle_exists:
-			frappe.throw(_("Cannot delete Serial No {0}, as it is used in stock transactions").format(self.name))
+			frappe.throw(
+				_("Cannot delete Serial No {0}, as it is used in stock transactions").format(self.name)
+			)
 
 	def update_serial_no_reference(self, serial_no=None):
 		last_sle = self.get_last_sle(serial_no)
@@ -212,57 +267,95 @@
 		self.set_maintenance_status()
 		self.set_status()
 
+
 def process_serial_no(sle):
 	item_det = get_item_details(sle.item_code)
 	validate_serial_no(sle, item_det)
 	update_serial_nos(sle, item_det)
 
+
 def validate_serial_no(sle, item_det):
 	serial_nos = get_serial_nos(sle.serial_no) if sle.serial_no else []
 	validate_material_transfer_entry(sle)
 
-	if item_det.has_serial_no==0:
+	if item_det.has_serial_no == 0:
 		if serial_nos:
-			frappe.throw(_("Item {0} is not setup for Serial Nos. Column must be blank").format(sle.item_code),
-				SerialNoNotRequiredError)
+			frappe.throw(
+				_("Item {0} is not setup for Serial Nos. Column must be blank").format(sle.item_code),
+				SerialNoNotRequiredError,
+			)
 	elif not sle.is_cancelled:
 		if serial_nos:
 			if cint(sle.actual_qty) != flt(sle.actual_qty):
-				frappe.throw(_("Serial No {0} quantity {1} cannot be a fraction").format(sle.item_code, sle.actual_qty))
+				frappe.throw(
+					_("Serial No {0} quantity {1} cannot be a fraction").format(sle.item_code, sle.actual_qty)
+				)
 
 			if len(serial_nos) and len(serial_nos) != abs(cint(sle.actual_qty)):
-				frappe.throw(_("{0} Serial Numbers required for Item {1}. You have provided {2}.").format(abs(sle.actual_qty), sle.item_code, len(serial_nos)),
-					SerialNoQtyError)
+				frappe.throw(
+					_("{0} Serial Numbers required for Item {1}. You have provided {2}.").format(
+						abs(sle.actual_qty), sle.item_code, len(serial_nos)
+					),
+					SerialNoQtyError,
+				)
 
 			if len(serial_nos) != len(set(serial_nos)):
-				frappe.throw(_("Duplicate Serial No entered for Item {0}").format(sle.item_code), SerialNoDuplicateError)
+				frappe.throw(
+					_("Duplicate Serial No entered for Item {0}").format(sle.item_code), SerialNoDuplicateError
+				)
 
 			for serial_no in serial_nos:
 				if frappe.db.exists("Serial No", serial_no):
-					sr = frappe.db.get_value("Serial No", serial_no, ["name", "item_code", "batch_no", "sales_order",
-						"delivery_document_no", "delivery_document_type", "warehouse", "purchase_document_type",
-						"purchase_document_no", "company", "status"], as_dict=1)
+					sr = frappe.db.get_value(
+						"Serial No",
+						serial_no,
+						[
+							"name",
+							"item_code",
+							"batch_no",
+							"sales_order",
+							"delivery_document_no",
+							"delivery_document_type",
+							"warehouse",
+							"purchase_document_type",
+							"purchase_document_no",
+							"company",
+							"status",
+						],
+						as_dict=1,
+					)
 
-					if sr.item_code!=sle.item_code:
+					if sr.item_code != sle.item_code:
 						if not allow_serial_nos_with_different_item(serial_no, sle):
-							frappe.throw(_("Serial No {0} does not belong to Item {1}").format(serial_no,
-								sle.item_code), SerialNoItemError)
+							frappe.throw(
+								_("Serial No {0} does not belong to Item {1}").format(serial_no, sle.item_code),
+								SerialNoItemError,
+							)
 
 					if cint(sle.actual_qty) > 0 and has_serial_no_exists(sr, sle):
 						doc_name = frappe.bold(get_link_to_form(sr.purchase_document_type, sr.purchase_document_no))
-						frappe.throw(_("Serial No {0} has already been received in the {1} #{2}")
-							.format(frappe.bold(serial_no), sr.purchase_document_type, doc_name), SerialNoDuplicateError)
+						frappe.throw(
+							_("Serial No {0} has already been received in the {1} #{2}").format(
+								frappe.bold(serial_no), sr.purchase_document_type, doc_name
+							),
+							SerialNoDuplicateError,
+						)
 
-					if (sr.delivery_document_no and sle.voucher_type not in ['Stock Entry', 'Stock Reconciliation']
-						and sle.voucher_type == sr.delivery_document_type):
-						return_against = frappe.db.get_value(sle.voucher_type, sle.voucher_no, 'return_against')
+					if (
+						sr.delivery_document_no
+						and sle.voucher_type not in ["Stock Entry", "Stock Reconciliation"]
+						and sle.voucher_type == sr.delivery_document_type
+					):
+						return_against = frappe.db.get_value(sle.voucher_type, sle.voucher_no, "return_against")
 						if return_against and return_against != sr.delivery_document_no:
 							frappe.throw(_("Serial no {0} has been already returned").format(sr.name))
 
 					if cint(sle.actual_qty) < 0:
-						if sr.warehouse!=sle.warehouse:
-							frappe.throw(_("Serial No {0} does not belong to Warehouse {1}").format(serial_no,
-								sle.warehouse), SerialNoWarehouseError)
+						if sr.warehouse != sle.warehouse:
+							frappe.throw(
+								_("Serial No {0} does not belong to Warehouse {1}").format(serial_no, sle.warehouse),
+								SerialNoWarehouseError,
+							)
 
 						if not sr.purchase_document_no:
 							frappe.throw(_("Serial No {0} not in stock").format(serial_no), SerialNoNotExistsError)
@@ -270,66 +363,100 @@
 						if sle.voucher_type in ("Delivery Note", "Sales Invoice"):
 
 							if sr.batch_no and sr.batch_no != sle.batch_no:
-								frappe.throw(_("Serial No {0} does not belong to Batch {1}").format(serial_no,
-									sle.batch_no), SerialNoBatchError)
+								frappe.throw(
+									_("Serial No {0} does not belong to Batch {1}").format(serial_no, sle.batch_no),
+									SerialNoBatchError,
+								)
 
 							if not sle.is_cancelled and not sr.warehouse:
-								frappe.throw(_("Serial No {0} does not belong to any Warehouse")
-									.format(serial_no), SerialNoWarehouseError)
+								frappe.throw(
+									_("Serial No {0} does not belong to any Warehouse").format(serial_no),
+									SerialNoWarehouseError,
+								)
 
 							# if Sales Order reference in Serial No validate the Delivery Note or Invoice is against the same
 							if sr.sales_order:
 								if sle.voucher_type == "Sales Invoice":
-									if not frappe.db.exists("Sales Invoice Item", {"parent": sle.voucher_no,
-										"item_code": sle.item_code, "sales_order": sr.sales_order}):
+									if not frappe.db.exists(
+										"Sales Invoice Item",
+										{"parent": sle.voucher_no, "item_code": sle.item_code, "sales_order": sr.sales_order},
+									):
 										frappe.throw(
-											_("Cannot deliver Serial No {0} of item {1} as it is reserved to fullfill Sales Order {2}")
-											.format(sr.name, sle.item_code, sr.sales_order)
+											_(
+												"Cannot deliver Serial No {0} of item {1} as it is reserved to fullfill Sales Order {2}"
+											).format(sr.name, sle.item_code, sr.sales_order)
 										)
 								elif sle.voucher_type == "Delivery Note":
-									if not frappe.db.exists("Delivery Note Item", {"parent": sle.voucher_no,
-										"item_code": sle.item_code, "against_sales_order": sr.sales_order}):
-										invoice = frappe.db.get_value("Delivery Note Item", {"parent": sle.voucher_no,
-											"item_code": sle.item_code}, "against_sales_invoice")
-										if not invoice or frappe.db.exists("Sales Invoice Item",
-											{"parent": invoice, "item_code": sle.item_code,
-											"sales_order": sr.sales_order}):
+									if not frappe.db.exists(
+										"Delivery Note Item",
+										{
+											"parent": sle.voucher_no,
+											"item_code": sle.item_code,
+											"against_sales_order": sr.sales_order,
+										},
+									):
+										invoice = frappe.db.get_value(
+											"Delivery Note Item",
+											{"parent": sle.voucher_no, "item_code": sle.item_code},
+											"against_sales_invoice",
+										)
+										if not invoice or frappe.db.exists(
+											"Sales Invoice Item",
+											{"parent": invoice, "item_code": sle.item_code, "sales_order": sr.sales_order},
+										):
 											frappe.throw(
-												_("Cannot deliver Serial No {0} of item {1} as it is reserved to fullfill Sales Order {2}")
-												.format(sr.name, sle.item_code, sr.sales_order)
+												_(
+													"Cannot deliver Serial No {0} of item {1} as it is reserved to fullfill Sales Order {2}"
+												).format(sr.name, sle.item_code, sr.sales_order)
 											)
 							# if Sales Order reference in Delivery Note or Invoice validate SO reservations for item
 							if sle.voucher_type == "Sales Invoice":
-								sales_order = frappe.db.get_value("Sales Invoice Item", {"parent": sle.voucher_no,
-									"item_code": sle.item_code}, "sales_order")
+								sales_order = frappe.db.get_value(
+									"Sales Invoice Item",
+									{"parent": sle.voucher_no, "item_code": sle.item_code},
+									"sales_order",
+								)
 								if sales_order and get_reserved_qty_for_so(sales_order, sle.item_code):
 									validate_so_serial_no(sr, sales_order)
 							elif sle.voucher_type == "Delivery Note":
-								sales_order = frappe.get_value("Delivery Note Item", {"parent": sle.voucher_no,
-									"item_code": sle.item_code}, "against_sales_order")
+								sales_order = frappe.get_value(
+									"Delivery Note Item",
+									{"parent": sle.voucher_no, "item_code": sle.item_code},
+									"against_sales_order",
+								)
 								if sales_order and get_reserved_qty_for_so(sales_order, sle.item_code):
 									validate_so_serial_no(sr, sales_order)
 								else:
-									sales_invoice = frappe.get_value("Delivery Note Item", {"parent": sle.voucher_no,
-										"item_code": sle.item_code}, "against_sales_invoice")
+									sales_invoice = frappe.get_value(
+										"Delivery Note Item",
+										{"parent": sle.voucher_no, "item_code": sle.item_code},
+										"against_sales_invoice",
+									)
 									if sales_invoice:
-										sales_order = frappe.db.get_value("Sales Invoice Item", {
-											"parent": sales_invoice, "item_code": sle.item_code}, "sales_order")
+										sales_order = frappe.db.get_value(
+											"Sales Invoice Item",
+											{"parent": sales_invoice, "item_code": sle.item_code},
+											"sales_order",
+										)
 										if sales_order and get_reserved_qty_for_so(sales_order, sle.item_code):
 											validate_so_serial_no(sr, sales_order)
 				elif cint(sle.actual_qty) < 0:
 					# transfer out
 					frappe.throw(_("Serial No {0} not in stock").format(serial_no), SerialNoNotExistsError)
 		elif cint(sle.actual_qty) < 0 or not item_det.serial_no_series:
-			frappe.throw(_("Serial Nos Required for Serialized Item {0}").format(sle.item_code),
-				SerialNoRequiredError)
+			frappe.throw(
+				_("Serial Nos Required for Serialized Item {0}").format(sle.item_code), SerialNoRequiredError
+			)
 	elif serial_nos:
 		# SLE is being cancelled and has serial nos
 		for serial_no in serial_nos:
 			check_serial_no_validity_on_cancel(serial_no, sle)
 
+
 def check_serial_no_validity_on_cancel(serial_no, sle):
-	sr = frappe.db.get_value("Serial No", serial_no, ["name", "warehouse", "company", "status"], as_dict=1)
+	sr = frappe.db.get_value(
+		"Serial No", serial_no, ["name", "warehouse", "company", "status"], as_dict=1
+	)
 	sr_link = frappe.utils.get_link_to_form("Serial No", serial_no)
 	doc_link = frappe.utils.get_link_to_form(sle.voucher_type, sle.voucher_no)
 	actual_qty = cint(sle.actual_qty)
@@ -339,57 +466,65 @@
 	if sr and (actual_qty < 0 or is_stock_reco) and (sr.warehouse and sr.warehouse != sle.warehouse):
 		# receipt(inward) is being cancelled
 		msg = _("Cannot cancel {0} {1} as Serial No {2} does not belong to the warehouse {3}").format(
-			sle.voucher_type, doc_link, sr_link, frappe.bold(sle.warehouse))
+			sle.voucher_type, doc_link, sr_link, frappe.bold(sle.warehouse)
+		)
 	elif sr and actual_qty > 0 and not is_stock_reco:
 		# delivery is being cancelled, check for warehouse.
 		if sr.warehouse:
 			# serial no is active in another warehouse/company.
 			msg = _("Cannot cancel {0} {1} as Serial No {2} is active in warehouse {3}").format(
-				sle.voucher_type, doc_link, sr_link, frappe.bold(sr.warehouse))
+				sle.voucher_type, doc_link, sr_link, frappe.bold(sr.warehouse)
+			)
 		elif sr.company != sle.company and sr.status == "Delivered":
 			# serial no is inactive (allowed) or delivered from another company (block).
 			msg = _("Cannot cancel {0} {1} as Serial No {2} does not belong to the company {3}").format(
-				sle.voucher_type, doc_link, sr_link, frappe.bold(sle.company))
+				sle.voucher_type, doc_link, sr_link, frappe.bold(sle.company)
+			)
 
 	if msg:
 		frappe.throw(msg, title=_("Cannot cancel"))
 
-def validate_material_transfer_entry(sle_doc):
-	sle_doc.update({
-		"skip_update_serial_no": False,
-		"skip_serial_no_validaiton": False
-	})
 
-	if (sle_doc.voucher_type == "Stock Entry" and not sle_doc.is_cancelled and
-		frappe.get_cached_value("Stock Entry", sle_doc.voucher_no, "purpose") == "Material Transfer"):
+def validate_material_transfer_entry(sle_doc):
+	sle_doc.update({"skip_update_serial_no": False, "skip_serial_no_validaiton": False})
+
+	if (
+		sle_doc.voucher_type == "Stock Entry"
+		and not sle_doc.is_cancelled
+		and frappe.get_cached_value("Stock Entry", sle_doc.voucher_no, "purpose") == "Material Transfer"
+	):
 		if sle_doc.actual_qty < 0:
 			sle_doc.skip_update_serial_no = True
 		else:
 			sle_doc.skip_serial_no_validaiton = True
 
-def validate_so_serial_no(sr, sales_order):
-	if not sr.sales_order or sr.sales_order!= sales_order:
-		msg = (_("Sales Order {0} has reservation for the item {1}, you can only deliver reserved {1} against {0}.")
-			.format(sales_order, sr.item_code))
 
-		frappe.throw(_("""{0} Serial No {1} cannot be delivered""")
-			.format(msg, sr.name))
+def validate_so_serial_no(sr, sales_order):
+	if not sr.sales_order or sr.sales_order != sales_order:
+		msg = _(
+			"Sales Order {0} has reservation for the item {1}, you can only deliver reserved {1} against {0}."
+		).format(sales_order, sr.item_code)
+
+		frappe.throw(_("""{0} Serial No {1} cannot be delivered""").format(msg, sr.name))
+
 
 def has_serial_no_exists(sn, sle):
-	if (sn.warehouse and not sle.skip_serial_no_validaiton
-		and sle.voucher_type != 'Stock Reconciliation'):
+	if (
+		sn.warehouse and not sle.skip_serial_no_validaiton and sle.voucher_type != "Stock Reconciliation"
+	):
 		return True
 
 	if sn.company != sle.company:
 		return False
 
+
 def allow_serial_nos_with_different_item(sle_serial_no, sle):
 	"""
-		Allows same serial nos for raw materials and finished goods
-		in Manufacture / Repack type Stock Entry
+	Allows same serial nos for raw materials and finished goods
+	in Manufacture / Repack type Stock Entry
 	"""
 	allow_serial_nos = False
-	if sle.voucher_type=="Stock Entry" and cint(sle.actual_qty) > 0:
+	if sle.voucher_type == "Stock Entry" and cint(sle.actual_qty) > 0:
 		stock_entry = frappe.get_cached_doc("Stock Entry", sle.voucher_no)
 		if stock_entry.purpose in ("Repack", "Manufacture"):
 			for d in stock_entry.get("items"):
@@ -400,16 +535,24 @@
 
 	return allow_serial_nos
 
+
 def update_serial_nos(sle, item_det):
-	if sle.skip_update_serial_no: return
-	if not sle.is_cancelled and not sle.serial_no and cint(sle.actual_qty) > 0 \
-			and item_det.has_serial_no == 1 and item_det.serial_no_series:
+	if sle.skip_update_serial_no:
+		return
+	if (
+		not sle.is_cancelled
+		and not sle.serial_no
+		and cint(sle.actual_qty) > 0
+		and item_det.has_serial_no == 1
+		and item_det.serial_no_series
+	):
 		serial_nos = get_auto_serial_nos(item_det.serial_no_series, sle.actual_qty)
 		sle.db_set("serial_no", serial_nos)
 		validate_serial_no(sle, item_det)
 	if sle.serial_no:
 		auto_make_serial_nos(sle)
 
+
 def get_auto_serial_nos(serial_no_series, qty):
 	serial_nos = []
 	for i in range(cint(qty)):
@@ -417,22 +560,24 @@
 
 	return "\n".join(serial_nos)
 
+
 def get_new_serial_number(series):
 	sr_no = make_autoname(series, "Serial No")
 	if frappe.db.exists("Serial No", sr_no):
 		sr_no = get_new_serial_number(series)
 	return sr_no
 
+
 def auto_make_serial_nos(args):
-	serial_nos = get_serial_nos(args.get('serial_no'))
+	serial_nos = get_serial_nos(args.get("serial_no"))
 	created_numbers = []
-	voucher_type = args.get('voucher_type')
-	item_code = args.get('item_code')
+	voucher_type = args.get("voucher_type")
+	item_code = args.get("item_code")
 	for serial_no in serial_nos:
 		is_new = False
 		if frappe.db.exists("Serial No", serial_no):
 			sr = frappe.get_cached_doc("Serial No", serial_no)
-		elif args.get('actual_qty', 0) > 0:
+		elif args.get("actual_qty", 0) > 0:
 			sr = frappe.new_doc("Serial No")
 			is_new = True
 
@@ -440,7 +585,7 @@
 		if is_new:
 			created_numbers.append(sr.name)
 
-	form_links = list(map(lambda d: get_link_to_form('Serial No', d), created_numbers))
+	form_links = list(map(lambda d: get_link_to_form("Serial No", d), created_numbers))
 
 	# Setting up tranlated title field for all cases
 	singular_title = _("Serial Number Created")
@@ -452,29 +597,41 @@
 	if len(form_links) == 1:
 		frappe.msgprint(_("Serial No {0} Created").format(form_links[0]), singular_title)
 	elif len(form_links) > 0:
-		message = _("The following serial numbers were created: <br><br> {0}").format(get_items_html(form_links, item_code))
+		message = _("The following serial numbers were created: <br><br> {0}").format(
+			get_items_html(form_links, item_code)
+		)
 		frappe.msgprint(message, multiple_title)
 
+
 def get_items_html(serial_nos, item_code):
-	body = ', '.join(serial_nos)
-	return '''<details><summary>
+	body = ", ".join(serial_nos)
+	return """<details><summary>
 		<b>{0}:</b> {1} Serial Numbers <span class="caret"></span>
 	</summary>
 	<div class="small">{2}</div></details>
-	'''.format(item_code, len(serial_nos), body)
+	""".format(
+		item_code, len(serial_nos), body
+	)
 
 
 def get_item_details(item_code):
-	return frappe.db.sql("""select name, has_batch_no, docstatus,
+	return frappe.db.sql(
+		"""select name, has_batch_no, docstatus,
 		is_stock_item, has_serial_no, serial_no_series
-		from tabItem where name=%s""", item_code, as_dict=True)[0]
+		from tabItem where name=%s""",
+		item_code,
+		as_dict=True,
+	)[0]
+
 
 def get_serial_nos(serial_no):
 	if isinstance(serial_no, list):
 		return serial_no
 
-	return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n')
-		if s.strip()]
+	return [
+		s.strip() for s in cstr(serial_no).strip().upper().replace(",", "\n").split("\n") if s.strip()
+	]
+
 
 def clean_serial_no_string(serial_no: str) -> str:
 	if not serial_no:
@@ -483,20 +640,23 @@
 	serial_no_list = get_serial_nos(serial_no)
 	return "\n".join(serial_no_list)
 
+
 def update_args_for_serial_no(serial_no_doc, serial_no, args, is_new=False):
 	for field in ["item_code", "work_order", "company", "batch_no", "supplier", "location"]:
 		if args.get(field):
 			serial_no_doc.set(field, args.get(field))
 
 	serial_no_doc.via_stock_ledger = args.get("via_stock_ledger") or True
-	serial_no_doc.warehouse = (args.get("warehouse")
-		if args.get("actual_qty", 0) > 0 else None)
+	serial_no_doc.warehouse = args.get("warehouse") if args.get("actual_qty", 0) > 0 else None
 
 	if is_new:
 		serial_no_doc.serial_no = serial_no
 
-	if (serial_no_doc.sales_order and args.get("voucher_type") == "Stock Entry"
-		and not args.get("actual_qty", 0) > 0):
+	if (
+		serial_no_doc.sales_order
+		and args.get("voucher_type") == "Stock Entry"
+		and not args.get("actual_qty", 0) > 0
+	):
 		serial_no_doc.sales_order = None
 
 	serial_no_doc.validate_item()
@@ -509,19 +669,27 @@
 
 	return serial_no_doc
 
-def update_serial_nos_after_submit(controller, parentfield):
-	stock_ledger_entries = frappe.db.sql("""select voucher_detail_no, serial_no, actual_qty, warehouse
-		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
-		(controller.doctype, controller.name), as_dict=True)
 
-	if not stock_ledger_entries: return
+def update_serial_nos_after_submit(controller, parentfield):
+	stock_ledger_entries = frappe.db.sql(
+		"""select voucher_detail_no, serial_no, actual_qty, warehouse
+		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
+		(controller.doctype, controller.name),
+		as_dict=True,
+	)
+
+	if not stock_ledger_entries:
+		return
 
 	for d in controller.get(parentfield):
 		if d.serial_no:
 			continue
 
-		update_rejected_serial_nos = True if (controller.doctype in ("Purchase Receipt", "Purchase Invoice")
-			and d.rejected_qty) else False
+		update_rejected_serial_nos = (
+			True
+			if (controller.doctype in ("Purchase Receipt", "Purchase Invoice") and d.rejected_qty)
+			else False
+		)
 		accepted_serial_nos_updated = False
 
 		if controller.doctype == "Stock Entry":
@@ -532,58 +700,73 @@
 			qty = d.stock_qty
 		else:
 			warehouse = d.warehouse
-			qty = (d.qty if controller.doctype == "Stock Reconciliation"
-				else d.stock_qty)
+			qty = d.qty if controller.doctype == "Stock Reconciliation" else d.stock_qty
 		for sle in stock_ledger_entries:
-			if sle.voucher_detail_no==d.name:
-				if not accepted_serial_nos_updated and qty and abs(sle.actual_qty) == abs(qty) \
-					and sle.warehouse == warehouse and sle.serial_no != d.serial_no:
-						d.serial_no = sle.serial_no
-						frappe.db.set_value(d.doctype, d.name, "serial_no", sle.serial_no)
-						accepted_serial_nos_updated = True
-						if not update_rejected_serial_nos:
-							break
-				elif update_rejected_serial_nos and abs(sle.actual_qty)==d.rejected_qty \
-					and sle.warehouse == d.rejected_warehouse and sle.serial_no != d.rejected_serial_no:
-						d.rejected_serial_no = sle.serial_no
-						frappe.db.set_value(d.doctype, d.name, "rejected_serial_no", sle.serial_no)
-						update_rejected_serial_nos = False
-						if accepted_serial_nos_updated:
-							break
+			if sle.voucher_detail_no == d.name:
+				if (
+					not accepted_serial_nos_updated
+					and qty
+					and abs(sle.actual_qty) == abs(qty)
+					and sle.warehouse == warehouse
+					and sle.serial_no != d.serial_no
+				):
+					d.serial_no = sle.serial_no
+					frappe.db.set_value(d.doctype, d.name, "serial_no", sle.serial_no)
+					accepted_serial_nos_updated = True
+					if not update_rejected_serial_nos:
+						break
+				elif (
+					update_rejected_serial_nos
+					and abs(sle.actual_qty) == d.rejected_qty
+					and sle.warehouse == d.rejected_warehouse
+					and sle.serial_no != d.rejected_serial_no
+				):
+					d.rejected_serial_no = sle.serial_no
+					frappe.db.set_value(d.doctype, d.name, "rejected_serial_no", sle.serial_no)
+					update_rejected_serial_nos = False
+					if accepted_serial_nos_updated:
+						break
+
 
 def update_maintenance_status():
-	serial_nos = frappe.db.sql('''select name from `tabSerial No` where (amc_expiry_date<%s or
-		warranty_expiry_date<%s) and maintenance_status not in ('Out of Warranty', 'Out of AMC')''',
-		(nowdate(), nowdate()))
+	serial_nos = frappe.db.sql(
+		"""select name from `tabSerial No` where (amc_expiry_date<%s or
+		warranty_expiry_date<%s) and maintenance_status not in ('Out of Warranty', 'Out of AMC')""",
+		(nowdate(), nowdate()),
+	)
 	for serial_no in serial_nos:
 		doc = frappe.get_doc("Serial No", serial_no[0])
 		doc.set_maintenance_status()
-		frappe.db.set_value('Serial No', doc.name, 'maintenance_status', doc.maintenance_status)
+		frappe.db.set_value("Serial No", doc.name, "maintenance_status", doc.maintenance_status)
+
 
 def get_delivery_note_serial_no(item_code, qty, delivery_note):
-	serial_nos = ''
-	dn_serial_nos = frappe.db.sql_list(""" select name from `tabSerial No`
+	serial_nos = ""
+	dn_serial_nos = frappe.db.sql_list(
+		""" select name from `tabSerial No`
 		where item_code = %(item_code)s and delivery_document_no = %(delivery_note)s
-		and sales_invoice is null limit {0}""".format(cint(qty)), {
-		'item_code': item_code,
-		'delivery_note': delivery_note
-	})
+		and sales_invoice is null limit {0}""".format(
+			cint(qty)
+		),
+		{"item_code": item_code, "delivery_note": delivery_note},
+	)
 
-	if dn_serial_nos and len(dn_serial_nos)>0:
-		serial_nos = '\n'.join(dn_serial_nos)
+	if dn_serial_nos and len(dn_serial_nos) > 0:
+		serial_nos = "\n".join(dn_serial_nos)
 
 	return serial_nos
 
+
 @frappe.whitelist()
 def auto_fetch_serial_number(
-		qty: float,
-		item_code: str,
-		warehouse: str,
-		posting_date: Optional[str] = None,
-		batch_nos: Optional[Union[str, List[str]]] = None,
-		for_doctype: Optional[str] = None,
-		exclude_sr_nos: Optional[List[str]] = None
-	) -> List[str]:
+	qty: float,
+	item_code: str,
+	warehouse: str,
+	posting_date: Optional[str] = None,
+	batch_nos: Optional[Union[str, List[str]]] = None,
+	for_doctype: Optional[str] = None,
+	exclude_sr_nos: Optional[List[str]] = None,
+) -> List[str]:
 
 	filters = frappe._dict({"item_code": item_code, "warehouse": warehouse})
 
@@ -604,24 +787,26 @@
 		filters.expiry_date = posting_date
 
 	serial_numbers = []
-	if for_doctype == 'POS Invoice':
+	if for_doctype == "POS Invoice":
 		exclude_sr_nos.extend(get_pos_reserved_serial_nos(filters))
 
 	serial_numbers = fetch_serial_numbers(filters, qty, do_not_include=exclude_sr_nos)
 
-	return sorted([d.get('name') for d in serial_numbers])
+	return sorted([d.get("name") for d in serial_numbers])
+
 
 def get_delivered_serial_nos(serial_nos):
-	'''
+	"""
 	Returns serial numbers that delivered from the list of serial numbers
-	'''
+	"""
 	from frappe.query_builder.functions import Coalesce
 
 	SerialNo = frappe.qb.DocType("Serial No")
 	serial_nos = get_serial_nos(serial_nos)
-	query = frappe.qb.select(SerialNo.name).from_(SerialNo).where(
-		(SerialNo.name.isin(serial_nos))
-		& (Coalesce(SerialNo.delivery_document_type, "") != "")
+	query = (
+		frappe.qb.select(SerialNo.name)
+		.from_(SerialNo)
+		.where((SerialNo.name.isin(serial_nos)) & (Coalesce(SerialNo.delivery_document_type, "") != ""))
 	)
 
 	result = query.run()
@@ -629,6 +814,7 @@
 		delivered_serial_nos = [row[0] for row in result]
 		return delivered_serial_nos
 
+
 @frappe.whitelist()
 def get_pos_reserved_serial_nos(filters):
 	if isinstance(filters, str):
@@ -636,21 +822,19 @@
 
 	POSInvoice = frappe.qb.DocType("POS Invoice")
 	POSInvoiceItem = frappe.qb.DocType("POS Invoice Item")
-	query = frappe.qb.from_(
-		POSInvoice
-	).from_(
-		POSInvoiceItem
-	).select(
-		POSInvoice.is_return,
-		POSInvoiceItem.serial_no
-	).where(
-		(POSInvoice.name == POSInvoiceItem.parent)
-		& (POSInvoice.docstatus == 1)
-		& (POSInvoiceItem.docstatus == 1)
-		& (POSInvoiceItem.item_code == filters.get('item_code'))
-		& (POSInvoiceItem.warehouse == filters.get('warehouse'))
-		& (POSInvoiceItem.serial_no.isnotnull())
-		& (POSInvoiceItem.serial_no != '')
+	query = (
+		frappe.qb.from_(POSInvoice)
+		.from_(POSInvoiceItem)
+		.select(POSInvoice.is_return, POSInvoiceItem.serial_no)
+		.where(
+			(POSInvoice.name == POSInvoiceItem.parent)
+			& (POSInvoice.docstatus == 1)
+			& (POSInvoiceItem.docstatus == 1)
+			& (POSInvoiceItem.item_code == filters.get("item_code"))
+			& (POSInvoiceItem.warehouse == filters.get("warehouse"))
+			& (POSInvoiceItem.serial_no.isnotnull())
+			& (POSInvoiceItem.serial_no != "")
+		)
 	)
 
 	pos_transacted_sr_nos = query.run(as_dict=True)
@@ -668,6 +852,7 @@
 
 	return reserved_sr_nos
 
+
 def fetch_serial_numbers(filters, qty, do_not_include=None):
 	if do_not_include is None:
 		do_not_include = []
@@ -677,17 +862,16 @@
 	serial_no = frappe.qb.DocType("Serial No")
 
 	query = (
-		frappe.qb
-			.from_(serial_no)
-			.select(serial_no.name)
-			.where(
-				(serial_no.item_code == filters["item_code"])
-				& (serial_no.warehouse == filters["warehouse"])
-				& (Coalesce(serial_no.sales_invoice, "") == "")
-				& (Coalesce(serial_no.delivery_document_no, "") == "")
-			)
-			.orderby(serial_no.creation)
-			.limit(qty or 1)
+		frappe.qb.from_(serial_no)
+		.select(serial_no.name)
+		.where(
+			(serial_no.item_code == filters["item_code"])
+			& (serial_no.warehouse == filters["warehouse"])
+			& (Coalesce(serial_no.sales_invoice, "") == "")
+			& (Coalesce(serial_no.delivery_document_no, "") == "")
+		)
+		.orderby(serial_no.creation)
+		.limit(qty or 1)
 	)
 
 	if do_not_include:
@@ -698,8 +882,9 @@
 
 	if expiry_date:
 		batch = frappe.qb.DocType("Batch")
-		query = (query
-			.left_join(batch).on(serial_no.batch_no == batch.name)
+		query = (
+			query.left_join(batch)
+			.on(serial_no.batch_no == batch.name)
 			.where(Coalesce(batch.expiry_date, "4000-12-31") >= expiry_date)
 		)
 
diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.py b/erpnext/stock/doctype/serial_no/test_serial_no.py
index 7df0a56..68623fb 100644
--- a/erpnext/stock/doctype/serial_no/test_serial_no.py
+++ b/erpnext/stock/doctype/serial_no/test_serial_no.py
@@ -18,12 +18,10 @@
 from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
 
 test_dependencies = ["Item"]
-test_records = frappe.get_test_records('Serial No')
-
+test_records = frappe.get_test_records("Serial No")
 
 
 class TestSerialNo(FrappeTestCase):
-
 	def tearDown(self):
 		frappe.db.rollback()
 
@@ -48,7 +46,9 @@
 		se = make_serialized_item(target_warehouse="_Test Warehouse - _TC")
 		serial_nos = get_serial_nos(se.get("items")[0].serial_no)
 
-		dn = create_delivery_note(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0])
+		dn = create_delivery_note(
+			item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]
+		)
 
 		serial_no = frappe.get_doc("Serial No", serial_nos[0])
 
@@ -60,8 +60,13 @@
 		self.assertEqual(serial_no.delivery_document_no, dn.name)
 
 		wh = create_warehouse("_Test Warehouse", company="_Test Company 1")
-		pr = make_purchase_receipt(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0],
-			company="_Test Company 1", warehouse=wh)
+		pr = make_purchase_receipt(
+			item_code="_Test Serialized Item With Series",
+			qty=1,
+			serial_no=serial_nos[0],
+			company="_Test Company 1",
+			warehouse=wh,
+		)
 
 		serial_no.reload()
 
@@ -74,9 +79,9 @@
 
 	def test_inter_company_transfer_intermediate_cancellation(self):
 		"""
-			Receive into and Deliver Serial No from one company.
-			Then Receive into and Deliver from second company.
-			Try to cancel intermediate receipts/deliveries to test if it is blocked.
+		Receive into and Deliver Serial No from one company.
+		Then Receive into and Deliver from second company.
+		Try to cancel intermediate receipts/deliveries to test if it is blocked.
 		"""
 		se = make_serialized_item(target_warehouse="_Test Warehouse - _TC")
 		serial_nos = get_serial_nos(se.get("items")[0].serial_no)
@@ -89,8 +94,9 @@
 		self.assertEqual(sn_doc.warehouse, "_Test Warehouse - _TC")
 		self.assertEqual(sn_doc.purchase_document_no, se.name)
 
-		dn = create_delivery_note(item_code="_Test Serialized Item With Series",
-			qty=1, serial_no=serial_nos[0])
+		dn = create_delivery_note(
+			item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]
+		)
 		sn_doc.reload()
 		# check Serial No details after delivery from **first** company
 		self.assertEqual(sn_doc.status, "Delivered")
@@ -104,8 +110,13 @@
 
 		# receive serial no in second company
 		wh = create_warehouse("_Test Warehouse", company="_Test Company 1")
-		pr = make_purchase_receipt(item_code="_Test Serialized Item With Series",
-			qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh)
+		pr = make_purchase_receipt(
+			item_code="_Test Serialized Item With Series",
+			qty=1,
+			serial_no=serial_nos[0],
+			company="_Test Company 1",
+			warehouse=wh,
+		)
 		sn_doc.reload()
 
 		self.assertEqual(sn_doc.warehouse, wh)
@@ -114,8 +125,13 @@
 		self.assertRaises(frappe.ValidationError, dn.cancel)
 
 		# deliver from second company
-		dn_2 = create_delivery_note(item_code="_Test Serialized Item With Series",
-			qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh)
+		dn_2 = create_delivery_note(
+			item_code="_Test Serialized Item With Series",
+			qty=1,
+			serial_no=serial_nos[0],
+			company="_Test Company 1",
+			warehouse=wh,
+		)
 		sn_doc.reload()
 
 		# check Serial No details after delivery from **second** company
@@ -131,9 +147,9 @@
 
 	def test_inter_company_transfer_fallback_on_cancel(self):
 		"""
-			Test Serial No state changes on cancellation.
-			If Delivery cancelled, it should fall back on last Receipt in the same company.
-			If Receipt is cancelled, it should be Inactive in the same company.
+		Test Serial No state changes on cancellation.
+		If Delivery cancelled, it should fall back on last Receipt in the same company.
+		If Receipt is cancelled, it should be Inactive in the same company.
 		"""
 		# Receipt in **first** company
 		se = make_serialized_item(target_warehouse="_Test Warehouse - _TC")
@@ -141,17 +157,28 @@
 		sn_doc = frappe.get_doc("Serial No", serial_nos[0])
 
 		# Delivery from first company
-		dn = create_delivery_note(item_code="_Test Serialized Item With Series",
-			qty=1, serial_no=serial_nos[0])
+		dn = create_delivery_note(
+			item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]
+		)
 
 		# Receipt in **second** company
 		wh = create_warehouse("_Test Warehouse", company="_Test Company 1")
-		pr = make_purchase_receipt(item_code="_Test Serialized Item With Series",
-			qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh)
+		pr = make_purchase_receipt(
+			item_code="_Test Serialized Item With Series",
+			qty=1,
+			serial_no=serial_nos[0],
+			company="_Test Company 1",
+			warehouse=wh,
+		)
 
 		# Delivery from second company
-		dn_2 = create_delivery_note(item_code="_Test Serialized Item With Series",
-			qty=1, serial_no=serial_nos[0], company="_Test Company 1", warehouse=wh)
+		dn_2 = create_delivery_note(
+			item_code="_Test Serialized Item With Series",
+			qty=1,
+			serial_no=serial_nos[0],
+			company="_Test Company 1",
+			warehouse=wh,
+		)
 		sn_doc.reload()
 
 		self.assertEqual(sn_doc.status, "Delivered")
@@ -184,12 +211,11 @@
 
 	def test_auto_creation_of_serial_no(self):
 		"""
-			Test if auto created Serial No excludes existing serial numbers
+		Test if auto created Serial No excludes existing serial numbers
 		"""
-		item_code = make_item("_Test Auto Serial Item ", {
-			"has_serial_no": 1,
-			"serial_no_series": "XYZ.###"
-		}).item_code
+		item_code = make_item(
+			"_Test Auto Serial Item ", {"has_serial_no": 1, "serial_no_series": "XYZ.###"}
+		).item_code
 
 		# Reserve XYZ005
 		pr_1 = make_purchase_receipt(item_code=item_code, qty=1, serial_no="XYZ005")
@@ -203,7 +229,7 @@
 	def test_serial_no_sanitation(self):
 		"Test if Serial No input is sanitised before entering the DB."
 		item_code = "_Test Serialized Item"
-		test_records = frappe.get_test_records('Stock Entry')
+		test_records = frappe.get_test_records("Stock Entry")
 
 		se = frappe.copy_doc(test_records[0])
 		se.get("items")[0].item_code = item_code
@@ -217,37 +243,43 @@
 		self.assertEqual(se.get("items")[0].serial_no, "_TS1\n_TS2\n_TS3\n_TS4 - 2021")
 
 	def test_correct_serial_no_incoming_rate(self):
-		""" Check correct consumption rate based on serial no record.
-		"""
+		"""Check correct consumption rate based on serial no record."""
 		item_code = "_Test Serialized Item"
 		warehouse = "_Test Warehouse - _TC"
 		serial_nos = ["LOWVALUATION", "HIGHVALUATION"]
 
-		in1 = make_stock_entry(item_code=item_code, to_warehouse=warehouse, qty=1, rate=42,
-				serial_no=serial_nos[0])
-		in2 = make_stock_entry(item_code=item_code, to_warehouse=warehouse, qty=1, rate=113,
-				serial_no=serial_nos[1])
+		in1 = make_stock_entry(
+			item_code=item_code, to_warehouse=warehouse, qty=1, rate=42, serial_no=serial_nos[0]
+		)
+		in2 = make_stock_entry(
+			item_code=item_code, to_warehouse=warehouse, qty=1, rate=113, serial_no=serial_nos[1]
+		)
 
-		out = create_delivery_note(item_code=item_code, qty=1, serial_no=serial_nos[0], do_not_submit=True)
+		out = create_delivery_note(
+			item_code=item_code, qty=1, serial_no=serial_nos[0], do_not_submit=True
+		)
 
 		# change serial no
 		out.items[0].serial_no = serial_nos[1]
 		out.save()
 		out.submit()
 
-		value_diff = frappe.db.get_value("Stock Ledger Entry",
-				{"voucher_no": out.name, "voucher_type": "Delivery Note"},
-				"stock_value_difference"
-			)
+		value_diff = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{"voucher_no": out.name, "voucher_type": "Delivery Note"},
+			"stock_value_difference",
+		)
 		self.assertEqual(value_diff, -113)
 
 	def test_auto_fetch(self):
-		item_code = make_item(properties={
-			"has_serial_no": 1,
-			"has_batch_no": 1,
-			"create_new_batch": 1,
-			"serial_no_series": "TEST.#######"
-		}).name
+		item_code = make_item(
+			properties={
+				"has_serial_no": 1,
+				"has_batch_no": 1,
+				"create_new_batch": 1,
+				"serial_no_series": "TEST.#######",
+			}
+		).name
 		warehouse = "_Test Warehouse - _TC"
 
 		in1 = make_stock_entry(item_code=item_code, to_warehouse=warehouse, qty=5)
@@ -260,8 +292,8 @@
 		batch2 = in2.items[0].batch_no
 
 		batch_wise_serials = {
-			batch1 : get_serial_nos(in1.items[0].serial_no),
-			batch2: get_serial_nos(in2.items[0].serial_no)
+			batch1: get_serial_nos(in1.items[0].serial_no),
+			batch2: get_serial_nos(in2.items[0].serial_no),
 		}
 
 		# Test FIFO
@@ -270,12 +302,15 @@
 
 		# partial FIFO
 		partial_fetch = auto_fetch_serial_number(2, item_code, warehouse)
-		self.assertTrue(set(partial_fetch).issubset(set(first_fetch)),
-				msg=f"{partial_fetch} should be subset of {first_fetch}")
+		self.assertTrue(
+			set(partial_fetch).issubset(set(first_fetch)),
+			msg=f"{partial_fetch} should be subset of {first_fetch}",
+		)
 
 		# exclusion
-		remaining = auto_fetch_serial_number(3, item_code, warehouse,
-				exclude_sr_nos=json.dumps(partial_fetch))
+		remaining = auto_fetch_serial_number(
+			3, item_code, warehouse, exclude_sr_nos=json.dumps(partial_fetch)
+		)
 		self.assertEqual(sorted(remaining + partial_fetch), first_fetch)
 
 		# batchwise
@@ -288,10 +323,14 @@
 
 		# multi batch
 		all_serials = [sr for sr_list in batch_wise_serials.values() for sr in sr_list]
-		fetched_serials = auto_fetch_serial_number(10, item_code, warehouse, batch_nos=list(batch_wise_serials.keys()))
+		fetched_serials = auto_fetch_serial_number(
+			10, item_code, warehouse, batch_nos=list(batch_wise_serials.keys())
+		)
 		self.assertEqual(sorted(all_serials), fetched_serials)
 
 		# expiry date
 		frappe.db.set_value("Batch", batch1, "expiry_date", "1980-01-01")
-		non_expired_serials = auto_fetch_serial_number(5, item_code, warehouse, posting_date="2021-01-01", batch_nos=batch1)
+		non_expired_serials = auto_fetch_serial_number(
+			5, item_code, warehouse, posting_date="2021-01-01", batch_nos=batch1
+		)
 		self.assertEqual(non_expired_serials, [])
diff --git a/erpnext/stock/doctype/shipment/shipment.py b/erpnext/stock/doctype/shipment/shipment.py
index 666de57..42a67f4 100644
--- a/erpnext/stock/doctype/shipment/shipment.py
+++ b/erpnext/stock/doctype/shipment/shipment.py
@@ -17,22 +17,22 @@
 		self.validate_pickup_time()
 		self.set_value_of_goods()
 		if self.docstatus == 0:
-			self.status = 'Draft'
+			self.status = "Draft"
 
 	def on_submit(self):
 		if not self.shipment_parcel:
-			frappe.throw(_('Please enter Shipment Parcel information'))
+			frappe.throw(_("Please enter Shipment Parcel information"))
 		if self.value_of_goods == 0:
-			frappe.throw(_('Value of goods cannot be 0'))
-		self.db_set('status', 'Submitted')
+			frappe.throw(_("Value of goods cannot be 0"))
+		self.db_set("status", "Submitted")
 
 	def on_cancel(self):
-		self.db_set('status', 'Cancelled')
+		self.db_set("status", "Cancelled")
 
 	def validate_weight(self):
 		for parcel in self.shipment_parcel:
 			if flt(parcel.weight) <= 0:
-				frappe.throw(_('Parcel weight cannot be 0'))
+				frappe.throw(_("Parcel weight cannot be 0"))
 
 	def validate_pickup_time(self):
 		if self.pickup_from and self.pickup_to and get_time(self.pickup_to) < get_time(self.pickup_from):
@@ -44,26 +44,34 @@
 			value_of_goods += flt(entry.get("grand_total"))
 		self.value_of_goods = value_of_goods if value_of_goods else self.value_of_goods
 
+
 @frappe.whitelist()
 def get_address_name(ref_doctype, docname):
 	# Return address name
 	return get_party_shipping_address(ref_doctype, docname)
 
+
 @frappe.whitelist()
 def get_contact_name(ref_doctype, docname):
 	# Return address name
 	return get_default_contact(ref_doctype, docname)
 
+
 @frappe.whitelist()
 def get_company_contact(user):
-	contact = frappe.db.get_value('User', user, [
-		'first_name',
-		'last_name',
-		'email',
-		'phone',
-		'mobile_no',
-		'gender',
-	], as_dict=1)
+	contact = frappe.db.get_value(
+		"User",
+		user,
+		[
+			"first_name",
+			"last_name",
+			"email",
+			"phone",
+			"mobile_no",
+			"gender",
+		],
+		as_dict=1,
+	)
 	if not contact.phone:
 		contact.phone = contact.mobile_no
 	return contact
diff --git a/erpnext/stock/doctype/shipment/test_shipment.py b/erpnext/stock/doctype/shipment/test_shipment.py
index 317abb6..ae97e7a 100644
--- a/erpnext/stock/doctype/shipment/test_shipment.py
+++ b/erpnext/stock/doctype/shipment/test_shipment.py
@@ -13,13 +13,14 @@
 	def test_shipment_from_delivery_note(self):
 		delivery_note = create_test_delivery_note()
 		delivery_note.submit()
-		shipment = create_test_shipment([ delivery_note ])
+		shipment = create_test_shipment([delivery_note])
 		shipment.submit()
 		second_shipment = make_shipment(delivery_note.name)
 		self.assertEqual(second_shipment.value_of_goods, delivery_note.grand_total)
 		self.assertEqual(len(second_shipment.shipment_delivery_note), 1)
 		self.assertEqual(second_shipment.shipment_delivery_note[0].delivery_note, delivery_note.name)
 
+
 def create_test_delivery_note():
 	company = get_shipment_company()
 	customer = get_shipment_customer()
@@ -30,25 +31,26 @@
 	delivery_note = frappe.new_doc("Delivery Note")
 	delivery_note.company = company.name
 	delivery_note.posting_date = posting_date.strftime("%Y-%m-%d")
-	delivery_note.posting_time = '10:00'
+	delivery_note.posting_time = "10:00"
 	delivery_note.customer = customer.name
-	delivery_note.append('items',
+	delivery_note.append(
+		"items",
 		{
 			"item_code": item.name,
 			"item_name": item.item_name,
-			"description": 'Test delivery note for shipment',
+			"description": "Test delivery note for shipment",
 			"qty": 5,
-			"uom": 'Nos',
-			"warehouse": 'Stores - _TC',
+			"uom": "Nos",
+			"warehouse": "Stores - _TC",
 			"rate": item.standard_rate,
-			"cost_center": 'Main - _TC'
-		}
+			"cost_center": "Main - _TC",
+		},
 	)
 	delivery_note.insert()
 	return delivery_note
 
 
-def create_test_shipment(delivery_notes = None):
+def create_test_shipment(delivery_notes=None):
 	company = get_shipment_company()
 	company_address = get_shipment_company_address(company.name)
 	customer = get_shipment_customer()
@@ -57,45 +59,35 @@
 	posting_date = date.today() + timedelta(days=5)
 
 	shipment = frappe.new_doc("Shipment")
-	shipment.pickup_from_type = 'Company'
+	shipment.pickup_from_type = "Company"
 	shipment.pickup_company = company.name
 	shipment.pickup_address_name = company_address.name
-	shipment.delivery_to_type = 'Customer'
+	shipment.delivery_to_type = "Customer"
 	shipment.delivery_customer = customer.name
 	shipment.delivery_address_name = customer_address.name
 	shipment.delivery_contact_name = customer_contact.name
-	shipment.pallets = 'No'
-	shipment.shipment_type = 'Goods'
+	shipment.pallets = "No"
+	shipment.shipment_type = "Goods"
 	shipment.value_of_goods = 1000
-	shipment.pickup_type = 'Pickup'
+	shipment.pickup_type = "Pickup"
 	shipment.pickup_date = posting_date.strftime("%Y-%m-%d")
-	shipment.pickup_from = '09:00'
-	shipment.pickup_to = '17:00'
-	shipment.description_of_content = 'unit test entry'
+	shipment.pickup_from = "09:00"
+	shipment.pickup_to = "17:00"
+	shipment.description_of_content = "unit test entry"
 	for delivery_note in delivery_notes:
-		shipment.append('shipment_delivery_note',
-			{
-				"delivery_note": delivery_note.name
-			}
-		)
-	shipment.append('shipment_parcel',
-		{
-			"length": 5,
-			"width": 5,
-			"height": 5,
-			"weight": 5,
-			"count": 5
-		}
+		shipment.append("shipment_delivery_note", {"delivery_note": delivery_note.name})
+	shipment.append(
+		"shipment_parcel", {"length": 5, "width": 5, "height": 5, "weight": 5, "count": 5}
 	)
 	shipment.insert()
 	return shipment
 
 
 def get_shipment_customer_contact(customer_name):
-	contact_fname = 'Customer Shipment'
-	contact_lname = 'Testing'
-	customer_name = contact_fname + ' ' + contact_lname
-	contacts = frappe.get_all("Contact", fields=["name"], filters = {"name": customer_name})
+	contact_fname = "Customer Shipment"
+	contact_lname = "Testing"
+	customer_name = contact_fname + " " + contact_lname
+	contacts = frappe.get_all("Contact", fields=["name"], filters={"name": customer_name})
 	if len(contacts):
 		return contacts[0]
 	else:
@@ -103,104 +95,106 @@
 
 
 def get_shipment_customer_address(customer_name):
-	address_title = customer_name + ' address 123'
-	customer_address = frappe.get_all("Address", fields=["name"], filters = {"address_title": address_title})
+	address_title = customer_name + " address 123"
+	customer_address = frappe.get_all(
+		"Address", fields=["name"], filters={"address_title": address_title}
+	)
 	if len(customer_address):
 		return customer_address[0]
 	else:
 		return create_shipment_address(address_title, customer_name, 81929)
 
+
 def get_shipment_customer():
-	customer_name = 'Shipment Customer'
-	customer = frappe.get_all("Customer", fields=["name"], filters = {"name": customer_name})
+	customer_name = "Shipment Customer"
+	customer = frappe.get_all("Customer", fields=["name"], filters={"name": customer_name})
 	if len(customer):
 		return customer[0]
 	else:
 		return create_shipment_customer(customer_name)
 
+
 def get_shipment_company_address(company_name):
-	address_title = company_name + ' address 123'
-	addresses = frappe.get_all("Address", fields=["name"], filters = {"address_title": address_title})
+	address_title = company_name + " address 123"
+	addresses = frappe.get_all("Address", fields=["name"], filters={"address_title": address_title})
 	if len(addresses):
 		return addresses[0]
 	else:
 		return create_shipment_address(address_title, company_name, 80331)
 
+
 def get_shipment_company():
 	return frappe.get_doc("Company", "_Test Company")
 
+
 def get_shipment_item(company_name):
-	item_name = 'Testing Shipment item'
-	items = frappe.get_all("Item",
+	item_name = "Testing Shipment item"
+	items = frappe.get_all(
+		"Item",
 		fields=["name", "item_name", "item_code", "standard_rate"],
-		filters = {"item_name": item_name}
+		filters={"item_name": item_name},
 	)
 	if len(items):
 		return items[0]
 	else:
 		return create_shipment_item(item_name, company_name)
 
+
 def create_shipment_address(address_title, company_name, postal_code):
 	address = frappe.new_doc("Address")
 	address.address_title = address_title
-	address.address_type = 'Shipping'
-	address.address_line1 = company_name + ' address line 1'
-	address.city = 'Random City'
+	address.address_type = "Shipping"
+	address.address_line1 = company_name + " address line 1"
+	address.city = "Random City"
 	address.postal_code = postal_code
-	address.country = 'Germany'
+	address.country = "Germany"
 	address.insert()
 	return address
 
 
 def create_customer_contact(fname, lname):
 	customer = frappe.new_doc("Contact")
-	customer.customer_name = fname + ' ' + lname
+	customer.customer_name = fname + " " + lname
 	customer.first_name = fname
 	customer.last_name = lname
 	customer.is_primary_contact = 1
 	customer.is_billing_contact = 1
-	customer.append('email_ids',
-		{
-			'email_id': 'randomme@email.com',
-			'is_primary': 1
-		}
+	customer.append("email_ids", {"email_id": "randomme@email.com", "is_primary": 1})
+	customer.append(
+		"phone_nos", {"phone": "123123123", "is_primary_phone": 1, "is_primary_mobile_no": 1}
 	)
-	customer.append('phone_nos',
-		{
-			'phone': '123123123',
-			'is_primary_phone': 1,
-			'is_primary_mobile_no': 1
-		}
-	)
-	customer.status = 'Passive'
+	customer.status = "Passive"
 	customer.insert()
 	return customer
 
+
 def create_shipment_customer(customer_name):
 	customer = frappe.new_doc("Customer")
 	customer.customer_name = customer_name
-	customer.customer_type = 'Company'
-	customer.customer_group = 'All Customer Groups'
-	customer.territory = 'All Territories'
-	customer.gst_category = 'Unregistered'
+	customer.customer_type = "Company"
+	customer.customer_group = "All Customer Groups"
+	customer.territory = "All Territories"
+	customer.gst_category = "Unregistered"
 	customer.insert()
 	return customer
 
+
 def create_material_receipt(item, company):
 	posting_date = date.today()
 	stock = frappe.new_doc("Stock Entry")
 	stock.company = company
-	stock.stock_entry_type = 'Material Receipt'
+	stock.stock_entry_type = "Material Receipt"
 	stock.posting_date = posting_date.strftime("%Y-%m-%d")
-	stock.append('items',
+	stock.append(
+		"items",
 		{
-			"t_warehouse": 'Stores - _TC',
+			"t_warehouse": "Stores - _TC",
 			"item_code": item.name,
 			"qty": 5,
-			"uom": 'Nos',
+			"uom": "Nos",
 			"basic_rate": item.standard_rate,
-			"cost_center": 'Main - _TC'
-		}
+			"cost_center": "Main - _TC",
+		},
 	)
 	stock.insert()
 	stock.submit()
@@ -210,14 +204,9 @@
 	item = frappe.new_doc("Item")
 	item.item_name = item_name
 	item.item_code = item_name
-	item.item_group = 'All Item Groups'
-	item.stock_uom = 'Nos'
+	item.item_group = "All Item Groups"
+	item.stock_uom = "Nos"
 	item.standard_rate = 50
-	item.append('item_defaults',
-		{
-			"company": company_name,
-			"default_warehouse": 'Stores - _TC'
-		}
-	)
+	item.append("item_defaults", {"company": company_name, "default_warehouse": "Stores - _TC"})
 	item.insert()
 	return item
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 99cf4de..bc54f7f 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -38,20 +38,28 @@
 
 class FinishedGoodError(frappe.ValidationError):
 	pass
+
+
 class IncorrectValuationRateError(frappe.ValidationError):
 	pass
+
+
 class DuplicateEntryForWorkOrderError(frappe.ValidationError):
 	pass
+
+
 class OperationsNotCompleteError(frappe.ValidationError):
 	pass
+
+
 class MaxSampleAlreadyRetainedError(frappe.ValidationError):
 	pass
 
+
 from erpnext.controllers.stock_controller import StockController
 
-form_grid_templates = {
-	"items": "templates/form_grid/stock_entry_grid.html"
-}
+form_grid_templates = {"items": "templates/form_grid/stock_entry_grid.html"}
+
 
 class StockEntry(StockController):
 	def get_feed(self):
@@ -63,16 +71,18 @@
 
 	def before_validate(self):
 		from erpnext.stock.doctype.putaway_rule.putaway_rule import apply_putaway_rule
-		apply_rule = self.apply_putaway_rule and (self.purpose in ["Material Transfer", "Material Receipt"])
+
+		apply_rule = self.apply_putaway_rule and (
+			self.purpose in ["Material Transfer", "Material Receipt"]
+		)
 
 		if self.get("items") and apply_rule:
-			apply_putaway_rule(self.doctype, self.get("items"), self.company,
-				purpose=self.purpose)
+			apply_putaway_rule(self.doctype, self.get("items"), self.company, purpose=self.purpose)
 
 	def validate(self):
 		self.pro_doc = frappe._dict()
 		if self.work_order:
-			self.pro_doc = frappe.get_doc('Work Order', self.work_order)
+			self.pro_doc = frappe.get_doc("Work Order", self.work_order)
 
 		self.validate_posting_time()
 		self.validate_purpose()
@@ -103,10 +113,10 @@
 		if not self.from_bom:
 			self.fg_completed_qty = 0.0
 
-		if self._action == 'submit':
-			self.make_batches('t_warehouse')
+		if self._action == "submit":
+			self.make_batches("t_warehouse")
 		else:
-			set_batch_nos(self, 's_warehouse')
+			set_batch_nos(self, "s_warehouse")
 
 		self.validate_serialized_batch()
 		self.set_actual_qty()
@@ -138,10 +148,10 @@
 		if self.work_order and self.purpose == "Manufacture":
 			self.update_so_in_serial_number()
 
-		if self.purpose == 'Material Transfer' and self.add_to_transit:
-			self.set_material_request_transfer_status('In Transit')
-		if self.purpose == 'Material Transfer' and self.outgoing_stock_entry:
-			self.set_material_request_transfer_status('Completed')
+		if self.purpose == "Material Transfer" and self.add_to_transit:
+			self.set_material_request_transfer_status("In Transit")
+		if self.purpose == "Material Transfer" and self.outgoing_stock_entry:
+			self.set_material_request_transfer_status("Completed")
 
 	def on_cancel(self):
 		self.update_purchase_order_supplied_items()
@@ -152,7 +162,7 @@
 		self.update_work_order()
 		self.update_stock_ledger()
 
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry', 'Repost Item Valuation')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
 
 		self.make_gl_entries_on_cancel()
 		self.repost_future_sle_and_gle()
@@ -162,15 +172,16 @@
 		self.delete_auto_created_batches()
 		self.delete_linked_stock_entry()
 
-		if self.purpose == 'Material Transfer' and self.add_to_transit:
-			self.set_material_request_transfer_status('Not Started')
-		if self.purpose == 'Material Transfer' and self.outgoing_stock_entry:
-			self.set_material_request_transfer_status('In Transit')
+		if self.purpose == "Material Transfer" and self.add_to_transit:
+			self.set_material_request_transfer_status("Not Started")
+		if self.purpose == "Material Transfer" and self.outgoing_stock_entry:
+			self.set_material_request_transfer_status("In Transit")
 
 	def set_job_card_data(self):
 		if self.job_card and not self.work_order:
-			data = frappe.db.get_value('Job Card',
-				self.job_card, ['for_quantity', 'work_order', 'bom_no'], as_dict=1)
+			data = frappe.db.get_value(
+				"Job Card", self.job_card, ["for_quantity", "work_order", "bom_no"], as_dict=1
+			)
 			self.fg_completed_qty = data.for_quantity
 			self.work_order = data.work_order
 			self.from_bom = 1
@@ -178,25 +189,37 @@
 
 	def validate_work_order_status(self):
 		pro_doc = frappe.get_doc("Work Order", self.work_order)
-		if pro_doc.status == 'Completed':
+		if pro_doc.status == "Completed":
 			frappe.throw(_("Cannot cancel transaction for Completed Work Order."))
 
 	def validate_purpose(self):
-		valid_purposes = ["Material Issue", "Material Receipt", "Material Transfer",
-			"Material Transfer for Manufacture", "Manufacture", "Repack", "Send to Subcontractor",
-			"Material Consumption for Manufacture"]
+		valid_purposes = [
+			"Material Issue",
+			"Material Receipt",
+			"Material Transfer",
+			"Material Transfer for Manufacture",
+			"Manufacture",
+			"Repack",
+			"Send to Subcontractor",
+			"Material Consumption for Manufacture",
+		]
 
 		if self.purpose not in valid_purposes:
 			frappe.throw(_("Purpose must be one of {0}").format(comma_or(valid_purposes)))
 
-		if self.job_card and self.purpose not in ['Material Transfer for Manufacture', 'Repack']:
-			frappe.throw(_("For job card {0}, you can only make the 'Material Transfer for Manufacture' type stock entry")
-				.format(self.job_card))
+		if self.job_card and self.purpose not in ["Material Transfer for Manufacture", "Repack"]:
+			frappe.throw(
+				_(
+					"For job card {0}, you can only make the 'Material Transfer for Manufacture' type stock entry"
+				).format(self.job_card)
+			)
 
 	def delete_linked_stock_entry(self):
 		if self.purpose == "Send to Warehouse":
-			for d in frappe.get_all("Stock Entry", filters={"docstatus": 0,
-				"outgoing_stock_entry": self.name, "purpose": "Receive at Warehouse"}):
+			for d in frappe.get_all(
+				"Stock Entry",
+				filters={"docstatus": 0, "outgoing_stock_entry": self.name, "purpose": "Receive at Warehouse"},
+			):
 				frappe.delete_doc("Stock Entry", d.name)
 
 	def set_transfer_qty(self):
@@ -205,80 +228,117 @@
 				frappe.throw(_("Row {0}: Qty is mandatory").format(item.idx))
 			if not flt(item.conversion_factor):
 				frappe.throw(_("Row {0}: UOM Conversion Factor is mandatory").format(item.idx))
-			item.transfer_qty = flt(flt(item.qty) * flt(item.conversion_factor),
-				self.precision("transfer_qty", item))
+			item.transfer_qty = flt(
+				flt(item.qty) * flt(item.conversion_factor), self.precision("transfer_qty", item)
+			)
 
 	def update_cost_in_project(self):
-		if (self.work_order and not frappe.db.get_value("Work Order",
-			self.work_order, "update_consumed_material_cost_in_project")):
+		if self.work_order and not frappe.db.get_value(
+			"Work Order", self.work_order, "update_consumed_material_cost_in_project"
+		):
 			return
 
 		if self.project:
-			amount = frappe.db.sql(""" select ifnull(sum(sed.amount), 0)
+			amount = frappe.db.sql(
+				""" select ifnull(sum(sed.amount), 0)
 				from
 					`tabStock Entry` se, `tabStock Entry Detail` sed
 				where
 					se.docstatus = 1 and se.project = %s and sed.parent = se.name
-					and (sed.t_warehouse is null or sed.t_warehouse = '')""", self.project, as_list=1)
+					and (sed.t_warehouse is null or sed.t_warehouse = '')""",
+				self.project,
+				as_list=1,
+			)
 
 			amount = amount[0][0] if amount else 0
-			additional_costs = frappe.db.sql(""" select ifnull(sum(sed.base_amount), 0)
+			additional_costs = frappe.db.sql(
+				""" select ifnull(sum(sed.base_amount), 0)
 				from
 					`tabStock Entry` se, `tabLanded Cost Taxes and Charges` sed
 				where
 					se.docstatus = 1 and se.project = %s and sed.parent = se.name
-					and se.purpose = 'Manufacture'""", self.project, as_list=1)
+					and se.purpose = 'Manufacture'""",
+				self.project,
+				as_list=1,
+			)
 
 			additional_cost_amt = additional_costs[0][0] if additional_costs else 0
 
 			amount += additional_cost_amt
-			frappe.db.set_value('Project', self.project, 'total_consumed_material_cost', amount)
+			frappe.db.set_value("Project", self.project, "total_consumed_material_cost", amount)
 
 	def validate_item(self):
 		stock_items = self.get_stock_items()
 		serialized_items = self.get_serialized_items()
 		for item in self.get("items"):
 			if flt(item.qty) and flt(item.qty) < 0:
-				frappe.throw(_("Row {0}: The item {1}, quantity must be positive number")
-					.format(item.idx, frappe.bold(item.item_code)))
+				frappe.throw(
+					_("Row {0}: The item {1}, quantity must be positive number").format(
+						item.idx, frappe.bold(item.item_code)
+					)
+				)
 
 			if item.item_code not in stock_items:
 				frappe.throw(_("{0} is not a stock Item").format(item.item_code))
 
-			item_details = self.get_item_details(frappe._dict(
-				{"item_code": item.item_code, "company": self.company,
-				"project": self.project, "uom": item.uom, 's_warehouse': item.s_warehouse}),
-				for_update=True)
+			item_details = self.get_item_details(
+				frappe._dict(
+					{
+						"item_code": item.item_code,
+						"company": self.company,
+						"project": self.project,
+						"uom": item.uom,
+						"s_warehouse": item.s_warehouse,
+					}
+				),
+				for_update=True,
+			)
 
-			for f in ("uom", "stock_uom", "description", "item_name", "expense_account",
-				"cost_center", "conversion_factor"):
-					if f == "stock_uom" or not item.get(f):
-						item.set(f, item_details.get(f))
-					if f == 'conversion_factor' and item.uom == item_details.get('stock_uom'):
-						item.set(f, item_details.get(f))
+			for f in (
+				"uom",
+				"stock_uom",
+				"description",
+				"item_name",
+				"expense_account",
+				"cost_center",
+				"conversion_factor",
+			):
+				if f == "stock_uom" or not item.get(f):
+					item.set(f, item_details.get(f))
+				if f == "conversion_factor" and item.uom == item_details.get("stock_uom"):
+					item.set(f, item_details.get(f))
 
 			if not item.transfer_qty and item.qty:
-				item.transfer_qty = flt(flt(item.qty) * flt(item.conversion_factor),
-				self.precision("transfer_qty", item))
+				item.transfer_qty = flt(
+					flt(item.qty) * flt(item.conversion_factor), self.precision("transfer_qty", item)
+				)
 
-			if (self.purpose in ("Material Transfer", "Material Transfer for Manufacture")
+			if (
+				self.purpose in ("Material Transfer", "Material Transfer for Manufacture")
 				and not item.serial_no
-				and item.item_code in serialized_items):
-				frappe.throw(_("Row #{0}: Please specify Serial No for Item {1}").format(item.idx, item.item_code),
-					frappe.MandatoryError)
+				and item.item_code in serialized_items
+			):
+				frappe.throw(
+					_("Row #{0}: Please specify Serial No for Item {1}").format(item.idx, item.item_code),
+					frappe.MandatoryError,
+				)
 
 	def validate_qty(self):
 		manufacture_purpose = ["Manufacture", "Material Consumption for Manufacture"]
 
 		if self.purpose in manufacture_purpose and self.work_order:
-			if not frappe.get_value('Work Order', self.work_order, 'skip_transfer'):
+			if not frappe.get_value("Work Order", self.work_order, "skip_transfer"):
 				item_code = []
 				for item in self.items:
-					if cstr(item.t_warehouse) == '':
-						req_items = frappe.get_all('Work Order Item',
-										filters={'parent': self.work_order, 'item_code': item.item_code}, fields=["item_code"])
+					if cstr(item.t_warehouse) == "":
+						req_items = frappe.get_all(
+							"Work Order Item",
+							filters={"parent": self.work_order, "item_code": item.item_code},
+							fields=["item_code"],
+						)
 
-						transferred_materials = frappe.db.sql("""
+						transferred_materials = frappe.db.sql(
+							"""
 									select
 										sum(qty) as qty
 									from `tabStock Entry` se,`tabStock Entry Detail` sed
@@ -286,7 +346,10 @@
 										se.name = sed.parent and se.docstatus=1 and
 										(se.purpose='Material Transfer for Manufacture' or se.purpose='Manufacture')
 										and sed.item_code=%s and se.work_order= %s and ifnull(sed.t_warehouse, '') != ''
-								""", (item.item_code, self.work_order), as_dict=1)
+								""",
+							(item.item_code, self.work_order),
+							as_dict=1,
+						)
 
 						stock_qty = flt(item.qty)
 						trans_qty = flt(transferred_materials[0].qty)
@@ -304,8 +367,11 @@
 		for item_code, qty_list in item_wise_qty.items():
 			total = flt(sum(qty_list), frappe.get_precision("Stock Entry Detail", "qty"))
 			if self.fg_completed_qty != total:
-				frappe.throw(_("The finished product {0} quantity {1} and For Quantity {2} cannot be different")
-					.format(frappe.bold(item_code), frappe.bold(total), frappe.bold(self.fg_completed_qty)))
+				frappe.throw(
+					_("The finished product {0} quantity {1} and For Quantity {2} cannot be different").format(
+						frappe.bold(item_code), frappe.bold(total), frappe.bold(self.fg_completed_qty)
+					)
+				)
 
 	def validate_difference_account(self):
 		if not cint(erpnext.is_perpetual_inventory_enabled(self.company)):
@@ -313,33 +379,53 @@
 
 		for d in self.get("items"):
 			if not d.expense_account:
-				frappe.throw(_("Please enter <b>Difference Account</b> or set default <b>Stock Adjustment Account</b> for company {0}")
-					.format(frappe.bold(self.company)))
+				frappe.throw(
+					_(
+						"Please enter <b>Difference Account</b> or set default <b>Stock Adjustment Account</b> for company {0}"
+					).format(frappe.bold(self.company))
+				)
 
-			elif self.is_opening == "Yes" and frappe.db.get_value("Account", d.expense_account, "report_type") == "Profit and Loss":
-				frappe.throw(_("Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry"), OpeningEntryAccountError)
+			elif (
+				self.is_opening == "Yes"
+				and frappe.db.get_value("Account", d.expense_account, "report_type") == "Profit and Loss"
+			):
+				frappe.throw(
+					_(
+						"Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry"
+					),
+					OpeningEntryAccountError,
+				)
 
 	def validate_warehouse(self):
 		"""perform various (sometimes conditional) validations on warehouse"""
 
-		source_mandatory = ["Material Issue", "Material Transfer", "Send to Subcontractor", "Material Transfer for Manufacture",
-			"Material Consumption for Manufacture"]
+		source_mandatory = [
+			"Material Issue",
+			"Material Transfer",
+			"Send to Subcontractor",
+			"Material Transfer for Manufacture",
+			"Material Consumption for Manufacture",
+		]
 
-		target_mandatory = ["Material Receipt", "Material Transfer", "Send to Subcontractor",
-			"Material Transfer for Manufacture"]
+		target_mandatory = [
+			"Material Receipt",
+			"Material Transfer",
+			"Send to Subcontractor",
+			"Material Transfer for Manufacture",
+		]
 
 		validate_for_manufacture = any([d.bom_no for d in self.get("items")])
 
 		if self.purpose in source_mandatory and self.purpose not in target_mandatory:
 			self.to_warehouse = None
-			for d in self.get('items'):
+			for d in self.get("items"):
 				d.t_warehouse = None
 		elif self.purpose in target_mandatory and self.purpose not in source_mandatory:
 			self.from_warehouse = None
-			for d in self.get('items'):
+			for d in self.get("items"):
 				d.s_warehouse = None
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if not d.s_warehouse and not d.t_warehouse:
 				d.s_warehouse = self.from_warehouse
 				d.t_warehouse = self.to_warehouse
@@ -356,7 +442,6 @@
 				else:
 					frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx))
 
-
 			if self.purpose == "Manufacture":
 				if validate_for_manufacture:
 					if d.is_finished_item or d.is_scrap_item or d.is_process_loss:
@@ -368,18 +453,26 @@
 						if not d.s_warehouse:
 							frappe.throw(_("Source warehouse is mandatory for row {0}").format(d.idx))
 
-			if cstr(d.s_warehouse) == cstr(d.t_warehouse) and not self.purpose == "Material Transfer for Manufacture":
+			if (
+				cstr(d.s_warehouse) == cstr(d.t_warehouse)
+				and not self.purpose == "Material Transfer for Manufacture"
+			):
 				frappe.throw(_("Source and target warehouse cannot be same for row {0}").format(d.idx))
 
 			if not (d.s_warehouse or d.t_warehouse):
 				frappe.throw(_("Atleast one warehouse is mandatory"))
 
 	def validate_work_order(self):
-		if self.purpose in ("Manufacture", "Material Transfer for Manufacture", "Material Consumption for Manufacture"):
+		if self.purpose in (
+			"Manufacture",
+			"Material Transfer for Manufacture",
+			"Material Consumption for Manufacture",
+		):
 			# check if work order is entered
 
-			if (self.purpose=="Manufacture" or self.purpose=="Material Consumption for Manufacture") \
-					and self.work_order:
+			if (
+				self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture"
+			) and self.work_order:
 				if not self.fg_completed_qty:
 					frappe.throw(_("For Quantity (Manufactured Qty) is mandatory"))
 				self.check_if_operations_completed()
@@ -390,40 +483,66 @@
 	def check_if_operations_completed(self):
 		"""Check if Time Sheets are completed against before manufacturing to capture operating costs."""
 		prod_order = frappe.get_doc("Work Order", self.work_order)
-		allowance_percentage = flt(frappe.db.get_single_value("Manufacturing Settings",
-			"overproduction_percentage_for_work_order"))
+		allowance_percentage = flt(
+			frappe.db.get_single_value("Manufacturing Settings", "overproduction_percentage_for_work_order")
+		)
 
 		for d in prod_order.get("operations"):
 			total_completed_qty = flt(self.fg_completed_qty) + flt(prod_order.produced_qty)
-			completed_qty = d.completed_qty + (allowance_percentage/100 * d.completed_qty)
+			completed_qty = d.completed_qty + (allowance_percentage / 100 * d.completed_qty)
 			if total_completed_qty > flt(completed_qty):
-				job_card = frappe.db.get_value('Job Card', {'operation_id': d.name}, 'name')
+				job_card = frappe.db.get_value("Job Card", {"operation_id": d.name}, "name")
 				if not job_card:
-					frappe.throw(_("Work Order {0}: Job Card not found for the operation {1}")
-						.format(self.work_order, d.operation))
+					frappe.throw(
+						_("Work Order {0}: Job Card not found for the operation {1}").format(
+							self.work_order, d.operation
+						)
+					)
 
-				work_order_link = frappe.utils.get_link_to_form('Work Order', self.work_order)
-				job_card_link = frappe.utils.get_link_to_form('Job Card', job_card)
-				frappe.throw(_("Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}.")
-					.format(d.idx, frappe.bold(d.operation), frappe.bold(total_completed_qty), work_order_link, job_card_link), OperationsNotCompleteError)
+				work_order_link = frappe.utils.get_link_to_form("Work Order", self.work_order)
+				job_card_link = frappe.utils.get_link_to_form("Job Card", job_card)
+				frappe.throw(
+					_(
+						"Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}."
+					).format(
+						d.idx,
+						frappe.bold(d.operation),
+						frappe.bold(total_completed_qty),
+						work_order_link,
+						job_card_link,
+					),
+					OperationsNotCompleteError,
+				)
 
 	def check_duplicate_entry_for_work_order(self):
-		other_ste = [t[0] for t in frappe.db.get_values("Stock Entry",  {
-			"work_order": self.work_order,
-			"purpose": self.purpose,
-			"docstatus": ["!=", 2],
-			"name": ["!=", self.name]
-		}, "name")]
+		other_ste = [
+			t[0]
+			for t in frappe.db.get_values(
+				"Stock Entry",
+				{
+					"work_order": self.work_order,
+					"purpose": self.purpose,
+					"docstatus": ["!=", 2],
+					"name": ["!=", self.name],
+				},
+				"name",
+			)
+		]
 
 		if other_ste:
-			production_item, qty = frappe.db.get_value("Work Order",
-				self.work_order, ["production_item", "qty"])
+			production_item, qty = frappe.db.get_value(
+				"Work Order", self.work_order, ["production_item", "qty"]
+			)
 			args = other_ste + [production_item]
-			fg_qty_already_entered = frappe.db.sql("""select sum(transfer_qty)
+			fg_qty_already_entered = frappe.db.sql(
+				"""select sum(transfer_qty)
 				from `tabStock Entry Detail`
 				where parent in (%s)
 					and item_code = %s
-					and ifnull(s_warehouse,'')='' """ % (", ".join(["%s" * len(other_ste)]), "%s"), args)[0][0]
+					and ifnull(s_warehouse,'')='' """
+				% (", ".join(["%s" * len(other_ste)]), "%s"),
+				args,
+			)[0][0]
 			if fg_qty_already_entered and fg_qty_already_entered >= qty:
 				frappe.throw(
 					_("Stock Entries already created for Work Order {0}: {1}").format(
@@ -435,34 +554,57 @@
 	def set_actual_qty(self):
 		from erpnext.stock.stock_ledger import is_negative_stock_allowed
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			allow_negative_stock = is_negative_stock_allowed(item_code=d.item_code)
-			previous_sle = get_previous_sle({
-				"item_code": d.item_code,
-				"warehouse": d.s_warehouse or d.t_warehouse,
-				"posting_date": self.posting_date,
-				"posting_time": self.posting_time
-			})
+			previous_sle = get_previous_sle(
+				{
+					"item_code": d.item_code,
+					"warehouse": d.s_warehouse or d.t_warehouse,
+					"posting_date": self.posting_date,
+					"posting_time": self.posting_time,
+				}
+			)
 
 			# get actual stock at source warehouse
 			d.actual_qty = previous_sle.get("qty_after_transaction") or 0
 
 			# validate qty during submit
-			if d.docstatus==1 and d.s_warehouse and not allow_negative_stock and flt(d.actual_qty, d.precision("actual_qty")) < flt(d.transfer_qty, d.precision("actual_qty")):
-				frappe.throw(_("Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})").format(d.idx,
-					frappe.bold(d.s_warehouse), formatdate(self.posting_date),
-					format_time(self.posting_time), frappe.bold(d.item_code))
-					+ '<br><br>' + _("Available quantity is {0}, you need {1}").format(frappe.bold(d.actual_qty),
-						frappe.bold(d.transfer_qty)),
-					NegativeStockError, title=_('Insufficient Stock'))
+			if (
+				d.docstatus == 1
+				and d.s_warehouse
+				and not allow_negative_stock
+				and flt(d.actual_qty, d.precision("actual_qty"))
+				< flt(d.transfer_qty, d.precision("actual_qty"))
+			):
+				frappe.throw(
+					_(
+						"Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})"
+					).format(
+						d.idx,
+						frappe.bold(d.s_warehouse),
+						formatdate(self.posting_date),
+						format_time(self.posting_time),
+						frappe.bold(d.item_code),
+					)
+					+ "<br><br>"
+					+ _("Available quantity is {0}, you need {1}").format(
+						frappe.bold(d.actual_qty), frappe.bold(d.transfer_qty)
+					),
+					NegativeStockError,
+					title=_("Insufficient Stock"),
+				)
 
 	def set_serial_nos(self, work_order):
-		previous_se = frappe.db.get_value("Stock Entry", {"work_order": work_order,
-				"purpose": "Material Transfer for Manufacture"}, "name")
+		previous_se = frappe.db.get_value(
+			"Stock Entry",
+			{"work_order": work_order, "purpose": "Material Transfer for Manufacture"},
+			"name",
+		)
 
-		for d in self.get('items'):
-			transferred_serial_no = frappe.db.get_value("Stock Entry Detail",{"parent": previous_se,
-				"item_code": d.item_code}, "serial_no")
+		for d in self.get("items"):
+			transferred_serial_no = frappe.db.get_value(
+				"Stock Entry Detail", {"parent": previous_se, "item_code": d.item_code}, "serial_no"
+			)
 
 			if transferred_serial_no:
 				d.serial_no = transferred_serial_no
@@ -470,8 +612,8 @@
 	@frappe.whitelist()
 	def get_stock_and_rate(self):
 		"""
-			Updates rate and availability of all the items.
-			Called from Update Rate and Availability button.
+		Updates rate and availability of all the items.
+		Called from Update Rate and Availability button.
 		"""
 		self.set_work_order_details()
 		self.set_transfer_qty()
@@ -488,38 +630,52 @@
 
 	def set_basic_rate(self, reset_outgoing_rate=True, raise_error_if_no_rate=True):
 		"""
-			Set rate for outgoing, scrapped and finished items
+		Set rate for outgoing, scrapped and finished items
 		"""
 		# Set rate for outgoing items
-		outgoing_items_cost = self.set_rate_for_outgoing_items(reset_outgoing_rate, raise_error_if_no_rate)
-		finished_item_qty = sum(d.transfer_qty for d in self.items if d.is_finished_item or d.is_process_loss)
+		outgoing_items_cost = self.set_rate_for_outgoing_items(
+			reset_outgoing_rate, raise_error_if_no_rate
+		)
+		finished_item_qty = sum(
+			d.transfer_qty for d in self.items if d.is_finished_item or d.is_process_loss
+		)
 
 		# Set basic rate for incoming items
-		for d in self.get('items'):
-			if d.s_warehouse or d.set_basic_rate_manually: continue
+		for d in self.get("items"):
+			if d.s_warehouse or d.set_basic_rate_manually:
+				continue
 
 			if d.allow_zero_valuation_rate:
 				d.basic_rate = 0.0
 			elif d.is_finished_item:
 				if self.purpose == "Manufacture":
-					d.basic_rate = self.get_basic_rate_for_manufactured_item(finished_item_qty, outgoing_items_cost)
+					d.basic_rate = self.get_basic_rate_for_manufactured_item(
+						finished_item_qty, outgoing_items_cost
+					)
 				elif self.purpose == "Repack":
 					d.basic_rate = self.get_basic_rate_for_repacked_items(d.transfer_qty, outgoing_items_cost)
 
 			if not d.basic_rate and not d.allow_zero_valuation_rate:
-				d.basic_rate = get_valuation_rate(d.item_code, d.t_warehouse,
-					self.doctype, self.name, d.allow_zero_valuation_rate,
-					currency=erpnext.get_company_currency(self.company), company=self.company,
-					raise_error_if_no_rate=raise_error_if_no_rate, batch_no=d.batch_no)
+				d.basic_rate = get_valuation_rate(
+					d.item_code,
+					d.t_warehouse,
+					self.doctype,
+					self.name,
+					d.allow_zero_valuation_rate,
+					currency=erpnext.get_company_currency(self.company),
+					company=self.company,
+					raise_error_if_no_rate=raise_error_if_no_rate,
+					batch_no=d.batch_no,
+				)
 
 			d.basic_rate = flt(d.basic_rate, d.precision("basic_rate"))
 			if d.is_process_loss:
-				d.basic_rate = flt(0.)
+				d.basic_rate = flt(0.0)
 			d.basic_amount = flt(flt(d.transfer_qty) * flt(d.basic_rate), d.precision("basic_amount"))
 
 	def set_rate_for_outgoing_items(self, reset_outgoing_rate=True, raise_error_if_no_rate=True):
 		outgoing_items_cost = 0.0
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.s_warehouse:
 				if reset_outgoing_rate:
 					args = self.get_args_for_incoming_rate(d)
@@ -534,19 +690,21 @@
 		return outgoing_items_cost
 
 	def get_args_for_incoming_rate(self, item):
-		return frappe._dict({
-			"item_code": item.item_code,
-			"warehouse": item.s_warehouse or item.t_warehouse,
-			"posting_date": self.posting_date,
-			"posting_time": self.posting_time,
-			"qty": item.s_warehouse and -1*flt(item.transfer_qty) or flt(item.transfer_qty),
-			"serial_no": item.serial_no,
-			"batch_no": item.batch_no,
-			"voucher_type": self.doctype,
-			"voucher_no": self.name,
-			"company": self.company,
-			"allow_zero_valuation": item.allow_zero_valuation_rate,
-		})
+		return frappe._dict(
+			{
+				"item_code": item.item_code,
+				"warehouse": item.s_warehouse or item.t_warehouse,
+				"posting_date": self.posting_date,
+				"posting_time": self.posting_time,
+				"qty": item.s_warehouse and -1 * flt(item.transfer_qty) or flt(item.transfer_qty),
+				"serial_no": item.serial_no,
+				"batch_no": item.batch_no,
+				"voucher_type": self.doctype,
+				"voucher_no": self.name,
+				"company": self.company,
+				"allow_zero_valuation": item.allow_zero_valuation_rate,
+			}
+		)
 
 	def get_basic_rate_for_repacked_items(self, finished_item_qty, outgoing_items_cost):
 		finished_items = [d.item_code for d in self.get("items") if d.is_finished_item]
@@ -562,9 +720,11 @@
 		scrap_items_cost = sum([flt(d.basic_amount) for d in self.get("items") if d.is_scrap_item])
 
 		# Get raw materials cost from BOM if multiple material consumption entries
-		if not outgoing_items_cost and frappe.db.get_single_value("Manufacturing Settings", "material_consumption", cache=True):
+		if not outgoing_items_cost and frappe.db.get_single_value(
+			"Manufacturing Settings", "material_consumption", cache=True
+		):
 			bom_items = self.get_bom_raw_materials(finished_item_qty)
-			outgoing_items_cost = sum([flt(row.qty)*flt(row.rate) for row in bom_items.values()])
+			outgoing_items_cost = sum([flt(row.qty) * flt(row.rate) for row in bom_items.values()])
 
 		return flt((outgoing_items_cost - scrap_items_cost) / finished_item_qty)
 
@@ -596,8 +756,10 @@
 		for d in self.get("items"):
 			if d.transfer_qty:
 				d.amount = flt(flt(d.basic_amount) + flt(d.additional_cost), d.precision("amount"))
-				d.valuation_rate = flt(flt(d.basic_rate) + (flt(d.additional_cost) / flt(d.transfer_qty)),
-					d.precision("valuation_rate"))
+				d.valuation_rate = flt(
+					flt(d.basic_rate) + (flt(d.additional_cost) / flt(d.transfer_qty)),
+					d.precision("valuation_rate"),
+				)
 
 	def set_total_incoming_outgoing_value(self):
 		self.total_incoming_value = self.total_outgoing_value = 0.0
@@ -611,92 +773,120 @@
 
 	def set_total_amount(self):
 		self.total_amount = None
-		if self.purpose not in ['Manufacture', 'Repack']:
+		if self.purpose not in ["Manufacture", "Repack"]:
 			self.total_amount = sum([flt(item.amount) for item in self.get("items")])
 
 	def set_stock_entry_type(self):
 		if self.purpose:
-			self.stock_entry_type = frappe.get_cached_value('Stock Entry Type',
-				{'purpose': self.purpose}, 'name')
+			self.stock_entry_type = frappe.get_cached_value(
+				"Stock Entry Type", {"purpose": self.purpose}, "name"
+			)
 
 	def set_purpose_for_stock_entry(self):
 		if self.stock_entry_type and not self.purpose:
-			self.purpose = frappe.get_cached_value('Stock Entry Type',
-				self.stock_entry_type, 'purpose')
+			self.purpose = frappe.get_cached_value("Stock Entry Type", self.stock_entry_type, "purpose")
 
 	def validate_duplicate_serial_no(self):
 		warehouse_wise_serial_nos = {}
 
 		# In case of repack the source and target serial nos could be same
-		for warehouse in ['s_warehouse', 't_warehouse']:
+		for warehouse in ["s_warehouse", "t_warehouse"]:
 			serial_nos = []
 			for row in self.items:
-				if not (row.serial_no and row.get(warehouse)): continue
+				if not (row.serial_no and row.get(warehouse)):
+					continue
 
 				for sn in get_serial_nos(row.serial_no):
 					if sn in serial_nos:
-						frappe.throw(_('The serial no {0} has added multiple times in the stock entry {1}')
-							.format(frappe.bold(sn), self.name))
+						frappe.throw(
+							_("The serial no {0} has added multiple times in the stock entry {1}").format(
+								frappe.bold(sn), self.name
+							)
+						)
 
 					serial_nos.append(sn)
 
 	def validate_purchase_order(self):
 		"""Throw exception if more raw material is transferred against Purchase Order than in
 		the raw materials supplied table"""
-		backflush_raw_materials_based_on = frappe.db.get_single_value("Buying Settings",
-			"backflush_raw_materials_of_subcontract_based_on")
+		backflush_raw_materials_based_on = frappe.db.get_single_value(
+			"Buying Settings", "backflush_raw_materials_of_subcontract_based_on"
+		)
 
-		qty_allowance = flt(frappe.db.get_single_value("Buying Settings",
-			"over_transfer_allowance"))
+		qty_allowance = flt(frappe.db.get_single_value("Buying Settings", "over_transfer_allowance"))
 
-		if not (self.purpose == "Send to Subcontractor" and self.purchase_order): return
+		if not (self.purpose == "Send to Subcontractor" and self.purchase_order):
+			return
 
-		if (backflush_raw_materials_based_on == 'BOM'):
+		if backflush_raw_materials_based_on == "BOM":
 			purchase_order = frappe.get_doc("Purchase Order", self.purchase_order)
 			for se_item in self.items:
 				item_code = se_item.original_item or se_item.item_code
 				precision = cint(frappe.db.get_default("float_precision")) or 3
-				required_qty = sum([flt(d.required_qty) for d in purchase_order.supplied_items \
-					if d.rm_item_code == item_code])
+				required_qty = sum(
+					[flt(d.required_qty) for d in purchase_order.supplied_items if d.rm_item_code == item_code]
+				)
 
-				total_allowed = required_qty + (required_qty * (qty_allowance/100))
+				total_allowed = required_qty + (required_qty * (qty_allowance / 100))
 
 				if not required_qty:
-					bom_no = frappe.db.get_value("Purchase Order Item",
+					bom_no = frappe.db.get_value(
+						"Purchase Order Item",
 						{"parent": self.purchase_order, "item_code": se_item.subcontracted_item},
-						"bom")
+						"bom",
+					)
 
 					if se_item.allow_alternative_item:
-						original_item_code = frappe.get_value("Item Alternative", {"alternative_item_code": item_code}, "item_code")
+						original_item_code = frappe.get_value(
+							"Item Alternative", {"alternative_item_code": item_code}, "item_code"
+						)
 
-						required_qty = sum([flt(d.required_qty) for d in purchase_order.supplied_items \
-							if d.rm_item_code == original_item_code])
+						required_qty = sum(
+							[
+								flt(d.required_qty)
+								for d in purchase_order.supplied_items
+								if d.rm_item_code == original_item_code
+							]
+						)
 
-						total_allowed = required_qty + (required_qty * (qty_allowance/100))
+						total_allowed = required_qty + (required_qty * (qty_allowance / 100))
 
 				if not required_qty:
-					frappe.throw(_("Item {0} not found in 'Raw Materials Supplied' table in Purchase Order {1}")
-						.format(se_item.item_code, self.purchase_order))
-				total_supplied = frappe.db.sql("""select sum(transfer_qty)
+					frappe.throw(
+						_("Item {0} not found in 'Raw Materials Supplied' table in Purchase Order {1}").format(
+							se_item.item_code, self.purchase_order
+						)
+					)
+				total_supplied = frappe.db.sql(
+					"""select sum(transfer_qty)
 					from `tabStock Entry Detail`, `tabStock Entry`
 					where `tabStock Entry`.purchase_order = %s
 						and `tabStock Entry`.docstatus = 1
 						and `tabStock Entry Detail`.item_code = %s
 						and `tabStock Entry Detail`.parent = `tabStock Entry`.name""",
-							(self.purchase_order, se_item.item_code))[0][0]
+					(self.purchase_order, se_item.item_code),
+				)[0][0]
 
 				if flt(total_supplied, precision) > flt(total_allowed, precision):
-					frappe.throw(_("Row {0}# Item {1} cannot be transferred more than {2} against Purchase Order {3}")
-						.format(se_item.idx, se_item.item_code, total_allowed, self.purchase_order))
+					frappe.throw(
+						_("Row {0}# Item {1} cannot be transferred more than {2} against Purchase Order {3}").format(
+							se_item.idx, se_item.item_code, total_allowed, self.purchase_order
+						)
+					)
 		elif backflush_raw_materials_based_on == "Material Transferred for Subcontract":
 			for row in self.items:
 				if not row.subcontracted_item:
-					frappe.throw(_("Row {0}: Subcontracted Item is mandatory for the raw material {1}")
-						.format(row.idx, frappe.bold(row.item_code)))
+					frappe.throw(
+						_("Row {0}: Subcontracted Item is mandatory for the raw material {1}").format(
+							row.idx, frappe.bold(row.item_code)
+						)
+					)
 				elif not row.po_detail:
 					filters = {
-						"parent": self.purchase_order, "docstatus": 1,
-						"rm_item_code": row.item_code, "main_item_code": row.subcontracted_item
+						"parent": self.purchase_order,
+						"docstatus": 1,
+						"rm_item_code": row.item_code,
+						"main_item_code": row.subcontracted_item,
 					}
 
 					po_detail = frappe.db.get_value("Purchase Order Item Supplied", filters, "name")
@@ -704,7 +894,7 @@
 						row.db_set("po_detail", po_detail)
 
 	def validate_bom(self):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.bom_no and d.is_finished_item:
 				item_code = d.original_item or d.item_code
 				validate_bom_no(item_code, d.bom_no)
@@ -722,7 +912,7 @@
 
 		for d in self.items:
 			if d.t_warehouse and not d.s_warehouse:
-				if self.purpose=="Repack" or d.item_code == finished_item:
+				if self.purpose == "Repack" or d.item_code == finished_item:
 					d.is_finished_item = 1
 				else:
 					d.is_scrap_item = 1
@@ -741,19 +931,17 @@
 
 	def validate_finished_goods(self):
 		"""
-			1. Check if FG exists (mfg, repack)
-			2. Check if Multiple FG Items are present (mfg)
-			3. Check FG Item and Qty against WO if present (mfg)
+		1. Check if FG exists (mfg, repack)
+		2. Check if Multiple FG Items are present (mfg)
+		3. Check FG Item and Qty against WO if present (mfg)
 		"""
 		production_item, wo_qty, finished_items = None, 0, []
 
-		wo_details = frappe.db.get_value(
-			"Work Order", self.work_order, ["production_item", "qty"]
-		)
+		wo_details = frappe.db.get_value("Work Order", self.work_order, ["production_item", "qty"])
 		if wo_details:
 			production_item, wo_qty = wo_details
 
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if d.is_finished_item:
 				if not self.work_order:
 					# Independent MFG Entry/ Repack Entry, no WO to match against
@@ -761,12 +949,16 @@
 					continue
 
 				if d.item_code != production_item:
-					frappe.throw(_("Finished Item {0} does not match with Work Order {1}")
-						.format(d.item_code, self.work_order)
+					frappe.throw(
+						_("Finished Item {0} does not match with Work Order {1}").format(
+							d.item_code, self.work_order
+						)
 					)
 				elif flt(d.transfer_qty) > flt(self.fg_completed_qty):
-					frappe.throw(_("Quantity in row {0} ({1}) must be same as manufactured quantity {2}")
-						.format(d.idx, d.transfer_qty, self.fg_completed_qty)
+					frappe.throw(
+						_("Quantity in row {0} ({1}) must be same as manufactured quantity {2}").format(
+							d.idx, d.transfer_qty, self.fg_completed_qty
+						)
 					)
 
 				finished_items.append(d.item_code)
@@ -774,28 +966,31 @@
 		if not finished_items:
 			frappe.throw(
 				msg=_("There must be atleast 1 Finished Good in this Stock Entry").format(self.name),
-				title=_("Missing Finished Good"), exc=FinishedGoodError
+				title=_("Missing Finished Good"),
+				exc=FinishedGoodError,
 			)
 
 		if self.purpose == "Manufacture":
 			if len(set(finished_items)) > 1:
 				frappe.throw(
 					msg=_("Multiple items cannot be marked as finished item"),
-					title=_("Note"), exc=FinishedGoodError
+					title=_("Note"),
+					exc=FinishedGoodError,
 				)
 
 			allowance_percentage = flt(
 				frappe.db.get_single_value(
-					"Manufacturing Settings","overproduction_percentage_for_work_order"
+					"Manufacturing Settings", "overproduction_percentage_for_work_order"
 				)
 			)
-			allowed_qty = wo_qty + ((allowance_percentage/100) * wo_qty)
+			allowed_qty = wo_qty + ((allowance_percentage / 100) * wo_qty)
 
 			# No work order could mean independent Manufacture entry, if so skip validation
 			if self.work_order and self.fg_completed_qty > allowed_qty:
 				frappe.throw(
-					_("For quantity {0} should not be greater than work order quantity {1}")
-					.format(flt(self.fg_completed_qty), wo_qty)
+					_("For quantity {0} should not be greater than work order quantity {1}").format(
+						flt(self.fg_completed_qty), wo_qty
+					)
 				)
 
 	def update_stock_ledger(self):
@@ -817,35 +1012,38 @@
 	def get_finished_item_row(self):
 		finished_item_row = None
 		if self.purpose in ("Manufacture", "Repack"):
-			for d in self.get('items'):
+			for d in self.get("items"):
 				if d.is_finished_item:
 					finished_item_row = d
 
 		return finished_item_row
 
 	def get_sle_for_source_warehouse(self, sl_entries, finished_item_row):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if cstr(d.s_warehouse):
-				sle = self.get_sl_entries(d, {
-					"warehouse": cstr(d.s_warehouse),
-					"actual_qty": -flt(d.transfer_qty),
-					"incoming_rate": 0
-				})
+				sle = self.get_sl_entries(
+					d, {"warehouse": cstr(d.s_warehouse), "actual_qty": -flt(d.transfer_qty), "incoming_rate": 0}
+				)
 				if cstr(d.t_warehouse):
 					sle.dependant_sle_voucher_detail_no = d.name
-				elif finished_item_row and (finished_item_row.item_code != d.item_code or finished_item_row.t_warehouse != d.s_warehouse):
+				elif finished_item_row and (
+					finished_item_row.item_code != d.item_code or finished_item_row.t_warehouse != d.s_warehouse
+				):
 					sle.dependant_sle_voucher_detail_no = finished_item_row.name
 
 				sl_entries.append(sle)
 
 	def get_sle_for_target_warehouse(self, sl_entries, finished_item_row):
-		for d in self.get('items'):
+		for d in self.get("items"):
 			if cstr(d.t_warehouse):
-				sle = self.get_sl_entries(d, {
-					"warehouse": cstr(d.t_warehouse),
-					"actual_qty": flt(d.transfer_qty),
-					"incoming_rate": flt(d.valuation_rate)
-				})
+				sle = self.get_sl_entries(
+					d,
+					{
+						"warehouse": cstr(d.t_warehouse),
+						"actual_qty": flt(d.transfer_qty),
+						"incoming_rate": flt(d.valuation_rate),
+					},
+				)
 				if cstr(d.s_warehouse) or (finished_item_row and d.name == finished_item_row.name):
 					sle.recalculate_rate = 1
 
@@ -875,40 +1073,55 @@
 					continue
 
 				item_account_wise_additional_cost.setdefault((d.item_code, d.name), {})
-				item_account_wise_additional_cost[(d.item_code, d.name)].setdefault(t.expense_account, {
-					"amount": 0.0,
-					"base_amount": 0.0
-				})
+				item_account_wise_additional_cost[(d.item_code, d.name)].setdefault(
+					t.expense_account, {"amount": 0.0, "base_amount": 0.0}
+				)
 
 				multiply_based_on = d.basic_amount if total_basic_amount else d.qty
 
-				item_account_wise_additional_cost[(d.item_code, d.name)][t.expense_account]["amount"] += \
+				item_account_wise_additional_cost[(d.item_code, d.name)][t.expense_account]["amount"] += (
 					flt(t.amount * multiply_based_on) / divide_based_on
+				)
 
-				item_account_wise_additional_cost[(d.item_code, d.name)][t.expense_account]["base_amount"] += \
+				item_account_wise_additional_cost[(d.item_code, d.name)][t.expense_account]["base_amount"] += (
 					flt(t.base_amount * multiply_based_on) / divide_based_on
+				)
 
 		if item_account_wise_additional_cost:
 			for d in self.get("items"):
-				for account, amount in item_account_wise_additional_cost.get((d.item_code, d.name), {}).items():
-					if not amount: continue
+				for account, amount in item_account_wise_additional_cost.get(
+					(d.item_code, d.name), {}
+				).items():
+					if not amount:
+						continue
 
-					gl_entries.append(self.get_gl_dict({
-						"account": account,
-						"against": d.expense_account,
-						"cost_center": d.cost_center,
-						"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-						"credit_in_account_currency": flt(amount["amount"]),
-						"credit": flt(amount["base_amount"])
-					}, item=d))
+					gl_entries.append(
+						self.get_gl_dict(
+							{
+								"account": account,
+								"against": d.expense_account,
+								"cost_center": d.cost_center,
+								"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+								"credit_in_account_currency": flt(amount["amount"]),
+								"credit": flt(amount["base_amount"]),
+							},
+							item=d,
+						)
+					)
 
-					gl_entries.append(self.get_gl_dict({
-						"account": d.expense_account,
-						"against": account,
-						"cost_center": d.cost_center,
-						"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
-						"credit": -1 * amount['base_amount'] # put it as negative credit instead of debit purposefully
-					}, item=d))
+					gl_entries.append(
+						self.get_gl_dict(
+							{
+								"account": d.expense_account,
+								"against": account,
+								"cost_center": d.cost_center,
+								"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+								"credit": -1
+								* amount["base_amount"],  # put it as negative credit instead of debit purposefully
+							},
+							item=d,
+						)
+					)
 
 		return process_gl_map(gl_entries)
 
@@ -917,11 +1130,13 @@
 			if flt(pro_doc.docstatus) != 1:
 				frappe.throw(_("Work Order {0} must be submitted").format(self.work_order))
 
-			if pro_doc.status == 'Stopped':
-				frappe.throw(_("Transaction not allowed against stopped Work Order {0}").format(self.work_order))
+			if pro_doc.status == "Stopped":
+				frappe.throw(
+					_("Transaction not allowed against stopped Work Order {0}").format(self.work_order)
+				)
 
 		if self.job_card:
-			job_doc = frappe.get_doc('Job Card', self.job_card)
+			job_doc = frappe.get_doc("Job Card", self.job_card)
 			job_doc.set_transferred_qty(update_status=True)
 			job_doc.set_transferred_qty_in_job_card(self)
 
@@ -941,73 +1156,95 @@
 
 	@frappe.whitelist()
 	def get_item_details(self, args=None, for_update=False):
-		item = frappe.db.sql("""select i.name, i.stock_uom, i.description, i.image, i.item_name, i.item_group,
+		item = frappe.db.sql(
+			"""select i.name, i.stock_uom, i.description, i.image, i.item_name, i.item_group,
 				i.has_batch_no, i.sample_quantity, i.has_serial_no, i.allow_alternative_item,
 				id.expense_account, id.buying_cost_center
 			from `tabItem` i LEFT JOIN `tabItem Default` id ON i.name=id.parent and id.company=%s
 			where i.name=%s
 				and i.disabled=0
 				and (i.end_of_life is null or i.end_of_life='0000-00-00' or i.end_of_life > %s)""",
-			(self.company, args.get('item_code'), nowdate()), as_dict = 1)
+			(self.company, args.get("item_code"), nowdate()),
+			as_dict=1,
+		)
 
 		if not item:
-			frappe.throw(_("Item {0} is not active or end of life has been reached").format(args.get("item_code")))
+			frappe.throw(
+				_("Item {0} is not active or end of life has been reached").format(args.get("item_code"))
+			)
 
 		item = item[0]
 		item_group_defaults = get_item_group_defaults(item.name, self.company)
 		brand_defaults = get_brand_defaults(item.name, self.company)
 
-		ret = frappe._dict({
-			'uom'			      	: item.stock_uom,
-			'stock_uom'				: item.stock_uom,
-			'description'		  	: item.description,
-			'image'					: item.image,
-			'item_name' 		  	: item.item_name,
-			'cost_center'			: get_default_cost_center(args, item, item_group_defaults, brand_defaults, self.company),
-			'qty'					: args.get("qty"),
-			'transfer_qty'			: args.get('qty'),
-			'conversion_factor'		: 1,
-			'batch_no'				: '',
-			'actual_qty'			: 0,
-			'basic_rate'			: 0,
-			'serial_no'				: '',
-			'has_serial_no'			: item.has_serial_no,
-			'has_batch_no'			: item.has_batch_no,
-			'sample_quantity'		: item.sample_quantity,
-			'expense_account'		: item.expense_account
-		})
+		ret = frappe._dict(
+			{
+				"uom": item.stock_uom,
+				"stock_uom": item.stock_uom,
+				"description": item.description,
+				"image": item.image,
+				"item_name": item.item_name,
+				"cost_center": get_default_cost_center(
+					args, item, item_group_defaults, brand_defaults, self.company
+				),
+				"qty": args.get("qty"),
+				"transfer_qty": args.get("qty"),
+				"conversion_factor": 1,
+				"batch_no": "",
+				"actual_qty": 0,
+				"basic_rate": 0,
+				"serial_no": "",
+				"has_serial_no": item.has_serial_no,
+				"has_batch_no": item.has_batch_no,
+				"sample_quantity": item.sample_quantity,
+				"expense_account": item.expense_account,
+			}
+		)
 
-		if self.purpose == 'Send to Subcontractor':
+		if self.purpose == "Send to Subcontractor":
 			ret["allow_alternative_item"] = item.allow_alternative_item
 
 		# update uom
 		if args.get("uom") and for_update:
-			ret.update(get_uom_details(args.get('item_code'), args.get('uom'), args.get('qty')))
+			ret.update(get_uom_details(args.get("item_code"), args.get("uom"), args.get("qty")))
 
-		if self.purpose == 'Material Issue':
-			ret["expense_account"] = (item.get("expense_account") or
-				item_group_defaults.get("expense_account") or
-				frappe.get_cached_value('Company',  self.company,  "default_expense_account"))
+		if self.purpose == "Material Issue":
+			ret["expense_account"] = (
+				item.get("expense_account")
+				or item_group_defaults.get("expense_account")
+				or frappe.get_cached_value("Company", self.company, "default_expense_account")
+			)
 
-		for company_field, field in {'stock_adjustment_account': 'expense_account',
-			'cost_center': 'cost_center'}.items():
+		for company_field, field in {
+			"stock_adjustment_account": "expense_account",
+			"cost_center": "cost_center",
+		}.items():
 			if not ret.get(field):
-				ret[field] = frappe.get_cached_value('Company',  self.company,  company_field)
+				ret[field] = frappe.get_cached_value("Company", self.company, company_field)
 
-		args['posting_date'] = self.posting_date
-		args['posting_time'] = self.posting_time
+		args["posting_date"] = self.posting_date
+		args["posting_time"] = self.posting_time
 
-		stock_and_rate = get_warehouse_details(args) if args.get('warehouse') else {}
+		stock_and_rate = get_warehouse_details(args) if args.get("warehouse") else {}
 		ret.update(stock_and_rate)
 
 		# automatically select batch for outgoing item
-		if (args.get('s_warehouse', None) and args.get('qty') and
-			ret.get('has_batch_no') and not args.get('batch_no')):
-			args.batch_no = get_batch_no(args['item_code'], args['s_warehouse'], args['qty'])
+		if (
+			args.get("s_warehouse", None)
+			and args.get("qty")
+			and ret.get("has_batch_no")
+			and not args.get("batch_no")
+		):
+			args.batch_no = get_batch_no(args["item_code"], args["s_warehouse"], args["qty"])
 
-		if self.purpose == "Send to Subcontractor" and self.get("purchase_order") and args.get('item_code'):
-			subcontract_items = frappe.get_all("Purchase Order Item Supplied",
-				{"parent": self.purchase_order, "rm_item_code": args.get('item_code')}, "main_item_code")
+		if (
+			self.purpose == "Send to Subcontractor" and self.get("purchase_order") and args.get("item_code")
+		):
+			subcontract_items = frappe.get_all(
+				"Purchase Order Item Supplied",
+				{"parent": self.purchase_order, "rm_item_code": args.get("item_code")},
+				"main_item_code",
+			)
 
 			if subcontract_items and len(subcontract_items) == 1:
 				ret["subcontracted_item"] = subcontract_items[0].main_item_code
@@ -1018,46 +1255,57 @@
 	def set_items_for_stock_in(self):
 		self.items = []
 
-		if self.outgoing_stock_entry and self.purpose == 'Material Transfer':
-			doc = frappe.get_doc('Stock Entry', self.outgoing_stock_entry)
+		if self.outgoing_stock_entry and self.purpose == "Material Transfer":
+			doc = frappe.get_doc("Stock Entry", self.outgoing_stock_entry)
 
 			if doc.per_transferred == 100:
-				frappe.throw(_("Goods are already received against the outward entry {0}")
-					.format(doc.name))
+				frappe.throw(_("Goods are already received against the outward entry {0}").format(doc.name))
 
 			for d in doc.items:
-				self.append('items', {
-					's_warehouse': d.t_warehouse,
-					'item_code': d.item_code,
-					'qty': d.qty,
-					'uom': d.uom,
-					'against_stock_entry': d.parent,
-					'ste_detail': d.name,
-					'stock_uom': d.stock_uom,
-					'conversion_factor': d.conversion_factor,
-					'serial_no': d.serial_no,
-					'batch_no': d.batch_no
-				})
+				self.append(
+					"items",
+					{
+						"s_warehouse": d.t_warehouse,
+						"item_code": d.item_code,
+						"qty": d.qty,
+						"uom": d.uom,
+						"against_stock_entry": d.parent,
+						"ste_detail": d.name,
+						"stock_uom": d.stock_uom,
+						"conversion_factor": d.conversion_factor,
+						"serial_no": d.serial_no,
+						"batch_no": d.batch_no,
+					},
+				)
 
 	@frappe.whitelist()
 	def get_items(self):
-		self.set('items', [])
+		self.set("items", [])
 		self.validate_work_order()
 
 		if not self.posting_date or not self.posting_time:
 			frappe.throw(_("Posting date and posting time is mandatory"))
 
 		self.set_work_order_details()
-		self.flags.backflush_based_on = frappe.db.get_single_value("Manufacturing Settings",
-			"backflush_raw_materials_based_on")
+		self.flags.backflush_based_on = frappe.db.get_single_value(
+			"Manufacturing Settings", "backflush_raw_materials_based_on"
+		)
 
 		if self.bom_no:
 
-			backflush_based_on = frappe.db.get_single_value("Manufacturing Settings",
-				"backflush_raw_materials_based_on")
+			backflush_based_on = frappe.db.get_single_value(
+				"Manufacturing Settings", "backflush_raw_materials_based_on"
+			)
 
-			if self.purpose in ["Material Issue", "Material Transfer", "Manufacture", "Repack",
-					"Send to Subcontractor", "Material Transfer for Manufacture", "Material Consumption for Manufacture"]:
+			if self.purpose in [
+				"Material Issue",
+				"Material Transfer",
+				"Manufacture",
+				"Repack",
+				"Send to Subcontractor",
+				"Material Transfer for Manufacture",
+				"Material Consumption for Manufacture",
+			]:
 
 				if self.work_order and self.purpose == "Material Transfer for Manufacture":
 					item_dict = self.get_pending_raw_materials(backflush_based_on)
@@ -1066,14 +1314,20 @@
 							item["to_warehouse"] = self.pro_doc.wip_warehouse
 					self.add_to_stock_entry_detail(item_dict)
 
-				elif (self.work_order and (self.purpose == "Manufacture"
-						or self.purpose == "Material Consumption for Manufacture") and not self.pro_doc.skip_transfer
-					and self.flags.backflush_based_on == "Material Transferred for Manufacture"):
+				elif (
+					self.work_order
+					and (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture")
+					and not self.pro_doc.skip_transfer
+					and self.flags.backflush_based_on == "Material Transferred for Manufacture"
+				):
 					self.get_transfered_raw_materials()
 
-				elif (self.work_order and (self.purpose == "Manufacture" or
-					self.purpose == "Material Consumption for Manufacture") and self.flags.backflush_based_on== "BOM"
-					and frappe.db.get_single_value("Manufacturing Settings", "material_consumption")== 1):
+				elif (
+					self.work_order
+					and (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture")
+					and self.flags.backflush_based_on == "BOM"
+					and frappe.db.get_single_value("Manufacturing Settings", "material_consumption") == 1
+				):
 					self.get_unconsumed_raw_materials()
 
 				else:
@@ -1082,31 +1336,36 @@
 
 					item_dict = self.get_bom_raw_materials(self.fg_completed_qty)
 
-					#Get PO Supplied Items Details
+					# Get PO Supplied Items Details
 					if self.purchase_order and self.purpose == "Send to Subcontractor":
-						#Get PO Supplied Items Details
-						item_wh = frappe._dict(frappe.db.sql("""
+						# Get PO Supplied Items Details
+						item_wh = frappe._dict(
+							frappe.db.sql(
+								"""
 							SELECT
 								rm_item_code, reserve_warehouse
 							FROM
 								`tabPurchase Order` po, `tabPurchase Order Item Supplied` poitemsup
 							WHERE
-								po.name = poitemsup.parent and po.name = %s """,self.purchase_order))
+								po.name = poitemsup.parent and po.name = %s """,
+								self.purchase_order,
+							)
+						)
 
 					for item in item_dict.values():
 						if self.pro_doc and cint(self.pro_doc.from_wip_warehouse):
 							item["from_warehouse"] = self.pro_doc.wip_warehouse
-						#Get Reserve Warehouse from PO
-						if self.purchase_order and self.purpose=="Send to Subcontractor":
+						# Get Reserve Warehouse from PO
+						if self.purchase_order and self.purpose == "Send to Subcontractor":
 							item["from_warehouse"] = item_wh.get(item.item_code)
-						item["to_warehouse"] = self.to_warehouse if self.purpose=="Send to Subcontractor" else ""
+						item["to_warehouse"] = self.to_warehouse if self.purpose == "Send to Subcontractor" else ""
 
 					self.add_to_stock_entry_detail(item_dict)
 
 			# fetch the serial_no of the first stock entry for the second stock entry
 			if self.work_order and self.purpose == "Manufacture":
 				self.set_serial_nos(self.work_order)
-				work_order = frappe.get_doc('Work Order', self.work_order)
+				work_order = frappe.get_doc("Work Order", self.work_order)
 				add_additional_cost(self, work_order)
 
 			# add finished goods item
@@ -1123,7 +1382,7 @@
 		if self.purpose != "Send to Subcontractor" and self.purpose in ["Manufacture", "Repack"]:
 			scrap_item_dict = self.get_bom_scrap_material(self.fg_completed_qty)
 			for item in scrap_item_dict.values():
-				item.idx = ''
+				item.idx = ""
 				if self.pro_doc and self.pro_doc.scrap_warehouse:
 					item["to_warehouse"] = self.pro_doc.scrap_warehouse
 
@@ -1136,7 +1395,7 @@
 		if self.work_order:
 			# common validations
 			if not self.pro_doc:
-				self.pro_doc = frappe.get_doc('Work Order', self.work_order)
+				self.pro_doc = frappe.get_doc("Work Order", self.work_order)
 
 			if self.pro_doc:
 				self.bom_no = self.pro_doc.bom_no
@@ -1167,11 +1426,18 @@
 			"stock_uom": item.stock_uom,
 			"expense_account": item.get("expense_account"),
 			"cost_center": item.get("buying_cost_center"),
-			"is_finished_item": 1
+			"is_finished_item": 1,
 		}
 
-		if self.work_order and self.pro_doc.has_batch_no and cint(frappe.db.get_single_value('Manufacturing Settings',
-			'make_serial_no_batch_from_work_order', cache=True)):
+		if (
+			self.work_order
+			and self.pro_doc.has_batch_no
+			and cint(
+				frappe.db.get_single_value(
+					"Manufacturing Settings", "make_serial_no_batch_from_work_order", cache=True
+				)
+			)
+		):
 			self.set_batchwise_finished_goods(args, item)
 		else:
 			self.add_finished_goods(args, item)
@@ -1180,12 +1446,12 @@
 		filters = {
 			"reference_name": self.pro_doc.name,
 			"reference_doctype": self.pro_doc.doctype,
-			"qty_to_produce": (">", 0)
+			"qty_to_produce": (">", 0),
 		}
 
 		fields = ["qty_to_produce as qty", "produced_qty", "name"]
 
-		data = frappe.get_all("Batch", filters = filters, fields = fields, order_by="creation asc")
+		data = frappe.get_all("Batch", filters=filters, fields=fields, order_by="creation asc")
 
 		if not data:
 			self.add_finished_goods(args, item)
@@ -1200,7 +1466,7 @@
 			if not batch_qty:
 				continue
 
-			if qty <=0:
+			if qty <= 0:
 				break
 
 			fg_qty = batch_qty
@@ -1214,23 +1480,27 @@
 			self.add_finished_goods(args, item)
 
 	def add_finished_goods(self, args, item):
-		self.add_to_stock_entry_detail({
-			item.name: args
-		}, bom_no = self.bom_no)
+		self.add_to_stock_entry_detail({item.name: args}, bom_no=self.bom_no)
 
 	def get_bom_raw_materials(self, qty):
 		from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
 
 		# item dict = { item_code: {qty, description, stock_uom} }
-		item_dict = get_bom_items_as_dict(self.bom_no, self.company, qty=qty,
-			fetch_exploded = self.use_multi_level_bom, fetch_qty_in_stock_uom=False)
+		item_dict = get_bom_items_as_dict(
+			self.bom_no,
+			self.company,
+			qty=qty,
+			fetch_exploded=self.use_multi_level_bom,
+			fetch_qty_in_stock_uom=False,
+		)
 
-		used_alternative_items = get_used_alternative_items(work_order = self.work_order)
+		used_alternative_items = get_used_alternative_items(work_order=self.work_order)
 		for item in item_dict.values():
 			# if source warehouse presents in BOM set from_warehouse as bom source_warehouse
 			if item["allow_alternative_item"]:
-				item["allow_alternative_item"] = frappe.db.get_value('Work Order',
-					self.work_order, "allow_alternative_item")
+				item["allow_alternative_item"] = frappe.db.get_value(
+					"Work Order", self.work_order, "allow_alternative_item"
+				)
 
 			item.from_warehouse = self.from_warehouse or item.source_warehouse or item.default_warehouse
 			if item.item_code in used_alternative_items:
@@ -1248,8 +1518,10 @@
 		from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
 
 		# item dict = { item_code: {qty, description, stock_uom} }
-		item_dict = get_bom_items_as_dict(self.bom_no, self.company, qty=qty,
-			fetch_exploded = 0, fetch_scrap_items = 1) or {}
+		item_dict = (
+			get_bom_items_as_dict(self.bom_no, self.company, qty=qty, fetch_exploded=0, fetch_scrap_items=1)
+			or {}
+		)
 
 		for item in item_dict.values():
 			item.from_warehouse = ""
@@ -1263,16 +1535,18 @@
 			if not item_row:
 				item_row = frappe._dict({})
 
-			item_row.update({
-				'uom': row.stock_uom,
-				'from_warehouse': '',
-				'qty': row.stock_qty + flt(item_row.stock_qty),
-				'converison_factor': 1,
-				'is_scrap_item': 1,
-				'item_name': row.item_name,
-				'description': row.description,
-				'allow_zero_valuation_rate': 1
-			})
+			item_row.update(
+				{
+					"uom": row.stock_uom,
+					"from_warehouse": "",
+					"qty": row.stock_qty + flt(item_row.stock_qty),
+					"converison_factor": 1,
+					"is_scrap_item": 1,
+					"item_name": row.item_name,
+					"description": row.description,
+					"allow_zero_valuation_rate": 1,
+				}
+			)
 
 			item_dict[row.item_code] = item_row
 
@@ -1285,21 +1559,25 @@
 		if not self.pro_doc.operations:
 			return []
 
-		job_card = frappe.qb.DocType('Job Card')
-		job_card_scrap_item = frappe.qb.DocType('Job Card Scrap Item')
+		job_card = frappe.qb.DocType("Job Card")
+		job_card_scrap_item = frappe.qb.DocType("Job Card Scrap Item")
 
 		scrap_items = (
 			frappe.qb.from_(job_card)
 			.select(
-				Sum(job_card_scrap_item.stock_qty).as_('stock_qty'),
-				job_card_scrap_item.item_code, job_card_scrap_item.item_name,
-				job_card_scrap_item.description, job_card_scrap_item.stock_uom)
+				Sum(job_card_scrap_item.stock_qty).as_("stock_qty"),
+				job_card_scrap_item.item_code,
+				job_card_scrap_item.item_name,
+				job_card_scrap_item.description,
+				job_card_scrap_item.stock_uom,
+			)
 			.join(job_card_scrap_item)
 			.on(job_card_scrap_item.parent == job_card.name)
 			.where(
 				(job_card_scrap_item.item_code.isnotnull())
 				& (job_card.work_order == self.work_order)
-				& (job_card.docstatus == 1))
+				& (job_card.docstatus == 1)
+			)
 			.groupby(job_card_scrap_item.item_code)
 		).run(as_dict=1)
 
@@ -1313,7 +1591,7 @@
 			if used_scrap_items.get(row.item_code):
 				used_scrap_items[row.item_code] -= row.stock_qty
 
-			if cint(frappe.get_cached_value('UOM', row.stock_uom, 'must_be_whole_number')):
+			if cint(frappe.get_cached_value("UOM", row.stock_uom, "must_be_whole_number")):
 				row.stock_qty = frappe.utils.ceil(row.stock_qty)
 
 		return scrap_items
@@ -1324,16 +1602,14 @@
 	def get_used_scrap_items(self):
 		used_scrap_items = defaultdict(float)
 		data = frappe.get_all(
-			'Stock Entry',
-			fields = [
-				'`tabStock Entry Detail`.`item_code`', '`tabStock Entry Detail`.`qty`'
+			"Stock Entry",
+			fields=["`tabStock Entry Detail`.`item_code`", "`tabStock Entry Detail`.`qty`"],
+			filters=[
+				["Stock Entry", "work_order", "=", self.work_order],
+				["Stock Entry Detail", "is_scrap_item", "=", 1],
+				["Stock Entry", "docstatus", "=", 1],
+				["Stock Entry", "purpose", "in", ["Repack", "Manufacture"]],
 			],
-			filters = [
-				['Stock Entry', 'work_order', '=', self.work_order],
-				['Stock Entry Detail', 'is_scrap_item', '=', 1],
-				['Stock Entry', 'docstatus', '=', 1],
-				['Stock Entry', 'purpose', 'in', ['Repack', 'Manufacture']]
-			]
 		)
 
 		for row in data:
@@ -1343,10 +1619,11 @@
 
 	def get_unconsumed_raw_materials(self):
 		wo = frappe.get_doc("Work Order", self.work_order)
-		wo_items = frappe.get_all('Work Order Item',
-			filters={'parent': self.work_order},
-			fields=["item_code", "source_warehouse", "required_qty", "consumed_qty", "transferred_qty"]
-			)
+		wo_items = frappe.get_all(
+			"Work Order Item",
+			filters={"parent": self.work_order},
+			fields=["item_code", "source_warehouse", "required_qty", "consumed_qty", "transferred_qty"],
+		)
 
 		work_order_qty = wo.material_transferred_for_manufacturing or wo.qty
 		for item in wo_items:
@@ -1363,21 +1640,24 @@
 			qty = req_qty_each * flt(self.fg_completed_qty)
 
 			if qty > 0:
-				self.add_to_stock_entry_detail({
-					item.item_code: {
-						"from_warehouse": wo.wip_warehouse or item.source_warehouse,
-						"to_warehouse": "",
-						"qty": qty,
-						"item_name": item.item_name,
-						"description": item.description,
-						"stock_uom": item_account_details.stock_uom,
-						"expense_account": item_account_details.get("expense_account"),
-						"cost_center": item_account_details.get("buying_cost_center"),
+				self.add_to_stock_entry_detail(
+					{
+						item.item_code: {
+							"from_warehouse": wo.wip_warehouse or item.source_warehouse,
+							"to_warehouse": "",
+							"qty": qty,
+							"item_name": item.item_name,
+							"description": item.description,
+							"stock_uom": item_account_details.stock_uom,
+							"expense_account": item_account_details.get("expense_account"),
+							"cost_center": item_account_details.get("buying_cost_center"),
+						}
 					}
-				})
+				)
 
 	def get_transfered_raw_materials(self):
-		transferred_materials = frappe.db.sql("""
+		transferred_materials = frappe.db.sql(
+			"""
 			select
 				item_name, original_item, item_code, sum(qty) as qty, sed.t_warehouse as warehouse,
 				description, stock_uom, expense_account, cost_center
@@ -1386,9 +1666,13 @@
 				se.name = sed.parent and se.docstatus=1 and se.purpose='Material Transfer for Manufacture'
 				and se.work_order= %s and ifnull(sed.t_warehouse, '') != ''
 			group by sed.item_code, sed.t_warehouse
-		""", self.work_order, as_dict=1)
+		""",
+			self.work_order,
+			as_dict=1,
+		)
 
-		materials_already_backflushed = frappe.db.sql("""
+		materials_already_backflushed = frappe.db.sql(
+			"""
 			select
 				item_code, sed.s_warehouse as warehouse, sum(qty) as qty
 			from
@@ -1398,26 +1682,34 @@
 				and (se.purpose='Manufacture' or se.purpose='Material Consumption for Manufacture')
 				and se.work_order= %s and ifnull(sed.s_warehouse, '') != ''
 			group by sed.item_code, sed.s_warehouse
-		""", self.work_order, as_dict=1)
+		""",
+			self.work_order,
+			as_dict=1,
+		)
 
-		backflushed_materials= {}
+		backflushed_materials = {}
 		for d in materials_already_backflushed:
-			backflushed_materials.setdefault(d.item_code,[]).append({d.warehouse: d.qty})
+			backflushed_materials.setdefault(d.item_code, []).append({d.warehouse: d.qty})
 
-		po_qty = frappe.db.sql("""select qty, produced_qty, material_transferred_for_manufacturing from
-			`tabWork Order` where name=%s""", self.work_order, as_dict=1)[0]
+		po_qty = frappe.db.sql(
+			"""select qty, produced_qty, material_transferred_for_manufacturing from
+			`tabWork Order` where name=%s""",
+			self.work_order,
+			as_dict=1,
+		)[0]
 
 		manufacturing_qty = flt(po_qty.qty) or 1
 		produced_qty = flt(po_qty.produced_qty)
 		trans_qty = flt(po_qty.material_transferred_for_manufacturing) or 1
 
 		for item in transferred_materials:
-			qty= item.qty
+			qty = item.qty
 			item_code = item.original_item or item.item_code
-			req_items = frappe.get_all('Work Order Item',
-				filters={'parent': self.work_order, 'item_code': item_code},
-				fields=["required_qty", "consumed_qty"]
-				)
+			req_items = frappe.get_all(
+				"Work Order Item",
+				filters={"parent": self.work_order, "item_code": item_code},
+				fields=["required_qty", "consumed_qty"],
+			)
 
 			req_qty = flt(req_items[0].required_qty) if req_items else flt(4)
 			req_qty_each = flt(req_qty / manufacturing_qty)
@@ -1425,23 +1717,23 @@
 
 			if trans_qty and manufacturing_qty > (produced_qty + flt(self.fg_completed_qty)):
 				if qty >= req_qty:
-					qty = (req_qty/trans_qty) * flt(self.fg_completed_qty)
+					qty = (req_qty / trans_qty) * flt(self.fg_completed_qty)
 				else:
 					qty = qty - consumed_qty
 
-				if self.purpose == 'Manufacture':
+				if self.purpose == "Manufacture":
 					# If Material Consumption is booked, must pull only remaining components to finish product
 					if consumed_qty != 0:
 						remaining_qty = consumed_qty - (produced_qty * req_qty_each)
 						exhaust_qty = req_qty_each * produced_qty
-						if remaining_qty > exhaust_qty :
-							if (remaining_qty/(req_qty_each * flt(self.fg_completed_qty))) >= 1:
-								qty =0
+						if remaining_qty > exhaust_qty:
+							if (remaining_qty / (req_qty_each * flt(self.fg_completed_qty))) >= 1:
+								qty = 0
 							else:
 								qty = (req_qty_each * flt(self.fg_completed_qty)) - remaining_qty
 					else:
 						if self.flags.backflush_based_on == "Material Transferred for Manufacture":
-							qty = (item.qty/trans_qty) * flt(self.fg_completed_qty)
+							qty = (item.qty / trans_qty) * flt(self.fg_completed_qty)
 						else:
 							qty = req_qty_each * flt(self.fg_completed_qty)
 
@@ -1449,45 +1741,51 @@
 				precision = frappe.get_precision("Stock Entry Detail", "qty")
 				for d in backflushed_materials.get(item.item_code):
 					if d.get(item.warehouse) > 0:
-						if (qty > req_qty):
-							qty = ((flt(qty, precision) - flt(d.get(item.warehouse), precision))
+						if qty > req_qty:
+							qty = (
+								(flt(qty, precision) - flt(d.get(item.warehouse), precision))
 								/ (flt(trans_qty, precision) - flt(produced_qty, precision))
 							) * flt(self.fg_completed_qty)
 
 							d[item.warehouse] -= qty
 
-			if cint(frappe.get_cached_value('UOM', item.stock_uom, 'must_be_whole_number')):
+			if cint(frappe.get_cached_value("UOM", item.stock_uom, "must_be_whole_number")):
 				qty = frappe.utils.ceil(qty)
 
 			if qty > 0:
-				self.add_to_stock_entry_detail({
-					item.item_code: {
-						"from_warehouse": item.warehouse,
-						"to_warehouse": "",
-						"qty": qty,
-						"item_name": item.item_name,
-						"description": item.description,
-						"stock_uom": item.stock_uom,
-						"expense_account": item.expense_account,
-						"cost_center": item.buying_cost_center,
-						"original_item": item.original_item
+				self.add_to_stock_entry_detail(
+					{
+						item.item_code: {
+							"from_warehouse": item.warehouse,
+							"to_warehouse": "",
+							"qty": qty,
+							"item_name": item.item_name,
+							"description": item.description,
+							"stock_uom": item.stock_uom,
+							"expense_account": item.expense_account,
+							"cost_center": item.buying_cost_center,
+							"original_item": item.original_item,
+						}
 					}
-				})
+				)
 
 	def get_pending_raw_materials(self, backflush_based_on=None):
 		"""
-			issue (item quantity) that is pending to issue or desire to transfer,
-			whichever is less
+		issue (item quantity) that is pending to issue or desire to transfer,
+		whichever is less
 		"""
 		item_dict = self.get_pro_order_required_items(backflush_based_on)
 
 		max_qty = flt(self.pro_doc.qty)
 
 		allow_overproduction = False
-		overproduction_percentage = flt(frappe.db.get_single_value("Manufacturing Settings",
-			"overproduction_percentage_for_work_order"))
+		overproduction_percentage = flt(
+			frappe.db.get_single_value("Manufacturing Settings", "overproduction_percentage_for_work_order")
+		)
 
-		to_transfer_qty = flt(self.pro_doc.material_transferred_for_manufacturing) + flt(self.fg_completed_qty)
+		to_transfer_qty = flt(self.pro_doc.material_transferred_for_manufacturing) + flt(
+			self.fg_completed_qty
+		)
 		transfer_limit_qty = max_qty + ((max_qty * overproduction_percentage) / 100)
 
 		if transfer_limit_qty >= to_transfer_qty:
@@ -1497,9 +1795,11 @@
 			pending_to_issue = flt(item_details.required_qty) - flt(item_details.transferred_qty)
 			desire_to_transfer = flt(self.fg_completed_qty) * flt(item_details.required_qty) / max_qty
 
-			if (desire_to_transfer <= pending_to_issue
+			if (
+				desire_to_transfer <= pending_to_issue
 				or (desire_to_transfer > 0 and backflush_based_on == "Material Transferred for Manufacture")
-				or allow_overproduction):
+				or allow_overproduction
+			):
 				item_dict[item]["qty"] = desire_to_transfer
 			elif pending_to_issue > 0:
 				item_dict[item]["qty"] = pending_to_issue
@@ -1520,7 +1820,7 @@
 
 	def get_pro_order_required_items(self, backflush_based_on=None):
 		"""
-			Gets Work Order Required Items only if Stock Entry purpose is **Material Transferred for Manufacture**.
+		Gets Work Order Required Items only if Stock Entry purpose is **Material Transferred for Manufacture**.
 		"""
 		item_dict, job_card_items = frappe._dict(), []
 		work_order = frappe.get_doc("Work Order", self.work_order)
@@ -1539,7 +1839,9 @@
 				continue
 
 			transfer_pending = flt(d.required_qty) > flt(d.transferred_qty)
-			can_transfer = transfer_pending or (backflush_based_on == "Material Transferred for Manufacture")
+			can_transfer = transfer_pending or (
+				backflush_based_on == "Material Transferred for Manufacture"
+			)
 
 			if not can_transfer:
 				continue
@@ -1550,11 +1852,7 @@
 
 				if consider_job_card:
 					job_card_item = frappe.db.get_value(
-						"Job Card Item",
-						{
-							"item_code": d.item_code,
-							"parent": self.get("job_card")
-						}
+						"Job Card Item", {"item_code": d.item_code, "parent": self.get("job_card")}
 					)
 					item_row["job_card_item"] = job_card_item or None
 
@@ -1574,12 +1872,7 @@
 			return []
 
 		job_card_items = frappe.get_all(
-			"Job Card Item",
-			filters={
-				"parent": job_card
-			},
-			fields=["item_code"],
-			distinct=True
+			"Job Card Item", filters={"parent": job_card}, fields=["item_code"], distinct=True
 		)
 		return [d.item_code for d in job_card_items]
 
@@ -1588,60 +1881,87 @@
 			item_row = item_dict[d]
 			stock_uom = item_row.get("stock_uom") or frappe.db.get_value("Item", d, "stock_uom")
 
-			se_child = self.append('items')
+			se_child = self.append("items")
 			se_child.s_warehouse = item_row.get("from_warehouse")
 			se_child.t_warehouse = item_row.get("to_warehouse")
-			se_child.item_code = item_row.get('item_code') or cstr(d)
+			se_child.item_code = item_row.get("item_code") or cstr(d)
 			se_child.uom = item_row["uom"] if item_row.get("uom") else stock_uom
 			se_child.stock_uom = stock_uom
 			se_child.qty = flt(item_row["qty"], se_child.precision("qty"))
 			se_child.allow_alternative_item = item_row.get("allow_alternative_item", 0)
 			se_child.subcontracted_item = item_row.get("main_item_code")
-			se_child.cost_center = (item_row.get("cost_center") or
-				get_default_cost_center(item_row, company = self.company))
+			se_child.cost_center = item_row.get("cost_center") or get_default_cost_center(
+				item_row, company=self.company
+			)
 			se_child.is_finished_item = item_row.get("is_finished_item", 0)
 			se_child.is_scrap_item = item_row.get("is_scrap_item", 0)
 			se_child.is_process_loss = item_row.get("is_process_loss", 0)
 
-			for field in ["idx", "po_detail", "original_item", "expense_account",
-				"description", "item_name", "serial_no", "batch_no", "allow_zero_valuation_rate"]:
+			for field in [
+				"idx",
+				"po_detail",
+				"original_item",
+				"expense_account",
+				"description",
+				"item_name",
+				"serial_no",
+				"batch_no",
+				"allow_zero_valuation_rate",
+			]:
 				if item_row.get(field):
 					se_child.set(field, item_row.get(field))
 
-			if se_child.s_warehouse==None:
+			if se_child.s_warehouse == None:
 				se_child.s_warehouse = self.from_warehouse
-			if se_child.t_warehouse==None:
+			if se_child.t_warehouse == None:
 				se_child.t_warehouse = self.to_warehouse
 
 			# in stock uom
 			se_child.conversion_factor = flt(item_row.get("conversion_factor")) or 1
-			se_child.transfer_qty = flt(item_row["qty"]*se_child.conversion_factor, se_child.precision("qty"))
+			se_child.transfer_qty = flt(
+				item_row["qty"] * se_child.conversion_factor, se_child.precision("qty")
+			)
 
-			se_child.bom_no = bom_no # to be assigned for finished item
+			se_child.bom_no = bom_no  # to be assigned for finished item
 			se_child.job_card_item = item_row.get("job_card_item") if self.get("job_card") else None
 
 	def validate_with_material_request(self):
 		for item in self.get("items"):
 			material_request = item.material_request or None
 			material_request_item = item.material_request_item or None
-			if self.purpose == 'Material Transfer' and self.outgoing_stock_entry:
-				parent_se = frappe.get_value("Stock Entry Detail", item.ste_detail, ['material_request','material_request_item'],as_dict=True)
+			if self.purpose == "Material Transfer" and self.outgoing_stock_entry:
+				parent_se = frappe.get_value(
+					"Stock Entry Detail",
+					item.ste_detail,
+					["material_request", "material_request_item"],
+					as_dict=True,
+				)
 				if parent_se:
 					material_request = parent_se.material_request
 					material_request_item = parent_se.material_request_item
 
 			if material_request:
-				mreq_item = frappe.db.get_value("Material Request Item",
+				mreq_item = frappe.db.get_value(
+					"Material Request Item",
 					{"name": material_request_item, "parent": material_request},
-					["item_code", "warehouse", "idx"], as_dict=True)
+					["item_code", "warehouse", "idx"],
+					as_dict=True,
+				)
 				if mreq_item.item_code != item.item_code:
-					frappe.throw(_("Item for row {0} does not match Material Request").format(item.idx),
-						frappe.MappingMismatchError)
+					frappe.throw(
+						_("Item for row {0} does not match Material Request").format(item.idx),
+						frappe.MappingMismatchError,
+					)
 				elif self.purpose == "Material Transfer" and self.add_to_transit:
 					continue
 
 	def validate_batch(self):
-		if self.purpose in ["Material Transfer for Manufacture", "Manufacture", "Repack", "Send to Subcontractor"]:
+		if self.purpose in [
+			"Material Transfer for Manufacture",
+			"Manufacture",
+			"Repack",
+			"Send to Subcontractor",
+		]:
 			for item in self.get("items"):
 				if item.batch_no:
 					disabled = frappe.db.get_value("Batch", item.batch_no, "disabled")
@@ -1649,30 +1969,34 @@
 						expiry_date = frappe.db.get_value("Batch", item.batch_no, "expiry_date")
 						if expiry_date:
 							if getdate(self.posting_date) > getdate(expiry_date):
-								frappe.throw(_("Batch {0} of Item {1} has expired.")
-									.format(item.batch_no, item.item_code))
+								frappe.throw(_("Batch {0} of Item {1} has expired.").format(item.batch_no, item.item_code))
 					else:
-						frappe.throw(_("Batch {0} of Item {1} is disabled.")
-							.format(item.batch_no, item.item_code))
+						frappe.throw(_("Batch {0} of Item {1} is disabled.").format(item.batch_no, item.item_code))
 
 	def update_purchase_order_supplied_items(self):
-		if (self.purchase_order and
-			(self.purpose in ['Send to Subcontractor', 'Material Transfer'] or self.is_return)):
+		if self.purchase_order and (
+			self.purpose in ["Send to Subcontractor", "Material Transfer"] or self.is_return
+		):
 
-			#Get PO Supplied Items Details
-			item_wh = frappe._dict(frappe.db.sql("""
+			# Get PO Supplied Items Details
+			item_wh = frappe._dict(
+				frappe.db.sql(
+					"""
 				select rm_item_code, reserve_warehouse
 				from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitemsup
 				where po.name = poitemsup.parent
-				and po.name = %s""", self.purchase_order))
+				and po.name = %s""",
+					self.purchase_order,
+				)
+			)
 
 			supplied_items = get_supplied_items(self.purchase_order)
 			for name, item in supplied_items.items():
-				frappe.db.set_value('Purchase Order Item Supplied', name, item)
+				frappe.db.set_value("Purchase Order Item Supplied", name, item)
 
-			#Update reserved sub contracted quantity in bin based on Supplied Item Details and
+			# Update reserved sub contracted quantity in bin based on Supplied Item Details and
 			for d in self.get("items"):
-				item_code = d.get('original_item') or d.get('item_code')
+				item_code = d.get("original_item") or d.get("item_code")
 				reserve_warehouse = item_wh.get(item_code)
 				if not (reserve_warehouse and item_code):
 					continue
@@ -1680,12 +2004,17 @@
 				stock_bin.update_reserved_qty_for_sub_contracting()
 
 	def update_so_in_serial_number(self):
-		so_name, item_code = frappe.db.get_value("Work Order", self.work_order, ["sales_order", "production_item"])
+		so_name, item_code = frappe.db.get_value(
+			"Work Order", self.work_order, ["sales_order", "production_item"]
+		)
 		if so_name and item_code:
 			qty_to_reserve = get_reserved_qty_for_so(so_name, item_code)
 			if qty_to_reserve:
-				reserved_qty = frappe.db.sql("""select count(name) from `tabSerial No` where item_code=%s and
-					sales_order=%s""", (item_code, so_name))
+				reserved_qty = frappe.db.sql(
+					"""select count(name) from `tabSerial No` where item_code=%s and
+					sales_order=%s""",
+					(item_code, so_name),
+				)
 				if reserved_qty and reserved_qty[0][0]:
 					qty_to_reserve -= reserved_qty[0][0]
 				if qty_to_reserve > 0:
@@ -1696,7 +2025,7 @@
 							for serial_no in serial_nos:
 								if qty_to_reserve > 0:
 									frappe.db.set_value("Serial No", serial_no, "sales_order", so_name)
-									qty_to_reserve -=1
+									qty_to_reserve -= 1
 
 	def validate_reserved_serial_no_consumption(self):
 		for item in self.items:
@@ -1704,13 +2033,14 @@
 				for sr in get_serial_nos(item.serial_no):
 					sales_order = frappe.db.get_value("Serial No", sr, "sales_order")
 					if sales_order:
-						msg = (_("(Serial No: {0}) cannot be consumed as it's reserverd to fullfill Sales Order {1}.")
-							.format(sr, sales_order))
+						msg = _(
+							"(Serial No: {0}) cannot be consumed as it's reserverd to fullfill Sales Order {1}."
+						).format(sr, sales_order)
 
 						frappe.throw(_("Item {0} {1}").format(item.item_code, msg))
 
 	def update_transferred_qty(self):
-		if self.purpose == 'Material Transfer' and self.outgoing_stock_entry:
+		if self.purpose == "Material Transfer" and self.outgoing_stock_entry:
 			stock_entries = {}
 			stock_entries_child_list = []
 			for d in self.items:
@@ -1718,70 +2048,87 @@
 					continue
 
 				stock_entries_child_list.append(d.ste_detail)
-				transferred_qty = frappe.get_all("Stock Entry Detail", fields = ["sum(qty) as qty"],
-					filters = { 'against_stock_entry': d.against_stock_entry,
-						'ste_detail': d.ste_detail,'docstatus': 1})
+				transferred_qty = frappe.get_all(
+					"Stock Entry Detail",
+					fields=["sum(qty) as qty"],
+					filters={
+						"against_stock_entry": d.against_stock_entry,
+						"ste_detail": d.ste_detail,
+						"docstatus": 1,
+					},
+				)
 
-				stock_entries[(d.against_stock_entry, d.ste_detail)] = (transferred_qty[0].qty
-					if transferred_qty and transferred_qty[0] else 0.0) or 0.0
+				stock_entries[(d.against_stock_entry, d.ste_detail)] = (
+					transferred_qty[0].qty if transferred_qty and transferred_qty[0] else 0.0
+				) or 0.0
 
-			if not stock_entries: return None
+			if not stock_entries:
+				return None
 
-			cond = ''
+			cond = ""
 			for data, transferred_qty in stock_entries.items():
 				cond += """ WHEN (parent = %s and name = %s) THEN %s
-					""" %(frappe.db.escape(data[0]), frappe.db.escape(data[1]), transferred_qty)
+					""" % (
+					frappe.db.escape(data[0]),
+					frappe.db.escape(data[1]),
+					transferred_qty,
+				)
 
 			if stock_entries_child_list:
-				frappe.db.sql(""" UPDATE `tabStock Entry Detail`
+				frappe.db.sql(
+					""" UPDATE `tabStock Entry Detail`
 					SET
 						transferred_qty = CASE {cond} END
 					WHERE
-						name in ({ste_details}) """.format(cond=cond,
-					ste_details = ','.join(['%s'] * len(stock_entries_child_list))),
-				tuple(stock_entries_child_list))
+						name in ({ste_details}) """.format(
+						cond=cond, ste_details=",".join(["%s"] * len(stock_entries_child_list))
+					),
+					tuple(stock_entries_child_list),
+				)
 
 			args = {
-				'source_dt': 'Stock Entry Detail',
-				'target_field': 'transferred_qty',
-				'target_ref_field': 'qty',
-				'target_dt': 'Stock Entry Detail',
-				'join_field': 'ste_detail',
-				'target_parent_dt': 'Stock Entry',
-				'target_parent_field': 'per_transferred',
-				'source_field': 'qty',
-				'percent_join_field': 'against_stock_entry'
+				"source_dt": "Stock Entry Detail",
+				"target_field": "transferred_qty",
+				"target_ref_field": "qty",
+				"target_dt": "Stock Entry Detail",
+				"join_field": "ste_detail",
+				"target_parent_dt": "Stock Entry",
+				"target_parent_field": "per_transferred",
+				"source_field": "qty",
+				"percent_join_field": "against_stock_entry",
 			}
 
 			self._update_percent_field_in_targets(args, update_modified=True)
 
 	def update_quality_inspection(self):
 		if self.inspection_required:
-			reference_type = reference_name = ''
+			reference_type = reference_name = ""
 			if self.docstatus == 1:
 				reference_name = self.name
-				reference_type = 'Stock Entry'
+				reference_type = "Stock Entry"
 
 			for d in self.items:
 				if d.quality_inspection:
-					frappe.db.set_value("Quality Inspection", d.quality_inspection, {
-						'reference_type': reference_type,
-						'reference_name': reference_name
-					})
+					frappe.db.set_value(
+						"Quality Inspection",
+						d.quality_inspection,
+						{"reference_type": reference_type, "reference_name": reference_name},
+					)
+
 	def set_material_request_transfer_status(self, status):
 		material_requests = []
 		if self.outgoing_stock_entry:
-			parent_se = frappe.get_value("Stock Entry", self.outgoing_stock_entry, 'add_to_transit')
+			parent_se = frappe.get_value("Stock Entry", self.outgoing_stock_entry, "add_to_transit")
 
 		for item in self.items:
 			material_request = item.material_request or None
 			if self.purpose == "Material Transfer" and material_request not in material_requests:
 				if self.outgoing_stock_entry and parent_se:
-					material_request = frappe.get_value("Stock Entry Detail", item.ste_detail, 'material_request')
+					material_request = frappe.get_value("Stock Entry Detail", item.ste_detail, "material_request")
 
 			if material_request and material_request not in material_requests:
 				material_requests.append(material_request)
-				frappe.db.set_value('Material Request', material_request, 'transfer_status', status)
+				frappe.db.set_value("Material Request", material_request, "transfer_status", status)
 
 	def update_items_for_process_loss(self):
 		process_loss_dict = {}
@@ -1789,7 +2136,9 @@
 			if not d.is_process_loss:
 				continue
 
-			scrap_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_scrap_warehouse")
+			scrap_warehouse = frappe.db.get_single_value(
+				"Manufacturing Settings", "default_scrap_warehouse"
+			)
 			if scrap_warehouse is not None:
 				d.t_warehouse = scrap_warehouse
 			d.is_scrap_item = 0
@@ -1814,14 +2163,22 @@
 		for row in self.items:
 			if row.is_finished_item and row.item_code == self.pro_doc.production_item:
 				if args.get("serial_no"):
-					row.serial_no = '\n'.join(args["serial_no"][0: cint(row.qty)])
+					row.serial_no = "\n".join(args["serial_no"][0 : cint(row.qty)])
 
 	def get_serial_nos_for_fg(self, args):
-		fields = ["`tabStock Entry`.`name`", "`tabStock Entry Detail`.`qty`",
-			"`tabStock Entry Detail`.`serial_no`", "`tabStock Entry Detail`.`batch_no`"]
+		fields = [
+			"`tabStock Entry`.`name`",
+			"`tabStock Entry Detail`.`qty`",
+			"`tabStock Entry Detail`.`serial_no`",
+			"`tabStock Entry Detail`.`batch_no`",
+		]
 
-		filters = [["Stock Entry","work_order","=",self.work_order], ["Stock Entry","purpose","=","Manufacture"],
-			["Stock Entry","docstatus","=",1], ["Stock Entry Detail","item_code","=",self.pro_doc.production_item]]
+		filters = [
+			["Stock Entry", "work_order", "=", self.work_order],
+			["Stock Entry", "purpose", "=", "Manufacture"],
+			["Stock Entry", "docstatus", "=", 1],
+			["Stock Entry Detail", "item_code", "=", self.pro_doc.production_item],
+		]
 
 		stock_entries = frappe.get_all("Stock Entry", fields=fields, filters=filters)
 
@@ -1836,85 +2193,98 @@
 
 		return sorted(list(set(get_serial_nos(self.pro_doc.serial_no)) - set(used_serial_nos)))
 
+
 @frappe.whitelist()
 def move_sample_to_retention_warehouse(company, items):
 	if isinstance(items, str):
 		items = json.loads(items)
-	retention_warehouse = frappe.db.get_single_value('Stock Settings', 'sample_retention_warehouse')
+	retention_warehouse = frappe.db.get_single_value("Stock Settings", "sample_retention_warehouse")
 	stock_entry = frappe.new_doc("Stock Entry")
 	stock_entry.company = company
 	stock_entry.purpose = "Material Transfer"
 	stock_entry.set_stock_entry_type()
 	for item in items:
-		if item.get('sample_quantity') and item.get('batch_no'):
-			sample_quantity = validate_sample_quantity(item.get('item_code'), item.get('sample_quantity'),
-				item.get('transfer_qty') or item.get('qty'), item.get('batch_no'))
+		if item.get("sample_quantity") and item.get("batch_no"):
+			sample_quantity = validate_sample_quantity(
+				item.get("item_code"),
+				item.get("sample_quantity"),
+				item.get("transfer_qty") or item.get("qty"),
+				item.get("batch_no"),
+			)
 			if sample_quantity:
-				sample_serial_nos = ''
-				if item.get('serial_no'):
-					serial_nos = (item.get('serial_no')).split()
-					if serial_nos and len(serial_nos) > item.get('sample_quantity'):
-						serial_no_list = serial_nos[:-(len(serial_nos)-item.get('sample_quantity'))]
-						sample_serial_nos = '\n'.join(serial_no_list)
+				sample_serial_nos = ""
+				if item.get("serial_no"):
+					serial_nos = (item.get("serial_no")).split()
+					if serial_nos and len(serial_nos) > item.get("sample_quantity"):
+						serial_no_list = serial_nos[: -(len(serial_nos) - item.get("sample_quantity"))]
+						sample_serial_nos = "\n".join(serial_no_list)
 
-				stock_entry.append("items", {
-					"item_code": item.get('item_code'),
-					"s_warehouse": item.get('t_warehouse'),
-					"t_warehouse": retention_warehouse,
-					"qty": item.get('sample_quantity'),
-					"basic_rate": item.get('valuation_rate'),
-					'uom': item.get('uom'),
-					'stock_uom': item.get('stock_uom'),
-					"conversion_factor": 1.0,
-					"serial_no": sample_serial_nos,
-					'batch_no': item.get('batch_no')
-				})
-	if stock_entry.get('items'):
+				stock_entry.append(
+					"items",
+					{
+						"item_code": item.get("item_code"),
+						"s_warehouse": item.get("t_warehouse"),
+						"t_warehouse": retention_warehouse,
+						"qty": item.get("sample_quantity"),
+						"basic_rate": item.get("valuation_rate"),
+						"uom": item.get("uom"),
+						"stock_uom": item.get("stock_uom"),
+						"conversion_factor": 1.0,
+						"serial_no": sample_serial_nos,
+						"batch_no": item.get("batch_no"),
+					},
+				)
+	if stock_entry.get("items"):
 		return stock_entry.as_dict()
 
+
 @frappe.whitelist()
 def make_stock_in_entry(source_name, target_doc=None):
-
 	def set_missing_values(source, target):
 		target.set_stock_entry_type()
 
 	def update_item(source_doc, target_doc, source_parent):
-		target_doc.t_warehouse = ''
+		target_doc.t_warehouse = ""
 
-		if source_doc.material_request_item and source_doc.material_request :
-			add_to_transit = frappe.db.get_value('Stock Entry', source_name, 'add_to_transit')
+		if source_doc.material_request_item and source_doc.material_request:
+			add_to_transit = frappe.db.get_value("Stock Entry", source_name, "add_to_transit")
 			if add_to_transit:
-				warehouse = frappe.get_value('Material Request Item', source_doc.material_request_item, 'warehouse')
+				warehouse = frappe.get_value(
+					"Material Request Item", source_doc.material_request_item, "warehouse"
+				)
 				target_doc.t_warehouse = warehouse
 
 		target_doc.s_warehouse = source_doc.t_warehouse
 		target_doc.qty = source_doc.qty - source_doc.transferred_qty
 
-	doclist = get_mapped_doc("Stock Entry", source_name, 	{
-		"Stock Entry": {
-			"doctype": "Stock Entry",
-			"field_map": {
-				"name": "outgoing_stock_entry"
+	doclist = get_mapped_doc(
+		"Stock Entry",
+		source_name,
+		{
+			"Stock Entry": {
+				"doctype": "Stock Entry",
+				"field_map": {"name": "outgoing_stock_entry"},
+				"validation": {"docstatus": ["=", 1]},
 			},
-			"validation": {
-				"docstatus": ["=", 1]
-			}
-		},
-		"Stock Entry Detail": {
-			"doctype": "Stock Entry Detail",
-			"field_map": {
-				"name": "ste_detail",
-				"parent": "against_stock_entry",
-				"serial_no": "serial_no",
-				"batch_no": "batch_no"
+			"Stock Entry Detail": {
+				"doctype": "Stock Entry Detail",
+				"field_map": {
+					"name": "ste_detail",
+					"parent": "against_stock_entry",
+					"serial_no": "serial_no",
+					"batch_no": "batch_no",
+				},
+				"postprocess": update_item,
+				"condition": lambda doc: flt(doc.qty) - flt(doc.transferred_qty) > 0.01,
 			},
-			"postprocess": update_item,
-			"condition": lambda doc: flt(doc.qty) - flt(doc.transferred_qty) > 0.01
 		},
-	}, target_doc, set_missing_values)
+		target_doc,
+		set_missing_values,
+	)
 
 	return doclist
 
+
 @frappe.whitelist()
 def get_work_order_details(work_order, company):
 	work_order = frappe.get_doc("Work Order", work_order)
@@ -1926,9 +2296,10 @@
 		"use_multi_level_bom": work_order.use_multi_level_bom,
 		"wip_warehouse": work_order.wip_warehouse,
 		"fg_warehouse": work_order.fg_warehouse,
-		"fg_completed_qty": pending_qty_to_produce
+		"fg_completed_qty": pending_qty_to_produce,
 	}
 
+
 def get_operating_cost_per_unit(work_order=None, bom_no=None):
 	operating_cost_per_unit = 0
 	if work_order:
@@ -1947,54 +2318,78 @@
 		if bom.quantity:
 			operating_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity)
 
-	if work_order and work_order.produced_qty and cint(frappe.db.get_single_value('Manufacturing Settings',
-		'add_corrective_operation_cost_in_finished_good_valuation')):
-		operating_cost_per_unit += flt(work_order.corrective_operation_cost) / flt(work_order.produced_qty)
+	if (
+		work_order
+		and work_order.produced_qty
+		and cint(
+			frappe.db.get_single_value(
+				"Manufacturing Settings", "add_corrective_operation_cost_in_finished_good_valuation"
+			)
+		)
+	):
+		operating_cost_per_unit += flt(work_order.corrective_operation_cost) / flt(
+			work_order.produced_qty
+		)
 
 	return operating_cost_per_unit
 
+
 def get_used_alternative_items(purchase_order=None, work_order=None):
 	cond = ""
 
 	if purchase_order:
-		cond = "and ste.purpose = 'Send to Subcontractor' and ste.purchase_order = '{0}'".format(purchase_order)
+		cond = "and ste.purpose = 'Send to Subcontractor' and ste.purchase_order = '{0}'".format(
+			purchase_order
+		)
 	elif work_order:
-		cond = "and ste.purpose = 'Material Transfer for Manufacture' and ste.work_order = '{0}'".format(work_order)
+		cond = "and ste.purpose = 'Material Transfer for Manufacture' and ste.work_order = '{0}'".format(
+			work_order
+		)
 
-	if not cond: return {}
+	if not cond:
+		return {}
 
 	used_alternative_items = {}
-	data = frappe.db.sql(""" select sted.original_item, sted.uom, sted.conversion_factor,
+	data = frappe.db.sql(
+		""" select sted.original_item, sted.uom, sted.conversion_factor,
 			sted.item_code, sted.item_name, sted.conversion_factor,sted.stock_uom, sted.description
 		from
 			`tabStock Entry` ste, `tabStock Entry Detail` sted
 		where
 			sted.parent = ste.name and ste.docstatus = 1 and sted.original_item !=  sted.item_code
-			{0} """.format(cond), as_dict=1)
+			{0} """.format(
+			cond
+		),
+		as_dict=1,
+	)
 
 	for d in data:
 		used_alternative_items[d.original_item] = d
 
 	return used_alternative_items
 
+
 def get_valuation_rate_for_finished_good_entry(work_order):
-	work_order_qty = flt(frappe.get_cached_value("Work Order",
-		work_order, 'material_transferred_for_manufacturing'))
+	work_order_qty = flt(
+		frappe.get_cached_value("Work Order", work_order, "material_transferred_for_manufacturing")
+	)
 
 	field = "(SUM(total_outgoing_value) / %s) as valuation_rate" % (work_order_qty)
 
-	stock_data = frappe.get_all("Stock Entry",
-		fields = field,
-		filters = {
+	stock_data = frappe.get_all(
+		"Stock Entry",
+		fields=field,
+		filters={
 			"docstatus": 1,
 			"purpose": "Material Transfer for Manufacture",
-			"work_order": work_order
-		}
+			"work_order": work_order,
+		},
 	)
 
 	if stock_data:
 		return stock_data[0].valuation_rate
 
+
 @frappe.whitelist()
 def get_uom_details(item_code, uom, qty):
 	"""Returns dict `{"conversion_factor": [value], "transfer_qty": qty * [value]}`
@@ -2003,24 +2398,31 @@
 	conversion_factor = get_conversion_factor(item_code, uom).get("conversion_factor")
 
 	if not conversion_factor:
-		frappe.msgprint(_("UOM coversion factor required for UOM: {0} in Item: {1}")
-			.format(uom, item_code))
-		ret = {'uom' : ''}
+		frappe.msgprint(
+			_("UOM coversion factor required for UOM: {0} in Item: {1}").format(uom, item_code)
+		)
+		ret = {"uom": ""}
 	else:
 		ret = {
-			'conversion_factor'		: flt(conversion_factor),
-			'transfer_qty'			: flt(qty) * flt(conversion_factor)
+			"conversion_factor": flt(conversion_factor),
+			"transfer_qty": flt(qty) * flt(conversion_factor),
 		}
 	return ret
 
+
 @frappe.whitelist()
 def get_expired_batch_items():
-	return frappe.db.sql("""select b.item, sum(sle.actual_qty) as qty, sle.batch_no, sle.warehouse, sle.stock_uom\
+	return frappe.db.sql(
+		"""select b.item, sum(sle.actual_qty) as qty, sle.batch_no, sle.warehouse, sle.stock_uom\
 	from `tabBatch` b, `tabStock Ledger Entry` sle
 	where b.expiry_date <= %s
 	and b.expiry_date is not NULL
 	and b.batch_id = sle.batch_no and sle.is_cancelled = 0
-	group by sle.warehouse, sle.item_code, sle.batch_no""",(nowdate()), as_dict=1)
+	group by sle.warehouse, sle.item_code, sle.batch_no""",
+		(nowdate()),
+		as_dict=1,
+	)
+
 
 @frappe.whitelist()
 def get_warehouse_details(args):
@@ -2031,51 +2433,73 @@
 
 	ret = {}
 	if args.warehouse and args.item_code:
-		args.update({
-			"posting_date": args.posting_date,
-			"posting_time": args.posting_time,
-		})
+		args.update(
+			{
+				"posting_date": args.posting_date,
+				"posting_time": args.posting_time,
+			}
+		)
 		ret = {
-			"actual_qty" : get_previous_sle(args).get("qty_after_transaction") or 0,
-			"basic_rate" : get_incoming_rate(args)
+			"actual_qty": get_previous_sle(args).get("qty_after_transaction") or 0,
+			"basic_rate": get_incoming_rate(args),
 		}
 	return ret
 
+
 @frappe.whitelist()
-def validate_sample_quantity(item_code, sample_quantity, qty, batch_no = None):
+def validate_sample_quantity(item_code, sample_quantity, qty, batch_no=None):
 	if cint(qty) < cint(sample_quantity):
-		frappe.throw(_("Sample quantity {0} cannot be more than received quantity {1}").format(sample_quantity, qty))
-	retention_warehouse = frappe.db.get_single_value('Stock Settings', 'sample_retention_warehouse')
+		frappe.throw(
+			_("Sample quantity {0} cannot be more than received quantity {1}").format(sample_quantity, qty)
+		)
+	retention_warehouse = frappe.db.get_single_value("Stock Settings", "sample_retention_warehouse")
 	retainted_qty = 0
 	if batch_no:
 		retainted_qty = get_batch_qty(batch_no, retention_warehouse, item_code)
-	max_retain_qty = frappe.get_value('Item', item_code, 'sample_quantity')
+	max_retain_qty = frappe.get_value("Item", item_code, "sample_quantity")
 	if retainted_qty >= max_retain_qty:
-		frappe.msgprint(_("Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}.").
-			format(retainted_qty, batch_no, item_code, batch_no), alert=True)
+		frappe.msgprint(
+			_(
+				"Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}."
+			).format(retainted_qty, batch_no, item_code, batch_no),
+			alert=True,
+		)
 		sample_quantity = 0
-	qty_diff = max_retain_qty-retainted_qty
+	qty_diff = max_retain_qty - retainted_qty
 	if cint(sample_quantity) > cint(qty_diff):
-		frappe.msgprint(_("Maximum Samples - {0} can be retained for Batch {1} and Item {2}.").
-			format(max_retain_qty, batch_no, item_code), alert=True)
+		frappe.msgprint(
+			_("Maximum Samples - {0} can be retained for Batch {1} and Item {2}.").format(
+				max_retain_qty, batch_no, item_code
+			),
+			alert=True,
+		)
 		sample_quantity = qty_diff
 	return sample_quantity
 
-def get_supplied_items(purchase_order):
-	fields = ['`tabStock Entry Detail`.`transfer_qty`', '`tabStock Entry`.`is_return`',
-			'`tabStock Entry Detail`.`po_detail`', '`tabStock Entry Detail`.`item_code`']
 
-	filters = [['Stock Entry', 'docstatus', '=', 1], ['Stock Entry', 'purchase_order', '=', purchase_order]]
+def get_supplied_items(purchase_order):
+	fields = [
+		"`tabStock Entry Detail`.`transfer_qty`",
+		"`tabStock Entry`.`is_return`",
+		"`tabStock Entry Detail`.`po_detail`",
+		"`tabStock Entry Detail`.`item_code`",
+	]
+
+	filters = [
+		["Stock Entry", "docstatus", "=", 1],
+		["Stock Entry", "purchase_order", "=", purchase_order],
+	]
 
 	supplied_item_details = {}
-	for row in frappe.get_all('Stock Entry', fields = fields, filters = filters):
+	for row in frappe.get_all("Stock Entry", fields=fields, filters=filters):
 		if not row.po_detail:
 			continue
 
 		key = row.po_detail
 		if key not in supplied_item_details:
-			supplied_item_details.setdefault(key,
-				frappe._dict({'supplied_qty': 0, 'returned_qty':0, 'total_supplied_qty':0}))
+			supplied_item_details.setdefault(
+				key, frappe._dict({"supplied_qty": 0, "returned_qty": 0, "total_supplied_qty": 0})
+			)
 
 		supplied_item = supplied_item_details[key]
 
@@ -2084,6 +2508,8 @@
 		else:
 			supplied_item.supplied_qty += row.transfer_qty
 
-		supplied_item.total_supplied_qty = flt(supplied_item.supplied_qty) - flt(supplied_item.returned_qty)
+		supplied_item.total_supplied_qty = flt(supplied_item.supplied_qty) - flt(
+			supplied_item.returned_qty
+		)
 
 	return supplied_item_details
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
index 17266ad..b3df728 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
@@ -10,7 +10,7 @@
 
 @frappe.whitelist()
 def make_stock_entry(**args):
-	'''Helper function to make a Stock Entry
+	"""Helper function to make a Stock Entry
 
 	:item_code: Item to be moved
 	:qty: Qty to be moved
@@ -25,16 +25,16 @@
 	:purpose: Optional
 	:do_not_save: Optional flag
 	:do_not_submit: Optional flag
-	'''
+	"""
 
 	def process_serial_numbers(serial_nos_list):
 		serial_nos_list = [
-			'\n'.join(serial_num['serial_no'] for serial_num in serial_nos_list if serial_num.serial_no)
+			"\n".join(serial_num["serial_no"] for serial_num in serial_nos_list if serial_num.serial_no)
 		]
 
-		uniques = list(set(serial_nos_list[0].split('\n')))
+		uniques = list(set(serial_nos_list[0].split("\n")))
 
-		return '\n'.join(uniques)
+		return "\n".join(uniques)
 
 	s = frappe.new_doc("Stock Entry")
 	args = frappe._dict(args)
@@ -60,7 +60,7 @@
 		s.apply_putaway_rule = args.apply_putaway_rule
 
 	if isinstance(args.qty, str):
-		if '.' in args.qty:
+		if "." in args.qty:
 			args.qty = flt(args.qty)
 		else:
 			args.qty = cint(args.qty)
@@ -79,16 +79,16 @@
 	# company
 	if not args.company:
 		if args.source:
-			args.company = frappe.db.get_value('Warehouse', args.source, 'company')
+			args.company = frappe.db.get_value("Warehouse", args.source, "company")
 		elif args.target:
-			args.company = frappe.db.get_value('Warehouse', args.target, 'company')
+			args.company = frappe.db.get_value("Warehouse", args.target, "company")
 
 	# set vales from test
 	if frappe.flags.in_test:
 		if not args.company:
-			args.company = '_Test Company'
+			args.company = "_Test Company"
 		if not args.item:
-			args.item = '_Test Item'
+			args.item = "_Test Item"
 
 	s.company = args.company or erpnext.get_default_company()
 	s.purchase_receipt_no = args.purchase_receipt_no
@@ -96,40 +96,40 @@
 	s.sales_invoice_no = args.sales_invoice_no
 	s.is_opening = args.is_opening or "No"
 	if not args.cost_center:
-		args.cost_center = frappe.get_value('Company', s.company, 'cost_center')
+		args.cost_center = frappe.get_value("Company", s.company, "cost_center")
 
 	if not args.expense_account and s.is_opening == "No":
-		args.expense_account = frappe.get_value('Company', s.company, 'stock_adjustment_account')
+		args.expense_account = frappe.get_value("Company", s.company, "stock_adjustment_account")
 
 	# We can find out the serial number using the batch source document
 	serial_number = args.serial_no
 
 	if not args.serial_no and args.qty and args.batch_no:
 		serial_number_list = frappe.get_list(
-			doctype='Stock Ledger Entry',
-			fields=['serial_no'],
-			filters={
-				'batch_no': args.batch_no,
-				'warehouse': args.from_warehouse
-			}
+			doctype="Stock Ledger Entry",
+			fields=["serial_no"],
+			filters={"batch_no": args.batch_no, "warehouse": args.from_warehouse},
 		)
 		serial_number = process_serial_numbers(serial_number_list)
 
 	args.serial_no = serial_number
 
-	s.append("items", {
-		"item_code": args.item,
-		"s_warehouse": args.source,
-		"t_warehouse": args.target,
-		"qty": args.qty,
-		"basic_rate": args.rate or args.basic_rate,
-		"conversion_factor": args.conversion_factor or 1.0,
-		"transfer_qty": flt(args.qty) * (flt(args.conversion_factor) or 1.0),
-		"serial_no": args.serial_no,
-		'batch_no': args.batch_no,
-		'cost_center': args.cost_center,
-		'expense_account': args.expense_account
-	})
+	s.append(
+		"items",
+		{
+			"item_code": args.item,
+			"s_warehouse": args.source,
+			"t_warehouse": args.target,
+			"qty": args.qty,
+			"basic_rate": args.rate or args.basic_rate,
+			"conversion_factor": args.conversion_factor or 1.0,
+			"transfer_qty": flt(args.qty) * (flt(args.conversion_factor) or 1.0),
+			"serial_no": args.serial_no,
+			"batch_no": args.batch_no,
+			"cost_center": args.cost_center,
+			"expense_account": args.expense_account,
+		},
+	)
 
 	s.set_stock_entry_type()
 	if not args.do_not_save:
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index 54c0e43..aeedcd1 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -38,9 +38,14 @@
 		condition += "`{0}`=%s".format(key)
 		values.append(value)
 
-	return frappe.db.sql("""select * from `tabStock Ledger Entry` %s
-		order by timestamp(posting_date, posting_time) desc, creation desc limit 1"""% condition,
-		values, as_dict=1)
+	return frappe.db.sql(
+		"""select * from `tabStock Ledger Entry` %s
+		order by timestamp(posting_date, posting_time) desc, creation desc limit 1"""
+		% condition,
+		values,
+		as_dict=1,
+	)
+
 
 class TestStockEntry(FrappeTestCase):
 	def tearDown(self):
@@ -53,36 +58,37 @@
 		item_code = "_Test Item 2"
 		warehouse = "_Test Warehouse - _TC"
 
-		create_stock_reconciliation(item_code="_Test Item 2", warehouse="_Test Warehouse - _TC",
-			qty=0, rate=100)
+		create_stock_reconciliation(
+			item_code="_Test Item 2", warehouse="_Test Warehouse - _TC", qty=0, rate=100
+		)
 
 		make_stock_entry(item_code=item_code, target=warehouse, qty=1, basic_rate=10)
-		sle = get_sle(item_code = item_code, warehouse = warehouse)[0]
+		sle = get_sle(item_code=item_code, warehouse=warehouse)[0]
 
 		self.assertEqual([[1, 10]], frappe.safe_eval(sle.stock_queue))
 
 		# negative qty
 		make_stock_entry(item_code=item_code, source=warehouse, qty=2, basic_rate=10)
-		sle = get_sle(item_code = item_code, warehouse = warehouse)[0]
+		sle = get_sle(item_code=item_code, warehouse=warehouse)[0]
 
 		self.assertEqual([[-1, 10]], frappe.safe_eval(sle.stock_queue))
 
 		# further negative
 		make_stock_entry(item_code=item_code, source=warehouse, qty=1)
-		sle = get_sle(item_code = item_code, warehouse = warehouse)[0]
+		sle = get_sle(item_code=item_code, warehouse=warehouse)[0]
 
 		self.assertEqual([[-2, 10]], frappe.safe_eval(sle.stock_queue))
 
 		# move stock to positive
 		make_stock_entry(item_code=item_code, target=warehouse, qty=3, basic_rate=20)
-		sle = get_sle(item_code = item_code, warehouse = warehouse)[0]
+		sle = get_sle(item_code=item_code, warehouse=warehouse)[0]
 		self.assertEqual([[1, 20]], frappe.safe_eval(sle.stock_queue))
 
 		# incoming entry with diff rate
 		make_stock_entry(item_code=item_code, target=warehouse, qty=1, basic_rate=30)
-		sle = get_sle(item_code = item_code, warehouse = warehouse)[0]
+		sle = get_sle(item_code=item_code, warehouse=warehouse)[0]
 
-		self.assertEqual([[1, 20],[1, 30]], frappe.safe_eval(sle.stock_queue))
+		self.assertEqual([[1, 20], [1, 30]], frappe.safe_eval(sle.stock_queue))
 
 		frappe.db.set_default("allow_negative_stock", 0)
 
@@ -92,37 +98,48 @@
 		self._test_auto_material_request("_Test Item", material_request_type="Transfer")
 
 	def test_auto_material_request_for_variant(self):
-		fields = [{'field_name': 'reorder_levels'}]
+		fields = [{"field_name": "reorder_levels"}]
 		set_item_variant_settings(fields)
 		make_item_variant()
 		template = frappe.get_doc("Item", "_Test Variant Item")
 
 		if not template.reorder_levels:
-			template.append('reorder_levels', {
-				"material_request_type": "Purchase",
-				"warehouse": "_Test Warehouse - _TC",
-				"warehouse_reorder_level": 20,
-				"warehouse_reorder_qty": 20
-			})
+			template.append(
+				"reorder_levels",
+				{
+					"material_request_type": "Purchase",
+					"warehouse": "_Test Warehouse - _TC",
+					"warehouse_reorder_level": 20,
+					"warehouse_reorder_qty": 20,
+				},
+			)
 
 		template.save()
 		self._test_auto_material_request("_Test Variant Item-S")
 
 	def test_auto_material_request_for_warehouse_group(self):
-		self._test_auto_material_request("_Test Item Warehouse Group Wise Reorder", warehouse="_Test Warehouse Group-C1 - _TC")
+		self._test_auto_material_request(
+			"_Test Item Warehouse Group Wise Reorder", warehouse="_Test Warehouse Group-C1 - _TC"
+		)
 
-	def _test_auto_material_request(self, item_code, material_request_type="Purchase", warehouse="_Test Warehouse - _TC"):
+	def _test_auto_material_request(
+		self, item_code, material_request_type="Purchase", warehouse="_Test Warehouse - _TC"
+	):
 		variant = frappe.get_doc("Item", item_code)
 
-		projected_qty, actual_qty = frappe.db.get_value("Bin", {"item_code": item_code,
-			"warehouse": warehouse}, ["projected_qty", "actual_qty"]) or [0, 0]
+		projected_qty, actual_qty = frappe.db.get_value(
+			"Bin", {"item_code": item_code, "warehouse": warehouse}, ["projected_qty", "actual_qty"]
+		) or [0, 0]
 
 		# stock entry reqd for auto-reorder
-		create_stock_reconciliation(item_code=item_code, warehouse=warehouse,
-			qty = actual_qty + abs(projected_qty) + 10, rate=100)
+		create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=actual_qty + abs(projected_qty) + 10, rate=100
+		)
 
-		projected_qty = frappe.db.get_value("Bin", {"item_code": item_code,
-			"warehouse": warehouse}, "projected_qty") or 0
+		projected_qty = (
+			frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "projected_qty")
+			or 0
+		)
 
 		frappe.db.set_value("Stock Settings", None, "auto_indent", 1)
 
@@ -133,6 +150,7 @@
 			variant.save()
 
 		from erpnext.stock.reorder_item import reorder_item
+
 		mr_list = reorder_item()
 
 		frappe.db.set_value("Stock Settings", None, "auto_indent", 0)
@@ -145,65 +163,113 @@
 		self.assertTrue(item_code in items)
 
 	def test_material_receipt_gl_entry(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
-		mr = make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company,
-			qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1")
+		mr = make_stock_entry(
+			item_code="_Test Item",
+			target="Stores - TCP1",
+			company=company,
+			qty=50,
+			basic_rate=100,
+			expense_account="Stock Adjustment - TCP1",
+		)
 
 		stock_in_hand_account = get_inventory_account(mr.company, mr.get("items")[0].t_warehouse)
-		self.check_stock_ledger_entries("Stock Entry", mr.name,
-			[["_Test Item", "Stores - TCP1", 50.0]])
+		self.check_stock_ledger_entries("Stock Entry", mr.name, [["_Test Item", "Stores - TCP1", 50.0]])
 
-		self.check_gl_entries("Stock Entry", mr.name,
-			sorted([
-				[stock_in_hand_account, 5000.0, 0.0],
-				["Stock Adjustment - TCP1", 0.0, 5000.0]
-			])
+		self.check_gl_entries(
+			"Stock Entry",
+			mr.name,
+			sorted([[stock_in_hand_account, 5000.0, 0.0], ["Stock Adjustment - TCP1", 0.0, 5000.0]]),
 		)
 
 		mr.cancel()
 
-		self.assertTrue(frappe.db.sql("""select * from `tabStock Ledger Entry`
-			where voucher_type='Stock Entry' and voucher_no=%s""", mr.name))
+		self.assertTrue(
+			frappe.db.sql(
+				"""select * from `tabStock Ledger Entry`
+			where voucher_type='Stock Entry' and voucher_no=%s""",
+				mr.name,
+			)
+		)
 
-		self.assertTrue(frappe.db.sql("""select * from `tabGL Entry`
-			where voucher_type='Stock Entry' and voucher_no=%s""", mr.name))
+		self.assertTrue(
+			frappe.db.sql(
+				"""select * from `tabGL Entry`
+			where voucher_type='Stock Entry' and voucher_no=%s""",
+				mr.name,
+			)
+		)
 
 	def test_material_issue_gl_entry(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
-		make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company,
-			qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1")
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
+		make_stock_entry(
+			item_code="_Test Item",
+			target="Stores - TCP1",
+			company=company,
+			qty=50,
+			basic_rate=100,
+			expense_account="Stock Adjustment - TCP1",
+		)
 
-		mi = make_stock_entry(item_code="_Test Item", source="Stores - TCP1", company=company,
-			qty=40, expense_account="Stock Adjustment - TCP1")
+		mi = make_stock_entry(
+			item_code="_Test Item",
+			source="Stores - TCP1",
+			company=company,
+			qty=40,
+			expense_account="Stock Adjustment - TCP1",
+		)
 
-		self.check_stock_ledger_entries("Stock Entry", mi.name,
-			[["_Test Item", "Stores - TCP1", -40.0]])
+		self.check_stock_ledger_entries("Stock Entry", mi.name, [["_Test Item", "Stores - TCP1", -40.0]])
 
 		stock_in_hand_account = get_inventory_account(mi.company, "Stores - TCP1")
-		stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
-			"voucher_no": mi.name}, "stock_value_difference"))
+		stock_value_diff = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Stock Entry", "voucher_no": mi.name},
+				"stock_value_difference",
+			)
+		)
 
-		self.check_gl_entries("Stock Entry", mi.name,
-			sorted([
-				[stock_in_hand_account, 0.0, stock_value_diff],
-				["Stock Adjustment - TCP1", stock_value_diff, 0.0]
-			])
+		self.check_gl_entries(
+			"Stock Entry",
+			mi.name,
+			sorted(
+				[
+					[stock_in_hand_account, 0.0, stock_value_diff],
+					["Stock Adjustment - TCP1", stock_value_diff, 0.0],
+				]
+			),
 		)
 		mi.cancel()
 
 	def test_material_transfer_gl_entry(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
-		item_code = 'Hand Sanitizer - 001'
-		create_item(item_code =item_code, is_stock_item = 1,
-			is_purchase_item=1, opening_stock=1000, valuation_rate=10, company=company, warehouse="Stores - TCP1")
+		item_code = "Hand Sanitizer - 001"
+		create_item(
+			item_code=item_code,
+			is_stock_item=1,
+			is_purchase_item=1,
+			opening_stock=1000,
+			valuation_rate=10,
+			company=company,
+			warehouse="Stores - TCP1",
+		)
 
-		mtn = make_stock_entry(item_code=item_code, source="Stores - TCP1",
-			target="Finished Goods - TCP1", qty=45, company=company)
+		mtn = make_stock_entry(
+			item_code=item_code,
+			source="Stores - TCP1",
+			target="Finished Goods - TCP1",
+			qty=45,
+			company=company,
+		)
 
-		self.check_stock_ledger_entries("Stock Entry", mtn.name,
-			[[item_code, "Stores - TCP1", -45.0], [item_code, "Finished Goods - TCP1", 45.0]])
+		self.check_stock_ledger_entries(
+			"Stock Entry",
+			mtn.name,
+			[[item_code, "Stores - TCP1", -45.0], [item_code, "Finished Goods - TCP1", 45.0]],
+		)
 
 		source_warehouse_account = get_inventory_account(mtn.company, mtn.get("items")[0].s_warehouse)
 
@@ -211,18 +277,33 @@
 
 		if source_warehouse_account == target_warehouse_account:
 			# no gl entry as both source and target warehouse has linked to same account.
-			self.assertFalse(frappe.db.sql("""select * from `tabGL Entry`
-				where voucher_type='Stock Entry' and voucher_no=%s""", mtn.name, as_dict=1))
+			self.assertFalse(
+				frappe.db.sql(
+					"""select * from `tabGL Entry`
+				where voucher_type='Stock Entry' and voucher_no=%s""",
+					mtn.name,
+					as_dict=1,
+				)
+			)
 
 		else:
-			stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
-				"voucher_no": mtn.name, "warehouse": "Stores - TCP1"}, "stock_value_difference"))
+			stock_value_diff = abs(
+				frappe.db.get_value(
+					"Stock Ledger Entry",
+					{"voucher_type": "Stock Entry", "voucher_no": mtn.name, "warehouse": "Stores - TCP1"},
+					"stock_value_difference",
+				)
+			)
 
-			self.check_gl_entries("Stock Entry", mtn.name,
-				sorted([
-					[source_warehouse_account, 0.0, stock_value_diff],
-					[target_warehouse_account, stock_value_diff, 0.0],
-				])
+			self.check_gl_entries(
+				"Stock Entry",
+				mtn.name,
+				sorted(
+					[
+						[source_warehouse_account, 0.0, stock_value_diff],
+						[target_warehouse_account, stock_value_diff, 0.0],
+					]
+				),
 			)
 
 		mtn.cancel()
@@ -239,20 +320,23 @@
 		repack.items[0].transfer_qty = 100.0
 		repack.items[1].qty = 50.0
 
-		repack.append("items", {
-			"conversion_factor": 1.0,
-			"cost_center": "_Test Cost Center - _TC",
-			"doctype": "Stock Entry Detail",
-			"expense_account": "Stock Adjustment - _TC",
-			"basic_rate": 150,
-			"item_code": "_Test Item 2",
-			"parentfield": "items",
-			"qty": 50.0,
-			"stock_uom": "_Test UOM",
-			"t_warehouse": "_Test Warehouse - _TC",
-			"transfer_qty": 50.0,
-			"uom": "_Test UOM"
-		})
+		repack.append(
+			"items",
+			{
+				"conversion_factor": 1.0,
+				"cost_center": "_Test Cost Center - _TC",
+				"doctype": "Stock Entry Detail",
+				"expense_account": "Stock Adjustment - _TC",
+				"basic_rate": 150,
+				"item_code": "_Test Item 2",
+				"parentfield": "items",
+				"qty": 50.0,
+				"stock_uom": "_Test UOM",
+				"t_warehouse": "_Test Warehouse - _TC",
+				"transfer_qty": 50.0,
+				"uom": "_Test UOM",
+			},
+		)
 		repack.set_stock_entry_type()
 		repack.insert()
 
@@ -265,12 +349,13 @@
 		# must raise error if 0 fg in repack entry
 		self.assertRaises(FinishedGoodError, repack.validate_finished_goods)
 
-		repack.delete() # teardown
+		repack.delete()  # teardown
 
 	def test_repack_no_change_in_valuation(self):
 		make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100)
-		make_stock_entry(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC",
-			qty=50, basic_rate=100)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=50, basic_rate=100
+		)
 
 		repack = frappe.copy_doc(test_records[3])
 		repack.posting_date = nowdate()
@@ -279,76 +364,113 @@
 		repack.insert()
 		repack.submit()
 
-		self.check_stock_ledger_entries("Stock Entry", repack.name,
-			[["_Test Item", "_Test Warehouse - _TC", -50.0],
-				["_Test Item Home Desktop 100", "_Test Warehouse - _TC", 1]])
+		self.check_stock_ledger_entries(
+			"Stock Entry",
+			repack.name,
+			[
+				["_Test Item", "_Test Warehouse - _TC", -50.0],
+				["_Test Item Home Desktop 100", "_Test Warehouse - _TC", 1],
+			],
+		)
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Stock Entry' and voucher_no=%s
-			order by account desc""", repack.name, as_dict=1)
+			order by account desc""",
+			repack.name,
+			as_dict=1,
+		)
 		self.assertFalse(gl_entries)
 
 	def test_repack_with_additional_costs(self):
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 
-		make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company,
-			qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1")
+		make_stock_entry(
+			item_code="_Test Item",
+			target="Stores - TCP1",
+			company=company,
+			qty=50,
+			basic_rate=100,
+			expense_account="Stock Adjustment - TCP1",
+		)
 
-
-		repack = make_stock_entry(company = company, purpose="Repack", do_not_save=True)
+		repack = make_stock_entry(company=company, purpose="Repack", do_not_save=True)
 		repack.posting_date = nowdate()
 		repack.posting_time = nowtime()
 
-		expenses_included_in_valuation = frappe.get_value("Company", company, "expenses_included_in_valuation")
+		expenses_included_in_valuation = frappe.get_value(
+			"Company", company, "expenses_included_in_valuation"
+		)
 
 		items = get_multiple_items()
 		repack.items = []
 		for item in items:
 			repack.append("items", item)
 
-		repack.set("additional_costs", [
-			{
-				"expense_account": expenses_included_in_valuation,
-				"description": "Actual Operating Cost",
-				"amount": 1000
-			},
-			{
-				"expense_account": expenses_included_in_valuation,
-				"description": "Additional Operating Cost",
-				"amount": 200
-			},
-		])
+		repack.set(
+			"additional_costs",
+			[
+				{
+					"expense_account": expenses_included_in_valuation,
+					"description": "Actual Operating Cost",
+					"amount": 1000,
+				},
+				{
+					"expense_account": expenses_included_in_valuation,
+					"description": "Additional Operating Cost",
+					"amount": 200,
+				},
+			],
+		)
 
 		repack.set_stock_entry_type()
 		repack.insert()
 		repack.submit()
 
 		stock_in_hand_account = get_inventory_account(repack.company, repack.get("items")[1].t_warehouse)
-		rm_stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
-			"voucher_no": repack.name, "item_code": "_Test Item"}, "stock_value_difference"))
+		rm_stock_value_diff = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Stock Entry", "voucher_no": repack.name, "item_code": "_Test Item"},
+				"stock_value_difference",
+			)
+		)
 
-		fg_stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
-			"voucher_no": repack.name, "item_code": "_Test Item Home Desktop 100"}, "stock_value_difference"))
+		fg_stock_value_diff = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{
+					"voucher_type": "Stock Entry",
+					"voucher_no": repack.name,
+					"item_code": "_Test Item Home Desktop 100",
+				},
+				"stock_value_difference",
+			)
+		)
 
 		stock_value_diff = flt(fg_stock_value_diff - rm_stock_value_diff, 2)
 
 		self.assertEqual(stock_value_diff, 1200)
 
-		self.check_gl_entries("Stock Entry", repack.name,
-			sorted([
-				[stock_in_hand_account, 1200, 0.0],
-				["Expenses Included In Valuation - TCP1", 0.0, 1200.0]
-			])
+		self.check_gl_entries(
+			"Stock Entry",
+			repack.name,
+			sorted(
+				[[stock_in_hand_account, 1200, 0.0], ["Expenses Included In Valuation - TCP1", 0.0, 1200.0]]
+			),
 		)
 
 	def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle):
 		expected_sle.sort(key=lambda x: x[1])
 
 		# check stock ledger entries
-		sle = frappe.db.sql("""select item_code, warehouse, actual_qty
+		sle = frappe.db.sql(
+			"""select item_code, warehouse, actual_qty
 			from `tabStock Ledger Entry` where voucher_type = %s
 			and voucher_no = %s order by item_code, warehouse, actual_qty""",
-			(voucher_type, voucher_no), as_list=1)
+			(voucher_type, voucher_no),
+			as_list=1,
+		)
 		self.assertTrue(sle)
 		sle.sort(key=lambda x: x[1])
 
@@ -360,9 +482,13 @@
 	def check_gl_entries(self, voucher_type, voucher_no, expected_gl_entries):
 		expected_gl_entries.sort(key=lambda x: x[0])
 
-		gl_entries = frappe.db.sql("""select account, debit, credit
+		gl_entries = frappe.db.sql(
+			"""select account, debit, credit
 			from `tabGL Entry` where voucher_type=%s and voucher_no=%s
-			order by account asc, debit asc""", (voucher_type, voucher_no), as_list=1)
+			order by account asc, debit asc""",
+			(voucher_type, voucher_no),
+			as_list=1,
+		)
 
 		self.assertTrue(gl_entries)
 		gl_entries.sort(key=lambda x: x[0])
@@ -463,7 +589,7 @@
 
 	def test_serial_item_error(self):
 		se, serial_nos = self.test_serial_by_series()
-		if not frappe.db.exists('Serial No', 'ABCD'):
+		if not frappe.db.exists("Serial No", "ABCD"):
 			make_serialized_item(item_code="_Test Serialized Item", serial_no="ABCD\nEFGH")
 
 		se = frappe.copy_doc(test_records[0])
@@ -493,10 +619,14 @@
 		se.set_stock_entry_type()
 		se.insert()
 		se.submit()
-		self.assertTrue(frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse 1 - _TC")
+		self.assertTrue(
+			frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse 1 - _TC"
+		)
 
 		se.cancel()
-		self.assertTrue(frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC")
+		self.assertTrue(
+			frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC"
+		)
 
 	def test_serial_warehouse_error(self):
 		make_serialized_item(target_warehouse="_Test Warehouse 1 - _TC")
@@ -524,14 +654,16 @@
 		self.assertFalse(frappe.db.get_value("Serial No", serial_no, "warehouse"))
 
 	def test_warehouse_company_validation(self):
-		company = frappe.db.get_value('Warehouse', '_Test Warehouse 2 - _TC1', 'company')
-		frappe.get_doc("User", "test2@example.com")\
-			.add_roles("Sales User", "Sales Manager", "Stock User", "Stock Manager")
+		company = frappe.db.get_value("Warehouse", "_Test Warehouse 2 - _TC1", "company")
+		frappe.get_doc("User", "test2@example.com").add_roles(
+			"Sales User", "Sales Manager", "Stock User", "Stock Manager"
+		)
 		frappe.set_user("test2@example.com")
 
 		from erpnext.stock.utils import InvalidWarehouseCompany
+
 		st1 = frappe.copy_doc(test_records[0])
-		st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1"
+		st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1"
 		st1.set_stock_entry_type()
 		st1.insert()
 		self.assertRaises(InvalidWarehouseCompany, st1.submit)
@@ -545,14 +677,15 @@
 		test_user.add_roles("Sales User", "Sales Manager", "Stock User")
 		test_user.remove_roles("Stock Manager", "System Manager")
 
-		frappe.get_doc("User", "test2@example.com")\
-			.add_roles("Sales User", "Sales Manager", "Stock User", "Stock Manager")
+		frappe.get_doc("User", "test2@example.com").add_roles(
+			"Sales User", "Sales Manager", "Stock User", "Stock Manager"
+		)
 
 		st1 = frappe.copy_doc(test_records[0])
 		st1.company = "_Test Company 1"
 
 		frappe.set_user("test@example.com")
-		st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1"
+		st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1"
 		self.assertRaises(frappe.PermissionError, st1.insert)
 
 		test_user.add_roles("System Manager")
@@ -560,7 +693,7 @@
 		frappe.set_user("test2@example.com")
 		st1 = frappe.copy_doc(test_records[0])
 		st1.company = "_Test Company 1"
-		st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1"
+		st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1"
 		st1.get("items")[0].expense_account = "Stock Adjustment - _TC1"
 		st1.get("items")[0].cost_center = "Main - _TC1"
 		st1.set_stock_entry_type()
@@ -574,14 +707,14 @@
 		remove_user_permission("Company", "_Test Company 1", "test2@example.com")
 
 	def test_freeze_stocks(self):
-		frappe.db.set_value('Stock Settings', None,'stock_auth_role', '')
+		frappe.db.set_value("Stock Settings", None, "stock_auth_role", "")
 
 		# test freeze_stocks_upto
 		frappe.db.set_value("Stock Settings", None, "stock_frozen_upto", add_days(nowdate(), 5))
 		se = frappe.copy_doc(test_records[0]).insert()
 		self.assertRaises(StockFreezeError, se.submit)
 
-		frappe.db.set_value("Stock Settings", None, "stock_frozen_upto", '')
+		frappe.db.set_value("Stock Settings", None, "stock_frozen_upto", "")
 
 		# test freeze_stocks_upto_days
 		frappe.db.set_value("Stock Settings", None, "stock_frozen_upto_days", -1)
@@ -597,20 +730,24 @@
 		from erpnext.manufacturing.doctype.work_order.work_order import (
 			make_stock_entry as _make_stock_entry,
 		)
-		bom_no, bom_operation_cost = frappe.db.get_value("BOM", {"item": "_Test FG Item 2",
-			"is_default": 1, "docstatus": 1}, ["name", "operating_cost"])
+
+		bom_no, bom_operation_cost = frappe.db.get_value(
+			"BOM", {"item": "_Test FG Item 2", "is_default": 1, "docstatus": 1}, ["name", "operating_cost"]
+		)
 
 		work_order = frappe.new_doc("Work Order")
-		work_order.update({
-			"company": "_Test Company",
-			"fg_warehouse": "_Test Warehouse 1 - _TC",
-			"production_item": "_Test FG Item 2",
-			"bom_no": bom_no,
-			"qty": 1.0,
-			"stock_uom": "_Test UOM",
-			"wip_warehouse": "_Test Warehouse - _TC",
-			"additional_operating_cost": 1000
-		})
+		work_order.update(
+			{
+				"company": "_Test Company",
+				"fg_warehouse": "_Test Warehouse 1 - _TC",
+				"production_item": "_Test FG Item 2",
+				"bom_no": bom_no,
+				"qty": 1.0,
+				"stock_uom": "_Test UOM",
+				"wip_warehouse": "_Test Warehouse - _TC",
+				"additional_operating_cost": 1000,
+			}
+		)
 		work_order.insert()
 		work_order.submit()
 
@@ -623,37 +760,41 @@
 		for d in stock_entry.get("items"):
 			if d.item_code != "_Test FG Item 2":
 				rm_cost += flt(d.amount)
-		fg_cost = list(filter(lambda x: x.item_code=="_Test FG Item 2", stock_entry.get("items")))[0].amount
-		self.assertEqual(fg_cost,
-			flt(rm_cost + bom_operation_cost + work_order.additional_operating_cost, 2))
+		fg_cost = list(filter(lambda x: x.item_code == "_Test FG Item 2", stock_entry.get("items")))[
+			0
+		].amount
+		self.assertEqual(
+			fg_cost, flt(rm_cost + bom_operation_cost + work_order.additional_operating_cost, 2)
+		)
 
 	def test_work_order_manufacture_with_material_consumption(self):
 		from erpnext.manufacturing.doctype.work_order.work_order import (
 			make_stock_entry as _make_stock_entry,
 		)
+
 		frappe.db.set_value("Manufacturing Settings", None, "material_consumption", "1")
 
-		bom_no = frappe.db.get_value("BOM", {"item": "_Test FG Item",
-			"is_default": 1, "docstatus": 1})
+		bom_no = frappe.db.get_value("BOM", {"item": "_Test FG Item", "is_default": 1, "docstatus": 1})
 
 		work_order = frappe.new_doc("Work Order")
-		work_order.update({
-			"company": "_Test Company",
-			"fg_warehouse": "_Test Warehouse 1 - _TC",
-			"production_item": "_Test FG Item",
-			"bom_no": bom_no,
-			"qty": 1.0,
-			"stock_uom": "_Test UOM",
-			"wip_warehouse": "_Test Warehouse - _TC"
-		})
+		work_order.update(
+			{
+				"company": "_Test Company",
+				"fg_warehouse": "_Test Warehouse 1 - _TC",
+				"production_item": "_Test FG Item",
+				"bom_no": bom_no,
+				"qty": 1.0,
+				"stock_uom": "_Test UOM",
+				"wip_warehouse": "_Test Warehouse - _TC",
+			}
+		)
 		work_order.insert()
 		work_order.submit()
 
-		make_stock_entry(item_code="_Test Item",
-			target="Stores - _TC", qty=10, basic_rate=5000.0)
-		make_stock_entry(item_code="_Test Item Home Desktop 100",
-			target="Stores - _TC", qty=10, basic_rate=1000.0)
-
+		make_stock_entry(item_code="_Test Item", target="Stores - _TC", qty=10, basic_rate=5000.0)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100", target="Stores - _TC", qty=10, basic_rate=1000.0
+		)
 
 		s = frappe.get_doc(_make_stock_entry(work_order.name, "Material Transfer for Manufacture", 1))
 		for d in s.get("items"):
@@ -665,13 +806,12 @@
 		s = frappe.get_doc(_make_stock_entry(work_order.name, "Manufacture", 1))
 		s.save()
 		rm_cost = 0
-		for d in s.get('items'):
+		for d in s.get("items"):
 			if d.s_warehouse:
 				rm_cost += d.amount
-		fg_cost = list(filter(lambda x: x.item_code=="_Test FG Item", s.get("items")))[0].amount
+		fg_cost = list(filter(lambda x: x.item_code == "_Test FG Item", s.get("items")))[0].amount
 		scrap_cost = list(filter(lambda x: x.is_scrap_item, s.get("items")))[0].amount
-		self.assertEqual(fg_cost,
-			flt(rm_cost - scrap_cost, 2))
+		self.assertEqual(fg_cost, flt(rm_cost - scrap_cost, 2))
 
 		# When Stock Entry has only FG + Scrap
 		s.items.pop(0)
@@ -679,31 +819,34 @@
 		s.submit()
 
 		rm_cost = 0
-		for d in s.get('items'):
+		for d in s.get("items"):
 			if d.s_warehouse:
 				rm_cost += d.amount
 		self.assertEqual(rm_cost, 0)
 		expected_fg_cost = s.get_basic_rate_for_manufactured_item(1)
-		fg_cost = list(filter(lambda x: x.item_code=="_Test FG Item", s.get("items")))[0].amount
+		fg_cost = list(filter(lambda x: x.item_code == "_Test FG Item", s.get("items")))[0].amount
 		self.assertEqual(flt(fg_cost, 2), flt(expected_fg_cost, 2))
 
 	def test_variant_work_order(self):
-		bom_no = frappe.db.get_value("BOM", {"item": "_Test Variant Item",
-			"is_default": 1, "docstatus": 1})
+		bom_no = frappe.db.get_value(
+			"BOM", {"item": "_Test Variant Item", "is_default": 1, "docstatus": 1}
+		)
 
-		make_item_variant() # make variant of _Test Variant Item if absent
+		make_item_variant()  # make variant of _Test Variant Item if absent
 
 		work_order = frappe.new_doc("Work Order")
-		work_order.update({
-			"company": "_Test Company",
-			"fg_warehouse": "_Test Warehouse 1 - _TC",
-			"production_item": "_Test Variant Item-S",
-			"bom_no": bom_no,
-			"qty": 1.0,
-			"stock_uom": "_Test UOM",
-			"wip_warehouse": "_Test Warehouse - _TC",
-			"skip_transfer": 1
-		})
+		work_order.update(
+			{
+				"company": "_Test Company",
+				"fg_warehouse": "_Test Warehouse 1 - _TC",
+				"production_item": "_Test Variant Item-S",
+				"bom_no": bom_no,
+				"qty": 1.0,
+				"stock_uom": "_Test UOM",
+				"wip_warehouse": "_Test Warehouse - _TC",
+				"skip_transfer": 1,
+			}
+		)
 		work_order.insert()
 		work_order.submit()
 
@@ -717,19 +860,29 @@
 		s1 = make_serialized_item(target_warehouse="_Test Warehouse - _TC")
 		serial_nos = s1.get("items")[0].serial_no
 
-		s2 = make_stock_entry(item_code="_Test Serialized Item With Series", source="_Test Warehouse - _TC",
-			qty=2, basic_rate=100, purpose="Repack", serial_no=serial_nos, do_not_save=True)
+		s2 = make_stock_entry(
+			item_code="_Test Serialized Item With Series",
+			source="_Test Warehouse - _TC",
+			qty=2,
+			basic_rate=100,
+			purpose="Repack",
+			serial_no=serial_nos,
+			do_not_save=True,
+		)
 
-		s2.append("items", {
-			"item_code": "_Test Serialized Item",
-			"t_warehouse": "_Test Warehouse - _TC",
-			"qty": 2,
-			"basic_rate": 120,
-			"expense_account": "Stock Adjustment - _TC",
-			"conversion_factor": 1.0,
-			"cost_center": "_Test Cost Center - _TC",
-			"serial_no": serial_nos
-		})
+		s2.append(
+			"items",
+			{
+				"item_code": "_Test Serialized Item",
+				"t_warehouse": "_Test Warehouse - _TC",
+				"qty": 2,
+				"basic_rate": 120,
+				"expense_account": "Stock Adjustment - _TC",
+				"conversion_factor": 1.0,
+				"cost_center": "_Test Cost Center - _TC",
+				"serial_no": serial_nos,
+			},
+		)
 
 		s2.submit()
 		s2.cancel()
@@ -739,10 +892,15 @@
 		from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
 
 		create_warehouse("Test Warehouse for Sample Retention")
-		frappe.db.set_value("Stock Settings", None, "sample_retention_warehouse", "Test Warehouse for Sample Retention - _TC")
+		frappe.db.set_value(
+			"Stock Settings",
+			None,
+			"sample_retention_warehouse",
+			"Test Warehouse for Sample Retention - _TC",
+		)
 
 		test_item_code = "Retain Sample Item"
-		if not frappe.db.exists('Item', test_item_code):
+		if not frappe.db.exists("Item", test_item_code):
 			item = frappe.new_doc("Item")
 			item.item_code = test_item_code
 			item.item_name = "Retain Sample Item"
@@ -758,44 +916,58 @@
 		receipt_entry = frappe.new_doc("Stock Entry")
 		receipt_entry.company = "_Test Company"
 		receipt_entry.purpose = "Material Receipt"
-		receipt_entry.append("items", {
-			"item_code": test_item_code,
-			"t_warehouse": "_Test Warehouse - _TC",
-			"qty": 40,
-			"basic_rate": 12,
-			"cost_center": "_Test Cost Center - _TC",
-			"sample_quantity": 4
-		})
+		receipt_entry.append(
+			"items",
+			{
+				"item_code": test_item_code,
+				"t_warehouse": "_Test Warehouse - _TC",
+				"qty": 40,
+				"basic_rate": 12,
+				"cost_center": "_Test Cost Center - _TC",
+				"sample_quantity": 4,
+			},
+		)
 		receipt_entry.set_stock_entry_type()
 		receipt_entry.insert()
 		receipt_entry.submit()
 
-		retention_data = move_sample_to_retention_warehouse(receipt_entry.company, receipt_entry.get("items"))
+		retention_data = move_sample_to_retention_warehouse(
+			receipt_entry.company, receipt_entry.get("items")
+		)
 		retention_entry = frappe.new_doc("Stock Entry")
 		retention_entry.company = retention_data.company
 		retention_entry.purpose = retention_data.purpose
-		retention_entry.append("items", {
-			"item_code": test_item_code,
-			"t_warehouse": "Test Warehouse for Sample Retention - _TC",
-			"s_warehouse": "_Test Warehouse - _TC",
-			"qty": 4,
-			"basic_rate": 12,
-			"cost_center": "_Test Cost Center - _TC",
-			"batch_no": receipt_entry.get("items")[0].batch_no
-		})
+		retention_entry.append(
+			"items",
+			{
+				"item_code": test_item_code,
+				"t_warehouse": "Test Warehouse for Sample Retention - _TC",
+				"s_warehouse": "_Test Warehouse - _TC",
+				"qty": 4,
+				"basic_rate": 12,
+				"cost_center": "_Test Cost Center - _TC",
+				"batch_no": receipt_entry.get("items")[0].batch_no,
+			},
+		)
 		retention_entry.set_stock_entry_type()
 		retention_entry.insert()
 		retention_entry.submit()
 
-		qty_in_usable_warehouse = get_batch_qty(receipt_entry.get("items")[0].batch_no, "_Test Warehouse - _TC", "_Test Item")
-		qty_in_retention_warehouse = get_batch_qty(receipt_entry.get("items")[0].batch_no, "Test Warehouse for Sample Retention - _TC", "_Test Item")
+		qty_in_usable_warehouse = get_batch_qty(
+			receipt_entry.get("items")[0].batch_no, "_Test Warehouse - _TC", "_Test Item"
+		)
+		qty_in_retention_warehouse = get_batch_qty(
+			receipt_entry.get("items")[0].batch_no,
+			"Test Warehouse for Sample Retention - _TC",
+			"_Test Item",
+		)
 
 		self.assertEqual(qty_in_usable_warehouse, 36)
 		self.assertEqual(qty_in_retention_warehouse, 4)
 
 	def test_quality_check(self):
 		item_code = "_Test Item For QC"
-		if not frappe.db.exists('Item', item_code):
+		if not frappe.db.exists("Item", item_code):
 			create_item(item_code)
 
 		repack = frappe.copy_doc(test_records[3])
@@ -849,44 +1021,63 @@
 	# 		self.assertEqual(item_quantity.get(d.item_code), d.qty)
 
 	def test_customer_provided_parts_se(self):
-		create_item('CUST-0987', is_customer_provided_item = 1, customer = '_Test Customer', is_purchase_item = 0)
-		se = make_stock_entry(item_code='CUST-0987', purpose = 'Material Receipt',
-			qty=4, to_warehouse = "_Test Warehouse - _TC")
+		create_item(
+			"CUST-0987", is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
+		)
+		se = make_stock_entry(
+			item_code="CUST-0987", purpose="Material Receipt", qty=4, to_warehouse="_Test Warehouse - _TC"
+		)
 		self.assertEqual(se.get("items")[0].allow_zero_valuation_rate, 1)
 		self.assertEqual(se.get("items")[0].amount, 0)
 
 	def test_zero_incoming_rate(self):
-		""" Make sure incoming rate of 0 is allowed while consuming.
+		"""Make sure incoming rate of 0 is allowed while consuming.
 
-			qty  | rate | valuation rate
-			 1   | 100  | 100
-			 1   | 0    | 50
-			-1   | 100  | 0
-			-1   | 0  <--- assert this
+		qty  | rate | valuation rate
+		 1   | 100  | 100
+		 1   | 0    | 50
+		-1   | 100  | 0
+		-1   | 0  <--- assert this
 		"""
 		item_code = "_TestZeroVal"
 		warehouse = "_Test Warehouse - _TC"
-		create_item('_TestZeroVal')
+		create_item("_TestZeroVal")
 		_receipt = make_stock_entry(item_code=item_code, qty=1, to_warehouse=warehouse, rate=100)
-		receipt2 = make_stock_entry(item_code=item_code, qty=1, to_warehouse=warehouse, rate=0, do_not_save=True)
+		receipt2 = make_stock_entry(
+			item_code=item_code, qty=1, to_warehouse=warehouse, rate=0, do_not_save=True
+		)
 		receipt2.items[0].allow_zero_valuation_rate = 1
 		receipt2.save()
 		receipt2.submit()
 
 		issue = make_stock_entry(item_code=item_code, qty=1, from_warehouse=warehouse)
 
-		value_diff = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": issue.name, "voucher_type": "Stock Entry"}, "stock_value_difference")
+		value_diff = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{"voucher_no": issue.name, "voucher_type": "Stock Entry"},
+			"stock_value_difference",
+		)
 		self.assertEqual(value_diff, -100)
 
 		issue2 = make_stock_entry(item_code=item_code, qty=1, from_warehouse=warehouse)
-		value_diff = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": issue2.name, "voucher_type": "Stock Entry"}, "stock_value_difference")
+		value_diff = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{"voucher_no": issue2.name, "voucher_type": "Stock Entry"},
+			"stock_value_difference",
+		)
 		self.assertEqual(value_diff, 0)
 
-
 	def test_gle_for_opening_stock_entry(self):
-		mr = make_stock_entry(item_code="_Test Item", target="Stores - TCP1",
-			company="_Test Company with perpetual inventory", qty=50, basic_rate=100,
-			expense_account="Stock Adjustment - TCP1", is_opening="Yes", do_not_save=True)
+		mr = make_stock_entry(
+			item_code="_Test Item",
+			target="Stores - TCP1",
+			company="_Test Company with perpetual inventory",
+			qty=50,
+			basic_rate=100,
+			expense_account="Stock Adjustment - TCP1",
+			is_opening="Yes",
+			do_not_save=True,
+		)
 
 		self.assertRaises(OpeningEntryAccountError, mr.save)
 
@@ -895,52 +1086,61 @@
 		mr.save()
 		mr.submit()
 
-		is_opening = frappe.db.get_value("GL Entry",
-			filters={"voucher_type": "Stock Entry", "voucher_no": mr.name}, fieldname="is_opening")
+		is_opening = frappe.db.get_value(
+			"GL Entry",
+			filters={"voucher_type": "Stock Entry", "voucher_no": mr.name},
+			fieldname="is_opening",
+		)
 		self.assertEqual(is_opening, "Yes")
 
 	def test_total_basic_amount_zero(self):
-		se = frappe.get_doc({"doctype":"Stock Entry",
-			"purpose":"Material Receipt",
-			"stock_entry_type":"Material Receipt",
-			"posting_date": nowdate(),
-			"company":"_Test Company with perpetual inventory",
-			"items":[
-				{
-					"item_code":"_Test Item",
-					"description":"_Test Item",
-					"qty": 1,
-					"basic_rate": 0,
-					"uom":"Nos",
-					"t_warehouse": "Stores - TCP1",
-					"allow_zero_valuation_rate": 1,
-					"cost_center": "Main - TCP1"
-				},
-				{
-					"item_code":"_Test Item",
-					"description":"_Test Item",
-					"qty": 2,
-					"basic_rate": 0,
-					"uom":"Nos",
-					"t_warehouse": "Stores - TCP1",
-					"allow_zero_valuation_rate": 1,
-					"cost_center": "Main - TCP1"
-				},
-			],
-			"additional_costs":[
-				{"expense_account":"Miscellaneous Expenses - TCP1",
-				"amount":100,
-				"description": "miscellanous"
-			}]
-		})
+		se = frappe.get_doc(
+			{
+				"doctype": "Stock Entry",
+				"purpose": "Material Receipt",
+				"stock_entry_type": "Material Receipt",
+				"posting_date": nowdate(),
+				"company": "_Test Company with perpetual inventory",
+				"items": [
+					{
+						"item_code": "_Test Item",
+						"description": "_Test Item",
+						"qty": 1,
+						"basic_rate": 0,
+						"uom": "Nos",
+						"t_warehouse": "Stores - TCP1",
+						"allow_zero_valuation_rate": 1,
+						"cost_center": "Main - TCP1",
+					},
+					{
+						"item_code": "_Test Item",
+						"description": "_Test Item",
+						"qty": 2,
+						"basic_rate": 0,
+						"uom": "Nos",
+						"t_warehouse": "Stores - TCP1",
+						"allow_zero_valuation_rate": 1,
+						"cost_center": "Main - TCP1",
+					},
+				],
+				"additional_costs": [
+					{
+						"expense_account": "Miscellaneous Expenses - TCP1",
+						"amount": 100,
+						"description": "miscellanous",
+					}
+				],
+			}
+		)
 		se.insert()
 		se.submit()
 
-		self.check_gl_entries("Stock Entry", se.name,
-			sorted([
-				["Stock Adjustment - TCP1", 100.0, 0.0],
-				["Miscellaneous Expenses - TCP1", 0.0, 100.0]
-			])
+		self.check_gl_entries(
+			"Stock Entry",
+			se.name,
+			sorted(
+				[["Stock Adjustment - TCP1", 100.0, 0.0], ["Miscellaneous Expenses - TCP1", 0.0, 100.0]]
+			),
 		)
 
 	def test_conversion_factor_change(self):
@@ -971,15 +1171,15 @@
 
 	def test_additional_cost_distribution_manufacture(self):
 		se = frappe.get_doc(
-				doctype="Stock Entry",
-				purpose="Manufacture",
-				additional_costs=[frappe._dict(base_amount=100)],
-				items=[
-					frappe._dict(item_code="RM", basic_amount=10),
-					frappe._dict(item_code="FG", basic_amount=20, t_warehouse="X", is_finished_item=1),
-					frappe._dict(item_code="scrap", basic_amount=30, t_warehouse="X")
-				],
-			)
+			doctype="Stock Entry",
+			purpose="Manufacture",
+			additional_costs=[frappe._dict(base_amount=100)],
+			items=[
+				frappe._dict(item_code="RM", basic_amount=10),
+				frappe._dict(item_code="FG", basic_amount=20, t_warehouse="X", is_finished_item=1),
+				frappe._dict(item_code="scrap", basic_amount=30, t_warehouse="X"),
+			],
+		)
 
 		se.distribute_additional_costs()
 
@@ -988,14 +1188,14 @@
 
 	def test_additional_cost_distribution_non_manufacture(self):
 		se = frappe.get_doc(
-				doctype="Stock Entry",
-				purpose="Material Receipt",
-				additional_costs=[frappe._dict(base_amount=100)],
-				items=[
-					frappe._dict(item_code="RECEIVED_1", basic_amount=20, t_warehouse="X"),
-					frappe._dict(item_code="RECEIVED_2", basic_amount=30, t_warehouse="X")
-				],
-			)
+			doctype="Stock Entry",
+			purpose="Material Receipt",
+			additional_costs=[frappe._dict(base_amount=100)],
+			items=[
+				frappe._dict(item_code="RECEIVED_1", basic_amount=20, t_warehouse="X"),
+				frappe._dict(item_code="RECEIVED_2", basic_amount=30, t_warehouse="X"),
+			],
+		)
 
 		se.distribute_additional_costs()
 
@@ -1010,9 +1210,11 @@
 			stock_entry_type="Manufacture",
 			company="_Test Company",
 			items=[
-				frappe._dict(item_code="_Test Item", qty=1, basic_rate=200, s_warehouse="_Test Warehouse - _TC"),
-				frappe._dict(item_code="_Test FG Item", qty=4, t_warehouse="_Test Warehouse 1 - _TC")
-			]
+				frappe._dict(
+					item_code="_Test Item", qty=1, basic_rate=200, s_warehouse="_Test Warehouse - _TC"
+				),
+				frappe._dict(item_code="_Test FG Item", qty=4, t_warehouse="_Test Warehouse 1 - _TC"),
+			],
 		)
 		# SE must have atleast one FG
 		self.assertRaises(FinishedGoodError, se.save)
@@ -1027,47 +1229,49 @@
 
 		# Check if FG cost is calculated based on RM total cost
 		# RM total cost = 200, FG rate = 200/4(FG qty) =  50
-		self.assertEqual(se.items[1].basic_rate, flt(se.items[0].basic_rate/4))
+		self.assertEqual(se.items[1].basic_rate, flt(se.items[0].basic_rate / 4))
 		self.assertEqual(se.value_difference, 0.0)
 		self.assertEqual(se.total_incoming_value, se.total_outgoing_value)
 
 	@change_settings("Stock Settings", {"allow_negative_stock": 0})
 	def test_future_negative_sle(self):
 		# Initialize item, batch, warehouse, opening qty
-		item_code = '_Test Future Neg Item'
-		batch_no = '_Test Future Neg Batch'
-		warehouses = [
-			'_Test Future Neg Warehouse Source',
-			'_Test Future Neg Warehouse Destination'
-		]
+		item_code = "_Test Future Neg Item"
+		batch_no = "_Test Future Neg Batch"
+		warehouses = ["_Test Future Neg Warehouse Source", "_Test Future Neg Warehouse Destination"]
 		warehouse_names = initialize_records_for_future_negative_sle_test(
-			item_code, batch_no, warehouses,
-			opening_qty=2, posting_date='2021-07-01'
+			item_code, batch_no, warehouses, opening_qty=2, posting_date="2021-07-01"
 		)
 
 		# Executing an illegal sequence should raise an error
 		sequence_of_entries = [
-			dict(item_code=item_code,
+			dict(
+				item_code=item_code,
 				qty=2,
 				from_warehouse=warehouse_names[0],
 				to_warehouse=warehouse_names[1],
 				batch_no=batch_no,
-				posting_date='2021-07-03',
-				purpose='Material Transfer'),
-			dict(item_code=item_code,
+				posting_date="2021-07-03",
+				purpose="Material Transfer",
+			),
+			dict(
+				item_code=item_code,
 				qty=2,
 				from_warehouse=warehouse_names[1],
 				to_warehouse=warehouse_names[0],
 				batch_no=batch_no,
-				posting_date='2021-07-04',
-				purpose='Material Transfer'),
-			dict(item_code=item_code,
+				posting_date="2021-07-04",
+				purpose="Material Transfer",
+			),
+			dict(
+				item_code=item_code,
 				qty=2,
 				from_warehouse=warehouse_names[0],
 				to_warehouse=warehouse_names[1],
 				batch_no=batch_no,
-				posting_date='2021-07-02',          # Illegal SE
-				purpose='Material Transfer')
+				posting_date="2021-07-02",  # Illegal SE
+				purpose="Material Transfer",
+			),
 		]
 
 		self.assertRaises(NegativeStockError, create_stock_entries, sequence_of_entries)
@@ -1077,74 +1281,74 @@
 		from erpnext.stock.doctype.batch.test_batch import TestBatch
 
 		# Initialize item, batch, warehouse, opening qty
-		item_code = '_Test MultiBatch Item'
+		item_code = "_Test MultiBatch Item"
 		TestBatch.make_batch_item(item_code)
 
-		batch_nos = [] # store generate batches
-		warehouse = '_Test Warehouse - _TC'
+		batch_nos = []  # store generate batches
+		warehouse = "_Test Warehouse - _TC"
 
 		se1 = make_stock_entry(
-				item_code=item_code,
-				qty=2,
-				to_warehouse=warehouse,
-				posting_date='2021-09-01',
-				purpose='Material Receipt'
-			)
+			item_code=item_code,
+			qty=2,
+			to_warehouse=warehouse,
+			posting_date="2021-09-01",
+			purpose="Material Receipt",
+		)
 		batch_nos.append(se1.items[0].batch_no)
 		se2 = make_stock_entry(
-				item_code=item_code,
-				qty=2,
-				to_warehouse=warehouse,
-				posting_date='2021-09-03',
-				purpose='Material Receipt'
-			)
+			item_code=item_code,
+			qty=2,
+			to_warehouse=warehouse,
+			posting_date="2021-09-03",
+			purpose="Material Receipt",
+		)
 		batch_nos.append(se2.items[0].batch_no)
 
 		with self.assertRaises(NegativeStockError) as nse:
-			make_stock_entry(item_code=item_code,
+			make_stock_entry(
+				item_code=item_code,
 				qty=1,
 				from_warehouse=warehouse,
 				batch_no=batch_nos[1],
-				posting_date='2021-09-02', # backdated consumption of 2nd batch
-				purpose='Material Issue')
+				posting_date="2021-09-02",  # backdated consumption of 2nd batch
+				purpose="Material Issue",
+			)
 
 	def test_multi_batch_value_diff(self):
-		""" Test value difference on stock entry in case of multi-batch.
-			| Stock entry | batch | qty | rate | value diff on SE             |
-			| ---         | ---   | --- | ---  | ---                          |
-			| receipt     | A     | 1   | 10   | 30                           |
-			| receipt     | B     | 1   | 20   |                              |
-			| issue       | A     | -1  | 10   | -30 (to assert after submit) |
-			| issue       | B     | -1  | 20   |                              |
+		"""Test value difference on stock entry in case of multi-batch.
+		| Stock entry | batch | qty | rate | value diff on SE             |
+		| ---         | ---   | --- | ---  | ---                          |
+		| receipt     | A     | 1   | 10   | 30                           |
+		| receipt     | B     | 1   | 20   |                              |
+		| issue       | A     | -1  | 10   | -30 (to assert after submit) |
+		| issue       | B     | -1  | 20   |                              |
 		"""
 		from erpnext.stock.doctype.batch.test_batch import TestBatch
 
 		batch_nos = []
 
-		item_code = '_TestMultibatchFifo'
+		item_code = "_TestMultibatchFifo"
 		TestBatch.make_batch_item(item_code)
-		warehouse = '_Test Warehouse - _TC'
+		warehouse = "_Test Warehouse - _TC"
 		receipt = make_stock_entry(
-				item_code=item_code,
-				qty=1,
-				rate=10,
-				to_warehouse=warehouse,
-				purpose='Material Receipt',
-				do_not_save=True
-			)
-		receipt.append("items", frappe.copy_doc(receipt.items[0], ignore_no_copy=False).update({"basic_rate": 20}) )
+			item_code=item_code,
+			qty=1,
+			rate=10,
+			to_warehouse=warehouse,
+			purpose="Material Receipt",
+			do_not_save=True,
+		)
+		receipt.append(
+			"items", frappe.copy_doc(receipt.items[0], ignore_no_copy=False).update({"basic_rate": 20})
+		)
 		receipt.save()
 		receipt.submit()
 		batch_nos.extend(row.batch_no for row in receipt.items)
 		self.assertEqual(receipt.value_difference, 30)
 
 		issue = make_stock_entry(
-				item_code=item_code,
-				qty=1,
-				from_warehouse=warehouse,
-				purpose='Material Issue',
-				do_not_save=True
-			)
+			item_code=item_code, qty=1, from_warehouse=warehouse, purpose="Material Issue", do_not_save=True
+		)
 		issue.append("items", frappe.copy_doc(issue.items[0], ignore_no_copy=False))
 		for row, batch_no in zip(issue.items, batch_nos):
 			row.batch_no = batch_no
@@ -1154,6 +1358,7 @@
 		issue.reload()  # reload because reposting current voucher updates rate
 		self.assertEqual(issue.value_difference, -30)
 
+
 def make_serialized_item(**args):
 	args = frappe._dict(args)
 	se = frappe.copy_doc(test_records[0])
@@ -1183,50 +1388,57 @@
 	se.submit()
 	return se
 
+
 def get_qty_after_transaction(**args):
 	args = frappe._dict(args)
-	last_sle = get_previous_sle({
-		"item_code": args.item_code or "_Test Item",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"posting_date": args.posting_date or nowdate(),
-		"posting_time": args.posting_time or nowtime()
-	})
+	last_sle = get_previous_sle(
+		{
+			"item_code": args.item_code or "_Test Item",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"posting_date": args.posting_date or nowdate(),
+			"posting_time": args.posting_time or nowtime(),
+		}
+	)
 	return flt(last_sle.get("qty_after_transaction"))
 
+
 def get_multiple_items():
 	return [
-			{
-				"conversion_factor": 1.0,
-				"cost_center": "Main - TCP1",
-				"doctype": "Stock Entry Detail",
-				"expense_account": "Stock Adjustment - TCP1",
-				"basic_rate": 100,
-				"item_code": "_Test Item",
-				"qty": 50.0,
-				"s_warehouse": "Stores - TCP1",
-				"stock_uom": "_Test UOM",
-				"transfer_qty": 50.0,
-				"uom": "_Test UOM"
-			},
-			{
-				"conversion_factor": 1.0,
-				"cost_center": "Main - TCP1",
-				"doctype": "Stock Entry Detail",
-				"expense_account": "Stock Adjustment - TCP1",
-				"basic_rate": 5000,
-				"item_code": "_Test Item Home Desktop 100",
-				"qty": 1,
-				"stock_uom": "_Test UOM",
-				"t_warehouse": "Stores - TCP1",
-				"transfer_qty": 1,
-				"uom": "_Test UOM"
-			}
-		]
+		{
+			"conversion_factor": 1.0,
+			"cost_center": "Main - TCP1",
+			"doctype": "Stock Entry Detail",
+			"expense_account": "Stock Adjustment - TCP1",
+			"basic_rate": 100,
+			"item_code": "_Test Item",
+			"qty": 50.0,
+			"s_warehouse": "Stores - TCP1",
+			"stock_uom": "_Test UOM",
+			"transfer_qty": 50.0,
+			"uom": "_Test UOM",
+		},
+		{
+			"conversion_factor": 1.0,
+			"cost_center": "Main - TCP1",
+			"doctype": "Stock Entry Detail",
+			"expense_account": "Stock Adjustment - TCP1",
+			"basic_rate": 5000,
+			"item_code": "_Test Item Home Desktop 100",
+			"qty": 1,
+			"stock_uom": "_Test UOM",
+			"t_warehouse": "Stores - TCP1",
+			"transfer_qty": 1,
+			"uom": "_Test UOM",
+		},
+	]
 
-test_records = frappe.get_test_records('Stock Entry')
+
+test_records = frappe.get_test_records("Stock Entry")
+
 
 def initialize_records_for_future_negative_sle_test(
-		item_code, batch_no, warehouses, opening_qty, posting_date):
+	item_code, batch_no, warehouses, opening_qty, posting_date
+):
 	from erpnext.stock.doctype.batch.test_batch import TestBatch, make_new_batch
 	from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import (
 		create_stock_reconciliation,
@@ -1237,9 +1449,9 @@
 	make_new_batch(item_code=item_code, batch_id=batch_no)
 	warehouse_names = [create_warehouse(w) for w in warehouses]
 	create_stock_reconciliation(
-		purpose='Opening Stock',
+		purpose="Opening Stock",
 		posting_date=posting_date,
-		posting_time='20:00:20',
+		posting_time="20:00:20",
 		item_code=item_code,
 		warehouse=warehouse_names[0],
 		valuation_rate=100,
diff --git a/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py b/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py
index efd97c0..7258cfb 100644
--- a/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py
+++ b/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py
@@ -8,5 +8,5 @@
 
 class StockEntryType(Document):
 	def validate(self):
-		if self.add_to_transit and self.purpose != 'Material Transfer':
+		if self.add_to_transit and self.purpose != "Material Transfer":
 			self.add_to_transit = 0
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 2f59304..5c1da42 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -14,11 +14,17 @@
 from erpnext.controllers.item_variant import ItemTemplateCannotHaveStock
 
 
-class StockFreezeError(frappe.ValidationError): pass
-class BackDatedStockTransaction(frappe.ValidationError): pass
+class StockFreezeError(frappe.ValidationError):
+	pass
+
+
+class BackDatedStockTransaction(frappe.ValidationError):
+	pass
+
 
 exclude_from_linked_with = True
 
+
 class StockLedgerEntry(Document):
 	def autoname(self):
 		"""
@@ -32,6 +38,7 @@
 	def validate(self):
 		self.flags.ignore_submit_comment = True
 		from erpnext.stock.utils import validate_disabled_warehouse, validate_warehouse_company
+
 		self.validate_mandatory()
 		self.validate_item()
 		self.validate_batch()
@@ -42,24 +49,29 @@
 		self.block_transactions_against_group_warehouse()
 		self.validate_with_last_transaction_posting_time()
 
-
 	def on_submit(self):
 		self.check_stock_frozen_date()
 		self.calculate_batch_qty()
 
 		if not self.get("via_landed_cost_voucher"):
 			from erpnext.stock.doctype.serial_no.serial_no import process_serial_no
+
 			process_serial_no(self)
 
 	def calculate_batch_qty(self):
 		if self.batch_no:
-			batch_qty = frappe.db.get_value("Stock Ledger Entry",
-				{"docstatus": 1, "batch_no": self.batch_no, "is_cancelled": 0},
-				"sum(actual_qty)") or 0
+			batch_qty = (
+				frappe.db.get_value(
+					"Stock Ledger Entry",
+					{"docstatus": 1, "batch_no": self.batch_no, "is_cancelled": 0},
+					"sum(actual_qty)",
+				)
+				or 0
+			)
 			frappe.db.set_value("Batch", self.batch_no, "batch_qty", batch_qty)
 
 	def validate_mandatory(self):
-		mandatory = ['warehouse','posting_date','voucher_type','voucher_no','company']
+		mandatory = ["warehouse", "posting_date", "voucher_type", "voucher_no", "company"]
 		for k in mandatory:
 			if not self.get(k):
 				frappe.throw(_("{0} is required").format(self.meta.get_label(k)))
@@ -68,9 +80,13 @@
 			frappe.throw(_("Actual Qty is mandatory"))
 
 	def validate_item(self):
-		item_det = frappe.db.sql("""select name, item_name, has_batch_no, docstatus,
+		item_det = frappe.db.sql(
+			"""select name, item_name, has_batch_no, docstatus,
 			is_stock_item, has_variants, stock_uom, create_new_batch
-			from tabItem where name=%s""", self.item_code, as_dict=True)
+			from tabItem where name=%s""",
+			self.item_code,
+			as_dict=True,
+		)
 
 		if not item_det:
 			frappe.throw(_("Item {0} not found").format(self.item_code))
@@ -82,39 +98,58 @@
 
 		# check if batch number is valid
 		if item_det.has_batch_no == 1:
-			batch_item = self.item_code if self.item_code == item_det.item_name else self.item_code + ":" + item_det.item_name
+			batch_item = (
+				self.item_code
+				if self.item_code == item_det.item_name
+				else self.item_code + ":" + item_det.item_name
+			)
 			if not self.batch_no:
 				frappe.throw(_("Batch number is mandatory for Item {0}").format(batch_item))
-			elif not frappe.db.get_value("Batch",{"item": self.item_code, "name": self.batch_no}):
-				frappe.throw(_("{0} is not a valid Batch Number for Item {1}").format(self.batch_no, batch_item))
+			elif not frappe.db.get_value("Batch", {"item": self.item_code, "name": self.batch_no}):
+				frappe.throw(
+					_("{0} is not a valid Batch Number for Item {1}").format(self.batch_no, batch_item)
+				)
 
 		elif item_det.has_batch_no == 0 and self.batch_no and self.is_cancelled == 0:
 			frappe.throw(_("The Item {0} cannot have Batch").format(self.item_code))
 
 		if item_det.has_variants:
-			frappe.throw(_("Stock cannot exist for Item {0} since has variants").format(self.item_code),
-				ItemTemplateCannotHaveStock)
+			frappe.throw(
+				_("Stock cannot exist for Item {0} since has variants").format(self.item_code),
+				ItemTemplateCannotHaveStock,
+			)
 
 		self.stock_uom = item_det.stock_uom
 
 	def check_stock_frozen_date(self):
-		stock_settings = frappe.get_cached_doc('Stock Settings')
+		stock_settings = frappe.get_cached_doc("Stock Settings")
 
 		if stock_settings.stock_frozen_upto:
-			if (getdate(self.posting_date) <= getdate(stock_settings.stock_frozen_upto)
-				and stock_settings.stock_auth_role not in frappe.get_roles()):
-				frappe.throw(_("Stock transactions before {0} are frozen")
-					.format(formatdate(stock_settings.stock_frozen_upto)), StockFreezeError)
+			if (
+				getdate(self.posting_date) <= getdate(stock_settings.stock_frozen_upto)
+				and stock_settings.stock_auth_role not in frappe.get_roles()
+			):
+				frappe.throw(
+					_("Stock transactions before {0} are frozen").format(
+						formatdate(stock_settings.stock_frozen_upto)
+					),
+					StockFreezeError,
+				)
 
 		stock_frozen_upto_days = cint(stock_settings.stock_frozen_upto_days)
 		if stock_frozen_upto_days:
-			older_than_x_days_ago = (add_days(getdate(self.posting_date), stock_frozen_upto_days) <= date.today())
+			older_than_x_days_ago = (
+				add_days(getdate(self.posting_date), stock_frozen_upto_days) <= date.today()
+			)
 			if older_than_x_days_ago and stock_settings.stock_auth_role not in frappe.get_roles():
-				frappe.throw(_("Not allowed to update stock transactions older than {0}").format(stock_frozen_upto_days), StockFreezeError)
+				frappe.throw(
+					_("Not allowed to update stock transactions older than {0}").format(stock_frozen_upto_days),
+					StockFreezeError,
+				)
 
 	def scrub_posting_time(self):
-		if not self.posting_time or self.posting_time == '00:0':
-			self.posting_time = '00:00'
+		if not self.posting_time or self.posting_time == "00:0":
+			self.posting_time = "00:00"
 
 	def validate_batch(self):
 		if self.batch_no and self.voucher_type != "Stock Entry":
@@ -128,43 +163,61 @@
 			self.fiscal_year = get_fiscal_year(self.posting_date, company=self.company)[0]
 		else:
 			from erpnext.accounts.utils import validate_fiscal_year
-			validate_fiscal_year(self.posting_date, self.fiscal_year, self.company,
-				self.meta.get_label("posting_date"), self)
+
+			validate_fiscal_year(
+				self.posting_date, self.fiscal_year, self.company, self.meta.get_label("posting_date"), self
+			)
 
 	def block_transactions_against_group_warehouse(self):
 		from erpnext.stock.utils import is_group_warehouse
+
 		is_group_warehouse(self.warehouse)
 
 	def validate_with_last_transaction_posting_time(self):
-		authorized_role = frappe.db.get_single_value("Stock Settings", "role_allowed_to_create_edit_back_dated_transactions")
+		authorized_role = frappe.db.get_single_value(
+			"Stock Settings", "role_allowed_to_create_edit_back_dated_transactions"
+		)
 		if authorized_role:
 			authorized_users = get_users(authorized_role)
 			if authorized_users and frappe.session.user not in authorized_users:
-				last_transaction_time = frappe.db.sql("""
+				last_transaction_time = frappe.db.sql(
+					"""
 					select MAX(timestamp(posting_date, posting_time)) as posting_time
 					from `tabStock Ledger Entry`
 					where docstatus = 1 and is_cancelled = 0 and item_code = %s
-					and warehouse = %s""", (self.item_code, self.warehouse))[0][0]
+					and warehouse = %s""",
+					(self.item_code, self.warehouse),
+				)[0][0]
 
-				cur_doc_posting_datetime = "%s %s" % (self.posting_date, self.get("posting_time") or "00:00:00")
+				cur_doc_posting_datetime = "%s %s" % (
+					self.posting_date,
+					self.get("posting_time") or "00:00:00",
+				)
 
-				if last_transaction_time and get_datetime(cur_doc_posting_datetime) < get_datetime(last_transaction_time):
-					msg = _("Last Stock Transaction for item {0} under warehouse {1} was on {2}.").format(frappe.bold(self.item_code),
-						frappe.bold(self.warehouse), frappe.bold(last_transaction_time))
+				if last_transaction_time and get_datetime(cur_doc_posting_datetime) < get_datetime(
+					last_transaction_time
+				):
+					msg = _("Last Stock Transaction for item {0} under warehouse {1} was on {2}.").format(
+						frappe.bold(self.item_code), frappe.bold(self.warehouse), frappe.bold(last_transaction_time)
+					)
 
-					msg += "<br><br>" + _("You are not authorized to make/edit Stock Transactions for Item {0} under warehouse {1} before this time.").format(
-						frappe.bold(self.item_code), frappe.bold(self.warehouse))
+					msg += "<br><br>" + _(
+						"You are not authorized to make/edit Stock Transactions for Item {0} under warehouse {1} before this time."
+					).format(frappe.bold(self.item_code), frappe.bold(self.warehouse))
 
 					msg += "<br><br>" + _("Please contact any of the following users to {} this transaction.")
 					msg += "<br>" + "<br>".join(authorized_users)
 					frappe.throw(msg, BackDatedStockTransaction, title=_("Backdated Stock Entry"))
 
+
 def on_doctype_update():
-	if not frappe.db.has_index('tabStock Ledger Entry', 'posting_sort_index'):
+	if not frappe.db.has_index("tabStock Ledger Entry", "posting_sort_index"):
 		frappe.db.commit()
-		frappe.db.add_index("Stock Ledger Entry",
+		frappe.db.add_index(
+			"Stock Ledger Entry",
 			fields=["posting_date", "posting_time", "name"],
-			index_name="posting_sort_index")
+			index_name="posting_sort_index",
+		)
 
 	frappe.db.add_index("Stock Ledger Entry", ["voucher_no", "voucher_type"])
 	frappe.db.add_index("Stock Ledger Entry", ["batch_no", "item_code", "warehouse"])
diff --git a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
index fc57995..42956a1 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
@@ -29,11 +29,17 @@
 class TestStockLedgerEntry(FrappeTestCase):
 	def setUp(self):
 		items = create_items()
-		reset('Stock Entry')
+		reset("Stock Entry")
 
 		# delete SLE and BINs for all items
-		frappe.db.sql("delete from `tabStock Ledger Entry` where item_code in (%s)" % (', '.join(['%s']*len(items))), items)
-		frappe.db.sql("delete from `tabBin` where item_code in (%s)" % (', '.join(['%s']*len(items))), items)
+		frappe.db.sql(
+			"delete from `tabStock Ledger Entry` where item_code in (%s)"
+			% (", ".join(["%s"] * len(items))),
+			items,
+		)
+		frappe.db.sql(
+			"delete from `tabBin` where item_code in (%s)" % (", ".join(["%s"] * len(items))), items
+		)
 
 	def test_item_cost_reposting(self):
 		company = "_Test Company"
@@ -45,9 +51,11 @@
 			qty=50,
 			rate=100,
 			company=company,
-			expense_account = "Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC",
-			posting_date='2020-04-10',
-			posting_time='14:00'
+			expense_account="Stock Adjustment - _TC"
+			if frappe.get_all("Stock Ledger Entry")
+			else "Temporary Opening - _TC",
+			posting_date="2020-04-10",
+			posting_time="14:00",
 		)
 
 		# _Test Item for Reposting at FG warehouse on 20-04-2020: Qty = 10, Rate = 200
@@ -57,9 +65,11 @@
 			qty=10,
 			rate=200,
 			company=company,
-			expense_account="Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC",
-			posting_date='2020-04-20',
-			posting_time='14:00'
+			expense_account="Stock Adjustment - _TC"
+			if frappe.get_all("Stock Ledger Entry")
+			else "Temporary Opening - _TC",
+			posting_date="2020-04-20",
+			posting_time="14:00",
 		)
 
 		# _Test Item for Reposting transferred from Stores to FG warehouse on 30-04-2020
@@ -69,28 +79,40 @@
 			target="Finished Goods - _TC",
 			company=company,
 			qty=10,
-			expense_account="Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC",
-			posting_date='2020-04-30',
-			posting_time='14:00'
+			expense_account="Stock Adjustment - _TC"
+			if frappe.get_all("Stock Ledger Entry")
+			else "Temporary Opening - _TC",
+			posting_date="2020-04-30",
+			posting_time="14:00",
 		)
-		target_wh_sle = frappe.db.get_value('Stock Ledger Entry', {
-			"item_code": "_Test Item for Reposting",
-			"warehouse": "Finished Goods - _TC",
-			"voucher_type": "Stock Entry",
-			"voucher_no": se.name
-		}, ["valuation_rate"], as_dict=1)
+		target_wh_sle = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
+				"item_code": "_Test Item for Reposting",
+				"warehouse": "Finished Goods - _TC",
+				"voucher_type": "Stock Entry",
+				"voucher_no": se.name,
+			},
+			["valuation_rate"],
+			as_dict=1,
+		)
 
 		self.assertEqual(target_wh_sle.get("valuation_rate"), 150)
 
 		# Repack entry on 5-5-2020
-		repack = create_repack_entry(company=company, posting_date='2020-05-05', posting_time='14:00')
+		repack = create_repack_entry(company=company, posting_date="2020-05-05", posting_time="14:00")
 
-		finished_item_sle = frappe.db.get_value('Stock Ledger Entry', {
-			"item_code": "_Test Finished Item for Reposting",
-			"warehouse": "Finished Goods - _TC",
-			"voucher_type": "Stock Entry",
-			"voucher_no": repack.name
-		}, ["incoming_rate", "valuation_rate"], as_dict=1)
+		finished_item_sle = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
+				"item_code": "_Test Finished Item for Reposting",
+				"warehouse": "Finished Goods - _TC",
+				"voucher_type": "Stock Entry",
+				"voucher_no": repack.name,
+			},
+			["incoming_rate", "valuation_rate"],
+			as_dict=1,
+		)
 		self.assertEqual(finished_item_sle.get("incoming_rate"), 540)
 		self.assertEqual(finished_item_sle.get("valuation_rate"), 540)
 
@@ -101,29 +123,37 @@
 			qty=50,
 			rate=150,
 			company=company,
-			expense_account ="Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC",
-			posting_date='2020-04-12',
-			posting_time='14:00'
+			expense_account="Stock Adjustment - _TC"
+			if frappe.get_all("Stock Ledger Entry")
+			else "Temporary Opening - _TC",
+			posting_date="2020-04-12",
+			posting_time="14:00",
 		)
 
-
 		# Check valuation rate of finished goods warehouse after back-dated entry at Stores
-		target_wh_sle = get_previous_sle({
-			"item_code": "_Test Item for Reposting",
-			"warehouse": "Finished Goods - _TC",
-			"posting_date": '2020-04-30',
-			"posting_time": '14:00'
-		})
+		target_wh_sle = get_previous_sle(
+			{
+				"item_code": "_Test Item for Reposting",
+				"warehouse": "Finished Goods - _TC",
+				"posting_date": "2020-04-30",
+				"posting_time": "14:00",
+			}
+		)
 		self.assertEqual(target_wh_sle.get("incoming_rate"), 150)
 		self.assertEqual(target_wh_sle.get("valuation_rate"), 175)
 
 		# Check valuation rate of repacked item after back-dated entry at Stores
-		finished_item_sle = frappe.db.get_value('Stock Ledger Entry', {
-			"item_code": "_Test Finished Item for Reposting",
-			"warehouse": "Finished Goods - _TC",
-			"voucher_type": "Stock Entry",
-			"voucher_no": repack.name
-		}, ["incoming_rate", "valuation_rate"], as_dict=1)
+		finished_item_sle = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{
+				"item_code": "_Test Finished Item for Reposting",
+				"warehouse": "Finished Goods - _TC",
+				"voucher_type": "Stock Entry",
+				"voucher_no": repack.name,
+			},
+			["incoming_rate", "valuation_rate"],
+			as_dict=1,
+		)
 		self.assertEqual(finished_item_sle.get("incoming_rate"), 790)
 		self.assertEqual(finished_item_sle.get("valuation_rate"), 790)
 
@@ -133,76 +163,133 @@
 		self.assertEqual(repack.items[1].get("basic_rate"), 750)
 
 	def test_purchase_return_valuation_reposting(self):
-		pr = make_purchase_receipt(company="_Test Company", posting_date='2020-04-10',
-			warehouse="Stores - _TC", item_code="_Test Item for Reposting", qty=5, rate=100)
+		pr = make_purchase_receipt(
+			company="_Test Company",
+			posting_date="2020-04-10",
+			warehouse="Stores - _TC",
+			item_code="_Test Item for Reposting",
+			qty=5,
+			rate=100,
+		)
 
-		return_pr = make_purchase_receipt(company="_Test Company", posting_date='2020-04-15',
-			warehouse="Stores - _TC", item_code="_Test Item for Reposting", is_return=1, return_against=pr.name, qty=-2)
+		return_pr = make_purchase_receipt(
+			company="_Test Company",
+			posting_date="2020-04-15",
+			warehouse="Stores - _TC",
+			item_code="_Test Item for Reposting",
+			is_return=1,
+			return_against=pr.name,
+			qty=-2,
+		)
 
 		# check sle
-		outgoing_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
-			"voucher_no": return_pr.name}, ["outgoing_rate", "stock_value_difference"])
+		outgoing_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{"voucher_type": "Purchase Receipt", "voucher_no": return_pr.name},
+			["outgoing_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(outgoing_rate, 100)
 		self.assertEqual(stock_value_difference, -200)
 
 		create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company)
 
-		outgoing_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
-			"voucher_no": return_pr.name}, ["outgoing_rate", "stock_value_difference"])
+		outgoing_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{"voucher_type": "Purchase Receipt", "voucher_no": return_pr.name},
+			["outgoing_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(outgoing_rate, 110)
 		self.assertEqual(stock_value_difference, -220)
 
 	def test_sales_return_valuation_reposting(self):
 		company = "_Test Company"
-		item_code="_Test Item for Reposting"
+		item_code = "_Test Item for Reposting"
 
 		# Purchase Return: Qty = 5, Rate = 100
-		pr = make_purchase_receipt(company=company, posting_date='2020-04-10',
-			warehouse="Stores - _TC", item_code=item_code, qty=5, rate=100)
+		pr = make_purchase_receipt(
+			company=company,
+			posting_date="2020-04-10",
+			warehouse="Stores - _TC",
+			item_code=item_code,
+			qty=5,
+			rate=100,
+		)
 
-		#Delivery Note: Qty = 5, Rate = 150
-		dn = create_delivery_note(item_code=item_code, qty=5, rate=150, warehouse="Stores - _TC",
-			company=company, expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC")
+		# Delivery Note: Qty = 5, Rate = 150
+		dn = create_delivery_note(
+			item_code=item_code,
+			qty=5,
+			rate=150,
+			warehouse="Stores - _TC",
+			company=company,
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+		)
 
 		# check outgoing_rate for DN
-		outgoing_rate = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn.name}, "stock_value_difference") / 5)
+		outgoing_rate = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name},
+				"stock_value_difference",
+			)
+			/ 5
+		)
 
 		self.assertEqual(dn.items[0].incoming_rate, 100)
 		self.assertEqual(outgoing_rate, 100)
 
 		# Return Entry: Qty = -2, Rate = 150
-		return_dn = create_delivery_note(is_return=1, return_against=dn.name, item_code=item_code, qty=-2, rate=150,
-			company=company, warehouse="Stores - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC")
+		return_dn = create_delivery_note(
+			is_return=1,
+			return_against=dn.name,
+			item_code=item_code,
+			qty=-2,
+			rate=150,
+			company=company,
+			warehouse="Stores - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+		)
 
 		# check incoming rate for Return entry
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": return_dn.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(return_dn.items[0].incoming_rate, 100)
 		self.assertEqual(incoming_rate, 100)
 		self.assertEqual(stock_value_difference, 200)
 
-		#-------------------------------
+		# -------------------------------
 
 		# Landed Cost Voucher to update the rate of incoming Purchase Return: Additional cost = 50
 		lcv = create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company)
 
 		# check outgoing_rate for DN after reposting
-		outgoing_rate = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn.name}, "stock_value_difference") / 5)
+		outgoing_rate = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name},
+				"stock_value_difference",
+			)
+			/ 5
+		)
 		self.assertEqual(outgoing_rate, 110)
 
 		dn.reload()
 		self.assertEqual(dn.items[0].incoming_rate, 110)
 
 		# check incoming rate for Return entry after reposting
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": return_dn.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(incoming_rate, 110)
 		self.assertEqual(stock_value_difference, 220)
@@ -218,55 +305,93 @@
 
 	def test_reposting_of_sales_return_for_packed_item(self):
 		company = "_Test Company"
-		packed_item_code="_Test Item for Reposting"
+		packed_item_code = "_Test Item for Reposting"
 		bundled_item = "_Test Bundled Item for Reposting"
 		create_product_bundle_item(bundled_item, [[packed_item_code, 4]])
 
 		# Purchase Return: Qty = 50, Rate = 100
-		pr = make_purchase_receipt(company=company, posting_date='2020-04-10',
-			warehouse="Stores - _TC", item_code=packed_item_code, qty=50, rate=100)
+		pr = make_purchase_receipt(
+			company=company,
+			posting_date="2020-04-10",
+			warehouse="Stores - _TC",
+			item_code=packed_item_code,
+			qty=50,
+			rate=100,
+		)
 
-		#Delivery Note: Qty = 5, Rate = 150
-		dn = create_delivery_note(item_code=bundled_item, qty=5, rate=150, warehouse="Stores - _TC",
-			company=company, expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC")
+		# Delivery Note: Qty = 5, Rate = 150
+		dn = create_delivery_note(
+			item_code=bundled_item,
+			qty=5,
+			rate=150,
+			warehouse="Stores - _TC",
+			company=company,
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+		)
 
 		# check outgoing_rate for DN
-		outgoing_rate = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn.name}, "stock_value_difference") / 20)
+		outgoing_rate = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name},
+				"stock_value_difference",
+			)
+			/ 20
+		)
 
 		self.assertEqual(dn.packed_items[0].incoming_rate, 100)
 		self.assertEqual(outgoing_rate, 100)
 
 		# Return Entry: Qty = -2, Rate = 150
-		return_dn = create_delivery_note(is_return=1, return_against=dn.name, item_code=bundled_item, qty=-2, rate=150,
-			company=company, warehouse="Stores - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC")
+		return_dn = create_delivery_note(
+			is_return=1,
+			return_against=dn.name,
+			item_code=bundled_item,
+			qty=-2,
+			rate=150,
+			company=company,
+			warehouse="Stores - _TC",
+			expense_account="Cost of Goods Sold - _TC",
+			cost_center="Main - _TC",
+		)
 
 		# check incoming rate for Return entry
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": return_dn.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(return_dn.packed_items[0].incoming_rate, 100)
 		self.assertEqual(incoming_rate, 100)
 		self.assertEqual(stock_value_difference, 800)
 
-		#-------------------------------
+		# -------------------------------
 
 		# Landed Cost Voucher to update the rate of incoming Purchase Return: Additional cost = 50
 		lcv = create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company)
 
 		# check outgoing_rate for DN after reposting
-		outgoing_rate = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn.name}, "stock_value_difference") / 20)
+		outgoing_rate = abs(
+			frappe.db.get_value(
+				"Stock Ledger Entry",
+				{"voucher_type": "Delivery Note", "voucher_no": dn.name},
+				"stock_value_difference",
+			)
+			/ 20
+		)
 		self.assertEqual(outgoing_rate, 101)
 
 		dn.reload()
 		self.assertEqual(dn.packed_items[0].incoming_rate, 101)
 
 		# check incoming rate for Return entry after reposting
-		incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
+		incoming_rate, stock_value_difference = frappe.db.get_value(
+			"Stock Ledger Entry",
 			{"voucher_type": "Delivery Note", "voucher_no": return_dn.name},
-			["incoming_rate", "stock_value_difference"])
+			["incoming_rate", "stock_value_difference"],
+		)
 
 		self.assertEqual(incoming_rate, 101)
 		self.assertEqual(stock_value_difference, 808)
@@ -284,20 +409,35 @@
 		from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
 
 		company = "_Test Company"
-		rm_item_code="_Test Item for Reposting"
+		rm_item_code = "_Test Item for Reposting"
 		subcontracted_item = "_Test Subcontracted Item for Reposting"
 
-		frappe.db.set_value("Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", "BOM")
-		make_bom(item = subcontracted_item, raw_materials =[rm_item_code], currency="INR")
+		frappe.db.set_value(
+			"Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", "BOM"
+		)
+		make_bom(item=subcontracted_item, raw_materials=[rm_item_code], currency="INR")
 
 		# Purchase raw materials on supplier warehouse: Qty = 50, Rate = 100
-		pr = make_purchase_receipt(company=company, posting_date='2020-04-10',
-			warehouse="Stores - _TC", item_code=rm_item_code, qty=10, rate=100)
+		pr = make_purchase_receipt(
+			company=company,
+			posting_date="2020-04-10",
+			warehouse="Stores - _TC",
+			item_code=rm_item_code,
+			qty=10,
+			rate=100,
+		)
 
 		# Purchase Receipt for subcontracted item
-		pr1 = make_purchase_receipt(company=company, posting_date='2020-04-20',
-			warehouse="Finished Goods - _TC", supplier_warehouse="Stores - _TC",
-			item_code=subcontracted_item, qty=10, rate=20, is_subcontracted="Yes")
+		pr1 = make_purchase_receipt(
+			company=company,
+			posting_date="2020-04-20",
+			warehouse="Finished Goods - _TC",
+			supplier_warehouse="Stores - _TC",
+			item_code=subcontracted_item,
+			qty=10,
+			rate=20,
+			is_subcontracted="Yes",
+		)
 
 		self.assertEqual(pr1.items[0].valuation_rate, 120)
 
@@ -308,8 +448,11 @@
 		self.assertEqual(pr1.items[0].valuation_rate, 125)
 
 		# check outgoing_rate for DN after reposting
-		incoming_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
-			"voucher_no": pr1.name, "item_code": subcontracted_item}, "incoming_rate")
+		incoming_rate = frappe.db.get_value(
+			"Stock Ledger Entry",
+			{"voucher_type": "Purchase Receipt", "voucher_no": pr1.name, "item_code": subcontracted_item},
+			"incoming_rate",
+		)
 		self.assertEqual(incoming_rate, 125)
 
 		# cleanup data
@@ -319,8 +462,9 @@
 
 	def test_back_dated_entry_not_allowed(self):
 		# Back dated stock transactions are only allowed to stock managers
-		frappe.db.set_value("Stock Settings", None,
-			"role_allowed_to_create_edit_back_dated_transactions", "Stock Manager")
+		frappe.db.set_value(
+			"Stock Settings", None, "role_allowed_to_create_edit_back_dated_transactions", "Stock Manager"
+		)
 
 		# Set User with Stock User role but not Stock Manager
 		try:
@@ -331,8 +475,13 @@
 			frappe.set_user(user.name)
 
 			stock_entry_on_today = make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100)
-			back_dated_se_1 = make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100,
-				posting_date=add_days(today(), -1), do_not_submit=True)
+			back_dated_se_1 = make_stock_entry(
+				target="_Test Warehouse - _TC",
+				qty=10,
+				basic_rate=100,
+				posting_date=add_days(today(), -1),
+				do_not_submit=True,
+			)
 
 			# Block back-dated entry
 			self.assertRaises(BackDatedStockTransaction, back_dated_se_1.submit)
@@ -342,14 +491,17 @@
 			frappe.set_user(user.name)
 
 			# Back dated entry allowed to Stock Manager
-			back_dated_se_2 = make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100,
-				posting_date=add_days(today(), -1))
+			back_dated_se_2 = make_stock_entry(
+				target="_Test Warehouse - _TC", qty=10, basic_rate=100, posting_date=add_days(today(), -1)
+			)
 
 			back_dated_se_2.cancel()
 			stock_entry_on_today.cancel()
 
 		finally:
-			frappe.db.set_value("Stock Settings", None, "role_allowed_to_create_edit_back_dated_transactions", None)
+			frappe.db.set_value(
+				"Stock Settings", None, "role_allowed_to_create_edit_back_dated_transactions", None
+			)
 			frappe.set_user("Administrator")
 			user.remove_roles("Stock Manager")
 
@@ -359,13 +511,13 @@
 		# Incoming Entries for Stock Value check
 		pr_entry_list = [
 			(item, warehouses[0], batches[0], 1, 100),
-			(item, warehouses[0], batches[1], 1,  50),
+			(item, warehouses[0], batches[1], 1, 50),
 			(item, warehouses[0], batches[0], 1, 150),
 			(item, warehouses[0], batches[1], 1, 100),
 		]
 		prs = create_purchase_receipt_entries_for_batchwise_item_valuation_test(pr_entry_list)
-		sle_details = fetch_sle_details_for_doc_list(prs, ['stock_value'])
-		sv_list = [d['stock_value'] for d in sle_details]
+		sle_details = fetch_sle_details_for_doc_list(prs, ["stock_value"])
+		sv_list = [d["stock_value"] for d in sle_details]
 		expected_sv = [100, 150, 300, 400]
 		self.assertEqual(expected_sv, sv_list, "Incorrect 'Stock Value' values")
 
@@ -374,29 +526,33 @@
 			(item, warehouses[0], batches[1], 1, 200),
 			(item, warehouses[0], batches[0], 1, 200),
 			(item, warehouses[0], batches[1], 1, 200),
-			(item, warehouses[0], batches[0], 1, 200)
+			(item, warehouses[0], batches[0], 1, 200),
 		]
 		dns = create_delivery_note_entries_for_batchwise_item_valuation_test(dn_entry_list)
-		sle_details = fetch_sle_details_for_doc_list(dns, ['stock_value_difference'])
-		svd_list = [-1 * d['stock_value_difference'] for d in sle_details]
+		sle_details = fetch_sle_details_for_doc_list(dns, ["stock_value_difference"])
+		svd_list = [-1 * d["stock_value_difference"] for d in sle_details]
 		expected_incoming_rates = expected_abs_svd = [75, 125, 75, 125]
 
 		self.assertEqual(expected_abs_svd, svd_list, "Incorrect 'Stock Value Difference' values")
 		for dn, incoming_rate in zip(dns, expected_incoming_rates):
 			self.assertEqual(
-				dn.items[0].incoming_rate, incoming_rate,
-				"Incorrect 'Incoming Rate' values fetched for DN items"
+				dn.items[0].incoming_rate,
+				incoming_rate,
+				"Incorrect 'Incoming Rate' values fetched for DN items",
 			)
 
-
 	def assertSLEs(self, doc, expected_sles, sle_filters=None):
-		""" Compare sorted SLEs, useful for vouchers that create multiple SLEs for same line"""
+		"""Compare sorted SLEs, useful for vouchers that create multiple SLEs for same line"""
 
 		filters = {"voucher_no": doc.name, "voucher_type": doc.doctype, "is_cancelled": 0}
 		if sle_filters:
 			filters.update(sle_filters)
-		sles = frappe.get_all("Stock Ledger Entry", fields=["*"], filters=filters,
-			order_by="timestamp(posting_date, posting_time), creation")
+		sles = frappe.get_all(
+			"Stock Ledger Entry",
+			fields=["*"],
+			filters=filters,
+			order_by="timestamp(posting_date, posting_time), creation",
+		)
 
 		for exp_sle, act_sle in zip(expected_sles, sles):
 			for k, v in exp_sle.items():
@@ -409,13 +565,10 @@
 
 				self.assertEqual(v, act_value, msg=f"{k} doesn't match \n{exp_sle}\n{act_sle}")
 
-
 	def test_batchwise_item_valuation_stock_reco(self):
 		item, warehouses, batches = setup_item_valuation_test()
-		state = {
-			"stock_value" : 0.0,
-			"qty": 0.0
-		}
+		state = {"stock_value": 0.0, "qty": 0.0}
+
 		def update_invariants(exp_sles):
 			for sle in exp_sles:
 				state["stock_value"] += sle["stock_value_difference"]
@@ -423,33 +576,41 @@
 				sle["stock_value"] = state["stock_value"]
 				sle["qty_after_transaction"] = state["qty"]
 
-		osr1 = create_stock_reconciliation(warehouse=warehouses[0], item_code=item, qty=10, rate=100, batch_no=batches[1])
+		osr1 = create_stock_reconciliation(
+			warehouse=warehouses[0], item_code=item, qty=10, rate=100, batch_no=batches[1]
+		)
 		expected_sles = [
 			{"actual_qty": 10, "stock_value_difference": 1000},
 		]
 		update_invariants(expected_sles)
 		self.assertSLEs(osr1, expected_sles)
 
-		osr2 = create_stock_reconciliation(warehouse=warehouses[0], item_code=item, qty=13, rate=200, batch_no=batches[0])
+		osr2 = create_stock_reconciliation(
+			warehouse=warehouses[0], item_code=item, qty=13, rate=200, batch_no=batches[0]
+		)
 		expected_sles = [
-			{"actual_qty": 13, "stock_value_difference": 200*13},
+			{"actual_qty": 13, "stock_value_difference": 200 * 13},
 		]
 		update_invariants(expected_sles)
 		self.assertSLEs(osr2, expected_sles)
 
-		sr1 = create_stock_reconciliation(warehouse=warehouses[0], item_code=item, qty=5, rate=50, batch_no=batches[1])
+		sr1 = create_stock_reconciliation(
+			warehouse=warehouses[0], item_code=item, qty=5, rate=50, batch_no=batches[1]
+		)
 
 		expected_sles = [
 			{"actual_qty": -10, "stock_value_difference": -10 * 100},
-			{"actual_qty": 5, "stock_value_difference": 250}
+			{"actual_qty": 5, "stock_value_difference": 250},
 		]
 		update_invariants(expected_sles)
 		self.assertSLEs(sr1, expected_sles)
 
-		sr2 = create_stock_reconciliation(warehouse=warehouses[0], item_code=item, qty=20, rate=75, batch_no=batches[0])
+		sr2 = create_stock_reconciliation(
+			warehouse=warehouses[0], item_code=item, qty=20, rate=75, batch_no=batches[0]
+		)
 		expected_sles = [
 			{"actual_qty": -13, "stock_value_difference": -13 * 200},
-			{"actual_qty": 20, "stock_value_difference": 20 * 75}
+			{"actual_qty": 20, "stock_value_difference": 20 * 75},
 		]
 		update_invariants(expected_sles)
 		self.assertSLEs(sr2, expected_sles)
@@ -459,108 +620,190 @@
 		source = warehouses[0]
 		target = warehouses[1]
 
-		unrelated_batch = make_stock_entry(item_code=item_code, target=source, batch_no=batches[1],
-				qty=5, rate=10)
-		self.assertSLEs(unrelated_batch, [
-			{"actual_qty": 5, "stock_value_difference": 10 * 5},
-		])
+		unrelated_batch = make_stock_entry(
+			item_code=item_code, target=source, batch_no=batches[1], qty=5, rate=10
+		)
+		self.assertSLEs(
+			unrelated_batch,
+			[
+				{"actual_qty": 5, "stock_value_difference": 10 * 5},
+			],
+		)
 
-		reciept = make_stock_entry(item_code=item_code, target=source, batch_no=batches[0], qty=5, rate=10)
-		self.assertSLEs(reciept, [
-			{"actual_qty": 5, "stock_value_difference": 10 * 5},
-		])
+		reciept = make_stock_entry(
+			item_code=item_code, target=source, batch_no=batches[0], qty=5, rate=10
+		)
+		self.assertSLEs(
+			reciept,
+			[
+				{"actual_qty": 5, "stock_value_difference": 10 * 5},
+			],
+		)
 
-		transfer = make_stock_entry(item_code=item_code, source=source, target=target, batch_no=batches[0], qty=5)
-		self.assertSLEs(transfer, [
-			{"actual_qty": -5, "stock_value_difference": -10 * 5, "warehouse": source},
-			{"actual_qty": 5, "stock_value_difference": 10 * 5, "warehouse": target}
-		])
+		transfer = make_stock_entry(
+			item_code=item_code, source=source, target=target, batch_no=batches[0], qty=5
+		)
+		self.assertSLEs(
+			transfer,
+			[
+				{"actual_qty": -5, "stock_value_difference": -10 * 5, "warehouse": source},
+				{"actual_qty": 5, "stock_value_difference": 10 * 5, "warehouse": target},
+			],
+		)
 
-		backdated_receipt = make_stock_entry(item_code=item_code, target=source, batch_no=batches[0],
-				qty=5, rate=20, posting_date=add_days(today(), -1))
-		self.assertSLEs(backdated_receipt, [
-			{"actual_qty": 5, "stock_value_difference": 20 * 5},
-		])
+		backdated_receipt = make_stock_entry(
+			item_code=item_code,
+			target=source,
+			batch_no=batches[0],
+			qty=5,
+			rate=20,
+			posting_date=add_days(today(), -1),
+		)
+		self.assertSLEs(
+			backdated_receipt,
+			[
+				{"actual_qty": 5, "stock_value_difference": 20 * 5},
+			],
+		)
 
 		# check reposted average rate in *future* transfer
-		self.assertSLEs(transfer, [
-			{"actual_qty": -5, "stock_value_difference": -15 * 5, "warehouse": source, "stock_value": 15 * 5 + 10 * 5},
-			{"actual_qty": 5, "stock_value_difference": 15 * 5, "warehouse": target, "stock_value": 15 * 5}
-		])
+		self.assertSLEs(
+			transfer,
+			[
+				{
+					"actual_qty": -5,
+					"stock_value_difference": -15 * 5,
+					"warehouse": source,
+					"stock_value": 15 * 5 + 10 * 5,
+				},
+				{
+					"actual_qty": 5,
+					"stock_value_difference": 15 * 5,
+					"warehouse": target,
+					"stock_value": 15 * 5,
+				},
+			],
+		)
 
-		transfer_unrelated = make_stock_entry(item_code=item_code, source=source,
-				target=target, batch_no=batches[1], qty=5)
-		self.assertSLEs(transfer_unrelated, [
-			{"actual_qty": -5, "stock_value_difference": -10 * 5, "warehouse": source, "stock_value": 15 * 5},
-			{"actual_qty": 5, "stock_value_difference": 10 * 5, "warehouse": target, "stock_value": 15 * 5 + 10 * 5}
-		])
+		transfer_unrelated = make_stock_entry(
+			item_code=item_code, source=source, target=target, batch_no=batches[1], qty=5
+		)
+		self.assertSLEs(
+			transfer_unrelated,
+			[
+				{
+					"actual_qty": -5,
+					"stock_value_difference": -10 * 5,
+					"warehouse": source,
+					"stock_value": 15 * 5,
+				},
+				{
+					"actual_qty": 5,
+					"stock_value_difference": 10 * 5,
+					"warehouse": target,
+					"stock_value": 15 * 5 + 10 * 5,
+				},
+			],
+		)
 
 	def test_intermediate_average_batch_wise_valuation(self):
-		""" A batch has moving average up until posting time,
+		"""A batch has moving average up until posting time,
 		check if same is respected when backdated entry is inserted in middle"""
 		item_code, warehouses, batches = setup_item_valuation_test()
 		warehouse = warehouses[0]
 
 		batch = batches[0]
 
-		yesterday = make_stock_entry(item_code=item_code, target=warehouse, batch_no=batch,
-				qty=1, rate=10, posting_date=add_days(today(), -1))
-		self.assertSLEs(yesterday, [
-			{"actual_qty": 1, "stock_value_difference": 10},
-		])
+		yesterday = make_stock_entry(
+			item_code=item_code,
+			target=warehouse,
+			batch_no=batch,
+			qty=1,
+			rate=10,
+			posting_date=add_days(today(), -1),
+		)
+		self.assertSLEs(
+			yesterday,
+			[
+				{"actual_qty": 1, "stock_value_difference": 10},
+			],
+		)
 
-		tomorrow = make_stock_entry(item_code=item_code, target=warehouse, batch_no=batches[0],
-				qty=1, rate=30, posting_date=add_days(today(), 1))
-		self.assertSLEs(tomorrow, [
-			{"actual_qty": 1, "stock_value_difference": 30},
-		])
+		tomorrow = make_stock_entry(
+			item_code=item_code,
+			target=warehouse,
+			batch_no=batches[0],
+			qty=1,
+			rate=30,
+			posting_date=add_days(today(), 1),
+		)
+		self.assertSLEs(
+			tomorrow,
+			[
+				{"actual_qty": 1, "stock_value_difference": 30},
+			],
+		)
 
-		create_today = make_stock_entry(item_code=item_code, target=warehouse, batch_no=batches[0],
-				qty=1, rate=20)
-		self.assertSLEs(create_today, [
-			{"actual_qty": 1, "stock_value_difference": 20},
-		])
+		create_today = make_stock_entry(
+			item_code=item_code, target=warehouse, batch_no=batches[0], qty=1, rate=20
+		)
+		self.assertSLEs(
+			create_today,
+			[
+				{"actual_qty": 1, "stock_value_difference": 20},
+			],
+		)
 
-		consume_today = make_stock_entry(item_code=item_code, source=warehouse, batch_no=batches[0],
-				qty=1)
-		self.assertSLEs(consume_today, [
-			{"actual_qty": -1, "stock_value_difference": -15},
-		])
+		consume_today = make_stock_entry(
+			item_code=item_code, source=warehouse, batch_no=batches[0], qty=1
+		)
+		self.assertSLEs(
+			consume_today,
+			[
+				{"actual_qty": -1, "stock_value_difference": -15},
+			],
+		)
 
-		consume_tomorrow = make_stock_entry(item_code=item_code, source=warehouse, batch_no=batches[0],
-				qty=2, posting_date=add_days(today(), 2))
-		self.assertSLEs(consume_tomorrow, [
-			{"stock_value_difference": -(30 + 15), "stock_value": 0, "qty_after_transaction": 0},
-		])
+		consume_tomorrow = make_stock_entry(
+			item_code=item_code,
+			source=warehouse,
+			batch_no=batches[0],
+			qty=2,
+			posting_date=add_days(today(), 2),
+		)
+		self.assertSLEs(
+			consume_tomorrow,
+			[
+				{"stock_value_difference": -(30 + 15), "stock_value": 0, "qty_after_transaction": 0},
+			],
+		)
 
 	def test_legacy_item_valuation_stock_entry(self):
 		columns = [
-				'stock_value_difference',
-				'stock_value',
-				'actual_qty',
-				'qty_after_transaction',
-				'stock_queue',
+			"stock_value_difference",
+			"stock_value",
+			"actual_qty",
+			"qty_after_transaction",
+			"stock_queue",
 		]
 		item, warehouses, batches = setup_item_valuation_test(use_batchwise_valuation=0)
 
 		def check_sle_details_against_expected(sle_details, expected_sle_details, detail, columns):
 			for i, (sle_vals, ex_sle_vals) in enumerate(zip(sle_details, expected_sle_details)):
 				for col, sle_val, ex_sle_val in zip(columns, sle_vals, ex_sle_vals):
-					if col == 'stock_queue':
+					if col == "stock_queue":
 						sle_val = get_stock_value_from_q(sle_val)
 						ex_sle_val = get_stock_value_from_q(ex_sle_val)
 					self.assertEqual(
-						sle_val, ex_sle_val,
-						f"Incorrect {col} value on transaction #: {i} in {detail}"
+						sle_val, ex_sle_val, f"Incorrect {col} value on transaction #: {i} in {detail}"
 					)
 
 		# List used to defer assertions to prevent commits cause of error skipped rollback
 		details_list = []
 
-
 		# Test Material Receipt Entries
 		se_entry_list_mr = [
-			(item, None, warehouses[0], batches[0], 1,  50, "2021-01-21"),
+			(item, None, warehouses[0], batches[0], 1, 50, "2021-01-21"),
 			(item, None, warehouses[0], batches[1], 1, 100, "2021-01-23"),
 		]
 		ses = create_stock_entry_entries_for_batchwise_item_valuation_test(
@@ -568,14 +811,10 @@
 		)
 		sle_details = fetch_sle_details_for_doc_list(ses, columns=columns, as_dict=0)
 		expected_sle_details = [
-			(50.0, 50.0, 1.0, 1.0, '[[1.0, 50.0]]'),
-			(100.0, 150.0, 1.0, 2.0, '[[1.0, 50.0], [1.0, 100.0]]'),
+			(50.0, 50.0, 1.0, 1.0, "[[1.0, 50.0]]"),
+			(100.0, 150.0, 1.0, 2.0, "[[1.0, 50.0], [1.0, 100.0]]"),
 		]
-		details_list.append((
-			sle_details, expected_sle_details,
-			"Material Receipt Entries", columns
-		))
-
+		details_list.append((sle_details, expected_sle_details, "Material Receipt Entries", columns))
 
 		# Test Material Issue Entries
 		se_entry_list_mi = [
@@ -585,14 +824,8 @@
 			se_entry_list_mi, "Material Issue"
 		)
 		sle_details = fetch_sle_details_for_doc_list(ses, columns=columns, as_dict=0)
-		expected_sle_details = [
-			(-50.0, 100.0, -1.0, 1.0, '[[1, 100.0]]')
-		]
-		details_list.append((
-			sle_details, expected_sle_details,
-			"Material Issue Entries", columns
-		))
-
+		expected_sle_details = [(-50.0, 100.0, -1.0, 1.0, "[[1, 100.0]]")]
+		details_list.append((sle_details, expected_sle_details, "Material Issue Entries", columns))
 
 		# Run assertions
 		for details in details_list:
@@ -602,10 +835,8 @@
 		item_code, warehouses, batches = setup_item_valuation_test(use_batchwise_valuation=0)
 		warehouse = warehouses[0]
 
-		state = {
-			"qty": 0.0,
-			"stock_value": 0.0
-		}
+		state = {"qty": 0.0, "stock_value": 0.0}
+
 		def update_invariants(exp_sles):
 			for sle in exp_sles:
 				state["stock_value"] += sle["stock_value_difference"]
@@ -614,59 +845,131 @@
 				sle["qty_after_transaction"] = state["qty"]
 			return exp_sles
 
-		old1 = make_stock_entry(item_code=item_code, target=warehouse, batch_no=batches[0],
-				qty=10, rate=10)
-		self.assertSLEs(old1, update_invariants([
-			{"actual_qty": 10, "stock_value_difference": 10*10, "stock_queue": [[10, 10]]},
-		]))
-		old2 = make_stock_entry(item_code=item_code, target=warehouse, batch_no=batches[1],
-				qty=10, rate=20)
-		self.assertSLEs(old2, update_invariants([
-			{"actual_qty": 10, "stock_value_difference": 10*20, "stock_queue": [[10, 10], [10, 20]]},
-		]))
-		old3 = make_stock_entry(item_code=item_code, target=warehouse, batch_no=batches[0],
-				qty=5, rate=15)
+		old1 = make_stock_entry(
+			item_code=item_code, target=warehouse, batch_no=batches[0], qty=10, rate=10
+		)
+		self.assertSLEs(
+			old1,
+			update_invariants(
+				[
+					{"actual_qty": 10, "stock_value_difference": 10 * 10, "stock_queue": [[10, 10]]},
+				]
+			),
+		)
+		old2 = make_stock_entry(
+			item_code=item_code, target=warehouse, batch_no=batches[1], qty=10, rate=20
+		)
+		self.assertSLEs(
+			old2,
+			update_invariants(
+				[
+					{"actual_qty": 10, "stock_value_difference": 10 * 20, "stock_queue": [[10, 10], [10, 20]]},
+				]
+			),
+		)
+		old3 = make_stock_entry(
+			item_code=item_code, target=warehouse, batch_no=batches[0], qty=5, rate=15
+		)
 
-		self.assertSLEs(old3, update_invariants([
-			{"actual_qty": 5, "stock_value_difference": 5*15, "stock_queue": [[10, 10], [10, 20], [5, 15]]},
-		]))
+		self.assertSLEs(
+			old3,
+			update_invariants(
+				[
+					{
+						"actual_qty": 5,
+						"stock_value_difference": 5 * 15,
+						"stock_queue": [[10, 10], [10, 20], [5, 15]],
+					},
+				]
+			),
+		)
 
 		new1 = make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=40)
 		batches.append(new1.items[0].batch_no)
 		# assert old queue remains
-		self.assertSLEs(new1, update_invariants([
-			{"actual_qty": 10, "stock_value_difference": 10*40, "stock_queue": [[10, 10], [10, 20], [5, 15]]},
-		]))
+		self.assertSLEs(
+			new1,
+			update_invariants(
+				[
+					{
+						"actual_qty": 10,
+						"stock_value_difference": 10 * 40,
+						"stock_queue": [[10, 10], [10, 20], [5, 15]],
+					},
+				]
+			),
+		)
 
 		new2 = make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=42)
 		batches.append(new2.items[0].batch_no)
-		self.assertSLEs(new2, update_invariants([
-			{"actual_qty": 10, "stock_value_difference": 10*42, "stock_queue": [[10, 10], [10, 20], [5, 15]]},
-		]))
+		self.assertSLEs(
+			new2,
+			update_invariants(
+				[
+					{
+						"actual_qty": 10,
+						"stock_value_difference": 10 * 42,
+						"stock_queue": [[10, 10], [10, 20], [5, 15]],
+					},
+				]
+			),
+		)
 
 		# consume old batch as per FIFO
-		consume_old1 = make_stock_entry(item_code=item_code, source=warehouse, qty=15, batch_no=batches[0])
-		self.assertSLEs(consume_old1, update_invariants([
-			{"actual_qty": -15, "stock_value_difference": -10*10 - 5*20, "stock_queue": [[5, 20], [5, 15]]},
-		]))
+		consume_old1 = make_stock_entry(
+			item_code=item_code, source=warehouse, qty=15, batch_no=batches[0]
+		)
+		self.assertSLEs(
+			consume_old1,
+			update_invariants(
+				[
+					{
+						"actual_qty": -15,
+						"stock_value_difference": -10 * 10 - 5 * 20,
+						"stock_queue": [[5, 20], [5, 15]],
+					},
+				]
+			),
+		)
 
 		# consume new batch as per batch
-		consume_new2 = make_stock_entry(item_code=item_code, source=warehouse, qty=10, batch_no=batches[-1])
-		self.assertSLEs(consume_new2, update_invariants([
-			{"actual_qty": -10, "stock_value_difference": -10*42, "stock_queue": [[5, 20], [5, 15]]},
-		]))
+		consume_new2 = make_stock_entry(
+			item_code=item_code, source=warehouse, qty=10, batch_no=batches[-1]
+		)
+		self.assertSLEs(
+			consume_new2,
+			update_invariants(
+				[
+					{"actual_qty": -10, "stock_value_difference": -10 * 42, "stock_queue": [[5, 20], [5, 15]]},
+				]
+			),
+		)
 
 		# finish all old batches
-		consume_old2 = make_stock_entry(item_code=item_code, source=warehouse, qty=10, batch_no=batches[1])
-		self.assertSLEs(consume_old2, update_invariants([
-			{"actual_qty": -10, "stock_value_difference": -5*20 - 5*15, "stock_queue": []},
-		]))
+		consume_old2 = make_stock_entry(
+			item_code=item_code, source=warehouse, qty=10, batch_no=batches[1]
+		)
+		self.assertSLEs(
+			consume_old2,
+			update_invariants(
+				[
+					{"actual_qty": -10, "stock_value_difference": -5 * 20 - 5 * 15, "stock_queue": []},
+				]
+			),
+		)
 
 		# finish all new batches
-		consume_new1 = make_stock_entry(item_code=item_code, source=warehouse, qty=10, batch_no=batches[-2])
-		self.assertSLEs(consume_new1, update_invariants([
-			{"actual_qty": -10, "stock_value_difference": -10*40, "stock_queue": []},
-		]))
+		consume_new1 = make_stock_entry(
+			item_code=item_code, source=warehouse, qty=10, batch_no=batches[-2]
+		)
+		self.assertSLEs(
+			consume_new1,
+			update_invariants(
+				[
+					{"actual_qty": -10, "stock_value_difference": -10 * 40, "stock_queue": []},
+				]
+			),
+		)
 
 	def test_fifo_dependent_consumption(self):
 		item = make_item("_TestFifoTransferRates")
@@ -686,12 +989,12 @@
 
 		expected_queues = []
 		for idx, rate in enumerate(rates, start=1):
-			expected_queues.append(
-				{"stock_queue": [[10, 10 * i] for i in range(1, idx + 1)]}
-			)
+			expected_queues.append({"stock_queue": [[10, 10 * i] for i in range(1, idx + 1)]})
 		self.assertSLEs(receipt, expected_queues)
 
-		transfer = make_stock_entry(item_code=item.name, source=source, target=target, qty=10, do_not_save=True, rate=10)
+		transfer = make_stock_entry(
+			item_code=item.name, source=source, target=target, qty=10, do_not_save=True, rate=10
+		)
 		for rate in rates[1:]:
 			row = frappe.copy_doc(transfer.items[0], ignore_no_copy=False)
 			transfer.append("items", row)
@@ -709,7 +1012,9 @@
 
 		rates = [10 * i for i in range(1, 5)]
 
-		receipt = make_stock_entry(item_code=rm.name, target=warehouse, qty=10, do_not_save=True, rate=10)
+		receipt = make_stock_entry(
+			item_code=rm.name, target=warehouse, qty=10, do_not_save=True, rate=10
+		)
 		for rate in rates[1:]:
 			row = frappe.copy_doc(receipt.items[0], ignore_no_copy=False)
 			row.basic_rate = rate
@@ -718,26 +1023,30 @@
 		receipt.save()
 		receipt.submit()
 
-		repack = make_stock_entry(item_code=rm.name, source=warehouse, qty=10,
-				do_not_save=True, rate=10, purpose="Repack")
+		repack = make_stock_entry(
+			item_code=rm.name, source=warehouse, qty=10, do_not_save=True, rate=10, purpose="Repack"
+		)
 		for rate in rates[1:]:
 			row = frappe.copy_doc(repack.items[0], ignore_no_copy=False)
 			repack.append("items", row)
 
-		repack.append("items", {
-			"item_code": packed.name,
-			"t_warehouse": warehouse,
-			"qty": 1,
-			"transfer_qty": 1,
-		})
+		repack.append(
+			"items",
+			{
+				"item_code": packed.name,
+				"t_warehouse": warehouse,
+				"qty": 1,
+				"transfer_qty": 1,
+			},
+		)
 
 		repack.save()
 		repack.submit()
 
 		# same exact queue should be transferred
-		self.assertSLEs(repack, [
-			{"incoming_rate": sum(rates) * 10}
-		], sle_filters={"item_code": packed.name})
+		self.assertSLEs(
+			repack, [{"incoming_rate": sum(rates) * 10}], sle_filters={"item_code": packed.name}
+		)
 
 	def test_negative_fifo_valuation(self):
 		"""
@@ -750,19 +1059,14 @@
 		receipt = make_stock_entry(item_code=item, target=warehouse, qty=10, rate=10)
 		consume1 = make_stock_entry(item_code=item, source=warehouse, qty=15)
 
-		self.assertSLEs(consume1, [
-			{"stock_value": -5 * 10, "stock_queue": [[-5, 10]]}
-		])
+		self.assertSLEs(consume1, [{"stock_value": -5 * 10, "stock_queue": [[-5, 10]]}])
 
 		consume2 = make_stock_entry(item_code=item, source=warehouse, qty=5)
-		self.assertSLEs(consume2, [
-			{"stock_value": -10 * 10, "stock_queue": [[-10, 10]]}
-		])
+		self.assertSLEs(consume2, [{"stock_value": -10 * 10, "stock_queue": [[-10, 10]]}])
 
 		receipt2 = make_stock_entry(item_code=item, target=warehouse, qty=15, rate=15)
-		self.assertSLEs(receipt2, [
-			{"stock_queue": [[5, 15]], "stock_value_difference": 175}
-		])
+		self.assertSLEs(receipt2, [{"stock_queue": [[5, 15]], "stock_value_difference": 175}])
+
 
 def create_repack_entry(**args):
 	args = frappe._dict(args)
@@ -771,51 +1075,63 @@
 	repack.company = args.company or "_Test Company"
 	repack.posting_date = args.posting_date
 	repack.set_posting_time = 1
-	repack.append("items", {
-		"item_code": "_Test Item for Reposting",
-		"s_warehouse": "Stores - _TC",
-		"qty": 5,
-		"conversion_factor": 1,
-		"expense_account": "Stock Adjustment - _TC",
-		"cost_center": "Main - _TC"
-	})
+	repack.append(
+		"items",
+		{
+			"item_code": "_Test Item for Reposting",
+			"s_warehouse": "Stores - _TC",
+			"qty": 5,
+			"conversion_factor": 1,
+			"expense_account": "Stock Adjustment - _TC",
+			"cost_center": "Main - _TC",
+		},
+	)
 
-	repack.append("items", {
-		"item_code": "_Test Finished Item for Reposting",
-		"t_warehouse": "Finished Goods - _TC",
-		"qty": 1,
-		"conversion_factor": 1,
-		"expense_account": "Stock Adjustment - _TC",
-		"cost_center": "Main - _TC"
-	})
+	repack.append(
+		"items",
+		{
+			"item_code": "_Test Finished Item for Reposting",
+			"t_warehouse": "Finished Goods - _TC",
+			"qty": 1,
+			"conversion_factor": 1,
+			"expense_account": "Stock Adjustment - _TC",
+			"cost_center": "Main - _TC",
+		},
+	)
 
-	repack.append("additional_costs", {
-		"expense_account": "Freight and Forwarding Charges - _TC",
-		"description": "transport cost",
-		"amount": 40
-	})
+	repack.append(
+		"additional_costs",
+		{
+			"expense_account": "Freight and Forwarding Charges - _TC",
+			"description": "transport cost",
+			"amount": 40,
+		},
+	)
 
 	repack.save()
 	repack.submit()
 
 	return repack
 
+
 def create_product_bundle_item(new_item_code, packed_items):
 	if not frappe.db.exists("Product Bundle", new_item_code):
 		item = frappe.new_doc("Product Bundle")
 		item.new_item_code = new_item_code
 
 		for d in packed_items:
-			item.append("items", {
-				"item_code": d[0],
-				"qty": d[1]
-			})
+			item.append("items", {"item_code": d[0], "qty": d[1]})
 
 		item.save()
 
+
 def create_items():
-	items = ["_Test Item for Reposting", "_Test Finished Item for Reposting",
-		"_Test Subcontracted Item for Reposting", "_Test Bundled Item for Reposting"]
+	items = [
+		"_Test Item for Reposting",
+		"_Test Finished Item for Reposting",
+		"_Test Subcontracted Item for Reposting",
+		"_Test Bundled Item for Reposting",
+	]
 	for d in items:
 		properties = {"valuation_method": "FIFO"}
 		if d == "_Test Bundled Item for Reposting":
@@ -827,7 +1143,10 @@
 
 	return items
 
-def setup_item_valuation_test(valuation_method="FIFO", suffix=None, use_batchwise_valuation=1, batches_list=['X', 'Y']):
+
+def setup_item_valuation_test(
+	valuation_method="FIFO", suffix=None, use_batchwise_valuation=1, batches_list=["X", "Y"]
+):
 	from erpnext.stock.doctype.batch.batch import make_batch
 	from erpnext.stock.doctype.item.test_item import make_item
 	from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
@@ -837,9 +1156,9 @@
 
 	item = make_item(
 		f"IV - Test Item {valuation_method} {suffix}",
-		dict(valuation_method=valuation_method, has_batch_no=1, create_new_batch=1)
+		dict(valuation_method=valuation_method, has_batch_no=1, create_new_batch=1),
 	)
-	warehouses = [create_warehouse(f"IV - Test Warehouse {i}") for i in ['J', 'K']]
+	warehouses = [create_warehouse(f"IV - Test Warehouse {i}") for i in ["J", "K"]]
 	batches = [f"IV - Test Batch {i} {valuation_method} {suffix}" for i in batches_list]
 
 	for i, batch_id in enumerate(batches):
@@ -847,11 +1166,9 @@
 			ubw = use_batchwise_valuation
 			if isinstance(use_batchwise_valuation, (list, tuple)):
 				ubw = use_batchwise_valuation[i]
-			batch = frappe.get_doc(frappe._dict(
-					doctype="Batch",
-					batch_id=batch_id,
-					item=item.item_code,
-					use_batchwise_valuation=ubw
+			batch = frappe.get_doc(
+				frappe._dict(
+					doctype="Batch", batch_id=batch_id, item=item.item_code, use_batchwise_valuation=ubw
 				)
 			).insert()
 			batch.use_batchwise_valuation = ubw
@@ -859,8 +1176,10 @@
 
 	return item.item_code, warehouses, batches
 
+
 def create_purchase_receipt_entries_for_batchwise_item_valuation_test(pr_entry_list):
 	from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
+
 	prs = []
 
 	for item, warehouse, batch_no, qty, rate in pr_entry_list:
@@ -869,17 +1188,15 @@
 
 	return prs
 
+
 def create_delivery_note_entries_for_batchwise_item_valuation_test(dn_entry_list):
 	from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note
 	from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
+
 	dns = []
 	for item, warehouse, batch_no, qty, rate in dn_entry_list:
 		so = make_sales_order(
-			rate=rate,
-			qty=qty,
-			item=item,
-			warehouse=warehouse,
-			against_blanket_order=0
+			rate=rate, qty=qty, item=item, warehouse=warehouse, against_blanket_order=0
 		)
 
 		dn = make_delivery_note(so.name)
@@ -889,20 +1206,25 @@
 		dns.append(dn)
 	return dns
 
+
 def fetch_sle_details_for_doc_list(doc_list, columns, as_dict=1):
-	return frappe.db.sql(f"""
+	return frappe.db.sql(
+		f"""
 		SELECT { ', '.join(columns)}
 		FROM `tabStock Ledger Entry`
 		WHERE
 			voucher_no IN %(voucher_nos)s
 			and docstatus = 1
 		ORDER BY timestamp(posting_date, posting_time) ASC, CREATION ASC
-	""", dict(
-		voucher_nos=[doc.name for doc in doc_list]
-	), as_dict=as_dict)
+	""",
+		dict(voucher_nos=[doc.name for doc in doc_list]),
+		as_dict=as_dict,
+	)
+
 
 def get_stock_value_from_q(q):
-	return sum(r*q for r,q in json.loads(q))
+	return sum(r * q for r, q in json.loads(q))
+
 
 def create_stock_entry_entries_for_batchwise_item_valuation_test(se_entry_list, purpose):
 	ses = []
@@ -913,23 +1235,17 @@
 			company="_Test Company",
 			batch_no=batch,
 			posting_date=posting_date,
-			purpose=purpose
+			purpose=purpose,
 		)
 
 		if purpose == "Material Receipt":
-			args.update(
-				dict(to_warehouse=target, rate=rate)
-			)
+			args.update(dict(to_warehouse=target, rate=rate))
 
 		elif purpose == "Material Issue":
-			args.update(
-				dict(from_warehouse=source)
-			)
+			args.update(dict(from_warehouse=source))
 
 		elif purpose == "Material Transfer":
-			args.update(
-				dict(from_warehouse=source, to_warehouse=target)
-			)
+			args.update(dict(from_warehouse=source, to_warehouse=target))
 
 		else:
 			raise ValueError(f"Invalid purpose: {purpose}")
@@ -937,6 +1253,7 @@
 
 	return ses
 
+
 def get_unique_suffix():
 	# Used to isolate valuation sensitive
 	# tests to prevent future tests from failing.
@@ -944,7 +1261,6 @@
 
 
 class TestDeferredNaming(FrappeTestCase):
-
 	@classmethod
 	def setUpClass(cls) -> None:
 		super().setUpClass()
@@ -957,10 +1273,22 @@
 		self.company = "_Test Company with perpetual inventory"
 
 	def tearDown(self) -> None:
-		make_property_setter(doctype="GL Entry", for_doctype=True,
-				property="autoname", value=self.gle_autoname, property_type="Data", fieldname=None)
-		make_property_setter(doctype="Stock Ledger Entry", for_doctype=True,
-				property="autoname", value=self.sle_autoname, property_type="Data", fieldname=None)
+		make_property_setter(
+			doctype="GL Entry",
+			for_doctype=True,
+			property="autoname",
+			value=self.gle_autoname,
+			property_type="Data",
+			fieldname=None,
+		)
+		make_property_setter(
+			doctype="Stock Ledger Entry",
+			for_doctype=True,
+			property="autoname",
+			value=self.sle_autoname,
+			property_type="Data",
+			fieldname=None,
+		)
 
 		# since deferred naming autocommits, commit all changes to avoid flake
 		frappe.db.commit()  # nosemgrep
@@ -973,12 +1301,13 @@
 		return gle, sle
 
 	def test_deferred_naming(self):
-		se = make_stock_entry(item_code=self.item, to_warehouse=self.warehouse,
-				qty=10, rate=100, company=self.company)
+		se = make_stock_entry(
+			item_code=self.item, to_warehouse=self.warehouse, qty=10, rate=100, company=self.company
+		)
 
 		gle, sle = self.get_gle_sles(se)
 		rename_gle_sle_docs()
-		renamed_gle, renamed_sle  = self.get_gle_sles(se)
+		renamed_gle, renamed_sle = self.get_gle_sles(se)
 
 		self.assertFalse(gle & renamed_gle, msg="GLEs not renamed")
 		self.assertFalse(sle & renamed_sle, msg="SLEs not renamed")
@@ -987,15 +1316,22 @@
 	def test_hash_naming(self):
 		# disable naming series
 		for doctype in ("GL Entry", "Stock Ledger Entry"):
-			make_property_setter(doctype=doctype, for_doctype=True,
-					property="autoname", value="hash", property_type="Data", fieldname=None)
+			make_property_setter(
+				doctype=doctype,
+				for_doctype=True,
+				property="autoname",
+				value="hash",
+				property_type="Data",
+				fieldname=None,
+			)
 
-		se = make_stock_entry(item_code=self.item, to_warehouse=self.warehouse,
-				qty=10, rate=100, company=self.company)
+		se = make_stock_entry(
+			item_code=self.item, to_warehouse=self.warehouse, qty=10, rate=100, company=self.company
+		)
 
 		gle, sle = self.get_gle_sles(se)
 		rename_gle_sle_docs()
-		renamed_gle, renamed_sle  = self.get_gle_sles(se)
+		renamed_gle, renamed_sle = self.get_gle_sles(se)
 
 		self.assertEqual(gle, renamed_gle, msg="GLEs are renamed while using hash naming")
 		self.assertEqual(sle, renamed_sle, msg="SLEs are renamed while using hash naming")
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 82a8c37..07a8566 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -14,8 +14,13 @@
 from erpnext.stock.utils import get_stock_balance
 
 
-class OpeningEntryAccountError(frappe.ValidationError): pass
-class EmptyStockReconciliationItemsError(frappe.ValidationError): pass
+class OpeningEntryAccountError(frappe.ValidationError):
+	pass
+
+
+class EmptyStockReconciliationItemsError(frappe.ValidationError):
+	pass
+
 
 class StockReconciliation(StockController):
 	def __init__(self, *args, **kwargs):
@@ -24,9 +29,11 @@
 
 	def validate(self):
 		if not self.expense_account:
-			self.expense_account = frappe.get_cached_value('Company',  self.company,  "stock_adjustment_account")
+			self.expense_account = frappe.get_cached_value(
+				"Company", self.company, "stock_adjustment_account"
+			)
 		if not self.cost_center:
-			self.cost_center = frappe.get_cached_value('Company',  self.company,  "cost_center")
+			self.cost_center = frappe.get_cached_value("Company", self.company, "cost_center")
 		self.validate_posting_time()
 		self.remove_items_with_no_change()
 		self.validate_data()
@@ -37,8 +44,8 @@
 		self.set_total_qty_and_amount()
 		self.validate_putaway_capacity()
 
-		if self._action=="submit":
-			self.make_batches('warehouse')
+		if self._action == "submit":
+			self.make_batches("warehouse")
 
 	def on_submit(self):
 		self.update_stock_ledger()
@@ -46,10 +53,11 @@
 		self.repost_future_sle_and_gle()
 
 		from erpnext.stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
+
 		update_serial_nos_after_submit(self, "items")
 
 	def on_cancel(self):
-		self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry', 'Repost Item Valuation')
+		self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
 		self.make_sle_on_cancel()
 		self.make_gl_entries_on_cancel()
 		self.repost_future_sle_and_gle()
@@ -57,13 +65,17 @@
 	def remove_items_with_no_change(self):
 		"""Remove items if qty or rate is not changed"""
 		self.difference_amount = 0.0
-		def _changed(item):
-			item_dict = get_stock_balance_for(item.item_code, item.warehouse,
-				self.posting_date, self.posting_time, batch_no=item.batch_no)
 
-			if ((item.qty is None or item.qty==item_dict.get("qty")) and
-				(item.valuation_rate is None or item.valuation_rate==item_dict.get("rate")) and
-				(not item.serial_no or (item.serial_no == item_dict.get("serial_nos")) )):
+		def _changed(item):
+			item_dict = get_stock_balance_for(
+				item.item_code, item.warehouse, self.posting_date, self.posting_time, batch_no=item.batch_no
+			)
+
+			if (
+				(item.qty is None or item.qty == item_dict.get("qty"))
+				and (item.valuation_rate is None or item.valuation_rate == item_dict.get("rate"))
+				and (not item.serial_no or (item.serial_no == item_dict.get("serial_nos")))
+			):
 				return False
 			else:
 				# set default as current rates
@@ -80,16 +92,20 @@
 
 				item.current_qty = item_dict.get("qty")
 				item.current_valuation_rate = item_dict.get("rate")
-				self.difference_amount += (flt(item.qty, item.precision("qty")) * \
-					flt(item.valuation_rate or item_dict.get("rate"), item.precision("valuation_rate")) \
-					- flt(item_dict.get("qty"), item.precision("qty")) * flt(item_dict.get("rate"), item.precision("valuation_rate")))
+				self.difference_amount += flt(item.qty, item.precision("qty")) * flt(
+					item.valuation_rate or item_dict.get("rate"), item.precision("valuation_rate")
+				) - flt(item_dict.get("qty"), item.precision("qty")) * flt(
+					item_dict.get("rate"), item.precision("valuation_rate")
+				)
 				return True
 
 		items = list(filter(lambda d: _changed(d), self.items))
 
 		if not items:
-			frappe.throw(_("None of the items have any change in quantity or value."),
-				EmptyStockReconciliationItemsError)
+			frappe.throw(
+				_("None of the items have any change in quantity or value."),
+				EmptyStockReconciliationItemsError,
+			)
 
 		elif len(items) != len(self.items):
 			self.items = items
@@ -99,7 +115,7 @@
 
 	def validate_data(self):
 		def _get_msg(row_num, msg):
-			return _("Row # {0}:").format(row_num+1) + " " + msg
+			return _("Row # {0}:").format(row_num + 1) + " " + msg
 
 		self.validation_messages = []
 		item_warehouse_combinations = []
@@ -109,7 +125,7 @@
 		for row_num, row in enumerate(self.items):
 			# find duplicates
 			key = [row.item_code, row.warehouse]
-			for field in ['serial_no', 'batch_no']:
+			for field in ["serial_no", "batch_no"]:
 				if row.get(field):
 					key.append(row.get(field))
 
@@ -126,32 +142,35 @@
 
 			# if both not specified
 			if row.qty in ["", None] and row.valuation_rate in ["", None]:
-				self.validation_messages.append(_get_msg(row_num,
-					_("Please specify either Quantity or Valuation Rate or both")))
+				self.validation_messages.append(
+					_get_msg(row_num, _("Please specify either Quantity or Valuation Rate or both"))
+				)
 
 			# do not allow negative quantity
 			if flt(row.qty) < 0:
-				self.validation_messages.append(_get_msg(row_num,
-					_("Negative Quantity is not allowed")))
+				self.validation_messages.append(_get_msg(row_num, _("Negative Quantity is not allowed")))
 
 			# do not allow negative valuation
 			if flt(row.valuation_rate) < 0:
-				self.validation_messages.append(_get_msg(row_num,
-					_("Negative Valuation Rate is not allowed")))
+				self.validation_messages.append(_get_msg(row_num, _("Negative Valuation Rate is not allowed")))
 
 			if row.qty and row.valuation_rate in ["", None]:
-				row.valuation_rate = get_stock_balance(row.item_code, row.warehouse,
-							self.posting_date, self.posting_time, with_valuation_rate=True)[1]
+				row.valuation_rate = get_stock_balance(
+					row.item_code, row.warehouse, self.posting_date, self.posting_time, with_valuation_rate=True
+				)[1]
 				if not row.valuation_rate:
 					# try if there is a buying price list in default currency
-					buying_rate = frappe.db.get_value("Item Price", {"item_code": row.item_code,
-						"buying": 1, "currency": default_currency}, "price_list_rate")
+					buying_rate = frappe.db.get_value(
+						"Item Price",
+						{"item_code": row.item_code, "buying": 1, "currency": default_currency},
+						"price_list_rate",
+					)
 					if buying_rate:
 						row.valuation_rate = buying_rate
 
 					else:
 						# get valuation rate from Item
-						row.valuation_rate = frappe.get_value('Item', row.item_code, 'valuation_rate')
+						row.valuation_rate = frappe.get_value("Item", row.item_code, "valuation_rate")
 
 		# throw all validation messages
 		if self.validation_messages:
@@ -178,7 +197,9 @@
 
 			# item should not be serialized
 			if item.has_serial_no and not row.serial_no and not item.serial_no_series:
-				raise frappe.ValidationError(_("Serial no(s) required for serialized item {0}").format(item_code))
+				raise frappe.ValidationError(
+					_("Serial no(s) required for serialized item {0}").format(item_code)
+				)
 
 			# item managed batch-wise not allowed
 			if item.has_batch_no and not row.batch_no and not item.create_new_batch:
@@ -191,8 +212,8 @@
 			self.validation_messages.append(_("Row #") + " " + ("%d: " % (row.idx)) + cstr(e))
 
 	def update_stock_ledger(self):
-		"""	find difference between current and expected entries
-			and create stock ledger entries based on the difference"""
+		"""find difference between current and expected entries
+		and create stock ledger entries based on the difference"""
 		from erpnext.stock.stock_ledger import get_previous_sle
 
 		sl_entries = []
@@ -208,15 +229,20 @@
 				self.get_sle_for_serialized_items(row, sl_entries)
 			else:
 				if row.serial_no or row.batch_no:
-					frappe.throw(_("Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it.") \
-						.format(row.idx, frappe.bold(row.item_code)))
+					frappe.throw(
+						_(
+							"Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it."
+						).format(row.idx, frappe.bold(row.item_code))
+					)
 
-				previous_sle = get_previous_sle({
-					"item_code": row.item_code,
-					"warehouse": row.warehouse,
-					"posting_date": self.posting_date,
-					"posting_time": self.posting_time
-				})
+				previous_sle = get_previous_sle(
+					{
+						"item_code": row.item_code,
+						"warehouse": row.warehouse,
+						"posting_date": self.posting_date,
+						"posting_time": self.posting_time,
+					}
+				)
 
 				if previous_sle:
 					if row.qty in ("", None):
@@ -226,12 +252,16 @@
 						row.valuation_rate = previous_sle.get("valuation_rate", 0)
 
 				if row.qty and not row.valuation_rate and not row.allow_zero_valuation_rate:
-					frappe.throw(_("Valuation Rate required for Item {0} at row {1}").format(row.item_code, row.idx))
+					frappe.throw(
+						_("Valuation Rate required for Item {0} at row {1}").format(row.item_code, row.idx)
+					)
 
-				if ((previous_sle and row.qty == previous_sle.get("qty_after_transaction")
-					and (row.valuation_rate == previous_sle.get("valuation_rate") or row.qty == 0))
-					or (not previous_sle and not row.qty)):
-						continue
+				if (
+					previous_sle
+					and row.qty == previous_sle.get("qty_after_transaction")
+					and (row.valuation_rate == previous_sle.get("valuation_rate") or row.qty == 0)
+				) or (not previous_sle and not row.qty):
+					continue
 
 				sl_entries.append(self.get_sle_for_items(row))
 
@@ -253,21 +283,24 @@
 
 		serial_nos = get_serial_nos(row.serial_no)
 
-
 		# To issue existing serial nos
 		if row.current_qty and (row.current_serial_no or row.batch_no):
 			args = self.get_sle_for_items(row)
-			args.update({
-				'actual_qty': -1 * row.current_qty,
-				'serial_no': row.current_serial_no,
-				'batch_no': row.batch_no,
-				'valuation_rate': row.current_valuation_rate
-			})
+			args.update(
+				{
+					"actual_qty": -1 * row.current_qty,
+					"serial_no": row.current_serial_no,
+					"batch_no": row.batch_no,
+					"valuation_rate": row.current_valuation_rate,
+				}
+			)
 
 			if row.current_serial_no:
-				args.update({
-					'qty_after_transaction': 0,
-				})
+				args.update(
+					{
+						"qty_after_transaction": 0,
+					}
+				)
 
 			sl_entries.append(args)
 
@@ -275,42 +308,49 @@
 		for serial_no in serial_nos:
 			args = self.get_sle_for_items(row, [serial_no])
 
-			previous_sle = get_previous_sle({
-				"item_code": row.item_code,
-				"posting_date": self.posting_date,
-				"posting_time": self.posting_time,
-				"serial_no": serial_no
-			})
+			previous_sle = get_previous_sle(
+				{
+					"item_code": row.item_code,
+					"posting_date": self.posting_date,
+					"posting_time": self.posting_time,
+					"serial_no": serial_no,
+				}
+			)
 
 			if previous_sle and row.warehouse != previous_sle.get("warehouse"):
 				# If serial no exists in different warehouse
 
-				warehouse = previous_sle.get("warehouse", '') or row.warehouse
+				warehouse = previous_sle.get("warehouse", "") or row.warehouse
 
 				if not qty_after_transaction:
-					qty_after_transaction = get_stock_balance(row.item_code,
-						warehouse, self.posting_date, self.posting_time)
+					qty_after_transaction = get_stock_balance(
+						row.item_code, warehouse, self.posting_date, self.posting_time
+					)
 
 				qty_after_transaction -= 1
 
 				new_args = args.copy()
-				new_args.update({
-					'actual_qty': -1,
-					'qty_after_transaction': qty_after_transaction,
-					'warehouse': warehouse,
-					'valuation_rate': previous_sle.get("valuation_rate")
-				})
+				new_args.update(
+					{
+						"actual_qty": -1,
+						"qty_after_transaction": qty_after_transaction,
+						"warehouse": warehouse,
+						"valuation_rate": previous_sle.get("valuation_rate"),
+					}
+				)
 
 				sl_entries.append(new_args)
 
 		if row.qty:
 			args = self.get_sle_for_items(row)
 
-			args.update({
-				'actual_qty': row.qty,
-				'incoming_rate': row.valuation_rate,
-				'valuation_rate': row.valuation_rate
-			})
+			args.update(
+				{
+					"actual_qty": row.qty,
+					"incoming_rate": row.valuation_rate,
+					"valuation_rate": row.valuation_rate,
+				}
+			)
 
 			sl_entries.append(args)
 
@@ -320,7 +360,8 @@
 
 	def update_valuation_rate_for_serial_no(self):
 		for d in self.items:
-			if not d.serial_no: continue
+			if not d.serial_no:
+				continue
 
 			serial_nos = get_serial_nos(d.serial_no)
 			self.update_valuation_rate_for_serial_nos(d, serial_nos)
@@ -331,7 +372,7 @@
 			return
 
 		for d in serial_nos:
-			frappe.db.set_value("Serial No", d, 'purchase_rate', valuation_rate)
+			frappe.db.set_value("Serial No", d, "purchase_rate", valuation_rate)
 
 	def get_sle_for_items(self, row, serial_nos=None):
 		"""Insert Stock Ledger Entries"""
@@ -339,22 +380,24 @@
 		if not serial_nos and row.serial_no:
 			serial_nos = get_serial_nos(row.serial_no)
 
-		data = frappe._dict({
-			"doctype": "Stock Ledger Entry",
-			"item_code": row.item_code,
-			"warehouse": row.warehouse,
-			"posting_date": self.posting_date,
-			"posting_time": self.posting_time,
-			"voucher_type": self.doctype,
-			"voucher_no": self.name,
-			"voucher_detail_no": row.name,
-			"company": self.company,
-			"stock_uom": frappe.db.get_value("Item", row.item_code, "stock_uom"),
-			"is_cancelled": 1 if self.docstatus == 2 else 0,
-			"serial_no": '\n'.join(serial_nos) if serial_nos else '',
-			"batch_no": row.batch_no,
-			"valuation_rate": flt(row.valuation_rate, row.precision("valuation_rate"))
-		})
+		data = frappe._dict(
+			{
+				"doctype": "Stock Ledger Entry",
+				"item_code": row.item_code,
+				"warehouse": row.warehouse,
+				"posting_date": self.posting_date,
+				"posting_time": self.posting_time,
+				"voucher_type": self.doctype,
+				"voucher_no": self.name,
+				"voucher_detail_no": row.name,
+				"company": self.company,
+				"stock_uom": frappe.db.get_value("Item", row.item_code, "stock_uom"),
+				"is_cancelled": 1 if self.docstatus == 2 else 0,
+				"serial_no": "\n".join(serial_nos) if serial_nos else "",
+				"batch_no": row.batch_no,
+				"valuation_rate": flt(row.valuation_rate, row.precision("valuation_rate")),
+			}
+		)
 
 		if not row.batch_no:
 			data.qty_after_transaction = flt(row.qty, row.precision("qty"))
@@ -382,7 +425,7 @@
 		for row in self.items:
 			if row.serial_no or row.batch_no or row.current_serial_no:
 				has_serial_no = True
-				serial_nos = ''
+				serial_nos = ""
 				if row.current_serial_no:
 					serial_nos = get_serial_nos(row.current_serial_no)
 
@@ -395,10 +438,11 @@
 				sl_entries = self.merge_similar_item_serial_nos(sl_entries)
 
 			sl_entries.reverse()
-			allow_negative_stock = cint(frappe.db.get_single_value("Stock Settings", "allow_negative_stock"))
+			allow_negative_stock = cint(
+				frappe.db.get_single_value("Stock Settings", "allow_negative_stock")
+			)
 			self.make_sl_entries(sl_entries, allow_negative_stock=allow_negative_stock)
 
-
 	def merge_similar_item_serial_nos(self, sl_entries):
 		# If user has put the same item in multiple row with different serial no
 		new_sl_entries = []
@@ -411,16 +455,16 @@
 
 			key = (d.item_code, d.warehouse)
 			if key not in merge_similar_entries:
-				d.total_amount = (d.actual_qty * d.valuation_rate)
+				d.total_amount = d.actual_qty * d.valuation_rate
 				merge_similar_entries[key] = d
 			elif d.serial_no:
 				data = merge_similar_entries[key]
 				data.actual_qty += d.actual_qty
 				data.qty_after_transaction += d.qty_after_transaction
 
-				data.total_amount += (d.actual_qty * d.valuation_rate)
+				data.total_amount += d.actual_qty * d.valuation_rate
 				data.valuation_rate = (data.total_amount) / data.actual_qty
-				data.serial_no += '\n' + d.serial_no
+				data.serial_no += "\n" + d.serial_no
 
 				data.incoming_rate = (data.total_amount) / data.actual_qty
 
@@ -433,8 +477,9 @@
 		if not self.cost_center:
 			msgprint(_("Please enter Cost Center"), raise_exception=1)
 
-		return super(StockReconciliation, self).get_gl_entries(warehouse_account,
-			self.expense_account, self.cost_center)
+		return super(StockReconciliation, self).get_gl_entries(
+			warehouse_account, self.expense_account, self.cost_center
+		)
 
 	def validate_expense_account(self):
 		if not cint(erpnext.is_perpetual_inventory_enabled(self.company)):
@@ -442,29 +487,39 @@
 
 		if not self.expense_account:
 			frappe.throw(_("Please enter Expense Account"))
-		elif self.purpose == "Opening Stock" or not frappe.db.sql("""select name from `tabStock Ledger Entry` limit 1"""):
+		elif self.purpose == "Opening Stock" or not frappe.db.sql(
+			"""select name from `tabStock Ledger Entry` limit 1"""
+		):
 			if frappe.db.get_value("Account", self.expense_account, "report_type") == "Profit and Loss":
-				frappe.throw(_("Difference Account must be a Asset/Liability type account, since this Stock Reconciliation is an Opening Entry"), OpeningEntryAccountError)
+				frappe.throw(
+					_(
+						"Difference Account must be a Asset/Liability type account, since this Stock Reconciliation is an Opening Entry"
+					),
+					OpeningEntryAccountError,
+				)
 
 	def set_zero_value_for_customer_provided_items(self):
 		changed_any_values = False
 
-		for d in self.get('items'):
-			is_customer_item = frappe.db.get_value('Item', d.item_code, 'is_customer_provided_item')
+		for d in self.get("items"):
+			is_customer_item = frappe.db.get_value("Item", d.item_code, "is_customer_provided_item")
 			if is_customer_item and d.valuation_rate:
 				d.valuation_rate = 0.0
 				changed_any_values = True
 
 		if changed_any_values:
-			msgprint(_("Valuation rate for customer provided items has been set to zero."),
-				title=_("Note"), indicator="blue")
-
+			msgprint(
+				_("Valuation rate for customer provided items has been set to zero."),
+				title=_("Note"),
+				indicator="blue",
+			)
 
 	def set_total_qty_and_amount(self):
 		for d in self.get("items"):
 			d.amount = flt(d.qty, d.precision("qty")) * flt(d.valuation_rate, d.precision("valuation_rate"))
-			d.current_amount = (flt(d.current_qty,
-				d.precision("current_qty")) * flt(d.current_valuation_rate, d.precision("current_valuation_rate")))
+			d.current_amount = flt(d.current_qty, d.precision("current_qty")) * flt(
+				d.current_valuation_rate, d.precision("current_valuation_rate")
+			)
 
 			d.quantity_difference = flt(d.qty) - flt(d.current_qty)
 			d.amount_difference = flt(d.amount) - flt(d.current_amount)
@@ -476,25 +531,33 @@
 
 	def submit(self):
 		if len(self.items) > 100:
-			msgprint(_("The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage"))
-			self.queue_action('submit', timeout=4600)
+			msgprint(
+				_(
+					"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage"
+				)
+			)
+			self.queue_action("submit", timeout=4600)
 		else:
 			self._submit()
 
 	def cancel(self):
 		if len(self.items) > 100:
-			msgprint(_("The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage"))
-			self.queue_action('cancel', timeout=2000)
+			msgprint(
+				_(
+					"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage"
+				)
+			)
+			self.queue_action("cancel", timeout=2000)
 		else:
 			self._cancel()
 
+
 @frappe.whitelist()
-def get_items(warehouse, posting_date, posting_time, company, item_code=None, ignore_empty_stock=False):
+def get_items(
+	warehouse, posting_date, posting_time, company, item_code=None, ignore_empty_stock=False
+):
 	ignore_empty_stock = cint(ignore_empty_stock)
-	items = [frappe._dict({
-		'item_code': item_code,
-		'warehouse': warehouse
-	})]
+	items = [frappe._dict({"item_code": item_code, "warehouse": warehouse})]
 
 	if not item_code:
 		items = get_items_for_stock_reco(warehouse, company)
@@ -504,8 +567,9 @@
 
 	for d in items:
 		if d.item_code in itemwise_batch_data:
-			valuation_rate = get_stock_balance(d.item_code, d.warehouse,
-				posting_date, posting_time, with_valuation_rate=True)[1]
+			valuation_rate = get_stock_balance(
+				d.item_code, d.warehouse, posting_date, posting_time, with_valuation_rate=True
+			)[1]
 
 			for row in itemwise_batch_data.get(d.item_code):
 				if ignore_empty_stock and not row.qty:
@@ -514,12 +578,22 @@
 				args = get_item_data(row, row.qty, valuation_rate)
 				res.append(args)
 		else:
-			stock_bal = get_stock_balance(d.item_code, d.warehouse, posting_date, posting_time,
-				with_valuation_rate=True , with_serial_no=cint(d.has_serial_no))
-			qty, valuation_rate, serial_no = stock_bal[0], stock_bal[1], stock_bal[2] if cint(d.has_serial_no) else ''
+			stock_bal = get_stock_balance(
+				d.item_code,
+				d.warehouse,
+				posting_date,
+				posting_time,
+				with_valuation_rate=True,
+				with_serial_no=cint(d.has_serial_no),
+			)
+			qty, valuation_rate, serial_no = (
+				stock_bal[0],
+				stock_bal[1],
+				stock_bal[2] if cint(d.has_serial_no) else "",
+			)
 
 			if ignore_empty_stock and not stock_bal[0]:
-					continue
+				continue
 
 			args = get_item_data(d, qty, valuation_rate, serial_no)
 
@@ -527,9 +601,11 @@
 
 	return res
 
+
 def get_items_for_stock_reco(warehouse, company):
 	lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"])
-	items = frappe.db.sql(f"""
+	items = frappe.db.sql(
+		f"""
 		select
 			i.name as item_code, i.item_name, bin.warehouse as warehouse, i.has_serial_no, i.has_batch_no
 		from
@@ -542,9 +618,12 @@
 			and exists(
 				select name from `tabWarehouse` where lft >= {lft} and rgt <= {rgt} and name = bin.warehouse
 			)
-	""", as_dict=1)
+	""",
+		as_dict=1,
+	)
 
-	items += frappe.db.sql("""
+	items += frappe.db.sql(
+		"""
 		select
 			i.name as item_code, i.item_name, id.default_warehouse as warehouse, i.has_serial_no, i.has_batch_no
 		from
@@ -559,40 +638,50 @@
 			and IFNULL(i.disabled, 0) = 0
 			and id.company = %s
 		group by i.name
-	""", (lft, rgt, company), as_dict=1)
+	""",
+		(lft, rgt, company),
+		as_dict=1,
+	)
 
 	# remove duplicates
 	# check if item-warehouse key extracted from each entry exists in set iw_keys
 	# and update iw_keys
 	iw_keys = set()
-	items = [item for item in items if [(item.item_code, item.warehouse) not in iw_keys, iw_keys.add((item.item_code, item.warehouse))][0]]
+	items = [
+		item
+		for item in items
+		if [
+			(item.item_code, item.warehouse) not in iw_keys,
+			iw_keys.add((item.item_code, item.warehouse)),
+		][0]
+	]
 
 	return items
 
+
 def get_item_data(row, qty, valuation_rate, serial_no=None):
 	return {
-		'item_code': row.item_code,
-		'warehouse': row.warehouse,
-		'qty': qty,
-		'item_name': row.item_name,
-		'valuation_rate': valuation_rate,
-		'current_qty': qty,
-		'current_valuation_rate': valuation_rate,
-		'current_serial_no': serial_no,
-		'serial_no': serial_no,
-		'batch_no': row.get('batch_no')
+		"item_code": row.item_code,
+		"warehouse": row.warehouse,
+		"qty": qty,
+		"item_name": row.item_name,
+		"valuation_rate": valuation_rate,
+		"current_qty": qty,
+		"current_valuation_rate": valuation_rate,
+		"current_serial_no": serial_no,
+		"serial_no": serial_no,
+		"batch_no": row.get("batch_no"),
 	}
 
+
 def get_itemwise_batch(warehouse, posting_date, company, item_code=None):
 	from erpnext.stock.report.batch_wise_balance_history.batch_wise_balance_history import execute
+
 	itemwise_batch_data = {}
 
-	filters = frappe._dict({
-		'warehouse': warehouse,
-		'from_date': posting_date,
-		'to_date': posting_date,
-		'company': company
-	})
+	filters = frappe._dict(
+		{"warehouse": warehouse, "from_date": posting_date, "to_date": posting_date, "company": company}
+	)
 
 	if item_code:
 		filters.item_code = item_code
@@ -600,23 +689,28 @@
 	columns, data = execute(filters)
 
 	for row in data:
-		itemwise_batch_data.setdefault(row[0], []).append(frappe._dict({
-			'item_code': row[0],
-			'warehouse': warehouse,
-			'qty': row[8],
-			'item_name': row[1],
-			'batch_no': row[4]
-		}))
+		itemwise_batch_data.setdefault(row[0], []).append(
+			frappe._dict(
+				{
+					"item_code": row[0],
+					"warehouse": warehouse,
+					"qty": row[8],
+					"item_name": row[1],
+					"batch_no": row[4],
+				}
+			)
+		)
 
 	return itemwise_batch_data
 
-@frappe.whitelist()
-def get_stock_balance_for(item_code, warehouse,
-	posting_date, posting_time, batch_no=None, with_valuation_rate= True):
-	frappe.has_permission("Stock Reconciliation", "write", throw = True)
 
-	item_dict = frappe.db.get_value("Item", item_code,
-		["has_serial_no", "has_batch_no"], as_dict=1)
+@frappe.whitelist()
+def get_stock_balance_for(
+	item_code, warehouse, posting_date, posting_time, batch_no=None, with_valuation_rate=True
+):
+	frappe.has_permission("Stock Reconciliation", "write", throw=True)
+
+	item_dict = frappe.db.get_value("Item", item_code, ["has_serial_no", "has_batch_no"], as_dict=1)
 
 	if not item_dict:
 		# In cases of data upload to Items table
@@ -625,8 +719,14 @@
 
 	serial_nos = ""
 	with_serial_no = True if item_dict.get("has_serial_no") else False
-	data = get_stock_balance(item_code, warehouse, posting_date, posting_time,
-		with_valuation_rate=with_valuation_rate, with_serial_no=with_serial_no)
+	data = get_stock_balance(
+		item_code,
+		warehouse,
+		posting_date,
+		posting_time,
+		with_valuation_rate=with_valuation_rate,
+		with_serial_no=with_serial_no,
+	)
 
 	if with_serial_no:
 		qty, rate, serial_nos = data
@@ -634,20 +734,20 @@
 		qty, rate = data
 
 	if item_dict.get("has_batch_no"):
-		qty = get_batch_qty(batch_no, warehouse, posting_date=posting_date, posting_time=posting_time) or 0
+		qty = (
+			get_batch_qty(batch_no, warehouse, posting_date=posting_date, posting_time=posting_time) or 0
+		)
 
-	return {
-		'qty': qty,
-		'rate': rate,
-		'serial_nos': serial_nos
-	}
+	return {"qty": qty, "rate": rate, "serial_nos": serial_nos}
+
 
 @frappe.whitelist()
 def get_difference_account(purpose, company):
-	if purpose == 'Stock Reconciliation':
+	if purpose == "Stock Reconciliation":
 		account = get_company_default(company, "stock_adjustment_account")
 	else:
-		account = frappe.db.get_value('Account', {'is_group': 0,
-			'company': company, 'account_type': 'Temporary'}, 'name')
+		account = frappe.db.get_value(
+			"Account", {"is_group": 0, "company": company, "account_type": "Temporary"}, "name"
+		)
 
 	return account
diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
index e6b252e..46a3f2a 100644
--- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
@@ -32,7 +32,6 @@
 	def tearDown(self):
 		frappe.flags.dont_execute_stock_reposts = None
 
-
 	def test_reco_for_fifo(self):
 		self._test_reco_sle_gle("FIFO")
 
@@ -40,55 +39,72 @@
 		self._test_reco_sle_gle("Moving Average")
 
 	def _test_reco_sle_gle(self, valuation_method):
-		se1, se2, se3 = insert_existing_sle(warehouse='Stores - TCP1')
-		company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company')
+		se1, se2, se3 = insert_existing_sle(warehouse="Stores - TCP1")
+		company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
 		# [[qty, valuation_rate, posting_date,
-		#		posting_time, expected_stock_value, bin_qty, bin_valuation]]
+		# 		posting_time, expected_stock_value, bin_qty, bin_valuation]]
 
 		input_data = [
 			[50, 1000, "2012-12-26", "12:00"],
 			[25, 900, "2012-12-26", "12:00"],
 			["", 1000, "2012-12-20", "12:05"],
 			[20, "", "2012-12-26", "12:05"],
-			[0, "", "2012-12-31", "12:10"]
+			[0, "", "2012-12-31", "12:10"],
 		]
 
 		for d in input_data:
 			set_valuation_method("_Test Item", valuation_method)
 
-			last_sle = get_previous_sle({
-				"item_code": "_Test Item",
-				"warehouse": "Stores - TCP1",
-				"posting_date": d[2],
-				"posting_time": d[3]
-			})
+			last_sle = get_previous_sle(
+				{
+					"item_code": "_Test Item",
+					"warehouse": "Stores - TCP1",
+					"posting_date": d[2],
+					"posting_time": d[3],
+				}
+			)
 
 			# submit stock reconciliation
-			stock_reco = create_stock_reconciliation(qty=d[0], rate=d[1],
-				posting_date=d[2], posting_time=d[3], warehouse="Stores - TCP1",
-				company=company, expense_account = "Stock Adjustment - TCP1")
+			stock_reco = create_stock_reconciliation(
+				qty=d[0],
+				rate=d[1],
+				posting_date=d[2],
+				posting_time=d[3],
+				warehouse="Stores - TCP1",
+				company=company,
+				expense_account="Stock Adjustment - TCP1",
+			)
 
 			# check stock value
-			sle = frappe.db.sql("""select * from `tabStock Ledger Entry`
-				where voucher_type='Stock Reconciliation' and voucher_no=%s""", stock_reco.name, as_dict=1)
+			sle = frappe.db.sql(
+				"""select * from `tabStock Ledger Entry`
+				where voucher_type='Stock Reconciliation' and voucher_no=%s""",
+				stock_reco.name,
+				as_dict=1,
+			)
 
 			qty_after_transaction = flt(d[0]) if d[0] != "" else flt(last_sle.get("qty_after_transaction"))
 
 			valuation_rate = flt(d[1]) if d[1] != "" else flt(last_sle.get("valuation_rate"))
 
-			if qty_after_transaction == last_sle.get("qty_after_transaction") \
-				and valuation_rate == last_sle.get("valuation_rate"):
-					self.assertFalse(sle)
+			if qty_after_transaction == last_sle.get(
+				"qty_after_transaction"
+			) and valuation_rate == last_sle.get("valuation_rate"):
+				self.assertFalse(sle)
 			else:
 				self.assertEqual(flt(sle[0].qty_after_transaction, 1), flt(qty_after_transaction, 1))
 				self.assertEqual(flt(sle[0].stock_value, 1), flt(qty_after_transaction * valuation_rate, 1))
 
 				# no gl entries
-				self.assertTrue(frappe.db.get_value("Stock Ledger Entry",
-					{"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}))
+				self.assertTrue(
+					frappe.db.get_value(
+						"Stock Ledger Entry", {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name}
+					)
+				)
 
-				acc_bal, stock_bal, wh_list = get_stock_and_account_balance("Stock In Hand - TCP1",
-					stock_reco.posting_date, stock_reco.company)
+				acc_bal, stock_bal, wh_list = get_stock_and_account_balance(
+					"Stock In Hand - TCP1", stock_reco.posting_date, stock_reco.company
+				)
 				self.assertEqual(flt(acc_bal, 1), flt(stock_bal, 1))
 
 				stock_reco.cancel()
@@ -98,18 +114,33 @@
 		se1.cancel()
 
 	def test_get_items(self):
-		create_warehouse("_Test Warehouse Group 1",
-			{"is_group": 1, "company": "_Test Company", "parent_warehouse": "All Warehouses - _TC"})
-		create_warehouse("_Test Warehouse Ledger 1",
-			{"is_group": 0, "parent_warehouse": "_Test Warehouse Group 1 - _TC", "company": "_Test Company"})
+		create_warehouse(
+			"_Test Warehouse Group 1",
+			{"is_group": 1, "company": "_Test Company", "parent_warehouse": "All Warehouses - _TC"},
+		)
+		create_warehouse(
+			"_Test Warehouse Ledger 1",
+			{
+				"is_group": 0,
+				"parent_warehouse": "_Test Warehouse Group 1 - _TC",
+				"company": "_Test Company",
+			},
+		)
 
-		create_item("_Test Stock Reco Item", is_stock_item=1, valuation_rate=100,
-			warehouse="_Test Warehouse Ledger 1 - _TC", opening_stock=100)
+		create_item(
+			"_Test Stock Reco Item",
+			is_stock_item=1,
+			valuation_rate=100,
+			warehouse="_Test Warehouse Ledger 1 - _TC",
+			opening_stock=100,
+		)
 
 		items = get_items("_Test Warehouse Group 1 - _TC", nowdate(), nowtime(), "_Test Company")
 
-		self.assertEqual(["_Test Stock Reco Item", "_Test Warehouse Ledger 1 - _TC", 100],
-			[items[0]["item_code"], items[0]["warehouse"], items[0]["qty"]])
+		self.assertEqual(
+			["_Test Stock Reco Item", "_Test Warehouse Ledger 1 - _TC", 100],
+			[items[0]["item_code"], items[0]["warehouse"], items[0]["qty"]],
+		)
 
 	def test_stock_reco_for_serialized_item(self):
 		to_delete_records = []
@@ -119,8 +150,9 @@
 		serial_item_code = "Stock-Reco-Serial-Item-1"
 		serial_warehouse = "_Test Warehouse for Stock Reco1 - _TC"
 
-		sr = create_stock_reconciliation(item_code=serial_item_code,
-			warehouse = serial_warehouse, qty=5, rate=200)
+		sr = create_stock_reconciliation(
+			item_code=serial_item_code, warehouse=serial_warehouse, qty=5, rate=200
+		)
 
 		serial_nos = get_serial_nos(sr.items[0].serial_no)
 		self.assertEqual(len(serial_nos), 5)
@@ -130,7 +162,7 @@
 			"warehouse": serial_warehouse,
 			"posting_date": nowdate(),
 			"posting_time": nowtime(),
-			"serial_no": sr.items[0].serial_no
+			"serial_no": sr.items[0].serial_no,
 		}
 
 		valuation_rate = get_incoming_rate(args)
@@ -138,8 +170,9 @@
 
 		to_delete_records.append(sr.name)
 
-		sr = create_stock_reconciliation(item_code=serial_item_code,
-			warehouse = serial_warehouse, qty=5, rate=300)
+		sr = create_stock_reconciliation(
+			item_code=serial_item_code, warehouse=serial_warehouse, qty=5, rate=300
+		)
 
 		serial_nos1 = get_serial_nos(sr.items[0].serial_no)
 		self.assertEqual(len(serial_nos1), 5)
@@ -149,7 +182,7 @@
 			"warehouse": serial_warehouse,
 			"posting_date": nowdate(),
 			"posting_time": nowtime(),
-			"serial_no": sr.items[0].serial_no
+			"serial_no": sr.items[0].serial_no,
 		}
 
 		valuation_rate = get_incoming_rate(args)
@@ -162,7 +195,6 @@
 			stock_doc = frappe.get_doc("Stock Reconciliation", d)
 			stock_doc.cancel()
 
-
 	def test_stock_reco_for_merge_serialized_item(self):
 		to_delete_records = []
 
@@ -170,23 +202,34 @@
 		serial_item_code = "Stock-Reco-Serial-Item-2"
 		serial_warehouse = "_Test Warehouse for Stock Reco1 - _TC"
 
-		sr = create_stock_reconciliation(item_code=serial_item_code, serial_no=random_string(6),
-			warehouse = serial_warehouse, qty=1, rate=100, do_not_submit=True, purpose='Opening Stock')
+		sr = create_stock_reconciliation(
+			item_code=serial_item_code,
+			serial_no=random_string(6),
+			warehouse=serial_warehouse,
+			qty=1,
+			rate=100,
+			do_not_submit=True,
+			purpose="Opening Stock",
+		)
 
 		for i in range(3):
-			sr.append('items', {
-				'item_code': serial_item_code,
-				'warehouse': serial_warehouse,
-				'qty': 1,
-				'valuation_rate': 100,
-				'serial_no': random_string(6)
-			})
+			sr.append(
+				"items",
+				{
+					"item_code": serial_item_code,
+					"warehouse": serial_warehouse,
+					"qty": 1,
+					"valuation_rate": 100,
+					"serial_no": random_string(6),
+				},
+			)
 
 		sr.save()
 		sr.submit()
 
-		sle_entries = frappe.get_all('Stock Ledger Entry', filters= {'voucher_no': sr.name},
-			fields = ['name', 'incoming_rate'])
+		sle_entries = frappe.get_all(
+			"Stock Ledger Entry", filters={"voucher_no": sr.name}, fields=["name", "incoming_rate"]
+		)
 
 		self.assertEqual(len(sle_entries), 1)
 		self.assertEqual(sle_entries[0].incoming_rate, 100)
@@ -205,8 +248,9 @@
 		item_code = "Stock-Reco-batch-Item-1"
 		warehouse = "_Test Warehouse for Stock Reco2 - _TC"
 
-		sr = create_stock_reconciliation(item_code=item_code,
-			warehouse = warehouse, qty=5, rate=200, do_not_submit=1)
+		sr = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=5, rate=200, do_not_submit=1
+		)
 		sr.save()
 		sr.submit()
 
@@ -214,8 +258,9 @@
 		self.assertTrue(batch_no)
 		to_delete_records.append(sr.name)
 
-		sr1 = create_stock_reconciliation(item_code=item_code,
-			warehouse = warehouse, qty=6, rate=300, batch_no=batch_no)
+		sr1 = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=6, rate=300, batch_no=batch_no
+		)
 
 		args = {
 			"item_code": item_code,
@@ -229,9 +274,9 @@
 		self.assertEqual(valuation_rate, 300)
 		to_delete_records.append(sr1.name)
 
-
-		sr2 = create_stock_reconciliation(item_code=item_code,
-			warehouse = warehouse, qty=0, rate=0, batch_no=batch_no)
+		sr2 = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=0, rate=0, batch_no=batch_no
+		)
 
 		stock_value = get_stock_value_on(warehouse, nowdate(), item_code)
 		self.assertEqual(stock_value, 0)
@@ -243,11 +288,12 @@
 			stock_doc.cancel()
 
 	def test_customer_provided_items(self):
-		item_code = 'Stock-Reco-customer-Item-100'
-		create_item(item_code, is_customer_provided_item = 1,
-			  customer = '_Test Customer', is_purchase_item = 0)
+		item_code = "Stock-Reco-customer-Item-100"
+		create_item(
+			item_code, is_customer_provided_item=1, customer="_Test Customer", is_purchase_item=0
+		)
 
-		sr = create_stock_reconciliation(item_code = item_code, qty = 10, rate = 420)
+		sr = create_stock_reconciliation(item_code=item_code, qty=10, rate=420)
 
 		self.assertEqual(sr.get("items")[0].allow_zero_valuation_rate, 1)
 		self.assertEqual(sr.get("items")[0].valuation_rate, 0)
@@ -255,65 +301,79 @@
 
 	def test_backdated_stock_reco_qty_reposting(self):
 		"""
-			Test if a backdated stock reco recalculates future qty until next reco.
-			-------------------------------------------
-			Var		| Doc	|	Qty	| Balance
-			-------------------------------------------
-			SR5		| Reco	|	0	|	8	(posting date: today-4) [backdated]
-			PR1		| PR	|	10	|	18	(posting date: today-3)
-			PR2		| PR	|	1	|	19	(posting date: today-2)
-			SR4		| Reco	|	0	|	6	(posting date: today-1) [backdated]
-			PR3		| PR	|	1	|	7	(posting date: today) # can't post future PR
+		Test if a backdated stock reco recalculates future qty until next reco.
+		-------------------------------------------
+		Var		| Doc	|	Qty	| Balance
+		-------------------------------------------
+		SR5		| Reco	|	0	|	8	(posting date: today-4) [backdated]
+		PR1		| PR	|	10	|	18	(posting date: today-3)
+		PR2		| PR	|	1	|	19	(posting date: today-2)
+		SR4		| Reco	|	0	|	6	(posting date: today-1) [backdated]
+		PR3		| PR	|	1	|	7	(posting date: today) # can't post future PR
 		"""
 		item_code = "Backdated-Reco-Item"
 		warehouse = "_Test Warehouse - _TC"
 		create_item(item_code)
 
-		pr1 = make_purchase_receipt(item_code=item_code, warehouse=warehouse, qty=10, rate=100,
-			posting_date=add_days(nowdate(), -3))
-		pr2 = make_purchase_receipt(item_code=item_code, warehouse=warehouse, qty=1, rate=100,
-			posting_date=add_days(nowdate(), -2))
-		pr3 = make_purchase_receipt(item_code=item_code, warehouse=warehouse, qty=1, rate=100,
-			posting_date=nowdate())
+		pr1 = make_purchase_receipt(
+			item_code=item_code, warehouse=warehouse, qty=10, rate=100, posting_date=add_days(nowdate(), -3)
+		)
+		pr2 = make_purchase_receipt(
+			item_code=item_code, warehouse=warehouse, qty=1, rate=100, posting_date=add_days(nowdate(), -2)
+		)
+		pr3 = make_purchase_receipt(
+			item_code=item_code, warehouse=warehouse, qty=1, rate=100, posting_date=nowdate()
+		)
 
-		pr1_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0},
-			"qty_after_transaction")
-		pr3_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr3.name, "is_cancelled": 0},
-			"qty_after_transaction")
+		pr1_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
+		pr3_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr3.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
 		self.assertEqual(pr1_balance, 10)
 		self.assertEqual(pr3_balance, 12)
 
 		# post backdated stock reco in between
-		sr4 = create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=6, rate=100,
-			posting_date=add_days(nowdate(), -1))
-		pr3_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr3.name, "is_cancelled": 0},
-			"qty_after_transaction")
+		sr4 = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=6, rate=100, posting_date=add_days(nowdate(), -1)
+		)
+		pr3_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr3.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
 		self.assertEqual(pr3_balance, 7)
 
 		# post backdated stock reco at the start
-		sr5 = create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=8, rate=100,
-			posting_date=add_days(nowdate(), -4))
-		pr1_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0},
-			"qty_after_transaction")
-		pr2_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr2.name, "is_cancelled": 0},
-			"qty_after_transaction")
-		sr4_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": sr4.name, "is_cancelled": 0},
-			"qty_after_transaction")
+		sr5 = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=8, rate=100, posting_date=add_days(nowdate(), -4)
+		)
+		pr1_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
+		pr2_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr2.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
+		sr4_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": sr4.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
 		self.assertEqual(pr1_balance, 18)
 		self.assertEqual(pr2_balance, 19)
-		self.assertEqual(sr4_balance, 6) # check if future stock reco is unaffected
+		self.assertEqual(sr4_balance, 6)  # check if future stock reco is unaffected
 
 		# cancel backdated stock reco and check future impact
 		sr5.cancel()
-		pr1_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0},
-			"qty_after_transaction")
-		pr2_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr2.name, "is_cancelled": 0},
-			"qty_after_transaction")
-		sr4_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": sr4.name, "is_cancelled": 0},
-			"qty_after_transaction")
+		pr1_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
+		pr2_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr2.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
+		sr4_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": sr4.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
 		self.assertEqual(pr1_balance, 10)
 		self.assertEqual(pr2_balance, 11)
-		self.assertEqual(sr4_balance, 6) # check if future stock reco is unaffected
+		self.assertEqual(sr4_balance, 6)  # check if future stock reco is unaffected
 
 		# teardown
 		sr4.cancel()
@@ -324,13 +384,13 @@
 	@change_settings("Stock Settings", {"allow_negative_stock": 0})
 	def test_backdated_stock_reco_future_negative_stock(self):
 		"""
-			Test if a backdated stock reco causes future negative stock and is blocked.
-			-------------------------------------------
-			Var		| Doc	|	Qty	| Balance
-			-------------------------------------------
-			PR1		| PR	|	10	|	10		(posting date: today-2)
-			SR3		| Reco	|	0	|	1		(posting date: today-1) [backdated & blocked]
-			DN2		| DN	|	-2	|	8(-1)	(posting date: today)
+		Test if a backdated stock reco causes future negative stock and is blocked.
+		-------------------------------------------
+		Var		| Doc	|	Qty	| Balance
+		-------------------------------------------
+		PR1		| PR	|	10	|	10		(posting date: today-2)
+		SR3		| Reco	|	0	|	1		(posting date: today-1) [backdated & blocked]
+		DN2		| DN	|	-2	|	8(-1)	(posting date: today)
 		"""
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 		from erpnext.stock.stock_ledger import NegativeStockError
@@ -339,22 +399,31 @@
 		warehouse = "_Test Warehouse - _TC"
 		create_item(item_code)
 
+		pr1 = make_purchase_receipt(
+			item_code=item_code, warehouse=warehouse, qty=10, rate=100, posting_date=add_days(nowdate(), -2)
+		)
+		dn2 = create_delivery_note(
+			item_code=item_code, warehouse=warehouse, qty=2, rate=120, posting_date=nowdate()
+		)
 
-		pr1 = make_purchase_receipt(item_code=item_code, warehouse=warehouse, qty=10, rate=100,
-			posting_date=add_days(nowdate(), -2))
-		dn2 = create_delivery_note(item_code=item_code, warehouse=warehouse, qty=2, rate=120,
-			posting_date=nowdate())
-
-		pr1_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0},
-			"qty_after_transaction")
-		dn2_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": dn2.name, "is_cancelled": 0},
-			"qty_after_transaction")
+		pr1_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": pr1.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
+		dn2_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": dn2.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
 		self.assertEqual(pr1_balance, 10)
 		self.assertEqual(dn2_balance, 8)
 
 		# check if stock reco is blocked
-		sr3 = create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=1, rate=100,
-			posting_date=add_days(nowdate(), -1), do_not_submit=True)
+		sr3 = create_stock_reconciliation(
+			item_code=item_code,
+			warehouse=warehouse,
+			qty=1,
+			rate=100,
+			posting_date=add_days(nowdate(), -1),
+			do_not_submit=True,
+		)
 		self.assertRaises(NegativeStockError, sr3.submit)
 
 		# teardown
@@ -362,16 +431,15 @@
 		dn2.cancel()
 		pr1.cancel()
 
-
 	@change_settings("Stock Settings", {"allow_negative_stock": 0})
 	def test_backdated_stock_reco_cancellation_future_negative_stock(self):
 		"""
-			Test if a backdated stock reco cancellation that causes future negative stock is blocked.
-			-------------------------------------------
-			Var | Doc  | Qty | Balance
-			-------------------------------------------
-			SR  | Reco | 100 | 100     (posting date: today-1) (shouldn't be cancelled after DN)
-			DN  | DN   | 100 |   0     (posting date: today)
+		Test if a backdated stock reco cancellation that causes future negative stock is blocked.
+		-------------------------------------------
+		Var | Doc  | Qty | Balance
+		-------------------------------------------
+		SR  | Reco | 100 | 100     (posting date: today-1) (shouldn't be cancelled after DN)
+		DN  | DN   | 100 |   0     (posting date: today)
 		"""
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 		from erpnext.stock.stock_ledger import NegativeStockError
@@ -380,15 +448,21 @@
 		warehouse = "_Test Warehouse - _TC"
 		create_item(item_code)
 
+		sr = create_stock_reconciliation(
+			item_code=item_code,
+			warehouse=warehouse,
+			qty=100,
+			rate=100,
+			posting_date=add_days(nowdate(), -1),
+		)
 
-		sr = create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=100, rate=100,
-			posting_date=add_days(nowdate(), -1))
+		dn = create_delivery_note(
+			item_code=item_code, warehouse=warehouse, qty=100, rate=120, posting_date=nowdate()
+		)
 
-		dn = create_delivery_note(item_code=item_code, warehouse=warehouse, qty=100, rate=120,
-			posting_date=nowdate())
-
-		dn_balance = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": dn.name, "is_cancelled": 0},
-			"qty_after_transaction")
+		dn_balance = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": dn.name, "is_cancelled": 0}, "qty_after_transaction"
+		)
 		self.assertEqual(dn_balance, 0)
 
 		# check if cancellation of stock reco is blocked
@@ -400,12 +474,12 @@
 	def test_intermediate_sr_bin_update(self):
 		"""Bin should show correct qty even for backdated entries.
 
-			-------------------------------------------
-			| creation | Var | Doc  | Qty | balance qty
-			-------------------------------------------
-			|  1       | SR  | Reco | 10  | 10     (posting date: today+10)
-			|  3       | SR2 | Reco | 11  | 11     (posting date: today+11)
-			|  2       | DN  | DN   | 5   | 6 <-- assert in BIN  (posting date: today+12)
+		-------------------------------------------
+		| creation | Var | Doc  | Qty | balance qty
+		-------------------------------------------
+		|  1       | SR  | Reco | 10  | 10     (posting date: today+10)
+		|  3       | SR2 | Reco | 11  | 11     (posting date: today+11)
+		|  2       | DN  | DN   | 5   | 6 <-- assert in BIN  (posting date: today+12)
 		"""
 		from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 
@@ -417,26 +491,33 @@
 		warehouse = "_Test Warehouse - _TC"
 		create_item(item_code)
 
-		sr = create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=10, rate=100,
-			posting_date=add_days(nowdate(), 10))
+		sr = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=10, rate=100, posting_date=add_days(nowdate(), 10)
+		)
 
-		dn = create_delivery_note(item_code=item_code, warehouse=warehouse, qty=5, rate=120,
-			posting_date=add_days(nowdate(), 12))
-		old_bin_qty = frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty")
+		dn = create_delivery_note(
+			item_code=item_code, warehouse=warehouse, qty=5, rate=120, posting_date=add_days(nowdate(), 12)
+		)
+		old_bin_qty = frappe.db.get_value(
+			"Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty"
+		)
 
-		sr2 = create_stock_reconciliation(item_code=item_code, warehouse=warehouse, qty=11, rate=100,
-			posting_date=add_days(nowdate(), 11))
-		new_bin_qty = frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty")
+		sr2 = create_stock_reconciliation(
+			item_code=item_code, warehouse=warehouse, qty=11, rate=100, posting_date=add_days(nowdate(), 11)
+		)
+		new_bin_qty = frappe.db.get_value(
+			"Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty"
+		)
 
 		self.assertEqual(old_bin_qty + 1, new_bin_qty)
 		frappe.db.rollback()
 
-
 	def test_valid_batch(self):
 		create_batch_item_with_batch("Testing Batch Item 1", "001")
 		create_batch_item_with_batch("Testing Batch Item 2", "002")
-		sr = create_stock_reconciliation(item_code="Testing Batch Item 1", qty=1, rate=100, batch_no="002"
-			, do_not_submit=True)
+		sr = create_stock_reconciliation(
+			item_code="Testing Batch Item 1", qty=1, rate=100, batch_no="002", do_not_submit=True
+		)
 		self.assertRaises(frappe.ValidationError, sr.submit)
 
 	def test_serial_no_cancellation(self):
@@ -458,15 +539,17 @@
 		serial_nos.pop()
 		new_serial_nos = "\n".join(serial_nos)
 
-		sr = create_stock_reconciliation(item_code=item.name, warehouse=warehouse, serial_no=new_serial_nos, qty=9)
+		sr = create_stock_reconciliation(
+			item_code=item.name, warehouse=warehouse, serial_no=new_serial_nos, qty=9
+		)
 		sr.cancel()
 
-		active_sr_no = frappe.get_all("Serial No",
-				filters={"item_code": item_code, "warehouse": warehouse, "status": "Active"})
+		active_sr_no = frappe.get_all(
+			"Serial No", filters={"item_code": item_code, "warehouse": warehouse, "status": "Active"}
+		)
 
 		self.assertEqual(len(active_sr_no), 10)
 
-
 	def test_serial_no_creation_and_inactivation(self):
 		item = create_item("_TestItemCreatedWithStockReco", is_stock_item=1)
 		if not item.has_serial_no:
@@ -476,19 +559,27 @@
 		item_code = item.name
 		warehouse = "_Test Warehouse - _TC"
 
-		sr = create_stock_reconciliation(item_code=item.name, warehouse=warehouse,
-				serial_no="SR-CREATED-SR-NO", qty=1, do_not_submit=True, rate=100)
+		sr = create_stock_reconciliation(
+			item_code=item.name,
+			warehouse=warehouse,
+			serial_no="SR-CREATED-SR-NO",
+			qty=1,
+			do_not_submit=True,
+			rate=100,
+		)
 		sr.save()
 		self.assertEqual(cstr(sr.items[0].current_serial_no), "")
 		sr.submit()
 
-		active_sr_no = frappe.get_all("Serial No",
-				filters={"item_code": item_code, "warehouse": warehouse, "status": "Active"})
+		active_sr_no = frappe.get_all(
+			"Serial No", filters={"item_code": item_code, "warehouse": warehouse, "status": "Active"}
+		)
 		self.assertEqual(len(active_sr_no), 1)
 
 		sr.cancel()
-		active_sr_no = frappe.get_all("Serial No",
-				filters={"item_code": item_code, "warehouse": warehouse, "status": "Active"})
+		active_sr_no = frappe.get_all(
+			"Serial No", filters={"item_code": item_code, "warehouse": warehouse, "status": "Active"}
+		)
 		self.assertEqual(len(active_sr_no), 0)
 
 
@@ -499,32 +590,51 @@
 		batch_item_doc.create_new_batch = 1
 		batch_item_doc.save(ignore_permissions=True)
 
-	if not frappe.db.exists('Batch', batch_id):
-		b = frappe.new_doc('Batch')
+	if not frappe.db.exists("Batch", batch_id):
+		b = frappe.new_doc("Batch")
 		b.item = item_name
 		b.batch_id = batch_id
 		b.save()
 
+
 def insert_existing_sle(warehouse):
 	from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
 
-	se1 = make_stock_entry(posting_date="2012-12-15", posting_time="02:00", item_code="_Test Item",
-		target=warehouse, qty=10, basic_rate=700)
+	se1 = make_stock_entry(
+		posting_date="2012-12-15",
+		posting_time="02:00",
+		item_code="_Test Item",
+		target=warehouse,
+		qty=10,
+		basic_rate=700,
+	)
 
-	se2 = make_stock_entry(posting_date="2012-12-25", posting_time="03:00", item_code="_Test Item",
-		source=warehouse, qty=15)
+	se2 = make_stock_entry(
+		posting_date="2012-12-25", posting_time="03:00", item_code="_Test Item", source=warehouse, qty=15
+	)
 
-	se3 = make_stock_entry(posting_date="2013-01-05", posting_time="07:00", item_code="_Test Item",
-		target=warehouse, qty=15, basic_rate=1200)
+	se3 = make_stock_entry(
+		posting_date="2013-01-05",
+		posting_time="07:00",
+		item_code="_Test Item",
+		target=warehouse,
+		qty=15,
+		basic_rate=1200,
+	)
 
 	return se1, se2, se3
 
-def create_batch_or_serial_no_items():
-	create_warehouse("_Test Warehouse for Stock Reco1",
-		{"is_group": 0, "parent_warehouse": "_Test Warehouse Group - _TC"})
 
-	create_warehouse("_Test Warehouse for Stock Reco2",
-		{"is_group": 0, "parent_warehouse": "_Test Warehouse Group - _TC"})
+def create_batch_or_serial_no_items():
+	create_warehouse(
+		"_Test Warehouse for Stock Reco1",
+		{"is_group": 0, "parent_warehouse": "_Test Warehouse Group - _TC"},
+	)
+
+	create_warehouse(
+		"_Test Warehouse for Stock Reco2",
+		{"is_group": 0, "parent_warehouse": "_Test Warehouse Group - _TC"},
+	)
 
 	serial_item_doc = create_item("Stock-Reco-Serial-Item-1", is_stock_item=1)
 	if not serial_item_doc.has_serial_no:
@@ -545,6 +655,7 @@
 		serial_item_doc.batch_number_series = "BASR.#####"
 		batch_item_doc.save(ignore_permissions=True)
 
+
 def create_stock_reconciliation(**args):
 	args = frappe._dict(args)
 	sr = frappe.new_doc("Stock Reconciliation")
@@ -553,20 +664,26 @@
 	sr.posting_time = args.posting_time or nowtime()
 	sr.set_posting_time = 1
 	sr.company = args.company or "_Test Company"
-	sr.expense_account = args.expense_account or \
-		("Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC")
-	sr.cost_center = args.cost_center \
-		or frappe.get_cached_value("Company", sr.company, "cost_center") \
+	sr.expense_account = args.expense_account or (
+		"Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC"
+	)
+	sr.cost_center = (
+		args.cost_center
+		or frappe.get_cached_value("Company", sr.company, "cost_center")
 		or "_Test Cost Center - _TC"
+	)
 
-	sr.append("items", {
-		"item_code": args.item_code or "_Test Item",
-		"warehouse": args.warehouse or "_Test Warehouse - _TC",
-		"qty": args.qty,
-		"valuation_rate": args.rate,
-		"serial_no": args.serial_no,
-		"batch_no": args.batch_no
-	})
+	sr.append(
+		"items",
+		{
+			"item_code": args.item_code or "_Test Item",
+			"warehouse": args.warehouse or "_Test Warehouse - _TC",
+			"qty": args.qty,
+			"valuation_rate": args.rate,
+			"serial_no": args.serial_no,
+			"batch_no": args.batch_no,
+		},
+	)
 
 	try:
 		if not args.do_not_submit:
@@ -575,6 +692,7 @@
 		pass
 	return sr
 
+
 def set_valuation_method(item_code, valuation_method):
 	existing_valuation_method = get_valuation_method(item_code)
 	if valuation_method == existing_valuation_method:
@@ -582,11 +700,13 @@
 
 	frappe.db.set_value("Item", item_code, "valuation_method", valuation_method)
 
-	for warehouse in frappe.get_all("Warehouse", filters={"company": "_Test Company"}, fields=["name", "is_group"]):
+	for warehouse in frappe.get_all(
+		"Warehouse", filters={"company": "_Test Company"}, fields=["name", "is_group"]
+	):
 		if not warehouse.is_group:
-			update_entries_after({
-				"item_code": item_code,
-				"warehouse": warehouse.name
-			}, allow_negative_stock=1)
+			update_entries_after(
+				{"item_code": item_code, "warehouse": warehouse.name}, allow_negative_stock=1
+			)
+
 
 test_dependencies = ["Item", "Warehouse"]
diff --git a/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py b/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py
index bab521d..e0c8ed1 100644
--- a/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py
+++ b/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py
@@ -6,8 +6,6 @@
 
 
 class StockRepostingSettings(Document):
-
-
 	def validate(self):
 		self.set_minimum_reposting_time_slot()
 
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py
index c1293cb..e592a4b 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.py
@@ -16,24 +16,40 @@
 
 class StockSettings(Document):
 	def validate(self):
-		for key in ["item_naming_by", "item_group", "stock_uom",
-			"allow_negative_stock", "default_warehouse", "set_qty_in_transactions_based_on_serial_no_input"]:
-				frappe.db.set_default(key, self.get(key, ""))
+		for key in [
+			"item_naming_by",
+			"item_group",
+			"stock_uom",
+			"allow_negative_stock",
+			"default_warehouse",
+			"set_qty_in_transactions_based_on_serial_no_input",
+		]:
+			frappe.db.set_default(key, self.get(key, ""))
 
 		from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series
-		set_by_naming_series("Item", "item_code",
-			self.get("item_naming_by")=="Naming Series", hide_name_field=True, make_mandatory=0)
+
+		set_by_naming_series(
+			"Item",
+			"item_code",
+			self.get("item_naming_by") == "Naming Series",
+			hide_name_field=True,
+			make_mandatory=0,
+		)
 
 		stock_frozen_limit = 356
 		submitted_stock_frozen = self.stock_frozen_upto_days or 0
 		if submitted_stock_frozen > stock_frozen_limit:
 			self.stock_frozen_upto_days = stock_frozen_limit
-			frappe.msgprint (_("`Freeze Stocks Older Than` should be smaller than %d days.") %stock_frozen_limit)
+			frappe.msgprint(
+				_("`Freeze Stocks Older Than` should be smaller than %d days.") % stock_frozen_limit
+			)
 
 		# show/hide barcode field
 		for name in ["barcode", "barcodes", "scan_barcode"]:
-			frappe.make_property_setter({'fieldname': name, 'property': 'hidden',
-				'value': 0 if self.show_barcode_field else 1}, validate_fields_for_doctype=False)
+			frappe.make_property_setter(
+				{"fieldname": name, "property": "hidden", "value": 0 if self.show_barcode_field else 1},
+				validate_fields_for_doctype=False,
+			)
 
 		self.validate_warehouses()
 		self.cant_change_valuation_method()
@@ -44,8 +60,12 @@
 		warehouse_fields = ["default_warehouse", "sample_retention_warehouse"]
 		for field in warehouse_fields:
 			if frappe.db.get_value("Warehouse", self.get(field), "is_group"):
-				frappe.throw(_("Group Warehouses cannot be used in transactions. Please change the value of {0}") \
-					.format(frappe.bold(self.meta.get_field(field).label)), title =_("Incorrect Warehouse"))
+				frappe.throw(
+					_("Group Warehouses cannot be used in transactions. Please change the value of {0}").format(
+						frappe.bold(self.meta.get_field(field).label)
+					),
+					title=_("Incorrect Warehouse"),
+				)
 
 	def cant_change_valuation_method(self):
 		db_valuation_method = frappe.db.get_single_value("Stock Settings", "valuation_method")
@@ -53,38 +73,73 @@
 		if db_valuation_method and db_valuation_method != self.valuation_method:
 			# check if there are any stock ledger entries against items
 			# which does not have it's own valuation method
-			sle = frappe.db.sql("""select name from `tabStock Ledger Entry` sle
+			sle = frappe.db.sql(
+				"""select name from `tabStock Ledger Entry` sle
 				where exists(select name from tabItem
 					where name=sle.item_code and (valuation_method is null or valuation_method='')) limit 1
-			""")
+			"""
+			)
 
 			if sle:
-				frappe.throw(_("Can't change the valuation method, as there are transactions against some items which do not have its own valuation method"))
+				frappe.throw(
+					_(
+						"Can't change the valuation method, as there are transactions against some items which do not have its own valuation method"
+					)
+				)
 
 	def validate_clean_description_html(self):
-		if int(self.clean_description_html or 0) \
-			and not int(self.db_get('clean_description_html') or 0):
+		if int(self.clean_description_html or 0) and not int(self.db_get("clean_description_html") or 0):
 			# changed to text
-			frappe.enqueue('erpnext.stock.doctype.stock_settings.stock_settings.clean_all_descriptions', now=frappe.flags.in_test)
+			frappe.enqueue(
+				"erpnext.stock.doctype.stock_settings.stock_settings.clean_all_descriptions",
+				now=frappe.flags.in_test,
+			)
 
 	def validate_pending_reposts(self):
 		if self.stock_frozen_upto:
 			check_pending_reposting(self.stock_frozen_upto)
 
-
 	def on_update(self):
 		self.toggle_warehouse_field_for_inter_warehouse_transfer()
 
 	def toggle_warehouse_field_for_inter_warehouse_transfer(self):
-		make_property_setter("Sales Invoice Item", "target_warehouse", "hidden", 1 - cint(self.allow_from_dn), "Check", validate_fields_for_doctype=False)
-		make_property_setter("Delivery Note Item", "target_warehouse", "hidden", 1 - cint(self.allow_from_dn), "Check", validate_fields_for_doctype=False)
-		make_property_setter("Purchase Invoice Item", "from_warehouse", "hidden", 1 - cint(self.allow_from_pr), "Check", validate_fields_for_doctype=False)
-		make_property_setter("Purchase Receipt Item", "from_warehouse", "hidden", 1 - cint(self.allow_from_pr), "Check", validate_fields_for_doctype=False)
+		make_property_setter(
+			"Sales Invoice Item",
+			"target_warehouse",
+			"hidden",
+			1 - cint(self.allow_from_dn),
+			"Check",
+			validate_fields_for_doctype=False,
+		)
+		make_property_setter(
+			"Delivery Note Item",
+			"target_warehouse",
+			"hidden",
+			1 - cint(self.allow_from_dn),
+			"Check",
+			validate_fields_for_doctype=False,
+		)
+		make_property_setter(
+			"Purchase Invoice Item",
+			"from_warehouse",
+			"hidden",
+			1 - cint(self.allow_from_pr),
+			"Check",
+			validate_fields_for_doctype=False,
+		)
+		make_property_setter(
+			"Purchase Receipt Item",
+			"from_warehouse",
+			"hidden",
+			1 - cint(self.allow_from_pr),
+			"Check",
+			validate_fields_for_doctype=False,
+		)
 
 
 def clean_all_descriptions():
-	for item in frappe.get_all('Item', ['name', 'description']):
+	for item in frappe.get_all("Item", ["name", "description"]):
 		if item.description:
 			clean_description = clean_html(item.description)
 		if item.description != clean_description:
-			frappe.db.set_value('Item', item.name, 'description', clean_description)
+			frappe.db.set_value("Item", item.name, "description", clean_description)
diff --git a/erpnext/stock/doctype/stock_settings/test_stock_settings.py b/erpnext/stock/doctype/stock_settings/test_stock_settings.py
index 1349671..974e163 100644
--- a/erpnext/stock/doctype/stock_settings/test_stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/test_stock_settings.py
@@ -13,35 +13,45 @@
 		frappe.db.set_value("Stock Settings", None, "clean_description_html", 0)
 
 	def test_settings(self):
-		item = frappe.get_doc(dict(
-			doctype = 'Item',
-			item_code = 'Item for description test',
-			item_group = 'Products',
-			description = '<p><span style="font-size: 12px;">Drawing No. 07-xxx-PO132<br></span><span style="font-size: 12px;">1800 x 1685 x 750<br></span><span style="font-size: 12px;">All parts made of Marine Ply<br></span><span style="font-size: 12px;">Top w/ Corian dd<br></span><span style="font-size: 12px;">CO, CS, VIP Day Cabin</span></p>'
-		)).insert()
+		item = frappe.get_doc(
+			dict(
+				doctype="Item",
+				item_code="Item for description test",
+				item_group="Products",
+				description='<p><span style="font-size: 12px;">Drawing No. 07-xxx-PO132<br></span><span style="font-size: 12px;">1800 x 1685 x 750<br></span><span style="font-size: 12px;">All parts made of Marine Ply<br></span><span style="font-size: 12px;">Top w/ Corian dd<br></span><span style="font-size: 12px;">CO, CS, VIP Day Cabin</span></p>',
+			)
+		).insert()
 
-		settings = frappe.get_single('Stock Settings')
+		settings = frappe.get_single("Stock Settings")
 		settings.clean_description_html = 1
 		settings.save()
 
 		item.reload()
 
-		self.assertEqual(item.description, '<p>Drawing No. 07-xxx-PO132<br>1800 x 1685 x 750<br>All parts made of Marine Ply<br>Top w/ Corian dd<br>CO, CS, VIP Day Cabin</p>')
+		self.assertEqual(
+			item.description,
+			"<p>Drawing No. 07-xxx-PO132<br>1800 x 1685 x 750<br>All parts made of Marine Ply<br>Top w/ Corian dd<br>CO, CS, VIP Day Cabin</p>",
+		)
 
 		item.delete()
 
 	def test_clean_html(self):
-		settings = frappe.get_single('Stock Settings')
+		settings = frappe.get_single("Stock Settings")
 		settings.clean_description_html = 1
 		settings.save()
 
-		item = frappe.get_doc(dict(
-			doctype = 'Item',
-			item_code = 'Item for description test',
-			item_group = 'Products',
-			description = '<p><span style="font-size: 12px;">Drawing No. 07-xxx-PO132<br></span><span style="font-size: 12px;">1800 x 1685 x 750<br></span><span style="font-size: 12px;">All parts made of Marine Ply<br></span><span style="font-size: 12px;">Top w/ Corian dd<br></span><span style="font-size: 12px;">CO, CS, VIP Day Cabin</span></p>'
-		)).insert()
+		item = frappe.get_doc(
+			dict(
+				doctype="Item",
+				item_code="Item for description test",
+				item_group="Products",
+				description='<p><span style="font-size: 12px;">Drawing No. 07-xxx-PO132<br></span><span style="font-size: 12px;">1800 x 1685 x 750<br></span><span style="font-size: 12px;">All parts made of Marine Ply<br></span><span style="font-size: 12px;">Top w/ Corian dd<br></span><span style="font-size: 12px;">CO, CS, VIP Day Cabin</span></p>',
+			)
+		).insert()
 
-		self.assertEqual(item.description, '<p>Drawing No. 07-xxx-PO132<br>1800 x 1685 x 750<br>All parts made of Marine Ply<br>Top w/ Corian dd<br>CO, CS, VIP Day Cabin</p>')
+		self.assertEqual(
+			item.description,
+			"<p>Drawing No. 07-xxx-PO132<br>1800 x 1685 x 750<br>All parts made of Marine Ply<br>Top w/ Corian dd<br>CO, CS, VIP Day Cabin</p>",
+		)
 
 		item.delete()
diff --git a/erpnext/stock/doctype/warehouse/test_warehouse.py b/erpnext/stock/doctype/warehouse/test_warehouse.py
index 08d7c99..1e9d01a 100644
--- a/erpnext/stock/doctype/warehouse/test_warehouse.py
+++ b/erpnext/stock/doctype/warehouse/test_warehouse.py
@@ -11,13 +11,14 @@
 from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
 from erpnext.stock.doctype.warehouse.warehouse import convert_to_group_or_ledger, get_children
 
-test_records = frappe.get_test_records('Warehouse')
+test_records = frappe.get_test_records("Warehouse")
+
 
 class TestWarehouse(FrappeTestCase):
 	def setUp(self):
 		super().setUp()
-		if not frappe.get_value('Item', '_Test Item'):
-			make_test_records('Item')
+		if not frappe.get_value("Item", "_Test Item"):
+			make_test_records("Item")
 
 	def test_parent_warehouse(self):
 		parent_warehouse = frappe.get_doc("Warehouse", "_Test Warehouse Group - _TC")
@@ -26,8 +27,12 @@
 	def test_warehouse_hierarchy(self):
 		p_warehouse = frappe.get_doc("Warehouse", "_Test Warehouse Group - _TC")
 
-		child_warehouses =  frappe.db.sql("""select name, is_group, parent_warehouse from `tabWarehouse` wh
-			where wh.lft > %s and wh.rgt < %s""", (p_warehouse.lft, p_warehouse.rgt), as_dict=1)
+		child_warehouses = frappe.db.sql(
+			"""select name, is_group, parent_warehouse from `tabWarehouse` wh
+			where wh.lft > %s and wh.rgt < %s""",
+			(p_warehouse.lft, p_warehouse.rgt),
+			as_dict=1,
+		)
 
 		for child_warehouse in child_warehouses:
 			self.assertEqual(p_warehouse.name, child_warehouse.parent_warehouse)
@@ -36,13 +41,13 @@
 	def test_unlinking_warehouse_from_item_defaults(self):
 		company = "_Test Company"
 
-		warehouse_names = [f'_Test Warehouse {i} for Unlinking' for i in range(2)]
+		warehouse_names = [f"_Test Warehouse {i} for Unlinking" for i in range(2)]
 		warehouse_ids = []
 		for warehouse in warehouse_names:
 			warehouse_id = create_warehouse(warehouse, company=company)
 			warehouse_ids.append(warehouse_id)
 
-		item_names = [f'_Test Item {i} for Unlinking' for i in range(2)]
+		item_names = [f"_Test Item {i} for Unlinking" for i in range(2)]
 		for item, warehouse in zip(item_names, warehouse_ids):
 			create_item(item, warehouse=warehouse, company=company)
 
@@ -52,17 +57,14 @@
 
 		# Check Item existance
 		for item in item_names:
-			self.assertTrue(
-				bool(frappe.db.exists("Item", item)),
-				f"{item} doesn't exist"
-			)
+			self.assertTrue(bool(frappe.db.exists("Item", item)), f"{item} doesn't exist")
 
 			item_doc = frappe.get_doc("Item", item)
 			for item_default in item_doc.item_defaults:
 				self.assertNotIn(
 					item_default.default_warehouse,
 					warehouse_ids,
-					f"{item} linked to {item_default.default_warehouse} in {warehouse_ids}."
+					f"{item} linked to {item_default.default_warehouse} in {warehouse_ids}.",
 				)
 
 	def test_group_non_group_conversion(self):
@@ -90,7 +92,7 @@
 		company = "_Test Company"
 
 		children = get_children("Warehouse", parent=company, company=company, is_root=True)
-		self.assertTrue(any(wh['value'] == "_Test Warehouse - _TC" for wh in children))
+		self.assertTrue(any(wh["value"] == "_Test Warehouse - _TC" for wh in children))
 
 
 def create_warehouse(warehouse_name, properties=None, company=None):
@@ -111,40 +113,46 @@
 	else:
 		return warehouse_id
 
+
 def get_warehouse(**args):
 	args = frappe._dict(args)
-	if(frappe.db.exists("Warehouse", args.warehouse_name + " - " + args.abbr)):
+	if frappe.db.exists("Warehouse", args.warehouse_name + " - " + args.abbr):
 		return frappe.get_doc("Warehouse", args.warehouse_name + " - " + args.abbr)
 	else:
-		w = frappe.get_doc({
-		"company": args.company or "_Test Company",
-		"doctype": "Warehouse",
-		"warehouse_name": args.warehouse_name,
-		"is_group": 0,
-		"account": get_warehouse_account(args.warehouse_name, args.company, args.abbr)
-		})
+		w = frappe.get_doc(
+			{
+				"company": args.company or "_Test Company",
+				"doctype": "Warehouse",
+				"warehouse_name": args.warehouse_name,
+				"is_group": 0,
+				"account": get_warehouse_account(args.warehouse_name, args.company, args.abbr),
+			}
+		)
 		w.insert()
 		return w
 
+
 def get_warehouse_account(warehouse_name, company, company_abbr=None):
 	if not company_abbr:
-		company_abbr = frappe.get_cached_value("Company", company, 'abbr')
+		company_abbr = frappe.get_cached_value("Company", company, "abbr")
 
 	if not frappe.db.exists("Account", warehouse_name + " - " + company_abbr):
 		return create_account(
 			account_name=warehouse_name,
 			parent_account=get_group_stock_account(company, company_abbr),
-			account_type='Stock',
-			company=company)
+			account_type="Stock",
+			company=company,
+		)
 	else:
 		return warehouse_name + " - " + company_abbr
 
 
 def get_group_stock_account(company, company_abbr=None):
-	group_stock_account = frappe.db.get_value("Account",
-		filters={'account_type': 'Stock', 'is_group': 1, 'company': company}, fieldname='name')
+	group_stock_account = frappe.db.get_value(
+		"Account", filters={"account_type": "Stock", "is_group": 1, "company": company}, fieldname="name"
+	)
 	if not group_stock_account:
 		if not company_abbr:
-			company_abbr = frappe.get_cached_value("Company", company, 'abbr')
+			company_abbr = frappe.get_cached_value("Company", company, "abbr")
 		group_stock_account = "Current Assets - " + company_abbr
 	return group_stock_account
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 4c7f41d..c892ba3 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -14,23 +14,25 @@
 
 
 class Warehouse(NestedSet):
-	nsm_parent_field = 'parent_warehouse'
+	nsm_parent_field = "parent_warehouse"
 
 	def autoname(self):
 		if self.company:
-			suffix = " - " + frappe.get_cached_value('Company',  self.company,  "abbr")
+			suffix = " - " + frappe.get_cached_value("Company", self.company, "abbr")
 			if not self.warehouse_name.endswith(suffix):
 				self.name = self.warehouse_name + suffix
 		else:
 			self.name = self.warehouse_name
 
 	def onload(self):
-		'''load account name for General Ledger Report'''
-		if self.company and cint(frappe.db.get_value("Company", self.company, "enable_perpetual_inventory")):
+		"""load account name for General Ledger Report"""
+		if self.company and cint(
+			frappe.db.get_value("Company", self.company, "enable_perpetual_inventory")
+		):
 			account = self.account or get_warehouse_account(self)
 
 			if account:
-				self.set_onload('account', account)
+				self.set_onload("account", account)
 		load_address_and_contact(self)
 
 	def on_update(self):
@@ -43,9 +45,19 @@
 		# delete bin
 		bins = frappe.get_all("Bin", fields="*", filters={"warehouse": self.name})
 		for d in bins:
-			if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
-					d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
-				throw(_("Warehouse {0} can not be deleted as quantity exists for Item {1}").format(self.name, d['item_code']))
+			if (
+				d["actual_qty"]
+				or d["reserved_qty"]
+				or d["ordered_qty"]
+				or d["indented_qty"]
+				or d["projected_qty"]
+				or d["planned_qty"]
+			):
+				throw(
+					_("Warehouse {0} can not be deleted as quantity exists for Item {1}").format(
+						self.name, d["item_code"]
+					)
+				)
 
 		if self.check_if_sle_exists():
 			throw(_("Warehouse can not be deleted as stock ledger entry exists for this warehouse."))
@@ -90,23 +102,24 @@
 	def unlink_from_items(self):
 		frappe.db.set_value("Item Default", {"default_warehouse": self.name}, "default_warehouse", None)
 
+
 @frappe.whitelist()
 def get_children(doctype, parent=None, company=None, is_root=False):
 	if is_root:
 		parent = ""
 
-	fields = ['name as value', 'is_group as expandable']
+	fields = ["name as value", "is_group as expandable"]
 	filters = [
-		['docstatus', '<', '2'],
-		['ifnull(`parent_warehouse`, "")', '=', parent],
-		['company', 'in', (company, None,'')]
+		["docstatus", "<", "2"],
+		['ifnull(`parent_warehouse`, "")', "=", parent],
+		["company", "in", (company, None, "")],
 	]
 
-	warehouses = frappe.get_list(doctype, fields=fields, filters=filters, order_by='name')
+	warehouses = frappe.get_list(doctype, fields=fields, filters=filters, order_by="name")
 
-	company_currency = ''
+	company_currency = ""
 	if company:
-		company_currency = frappe.get_cached_value('Company', company, 'default_currency')
+		company_currency = frappe.get_cached_value("Company", company, "default_currency")
 
 	warehouse_wise_value = get_warehouse_wise_stock_value(company)
 
@@ -117,14 +130,20 @@
 			wh["company_currency"] = company_currency
 	return warehouses
 
-def get_warehouse_wise_stock_value(company):
-	warehouses = frappe.get_all('Warehouse',
-		fields = ['name', 'parent_warehouse'], filters = {'company': company})
-	parent_warehouse = {d.name : d.parent_warehouse for d in warehouses}
 
-	filters = {'warehouse': ('in', [data.name for data in warehouses])}
-	bin_data = frappe.get_all('Bin', fields = ['sum(stock_value) as stock_value', 'warehouse'],
-		filters = filters, group_by = 'warehouse')
+def get_warehouse_wise_stock_value(company):
+	warehouses = frappe.get_all(
+		"Warehouse", fields=["name", "parent_warehouse"], filters={"company": company}
+	)
+	parent_warehouse = {d.name: d.parent_warehouse for d in warehouses}
+
+	filters = {"warehouse": ("in", [data.name for data in warehouses])}
+	bin_data = frappe.get_all(
+		"Bin",
+		fields=["sum(stock_value) as stock_value", "warehouse"],
+		filters=filters,
+		group_by="warehouse",
+	)
 
 	warehouse_wise_stock_value = defaultdict(float)
 	for row in bin_data:
@@ -132,23 +151,30 @@
 			continue
 
 		warehouse_wise_stock_value[row.warehouse] = row.stock_value
-		update_value_in_parent_warehouse(warehouse_wise_stock_value,
-			parent_warehouse, row.warehouse, row.stock_value)
+		update_value_in_parent_warehouse(
+			warehouse_wise_stock_value, parent_warehouse, row.warehouse, row.stock_value
+		)
 
 	return warehouse_wise_stock_value
 
-def update_value_in_parent_warehouse(warehouse_wise_stock_value, parent_warehouse_dict, warehouse, stock_value):
+
+def update_value_in_parent_warehouse(
+	warehouse_wise_stock_value, parent_warehouse_dict, warehouse, stock_value
+):
 	parent_warehouse = parent_warehouse_dict.get(warehouse)
 	if not parent_warehouse:
 		return
 
 	warehouse_wise_stock_value[parent_warehouse] += flt(stock_value)
-	update_value_in_parent_warehouse(warehouse_wise_stock_value, parent_warehouse_dict,
-		parent_warehouse, stock_value)
+	update_value_in_parent_warehouse(
+		warehouse_wise_stock_value, parent_warehouse_dict, parent_warehouse, stock_value
+	)
+
 
 @frappe.whitelist()
 def add_node():
 	from frappe.desk.treeview import make_tree_args
+
 	args = make_tree_args(**frappe.form_dict)
 
 	if cint(args.is_root):
@@ -156,33 +182,37 @@
 
 	frappe.get_doc(args).insert()
 
+
 @frappe.whitelist()
 def convert_to_group_or_ledger(docname=None):
 	if not docname:
 		docname = frappe.form_dict.docname
 	return frappe.get_doc("Warehouse", docname).convert_to_group_or_ledger()
 
+
 def get_child_warehouses(warehouse):
 	from frappe.utils.nestedset import get_descendants_of
 
 	children = get_descendants_of("Warehouse", warehouse, ignore_permissions=True, order_by="lft")
-	return children + [warehouse]   # append self for backward compatibility
+	return children + [warehouse]  # append self for backward compatibility
+
 
 def get_warehouses_based_on_account(account, company=None):
 	warehouses = []
-	for d in frappe.get_all("Warehouse", fields = ["name", "is_group"],
-		filters = {"account": account}):
+	for d in frappe.get_all("Warehouse", fields=["name", "is_group"], filters={"account": account}):
 		if d.is_group:
 			warehouses.extend(get_child_warehouses(d.name))
 		else:
 			warehouses.append(d.name)
 
-	if (not warehouses and company and
-		frappe.get_cached_value("Company", company, "default_inventory_account") == account):
-		warehouses = [d.name for d in frappe.get_all("Warehouse", filters={'is_group': 0})]
+	if (
+		not warehouses
+		and company
+		and frappe.get_cached_value("Company", company, "default_inventory_account") == account
+	):
+		warehouses = [d.name for d in frappe.get_all("Warehouse", filters={"is_group": 0})]
 
 	if not warehouses:
-		frappe.throw(_("Warehouse not found against the account {0}")
-			.format(account))
+		frappe.throw(_("Warehouse not found against the account {0}").format(account))
 
 	return warehouses
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 9bb41b9..f72588e 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -23,31 +23,38 @@
 from erpnext.stock.doctype.item_manufacturer.item_manufacturer import get_item_manufacturer_part_no
 from erpnext.stock.doctype.price_list.price_list import get_price_list_details
 
-sales_doctypes = ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice', 'POS Invoice']
-purchase_doctypes = ['Material Request', 'Supplier Quotation', 'Purchase Order', 'Purchase Receipt', 'Purchase Invoice']
+sales_doctypes = ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice", "POS Invoice"]
+purchase_doctypes = [
+	"Material Request",
+	"Supplier Quotation",
+	"Purchase Order",
+	"Purchase Receipt",
+	"Purchase Invoice",
+]
+
 
 @frappe.whitelist()
 def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=True):
 	"""
-		args = {
-			"item_code": "",
-			"warehouse": None,
-			"customer": "",
-			"conversion_rate": 1.0,
-			"selling_price_list": None,
-			"price_list_currency": None,
-			"plc_conversion_rate": 1.0,
-			"doctype": "",
-			"name": "",
-			"supplier": None,
-			"transaction_date": None,
-			"conversion_rate": 1.0,
-			"buying_price_list": None,
-			"is_subcontracted": "Yes" / "No",
-			"ignore_pricing_rule": 0/1
-			"project": ""
-			"set_warehouse": ""
-		}
+	args = {
+	        "item_code": "",
+	        "warehouse": None,
+	        "customer": "",
+	        "conversion_rate": 1.0,
+	        "selling_price_list": None,
+	        "price_list_currency": None,
+	        "plc_conversion_rate": 1.0,
+	        "doctype": "",
+	        "name": "",
+	        "supplier": None,
+	        "transaction_date": None,
+	        "conversion_rate": 1.0,
+	        "buying_price_list": None,
+	        "is_subcontracted": "Yes" / "No",
+	        "ignore_pricing_rule": 0/1
+	        "project": ""
+	        "set_warehouse": ""
+	}
 	"""
 
 	args = process_args(args)
@@ -61,16 +68,21 @@
 	if isinstance(doc, str):
 		doc = json.loads(doc)
 
-	if doc and doc.get('doctype') == 'Purchase Invoice':
-		args['bill_date'] = doc.get('bill_date')
+	if doc and doc.get("doctype") == "Purchase Invoice":
+		args["bill_date"] = doc.get("bill_date")
 
 	if doc:
-		args['posting_date'] = doc.get('posting_date')
-		args['transaction_date'] = doc.get('transaction_date')
+		args["posting_date"] = doc.get("posting_date")
+		args["transaction_date"] = doc.get("transaction_date")
 
 	get_item_tax_template(args, item, out)
-	out["item_tax_rate"] = get_item_tax_map(args.company, args.get("item_tax_template") if out.get("item_tax_template") is None \
-		else out.get("item_tax_template"), as_json=True)
+	out["item_tax_rate"] = get_item_tax_map(
+		args.company,
+		args.get("item_tax_template")
+		if out.get("item_tax_template") is None
+		else out.get("item_tax_template"),
+		as_json=True,
+	)
 
 	get_party_item_code(args, item, out)
 
@@ -83,12 +95,14 @@
 	if args.customer and cint(args.is_pos):
 		out.update(get_pos_profile_item_details(args.company, args, update_data=True))
 
-	if (args.get("doctype") == "Material Request" and
-		args.get("material_request_type") == "Material Transfer"):
+	if (
+		args.get("doctype") == "Material Request"
+		and args.get("material_request_type") == "Material Transfer"
+	):
 		out.update(get_bin_details(args.item_code, args.get("from_warehouse")))
 
 	elif out.get("warehouse"):
-		if doc and doc.get('doctype') == 'Purchase Order':
+		if doc and doc.get("doctype") == "Purchase Order":
 			# calculate company_total_stock only for po
 			bin_details = get_bin_details(args.item_code, out.warehouse, args.company)
 		else:
@@ -101,28 +115,27 @@
 		if args.get(key) is None:
 			args[key] = value
 
-	data = get_pricing_rule_for_item(args, out.price_list_rate,
-		doc, for_validate=for_validate)
+	data = get_pricing_rule_for_item(args, out.price_list_rate, doc, for_validate=for_validate)
 
 	out.update(data)
 
 	update_stock(args, out)
 
 	if args.transaction_date and item.lead_time_days:
-		out.schedule_date = out.lead_time_date = add_days(args.transaction_date,
-			item.lead_time_days)
+		out.schedule_date = out.lead_time_date = add_days(args.transaction_date, item.lead_time_days)
 
 	if args.get("is_subcontracted") == "Yes":
-		out.bom = args.get('bom') or get_default_bom(args.item_code)
+		out.bom = args.get("bom") or get_default_bom(args.item_code)
 
 	get_gross_profit(out)
-	if args.doctype == 'Material Request':
+	if args.doctype == "Material Request":
 		out.rate = args.rate or out.price_list_rate
 		out.amount = flt(args.qty) * flt(out.rate)
 
 	out = remove_standard_fields(out)
 	return out
 
+
 def remove_standard_fields(details):
 	for key in child_table_fields + default_fields:
 		details.pop(key, None)
@@ -130,9 +143,14 @@
 
 
 def update_stock(args, out):
-	if (args.get("doctype") == "Delivery Note" or
-		(args.get("doctype") == "Sales Invoice" and args.get('update_stock'))) \
-		and out.warehouse and out.stock_qty > 0:
+	if (
+		(
+			args.get("doctype") == "Delivery Note"
+			or (args.get("doctype") == "Sales Invoice" and args.get("update_stock"))
+		)
+		and out.warehouse
+		and out.stock_qty > 0
+	):
 
 		if out.has_batch_no and not args.get("batch_no"):
 			out.batch_no = get_batch_no(out.item_code, out.warehouse, out.qty)
@@ -140,9 +158,9 @@
 			if actual_batch_qty:
 				out.update(actual_batch_qty)
 
-		if out.has_serial_no and args.get('batch_no'):
+		if out.has_serial_no and args.get("batch_no"):
 			reserved_so = get_so_reservation_for_item(args)
-			out.batch_no = args.get('batch_no')
+			out.batch_no = args.get("batch_no")
 			out.serial_no = get_serial_no(out, args.serial_no, sales_order=reserved_so)
 
 		elif out.has_serial_no:
@@ -156,13 +174,14 @@
 		bundled_items = frappe.get_doc("Product Bundle", args.item_code)
 
 		for bundle_item in bundled_items.items:
-			valuation_rate += \
-				flt(get_valuation_rate(bundle_item.item_code, args.company, out.get("warehouse")).get("valuation_rate") \
-					* bundle_item.qty)
+			valuation_rate += flt(
+				get_valuation_rate(bundle_item.item_code, args.company, out.get("warehouse")).get(
+					"valuation_rate"
+				)
+				* bundle_item.qty
+			)
 
-		out.update({
-			"valuation_rate": valuation_rate
-		})
+		out.update({"valuation_rate": valuation_rate})
 
 	else:
 		out.update(get_valuation_rate(args.item_code, args.company, out.get("warehouse")))
@@ -185,11 +204,13 @@
 	set_transaction_type(args)
 	return args
 
+
 def process_string_args(args):
 	if isinstance(args, str):
 		args = json.loads(args)
 	return args
 
+
 @frappe.whitelist()
 def get_item_code(barcode=None, serial_no=None):
 	if barcode:
@@ -209,6 +230,7 @@
 		throw(_("Please specify Company"))
 
 	from erpnext.stock.doctype.item.item import validate_end_of_life
+
 	validate_end_of_life(item.name, item.end_of_life, item.disabled)
 
 	if args.transaction_type == "selling" and cint(item.has_variants):
@@ -222,37 +244,37 @@
 def get_basic_details(args, item, overwrite_warehouse=True):
 	"""
 	:param args: {
-			"item_code": "",
-			"warehouse": None,
-			"customer": "",
-			"conversion_rate": 1.0,
-			"selling_price_list": None,
-			"price_list_currency": None,
-			"price_list_uom_dependant": None,
-			"plc_conversion_rate": 1.0,
-			"doctype": "",
-			"name": "",
-			"supplier": None,
-			"transaction_date": None,
-			"conversion_rate": 1.0,
-			"buying_price_list": None,
-			"is_subcontracted": "Yes" / "No",
-			"ignore_pricing_rule": 0/1
-			"project": "",
-			barcode: "",
-			serial_no: "",
-			currency: "",
-			update_stock: "",
-			price_list: "",
-			company: "",
-			order_type: "",
-			is_pos: "",
-			project: "",
-			qty: "",
-			stock_qty: "",
-			conversion_factor: "",
-			against_blanket_order: 0/1
-		}
+	                "item_code": "",
+	                "warehouse": None,
+	                "customer": "",
+	                "conversion_rate": 1.0,
+	                "selling_price_list": None,
+	                "price_list_currency": None,
+	                "price_list_uom_dependant": None,
+	                "plc_conversion_rate": 1.0,
+	                "doctype": "",
+	                "name": "",
+	                "supplier": None,
+	                "transaction_date": None,
+	                "conversion_rate": 1.0,
+	                "buying_price_list": None,
+	                "is_subcontracted": "Yes" / "No",
+	                "ignore_pricing_rule": 0/1
+	                "project": "",
+	                barcode: "",
+	                serial_no: "",
+	                currency: "",
+	                update_stock: "",
+	                price_list: "",
+	                company: "",
+	                order_type: "",
+	                is_pos: "",
+	                project: "",
+	                qty: "",
+	                stock_qty: "",
+	                conversion_factor: "",
+	                against_blanket_order: 0/1
+	        }
 	:param item: `item_code` of Item object
 	:return: frappe._dict
 	"""
@@ -267,77 +289,98 @@
 	item_group_defaults = get_item_group_defaults(item.name, args.company)
 	brand_defaults = get_brand_defaults(item.name, args.company)
 
-	defaults = frappe._dict({
-		'item_defaults': item_defaults,
-		'item_group_defaults': item_group_defaults,
-		'brand_defaults': brand_defaults
-	})
+	defaults = frappe._dict(
+		{
+			"item_defaults": item_defaults,
+			"item_group_defaults": item_group_defaults,
+			"brand_defaults": brand_defaults,
+		}
+	)
 
 	warehouse = get_item_warehouse(item, args, overwrite_warehouse, defaults)
 
-	if args.get('doctype') == "Material Request" and not args.get('material_request_type'):
-		args['material_request_type'] = frappe.db.get_value('Material Request',
-			args.get('name'), 'material_request_type', cache=True)
+	if args.get("doctype") == "Material Request" and not args.get("material_request_type"):
+		args["material_request_type"] = frappe.db.get_value(
+			"Material Request", args.get("name"), "material_request_type", cache=True
+		)
 
 	expense_account = None
 
-	if args.get('doctype') == 'Purchase Invoice' and item.is_fixed_asset:
+	if args.get("doctype") == "Purchase Invoice" and item.is_fixed_asset:
 		from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
-		expense_account = get_asset_category_account(fieldname = "fixed_asset_account", item = args.item_code, company= args.company)
 
-	#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
-	if not args.get('uom'):
-		if args.get('doctype') in sales_doctypes:
+		expense_account = get_asset_category_account(
+			fieldname="fixed_asset_account", item=args.item_code, company=args.company
+		)
+
+	# Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
+	if not args.get("uom"):
+		if args.get("doctype") in sales_doctypes:
 			args.uom = item.sales_uom if item.sales_uom else item.stock_uom
-		elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \
-			(args.get('doctype') == 'Material Request' and args.get('material_request_type') == 'Purchase'):
+		elif (args.get("doctype") in ["Purchase Order", "Purchase Receipt", "Purchase Invoice"]) or (
+			args.get("doctype") == "Material Request" and args.get("material_request_type") == "Purchase"
+		):
 			args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
 		else:
 			args.uom = item.stock_uom
 
-	if (args.get("batch_no") and
-		item.name != frappe.get_cached_value('Batch', args.get("batch_no"), 'item')):
-		args['batch_no'] = ''
+	if args.get("batch_no") and item.name != frappe.get_cached_value(
+		"Batch", args.get("batch_no"), "item"
+	):
+		args["batch_no"] = ""
 
-	out = frappe._dict({
-		"item_code": item.name,
-		"item_name": item.item_name,
-		"description": cstr(item.description).strip(),
-		"image": cstr(item.image).strip(),
-		"warehouse": warehouse,
-		"income_account": get_default_income_account(args, item_defaults, item_group_defaults, brand_defaults),
-		"expense_account": expense_account or get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults) ,
-		"discount_account": get_default_discount_account(args, item_defaults),
-		"cost_center": get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults),
-		'has_serial_no': item.has_serial_no,
-		'has_batch_no': item.has_batch_no,
-		"batch_no": args.get("batch_no"),
-		"uom": args.uom,
-		"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
-		"qty": flt(args.qty) or 1.0,
-		"stock_qty": flt(args.qty) or 1.0,
-		"price_list_rate": 0.0,
-		"base_price_list_rate": 0.0,
-		"rate": 0.0,
-		"base_rate": 0.0,
-		"amount": 0.0,
-		"base_amount": 0.0,
-		"net_rate": 0.0,
-		"net_amount": 0.0,
-		"discount_percentage": 0.0,
-		"discount_amount": 0.0,
-		"supplier": get_default_supplier(args, item_defaults, item_group_defaults, brand_defaults),
-		"update_stock": args.get("update_stock") if args.get('doctype') in ['Sales Invoice', 'Purchase Invoice'] else 0,
-		"delivered_by_supplier": item.delivered_by_supplier if args.get("doctype") in ["Sales Order", "Sales Invoice"] else 0,
-		"is_fixed_asset": item.is_fixed_asset,
-		"last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0,
-		"transaction_date": args.get("transaction_date"),
-		"against_blanket_order": args.get("against_blanket_order"),
-		"bom_no": item.get("default_bom"),
-		"weight_per_unit": args.get("weight_per_unit") or item.get("weight_per_unit"),
-		"weight_uom": args.get("weight_uom") or item.get("weight_uom"),
-		"grant_commission": item.get("grant_commission")
-	})
+	out = frappe._dict(
+		{
+			"item_code": item.name,
+			"item_name": item.item_name,
+			"description": cstr(item.description).strip(),
+			"image": cstr(item.image).strip(),
+			"warehouse": warehouse,
+			"income_account": get_default_income_account(
+				args, item_defaults, item_group_defaults, brand_defaults
+			),
+			"expense_account": expense_account
+			or get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults),
+			"discount_account": get_default_discount_account(args, item_defaults),
+			"cost_center": get_default_cost_center(
+				args, item_defaults, item_group_defaults, brand_defaults
+			),
+			"has_serial_no": item.has_serial_no,
+			"has_batch_no": item.has_batch_no,
+			"batch_no": args.get("batch_no"),
+			"uom": args.uom,
+			"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
+			"qty": flt(args.qty) or 1.0,
+			"stock_qty": flt(args.qty) or 1.0,
+			"price_list_rate": 0.0,
+			"base_price_list_rate": 0.0,
+			"rate": 0.0,
+			"base_rate": 0.0,
+			"amount": 0.0,
+			"base_amount": 0.0,
+			"net_rate": 0.0,
+			"net_amount": 0.0,
+			"discount_percentage": 0.0,
+			"discount_amount": 0.0,
+			"supplier": get_default_supplier(args, item_defaults, item_group_defaults, brand_defaults),
+			"update_stock": args.get("update_stock")
+			if args.get("doctype") in ["Sales Invoice", "Purchase Invoice"]
+			else 0,
+			"delivered_by_supplier": item.delivered_by_supplier
+			if args.get("doctype") in ["Sales Order", "Sales Invoice"]
+			else 0,
+			"is_fixed_asset": item.is_fixed_asset,
+			"last_purchase_rate": item.last_purchase_rate
+			if args.get("doctype") in ["Purchase Order"]
+			else 0,
+			"transaction_date": args.get("transaction_date"),
+			"against_blanket_order": args.get("against_blanket_order"),
+			"bom_no": item.get("default_bom"),
+			"weight_per_unit": args.get("weight_per_unit") or item.get("weight_per_unit"),
+			"weight_uom": args.get("weight_uom") or item.get("weight_uom"),
+			"grant_commission": item.get("grant_commission"),
+		}
+	)
 
 	if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
 		out.update(calculate_service_end_date(args, item))
@@ -346,26 +389,31 @@
 	if item.stock_uom == args.uom:
 		out.conversion_factor = 1.0
 	else:
-		out.conversion_factor = args.conversion_factor or \
-			get_conversion_factor(item.name, args.uom).get("conversion_factor")
+		out.conversion_factor = args.conversion_factor or get_conversion_factor(item.name, args.uom).get(
+			"conversion_factor"
+		)
 
 	args.conversion_factor = out.conversion_factor
 	out.stock_qty = out.qty * out.conversion_factor
 	args.stock_qty = out.stock_qty
 
 	# calculate last purchase rate
-	if args.get('doctype') in purchase_doctypes:
+	if args.get("doctype") in purchase_doctypes:
 		from erpnext.buying.doctype.purchase_order.purchase_order import item_last_purchase_rate
-		out.last_purchase_rate = item_last_purchase_rate(args.name, args.conversion_rate, item.name, out.conversion_factor)
+
+		out.last_purchase_rate = item_last_purchase_rate(
+			args.name, args.conversion_rate, item.name, out.conversion_factor
+		)
 
 	# if default specified in item is for another company, fetch from company
 	for d in [
 		["Account", "income_account", "default_income_account"],
 		["Account", "expense_account", "default_expense_account"],
 		["Cost Center", "cost_center", "cost_center"],
-		["Warehouse", "warehouse", ""]]:
-			if not out[d[1]]:
-				out[d[1]] = frappe.get_cached_value('Company',  args.company,  d[2]) if d[2] else None
+		["Warehouse", "warehouse", ""],
+	]:
+		if not out[d[1]]:
+			out[d[1]] = frappe.get_cached_value("Company", args.company, d[2]) if d[2] else None
 
 	for fieldname in ("item_name", "item_group", "brand", "stock_uom"):
 		out[fieldname] = item.get(fieldname)
@@ -378,53 +426,58 @@
 			out["manufacturer_part_no"] = None
 			out["manufacturer"] = None
 	else:
-		data = frappe.get_value("Item", item.name,
-			["default_item_manufacturer", "default_manufacturer_part_no"] , as_dict=1)
+		data = frappe.get_value(
+			"Item", item.name, ["default_item_manufacturer", "default_manufacturer_part_no"], as_dict=1
+		)
 
 		if data:
-			out.update({
-				"manufacturer": data.default_item_manufacturer,
-				"manufacturer_part_no": data.default_manufacturer_part_no
-			})
+			out.update(
+				{
+					"manufacturer": data.default_item_manufacturer,
+					"manufacturer_part_no": data.default_manufacturer_part_no,
+				}
+			)
 
-	child_doctype = args.doctype + ' Item'
+	child_doctype = args.doctype + " Item"
 	meta = frappe.get_meta(child_doctype)
 	if meta.get_field("barcode"):
 		update_barcode_value(out)
 
 	if out.get("weight_per_unit"):
-		out['total_weight'] = out.weight_per_unit * out.stock_qty
+		out["total_weight"] = out.weight_per_unit * out.stock_qty
 
 	return out
 
+
 def get_item_warehouse(item, args, overwrite_warehouse, defaults=None):
 	if not defaults:
-		defaults = frappe._dict({
-			'item_defaults' : get_item_defaults(item.name, args.company),
-			'item_group_defaults' : get_item_group_defaults(item.name, args.company),
-			'brand_defaults' : get_brand_defaults(item.name, args.company)
-		})
+		defaults = frappe._dict(
+			{
+				"item_defaults": get_item_defaults(item.name, args.company),
+				"item_group_defaults": get_item_group_defaults(item.name, args.company),
+				"brand_defaults": get_brand_defaults(item.name, args.company),
+			}
+		)
 
 	if overwrite_warehouse or not args.warehouse:
 		warehouse = (
-			args.get("set_warehouse") or
-			defaults.item_defaults.get("default_warehouse") or
-			defaults.item_group_defaults.get("default_warehouse") or
-			defaults.brand_defaults.get("default_warehouse") or
-			args.get('warehouse')
+			args.get("set_warehouse")
+			or defaults.item_defaults.get("default_warehouse")
+			or defaults.item_group_defaults.get("default_warehouse")
+			or defaults.brand_defaults.get("default_warehouse")
+			or args.get("warehouse")
 		)
 
 		if not warehouse:
 			defaults = frappe.defaults.get_defaults() or {}
-			warehouse_exists = frappe.db.exists("Warehouse", {
-				'name': defaults.default_warehouse,
-				'company': args.company
-			})
+			warehouse_exists = frappe.db.exists(
+				"Warehouse", {"name": defaults.default_warehouse, "company": args.company}
+			)
 			if defaults.get("default_warehouse") and warehouse_exists:
 				warehouse = defaults.default_warehouse
 
 	else:
-		warehouse = args.get('warehouse')
+		warehouse = args.get("warehouse")
 
 	if not warehouse:
 		default_warehouse = frappe.db.get_single_value("Stock Settings", "default_warehouse")
@@ -433,12 +486,14 @@
 
 	return warehouse
 
+
 def update_barcode_value(out):
 	barcode_data = get_barcode_data([out])
 
 	# If item has one barcode then update the value of the barcode field
 	if barcode_data and len(barcode_data.get(out.item_code)) == 1:
-		out['barcode'] = barcode_data.get(out.item_code)[0]
+		out["barcode"] = barcode_data.get(out.item_code)[0]
+
 
 def get_barcode_data(items_list):
 	# get itemwise batch no data
@@ -447,9 +502,13 @@
 
 	itemwise_barcode = {}
 	for item in items_list:
-		barcodes = frappe.db.sql("""
+		barcodes = frappe.db.sql(
+			"""
 			select barcode from `tabItem Barcode` where parent = %s
-		""", item.item_code, as_dict=1)
+		""",
+			item.item_code,
+			as_dict=1,
+		)
 
 		for barcode in barcodes:
 			if item.item_code not in itemwise_barcode:
@@ -458,6 +517,7 @@
 
 	return itemwise_barcode
 
+
 @frappe.whitelist()
 def get_item_tax_info(company, tax_category, item_codes, item_rates=None, item_tax_templates=None):
 	out = {}
@@ -483,22 +543,29 @@
 
 		out[item_code[1]] = {}
 		item = frappe.get_cached_doc("Item", item_code[0])
-		args = {"company": company, "tax_category": tax_category, "net_rate": item_rates.get(item_code[1])}
+		args = {
+			"company": company,
+			"tax_category": tax_category,
+			"net_rate": item_rates.get(item_code[1]),
+		}
 
 		if item_tax_templates:
 			args.update({"item_tax_template": item_tax_templates.get(item_code[1])})
 
 		get_item_tax_template(args, item, out[item_code[1]])
-		out[item_code[1]]["item_tax_rate"] = get_item_tax_map(company, out[item_code[1]].get("item_tax_template"), as_json=True)
+		out[item_code[1]]["item_tax_rate"] = get_item_tax_map(
+			company, out[item_code[1]].get("item_tax_template"), as_json=True
+		)
 
 	return out
 
+
 def get_item_tax_template(args, item, out):
 	"""
-		args = {
-			"tax_category": None
-			"item_tax_template": None
-		}
+	args = {
+	        "tax_category": None
+	        "item_tax_template": None
+	}
 	"""
 	item_tax_template = None
 	if item.taxes:
@@ -511,6 +578,7 @@
 			item_tax_template = _get_item_tax_template(args, item_group_doc.taxes, out)
 			item_group = item_group_doc.parent_item_group
 
+
 def _get_item_tax_template(args, taxes, out=None, for_validate=False):
 	if out is None:
 		out = {}
@@ -518,36 +586,43 @@
 	taxes_with_no_validity = []
 
 	for tax in taxes:
-		tax_company = frappe.get_cached_value("Item Tax Template", tax.item_tax_template, 'company')
-		if tax_company == args['company']:
-			if (tax.valid_from or tax.maximum_net_rate):
+		tax_company = frappe.get_cached_value("Item Tax Template", tax.item_tax_template, "company")
+		if tax_company == args["company"]:
+			if tax.valid_from or tax.maximum_net_rate:
 				# In purchase Invoice first preference will be given to supplier invoice date
 				# if supplier date is not present then posting date
-				validation_date = args.get('transaction_date') or args.get('bill_date') or args.get('posting_date')
+				validation_date = (
+					args.get("transaction_date") or args.get("bill_date") or args.get("posting_date")
+				)
 
-				if getdate(tax.valid_from) <= getdate(validation_date) \
-					and is_within_valid_range(args, tax):
+				if getdate(tax.valid_from) <= getdate(validation_date) and is_within_valid_range(args, tax):
 					taxes_with_validity.append(tax)
 			else:
 				taxes_with_no_validity.append(tax)
 
 	if taxes_with_validity:
-		taxes = sorted(taxes_with_validity, key = lambda i: i.valid_from, reverse=True)
+		taxes = sorted(taxes_with_validity, key=lambda i: i.valid_from, reverse=True)
 	else:
 		taxes = taxes_with_no_validity
 
 	if for_validate:
-		return [tax.item_tax_template for tax in taxes if (cstr(tax.tax_category) == cstr(args.get('tax_category')) \
-			and (tax.item_tax_template not in taxes))]
+		return [
+			tax.item_tax_template
+			for tax in taxes
+			if (
+				cstr(tax.tax_category) == cstr(args.get("tax_category"))
+				and (tax.item_tax_template not in taxes)
+			)
+		]
 
 	# all templates have validity and no template is valid
 	if not taxes_with_validity and (not taxes_with_no_validity):
 		return None
 
 	# do not change if already a valid template
-	if args.get('item_tax_template') in {t.item_tax_template for t in taxes}:
-		out["item_tax_template"] = args.get('item_tax_template')
-		return args.get('item_tax_template')
+	if args.get("item_tax_template") in {t.item_tax_template for t in taxes}:
+		out["item_tax_template"] = args.get("item_tax_template")
+		return args.get("item_tax_template")
 
 	for tax in taxes:
 		if cstr(tax.tax_category) == cstr(args.get("tax_category")):
@@ -555,15 +630,17 @@
 			return tax.item_tax_template
 	return None
 
+
 def is_within_valid_range(args, tax):
 	if not flt(tax.maximum_net_rate):
 		# No range specified, just ignore
 		return True
-	elif flt(tax.minimum_net_rate) <= flt(args.get('net_rate')) <= flt(tax.maximum_net_rate):
+	elif flt(tax.minimum_net_rate) <= flt(args.get("net_rate")) <= flt(tax.maximum_net_rate):
 		return True
 
 	return False
 
+
 @frappe.whitelist()
 def get_item_tax_map(company, item_tax_template, as_json=True):
 	item_tax_map = {}
@@ -575,6 +652,7 @@
 
 	return json.dumps(item_tax_map) if as_json else item_tax_map
 
+
 @frappe.whitelist()
 def calculate_service_end_date(args, item=None):
 	args = process_args(args)
@@ -593,53 +671,68 @@
 
 	service_start_date = args.service_start_date if args.service_start_date else args.transaction_date
 	service_end_date = add_months(service_start_date, item.get(no_of_months))
-	deferred_detail = {
-		"service_start_date": service_start_date,
-		"service_end_date": service_end_date
-	}
+	deferred_detail = {"service_start_date": service_start_date, "service_end_date": service_end_date}
 	deferred_detail[enable_deferred] = item.get(enable_deferred)
 	deferred_detail[account] = get_default_deferred_account(args, item, fieldname=account)
 
 	return deferred_detail
 
+
 def get_default_income_account(args, item, item_group, brand):
-	return (item.get("income_account")
+	return (
+		item.get("income_account")
 		or item_group.get("income_account")
 		or brand.get("income_account")
-		or args.income_account)
+		or args.income_account
+	)
+
 
 def get_default_expense_account(args, item, item_group, brand):
-	return (item.get("expense_account")
+	return (
+		item.get("expense_account")
 		or item_group.get("expense_account")
 		or brand.get("expense_account")
-		or args.expense_account)
+		or args.expense_account
+	)
+
 
 def get_default_discount_account(args, item):
-	return (item.get("default_discount_account")
-		or args.discount_account)
+	return item.get("default_discount_account") or args.discount_account
+
 
 def get_default_deferred_account(args, item, fieldname=None):
 	if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
-		return (item.get(fieldname)
+		return (
+			item.get(fieldname)
 			or args.get(fieldname)
-			or frappe.get_cached_value('Company',  args.company,  "default_"+fieldname))
+			or frappe.get_cached_value("Company", args.company, "default_" + fieldname)
+		)
 	else:
 		return None
 
+
 def get_default_cost_center(args, item=None, item_group=None, brand=None, company=None):
 	cost_center = None
 
 	if not company and args.get("company"):
 		company = args.get("company")
 
-	if args.get('project'):
+	if args.get("project"):
 		cost_center = frappe.db.get_value("Project", args.get("project"), "cost_center", cache=True)
 
 	if not cost_center and (item and item_group and brand):
-		if args.get('customer'):
-			cost_center = item.get('selling_cost_center') or item_group.get('selling_cost_center') or brand.get('selling_cost_center')
+		if args.get("customer"):
+			cost_center = (
+				item.get("selling_cost_center")
+				or item_group.get("selling_cost_center")
+				or brand.get("selling_cost_center")
+			)
 		else:
-			cost_center = item.get('buying_cost_center') or item_group.get('buying_cost_center') or brand.get('buying_cost_center')
+			cost_center = (
+				item.get("buying_cost_center")
+				or item_group.get("buying_cost_center")
+				or brand.get("buying_cost_center")
+			)
 
 	elif not cost_center and args.get("item_code") and company:
 		for method in ["get_item_defaults", "get_item_group_defaults", "get_brand_defaults"]:
@@ -652,20 +745,26 @@
 	if not cost_center and args.get("cost_center"):
 		cost_center = args.get("cost_center")
 
-	if (company and cost_center
-		and frappe.get_cached_value("Cost Center", cost_center, "company") != company):
+	if (
+		company
+		and cost_center
+		and frappe.get_cached_value("Cost Center", cost_center, "company") != company
+	):
 		return None
 
 	if not cost_center and company:
-		cost_center = frappe.get_cached_value("Company",
-			company, "cost_center")
+		cost_center = frappe.get_cached_value("Company", company, "cost_center")
 
 	return cost_center
 
+
 def get_default_supplier(args, item, item_group, brand):
-	return (item.get("default_supplier")
+	return (
+		item.get("default_supplier")
 		or item_group.get("default_supplier")
-		or brand.get("default_supplier"))
+		or brand.get("default_supplier")
+	)
+
 
 def get_price_list_rate(args, item_doc, out=None):
 	if out is None:
@@ -673,7 +772,7 @@
 
 	meta = frappe.get_meta(args.parenttype or args.doctype)
 
-	if meta.get_field("currency") or args.get('currency'):
+	if meta.get_field("currency") or args.get("currency"):
 		if not args.get("price_list_currency") or not args.get("plc_conversion_rate"):
 			# if currency and plc_conversion_rate exist then
 			# `get_price_list_currency_and_exchange_rate` has already been called
@@ -695,54 +794,72 @@
 				insert_item_price(args)
 			return out
 
-		out.price_list_rate = flt(price_list_rate) * flt(args.plc_conversion_rate) \
-			/ flt(args.conversion_rate)
+		out.price_list_rate = (
+			flt(price_list_rate) * flt(args.plc_conversion_rate) / flt(args.conversion_rate)
+		)
 
-		if not out.price_list_rate and args.transaction_type=="buying":
+		if not out.price_list_rate and args.transaction_type == "buying":
 			from erpnext.stock.doctype.item.item import get_last_purchase_details
-			out.update(get_last_purchase_details(item_doc.name,
-				args.name, args.conversion_rate))
+
+			out.update(get_last_purchase_details(item_doc.name, args.name, args.conversion_rate))
 
 	return out
 
+
 def insert_item_price(args):
 	"""Insert Item Price if Price List and Price List Rate are specified and currency is the same"""
-	if frappe.db.get_value("Price List", args.price_list, "currency", cache=True) == args.currency \
-		and cint(frappe.db.get_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing")):
+	if frappe.db.get_value(
+		"Price List", args.price_list, "currency", cache=True
+	) == args.currency and cint(
+		frappe.db.get_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing")
+	):
 		if frappe.has_permission("Item Price", "write"):
-			price_list_rate = (args.rate / args.get('conversion_factor')
-				if args.get("conversion_factor") else args.rate)
+			price_list_rate = (
+				args.rate / args.get("conversion_factor") if args.get("conversion_factor") else args.rate
+			)
 
-			item_price = frappe.db.get_value('Item Price',
-				{'item_code': args.item_code, 'price_list': args.price_list, 'currency': args.currency},
-				['name', 'price_list_rate'], as_dict=1)
+			item_price = frappe.db.get_value(
+				"Item Price",
+				{"item_code": args.item_code, "price_list": args.price_list, "currency": args.currency},
+				["name", "price_list_rate"],
+				as_dict=1,
+			)
 			if item_price and item_price.name:
-				if item_price.price_list_rate != price_list_rate and frappe.db.get_single_value('Stock Settings', 'update_existing_price_list_rate'):
-					frappe.db.set_value('Item Price', item_price.name, "price_list_rate", price_list_rate)
-					frappe.msgprint(_("Item Price updated for {0} in Price List {1}").format(args.item_code,
-						args.price_list), alert=True)
+				if item_price.price_list_rate != price_list_rate and frappe.db.get_single_value(
+					"Stock Settings", "update_existing_price_list_rate"
+				):
+					frappe.db.set_value("Item Price", item_price.name, "price_list_rate", price_list_rate)
+					frappe.msgprint(
+						_("Item Price updated for {0} in Price List {1}").format(args.item_code, args.price_list),
+						alert=True,
+					)
 			else:
-				item_price = frappe.get_doc({
-					"doctype": "Item Price",
-					"price_list": args.price_list,
-					"item_code": args.item_code,
-					"currency": args.currency,
-					"price_list_rate": price_list_rate
-				})
+				item_price = frappe.get_doc(
+					{
+						"doctype": "Item Price",
+						"price_list": args.price_list,
+						"item_code": args.item_code,
+						"currency": args.currency,
+						"price_list_rate": price_list_rate,
+					}
+				)
 				item_price.insert()
-				frappe.msgprint(_("Item Price added for {0} in Price List {1}").format(args.item_code,
-					args.price_list), alert=True)
+				frappe.msgprint(
+					_("Item Price added for {0} in Price List {1}").format(args.item_code, args.price_list),
+					alert=True,
+				)
+
 
 def get_item_price(args, item_code, ignore_party=False):
 	"""
-		Get name, price_list_rate from Item Price based on conditions
-			Check if the desired qty is within the increment of the packing list.
-		:param args: dict (or frappe._dict) with mandatory fields price_list, uom
-			optional fields transaction_date, customer, supplier
-		:param item_code: str, Item Doctype field item_code
+	Get name, price_list_rate from Item Price based on conditions
+	        Check if the desired qty is within the increment of the packing list.
+	:param args: dict (or frappe._dict) with mandatory fields price_list, uom
+	        optional fields transaction_date, customer, supplier
+	:param item_code: str, Item Doctype field item_code
 	"""
 
-	args['item_code'] = item_code
+	args["item_code"] = item_code
 
 	conditions = """where item_code=%(item_code)s
 		and price_list=%(price_list)s
@@ -758,36 +875,42 @@
 		else:
 			conditions += "and (customer is null or customer = '') and (supplier is null or supplier = '')"
 
-	if args.get('transaction_date'):
+	if args.get("transaction_date"):
 		conditions += """ and %(transaction_date)s between
 			ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31')"""
 
-	if args.get('posting_date'):
+	if args.get("posting_date"):
 		conditions += """ and %(posting_date)s between
 			ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31')"""
 
-	return frappe.db.sql(""" select name, price_list_rate, uom
+	return frappe.db.sql(
+		""" select name, price_list_rate, uom
 		from `tabItem Price` {conditions}
-		order by valid_from desc, batch_no desc, uom desc """.format(conditions=conditions), args)
+		order by valid_from desc, batch_no desc, uom desc """.format(
+			conditions=conditions
+		),
+		args,
+	)
+
 
 def get_price_list_rate_for(args, item_code):
 	"""
-		:param customer: link to Customer DocType
-		:param supplier: link to Supplier DocType
-		:param price_list: str (Standard Buying or Standard Selling)
-		:param item_code: str, Item Doctype field item_code
-		:param qty: Desired Qty
-		:param transaction_date: Date of the price
+	:param customer: link to Customer DocType
+	:param supplier: link to Supplier DocType
+	:param price_list: str (Standard Buying or Standard Selling)
+	:param item_code: str, Item Doctype field item_code
+	:param qty: Desired Qty
+	:param transaction_date: Date of the price
 	"""
 	item_price_args = {
-			"item_code": item_code,
-			"price_list": args.get('price_list'),
-			"customer": args.get('customer'),
-			"supplier": args.get('supplier'),
-			"uom": args.get('uom'),
-			"transaction_date": args.get('transaction_date'),
-			"posting_date": args.get('posting_date'),
-			"batch_no": args.get('batch_no')
+		"item_code": item_code,
+		"price_list": args.get("price_list"),
+		"customer": args.get("customer"),
+		"supplier": args.get("supplier"),
+		"uom": args.get("uom"),
+		"transaction_date": args.get("transaction_date"),
+		"posting_date": args.get("posting_date"),
+		"batch_no": args.get("batch_no"),
 	}
 
 	item_price_data = 0
@@ -800,12 +923,15 @@
 		for field in ["customer", "supplier"]:
 			del item_price_args[field]
 
-		general_price_list_rate = get_item_price(item_price_args, item_code,
-			ignore_party=args.get("ignore_party"))
+		general_price_list_rate = get_item_price(
+			item_price_args, item_code, ignore_party=args.get("ignore_party")
+		)
 
 		if not general_price_list_rate and args.get("uom") != args.get("stock_uom"):
 			item_price_args["uom"] = args.get("stock_uom")
-			general_price_list_rate = get_item_price(item_price_args, item_code, ignore_party=args.get("ignore_party"))
+			general_price_list_rate = get_item_price(
+				item_price_args, item_code, ignore_party=args.get("ignore_party")
+			)
 
 		if general_price_list_rate:
 			item_price_data = general_price_list_rate
@@ -813,18 +939,19 @@
 	if item_price_data:
 		if item_price_data[0][2] == args.get("uom"):
 			return item_price_data[0][1]
-		elif not args.get('price_list_uom_dependant'):
+		elif not args.get("price_list_uom_dependant"):
 			return flt(item_price_data[0][1] * flt(args.get("conversion_factor", 1)))
 		else:
 			return item_price_data[0][1]
 
+
 def check_packing_list(price_list_rate_name, desired_qty, item_code):
 	"""
-		Check if the desired qty is within the increment of the packing list.
-		:param price_list_rate_name: Name of Item Price
-		:param desired_qty: Desired Qt
-		:param item_code: str, Item Doctype field item_code
-		:param qty: Desired Qt
+	Check if the desired qty is within the increment of the packing list.
+	:param price_list_rate_name: Name of Item Price
+	:param desired_qty: Desired Qt
+	:param item_code: str, Item Doctype field item_code
+	:param qty: Desired Qt
 	"""
 
 	flag = True
@@ -837,47 +964,62 @@
 
 	return flag
 
+
 def validate_conversion_rate(args, meta):
 	from erpnext.controllers.accounts_controller import validate_conversion_rate
 
-	company_currency = frappe.get_cached_value('Company',  args.company,  "default_currency")
-	if (not args.conversion_rate and args.currency==company_currency):
+	company_currency = frappe.get_cached_value("Company", args.company, "default_currency")
+	if not args.conversion_rate and args.currency == company_currency:
 		args.conversion_rate = 1.0
 
-	if (not args.ignore_conversion_rate and args.conversion_rate == 1 and args.currency!=company_currency):
-		args.conversion_rate = get_exchange_rate(args.currency,
-			company_currency, args.transaction_date, "for_buying") or 1.0
+	if (
+		not args.ignore_conversion_rate
+		and args.conversion_rate == 1
+		and args.currency != company_currency
+	):
+		args.conversion_rate = (
+			get_exchange_rate(args.currency, company_currency, args.transaction_date, "for_buying") or 1.0
+		)
 
 	# validate currency conversion rate
-	validate_conversion_rate(args.currency, args.conversion_rate,
-		meta.get_label("conversion_rate"), args.company)
+	validate_conversion_rate(
+		args.currency, args.conversion_rate, meta.get_label("conversion_rate"), args.company
+	)
 
-	args.conversion_rate = flt(args.conversion_rate,
-		get_field_precision(meta.get_field("conversion_rate"),
-			frappe._dict({"fields": args})))
+	args.conversion_rate = flt(
+		args.conversion_rate,
+		get_field_precision(meta.get_field("conversion_rate"), frappe._dict({"fields": args})),
+	)
 
 	if args.price_list:
-		if (not args.plc_conversion_rate
-			and args.price_list_currency==frappe.db.get_value("Price List", args.price_list, "currency", cache=True)):
+		if not args.plc_conversion_rate and args.price_list_currency == frappe.db.get_value(
+			"Price List", args.price_list, "currency", cache=True
+		):
 			args.plc_conversion_rate = 1.0
 
 		# validate price list currency conversion rate
 		if not args.get("price_list_currency"):
 			throw(_("Price List Currency not selected"))
 		else:
-			validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
-				meta.get_label("plc_conversion_rate"), args.company)
+			validate_conversion_rate(
+				args.price_list_currency,
+				args.plc_conversion_rate,
+				meta.get_label("plc_conversion_rate"),
+				args.company,
+			)
 
 			if meta.get_field("plc_conversion_rate"):
-				args.plc_conversion_rate = flt(args.plc_conversion_rate,
-					get_field_precision(meta.get_field("plc_conversion_rate"),
-					frappe._dict({"fields": args})))
+				args.plc_conversion_rate = flt(
+					args.plc_conversion_rate,
+					get_field_precision(meta.get_field("plc_conversion_rate"), frappe._dict({"fields": args})),
+				)
+
 
 def get_party_item_code(args, item_doc, out):
-	if args.transaction_type=="selling" and args.customer:
+	if args.transaction_type == "selling" and args.customer:
 		out.customer_item_code = None
 
-		if args.quotation_to and args.quotation_to != 'Customer':
+		if args.quotation_to and args.quotation_to != "Customer":
 			return
 
 		customer_item_code = item_doc.get("customer_items", {"customer_name": args.customer})
@@ -890,15 +1032,16 @@
 			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
 
-	if args.transaction_type=="buying" and args.supplier:
+	if args.transaction_type == "buying" and args.supplier:
 		item_supplier = item_doc.get("supplier_items", {"supplier": args.supplier})
 		out.supplier_part_no = item_supplier[0].supplier_part_no if item_supplier else None
 
+
 def get_pos_profile_item_details(company, args, pos_profile=None, update_data=False):
 	res = frappe._dict()
 
 	if not frappe.flags.pos_profile and not pos_profile:
-		pos_profile = frappe.flags.pos_profile = get_pos_profile(company, args.get('pos_profile'))
+		pos_profile = frappe.flags.pos_profile = get_pos_profile(company, args.get("pos_profile"))
 
 	if pos_profile:
 		for fieldname in ("income_account", "cost_center", "warehouse", "expense_account"):
@@ -910,70 +1053,89 @@
 
 	return res
 
+
 @frappe.whitelist()
 def get_pos_profile(company, pos_profile=None, user=None):
-	if pos_profile: return frappe.get_cached_doc('POS Profile', pos_profile)
+	if pos_profile:
+		return frappe.get_cached_doc("POS Profile", pos_profile)
 
 	if not user:
-		user = frappe.session['user']
+		user = frappe.session["user"]
 
 	condition = "pfu.user = %(user)s AND pfu.default=1"
 	if user and company:
 		condition = "pfu.user = %(user)s AND pf.company = %(company)s AND pfu.default=1"
 
-	pos_profile = frappe.db.sql("""SELECT pf.*
+	pos_profile = frappe.db.sql(
+		"""SELECT pf.*
 		FROM
 			`tabPOS Profile` pf LEFT JOIN `tabPOS Profile User` pfu
 		ON
 				pf.name = pfu.parent
 		WHERE
 			{cond} AND pf.disabled = 0
-	""".format(cond = condition), {
-		'user': user,
-		'company': company
-	}, as_dict=1)
+	""".format(
+			cond=condition
+		),
+		{"user": user, "company": company},
+		as_dict=1,
+	)
 
 	if not pos_profile and company:
-		pos_profile = frappe.db.sql("""SELECT pf.*
+		pos_profile = frappe.db.sql(
+			"""SELECT pf.*
 			FROM
 				`tabPOS Profile` pf LEFT JOIN `tabPOS Profile User` pfu
 			ON
 					pf.name = pfu.parent
 			WHERE
 				pf.company = %(company)s AND pf.disabled = 0
-		""", {
-			'company': company
-		}, as_dict=1)
+		""",
+			{"company": company},
+			as_dict=1,
+		)
 
 	return pos_profile and pos_profile[0] or None
 
+
 def get_serial_nos_by_fifo(args, sales_order=None):
 	if frappe.db.get_single_value("Stock Settings", "automatically_set_serial_nos_based_on_fifo"):
-		return "\n".join(frappe.db.sql_list("""select name from `tabSerial No`
+		return "\n".join(
+			frappe.db.sql_list(
+				"""select name from `tabSerial No`
 			where item_code=%(item_code)s and warehouse=%(warehouse)s and
 			sales_order=IF(%(sales_order)s IS NULL, sales_order, %(sales_order)s)
 			order by timestamp(purchase_date, purchase_time)
 			asc limit %(qty)s""",
-			{
-				"item_code": args.item_code,
-				"warehouse": args.warehouse,
-				"qty": abs(cint(args.stock_qty)),
-				"sales_order": sales_order
-			}))
+				{
+					"item_code": args.item_code,
+					"warehouse": args.warehouse,
+					"qty": abs(cint(args.stock_qty)),
+					"sales_order": sales_order,
+				},
+			)
+		)
+
 
 def get_serial_no_batchwise(args, sales_order=None):
 	if frappe.db.get_single_value("Stock Settings", "automatically_set_serial_nos_based_on_fifo"):
-		return "\n".join(frappe.db.sql_list("""select name from `tabSerial No`
+		return "\n".join(
+			frappe.db.sql_list(
+				"""select name from `tabSerial No`
 			where item_code=%(item_code)s and warehouse=%(warehouse)s and
 			sales_order=IF(%(sales_order)s IS NULL, sales_order, %(sales_order)s)
 			and batch_no=IF(%(batch_no)s IS NULL, batch_no, %(batch_no)s) order
-			by timestamp(purchase_date, purchase_time) asc limit %(qty)s""", {
-				"item_code": args.item_code,
-				"warehouse": args.warehouse,
-				"batch_no": args.batch_no,
-				"qty": abs(cint(args.stock_qty)),
-				"sales_order": sales_order
-			}))
+			by timestamp(purchase_date, purchase_time) asc limit %(qty)s""",
+				{
+					"item_code": args.item_code,
+					"warehouse": args.warehouse,
+					"batch_no": args.batch_no,
+					"qty": abs(cint(args.stock_qty)),
+					"sales_order": sales_order,
+				},
+			)
+		)
+
 
 @frappe.whitelist()
 def get_conversion_factor(item_code, uom):
@@ -981,69 +1143,94 @@
 	filters = {"parent": item_code, "uom": uom}
 	if variant_of:
 		filters["parent"] = ("in", (item_code, variant_of))
-	conversion_factor = frappe.db.get_value("UOM Conversion Detail",
-		filters, "conversion_factor")
+	conversion_factor = frappe.db.get_value("UOM Conversion Detail", filters, "conversion_factor")
 	if not conversion_factor:
 		stock_uom = frappe.db.get_value("Item", item_code, "stock_uom")
 		conversion_factor = get_uom_conv_factor(uom, stock_uom)
 	return {"conversion_factor": conversion_factor or 1.0}
 
+
 @frappe.whitelist()
 def get_projected_qty(item_code, warehouse):
-	return {"projected_qty": frappe.db.get_value("Bin",
-		{"item_code": item_code, "warehouse": warehouse}, "projected_qty")}
+	return {
+		"projected_qty": frappe.db.get_value(
+			"Bin", {"item_code": item_code, "warehouse": warehouse}, "projected_qty"
+		)
+	}
+
 
 @frappe.whitelist()
 def get_bin_details(item_code, warehouse, company=None):
-	bin_details = frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
-		["projected_qty", "actual_qty", "reserved_qty"], as_dict=True, cache=True) \
-			or {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0}
+	bin_details = frappe.db.get_value(
+		"Bin",
+		{"item_code": item_code, "warehouse": warehouse},
+		["projected_qty", "actual_qty", "reserved_qty"],
+		as_dict=True,
+		cache=True,
+	) or {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0}
 	if company:
-		bin_details['company_total_stock'] = get_company_total_stock(item_code, company)
+		bin_details["company_total_stock"] = get_company_total_stock(item_code, company)
 	return bin_details
 
+
 def get_company_total_stock(item_code, company):
-	return frappe.db.sql("""SELECT sum(actual_qty) from
+	return frappe.db.sql(
+		"""SELECT sum(actual_qty) from
 		(`tabBin` INNER JOIN `tabWarehouse` ON `tabBin`.warehouse = `tabWarehouse`.name)
 		WHERE `tabWarehouse`.company = %s and `tabBin`.item_code = %s""",
-		(company, item_code))[0][0]
+		(company, item_code),
+	)[0][0]
+
 
 @frappe.whitelist()
 def get_serial_no_details(item_code, warehouse, stock_qty, serial_no):
-	args = frappe._dict({"item_code":item_code, "warehouse":warehouse, "stock_qty":stock_qty, "serial_no":serial_no})
+	args = frappe._dict(
+		{"item_code": item_code, "warehouse": warehouse, "stock_qty": stock_qty, "serial_no": serial_no}
+	)
 	serial_no = get_serial_no(args)
-	return {'serial_no': serial_no}
+	return {"serial_no": serial_no}
+
 
 @frappe.whitelist()
-def get_bin_details_and_serial_nos(item_code, warehouse, has_batch_no=None, stock_qty=None, serial_no=None):
+def get_bin_details_and_serial_nos(
+	item_code, warehouse, has_batch_no=None, stock_qty=None, serial_no=None
+):
 	bin_details_and_serial_nos = {}
 	bin_details_and_serial_nos.update(get_bin_details(item_code, warehouse))
 	if flt(stock_qty) > 0:
 		if has_batch_no:
-			args = frappe._dict({"item_code":item_code, "warehouse":warehouse, "stock_qty":stock_qty})
+			args = frappe._dict({"item_code": item_code, "warehouse": warehouse, "stock_qty": stock_qty})
 			serial_no = get_serial_no(args)
-			bin_details_and_serial_nos.update({'serial_no': serial_no})
+			bin_details_and_serial_nos.update({"serial_no": serial_no})
 			return bin_details_and_serial_nos
 
-		bin_details_and_serial_nos.update(get_serial_no_details(item_code, warehouse, stock_qty, serial_no))
+		bin_details_and_serial_nos.update(
+			get_serial_no_details(item_code, warehouse, stock_qty, serial_no)
+		)
 	return bin_details_and_serial_nos
 
+
 @frappe.whitelist()
 def get_batch_qty_and_serial_no(batch_no, stock_qty, warehouse, item_code, has_serial_no):
 	batch_qty_and_serial_no = {}
 	batch_qty_and_serial_no.update(get_batch_qty(batch_no, warehouse, item_code))
 
-	if (flt(batch_qty_and_serial_no.get('actual_batch_qty')) >= flt(stock_qty)) and has_serial_no:
-		args = frappe._dict({"item_code":item_code, "warehouse":warehouse, "stock_qty":stock_qty, "batch_no":batch_no})
+	if (flt(batch_qty_and_serial_no.get("actual_batch_qty")) >= flt(stock_qty)) and has_serial_no:
+		args = frappe._dict(
+			{"item_code": item_code, "warehouse": warehouse, "stock_qty": stock_qty, "batch_no": batch_no}
+		)
 		serial_no = get_serial_no(args)
-		batch_qty_and_serial_no.update({'serial_no': serial_no})
+		batch_qty_and_serial_no.update({"serial_no": serial_no})
 	return batch_qty_and_serial_no
 
+
 @frappe.whitelist()
 def get_batch_qty(batch_no, warehouse, item_code):
 	from erpnext.stock.doctype.batch import batch
+
 	if batch_no:
-		return {'actual_batch_qty': batch.get_batch_qty(batch_no, warehouse)}
+		return {"actual_batch_qty": batch.get_batch_qty(batch_no, warehouse)}
+
 
 @frappe.whitelist()
 def apply_price_list(args, as_doc=False):
@@ -1053,23 +1240,23 @@
 	:param args: See below
 	:param as_doc: Updates value in the passed dict
 
-		args = {
-			"doctype": "",
-			"name": "",
-			"items": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
-			"conversion_rate": 1.0,
-			"selling_price_list": None,
-			"price_list_currency": None,
-			"price_list_uom_dependant": None,
-			"plc_conversion_rate": 1.0,
-			"doctype": "",
-			"name": "",
-			"supplier": None,
-			"transaction_date": None,
-			"conversion_rate": 1.0,
-			"buying_price_list": None,
-			"ignore_pricing_rule": 0/1
-		}
+	        args = {
+	                "doctype": "",
+	                "name": "",
+	                "items": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
+	                "conversion_rate": 1.0,
+	                "selling_price_list": None,
+	                "price_list_currency": None,
+	                "price_list_uom_dependant": None,
+	                "plc_conversion_rate": 1.0,
+	                "doctype": "",
+	                "name": "",
+	                "supplier": None,
+	                "transaction_date": None,
+	                "conversion_rate": 1.0,
+	                "buying_price_list": None,
+	                "ignore_pricing_rule": 0/1
+	        }
 	"""
 	args = process_args(args)
 
@@ -1089,10 +1276,10 @@
 			children.append(item_details)
 
 	if as_doc:
-		args.price_list_currency = parent.price_list_currency,
+		args.price_list_currency = (parent.price_list_currency,)
 		args.plc_conversion_rate = parent.plc_conversion_rate
-		if args.get('items'):
-			for i, item in enumerate(args.get('items')):
+		if args.get("items"):
+			for i, item in enumerate(args.get("items")):
 				for fieldname in children[i]:
 					# if the field exists in the original doc
 					# update the value
@@ -1100,26 +1287,25 @@
 						item[fieldname] = children[i][fieldname]
 		return args
 	else:
-		return {
-			"parent": parent,
-			"children": children
-		}
+		return {"parent": parent, "children": children}
+
 
 def apply_price_list_on_item(args):
-	item_doc = frappe.db.get_value("Item", args.item_code, ['name', 'variant_of'], as_dict=1)
+	item_doc = frappe.db.get_value("Item", args.item_code, ["name", "variant_of"], as_dict=1)
 	item_details = get_price_list_rate(args, item_doc)
 
 	item_details.update(get_pricing_rule_for_item(args, item_details.price_list_rate))
 
 	return item_details
 
+
 def get_price_list_currency_and_exchange_rate(args):
 	if not args.price_list:
 		return {}
 
-	if args.doctype in ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']:
+	if args.doctype in ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]:
 		args.update({"exchange_rate": "for_selling"})
-	elif args.doctype in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']:
+	elif args.doctype in ["Purchase Order", "Purchase Receipt", "Purchase Invoice"]:
 		args.update({"exchange_rate": "for_buying"})
 
 	price_list_details = get_price_list_details(args.price_list)
@@ -1130,25 +1316,38 @@
 	plc_conversion_rate = args.plc_conversion_rate
 	company_currency = get_company_currency(args.company)
 
-	if (not plc_conversion_rate) or (price_list_currency and args.price_list_currency \
-		and price_list_currency != args.price_list_currency):
-			# cksgb 19/09/2016: added args.transaction_date as posting_date argument for get_exchange_rate
-			plc_conversion_rate = get_exchange_rate(price_list_currency, company_currency,
-				args.transaction_date, args.exchange_rate) or plc_conversion_rate
+	if (not plc_conversion_rate) or (
+		price_list_currency
+		and args.price_list_currency
+		and price_list_currency != args.price_list_currency
+	):
+		# cksgb 19/09/2016: added args.transaction_date as posting_date argument for get_exchange_rate
+		plc_conversion_rate = (
+			get_exchange_rate(
+				price_list_currency, company_currency, args.transaction_date, args.exchange_rate
+			)
+			or plc_conversion_rate
+		)
 
-	return frappe._dict({
-		"price_list_currency": price_list_currency,
-		"price_list_uom_dependant": price_list_uom_dependant,
-		"plc_conversion_rate": plc_conversion_rate or 1
-	})
+	return frappe._dict(
+		{
+			"price_list_currency": price_list_currency,
+			"price_list_uom_dependant": price_list_uom_dependant,
+			"plc_conversion_rate": plc_conversion_rate or 1,
+		}
+	)
+
 
 @frappe.whitelist()
 def get_default_bom(item_code=None):
 	if item_code:
-		bom = frappe.db.get_value("BOM", {"docstatus": 1, "is_default": 1, "is_active": 1, "item": item_code})
+		bom = frappe.db.get_value(
+			"BOM", {"docstatus": 1, "is_default": 1, "is_active": 1, "item": item_code}
+		)
 		if bom:
 			return bom
 
+
 @frappe.whitelist()
 def get_valuation_rate(item_code, company, warehouse=None):
 	item = get_item_defaults(item_code, company)
@@ -1157,43 +1356,57 @@
 	# item = frappe.get_doc("Item", item_code)
 	if item.get("is_stock_item"):
 		if not warehouse:
-			warehouse = item.get("default_warehouse") or item_group.get("default_warehouse") or brand.get("default_warehouse")
+			warehouse = (
+				item.get("default_warehouse")
+				or item_group.get("default_warehouse")
+				or brand.get("default_warehouse")
+			)
 
-		return frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
-			["valuation_rate"], as_dict=True) or {"valuation_rate": 0}
+		return frappe.db.get_value(
+			"Bin", {"item_code": item_code, "warehouse": warehouse}, ["valuation_rate"], as_dict=True
+		) or {"valuation_rate": 0}
 
 	elif not item.get("is_stock_item"):
-		valuation_rate =frappe.db.sql("""select sum(base_net_amount) / sum(qty*conversion_factor)
+		valuation_rate = frappe.db.sql(
+			"""select sum(base_net_amount) / sum(qty*conversion_factor)
 			from `tabPurchase Invoice Item`
-			where item_code = %s and docstatus=1""", item_code)
+			where item_code = %s and docstatus=1""",
+			item_code,
+		)
 
 		if valuation_rate:
 			return {"valuation_rate": valuation_rate[0][0] or 0.0}
 	else:
 		return {"valuation_rate": 0.0}
 
+
 def get_gross_profit(out):
 	if out.valuation_rate:
-		out.update({
-			"gross_profit": ((out.base_rate - out.valuation_rate) * out.stock_qty)
-		})
+		out.update({"gross_profit": ((out.base_rate - out.valuation_rate) * out.stock_qty)})
 
 	return out
 
+
 @frappe.whitelist()
 def get_serial_no(args, serial_nos=None, sales_order=None):
 	serial_no = None
 	if isinstance(args, str):
 		args = json.loads(args)
 		args = frappe._dict(args)
-	if args.get('doctype') == 'Sales Invoice' and not args.get('update_stock'):
+	if args.get("doctype") == "Sales Invoice" and not args.get("update_stock"):
 		return ""
-	if args.get('warehouse') and args.get('stock_qty') and args.get('item_code'):
-		has_serial_no = frappe.get_value('Item', {'item_code': args.item_code}, "has_serial_no")
-		if args.get('batch_no') and has_serial_no == 1:
+	if args.get("warehouse") and args.get("stock_qty") and args.get("item_code"):
+		has_serial_no = frappe.get_value("Item", {"item_code": args.item_code}, "has_serial_no")
+		if args.get("batch_no") and has_serial_no == 1:
 			return get_serial_no_batchwise(args, sales_order)
 		elif has_serial_no == 1:
-			args = json.dumps({"item_code": args.get('item_code'),"warehouse": args.get('warehouse'),"stock_qty": args.get('stock_qty')})
+			args = json.dumps(
+				{
+					"item_code": args.get("item_code"),
+					"warehouse": args.get("warehouse"),
+					"stock_qty": args.get("stock_qty"),
+				}
+			)
 			args = process_args(args)
 			serial_no = get_serial_nos_by_fifo(args, sales_order)
 
@@ -1210,53 +1423,68 @@
 		if blanket_order_details:
 			out.update(blanket_order_details)
 
+
 @frappe.whitelist()
 def get_blanket_order_details(args):
 	if isinstance(args, str):
 		args = frappe._dict(json.loads(args))
 
 	blanket_order_details = None
-	condition = ''
+	condition = ""
 	if args.item_code:
 		if args.customer and args.doctype == "Sales Order":
-			condition = ' and bo.customer=%(customer)s'
+			condition = " and bo.customer=%(customer)s"
 		elif args.supplier and args.doctype == "Purchase Order":
-			condition = ' and bo.supplier=%(supplier)s'
+			condition = " and bo.supplier=%(supplier)s"
 		if args.blanket_order:
-			condition += ' and bo.name =%(blanket_order)s'
+			condition += " and bo.name =%(blanket_order)s"
 		if args.transaction_date:
-			condition += ' and bo.to_date>=%(transaction_date)s'
+			condition += " and bo.to_date>=%(transaction_date)s"
 
-		blanket_order_details = frappe.db.sql('''
+		blanket_order_details = frappe.db.sql(
+			"""
 				select boi.rate as blanket_order_rate, bo.name as blanket_order
 				from `tabBlanket Order` bo, `tabBlanket Order Item` boi
 				where bo.company=%(company)s and boi.item_code=%(item_code)s
 					and bo.docstatus=1 and bo.name = boi.parent {0}
-			'''.format(condition), args, as_dict=True)
+			""".format(
+				condition
+			),
+			args,
+			as_dict=True,
+		)
 
-		blanket_order_details = blanket_order_details[0] if blanket_order_details else ''
+		blanket_order_details = blanket_order_details[0] if blanket_order_details else ""
 	return blanket_order_details
 
+
 def get_so_reservation_for_item(args):
 	reserved_so = None
-	if args.get('against_sales_order'):
-		if get_reserved_qty_for_so(args.get('against_sales_order'), args.get('item_code')):
-			reserved_so = args.get('against_sales_order')
-	elif args.get('against_sales_invoice'):
-		sales_order = frappe.db.sql("""select sales_order from `tabSales Invoice Item` where
-		parent=%s and item_code=%s""", (args.get('against_sales_invoice'), args.get('item_code')))
+	if args.get("against_sales_order"):
+		if get_reserved_qty_for_so(args.get("against_sales_order"), args.get("item_code")):
+			reserved_so = args.get("against_sales_order")
+	elif args.get("against_sales_invoice"):
+		sales_order = frappe.db.sql(
+			"""select sales_order from `tabSales Invoice Item` where
+		parent=%s and item_code=%s""",
+			(args.get("against_sales_invoice"), args.get("item_code")),
+		)
 		if sales_order and sales_order[0]:
-			if get_reserved_qty_for_so(sales_order[0][0], args.get('item_code')):
+			if get_reserved_qty_for_so(sales_order[0][0], args.get("item_code")):
 				reserved_so = sales_order[0]
 	elif args.get("sales_order"):
-		if get_reserved_qty_for_so(args.get('sales_order'), args.get('item_code')):
-			reserved_so = args.get('sales_order')
+		if get_reserved_qty_for_so(args.get("sales_order"), args.get("item_code")):
+			reserved_so = args.get("sales_order")
 	return reserved_so
 
+
 def get_reserved_qty_for_so(sales_order, item_code):
-	reserved_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item`
+	reserved_qty = frappe.db.sql(
+		"""select sum(qty) from `tabSales Order Item`
 	where parent=%s and item_code=%s and ensure_delivery_based_on_produced_serial_no=1
-	""", (sales_order, item_code))
+	""",
+		(sales_order, item_code),
+	)
 	if reserved_qty and reserved_qty[0][0]:
 		return reserved_qty[0][0]
 	else:
diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py
index 21f2573..a96ffef 100644
--- a/erpnext/stock/reorder_item.py
+++ b/erpnext/stock/reorder_item.py
@@ -13,22 +13,29 @@
 
 
 def reorder_item():
-	""" Reorder item if stock reaches reorder level"""
+	"""Reorder item if stock reaches reorder level"""
 	# if initial setup not completed, return
 	if not (frappe.db.a_row_exists("Company") and frappe.db.a_row_exists("Fiscal Year")):
 		return
 
-	if cint(frappe.db.get_value('Stock Settings', None, 'auto_indent')):
+	if cint(frappe.db.get_value("Stock Settings", None, "auto_indent")):
 		return _reorder_item()
 
+
 def _reorder_item():
 	material_requests = {"Purchase": {}, "Transfer": {}, "Material Issue": {}, "Manufacture": {}}
-	warehouse_company = frappe._dict(frappe.db.sql("""select name, company from `tabWarehouse`
-		where disabled=0"""))
-	default_company = (erpnext.get_default_company() or
-		frappe.db.sql("""select name from tabCompany limit 1""")[0][0])
+	warehouse_company = frappe._dict(
+		frappe.db.sql(
+			"""select name, company from `tabWarehouse`
+		where disabled=0"""
+		)
+	)
+	default_company = (
+		erpnext.get_default_company() or frappe.db.sql("""select name from tabCompany limit 1""")[0][0]
+	)
 
-	items_to_consider = frappe.db.sql_list("""select name from `tabItem` item
+	items_to_consider = frappe.db.sql_list(
+		"""select name from `tabItem` item
 		where is_stock_item=1 and has_variants=0
 			and disabled=0
 			and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
@@ -36,14 +43,17 @@
 				or (variant_of is not null and variant_of != ''
 				and exists (select name from `tabItem Reorder` ir where ir.parent=item.variant_of))
 			)""",
-		{"today": nowdate()})
+		{"today": nowdate()},
+	)
 
 	if not items_to_consider:
 		return
 
 	item_warehouse_projected_qty = get_item_warehouse_projected_qty(items_to_consider)
 
-	def add_to_material_request(item_code, warehouse, reorder_level, reorder_qty, material_request_type, warehouse_group=None):
+	def add_to_material_request(
+		item_code, warehouse, reorder_level, reorder_qty, material_request_type, warehouse_group=None
+	):
 		if warehouse not in warehouse_company:
 			# a disabled warehouse
 			return
@@ -64,11 +74,9 @@
 
 			company = warehouse_company.get(warehouse) or default_company
 
-			material_requests[material_request_type].setdefault(company, []).append({
-				"item_code": item_code,
-				"warehouse": warehouse,
-				"reorder_qty": reorder_qty
-			})
+			material_requests[material_request_type].setdefault(company, []).append(
+				{"item_code": item_code, "warehouse": warehouse, "reorder_qty": reorder_qty}
+			)
 
 	for item_code in items_to_consider:
 		item = frappe.get_doc("Item", item_code)
@@ -78,19 +86,30 @@
 
 		if item.get("reorder_levels"):
 			for d in item.get("reorder_levels"):
-				add_to_material_request(item_code, d.warehouse, d.warehouse_reorder_level,
-					d.warehouse_reorder_qty, d.material_request_type, warehouse_group=d.warehouse_group)
+				add_to_material_request(
+					item_code,
+					d.warehouse,
+					d.warehouse_reorder_level,
+					d.warehouse_reorder_qty,
+					d.material_request_type,
+					warehouse_group=d.warehouse_group,
+				)
 
 	if material_requests:
 		return create_material_request(material_requests)
 
+
 def get_item_warehouse_projected_qty(items_to_consider):
 	item_warehouse_projected_qty = {}
 
-	for item_code, warehouse, projected_qty in frappe.db.sql("""select item_code, warehouse, projected_qty
+	for item_code, warehouse, projected_qty in frappe.db.sql(
+		"""select item_code, warehouse, projected_qty
 		from tabBin where item_code in ({0})
-			and (warehouse != "" and warehouse is not null)"""\
-		.format(", ".join(["%s"] * len(items_to_consider))), items_to_consider):
+			and (warehouse != "" and warehouse is not null)""".format(
+			", ".join(["%s"] * len(items_to_consider))
+		),
+		items_to_consider,
+	):
 
 		if item_code not in item_warehouse_projected_qty:
 			item_warehouse_projected_qty.setdefault(item_code, {})
@@ -102,15 +121,18 @@
 
 		while warehouse_doc.parent_warehouse:
 			if not item_warehouse_projected_qty.get(item_code, {}).get(warehouse_doc.parent_warehouse):
-				item_warehouse_projected_qty.setdefault(item_code, {})[warehouse_doc.parent_warehouse] = flt(projected_qty)
+				item_warehouse_projected_qty.setdefault(item_code, {})[warehouse_doc.parent_warehouse] = flt(
+					projected_qty
+				)
 			else:
 				item_warehouse_projected_qty[item_code][warehouse_doc.parent_warehouse] += flt(projected_qty)
 			warehouse_doc = frappe.get_doc("Warehouse", warehouse_doc.parent_warehouse)
 
 	return item_warehouse_projected_qty
 
+
 def create_material_request(material_requests):
-	"""	Create indent on reaching reorder level	"""
+	"""Create indent on reaching reorder level"""
 	mr_list = []
 	exceptions_list = []
 
@@ -131,11 +153,13 @@
 					continue
 
 				mr = frappe.new_doc("Material Request")
-				mr.update({
-					"company": company,
-					"transaction_date": nowdate(),
-					"material_request_type": "Material Transfer" if request_type=="Transfer" else request_type
-				})
+				mr.update(
+					{
+						"company": company,
+						"transaction_date": nowdate(),
+						"material_request_type": "Material Transfer" if request_type == "Transfer" else request_type,
+					}
+				)
 
 				for d in items:
 					d = frappe._dict(d)
@@ -143,30 +167,37 @@
 					uom = item.stock_uom
 					conversion_factor = 1.0
 
-					if request_type == 'Purchase':
+					if request_type == "Purchase":
 						uom = item.purchase_uom or item.stock_uom
 						if uom != item.stock_uom:
-							conversion_factor = frappe.db.get_value("UOM Conversion Detail",
-								{'parent': item.name, 'uom': uom}, 'conversion_factor') or 1.0
+							conversion_factor = (
+								frappe.db.get_value(
+									"UOM Conversion Detail", {"parent": item.name, "uom": uom}, "conversion_factor"
+								)
+								or 1.0
+							)
 
 					must_be_whole_number = frappe.db.get_value("UOM", uom, "must_be_whole_number", cache=True)
 					qty = d.reorder_qty / conversion_factor
 					if must_be_whole_number:
 						qty = ceil(qty)
 
-					mr.append("items", {
-						"doctype": "Material Request Item",
-						"item_code": d.item_code,
-						"schedule_date": add_days(nowdate(),cint(item.lead_time_days)),
-						"qty": qty,
-						"uom": uom,
-						"stock_uom": item.stock_uom,
-						"warehouse": d.warehouse,
-						"item_name": item.item_name,
-						"description": item.description,
-						"item_group": item.item_group,
-						"brand": item.brand,
-					})
+					mr.append(
+						"items",
+						{
+							"doctype": "Material Request Item",
+							"item_code": d.item_code,
+							"schedule_date": add_days(nowdate(), cint(item.lead_time_days)),
+							"qty": qty,
+							"uom": uom,
+							"stock_uom": item.stock_uom,
+							"warehouse": d.warehouse,
+							"item_name": item.item_name,
+							"description": item.description,
+							"item_group": item.item_group,
+							"brand": item.brand,
+						},
+					)
 
 				schedule_dates = [d.schedule_date for d in mr.items]
 				mr.schedule_date = max(schedule_dates or [nowdate()])
@@ -180,10 +211,11 @@
 
 	if mr_list:
 		if getattr(frappe.local, "reorder_email_notify", None) is None:
-			frappe.local.reorder_email_notify = cint(frappe.db.get_value('Stock Settings', None,
-				'reorder_email_notify'))
+			frappe.local.reorder_email_notify = cint(
+				frappe.db.get_value("Stock Settings", None, "reorder_email_notify")
+			)
 
-		if(frappe.local.reorder_email_notify):
+		if frappe.local.reorder_email_notify:
 			send_email_notification(mr_list)
 
 	if exceptions_list:
@@ -191,33 +223,44 @@
 
 	return mr_list
 
-def send_email_notification(mr_list):
-	""" Notify user about auto creation of indent"""
 
-	email_list = frappe.db.sql_list("""select distinct r.parent
+def send_email_notification(mr_list):
+	"""Notify user about auto creation of indent"""
+
+	email_list = frappe.db.sql_list(
+		"""select distinct r.parent
 		from `tabHas Role` r, tabUser p
 		where p.name = r.parent and p.enabled = 1 and p.docstatus < 2
 		and r.role in ('Purchase Manager','Stock Manager')
-		and p.name not in ('Administrator', 'All', 'Guest')""")
+		and p.name not in ('Administrator', 'All', 'Guest')"""
+	)
 
-	msg = frappe.render_template("templates/emails/reorder_item.html", {
-		"mr_list": mr_list
-	})
+	msg = frappe.render_template("templates/emails/reorder_item.html", {"mr_list": mr_list})
 
-	frappe.sendmail(recipients=email_list,
-		subject=_('Auto Material Requests Generated'), message = msg)
+	frappe.sendmail(recipients=email_list, subject=_("Auto Material Requests Generated"), message=msg)
+
 
 def notify_errors(exceptions_list):
 	subject = _("[Important] [ERPNext] Auto Reorder Errors")
-	content = _("Dear System Manager,") + "<br>" + _("An error occured for certain Items while creating Material Requests based on Re-order level. \
-		Please rectify these issues :") + "<br>"
+	content = (
+		_("Dear System Manager,")
+		+ "<br>"
+		+ _(
+			"An error occured for certain Items while creating Material Requests based on Re-order level. \
+		Please rectify these issues :"
+		)
+		+ "<br>"
+	)
 
 	for exception in exceptions_list:
 		exception = json.loads(exception)
-		error_message = """<div class='small text-muted'>{0}</div><br>""".format(_(exception.get("message")))
+		error_message = """<div class='small text-muted'>{0}</div><br>""".format(
+			_(exception.get("message"))
+		)
 		content += error_message
 
 	content += _("Regards,") + "<br>" + _("Administrator")
 
 	from frappe.email import sendmail_to_system_managers
+
 	sendmail_to_system_managers(subject, content)
diff --git a/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py b/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py
index 87097c7..3d9b046 100644
--- a/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py
+++ b/erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	float_precision = cint(frappe.db.get_default("float_precision")) or 3
 
@@ -22,22 +23,37 @@
 			for batch in sorted(iwb_map[item][wh]):
 				qty_dict = iwb_map[item][wh][batch]
 
-				data.append([item, item_map[item]["item_name"], item_map[item]["description"], wh, batch,
-					frappe.db.get_value('Batch', batch, 'expiry_date'), qty_dict.expiry_status
-				])
-
+				data.append(
+					[
+						item,
+						item_map[item]["item_name"],
+						item_map[item]["description"],
+						wh,
+						batch,
+						frappe.db.get_value("Batch", batch, "expiry_date"),
+						qty_dict.expiry_status,
+					]
+				)
 
 	return columns, data
 
+
 def get_columns(filters):
 	"""return columns based on filters"""
 
-	columns = [_("Item") + ":Link/Item:100"] + [_("Item Name") + "::150"] + [_("Description") + "::150"] + \
-	[_("Warehouse") + ":Link/Warehouse:100"] + [_("Batch") + ":Link/Batch:100"] + [_("Expires On") + ":Date:90"] + \
-	[_("Expiry (In Days)") + ":Int:120"]
+	columns = (
+		[_("Item") + ":Link/Item:100"]
+		+ [_("Item Name") + "::150"]
+		+ [_("Description") + "::150"]
+		+ [_("Warehouse") + ":Link/Warehouse:100"]
+		+ [_("Batch") + ":Link/Batch:100"]
+		+ [_("Expires On") + ":Date:90"]
+		+ [_("Expiry (In Days)") + ":Int:120"]
+	)
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 	if not filters.get("from_date"):
@@ -50,14 +66,19 @@
 
 	return conditions
 
+
 def get_stock_ledger_entries(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""select item_code, batch_no, warehouse,
+	return frappe.db.sql(
+		"""select item_code, batch_no, warehouse,
 		posting_date, actual_qty
 		from `tabStock Ledger Entry`
 		where is_cancelled = 0
-		and docstatus < 2 and ifnull(batch_no, '') != '' %s order by item_code, warehouse""" %
-		conditions, as_dict=1)
+		and docstatus < 2 and ifnull(batch_no, '') != '' %s order by item_code, warehouse"""
+		% conditions,
+		as_dict=1,
+	)
+
 
 def get_item_warehouse_batch_map(filters, float_precision):
 	sle = get_stock_ledger_entries(filters)
@@ -67,13 +88,13 @@
 	to_date = getdate(filters["to_date"])
 
 	for d in sle:
-		iwb_map.setdefault(d.item_code, {}).setdefault(d.warehouse, {})\
-			.setdefault(d.batch_no, frappe._dict({
-				"expires_on": None, "expiry_status": None}))
+		iwb_map.setdefault(d.item_code, {}).setdefault(d.warehouse, {}).setdefault(
+			d.batch_no, frappe._dict({"expires_on": None, "expiry_status": None})
+		)
 
 		qty_dict = iwb_map[d.item_code][d.warehouse][d.batch_no]
 
-		expiry_date_unicode = frappe.db.get_value('Batch', d.batch_no, 'expiry_date')
+		expiry_date_unicode = frappe.db.get_value("Batch", d.batch_no, "expiry_date")
 		qty_dict.expires_on = expiry_date_unicode
 
 		exp_date = frappe.utils.data.getdate(expiry_date_unicode)
@@ -88,6 +109,7 @@
 
 	return iwb_map
 
+
 def get_item_details(filters):
 	item_map = {}
 	for d in frappe.db.sql("select name, item_name, description from tabItem", as_dict=1):
diff --git a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
index 9b21dea..8a13300 100644
--- a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
+++ b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	if filters.from_date > filters.to_date:
 		frappe.throw(_("From Date must be before To Date"))
@@ -26,11 +27,20 @@
 				for batch in sorted(iwb_map[item][wh]):
 					qty_dict = iwb_map[item][wh][batch]
 					if qty_dict.opening_qty or qty_dict.in_qty or qty_dict.out_qty or qty_dict.bal_qty:
-						data.append([item, item_map[item]["item_name"], item_map[item]["description"], wh, batch,
-							flt(qty_dict.opening_qty, float_precision), flt(qty_dict.in_qty, float_precision),
-							flt(qty_dict.out_qty, float_precision), flt(qty_dict.bal_qty, float_precision),
-							item_map[item]["stock_uom"]
-						])
+						data.append(
+							[
+								item,
+								item_map[item]["item_name"],
+								item_map[item]["description"],
+								wh,
+								batch,
+								flt(qty_dict.opening_qty, float_precision),
+								flt(qty_dict.in_qty, float_precision),
+								flt(qty_dict.out_qty, float_precision),
+								flt(qty_dict.bal_qty, float_precision),
+								item_map[item]["stock_uom"],
+							]
+						)
 
 	return columns, data
 
@@ -38,10 +48,18 @@
 def get_columns(filters):
 	"""return columns based on filters"""
 
-	columns = [_("Item") + ":Link/Item:100"] + [_("Item Name") + "::150"] + [_("Description") + "::150"] + \
-		[_("Warehouse") + ":Link/Warehouse:100"] + [_("Batch") + ":Link/Batch:100"] + [_("Opening Qty") + ":Float:90"] + \
-		[_("In Qty") + ":Float:80"] + [_("Out Qty") + ":Float:80"] + [_("Balance Qty") + ":Float:90"] + \
-		[_("UOM") + "::90"]
+	columns = (
+		[_("Item") + ":Link/Item:100"]
+		+ [_("Item Name") + "::150"]
+		+ [_("Description") + "::150"]
+		+ [_("Warehouse") + ":Link/Warehouse:100"]
+		+ [_("Batch") + ":Link/Batch:100"]
+		+ [_("Opening Qty") + ":Float:90"]
+		+ [_("In Qty") + ":Float:80"]
+		+ [_("Out Qty") + ":Float:80"]
+		+ [_("Balance Qty") + ":Float:90"]
+		+ [_("UOM") + "::90"]
+	)
 
 	return columns
 
@@ -66,13 +84,16 @@
 # get all details
 def get_stock_ledger_entries(filters):
 	conditions = get_conditions(filters)
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select item_code, batch_no, warehouse, posting_date, sum(actual_qty) as actual_qty
 		from `tabStock Ledger Entry`
 		where is_cancelled = 0 and docstatus < 2 and ifnull(batch_no, '') != '' %s
 		group by voucher_no, batch_no, item_code, warehouse
-		order by item_code, warehouse""" %
-		conditions, as_dict=1)
+		order by item_code, warehouse"""
+		% conditions,
+		as_dict=1,
+	)
 
 
 def get_item_warehouse_batch_map(filters, float_precision):
@@ -83,20 +104,21 @@
 	to_date = getdate(filters["to_date"])
 
 	for d in sle:
-		iwb_map.setdefault(d.item_code, {}).setdefault(d.warehouse, {})\
-			.setdefault(d.batch_no, frappe._dict({
-				"opening_qty": 0.0, "in_qty": 0.0, "out_qty": 0.0, "bal_qty": 0.0
-			}))
+		iwb_map.setdefault(d.item_code, {}).setdefault(d.warehouse, {}).setdefault(
+			d.batch_no, frappe._dict({"opening_qty": 0.0, "in_qty": 0.0, "out_qty": 0.0, "bal_qty": 0.0})
+		)
 		qty_dict = iwb_map[d.item_code][d.warehouse][d.batch_no]
 		if d.posting_date < from_date:
-			qty_dict.opening_qty = flt(qty_dict.opening_qty, float_precision) \
-				+ flt(d.actual_qty, float_precision)
+			qty_dict.opening_qty = flt(qty_dict.opening_qty, float_precision) + flt(
+				d.actual_qty, float_precision
+			)
 		elif d.posting_date >= from_date and d.posting_date <= to_date:
 			if flt(d.actual_qty) > 0:
 				qty_dict.in_qty = flt(qty_dict.in_qty, float_precision) + flt(d.actual_qty, float_precision)
 			else:
-				qty_dict.out_qty = flt(qty_dict.out_qty, float_precision) \
-					+ abs(flt(d.actual_qty, float_precision))
+				qty_dict.out_qty = flt(qty_dict.out_qty, float_precision) + abs(
+					flt(d.actual_qty, float_precision)
+				)
 
 		qty_dict.bal_qty = flt(qty_dict.bal_qty, float_precision) + flt(d.actual_qty, float_precision)
 
diff --git a/erpnext/stock/report/bom_search/bom_search.py b/erpnext/stock/report/bom_search/bom_search.py
index a22b224..3be87ab 100644
--- a/erpnext/stock/report/bom_search/bom_search.py
+++ b/erpnext/stock/report/bom_search/bom_search.py
@@ -10,11 +10,13 @@
 	parents = {
 		"Product Bundle Item": "Product Bundle",
 		"BOM Explosion Item": "BOM",
-		"BOM Item": "BOM"
+		"BOM Item": "BOM",
 	}
 
-	for doctype in ("Product Bundle Item",
-		"BOM Explosion Item" if filters.search_sub_assemblies else "BOM Item"):
+	for doctype in (
+		"Product Bundle Item",
+		"BOM Explosion Item" if filters.search_sub_assemblies else "BOM Item",
+	):
 		all_boms = {}
 		for d in frappe.get_all(doctype, fields=["parent", "item_code"]):
 			all_boms.setdefault(d.parent, []).append(d.item_code)
@@ -29,16 +31,13 @@
 			if valid:
 				data.append((parent, parents[doctype]))
 
-	return [{
-		"fieldname": "parent",
-		"label": "BOM",
-		"width": 200,
-		"fieldtype": "Dynamic Link",
-		"options": "doctype"
-	},
-	{
-		"fieldname": "doctype",
-		"label": "Type",
-		"width": 200,
-		"fieldtype": "Data"
-	}], data
+	return [
+		{
+			"fieldname": "parent",
+			"label": "BOM",
+			"width": 200,
+			"fieldtype": "Dynamic Link",
+			"options": "doctype",
+		},
+		{"fieldname": "doctype", "label": "Type", "width": 200, "fieldtype": "Data"},
+	], data
diff --git a/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py b/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py
index 058af77..4642a53 100644
--- a/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py
+++ b/erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py
@@ -41,18 +41,8 @@
 
 def get_columns() -> Columns:
 	return [
-		{
-			'label': _('Item Group'),
-			'fieldname': 'item_group',
-			'fieldtype': 'Data',
-			'width': '200'
-		},
-		{
-			'label': _('COGS Debit'),
-			'fieldname': 'cogs_debit',
-			'fieldtype': 'Currency',
-			'width': '200'
-		}
+		{"label": _("Item Group"), "fieldname": "item_group", "fieldtype": "Data", "width": "200"},
+		{"label": _("COGS Debit"), "fieldname": "cogs_debit", "fieldtype": "Currency", "width": "200"},
 	]
 
 
@@ -67,11 +57,11 @@
 	data = []
 	for item in leveled_dict.items():
 		i = item[1]
-		if i['agg_value'] == 0:
+		if i["agg_value"] == 0:
 			continue
-		data.append(get_row(i['name'], i['agg_value'], i['is_group'], i['level']))
-		if i['self_value'] < i['agg_value'] and i['self_value'] > 0:
-			data.append(get_row(i['name'], i['self_value'], 0, i['level'] + 1))
+		data.append(get_row(i["name"], i["agg_value"], i["is_group"], i["level"]))
+		if i["self_value"] < i["agg_value"] and i["self_value"] > 0:
+			data.append(get_row(i["name"], i["self_value"], 0, i["level"] + 1))
 	return data
 
 
@@ -79,8 +69,8 @@
 	gl_entries = get_gl_entries(filters, [])
 	filtered_entries = []
 	for entry in gl_entries:
-		posting_date = entry.get('posting_date')
-		from_date = filters.get('from_date')
+		posting_date = entry.get("posting_date")
+		from_date = filters.get("from_date")
 		if date_diff(from_date, posting_date) > 0:
 			continue
 		filtered_entries.append(entry)
@@ -88,10 +78,11 @@
 
 
 def get_stock_value_difference_list(filtered_entries: FilteredEntries) -> SVDList:
-	voucher_nos = [fe.get('voucher_no') for fe in filtered_entries]
+	voucher_nos = [fe.get("voucher_no") for fe in filtered_entries]
 	svd_list = frappe.get_list(
-		'Stock Ledger Entry', fields=['item_code','stock_value_difference'],
-		filters=[('voucher_no', 'in', voucher_nos), ("is_cancelled", "=", 0)]
+		"Stock Ledger Entry",
+		fields=["item_code", "stock_value_difference"],
+		filters=[("voucher_no", "in", voucher_nos), ("is_cancelled", "=", 0)],
 	)
 	assign_item_groups_to_svd_list(svd_list)
 	return svd_list
@@ -99,7 +90,7 @@
 
 def get_leveled_dict() -> OrderedDict:
 	item_groups_dict = get_item_groups_dict()
-	lr_list = sorted(item_groups_dict, key=lambda x : int(x[0]))
+	lr_list = sorted(item_groups_dict, key=lambda x: int(x[0]))
 	leveled_dict = OrderedDict()
 	current_level = 0
 	nesting_r = []
@@ -108,10 +99,10 @@
 			nesting_r.pop()
 			current_level -= 1
 
-		leveled_dict[(l,r)] = {
-			'level' : current_level,
-			'name' : item_groups_dict[(l,r)]['name'],
-			'is_group' : item_groups_dict[(l,r)]['is_group']
+		leveled_dict[(l, r)] = {
+			"level": current_level,
+			"name": item_groups_dict[(l, r)]["name"],
+			"is_group": item_groups_dict[(l, r)]["is_group"],
 		}
 
 		if int(r) - int(l) > 1:
@@ -123,38 +114,38 @@
 
 
 def assign_self_values(leveled_dict: OrderedDict, svd_list: SVDList) -> None:
-	key_dict = {v['name']:k for k, v in leveled_dict.items()}
+	key_dict = {v["name"]: k for k, v in leveled_dict.items()}
 	for item in svd_list:
 		key = key_dict[item.get("item_group")]
-		leveled_dict[key]['self_value'] += -item.get("stock_value_difference")
+		leveled_dict[key]["self_value"] += -item.get("stock_value_difference")
 
 
 def assign_agg_values(leveled_dict: OrderedDict) -> None:
 	keys = list(leveled_dict.keys())[::-1]
-	prev_level = leveled_dict[keys[-1]]['level']
+	prev_level = leveled_dict[keys[-1]]["level"]
 	accu = [0]
 	for k in keys[:-1]:
-		curr_level = leveled_dict[k]['level']
+		curr_level = leveled_dict[k]["level"]
 		if curr_level == prev_level:
-			accu[-1] += leveled_dict[k]['self_value']
-			leveled_dict[k]['agg_value'] = leveled_dict[k]['self_value']
+			accu[-1] += leveled_dict[k]["self_value"]
+			leveled_dict[k]["agg_value"] = leveled_dict[k]["self_value"]
 
 		elif curr_level > prev_level:
-			accu.append(leveled_dict[k]['self_value'])
-			leveled_dict[k]['agg_value'] = accu[-1]
+			accu.append(leveled_dict[k]["self_value"])
+			leveled_dict[k]["agg_value"] = accu[-1]
 
 		elif curr_level < prev_level:
-			accu[-1] += leveled_dict[k]['self_value']
-			leveled_dict[k]['agg_value'] = accu[-1]
+			accu[-1] += leveled_dict[k]["self_value"]
+			leveled_dict[k]["agg_value"] = accu[-1]
 
 		prev_level = curr_level
 
 	# root node
 	rk = keys[-1]
-	leveled_dict[rk]['agg_value'] = sum(accu) + leveled_dict[rk]['self_value']
+	leveled_dict[rk]["agg_value"] = sum(accu) + leveled_dict[rk]["self_value"]
 
 
-def get_row(name:str, value:float, is_bold:int, indent:int) -> Row:
+def get_row(name: str, value: float, is_bold: int, indent: int) -> Row:
 	item_group = name
 	if is_bold:
 		item_group = frappe.bold(item_group)
@@ -168,20 +159,20 @@
 
 
 def get_item_groups_map(svd_list: SVDList) -> Dict[str, str]:
-	item_codes = set(i['item_code'] for i in svd_list)
+	item_codes = set(i["item_code"] for i in svd_list)
 	ig_list = frappe.get_list(
-		'Item', fields=['item_code','item_group'],
-		filters=[('item_code', 'in', item_codes)]
+		"Item", fields=["item_code", "item_group"], filters=[("item_code", "in", item_codes)]
 	)
-	return {i['item_code']:i['item_group'] for i in ig_list}
+	return {i["item_code"]: i["item_group"] for i in ig_list}
 
 
 def get_item_groups_dict() -> ItemGroupsDict:
 	item_groups_list = frappe.get_all("Item Group", fields=("name", "is_group", "lft", "rgt"))
-	return {(i['lft'],i['rgt']):{'name':i['name'], 'is_group':i['is_group']}
-		for i in item_groups_list}
+	return {
+		(i["lft"], i["rgt"]): {"name": i["name"], "is_group": i["is_group"]} for i in item_groups_list
+	}
 
 
 def update_leveled_dict(leveled_dict: OrderedDict) -> None:
 	for k in leveled_dict:
-		leveled_dict[k].update({'self_value':0, 'agg_value':0})
+		leveled_dict[k].update({"self_value": 0, "agg_value": 0})
diff --git a/erpnext/stock/report/delayed_item_report/delayed_item_report.py b/erpnext/stock/report/delayed_item_report/delayed_item_report.py
index 4ec36ea..9df24d6 100644
--- a/erpnext/stock/report/delayed_item_report/delayed_item_report.py
+++ b/erpnext/stock/report/delayed_item_report/delayed_item_report.py
@@ -7,11 +7,12 @@
 from frappe.utils import date_diff
 
 
-def execute(filters=None, consolidated = False):
+def execute(filters=None, consolidated=False):
 	data, columns = DelayedItemReport(filters).run()
 
 	return data, columns
 
+
 class DelayedItemReport(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
@@ -23,28 +24,38 @@
 		conditions = ""
 
 		doctype = self.filters.get("based_on")
-		child_doc= "%s Item" % doctype
+		child_doc = "%s Item" % doctype
 
 		if doctype == "Sales Invoice":
 			conditions = " and `tabSales Invoice`.update_stock = 1 and `tabSales Invoice`.is_pos = 0"
 
 		if self.filters.get("item_group"):
-			conditions += " and `tab%s`.item_group = %s" % (child_doc,
-				frappe.db.escape(self.filters.get("item_group")))
+			conditions += " and `tab%s`.item_group = %s" % (
+				child_doc,
+				frappe.db.escape(self.filters.get("item_group")),
+			)
 
 		for field in ["customer", "customer_group", "company"]:
 			if self.filters.get(field):
-				conditions += " and `tab%s`.%s = %s" % (doctype,
-					field, frappe.db.escape(self.filters.get(field)))
+				conditions += " and `tab%s`.%s = %s" % (
+					doctype,
+					field,
+					frappe.db.escape(self.filters.get(field)),
+				)
 
 		sales_order_field = "against_sales_order"
 		if doctype == "Sales Invoice":
 			sales_order_field = "sales_order"
 
 		if self.filters.get("sales_order"):
-			conditions = " and `tab%s`.%s = '%s'" %(child_doc, sales_order_field, self.filters.get("sales_order"))
+			conditions = " and `tab%s`.%s = '%s'" % (
+				child_doc,
+				sales_order_field,
+				self.filters.get("sales_order"),
+			)
 
-		self.transactions = frappe.db.sql(""" SELECT `tab{child_doc}`.item_code, `tab{child_doc}`.item_name,
+		self.transactions = frappe.db.sql(
+			""" SELECT `tab{child_doc}`.item_code, `tab{child_doc}`.item_name,
 				`tab{child_doc}`.item_group, `tab{child_doc}`.qty, `tab{child_doc}`.rate, `tab{child_doc}`.amount,
 				`tab{child_doc}`.so_detail, `tab{child_doc}`.{so_field} as sales_order,
 				`tab{doctype}`.shipping_address_name, `tab{doctype}`.po_no, `tab{doctype}`.customer,
@@ -54,10 +65,12 @@
 				`tab{child_doc}`.parent = `tab{doctype}`.name and `tab{doctype}`.docstatus = 1 and
 				`tab{doctype}`.posting_date between %(from_date)s and %(to_date)s and
 				`tab{child_doc}`.{so_field} is not null and `tab{child_doc}`.{so_field} != '' {cond}
-		""".format(cond=conditions, doctype=doctype, child_doc=child_doc, so_field=sales_order_field), {
-			'from_date': self.filters.get('from_date'),
-			'to_date': self.filters.get('to_date')
-		}, as_dict=1)
+		""".format(
+				cond=conditions, doctype=doctype, child_doc=child_doc, so_field=sales_order_field
+			),
+			{"from_date": self.filters.get("from_date"), "to_date": self.filters.get("to_date")},
+			as_dict=1,
+		)
 
 		if self.transactions:
 			self.filter_transactions_data(consolidated)
@@ -67,112 +80,85 @@
 	def filter_transactions_data(self, consolidated=False):
 		sales_orders = [d.sales_order for d in self.transactions]
 		doctype = "Sales Order"
-		filters = {'name': ('in', sales_orders)}
+		filters = {"name": ("in", sales_orders)}
 
 		if not consolidated:
 			sales_order_items = [d.so_detail for d in self.transactions]
 			doctype = "Sales Order Item"
-			filters = {'parent': ('in', sales_orders), 'name': ('in', sales_order_items)}
+			filters = {"parent": ("in", sales_orders), "name": ("in", sales_order_items)}
 
 		so_data = {}
-		for d in frappe.get_all(doctype, filters = filters,
-			fields = ["delivery_date", "parent", "name"]):
+		for d in frappe.get_all(doctype, filters=filters, fields=["delivery_date", "parent", "name"]):
 			key = d.name if consolidated else (d.parent, d.name)
 			if key not in so_data:
 				so_data.setdefault(key, d.delivery_date)
 
 		for row in self.transactions:
 			key = row.sales_order if consolidated else (row.sales_order, row.so_detail)
-			row.update({
-				'delivery_date': so_data.get(key),
-				'delayed_days': date_diff(row.posting_date, so_data.get(key))
-			})
+			row.update(
+				{
+					"delivery_date": so_data.get(key),
+					"delayed_days": date_diff(row.posting_date, so_data.get(key)),
+				}
+			)
 
 		return self.transactions
 
 	def get_columns(self):
 		based_on = self.filters.get("based_on")
 
-		return [{
-			"label": _(based_on),
-			"fieldname": "name",
-			"fieldtype": "Link",
-			"options": based_on,
-			"width": 100
-		},
-		{
-			"label": _("Customer"),
-			"fieldname": "customer",
-			"fieldtype": "Link",
-			"options": "Customer",
-			"width": 200
-		},
-		{
-			"label": _("Shipping Address"),
-			"fieldname": "shipping_address_name",
-			"fieldtype": "Link",
-			"options": "Address",
-			"width": 120
-		},
-		{
-			"label": _("Expected Delivery Date"),
-			"fieldname": "delivery_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Actual Delivery Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Item Code"),
-			"fieldname": "item_code",
-			"fieldtype": "Link",
-			"options": "Item",
-			"width": 100
-		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Quantity"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"label": _("Rate"),
-			"fieldname": "rate",
-			"fieldtype": "Currency",
-			"width": 100
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "amount",
-			"fieldtype": "Currency",
-			"width": 100
-		},
-		{
-			"label": _("Delayed Days"),
-			"fieldname": "delayed_days",
-			"fieldtype": "Int",
-			"width": 100
-		},
-		{
-			"label": _("Sales Order"),
-			"fieldname": "sales_order",
-			"fieldtype": "Link",
-			"options": "Sales Order",
-			"width": 100
-		},
-		{
-			"label": _("Customer PO"),
-			"fieldname": "po_no",
-			"fieldtype": "Data",
-			"width": 100
-		}]
+		return [
+			{
+				"label": _(based_on),
+				"fieldname": "name",
+				"fieldtype": "Link",
+				"options": based_on,
+				"width": 100,
+			},
+			{
+				"label": _("Customer"),
+				"fieldname": "customer",
+				"fieldtype": "Link",
+				"options": "Customer",
+				"width": 200,
+			},
+			{
+				"label": _("Shipping Address"),
+				"fieldname": "shipping_address_name",
+				"fieldtype": "Link",
+				"options": "Address",
+				"width": 120,
+			},
+			{
+				"label": _("Expected Delivery Date"),
+				"fieldname": "delivery_date",
+				"fieldtype": "Date",
+				"width": 100,
+			},
+			{
+				"label": _("Actual Delivery Date"),
+				"fieldname": "posting_date",
+				"fieldtype": "Date",
+				"width": 100,
+			},
+			{
+				"label": _("Item Code"),
+				"fieldname": "item_code",
+				"fieldtype": "Link",
+				"options": "Item",
+				"width": 100,
+			},
+			{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
+			{"label": _("Quantity"), "fieldname": "qty", "fieldtype": "Float", "width": 100},
+			{"label": _("Rate"), "fieldname": "rate", "fieldtype": "Currency", "width": 100},
+			{"label": _("Amount"), "fieldname": "amount", "fieldtype": "Currency", "width": 100},
+			{"label": _("Delayed Days"), "fieldname": "delayed_days", "fieldtype": "Int", "width": 100},
+			{
+				"label": _("Sales Order"),
+				"fieldname": "sales_order",
+				"fieldtype": "Link",
+				"options": "Sales Order",
+				"width": 100,
+			},
+			{"label": _("Customer PO"), "fieldname": "po_no", "fieldtype": "Data", "width": 100},
+		]
diff --git a/erpnext/stock/report/delayed_order_report/delayed_order_report.py b/erpnext/stock/report/delayed_order_report/delayed_order_report.py
index 26090ab..197218d 100644
--- a/erpnext/stock/report/delayed_order_report/delayed_order_report.py
+++ b/erpnext/stock/report/delayed_order_report/delayed_order_report.py
@@ -14,6 +14,7 @@
 
 	return columns, data
 
+
 class DelayedOrderReport(DelayedItemReport):
 	def run(self):
 		return self.get_columns(), self.get_data(consolidated=True) or []
@@ -33,60 +34,48 @@
 	def get_columns(self):
 		based_on = self.filters.get("based_on")
 
-		return [{
-			"label": _(based_on),
-			"fieldname": "name",
-			"fieldtype": "Link",
-			"options": based_on,
-			"width": 100
-		},{
-			"label": _("Customer"),
-			"fieldname": "customer",
-			"fieldtype": "Link",
-			"options": "Customer",
-			"width": 200
-		},
-		{
-			"label": _("Shipping Address"),
-			"fieldname": "shipping_address_name",
-			"fieldtype": "Link",
-			"options": "Address",
-			"width": 140
-		},
-		{
-			"label": _("Expected Delivery Date"),
-			"fieldname": "delivery_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Actual Delivery Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Amount"),
-			"fieldname": "grand_total",
-			"fieldtype": "Currency",
-			"width": 100
-		},
-		{
-			"label": _("Delayed Days"),
-			"fieldname": "delayed_days",
-			"fieldtype": "Int",
-			"width": 100
-		},
-		{
-			"label": _("Sales Order"),
-			"fieldname": "sales_order",
-			"fieldtype": "Link",
-			"options": "Sales Order",
-			"width": 150
-		},
-		{
-			"label": _("Customer PO"),
-			"fieldname": "po_no",
-			"fieldtype": "Data",
-			"width": 110
-		}]
+		return [
+			{
+				"label": _(based_on),
+				"fieldname": "name",
+				"fieldtype": "Link",
+				"options": based_on,
+				"width": 100,
+			},
+			{
+				"label": _("Customer"),
+				"fieldname": "customer",
+				"fieldtype": "Link",
+				"options": "Customer",
+				"width": 200,
+			},
+			{
+				"label": _("Shipping Address"),
+				"fieldname": "shipping_address_name",
+				"fieldtype": "Link",
+				"options": "Address",
+				"width": 140,
+			},
+			{
+				"label": _("Expected Delivery Date"),
+				"fieldname": "delivery_date",
+				"fieldtype": "Date",
+				"width": 100,
+			},
+			{
+				"label": _("Actual Delivery Date"),
+				"fieldname": "posting_date",
+				"fieldtype": "Date",
+				"width": 100,
+			},
+			{"label": _("Amount"), "fieldname": "grand_total", "fieldtype": "Currency", "width": 100},
+			{"label": _("Delayed Days"), "fieldname": "delayed_days", "fieldtype": "Int", "width": 100},
+			{
+				"label": _("Sales Order"),
+				"fieldname": "sales_order",
+				"fieldtype": "Link",
+				"options": "Sales Order",
+				"width": 150,
+			},
+			{"label": _("Customer PO"), "fieldname": "po_no", "fieldtype": "Data", "width": 110},
+		]
diff --git a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py
index b7ac7ff..7a1b8c0 100644
--- a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py
+++ b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Delivery Note")
 	data = get_data(filters, conditions)
@@ -17,6 +18,7 @@
 
 	return conditions["columns"], data, None, chart_data
 
+
 def get_chart_data(data, filters):
 	if not data:
 		return []
@@ -27,7 +29,7 @@
 		# consider only consolidated row
 		data = [row for row in data if row[0]]
 
-	data = sorted(data, key = lambda i: i[-1],reverse=True)
+	data = sorted(data, key=lambda i: i[-1], reverse=True)
 
 	if len(data) > 10:
 		# get top 10 if data too long
@@ -39,13 +41,8 @@
 
 	return {
 		"data": {
-			"labels" : labels,
-			"datasets" : [
-				{
-				"name": _("Total Delivered Amount"),
-				"values": datapoints
-				}
-			]
+			"labels": labels,
+			"datasets": [{"name": _("Total Delivered Amount"), "values": datapoints}],
 		},
-		"type" : "bar"
+		"type": "bar",
 	}
diff --git a/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py b/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py
index 6aa12ac..bcc2139 100644
--- a/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py
+++ b/erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py
@@ -12,6 +12,7 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_data(filters):
 	data = get_stock_ledger_entries(filters)
 	itewise_balance_qty = {}
@@ -23,6 +24,7 @@
 	res = validate_data(itewise_balance_qty)
 	return res
 
+
 def validate_data(itewise_balance_qty):
 	res = []
 	for key, data in itewise_balance_qty.items():
@@ -33,6 +35,7 @@
 
 	return res
 
+
 def get_incorrect_data(data):
 	balance_qty = 0.0
 	for row in data:
@@ -45,67 +48,84 @@
 			row.differnce = abs(flt(row.expected_balance_qty) - flt(row.qty_after_transaction))
 			return row
 
+
 def get_stock_ledger_entries(report_filters):
 	filters = {"is_cancelled": 0}
-	fields = ['name', 'voucher_type', 'voucher_no', 'item_code', 'actual_qty',
-		'posting_date', 'posting_time', 'company', 'warehouse', 'qty_after_transaction', 'batch_no']
+	fields = [
+		"name",
+		"voucher_type",
+		"voucher_no",
+		"item_code",
+		"actual_qty",
+		"posting_date",
+		"posting_time",
+		"company",
+		"warehouse",
+		"qty_after_transaction",
+		"batch_no",
+	]
 
-	for field in ['warehouse', 'item_code', 'company']:
+	for field in ["warehouse", "item_code", "company"]:
 		if report_filters.get(field):
 			filters[field] = report_filters.get(field)
 
-	return frappe.get_all('Stock Ledger Entry', fields = fields, filters = filters,
-		order_by = 'timestamp(posting_date, posting_time) asc, creation asc')
+	return frappe.get_all(
+		"Stock Ledger Entry",
+		fields=fields,
+		filters=filters,
+		order_by="timestamp(posting_date, posting_time) asc, creation asc",
+	)
+
 
 def get_columns():
-	return [{
-		'label': _('Id'),
-		'fieldtype': 'Link',
-		'fieldname': 'name',
-		'options': 'Stock Ledger Entry',
-		'width': 120
-	}, {
-		'label': _('Posting Date'),
-		'fieldtype': 'Date',
-		'fieldname': 'posting_date',
-		'width': 110
-	}, {
-		'label': _('Voucher Type'),
-		'fieldtype': 'Link',
-		'fieldname': 'voucher_type',
-		'options': 'DocType',
-		'width': 120
-	}, {
-		'label': _('Voucher No'),
-		'fieldtype': 'Dynamic Link',
-		'fieldname': 'voucher_no',
-		'options': 'voucher_type',
-		'width': 120
-	}, {
-		'label': _('Item Code'),
-		'fieldtype': 'Link',
-		'fieldname': 'item_code',
-		'options': 'Item',
-		'width': 120
-	}, {
-		'label': _('Warehouse'),
-		'fieldtype': 'Link',
-		'fieldname': 'warehouse',
-		'options': 'Warehouse',
-		'width': 120
-	}, {
-		'label': _('Expected Balance Qty'),
-		'fieldtype': 'Float',
-		'fieldname': 'expected_balance_qty',
-		'width': 170
-	}, {
-		'label': _('Actual Balance Qty'),
-		'fieldtype': 'Float',
-		'fieldname': 'qty_after_transaction',
-		'width': 150
-	}, {
-		'label': _('Difference'),
-		'fieldtype': 'Float',
-		'fieldname': 'differnce',
-		'width': 110
-	}]
+	return [
+		{
+			"label": _("Id"),
+			"fieldtype": "Link",
+			"fieldname": "name",
+			"options": "Stock Ledger Entry",
+			"width": 120,
+		},
+		{"label": _("Posting Date"), "fieldtype": "Date", "fieldname": "posting_date", "width": 110},
+		{
+			"label": _("Voucher Type"),
+			"fieldtype": "Link",
+			"fieldname": "voucher_type",
+			"options": "DocType",
+			"width": 120,
+		},
+		{
+			"label": _("Voucher No"),
+			"fieldtype": "Dynamic Link",
+			"fieldname": "voucher_no",
+			"options": "voucher_type",
+			"width": 120,
+		},
+		{
+			"label": _("Item Code"),
+			"fieldtype": "Link",
+			"fieldname": "item_code",
+			"options": "Item",
+			"width": 120,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldtype": "Link",
+			"fieldname": "warehouse",
+			"options": "Warehouse",
+			"width": 120,
+		},
+		{
+			"label": _("Expected Balance Qty"),
+			"fieldtype": "Float",
+			"fieldname": "expected_balance_qty",
+			"width": 170,
+		},
+		{
+			"label": _("Actual Balance Qty"),
+			"fieldtype": "Float",
+			"fieldname": "qty_after_transaction",
+			"width": 150,
+		},
+		{"label": _("Difference"), "fieldtype": "Float", "fieldname": "differnce", "width": 110},
+	]
diff --git a/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py b/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py
index be8597d..78c6961 100644
--- a/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py
+++ b/erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py
@@ -15,6 +15,7 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_data(filters):
 	data = get_stock_ledger_entries(filters)
 	serial_nos_data = prepare_serial_nos(data)
@@ -22,6 +23,7 @@
 
 	return data
 
+
 def prepare_serial_nos(data):
 	serial_no_wise_data = {}
 	for row in data:
@@ -37,13 +39,16 @@
 
 	return serial_no_wise_data
 
+
 def get_incorrect_serial_nos(serial_nos_data):
 	result = []
 
-	total_value = frappe._dict({'qty': 0, 'valuation_rate': 0, 'serial_no': frappe.bold(_('Balance'))})
+	total_value = frappe._dict(
+		{"qty": 0, "valuation_rate": 0, "serial_no": frappe.bold(_("Balance"))}
+	)
 
 	for serial_no, data in serial_nos_data.items():
-		total_dict = frappe._dict({'qty': 0, 'valuation_rate': 0, 'serial_no': frappe.bold(_('Total'))})
+		total_dict = frappe._dict({"qty": 0, "valuation_rate": 0, "serial_no": frappe.bold(_("Total"))})
 
 		if check_incorrect_serial_data(data, total_dict):
 			result.extend(data)
@@ -58,93 +63,111 @@
 
 	return result
 
+
 def check_incorrect_serial_data(data, total_dict):
 	incorrect_data = False
 	for row in data:
 		total_dict.qty += row.qty
 		total_dict.valuation_rate += row.valuation_rate
 
-		if ((total_dict.qty == 0 and abs(total_dict.valuation_rate) > 0) or total_dict.qty < 0):
+		if (total_dict.qty == 0 and abs(total_dict.valuation_rate) > 0) or total_dict.qty < 0:
 			incorrect_data = True
 
 	return incorrect_data
 
+
 def get_stock_ledger_entries(report_filters):
-	fields = ['name', 'voucher_type', 'voucher_no', 'item_code', 'serial_no as serial_nos', 'actual_qty',
-		'posting_date', 'posting_time', 'company', 'warehouse', '(stock_value_difference / actual_qty) as valuation_rate']
+	fields = [
+		"name",
+		"voucher_type",
+		"voucher_no",
+		"item_code",
+		"serial_no as serial_nos",
+		"actual_qty",
+		"posting_date",
+		"posting_time",
+		"company",
+		"warehouse",
+		"(stock_value_difference / actual_qty) as valuation_rate",
+	]
 
-	filters = {'serial_no': ("is", "set"), "is_cancelled": 0}
+	filters = {"serial_no": ("is", "set"), "is_cancelled": 0}
 
-	if report_filters.get('item_code'):
-		filters['item_code'] = report_filters.get('item_code')
+	if report_filters.get("item_code"):
+		filters["item_code"] = report_filters.get("item_code")
 
-	if report_filters.get('from_date') and report_filters.get('to_date'):
-		filters['posting_date'] = ('between', [report_filters.get('from_date'), report_filters.get('to_date')])
+	if report_filters.get("from_date") and report_filters.get("to_date"):
+		filters["posting_date"] = (
+			"between",
+			[report_filters.get("from_date"), report_filters.get("to_date")],
+		)
 
-	return frappe.get_all('Stock Ledger Entry', fields = fields, filters = filters,
-		order_by = 'timestamp(posting_date, posting_time) asc, creation asc')
+	return frappe.get_all(
+		"Stock Ledger Entry",
+		fields=fields,
+		filters=filters,
+		order_by="timestamp(posting_date, posting_time) asc, creation asc",
+	)
+
 
 def get_columns():
-	return [{
-		'label': _('Company'),
-		'fieldtype': 'Link',
-		'fieldname': 'company',
-		'options': 'Company',
-		'width': 120
-	}, {
-		'label': _('Id'),
-		'fieldtype': 'Link',
-		'fieldname': 'name',
-		'options': 'Stock Ledger Entry',
-		'width': 120
-	}, {
-		'label': _('Posting Date'),
-		'fieldtype': 'Date',
-		'fieldname': 'posting_date',
-		'width': 90
-	}, {
-		'label': _('Posting Time'),
-		'fieldtype': 'Time',
-		'fieldname': 'posting_time',
-		'width': 90
-	}, {
-		'label': _('Voucher Type'),
-		'fieldtype': 'Link',
-		'fieldname': 'voucher_type',
-		'options': 'DocType',
-		'width': 100
-	}, {
-		'label': _('Voucher No'),
-		'fieldtype': 'Dynamic Link',
-		'fieldname': 'voucher_no',
-		'options': 'voucher_type',
-		'width': 110
-	}, {
-		'label': _('Item Code'),
-		'fieldtype': 'Link',
-		'fieldname': 'item_code',
-		'options': 'Item',
-		'width': 120
-	}, {
-		'label': _('Warehouse'),
-		'fieldtype': 'Link',
-		'fieldname': 'warehouse',
-		'options': 'Warehouse',
-		'width': 120
-	}, {
-		'label': _('Serial No'),
-		'fieldtype': 'Link',
-		'fieldname': 'serial_no',
-		'options': 'Serial No',
-		'width': 100
-	}, {
-		'label': _('Qty'),
-		'fieldtype': 'Float',
-		'fieldname': 'qty',
-		'width': 80
-	}, {
-		'label': _('Valuation Rate (In / Out)'),
-		'fieldtype': 'Currency',
-		'fieldname': 'valuation_rate',
-		'width': 110
-	}]
+	return [
+		{
+			"label": _("Company"),
+			"fieldtype": "Link",
+			"fieldname": "company",
+			"options": "Company",
+			"width": 120,
+		},
+		{
+			"label": _("Id"),
+			"fieldtype": "Link",
+			"fieldname": "name",
+			"options": "Stock Ledger Entry",
+			"width": 120,
+		},
+		{"label": _("Posting Date"), "fieldtype": "Date", "fieldname": "posting_date", "width": 90},
+		{"label": _("Posting Time"), "fieldtype": "Time", "fieldname": "posting_time", "width": 90},
+		{
+			"label": _("Voucher Type"),
+			"fieldtype": "Link",
+			"fieldname": "voucher_type",
+			"options": "DocType",
+			"width": 100,
+		},
+		{
+			"label": _("Voucher No"),
+			"fieldtype": "Dynamic Link",
+			"fieldname": "voucher_no",
+			"options": "voucher_type",
+			"width": 110,
+		},
+		{
+			"label": _("Item Code"),
+			"fieldtype": "Link",
+			"fieldname": "item_code",
+			"options": "Item",
+			"width": 120,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldtype": "Link",
+			"fieldname": "warehouse",
+			"options": "Warehouse",
+			"width": 120,
+		},
+		{
+			"label": _("Serial No"),
+			"fieldtype": "Link",
+			"fieldname": "serial_no",
+			"options": "Serial No",
+			"width": 100,
+		},
+		{"label": _("Qty"), "fieldtype": "Float", "fieldname": "qty", "width": 80},
+		{
+			"label": _("Valuation Rate (In / Out)"),
+			"fieldtype": "Currency",
+			"fieldname": "valuation_rate",
+			"width": 110,
+		},
+	]
diff --git a/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py b/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
index 28e6cb2..23e3c8a 100644
--- a/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
+++ b/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
@@ -13,14 +13,18 @@
 
 def execute(filters=None):
 	if not erpnext.is_perpetual_inventory_enabled(filters.company):
-		frappe.throw(_("Perpetual inventory required for the company {0} to view this report.")
-			.format(filters.company))
+		frappe.throw(
+			_("Perpetual inventory required for the company {0} to view this report.").format(
+				filters.company
+			)
+		)
 
 	data = get_data(filters)
 	columns = get_columns(filters)
 
 	return columns, data
 
+
 def get_unsync_date(filters):
 	date = filters.from_date
 	if not date:
@@ -31,14 +35,16 @@
 		return
 
 	while getdate(date) < getdate(today()):
-		account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(posting_date=date,
-			company=filters.company, account = filters.account)
+		account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(
+			posting_date=date, company=filters.company, account=filters.account
+		)
 
 		if abs(account_bal - stock_bal) > 0.1:
 			return date
 
 		date = add_days(date, 1)
 
+
 def get_data(report_filters):
 	from_date = get_unsync_date(report_filters)
 
@@ -48,7 +54,8 @@
 	result = []
 
 	voucher_wise_dict = {}
-	data = frappe.db.sql('''
+	data = frappe.db.sql(
+		"""
 			SELECT
 				name, posting_date, posting_time, voucher_type, voucher_no,
 				stock_value_difference, stock_value, warehouse, item_code
@@ -59,14 +66,19 @@
 				= %s and company = %s
 				and is_cancelled = 0
 			ORDER BY timestamp(posting_date, posting_time) asc, creation asc
-		''', (from_date, report_filters.company), as_dict=1)
+		""",
+		(from_date, report_filters.company),
+		as_dict=1,
+	)
 
 	for d in data:
 		voucher_wise_dict.setdefault((d.item_code, d.warehouse), []).append(d)
 
 	closing_date = add_days(from_date, -1)
 	for key, stock_data in voucher_wise_dict.items():
-		prev_stock_value = get_stock_value_on(posting_date = closing_date, item_code=key[0], warehouse =key[1])
+		prev_stock_value = get_stock_value_on(
+			posting_date=closing_date, item_code=key[0], warehouse=key[1]
+		)
 		for data in stock_data:
 			expected_stock_value = prev_stock_value + data.stock_value_difference
 			if abs(data.stock_value - expected_stock_value) > 0.1:
@@ -76,6 +88,7 @@
 
 	return result
 
+
 def get_columns(filters):
 	return [
 		{
@@ -83,60 +96,43 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Stock Ledger Entry",
-			"width": "80"
+			"width": "80",
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date"
-		},
-		{
-			"label": _("Posting Time"),
-			"fieldname": "posting_time",
-			"fieldtype": "Time"
-		},
-		{
-			"label": _("Voucher Type"),
-			"fieldname": "voucher_type",
-			"width": "110"
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date"},
+		{"label": _("Posting Time"), "fieldname": "posting_time", "fieldtype": "Time"},
+		{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": "110"},
 		{
 			"label": _("Voucher No"),
 			"fieldname": "voucher_no",
 			"fieldtype": "Dynamic Link",
 			"options": "voucher_type",
-			"width": "110"
+			"width": "110",
 		},
 		{
 			"label": _("Item Code"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": "110"
+			"width": "110",
 		},
 		{
 			"label": _("Warehouse"),
 			"fieldname": "warehouse",
 			"fieldtype": "Link",
 			"options": "Warehouse",
-			"width": "110"
+			"width": "110",
 		},
 		{
 			"label": _("Expected Stock Value"),
 			"fieldname": "expected_stock_value",
 			"fieldtype": "Currency",
-			"width": "150"
+			"width": "150",
 		},
-		{
-			"label": _("Stock Value"),
-			"fieldname": "stock_value",
-			"fieldtype": "Currency",
-			"width": "120"
-		},
+		{"label": _("Stock Value"), "fieldname": "stock_value", "fieldtype": "Currency", "width": "120"},
 		{
 			"label": _("Difference Value"),
 			"fieldname": "difference_value",
 			"fieldtype": "Currency",
-			"width": "150"
-		}
+			"width": "150",
+		},
 	]
diff --git a/erpnext/stock/report/item_price_stock/item_price_stock.py b/erpnext/stock/report/item_price_stock/item_price_stock.py
index 65af9f5..15218e6 100644
--- a/erpnext/stock/report/item_price_stock/item_price_stock.py
+++ b/erpnext/stock/report/item_price_stock/item_price_stock.py
@@ -7,10 +7,11 @@
 
 def execute(filters=None):
 	columns, data = [], []
-	columns=get_columns()
-	data=get_data(filters,columns)
+	columns = get_columns()
+	data = get_data(filters, columns)
 	return columns, data
 
+
 def get_columns():
 	return [
 		{
@@ -18,77 +19,64 @@
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("Brand"),
-			"fieldname": "brand",
-			"fieldtype": "Data",
-			"width": 100
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 120},
+		{"label": _("Brand"), "fieldname": "brand", "fieldtype": "Data", "width": 100},
 		{
 			"label": _("Warehouse"),
 			"fieldname": "warehouse",
 			"fieldtype": "Link",
 			"options": "Warehouse",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Stock Available"),
 			"fieldname": "stock_available",
 			"fieldtype": "Float",
-			"width": 120
+			"width": 120,
 		},
 		{
 			"label": _("Buying Price List"),
 			"fieldname": "buying_price_list",
 			"fieldtype": "Link",
 			"options": "Price List",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Buying Rate"),
-			"fieldname": "buying_rate",
-			"fieldtype": "Currency",
-			"width": 120
-		},
+		{"label": _("Buying Rate"), "fieldname": "buying_rate", "fieldtype": "Currency", "width": 120},
 		{
 			"label": _("Selling Price List"),
 			"fieldname": "selling_price_list",
 			"fieldtype": "Link",
 			"options": "Price List",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Selling Rate"),
-			"fieldname": "selling_rate",
-			"fieldtype": "Currency",
-			"width": 120
-		}
+		{"label": _("Selling Rate"), "fieldname": "selling_rate", "fieldtype": "Currency", "width": 120},
 	]
 
+
 def get_data(filters, columns):
 	item_price_qty_data = []
 	item_price_qty_data = get_item_price_qty_data(filters)
 	return item_price_qty_data
 
+
 def get_item_price_qty_data(filters):
 	conditions = ""
 	if filters.get("item_code"):
 		conditions += "where a.item_code=%(item_code)s"
 
-	item_results = frappe.db.sql("""select a.item_code, a.item_name, a.name as price_list_name,
+	item_results = frappe.db.sql(
+		"""select a.item_code, a.item_name, a.name as price_list_name,
 		a.brand as brand, b.warehouse as warehouse, b.actual_qty as actual_qty
 		from `tabItem Price` a left join `tabBin` b
 		ON a.item_code = b.item_code
-		{conditions}"""
-		.format(conditions=conditions), filters, as_dict=1)
+		{conditions}""".format(
+			conditions=conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	price_list_names = list(set(item.price_list_name for item in item_results))
 
@@ -99,15 +87,15 @@
 	if item_results:
 		for item_dict in item_results:
 			data = {
-				'item_code': item_dict.item_code,
-				'item_name': item_dict.item_name,
-				'brand': item_dict.brand,
-				'warehouse': item_dict.warehouse,
-				'stock_available': item_dict.actual_qty or 0,
-				'buying_price_list': "",
-				'buying_rate': 0.0,
-				'selling_price_list': "",
-				'selling_rate': 0.0
+				"item_code": item_dict.item_code,
+				"item_name": item_dict.item_name,
+				"brand": item_dict.brand,
+				"warehouse": item_dict.warehouse,
+				"stock_available": item_dict.actual_qty or 0,
+				"buying_price_list": "",
+				"buying_rate": 0.0,
+				"selling_price_list": "",
+				"selling_rate": 0.0,
 			}
 
 			price_list = item_dict["price_list_name"]
@@ -122,6 +110,7 @@
 
 	return result
 
+
 def get_price_map(price_list_names, buying=0, selling=0):
 	price_map = {}
 
@@ -137,14 +126,12 @@
 	else:
 		filters["selling"] = 1
 
-	pricing_details = frappe.get_all("Item Price",
-		fields = ["name", "price_list", "price_list_rate"], filters=filters)
+	pricing_details = frappe.get_all(
+		"Item Price", fields=["name", "price_list", "price_list_rate"], filters=filters
+	)
 
 	for d in pricing_details:
 		name = d["name"]
-		price_map[name] = {
-			price_list_key :d["price_list"],
-			rate_key :d["price_list_rate"]
-		}
+		price_map[name] = {price_list_key: d["price_list"], rate_key: d["price_list_rate"]}
 
 	return price_map
diff --git a/erpnext/stock/report/item_prices/item_prices.py b/erpnext/stock/report/item_prices/item_prices.py
index 0d0e8d2..87f1a42 100644
--- a/erpnext/stock/report/item_prices/item_prices.py
+++ b/erpnext/stock/report/item_prices/item_prices.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	columns = get_columns(filters)
 	conditions = get_condition(filters)
@@ -19,64 +20,95 @@
 	val_rate_map = get_valuation_rate()
 
 	from erpnext.accounts.utils import get_currency_precision
+
 	precision = get_currency_precision() or 2
 	data = []
 	for item in sorted(item_map):
-		data.append([item, item_map[item]["item_name"],item_map[item]["item_group"],
-			item_map[item]["brand"], item_map[item]["description"], item_map[item]["stock_uom"],
-			flt(last_purchase_rate.get(item, 0), precision),
-			flt(val_rate_map.get(item, 0), precision),
-			pl.get(item, {}).get("Selling"),
-			pl.get(item, {}).get("Buying"),
-			flt(bom_rate.get(item, 0), precision)
-		])
+		data.append(
+			[
+				item,
+				item_map[item]["item_name"],
+				item_map[item]["item_group"],
+				item_map[item]["brand"],
+				item_map[item]["description"],
+				item_map[item]["stock_uom"],
+				flt(last_purchase_rate.get(item, 0), precision),
+				flt(val_rate_map.get(item, 0), precision),
+				pl.get(item, {}).get("Selling"),
+				pl.get(item, {}).get("Buying"),
+				flt(bom_rate.get(item, 0), precision),
+			]
+		)
 
 	return columns, data
 
+
 def get_columns(filters):
 	"""return columns based on filters"""
 
-	columns = [_("Item") + ":Link/Item:100", _("Item Name") + "::150",_("Item Group") + ":Link/Item Group:125",
-		_("Brand") + "::100", _("Description") + "::150", _("UOM") + ":Link/UOM:80",
-		_("Last Purchase Rate") + ":Currency:90", _("Valuation Rate") + ":Currency:80",	_("Sales Price List") + "::180",
-		_("Purchase Price List") + "::180", _("BOM Rate") + ":Currency:90"]
+	columns = [
+		_("Item") + ":Link/Item:100",
+		_("Item Name") + "::150",
+		_("Item Group") + ":Link/Item Group:125",
+		_("Brand") + "::100",
+		_("Description") + "::150",
+		_("UOM") + ":Link/UOM:80",
+		_("Last Purchase Rate") + ":Currency:90",
+		_("Valuation Rate") + ":Currency:80",
+		_("Sales Price List") + "::180",
+		_("Purchase Price List") + "::180",
+		_("BOM Rate") + ":Currency:90",
+	]
 
 	return columns
 
+
 def get_item_details(conditions):
 	"""returns all items details"""
 
 	item_map = {}
 
-	for i in frappe.db.sql("""select name, item_group, item_name, description,
+	for i in frappe.db.sql(
+		"""select name, item_group, item_name, description,
 		brand, stock_uom from tabItem %s
-		order by item_code, item_group""" % (conditions), as_dict=1):
-			item_map.setdefault(i.name, i)
+		order by item_code, item_group"""
+		% (conditions),
+		as_dict=1,
+	):
+		item_map.setdefault(i.name, i)
 
 	return item_map
 
+
 def get_price_list():
 	"""Get selling & buying price list of every item"""
 
 	rate = {}
 
-	price_list = frappe.db.sql("""select ip.item_code, ip.buying, ip.selling,
+	price_list = frappe.db.sql(
+		"""select ip.item_code, ip.buying, ip.selling,
 		concat(ifnull(cu.symbol,ip.currency), " ", round(ip.price_list_rate,2), " - ", ip.price_list) as price
 		from `tabItem Price` ip, `tabPrice List` pl, `tabCurrency` cu
-		where ip.price_list=pl.name and pl.currency=cu.name and pl.enabled=1""", as_dict=1)
+		where ip.price_list=pl.name and pl.currency=cu.name and pl.enabled=1""",
+		as_dict=1,
+	)
 
 	for j in price_list:
 		if j.price:
-			rate.setdefault(j.item_code, {}).setdefault("Buying" if j.buying else "Selling", []).append(j.price)
+			rate.setdefault(j.item_code, {}).setdefault("Buying" if j.buying else "Selling", []).append(
+				j.price
+			)
 	item_rate_map = {}
 
 	for item in rate:
 		for buying_or_selling in rate[item]:
-			item_rate_map.setdefault(item, {}).setdefault(buying_or_selling,
-				", ".join(rate[item].get(buying_or_selling, [])))
+			item_rate_map.setdefault(item, {}).setdefault(
+				buying_or_selling, ", ".join(rate[item].get(buying_or_selling, []))
+			)
 
 	return item_rate_map
 
+
 def get_last_purchase_rate():
 	item_last_purchase_rate_map = {}
 
@@ -108,29 +140,38 @@
 
 	return item_last_purchase_rate_map
 
+
 def get_item_bom_rate():
 	"""Get BOM rate of an item from BOM"""
 
 	item_bom_map = {}
 
-	for b in frappe.db.sql("""select item, (total_cost/quantity) as bom_rate
-		from `tabBOM` where is_active=1 and is_default=1""", as_dict=1):
-			item_bom_map.setdefault(b.item, flt(b.bom_rate))
+	for b in frappe.db.sql(
+		"""select item, (total_cost/quantity) as bom_rate
+		from `tabBOM` where is_active=1 and is_default=1""",
+		as_dict=1,
+	):
+		item_bom_map.setdefault(b.item, flt(b.bom_rate))
 
 	return item_bom_map
 
+
 def get_valuation_rate():
 	"""Get an average valuation rate of an item from all warehouses"""
 
 	item_val_rate_map = {}
 
-	for d in frappe.db.sql("""select item_code,
+	for d in frappe.db.sql(
+		"""select item_code,
 		sum(actual_qty*valuation_rate)/sum(actual_qty) as val_rate
-		from tabBin where actual_qty > 0 group by item_code""", as_dict=1):
-			item_val_rate_map.setdefault(d.item_code, d.val_rate)
+		from tabBin where actual_qty > 0 group by item_code""",
+		as_dict=1,
+	):
+		item_val_rate_map.setdefault(d.item_code, d.val_rate)
 
 	return item_val_rate_map
 
+
 def get_condition(filters):
 	"""Get Filter Items"""
 
diff --git a/erpnext/stock/report/item_shortage_report/item_shortage_report.py b/erpnext/stock/report/item_shortage_report/item_shortage_report.py
index 30c7614..03a3a6a 100644
--- a/erpnext/stock/report/item_shortage_report/item_shortage_report.py
+++ b/erpnext/stock/report/item_shortage_report/item_shortage_report.py
@@ -18,6 +18,7 @@
 
 	return columns, data, None, chart_data
 
+
 def get_conditions(filters):
 	conditions = ""
 
@@ -28,8 +29,10 @@
 
 	return conditions
 
+
 def get_data(conditions, filters):
-	data = frappe.db.sql("""
+	data = frappe.db.sql(
+		"""
 		SELECT
 			bin.warehouse,
 			bin.item_code,
@@ -51,10 +54,16 @@
 			AND warehouse.name = bin.warehouse
 			AND bin.item_code=item.name
 			{0}
-		ORDER BY bin.projected_qty;""".format(conditions), filters, as_dict=1)
+		ORDER BY bin.projected_qty;""".format(
+			conditions
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return data
 
+
 def get_chart_data(data):
 	labels, datapoints = [], []
 
@@ -67,18 +76,11 @@
 		datapoints = datapoints[:10]
 
 	return {
-		"data": {
-			"labels": labels,
-			"datasets":[
-				{
-					"name": _("Projected Qty"),
-					"values": datapoints
-				}
-			]
-		},
-		"type": "bar"
+		"data": {"labels": labels, "datasets": [{"name": _("Projected Qty"), "values": datapoints}]},
+		"type": "bar",
 	}
 
+
 def get_columns():
 	columns = [
 		{
@@ -86,76 +88,66 @@
 			"fieldname": "warehouse",
 			"fieldtype": "Link",
 			"options": "Warehouse",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Item"),
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"label": _("Actual Quantity"),
 			"fieldname": "actual_qty",
 			"fieldtype": "Float",
 			"width": 120,
-			"convertible": "qty"
+			"convertible": "qty",
 		},
 		{
 			"label": _("Ordered Quantity"),
 			"fieldname": "ordered_qty",
 			"fieldtype": "Float",
 			"width": 120,
-			"convertible": "qty"
+			"convertible": "qty",
 		},
 		{
 			"label": _("Planned Quantity"),
 			"fieldname": "planned_qty",
 			"fieldtype": "Float",
 			"width": 120,
-			"convertible": "qty"
+			"convertible": "qty",
 		},
 		{
 			"label": _("Reserved Quantity"),
 			"fieldname": "reserved_qty",
 			"fieldtype": "Float",
 			"width": 120,
-			"convertible": "qty"
+			"convertible": "qty",
 		},
 		{
 			"label": _("Reserved Quantity for Production"),
 			"fieldname": "reserved_qty_for_production",
 			"fieldtype": "Float",
 			"width": 120,
-			"convertible": "qty"
+			"convertible": "qty",
 		},
 		{
 			"label": _("Projected Quantity"),
 			"fieldname": "projected_qty",
 			"fieldtype": "Float",
 			"width": 120,
-			"convertible": "qty"
+			"convertible": "qty",
 		},
 		{
 			"label": _("Company"),
 			"fieldname": "company",
 			"fieldtype": "Link",
 			"options": "Company",
-			"width": 120
+			"width": 120,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Description"),
-			"fieldname": "description",
-			"fieldtype": "Data",
-			"width": 120
-		}
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
+		{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 120},
 	]
 
 	return columns
diff --git a/erpnext/stock/report/item_variant_details/item_variant_details.py b/erpnext/stock/report/item_variant_details/item_variant_details.py
index 10cef70..d1bf220 100644
--- a/erpnext/stock/report/item_variant_details/item_variant_details.py
+++ b/erpnext/stock/report/item_variant_details/item_variant_details.py
@@ -11,25 +11,21 @@
 	data = get_data(filters.item)
 	return columns, data
 
+
 def get_data(item):
 	if not item:
 		return []
 	item_dicts = []
 
 	variant_results = frappe.db.get_all(
-		"Item",
-		fields=["name"],
-		filters={
-			"variant_of": ["=", item],
-			"disabled": 0
-		}
+		"Item", fields=["name"], filters={"variant_of": ["=", item], "disabled": 0}
 	)
 
 	if not variant_results:
 		frappe.msgprint(_("There aren't any item variants for the selected item"))
 		return []
 	else:
-		variant_list = [variant['name'] for variant in variant_results]
+		variant_list = [variant["name"] for variant in variant_results]
 
 	order_count_map = get_open_sales_orders_count(variant_list)
 	stock_details_map = get_stock_details_map(variant_list)
@@ -40,15 +36,13 @@
 	attributes = frappe.db.get_all(
 		"Item Variant Attribute",
 		fields=["attribute"],
-		filters={
-			"parent": ["in", variant_list]
-		},
-		group_by="attribute"
+		filters={"parent": ["in", variant_list]},
+		group_by="attribute",
 	)
 	attribute_list = [row.get("attribute") for row in attributes]
 
 	# Prepare dicts
-	variant_dicts = [{"variant_name": d['name']} for d in variant_results]
+	variant_dicts = [{"variant_name": d["name"]} for d in variant_results]
 	for item_dict in variant_dicts:
 		name = item_dict.get("variant_name")
 
@@ -72,73 +66,66 @@
 
 	return item_dicts
 
+
 def get_columns(item):
-	columns = [{
-		"fieldname": "variant_name",
-		"label": "Variant",
-		"fieldtype": "Link",
-		"options": "Item",
-		"width": 200
-	}]
+	columns = [
+		{
+			"fieldname": "variant_name",
+			"label": "Variant",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 200,
+		}
+	]
 
 	item_doc = frappe.get_doc("Item", item)
 
 	for entry in item_doc.attributes:
-		columns.append({
-			"fieldname": frappe.scrub(entry.attribute),
-			"label": entry.attribute,
-			"fieldtype": "Data",
-			"width": 100
-		})
+		columns.append(
+			{
+				"fieldname": frappe.scrub(entry.attribute),
+				"label": entry.attribute,
+				"fieldtype": "Data",
+				"width": 100,
+			}
+		)
 
 	additional_columns = [
 		{
 			"fieldname": "avg_buying_price_list_rate",
 			"label": _("Avg. Buying Price List Rate"),
 			"fieldtype": "Currency",
-			"width": 150
+			"width": 150,
 		},
 		{
 			"fieldname": "avg_selling_price_list_rate",
 			"label": _("Avg. Selling Price List Rate"),
 			"fieldtype": "Currency",
-			"width": 150
+			"width": 150,
 		},
-		{
-			"fieldname": "current_stock",
-			"label": _("Current Stock"),
-			"fieldtype": "Float",
-			"width": 120
-		},
-		{
-			"fieldname": "in_production",
-			"label": _("In Production"),
-			"fieldtype": "Float",
-			"width": 150
-		},
+		{"fieldname": "current_stock", "label": _("Current Stock"), "fieldtype": "Float", "width": 120},
+		{"fieldname": "in_production", "label": _("In Production"), "fieldtype": "Float", "width": 150},
 		{
 			"fieldname": "open_orders",
 			"label": _("Open Sales Orders"),
 			"fieldtype": "Float",
-			"width": 150
-		}
+			"width": 150,
+		},
 	]
 	columns.extend(additional_columns)
 
 	return columns
 
+
 def get_open_sales_orders_count(variants_list):
 	open_sales_orders = frappe.db.get_list(
 		"Sales Order",
-		fields=[
-			"name",
-			"`tabSales Order Item`.item_code"
-		],
+		fields=["name", "`tabSales Order Item`.item_code"],
 		filters=[
 			["Sales Order", "docstatus", "=", 1],
-			["Sales Order Item", "item_code", "in", variants_list]
+			["Sales Order Item", "item_code", "in", variants_list],
 		],
-		distinct=1
+		distinct=1,
 	)
 
 	order_count_map = {}
@@ -151,6 +138,7 @@
 
 	return order_count_map
 
+
 def get_stock_details_map(variant_list):
 	stock_details = frappe.db.get_all(
 		"Bin",
@@ -160,10 +148,8 @@
 			"sum(projected_qty) as projected_qty",
 			"item_code",
 		],
-		filters={
-			"item_code": ["in", variant_list]
-		},
-		group_by="item_code"
+		filters={"item_code": ["in", variant_list]},
+		group_by="item_code",
 	)
 
 	stock_details_map = {}
@@ -171,11 +157,12 @@
 		name = row.get("item_code")
 		stock_details_map[name] = {
 			"Inventory": row.get("actual_qty"),
-			"In Production": row.get("planned_qty")
+			"In Production": row.get("planned_qty"),
 		}
 
 	return stock_details_map
 
+
 def get_buying_price_map(variant_list):
 	buying = frappe.db.get_all(
 		"Item Price",
@@ -183,11 +170,8 @@
 			"avg(price_list_rate) as avg_rate",
 			"item_code",
 		],
-		filters={
-			"item_code": ["in", variant_list],
-			"buying": 1
-		},
-		group_by="item_code"
+		filters={"item_code": ["in", variant_list], "buying": 1},
+		group_by="item_code",
 	)
 
 	buying_price_map = {}
@@ -196,6 +180,7 @@
 
 	return buying_price_map
 
+
 def get_selling_price_map(variant_list):
 	selling = frappe.db.get_all(
 		"Item Price",
@@ -203,11 +188,8 @@
 			"avg(price_list_rate) as avg_rate",
 			"item_code",
 		],
-		filters={
-			"item_code": ["in", variant_list],
-			"selling": 1
-		},
-		group_by="item_code"
+		filters={"item_code": ["in", variant_list], "selling": 1},
+		group_by="item_code",
 	)
 
 	selling_price_map = {}
@@ -216,17 +198,12 @@
 
 	return selling_price_map
 
+
 def get_attribute_values_map(variant_list):
 	attribute_list = frappe.db.get_all(
 		"Item Variant Attribute",
-		fields=[
-			"attribute",
-			"attribute_value",
-			"parent"
-		],
-		filters={
-			"parent": ["in", variant_list]
-		}
+		fields=["attribute", "attribute_value", "parent"],
+		filters={"parent": ["in", variant_list]},
 	)
 
 	attr_val_map = {}
diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
index cfa1e47..f308e9e 100644
--- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
+++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
@@ -7,13 +7,14 @@
 
 
 def execute(filters=None):
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 	float_precision = frappe.db.get_default("float_precision")
 
 	condition = get_condition(filters)
 
 	avg_daily_outgoing = 0
-	diff = ((getdate(filters.get("to_date")) - getdate(filters.get("from_date"))).days)+1
+	diff = ((getdate(filters.get("to_date")) - getdate(filters.get("from_date"))).days) + 1
 	if diff <= 0:
 		frappe.throw(_("'From Date' must be after 'To Date'"))
 
@@ -24,42 +25,72 @@
 
 	data = []
 	for item in items:
-		total_outgoing = flt(consumed_item_map.get(item.name, 0)) + flt(delivered_item_map.get(item.name,0))
+		total_outgoing = flt(consumed_item_map.get(item.name, 0)) + flt(
+			delivered_item_map.get(item.name, 0)
+		)
 		avg_daily_outgoing = flt(total_outgoing / diff, float_precision)
 		reorder_level = (avg_daily_outgoing * flt(item.lead_time_days)) + flt(item.safety_stock)
 
-		data.append([item.name, item.item_name, item.item_group, item.brand, item.description,
-			item.safety_stock, item.lead_time_days, consumed_item_map.get(item.name, 0),
-			delivered_item_map.get(item.name,0), total_outgoing, avg_daily_outgoing, reorder_level])
+		data.append(
+			[
+				item.name,
+				item.item_name,
+				item.item_group,
+				item.brand,
+				item.description,
+				item.safety_stock,
+				item.lead_time_days,
+				consumed_item_map.get(item.name, 0),
+				delivered_item_map.get(item.name, 0),
+				total_outgoing,
+				avg_daily_outgoing,
+				reorder_level,
+			]
+		)
 
-	return columns , data
+	return columns, data
+
 
 def get_columns():
-	return[
-			_("Item") + ":Link/Item:120", _("Item Name") + ":Data:120", _("Item Group") + ":Link/Item Group:100",
-			_("Brand") + ":Link/Brand:100", _("Description") + "::160",
-			_("Safety Stock") + ":Float:160", _("Lead Time Days") + ":Float:120", _("Consumed") + ":Float:120",
-			_("Delivered") + ":Float:120", _("Total Outgoing") + ":Float:120", _("Avg Daily Outgoing") + ":Float:160",
-			_("Reorder Level") + ":Float:120"
+	return [
+		_("Item") + ":Link/Item:120",
+		_("Item Name") + ":Data:120",
+		_("Item Group") + ":Link/Item Group:100",
+		_("Brand") + ":Link/Brand:100",
+		_("Description") + "::160",
+		_("Safety Stock") + ":Float:160",
+		_("Lead Time Days") + ":Float:120",
+		_("Consumed") + ":Float:120",
+		_("Delivered") + ":Float:120",
+		_("Total Outgoing") + ":Float:120",
+		_("Avg Daily Outgoing") + ":Float:160",
+		_("Reorder Level") + ":Float:120",
 	]
 
+
 def get_item_info(filters):
 	from erpnext.stock.report.stock_ledger.stock_ledger import get_item_group_condition
+
 	conditions = [get_item_group_condition(filters.get("item_group"))]
 	if filters.get("brand"):
 		conditions.append("item.brand=%(brand)s")
 	conditions.append("is_stock_item = 1")
 
-	return frappe.db.sql("""select name, item_name, description, brand, item_group,
-		safety_stock, lead_time_days from `tabItem` item where {}"""
-		.format(" and ".join(conditions)), filters, as_dict=1)
+	return frappe.db.sql(
+		"""select name, item_name, description, brand, item_group,
+		safety_stock, lead_time_days from `tabItem` item where {}""".format(
+			" and ".join(conditions)
+		),
+		filters,
+		as_dict=1,
+	)
 
 
 def get_consumed_items(condition):
 	purpose_to_exclude = [
 		"Material Transfer for Manufacture",
 		"Material Transfer",
-		"Send to Subcontractor"
+		"Send to Subcontractor",
 	]
 
 	condition += """
@@ -67,10 +98,13 @@
 			purpose is NULL
 			or purpose not in ({})
 		)
-	""".format(', '.join(f"'{p}'" for p in purpose_to_exclude))
+	""".format(
+		", ".join(f"'{p}'" for p in purpose_to_exclude)
+	)
 	condition = condition.replace("posting_date", "sle.posting_date")
 
-	consumed_items = frappe.db.sql("""
+	consumed_items = frappe.db.sql(
+		"""
 		select item_code, abs(sum(actual_qty)) as consumed_qty
 		from `tabStock Ledger Entry` as sle left join `tabStock Entry` as se
 			on sle.voucher_no = se.name
@@ -79,22 +113,34 @@
 			and is_cancelled = 0
 			and voucher_type not in ('Delivery Note', 'Sales Invoice')
 			%s
-		group by item_code""" % condition, as_dict=1)
+		group by item_code"""
+		% condition,
+		as_dict=1,
+	)
 
-	consumed_items_map = {item.item_code : item.consumed_qty for item in consumed_items}
+	consumed_items_map = {item.item_code: item.consumed_qty for item in consumed_items}
 	return consumed_items_map
 
+
 def get_delivered_items(condition):
-	dn_items = frappe.db.sql("""select dn_item.item_code, sum(dn_item.stock_qty) as dn_qty
+	dn_items = frappe.db.sql(
+		"""select dn_item.item_code, sum(dn_item.stock_qty) as dn_qty
 		from `tabDelivery Note` dn, `tabDelivery Note Item` dn_item
 		where dn.name = dn_item.parent and dn.docstatus = 1 %s
-		group by dn_item.item_code""" % (condition), as_dict=1)
+		group by dn_item.item_code"""
+		% (condition),
+		as_dict=1,
+	)
 
-	si_items = frappe.db.sql("""select si_item.item_code, sum(si_item.stock_qty) as si_qty
+	si_items = frappe.db.sql(
+		"""select si_item.item_code, sum(si_item.stock_qty) as si_qty
 		from `tabSales Invoice` si, `tabSales Invoice Item` si_item
 		where si.name = si_item.parent and si.docstatus = 1 and
 		si.update_stock = 1 %s
-		group by si_item.item_code""" % (condition), as_dict=1)
+		group by si_item.item_code"""
+		% (condition),
+		as_dict=1,
+	)
 
 	dn_item_map = {}
 	for item in dn_items:
@@ -105,10 +151,14 @@
 
 	return dn_item_map
 
+
 def get_condition(filters):
 	conditions = ""
 	if filters.get("from_date") and filters.get("to_date"):
-		conditions += " and posting_date between '%s' and '%s'" % (filters["from_date"],filters["to_date"])
+		conditions += " and posting_date between '%s' and '%s'" % (
+			filters["from_date"],
+			filters["to_date"],
+		)
 	else:
 		frappe.throw(_("From and To dates required"))
 	return conditions
diff --git a/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py b/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py
index d9adced..854875a 100644
--- a/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py
+++ b/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py
@@ -44,7 +44,9 @@
 
 			child_rows = []
 			for child_item_detail in required_items:
-				child_item_balance = stock_balance.get(child_item_detail.item_code, frappe._dict()).get(warehouse, frappe._dict())
+				child_item_balance = stock_balance.get(child_item_detail.item_code, frappe._dict()).get(
+					warehouse, frappe._dict()
+				)
 				child_row = {
 					"indent": 1,
 					"parent_item": parent_item,
@@ -73,16 +75,46 @@
 
 def get_columns():
 	columns = [
-		{"fieldname": "item_code", "label": _("Item"), "fieldtype": "Link", "options": "Item", "width": 300},
-		{"fieldname": "warehouse", "label": _("Warehouse"), "fieldtype": "Link", "options": "Warehouse", "width": 100},
+		{
+			"fieldname": "item_code",
+			"label": _("Item"),
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 300,
+		},
+		{
+			"fieldname": "warehouse",
+			"label": _("Warehouse"),
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 100,
+		},
 		{"fieldname": "uom", "label": _("UOM"), "fieldtype": "Link", "options": "UOM", "width": 70},
 		{"fieldname": "bundle_qty", "label": _("Bundle Qty"), "fieldtype": "Float", "width": 100},
 		{"fieldname": "actual_qty", "label": _("Actual Qty"), "fieldtype": "Float", "width": 100},
 		{"fieldname": "minimum_qty", "label": _("Minimum Qty"), "fieldtype": "Float", "width": 100},
-		{"fieldname": "item_group", "label": _("Item Group"), "fieldtype": "Link", "options": "Item Group", "width": 100},
-		{"fieldname": "brand", "label": _("Brand"), "fieldtype": "Link", "options": "Brand", "width": 100},
+		{
+			"fieldname": "item_group",
+			"label": _("Item Group"),
+			"fieldtype": "Link",
+			"options": "Item Group",
+			"width": 100,
+		},
+		{
+			"fieldname": "brand",
+			"label": _("Brand"),
+			"fieldtype": "Link",
+			"options": "Brand",
+			"width": 100,
+		},
 		{"fieldname": "description", "label": _("Description"), "width": 140},
-		{"fieldname": "company", "label": _("Company"), "fieldtype": "Link", "options": "Company", "width": 100}
+		{
+			"fieldname": "company",
+			"label": _("Company"),
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 100,
+		},
 	]
 	return columns
 
@@ -92,12 +124,18 @@
 	item_details = frappe._dict()
 
 	conditions = get_parent_item_conditions(filters)
-	parent_item_details = frappe.db.sql("""
+	parent_item_details = frappe.db.sql(
+		"""
 		select item.name as item_code, item.item_name, pb.description, item.item_group, item.brand, item.stock_uom
 		from `tabItem` item
 		inner join `tabProduct Bundle` pb on pb.new_item_code = item.name
 		where ifnull(item.disabled, 0) = 0 {0}
-	""".format(conditions), filters, as_dict=1)  # nosec
+	""".format(
+			conditions
+		),
+		filters,
+		as_dict=1,
+	)  # nosec
 
 	parent_items = []
 	for d in parent_item_details:
@@ -105,7 +143,8 @@
 		item_details[d.item_code] = d
 
 	if parent_items:
-		child_item_details = frappe.db.sql("""
+		child_item_details = frappe.db.sql(
+			"""
 			select
 				pb.new_item_code as parent_item, pbi.item_code, item.item_name, pbi.description, item.item_group, item.brand,
 				item.stock_uom, pbi.uom, pbi.qty
@@ -113,7 +152,12 @@
 			inner join `tabProduct Bundle` pb on pb.name = pbi.parent
 			inner join `tabItem` item on item.name = pbi.item_code
 			where pb.new_item_code in ({0})
-		""".format(", ".join(["%s"] * len(parent_items))), parent_items, as_dict=1)  # nosec
+		""".format(
+				", ".join(["%s"] * len(parent_items))
+			),
+			parent_items,
+			as_dict=1,
+		)  # nosec
 	else:
 		child_item_details = []
 
@@ -140,12 +184,14 @@
 	if not items:
 		return []
 
-	item_conditions_sql = ' and sle.item_code in ({})' \
-		.format(', '.join(frappe.db.escape(i) for i in items))
+	item_conditions_sql = " and sle.item_code in ({})".format(
+		", ".join(frappe.db.escape(i) for i in items)
+	)
 
 	conditions = get_sle_conditions(filters)
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			sle.item_code, sle.warehouse, sle.qty_after_transaction, sle.company
 		from
@@ -153,7 +199,10 @@
 		left join `tabStock Ledger Entry` sle2 on
 			sle.item_code = sle2.item_code and sle.warehouse = sle2.warehouse
 			and (sle.posting_date, sle.posting_time, sle.name) < (sle2.posting_date, sle2.posting_time, sle2.name)
-		where sle2.name is null and sle.docstatus < 2 %s %s""" % (item_conditions_sql, conditions), as_dict=1)  # nosec
+		where sle2.name is null and sle.docstatus < 2 %s %s"""
+		% (item_conditions_sql, conditions),
+		as_dict=1,
+	)  # nosec
 
 
 def get_parent_item_conditions(filters):
@@ -179,9 +228,14 @@
 	conditions += " and sle.posting_date <= %s" % frappe.db.escape(filters.get("date"))
 
 	if filters.get("warehouse"):
-		warehouse_details = frappe.db.get_value("Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1)
+		warehouse_details = frappe.db.get_value(
+			"Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1
+		)
 		if warehouse_details:
-			conditions += " and exists (select name from `tabWarehouse` wh \
-				where wh.lft >= %s and wh.rgt <= %s and sle.warehouse = wh.name)" % (warehouse_details.lft, warehouse_details.rgt)  # nosec
+			conditions += (
+				" and exists (select name from `tabWarehouse` wh \
+				where wh.lft >= %s and wh.rgt <= %s and sle.warehouse = wh.name)"
+				% (warehouse_details.lft, warehouse_details.rgt)
+			)  # nosec
 
 	return conditions
diff --git a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
index 9738442..fe2d55a 100644
--- a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
+++ b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
@@ -8,7 +8,8 @@
 
 
 def execute(filters=None):
-	if not filters: filters ={}
+	if not filters:
+		filters = {}
 	data = []
 	conditions = get_columns(filters, "Purchase Receipt")
 	data = get_data(filters, conditions)
@@ -17,6 +18,7 @@
 
 	return conditions["columns"], data, None, chart_data
 
+
 def get_chart_data(data, filters):
 	if not data:
 		return []
@@ -27,7 +29,7 @@
 		# consider only consolidated row
 		data = [row for row in data if row[0]]
 
-	data = sorted(data, key = lambda i: i[-1], reverse=True)
+	data = sorted(data, key=lambda i: i[-1], reverse=True)
 
 	if len(data) > 10:
 		# get top 10 if data too long
@@ -39,14 +41,9 @@
 
 	return {
 		"data": {
-			"labels" : labels,
-			"datasets" : [
-				{
-				"name": _("Total Received Amount"),
-				"values": datapoints
-				}
-			]
+			"labels": labels,
+			"datasets": [{"name": _("Total Received Amount"), "values": datapoints}],
 		},
-		"type" : "bar",
-		"colors":["#5e64ff"]
+		"type": "bar",
+		"colors": ["#5e64ff"],
 	}
diff --git a/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py b/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py
index 80ec848..e439f51 100644
--- a/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py
+++ b/erpnext/stock/report/serial_no_ledger/serial_no_ledger.py
@@ -12,42 +12,43 @@
 	data = get_data(filters)
 	return columns, data
 
+
 def get_columns(filters):
-	columns = [{
-		'label': _('Posting Date'),
-		'fieldtype': 'Date',
-		'fieldname': 'posting_date'
-	}, {
-		'label': _('Posting Time'),
-		'fieldtype': 'Time',
-		'fieldname': 'posting_time'
-	}, {
-		'label': _('Voucher Type'),
-		'fieldtype': 'Link',
-		'fieldname': 'voucher_type',
-		'options': 'DocType',
-		'width': 220
-	}, {
-		'label': _('Voucher No'),
-		'fieldtype': 'Dynamic Link',
-		'fieldname': 'voucher_no',
-		'options': 'voucher_type',
-		'width': 220
-	}, {
-		'label': _('Company'),
-		'fieldtype': 'Link',
-		'fieldname': 'company',
-		'options': 'Company',
-		'width': 220
-	}, {
-		'label': _('Warehouse'),
-		'fieldtype': 'Link',
-		'fieldname': 'warehouse',
-		'options': 'Warehouse',
-		'width': 220
-	}]
+	columns = [
+		{"label": _("Posting Date"), "fieldtype": "Date", "fieldname": "posting_date"},
+		{"label": _("Posting Time"), "fieldtype": "Time", "fieldname": "posting_time"},
+		{
+			"label": _("Voucher Type"),
+			"fieldtype": "Link",
+			"fieldname": "voucher_type",
+			"options": "DocType",
+			"width": 220,
+		},
+		{
+			"label": _("Voucher No"),
+			"fieldtype": "Dynamic Link",
+			"fieldname": "voucher_no",
+			"options": "voucher_type",
+			"width": 220,
+		},
+		{
+			"label": _("Company"),
+			"fieldtype": "Link",
+			"fieldname": "company",
+			"options": "Company",
+			"width": 220,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldtype": "Link",
+			"fieldname": "warehouse",
+			"options": "Warehouse",
+			"width": 220,
+		},
+	]
 
 	return columns
 
+
 def get_data(filters):
-	return get_stock_ledger_entries(filters, '<=', order="asc") or []
+	return get_stock_ledger_entries(filters, "<=", order="asc") or []
diff --git a/erpnext/stock/report/stock_ageing/stock_ageing.py b/erpnext/stock/report/stock_ageing/stock_ageing.py
index 7ca4003..1956238 100644
--- a/erpnext/stock/report/stock_ageing/stock_ageing.py
+++ b/erpnext/stock/report/stock_ageing/stock_ageing.py
@@ -25,6 +25,7 @@
 
 	return columns, data, None, chart_data
 
+
 def format_report_data(filters: Filters, item_details: Dict, to_date: str) -> List[Dict]:
 	"Returns ordered, formatted data with ranges."
 	_func = itemgetter(1)
@@ -38,31 +39,38 @@
 
 		fifo_queue = sorted(filter(_func, item_dict["fifo_queue"]), key=_func)
 
-		if not fifo_queue: continue
+		if not fifo_queue:
+			continue
 
 		average_age = get_average_age(fifo_queue, to_date)
 		earliest_age = date_diff(to_date, fifo_queue[0][1])
 		latest_age = date_diff(to_date, fifo_queue[-1][1])
 		range1, range2, range3, above_range3 = get_range_age(filters, fifo_queue, to_date, item_dict)
 
-		row = [details.name, details.item_name, details.description,
-			details.item_group, details.brand]
+		row = [details.name, details.item_name, details.description, details.item_group, details.brand]
 
 		if filters.get("show_warehouse_wise_stock"):
 			row.append(details.warehouse)
 
-		row.extend([
-			flt(item_dict.get("total_qty"), precision),
-			average_age,
-			range1, range2, range3, above_range3,
-			earliest_age, latest_age,
-			details.stock_uom
-		])
+		row.extend(
+			[
+				flt(item_dict.get("total_qty"), precision),
+				average_age,
+				range1,
+				range2,
+				range3,
+				above_range3,
+				earliest_age,
+				latest_age,
+				details.stock_uom,
+			]
+		)
 
 		data.append(row)
 
 	return data
 
+
 def get_average_age(fifo_queue: List, to_date: str) -> float:
 	batch_age = age_qty = total_qty = 0.0
 	for batch in fifo_queue:
@@ -77,6 +85,7 @@
 
 	return flt(age_qty / total_qty, 2) if total_qty else 0.0
 
+
 def get_range_age(filters: Filters, fifo_queue: List, to_date: str, item_dict: Dict) -> Tuple:
 
 	precision = cint(frappe.db.get_single_value("System Settings", "float_precision", cache=True))
@@ -98,6 +107,7 @@
 
 	return range1, range2, range3, above_range3
 
+
 def get_columns(filters: Filters) -> List[Dict]:
 	range_columns = []
 	setup_ageing_columns(filters, range_columns)
@@ -107,82 +117,55 @@
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 100
+			"width": 100,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 100
-		},
-		{
-			"label": _("Description"),
-			"fieldname": "description",
-			"fieldtype": "Data",
-			"width": 200
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 100},
+		{"label": _("Description"), "fieldname": "description", "fieldtype": "Data", "width": 200},
 		{
 			"label": _("Item Group"),
 			"fieldname": "item_group",
 			"fieldtype": "Link",
 			"options": "Item Group",
-			"width": 100
+			"width": 100,
 		},
 		{
 			"label": _("Brand"),
 			"fieldname": "brand",
 			"fieldtype": "Link",
 			"options": "Brand",
-			"width": 100
-		}]
+			"width": 100,
+		},
+	]
 
 	if filters.get("show_warehouse_wise_stock"):
-		columns +=[{
-			"label": _("Warehouse"),
-			"fieldname": "warehouse",
-			"fieldtype": "Link",
-			"options": "Warehouse",
-			"width": 100
-		}]
+		columns += [
+			{
+				"label": _("Warehouse"),
+				"fieldname": "warehouse",
+				"fieldtype": "Link",
+				"options": "Warehouse",
+				"width": 100,
+			}
+		]
 
-	columns.extend([
-		{
-			"label": _("Available Qty"),
-			"fieldname": "qty",
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"label": _("Average Age"),
-			"fieldname": "average_age",
-			"fieldtype": "Float",
-			"width": 100
-		}])
+	columns.extend(
+		[
+			{"label": _("Available Qty"), "fieldname": "qty", "fieldtype": "Float", "width": 100},
+			{"label": _("Average Age"), "fieldname": "average_age", "fieldtype": "Float", "width": 100},
+		]
+	)
 	columns.extend(range_columns)
-	columns.extend([
-		{
-			"label": _("Earliest"),
-			"fieldname": "earliest",
-			"fieldtype": "Int",
-			"width": 80
-		},
-		{
-			"label": _("Latest"),
-			"fieldname": "latest",
-			"fieldtype": "Int",
-			"width": 80
-		},
-		{
-			"label": _("UOM"),
-			"fieldname": "uom",
-			"fieldtype": "Link",
-			"options": "UOM",
-			"width": 100
-		}
-	])
+	columns.extend(
+		[
+			{"label": _("Earliest"), "fieldname": "earliest", "fieldtype": "Int", "width": 80},
+			{"label": _("Latest"), "fieldname": "latest", "fieldtype": "Int", "width": 80},
+			{"label": _("UOM"), "fieldname": "uom", "fieldtype": "Link", "options": "UOM", "width": 100},
+		]
+	)
 
 	return columns
 
+
 def get_chart_data(data: List, filters: Filters) -> Dict:
 	if not data:
 		return []
@@ -192,7 +175,7 @@
 	if filters.get("show_warehouse_wise_stock"):
 		return {}
 
-	data.sort(key = lambda row: row[6], reverse=True)
+	data.sort(key=lambda row: row[6], reverse=True)
 
 	if len(data) > 10:
 		data = data[:10]
@@ -202,42 +185,33 @@
 		datapoints.append(row[6])
 
 	return {
-		"data" : {
-			"labels": labels,
-			"datasets": [
-				{
-					"name": _("Average Age"),
-					"values": datapoints
-				}
-			]
-		},
-		"type" : "bar"
+		"data": {"labels": labels, "datasets": [{"name": _("Average Age"), "values": datapoints}]},
+		"type": "bar",
 	}
 
+
 def setup_ageing_columns(filters: Filters, range_columns: List):
 	ranges = [
 		f"0 - {filters['range1']}",
 		f"{cint(filters['range1']) + 1} - {cint(filters['range2'])}",
 		f"{cint(filters['range2']) + 1} - {cint(filters['range3'])}",
-		f"{cint(filters['range3']) + 1} - {_('Above')}"
+		f"{cint(filters['range3']) + 1} - {_('Above')}",
 	]
 	for i, label in enumerate(ranges):
-		fieldname = 'range' + str(i+1)
-		add_column(range_columns, label=f"Age ({label})",fieldname=fieldname)
+		fieldname = "range" + str(i + 1)
+		add_column(range_columns, label=f"Age ({label})", fieldname=fieldname)
 
-def add_column(range_columns: List, label:str, fieldname: str, fieldtype: str = 'Float', width: int = 140):
-	range_columns.append(dict(
-		label=label,
-		fieldname=fieldname,
-		fieldtype=fieldtype,
-		width=width
-	))
+
+def add_column(
+	range_columns: List, label: str, fieldname: str, fieldtype: str = "Float", width: int = 140
+):
+	range_columns.append(dict(label=label, fieldname=fieldname, fieldtype=fieldtype, width=width))
 
 
 class FIFOSlots:
 	"Returns FIFO computed slots of inwarded stock as per date."
 
-	def __init__(self, filters: Dict = None , sle: List = None):
+	def __init__(self, filters: Dict = None, sle: List = None):
 		self.item_details = {}
 		self.transferred_item_details = {}
 		self.serial_no_batch_purchase_details = {}
@@ -246,13 +220,13 @@
 
 	def generate(self) -> Dict:
 		"""
-			Returns dict of the foll.g structure:
-			Key = Item A / (Item A, Warehouse A)
-			Key: {
-				'details' -> Dict: ** item details **,
-				'fifo_queue' -> List: ** list of lists containing entries/slots for existing stock,
-					consumed/updated and maintained via FIFO. **
-			}
+		Returns dict of the foll.g structure:
+		Key = Item A / (Item A, Warehouse A)
+		Key: {
+		        'details' -> Dict: ** item details **,
+		        'fifo_queue' -> List: ** list of lists containing entries/slots for existing stock,
+		                consumed/updated and maintained via FIFO. **
+		}
 		"""
 		if self.sle is None:
 			self.sle = self.__get_stock_ledger_entries()
@@ -292,7 +266,9 @@
 
 		return key, fifo_queue, transferred_item_key
 
-	def __compute_incoming_stock(self, row: Dict, fifo_queue: List, transfer_key: Tuple, serial_nos: List):
+	def __compute_incoming_stock(
+		self, row: Dict, fifo_queue: List, transfer_key: Tuple, serial_nos: List
+	):
 		"Update FIFO Queue on inward stock."
 
 		transfer_data = self.transferred_item_details.get(transfer_key)
@@ -318,7 +294,9 @@
 					self.serial_no_batch_purchase_details.setdefault(serial_no, row.posting_date)
 					fifo_queue.append([serial_no, row.posting_date])
 
-	def __compute_outgoing_stock(self, row: Dict, fifo_queue: List, transfer_key: Tuple, serial_nos: List):
+	def __compute_outgoing_stock(
+		self, row: Dict, fifo_queue: List, transfer_key: Tuple, serial_nos: List
+	):
 		"Update FIFO Queue on outward stock."
 		if serial_nos:
 			fifo_queue[:] = [serial_no for serial_no in fifo_queue if serial_no[0] not in serial_nos]
@@ -384,15 +362,13 @@
 	def __aggregate_details_by_item(self, wh_wise_data: Dict) -> Dict:
 		"Aggregate Item-Wh wise data into single Item entry."
 		item_aggregated_data = {}
-		for key,row in wh_wise_data.items():
+		for key, row in wh_wise_data.items():
 			item = key[0]
 			if not item_aggregated_data.get(item):
-				item_aggregated_data.setdefault(item, {
-					"details": frappe._dict(),
-					"fifo_queue": [],
-					"qty_after_transaction": 0.0,
-					"total_qty": 0.0
-				})
+				item_aggregated_data.setdefault(
+					item,
+					{"details": frappe._dict(), "fifo_queue": [], "qty_after_transaction": 0.0, "total_qty": 0.0},
+				)
 			item_row = item_aggregated_data.get(item)
 			item_row["details"].update(row["details"])
 			item_row["fifo_queue"].extend(row["fifo_queue"])
@@ -404,19 +380,29 @@
 
 	def __get_stock_ledger_entries(self) -> List[Dict]:
 		sle = frappe.qb.DocType("Stock Ledger Entry")
-		item = self.__get_item_query() # used as derived table in sle query
+		item = self.__get_item_query()  # used as derived table in sle query
 
 		sle_query = (
-			frappe.qb.from_(sle).from_(item)
+			frappe.qb.from_(sle)
+			.from_(item)
 			.select(
-				item.name, item.item_name, item.item_group,
-				item.brand, item.description,
-				item.stock_uom, item.has_serial_no,
-				sle.actual_qty, sle.posting_date,
-				sle.voucher_type, sle.voucher_no,
-				sle.serial_no, sle.batch_no,
-				sle.qty_after_transaction, sle.warehouse
-			).where(
+				item.name,
+				item.item_name,
+				item.item_group,
+				item.brand,
+				item.description,
+				item.stock_uom,
+				item.has_serial_no,
+				sle.actual_qty,
+				sle.posting_date,
+				sle.voucher_type,
+				sle.voucher_no,
+				sle.serial_no,
+				sle.batch_no,
+				sle.qty_after_transaction,
+				sle.warehouse,
+			)
+			.where(
 				(sle.item_code == item.name)
 				& (sle.company == self.filters.get("company"))
 				& (sle.posting_date <= self.filters.get("to_date"))
@@ -427,9 +413,7 @@
 		if self.filters.get("warehouse"):
 			sle_query = self.__get_warehouse_conditions(sle, sle_query)
 
-		sle_query = sle_query.orderby(
-			sle.posting_date, sle.posting_time, sle.creation, sle.actual_qty
-		)
+		sle_query = sle_query.orderby(sle.posting_date, sle.posting_time, sle.creation, sle.actual_qty)
 
 		return sle_query.run(as_dict=True)
 
@@ -437,8 +421,7 @@
 		item_table = frappe.qb.DocType("Item")
 
 		item = frappe.qb.from_("Item").select(
-			"name", "item_name", "description", "stock_uom",
-			"brand", "item_group", "has_serial_no"
+			"name", "item_name", "description", "stock_uom", "brand", "item_group", "has_serial_no"
 		)
 
 		if self.filters.get("item_code"):
@@ -451,18 +434,13 @@
 
 	def __get_warehouse_conditions(self, sle, sle_query) -> str:
 		warehouse = frappe.qb.DocType("Warehouse")
-		lft, rgt = frappe.db.get_value(
-			"Warehouse",
-			self.filters.get("warehouse"),
-			['lft', 'rgt']
-		)
+		lft, rgt = frappe.db.get_value("Warehouse", self.filters.get("warehouse"), ["lft", "rgt"])
 
 		warehouse_results = (
 			frappe.qb.from_(warehouse)
-			.select("name").where(
-				(warehouse.lft >= lft)
-				& (warehouse.rgt <= rgt)
-			).run()
+			.select("name")
+			.where((warehouse.lft >= lft) & (warehouse.rgt <= rgt))
+			.run()
 		)
 		warehouse_results = [x[0] for x in warehouse_results]
 
diff --git a/erpnext/stock/report/stock_ageing/test_stock_ageing.py b/erpnext/stock/report/stock_ageing/test_stock_ageing.py
index ca963b7..fb36360 100644
--- a/erpnext/stock/report/stock_ageing/test_stock_ageing.py
+++ b/erpnext/stock/report/stock_ageing/test_stock_ageing.py
@@ -10,9 +10,7 @@
 class TestStockAgeing(FrappeTestCase):
 	def setUp(self) -> None:
 		self.filters = frappe._dict(
-			company="_Test Company",
-			to_date="2021-12-10",
-			range1=30, range2=60, range3=90
+			company="_Test Company", to_date="2021-12-10", range1=30, range2=60, range3=90
 		)
 
 	def test_normal_inward_outward_queue(self):
@@ -20,28 +18,37 @@
 		sle = [
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=30, qty_after_transaction=30,
+				actual_qty=30,
+				qty_after_transaction=30,
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=20, qty_after_transaction=50,
+				actual_qty=20,
+				qty_after_transaction=50,
 				warehouse="WH 1",
-				posting_date="2021-12-02", voucher_type="Stock Entry",
+				posting_date="2021-12-02",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-10), qty_after_transaction=40,
+				actual_qty=(-10),
+				qty_after_transaction=40,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="003",
-				has_serial_no=False, serial_no=None
-			)
+				has_serial_no=False,
+				serial_no=None,
+			),
 		]
 
 		slots = FIFOSlots(self.filters, sle).generate()
@@ -58,36 +65,48 @@
 		sle = [
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-30), qty_after_transaction=(-30),
+				actual_qty=(-30),
+				qty_after_transaction=(-30),
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=20, qty_after_transaction=(-10),
+				actual_qty=20,
+				qty_after_transaction=(-10),
 				warehouse="WH 1",
-				posting_date="2021-12-02", voucher_type="Stock Entry",
+				posting_date="2021-12-02",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=20, qty_after_transaction=10,
+				actual_qty=20,
+				qty_after_transaction=10,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="003",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=10, qty_after_transaction=20,
+				actual_qty=10,
+				qty_after_transaction=20,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="004",
-				has_serial_no=False, serial_no=None
-			)
+				has_serial_no=False,
+				serial_no=None,
+			),
 		]
 
 		slots = FIFOSlots(self.filters, sle).generate()
@@ -107,28 +126,37 @@
 		sle = [
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=30, qty_after_transaction=30,
+				actual_qty=30,
+				qty_after_transaction=30,
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=0, qty_after_transaction=50,
+				actual_qty=0,
+				qty_after_transaction=50,
 				warehouse="WH 1",
-				posting_date="2021-12-02", voucher_type="Stock Reconciliation",
+				posting_date="2021-12-02",
+				voucher_type="Stock Reconciliation",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-10), qty_after_transaction=40,
+				actual_qty=(-10),
+				qty_after_transaction=40,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="003",
-				has_serial_no=False, serial_no=None
-			)
+				has_serial_no=False,
+				serial_no=None,
+			),
 		]
 
 		slots = FIFOSlots(self.filters, sle).generate()
@@ -150,28 +178,37 @@
 		sle = [
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=0, qty_after_transaction=1000,
+				actual_qty=0,
+				qty_after_transaction=1000,
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Reconciliation",
+				posting_date="2021-12-01",
+				voucher_type="Stock Reconciliation",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=0, qty_after_transaction=400,
+				actual_qty=0,
+				qty_after_transaction=400,
 				warehouse="WH 1",
-				posting_date="2021-12-02", voucher_type="Stock Reconciliation",
+				posting_date="2021-12-02",
+				voucher_type="Stock Reconciliation",
 				voucher_no="003",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-10), qty_after_transaction=390,
+				actual_qty=(-10),
+				qty_after_transaction=390,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="003",
-				has_serial_no=False, serial_no=None
-			)
+				has_serial_no=False,
+				serial_no=None,
+			),
 		]
 		slots = FIFOSlots(self.filters, sle).generate()
 
@@ -196,32 +233,41 @@
 		sle = [
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=0, qty_after_transaction=1000,
+				actual_qty=0,
+				qty_after_transaction=1000,
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Reconciliation",
+				posting_date="2021-12-01",
+				voucher_type="Stock Reconciliation",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=0, qty_after_transaction=400,
+				actual_qty=0,
+				qty_after_transaction=400,
 				warehouse="WH 2",
-				posting_date="2021-12-02", voucher_type="Stock Reconciliation",
+				posting_date="2021-12-02",
+				voucher_type="Stock Reconciliation",
 				voucher_no="003",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-10), qty_after_transaction=990,
+				actual_qty=(-10),
+				qty_after_transaction=990,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="004",
-				has_serial_no=False, serial_no=None
-			)
+				has_serial_no=False,
+				serial_no=None,
+			),
 		]
 
 		item_wise_slots, item_wh_wise_slots = generate_item_and_item_wh_wise_slots(
-			filters=self.filters,sle=sle
+			filters=self.filters, sle=sle
 		)
 
 		# test without 'show_warehouse_wise_stock'
@@ -234,7 +280,9 @@
 		self.assertEqual(queue[1][0], 400.0)
 
 		# test with 'show_warehouse_wise_stock' checked
-		item_wh_balances = [item_wh_wise_slots.get(i).get("qty_after_transaction") for i in item_wh_wise_slots]
+		item_wh_balances = [
+			item_wh_wise_slots.get(i).get("qty_after_transaction") for i in item_wh_wise_slots
+		]
 		self.assertEqual(sum(item_wh_balances), item_result["qty_after_transaction"])
 
 	def test_repack_entry_same_item_split_rows(self):
@@ -251,37 +299,49 @@
 		Case most likely for batch items. Test time bucket computation.
 		"""
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=500, qty_after_transaction=500,
+				actual_qty=500,
+				qty_after_transaction=500,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=450,
+				actual_qty=(-50),
+				qty_after_transaction=450,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=400,
+				actual_qty=(-50),
+				qty_after_transaction=400,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=100, qty_after_transaction=500,
+				actual_qty=100,
+				qty_after_transaction=500,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 		slots = FIFOSlots(self.filters, sle).generate()
@@ -308,29 +368,38 @@
 		Case most likely for batch items. Test time bucket computation.
 		"""
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=500, qty_after_transaction=500,
+				actual_qty=500,
+				qty_after_transaction=500,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-100), qty_after_transaction=400,
+				actual_qty=(-100),
+				qty_after_transaction=400,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=50, qty_after_transaction=450,
+				actual_qty=50,
+				qty_after_transaction=450,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 		slots = FIFOSlots(self.filters, sle).generate()
@@ -355,37 +424,49 @@
 		Item 1  | 50   | 002 (repack)
 		"""
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=20, qty_after_transaction=20,
+				actual_qty=20,
+				qty_after_transaction=20,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=(-30),
+				actual_qty=(-50),
+				qty_after_transaction=(-30),
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=(-80),
+				actual_qty=(-50),
+				qty_after_transaction=(-80),
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=50, qty_after_transaction=(-30),
+				actual_qty=50,
+				qty_after_transaction=(-30),
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 		fifo_slots = FIFOSlots(self.filters, sle)
@@ -397,7 +478,7 @@
 		self.assertEqual(queue[0][0], -30.0)
 
 		# check transfer bucket
-		transfer_bucket = fifo_slots.transferred_item_details[('002', 'Flask Item', 'WH 1')]
+		transfer_bucket = fifo_slots.transferred_item_details[("002", "Flask Item", "WH 1")]
 		self.assertEqual(transfer_bucket[0][0], 50)
 
 	def test_repack_entry_same_item_overproduce(self):
@@ -413,29 +494,38 @@
 		Case most likely for batch items. Test time bucket computation.
 		"""
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=500, qty_after_transaction=500,
+				actual_qty=500,
+				qty_after_transaction=500,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=450,
+				actual_qty=(-50),
+				qty_after_transaction=450,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=100, qty_after_transaction=550,
+				actual_qty=100,
+				qty_after_transaction=550,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 		slots = FIFOSlots(self.filters, sle).generate()
@@ -461,37 +551,49 @@
 		Item 1  | 50   | 002 (repack)
 		"""
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=20, qty_after_transaction=20,
+				actual_qty=20,
+				qty_after_transaction=20,
 				warehouse="WH 1",
-				posting_date="2021-12-03", voucher_type="Stock Entry",
+				posting_date="2021-12-03",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=(-30),
+				actual_qty=(-50),
+				qty_after_transaction=(-30),
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=50, qty_after_transaction=20,
+				actual_qty=50,
+				qty_after_transaction=20,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 			frappe._dict(
 				name="Flask Item",
-				actual_qty=50, qty_after_transaction=70,
+				actual_qty=50,
+				qty_after_transaction=70,
 				warehouse="WH 1",
-				posting_date="2021-12-04", voucher_type="Stock Entry",
+				posting_date="2021-12-04",
+				voucher_type="Stock Entry",
 				voucher_no="002",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 		fifo_slots = FIFOSlots(self.filters, sle)
@@ -504,7 +606,7 @@
 		self.assertEqual(queue[1][0], 50.0)
 
 		# check transfer bucket
-		transfer_bucket = fifo_slots.transferred_item_details[('002', 'Flask Item', 'WH 1')]
+		transfer_bucket = fifo_slots.transferred_item_details[("002", "Flask Item", "WH 1")]
 		self.assertFalse(transfer_bucket)
 
 	def test_negative_stock_same_voucher(self):
@@ -519,29 +621,38 @@
 		Item 1  | 80   | 001
 		"""
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=(-50),
+				actual_qty=(-50),
+				qty_after_transaction=(-50),
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=(-50), qty_after_transaction=(-100),
+				actual_qty=(-50),
+				qty_after_transaction=(-100),
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=30, qty_after_transaction=(-70),
+				actual_qty=30,
+				qty_after_transaction=(-70),
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 		fifo_slots = FIFOSlots(self.filters, sle)
@@ -549,59 +660,71 @@
 		item_result = slots["Flask Item"]
 
 		# check transfer bucket
-		transfer_bucket = fifo_slots.transferred_item_details[('001', 'Flask Item', 'WH 1')]
+		transfer_bucket = fifo_slots.transferred_item_details[("001", "Flask Item", "WH 1")]
 		self.assertEqual(transfer_bucket[0][0], 20)
 		self.assertEqual(transfer_bucket[1][0], 50)
 		self.assertEqual(item_result["fifo_queue"][0][0], -70.0)
 
-		sle.append(frappe._dict(
-			name="Flask Item",
-			actual_qty=80, qty_after_transaction=10,
-			warehouse="WH 1",
-			posting_date="2021-12-01", voucher_type="Stock Entry",
-			voucher_no="001",
-			has_serial_no=False, serial_no=None
-		))
+		sle.append(
+			frappe._dict(
+				name="Flask Item",
+				actual_qty=80,
+				qty_after_transaction=10,
+				warehouse="WH 1",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
+				voucher_no="001",
+				has_serial_no=False,
+				serial_no=None,
+			)
+		)
 
 		fifo_slots = FIFOSlots(self.filters, sle)
 		slots = fifo_slots.generate()
 		item_result = slots["Flask Item"]
 
-		transfer_bucket = fifo_slots.transferred_item_details[('001', 'Flask Item', 'WH 1')]
+		transfer_bucket = fifo_slots.transferred_item_details[("001", "Flask Item", "WH 1")]
 		self.assertFalse(transfer_bucket)
 		self.assertEqual(item_result["fifo_queue"][0][0], 10.0)
 
 	def test_precision(self):
 		"Test if final balance qty is rounded off correctly."
 		sle = [
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=0.3, qty_after_transaction=0.3,
+				actual_qty=0.3,
+				qty_after_transaction=0.3,
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
-			frappe._dict( # stock up item
+			frappe._dict(  # stock up item
 				name="Flask Item",
-				actual_qty=0.6, qty_after_transaction=0.9,
+				actual_qty=0.6,
+				qty_after_transaction=0.9,
 				warehouse="WH 1",
-				posting_date="2021-12-01", voucher_type="Stock Entry",
+				posting_date="2021-12-01",
+				voucher_type="Stock Entry",
 				voucher_no="001",
-				has_serial_no=False, serial_no=None
+				has_serial_no=False,
+				serial_no=None,
 			),
 		]
 
 		slots = FIFOSlots(self.filters, sle).generate()
 		report_data = format_report_data(self.filters, slots, self.filters["to_date"])
-		row = report_data[0] # first row in report
+		row = report_data[0]  # first row in report
 		bal_qty = row[5]
-		range_qty_sum = sum([i for i in row[7:11]]) # get sum of range balance
+		range_qty_sum = sum([i for i in row[7:11]])  # get sum of range balance
 
 		# check if value of Available Qty column matches with range bucket post format
 		self.assertEqual(bal_qty, 0.9)
 		self.assertEqual(bal_qty, range_qty_sum)
 
+
 def generate_item_and_item_wh_wise_slots(filters, sle):
 	"Return results with and without 'show_warehouse_wise_stock'"
 	item_wise_slots = FIFOSlots(filters, sle).generate()
diff --git a/erpnext/stock/report/stock_analytics/stock_analytics.py b/erpnext/stock/report/stock_analytics/stock_analytics.py
index ddc8310..da0776b 100644
--- a/erpnext/stock/report/stock_analytics/stock_analytics.py
+++ b/erpnext/stock/report/stock_analytics/stock_analytics.py
@@ -25,84 +25,64 @@
 
 	return columns, data, None, chart
 
+
 def get_columns(filters):
 	columns = [
-		{
-			"label": _("Item"),
-			"options":"Item",
-			"fieldname": "name",
-			"fieldtype": "Link",
-			"width": 140
-		},
+		{"label": _("Item"), "options": "Item", "fieldname": "name", "fieldtype": "Link", "width": 140},
 		{
 			"label": _("Item Name"),
-			"options":"Item",
+			"options": "Item",
 			"fieldname": "item_name",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
 		{
 			"label": _("Item Group"),
-			"options":"Item Group",
+			"options": "Item Group",
 			"fieldname": "item_group",
 			"fieldtype": "Link",
-			"width": 140
+			"width": 140,
 		},
-		{
-			"label": _("Brand"),
-			"fieldname": "brand",
-			"fieldtype": "Data",
-			"width": 120
-		},
-		{
-			"label": _("UOM"),
-			"fieldname": "uom",
-			"fieldtype": "Data",
-			"width": 120
-		}]
+		{"label": _("Brand"), "fieldname": "brand", "fieldtype": "Data", "width": 120},
+		{"label": _("UOM"), "fieldname": "uom", "fieldtype": "Data", "width": 120},
+	]
 
 	ranges = get_period_date_ranges(filters)
 
 	for dummy, end_date in ranges:
 		period = get_period(end_date, filters)
 
-		columns.append({
-			"label": _(period),
-			"fieldname":scrub(period),
-			"fieldtype": "Float",
-			"width": 120
-		})
+		columns.append(
+			{"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120}
+		)
 
 	return columns
 
+
 def get_period_date_ranges(filters):
-		from dateutil.relativedelta import relativedelta
-		from_date = round_down_to_nearest_frequency(filters.from_date, filters.range)
-		to_date = getdate(filters.to_date)
+	from dateutil.relativedelta import relativedelta
 
-		increment = {
-			"Monthly": 1,
-			"Quarterly": 3,
-			"Half-Yearly": 6,
-			"Yearly": 12
-		}.get(filters.range,1)
+	from_date = round_down_to_nearest_frequency(filters.from_date, filters.range)
+	to_date = getdate(filters.to_date)
 
-		periodic_daterange = []
-		for dummy in range(1, 53, increment):
-			if filters.range == "Weekly":
-				period_end_date = from_date + relativedelta(days=6)
-			else:
-				period_end_date = from_date + relativedelta(months=increment, days=-1)
+	increment = {"Monthly": 1, "Quarterly": 3, "Half-Yearly": 6, "Yearly": 12}.get(filters.range, 1)
 
-			if period_end_date > to_date:
-				period_end_date = to_date
-			periodic_daterange.append([from_date, period_end_date])
+	periodic_daterange = []
+	for dummy in range(1, 53, increment):
+		if filters.range == "Weekly":
+			period_end_date = from_date + relativedelta(days=6)
+		else:
+			period_end_date = from_date + relativedelta(months=increment, days=-1)
 
-			from_date = period_end_date + relativedelta(days=1)
-			if period_end_date == to_date:
-				break
+		if period_end_date > to_date:
+			period_end_date = to_date
+		periodic_daterange.append([from_date, period_end_date])
 
-		return periodic_daterange
+		from_date = period_end_date + relativedelta(days=1)
+		if period_end_date == to_date:
+			break
+
+	return periodic_daterange
 
 
 def round_down_to_nearest_frequency(date: str, frequency: str) -> datetime.datetime:
@@ -132,12 +112,12 @@
 def get_period(posting_date, filters):
 	months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
 
-	if filters.range == 'Weekly':
+	if filters.range == "Weekly":
 		period = "Week " + str(posting_date.isocalendar()[1]) + " " + str(posting_date.year)
-	elif filters.range == 'Monthly':
+	elif filters.range == "Monthly":
 		period = str(months[posting_date.month - 1]) + " " + str(posting_date.year)
-	elif filters.range == 'Quarterly':
-		period = "Quarter " + str(((posting_date.month-1)//3)+1) +" " + str(posting_date.year)
+	elif filters.range == "Quarterly":
+		period = "Quarter " + str(((posting_date.month - 1) // 3) + 1) + " " + str(posting_date.year)
 	else:
 		year = get_fiscal_year(posting_date, company=filters.company)
 		period = str(year[2])
@@ -147,26 +127,26 @@
 
 def get_periodic_data(entry, filters):
 	"""Structured as:
-		Item 1
-			- Balance (updated and carried forward):
-					- Warehouse A : bal_qty/value
-					- Warehouse B : bal_qty/value
-			- Jun 2021 (sum of warehouse quantities used in report)
-					- Warehouse A : bal_qty/value
-					- Warehouse B : bal_qty/value
-			- Jul 2021 (sum of warehouse quantities used in report)
-					- Warehouse A : bal_qty/value
-					- Warehouse B : bal_qty/value
-		Item 2
-			- Balance (updated and carried forward):
-					- Warehouse A : bal_qty/value
-					- Warehouse B : bal_qty/value
-			- Jun 2021 (sum of warehouse quantities used in report)
-					- Warehouse A : bal_qty/value
-					- Warehouse B : bal_qty/value
-			- Jul 2021 (sum of warehouse quantities used in report)
-					- Warehouse A : bal_qty/value
-					- Warehouse B : bal_qty/value
+	Item 1
+	        - Balance (updated and carried forward):
+	                        - Warehouse A : bal_qty/value
+	                        - Warehouse B : bal_qty/value
+	        - Jun 2021 (sum of warehouse quantities used in report)
+	                        - Warehouse A : bal_qty/value
+	                        - Warehouse B : bal_qty/value
+	        - Jul 2021 (sum of warehouse quantities used in report)
+	                        - Warehouse A : bal_qty/value
+	                        - Warehouse B : bal_qty/value
+	Item 2
+	        - Balance (updated and carried forward):
+	                        - Warehouse A : bal_qty/value
+	                        - Warehouse B : bal_qty/value
+	        - Jun 2021 (sum of warehouse quantities used in report)
+	                        - Warehouse A : bal_qty/value
+	                        - Warehouse B : bal_qty/value
+	        - Jul 2021 (sum of warehouse quantities used in report)
+	                        - Warehouse A : bal_qty/value
+	                        - Warehouse B : bal_qty/value
 	"""
 	periodic_data = {}
 	for d in entry:
@@ -176,31 +156,36 @@
 		# if period against item does not exist yet, instantiate it
 		# insert existing balance dict against period, and add/subtract to it
 		if periodic_data.get(d.item_code) and not periodic_data.get(d.item_code).get(period):
-			previous_balance = periodic_data[d.item_code]['balance'].copy()
+			previous_balance = periodic_data[d.item_code]["balance"].copy()
 			periodic_data[d.item_code][period] = previous_balance
 
 		if d.voucher_type == "Stock Reconciliation":
-			if periodic_data.get(d.item_code) and periodic_data.get(d.item_code).get('balance').get(d.warehouse):
-				bal_qty = periodic_data[d.item_code]['balance'][d.warehouse]
+			if periodic_data.get(d.item_code) and periodic_data.get(d.item_code).get("balance").get(
+				d.warehouse
+			):
+				bal_qty = periodic_data[d.item_code]["balance"][d.warehouse]
 
 			qty_diff = d.qty_after_transaction - bal_qty
 		else:
 			qty_diff = d.actual_qty
 
-		if filters["value_quantity"] == 'Quantity':
+		if filters["value_quantity"] == "Quantity":
 			value = qty_diff
 		else:
 			value = d.stock_value_difference
 
 		# period-warehouse wise balance
-		periodic_data.setdefault(d.item_code, {}).setdefault('balance', {}).setdefault(d.warehouse, 0.0)
+		periodic_data.setdefault(d.item_code, {}).setdefault("balance", {}).setdefault(d.warehouse, 0.0)
 		periodic_data.setdefault(d.item_code, {}).setdefault(period, {}).setdefault(d.warehouse, 0.0)
 
-		periodic_data[d.item_code]['balance'][d.warehouse] += value
-		periodic_data[d.item_code][period][d.warehouse] = periodic_data[d.item_code]['balance'][d.warehouse]
+		periodic_data[d.item_code]["balance"][d.warehouse] += value
+		periodic_data[d.item_code][period][d.warehouse] = periodic_data[d.item_code]["balance"][
+			d.warehouse
+		]
 
 	return periodic_data
 
+
 def get_data(filters):
 	data = []
 	items = get_items(filters)
@@ -229,14 +214,10 @@
 
 	return data
 
+
 def get_chart_data(columns):
 	labels = [d.get("label") for d in columns[5:]]
-	chart = {
-		"data": {
-			'labels': labels,
-			'datasets':[]
-		}
-	}
+	chart = {"data": {"labels": labels, "datasets": []}}
 	chart["type"] = "line"
 
 	return chart
diff --git a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py
index 6fd3fe7..99f820e 100644
--- a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py
+++ b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py
@@ -12,21 +12,25 @@
 
 def execute(filters=None):
 	if not erpnext.is_perpetual_inventory_enabled(filters.company):
-		frappe.throw(_("Perpetual inventory required for the company {0} to view this report.")
-			.format(filters.company))
+		frappe.throw(
+			_("Perpetual inventory required for the company {0} to view this report.").format(
+				filters.company
+			)
+		)
 
 	data = get_data(filters)
 	columns = get_columns(filters)
 
 	return columns, data
 
+
 def get_data(report_filters):
 	data = []
 
 	filters = {
 		"is_cancelled": 0,
 		"company": report_filters.company,
-		"posting_date": ("<=", report_filters.as_on_date)
+		"posting_date": ("<=", report_filters.as_on_date),
 	}
 
 	currency_precision = get_currency_precision() or 2
@@ -43,18 +47,28 @@
 
 	return data
 
+
 def get_stock_ledger_data(report_filters, filters):
 	if report_filters.account:
-		warehouses = get_warehouses_based_on_account(report_filters.account,
-			report_filters.company)
+		warehouses = get_warehouses_based_on_account(report_filters.account, report_filters.company)
 
 		filters["warehouse"] = ("in", warehouses)
 
-	return frappe.get_all("Stock Ledger Entry", filters=filters,
-		fields = ["name", "voucher_type", "voucher_no",
-			"sum(stock_value_difference) as stock_value", "posting_date", "posting_time"],
-		group_by = "voucher_type, voucher_no",
-		order_by = "posting_date ASC, posting_time ASC")
+	return frappe.get_all(
+		"Stock Ledger Entry",
+		filters=filters,
+		fields=[
+			"name",
+			"voucher_type",
+			"voucher_no",
+			"sum(stock_value_difference) as stock_value",
+			"posting_date",
+			"posting_time",
+		],
+		group_by="voucher_type, voucher_no",
+		order_by="posting_date ASC, posting_time ASC",
+	)
+
 
 def get_gl_data(report_filters, filters):
 	if report_filters.account:
@@ -62,17 +76,22 @@
 	else:
 		stock_accounts = get_stock_accounts(report_filters.company)
 
-	filters.update({
-		"account": ("in", stock_accounts)
-	})
+	filters.update({"account": ("in", stock_accounts)})
 
 	if filters.get("warehouse"):
 		del filters["warehouse"]
 
-	gl_entries = frappe.get_all("GL Entry", filters=filters,
-		fields = ["name", "voucher_type", "voucher_no",
-			"sum(debit_in_account_currency) - sum(credit_in_account_currency) as account_value"],
-		group_by = "voucher_type, voucher_no")
+	gl_entries = frappe.get_all(
+		"GL Entry",
+		filters=filters,
+		fields=[
+			"name",
+			"voucher_type",
+			"voucher_no",
+			"sum(debit_in_account_currency) - sum(credit_in_account_currency) as account_value",
+		],
+		group_by="voucher_type, voucher_no",
+	)
 
 	voucher_wise_gl_data = {}
 	for d in gl_entries:
@@ -81,6 +100,7 @@
 
 	return voucher_wise_gl_data
 
+
 def get_columns(filters):
 	return [
 		{
@@ -88,46 +108,29 @@
 			"fieldname": "name",
 			"fieldtype": "Link",
 			"options": "Stock Ledger Entry",
-			"width": "80"
+			"width": "80",
 		},
-		{
-			"label": _("Posting Date"),
-			"fieldname": "posting_date",
-			"fieldtype": "Date"
-		},
-		{
-			"label": _("Posting Time"),
-			"fieldname": "posting_time",
-			"fieldtype": "Time"
-		},
-		{
-			"label": _("Voucher Type"),
-			"fieldname": "voucher_type",
-			"width": "110"
-		},
+		{"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date"},
+		{"label": _("Posting Time"), "fieldname": "posting_time", "fieldtype": "Time"},
+		{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": "110"},
 		{
 			"label": _("Voucher No"),
 			"fieldname": "voucher_no",
 			"fieldtype": "Dynamic Link",
 			"options": "voucher_type",
-			"width": "110"
+			"width": "110",
 		},
-		{
-			"label": _("Stock Value"),
-			"fieldname": "stock_value",
-			"fieldtype": "Currency",
-			"width": "120"
-		},
+		{"label": _("Stock Value"), "fieldname": "stock_value", "fieldtype": "Currency", "width": "120"},
 		{
 			"label": _("Account Value"),
 			"fieldname": "account_value",
 			"fieldtype": "Currency",
-			"width": "120"
+			"width": "120",
 		},
 		{
 			"label": _("Difference Value"),
 			"fieldname": "difference_value",
 			"fieldtype": "Currency",
-			"width": "120"
-		}
+			"width": "120",
+		},
 	]
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index 24f47c1..afbc6fe 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -16,9 +16,10 @@
 
 def execute(filters=None):
 	is_reposting_item_valuation_in_progress()
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
-	to_date = filters.get('to_date')
+	to_date = filters.get("to_date")
 
 	if filters.get("company"):
 		company_currency = erpnext.get_company_currency(filters.get("company"))
@@ -30,8 +31,8 @@
 	items = get_items(filters)
 	sle = get_stock_ledger_entries(filters, items)
 
-	if filters.get('show_stock_ageing_data'):
-		filters['show_warehouse_wise_stock'] = True
+	if filters.get("show_stock_ageing_data"):
+		filters["show_warehouse_wise_stock"] = True
 		item_wise_fifo_queue = FIFOSlots(filters, sle).generate()
 
 	# if no stock ledger entry found return
@@ -57,12 +58,12 @@
 				item_reorder_qty = item_reorder_detail_map[item + warehouse]["warehouse_reorder_qty"]
 
 			report_data = {
-				'currency': company_currency,
-				'item_code': item,
-				'warehouse': warehouse,
-				'company': company,
-				'reorder_level': item_reorder_level,
-				'reorder_qty': item_reorder_qty,
+				"currency": company_currency,
+				"item_code": item,
+				"warehouse": warehouse,
+				"company": company,
+				"reorder_level": item_reorder_level,
+				"reorder_qty": item_reorder_qty,
 			}
 			report_data.update(item_map[item])
 			report_data.update(qty_dict)
@@ -70,21 +71,18 @@
 			if include_uom:
 				conversion_factors.setdefault(item, item_map[item].conversion_factor)
 
-			if filters.get('show_stock_ageing_data'):
-				fifo_queue = item_wise_fifo_queue[(item, warehouse)].get('fifo_queue')
+			if filters.get("show_stock_ageing_data"):
+				fifo_queue = item_wise_fifo_queue[(item, warehouse)].get("fifo_queue")
 
-				stock_ageing_data = {
-					'average_age': 0,
-					'earliest_age': 0,
-					'latest_age': 0
-				}
+				stock_ageing_data = {"average_age": 0, "earliest_age": 0, "latest_age": 0}
 				if fifo_queue:
 					fifo_queue = sorted(filter(_func, fifo_queue), key=_func)
-					if not fifo_queue: continue
+					if not fifo_queue:
+						continue
 
-					stock_ageing_data['average_age'] = get_average_age(fifo_queue, to_date)
-					stock_ageing_data['earliest_age'] = date_diff(to_date, fifo_queue[0][1])
-					stock_ageing_data['latest_age'] = date_diff(to_date, fifo_queue[-1][1])
+					stock_ageing_data["average_age"] = get_average_age(fifo_queue, to_date)
+					stock_ageing_data["earliest_age"] = date_diff(to_date, fifo_queue[0][1])
+					stock_ageing_data["latest_age"] = date_diff(to_date, fifo_queue[-1][1])
 
 				report_data.update(stock_ageing_data)
 
@@ -93,38 +91,130 @@
 	add_additional_uom_columns(columns, data, include_uom, conversion_factors)
 	return columns, data
 
+
 def get_columns(filters):
 	"""return columns"""
 	columns = [
-		{"label": _("Item"), "fieldname": "item_code", "fieldtype": "Link", "options": "Item", "width": 100},
+		{
+			"label": _("Item"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 100,
+		},
 		{"label": _("Item Name"), "fieldname": "item_name", "width": 150},
-		{"label": _("Item Group"), "fieldname": "item_group", "fieldtype": "Link", "options": "Item Group", "width": 100},
-		{"label": _("Warehouse"), "fieldname": "warehouse", "fieldtype": "Link", "options": "Warehouse", "width": 100},
-		{"label": _("Stock UOM"), "fieldname": "stock_uom", "fieldtype": "Link", "options": "UOM", "width": 90},
-		{"label": _("Balance Qty"), "fieldname": "bal_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Balance Value"), "fieldname": "bal_val", "fieldtype": "Currency", "width": 100, "options": "currency"},
-		{"label": _("Opening Qty"), "fieldname": "opening_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Opening Value"), "fieldname": "opening_val", "fieldtype": "Currency", "width": 110, "options": "currency"},
-		{"label": _("In Qty"), "fieldname": "in_qty", "fieldtype": "Float", "width": 80, "convertible": "qty"},
+		{
+			"label": _("Item Group"),
+			"fieldname": "item_group",
+			"fieldtype": "Link",
+			"options": "Item Group",
+			"width": 100,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 100,
+		},
+		{
+			"label": _("Stock UOM"),
+			"fieldname": "stock_uom",
+			"fieldtype": "Link",
+			"options": "UOM",
+			"width": 90,
+		},
+		{
+			"label": _("Balance Qty"),
+			"fieldname": "bal_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Balance Value"),
+			"fieldname": "bal_val",
+			"fieldtype": "Currency",
+			"width": 100,
+			"options": "currency",
+		},
+		{
+			"label": _("Opening Qty"),
+			"fieldname": "opening_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Opening Value"),
+			"fieldname": "opening_val",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "currency",
+		},
+		{
+			"label": _("In Qty"),
+			"fieldname": "in_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty",
+		},
 		{"label": _("In Value"), "fieldname": "in_val", "fieldtype": "Float", "width": 80},
-		{"label": _("Out Qty"), "fieldname": "out_qty", "fieldtype": "Float", "width": 80, "convertible": "qty"},
+		{
+			"label": _("Out Qty"),
+			"fieldname": "out_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty",
+		},
 		{"label": _("Out Value"), "fieldname": "out_val", "fieldtype": "Float", "width": 80},
-		{"label": _("Valuation Rate"), "fieldname": "val_rate", "fieldtype": "Currency", "width": 90, "convertible": "rate", "options": "currency"},
-		{"label": _("Reorder Level"), "fieldname": "reorder_level", "fieldtype": "Float", "width": 80, "convertible": "qty"},
-		{"label": _("Reorder Qty"), "fieldname": "reorder_qty", "fieldtype": "Float", "width": 80, "convertible": "qty"},
-		{"label": _("Company"), "fieldname": "company", "fieldtype": "Link", "options": "Company", "width": 100}
+		{
+			"label": _("Valuation Rate"),
+			"fieldname": "val_rate",
+			"fieldtype": "Currency",
+			"width": 90,
+			"convertible": "rate",
+			"options": "currency",
+		},
+		{
+			"label": _("Reorder Level"),
+			"fieldname": "reorder_level",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reorder Qty"),
+			"fieldname": "reorder_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 100,
+		},
 	]
 
-	if filters.get('show_stock_ageing_data'):
-		columns += [{'label': _('Average Age'), 'fieldname': 'average_age', 'width': 100},
-		{'label': _('Earliest Age'), 'fieldname': 'earliest_age', 'width': 100},
-		{'label': _('Latest Age'), 'fieldname': 'latest_age', 'width': 100}]
+	if filters.get("show_stock_ageing_data"):
+		columns += [
+			{"label": _("Average Age"), "fieldname": "average_age", "width": 100},
+			{"label": _("Earliest Age"), "fieldname": "earliest_age", "width": 100},
+			{"label": _("Latest Age"), "fieldname": "latest_age", "width": 100},
+		]
 
-	if filters.get('show_variant_attributes'):
-		columns += [{'label': att_name, 'fieldname': att_name, 'width': 100} for att_name in get_variants_attributes()]
+	if filters.get("show_variant_attributes"):
+		columns += [
+			{"label": att_name, "fieldname": att_name, "width": 100}
+			for att_name in get_variants_attributes()
+		]
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 	if not filters.get("from_date"):
@@ -139,28 +229,37 @@
 		conditions += " and sle.company = %s" % frappe.db.escape(filters.get("company"))
 
 	if filters.get("warehouse"):
-		warehouse_details = frappe.db.get_value("Warehouse",
-			filters.get("warehouse"), ["lft", "rgt"], as_dict=1)
+		warehouse_details = frappe.db.get_value(
+			"Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1
+		)
 		if warehouse_details:
-			conditions += " and exists (select name from `tabWarehouse` wh \
-				where wh.lft >= %s and wh.rgt <= %s and sle.warehouse = wh.name)"%(warehouse_details.lft,
-				warehouse_details.rgt)
+			conditions += (
+				" and exists (select name from `tabWarehouse` wh \
+				where wh.lft >= %s and wh.rgt <= %s and sle.warehouse = wh.name)"
+				% (warehouse_details.lft, warehouse_details.rgt)
+			)
 
 	if filters.get("warehouse_type") and not filters.get("warehouse"):
-		conditions += " and exists (select name from `tabWarehouse` wh \
-			where wh.warehouse_type = '%s' and sle.warehouse = wh.name)"%(filters.get("warehouse_type"))
+		conditions += (
+			" and exists (select name from `tabWarehouse` wh \
+			where wh.warehouse_type = '%s' and sle.warehouse = wh.name)"
+			% (filters.get("warehouse_type"))
+		)
 
 	return conditions
 
+
 def get_stock_ledger_entries(filters, items):
-	item_conditions_sql = ''
+	item_conditions_sql = ""
 	if items:
-		item_conditions_sql = ' and sle.item_code in ({})'\
-			.format(', '.join(frappe.db.escape(i, percent=False) for i in items))
+		item_conditions_sql = " and sle.item_code in ({})".format(
+			", ".join(frappe.db.escape(i, percent=False) for i in items)
+		)
 
 	conditions = get_conditions(filters)
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			sle.item_code, warehouse, sle.posting_date, sle.actual_qty, sle.valuation_rate,
 			sle.company, sle.voucher_type, sle.qty_after_transaction, sle.stock_value_difference,
@@ -169,8 +268,11 @@
 			`tabStock Ledger Entry` sle
 		where sle.docstatus < 2 %s %s
 		and is_cancelled = 0
-		order by sle.posting_date, sle.posting_time, sle.creation, sle.actual_qty""" % #nosec
-		(item_conditions_sql, conditions), as_dict=1)
+		order by sle.posting_date, sle.posting_time, sle.creation, sle.actual_qty"""
+		% (item_conditions_sql, conditions),  # nosec
+		as_dict=1,
+	)
+
 
 def get_item_warehouse_map(filters, sle):
 	iwb_map = {}
@@ -182,13 +284,19 @@
 	for d in sle:
 		key = (d.company, d.item_code, d.warehouse)
 		if key not in iwb_map:
-			iwb_map[key] = frappe._dict({
-				"opening_qty": 0.0, "opening_val": 0.0,
-				"in_qty": 0.0, "in_val": 0.0,
-				"out_qty": 0.0, "out_val": 0.0,
-				"bal_qty": 0.0, "bal_val": 0.0,
-				"val_rate": 0.0
-			})
+			iwb_map[key] = frappe._dict(
+				{
+					"opening_qty": 0.0,
+					"opening_val": 0.0,
+					"in_qty": 0.0,
+					"in_val": 0.0,
+					"out_qty": 0.0,
+					"out_val": 0.0,
+					"bal_qty": 0.0,
+					"bal_val": 0.0,
+					"val_rate": 0.0,
+				}
+			)
 
 		qty_dict = iwb_map[(d.company, d.item_code, d.warehouse)]
 
@@ -199,9 +307,11 @@
 
 		value_diff = flt(d.stock_value_difference)
 
-		if d.posting_date < from_date or (d.posting_date == from_date
-			and d.voucher_type == "Stock Reconciliation" and
-			frappe.db.get_value("Stock Reconciliation", d.voucher_no, "purpose") == "Opening Stock"):
+		if d.posting_date < from_date or (
+			d.posting_date == from_date
+			and d.voucher_type == "Stock Reconciliation"
+			and frappe.db.get_value("Stock Reconciliation", d.voucher_no, "purpose") == "Opening Stock"
+		):
 			qty_dict.opening_qty += qty_diff
 			qty_dict.opening_val += value_diff
 
@@ -221,6 +331,7 @@
 
 	return iwb_map
 
+
 def filter_items_with_no_transactions(iwb_map, float_precision):
 	for (company, item, warehouse) in sorted(iwb_map):
 		qty_dict = iwb_map[(company, item, warehouse)]
@@ -237,6 +348,7 @@
 
 	return iwb_map
 
+
 def get_items(filters):
 	"Get items based on item code, item group or brand."
 	conditions = []
@@ -245,15 +357,17 @@
 	else:
 		if filters.get("item_group"):
 			conditions.append(get_item_group_condition(filters.get("item_group")))
-		if filters.get("brand"): # used in stock analytics report
+		if filters.get("brand"):  # used in stock analytics report
 			conditions.append("item.brand=%(brand)s")
 
 	items = []
 	if conditions:
-		items = frappe.db.sql_list("""select name from `tabItem` item where {}"""
-			.format(" and ".join(conditions)), filters)
+		items = frappe.db.sql_list(
+			"""select name from `tabItem` item where {}""".format(" and ".join(conditions)), filters
+		)
 	return items
 
+
 def get_item_details(items, sle, filters):
 	item_details = {}
 	if not items:
@@ -265,10 +379,13 @@
 	cf_field = cf_join = ""
 	if filters.get("include_uom"):
 		cf_field = ", ucd.conversion_factor"
-		cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%s" \
+		cf_join = (
+			"left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%s"
 			% frappe.db.escape(filters.get("include_uom"))
+		)
 
-	res = frappe.db.sql("""
+	res = frappe.db.sql(
+		"""
 		select
 			item.name, item.item_name, item.description, item.item_group, item.brand, item.stock_uom %s
 		from
@@ -276,40 +393,57 @@
 			%s
 		where
 			item.name in (%s)
-	""" % (cf_field, cf_join, ','.join(['%s'] *len(items))), items, as_dict=1)
+	"""
+		% (cf_field, cf_join, ",".join(["%s"] * len(items))),
+		items,
+		as_dict=1,
+	)
 
 	for item in res:
 		item_details.setdefault(item.name, item)
 
-	if filters.get('show_variant_attributes', 0) == 1:
+	if filters.get("show_variant_attributes", 0) == 1:
 		variant_values = get_variant_values_for(list(item_details))
 		item_details = {k: v.update(variant_values.get(k, {})) for k, v in item_details.items()}
 
 	return item_details
 
+
 def get_item_reorder_details(items):
 	item_reorder_details = frappe._dict()
 
 	if items:
-		item_reorder_details = frappe.db.sql("""
+		item_reorder_details = frappe.db.sql(
+			"""
 			select parent, warehouse, warehouse_reorder_qty, warehouse_reorder_level
 			from `tabItem Reorder`
 			where parent in ({0})
-		""".format(', '.join(frappe.db.escape(i, percent=False) for i in items)), as_dict=1)
+		""".format(
+				", ".join(frappe.db.escape(i, percent=False) for i in items)
+			),
+			as_dict=1,
+		)
 
 	return dict((d.parent + d.warehouse, d) for d in item_reorder_details)
 
+
 def get_variants_attributes():
-	'''Return all item variant attributes.'''
-	return [i.name for i in frappe.get_all('Item Attribute')]
+	"""Return all item variant attributes."""
+	return [i.name for i in frappe.get_all("Item Attribute")]
+
 
 def get_variant_values_for(items):
-	'''Returns variant values for items.'''
+	"""Returns variant values for items."""
 	attribute_map = {}
-	for attr in frappe.db.sql('''select parent, attribute, attribute_value
+	for attr in frappe.db.sql(
+		"""select parent, attribute, attribute_value
 		from `tabItem Variant Attribute` where parent in (%s)
-		''' % ", ".join(["%s"] * len(items)), tuple(items), as_dict=1):
-			attribute_map.setdefault(attr['parent'], {})
-			attribute_map[attr['parent']].update({attr['attribute']: attr['attribute_value']})
+		"""
+		% ", ".join(["%s"] * len(items)),
+		tuple(items),
+		as_dict=1,
+	):
+		attribute_map.setdefault(attr["parent"], {})
+		attribute_map[attr["parent"]].update({attr["attribute"]: attr["attribute_value"]})
 
 	return attribute_map
diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py
index 9fde47e..409e238 100644
--- a/erpnext/stock/report/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/report/stock_ledger/stock_ledger.py
@@ -42,19 +42,13 @@
 			actual_qty += flt(sle.actual_qty, precision)
 			stock_value += sle.stock_value_difference
 
-			if sle.voucher_type == 'Stock Reconciliation' and not sle.actual_qty:
+			if sle.voucher_type == "Stock Reconciliation" and not sle.actual_qty:
 				actual_qty = sle.qty_after_transaction
 				stock_value = sle.stock_value
 
-			sle.update({
-				"qty_after_transaction": actual_qty,
-				"stock_value": stock_value
-			})
+			sle.update({"qty_after_transaction": actual_qty, "stock_value": stock_value})
 
-		sle.update({
-			"in_qty": max(sle.actual_qty, 0),
-			"out_qty": min(sle.actual_qty, 0)
-		})
+		sle.update({"in_qty": max(sle.actual_qty, 0), "out_qty": min(sle.actual_qty, 0)})
 
 		if sle.serial_no:
 			update_available_serial_nos(available_serial_nos, sle)
@@ -67,13 +61,15 @@
 	update_included_uom_in_report(columns, data, include_uom, conversion_factors)
 	return columns, data
 
+
 def update_available_serial_nos(available_serial_nos, sle):
 	serial_nos = get_serial_nos(sle.serial_no)
 	key = (sle.item_code, sle.warehouse)
 	if key not in available_serial_nos:
-		stock_balance = get_stock_balance_for(sle.item_code, sle.warehouse, sle.date.split(' ')[0],
-			sle.date.split(' ')[1])
-		serials = get_serial_nos(stock_balance['serial_nos']) if stock_balance['serial_nos'] else []
+		stock_balance = get_stock_balance_for(
+			sle.item_code, sle.warehouse, sle.date.split(" ")[0], sle.date.split(" ")[1]
+		)
+		serials = get_serial_nos(stock_balance["serial_nos"]) if stock_balance["serial_nos"] else []
 		available_serial_nos.setdefault(key, serials)
 
 	existing_serial_no = available_serial_nos[key]
@@ -89,45 +85,158 @@
 			else:
 				existing_serial_no.append(sn)
 
-	sle.balance_serial_no = '\n'.join(existing_serial_no)
+	sle.balance_serial_no = "\n".join(existing_serial_no)
+
 
 def get_columns():
 	columns = [
 		{"label": _("Date"), "fieldname": "date", "fieldtype": "Datetime", "width": 150},
-		{"label": _("Item"), "fieldname": "item_code", "fieldtype": "Link", "options": "Item", "width": 100},
+		{
+			"label": _("Item"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 100,
+		},
 		{"label": _("Item Name"), "fieldname": "item_name", "width": 100},
-		{"label": _("Stock UOM"), "fieldname": "stock_uom", "fieldtype": "Link", "options": "UOM", "width": 90},
-		{"label": _("In Qty"), "fieldname": "in_qty", "fieldtype": "Float", "width": 80, "convertible": "qty"},
-		{"label": _("Out Qty"), "fieldname": "out_qty", "fieldtype": "Float", "width": 80, "convertible": "qty"},
-		{"label": _("Balance Qty"), "fieldname": "qty_after_transaction", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Voucher #"), "fieldname": "voucher_no", "fieldtype": "Dynamic Link", "options": "voucher_type", "width": 150},
-		{"label": _("Warehouse"), "fieldname": "warehouse", "fieldtype": "Link", "options": "Warehouse", "width": 150},
-		{"label": _("Item Group"), "fieldname": "item_group", "fieldtype": "Link", "options": "Item Group", "width": 100},
-		{"label": _("Brand"), "fieldname": "brand", "fieldtype": "Link", "options": "Brand", "width": 100},
+		{
+			"label": _("Stock UOM"),
+			"fieldname": "stock_uom",
+			"fieldtype": "Link",
+			"options": "UOM",
+			"width": 90,
+		},
+		{
+			"label": _("In Qty"),
+			"fieldname": "in_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Out Qty"),
+			"fieldname": "out_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Balance Qty"),
+			"fieldname": "qty_after_transaction",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Voucher #"),
+			"fieldname": "voucher_no",
+			"fieldtype": "Dynamic Link",
+			"options": "voucher_type",
+			"width": 150,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 150,
+		},
+		{
+			"label": _("Item Group"),
+			"fieldname": "item_group",
+			"fieldtype": "Link",
+			"options": "Item Group",
+			"width": 100,
+		},
+		{
+			"label": _("Brand"),
+			"fieldname": "brand",
+			"fieldtype": "Link",
+			"options": "Brand",
+			"width": 100,
+		},
 		{"label": _("Description"), "fieldname": "description", "width": 200},
-		{"label": _("Incoming Rate"), "fieldname": "incoming_rate", "fieldtype": "Currency", "width": 110, "options": "Company:company:default_currency", "convertible": "rate"},
-		{"label": _("Valuation Rate"), "fieldname": "valuation_rate", "fieldtype": "Currency", "width": 110, "options": "Company:company:default_currency", "convertible": "rate"},
-		{"label": _("Balance Value"), "fieldname": "stock_value", "fieldtype": "Currency", "width": 110, "options": "Company:company:default_currency"},
-		{"label": _("Value Change"), "fieldname": "stock_value_difference", "fieldtype": "Currency", "width": 110, "options": "Company:company:default_currency"},
+		{
+			"label": _("Incoming Rate"),
+			"fieldname": "incoming_rate",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "Company:company:default_currency",
+			"convertible": "rate",
+		},
+		{
+			"label": _("Valuation Rate"),
+			"fieldname": "valuation_rate",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "Company:company:default_currency",
+			"convertible": "rate",
+		},
+		{
+			"label": _("Balance Value"),
+			"fieldname": "stock_value",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "Company:company:default_currency",
+		},
+		{
+			"label": _("Value Change"),
+			"fieldname": "stock_value_difference",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "Company:company:default_currency",
+		},
 		{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": 110},
-		{"label": _("Voucher #"), "fieldname": "voucher_no", "fieldtype": "Dynamic Link", "options": "voucher_type", "width": 100},
-		{"label": _("Batch"), "fieldname": "batch_no", "fieldtype": "Link", "options": "Batch", "width": 100},
-		{"label": _("Serial No"), "fieldname": "serial_no", "fieldtype": "Link", "options": "Serial No", "width": 100},
+		{
+			"label": _("Voucher #"),
+			"fieldname": "voucher_no",
+			"fieldtype": "Dynamic Link",
+			"options": "voucher_type",
+			"width": 100,
+		},
+		{
+			"label": _("Batch"),
+			"fieldname": "batch_no",
+			"fieldtype": "Link",
+			"options": "Batch",
+			"width": 100,
+		},
+		{
+			"label": _("Serial No"),
+			"fieldname": "serial_no",
+			"fieldtype": "Link",
+			"options": "Serial No",
+			"width": 100,
+		},
 		{"label": _("Balance Serial No"), "fieldname": "balance_serial_no", "width": 100},
-		{"label": _("Project"), "fieldname": "project", "fieldtype": "Link", "options": "Project", "width": 100},
-		{"label": _("Company"), "fieldname": "company", "fieldtype": "Link", "options": "Company", "width": 110}
+		{
+			"label": _("Project"),
+			"fieldname": "project",
+			"fieldtype": "Link",
+			"options": "Project",
+			"width": 100,
+		},
+		{
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 110,
+		},
 	]
 
 	return columns
 
 
 def get_stock_ledger_entries(filters, items):
-	item_conditions_sql = ''
+	item_conditions_sql = ""
 	if items:
-		item_conditions_sql = 'and sle.item_code in ({})'\
-			.format(', '.join(frappe.db.escape(i) for i in items))
+		item_conditions_sql = "and sle.item_code in ({})".format(
+			", ".join(frappe.db.escape(i) for i in items)
+		)
 
-	sl_entries = frappe.db.sql("""
+	sl_entries = frappe.db.sql(
+		"""
 		SELECT
 			concat_ws(" ", posting_date, posting_time) AS date,
 			item_code,
@@ -153,8 +262,12 @@
 				{item_conditions_sql}
 		ORDER BY
 			posting_date asc, posting_time asc, creation asc
-		""".format(sle_conditions=get_sle_conditions(filters), item_conditions_sql=item_conditions_sql),
-		filters, as_dict=1)
+		""".format(
+			sle_conditions=get_sle_conditions(filters), item_conditions_sql=item_conditions_sql
+		),
+		filters,
+		as_dict=1,
+	)
 
 	return sl_entries
 
@@ -171,8 +284,9 @@
 
 	items = []
 	if conditions:
-		items = frappe.db.sql_list("""select name from `tabItem` item where {}"""
-			.format(" and ".join(conditions)), filters)
+		items = frappe.db.sql_list(
+			"""select name from `tabItem` item where {}""".format(" and ".join(conditions)), filters
+		)
 	return items
 
 
@@ -187,10 +301,13 @@
 	cf_field = cf_join = ""
 	if include_uom:
 		cf_field = ", ucd.conversion_factor"
-		cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%s" \
+		cf_join = (
+			"left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%s"
 			% frappe.db.escape(include_uom)
+		)
 
-	res = frappe.db.sql("""
+	res = frappe.db.sql(
+		"""
 		select
 			item.name, item.item_name, item.description, item.item_group, item.brand, item.stock_uom {cf_field}
 		from
@@ -198,7 +315,12 @@
 			{cf_join}
 		where
 			item.name in ({item_codes})
-	""".format(cf_field=cf_field, cf_join=cf_join, item_codes=','.join(['%s'] *len(items))), items, as_dict=1)
+	""".format(
+			cf_field=cf_field, cf_join=cf_join, item_codes=",".join(["%s"] * len(items))
+		),
+		items,
+		as_dict=1,
+	)
 
 	for item in res:
 		item_details.setdefault(item.name, item)
@@ -227,16 +349,20 @@
 		return
 
 	from erpnext.stock.stock_ledger import get_previous_sle
-	last_entry = get_previous_sle({
-		"item_code": filters.item_code,
-		"warehouse_condition": get_warehouse_condition(filters.warehouse),
-		"posting_date": filters.from_date,
-		"posting_time": "00:00:00"
-	})
+
+	last_entry = get_previous_sle(
+		{
+			"item_code": filters.item_code,
+			"warehouse_condition": get_warehouse_condition(filters.warehouse),
+			"posting_date": filters.from_date,
+			"posting_time": "00:00:00",
+		}
+	)
 
 	# check if any SLEs are actually Opening Stock Reconciliation
 	for sle in sl_entries:
-		if (sle.get("voucher_type") == "Stock Reconciliation"
+		if (
+			sle.get("voucher_type") == "Stock Reconciliation"
 			and sle.get("date").split()[0] == filters.from_date
 			and frappe.db.get_value("Stock Reconciliation", sle.voucher_no, "purpose") == "Opening Stock"
 		):
@@ -247,7 +373,7 @@
 		"item_code": _("'Opening'"),
 		"qty_after_transaction": last_entry.get("qty_after_transaction", 0),
 		"valuation_rate": last_entry.get("valuation_rate", 0),
-		"stock_value": last_entry.get("stock_value", 0)
+		"stock_value": last_entry.get("stock_value", 0),
 	}
 
 	return row
@@ -256,18 +382,22 @@
 def get_warehouse_condition(warehouse):
 	warehouse_details = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"], as_dict=1)
 	if warehouse_details:
-		return " exists (select name from `tabWarehouse` wh \
-			where wh.lft >= %s and wh.rgt <= %s and warehouse = wh.name)"%(warehouse_details.lft,
-			warehouse_details.rgt)
+		return (
+			" exists (select name from `tabWarehouse` wh \
+			where wh.lft >= %s and wh.rgt <= %s and warehouse = wh.name)"
+			% (warehouse_details.lft, warehouse_details.rgt)
+		)
 
-	return ''
+	return ""
 
 
 def get_item_group_condition(item_group):
 	item_group_details = frappe.db.get_value("Item Group", item_group, ["lft", "rgt"], as_dict=1)
 	if item_group_details:
-		return "item.item_group in (select ig.name from `tabItem Group` ig \
-			where ig.lft >= %s and ig.rgt <= %s and item.item_group = ig.name)"%(item_group_details.lft,
-			item_group_details.rgt)
+		return (
+			"item.item_group in (select ig.name from `tabItem Group` ig \
+			where ig.lft >= %s and ig.rgt <= %s and item.item_group = ig.name)"
+			% (item_group_details.lft, item_group_details.rgt)
+		)
 
-	return ''
+	return ""
diff --git a/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py b/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
index 163b205..f93bd66 100644
--- a/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
+++ b/erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
@@ -17,8 +17,10 @@
 	def setUp(self) -> None:
 		make_serial_item_with_serial("_Test Stock Report Serial Item")
 		self.filters = frappe._dict(
-			company="_Test Company", from_date=today(), to_date=add_days(today(), 30),
-			item_code="_Test Stock Report Serial Item"
+			company="_Test Company",
+			from_date=today(),
+			to_date=add_days(today(), 30),
+			item_code="_Test Stock Report Serial Item",
 		)
 
 	def tearDown(self) -> None:
@@ -38,4 +40,3 @@
 		self.assertEqual(data[0].out_qty, -1)
 		self.assertEqual(data[0].serial_no, serials_added[1])
 		self.assertEqual(data[0].balance_serial_no, serials_added[0])
-
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
index 1ba2482..6cc9061 100644
--- a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
@@ -40,11 +40,7 @@
 	return frappe.get_all(
 		"Stock Ledger Entry",
 		fields=SLE_FIELDS,
-		filters={
-			"item_code": filters.item_code,
-			"warehouse": filters.warehouse,
-			"is_cancelled": 0
-		},
+		filters={"item_code": filters.item_code, "warehouse": filters.warehouse, "is_cancelled": 0},
 		order_by="timestamp(posting_date, posting_time), creation",
 	)
 
@@ -62,7 +58,7 @@
 			fifo_value += qty * rate
 
 		if sle.actual_qty < 0:
-			sle.consumption_rate = sle.stock_value_difference  / sle.actual_qty
+			sle.consumption_rate = sle.stock_value_difference / sle.actual_qty
 
 		balance_qty += sle.actual_qty
 		balance_stock_value += sle.stock_value_difference
@@ -90,14 +86,16 @@
 		sle.valuation_diff = (
 			sle.valuation_rate - sle.balance_value_by_qty if sle.balance_value_by_qty else None
 		)
-		sle.diff_value_diff = sle.stock_value_from_diff -  sle.stock_value
+		sle.diff_value_diff = sle.stock_value_from_diff - sle.stock_value
 
 		if idx > 0:
 			sle.fifo_stock_diff = sle.fifo_stock_value - sles[idx - 1].fifo_stock_value
 			sle.fifo_difference_diff = sle.fifo_stock_diff - sle.stock_value_difference
 
 		if sle.batch_no:
-			sle.use_batchwise_valuation = frappe.db.get_value("Batch", sle.batch_no, "use_batchwise_valuation", cache=True)
+			sle.use_batchwise_valuation = frappe.db.get_value(
+				"Batch", sle.batch_no, "use_batchwise_valuation", cache=True
+			)
 
 	return sles
 
@@ -183,7 +181,6 @@
 			"fieldtype": "Data",
 			"label": "FIFO/LIFO Queue",
 		},
-
 		{
 			"fieldname": "fifo_queue_qty",
 			"fieldtype": "Float",
@@ -244,7 +241,6 @@
 			"fieldtype": "Float",
 			"label": "(I) Valuation Rate as per FIFO",
 		},
-
 		{
 			"fieldname": "fifo_valuation_diff",
 			"fieldtype": "Float",
diff --git a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
index a28b752..49e797d 100644
--- a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
+++ b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
@@ -32,8 +32,9 @@
 			continue
 
 		# item = item_map.setdefault(bin.item_code, get_item(bin.item_code))
-		company = warehouse_company.setdefault(bin.warehouse,
-			frappe.db.get_value("Warehouse", bin.warehouse, "company"))
+		company = warehouse_company.setdefault(
+			bin.warehouse, frappe.db.get_value("Warehouse", bin.warehouse, "company")
+		)
 
 		if filters.brand and filters.brand != item.brand:
 			continue
@@ -59,10 +60,29 @@
 		if reserved_qty_for_pos:
 			bin.projected_qty -= reserved_qty_for_pos
 
-		data.append([item.name, item.item_name, item.description, item.item_group, item.brand, bin.warehouse,
-			item.stock_uom, bin.actual_qty, bin.planned_qty, bin.indented_qty, bin.ordered_qty,
-			bin.reserved_qty, bin.reserved_qty_for_production, bin.reserved_qty_for_sub_contract, reserved_qty_for_pos,
-			bin.projected_qty, re_order_level, re_order_qty, shortage_qty])
+		data.append(
+			[
+				item.name,
+				item.item_name,
+				item.description,
+				item.item_group,
+				item.brand,
+				bin.warehouse,
+				item.stock_uom,
+				bin.actual_qty,
+				bin.planned_qty,
+				bin.indented_qty,
+				bin.ordered_qty,
+				bin.reserved_qty,
+				bin.reserved_qty_for_production,
+				bin.reserved_qty_for_sub_contract,
+				reserved_qty_for_pos,
+				bin.projected_qty,
+				re_order_level,
+				re_order_qty,
+				shortage_qty,
+			]
+		)
 
 		if include_uom:
 			conversion_factors.append(item.conversion_factor)
@@ -70,66 +90,180 @@
 	update_included_uom_in_report(columns, data, include_uom, conversion_factors)
 	return columns, data
 
+
 def get_columns():
 	return [
-		{"label": _("Item Code"), "fieldname": "item_code", "fieldtype": "Link", "options": "Item", "width": 140},
+		{
+			"label": _("Item Code"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 140,
+		},
 		{"label": _("Item Name"), "fieldname": "item_name", "width": 100},
 		{"label": _("Description"), "fieldname": "description", "width": 200},
-		{"label": _("Item Group"), "fieldname": "item_group", "fieldtype": "Link", "options": "Item Group", "width": 100},
-		{"label": _("Brand"), "fieldname": "brand", "fieldtype": "Link", "options": "Brand", "width": 100},
-		{"label": _("Warehouse"), "fieldname": "warehouse", "fieldtype": "Link", "options": "Warehouse", "width": 120},
-		{"label": _("UOM"), "fieldname": "stock_uom", "fieldtype": "Link", "options": "UOM", "width": 100},
-		{"label": _("Actual Qty"), "fieldname": "actual_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Planned Qty"), "fieldname": "planned_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Requested Qty"), "fieldname": "indented_qty", "fieldtype": "Float", "width": 110, "convertible": "qty"},
-		{"label": _("Ordered Qty"), "fieldname": "ordered_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Reserved Qty"), "fieldname": "reserved_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Reserved for Production"), "fieldname": "reserved_qty_for_production", "fieldtype": "Float",
-			"width": 100, "convertible": "qty"},
-		{"label": _("Reserved for Sub Contracting"), "fieldname": "reserved_qty_for_sub_contract", "fieldtype": "Float",
-			"width": 100, "convertible": "qty"},
-		{"label": _("Reserved for POS Transactions"), "fieldname": "reserved_qty_for_pos", "fieldtype": "Float",
-			"width": 100, "convertible": "qty"},
-		{"label": _("Projected Qty"), "fieldname": "projected_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Reorder Level"), "fieldname": "re_order_level", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Reorder Qty"), "fieldname": "re_order_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"},
-		{"label": _("Shortage Qty"), "fieldname": "shortage_qty", "fieldtype": "Float", "width": 100, "convertible": "qty"}
+		{
+			"label": _("Item Group"),
+			"fieldname": "item_group",
+			"fieldtype": "Link",
+			"options": "Item Group",
+			"width": 100,
+		},
+		{
+			"label": _("Brand"),
+			"fieldname": "brand",
+			"fieldtype": "Link",
+			"options": "Brand",
+			"width": 100,
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 120,
+		},
+		{
+			"label": _("UOM"),
+			"fieldname": "stock_uom",
+			"fieldtype": "Link",
+			"options": "UOM",
+			"width": 100,
+		},
+		{
+			"label": _("Actual Qty"),
+			"fieldname": "actual_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Planned Qty"),
+			"fieldname": "planned_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Requested Qty"),
+			"fieldname": "indented_qty",
+			"fieldtype": "Float",
+			"width": 110,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Ordered Qty"),
+			"fieldname": "ordered_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reserved Qty"),
+			"fieldname": "reserved_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reserved for Production"),
+			"fieldname": "reserved_qty_for_production",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reserved for Sub Contracting"),
+			"fieldname": "reserved_qty_for_sub_contract",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reserved for POS Transactions"),
+			"fieldname": "reserved_qty_for_pos",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Projected Qty"),
+			"fieldname": "projected_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reorder Level"),
+			"fieldname": "re_order_level",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Reorder Qty"),
+			"fieldname": "re_order_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
+		{
+			"label": _("Shortage Qty"),
+			"fieldname": "shortage_qty",
+			"fieldtype": "Float",
+			"width": 100,
+			"convertible": "qty",
+		},
 	]
 
+
 def get_bin_list(filters):
 	conditions = []
 
 	if filters.item_code:
-		conditions.append("item_code = '%s' "%filters.item_code)
+		conditions.append("item_code = '%s' " % filters.item_code)
 
 	if filters.warehouse:
-		warehouse_details = frappe.db.get_value("Warehouse", filters.warehouse, ["lft", "rgt"], as_dict=1)
+		warehouse_details = frappe.db.get_value(
+			"Warehouse", filters.warehouse, ["lft", "rgt"], as_dict=1
+		)
 
 		if warehouse_details:
-			conditions.append(" exists (select name from `tabWarehouse` wh \
-				where wh.lft >= %s and wh.rgt <= %s and bin.warehouse = wh.name)"%(warehouse_details.lft,
-				warehouse_details.rgt))
+			conditions.append(
+				" exists (select name from `tabWarehouse` wh \
+				where wh.lft >= %s and wh.rgt <= %s and bin.warehouse = wh.name)"
+				% (warehouse_details.lft, warehouse_details.rgt)
+			)
 
-	bin_list = frappe.db.sql("""select item_code, warehouse, actual_qty, planned_qty, indented_qty,
+	bin_list = frappe.db.sql(
+		"""select item_code, warehouse, actual_qty, planned_qty, indented_qty,
 		ordered_qty, reserved_qty, reserved_qty_for_production, reserved_qty_for_sub_contract, projected_qty
 		from tabBin bin {conditions} order by item_code, warehouse
-		""".format(conditions=" where " + " and ".join(conditions) if conditions else ""), as_dict=1)
+		""".format(
+			conditions=" where " + " and ".join(conditions) if conditions else ""
+		),
+		as_dict=1,
+	)
 
 	return bin_list
 
+
 def get_item_map(item_code, include_uom):
 	"""Optimization: get only the item doc and re_order_levels table"""
 
 	condition = ""
 	if item_code:
-		condition = 'and item_code = {0}'.format(frappe.db.escape(item_code, percent=False))
+		condition = "and item_code = {0}".format(frappe.db.escape(item_code, percent=False))
 
 	cf_field = cf_join = ""
 	if include_uom:
 		cf_field = ", ucd.conversion_factor"
-		cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%(include_uom)s"
+		cf_join = (
+			"left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%(include_uom)s"
+		)
 
-	items = frappe.db.sql("""
+	items = frappe.db.sql(
+		"""
 		select item.name, item.item_name, item.description, item.item_group, item.brand, item.stock_uom{cf_field}
 		from `tabItem` item
 		{cf_join}
@@ -137,16 +271,21 @@
 		and item.disabled=0
 		{condition}
 		and (item.end_of_life > %(today)s or item.end_of_life is null or item.end_of_life='0000-00-00')
-		and exists (select name from `tabBin` bin where bin.item_code=item.name)"""\
-		.format(cf_field=cf_field, cf_join=cf_join, condition=condition),
-		{"today": today(), "include_uom": include_uom}, as_dict=True)
+		and exists (select name from `tabBin` bin where bin.item_code=item.name)""".format(
+			cf_field=cf_field, cf_join=cf_join, condition=condition
+		),
+		{"today": today(), "include_uom": include_uom},
+		as_dict=True,
+	)
 
 	condition = ""
 	if item_code:
-		condition = 'where parent={0}'.format(frappe.db.escape(item_code, percent=False))
+		condition = "where parent={0}".format(frappe.db.escape(item_code, percent=False))
 
 	reorder_levels = frappe._dict()
-	for ir in frappe.db.sql("""select * from `tabItem Reorder` {condition}""".format(condition=condition), as_dict=1):
+	for ir in frappe.db.sql(
+		"""select * from `tabItem Reorder` {condition}""".format(condition=condition), as_dict=1
+	):
 		if ir.parent not in reorder_levels:
 			reorder_levels[ir.parent] = []
 
diff --git a/erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py b/erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py
index a7b4835..70f04da 100644
--- a/erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py
+++ b/erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py
@@ -12,12 +12,14 @@
 	data = get_data(filters.warehouse)
 	return columns, data
 
+
 def validate_warehouse(filters):
 	company = filters.company
 	warehouse = filters.warehouse
 	if not frappe.db.exists("Warehouse", {"name": warehouse, "company": company}):
 		frappe.throw(_("Warehouse: {0} does not belong to {1}").format(warehouse, company))
 
+
 def get_columns():
 	columns = [
 		{
@@ -25,49 +27,37 @@
 			"fieldname": "item_code",
 			"fieldtype": "Link",
 			"options": "Item",
-			"width": 200
+			"width": 200,
 		},
-		{
-			"label": _("Item Name"),
-			"fieldname": "item_name",
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"label": _("Serial No Count"),
-			"fieldname": "total",
-			"fieldtype": "Float",
-			"width": 150
-		},
-		{
-			"label": _("Stock Qty"),
-			"fieldname": "stock_qty",
-			"fieldtype": "Float",
-			"width": 150
-		},
-		{
-			"label": _("Difference"),
-			"fieldname": "difference",
-			"fieldtype": "Float",
-			"width": 150
-		},
+		{"label": _("Item Name"), "fieldname": "item_name", "fieldtype": "Data", "width": 200},
+		{"label": _("Serial No Count"), "fieldname": "total", "fieldtype": "Float", "width": 150},
+		{"label": _("Stock Qty"), "fieldname": "stock_qty", "fieldtype": "Float", "width": 150},
+		{"label": _("Difference"), "fieldname": "difference", "fieldtype": "Float", "width": 150},
 	]
 
 	return columns
 
-def get_data(warehouse):
-	serial_item_list = frappe.get_all("Item", filters={
-		'has_serial_no': True,
-	}, fields=['item_code', 'item_name'])
 
-	status_list = ['Active', 'Expired']
+def get_data(warehouse):
+	serial_item_list = frappe.get_all(
+		"Item",
+		filters={
+			"has_serial_no": True,
+		},
+		fields=["item_code", "item_name"],
+	)
+
+	status_list = ["Active", "Expired"]
 	data = []
 	for item in serial_item_list:
-		total_serial_no = frappe.db.count("Serial No",
-			filters={"item_code": item.item_code, "status": ("in", status_list), "warehouse": warehouse})
+		total_serial_no = frappe.db.count(
+			"Serial No",
+			filters={"item_code": item.item_code, "status": ("in", status_list), "warehouse": warehouse},
+		)
 
-		actual_qty = frappe.db.get_value('Bin', fieldname=['actual_qty'],
-			filters={"warehouse": warehouse, "item_code": item.item_code})
+		actual_qty = frappe.db.get_value(
+			"Bin", fieldname=["actual_qty"], filters={"warehouse": warehouse, "item_code": item.item_code}
+		)
 
 		# frappe.db.get_value returns null if no record exist.
 		if not actual_qty:
diff --git a/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py b/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
index d1748ed..5430fe6 100644
--- a/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
+++ b/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
@@ -20,11 +20,11 @@
 		if consumed_details.get(item_code):
 			for cd in consumed_details.get(item_code):
 
-				if (cd.voucher_no not in material_transfer_vouchers):
+				if cd.voucher_no not in material_transfer_vouchers:
 					if cd.voucher_type in ["Delivery Note", "Sales Invoice"]:
 						delivered_qty += abs(flt(cd.actual_qty))
 						delivered_amount += abs(flt(cd.stock_value_difference))
-					elif cd.voucher_type!="Delivery Note":
+					elif cd.voucher_type != "Delivery Note":
 						consumed_qty += abs(flt(cd.actual_qty))
 						consumed_amount += abs(flt(cd.stock_value_difference))
 
@@ -32,66 +32,98 @@
 				total_qty += delivered_qty + consumed_qty
 				total_amount += delivered_amount + consumed_amount
 
-				row = [cd.item_code, cd.item_name, cd.description, cd.stock_uom, \
-					consumed_qty, consumed_amount, delivered_qty, delivered_amount, \
-					total_qty, total_amount, ','.join(list(set(suppliers)))]
+				row = [
+					cd.item_code,
+					cd.item_name,
+					cd.description,
+					cd.stock_uom,
+					consumed_qty,
+					consumed_amount,
+					delivered_qty,
+					delivered_amount,
+					total_qty,
+					total_amount,
+					",".join(list(set(suppliers))),
+				]
 				data.append(row)
 
 	return columns, data
 
+
 def get_columns(filters):
 	"""return columns based on filters"""
 
-	columns = [_("Item") + ":Link/Item:100"] + [_("Item Name") + "::100"] + \
-	[_("Description") + "::150"] + [_("UOM") + ":Link/UOM:90"] + \
-	[_("Consumed Qty") + ":Float:110"] + [_("Consumed Amount") + ":Currency:130"] + \
-	[_("Delivered Qty") + ":Float:110"] + [_("Delivered Amount") + ":Currency:130"] + \
-	[_("Total Qty") + ":Float:110"] + [_("Total Amount") + ":Currency:130"] + \
-	[_("Supplier(s)") + "::250"]
+	columns = (
+		[_("Item") + ":Link/Item:100"]
+		+ [_("Item Name") + "::100"]
+		+ [_("Description") + "::150"]
+		+ [_("UOM") + ":Link/UOM:90"]
+		+ [_("Consumed Qty") + ":Float:110"]
+		+ [_("Consumed Amount") + ":Currency:130"]
+		+ [_("Delivered Qty") + ":Float:110"]
+		+ [_("Delivered Amount") + ":Currency:130"]
+		+ [_("Total Qty") + ":Float:110"]
+		+ [_("Total Amount") + ":Currency:130"]
+		+ [_("Supplier(s)") + "::250"]
+	)
 
 	return columns
 
+
 def get_conditions(filters):
 	conditions = ""
 	values = []
 
-	if filters.get('from_date') and filters.get('to_date'):
+	if filters.get("from_date") and filters.get("to_date"):
 		conditions = "and sle.posting_date>=%s and sle.posting_date<=%s"
-		values = [filters.get('from_date'), filters.get('to_date')]
+		values = [filters.get("from_date"), filters.get("to_date")]
 
 	return conditions, values
 
+
 def get_consumed_details(filters):
 	conditions, values = get_conditions(filters)
 	consumed_details = {}
 
-	for d in frappe.db.sql("""select sle.item_code, i.item_name, i.description,
+	for d in frappe.db.sql(
+		"""select sle.item_code, i.item_name, i.description,
 		i.stock_uom, sle.actual_qty, sle.stock_value_difference,
 		sle.voucher_no, sle.voucher_type
 		from `tabStock Ledger Entry` sle, `tabItem` i
-		where sle.is_cancelled = 0 and sle.item_code=i.name and sle.actual_qty < 0 %s""" % conditions, values, as_dict=1):
-			consumed_details.setdefault(d.item_code, []).append(d)
+		where sle.is_cancelled = 0 and sle.item_code=i.name and sle.actual_qty < 0 %s"""
+		% conditions,
+		values,
+		as_dict=1,
+	):
+		consumed_details.setdefault(d.item_code, []).append(d)
 
 	return consumed_details
 
+
 def get_suppliers_details(filters):
 	item_supplier_map = {}
-	supplier = filters.get('supplier')
+	supplier = filters.get("supplier")
 
-	for d in frappe.db.sql("""select pr.supplier, pri.item_code from
+	for d in frappe.db.sql(
+		"""select pr.supplier, pri.item_code from
 		`tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri
 		where pr.name=pri.parent and pr.docstatus=1 and
 		pri.item_code=(select name from `tabItem` where
-			is_stock_item=1 and name=pri.item_code)""", as_dict=1):
-			item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
+			is_stock_item=1 and name=pri.item_code)""",
+		as_dict=1,
+	):
+		item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
 
-	for d in frappe.db.sql("""select pr.supplier, pri.item_code from
+	for d in frappe.db.sql(
+		"""select pr.supplier, pri.item_code from
 		`tabPurchase Invoice` pr, `tabPurchase Invoice Item` pri
 		where pr.name=pri.parent and pr.docstatus=1 and
 		ifnull(pr.update_stock, 0) = 1 and pri.item_code=(select name from `tabItem`
-			where is_stock_item=1 and name=pri.item_code)""", as_dict=1):
-			if d.item_code not in item_supplier_map:
-				item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
+			where is_stock_item=1 and name=pri.item_code)""",
+		as_dict=1,
+	):
+		if d.item_code not in item_supplier_map:
+			item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
 
 	if supplier:
 		invalid_items = []
@@ -104,6 +136,9 @@
 
 	return item_supplier_map
 
+
 def get_material_transfer_vouchers():
-	return frappe.db.sql_list("""select name from `tabStock Entry` where
-		purpose='Material Transfer' and docstatus=1""")
+	return frappe.db.sql_list(
+		"""select name from `tabStock Entry` where
+		purpose='Material Transfer' and docstatus=1"""
+	)
diff --git a/erpnext/stock/report/test_reports.py b/erpnext/stock/report/test_reports.py
index 76c2079..55b9104 100644
--- a/erpnext/stock/report/test_reports.py
+++ b/erpnext/stock/report/test_reports.py
@@ -43,8 +43,18 @@
 		},
 	),
 	("Warehouse wise Item Balance Age and Value", {"_optional": True}),
-	("Item Variant Details", {"item": "_Test Variant Item",}),
-	("Total Stock Summary", {"group_by": "warehouse",}),
+	(
+		"Item Variant Details",
+		{
+			"item": "_Test Variant Item",
+		},
+	),
+	(
+		"Total Stock Summary",
+		{
+			"group_by": "warehouse",
+		},
+	),
 	("Batch Item Expiry Status", {}),
 	("Incorrect Stock Value Report", {"company": "_Test Company with perpetual inventory"}),
 	("Incorrect Serial No Valuation", {}),
@@ -54,12 +64,7 @@
 	("Delayed Item Report", {"based_on": "Sales Invoice"}),
 	("Delayed Item Report", {"based_on": "Delivery Note"}),
 	("Stock Ageing", {"range1": 30, "range2": 60, "range3": 90, "_optional": True}),
-	("Stock Ledger Invariant Check",
-		{
-			"warehouse": "_Test Warehouse - _TC",
-			"item": "_Test Item"
-		}
-	),
+	("Stock Ledger Invariant Check", {"warehouse": "_Test Warehouse - _TC", "item": "_Test Item"}),
 ]
 
 OPTIONAL_FILTERS = {
diff --git a/erpnext/stock/report/total_stock_summary/total_stock_summary.py b/erpnext/stock/report/total_stock_summary/total_stock_summary.py
index 6f27558..21529da 100644
--- a/erpnext/stock/report/total_stock_summary/total_stock_summary.py
+++ b/erpnext/stock/report/total_stock_summary/total_stock_summary.py
@@ -15,6 +15,7 @@
 
 	return columns, stock
 
+
 def get_columns():
 	columns = [
 		_("Company") + ":Link/Company:250",
@@ -26,13 +27,16 @@
 
 	return columns
 
+
 def get_total_stock(filters):
 	conditions = ""
 	columns = ""
 
 	if filters.get("group_by") == "Warehouse":
 		if filters.get("company"):
-			conditions += " AND warehouse.company = %s" % frappe.db.escape(filters.get("company"), percent=False)
+			conditions += " AND warehouse.company = %s" % frappe.db.escape(
+				filters.get("company"), percent=False
+			)
 
 		conditions += " GROUP BY ledger.warehouse, item.item_code"
 		columns += "'' as company, ledger.warehouse"
@@ -40,7 +44,8 @@
 		conditions += " GROUP BY warehouse.company, item.item_code"
 		columns += " warehouse.company, '' as warehouse"
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 			SELECT
 				%s,
 				item.item_code,
@@ -53,4 +58,6 @@
 			INNER JOIN `tabWarehouse` warehouse
 				ON warehouse.name = ledger.warehouse
 			WHERE
-				ledger.actual_qty != 0 %s""" % (columns, conditions))
+				ledger.actual_qty != 0 %s"""
+		% (columns, conditions)
+	)
diff --git a/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py b/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
index 22bdb89..a54373f 100644
--- a/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
+++ b/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
@@ -21,7 +21,8 @@
 
 def execute(filters=None):
 	is_reposting_item_valuation_in_progress()
-	if not filters: filters = {}
+	if not filters:
+		filters = {}
 
 	validate_filters(filters)
 
@@ -39,7 +40,8 @@
 	item_value = {}
 
 	for (company, item, warehouse) in sorted(iwb_map):
-		if not item_map.get(item):  continue
+		if not item_map.get(item):
+			continue
 
 		row = []
 		qty_dict = iwb_map[(company, item, warehouse)]
@@ -50,13 +52,13 @@
 			total_stock_value += qty_dict.bal_val if wh.name == warehouse else 0.00
 
 		item_balance[(item, item_map[item]["item_group"])].append(row)
-		item_value.setdefault((item, item_map[item]["item_group"]),[])
+		item_value.setdefault((item, item_map[item]["item_group"]), [])
 		item_value[(item, item_map[item]["item_group"])].append(total_stock_value)
 
-
 	# sum bal_qty by item
 	for (item, item_group), wh_balance in item_balance.items():
-		if not item_ageing.get(item):  continue
+		if not item_ageing.get(item):
+			continue
 
 		total_stock_value = sum(item_value[(item, item_group)])
 		row = [item, item_group, total_stock_value]
@@ -81,17 +83,19 @@
 	add_warehouse_column(columns, warehouse_list)
 	return columns, data
 
+
 def get_columns(filters):
 	"""return columns"""
 
 	columns = [
-		_("Item")+":Link/Item:180",
-		_("Item Group")+"::100",
-		_("Value")+":Currency:100",
-		_("Age")+":Float:60",
+		_("Item") + ":Link/Item:180",
+		_("Item Group") + "::100",
+		_("Value") + ":Currency:100",
+		_("Age") + ":Float:60",
 	]
 	return columns
 
+
 def validate_filters(filters):
 	if not (filters.get("item_code") or filters.get("warehouse")):
 		sle_count = flt(frappe.db.sql("""select count(name) from `tabStock Ledger Entry`""")[0][0])
@@ -100,11 +104,12 @@
 	if not filters.get("company"):
 		filters["company"] = frappe.defaults.get_user_default("Company")
 
+
 def get_warehouse_list(filters):
 	from frappe.core.doctype.user_permission.user_permission import get_permitted_documents
 
-	condition = ''
-	user_permitted_warehouse = get_permitted_documents('Warehouse')
+	condition = ""
+	user_permitted_warehouse = get_permitted_documents("Warehouse")
 	value = ()
 	if user_permitted_warehouse:
 		condition = "and name in %s"
@@ -113,13 +118,20 @@
 		condition = "and name = %s"
 		value = filters.get("warehouse")
 
-	return frappe.db.sql("""select name
+	return frappe.db.sql(
+		"""select name
 		from `tabWarehouse` where is_group = 0
-		{condition}""".format(condition=condition), value, as_dict=1)
+		{condition}""".format(
+			condition=condition
+		),
+		value,
+		as_dict=1,
+	)
+
 
 def add_warehouse_column(columns, warehouse_list):
 	if len(warehouse_list) > 1:
-		columns += [_("Total Qty")+":Int:50"]
+		columns += [_("Total Qty") + ":Int:50"]
 
 	for wh in warehouse_list:
-		columns += [_(wh.name)+":Int:54"]
+		columns += [_(wh.name) + ":Int:54"]
diff --git a/erpnext/stock/stock_balance.py b/erpnext/stock/stock_balance.py
index 62017e4..e05d1c3 100644
--- a/erpnext/stock/stock_balance.py
+++ b/erpnext/stock/stock_balance.py
@@ -15,16 +15,20 @@
 	frappe.db.auto_commit_on_many_writes = 1
 
 	if allow_negative_stock:
-		existing_allow_negative_stock = frappe.db.get_value("Stock Settings", None, "allow_negative_stock")
+		existing_allow_negative_stock = frappe.db.get_value(
+			"Stock Settings", None, "allow_negative_stock"
+		)
 		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
 
-	item_warehouses = frappe.db.sql("""
+	item_warehouses = frappe.db.sql(
+		"""
 		select distinct item_code, warehouse
 		from
 			(select item_code, warehouse from tabBin
 			union
 			select item_code, warehouse from `tabStock Ledger Entry`) a
-	""")
+	"""
+	)
 	for d in item_warehouses:
 		try:
 			repost_stock(d[0], d[1], allow_zero_rate, only_actual, only_bin, allow_negative_stock)
@@ -33,11 +37,20 @@
 			frappe.db.rollback()
 
 	if allow_negative_stock:
-		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock)
+		frappe.db.set_value(
+			"Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock
+		)
 	frappe.db.auto_commit_on_many_writes = 0
 
-def repost_stock(item_code, warehouse, allow_zero_rate=False,
-	only_actual=False, only_bin=False, allow_negative_stock=False):
+
+def repost_stock(
+	item_code,
+	warehouse,
+	allow_zero_rate=False,
+	only_actual=False,
+	only_bin=False,
+	allow_negative_stock=False,
+):
 
 	if not only_bin:
 		repost_actual_qty(item_code, warehouse, allow_zero_rate, allow_negative_stock)
@@ -47,35 +60,42 @@
 			"reserved_qty": get_reserved_qty(item_code, warehouse),
 			"indented_qty": get_indented_qty(item_code, warehouse),
 			"ordered_qty": get_ordered_qty(item_code, warehouse),
-			"planned_qty": get_planned_qty(item_code, warehouse)
+			"planned_qty": get_planned_qty(item_code, warehouse),
 		}
 		if only_bin:
-			qty_dict.update({
-				"actual_qty": get_balance_qty_from_sle(item_code, warehouse)
-			})
+			qty_dict.update({"actual_qty": get_balance_qty_from_sle(item_code, warehouse)})
 
 		update_bin_qty(item_code, warehouse, qty_dict)
 
+
 def repost_actual_qty(item_code, warehouse, allow_zero_rate=False, allow_negative_stock=False):
-	create_repost_item_valuation_entry({
-		"item_code": item_code,
-		"warehouse": warehouse,
-		"posting_date": "1900-01-01",
-		"posting_time": "00:01",
-		"allow_negative_stock": allow_negative_stock,
-		"allow_zero_rate": allow_zero_rate
-	})
+	create_repost_item_valuation_entry(
+		{
+			"item_code": item_code,
+			"warehouse": warehouse,
+			"posting_date": "1900-01-01",
+			"posting_time": "00:01",
+			"allow_negative_stock": allow_negative_stock,
+			"allow_zero_rate": allow_zero_rate,
+		}
+	)
+
 
 def get_balance_qty_from_sle(item_code, warehouse):
-	balance_qty = frappe.db.sql("""select qty_after_transaction from `tabStock Ledger Entry`
+	balance_qty = frappe.db.sql(
+		"""select qty_after_transaction from `tabStock Ledger Entry`
 		where item_code=%s and warehouse=%s and is_cancelled=0
 		order by posting_date desc, posting_time desc, creation desc
-		limit 1""", (item_code, warehouse))
+		limit 1""",
+		(item_code, warehouse),
+	)
 
 	return flt(balance_qty[0][0]) if balance_qty else 0.0
 
+
 def get_reserved_qty(item_code, warehouse):
-	reserved_qty = frappe.db.sql("""
+	reserved_qty = frappe.db.sql(
+		"""
 		select
 			sum(dnpi_qty * ((so_item_qty - so_item_delivered_qty) / so_item_qty))
 		from
@@ -115,58 +135,76 @@
 			) tab
 		where
 			so_item_qty >= so_item_delivered_qty
-	""", (item_code, warehouse, item_code, warehouse))
+	""",
+		(item_code, warehouse, item_code, warehouse),
+	)
 
 	return flt(reserved_qty[0][0]) if reserved_qty else 0
 
+
 def get_indented_qty(item_code, warehouse):
 	# Ordered Qty is always maintained in stock UOM
-	inward_qty = frappe.db.sql("""
+	inward_qty = frappe.db.sql(
+		"""
 		select sum(mr_item.stock_qty - mr_item.ordered_qty)
 		from `tabMaterial Request Item` mr_item, `tabMaterial Request` mr
 		where mr_item.item_code=%s and mr_item.warehouse=%s
 			and mr.material_request_type in ('Purchase', 'Manufacture', 'Customer Provided', 'Material Transfer')
 			and mr_item.stock_qty > mr_item.ordered_qty and mr_item.parent=mr.name
 			and mr.status!='Stopped' and mr.docstatus=1
-	""", (item_code, warehouse))
+	""",
+		(item_code, warehouse),
+	)
 	inward_qty = flt(inward_qty[0][0]) if inward_qty else 0
 
-	outward_qty = frappe.db.sql("""
+	outward_qty = frappe.db.sql(
+		"""
 		select sum(mr_item.stock_qty - mr_item.ordered_qty)
 		from `tabMaterial Request Item` mr_item, `tabMaterial Request` mr
 		where mr_item.item_code=%s and mr_item.warehouse=%s
 			and mr.material_request_type = 'Material Issue'
 			and mr_item.stock_qty > mr_item.ordered_qty and mr_item.parent=mr.name
 			and mr.status!='Stopped' and mr.docstatus=1
-	""", (item_code, warehouse))
+	""",
+		(item_code, warehouse),
+	)
 	outward_qty = flt(outward_qty[0][0]) if outward_qty else 0
 
 	requested_qty = inward_qty - outward_qty
 
 	return requested_qty
 
+
 def get_ordered_qty(item_code, warehouse):
-	ordered_qty = frappe.db.sql("""
+	ordered_qty = frappe.db.sql(
+		"""
 		select sum((po_item.qty - po_item.received_qty)*po_item.conversion_factor)
 		from `tabPurchase Order Item` po_item, `tabPurchase Order` po
 		where po_item.item_code=%s and po_item.warehouse=%s
 		and po_item.qty > po_item.received_qty and po_item.parent=po.name
 		and po.status not in ('Closed', 'Delivered') and po.docstatus=1
-		and po_item.delivered_by_supplier = 0""", (item_code, warehouse))
+		and po_item.delivered_by_supplier = 0""",
+		(item_code, warehouse),
+	)
 
 	return flt(ordered_qty[0][0]) if ordered_qty else 0
 
+
 def get_planned_qty(item_code, warehouse):
-	planned_qty = frappe.db.sql("""
+	planned_qty = frappe.db.sql(
+		"""
 		select sum(qty - produced_qty) from `tabWork Order`
 		where production_item = %s and fg_warehouse = %s and status not in ("Stopped", "Completed", "Closed")
-		and docstatus=1 and qty > produced_qty""", (item_code, warehouse))
+		and docstatus=1 and qty > produced_qty""",
+		(item_code, warehouse),
+	)
 
 	return flt(planned_qty[0][0]) if planned_qty else 0
 
 
 def update_bin_qty(item_code, warehouse, qty_dict=None):
 	from erpnext.stock.utils import get_bin
+
 	bin = get_bin(item_code, warehouse)
 	mismatch = False
 	for field, value in qty_dict.items():
@@ -180,41 +218,54 @@
 		bin.db_update()
 		bin.clear_cache()
 
-def set_stock_balance_as_per_serial_no(item_code=None, posting_date=None, posting_time=None,
-	 	fiscal_year=None):
-	if not posting_date: posting_date = nowdate()
-	if not posting_time: posting_time = nowtime()
 
-	condition = " and item.name='%s'" % item_code.replace("'", "\'") if item_code else ""
+def set_stock_balance_as_per_serial_no(
+	item_code=None, posting_date=None, posting_time=None, fiscal_year=None
+):
+	if not posting_date:
+		posting_date = nowdate()
+	if not posting_time:
+		posting_time = nowtime()
 
-	bin = frappe.db.sql("""select bin.item_code, bin.warehouse, bin.actual_qty, item.stock_uom
+	condition = " and item.name='%s'" % item_code.replace("'", "'") if item_code else ""
+
+	bin = frappe.db.sql(
+		"""select bin.item_code, bin.warehouse, bin.actual_qty, item.stock_uom
 		from `tabBin` bin, tabItem item
-		where bin.item_code = item.name and item.has_serial_no = 1 %s""" % condition)
+		where bin.item_code = item.name and item.has_serial_no = 1 %s"""
+		% condition
+	)
 
 	for d in bin:
-		serial_nos = frappe.db.sql("""select count(name) from `tabSerial No`
-			where item_code=%s and warehouse=%s and docstatus < 2""", (d[0], d[1]))
+		serial_nos = frappe.db.sql(
+			"""select count(name) from `tabSerial No`
+			where item_code=%s and warehouse=%s and docstatus < 2""",
+			(d[0], d[1]),
+		)
 
-		sle = frappe.db.sql("""select valuation_rate, company from `tabStock Ledger Entry`
+		sle = frappe.db.sql(
+			"""select valuation_rate, company from `tabStock Ledger Entry`
 			where item_code = %s and warehouse = %s and is_cancelled = 0
-			order by posting_date desc limit 1""", (d[0], d[1]))
+			order by posting_date desc limit 1""",
+			(d[0], d[1]),
+		)
 
 		sle_dict = {
-			'doctype'					: 'Stock Ledger Entry',
-			'item_code'					: d[0],
-			'warehouse'					: d[1],
-			'transaction_date'	 		: nowdate(),
-			'posting_date'				: posting_date,
-			'posting_time'			 	: posting_time,
-			'voucher_type'			 	: 'Stock Reconciliation (Manual)',
-			'voucher_no'				: '',
-			'voucher_detail_no'			: '',
-			'actual_qty'				: flt(serial_nos[0][0]) - flt(d[2]),
-			'stock_uom'					: d[3],
-			'incoming_rate'				: sle and flt(serial_nos[0][0]) > flt(d[2]) and flt(sle[0][0]) or 0,
-			'company'					: sle and cstr(sle[0][1]) or 0,
-			'batch_no'					: '',
-			'serial_no'					: ''
+			"doctype": "Stock Ledger Entry",
+			"item_code": d[0],
+			"warehouse": d[1],
+			"transaction_date": nowdate(),
+			"posting_date": posting_date,
+			"posting_time": posting_time,
+			"voucher_type": "Stock Reconciliation (Manual)",
+			"voucher_no": "",
+			"voucher_detail_no": "",
+			"actual_qty": flt(serial_nos[0][0]) - flt(d[2]),
+			"stock_uom": d[3],
+			"incoming_rate": sle and flt(serial_nos[0][0]) > flt(d[2]) and flt(sle[0][0]) or 0,
+			"company": sle and cstr(sle[0][1]) or 0,
+			"batch_no": "",
+			"serial_no": "",
 		}
 
 		sle_doc = frappe.get_doc(sle_dict)
@@ -223,16 +274,17 @@
 		sle_doc.insert()
 
 		args = sle_dict.copy()
-		args.update({
-			"sle_id": sle_doc.name
-		})
+		args.update({"sle_id": sle_doc.name})
 
-		create_repost_item_valuation_entry({
-			"item_code": d[0],
-			"warehouse": d[1],
-			"posting_date": posting_date,
-			"posting_time": posting_time
-		})
+		create_repost_item_valuation_entry(
+			{
+				"item_code": d[0],
+				"warehouse": d[1],
+				"posting_date": posting_date,
+				"posting_time": posting_time,
+			}
+		)
+
 
 def reset_serial_no_status_and_warehouse(serial_nos=None):
 	if not serial_nos:
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 1aaaad2..967b2b2 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -22,28 +22,32 @@
 from erpnext.stock.valuation import FIFOValuation, LIFOValuation, round_off_if_near_zero
 
 
-class NegativeStockError(frappe.ValidationError): pass
+class NegativeStockError(frappe.ValidationError):
+	pass
+
+
 class SerialNoExistsInFutureTransaction(frappe.ValidationError):
 	pass
 
 
 def make_sl_entries(sl_entries, allow_negative_stock=False, via_landed_cost_voucher=False):
-	""" Create SL entries from SL entry dicts
+	"""Create SL entries from SL entry dicts
 
-		args:
-			- allow_negative_stock: disable negative stock valiations if true
-			- via_landed_cost_voucher: landed cost voucher cancels and reposts
-			entries of purchase document. This flag is used to identify if
-			cancellation and repost is happening via landed cost voucher, in
-			such cases certain validations need to be ignored (like negative
-					stock)
+	args:
+	        - allow_negative_stock: disable negative stock valiations if true
+	        - via_landed_cost_voucher: landed cost voucher cancels and reposts
+	        entries of purchase document. This flag is used to identify if
+	        cancellation and repost is happening via landed cost voucher, in
+	        such cases certain validations need to be ignored (like negative
+	                        stock)
 	"""
 	from erpnext.controllers.stock_controller import future_sle_exists
+
 	if sl_entries:
 		cancel = sl_entries[0].get("is_cancelled")
 		if cancel:
 			validate_cancellation(sl_entries)
-			set_as_cancel(sl_entries[0].get('voucher_type'), sl_entries[0].get('voucher_no'))
+			set_as_cancel(sl_entries[0].get("voucher_type"), sl_entries[0].get("voucher_no"))
 
 		args = get_args_for_future_sle(sl_entries[0])
 		future_sle_exists(args, sl_entries)
@@ -53,19 +57,21 @@
 				validate_serial_no(sle)
 
 			if cancel:
-				sle['actual_qty'] = -flt(sle.get('actual_qty'))
+				sle["actual_qty"] = -flt(sle.get("actual_qty"))
 
-				if sle['actual_qty'] < 0 and not sle.get('outgoing_rate'):
-					sle['outgoing_rate'] = get_incoming_outgoing_rate_for_cancel(sle.item_code,
-						sle.voucher_type, sle.voucher_no, sle.voucher_detail_no)
-					sle['incoming_rate'] = 0.0
+				if sle["actual_qty"] < 0 and not sle.get("outgoing_rate"):
+					sle["outgoing_rate"] = get_incoming_outgoing_rate_for_cancel(
+						sle.item_code, sle.voucher_type, sle.voucher_no, sle.voucher_detail_no
+					)
+					sle["incoming_rate"] = 0.0
 
-				if sle['actual_qty'] > 0 and not sle.get('incoming_rate'):
-					sle['incoming_rate'] = get_incoming_outgoing_rate_for_cancel(sle.item_code,
-						sle.voucher_type, sle.voucher_no, sle.voucher_detail_no)
-					sle['outgoing_rate'] = 0.0
+				if sle["actual_qty"] > 0 and not sle.get("incoming_rate"):
+					sle["incoming_rate"] = get_incoming_outgoing_rate_for_cancel(
+						sle.item_code, sle.voucher_type, sle.voucher_no, sle.voucher_detail_no
+					)
+					sle["outgoing_rate"] = 0.0
 
-			if sle.get("actual_qty") or sle.get("voucher_type")=="Stock Reconciliation":
+			if sle.get("actual_qty") or sle.get("voucher_type") == "Stock Reconciliation":
 				sle_doc = make_entry(sle, allow_negative_stock, via_landed_cost_voucher)
 
 			args = sle_doc.as_dict()
@@ -74,13 +80,16 @@
 				# preserve previous_qty_after_transaction for qty reposting
 				args.previous_qty_after_transaction = sle.get("previous_qty_after_transaction")
 
-			is_stock_item = frappe.get_cached_value('Item', args.get("item_code"), 'is_stock_item')
+			is_stock_item = frappe.get_cached_value("Item", args.get("item_code"), "is_stock_item")
 			if is_stock_item:
 				bin_name = get_or_make_bin(args.get("item_code"), args.get("warehouse"))
 				repost_current_voucher(args, allow_negative_stock, via_landed_cost_voucher)
 				update_bin_qty(bin_name, args)
 			else:
-				frappe.msgprint(_("Item {0} ignored since it is not a stock item").format(args.get("item_code")))
+				frappe.msgprint(
+					_("Item {0} ignored since it is not a stock item").format(args.get("item_code"))
+				)
+
 
 def repost_current_voucher(args, allow_negative_stock=False, via_landed_cost_voucher=False):
 	if args.get("actual_qty") or args.get("voucher_type") == "Stock Reconciliation":
@@ -92,28 +101,35 @@
 
 		# Reposts only current voucher SL Entries
 		# Updates valuation rate, stock value, stock queue for current transaction
-		update_entries_after({
-			"item_code": args.get('item_code'),
-			"warehouse": args.get('warehouse'),
-			"posting_date": args.get("posting_date"),
-			"posting_time": args.get("posting_time"),
-			"voucher_type": args.get("voucher_type"),
-			"voucher_no": args.get("voucher_no"),
-			"sle_id": args.get('name'),
-			"creation": args.get('creation')
-		}, allow_negative_stock=allow_negative_stock, via_landed_cost_voucher=via_landed_cost_voucher)
+		update_entries_after(
+			{
+				"item_code": args.get("item_code"),
+				"warehouse": args.get("warehouse"),
+				"posting_date": args.get("posting_date"),
+				"posting_time": args.get("posting_time"),
+				"voucher_type": args.get("voucher_type"),
+				"voucher_no": args.get("voucher_no"),
+				"sle_id": args.get("name"),
+				"creation": args.get("creation"),
+			},
+			allow_negative_stock=allow_negative_stock,
+			via_landed_cost_voucher=via_landed_cost_voucher,
+		)
 
 		# update qty in future sle and Validate negative qty
 		update_qty_in_future_sle(args, allow_negative_stock)
 
 
 def get_args_for_future_sle(row):
-	return frappe._dict({
-		'voucher_type': row.get('voucher_type'),
-		'voucher_no': row.get('voucher_no'),
-		'posting_date': row.get('posting_date'),
-		'posting_time': row.get('posting_time')
-	})
+	return frappe._dict(
+		{
+			"voucher_type": row.get("voucher_type"),
+			"voucher_no": row.get("voucher_no"),
+			"posting_date": row.get("posting_date"),
+			"posting_time": row.get("posting_time"),
+		}
+	)
+
 
 def validate_serial_no(sle):
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
@@ -121,58 +137,79 @@
 	for sn in get_serial_nos(sle.serial_no):
 		args = copy.deepcopy(sle)
 		args.serial_no = sn
-		args.warehouse = ''
+		args.warehouse = ""
 
 		vouchers = []
-		for row in get_stock_ledger_entries(args, '>'):
+		for row in get_stock_ledger_entries(args, ">"):
 			voucher_type = frappe.bold(row.voucher_type)
 			voucher_no = frappe.bold(get_link_to_form(row.voucher_type, row.voucher_no))
-			vouchers.append(f'{voucher_type} {voucher_no}')
+			vouchers.append(f"{voucher_type} {voucher_no}")
 
 		if vouchers:
 			serial_no = frappe.bold(sn)
-			msg = (f'''The serial no {serial_no} has been used in the future transactions so you need to cancel them first.
-				The list of the transactions are as below.''' + '<br><br><ul><li>')
+			msg = (
+				f"""The serial no {serial_no} has been used in the future transactions so you need to cancel them first.
+				The list of the transactions are as below."""
+				+ "<br><br><ul><li>"
+			)
 
-			msg += '</li><li>'.join(vouchers)
-			msg += '</li></ul>'
+			msg += "</li><li>".join(vouchers)
+			msg += "</li></ul>"
 
-			title = 'Cannot Submit' if not sle.get('is_cancelled') else 'Cannot Cancel'
+			title = "Cannot Submit" if not sle.get("is_cancelled") else "Cannot Cancel"
 			frappe.throw(_(msg), title=_(title), exc=SerialNoExistsInFutureTransaction)
 
+
 def validate_cancellation(args):
 	if args[0].get("is_cancelled"):
-		repost_entry = frappe.db.get_value("Repost Item Valuation", {
-			'voucher_type': args[0].voucher_type,
-			'voucher_no': args[0].voucher_no,
-			'docstatus': 1
-		}, ['name', 'status'], as_dict=1)
+		repost_entry = frappe.db.get_value(
+			"Repost Item Valuation",
+			{"voucher_type": args[0].voucher_type, "voucher_no": args[0].voucher_no, "docstatus": 1},
+			["name", "status"],
+			as_dict=1,
+		)
 
 		if repost_entry:
-			if repost_entry.status == 'In Progress':
-				frappe.throw(_("Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet."))
-			if repost_entry.status == 'Queued':
+			if repost_entry.status == "In Progress":
+				frappe.throw(
+					_(
+						"Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet."
+					)
+				)
+			if repost_entry.status == "Queued":
 				doc = frappe.get_doc("Repost Item Valuation", repost_entry.name)
 				doc.flags.ignore_permissions = True
 				doc.cancel()
 				doc.delete()
 
+
 def set_as_cancel(voucher_type, voucher_no):
-	frappe.db.sql("""update `tabStock Ledger Entry` set is_cancelled=1,
+	frappe.db.sql(
+		"""update `tabStock Ledger Entry` set is_cancelled=1,
 		modified=%s, modified_by=%s
 		where voucher_type=%s and voucher_no=%s and is_cancelled = 0""",
-		(now(), frappe.session.user, voucher_type, voucher_no))
+		(now(), frappe.session.user, voucher_type, voucher_no),
+	)
+
 
 def make_entry(args, allow_negative_stock=False, via_landed_cost_voucher=False):
 	args["doctype"] = "Stock Ledger Entry"
 	sle = frappe.get_doc(args)
 	sle.flags.ignore_permissions = 1
-	sle.allow_negative_stock=allow_negative_stock
+	sle.allow_negative_stock = allow_negative_stock
 	sle.via_landed_cost_voucher = via_landed_cost_voucher
 	sle.submit()
 	return sle
 
-def repost_future_sle(args=None, voucher_type=None, voucher_no=None, allow_negative_stock=None, via_landed_cost_voucher=False, doc=None):
+
+def repost_future_sle(
+	args=None,
+	voucher_type=None,
+	voucher_no=None,
+	allow_negative_stock=None,
+	via_landed_cost_voucher=False,
+	doc=None,
+):
 	if not args and voucher_type and voucher_no:
 		args = get_items_to_be_repost(voucher_type, voucher_no, doc)
 
@@ -182,20 +219,28 @@
 	while i < len(args):
 		validate_item_warehouse(args[i])
 
-		obj = update_entries_after({
-			'item_code': args[i].get('item_code'),
-			'warehouse': args[i].get('warehouse'),
-			'posting_date': args[i].get('posting_date'),
-			'posting_time': args[i].get('posting_time'),
-			'creation': args[i].get('creation'),
-			'distinct_item_warehouses': distinct_item_warehouses
-		}, allow_negative_stock=allow_negative_stock, via_landed_cost_voucher=via_landed_cost_voucher)
+		obj = update_entries_after(
+			{
+				"item_code": args[i].get("item_code"),
+				"warehouse": args[i].get("warehouse"),
+				"posting_date": args[i].get("posting_date"),
+				"posting_time": args[i].get("posting_time"),
+				"creation": args[i].get("creation"),
+				"distinct_item_warehouses": distinct_item_warehouses,
+			},
+			allow_negative_stock=allow_negative_stock,
+			via_landed_cost_voucher=via_landed_cost_voucher,
+		)
 
-		distinct_item_warehouses[(args[i].get('item_code'), args[i].get('warehouse'))].reposting_status = True
+		distinct_item_warehouses[
+			(args[i].get("item_code"), args[i].get("warehouse"))
+		].reposting_status = True
 
 		if obj.new_items_found:
 			for item_wh, data in distinct_item_warehouses.items():
-				if ('args_idx' not in data and not data.reposting_status) or (data.sle_changed and data.reposting_status):
+				if ("args_idx" not in data and not data.reposting_status) or (
+					data.sle_changed and data.reposting_status
+				):
 					data.args_idx = len(args)
 					args.append(data.sle)
 				elif data.sle_changed and not data.reposting_status:
@@ -210,82 +255,104 @@
 	if doc and args:
 		update_args_in_repost_item_valuation(doc, i, args, distinct_item_warehouses)
 
+
 def validate_item_warehouse(args):
-	for field in ['item_code', 'warehouse', 'posting_date', 'posting_time']:
+	for field in ["item_code", "warehouse", "posting_date", "posting_time"]:
 		if not args.get(field):
-			validation_msg = f'The field {frappe.unscrub(args.get(field))} is required for the reposting'
+			validation_msg = f"The field {frappe.unscrub(args.get(field))} is required for the reposting"
 			frappe.throw(_(validation_msg))
 
+
 def update_args_in_repost_item_valuation(doc, index, args, distinct_item_warehouses):
-	frappe.db.set_value(doc.doctype, doc.name, {
-		'items_to_be_repost': json.dumps(args, default=str),
-		'distinct_item_and_warehouse': json.dumps({str(k): v for k,v in distinct_item_warehouses.items()}, default=str),
-		'current_index': index
-	})
+	frappe.db.set_value(
+		doc.doctype,
+		doc.name,
+		{
+			"items_to_be_repost": json.dumps(args, default=str),
+			"distinct_item_and_warehouse": json.dumps(
+				{str(k): v for k, v in distinct_item_warehouses.items()}, default=str
+			),
+			"current_index": index,
+		},
+	)
 
 	frappe.db.commit()
 
-	frappe.publish_realtime('item_reposting_progress', {
-		'name': doc.name,
-		'items_to_be_repost': json.dumps(args, default=str),
-		'current_index': index
-	})
+	frappe.publish_realtime(
+		"item_reposting_progress",
+		{"name": doc.name, "items_to_be_repost": json.dumps(args, default=str), "current_index": index},
+	)
+
 
 def get_items_to_be_repost(voucher_type, voucher_no, doc=None):
 	if doc and doc.items_to_be_repost:
 		return json.loads(doc.items_to_be_repost) or []
 
-	return frappe.db.get_all("Stock Ledger Entry",
+	return frappe.db.get_all(
+		"Stock Ledger Entry",
 		filters={"voucher_type": voucher_type, "voucher_no": voucher_no},
 		fields=["item_code", "warehouse", "posting_date", "posting_time", "creation"],
 		order_by="creation asc",
-		group_by="item_code, warehouse"
+		group_by="item_code, warehouse",
 	)
 
+
 def get_distinct_item_warehouse(args=None, doc=None):
 	distinct_item_warehouses = {}
 	if doc and doc.distinct_item_and_warehouse:
 		distinct_item_warehouses = json.loads(doc.distinct_item_and_warehouse)
-		distinct_item_warehouses = {frappe.safe_eval(k): frappe._dict(v) for k, v in distinct_item_warehouses.items()}
+		distinct_item_warehouses = {
+			frappe.safe_eval(k): frappe._dict(v) for k, v in distinct_item_warehouses.items()
+		}
 	else:
 		for i, d in enumerate(args):
-			distinct_item_warehouses.setdefault((d.item_code, d.warehouse), frappe._dict({
-				"reposting_status": False,
-				"sle": d,
-				"args_idx": i
-			}))
+			distinct_item_warehouses.setdefault(
+				(d.item_code, d.warehouse), frappe._dict({"reposting_status": False, "sle": d, "args_idx": i})
+			)
 
 	return distinct_item_warehouses
 
+
 def get_current_index(doc=None):
 	if doc and doc.current_index:
 		return doc.current_index
 
+
 class update_entries_after(object):
 	"""
-		update valution rate and qty after transaction
-		from the current time-bucket onwards
+	update valution rate and qty after transaction
+	from the current time-bucket onwards
 
-		:param args: args as dict
+	:param args: args as dict
 
-			args = {
-				"item_code": "ABC",
-				"warehouse": "XYZ",
-				"posting_date": "2012-12-12",
-				"posting_time": "12:00"
-			}
+	        args = {
+	                "item_code": "ABC",
+	                "warehouse": "XYZ",
+	                "posting_date": "2012-12-12",
+	                "posting_time": "12:00"
+	        }
 	"""
-	def __init__(self, args, allow_zero_rate=False, allow_negative_stock=None, via_landed_cost_voucher=False, verbose=1):
+
+	def __init__(
+		self,
+		args,
+		allow_zero_rate=False,
+		allow_negative_stock=None,
+		via_landed_cost_voucher=False,
+		verbose=1,
+	):
 		self.exceptions = {}
 		self.verbose = verbose
 		self.allow_zero_rate = allow_zero_rate
 		self.via_landed_cost_voucher = via_landed_cost_voucher
 		self.item_code = args.get("item_code")
-		self.allow_negative_stock = allow_negative_stock or is_negative_stock_allowed(item_code=self.item_code)
+		self.allow_negative_stock = allow_negative_stock or is_negative_stock_allowed(
+			item_code=self.item_code
+		)
 
 		self.args = frappe._dict(args)
 		if self.args.sle_id:
-			self.args['name'] = self.args.sle_id
+			self.args["name"] = self.args.sle_id
 
 		self.company = frappe.get_cached_value("Warehouse", self.args.warehouse, "company")
 		self.get_precision()
@@ -299,28 +366,29 @@
 		self.build()
 
 	def get_precision(self):
-		company_base_currency = frappe.get_cached_value('Company',  self.company,  "default_currency")
-		self.precision = get_field_precision(frappe.get_meta("Stock Ledger Entry").get_field("stock_value"),
-			currency=company_base_currency)
+		company_base_currency = frappe.get_cached_value("Company", self.company, "default_currency")
+		self.precision = get_field_precision(
+			frappe.get_meta("Stock Ledger Entry").get_field("stock_value"), currency=company_base_currency
+		)
 
 	def initialize_previous_data(self, args):
 		"""
-			Get previous sl entries for current item for each related warehouse
-			and assigns into self.data dict
+		Get previous sl entries for current item for each related warehouse
+		and assigns into self.data dict
 
-			:Data Structure:
+		:Data Structure:
 
-			self.data = {
-				warehouse1: {
-					'previus_sle': {},
-					'qty_after_transaction': 10,
-					'valuation_rate': 100,
-					'stock_value': 1000,
-					'prev_stock_value': 1000,
-					'stock_queue': '[[10, 100]]',
-					'stock_value_difference': 1000
-				}
-			}
+		self.data = {
+		        warehouse1: {
+		                'previus_sle': {},
+		                'qty_after_transaction': 10,
+		                'valuation_rate': 100,
+		                'stock_value': 1000,
+		                'prev_stock_value': 1000,
+		                'stock_queue': '[[10, 100]]',
+		                'stock_value_difference': 1000
+		        }
+		}
 
 		"""
 		self.data.setdefault(args.warehouse, frappe._dict())
@@ -331,11 +399,13 @@
 		for key in ("qty_after_transaction", "valuation_rate", "stock_value"):
 			setattr(warehouse_dict, key, flt(previous_sle.get(key)))
 
-		warehouse_dict.update({
-			"prev_stock_value": previous_sle.stock_value or 0.0,
-			"stock_queue": json.loads(previous_sle.stock_queue or "[]"),
-			"stock_value_difference": 0.0
-		})
+		warehouse_dict.update(
+			{
+				"prev_stock_value": previous_sle.stock_value or 0.0,
+				"stock_queue": json.loads(previous_sle.stock_queue or "[]"),
+				"stock_value_difference": 0.0,
+			}
+		)
 
 	def build(self):
 		from erpnext.controllers.stock_controller import future_sle_exists
@@ -368,9 +438,10 @@
 			self.process_sle(sle)
 
 	def get_sle_against_current_voucher(self):
-		self.args['time_format'] = '%H:%i:%s'
+		self.args["time_format"] = "%H:%i:%s"
 
-		return frappe.db.sql("""
+		return frappe.db.sql(
+			"""
 			select
 				*, timestamp(posting_date, posting_time) as "timestamp"
 			from
@@ -384,22 +455,29 @@
 			order by
 				creation ASC
 			for update
-		""", self.args, as_dict=1)
+		""",
+			self.args,
+			as_dict=1,
+		)
 
 	def get_future_entries_to_fix(self):
 		# includes current entry!
-		args = self.data[self.args.warehouse].previous_sle \
-			or frappe._dict({"item_code": self.item_code, "warehouse": self.args.warehouse})
+		args = self.data[self.args.warehouse].previous_sle or frappe._dict(
+			{"item_code": self.item_code, "warehouse": self.args.warehouse}
+		)
 
 		return list(self.get_sle_after_datetime(args))
 
 	def get_dependent_entries_to_fix(self, entries_to_fix, sle):
-		dependant_sle = get_sle_by_voucher_detail_no(sle.dependant_sle_voucher_detail_no,
-			excluded_sle=sle.name)
+		dependant_sle = get_sle_by_voucher_detail_no(
+			sle.dependant_sle_voucher_detail_no, excluded_sle=sle.name
+		)
 
 		if not dependant_sle:
 			return entries_to_fix
-		elif dependant_sle.item_code == self.item_code and dependant_sle.warehouse == self.args.warehouse:
+		elif (
+			dependant_sle.item_code == self.item_code and dependant_sle.warehouse == self.args.warehouse
+		):
 			return entries_to_fix
 		elif dependant_sle.item_code != self.item_code:
 			self.update_distinct_item_warehouses(dependant_sle)
@@ -411,14 +489,14 @@
 
 	def update_distinct_item_warehouses(self, dependant_sle):
 		key = (dependant_sle.item_code, dependant_sle.warehouse)
-		val = frappe._dict({
-			"sle": dependant_sle
-		})
+		val = frappe._dict({"sle": dependant_sle})
 		if key not in self.distinct_item_warehouses:
 			self.distinct_item_warehouses[key] = val
 			self.new_items_found = True
 		else:
-			existing_sle_posting_date = self.distinct_item_warehouses[key].get("sle", {}).get("posting_date")
+			existing_sle_posting_date = (
+				self.distinct_item_warehouses[key].get("sle", {}).get("posting_date")
+			)
 			if getdate(dependant_sle.posting_date) < getdate(existing_sle_posting_date):
 				val.sle_changed = True
 				self.distinct_item_warehouses[key] = val
@@ -427,12 +505,13 @@
 	def append_future_sle_for_dependant(self, dependant_sle, entries_to_fix):
 		self.initialize_previous_data(dependant_sle)
 
-		args = self.data[dependant_sle.warehouse].previous_sle \
-			or frappe._dict({"item_code": self.item_code, "warehouse": dependant_sle.warehouse})
+		args = self.data[dependant_sle.warehouse].previous_sle or frappe._dict(
+			{"item_code": self.item_code, "warehouse": dependant_sle.warehouse}
+		)
 		future_sle_for_dependant = list(self.get_sle_after_datetime(args))
 
 		entries_to_fix.extend(future_sle_for_dependant)
-		return sorted(entries_to_fix, key=lambda k: k['timestamp'])
+		return sorted(entries_to_fix, key=lambda k: k["timestamp"])
 
 	def process_sle(self, sle):
 		from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
@@ -457,22 +536,30 @@
 			if sle.voucher_type == "Stock Reconciliation":
 				self.wh_data.qty_after_transaction = sle.qty_after_transaction
 
-			self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(self.wh_data.valuation_rate)
-		elif sle.batch_no and frappe.db.get_value("Batch", sle.batch_no, "use_batchwise_valuation", cache=True):
+			self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(
+				self.wh_data.valuation_rate
+			)
+		elif sle.batch_no and frappe.db.get_value(
+			"Batch", sle.batch_no, "use_batchwise_valuation", cache=True
+		):
 			self.update_batched_values(sle)
 		else:
-			if sle.voucher_type=="Stock Reconciliation" and not sle.batch_no:
+			if sle.voucher_type == "Stock Reconciliation" and not sle.batch_no:
 				# assert
 				self.wh_data.valuation_rate = sle.valuation_rate
 				self.wh_data.qty_after_transaction = sle.qty_after_transaction
-				self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(self.wh_data.valuation_rate)
+				self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(
+					self.wh_data.valuation_rate
+				)
 				if self.valuation_method != "Moving Average":
 					self.wh_data.stock_queue = [[self.wh_data.qty_after_transaction, self.wh_data.valuation_rate]]
 			else:
 				if self.valuation_method == "Moving Average":
 					self.get_moving_average_values(sle)
 					self.wh_data.qty_after_transaction += flt(sle.actual_qty)
-					self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(self.wh_data.valuation_rate)
+					self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(
+						self.wh_data.valuation_rate
+					)
 				else:
 					self.update_queue_values(sle)
 
@@ -489,17 +576,16 @@
 		sle.stock_value = self.wh_data.stock_value
 		sle.stock_queue = json.dumps(self.wh_data.stock_queue)
 		sle.stock_value_difference = stock_value_difference
-		sle.doctype="Stock Ledger Entry"
+		sle.doctype = "Stock Ledger Entry"
 		frappe.get_doc(sle).db_update()
 
 		if not self.args.get("sle_id"):
 			self.update_outgoing_rate_on_transaction(sle)
 
-
 	def validate_negative_stock(self, sle):
 		"""
-			validate negative stock for entries current datetime onwards
-			will not consider cancelled entries
+		validate negative stock for entries current datetime onwards
+		will not consider cancelled entries
 		"""
 		diff = self.wh_data.qty_after_transaction + flt(sle.actual_qty)
 
@@ -528,13 +614,24 @@
 			self.recalculate_amounts_in_stock_entry(sle.voucher_no)
 			rate = frappe.db.get_value("Stock Entry Detail", sle.voucher_detail_no, "valuation_rate")
 		# Sales and Purchase Return
-		elif sle.voucher_type in ("Purchase Receipt", "Purchase Invoice", "Delivery Note", "Sales Invoice"):
+		elif sle.voucher_type in (
+			"Purchase Receipt",
+			"Purchase Invoice",
+			"Delivery Note",
+			"Sales Invoice",
+		):
 			if frappe.get_cached_value(sle.voucher_type, sle.voucher_no, "is_return"):
 				from erpnext.controllers.sales_and_purchase_return import (
 					get_rate_for_return,  # don't move this import to top
 				)
-				rate = get_rate_for_return(sle.voucher_type, sle.voucher_no, sle.item_code,
-					voucher_detail_no=sle.voucher_detail_no, sle = sle)
+
+				rate = get_rate_for_return(
+					sle.voucher_type,
+					sle.voucher_no,
+					sle.item_code,
+					voucher_detail_no=sle.voucher_detail_no,
+					sle=sle,
+				)
 			else:
 				if sle.voucher_type in ("Purchase Receipt", "Purchase Invoice"):
 					rate_field = "valuation_rate"
@@ -542,8 +639,9 @@
 					rate_field = "incoming_rate"
 
 				# check in item table
-				item_code, incoming_rate = frappe.db.get_value(sle.voucher_type + " Item",
-					sle.voucher_detail_no, ["item_code", rate_field])
+				item_code, incoming_rate = frappe.db.get_value(
+					sle.voucher_type + " Item", sle.voucher_detail_no, ["item_code", rate_field]
+				)
 
 				if item_code == sle.item_code:
 					rate = incoming_rate
@@ -553,15 +651,18 @@
 					else:
 						ref_doctype = "Purchase Receipt Item Supplied"
 
-					rate = frappe.db.get_value(ref_doctype, {"parent_detail_docname": sle.voucher_detail_no,
-						"item_code": sle.item_code}, rate_field)
+					rate = frappe.db.get_value(
+						ref_doctype,
+						{"parent_detail_docname": sle.voucher_detail_no, "item_code": sle.item_code},
+						rate_field,
+					)
 
 		return rate
 
 	def update_outgoing_rate_on_transaction(self, sle):
 		"""
-			Update outgoing rate in Stock Entry, Delivery Note, Sales Invoice and Sales Return
-			In case of Stock Entry, also calculate FG Item rate and total incoming/outgoing amount
+		Update outgoing rate in Stock Entry, Delivery Note, Sales Invoice and Sales Return
+		In case of Stock Entry, also calculate FG Item rate and total incoming/outgoing amount
 		"""
 		if sle.actual_qty and sle.voucher_detail_no:
 			outgoing_rate = abs(flt(sle.stock_value_difference)) / abs(sle.actual_qty)
@@ -591,24 +692,33 @@
 		# Update item's incoming rate on transaction
 		item_code = frappe.db.get_value(sle.voucher_type + " Item", sle.voucher_detail_no, "item_code")
 		if item_code == sle.item_code:
-			frappe.db.set_value(sle.voucher_type + " Item", sle.voucher_detail_no, "incoming_rate", outgoing_rate)
+			frappe.db.set_value(
+				sle.voucher_type + " Item", sle.voucher_detail_no, "incoming_rate", outgoing_rate
+			)
 		else:
 			# packed item
-			frappe.db.set_value("Packed Item",
+			frappe.db.set_value(
+				"Packed Item",
 				{"parent_detail_docname": sle.voucher_detail_no, "item_code": sle.item_code},
-				"incoming_rate", outgoing_rate)
+				"incoming_rate",
+				outgoing_rate,
+			)
 
 	def update_rate_on_purchase_receipt(self, sle, outgoing_rate):
 		if frappe.db.exists(sle.voucher_type + " Item", sle.voucher_detail_no):
-			frappe.db.set_value(sle.voucher_type + " Item", sle.voucher_detail_no, "base_net_rate", outgoing_rate)
+			frappe.db.set_value(
+				sle.voucher_type + " Item", sle.voucher_detail_no, "base_net_rate", outgoing_rate
+			)
 		else:
-			frappe.db.set_value("Purchase Receipt Item Supplied", sle.voucher_detail_no, "rate", outgoing_rate)
+			frappe.db.set_value(
+				"Purchase Receipt Item Supplied", sle.voucher_detail_no, "rate", outgoing_rate
+			)
 
 		# Recalculate subcontracted item's rate in case of subcontracted purchase receipt/invoice
-		if frappe.get_cached_value(sle.voucher_type, sle.voucher_no, "is_subcontracted") == 'Yes':
+		if frappe.get_cached_value(sle.voucher_type, sle.voucher_no, "is_subcontracted") == "Yes":
 			doc = frappe.get_doc(sle.voucher_type, sle.voucher_no)
 			doc.update_valuation_rate(reset_outgoing_rate=False)
-			for d in (doc.items + doc.supplied_items):
+			for d in doc.items + doc.supplied_items:
 				d.db_update()
 
 	def get_serialized_values(self, sle):
@@ -635,29 +745,34 @@
 		new_stock_qty = self.wh_data.qty_after_transaction + actual_qty
 
 		if new_stock_qty > 0:
-			new_stock_value = (self.wh_data.qty_after_transaction * self.wh_data.valuation_rate) + stock_value_change
+			new_stock_value = (
+				self.wh_data.qty_after_transaction * self.wh_data.valuation_rate
+			) + stock_value_change
 			if new_stock_value >= 0:
 				# calculate new valuation rate only if stock value is positive
 				# else it remains the same as that of previous entry
 				self.wh_data.valuation_rate = new_stock_value / new_stock_qty
 
 		if not self.wh_data.valuation_rate and sle.voucher_detail_no:
-			allow_zero_rate = self.check_if_allow_zero_valuation_rate(sle.voucher_type, sle.voucher_detail_no)
+			allow_zero_rate = self.check_if_allow_zero_valuation_rate(
+				sle.voucher_type, sle.voucher_detail_no
+			)
 			if not allow_zero_rate:
 				self.wh_data.valuation_rate = self.get_fallback_rate(sle)
 
 	def get_incoming_value_for_serial_nos(self, sle, serial_nos):
 		# get rate from serial nos within same company
-		all_serial_nos = frappe.get_all("Serial No",
-			fields=["purchase_rate", "name", "company"],
-			filters = {'name': ('in', serial_nos)})
+		all_serial_nos = frappe.get_all(
+			"Serial No", fields=["purchase_rate", "name", "company"], filters={"name": ("in", serial_nos)}
+		)
 
-		incoming_values = sum(flt(d.purchase_rate) for d in all_serial_nos if d.company==sle.company)
+		incoming_values = sum(flt(d.purchase_rate) for d in all_serial_nos if d.company == sle.company)
 
 		# Get rate for serial nos which has been transferred to other company
-		invalid_serial_nos = [d.name for d in all_serial_nos if d.company!=sle.company]
+		invalid_serial_nos = [d.name for d in all_serial_nos if d.company != sle.company]
 		for serial_no in invalid_serial_nos:
-			incoming_rate = frappe.db.sql("""
+			incoming_rate = frappe.db.sql(
+				"""
 				select incoming_rate
 				from `tabStock Ledger Entry`
 				where
@@ -671,7 +786,9 @@
 					)
 				order by posting_date desc
 				limit 1
-			""", (sle.company, serial_no, serial_no+'\n%', '%\n'+serial_no, '%\n'+serial_no+'\n%'))
+			""",
+				(sle.company, serial_no, serial_no + "\n%", "%\n" + serial_no, "%\n" + serial_no + "\n%"),
+			)
 
 			incoming_values += flt(incoming_rate[0][0]) if incoming_rate else 0
 
@@ -685,15 +802,17 @@
 				if flt(self.wh_data.qty_after_transaction) <= 0:
 					self.wh_data.valuation_rate = sle.incoming_rate
 				else:
-					new_stock_value = (self.wh_data.qty_after_transaction * self.wh_data.valuation_rate) + \
-						(actual_qty * sle.incoming_rate)
+					new_stock_value = (self.wh_data.qty_after_transaction * self.wh_data.valuation_rate) + (
+						actual_qty * sle.incoming_rate
+					)
 
 					self.wh_data.valuation_rate = new_stock_value / new_stock_qty
 
 			elif sle.outgoing_rate:
 				if new_stock_qty:
-					new_stock_value = (self.wh_data.qty_after_transaction * self.wh_data.valuation_rate) + \
-						(actual_qty * sle.outgoing_rate)
+					new_stock_value = (self.wh_data.qty_after_transaction * self.wh_data.valuation_rate) + (
+						actual_qty * sle.outgoing_rate
+					)
 
 					self.wh_data.valuation_rate = new_stock_value / new_stock_qty
 				else:
@@ -708,7 +827,9 @@
 			# Get valuation rate from previous SLE or Item master, if item does not have the
 			# allow zero valuration rate flag set
 			if not self.wh_data.valuation_rate and sle.voucher_detail_no:
-				allow_zero_valuation_rate = self.check_if_allow_zero_valuation_rate(sle.voucher_type, sle.voucher_detail_no)
+				allow_zero_valuation_rate = self.check_if_allow_zero_valuation_rate(
+					sle.voucher_type, sle.voucher_detail_no
+				)
 				if not allow_zero_valuation_rate:
 					self.wh_data.valuation_rate = self.get_fallback_rate(sle)
 
@@ -717,7 +838,9 @@
 		actual_qty = flt(sle.actual_qty)
 		outgoing_rate = flt(sle.outgoing_rate)
 
-		self.wh_data.qty_after_transaction = round_off_if_near_zero(self.wh_data.qty_after_transaction + actual_qty)
+		self.wh_data.qty_after_transaction = round_off_if_near_zero(
+			self.wh_data.qty_after_transaction + actual_qty
+		)
 
 		if self.valuation_method == "LIFO":
 			stock_queue = LIFOValuation(self.wh_data.stock_queue)
@@ -729,24 +852,33 @@
 		if actual_qty > 0:
 			stock_queue.add_stock(qty=actual_qty, rate=incoming_rate)
 		else:
+
 			def rate_generator() -> float:
-				allow_zero_valuation_rate = self.check_if_allow_zero_valuation_rate(sle.voucher_type, sle.voucher_detail_no)
+				allow_zero_valuation_rate = self.check_if_allow_zero_valuation_rate(
+					sle.voucher_type, sle.voucher_detail_no
+				)
 				if not allow_zero_valuation_rate:
 					return self.get_fallback_rate(sle)
 				else:
 					return 0.0
 
-			stock_queue.remove_stock(qty=abs(actual_qty), outgoing_rate=outgoing_rate, rate_generator=rate_generator)
+			stock_queue.remove_stock(
+				qty=abs(actual_qty), outgoing_rate=outgoing_rate, rate_generator=rate_generator
+			)
 
 		_qty, stock_value = stock_queue.get_total_stock_and_value()
 
 		stock_value_difference = stock_value - prev_stock_value
 
 		self.wh_data.stock_queue = stock_queue.state
-		self.wh_data.stock_value = round_off_if_near_zero(self.wh_data.stock_value + stock_value_difference)
+		self.wh_data.stock_value = round_off_if_near_zero(
+			self.wh_data.stock_value + stock_value_difference
+		)
 
 		if not self.wh_data.stock_queue:
-			self.wh_data.stock_queue.append([0, sle.incoming_rate or sle.outgoing_rate or self.wh_data.valuation_rate])
+			self.wh_data.stock_queue.append(
+				[0, sle.incoming_rate or sle.outgoing_rate or self.wh_data.valuation_rate]
+			)
 
 		if self.wh_data.qty_after_transaction:
 			self.wh_data.valuation_rate = self.wh_data.stock_value / self.wh_data.qty_after_transaction
@@ -755,14 +887,21 @@
 		incoming_rate = flt(sle.incoming_rate)
 		actual_qty = flt(sle.actual_qty)
 
-		self.wh_data.qty_after_transaction = round_off_if_near_zero(self.wh_data.qty_after_transaction + actual_qty)
+		self.wh_data.qty_after_transaction = round_off_if_near_zero(
+			self.wh_data.qty_after_transaction + actual_qty
+		)
 
 		if actual_qty > 0:
 			stock_value_difference = incoming_rate * actual_qty
 		else:
-			outgoing_rate = get_batch_incoming_rate(item_code=sle.item_code,
-					warehouse=sle.warehouse, batch_no=sle.batch_no, posting_date=sle.posting_date,
-					posting_time=sle.posting_time, creation=sle.creation)
+			outgoing_rate = get_batch_incoming_rate(
+				item_code=sle.item_code,
+				warehouse=sle.warehouse,
+				batch_no=sle.batch_no,
+				posting_date=sle.posting_date,
+				posting_time=sle.posting_time,
+				creation=sle.creation,
+			)
 			if outgoing_rate is None:
 				# This can *only* happen if qty available for the batch is zero.
 				# in such case fall back various other rates.
@@ -771,7 +910,9 @@
 				outgoing_rate = self.get_fallback_rate(sle)
 			stock_value_difference = outgoing_rate * actual_qty
 
-		self.wh_data.stock_value = round_off_if_near_zero(self.wh_data.stock_value + stock_value_difference)
+		self.wh_data.stock_value = round_off_if_near_zero(
+			self.wh_data.stock_value + stock_value_difference
+		)
 		if self.wh_data.qty_after_transaction:
 			self.wh_data.valuation_rate = self.wh_data.stock_value / self.wh_data.qty_after_transaction
 
@@ -790,10 +931,17 @@
 
 	def get_fallback_rate(self, sle) -> float:
 		"""When exact incoming rate isn't available use any of other "average" rates as fallback.
-			This should only get used for negative stock."""
-		return get_valuation_rate(sle.item_code, sle.warehouse,
-			sle.voucher_type, sle.voucher_no, self.allow_zero_rate,
-			currency=erpnext.get_company_currency(sle.company), company=sle.company, batch_no=sle.batch_no)
+		This should only get used for negative stock."""
+		return get_valuation_rate(
+			sle.item_code,
+			sle.warehouse,
+			sle.voucher_type,
+			sle.voucher_no,
+			self.allow_zero_rate,
+			currency=erpnext.get_company_currency(sle.company),
+			company=sle.company,
+			batch_no=sle.batch_no,
+		)
 
 	def get_sle_before_datetime(self, args):
 		"""get previous stock ledger entry before current time-bucket"""
@@ -810,18 +958,27 @@
 		for warehouse, exceptions in self.exceptions.items():
 			deficiency = min(e["diff"] for e in exceptions)
 
-			if ((exceptions[0]["voucher_type"], exceptions[0]["voucher_no"]) in
-				frappe.local.flags.currently_saving):
+			if (
+				exceptions[0]["voucher_type"],
+				exceptions[0]["voucher_no"],
+			) in frappe.local.flags.currently_saving:
 
 				msg = _("{0} units of {1} needed in {2} to complete this transaction.").format(
-					abs(deficiency), frappe.get_desk_link('Item', exceptions[0]["item_code"]),
-					frappe.get_desk_link('Warehouse', warehouse))
+					abs(deficiency),
+					frappe.get_desk_link("Item", exceptions[0]["item_code"]),
+					frappe.get_desk_link("Warehouse", warehouse),
+				)
 			else:
-				msg = _("{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction.").format(
-					abs(deficiency), frappe.get_desk_link('Item', exceptions[0]["item_code"]),
-					frappe.get_desk_link('Warehouse', warehouse),
-					exceptions[0]["posting_date"], exceptions[0]["posting_time"],
-					frappe.get_desk_link(exceptions[0]["voucher_type"], exceptions[0]["voucher_no"]))
+				msg = _(
+					"{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction."
+				).format(
+					abs(deficiency),
+					frappe.get_desk_link("Item", exceptions[0]["item_code"]),
+					frappe.get_desk_link("Warehouse", warehouse),
+					exceptions[0]["posting_date"],
+					exceptions[0]["posting_time"],
+					frappe.get_desk_link(exceptions[0]["voucher_type"], exceptions[0]["voucher_no"]),
+				)
 
 			if msg:
 				msg_list.append(msg)
@@ -829,7 +986,7 @@
 		if msg_list:
 			message = "\n\n".join(msg_list)
 			if self.verbose:
-				frappe.throw(message, NegativeStockError, title=_('Insufficient Stock'))
+				frappe.throw(message, NegativeStockError, title=_("Insufficient Stock"))
 			else:
 				raise NegativeStockError(message)
 
@@ -838,19 +995,16 @@
 		for warehouse, data in self.data.items():
 			bin_name = get_or_make_bin(self.item_code, warehouse)
 
-			updated_values = {
-				"actual_qty": data.qty_after_transaction,
-				"stock_value": data.stock_value
-			}
+			updated_values = {"actual_qty": data.qty_after_transaction, "stock_value": data.stock_value}
 			if data.valuation_rate is not None:
 				updated_values["valuation_rate"] = data.valuation_rate
-			frappe.db.set_value('Bin', bin_name, updated_values)
+			frappe.db.set_value("Bin", bin_name, updated_values)
 
 
 def get_previous_sle_of_current_voucher(args, exclude_current_voucher=False):
 	"""get stock ledger entries filtered by specific posting datetime conditions"""
 
-	args['time_format'] = '%H:%i:%s'
+	args["time_format"] = "%H:%i:%s"
 	if not args.get("posting_date"):
 		args["posting_date"] = "1900-01-01"
 	if not args.get("posting_time"):
@@ -861,7 +1015,8 @@
 		voucher_no = args.get("voucher_no")
 		voucher_condition = f"and voucher_no != '{voucher_no}'"
 
-	sle = frappe.db.sql("""
+	sle = frappe.db.sql(
+		"""
 		select *, timestamp(posting_date, posting_time) as "timestamp"
 		from `tabStock Ledger Entry`
 		where item_code = %(item_code)s
@@ -871,32 +1026,48 @@
 			and timestamp(posting_date, time_format(posting_time, %(time_format)s)) < timestamp(%(posting_date)s, time_format(%(posting_time)s, %(time_format)s))
 		order by timestamp(posting_date, posting_time) desc, creation desc
 		limit 1
-		for update""".format(voucher_condition=voucher_condition), args, as_dict=1)
+		for update""".format(
+			voucher_condition=voucher_condition
+		),
+		args,
+		as_dict=1,
+	)
 
 	return sle[0] if sle else frappe._dict()
 
+
 def get_previous_sle(args, for_update=False):
 	"""
-		get the last sle on or before the current time-bucket,
-		to get actual qty before transaction, this function
-		is called from various transaction like stock entry, reco etc
+	get the last sle on or before the current time-bucket,
+	to get actual qty before transaction, this function
+	is called from various transaction like stock entry, reco etc
 
-		args = {
-			"item_code": "ABC",
-			"warehouse": "XYZ",
-			"posting_date": "2012-12-12",
-			"posting_time": "12:00",
-			"sle": "name of reference Stock Ledger Entry"
-		}
+	args = {
+	        "item_code": "ABC",
+	        "warehouse": "XYZ",
+	        "posting_date": "2012-12-12",
+	        "posting_time": "12:00",
+	        "sle": "name of reference Stock Ledger Entry"
+	}
 	"""
 	args["name"] = args.get("sle", None) or ""
 	sle = get_stock_ledger_entries(args, "<=", "desc", "limit 1", for_update=for_update)
 	return sle and sle[0] or {}
 
-def get_stock_ledger_entries(previous_sle, operator=None,
-	order="desc", limit=None, for_update=False, debug=False, check_serial_no=True):
+
+def get_stock_ledger_entries(
+	previous_sle,
+	operator=None,
+	order="desc",
+	limit=None,
+	for_update=False,
+	debug=False,
+	check_serial_no=True,
+):
 	"""get stock ledger entries filtered by specific posting datetime conditions"""
-	conditions = " and timestamp(posting_date, posting_time) {0} timestamp(%(posting_date)s, %(posting_time)s)".format(operator)
+	conditions = " and timestamp(posting_date, posting_time) {0} timestamp(%(posting_date)s, %(posting_time)s)".format(
+		operator
+	)
 	if previous_sle.get("warehouse"):
 		conditions += " and warehouse = %(warehouse)s"
 	elif previous_sle.get("warehouse_condition"):
@@ -905,15 +1076,21 @@
 	if check_serial_no and previous_sle.get("serial_no"):
 		# conditions += " and serial_no like {}".format(frappe.db.escape('%{0}%'.format(previous_sle.get("serial_no"))))
 		serial_no = previous_sle.get("serial_no")
-		conditions += (""" and
+		conditions += (
+			""" and
 			(
 				serial_no = {0}
 				or serial_no like {1}
 				or serial_no like {2}
 				or serial_no like {3}
 			)
-		""").format(frappe.db.escape(serial_no), frappe.db.escape('{}\n%'.format(serial_no)),
-			frappe.db.escape('%\n{}'.format(serial_no)), frappe.db.escape('%\n{}\n%'.format(serial_no)))
+		"""
+		).format(
+			frappe.db.escape(serial_no),
+			frappe.db.escape("{}\n%".format(serial_no)),
+			frappe.db.escape("%\n{}".format(serial_no)),
+			frappe.db.escape("%\n{}\n%".format(serial_no)),
+		)
 
 	if not previous_sle.get("posting_date"):
 		previous_sle["posting_date"] = "1900-01-01"
@@ -923,70 +1100,95 @@
 	if operator in (">", "<=") and previous_sle.get("name"):
 		conditions += " and name!=%(name)s"
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select *, timestamp(posting_date, posting_time) as "timestamp"
 		from `tabStock Ledger Entry`
 		where item_code = %%(item_code)s
 		and is_cancelled = 0
 		%(conditions)s
 		order by timestamp(posting_date, posting_time) %(order)s, creation %(order)s
-		%(limit)s %(for_update)s""" % {
+		%(limit)s %(for_update)s"""
+		% {
 			"conditions": conditions,
 			"limit": limit or "",
 			"for_update": for_update and "for update" or "",
-			"order": order
-		}, previous_sle, as_dict=1, debug=debug)
+			"order": order,
+		},
+		previous_sle,
+		as_dict=1,
+		debug=debug,
+	)
+
 
 def get_sle_by_voucher_detail_no(voucher_detail_no, excluded_sle=None):
-	return frappe.db.get_value('Stock Ledger Entry',
-		{'voucher_detail_no': voucher_detail_no, 'name': ['!=', excluded_sle]},
-		['item_code', 'warehouse', 'posting_date', 'posting_time', 'timestamp(posting_date, posting_time) as timestamp'],
-		as_dict=1)
+	return frappe.db.get_value(
+		"Stock Ledger Entry",
+		{"voucher_detail_no": voucher_detail_no, "name": ["!=", excluded_sle]},
+		[
+			"item_code",
+			"warehouse",
+			"posting_date",
+			"posting_time",
+			"timestamp(posting_date, posting_time) as timestamp",
+		],
+		as_dict=1,
+	)
 
-def get_batch_incoming_rate(item_code, warehouse, batch_no, posting_date, posting_time, creation=None):
 
-	Timestamp = CustomFunction('timestamp', ['date', 'time'])
+def get_batch_incoming_rate(
+	item_code, warehouse, batch_no, posting_date, posting_time, creation=None
+):
+
+	Timestamp = CustomFunction("timestamp", ["date", "time"])
 
 	sle = frappe.qb.DocType("Stock Ledger Entry")
 
-	timestamp_condition = (Timestamp(sle.posting_date, sle.posting_time) < Timestamp(posting_date, posting_time))
+	timestamp_condition = Timestamp(sle.posting_date, sle.posting_time) < Timestamp(
+		posting_date, posting_time
+	)
 	if creation:
 		timestamp_condition |= (
-				(Timestamp(sle.posting_date, sle.posting_time) == Timestamp(posting_date, posting_time))
-				& (sle.creation < creation)
-			)
+			Timestamp(sle.posting_date, sle.posting_time) == Timestamp(posting_date, posting_time)
+		) & (sle.creation < creation)
 
 	batch_details = (
-		frappe.qb
-			.from_(sle)
-			.select(
-				Sum(sle.stock_value_difference).as_("batch_value"),
-				Sum(sle.actual_qty).as_("batch_qty")
-			)
-			.where(
-				(sle.item_code == item_code)
-				& (sle.warehouse == warehouse)
-				& (sle.batch_no == batch_no)
-				& (sle.is_cancelled == 0)
-			)
-			.where(timestamp_condition)
+		frappe.qb.from_(sle)
+		.select(Sum(sle.stock_value_difference).as_("batch_value"), Sum(sle.actual_qty).as_("batch_qty"))
+		.where(
+			(sle.item_code == item_code)
+			& (sle.warehouse == warehouse)
+			& (sle.batch_no == batch_no)
+			& (sle.is_cancelled == 0)
+		)
+		.where(timestamp_condition)
 	).run(as_dict=True)
 
 	if batch_details and batch_details[0].batch_qty:
 		return batch_details[0].batch_value / batch_details[0].batch_qty
 
 
-def get_valuation_rate(item_code, warehouse, voucher_type, voucher_no,
-	allow_zero_rate=False, currency=None, company=None, raise_error_if_no_rate=True, batch_no=None):
+def get_valuation_rate(
+	item_code,
+	warehouse,
+	voucher_type,
+	voucher_no,
+	allow_zero_rate=False,
+	currency=None,
+	company=None,
+	raise_error_if_no_rate=True,
+	batch_no=None,
+):
 
 	if not company:
-		company =  frappe.get_cached_value("Warehouse", warehouse, "company")
+		company = frappe.get_cached_value("Warehouse", warehouse, "company")
 
 	last_valuation_rate = None
 
 	# Get moving average rate of a specific batch number
 	if warehouse and batch_no and frappe.db.get_value("Batch", batch_no, "use_batchwise_valuation"):
-		last_valuation_rate = frappe.db.sql("""
+		last_valuation_rate = frappe.db.sql(
+			"""
 			select sum(stock_value_difference) / sum(actual_qty)
 			from `tabStock Ledger Entry`
 			where
@@ -996,11 +1198,13 @@
 				AND is_cancelled = 0
 				AND NOT (voucher_no = %s AND voucher_type = %s)
 			""",
-			(item_code, warehouse, batch_no, voucher_no, voucher_type))
+			(item_code, warehouse, batch_no, voucher_no, voucher_type),
+		)
 
 	# Get valuation rate from last sle for the same item and warehouse
 	if not last_valuation_rate or last_valuation_rate[0][0] is None:
-		last_valuation_rate = frappe.db.sql("""select valuation_rate
+		last_valuation_rate = frappe.db.sql(
+			"""select valuation_rate
 			from `tabStock Ledger Entry` force index (item_warehouse)
 			where
 				item_code = %s
@@ -1008,18 +1212,23 @@
 				AND valuation_rate >= 0
 				AND is_cancelled = 0
 				AND NOT (voucher_no = %s AND voucher_type = %s)
-			order by posting_date desc, posting_time desc, name desc limit 1""", (item_code, warehouse, voucher_no, voucher_type))
+			order by posting_date desc, posting_time desc, name desc limit 1""",
+			(item_code, warehouse, voucher_no, voucher_type),
+		)
 
 	if not last_valuation_rate:
 		# Get valuation rate from last sle for the item against any warehouse
-		last_valuation_rate = frappe.db.sql("""select valuation_rate
+		last_valuation_rate = frappe.db.sql(
+			"""select valuation_rate
 			from `tabStock Ledger Entry` force index (item_code)
 			where
 				item_code = %s
 				AND valuation_rate > 0
 				AND is_cancelled = 0
 				AND NOT(voucher_no = %s AND voucher_type = %s)
-			order by posting_date desc, posting_time desc, name desc limit 1""", (item_code, voucher_no, voucher_type))
+			order by posting_date desc, posting_time desc, name desc limit 1""",
+			(item_code, voucher_no, voucher_type),
+		)
 
 	if last_valuation_rate:
 		return flt(last_valuation_rate[0][0])
@@ -1034,18 +1243,36 @@
 
 		if not valuation_rate:
 			# try in price list
-			valuation_rate = frappe.db.get_value('Item Price',
-				dict(item_code=item_code, buying=1, currency=currency),
-				'price_list_rate')
+			valuation_rate = frappe.db.get_value(
+				"Item Price", dict(item_code=item_code, buying=1, currency=currency), "price_list_rate"
+			)
 
-	if not allow_zero_rate and not valuation_rate and raise_error_if_no_rate \
-			and cint(erpnext.is_perpetual_inventory_enabled(company)):
+	if (
+		not allow_zero_rate
+		and not valuation_rate
+		and raise_error_if_no_rate
+		and cint(erpnext.is_perpetual_inventory_enabled(company))
+	):
 		form_link = get_link_to_form("Item", item_code)
 
-		message = _("Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}.").format(form_link, voucher_type, voucher_no)
+		message = _(
+			"Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}."
+		).format(form_link, voucher_type, voucher_no)
 		message += "<br><br>" + _("Here are the options to proceed:")
-		solutions = "<li>" + _("If the item is transacting as a Zero Valuation Rate item in this entry, please enable 'Allow Zero Valuation Rate' in the {0} Item table.").format(voucher_type) + "</li>"
-		solutions += "<li>" + _("If not, you can Cancel / Submit this entry") + " {0} ".format(frappe.bold("after")) + _("performing either one below:") + "</li>"
+		solutions = (
+			"<li>"
+			+ _(
+				"If the item is transacting as a Zero Valuation Rate item in this entry, please enable 'Allow Zero Valuation Rate' in the {0} Item table."
+			).format(voucher_type)
+			+ "</li>"
+		)
+		solutions += (
+			"<li>"
+			+ _("If not, you can Cancel / Submit this entry")
+			+ " {0} ".format(frappe.bold("after"))
+			+ _("performing either one below:")
+			+ "</li>"
+		)
 		sub_solutions = "<ul><li>" + _("Create an incoming stock transaction for the Item.") + "</li>"
 		sub_solutions += "<li>" + _("Mention Valuation Rate in the Item master.") + "</li></ul>"
 		msg = message + solutions + sub_solutions + "</li>"
@@ -1054,6 +1281,7 @@
 
 	return valuation_rate
 
+
 def update_qty_in_future_sle(args, allow_negative_stock=False):
 	"""Recalculate Qty after Transaction in future SLEs based on current SLE."""
 	datetime_limit_condition = ""
@@ -1070,7 +1298,8 @@
 		# add condition to update SLEs before this date & time
 		datetime_limit_condition = get_datetime_limit_condition(detail)
 
-	frappe.db.sql("""
+	frappe.db.sql(
+		"""
 		update `tabStock Ledger Entry`
 		set qty_after_transaction = qty_after_transaction + {qty_shift}
 		where
@@ -1085,10 +1314,15 @@
 				)
 			)
 		{datetime_limit_condition}
-		""".format(qty_shift=qty_shift, datetime_limit_condition=datetime_limit_condition), args)
+		""".format(
+			qty_shift=qty_shift, datetime_limit_condition=datetime_limit_condition
+		),
+		args,
+	)
 
 	validate_negative_qty_in_future_sle(args, allow_negative_stock)
 
+
 def get_stock_reco_qty_shift(args):
 	stock_reco_qty_shift = 0
 	if args.get("is_cancelled"):
@@ -1100,8 +1334,9 @@
 			stock_reco_qty_shift = flt(args.actual_qty)
 	else:
 		# reco is being submitted
-		last_balance = get_previous_sle_of_current_voucher(args,
-			exclude_current_voucher=True).get("qty_after_transaction")
+		last_balance = get_previous_sle_of_current_voucher(args, exclude_current_voucher=True).get(
+			"qty_after_transaction"
+		)
 
 		if last_balance is not None:
 			stock_reco_qty_shift = flt(args.qty_after_transaction) - flt(last_balance)
@@ -1110,10 +1345,12 @@
 
 	return stock_reco_qty_shift
 
+
 def get_next_stock_reco(args):
 	"""Returns next nearest stock reconciliaton's details."""
 
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			name, posting_date, posting_time, creation, voucher_no
 		from
@@ -1131,7 +1368,11 @@
 				)
 			)
 		limit 1
-	""", args, as_dict=1)
+	""",
+		args,
+		as_dict=1,
+	)
+
 
 def get_datetime_limit_condition(detail):
 	return f"""
@@ -1143,6 +1384,7 @@
 			)
 		)"""
 
+
 def validate_negative_qty_in_future_sle(args, allow_negative_stock=False):
 	if allow_negative_stock or is_negative_stock_allowed(item_code=args.item_code):
 		return
@@ -1151,32 +1393,40 @@
 
 	neg_sle = get_future_sle_with_negative_qty(args)
 	if neg_sle:
-		message = _("{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction.").format(
+		message = _(
+			"{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction."
+		).format(
 			abs(neg_sle[0]["qty_after_transaction"]),
-			frappe.get_desk_link('Item', args.item_code),
-			frappe.get_desk_link('Warehouse', args.warehouse),
-			neg_sle[0]["posting_date"], neg_sle[0]["posting_time"],
-			frappe.get_desk_link(neg_sle[0]["voucher_type"], neg_sle[0]["voucher_no"]))
+			frappe.get_desk_link("Item", args.item_code),
+			frappe.get_desk_link("Warehouse", args.warehouse),
+			neg_sle[0]["posting_date"],
+			neg_sle[0]["posting_time"],
+			frappe.get_desk_link(neg_sle[0]["voucher_type"], neg_sle[0]["voucher_no"]),
+		)
 
-		frappe.throw(message, NegativeStockError, title=_('Insufficient Stock'))
-
+		frappe.throw(message, NegativeStockError, title=_("Insufficient Stock"))
 
 	if not args.batch_no:
 		return
 
 	neg_batch_sle = get_future_sle_with_negative_batch_qty(args)
 	if neg_batch_sle:
-		message = _("{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction.").format(
+		message = _(
+			"{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction."
+		).format(
 			abs(neg_batch_sle[0]["cumulative_total"]),
-			frappe.get_desk_link('Batch', args.batch_no),
-			frappe.get_desk_link('Warehouse', args.warehouse),
-			neg_batch_sle[0]["posting_date"], neg_batch_sle[0]["posting_time"],
-			frappe.get_desk_link(neg_batch_sle[0]["voucher_type"], neg_batch_sle[0]["voucher_no"]))
+			frappe.get_desk_link("Batch", args.batch_no),
+			frappe.get_desk_link("Warehouse", args.warehouse),
+			neg_batch_sle[0]["posting_date"],
+			neg_batch_sle[0]["posting_time"],
+			frappe.get_desk_link(neg_batch_sle[0]["voucher_type"], neg_batch_sle[0]["voucher_no"]),
+		)
 		frappe.throw(message, NegativeStockError, title=_("Insufficient Stock for Batch"))
 
 
 def get_future_sle_with_negative_qty(args):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		select
 			qty_after_transaction, posting_date, posting_time,
 			voucher_type, voucher_no
@@ -1190,11 +1440,15 @@
 			and qty_after_transaction < 0
 		order by timestamp(posting_date, posting_time) asc
 		limit 1
-	""", args, as_dict=1)
+	""",
+		args,
+		as_dict=1,
+	)
 
 
 def get_future_sle_with_negative_batch_qty(args):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		with batch_ledger as (
 			select
 				posting_date, posting_time, voucher_type, voucher_no,
@@ -1212,7 +1466,10 @@
 			cumulative_total < 0.0
 			and timestamp(posting_date, posting_time) >= timestamp(%(posting_date)s, %(posting_time)s)
 		limit 1
-	""", args, as_dict=1)
+	""",
+		args,
+		as_dict=1,
+	)
 
 
 def is_negative_stock_allowed(*, item_code: Optional[str] = None) -> bool:
diff --git a/erpnext/stock/tests/test_valuation.py b/erpnext/stock/tests/test_valuation.py
index b64ff8e..506a666 100644
--- a/erpnext/stock/tests/test_valuation.py
+++ b/erpnext/stock/tests/test_valuation.py
@@ -16,7 +16,6 @@
 
 
 class TestFIFOValuation(unittest.TestCase):
-
 	def setUp(self):
 		self.queue = FIFOValuation([])
 
@@ -29,7 +28,9 @@
 		self.assertAlmostEqual(sum(q for q, _ in self.queue), qty, msg=f"queue: {self.queue}", places=4)
 
 	def assertTotalValue(self, value):
-		self.assertAlmostEqual(sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}", places=2)
+		self.assertAlmostEqual(
+			sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}", places=2
+		)
 
 	def test_simple_addition(self):
 		self.queue.add_stock(1, 10)
@@ -55,7 +56,6 @@
 		self.queue.add_stock(6, 10)
 		self.assertEqual(self.queue, [[1, 10]])
 
-
 	def test_negative_stock(self):
 		self.queue.remove_stock(1, 5)
 		self.assertEqual(self.queue, [[-1, 5]])
@@ -75,7 +75,6 @@
 		self.queue.remove_stock(1, 20)
 		self.assertEqual(self.queue, [[1, 10]])
 
-
 	def test_remove_multiple_bins(self):
 		self.queue.add_stock(1, 10)
 		self.queue.add_stock(2, 20)
@@ -85,7 +84,6 @@
 		self.queue.remove_stock(4)
 		self.assertEqual(self.queue, [[5, 20]])
 
-
 	def test_remove_multiple_bins_with_rate(self):
 		self.queue.add_stock(1, 10)
 		self.queue.add_stock(2, 20)
@@ -143,7 +141,9 @@
 			else:
 				qty = abs(qty)
 				consumed = self.queue.remove_stock(qty)
-				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				self.assertAlmostEqual(
+					qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}"
+				)
 				total_qty -= qty
 			self.assertTotalQty(total_qty)
 
@@ -164,7 +164,9 @@
 			else:
 				qty = abs(qty)
 				consumed = self.queue.remove_stock(qty)
-				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				self.assertAlmostEqual(
+					qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}"
+				)
 				total_qty -= qty
 				total_value -= sum(q * r for q, r in consumed)
 			self.assertTotalQty(total_qty)
@@ -172,7 +174,6 @@
 
 
 class TestLIFOValuation(unittest.TestCase):
-
 	def setUp(self):
 		self.stack = LIFOValuation([])
 
@@ -185,7 +186,9 @@
 		self.assertAlmostEqual(sum(q for q, _ in self.stack), qty, msg=f"stack: {self.stack}", places=4)
 
 	def assertTotalValue(self, value):
-		self.assertAlmostEqual(sum(q * r for q, r in self.stack), value, msg=f"stack: {self.stack}", places=2)
+		self.assertAlmostEqual(
+			sum(q * r for q, r in self.stack), value, msg=f"stack: {self.stack}", places=2
+		)
 
 	def test_simple_addition(self):
 		self.stack.add_stock(1, 10)
@@ -248,7 +251,6 @@
 		consumed = self.stack.remove_stock(5)
 		self.assertEqual(consumed, [[5, 5]])
 
-
 	@given(stock_queue_generator)
 	def test_lifo_qty_hypothesis(self, stock_stack):
 		self.stack = LIFOValuation([])
@@ -263,7 +265,9 @@
 			else:
 				qty = abs(qty)
 				consumed = self.stack.remove_stock(qty)
-				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				self.assertAlmostEqual(
+					qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}"
+				)
 				total_qty -= qty
 			self.assertTotalQty(total_qty)
 
@@ -284,12 +288,15 @@
 			else:
 				qty = abs(qty)
 				consumed = self.stack.remove_stock(qty)
-				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				self.assertAlmostEqual(
+					qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}"
+				)
 				total_qty -= qty
 				total_value -= sum(q * r for q, r in consumed)
 			self.assertTotalQty(total_qty)
 			self.assertTotalValue(total_value)
 
+
 class TestLIFOValuationSLE(FrappeTestCase):
 	ITEM_CODE = "_Test LIFO item"
 	WAREHOUSE = "_Test Warehouse - _TC"
@@ -309,7 +316,9 @@
 		return make_stock_entry(**kwargs)
 
 	def assertStockQueue(self, se, expected_queue):
-		sle_name = frappe.db.get_value("Stock Ledger Entry", {"voucher_no": se.name, "is_cancelled": 0, "voucher_type": "Stock Entry"})
+		sle_name = frappe.db.get_value(
+			"Stock Ledger Entry", {"voucher_no": se.name, "is_cancelled": 0, "voucher_type": "Stock Entry"}
+		)
 		sle = frappe.get_doc("Stock Ledger Entry", sle_name)
 
 		stock_queue = json.loads(sle.stock_queue)
@@ -321,7 +330,6 @@
 		if total_qty > 0:
 			self.assertEqual(stock_queue, expected_queue)
 
-
 	def test_lifo_values(self):
 
 		in1 = self._make_stock_entry(1, 1)
@@ -340,7 +348,7 @@
 		self.assertStockQueue(out2, [[1, 1]])
 
 		in4 = self._make_stock_entry(4, 4)
-		self.assertStockQueue(in4, [[1, 1], [4,4]])
+		self.assertStockQueue(in4, [[1, 1], [4, 4]])
 
 		out3 = self._make_stock_entry(-5)
 		self.assertStockQueue(out3, [])
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index e205389..741646d 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -12,8 +12,13 @@
 from erpnext.stock.valuation import FIFOValuation, LIFOValuation
 
 
-class InvalidWarehouseCompany(frappe.ValidationError): pass
-class PendingRepostingError(frappe.ValidationError): pass
+class InvalidWarehouseCompany(frappe.ValidationError):
+	pass
+
+
+class PendingRepostingError(frappe.ValidationError):
+	pass
+
 
 def get_stock_value_from_bin(warehouse=None, item_code=None):
 	values = {}
@@ -26,22 +31,27 @@
 						and w2.lft between w1.lft and w1.rgt
 						) """
 
-		values['warehouse'] = warehouse
+		values["warehouse"] = warehouse
 
 	if item_code:
 		conditions += " and `tabBin`.item_code = %(item_code)s"
 
-		values['item_code'] = item_code
+		values["item_code"] = item_code
 
-	query = """select sum(stock_value) from `tabBin`, `tabItem` where 1 = 1
-		and `tabItem`.name = `tabBin`.item_code and ifnull(`tabItem`.disabled, 0) = 0 %s""" % conditions
+	query = (
+		"""select sum(stock_value) from `tabBin`, `tabItem` where 1 = 1
+		and `tabItem`.name = `tabBin`.item_code and ifnull(`tabItem`.disabled, 0) = 0 %s"""
+		% conditions
+	)
 
 	stock_value = frappe.db.sql(query, values)
 
 	return stock_value
 
+
 def get_stock_value_on(warehouse=None, posting_date=None, item_code=None):
-	if not posting_date: posting_date = nowdate()
+	if not posting_date:
+		posting_date = nowdate()
 
 	values, condition = [posting_date], ""
 
@@ -63,13 +73,19 @@
 		values.append(item_code)
 		condition += " AND item_code = %s"
 
-	stock_ledger_entries = frappe.db.sql("""
+	stock_ledger_entries = frappe.db.sql(
+		"""
 		SELECT item_code, stock_value, name, warehouse
 		FROM `tabStock Ledger Entry` sle
 		WHERE posting_date <= %s {0}
 			and is_cancelled = 0
 		ORDER BY timestamp(posting_date, posting_time) DESC, creation DESC
-	""".format(condition), values, as_dict=1)
+	""".format(
+			condition
+		),
+		values,
+		as_dict=1,
+	)
 
 	sle_map = {}
 	for sle in stock_ledger_entries:
@@ -78,23 +94,32 @@
 
 	return sum(sle_map.values())
 
+
 @frappe.whitelist()
-def get_stock_balance(item_code, warehouse, posting_date=None, posting_time=None,
-	with_valuation_rate=False, with_serial_no=False):
+def get_stock_balance(
+	item_code,
+	warehouse,
+	posting_date=None,
+	posting_time=None,
+	with_valuation_rate=False,
+	with_serial_no=False,
+):
 	"""Returns stock balance quantity at given warehouse on given posting date or current date.
 
 	If `with_valuation_rate` is True, will return tuple (qty, rate)"""
 
 	from erpnext.stock.stock_ledger import get_previous_sle
 
-	if posting_date is None: posting_date = nowdate()
-	if posting_time is None: posting_time = nowtime()
+	if posting_date is None:
+		posting_date = nowdate()
+	if posting_time is None:
+		posting_time = nowtime()
 
 	args = {
 		"item_code": item_code,
-		"warehouse":warehouse,
+		"warehouse": warehouse,
 		"posting_date": posting_date,
-		"posting_time": posting_time
+		"posting_time": posting_time,
 	}
 
 	last_entry = get_previous_sle(args)
@@ -103,33 +128,41 @@
 		if with_serial_no:
 			serial_nos = get_serial_nos_data_after_transactions(args)
 
-			return ((last_entry.qty_after_transaction, last_entry.valuation_rate, serial_nos)
-				if last_entry else (0.0, 0.0, None))
+			return (
+				(last_entry.qty_after_transaction, last_entry.valuation_rate, serial_nos)
+				if last_entry
+				else (0.0, 0.0, None)
+			)
 		else:
-			return (last_entry.qty_after_transaction, last_entry.valuation_rate) if last_entry else (0.0, 0.0)
+			return (
+				(last_entry.qty_after_transaction, last_entry.valuation_rate) if last_entry else (0.0, 0.0)
+			)
 	else:
 		return last_entry.qty_after_transaction if last_entry else 0.0
 
+
 def get_serial_nos_data_after_transactions(args):
 	from pypika import CustomFunction
 
 	serial_nos = set()
 	args = frappe._dict(args)
-	sle = frappe.qb.DocType('Stock Ledger Entry')
-	Timestamp = CustomFunction('timestamp', ['date', 'time'])
+	sle = frappe.qb.DocType("Stock Ledger Entry")
+	Timestamp = CustomFunction("timestamp", ["date", "time"])
 
-	stock_ledger_entries = frappe.qb.from_(
-		sle
-	).select(
-		'serial_no','actual_qty'
-	).where(
-		(sle.item_code == args.item_code)
-		& (sle.warehouse == args.warehouse)
-		& (Timestamp(sle.posting_date, sle.posting_time) < Timestamp(args.posting_date, args.posting_time))
-		& (sle.is_cancelled == 0)
-	).orderby(
-		sle.posting_date, sle.posting_time, sle.creation
-	).run(as_dict=1)
+	stock_ledger_entries = (
+		frappe.qb.from_(sle)
+		.select("serial_no", "actual_qty")
+		.where(
+			(sle.item_code == args.item_code)
+			& (sle.warehouse == args.warehouse)
+			& (
+				Timestamp(sle.posting_date, sle.posting_time) < Timestamp(args.posting_date, args.posting_time)
+			)
+			& (sle.is_cancelled == 0)
+		)
+		.orderby(sle.posting_date, sle.posting_time, sle.creation)
+		.run(as_dict=1)
+	)
 
 	for stock_ledger_entry in stock_ledger_entries:
 		changed_serial_no = get_serial_nos_data(stock_ledger_entry.serial_no)
@@ -138,12 +171,15 @@
 		else:
 			serial_nos.difference_update(changed_serial_no)
 
-	return '\n'.join(serial_nos)
+	return "\n".join(serial_nos)
+
 
 def get_serial_nos_data(serial_nos):
 	from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
 	return get_serial_nos(serial_nos)
 
+
 @frappe.whitelist()
 def get_latest_stock_qty(item_code, warehouse=None):
 	values, condition = [item_code], ""
@@ -160,37 +196,48 @@
 			values.append(warehouse)
 			condition += " AND warehouse = %s"
 
-	actual_qty = frappe.db.sql("""select sum(actual_qty) from tabBin
-		where item_code=%s {0}""".format(condition), values)[0][0]
+	actual_qty = frappe.db.sql(
+		"""select sum(actual_qty) from tabBin
+		where item_code=%s {0}""".format(
+			condition
+		),
+		values,
+	)[0][0]
 
 	return actual_qty
 
 
 def get_latest_stock_balance():
 	bin_map = {}
-	for d in frappe.db.sql("""SELECT item_code, warehouse, stock_value as stock_value
-		FROM tabBin""", as_dict=1):
-			bin_map.setdefault(d.warehouse, {}).setdefault(d.item_code, flt(d.stock_value))
+	for d in frappe.db.sql(
+		"""SELECT item_code, warehouse, stock_value as stock_value
+		FROM tabBin""",
+		as_dict=1,
+	):
+		bin_map.setdefault(d.warehouse, {}).setdefault(d.item_code, flt(d.stock_value))
 
 	return bin_map
 
+
 def get_bin(item_code, warehouse):
 	bin = frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse})
 	if not bin:
 		bin_obj = _create_bin(item_code, warehouse)
 	else:
-		bin_obj = frappe.get_doc('Bin', bin, for_update=True)
+		bin_obj = frappe.get_doc("Bin", bin, for_update=True)
 	bin_obj.flags.ignore_permissions = True
 	return bin_obj
 
-def get_or_make_bin(item_code: str , warehouse: str) -> str:
-	bin_record = frappe.db.get_value('Bin', {'item_code': item_code, 'warehouse': warehouse})
+
+def get_or_make_bin(item_code: str, warehouse: str) -> str:
+	bin_record = frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse})
 
 	if not bin_record:
 		bin_obj = _create_bin(item_code, warehouse)
 		bin_record = bin_obj.name
 	return bin_record
 
+
 def _create_bin(item_code, warehouse):
 	"""Create a bin and take care of concurrent inserts."""
 
@@ -206,6 +253,7 @@
 
 	return bin_obj
 
+
 @frappe.whitelist()
 def get_incoming_rate(args, raise_error_if_no_rate=True):
 	"""Get Incoming Rate based on valuation method"""
@@ -214,19 +262,21 @@
 		get_previous_sle,
 		get_valuation_rate,
 	)
+
 	if isinstance(args, str):
 		args = json.loads(args)
 
-	voucher_no = args.get('voucher_no') or args.get('name')
+	voucher_no = args.get("voucher_no") or args.get("name")
 
 	in_rate = None
 	if (args.get("serial_no") or "").strip():
 		in_rate = get_avg_purchase_rate(args.get("serial_no"))
-	elif args.get("batch_no") and \
-			frappe.db.get_value("Batch", args.get("batch_no"), "use_batchwise_valuation", cache=True):
+	elif args.get("batch_no") and frappe.db.get_value(
+		"Batch", args.get("batch_no"), "use_batchwise_valuation", cache=True
+	):
 		in_rate = get_batch_incoming_rate(
-			item_code=args.get('item_code'),
-			warehouse=args.get('warehouse'),
+			item_code=args.get("item_code"),
+			warehouse=args.get("warehouse"),
 			batch_no=args.get("batch_no"),
 			posting_date=args.get("posting_date"),
 			posting_time=args.get("posting_time"),
@@ -234,40 +284,62 @@
 	else:
 		valuation_method = get_valuation_method(args.get("item_code"))
 		previous_sle = get_previous_sle(args)
-		if valuation_method in ('FIFO', 'LIFO'):
+		if valuation_method in ("FIFO", "LIFO"):
 			if previous_sle:
-				previous_stock_queue = json.loads(previous_sle.get('stock_queue', '[]') or '[]')
-				in_rate = _get_fifo_lifo_rate(previous_stock_queue, args.get("qty") or 0, valuation_method) if previous_stock_queue else 0
-		elif valuation_method == 'Moving Average':
-			in_rate = previous_sle.get('valuation_rate') or 0
+				previous_stock_queue = json.loads(previous_sle.get("stock_queue", "[]") or "[]")
+				in_rate = (
+					_get_fifo_lifo_rate(previous_stock_queue, args.get("qty") or 0, valuation_method)
+					if previous_stock_queue
+					else 0
+				)
+		elif valuation_method == "Moving Average":
+			in_rate = previous_sle.get("valuation_rate") or 0
 
 	if in_rate is None:
-		in_rate = get_valuation_rate(args.get('item_code'), args.get('warehouse'),
-			args.get('voucher_type'), voucher_no, args.get('allow_zero_valuation'),
-			currency=erpnext.get_company_currency(args.get('company')), company=args.get('company'),
-			raise_error_if_no_rate=raise_error_if_no_rate, batch_no=args.get("batch_no"))
+		in_rate = get_valuation_rate(
+			args.get("item_code"),
+			args.get("warehouse"),
+			args.get("voucher_type"),
+			voucher_no,
+			args.get("allow_zero_valuation"),
+			currency=erpnext.get_company_currency(args.get("company")),
+			company=args.get("company"),
+			raise_error_if_no_rate=raise_error_if_no_rate,
+			batch_no=args.get("batch_no"),
+		)
 
 	return flt(in_rate)
 
+
 def get_avg_purchase_rate(serial_nos):
 	"""get average value of serial numbers"""
 
 	serial_nos = get_valid_serial_nos(serial_nos)
-	return flt(frappe.db.sql("""select avg(purchase_rate) from `tabSerial No`
-		where name in (%s)""" % ", ".join(["%s"] * len(serial_nos)),
-		tuple(serial_nos))[0][0])
+	return flt(
+		frappe.db.sql(
+			"""select avg(purchase_rate) from `tabSerial No`
+		where name in (%s)"""
+			% ", ".join(["%s"] * len(serial_nos)),
+			tuple(serial_nos),
+		)[0][0]
+	)
+
 
 def get_valuation_method(item_code):
 	"""get valuation method from item or default"""
-	val_method = frappe.db.get_value('Item', item_code, 'valuation_method', cache=True)
+	val_method = frappe.db.get_value("Item", item_code, "valuation_method", cache=True)
 	if not val_method:
-		val_method = frappe.db.get_value("Stock Settings", None, "valuation_method", cache=True) or "FIFO"
+		val_method = (
+			frappe.db.get_value("Stock Settings", None, "valuation_method", cache=True) or "FIFO"
+		)
 	return val_method
 
+
 def get_fifo_rate(previous_stock_queue, qty):
 	"""get FIFO (average) Rate from Queue"""
 	return _get_fifo_lifo_rate(previous_stock_queue, qty, "FIFO")
 
+
 def get_lifo_rate(previous_stock_queue, qty):
 	"""get LIFO (average) Rate from Queue"""
 	return _get_fifo_lifo_rate(previous_stock_queue, qty, "LIFO")
@@ -286,10 +358,11 @@
 		total_qty, total_value = ValuationKlass(popped_bins).get_total_stock_and_value()
 		return total_value / total_qty if total_qty else 0.0
 
-def get_valid_serial_nos(sr_nos, qty=0, item_code=''):
+
+def get_valid_serial_nos(sr_nos, qty=0, item_code=""):
 	"""split serial nos, validate and return list of valid serial nos"""
 	# TODO: remove duplicates in client side
-	serial_nos = cstr(sr_nos).strip().replace(',', '\n').split('\n')
+	serial_nos = cstr(sr_nos).strip().replace(",", "\n").split("\n")
 
 	valid_serial_nos = []
 	for val in serial_nos:
@@ -305,19 +378,29 @@
 
 	return valid_serial_nos
 
+
 def validate_warehouse_company(warehouse, company):
 	warehouse_company = frappe.db.get_value("Warehouse", warehouse, "company", cache=True)
 	if warehouse_company and warehouse_company != company:
-		frappe.throw(_("Warehouse {0} does not belong to company {1}").format(warehouse, company),
-			InvalidWarehouseCompany)
+		frappe.throw(
+			_("Warehouse {0} does not belong to company {1}").format(warehouse, company),
+			InvalidWarehouseCompany,
+		)
+
 
 def is_group_warehouse(warehouse):
 	if frappe.db.get_value("Warehouse", warehouse, "is_group", cache=True):
 		frappe.throw(_("Group node warehouse is not allowed to select for transactions"))
 
+
 def validate_disabled_warehouse(warehouse):
 	if frappe.db.get_value("Warehouse", warehouse, "disabled", cache=True):
-		frappe.throw(_("Disabled Warehouse {0} cannot be used for this transaction.").format(get_link_to_form('Warehouse', warehouse)))
+		frappe.throw(
+			_("Disabled Warehouse {0} cannot be used for this transaction.").format(
+				get_link_to_form("Warehouse", warehouse)
+			)
+		)
+
 
 def update_included_uom_in_report(columns, result, include_uom, conversion_factors):
 	if not include_uom or not conversion_factors:
@@ -335,11 +418,14 @@
 			convertible_columns.setdefault(key, d.get("convertible"))
 
 			# Add new column to show qty/rate as per the selected UOM
-			columns.insert(idx+1, {
-				'label': "{0} (per {1})".format(d.get("label"), include_uom),
-				'fieldname': "{0}_{1}".format(d.get("fieldname"), frappe.scrub(include_uom)),
-				'fieldtype': 'Currency' if d.get("convertible") == 'rate' else 'Float'
-			})
+			columns.insert(
+				idx + 1,
+				{
+					"label": "{0} (per {1})".format(d.get("label"), include_uom),
+					"fieldname": "{0}_{1}".format(d.get("fieldname"), frappe.scrub(include_uom)),
+					"fieldtype": "Currency" if d.get("convertible") == "rate" else "Float",
+				},
+			)
 
 	update_dict_values = []
 	for row_idx, row in enumerate(result):
@@ -351,13 +437,13 @@
 			if not conversion_factors[row_idx]:
 				conversion_factors[row_idx] = 1
 
-			if convertible_columns.get(key) == 'rate':
+			if convertible_columns.get(key) == "rate":
 				new_value = flt(value) * conversion_factors[row_idx]
 			else:
 				new_value = flt(value) / conversion_factors[row_idx]
 
 			if not is_dict_obj:
-				row.insert(key+1, new_value)
+				row.insert(key + 1, new_value)
 			else:
 				new_key = "{0}_{1}".format(key, frappe.scrub(include_uom))
 				update_dict_values.append([row, new_key, new_value])
@@ -366,11 +452,17 @@
 		row, key, value = data
 		row[key] = value
 
+
 def get_available_serial_nos(args):
-	return frappe.db.sql(""" SELECT name from `tabSerial No`
+	return frappe.db.sql(
+		""" SELECT name from `tabSerial No`
 		WHERE item_code = %(item_code)s and warehouse = %(warehouse)s
 		 and timestamp(purchase_date, purchase_time) <= timestamp(%(posting_date)s, %(posting_time)s)
-	""", args, as_dict=1)
+	""",
+		args,
+		as_dict=1,
+	)
+
 
 def add_additional_uom_columns(columns, result, include_uom, conversion_factors):
 	if not include_uom or not conversion_factors:
@@ -379,70 +471,80 @@
 	convertible_column_map = {}
 	for col_idx in list(reversed(range(0, len(columns)))):
 		col = columns[col_idx]
-		if isinstance(col, dict) and col.get('convertible') in ['rate', 'qty']:
+		if isinstance(col, dict) and col.get("convertible") in ["rate", "qty"]:
 			next_col = col_idx + 1
 			columns.insert(next_col, col.copy())
-			columns[next_col]['fieldname'] += '_alt'
-			convertible_column_map[col.get('fieldname')] = frappe._dict({
-				'converted_col': columns[next_col]['fieldname'],
-				'for_type': col.get('convertible')
-			})
-			if col.get('convertible') == 'rate':
-				columns[next_col]['label'] += ' (per {})'.format(include_uom)
+			columns[next_col]["fieldname"] += "_alt"
+			convertible_column_map[col.get("fieldname")] = frappe._dict(
+				{"converted_col": columns[next_col]["fieldname"], "for_type": col.get("convertible")}
+			)
+			if col.get("convertible") == "rate":
+				columns[next_col]["label"] += " (per {})".format(include_uom)
 			else:
-				columns[next_col]['label'] += ' ({})'.format(include_uom)
+				columns[next_col]["label"] += " ({})".format(include_uom)
 
 	for row_idx, row in enumerate(result):
 		for convertible_col, data in convertible_column_map.items():
-			conversion_factor = conversion_factors[row.get('item_code')] or 1
+			conversion_factor = conversion_factors[row.get("item_code")] or 1
 			for_type = data.for_type
 			value_before_conversion = row.get(convertible_col)
-			if for_type == 'rate':
+			if for_type == "rate":
 				row[data.converted_col] = flt(value_before_conversion) * conversion_factor
 			else:
 				row[data.converted_col] = flt(value_before_conversion) / conversion_factor
 
 		result[row_idx] = row
 
+
 def get_incoming_outgoing_rate_for_cancel(item_code, voucher_type, voucher_no, voucher_detail_no):
-	outgoing_rate = frappe.db.sql("""SELECT abs(stock_value_difference / actual_qty)
+	outgoing_rate = frappe.db.sql(
+		"""SELECT abs(stock_value_difference / actual_qty)
 		FROM `tabStock Ledger Entry`
 		WHERE voucher_type = %s and voucher_no = %s
 			and item_code = %s and voucher_detail_no = %s
 			ORDER BY CREATION DESC limit 1""",
-		(voucher_type, voucher_no, item_code, voucher_detail_no))
+		(voucher_type, voucher_no, item_code, voucher_detail_no),
+	)
 
 	outgoing_rate = outgoing_rate[0][0] if outgoing_rate else 0.0
 
 	return outgoing_rate
 
+
 def is_reposting_item_valuation_in_progress():
-	reposting_in_progress = frappe.db.exists("Repost Item Valuation",
-		{'docstatus': 1, 'status': ['in', ['Queued','In Progress']]})
+	reposting_in_progress = frappe.db.exists(
+		"Repost Item Valuation", {"docstatus": 1, "status": ["in", ["Queued", "In Progress"]]}
+	)
 	if reposting_in_progress:
-		frappe.msgprint(_("Item valuation reposting in progress. Report might show incorrect item valuation."), alert=1)
+		frappe.msgprint(
+			_("Item valuation reposting in progress. Report might show incorrect item valuation."), alert=1
+		)
+
 
 def check_pending_reposting(posting_date: str, throw_error: bool = True) -> bool:
 	"""Check if there are pending reposting job till the specified posting date."""
 
 	filters = {
 		"docstatus": 1,
-		"status": ["in", ["Queued","In Progress", "Failed"]],
+		"status": ["in", ["Queued", "In Progress", "Failed"]],
 		"posting_date": ["<=", posting_date],
 	}
 
-	reposting_pending =  frappe.db.exists("Repost Item Valuation", filters)
+	reposting_pending = frappe.db.exists("Repost Item Valuation", filters)
 	if reposting_pending and throw_error:
-		msg = _("Stock/Accounts can not be frozen as processing of backdated entries is going on. Please try again later.")
-		frappe.msgprint(msg,
-				raise_exception=PendingRepostingError,
-				title="Stock Reposting Ongoing",
-				indicator="red",
-				primary_action={
-					"label": _("Show pending entries"),
-					"client_action": "erpnext.route_to_pending_reposts",
-					"args": filters,
-				}
-			)
+		msg = _(
+			"Stock/Accounts can not be frozen as processing of backdated entries is going on. Please try again later."
+		)
+		frappe.msgprint(
+			msg,
+			raise_exception=PendingRepostingError,
+			title="Stock Reposting Ongoing",
+			indicator="red",
+			primary_action={
+				"label": _("Show pending entries"),
+				"client_action": "erpnext.route_to_pending_reposts",
+				"args": filters,
+			},
+		)
 
 	return bool(reposting_pending)
diff --git a/erpnext/stock/valuation.py b/erpnext/stock/valuation.py
index e2bd1ad..648b218 100644
--- a/erpnext/stock/valuation.py
+++ b/erpnext/stock/valuation.py
@@ -11,7 +11,6 @@
 
 
 class BinWiseValuation(ABC):
-
 	@abstractmethod
 	def add_stock(self, qty: float, rate: float) -> None:
 		pass
@@ -61,7 +60,9 @@
 
 	# specifying the attributes to save resources
 	# ref: https://docs.python.org/3/reference/datamodel.html#slots
-	__slots__ = ["queue",]
+	__slots__ = [
+		"queue",
+	]
 
 	def __init__(self, state: Optional[List[StockBin]]):
 		self.queue: List[StockBin] = state if state is not None else []
@@ -74,9 +75,9 @@
 	def add_stock(self, qty: float, rate: float) -> None:
 		"""Update fifo queue with new stock.
 
-			args:
-				qty: new quantity to add
-				rate: incoming rate of new quantity"""
+		args:
+		        qty: new quantity to add
+		        rate: incoming rate of new quantity"""
 
 		if not len(self.queue):
 			self.queue.append([0, 0])
@@ -101,12 +102,12 @@
 		"""Remove stock from the queue and return popped bins.
 
 		args:
-			qty: quantity to remove
-			rate: outgoing rate
-			rate_generator: function to be called if queue is not found and rate is required.
+		        qty: quantity to remove
+		        rate: outgoing rate
+		        rate_generator: function to be called if queue is not found and rate is required.
 		"""
 		if not rate_generator:
-			rate_generator = lambda : 0.0  # noqa
+			rate_generator = lambda: 0.0  # noqa
 
 		consumed_bins = []
 		while qty:
@@ -126,7 +127,9 @@
 				if index is None:  # nosemgrep
 					new_stock_value = sum(d[QTY] * d[RATE] for d in self.queue) - qty * outgoing_rate
 					new_stock_qty = sum(d[QTY] for d in self.queue) - qty
-					self.queue = [[new_stock_qty, new_stock_value / new_stock_qty if new_stock_qty > 0 else outgoing_rate]]
+					self.queue = [
+						[new_stock_qty, new_stock_value / new_stock_qty if new_stock_qty > 0 else outgoing_rate]
+					]
 					consumed_bins.append([qty, outgoing_rate])
 					break
 			else:
@@ -169,7 +172,9 @@
 
 	# specifying the attributes to save resources
 	# ref: https://docs.python.org/3/reference/datamodel.html#slots
-	__slots__ = ["stack",]
+	__slots__ = [
+		"stack",
+	]
 
 	def __init__(self, state: Optional[List[StockBin]]):
 		self.stack: List[StockBin] = state if state is not None else []
@@ -182,11 +187,11 @@
 	def add_stock(self, qty: float, rate: float) -> None:
 		"""Update lifo stack with new stock.
 
-			args:
-				qty: new quantity to add
-				rate: incoming rate of new quantity.
+		args:
+		        qty: new quantity to add
+		        rate: incoming rate of new quantity.
 
-			Behaviour of this is same as FIFO valuation.
+		Behaviour of this is same as FIFO valuation.
 		"""
 		if not len(self.stack):
 			self.stack.append([0, 0])
@@ -205,19 +210,18 @@
 				else:  # new balance qty is still negative, maintain same rate
 					self.stack[-1][QTY] = qty
 
-
 	def remove_stock(
 		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
 	) -> List[StockBin]:
 		"""Remove stock from the stack and return popped bins.
 
 		args:
-			qty: quantity to remove
-			rate: outgoing rate - ignored. Kept for backwards compatibility.
-			rate_generator: function to be called if stack is not found and rate is required.
+		        qty: quantity to remove
+		        rate: outgoing rate - ignored. Kept for backwards compatibility.
+		        rate_generator: function to be called if stack is not found and rate is required.
 		"""
 		if not rate_generator:
-			rate_generator = lambda : 0.0  # noqa
+			rate_generator = lambda: 0.0  # noqa
 
 		consumed_bins = []
 		while qty:
@@ -254,7 +258,7 @@
 	"""Rounds off the number to zero only if number is close to zero for decimal
 	specified in precision. Precision defaults to 7.
 	"""
-	if abs(0.0 - flt(number)) < (1.0 / (10 ** precision)):
+	if abs(0.0 - flt(number)) < (1.0 / (10**precision)):
 		return 0.0
 
 	return flt(number)
diff --git a/erpnext/support/__init__.py b/erpnext/support/__init__.py
index ac23ede..7b6845d 100644
--- a/erpnext/support/__init__.py
+++ b/erpnext/support/__init__.py
@@ -1,5 +1,5 @@
 install_docs = [
-	{'doctype':'Role', 'role_name':'Support Team', 'name':'Support Team'},
-	{'doctype':'Role', 'role_name':'Maintenance User', 'name':'Maintenance User'},
-	{'doctype':'Role', 'role_name':'Maintenance Manager', 'name':'Maintenance Manager'}
+	{"doctype": "Role", "role_name": "Support Team", "name": "Support Team"},
+	{"doctype": "Role", "role_name": "Maintenance User", "name": "Maintenance User"},
+	{"doctype": "Role", "role_name": "Maintenance Manager", "name": "Maintenance Manager"},
 ]
diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py
index e211e24..08a06b1 100644
--- a/erpnext/support/doctype/issue/issue.py
+++ b/erpnext/support/doctype/issue/issue.py
@@ -50,23 +50,26 @@
 					self.customer = contact.get_link_for("Customer")
 
 			if not self.company:
-				self.company = frappe.db.get_value("Lead", self.lead, "company") or \
-					frappe.db.get_default("Company")
+				self.company = frappe.db.get_value("Lead", self.lead, "company") or frappe.db.get_default(
+					"Company"
+				)
 
 	def create_communication(self):
 		communication = frappe.new_doc("Communication")
-		communication.update({
-			"communication_type": "Communication",
-			"communication_medium": "Email",
-			"sent_or_received": "Received",
-			"email_status": "Open",
-			"subject": self.subject,
-			"sender": self.raised_by,
-			"content": self.description,
-			"status": "Linked",
-			"reference_doctype": "Issue",
-			"reference_name": self.name
-		})
+		communication.update(
+			{
+				"communication_type": "Communication",
+				"communication_medium": "Email",
+				"sent_or_received": "Received",
+				"email_status": "Open",
+				"subject": self.subject,
+				"sender": self.raised_by,
+				"content": self.description,
+				"status": "Linked",
+				"reference_doctype": "Issue",
+				"reference_name": self.name,
+			}
+		)
 		communication.ignore_permissions = True
 		communication.ignore_mandatory = True
 		communication.save()
@@ -97,23 +100,31 @@
 		# Replicate linked Communications
 		# TODO: get all communications in timeline before this, and modify them to append them to new doc
 		comm_to_split_from = frappe.get_doc("Communication", communication_id)
-		communications = frappe.get_all("Communication",
-			filters={"reference_doctype": "Issue",
+		communications = frappe.get_all(
+			"Communication",
+			filters={
+				"reference_doctype": "Issue",
 				"reference_name": comm_to_split_from.reference_name,
-				"creation": (">=", comm_to_split_from.creation)})
+				"creation": (">=", comm_to_split_from.creation),
+			},
+		)
 
 		for communication in communications:
 			doc = frappe.get_doc("Communication", communication.name)
 			doc.reference_name = replicated_issue.name
 			doc.save(ignore_permissions=True)
 
-		frappe.get_doc({
-			"doctype": "Comment",
-			"comment_type": "Info",
-			"reference_doctype": "Issue",
-			"reference_name": replicated_issue.name,
-			"content": " - Split the Issue from <a href='/app/Form/Issue/{0}'>{1}</a>".format(self.name, frappe.bold(self.name)),
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Comment",
+				"comment_type": "Info",
+				"reference_doctype": "Issue",
+				"reference_name": replicated_issue.name,
+				"content": " - Split the Issue from <a href='/app/Form/Issue/{0}'>{1}</a>".format(
+					self.name, frappe.bold(self.name)
+				),
+			}
+		).insert(ignore_permissions=True)
 
 		return replicated_issue.name
 
@@ -121,6 +132,7 @@
 		self.db_set("resolution_time", None)
 		self.db_set("user_resolution_time", None)
 
+
 def get_list_context(context=None):
 	return {
 		"title": _("Issues"),
@@ -128,7 +140,7 @@
 		"row_template": "templates/includes/issue_row.html",
 		"show_sidebar": True,
 		"show_search": True,
-		"no_breadcrumbs": True
+		"no_breadcrumbs": True,
 	}
 
 
@@ -145,7 +157,8 @@
 
 	ignore_permissions = False
 	if is_website_user():
-		if not filters: filters = {}
+		if not filters:
+			filters = {}
 
 		if customer:
 			filters["customer"] = customer
@@ -154,7 +167,9 @@
 
 		ignore_permissions = True
 
-	return get_list(doctype, txt, filters, limit_start, limit_page_length, ignore_permissions=ignore_permissions)
+	return get_list(
+		doctype, txt, filters, limit_start, limit_page_length, ignore_permissions=ignore_permissions
+	)
 
 
 @frappe.whitelist()
@@ -163,16 +178,24 @@
 	for name in json.loads(names):
 		frappe.db.set_value("Issue", name, "status", status)
 
+
 @frappe.whitelist()
 def set_status(name, status):
 	frappe.db.set_value("Issue", name, "status", status)
 
+
 def auto_close_tickets():
 	"""Auto-close replied support tickets after 7 days"""
-	auto_close_after_days = frappe.db.get_value("Support Settings", "Support Settings", "close_issue_after_days") or 7
+	auto_close_after_days = (
+		frappe.db.get_value("Support Settings", "Support Settings", "close_issue_after_days") or 7
+	)
 
-	issues = frappe.db.sql(""" select name from tabIssue where status='Replied' and
-		modified<DATE_SUB(CURDATE(), INTERVAL %s DAY) """, (auto_close_after_days), as_dict=True)
+	issues = frappe.db.sql(
+		""" select name from tabIssue where status='Replied' and
+		modified<DATE_SUB(CURDATE(), INTERVAL %s DAY) """,
+		(auto_close_after_days),
+		as_dict=True,
+	)
 
 	for issue in issues:
 		doc = frappe.get_doc("Issue", issue.get("name"))
@@ -181,72 +204,87 @@
 		doc.flags.ignore_mandatory = True
 		doc.save()
 
+
 def has_website_permission(doc, ptype, user, verbose=False):
 	from erpnext.controllers.website_list_for_contact import has_website_permission
+
 	permission_based_on_customer = has_website_permission(doc, ptype, user, verbose)
 
-	return permission_based_on_customer or doc.raised_by==user
+	return permission_based_on_customer or doc.raised_by == user
+
 
 def update_issue(contact, method):
 	"""Called when Contact is deleted"""
 	frappe.db.sql("""UPDATE `tabIssue` set contact='' where contact=%s""", contact.name)
 
+
 @frappe.whitelist()
 def make_task(source_name, target_doc=None):
-	return get_mapped_doc("Issue", source_name, {
-		"Issue": {
-			"doctype": "Task"
-		}
-	}, target_doc)
+	return get_mapped_doc("Issue", source_name, {"Issue": {"doctype": "Task"}}, target_doc)
+
 
 @frappe.whitelist()
 def make_issue_from_communication(communication, ignore_communication_links=False):
-	""" raise a issue from email """
+	"""raise a issue from email"""
 
 	doc = frappe.get_doc("Communication", communication)
-	issue = frappe.get_doc({
-		"doctype": "Issue",
-		"subject": doc.subject,
-		"communication_medium": doc.communication_medium,
-		"raised_by": doc.sender or "",
-		"raised_by_phone": doc.phone_no or ""
-	}).insert(ignore_permissions=True)
+	issue = frappe.get_doc(
+		{
+			"doctype": "Issue",
+			"subject": doc.subject,
+			"communication_medium": doc.communication_medium,
+			"raised_by": doc.sender or "",
+			"raised_by_phone": doc.phone_no or "",
+		}
+	).insert(ignore_permissions=True)
 
 	link_communication_to_document(doc, "Issue", issue.name, ignore_communication_links)
 
 	return issue.name
 
+
 def get_time_in_timedelta(time):
 	"""
-		Converts datetime.time(10, 36, 55, 961454) to datetime.timedelta(seconds=38215)
+	Converts datetime.time(10, 36, 55, 961454) to datetime.timedelta(seconds=38215)
 	"""
 	return timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
 
+
 def set_first_response_time(communication, method):
-	if communication.get('reference_doctype') == "Issue":
+	if communication.get("reference_doctype") == "Issue":
 		issue = get_parent_doc(communication)
 		if is_first_response(issue) and issue.service_level_agreement:
-			first_response_time = calculate_first_response_time(issue, get_datetime(issue.first_responded_on))
+			first_response_time = calculate_first_response_time(
+				issue, get_datetime(issue.first_responded_on)
+			)
 			issue.db_set("first_response_time", first_response_time)
 
+
 def is_first_response(issue):
-	responses = frappe.get_all('Communication', filters = {'reference_name': issue.name, 'sent_or_received': 'Sent'})
+	responses = frappe.get_all(
+		"Communication", filters={"reference_name": issue.name, "sent_or_received": "Sent"}
+	)
 	if len(responses) == 1:
 		return True
 	return False
 
+
 def calculate_first_response_time(issue, first_responded_on):
 	issue_creation_date = issue.service_level_agreement_creation or issue.creation
 	issue_creation_time = get_time_in_seconds(issue_creation_date)
 	first_responded_on_in_seconds = get_time_in_seconds(first_responded_on)
-	support_hours = frappe.get_cached_doc("Service Level Agreement", issue.service_level_agreement).support_and_resolution
+	support_hours = frappe.get_cached_doc(
+		"Service Level Agreement", issue.service_level_agreement
+	).support_and_resolution
 
 	if issue_creation_date.day == first_responded_on.day:
 		if is_work_day(issue_creation_date, support_hours):
 			start_time, end_time = get_working_hours(issue_creation_date, support_hours)
 
 			# issue creation and response on the same day during working hours
-			if is_during_working_hours(issue_creation_date, support_hours) and is_during_working_hours(first_responded_on, support_hours):
+			if is_during_working_hours(issue_creation_date, support_hours) and is_during_working_hours(
+				first_responded_on, support_hours
+			):
 				return get_elapsed_time(issue_creation_date, first_responded_on)
 
 			# issue creation is during working hours, but first response was after working hours
@@ -259,7 +297,7 @@
 
 			# both issue creation and first response were after working hours
 			else:
-				return 1.0		# this should ideally be zero, but it gets reset when the next response is sent if the value is zero
+				return 1.0  # this should ideally be zero, but it gets reset when the next response is sent if the value is zero
 
 		else:
 			return 1.0
@@ -269,7 +307,9 @@
 		if date_diff(first_responded_on, issue_creation_date) == 1:
 			first_response_time = 0
 		else:
-			first_response_time = calculate_initial_frt(issue_creation_date, date_diff(first_responded_on, issue_creation_date)- 1, support_hours)
+			first_response_time = calculate_initial_frt(
+				issue_creation_date, date_diff(first_responded_on, issue_creation_date) - 1, support_hours
+			)
 
 		# time taken on day of issue creation
 		if is_work_day(issue_creation_date, support_hours):
@@ -294,9 +334,11 @@
 		else:
 			return 1.0
 
+
 def get_time_in_seconds(date):
 	return timedelta(hours=date.hour, minutes=date.minute, seconds=date.second)
 
+
 def get_working_hours(date, support_hours):
 	if is_work_day(date, support_hours):
 		weekday = frappe.utils.get_weekday(date)
@@ -304,6 +346,7 @@
 			if day.workday == weekday:
 				return day.start_time, day.end_time
 
+
 def is_work_day(date, support_hours):
 	weekday = frappe.utils.get_weekday(date)
 	for day in support_hours:
@@ -311,6 +354,7 @@
 			return True
 	return False
 
+
 def is_during_working_hours(date, support_hours):
 	start_time, end_time = get_working_hours(date, support_hours)
 	time = get_time_in_seconds(date)
@@ -318,19 +362,22 @@
 		return True
 	return False
 
+
 def get_elapsed_time(start_time, end_time):
 	return round(time_diff_in_seconds(end_time, start_time), 2)
 
+
 def calculate_initial_frt(issue_creation_date, days_in_between, support_hours):
 	initial_frt = 0
 	for i in range(days_in_between):
-		date = issue_creation_date + timedelta(days = (i+1))
+		date = issue_creation_date + timedelta(days=(i + 1))
 		if is_work_day(date, support_hours):
 			start_time, end_time = get_working_hours(date, support_hours)
 			initial_frt += get_elapsed_time(start_time, end_time)
 
 	return initial_frt
 
+
 def is_before_working_hours(date, support_hours):
 	start_time, end_time = get_working_hours(date, support_hours)
 	time = get_time_in_seconds(date)
@@ -338,6 +385,7 @@
 		return True
 	return False
 
+
 def get_holidays(holiday_list_name):
 	holiday_list = frappe.get_cached_doc("Holiday List", holiday_list_name)
 	holidays = [holiday.holiday_date for holiday in holiday_list.holidays]
diff --git a/erpnext/support/doctype/issue/issue_dashboard.py b/erpnext/support/doctype/issue/issue_dashboard.py
index 7ab358a..1a53be9 100644
--- a/erpnext/support/doctype/issue/issue_dashboard.py
+++ b/erpnext/support/doctype/issue/issue_dashboard.py
@@ -2,12 +2,4 @@
 
 
 def get_data():
-	return {
-		'fieldname': 'issue',
-		'transactions': [
-			{
-				'label': _('Activity'),
-				'items': ['Task']
-			}
-		]
-	}
+	return {"fieldname": "issue", "transactions": [{"label": _("Activity"), "items": ["Task"]}]}
diff --git a/erpnext/support/doctype/issue/test_issue.py b/erpnext/support/doctype/issue/test_issue.py
index 7a0a5e5..a440124 100644
--- a/erpnext/support/doctype/issue/test_issue.py
+++ b/erpnext/support/doctype/issue/test_issue.py
@@ -23,6 +23,7 @@
 		frappe.db.set_value("Support Settings", None, "track_service_level_agreement", 1)
 		create_service_level_agreements_for_issues()
 
+
 class TestIssue(TestSetUp):
 	def test_response_time_and_resolution_time_based_on_different_sla(self):
 		creation = get_datetime("2019-03-04 12:00")
@@ -41,9 +42,10 @@
 		self.assertEqual(issue.response_by, get_datetime("2019-03-04 14:00"))
 		self.assertEqual(issue.resolution_by, get_datetime("2019-03-04 15:00"))
 
-
 		# make issue with territory specific SLA
-		customer = create_customer("___Test Customer", "__Test SLA Customer Group", "_Test SLA Territory")
+		customer = create_customer(
+			"___Test Customer", "__Test SLA Customer Group", "_Test SLA Territory"
+		)
 		issue = make_issue(creation, "___Test Customer", 3)
 
 		self.assertEqual(issue.response_by, get_datetime("2019-03-04 14:00"))
@@ -78,10 +80,10 @@
 
 		frappe.flags.current_time = get_datetime("2019-03-04 15:00")
 		issue.reload()
-		issue.status = 'Closed'
+		issue.status = "Closed"
 		issue.save()
 
-		self.assertEqual(issue.agreement_status, 'Fulfilled')
+		self.assertEqual(issue.agreement_status, "Fulfilled")
 
 	def test_hold_time_on_replied(self):
 		creation = get_datetime("2020-03-04 4:00")
@@ -94,7 +96,7 @@
 
 		frappe.flags.current_time = get_datetime("2020-03-04 4:15")
 		issue.reload()
-		issue.status = 'Replied'
+		issue.status = "Replied"
 		issue.save()
 
 		self.assertEqual(issue.on_hold_since, frappe.flags.current_time)
@@ -113,7 +115,7 @@
 
 		frappe.flags.current_time = get_datetime("2020-03-04 5:05")
 		issue.reload()
-		issue.status = 'Closed'
+		issue.status = "Closed"
 		issue.save()
 
 		issue.reload()
@@ -130,27 +132,29 @@
 		create_communication(issue.name, "test@admin.com", "Sent", frappe.flags.current_time)
 
 		issue.reload()
-		issue.status = 'Replied'
+		issue.status = "Replied"
 		issue.save()
 
 		self.assertEqual(issue.on_hold_since, frappe.flags.current_time)
 
 		# close the issue after being on hold for 20 days
 		frappe.flags.current_time = get_datetime("2021-11-22 01:00")
-		issue.status = 'Closed'
+		issue.status = "Closed"
 		issue.save()
 
-		self.assertEqual(issue.resolution_by, get_datetime('2021-11-22 06:00:00'))
-		self.assertEqual(issue.resolution_date, get_datetime('2021-11-22 01:00:00'))
-		self.assertEqual(issue.agreement_status, 'Fulfilled')
+		self.assertEqual(issue.resolution_by, get_datetime("2021-11-22 06:00:00"))
+		self.assertEqual(issue.resolution_date, get_datetime("2021-11-22 01:00:00"))
+		self.assertEqual(issue.agreement_status, "Fulfilled")
 
 	def test_issue_open_after_closed(self):
 
 		# Created on -> 1 pm, Response Time -> 4 hrs, Resolution Time -> 6 hrs
 		frappe.flags.current_time = get_datetime("2021-11-01 13:00")
-		issue = make_issue(frappe.flags.current_time, index=1, issue_type='Critical') # Applies 24hr working time SLA
+		issue = make_issue(
+			frappe.flags.current_time, index=1, issue_type="Critical"
+		)  # Applies 24hr working time SLA
 		create_communication(issue.name, "test@example.com", "Received", frappe.flags.current_time)
-		self.assertEquals(issue.agreement_status, 'First Response Due')
+		self.assertEquals(issue.agreement_status, "First Response Due")
 		self.assertEquals(issue.response_by, get_datetime("2021-11-01 17:00"))
 		self.assertEquals(issue.resolution_by, get_datetime("2021-11-01 19:00"))
 
@@ -158,9 +162,9 @@
 		frappe.flags.current_time = get_datetime("2021-11-01 14:00")
 		create_communication(issue.name, "test@admin.com", "Sent", frappe.flags.current_time)
 		issue.reload()
-		issue.status = 'Replied'
+		issue.status = "Replied"
 		issue.save()
-		self.assertEquals(issue.agreement_status, 'Resolution Due')
+		self.assertEquals(issue.agreement_status, "Resolution Due")
 		self.assertEquals(issue.on_hold_since, frappe.flags.current_time)
 		self.assertEquals(issue.first_responded_on, frappe.flags.current_time)
 
@@ -168,7 +172,7 @@
 		frappe.flags.current_time = get_datetime("2021-11-01 15:00")
 		create_communication(issue.name, "test@example.com", "Received", frappe.flags.current_time)
 		issue.reload()
-		self.assertEquals(issue.status, 'Open')
+		self.assertEquals(issue.status, "Open")
 		# Hold Time + 1 Hrs
 		self.assertEquals(issue.total_hold_time, 3600)
 		# Resolution By should increase by one hrs
@@ -178,19 +182,19 @@
 		frappe.flags.current_time = get_datetime("2021-11-01 16:00")
 		create_communication(issue.name, "test@admin.com", "Sent", frappe.flags.current_time)
 		issue.reload()
-		issue.status = 'Replied'
+		issue.status = "Replied"
 		issue.save()
-		self.assertEquals(issue.agreement_status, 'Resolution Due')
+		self.assertEquals(issue.agreement_status, "Resolution Due")
 
 		# Customer Closed → 10 pm
 		frappe.flags.current_time = get_datetime("2021-11-01 22:00")
-		issue.status = 'Closed'
+		issue.status = "Closed"
 		issue.save()
 		# Hold Time + 6 Hrs
 		self.assertEquals(issue.total_hold_time, 3600 + 21600)
 		# Resolution By should increase by 6 hrs
 		self.assertEquals(issue.resolution_by, get_datetime("2021-11-02 02:00"))
-		self.assertEquals(issue.agreement_status, 'Fulfilled')
+		self.assertEquals(issue.agreement_status, "Fulfilled")
 		self.assertEquals(issue.resolution_date, frappe.flags.current_time)
 
 		# Customer Open → 3 am i.e after resolution by is crossed
@@ -201,15 +205,15 @@
 		self.assertEquals(issue.total_hold_time, 3600 + 21600 + 18000)
 		# Resolution By should increase by 5 hrs
 		self.assertEquals(issue.resolution_by, get_datetime("2021-11-02 07:00"))
-		self.assertEquals(issue.agreement_status, 'Resolution Due')
+		self.assertEquals(issue.agreement_status, "Resolution Due")
 		self.assertFalse(issue.resolution_date)
 
 		# We Closed → 4 am, SLA should be Fulfilled
 		frappe.flags.current_time = get_datetime("2021-11-02 04:00")
-		issue.status = 'Closed'
+		issue.status = "Closed"
 		issue.save()
 		self.assertEquals(issue.resolution_by, get_datetime("2021-11-02 07:00"))
-		self.assertEquals(issue.agreement_status, 'Fulfilled')
+		self.assertEquals(issue.agreement_status, "Fulfilled")
 		self.assertEquals(issue.resolution_date, frappe.flags.current_time)
 
 	def test_recording_of_assignment_on_first_reponse_failure(self):
@@ -219,11 +223,7 @@
 
 		issue = make_issue(frappe.flags.current_time, index=1)
 		create_communication(issue.name, "test@example.com", "Received", frappe.flags.current_time)
-		add_assignment({
-			'doctype': issue.doctype,
-			'name': issue.name,
-			'assign_to': ['test@admin.com']
-		})
+		add_assignment({"doctype": issue.doctype, "name": issue.name, "assign_to": ["test@admin.com"]})
 		issue.reload()
 
 		# send a reply failing response SLA
@@ -232,12 +232,15 @@
 
 		# assert if a new timeline item has been added
 		# to record the assignment
-		comment = frappe.db.exists('Comment', {
-			'reference_doctype': 'Issue',
-			'reference_name': issue.name,
-			'comment_type': 'Assigned',
-			'content': _('First Response SLA Failed by {}').format('test')
-		})
+		comment = frappe.db.exists(
+			"Comment",
+			{
+				"reference_doctype": "Issue",
+				"reference_name": issue.name,
+				"comment_type": "Assigned",
+				"content": _("First Response SLA Failed by {}").format("test"),
+			},
+		)
 		self.assertTrue(comment)
 
 	def test_agreement_status_on_response(self):
@@ -245,7 +248,7 @@
 
 		issue = make_issue(frappe.flags.current_time, index=1)
 		create_communication(issue.name, "test@example.com", "Received", frappe.flags.current_time)
-		self.assertTrue(issue.status == 'Open')
+		self.assertTrue(issue.status == "Open")
 
 		# send a reply within response SLA
 		frappe.flags.current_time = get_datetime("2021-11-02 11:00")
@@ -253,7 +256,8 @@
 
 		issue.reload()
 		self.assertEquals(issue.first_responded_on, frappe.flags.current_time)
-		self.assertEquals(issue.agreement_status, 'Resolution Due')
+		self.assertEquals(issue.agreement_status, "Resolution Due")
+
 
 class TestFirstResponseTime(TestSetUp):
 	# working hours used in all cases: Mon-Fri, 10am to 6pm
@@ -262,209 +266,268 @@
 	# issue creation and first response are on the same day
 	def test_first_response_time_case1(self):
 		"""
-			Test frt when issue creation and first response are during working hours on the same day.
+		Test frt when issue creation and first response are during working hours on the same day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 11:00"), get_datetime("06-28-2021 12:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 11:00"), get_datetime("06-28-2021 12:00")
+		)
 		self.assertEqual(issue.first_response_time, 3600.0)
 
 	def test_first_response_time_case2(self):
 		"""
-			Test frt when issue creation was during working hours, but first response is sent after working hours on the same day.
+		Test frt when issue creation was during working hours, but first response is sent after working hours on the same day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-28-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("06-28-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 21600.0)
 
 	def test_first_response_time_case3(self):
 		"""
-			Test frt when issue creation was before working hours but first response is sent during working hours on the same day.
+		Test frt when issue creation was before working hours but first response is sent during working hours on the same day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-28-2021 12:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("06-28-2021 12:00")
+		)
 		self.assertEqual(issue.first_response_time, 7200.0)
 
 	def test_first_response_time_case4(self):
 		"""
-			Test frt when both issue creation and first response were after working hours on the same day.
+		Test frt when both issue creation and first response were after working hours on the same day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 19:00"), get_datetime("06-28-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 19:00"), get_datetime("06-28-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 1.0)
 
 	def test_first_response_time_case5(self):
 		"""
-			Test frt when both issue creation and first response are on the same day, but it's not a work day.
+		Test frt when both issue creation and first response are on the same day, but it's not a work day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-27-2021 10:00"), get_datetime("06-27-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-27-2021 10:00"), get_datetime("06-27-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 1.0)
 
 	# issue creation and first response are on consecutive days
 	def test_first_response_time_case6(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is also sent before working hours, but on the next day.
+		Test frt when the issue was created before working hours and the first response is also sent before working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 6:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 6:00")
+		)
 		self.assertEqual(issue.first_response_time, 28800.0)
 
 	def test_first_response_time_case7(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is sent during working hours, but on the next day.
+		Test frt when the issue was created before working hours and the first response is sent during working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 32400.0)
 
 	def test_first_response_time_case8(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is sent after working hours, but on the next day.
+		Test frt when the issue was created before working hours and the first response is sent after working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 57600.0)
 
 	def test_first_response_time_case9(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is sent on the next day, which is not a work day.
+		Test frt when the issue was created before working hours and the first response is sent on the next day, which is not a work day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-25-2021 6:00"), get_datetime("06-26-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-25-2021 6:00"), get_datetime("06-26-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 28800.0)
 
 	def test_first_response_time_case10(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is sent before working hours, but on the next day.
+		Test frt when the issue was created during working hours and the first response is sent before working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 6:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 6:00")
+		)
 		self.assertEqual(issue.first_response_time, 21600.0)
 
 	def test_first_response_time_case11(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is also sent during working hours, but on the next day.
+		Test frt when the issue was created during working hours and the first response is also sent during working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 25200.0)
 
 	def test_first_response_time_case12(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is sent after working hours, but on the next day.
+		Test frt when the issue was created during working hours and the first response is sent after working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 50400.0)
 
 	def test_first_response_time_case13(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is sent on the next day, which is not a work day.
+		Test frt when the issue was created during working hours and the first response is sent on the next day, which is not a work day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-25-2021 12:00"), get_datetime("06-26-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-25-2021 12:00"), get_datetime("06-26-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 21600.0)
 
 	def test_first_response_time_case14(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is sent before working hours, but on the next day.
+		Test frt when the issue was created after working hours and the first response is sent before working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 6:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 6:00")
+		)
 		self.assertEqual(issue.first_response_time, 1.0)
 
 	def test_first_response_time_case15(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is sent during working hours, but on the next day.
+		Test frt when the issue was created after working hours and the first response is sent during working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 3600.0)
 
 	def test_first_response_time_case16(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is also sent after working hours, but on the next day.
+		Test frt when the issue was created after working hours and the first response is also sent after working hours, but on the next day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 28800.0)
 
 	def test_first_response_time_case17(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is sent on the next day, which is not a work day.
+		Test frt when the issue was created after working hours and the first response is sent on the next day, which is not a work day.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-25-2021 20:00"), get_datetime("06-26-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-25-2021 20:00"), get_datetime("06-26-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 1.0)
 
 	# issue creation and first response are a few days apart
 	def test_first_response_time_case18(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is also sent before working hours, but after a few days.
+		Test frt when the issue was created before working hours and the first response is also sent before working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 6:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 6:00")
+		)
 		self.assertEqual(issue.first_response_time, 86400.0)
 
 	def test_first_response_time_case19(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is sent during working hours, but after a few days.
+		Test frt when the issue was created before working hours and the first response is sent during working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 90000.0)
 
 	def test_first_response_time_case20(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is sent after working hours, but after a few days.
+		Test frt when the issue was created before working hours and the first response is sent after working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 115200.0)
 
 	def test_first_response_time_case21(self):
 		"""
-			Test frt when the issue was created before working hours and the first response is sent after a few days, on a holiday.
+		Test frt when the issue was created before working hours and the first response is sent after a few days, on a holiday.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-25-2021 6:00"), get_datetime("06-27-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-25-2021 6:00"), get_datetime("06-27-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 28800.0)
 
 	def test_first_response_time_case22(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is sent before working hours, but after a few days.
+		Test frt when the issue was created during working hours and the first response is sent before working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 6:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 6:00")
+		)
 		self.assertEqual(issue.first_response_time, 79200.0)
 
 	def test_first_response_time_case23(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is also sent during working hours, but after a few days.
+		Test frt when the issue was created during working hours and the first response is also sent during working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 82800.0)
 
 	def test_first_response_time_case24(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is sent after working hours, but after a few days.
+		Test frt when the issue was created during working hours and the first response is sent after working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 108000.0)
 
 	def test_first_response_time_case25(self):
 		"""
-			Test frt when the issue was created during working hours and the first response is sent after a few days, on a holiday.
+		Test frt when the issue was created during working hours and the first response is sent after a few days, on a holiday.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-25-2021 12:00"), get_datetime("06-27-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-25-2021 12:00"), get_datetime("06-27-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 21600.0)
 
 	def test_first_response_time_case26(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is sent before working hours, but after a few days.
+		Test frt when the issue was created after working hours and the first response is sent before working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 6:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 6:00")
+		)
 		self.assertEqual(issue.first_response_time, 57600.0)
 
 	def test_first_response_time_case27(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is sent during working hours, but after a few days.
+		Test frt when the issue was created after working hours and the first response is sent during working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 61200.0)
 
 	def test_first_response_time_case28(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is also sent after working hours, but after a few days.
+		Test frt when the issue was created after working hours and the first response is also sent after working hours, but after a few days.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 20:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 20:00")
+		)
 		self.assertEqual(issue.first_response_time, 86400.0)
 
 	def test_first_response_time_case29(self):
 		"""
-			Test frt when the issue was created after working hours and the first response is sent after a few days, on a holiday.
+		Test frt when the issue was created after working hours and the first response is sent after a few days, on a holiday.
 		"""
-		issue = create_issue_and_communication(get_datetime("06-25-2021 20:00"), get_datetime("06-27-2021 11:00"))
+		issue = create_issue_and_communication(
+			get_datetime("06-25-2021 20:00"), get_datetime("06-27-2021 11:00")
+		)
 		self.assertEqual(issue.first_response_time, 1.0)
 
+
 def create_issue_and_communication(issue_creation, first_responded_on):
 	issue = make_issue(issue_creation, index=1)
 	sender = create_user("test@admin.com")
@@ -474,25 +537,28 @@
 
 	return issue
 
+
 def make_issue(creation=None, customer=None, index=0, priority=None, issue_type=None):
-	if issue_type and not frappe.db.exists('Issue Type', issue_type):
-		doc = frappe.new_doc('Issue Type')
+	if issue_type and not frappe.db.exists("Issue Type", issue_type):
+		doc = frappe.new_doc("Issue Type")
 		doc.name = issue_type
 		doc.insert()
 
-	issue = frappe.get_doc({
-		"doctype": "Issue",
-		"subject": "Service Level Agreement Issue {0}".format(index),
-		"customer": customer,
-		"raised_by": "test@example.com",
-		"description": "Service Level Agreement Issue",
-		"issue_type": issue_type,
-		"priority": priority,
-		"creation": creation,
-		"opening_date": creation,
-		"service_level_agreement_creation": creation,
-		"company": "_Test Company"
-	}).insert(ignore_permissions=True)
+	issue = frappe.get_doc(
+		{
+			"doctype": "Issue",
+			"subject": "Service Level Agreement Issue {0}".format(index),
+			"customer": customer,
+			"raised_by": "test@example.com",
+			"description": "Service Level Agreement Issue",
+			"issue_type": issue_type,
+			"priority": priority,
+			"creation": creation,
+			"opening_date": creation,
+			"service_level_agreement_creation": creation,
+			"company": "_Test Company",
+		}
+	).insert(ignore_permissions=True)
 
 	return issue
 
@@ -503,45 +569,50 @@
 	create_territory(territory)
 
 	if not frappe.db.exists("Customer", {"customer_name": name}):
-		frappe.get_doc({
-			"doctype": "Customer",
-			"customer_name": name,
-			"customer_group": customer_group,
-			"territory": territory
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Customer",
+				"customer_name": name,
+				"customer_group": customer_group,
+				"territory": territory,
+			}
+		).insert(ignore_permissions=True)
 
 
 def create_customer_group(customer_group):
 
 	if not frappe.db.exists("Customer Group", {"customer_group_name": customer_group}):
-		frappe.get_doc({
-			"doctype": "Customer Group",
-			"customer_group_name": customer_group
-		}).insert(ignore_permissions=True)
+		frappe.get_doc({"doctype": "Customer Group", "customer_group_name": customer_group}).insert(
+			ignore_permissions=True
+		)
 
 
 def create_territory(territory):
 
 	if not frappe.db.exists("Territory", {"territory_name": territory}):
-		frappe.get_doc({
-			"doctype": "Territory",
-			"territory_name": territory,
-		}).insert(ignore_permissions=True)
+		frappe.get_doc(
+			{
+				"doctype": "Territory",
+				"territory_name": territory,
+			}
+		).insert(ignore_permissions=True)
 
 
 def create_communication(reference_name, sender, sent_or_received, creation):
-	communication = frappe.get_doc({
-		"doctype": "Communication",
-		"communication_type": "Communication",
-		"communication_medium": "Email",
-		"sent_or_received": sent_or_received,
-		"email_status": "Open",
-		"subject": "Test Issue",
-		"sender": sender,
-		"content": "Test",
-		"status": "Linked",
-		"reference_doctype": "Issue",
-		"creation": creation,
-		"reference_name": reference_name
-	})
+	communication = frappe.get_doc(
+		{
+			"doctype": "Communication",
+			"communication_type": "Communication",
+			"communication_medium": "Email",
+			"sent_or_received": sent_or_received,
+			"email_status": "Open",
+			"subject": "Test Issue",
+			"sender": sender,
+			"content": "Test",
+			"status": "Linked",
+			"reference_doctype": "Issue",
+			"creation": creation,
+			"reference_name": reference_name,
+		}
+	)
 	communication.save()
diff --git a/erpnext/support/doctype/issue_priority/test_issue_priority.py b/erpnext/support/doctype/issue_priority/test_issue_priority.py
index d2b1415..c30540b 100644
--- a/erpnext/support/doctype/issue_priority/test_issue_priority.py
+++ b/erpnext/support/doctype/issue_priority/test_issue_priority.py
@@ -7,7 +7,6 @@
 
 
 class TestIssuePriority(unittest.TestCase):
-
 	def test_priorities(self):
 		make_priorities()
 		priorities = frappe.get_list("Issue Priority")
@@ -15,14 +14,13 @@
 		for priority in priorities:
 			self.assertIn(priority.name, ["Low", "Medium", "High"])
 
+
 def make_priorities():
 	insert_priority("Low")
 	insert_priority("Medium")
 	insert_priority("High")
 
+
 def insert_priority(name):
 	if not frappe.db.exists("Issue Priority", name):
-		frappe.get_doc({
-			"doctype": "Issue Priority",
-			"name": name
-		}).insert(ignore_permissions=True)
+		frappe.get_doc({"doctype": "Issue Priority", "name": name}).insert(ignore_permissions=True)
diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
index 526b6aa..e49f212 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
@@ -42,16 +42,24 @@
 		for priority in self.priorities:
 			# Check if response and resolution time is set for every priority
 			if not priority.response_time:
-				frappe.throw(_("Set Response Time for Priority {0} in row {1}.").format(priority.priority, priority.idx))
+				frappe.throw(
+					_("Set Response Time for Priority {0} in row {1}.").format(priority.priority, priority.idx)
+				)
 
 			if self.apply_sla_for_resolution:
 				if not priority.resolution_time:
-					frappe.throw(_("Set Response Time for Priority {0} in row {1}.").format(priority.priority, priority.idx))
+					frappe.throw(
+						_("Set Response Time for Priority {0} in row {1}.").format(priority.priority, priority.idx)
+					)
 
 				response = priority.response_time
 				resolution = priority.resolution_time
 				if response > resolution:
-					frappe.throw(_("Response Time for {0} priority in row {1} can't be greater than Resolution Time.").format(priority.priority, priority.idx))
+					frappe.throw(
+						_("Response Time for {0} priority in row {1} can't be greater than Resolution Time.").format(
+							priority.priority, priority.idx
+						)
+					)
 
 			priorities.append(priority.priority)
 
@@ -74,9 +82,14 @@
 			support_days.append(support_and_resolution.workday)
 			support_and_resolution.idx = week.index(support_and_resolution.workday) + 1
 
-			if to_timedelta(support_and_resolution.start_time) >= to_timedelta(support_and_resolution.end_time):
-				frappe.throw(_("Start Time can't be greater than or equal to End Time for {0}.").format(
-					support_and_resolution.workday))
+			if to_timedelta(support_and_resolution.start_time) >= to_timedelta(
+				support_and_resolution.end_time
+			):
+				frappe.throw(
+					_("Start Time can't be greater than or equal to End Time for {0}.").format(
+						support_and_resolution.workday
+					)
+				)
 
 		# Check for repeated workday
 		if not len(set(support_days)) == len(support_days):
@@ -84,51 +97,76 @@
 			frappe.throw(_("Workday {0} has been repeated.").format(repeated_days))
 
 	def validate_doc(self):
-		if self.enabled and self.document_type == "Issue" \
-			and not frappe.db.get_single_value("Support Settings", "track_service_level_agreement"):
-			frappe.throw(_("{0} is not enabled in {1}").format(frappe.bold("Track Service Level Agreement"),
-				get_link_to_form("Support Settings", "Support Settings")))
+		if (
+			self.enabled
+			and self.document_type == "Issue"
+			and not frappe.db.get_single_value("Support Settings", "track_service_level_agreement")
+		):
+			frappe.throw(
+				_("{0} is not enabled in {1}").format(
+					frappe.bold("Track Service Level Agreement"),
+					get_link_to_form("Support Settings", "Support Settings"),
+				)
+			)
 
-		if self.default_service_level_agreement and frappe.db.exists("Service Level Agreement", {
-			"document_type": self.document_type,
-			"default_service_level_agreement": "1",
-			"name": ["!=", self.name]
-		}):
-			frappe.throw(_("Default Service Level Agreement for {0} already exists.").format(self.document_type))
+		if self.default_service_level_agreement and frappe.db.exists(
+			"Service Level Agreement",
+			{
+				"document_type": self.document_type,
+				"default_service_level_agreement": "1",
+				"name": ["!=", self.name],
+			},
+		):
+			frappe.throw(
+				_("Default Service Level Agreement for {0} already exists.").format(self.document_type)
+			)
 
 		if self.start_date and self.end_date:
 			self.validate_from_to_dates(self.start_date, self.end_date)
 
-		if self.entity_type and self.entity and frappe.db.exists("Service Level Agreement", {
-			"entity_type": self.entity_type,
-			"entity": self.entity,
-			"name": ["!=", self.name]
-		}):
-			frappe.throw(_("Service Level Agreement for {0} {1} already exists.").format(
-				frappe.bold(self.entity_type), frappe.bold(self.entity)))
+		if (
+			self.entity_type
+			and self.entity
+			and frappe.db.exists(
+				"Service Level Agreement",
+				{"entity_type": self.entity_type, "entity": self.entity, "name": ["!=", self.name]},
+			)
+		):
+			frappe.throw(
+				_("Service Level Agreement for {0} {1} already exists.").format(
+					frappe.bold(self.entity_type), frappe.bold(self.entity)
+				)
+			)
 
 	def validate_selected_doctype(self):
 		invalid_doctypes = list(frappe.model.core_doctypes_list)
-		invalid_doctypes.extend(['Cost Center', 'Company'])
-		valid_document_types = frappe.get_all('DocType', {
-			'issingle': 0,
-			'istable': 0,
-			'is_submittable': 0,
-			'name': ['not in', invalid_doctypes],
-			'module': ['not in', ["Email", "Core", "Custom", "Event Streaming", "Social", "Data Migration", "Geo", "Desk"]]
-		}, pluck="name")
+		invalid_doctypes.extend(["Cost Center", "Company"])
+		valid_document_types = frappe.get_all(
+			"DocType",
+			{
+				"issingle": 0,
+				"istable": 0,
+				"is_submittable": 0,
+				"name": ["not in", invalid_doctypes],
+				"module": [
+					"not in",
+					["Email", "Core", "Custom", "Event Streaming", "Social", "Data Migration", "Geo", "Desk"],
+				],
+			},
+			pluck="name",
+		)
 
 		if self.document_type not in valid_document_types:
-			frappe.throw(
-				msg=_("Please select valid document type."),
-				title=_("Invalid Document Type")
-			)
+			frappe.throw(msg=_("Please select valid document type."), title=_("Invalid Document Type"))
 
 	def validate_status_field(self):
 		meta = frappe.get_meta(self.document_type)
 		if not meta.get_field("status"):
-			frappe.throw(_("The Document Type {0} must have a Status field to configure Service Level Agreement").format(
-				frappe.bold(self.document_type)))
+			frappe.throw(
+				_(
+					"The Document Type {0} must have a Status field to configure Service Level Agreement"
+				).format(frappe.bold(self.document_type))
+			)
 
 	def validate_condition(self):
 		temp_doc = frappe.new_doc(self.document_type)
@@ -141,11 +179,13 @@
 	def get_service_level_agreement_priority(self, priority):
 		priority = frappe.get_doc("Service Level Priority", {"priority": priority, "parent": self.name})
 
-		return frappe._dict({
-			"priority": priority.priority,
-			"response_time": priority.response_time,
-			"resolution_time": priority.resolution_time
-		})
+		return frappe._dict(
+			{
+				"priority": priority.priority,
+				"response_time": priority.response_time,
+				"resolution_time": priority.resolution_time,
+			}
+		)
 
 	def before_insert(self):
 		# no need to set up SLA fields for Issue dt as they are standard fields in Issue
@@ -176,46 +216,50 @@
 			if not meta.has_field(field.get("fieldname")):
 				last_index += 1
 
-				frappe.get_doc({
-					"doctype": "DocField",
-					"idx": last_index,
-					"parenttype": "DocType",
-					"parentfield": "fields",
-					"parent": self.document_type,
-					"label": field.get("label"),
-					"fieldname": field.get("fieldname"),
-					"fieldtype": field.get("fieldtype"),
-					"collapsible": field.get("collapsible"),
-					"options": field.get("options"),
-					"read_only": field.get("read_only"),
-					"hidden": field.get("hidden"),
-					"description": field.get("description"),
-					"default": field.get("default"),
-				}).insert(ignore_permissions=True)
+				frappe.get_doc(
+					{
+						"doctype": "DocField",
+						"idx": last_index,
+						"parenttype": "DocType",
+						"parentfield": "fields",
+						"parent": self.document_type,
+						"label": field.get("label"),
+						"fieldname": field.get("fieldname"),
+						"fieldtype": field.get("fieldtype"),
+						"collapsible": field.get("collapsible"),
+						"options": field.get("options"),
+						"read_only": field.get("read_only"),
+						"hidden": field.get("hidden"),
+						"description": field.get("description"),
+						"default": field.get("default"),
+					}
+				).insert(ignore_permissions=True)
 			else:
 				existing_field = meta.get_field(field.get("fieldname"))
 				self.reset_field_properties(existing_field, "DocField", field)
 
 		# to update meta and modified timestamp
-		frappe.get_doc('DocType', self.document_type).save(ignore_permissions=True)
+		frappe.get_doc("DocType", self.document_type).save(ignore_permissions=True)
 
 	def create_custom_fields(self, meta, service_level_agreement_fields):
 		for field in service_level_agreement_fields:
 			if not meta.has_field(field.get("fieldname")):
-				frappe.get_doc({
-					"doctype": "Custom Field",
-					"dt": self.document_type,
-					"label": field.get("label"),
-					"fieldname": field.get("fieldname"),
-					"fieldtype": field.get("fieldtype"),
-					"insert_after": "append",
-					"collapsible": field.get("collapsible"),
-					"options": field.get("options"),
-					"read_only": field.get("read_only"),
-					"hidden": field.get("hidden"),
-					"description": field.get("description"),
-					"default": field.get("default"),
-				}).insert(ignore_permissions=True)
+				frappe.get_doc(
+					{
+						"doctype": "Custom Field",
+						"dt": self.document_type,
+						"label": field.get("label"),
+						"fieldname": field.get("fieldname"),
+						"fieldtype": field.get("fieldtype"),
+						"insert_after": "append",
+						"collapsible": field.get("collapsible"),
+						"options": field.get("options"),
+						"read_only": field.get("read_only"),
+						"hidden": field.get("hidden"),
+						"description": field.get("description"),
+						"default": field.get("default"),
+					}
+				).insert(ignore_permissions=True)
 			else:
 				existing_field = meta.get_field(field.get("fieldname"))
 				self.reset_field_properties(existing_field, "Custom Field", field)
@@ -236,57 +280,73 @@
 
 
 def check_agreement_status():
-	service_level_agreements = frappe.get_all("Service Level Agreement", filters=[
-		{"enabled": 1},
-		{"default_service_level_agreement": 0}
-	], fields=["name"])
+	service_level_agreements = frappe.get_all(
+		"Service Level Agreement",
+		filters=[{"enabled": 1}, {"default_service_level_agreement": 0}],
+		fields=["name"],
+	)
 
 	for service_level_agreement in service_level_agreements:
 		doc = frappe.get_doc("Service Level Agreement", service_level_agreement.name)
 		if doc.end_date and getdate(doc.end_date) < getdate(frappe.utils.getdate()):
 			frappe.db.set_value("Service Level Agreement", service_level_agreement.name, "enabled", 0)
 
+
 def get_active_service_level_agreement_for(doc):
 	if not frappe.db.get_single_value("Support Settings", "track_service_level_agreement"):
 		return
 
 	filters = [
-		["Service Level Agreement", "document_type", "=", doc.get('doctype')],
-		["Service Level Agreement", "enabled", "=", 1]
+		["Service Level Agreement", "document_type", "=", doc.get("doctype")],
+		["Service Level Agreement", "enabled", "=", 1],
 	]
 
-	if doc.get('priority'):
-		filters.append(["Service Level Priority", "priority", "=", doc.get('priority')])
+	if doc.get("priority"):
+		filters.append(["Service Level Priority", "priority", "=", doc.get("priority")])
 
 	or_filters = []
-	if doc.get('service_level_agreement'):
+	if doc.get("service_level_agreement"):
 		or_filters = [
-			["Service Level Agreement", "name", "=", doc.get('service_level_agreement')],
+			["Service Level Agreement", "name", "=", doc.get("service_level_agreement")],
 		]
 
-	customer = doc.get('customer')
+	customer = doc.get("customer")
 	if customer:
-		or_filters.extend([
-			["Service Level Agreement", "entity", "in", [customer] + get_customer_group(customer) + get_customer_territory(customer)],
-			["Service Level Agreement", "entity_type", "is", "not set"]
-		])
-	else:
-		or_filters.append(
-			["Service Level Agreement", "entity_type", "is", "not set"]
+		or_filters.extend(
+			[
+				[
+					"Service Level Agreement",
+					"entity",
+					"in",
+					[customer] + get_customer_group(customer) + get_customer_territory(customer),
+				],
+				["Service Level Agreement", "entity_type", "is", "not set"],
+			]
 		)
+	else:
+		or_filters.append(["Service Level Agreement", "entity_type", "is", "not set"])
 
-	default_sla_filter = filters + [["Service Level Agreement", "default_service_level_agreement", "=", 1]]
-	default_sla = frappe.get_all("Service Level Agreement", filters=default_sla_filter,
-		fields=["name", "default_priority", "apply_sla_for_resolution", "condition"])
+	default_sla_filter = filters + [
+		["Service Level Agreement", "default_service_level_agreement", "=", 1]
+	]
+	default_sla = frappe.get_all(
+		"Service Level Agreement",
+		filters=default_sla_filter,
+		fields=["name", "default_priority", "apply_sla_for_resolution", "condition"],
+	)
 
 	filters += [["Service Level Agreement", "default_service_level_agreement", "=", 0]]
-	agreements = frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters,
-		fields=["name", "default_priority", "apply_sla_for_resolution", "condition"])
+	agreements = frappe.get_all(
+		"Service Level Agreement",
+		filters=filters,
+		or_filters=or_filters,
+		fields=["name", "default_priority", "apply_sla_for_resolution", "condition"],
+	)
 
 	# check if the current document on which SLA is to be applied fulfills all the conditions
 	filtered_agreements = []
 	for agreement in agreements:
-		condition = agreement.get('condition')
+		condition = agreement.get("condition")
 		if not condition or (condition and frappe.safe_eval(condition, None, get_context(doc))):
 			filtered_agreements.append(agreement)
 
@@ -295,8 +355,14 @@
 
 	return filtered_agreements[0] if filtered_agreements else None
 
+
 def get_context(doc):
-	return {"doc": doc.as_dict(), "nowdate": nowdate, "frappe": frappe._dict(utils=get_safe_globals().get("frappe").get("utils"))}
+	return {
+		"doc": doc.as_dict(),
+		"nowdate": nowdate,
+		"frappe": frappe._dict(utils=get_safe_globals().get("frappe").get("utils")),
+	}
+
 
 def get_customer_group(customer):
 	customer_groups = []
@@ -325,22 +391,33 @@
 
 	filters = [
 		["Service Level Agreement", "document_type", "=", doctype],
-		["Service Level Agreement", "enabled", "=", 1]
+		["Service Level Agreement", "enabled", "=", 1],
 	]
 
-	or_filters = [
-		["Service Level Agreement", "default_service_level_agreement", "=", 1]
-	]
+	or_filters = [["Service Level Agreement", "default_service_level_agreement", "=", 1]]
 
 	if customer:
 		# Include SLA with No Entity and Entity Type
 		or_filters.append(
-			["Service Level Agreement", "entity", "in", [""] + [customer] + get_customer_group(customer) + get_customer_territory(customer)]
+			[
+				"Service Level Agreement",
+				"entity",
+				"in",
+				[""] + [customer] + get_customer_group(customer) + get_customer_territory(customer),
+			]
 		)
 
 	return {
-		"priority": [priority.priority for priority in frappe.get_all("Service Level Priority", filters={"parent": name}, fields=["priority"])],
-		"service_level_agreements": [d.name for d in frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters)]
+		"priority": [
+			priority.priority
+			for priority in frappe.get_all(
+				"Service Level Priority", filters={"parent": name}, fields=["priority"]
+			)
+		],
+		"service_level_agreements": [
+			d.name
+			for d in frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters)
+		],
 	}
 
 
@@ -366,7 +443,9 @@
 
 
 def set_documents_with_active_service_level_agreement():
-	active = [sla.document_type for sla in frappe.get_all("Service Level Agreement", fields=["document_type"])]
+	active = [
+		sla.document_type for sla in frappe.get_all("Service Level Agreement", fields=["document_type"])
+	]
 	frappe.cache().hset("service_level_agreement", "active", active)
 	return active
 
@@ -414,7 +493,7 @@
 
 def handle_status_change(doc, apply_sla_for_resolution):
 	now_time = frappe.flags.current_time or now_datetime(doc.get("owner"))
-	prev_status = frappe.db.get_value(doc.doctype, doc.name, 'status')
+	prev_status = frappe.db.get_value(doc.doctype, doc.name, "status")
 
 	hold_statuses = get_hold_statuses(doc.service_level_agreement)
 	fulfillment_statuses = get_fulfillment_statuses(doc.service_level_agreement)
@@ -429,9 +508,9 @@
 		return status not in hold_statuses and status not in fulfillment_statuses
 
 	def set_first_response():
-		if doc.meta.has_field("first_responded_on") and not doc.get('first_responded_on'):
+		if doc.meta.has_field("first_responded_on") and not doc.get("first_responded_on"):
 			doc.first_responded_on = now_time
-			if get_datetime(doc.get('first_responded_on')) > get_datetime(doc.get('response_by')):
+			if get_datetime(doc.get("first_responded_on")) > get_datetime(doc.get("response_by")):
 				record_assigned_users_on_failure(doc)
 
 	def calculate_hold_hours():
@@ -444,7 +523,7 @@
 			doc.total_hold_time = (doc.total_hold_time or 0) + current_hold_hours
 		doc.on_hold_since = None
 
-	if ((is_open_status(prev_status) and not is_open_status(doc.status)) or doc.flags.on_first_reply):
+	if (is_open_status(prev_status) and not is_open_status(doc.status)) or doc.flags.on_first_reply:
 		set_first_response()
 
 	# Open to Replied
@@ -492,22 +571,28 @@
 
 
 def get_fulfillment_statuses(service_level_agreement):
-	return [entry.status for entry in frappe.db.get_all("SLA Fulfilled On Status", filters={
-		"parent": service_level_agreement
-	}, fields=["status"])]
+	return [
+		entry.status
+		for entry in frappe.db.get_all(
+			"SLA Fulfilled On Status", filters={"parent": service_level_agreement}, fields=["status"]
+		)
+	]
 
 
 def get_hold_statuses(service_level_agreement):
-	return [entry.status for entry in frappe.db.get_all("Pause SLA On Status", filters={
-		"parent": service_level_agreement
-	}, fields=["status"])]
+	return [
+		entry.status
+		for entry in frappe.db.get_all(
+			"Pause SLA On Status", filters={"parent": service_level_agreement}, fields=["status"]
+		)
+	]
 
 
 def update_response_and_resolution_metrics(doc, apply_sla_for_resolution):
 	priority = get_response_and_resolution_duration(doc)
 	start_date_time = get_datetime(doc.get("service_level_agreement_creation") or doc.creation)
 	set_response_by(doc, start_date_time, priority)
-	if apply_sla_for_resolution and not doc.get('on_hold_since'): # resolution_by is reset if on hold
+	if apply_sla_for_resolution and not doc.get("on_hold_since"):  # resolution_by is reset if on hold
 		set_resolution_by(doc, start_date_time, priority)
 
 
@@ -526,9 +611,13 @@
 		current_weekday = weekdays[current_date_time.weekday()]
 
 		if not is_holiday(current_date_time, holidays) and current_weekday in support_days:
-			if getdate(current_date_time) == getdate(start_date_time) \
-				and get_time_in_timedelta(current_date_time.time()) > support_days[current_weekday].start_time:
-				start_time = current_date_time - datetime(current_date_time.year, current_date_time.month, current_date_time.day)
+			if (
+				getdate(current_date_time) == getdate(start_date_time)
+				and get_time_in_timedelta(current_date_time.time()) > support_days[current_weekday].start_time
+			):
+				start_time = current_date_time - datetime(
+					current_date_time.year, current_date_time.month, current_date_time.day
+				)
 			else:
 				start_time = support_days[current_weekday].start_time
 
@@ -572,10 +661,12 @@
 def get_support_days(service_level):
 	support_days = {}
 	for service in service_level.get("support_and_resolution"):
-		support_days[service.workday] = frappe._dict({
-			"start_time": service.start_time,
-			"end_time": service.end_time,
-		})
+		support_days[service.workday] = frappe._dict(
+			{
+				"start_time": service.start_time,
+				"end_time": service.end_time,
+			}
+		)
 	return support_days
 
 
@@ -588,15 +679,20 @@
 	if not doc.meta.has_field("user_resolution_time"):
 		return
 
-	communications = frappe.get_all("Communication", filters={
-			"reference_doctype": doc.doctype,
-			"reference_name": doc.name
-		}, fields=["sent_or_received", "name", "creation"], order_by="creation")
+	communications = frappe.get_all(
+		"Communication",
+		filters={"reference_doctype": doc.doctype, "reference_name": doc.name},
+		fields=["sent_or_received", "name", "creation"],
+		order_by="creation",
+	)
 
 	pending_time = []
 	for i in range(len(communications)):
-		if communications[i].sent_or_received == "Received" and communications[i-1].sent_or_received == "Sent":
-			wait_time = time_diff_in_seconds(communications[i].creation, communications[i-1].creation)
+		if (
+			communications[i].sent_or_received == "Received"
+			and communications[i - 1].sent_or_received == "Sent"
+		):
+			wait_time = time_diff_in_seconds(communications[i].creation, communications[i - 1].creation)
 			if wait_time > 0:
 				pending_time.append(wait_time)
 
@@ -606,25 +702,35 @@
 
 
 def change_service_level_agreement_and_priority(self):
-	if self.service_level_agreement and frappe.db.exists("Issue", self.name) and \
-		frappe.db.get_single_value("Support Settings", "track_service_level_agreement"):
+	if (
+		self.service_level_agreement
+		and frappe.db.exists("Issue", self.name)
+		and frappe.db.get_single_value("Support Settings", "track_service_level_agreement")
+	):
 
 		if not self.priority == frappe.db.get_value("Issue", self.name, "priority"):
-			self.set_response_and_resolution_time(priority=self.priority, service_level_agreement=self.service_level_agreement)
+			self.set_response_and_resolution_time(
+				priority=self.priority, service_level_agreement=self.service_level_agreement
+			)
 			frappe.msgprint(_("Priority has been changed to {0}.").format(self.priority))
 
-		if not self.service_level_agreement == frappe.db.get_value("Issue", self.name, "service_level_agreement"):
-			self.set_response_and_resolution_time(priority=self.priority, service_level_agreement=self.service_level_agreement)
-			frappe.msgprint(_("Service Level Agreement has been changed to {0}.").format(self.service_level_agreement))
+		if not self.service_level_agreement == frappe.db.get_value(
+			"Issue", self.name, "service_level_agreement"
+		):
+			self.set_response_and_resolution_time(
+				priority=self.priority, service_level_agreement=self.service_level_agreement
+			)
+			frappe.msgprint(
+				_("Service Level Agreement has been changed to {0}.").format(self.service_level_agreement)
+			)
 
 
 def get_response_and_resolution_duration(doc):
 	sla = frappe.get_doc("Service Level Agreement", doc.service_level_agreement)
 	priority = sla.get_service_level_agreement_priority(doc.priority)
-	priority.update({
-		"support_and_resolution": sla.support_and_resolution,
-		"holiday_list": sla.holiday_list
-	})
+	priority.update(
+		{"support_and_resolution": sla.support_and_resolution, "holiday_list": sla.holiday_list}
+	)
 	return priority
 
 
@@ -632,14 +738,16 @@
 	if not frappe.db.get_single_value("Support Settings", "allow_resetting_service_level_agreement"):
 		frappe.throw(_("Allow Resetting Service Level Agreement from Support Settings."))
 
-	frappe.get_doc({
-		"doctype": "Comment",
-		"comment_type": "Info",
-		"reference_doctype": doc.doctype,
-		"reference_name": doc.name,
-		"comment_email": user,
-		"content": " resetted Service Level Agreement - {0}".format(_(reason)),
-	}).insert(ignore_permissions=True)
+	frappe.get_doc(
+		{
+			"doctype": "Comment",
+			"comment_type": "Info",
+			"reference_doctype": doc.doctype,
+			"reference_name": doc.name,
+			"comment_email": user,
+			"content": " resetted Service Level Agreement - {0}".format(_(reason)),
+		}
+	).insert(ignore_permissions=True)
 
 	doc.service_level_agreement_creation = now_datetime(doc.get("owner"))
 	doc.save()
@@ -665,28 +773,30 @@
 	if not parent:
 		return
 
-	if not parent.meta.has_field('service_level_agreement'):
+	if not parent.meta.has_field("service_level_agreement"):
 		return
 
 	if (
-		doc.sent_or_received == "Received" # a reply is received
-		and parent.get('status') == 'Open' # issue status is set as open from communication.py
+		doc.sent_or_received == "Received"  # a reply is received
+		and parent.get("status") == "Open"  # issue status is set as open from communication.py
 		and parent.get_doc_before_save()
-		and parent.get('status') != parent._doc_before_save.get('status') # status changed
+		and parent.get("status") != parent._doc_before_save.get("status")  # status changed
 	):
 		# undo the status change in db
 		# since prev status is fetched from db
 		frappe.db.set_value(
-			parent.doctype, parent.name,
-			'status', parent._doc_before_save.get('status'),
-			update_modified=False
+			parent.doctype,
+			parent.name,
+			"status",
+			parent._doc_before_save.get("status"),
+			update_modified=False,
 		)
 
 	elif (
-		doc.sent_or_received == "Sent" # a reply is sent
-		and parent.get('first_responded_on') # first_responded_on is set from communication.py
+		doc.sent_or_received == "Sent"  # a reply is sent
+		and parent.get("first_responded_on")  # first_responded_on is set from communication.py
 		and parent.get_doc_before_save()
-		and not parent._doc_before_save.get('first_responded_on') # first_responded_on was not set
+		and not parent._doc_before_save.get("first_responded_on")  # first_responded_on was not set
 	):
 		# reset first_responded_on since it will be handled/set later on
 		parent.first_responded_on = None
@@ -695,7 +805,9 @@
 	else:
 		return
 
-	for_resolution = frappe.db.get_value('Service Level Agreement', parent.service_level_agreement, 'apply_sla_for_resolution')
+	for_resolution = frappe.db.get_value(
+		"Service Level Agreement", parent.service_level_agreement, "apply_sla_for_resolution"
+	)
 
 	handle_status_change(parent, for_resolution)
 	update_response_and_resolution_metrics(parent, for_resolution)
@@ -705,36 +817,42 @@
 
 
 def reset_expected_response_and_resolution(doc):
-	if doc.meta.has_field("first_responded_on") and not doc.get('first_responded_on'):
+	if doc.meta.has_field("first_responded_on") and not doc.get("first_responded_on"):
 		doc.response_by = None
-	if doc.meta.has_field("resolution_by") and not doc.get('resolution_date'):
+	if doc.meta.has_field("resolution_by") and not doc.get("resolution_date"):
 		doc.resolution_by = None
 
 
 def set_response_by(doc, start_date_time, priority):
 	if doc.meta.has_field("response_by"):
-		doc.response_by = get_expected_time_for(parameter="response", service_level=priority, start_date_time=start_date_time)
-		if doc.meta.has_field("total_hold_time") and doc.get('total_hold_time') and not doc.get('first_responded_on'):
-			doc.response_by = add_to_date(doc.response_by, seconds=round(doc.get('total_hold_time')))
+		doc.response_by = get_expected_time_for(
+			parameter="response", service_level=priority, start_date_time=start_date_time
+		)
+		if (
+			doc.meta.has_field("total_hold_time")
+			and doc.get("total_hold_time")
+			and not doc.get("first_responded_on")
+		):
+			doc.response_by = add_to_date(doc.response_by, seconds=round(doc.get("total_hold_time")))
 
 
 def set_resolution_by(doc, start_date_time, priority):
 	if doc.meta.has_field("resolution_by"):
-		doc.resolution_by = get_expected_time_for(parameter="resolution", service_level=priority, start_date_time=start_date_time)
-		if doc.meta.has_field("total_hold_time") and doc.get('total_hold_time'):
-			doc.resolution_by = add_to_date(doc.resolution_by, seconds=round(doc.get('total_hold_time')))
+		doc.resolution_by = get_expected_time_for(
+			parameter="resolution", service_level=priority, start_date_time=start_date_time
+		)
+		if doc.meta.has_field("total_hold_time") and doc.get("total_hold_time"):
+			doc.resolution_by = add_to_date(doc.resolution_by, seconds=round(doc.get("total_hold_time")))
 
 
 def record_assigned_users_on_failure(doc):
 	assigned_users = doc.get_assigned_users()
 	if assigned_users:
 		from frappe.utils import get_fullname
-		assigned_users = ', '.join((get_fullname(user) for user in assigned_users))
-		message = _('First Response SLA Failed by {}').format(assigned_users)
-		doc.add_comment(
-			comment_type='Assigned',
-			text=message
-		)
+
+		assigned_users = ", ".join((get_fullname(user) for user in assigned_users))
+		message = _("First Response SLA Failed by {}").format(assigned_users)
+		doc.add_comment(comment_type="Assigned", text=message)
 
 
 def get_service_level_agreement_fields():
@@ -743,71 +861,57 @@
 			"collapsible": 1,
 			"fieldname": "service_level_section",
 			"fieldtype": "Section Break",
-			"label": "Service Level"
+			"label": "Service Level",
 		},
 		{
 			"fieldname": "service_level_agreement",
 			"fieldtype": "Link",
 			"label": "Service Level Agreement",
-			"options": "Service Level Agreement"
+			"options": "Service Level Agreement",
 		},
-		{
-			"fieldname": "priority",
-			"fieldtype": "Link",
-			"label": "Priority",
-			"options": "Issue Priority"
-		},
-		{
-			"fieldname": "response_by",
-			"fieldtype": "Datetime",
-			"label": "Response By",
-			"read_only": 1
-		},
+		{"fieldname": "priority", "fieldtype": "Link", "label": "Priority", "options": "Issue Priority"},
+		{"fieldname": "response_by", "fieldtype": "Datetime", "label": "Response By", "read_only": 1},
 		{
 			"fieldname": "first_responded_on",
 			"fieldtype": "Datetime",
 			"label": "First Responded On",
 			"no_copy": 1,
-			"read_only": 1
+			"read_only": 1,
 		},
 		{
 			"fieldname": "on_hold_since",
 			"fieldtype": "Datetime",
 			"hidden": 1,
 			"label": "On Hold Since",
-			"read_only": 1
+			"read_only": 1,
 		},
 		{
 			"fieldname": "total_hold_time",
 			"fieldtype": "Duration",
 			"label": "Total Hold Time",
-			"read_only": 1
+			"read_only": 1,
 		},
-		{
-			"fieldname": "cb",
-			"fieldtype": "Column Break",
-			"read_only": 1
-		},
+		{"fieldname": "cb", "fieldtype": "Column Break", "read_only": 1},
 		{
 			"default": "First Response Due",
 			"fieldname": "agreement_status",
 			"fieldtype": "Select",
 			"label": "Service Level Agreement Status",
 			"options": "First Response Due\nResolution Due\nFulfilled\nFailed",
-			"read_only": 1
+			"read_only": 1,
 		},
 		{
 			"fieldname": "resolution_by",
 			"fieldtype": "Datetime",
 			"label": "Resolution By",
-			"read_only": 1
+			"read_only": 1,
 		},
 		{
 			"fieldname": "service_level_agreement_creation",
 			"fieldtype": "Datetime",
 			"hidden": 1,
 			"label": "Service Level Agreement Creation",
-			"read_only": 1
+			"read_only": 1,
 		},
 		{
 			"depends_on": "eval:!doc.__islocal",
@@ -815,8 +919,8 @@
 			"fieldtype": "Datetime",
 			"label": "Resolution Date",
 			"no_copy": 1,
-			"read_only": 1
-		}
+			"read_only": 1,
+		},
 	]
 
 
@@ -826,21 +930,21 @@
 
 
 def update_agreement_status(doc, apply_sla_for_resolution):
-	if (doc.meta.has_field("agreement_status")):
+	if doc.meta.has_field("agreement_status"):
 		# if SLA is applied for resolution check for response and resolution, else only response
 		if apply_sla_for_resolution:
-			if doc.meta.has_field("first_responded_on") and not doc.get('first_responded_on'):
+			if doc.meta.has_field("first_responded_on") and not doc.get("first_responded_on"):
 				doc.agreement_status = "First Response Due"
-			elif doc.meta.has_field("resolution_date") and not doc.get('resolution_date'):
+			elif doc.meta.has_field("resolution_date") and not doc.get("resolution_date"):
 				doc.agreement_status = "Resolution Due"
-			elif get_datetime(doc.get('resolution_date')) <= get_datetime(doc.get('resolution_by')):
+			elif get_datetime(doc.get("resolution_date")) <= get_datetime(doc.get("resolution_by")):
 				doc.agreement_status = "Fulfilled"
 			else:
 				doc.agreement_status = "Failed"
 		else:
-			if doc.meta.has_field("first_responded_on") and not doc.get('first_responded_on'):
+			if doc.meta.has_field("first_responded_on") and not doc.get("first_responded_on"):
 				doc.agreement_status = "First Response Due"
-			elif get_datetime(doc.get('first_responded_on')) <= get_datetime(doc.get('response_by')):
+			elif get_datetime(doc.get("first_responded_on")) <= get_datetime(doc.get("response_by")):
 				doc.agreement_status = "Fulfilled"
 			else:
 				doc.agreement_status = "Failed"
@@ -853,6 +957,7 @@
 def get_time_in_timedelta(time):
 	"""Converts datetime.time(10, 36, 55, 961454) to datetime.timedelta(seconds=38215)."""
 	import datetime
+
 	return datetime.timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
 
 
@@ -865,7 +970,7 @@
 	from pytz import UnknownTimeZoneError, timezone
 
 	user_tz = get_tz(user)
-	utcnow = timezone('UTC').localize(utc_timestamp)
+	utcnow = timezone("UTC").localize(utc_timestamp)
 	try:
 		return utcnow.astimezone(timezone(user_tz))
 	except UnknownTimeZoneError:
@@ -884,11 +989,7 @@
 @frappe.whitelist()
 def get_sla_doctypes():
 	doctypes = []
-	data = frappe.get_all('Service Level Agreement',
-		{'enabled': 1},
-		['document_type'],
-		distinct=1
-	)
+	data = frappe.get_all("Service Level Agreement", {"enabled": 1}, ["document_type"], distinct=1)
 
 	for entry in data:
 		doctypes.append(entry.document_type)
diff --git a/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py
index a34124f..4e00138 100644
--- a/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py
+++ b/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py
@@ -20,51 +20,122 @@
 
 	def test_service_level_agreement(self):
 		# Default Service Level Agreement
-		create_default_service_level_agreement = create_service_level_agreement(default_service_level_agreement=1,
-			holiday_list="__Test Holiday List", entity_type=None, entity=None, response_time=14400, resolution_time=21600)
+		create_default_service_level_agreement = create_service_level_agreement(
+			default_service_level_agreement=1,
+			holiday_list="__Test Holiday List",
+			entity_type=None,
+			entity=None,
+			response_time=14400,
+			resolution_time=21600,
+		)
 
-		get_default_service_level_agreement = get_service_level_agreement(default_service_level_agreement=1)
+		get_default_service_level_agreement = get_service_level_agreement(
+			default_service_level_agreement=1
+		)
 
-		self.assertEqual(create_default_service_level_agreement.name, get_default_service_level_agreement.name)
-		self.assertEqual(create_default_service_level_agreement.entity_type, get_default_service_level_agreement.entity_type)
-		self.assertEqual(create_default_service_level_agreement.entity, get_default_service_level_agreement.entity)
-		self.assertEqual(create_default_service_level_agreement.default_service_level_agreement, get_default_service_level_agreement.default_service_level_agreement)
+		self.assertEqual(
+			create_default_service_level_agreement.name, get_default_service_level_agreement.name
+		)
+		self.assertEqual(
+			create_default_service_level_agreement.entity_type,
+			get_default_service_level_agreement.entity_type,
+		)
+		self.assertEqual(
+			create_default_service_level_agreement.entity, get_default_service_level_agreement.entity
+		)
+		self.assertEqual(
+			create_default_service_level_agreement.default_service_level_agreement,
+			get_default_service_level_agreement.default_service_level_agreement,
+		)
 
 		# Service Level Agreement for Customer
 		customer = create_customer()
-		create_customer_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0,
-			holiday_list="__Test Holiday List", entity_type="Customer", entity=customer,
-			response_time=7200, resolution_time=10800)
-		get_customer_service_level_agreement = get_service_level_agreement(entity_type="Customer", entity=customer)
+		create_customer_service_level_agreement = create_service_level_agreement(
+			default_service_level_agreement=0,
+			holiday_list="__Test Holiday List",
+			entity_type="Customer",
+			entity=customer,
+			response_time=7200,
+			resolution_time=10800,
+		)
+		get_customer_service_level_agreement = get_service_level_agreement(
+			entity_type="Customer", entity=customer
+		)
 
-		self.assertEqual(create_customer_service_level_agreement.name, get_customer_service_level_agreement.name)
-		self.assertEqual(create_customer_service_level_agreement.entity_type, get_customer_service_level_agreement.entity_type)
-		self.assertEqual(create_customer_service_level_agreement.entity, get_customer_service_level_agreement.entity)
-		self.assertEqual(create_customer_service_level_agreement.default_service_level_agreement, get_customer_service_level_agreement.default_service_level_agreement)
+		self.assertEqual(
+			create_customer_service_level_agreement.name, get_customer_service_level_agreement.name
+		)
+		self.assertEqual(
+			create_customer_service_level_agreement.entity_type,
+			get_customer_service_level_agreement.entity_type,
+		)
+		self.assertEqual(
+			create_customer_service_level_agreement.entity, get_customer_service_level_agreement.entity
+		)
+		self.assertEqual(
+			create_customer_service_level_agreement.default_service_level_agreement,
+			get_customer_service_level_agreement.default_service_level_agreement,
+		)
 
 		# Service Level Agreement for Customer Group
 		customer_group = create_customer_group()
-		create_customer_group_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0,
-			holiday_list="__Test Holiday List", entity_type="Customer Group", entity=customer_group,
-			response_time=7200, resolution_time=10800)
-		get_customer_group_service_level_agreement = get_service_level_agreement(entity_type="Customer Group", entity=customer_group)
+		create_customer_group_service_level_agreement = create_service_level_agreement(
+			default_service_level_agreement=0,
+			holiday_list="__Test Holiday List",
+			entity_type="Customer Group",
+			entity=customer_group,
+			response_time=7200,
+			resolution_time=10800,
+		)
+		get_customer_group_service_level_agreement = get_service_level_agreement(
+			entity_type="Customer Group", entity=customer_group
+		)
 
-		self.assertEqual(create_customer_group_service_level_agreement.name, get_customer_group_service_level_agreement.name)
-		self.assertEqual(create_customer_group_service_level_agreement.entity_type, get_customer_group_service_level_agreement.entity_type)
-		self.assertEqual(create_customer_group_service_level_agreement.entity, get_customer_group_service_level_agreement.entity)
-		self.assertEqual(create_customer_group_service_level_agreement.default_service_level_agreement, get_customer_group_service_level_agreement.default_service_level_agreement)
+		self.assertEqual(
+			create_customer_group_service_level_agreement.name,
+			get_customer_group_service_level_agreement.name,
+		)
+		self.assertEqual(
+			create_customer_group_service_level_agreement.entity_type,
+			get_customer_group_service_level_agreement.entity_type,
+		)
+		self.assertEqual(
+			create_customer_group_service_level_agreement.entity,
+			get_customer_group_service_level_agreement.entity,
+		)
+		self.assertEqual(
+			create_customer_group_service_level_agreement.default_service_level_agreement,
+			get_customer_group_service_level_agreement.default_service_level_agreement,
+		)
 
 		# Service Level Agreement for Territory
 		territory = create_territory()
-		create_territory_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0,
+		create_territory_service_level_agreement = create_service_level_agreement(
+			default_service_level_agreement=0,
 			holiday_list="__Test Holiday List",
-			entity_type="Territory", entity=territory, response_time=7200, resolution_time=10800)
-		get_territory_service_level_agreement = get_service_level_agreement(entity_type="Territory", entity=territory)
+			entity_type="Territory",
+			entity=territory,
+			response_time=7200,
+			resolution_time=10800,
+		)
+		get_territory_service_level_agreement = get_service_level_agreement(
+			entity_type="Territory", entity=territory
+		)
 
-		self.assertEqual(create_territory_service_level_agreement.name, get_territory_service_level_agreement.name)
-		self.assertEqual(create_territory_service_level_agreement.entity_type, get_territory_service_level_agreement.entity_type)
-		self.assertEqual(create_territory_service_level_agreement.entity, get_territory_service_level_agreement.entity)
-		self.assertEqual(create_territory_service_level_agreement.default_service_level_agreement, get_territory_service_level_agreement.default_service_level_agreement)
+		self.assertEqual(
+			create_territory_service_level_agreement.name, get_territory_service_level_agreement.name
+		)
+		self.assertEqual(
+			create_territory_service_level_agreement.entity_type,
+			get_territory_service_level_agreement.entity_type,
+		)
+		self.assertEqual(
+			create_territory_service_level_agreement.entity, get_territory_service_level_agreement.entity
+		)
+		self.assertEqual(
+			create_territory_service_level_agreement.default_service_level_agreement,
+			get_territory_service_level_agreement.default_service_level_agreement,
+		)
 
 	def test_custom_field_creation_for_sla_on_standard_dt(self):
 		# Default Service Level Agreement
@@ -72,10 +143,12 @@
 		lead_sla = create_service_level_agreement(
 			default_service_level_agreement=1,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
-			response_time=14400, resolution_time=21600,
+			entity_type=None,
+			entity=None,
+			response_time=14400,
+			resolution_time=21600,
 			doctype=doctype,
-			sla_fulfilled_on=[{"status": "Converted"}]
+			sla_fulfilled_on=[{"status": "Converted"}],
 		)
 
 		# check default SLA for lead
@@ -86,27 +159,35 @@
 		sla_fields = get_service_level_agreement_fields()
 
 		for field in sla_fields:
-			self.assertTrue(frappe.db.exists("Custom Field", {"dt": doctype, "fieldname": field.get("fieldname")}))
+			self.assertTrue(
+				frappe.db.exists("Custom Field", {"dt": doctype, "fieldname": field.get("fieldname")})
+			)
 
 	def test_docfield_creation_for_sla_on_custom_dt(self):
 		doctype = create_custom_doctype()
 		sla = create_service_level_agreement(
 			default_service_level_agreement=1,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
-			response_time=14400, resolution_time=21600,
-			doctype=doctype.name
+			entity_type=None,
+			entity=None,
+			response_time=14400,
+			resolution_time=21600,
+			doctype=doctype.name,
 		)
 
 		# check default SLA for custom dt
-		default_sla = get_service_level_agreement(default_service_level_agreement=1, doctype=doctype.name)
+		default_sla = get_service_level_agreement(
+			default_service_level_agreement=1, doctype=doctype.name
+		)
 		self.assertEqual(sla.name, default_sla.name)
 
 		# check SLA docfields created
 		sla_fields = get_service_level_agreement_fields()
 
 		for field in sla_fields:
-			self.assertTrue(frappe.db.exists("DocField", {"fieldname": field.get("fieldname"), "parent": doctype.name}))
+			self.assertTrue(
+				frappe.db.exists("DocField", {"fieldname": field.get("fieldname"), "parent": doctype.name})
+			)
 
 	def test_sla_application(self):
 		# Default Service Level Agreement
@@ -114,10 +195,12 @@
 		lead_sla = create_service_level_agreement(
 			default_service_level_agreement=1,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
-			response_time=14400, resolution_time=21600,
+			entity_type=None,
+			entity=None,
+			response_time=14400,
+			resolution_time=21600,
 			doctype=doctype,
-			sla_fulfilled_on=[{"status": "Converted"}]
+			sla_fulfilled_on=[{"status": "Converted"}],
 		)
 
 		# make lead with default SLA
@@ -130,21 +213,23 @@
 
 		frappe.flags.current_time = datetime.datetime(2019, 3, 4, 15, 0)
 		lead.reload()
-		lead.status = 'Converted'
+		lead.status = "Converted"
 		lead.save()
 
-		self.assertEqual(lead.agreement_status, 'Fulfilled')
+		self.assertEqual(lead.agreement_status, "Fulfilled")
 
 	def test_hold_time(self):
 		doctype = "Lead"
 		create_service_level_agreement(
 			default_service_level_agreement=1,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
-			response_time=14400, resolution_time=21600,
+			entity_type=None,
+			entity=None,
+			response_time=14400,
+			resolution_time=21600,
 			doctype=doctype,
 			sla_fulfilled_on=[{"status": "Converted"}],
-			pause_sla_on=[{"status": "Replied"}]
+			pause_sla_on=[{"status": "Replied"}],
 		)
 
 		creation = datetime.datetime(2020, 3, 4, 4, 0)
@@ -152,7 +237,7 @@
 
 		frappe.flags.current_time = datetime.datetime(2020, 3, 4, 4, 15)
 		lead.reload()
-		lead.status = 'Replied'
+		lead.status = "Replied"
 		lead.save()
 
 		lead.reload()
@@ -160,7 +245,7 @@
 
 		frappe.flags.current_time = datetime.datetime(2020, 3, 4, 5, 5)
 		lead.reload()
-		lead.status = 'Converted'
+		lead.status = "Converted"
 		lead.save()
 
 		lead.reload()
@@ -172,12 +257,13 @@
 		create_service_level_agreement(
 			default_service_level_agreement=1,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
+			entity_type=None,
+			entity=None,
 			response_time=14400,
 			doctype=doctype,
 			sla_fulfilled_on=[{"status": "Replied"}],
 			pause_sla_on=[],
-			apply_sla_for_resolution=0
+			apply_sla_for_resolution=0,
 		)
 
 		creation = datetime.datetime(2019, 3, 4, 12, 0)
@@ -187,22 +273,23 @@
 		# failed with response time only
 		frappe.flags.current_time = datetime.datetime(2019, 3, 4, 16, 5)
 		lead.reload()
-		lead.status = 'Replied'
+		lead.status = "Replied"
 		lead.save()
 
 		lead.reload()
-		self.assertEqual(lead.agreement_status, 'Failed')
+		self.assertEqual(lead.agreement_status, "Failed")
 
 	def test_fulfilled_sla_for_response_only(self):
 		doctype = "Lead"
 		lead_sla = create_service_level_agreement(
 			default_service_level_agreement=1,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
+			entity_type=None,
+			entity=None,
 			response_time=14400,
 			doctype=doctype,
 			sla_fulfilled_on=[{"status": "Replied"}],
-			apply_sla_for_resolution=0
+			apply_sla_for_resolution=0,
 		)
 
 		# fulfilled with response time only
@@ -214,11 +301,11 @@
 
 		frappe.flags.current_time = datetime.datetime(2019, 3, 4, 15, 30)
 		lead.reload()
-		lead.status = 'Replied'
+		lead.status = "Replied"
 		lead.save()
 
 		lead.reload()
-		self.assertEqual(lead.agreement_status, 'Fulfilled')
+		self.assertEqual(lead.agreement_status, "Fulfilled")
 
 	def test_service_level_agreement_filters(self):
 		doctype = "Lead"
@@ -226,29 +313,30 @@
 			default_service_level_agreement=0,
 			doctype=doctype,
 			holiday_list="__Test Holiday List",
-			entity_type=None, entity=None,
+			entity_type=None,
+			entity=None,
 			condition='doc.source == "Test Source"',
 			response_time=14400,
 			sla_fulfilled_on=[{"status": "Replied"}],
-			apply_sla_for_resolution=0
+			apply_sla_for_resolution=0,
 		)
 		creation = datetime.datetime(2019, 3, 4, 12, 0)
 		lead = make_lead(creation=creation, index=4)
-		applied_sla = frappe.db.get_value('Lead', lead.name, 'service_level_agreement')
+		applied_sla = frappe.db.get_value("Lead", lead.name, "service_level_agreement")
 		self.assertFalse(applied_sla)
 
-		source = frappe.get_doc(doctype='Lead Source', source_name='Test Source')
+		source = frappe.get_doc(doctype="Lead Source", source_name="Test Source")
 		source.insert(ignore_if_duplicate=True)
 		lead.source = "Test Source"
 		lead.save()
-		applied_sla = frappe.db.get_value('Lead', lead.name, 'service_level_agreement')
+		applied_sla = frappe.db.get_value("Lead", lead.name, "service_level_agreement")
 		self.assertEqual(applied_sla, lead_sla.name)
 
 		# check if SLA is removed if condition fails
 		lead.reload()
 		lead.source = None
 		lead.save()
-		applied_sla = frappe.db.get_value('Lead', lead.name, 'service_level_agreement')
+		applied_sla = frappe.db.get_value("Lead", lead.name, "service_level_agreement")
 		self.assertFalse(applied_sla)
 
 	def tearDown(self):
@@ -256,130 +344,150 @@
 			frappe.delete_doc("Service Level Agreement", d.name, force=1)
 
 
-def get_service_level_agreement(default_service_level_agreement=None, entity_type=None, entity=None, doctype="Issue"):
+def get_service_level_agreement(
+	default_service_level_agreement=None, entity_type=None, entity=None, doctype="Issue"
+):
 	if default_service_level_agreement:
-		filters = {"default_service_level_agreement": default_service_level_agreement, "document_type": doctype}
+		filters = {
+			"default_service_level_agreement": default_service_level_agreement,
+			"document_type": doctype,
+		}
 	else:
 		filters = {"entity_type": entity_type, "entity": entity}
 
 	service_level_agreement = frappe.get_doc("Service Level Agreement", filters)
 	return service_level_agreement
 
-def create_service_level_agreement(default_service_level_agreement, holiday_list, response_time, entity_type,
-	entity, resolution_time=0, doctype="Issue", condition="", sla_fulfilled_on=[], pause_sla_on=[], apply_sla_for_resolution=1,
-	service_level=None, start_time="10:00:00", end_time="18:00:00"):
+
+def create_service_level_agreement(
+	default_service_level_agreement,
+	holiday_list,
+	response_time,
+	entity_type,
+	entity,
+	resolution_time=0,
+	doctype="Issue",
+	condition="",
+	sla_fulfilled_on=[],
+	pause_sla_on=[],
+	apply_sla_for_resolution=1,
+	service_level=None,
+	start_time="10:00:00",
+	end_time="18:00:00",
+):
 
 	make_holiday_list()
 	make_priorities()
 
 	if not sla_fulfilled_on:
-		sla_fulfilled_on = [
-			{"status": "Resolved"},
-			{"status": "Closed"}
-		]
+		sla_fulfilled_on = [{"status": "Resolved"}, {"status": "Closed"}]
 
 	pause_sla_on = [{"status": "Replied"}] if doctype == "Issue" else pause_sla_on
 
-	service_level_agreement = frappe._dict({
-		"doctype": "Service Level Agreement",
-		"enabled": 1,
-		"document_type": doctype,
-		"service_level": service_level or "__Test {} SLA".format(entity_type if entity_type else "Default"),
-		"default_service_level_agreement": default_service_level_agreement,
-		"condition": condition,
-		"default_priority": "Medium",
-		"holiday_list": holiday_list,
-		"entity_type": entity_type,
-		"entity": entity,
-		"start_date": frappe.utils.getdate(),
-		"end_date": frappe.utils.add_to_date(frappe.utils.getdate(), days=100),
-		"apply_sla_for_resolution": apply_sla_for_resolution,
-		"priorities": [
-			{
-				"priority": "Low",
-				"response_time": response_time,
-				"resolution_time": resolution_time,
-			},
-			{
-				"priority": "Medium",
-				"response_time": response_time,
-				"default_priority": 1,
-				"resolution_time": resolution_time,
-			},
-			{
-				"priority": "High",
-				"response_time": response_time,
-				"resolution_time": resolution_time,
-			}
-		],
-		"sla_fulfilled_on": sla_fulfilled_on,
-		"pause_sla_on": pause_sla_on,
-		"support_and_resolution": [
-			{
-				"workday": "Monday",
-				"start_time": start_time,
-				"end_time": end_time,
-			},
-			{
-				"workday": "Tuesday",
-				"start_time": start_time,
-				"end_time": end_time,
-			},
-			{
-				"workday": "Wednesday",
-				"start_time": start_time,
-				"end_time": end_time,
-			},
-			{
-				"workday": "Thursday",
-				"start_time": start_time,
-				"end_time": end_time,
-			},
-			{
-				"workday": "Friday",
-				"start_time": start_time,
-				"end_time": end_time,
-			}
-		]
-	})
+	service_level_agreement = frappe._dict(
+		{
+			"doctype": "Service Level Agreement",
+			"enabled": 1,
+			"document_type": doctype,
+			"service_level": service_level
+			or "__Test {} SLA".format(entity_type if entity_type else "Default"),
+			"default_service_level_agreement": default_service_level_agreement,
+			"condition": condition,
+			"default_priority": "Medium",
+			"holiday_list": holiday_list,
+			"entity_type": entity_type,
+			"entity": entity,
+			"start_date": frappe.utils.getdate(),
+			"end_date": frappe.utils.add_to_date(frappe.utils.getdate(), days=100),
+			"apply_sla_for_resolution": apply_sla_for_resolution,
+			"priorities": [
+				{
+					"priority": "Low",
+					"response_time": response_time,
+					"resolution_time": resolution_time,
+				},
+				{
+					"priority": "Medium",
+					"response_time": response_time,
+					"default_priority": 1,
+					"resolution_time": resolution_time,
+				},
+				{
+					"priority": "High",
+					"response_time": response_time,
+					"resolution_time": resolution_time,
+				},
+			],
+			"sla_fulfilled_on": sla_fulfilled_on,
+			"pause_sla_on": pause_sla_on,
+			"support_and_resolution": [
+				{
+					"workday": "Monday",
+					"start_time": start_time,
+					"end_time": end_time,
+				},
+				{
+					"workday": "Tuesday",
+					"start_time": start_time,
+					"end_time": end_time,
+				},
+				{
+					"workday": "Wednesday",
+					"start_time": start_time,
+					"end_time": end_time,
+				},
+				{
+					"workday": "Thursday",
+					"start_time": start_time,
+					"end_time": end_time,
+				},
+				{
+					"workday": "Friday",
+					"start_time": start_time,
+					"end_time": end_time,
+				},
+			],
+		}
+	)
 
 	filters = {
 		"default_service_level_agreement": service_level_agreement.default_service_level_agreement,
-		"service_level": service_level_agreement.service_level
+		"service_level": service_level_agreement.service_level,
 	}
 
 	if not default_service_level_agreement:
-		filters.update({
-			"entity_type": entity_type,
-			"entity": entity
-		})
+		filters.update({"entity_type": entity_type, "entity": entity})
 
 	sla = frappe.db.exists("Service Level Agreement", filters)
 	if sla:
 		frappe.delete_doc("Service Level Agreement", sla, force=1)
 
-	return frappe.get_doc(service_level_agreement).insert(ignore_permissions=True, ignore_if_duplicate=True)
+	return frappe.get_doc(service_level_agreement).insert(
+		ignore_permissions=True, ignore_if_duplicate=True
+	)
 
 
 def create_customer():
-	customer = frappe.get_doc({
-		"doctype": "Customer",
-		"customer_name": "_Test Customer",
-		"customer_group": "Commercial",
-		"customer_type": "Individual",
-		"territory": "Rest Of The World"
-	})
+	customer = frappe.get_doc(
+		{
+			"doctype": "Customer",
+			"customer_name": "_Test Customer",
+			"customer_group": "Commercial",
+			"customer_type": "Individual",
+			"territory": "Rest Of The World",
+		}
+	)
 	if not frappe.db.exists("Customer", "_Test Customer"):
 		customer.insert(ignore_permissions=True)
 		return customer.name
 	else:
 		return frappe.db.exists("Customer", "_Test Customer")
 
+
 def create_customer_group():
-	customer_group = frappe.get_doc({
-		"doctype": "Customer Group",
-		"customer_group_name": "_Test SLA Customer Group"
-	})
+	customer_group = frappe.get_doc(
+		{"doctype": "Customer Group", "customer_group_name": "_Test SLA Customer Group"}
+	)
 
 	if not frappe.db.exists("Customer Group", {"customer_group_name": "_Test SLA Customer Group"}):
 		customer_group.insert()
@@ -387,11 +495,14 @@
 	else:
 		return frappe.db.exists("Customer Group", {"customer_group_name": "_Test SLA Customer Group"})
 
+
 def create_territory():
-	territory = frappe.get_doc({
-		"doctype": "Territory",
-		"territory_name": "_Test SLA Territory",
-	})
+	territory = frappe.get_doc(
+		{
+			"doctype": "Territory",
+			"territory_name": "_Test SLA Territory",
+		}
+	)
 
 	if not frappe.db.exists("Territory", {"territory_name": "_Test SLA Territory"}):
 		territory.insert()
@@ -399,102 +510,116 @@
 	else:
 		return frappe.db.exists("Territory", {"territory_name": "_Test SLA Territory"})
 
+
 def create_service_level_agreements_for_issues():
-	create_service_level_agreement(default_service_level_agreement=1, holiday_list="__Test Holiday List",
-		entity_type=None, entity=None, response_time=14400, resolution_time=21600)
+	create_service_level_agreement(
+		default_service_level_agreement=1,
+		holiday_list="__Test Holiday List",
+		entity_type=None,
+		entity=None,
+		response_time=14400,
+		resolution_time=21600,
+	)
 
 	create_customer()
-	create_service_level_agreement(default_service_level_agreement=0, holiday_list="__Test Holiday List",
-		entity_type="Customer", entity="_Test Customer", response_time=7200, resolution_time=10800)
+	create_service_level_agreement(
+		default_service_level_agreement=0,
+		holiday_list="__Test Holiday List",
+		entity_type="Customer",
+		entity="_Test Customer",
+		response_time=7200,
+		resolution_time=10800,
+	)
 
 	create_customer_group()
-	create_service_level_agreement(default_service_level_agreement=0, holiday_list="__Test Holiday List",
-		entity_type="Customer Group", entity="_Test SLA Customer Group", response_time=7200, resolution_time=10800)
+	create_service_level_agreement(
+		default_service_level_agreement=0,
+		holiday_list="__Test Holiday List",
+		entity_type="Customer Group",
+		entity="_Test SLA Customer Group",
+		response_time=7200,
+		resolution_time=10800,
+	)
 
 	create_territory()
-	create_service_level_agreement(default_service_level_agreement=0, holiday_list="__Test Holiday List",
-		entity_type="Territory", entity="_Test SLA Territory", response_time=7200, resolution_time=10800)
+	create_service_level_agreement(
+		default_service_level_agreement=0,
+		holiday_list="__Test Holiday List",
+		entity_type="Territory",
+		entity="_Test SLA Territory",
+		response_time=7200,
+		resolution_time=10800,
+	)
 
 	create_service_level_agreement(
-		default_service_level_agreement=0, holiday_list="__Test Holiday List",
-		entity_type=None, entity=None, response_time=14400, resolution_time=21600,
-		service_level="24-hour-SLA", start_time="00:00:00", end_time="23:59:59",
-		condition="doc.issue_type == 'Critical'"
+		default_service_level_agreement=0,
+		holiday_list="__Test Holiday List",
+		entity_type=None,
+		entity=None,
+		response_time=14400,
+		resolution_time=21600,
+		service_level="24-hour-SLA",
+		start_time="00:00:00",
+		end_time="23:59:59",
+		condition="doc.issue_type == 'Critical'",
 	)
 
+
 def make_holiday_list():
 	holiday_list = frappe.db.exists("Holiday List", "__Test Holiday List")
 	if not holiday_list:
-		holiday_list = frappe.get_doc({
-			"doctype": "Holiday List",
-			"holiday_list_name": "__Test Holiday List",
-			"from_date": "2019-01-01",
-			"to_date": "2019-12-31",
-			"holidays": [
-				{
-					"description": "Test Holiday 1",
-					"holiday_date": "2019-03-05"
-				},
-				{
-					"description": "Test Holiday 2",
-					"holiday_date": "2019-03-07"
-				},
-				{
-					"description": "Test Holiday 3",
-					"holiday_date": "2019-02-11"
-				},
-			]
-		}).insert()
+		holiday_list = frappe.get_doc(
+			{
+				"doctype": "Holiday List",
+				"holiday_list_name": "__Test Holiday List",
+				"from_date": "2019-01-01",
+				"to_date": "2019-12-31",
+				"holidays": [
+					{"description": "Test Holiday 1", "holiday_date": "2019-03-05"},
+					{"description": "Test Holiday 2", "holiday_date": "2019-03-07"},
+					{"description": "Test Holiday 3", "holiday_date": "2019-02-11"},
+				],
+			}
+		).insert()
+
 
 def create_custom_doctype():
 	if not frappe.db.exists("DocType", "Test SLA on Custom Dt"):
-		doc = frappe.get_doc({
+		doc = frappe.get_doc(
+			{
 				"doctype": "DocType",
 				"module": "Support",
 				"custom": 1,
 				"fields": [
-					{
-						"label": "Date",
-						"fieldname": "date",
-						"fieldtype": "Date"
-					},
-					{
-						"label": "Description",
-						"fieldname": "desc",
-						"fieldtype": "Long Text"
-					},
-					{
-						"label": "Email ID",
-						"fieldname": "email_id",
-						"fieldtype": "Link",
-						"options": "Customer"
-					},
+					{"label": "Date", "fieldname": "date", "fieldtype": "Date"},
+					{"label": "Description", "fieldname": "desc", "fieldtype": "Long Text"},
+					{"label": "Email ID", "fieldname": "email_id", "fieldtype": "Link", "options": "Customer"},
 					{
 						"label": "Status",
 						"fieldname": "status",
 						"fieldtype": "Select",
-						"options": "Open\nReplied\nClosed"
-					}
+						"options": "Open\nReplied\nClosed",
+					},
 				],
-				"permissions": [{
-					"role": "System Manager",
-					"read": 1,
-					"write": 1
-				}],
+				"permissions": [{"role": "System Manager", "read": 1, "write": 1}],
 				"name": "Test SLA on Custom Dt",
-			})
+			}
+		)
 		doc.insert()
 		return doc
 	else:
 		return frappe.get_doc("DocType", "Test SLA on Custom Dt")
 
+
 def make_lead(creation=None, index=0):
-	return frappe.get_doc({
-		"doctype": "Lead",
-		"email_id": "test_lead1@example{0}.com".format(index),
-		"lead_name": "_Test Lead {0}".format(index),
-		"status": "Open",
-		"creation": creation,
-		"service_level_agreement_creation": creation,
-		"priority": "Medium"
-	}).insert(ignore_permissions=True)
+	return frappe.get_doc(
+		{
+			"doctype": "Lead",
+			"email_id": "test_lead1@example{0}.com".format(index),
+			"lead_name": "_Test Lead {0}".format(index),
+			"status": "Open",
+			"creation": creation,
+			"service_level_agreement_creation": creation,
+			"priority": "Medium",
+		}
+	).insert(ignore_permissions=True)
diff --git a/erpnext/support/doctype/warranty_claim/test_warranty_claim.py b/erpnext/support/doctype/warranty_claim/test_warranty_claim.py
index f022d55..19e2349 100644
--- a/erpnext/support/doctype/warranty_claim/test_warranty_claim.py
+++ b/erpnext/support/doctype/warranty_claim/test_warranty_claim.py
@@ -5,7 +5,8 @@
 
 import frappe
 
-test_records = frappe.get_test_records('Warranty Claim')
+test_records = frappe.get_test_records("Warranty Claim")
+
 
 class TestWarrantyClaim(unittest.TestCase):
 	pass
diff --git a/erpnext/support/doctype/warranty_claim/warranty_claim.py b/erpnext/support/doctype/warranty_claim/warranty_claim.py
index 87e9541..5e2ea06 100644
--- a/erpnext/support/doctype/warranty_claim/warranty_claim.py
+++ b/erpnext/support/doctype/warranty_claim/warranty_claim.py
@@ -2,7 +2,6 @@
 # License: GNU General Public License v3. See license.txt
 
 
-
 import frappe
 from frappe import _, session
 from frappe.utils import now_datetime
@@ -15,27 +14,33 @@
 		return _("{0}: From {1}").format(self.status, self.customer_name)
 
 	def validate(self):
-		if session['user'] != 'Guest' and not self.customer:
+		if session["user"] != "Guest" and not self.customer:
 			frappe.throw(_("Customer is required"))
 
-		if self.status=="Closed" and not self.resolution_date and \
-			frappe.db.get_value("Warranty Claim", self.name, "status")!="Closed":
+		if (
+			self.status == "Closed"
+			and not self.resolution_date
+			and frappe.db.get_value("Warranty Claim", self.name, "status") != "Closed"
+		):
 			self.resolution_date = now_datetime()
 
 	def on_cancel(self):
-		lst = frappe.db.sql("""select t1.name
+		lst = frappe.db.sql(
+			"""select t1.name
 			from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2
 			where t2.parent = t1.name and t2.prevdoc_docname = %s and	t1.docstatus!=2""",
-			(self.name))
+			(self.name),
+		)
 		if lst:
-			lst1 = ','.join(x[0] for x in lst)
+			lst1 = ",".join(x[0] for x in lst)
 			frappe.throw(_("Cancel Material Visit {0} before cancelling this Warranty Claim").format(lst1))
 		else:
-			frappe.db.set(self, 'status', 'Cancelled')
+			frappe.db.set(self, "status", "Cancelled")
 
 	def on_update(self):
 		pass
 
+
 @frappe.whitelist()
 def make_maintenance_visit(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc, map_child_doc
@@ -44,25 +49,25 @@
 		target_doc.prevdoc_doctype = source_parent.doctype
 		target_doc.prevdoc_docname = source_parent.name
 
-	visit = frappe.db.sql("""select t1.name
+	visit = frappe.db.sql(
+		"""select t1.name
 		from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2
 		where t2.parent=t1.name and t2.prevdoc_docname=%s
-		and t1.docstatus=1 and t1.completion_status='Fully Completed'""", source_name)
+		and t1.docstatus=1 and t1.completion_status='Fully Completed'""",
+		source_name,
+	)
 
 	if not visit:
-		target_doc = get_mapped_doc("Warranty Claim", source_name, {
-			"Warranty Claim": {
-				"doctype": "Maintenance Visit",
-				"field_map": {}
-			}
-		}, target_doc)
+		target_doc = get_mapped_doc(
+			"Warranty Claim",
+			source_name,
+			{"Warranty Claim": {"doctype": "Maintenance Visit", "field_map": {}}},
+			target_doc,
+		)
 
 		source_doc = frappe.get_doc("Warranty Claim", source_name)
 		if source_doc.get("item_code"):
-			table_map = {
-				"doctype": "Maintenance Visit Purpose",
-				"postprocess": _update_links
-			}
+			table_map = {"doctype": "Maintenance Visit Purpose", "postprocess": _update_links}
 			map_child_doc(source_doc, target_doc, table_map, source_doc)
 
 		return target_doc
diff --git a/erpnext/support/report/first_response_time_for_issues/first_response_time_for_issues.py b/erpnext/support/report/first_response_time_for_issues/first_response_time_for_issues.py
index 2ab0fb8..5b51ef8 100644
--- a/erpnext/support/report/first_response_time_for_issues/first_response_time_for_issues.py
+++ b/erpnext/support/report/first_response_time_for_issues/first_response_time_for_issues.py
@@ -7,21 +7,17 @@
 
 def execute(filters=None):
 	columns = [
+		{"fieldname": "creation_date", "label": "Date", "fieldtype": "Date", "width": 300},
 		{
-			'fieldname': 'creation_date',
-			'label': 'Date',
-			'fieldtype': 'Date',
-			'width': 300
-		},
-		{
-			'fieldname': 'first_response_time',
-			'fieldtype': 'Duration',
-			'label': 'First Response Time',
-			'width': 300
+			"fieldname": "first_response_time",
+			"fieldtype": "Duration",
+			"label": "First Response Time",
+			"width": 300,
 		},
 	]
 
-	data = frappe.db.sql('''
+	data = frappe.db.sql(
+		"""
 		SELECT
 			date(creation) as creation_date,
 			avg(first_response_time) as avg_response_time
@@ -31,6 +27,8 @@
 			and first_response_time > 0
 		GROUP BY creation_date
 		ORDER BY creation_date desc
-	''', (filters.from_date, filters.to_date))
+	""",
+		(filters.from_date, filters.to_date),
+	)
 
 	return columns, data
diff --git a/erpnext/support/report/issue_analytics/issue_analytics.py b/erpnext/support/report/issue_analytics/issue_analytics.py
index 056f2e0..00ba25a 100644
--- a/erpnext/support/report/issue_analytics/issue_analytics.py
+++ b/erpnext/support/report/issue_analytics/issue_analytics.py
@@ -14,6 +14,7 @@
 def execute(filters=None):
 	return IssueAnalytics(filters).run()
 
+
 class IssueAnalytics(object):
 	def __init__(self, filters=None):
 		"""Issue Analytics Report"""
@@ -30,101 +31,98 @@
 	def get_columns(self):
 		self.columns = []
 
-		if self.filters.based_on == 'Customer':
-			self.columns.append({
-				'label': _('Customer'),
-				'options': 'Customer',
-				'fieldname': 'customer',
-				'fieldtype': 'Link',
-				'width': 200
-			})
+		if self.filters.based_on == "Customer":
+			self.columns.append(
+				{
+					"label": _("Customer"),
+					"options": "Customer",
+					"fieldname": "customer",
+					"fieldtype": "Link",
+					"width": 200,
+				}
+			)
 
-		elif self.filters.based_on == 'Assigned To':
-			self.columns.append({
-				'label': _('User'),
-				'fieldname': 'user',
-				'fieldtype': 'Link',
-				'options': 'User',
-				'width': 200
-			})
+		elif self.filters.based_on == "Assigned To":
+			self.columns.append(
+				{"label": _("User"), "fieldname": "user", "fieldtype": "Link", "options": "User", "width": 200}
+			)
 
-		elif self.filters.based_on == 'Issue Type':
-			self.columns.append({
-				'label': _('Issue Type'),
-				'fieldname': 'issue_type',
-				'fieldtype': 'Link',
-				'options': 'Issue Type',
-				'width': 200
-			})
+		elif self.filters.based_on == "Issue Type":
+			self.columns.append(
+				{
+					"label": _("Issue Type"),
+					"fieldname": "issue_type",
+					"fieldtype": "Link",
+					"options": "Issue Type",
+					"width": 200,
+				}
+			)
 
-		elif self.filters.based_on == 'Issue Priority':
-			self.columns.append({
-				'label': _('Issue Priority'),
-				'fieldname': 'priority',
-				'fieldtype': 'Link',
-				'options': 'Issue Priority',
-				'width': 200
-			})
+		elif self.filters.based_on == "Issue Priority":
+			self.columns.append(
+				{
+					"label": _("Issue Priority"),
+					"fieldname": "priority",
+					"fieldtype": "Link",
+					"options": "Issue Priority",
+					"width": 200,
+				}
+			)
 
 		for end_date in self.periodic_daterange:
 			period = self.get_period(end_date)
-			self.columns.append({
-				'label': _(period),
-				'fieldname': scrub(period),
-				'fieldtype': 'Int',
-				'width': 120
-			})
+			self.columns.append(
+				{"label": _(period), "fieldname": scrub(period), "fieldtype": "Int", "width": 120}
+			)
 
-		self.columns.append({
-			'label': _('Total'),
-			'fieldname': 'total',
-			'fieldtype': 'Int',
-			'width': 120
-		})
+		self.columns.append(
+			{"label": _("Total"), "fieldname": "total", "fieldtype": "Int", "width": 120}
+		)
 
 	def get_data(self):
 		self.get_issues()
 		self.get_rows()
 
 	def get_period(self, date):
-		months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+		months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
 
-		if self.filters.range == 'Weekly':
-			period = 'Week ' + str(date.isocalendar()[1])
-		elif self.filters.range == 'Monthly':
+		if self.filters.range == "Weekly":
+			period = "Week " + str(date.isocalendar()[1])
+		elif self.filters.range == "Monthly":
 			period = str(months[date.month - 1])
-		elif self.filters.range == 'Quarterly':
-			period = 'Quarter ' + str(((date.month - 1) // 3) + 1)
+		elif self.filters.range == "Quarterly":
+			period = "Quarter " + str(((date.month - 1) // 3) + 1)
 		else:
 			year = get_fiscal_year(date, self.filters.company)
 			period = str(year[0])
 
-		if getdate(self.filters.from_date).year != getdate(self.filters.to_date).year and self.filters.range != 'Yearly':
-			period += ' ' + str(date.year)
+		if (
+			getdate(self.filters.from_date).year != getdate(self.filters.to_date).year
+			and self.filters.range != "Yearly"
+		):
+			period += " " + str(date.year)
 
 		return period
 
 	def get_period_date_ranges(self):
 		from dateutil.relativedelta import MO, relativedelta
+
 		from_date, to_date = getdate(self.filters.from_date), getdate(self.filters.to_date)
 
-		increment = {
-			'Monthly': 1,
-			'Quarterly': 3,
-			'Half-Yearly': 6,
-			'Yearly': 12
-		}.get(self.filters.range, 1)
+		increment = {"Monthly": 1, "Quarterly": 3, "Half-Yearly": 6, "Yearly": 12}.get(
+			self.filters.range, 1
+		)
 
-		if self.filters.range in ['Monthly', 'Quarterly']:
+		if self.filters.range in ["Monthly", "Quarterly"]:
 			from_date = from_date.replace(day=1)
-		elif self.filters.range == 'Yearly':
+		elif self.filters.range == "Yearly":
 			from_date = get_fiscal_year(from_date)[1]
 		else:
 			from_date = from_date + relativedelta(from_date, weekday=MO(-1))
 
 		self.periodic_daterange = []
 		for dummy in range(1, 53):
-			if self.filters.range == 'Weekly':
+			if self.filters.range == "Weekly":
 				period_end_date = add_days(from_date, 6)
 			else:
 				period_end_date = add_to_date(from_date, months=increment, days=-1)
@@ -141,25 +139,26 @@
 	def get_issues(self):
 		filters = self.get_common_filters()
 		self.field_map = {
-			'Customer': 'customer',
-			'Issue Type': 'issue_type',
-			'Issue Priority': 'priority',
-			'Assigned To': '_assign'
+			"Customer": "customer",
+			"Issue Type": "issue_type",
+			"Issue Priority": "priority",
+			"Assigned To": "_assign",
 		}
 
-		self.entries = frappe.db.get_all('Issue',
-			fields=[self.field_map.get(self.filters.based_on), 'name', 'opening_date'],
-			filters=filters
+		self.entries = frappe.db.get_all(
+			"Issue",
+			fields=[self.field_map.get(self.filters.based_on), "name", "opening_date"],
+			filters=filters,
 		)
 
 	def get_common_filters(self):
 		filters = {}
-		filters['opening_date'] = ('between', [self.filters.from_date, self.filters.to_date])
+		filters["opening_date"] = ("between", [self.filters.from_date, self.filters.to_date])
 
-		if self.filters.get('assigned_to'):
-			filters['_assign'] = ('like', '%' + self.filters.get('assigned_to') + '%')
+		if self.filters.get("assigned_to"):
+			filters["_assign"] = ("like", "%" + self.filters.get("assigned_to") + "%")
 
-		for entry in ['company', 'status', 'priority', 'customer', 'project']:
+		for entry in ["company", "status", "priority", "customer", "project"]:
 			if self.filters.get(entry):
 				filters[entry] = self.filters.get(entry)
 
@@ -170,14 +169,14 @@
 		self.get_periodic_data()
 
 		for entity, period_data in self.issue_periodic_data.items():
-			if self.filters.based_on == 'Customer':
-				row = {'customer': entity}
-			elif self.filters.based_on == 'Assigned To':
-				row = {'user': entity}
-			elif self.filters.based_on == 'Issue Type':
-				row = {'issue_type': entity}
-			elif self.filters.based_on == 'Issue Priority':
-				row = {'priority': entity}
+			if self.filters.based_on == "Customer":
+				row = {"customer": entity}
+			elif self.filters.based_on == "Assigned To":
+				row = {"user": entity}
+			elif self.filters.based_on == "Issue Type":
+				row = {"issue_type": entity}
+			elif self.filters.based_on == "Issue Priority":
+				row = {"priority": entity}
 
 			total = 0
 			for end_date in self.periodic_daterange:
@@ -186,7 +185,7 @@
 				row[scrub(period)] = amount
 				total += amount
 
-			row['total'] = total
+			row["total"] = total
 
 			self.data.append(row)
 
@@ -194,9 +193,9 @@
 		self.issue_periodic_data = frappe._dict()
 
 		for d in self.entries:
-			period = self.get_period(d.get('opening_date'))
+			period = self.get_period(d.get("opening_date"))
 
-			if self.filters.based_on == 'Assigned To':
+			if self.filters.based_on == "Assigned To":
 				if d._assign:
 					for entry in json.loads(d._assign):
 						self.issue_periodic_data.setdefault(entry, frappe._dict()).setdefault(period, 0.0)
@@ -206,18 +205,12 @@
 				field = self.field_map.get(self.filters.based_on)
 				value = d.get(field)
 				if not value:
-					value = _('Not Specified')
+					value = _("Not Specified")
 
 				self.issue_periodic_data.setdefault(value, frappe._dict()).setdefault(period, 0.0)
 				self.issue_periodic_data[value][period] += 1
 
 	def get_chart_data(self):
 		length = len(self.columns)
-		labels = [d.get('label') for d in self.columns[1:length-1]]
-		self.chart = {
-			'data': {
-				'labels': labels,
-				'datasets': []
-			},
-			'type': 'line'
-		}
+		labels = [d.get("label") for d in self.columns[1 : length - 1]]
+		self.chart = {"data": {"labels": labels, "datasets": []}, "type": "line"}
diff --git a/erpnext/support/report/issue_analytics/test_issue_analytics.py b/erpnext/support/report/issue_analytics/test_issue_analytics.py
index ba4dc54..169392e 100644
--- a/erpnext/support/report/issue_analytics/test_issue_analytics.py
+++ b/erpnext/support/report/issue_analytics/test_issue_analytics.py
@@ -10,7 +10,8 @@
 )
 from erpnext.support.report.issue_analytics.issue_analytics import execute
 
-months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+
 
 class TestIssueAnalytics(unittest.TestCase):
 	@classmethod
@@ -23,8 +24,8 @@
 		self.current_month = str(months[current_month_date.month - 1]).lower()
 		self.last_month = str(months[last_month_date.month - 1]).lower()
 		if current_month_date.year != last_month_date.year:
-			self.current_month += '_' + str(current_month_date.year)
-			self.last_month += '_' + str(last_month_date.year)
+			self.current_month += "_" + str(current_month_date.year)
+			self.last_month += "_" + str(last_month_date.year)
 
 	def test_issue_analytics(self):
 		create_service_level_agreements_for_issues()
@@ -38,146 +39,88 @@
 
 	def compare_result_for_customer(self):
 		filters = {
-			'company': '_Test Company',
-			'based_on': 'Customer',
-			'from_date': add_months(getdate(), -1),
-			'to_date': getdate(),
-			'range': 'Monthly'
+			"company": "_Test Company",
+			"based_on": "Customer",
+			"from_date": add_months(getdate(), -1),
+			"to_date": getdate(),
+			"range": "Monthly",
 		}
 
 		report = execute(filters)
 
 		expected_data = [
-			{
-				'customer': '__Test Customer 2',
-				self.last_month: 1.0,
-				self.current_month: 0.0,
-				'total': 1.0
-			},
-			{
-				'customer': '__Test Customer 1',
-				self.last_month: 0.0,
-				self.current_month: 1.0,
-				'total': 1.0
-			},
-			{
-				'customer': '__Test Customer',
-				self.last_month: 1.0,
-				self.current_month: 1.0,
-				'total': 2.0
-			}
+			{"customer": "__Test Customer 2", self.last_month: 1.0, self.current_month: 0.0, "total": 1.0},
+			{"customer": "__Test Customer 1", self.last_month: 0.0, self.current_month: 1.0, "total": 1.0},
+			{"customer": "__Test Customer", self.last_month: 1.0, self.current_month: 1.0, "total": 2.0},
 		]
 
-		self.assertEqual(expected_data, report[1]) # rows
-		self.assertEqual(len(report[0]), 4) # cols
+		self.assertEqual(expected_data, report[1])  # rows
+		self.assertEqual(len(report[0]), 4)  # cols
 
 	def compare_result_for_issue_type(self):
 		filters = {
-			'company': '_Test Company',
-			'based_on': 'Issue Type',
-			'from_date': add_months(getdate(), -1),
-			'to_date': getdate(),
-			'range': 'Monthly'
+			"company": "_Test Company",
+			"based_on": "Issue Type",
+			"from_date": add_months(getdate(), -1),
+			"to_date": getdate(),
+			"range": "Monthly",
 		}
 
 		report = execute(filters)
 
 		expected_data = [
-			{
-				'issue_type': 'Discomfort',
-				self.last_month: 1.0,
-				self.current_month: 0.0,
-				'total': 1.0
-			},
-			{
-				'issue_type': 'Service Request',
-				self.last_month: 0.0,
-				self.current_month: 1.0,
-				'total': 1.0
-			},
-			{
-				'issue_type': 'Bug',
-				self.last_month: 1.0,
-				self.current_month: 1.0,
-				'total': 2.0
-			}
+			{"issue_type": "Discomfort", self.last_month: 1.0, self.current_month: 0.0, "total": 1.0},
+			{"issue_type": "Service Request", self.last_month: 0.0, self.current_month: 1.0, "total": 1.0},
+			{"issue_type": "Bug", self.last_month: 1.0, self.current_month: 1.0, "total": 2.0},
 		]
 
-		self.assertEqual(expected_data, report[1]) # rows
-		self.assertEqual(len(report[0]), 4) # cols
+		self.assertEqual(expected_data, report[1])  # rows
+		self.assertEqual(len(report[0]), 4)  # cols
 
 	def compare_result_for_issue_priority(self):
 		filters = {
-			'company': '_Test Company',
-			'based_on': 'Issue Priority',
-			'from_date': add_months(getdate(), -1),
-			'to_date': getdate(),
-			'range': 'Monthly'
+			"company": "_Test Company",
+			"based_on": "Issue Priority",
+			"from_date": add_months(getdate(), -1),
+			"to_date": getdate(),
+			"range": "Monthly",
 		}
 
 		report = execute(filters)
 
 		expected_data = [
-			{
-				'priority': 'Medium',
-				self.last_month: 1.0,
-				self.current_month: 1.0,
-				'total': 2.0
-			},
-			{
-				'priority': 'Low',
-				self.last_month: 1.0,
-				self.current_month: 0.0,
-				'total': 1.0
-			},
-			{
-				'priority': 'High',
-				self.last_month: 0.0,
-				self.current_month: 1.0,
-				'total': 1.0
-			}
+			{"priority": "Medium", self.last_month: 1.0, self.current_month: 1.0, "total": 2.0},
+			{"priority": "Low", self.last_month: 1.0, self.current_month: 0.0, "total": 1.0},
+			{"priority": "High", self.last_month: 0.0, self.current_month: 1.0, "total": 1.0},
 		]
 
-		self.assertEqual(expected_data, report[1]) # rows
-		self.assertEqual(len(report[0]), 4) # cols
+		self.assertEqual(expected_data, report[1])  # rows
+		self.assertEqual(len(report[0]), 4)  # cols
 
 	def compare_result_for_assignment(self):
 		filters = {
-			'company': '_Test Company',
-			'based_on': 'Assigned To',
-			'from_date': add_months(getdate(), -1),
-			'to_date': getdate(),
-			'range': 'Monthly'
+			"company": "_Test Company",
+			"based_on": "Assigned To",
+			"from_date": add_months(getdate(), -1),
+			"to_date": getdate(),
+			"range": "Monthly",
 		}
 
 		report = execute(filters)
 
 		expected_data = [
-			{
-				'user': 'test@example.com',
-				self.last_month: 1.0,
-				self.current_month: 1.0,
-				'total': 2.0
-			},
-			{
-				'user': 'test1@example.com',
-				self.last_month: 2.0,
-				self.current_month: 1.0,
-				'total': 3.0
-			}
+			{"user": "test@example.com", self.last_month: 1.0, self.current_month: 1.0, "total": 2.0},
+			{"user": "test1@example.com", self.last_month: 2.0, self.current_month: 1.0, "total": 3.0},
 		]
 
-		self.assertEqual(expected_data, report[1]) # rows
-		self.assertEqual(len(report[0]), 4) # cols
+		self.assertEqual(expected_data, report[1])  # rows
+		self.assertEqual(len(report[0]), 4)  # cols
 
 
 def create_issue_types():
-	for entry in ['Bug', 'Service Request', 'Discomfort']:
-		if not frappe.db.exists('Issue Type', entry):
-			frappe.get_doc({
-				'doctype': 'Issue Type',
-				'__newname': entry
-			}).insert()
+	for entry in ["Bug", "Service Request", "Discomfort"]:
+		if not frappe.db.exists("Issue Type", entry):
+			frappe.get_doc({"doctype": "Issue Type", "__newname": entry}).insert()
 
 
 def create_records():
@@ -189,29 +132,15 @@
 	last_month_date = add_months(current_month_date, -1)
 
 	issue = make_issue(current_month_date, "__Test Customer", 2, "High", "Bug")
-	add_assignment({
-		"assign_to": ["test@example.com"],
-		"doctype": "Issue",
-		"name": issue.name
-	})
+	add_assignment({"assign_to": ["test@example.com"], "doctype": "Issue", "name": issue.name})
 
 	issue = make_issue(last_month_date, "__Test Customer", 2, "Low", "Bug")
-	add_assignment({
-		"assign_to": ["test1@example.com"],
-		"doctype": "Issue",
-		"name": issue.name
-	})
+	add_assignment({"assign_to": ["test1@example.com"], "doctype": "Issue", "name": issue.name})
 
 	issue = make_issue(current_month_date, "__Test Customer 1", 2, "Medium", "Service Request")
-	add_assignment({
-		"assign_to": ["test1@example.com"],
-		"doctype": "Issue",
-		"name": issue.name
-	})
+	add_assignment({"assign_to": ["test1@example.com"], "doctype": "Issue", "name": issue.name})
 
 	issue = make_issue(last_month_date, "__Test Customer 2", 2, "Medium", "Discomfort")
-	add_assignment({
-		"assign_to": ["test@example.com", "test1@example.com"],
-		"doctype": "Issue",
-		"name": issue.name
-	})
+	add_assignment(
+		{"assign_to": ["test@example.com", "test1@example.com"], "doctype": "Issue", "name": issue.name}
+	)
diff --git a/erpnext/support/report/issue_summary/issue_summary.py b/erpnext/support/report/issue_summary/issue_summary.py
index 67fe345..c80ce88 100644
--- a/erpnext/support/report/issue_summary/issue_summary.py
+++ b/erpnext/support/report/issue_summary/issue_summary.py
@@ -12,6 +12,7 @@
 def execute(filters=None):
 	return IssueSummary(filters).run()
 
+
 class IssueSummary(object):
 	def __init__(self, filters=None):
 		self.filters = frappe._dict(filters or {})
@@ -27,83 +28,78 @@
 	def get_columns(self):
 		self.columns = []
 
-		if self.filters.based_on == 'Customer':
-			self.columns.append({
-				'label': _('Customer'),
-				'options': 'Customer',
-				'fieldname': 'customer',
-				'fieldtype': 'Link',
-				'width': 200
-			})
+		if self.filters.based_on == "Customer":
+			self.columns.append(
+				{
+					"label": _("Customer"),
+					"options": "Customer",
+					"fieldname": "customer",
+					"fieldtype": "Link",
+					"width": 200,
+				}
+			)
 
-		elif self.filters.based_on == 'Assigned To':
-			self.columns.append({
-				'label': _('User'),
-				'fieldname': 'user',
-				'fieldtype': 'Link',
-				'options': 'User',
-				'width': 200
-			})
+		elif self.filters.based_on == "Assigned To":
+			self.columns.append(
+				{"label": _("User"), "fieldname": "user", "fieldtype": "Link", "options": "User", "width": 200}
+			)
 
-		elif self.filters.based_on == 'Issue Type':
-			self.columns.append({
-				'label': _('Issue Type'),
-				'fieldname': 'issue_type',
-				'fieldtype': 'Link',
-				'options': 'Issue Type',
-				'width': 200
-			})
+		elif self.filters.based_on == "Issue Type":
+			self.columns.append(
+				{
+					"label": _("Issue Type"),
+					"fieldname": "issue_type",
+					"fieldtype": "Link",
+					"options": "Issue Type",
+					"width": 200,
+				}
+			)
 
-		elif self.filters.based_on == 'Issue Priority':
-			self.columns.append({
-				'label': _('Issue Priority'),
-				'fieldname': 'priority',
-				'fieldtype': 'Link',
-				'options': 'Issue Priority',
-				'width': 200
-			})
+		elif self.filters.based_on == "Issue Priority":
+			self.columns.append(
+				{
+					"label": _("Issue Priority"),
+					"fieldname": "priority",
+					"fieldtype": "Link",
+					"options": "Issue Priority",
+					"width": 200,
+				}
+			)
 
-		self.statuses = ['Open', 'Replied', 'On Hold', 'Resolved', 'Closed']
+		self.statuses = ["Open", "Replied", "On Hold", "Resolved", "Closed"]
 		for status in self.statuses:
-			self.columns.append({
-				'label': _(status),
-				'fieldname': scrub(status),
-				'fieldtype': 'Int',
-				'width': 80
-			})
+			self.columns.append(
+				{"label": _(status), "fieldname": scrub(status), "fieldtype": "Int", "width": 80}
+			)
 
-		self.columns.append({
-			'label': _('Total Issues'),
-			'fieldname': 'total_issues',
-			'fieldtype': 'Int',
-			'width': 100
-		})
+		self.columns.append(
+			{"label": _("Total Issues"), "fieldname": "total_issues", "fieldtype": "Int", "width": 100}
+		)
 
 		self.sla_status_map = {
-			'SLA Failed': 'failed',
-			'SLA Fulfilled': 'fulfilled',
-			'First Response Due': 'first_response_due',
-			'Resolution Due': 'resolution_due'
+			"SLA Failed": "failed",
+			"SLA Fulfilled": "fulfilled",
+			"First Response Due": "first_response_due",
+			"Resolution Due": "resolution_due",
 		}
 
 		for label, fieldname in self.sla_status_map.items():
-			self.columns.append({
-				'label': _(label),
-				'fieldname': fieldname,
-				'fieldtype': 'Int',
-				'width': 100
-			})
+			self.columns.append(
+				{"label": _(label), "fieldname": fieldname, "fieldtype": "Int", "width": 100}
+			)
 
-		self.metrics = ['Avg First Response Time', 'Avg Response Time', 'Avg Hold Time',
-			'Avg Resolution Time', 'Avg User Resolution Time']
+		self.metrics = [
+			"Avg First Response Time",
+			"Avg Response Time",
+			"Avg Hold Time",
+			"Avg Resolution Time",
+			"Avg User Resolution Time",
+		]
 
 		for metric in self.metrics:
-			self.columns.append({
-				'label': _(metric),
-				'fieldname': scrub(metric),
-				'fieldtype': 'Duration',
-				'width': 170
-			})
+			self.columns.append(
+				{"label": _(metric), "fieldname": scrub(metric), "fieldtype": "Duration", "width": 170}
+			)
 
 	def get_data(self):
 		self.get_issues()
@@ -112,26 +108,37 @@
 	def get_issues(self):
 		filters = self.get_common_filters()
 		self.field_map = {
-			'Customer': 'customer',
-			'Issue Type': 'issue_type',
-			'Issue Priority': 'priority',
-			'Assigned To': '_assign'
+			"Customer": "customer",
+			"Issue Type": "issue_type",
+			"Issue Priority": "priority",
+			"Assigned To": "_assign",
 		}
 
-		self.entries = frappe.db.get_all('Issue',
-			fields=[self.field_map.get(self.filters.based_on), 'name', 'opening_date', 'status', 'avg_response_time',
-				'first_response_time', 'total_hold_time', 'user_resolution_time', 'resolution_time', 'agreement_status'],
-			filters=filters
+		self.entries = frappe.db.get_all(
+			"Issue",
+			fields=[
+				self.field_map.get(self.filters.based_on),
+				"name",
+				"opening_date",
+				"status",
+				"avg_response_time",
+				"first_response_time",
+				"total_hold_time",
+				"user_resolution_time",
+				"resolution_time",
+				"agreement_status",
+			],
+			filters=filters,
 		)
 
 	def get_common_filters(self):
 		filters = {}
-		filters['opening_date'] = ('between', [self.filters.from_date, self.filters.to_date])
+		filters["opening_date"] = ("between", [self.filters.from_date, self.filters.to_date])
 
-		if self.filters.get('assigned_to'):
-			filters['_assign'] = ('like', '%' + self.filters.get('assigned_to') + '%')
+		if self.filters.get("assigned_to"):
+			filters["_assign"] = ("like", "%" + self.filters.get("assigned_to") + "%")
 
-		for entry in ['company', 'status', 'priority', 'customer', 'project']:
+		for entry in ["company", "status", "priority", "customer", "project"]:
 			if self.filters.get(entry):
 				filters[entry] = self.filters.get(entry)
 
@@ -142,20 +149,20 @@
 		self.get_summary_data()
 
 		for entity, data in self.issue_summary_data.items():
-			if self.filters.based_on == 'Customer':
-				row = {'customer': entity}
-			elif self.filters.based_on == 'Assigned To':
-				row = {'user': entity}
-			elif self.filters.based_on == 'Issue Type':
-				row = {'issue_type': entity}
-			elif self.filters.based_on == 'Issue Priority':
-				row = {'priority': entity}
+			if self.filters.based_on == "Customer":
+				row = {"customer": entity}
+			elif self.filters.based_on == "Assigned To":
+				row = {"user": entity}
+			elif self.filters.based_on == "Issue Type":
+				row = {"issue_type": entity}
+			elif self.filters.based_on == "Issue Priority":
+				row = {"priority": entity}
 
 			for status in self.statuses:
 				count = flt(data.get(status, 0.0))
 				row[scrub(status)] = count
 
-			row['total_issues'] = data.get('total_issues', 0.0)
+			row["total_issues"] = data.get("total_issues", 0.0)
 
 			for sla_status in self.sla_status_map.values():
 				value = flt(data.get(sla_status), 0.0)
@@ -174,36 +181,41 @@
 			status = d.status
 			agreement_status = scrub(d.agreement_status)
 
-			if self.filters.based_on == 'Assigned To':
+			if self.filters.based_on == "Assigned To":
 				if d._assign:
 					for entry in json.loads(d._assign):
 						self.issue_summary_data.setdefault(entry, frappe._dict()).setdefault(status, 0.0)
 						self.issue_summary_data.setdefault(entry, frappe._dict()).setdefault(agreement_status, 0.0)
-						self.issue_summary_data.setdefault(entry, frappe._dict()).setdefault('total_issues', 0.0)
+						self.issue_summary_data.setdefault(entry, frappe._dict()).setdefault("total_issues", 0.0)
 						self.issue_summary_data[entry][status] += 1
 						self.issue_summary_data[entry][agreement_status] += 1
-						self.issue_summary_data[entry]['total_issues'] += 1
+						self.issue_summary_data[entry]["total_issues"] += 1
 
 			else:
 				field = self.field_map.get(self.filters.based_on)
 				value = d.get(field)
 				if not value:
-					value = _('Not Specified')
+					value = _("Not Specified")
 
 				self.issue_summary_data.setdefault(value, frappe._dict()).setdefault(status, 0.0)
 				self.issue_summary_data.setdefault(value, frappe._dict()).setdefault(agreement_status, 0.0)
-				self.issue_summary_data.setdefault(value, frappe._dict()).setdefault('total_issues', 0.0)
+				self.issue_summary_data.setdefault(value, frappe._dict()).setdefault("total_issues", 0.0)
 				self.issue_summary_data[value][status] += 1
 				self.issue_summary_data[value][agreement_status] += 1
-				self.issue_summary_data[value]['total_issues'] += 1
+				self.issue_summary_data[value]["total_issues"] += 1
 
 		self.get_metrics_data()
 
 	def get_metrics_data(self):
 		issues = []
 
-		metrics_list = ['avg_response_time', 'avg_first_response_time', 'avg_hold_time',
-			'avg_resolution_time', 'avg_user_resolution_time']
+		metrics_list = [
+			"avg_response_time",
+			"avg_first_response_time",
+			"avg_hold_time",
+			"avg_resolution_time",
+			"avg_user_resolution_time",
+		]
 
 		for entry in self.entries:
 			issues.append(entry.name)
@@ -211,7 +223,7 @@
 		field = self.field_map.get(self.filters.based_on)
 
 		if issues:
-			if self.filters.based_on == 'Assigned To':
+			if self.filters.based_on == "Assigned To":
 				assignment_map = frappe._dict()
 				for d in self.entries:
 					if d._assign:
@@ -219,11 +231,15 @@
 							for metric in metrics_list:
 								self.issue_summary_data.setdefault(entry, frappe._dict()).setdefault(metric, 0.0)
 
-							self.issue_summary_data[entry]['avg_response_time'] += d.get('avg_response_time') or 0.0
-							self.issue_summary_data[entry]['avg_first_response_time'] += d.get('first_response_time') or 0.0
-							self.issue_summary_data[entry]['avg_hold_time'] += d.get('total_hold_time') or 0.0
-							self.issue_summary_data[entry]['avg_resolution_time'] += d.get('resolution_time') or 0.0
-							self.issue_summary_data[entry]['avg_user_resolution_time'] += d.get('user_resolution_time') or 0.0
+							self.issue_summary_data[entry]["avg_response_time"] += d.get("avg_response_time") or 0.0
+							self.issue_summary_data[entry]["avg_first_response_time"] += (
+								d.get("first_response_time") or 0.0
+							)
+							self.issue_summary_data[entry]["avg_hold_time"] += d.get("total_hold_time") or 0.0
+							self.issue_summary_data[entry]["avg_resolution_time"] += d.get("resolution_time") or 0.0
+							self.issue_summary_data[entry]["avg_user_resolution_time"] += (
+								d.get("user_resolution_time") or 0.0
+							)
 
 							if not assignment_map.get(entry):
 								assignment_map[entry] = 0
@@ -234,7 +250,8 @@
 						self.issue_summary_data[entry][metric] /= flt(assignment_map.get(entry))
 
 			else:
-				data = frappe.db.sql("""
+				data = frappe.db.sql(
+					"""
 					SELECT
 						{0}, AVG(first_response_time) as avg_frt,
 						AVG(avg_response_time) as avg_resp_time,
@@ -245,21 +262,30 @@
 					WHERE
 						name IN %(issues)s
 					GROUP BY {0}
-				""".format(field), {'issues': issues}, as_dict=1)
+				""".format(
+						field
+					),
+					{"issues": issues},
+					as_dict=1,
+				)
 
 				for entry in data:
 					value = entry.get(field)
 					if not value:
-						value = _('Not Specified')
+						value = _("Not Specified")
 
 					for metric in metrics_list:
 						self.issue_summary_data.setdefault(value, frappe._dict()).setdefault(metric, 0.0)
 
-					self.issue_summary_data[value]['avg_response_time'] = entry.get('avg_resp_time') or 0.0
-					self.issue_summary_data[value]['avg_first_response_time'] = entry.get('avg_frt') or 0.0
-					self.issue_summary_data[value]['avg_hold_time'] = entry.get('avg_hold_time') or 0.0
-					self.issue_summary_data[value]['avg_resolution_time'] = entry.get('avg_resolution_time') or 0.0
-					self.issue_summary_data[value]['avg_user_resolution_time'] = entry.get('avg_user_resolution_time') or 0.0
+					self.issue_summary_data[value]["avg_response_time"] = entry.get("avg_resp_time") or 0.0
+					self.issue_summary_data[value]["avg_first_response_time"] = entry.get("avg_frt") or 0.0
+					self.issue_summary_data[value]["avg_hold_time"] = entry.get("avg_hold_time") or 0.0
+					self.issue_summary_data[value]["avg_resolution_time"] = (
+						entry.get("avg_resolution_time") or 0.0
+					)
+					self.issue_summary_data[value]["avg_user_resolution_time"] = (
+						entry.get("avg_user_resolution_time") or 0.0
+					)
 
 	def get_chart_data(self):
 		self.chart = []
@@ -273,47 +299,30 @@
 
 		entity = self.filters.based_on
 		entity_field = self.field_map.get(entity)
-		if entity == 'Assigned To':
-			entity_field = 'user'
+		if entity == "Assigned To":
+			entity_field = "user"
 
 		for entry in self.data:
 			labels.append(entry.get(entity_field))
-			open_issues.append(entry.get('open'))
-			replied_issues.append(entry.get('replied'))
-			on_hold_issues.append(entry.get('on_hold'))
-			resolved_issues.append(entry.get('resolved'))
-			closed_issues.append(entry.get('closed'))
+			open_issues.append(entry.get("open"))
+			replied_issues.append(entry.get("replied"))
+			on_hold_issues.append(entry.get("on_hold"))
+			resolved_issues.append(entry.get("resolved"))
+			closed_issues.append(entry.get("closed"))
 
 		self.chart = {
-			'data': {
-				'labels': labels[:30],
-				'datasets': [
-					{
-						'name': 'Open',
-						'values': open_issues[:30]
-					},
-					{
-						'name': 'Replied',
-						'values': replied_issues[:30]
-					},
-					{
-						'name': 'On Hold',
-						'values': on_hold_issues[:30]
-					},
-					{
-						'name': 'Resolved',
-						'values': resolved_issues[:30]
-					},
-					{
-						'name': 'Closed',
-						'values': closed_issues[:30]
-					}
-				]
+			"data": {
+				"labels": labels[:30],
+				"datasets": [
+					{"name": "Open", "values": open_issues[:30]},
+					{"name": "Replied", "values": replied_issues[:30]},
+					{"name": "On Hold", "values": on_hold_issues[:30]},
+					{"name": "Resolved", "values": resolved_issues[:30]},
+					{"name": "Closed", "values": closed_issues[:30]},
+				],
 			},
-			'type': 'bar',
-			'barOptions': {
-				'stacked': True
-			}
+			"type": "bar",
+			"barOptions": {"stacked": True},
 		}
 
 	def get_report_summary(self):
@@ -326,41 +335,41 @@
 		closed = 0
 
 		for entry in self.data:
-			open_issues += entry.get('open')
-			replied += entry.get('replied')
-			on_hold += entry.get('on_hold')
-			resolved += entry.get('resolved')
-			closed += entry.get('closed')
+			open_issues += entry.get("open")
+			replied += entry.get("replied")
+			on_hold += entry.get("on_hold")
+			resolved += entry.get("resolved")
+			closed += entry.get("closed")
 
 		self.report_summary = [
 			{
-				'value': open_issues,
-				'indicator': 'Red',
-				'label': _('Open'),
-				'datatype': 'Int',
+				"value": open_issues,
+				"indicator": "Red",
+				"label": _("Open"),
+				"datatype": "Int",
 			},
 			{
-				'value': replied,
-				'indicator': 'Grey',
-				'label': _('Replied'),
-				'datatype': 'Int',
+				"value": replied,
+				"indicator": "Grey",
+				"label": _("Replied"),
+				"datatype": "Int",
 			},
 			{
-				'value': on_hold,
-				'indicator': 'Grey',
-				'label': _('On Hold'),
-				'datatype': 'Int',
+				"value": on_hold,
+				"indicator": "Grey",
+				"label": _("On Hold"),
+				"datatype": "Int",
 			},
 			{
-				'value': resolved,
-				'indicator': 'Green',
-				'label': _('Resolved'),
-				'datatype': 'Int',
+				"value": resolved,
+				"indicator": "Green",
+				"label": _("Resolved"),
+				"datatype": "Int",
 			},
 			{
-				'value': closed,
-				'indicator': 'Green',
-				'label': _('Closed'),
-				'datatype': 'Int',
-			}
+				"value": closed,
+				"indicator": "Green",
+				"label": _("Closed"),
+				"datatype": "Int",
+			},
 		]
diff --git a/erpnext/support/report/support_hour_distribution/support_hour_distribution.py b/erpnext/support/report/support_hour_distribution/support_hour_distribution.py
index 6b2098f..5496721 100644
--- a/erpnext/support/report/support_hour_distribution/support_hour_distribution.py
+++ b/erpnext/support/report/support_hour_distribution/support_hour_distribution.py
@@ -7,34 +7,36 @@
 from frappe.utils import add_to_date, get_datetime, getdate
 
 time_slots = {
-	'12AM - 3AM': '00:00:00-03:00:00',
-	'3AM - 6AM': '03:00:00-06:00:00',
-	'6AM - 9AM': '06:00:00-09:00:00',
-	'9AM - 12PM': '09:00:00-12:00:00',
-	'12PM - 3PM': '12:00:00-15:00:00',
-	'3PM - 6PM': '15:00:00-18:00:00',
-	'6PM - 9PM': '18:00:00-21:00:00',
-	'9PM - 12AM': '21:00:00-23:00:00'
+	"12AM - 3AM": "00:00:00-03:00:00",
+	"3AM - 6AM": "03:00:00-06:00:00",
+	"6AM - 9AM": "06:00:00-09:00:00",
+	"9AM - 12PM": "09:00:00-12:00:00",
+	"12PM - 3PM": "12:00:00-15:00:00",
+	"3PM - 6PM": "15:00:00-18:00:00",
+	"6PM - 9PM": "18:00:00-21:00:00",
+	"9PM - 12AM": "21:00:00-23:00:00",
 }
 
+
 def execute(filters=None):
 	columns, data = [], []
-	if not filters.get('periodicity'):
-		filters['periodicity'] = 'Daily'
+	if not filters.get("periodicity"):
+		filters["periodicity"] = "Daily"
 
 	columns = get_columns()
 	data, timeslot_wise_count = get_data(filters)
 	chart = get_chart_data(timeslot_wise_count)
 	return columns, data, None, chart
 
+
 def get_data(filters):
 	start_date = getdate(filters.from_date)
 	data = []
 	time_slot_wise_total_count = {}
-	while(start_date <= getdate(filters.to_date)):
-		hours_count = {'date': start_date}
+	while start_date <= getdate(filters.to_date):
+		hours_count = {"date": start_date}
 		for key, value in time_slots.items():
-			start_time, end_time = value.split('-')
+			start_time, end_time = value.split("-")
 			start_time = get_datetime("{0} {1}".format(start_date.strftime("%Y-%m-%d"), start_time))
 			end_time = get_datetime("{0} {1}".format(start_date.strftime("%Y-%m-%d"), end_time))
 			hours_count[key] = get_hours_count(start_time, end_time)
@@ -47,49 +49,57 @@
 
 	return data, time_slot_wise_total_count
 
+
 def get_hours_count(start_time, end_time):
-	data = frappe.db.sql(""" select count(*) from `tabIssue` where creation
-		between %(start_time)s and %(end_time)s""", {
-			'start_time': start_time,
-			'end_time': end_time
-		}, as_list=1) or []
+	data = (
+		frappe.db.sql(
+			""" select count(*) from `tabIssue` where creation
+		between %(start_time)s and %(end_time)s""",
+			{"start_time": start_time, "end_time": end_time},
+			as_list=1,
+		)
+		or []
+	)
 
 	return data[0][0] if len(data) > 0 else 0
 
-def get_columns():
-	columns = [{
-		"fieldname": "date",
-		"label": _("Date"),
-		"fieldtype": "Date",
-		"width": 100
-	}]
 
-	for label in ['12AM - 3AM', '3AM - 6AM', '6AM - 9AM',
-		'9AM - 12PM', '12PM - 3PM', '3PM - 6PM', '6PM - 9PM', '9PM - 12AM']:
-		columns.append({
-			"fieldname": label,
-			"label": _(label),
-			"fieldtype": "Data",
-			"width": 120
-		})
+def get_columns():
+	columns = [{"fieldname": "date", "label": _("Date"), "fieldtype": "Date", "width": 100}]
+
+	for label in [
+		"12AM - 3AM",
+		"3AM - 6AM",
+		"6AM - 9AM",
+		"9AM - 12PM",
+		"12PM - 3PM",
+		"3PM - 6PM",
+		"6PM - 9PM",
+		"9PM - 12AM",
+	]:
+		columns.append({"fieldname": label, "label": _(label), "fieldtype": "Data", "width": 120})
 
 	return columns
 
+
 def get_chart_data(timeslot_wise_count):
 	total_count = []
-	timeslots = ['12AM - 3AM', '3AM - 6AM', '6AM - 9AM',
-		'9AM - 12PM', '12PM - 3PM', '3PM - 6PM', '6PM - 9PM', '9PM - 12AM']
+	timeslots = [
+		"12AM - 3AM",
+		"3AM - 6AM",
+		"6AM - 9AM",
+		"9AM - 12PM",
+		"12PM - 3PM",
+		"3PM - 6PM",
+		"6PM - 9PM",
+		"9PM - 12AM",
+	]
 
 	datasets = []
 	for data in timeslots:
 		total_count.append(timeslot_wise_count.get(data, 0))
-	datasets.append({'values': total_count})
+	datasets.append({"values": total_count})
 
-	chart = {
-		"data": {
-			'labels': timeslots,
-			'datasets': datasets
-		}
-	}
+	chart = {"data": {"labels": timeslots, "datasets": datasets}}
 	chart["type"] = "line"
 	return chart
diff --git a/erpnext/telephony/doctype/call_log/call_log.py b/erpnext/telephony/doctype/call_log/call_log.py
index 0c24484..1c88883 100644
--- a/erpnext/telephony/doctype/call_log/call_log.py
+++ b/erpnext/telephony/doctype/call_log/call_log.py
@@ -11,8 +11,8 @@
 from erpnext.crm.doctype.lead.lead import get_lead_with_phone_number
 from erpnext.crm.doctype.utils import get_scheduled_employees_for_popup, strip_number
 
-END_CALL_STATUSES = ['No Answer', 'Completed', 'Busy', 'Failed']
-ONGOING_CALL_STATUSES = ['Ringing', 'In Progress']
+END_CALL_STATUSES = ["No Answer", "Completed", "Busy", "Failed"]
+ONGOING_CALL_STATUSES = ["Ringing", "In Progress"]
 
 
 class CallLog(Document):
@@ -20,18 +20,17 @@
 		deduplicate_dynamic_links(self)
 
 	def before_insert(self):
-		"""Add lead(third party person) links to the document.
-		"""
-		lead_number = self.get('from') if self.is_incoming_call() else self.get('to')
+		"""Add lead(third party person) links to the document."""
+		lead_number = self.get("from") if self.is_incoming_call() else self.get("to")
 		lead_number = strip_number(lead_number)
 
 		contact = get_contact_with_phone_number(strip_number(lead_number))
 		if contact:
-			self.add_link(link_type='Contact', link_name=contact)
+			self.add_link(link_type="Contact", link_name=contact)
 
 		lead = get_lead_with_phone_number(lead_number)
 		if lead:
-			self.add_link(link_type='Lead', link_name=lead)
+			self.add_link(link_type="Lead", link_name=lead)
 
 	def after_insert(self):
 		self.trigger_call_popup()
@@ -39,29 +38,29 @@
 	def on_update(self):
 		def _is_call_missed(doc_before_save, doc_after_save):
 			# FIXME: This works for Exotel but not for all telepony providers
-			return doc_before_save.to != doc_after_save.to and doc_after_save.status not in END_CALL_STATUSES
+			return (
+				doc_before_save.to != doc_after_save.to and doc_after_save.status not in END_CALL_STATUSES
+			)
 
 		def _is_call_ended(doc_before_save, doc_after_save):
 			return doc_before_save.status not in END_CALL_STATUSES and self.status in END_CALL_STATUSES
 
 		doc_before_save = self.get_doc_before_save()
-		if not doc_before_save: return
+		if not doc_before_save:
+			return
 
 		if _is_call_missed(doc_before_save, self):
-			frappe.publish_realtime('call_{id}_missed'.format(id=self.id), self)
+			frappe.publish_realtime("call_{id}_missed".format(id=self.id), self)
 			self.trigger_call_popup()
 
 		if _is_call_ended(doc_before_save, self):
-			frappe.publish_realtime('call_{id}_ended'.format(id=self.id), self)
+			frappe.publish_realtime("call_{id}_ended".format(id=self.id), self)
 
 	def is_incoming_call(self):
-		return self.type == 'Incoming'
+		return self.type == "Incoming"
 
 	def add_link(self, link_type, link_name):
-		self.append('links', {
-			'link_doctype': link_type,
-			'link_name': link_name
-		})
+		self.append("links", {"link_doctype": link_type, "link_name": link_name})
 
 	def trigger_call_popup(self):
 		if self.is_incoming_call():
@@ -72,53 +71,63 @@
 			emails = set(scheduled_employees).intersection(employee_emails)
 
 			if frappe.conf.developer_mode:
-				self.add_comment(text=f"""
+				self.add_comment(
+					text=f"""
 					Scheduled Employees: {scheduled_employees}
 					Matching Employee: {employee_emails}
 					Show Popup To: {emails}
-				""")
+				"""
+				)
 
 			if employee_emails and not emails:
 				self.add_comment(text=_("No employee was scheduled for call popup"))
 
 			for email in emails:
-				frappe.publish_realtime('show_call_popup', self, user=email)
+				frappe.publish_realtime("show_call_popup", self, user=email)
 
 
 @frappe.whitelist()
 def add_call_summary(call_log, summary):
-	doc = frappe.get_doc('Call Log', call_log)
-	doc.add_comment('Comment', frappe.bold(_('Call Summary')) + '<br><br>' + summary)
+	doc = frappe.get_doc("Call Log", call_log)
+	doc.add_comment("Comment", frappe.bold(_("Call Summary")) + "<br><br>" + summary)
+
 
 def get_employees_with_number(number):
 	number = strip_number(number)
-	if not number: return []
+	if not number:
+		return []
 
-	employee_emails = frappe.cache().hget('employees_with_number', number)
-	if employee_emails: return employee_emails
+	employee_emails = frappe.cache().hget("employees_with_number", number)
+	if employee_emails:
+		return employee_emails
 
-	employees = frappe.get_all('Employee', filters={
-		'cell_number': ['like', '%{}%'.format(number)],
-		'user_id': ['!=', '']
-	}, fields=['user_id'])
+	employees = frappe.get_all(
+		"Employee",
+		filters={"cell_number": ["like", "%{}%".format(number)], "user_id": ["!=", ""]},
+		fields=["user_id"],
+	)
 
 	employee_emails = [employee.user_id for employee in employees]
-	frappe.cache().hset('employees_with_number', number, employee_emails)
+	frappe.cache().hset("employees_with_number", number, employee_emails)
 
 	return employee_emails
 
+
 def link_existing_conversations(doc, state):
 	"""
 	Called from hooks on creation of Contact or Lead to link all the existing conversations.
 	"""
-	if doc.doctype != 'Contact': return
+	if doc.doctype != "Contact":
+		return
 	try:
 		numbers = [d.phone for d in doc.phone_nos]
 
 		for number in numbers:
 			number = strip_number(number)
-			if not number: continue
-			logs = frappe.db.sql_list("""
+			if not number:
+				continue
+			logs = frappe.db.sql_list(
+				"""
 				SELECT cl.name FROM `tabCall Log` cl
 				LEFT JOIN `tabDynamic Link` dl
 				ON cl.name = dl.parent
@@ -131,44 +140,42 @@
 						ELSE 0
 					END
 				)=0
-			""", dict(
-				phone_number='%{}'.format(number),
-				docname=doc.name,
-				doctype = doc.doctype
-				)
+			""",
+				dict(phone_number="%{}".format(number), docname=doc.name, doctype=doc.doctype),
 			)
 
 			for log in logs:
-				call_log = frappe.get_doc('Call Log', log)
+				call_log = frappe.get_doc("Call Log", log)
 				call_log.add_link(link_type=doc.doctype, link_name=doc.name)
 				call_log.save(ignore_permissions=True)
 			frappe.db.commit()
 	except Exception:
-		frappe.log_error(title=_('Error during caller information update'))
+		frappe.log_error(title=_("Error during caller information update"))
+
 
 def get_linked_call_logs(doctype, docname):
 	# content will be shown in timeline
-	logs = frappe.get_all('Dynamic Link', fields=['parent'], filters={
-		'parenttype': 'Call Log',
-		'link_doctype': doctype,
-		'link_name': docname
-	})
+	logs = frappe.get_all(
+		"Dynamic Link",
+		fields=["parent"],
+		filters={"parenttype": "Call Log", "link_doctype": doctype, "link_name": docname},
+	)
 
 	logs = set([log.parent for log in logs])
 
-	logs = frappe.get_all('Call Log', fields=['*'], filters={
-		'name': ['in', logs]
-	})
+	logs = frappe.get_all("Call Log", fields=["*"], filters={"name": ["in", logs]})
 
 	timeline_contents = []
 	for log in logs:
 		log.show_call_button = 0
-		timeline_contents.append({
-			'icon': 'call',
-			'is_card': True,
-			'creation': log.creation,
-			'template': 'call_link',
-			'template_data': log
-		})
+		timeline_contents.append(
+			{
+				"icon": "call",
+				"is_card": True,
+				"creation": log.creation,
+				"template": "call_link",
+				"template_data": log,
+			}
+		)
 
 	return timeline_contents
diff --git a/erpnext/telephony/doctype/incoming_call_settings/incoming_call_settings.py b/erpnext/telephony/doctype/incoming_call_settings/incoming_call_settings.py
index 08e244d..5edf81d 100644
--- a/erpnext/telephony/doctype/incoming_call_settings/incoming_call_settings.py
+++ b/erpnext/telephony/doctype/incoming_call_settings/incoming_call_settings.py
@@ -20,35 +20,38 @@
 		self.validate_call_schedule_overlaps(self.call_handling_schedule)
 
 	def validate_call_schedule_timeslot(self, schedule: list):
-		"""	Make sure that to time slot is ahead of from time slot.
-		"""
+		"""Make sure that to time slot is ahead of from time slot."""
 		errors = []
 		for record in schedule:
 			from_time = self.time_to_seconds(record.from_time)
 			to_time = self.time_to_seconds(record.to_time)
 			if from_time >= to_time:
 				errors.append(
-					_('Call Schedule Row {0}: To time slot should always be ahead of From time slot.').format(record.idx)
+					_("Call Schedule Row {0}: To time slot should always be ahead of From time slot.").format(
+						record.idx
+					)
 				)
 
 		if errors:
-			frappe.throw('<br/>'.join(errors))
+			frappe.throw("<br/>".join(errors))
 
 	def validate_call_schedule_overlaps(self, schedule: list):
-		"""Check if any time slots are overlapped in a day schedule.
-		"""
+		"""Check if any time slots are overlapped in a day schedule."""
 		week_days = set([each.day_of_week for each in schedule])
 
 		for day in week_days:
-			timeslots = [(record.from_time, record.to_time) for record in schedule if record.day_of_week==day]
+			timeslots = [
+				(record.from_time, record.to_time) for record in schedule if record.day_of_week == day
+			]
 
 			# convert time in timeslot into an integer represents number of seconds
 			timeslots = sorted(map(lambda seq: tuple(map(self.time_to_seconds, seq)), timeslots))
-			if len(timeslots) < 2: continue
+			if len(timeslots) < 2:
+				continue
 
 			for i in range(1, len(timeslots)):
-				if self.check_timeslots_overlap(timeslots[i-1], timeslots[i]):
-					frappe.throw(_('Please fix overlapping time slots for {0}.').format(day))
+				if self.check_timeslots_overlap(timeslots[i - 1], timeslots[i]):
+					frappe.throw(_("Please fix overlapping time slots for {0}.").format(day))
 
 	@staticmethod
 	def check_timeslots_overlap(ts1: Tuple[int, int], ts2: Tuple[int, int]) -> bool:
@@ -58,7 +61,6 @@
 
 	@staticmethod
 	def time_to_seconds(time: str) -> int:
-		"""Convert time string of format HH:MM:SS into seconds
-		"""
+		"""Convert time string of format HH:MM:SS into seconds"""
 		date_time = datetime.strptime(time, "%H:%M:%S")
 		return date_time - datetime(1900, 1, 1)
diff --git a/erpnext/templates/pages/courses.py b/erpnext/templates/pages/courses.py
index 6051e60..fb1af38 100644
--- a/erpnext/templates/pages/courses.py
+++ b/erpnext/templates/pages/courses.py
@@ -6,13 +6,13 @@
 
 
 def get_context(context):
-	course = frappe.get_doc('Course', frappe.form_dict.course)
+	course = frappe.get_doc("Course", frappe.form_dict.course)
 	sidebar_title = course.name
 
 	context.no_cache = 1
 	context.show_sidebar = True
-	course = frappe.get_doc('Course', frappe.form_dict.course)
-	course.has_permission('read')
+	course = frappe.get_doc("Course", frappe.form_dict.course)
+	course.has_permission("read")
 	context.doc = course
 	context.sidebar_title = sidebar_title
 	context.intro = course.course_intro
diff --git a/erpnext/templates/pages/help.py b/erpnext/templates/pages/help.py
index 6a83fc8..19993ee 100644
--- a/erpnext/templates/pages/help.py
+++ b/erpnext/templates/pages/help.py
@@ -25,21 +25,19 @@
 	else:
 		context.issues = []
 
+
 def get_forum_posts(s):
-	response = requests.get(s.forum_url + '/' + s.get_latest_query)
+	response = requests.get(s.forum_url + "/" + s.get_latest_query)
 	response.raise_for_status()
 	response_json = response.json()
 
-	topics_data = {} # it will actually be an array
-	key_list = s.response_key_list.split(',')
+	topics_data = {}  # it will actually be an array
+	key_list = s.response_key_list.split(",")
 	for key in key_list:
 		topics_data = response_json.get(key) if not topics_data else topics_data.get(key)
 
 	for topic in topics_data:
-		topic["link"] = s.forum_url + '/' + s.post_route_string + '/' + str(topic.get(s.post_route_key))
+		topic["link"] = s.forum_url + "/" + s.post_route_string + "/" + str(topic.get(s.post_route_key))
 
-	post_params = {
-		"title": s.post_title_key,
-		"description": s.post_description_key
-	}
+	post_params = {"title": s.post_title_key, "description": s.post_description_key}
 	return topics_data, post_params
diff --git a/erpnext/templates/pages/home.py b/erpnext/templates/pages/home.py
index d08e81b..bca3e56 100644
--- a/erpnext/templates/pages/home.py
+++ b/erpnext/templates/pages/home.py
@@ -6,46 +6,51 @@
 
 no_cache = 1
 
+
 def get_context(context):
-	homepage = frappe.get_doc('Homepage')
+	homepage = frappe.get_doc("Homepage")
 
 	for item in homepage.products:
-		route = frappe.db.get_value('Website Item', {"item_code": item.item_code}, 'route')
+		route = frappe.db.get_value("Website Item", {"item_code": item.item_code}, "route")
 		if route:
-			item.route = '/' + route
+			item.route = "/" + route
 
 	homepage.title = homepage.title or homepage.company
 	context.title = homepage.title
 	context.homepage = homepage
 
-	if homepage.hero_section_based_on == 'Homepage Section' and homepage.hero_section:
-		homepage.hero_section_doc = frappe.get_doc('Homepage Section', homepage.hero_section)
+	if homepage.hero_section_based_on == "Homepage Section" and homepage.hero_section:
+		homepage.hero_section_doc = frappe.get_doc("Homepage Section", homepage.hero_section)
 
 	if homepage.slideshow:
-		doc = frappe.get_doc('Website Slideshow', homepage.slideshow)
+		doc = frappe.get_doc("Website Slideshow", homepage.slideshow)
 		context.slideshow = homepage.slideshow
 		context.slideshow_header = doc.header
 		context.slides = doc.slideshow_items
 
-	context.blogs = frappe.get_all('Blog Post',
-		fields=['title', 'blogger', 'blog_intro', 'route'],
-		filters={
-			'published': 1
-		},
-		order_by='modified desc',
-		limit=3
+	context.blogs = frappe.get_all(
+		"Blog Post",
+		fields=["title", "blogger", "blog_intro", "route"],
+		filters={"published": 1},
+		order_by="modified desc",
+		limit=3,
 	)
 
 	# filter out homepage section which is used as hero section
-	homepage_hero_section = homepage.hero_section_based_on == 'Homepage Section' and homepage.hero_section
-	homepage_sections = frappe.get_all('Homepage Section',
-		filters=[['name', '!=', homepage_hero_section]] if homepage_hero_section else None,
-		order_by='section_order asc'
+	homepage_hero_section = (
+		homepage.hero_section_based_on == "Homepage Section" and homepage.hero_section
 	)
-	context.homepage_sections = [frappe.get_doc('Homepage Section', name) for name in homepage_sections]
+	homepage_sections = frappe.get_all(
+		"Homepage Section",
+		filters=[["name", "!=", homepage_hero_section]] if homepage_hero_section else None,
+		order_by="section_order asc",
+	)
+	context.homepage_sections = [
+		frappe.get_doc("Homepage Section", name) for name in homepage_sections
+	]
 
 	context.metatags = context.metatags or frappe._dict({})
 	context.metatags.image = homepage.hero_image or None
 	context.metatags.description = homepage.description or None
 
-	context.explore_link = '/all-products'
+	context.explore_link = "/all-products"
diff --git a/erpnext/templates/pages/integrations/gocardless_checkout.py b/erpnext/templates/pages/integrations/gocardless_checkout.py
index bbdbf1d..280f67f 100644
--- a/erpnext/templates/pages/integrations/gocardless_checkout.py
+++ b/erpnext/templates/pages/integrations/gocardless_checkout.py
@@ -14,8 +14,18 @@
 
 no_cache = 1
 
-expected_keys = ('amount', 'title', 'description', 'reference_doctype', 'reference_docname',
-	'payer_name', 'payer_email', 'order_id', 'currency')
+expected_keys = (
+	"amount",
+	"title",
+	"description",
+	"reference_doctype",
+	"reference_docname",
+	"payer_name",
+	"payer_email",
+	"order_id",
+	"currency",
+)
+
 
 def get_context(context):
 	context.no_cache = 1
@@ -25,17 +35,22 @@
 		for key in expected_keys:
 			context[key] = frappe.form_dict[key]
 
-		context['amount'] = flt(context['amount'])
+		context["amount"] = flt(context["amount"])
 
 		gateway_controller = get_gateway_controller(context.reference_docname)
-		context['header_img'] = frappe.db.get_value("GoCardless Settings", gateway_controller, "header_img")
+		context["header_img"] = frappe.db.get_value(
+			"GoCardless Settings", gateway_controller, "header_img"
+		)
 
 	else:
-		frappe.redirect_to_message(_('Some information is missing'),
-			_('Looks like someone sent you to an incomplete URL. Please ask them to look into it.'))
+		frappe.redirect_to_message(
+			_("Some information is missing"),
+			_("Looks like someone sent you to an incomplete URL. Please ask them to look into it."),
+		)
 		frappe.local.flags.redirect_location = frappe.local.response.location
 		raise frappe.Redirect
 
+
 @frappe.whitelist(allow_guest=True)
 def check_mandate(data, reference_doctype, reference_docname):
 	data = json.loads(data)
@@ -59,23 +74,27 @@
 			prefilled_customer.update({"email": frappe.session.user})
 
 	else:
-		prefilled_customer = {
-			"company_name": payer.name,
-			"email": frappe.session.user
-		}
+		prefilled_customer = {"company_name": payer.name, "email": frappe.session.user}
 
-	success_url = get_url("./integrations/gocardless_confirmation?reference_doctype=" + reference_doctype + "&reference_docname=" + reference_docname)
+	success_url = get_url(
+		"./integrations/gocardless_confirmation?reference_doctype="
+		+ reference_doctype
+		+ "&reference_docname="
+		+ reference_docname
+	)
 
 	try:
-		redirect_flow = client.redirect_flows.create(params={
-							"description": _("Pay {0} {1}").format(data['amount'], data['currency']),
-							"session_token": frappe.session.user,
-							"success_redirect_url": success_url,
-							"prefilled_customer": prefilled_customer
-						})
+		redirect_flow = client.redirect_flows.create(
+			params={
+				"description": _("Pay {0} {1}").format(data["amount"], data["currency"]),
+				"session_token": frappe.session.user,
+				"success_redirect_url": success_url,
+				"prefilled_customer": prefilled_customer,
+			}
+		)
 
 		return {"redirect_to": redirect_flow.redirect_url}
 
 	except Exception as e:
 		frappe.log_error(e, "GoCardless Payment Error")
-		return {"redirect_to": '/integrations/payment-failed'}
+		return {"redirect_to": "/integrations/payment-failed"}
diff --git a/erpnext/templates/pages/integrations/gocardless_confirmation.py b/erpnext/templates/pages/integrations/gocardless_confirmation.py
index a6c3e71..cab532a 100644
--- a/erpnext/templates/pages/integrations/gocardless_confirmation.py
+++ b/erpnext/templates/pages/integrations/gocardless_confirmation.py
@@ -11,7 +11,8 @@
 
 no_cache = 1
 
-expected_keys = ('redirect_flow_id', 'reference_doctype', 'reference_docname')
+expected_keys = ("redirect_flow_id", "reference_doctype", "reference_docname")
+
 
 def get_context(context):
 	context.no_cache = 1
@@ -22,11 +23,14 @@
 			context[key] = frappe.form_dict[key]
 
 	else:
-		frappe.redirect_to_message(_('Some information is missing'),
-			_('Looks like someone sent you to an incomplete URL. Please ask them to look into it.'))
+		frappe.redirect_to_message(
+			_("Some information is missing"),
+			_("Looks like someone sent you to an incomplete URL. Please ask them to look into it."),
+		)
 		frappe.local.flags.redirect_location = frappe.local.response.location
 		raise frappe.Redirect
 
+
 @frappe.whitelist(allow_guest=True)
 def confirm_payment(redirect_flow_id, reference_doctype, reference_docname):
 
@@ -34,15 +38,15 @@
 
 	try:
 		redirect_flow = client.redirect_flows.complete(
-			redirect_flow_id,
-			params={
-				"session_token": frappe.session.user
-		})
+			redirect_flow_id, params={"session_token": frappe.session.user}
+		)
 
 		confirmation_url = redirect_flow.confirmation_url
-		gocardless_success_page = frappe.get_hooks('gocardless_success_page')
+		gocardless_success_page = frappe.get_hooks("gocardless_success_page")
 		if gocardless_success_page:
-			confirmation_url = frappe.get_attr(gocardless_success_page[-1])(reference_doctype, reference_docname)
+			confirmation_url = frappe.get_attr(gocardless_success_page[-1])(
+				reference_doctype, reference_docname
+			)
 
 		data = {
 			"mandate": redirect_flow.links.mandate,
@@ -50,7 +54,7 @@
 			"redirect_to": confirmation_url,
 			"redirect_message": "Mandate successfully created",
 			"reference_doctype": reference_doctype,
-			"reference_docname": reference_docname
+			"reference_docname": reference_docname,
 		}
 
 		try:
@@ -65,29 +69,38 @@
 
 	except Exception as e:
 		frappe.log_error(e, "GoCardless Payment Error")
-		return {"redirect_to": '/integrations/payment-failed'}
+		return {"redirect_to": "/integrations/payment-failed"}
 
 
 def create_mandate(data):
 	data = frappe._dict(data)
 	frappe.logger().debug(data)
 
-	mandate = data.get('mandate')
+	mandate = data.get("mandate")
 
 	if frappe.db.exists("GoCardless Mandate", mandate):
 		return
 
 	else:
-		reference_doc = frappe.db.get_value(data.get('reference_doctype'), data.get('reference_docname'), ["reference_doctype", "reference_name"], as_dict=1)
-		erpnext_customer = frappe.db.get_value(reference_doc.reference_doctype, reference_doc.reference_name, ["customer_name"], as_dict=1)
+		reference_doc = frappe.db.get_value(
+			data.get("reference_doctype"),
+			data.get("reference_docname"),
+			["reference_doctype", "reference_name"],
+			as_dict=1,
+		)
+		erpnext_customer = frappe.db.get_value(
+			reference_doc.reference_doctype, reference_doc.reference_name, ["customer_name"], as_dict=1
+		)
 
 		try:
-			frappe.get_doc({
-			"doctype": "GoCardless Mandate",
-			"mandate": mandate,
-			"customer": erpnext_customer.customer_name,
-			"gocardless_customer": data.get('customer')
-			}).insert(ignore_permissions=True)
+			frappe.get_doc(
+				{
+					"doctype": "GoCardless Mandate",
+					"mandate": mandate,
+					"customer": erpnext_customer.customer_name,
+					"gocardless_customer": data.get("customer"),
+				}
+			).insert(ignore_permissions=True)
 
 		except Exception:
 			frappe.log_error(frappe.get_traceback())
diff --git a/erpnext/templates/pages/material_request_info.py b/erpnext/templates/pages/material_request_info.py
index 65d4427..301ca01 100644
--- a/erpnext/templates/pages/material_request_info.py
+++ b/erpnext/templates/pages/material_request_info.py
@@ -20,17 +20,23 @@
 	if not frappe.has_website_permission(context.doc):
 		frappe.throw(_("Not Permitted"), frappe.PermissionError)
 
-	default_print_format = frappe.db.get_value('Property Setter', dict(property='default_print_format', doc_type=frappe.form_dict.doctype), "value")
+	default_print_format = frappe.db.get_value(
+		"Property Setter",
+		dict(property="default_print_format", doc_type=frappe.form_dict.doctype),
+		"value",
+	)
 	if default_print_format:
 		context.print_format = default_print_format
 	else:
 		context.print_format = "Standard"
 	context.doc.items = get_more_items_info(context.doc.items, context.doc.name)
 
+
 def get_more_items_info(items, material_request):
 	for item in items:
-		item.customer_provided = frappe.get_value('Item', item.item_code, 'is_customer_provided_item')
-		item.work_orders = frappe.db.sql("""
+		item.customer_provided = frappe.get_value("Item", item.item_code, "is_customer_provided_item")
+		item.work_orders = frappe.db.sql(
+			"""
 			select
 				wo.name, wo.status, wo_item.consumed_qty
 			from
@@ -41,9 +47,16 @@
 				and wo_item.parent=wo.name
 				and wo.status not in ('Completed', 'Cancelled', 'Stopped')
 			order by
-				wo.name asc""", item.item_code, as_dict=1)
-		item.delivered_qty = flt(frappe.db.sql("""select sum(transfer_qty)
+				wo.name asc""",
+			item.item_code,
+			as_dict=1,
+		)
+		item.delivered_qty = flt(
+			frappe.db.sql(
+				"""select sum(transfer_qty)
 						from `tabStock Entry Detail` where material_request = %s
 						and item_code = %s and docstatus = 1""",
-						(material_request, item.item_code))[0][0])
+				(material_request, item.item_code),
+			)[0][0]
+		)
 	return items
diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py
index 712b141..3e6d57a 100644
--- a/erpnext/templates/pages/order.py
+++ b/erpnext/templates/pages/order.py
@@ -19,12 +19,17 @@
 
 	context.parents = frappe.form_dict.parents
 	context.title = frappe.form_dict.name
-	context.payment_ref = frappe.db.get_value("Payment Request",
-		{"reference_name": frappe.form_dict.name}, "name")
+	context.payment_ref = frappe.db.get_value(
+		"Payment Request", {"reference_name": frappe.form_dict.name}, "name"
+	)
 
 	context.enabled_checkout = frappe.get_doc("E Commerce Settings").enable_checkout
 
-	default_print_format = frappe.db.get_value('Property Setter', dict(property='default_print_format', doc_type=frappe.form_dict.doctype), "value")
+	default_print_format = frappe.db.get_value(
+		"Property Setter",
+		dict(property="default_print_format", doc_type=frappe.form_dict.doctype),
+		"value",
+	)
 	if default_print_format:
 		context.print_format = default_print_format
 	else:
@@ -34,15 +39,23 @@
 		frappe.throw(_("Not Permitted"), frappe.PermissionError)
 
 	# check for the loyalty program of the customer
-	customer_loyalty_program = frappe.db.get_value("Customer", context.doc.customer, "loyalty_program")
+	customer_loyalty_program = frappe.db.get_value(
+		"Customer", context.doc.customer, "loyalty_program"
+	)
 	if customer_loyalty_program:
 		from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
 			get_loyalty_program_details_with_points,
 		)
-		loyalty_program_details = get_loyalty_program_details_with_points(context.doc.customer, customer_loyalty_program)
+
+		loyalty_program_details = get_loyalty_program_details_with_points(
+			context.doc.customer, customer_loyalty_program
+		)
 		context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points"))
 
+
 def get_attachments(dt, dn):
-        return frappe.get_all("File",
-			fields=["name", "file_name", "file_url", "is_private"],
-			filters = {"attached_to_name": dn, "attached_to_doctype": dt, "is_private":0})
+	return frappe.get_all(
+		"File",
+		fields=["name", "file_name", "file_url", "is_private"],
+		filters={"attached_to_name": dn, "attached_to_doctype": dt, "is_private": 0},
+	)
diff --git a/erpnext/templates/pages/partners.py b/erpnext/templates/pages/partners.py
index e4043ea..8a49504 100644
--- a/erpnext/templates/pages/partners.py
+++ b/erpnext/templates/pages/partners.py
@@ -6,11 +6,12 @@
 
 page_title = "Partners"
 
-def get_context(context):
-	partners = frappe.db.sql("""select * from `tabSales Partner`
-			where show_in_website=1 order by name asc""", as_dict=True)
 
-	return {
-		"partners": partners,
-		"title": page_title
-	}
+def get_context(context):
+	partners = frappe.db.sql(
+		"""select * from `tabSales Partner`
+			where show_in_website=1 order by name asc""",
+		as_dict=True,
+	)
+
+	return {"partners": partners, "title": page_title}
diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py
index 237adf9..77a749e 100644
--- a/erpnext/templates/pages/product_search.py
+++ b/erpnext/templates/pages/product_search.py
@@ -17,9 +17,11 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	context.show_search = True
 
+
 @frappe.whitelist(allow_guest=True)
 def get_product_list(search=None, start=0, limit=12):
 	data = get_product_data(search, start, limit)
@@ -29,6 +31,7 @@
 
 	return [get_item_for_list_in_html(r) for r in data]
 
+
 def get_product_data(search=None, start=0, limit=12):
 	# limit = 12 because we show 12 items in the grid view
 	# base query
@@ -53,7 +56,8 @@
 	# order by
 	query += """ ORDER BY ranking desc, modified desc limit %s, %s""" % (cint(start), cint(limit))
 
-	return frappe.db.sql(query, {"search": search}, as_dict=1) # nosemgrep
+	return frappe.db.sql(query, {"search": search}, as_dict=1)  # nosemgrep
+
 
 @frappe.whitelist(allow_guest=True)
 def search(query):
@@ -62,9 +66,10 @@
 
 	return {
 		"product_results": product_results.get("results") or [],
-		"category_results": category_results.get("results") or []
+		"category_results": category_results.get("results") or [],
 	}
 
+
 @frappe.whitelist(allow_guest=True)
 def product_search(query, limit=10, fuzzy_search=True):
 	search_results = {"from_redisearch": True, "results": []}
@@ -84,9 +89,7 @@
 	ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=red)
 	client = Client(make_key(WEBSITE_ITEM_INDEX), conn=red)
 	suggestions = ac.get_suggestions(
-		query,
-		num=limit,
-		fuzzy= fuzzy_search and len(query) > 3 # Fuzzy on length < 3 can be real slow
+		query, num=limit, fuzzy=fuzzy_search and len(query) > 3  # Fuzzy on length < 3 can be real slow
 	)
 
 	# Build a query
@@ -98,17 +101,22 @@
 	q = Query(query_string)
 
 	results = client.search(q)
-	search_results['results'] = list(map(convert_to_dict, results.docs))
-	search_results['results'] = sorted(search_results['results'], key=lambda k: frappe.utils.cint(k['ranking']), reverse=True)
+	search_results["results"] = list(map(convert_to_dict, results.docs))
+	search_results["results"] = sorted(
+		search_results["results"], key=lambda k: frappe.utils.cint(k["ranking"]), reverse=True
+	)
 
 	return search_results
 
+
 def clean_up_query(query):
-	return ''.join(c for c in query if c.isalnum() or c.isspace())
+	return "".join(c for c in query if c.isalnum() or c.isspace())
+
 
 def convert_to_dict(redis_search_doc):
 	return redis_search_doc.__dict__
 
+
 @frappe.whitelist(allow_guest=True)
 def get_category_suggestions(query):
 	search_results = {"results": []}
@@ -117,13 +125,10 @@
 		# Redisearch module not loaded, query db
 		categories = frappe.db.get_all(
 			"Item Group",
-			filters={
-				"name": ["like", "%{0}%".format(query)],
-				"show_in_website": 1
-			},
-			fields=["name", "route"]
+			filters={"name": ["like", "%{0}%".format(query)], "show_in_website": 1},
+			fields=["name", "route"],
 		)
-		search_results['results'] = categories
+		search_results["results"] = categories
 		return search_results
 
 	if not query:
@@ -132,6 +137,6 @@
 	ac = AutoCompleter(make_key(WEBSITE_ITEM_CATEGORY_AUTOCOMPLETE), conn=frappe.cache())
 	suggestions = ac.get_suggestions(query, num=10)
 
-	search_results['results'] = [s.string for s in suggestions]
+	search_results["results"] = [s.string for s in suggestions]
 
-	return search_results
\ No newline at end of file
+	return search_results
diff --git a/erpnext/templates/pages/projects.py b/erpnext/templates/pages/projects.py
index 16aa439..4b3089b 100644
--- a/erpnext/templates/pages/projects.py
+++ b/erpnext/templates/pages/projects.py
@@ -6,21 +6,28 @@
 
 
 def get_context(context):
-	project_user = frappe.db.get_value("Project User", {"parent": frappe.form_dict.project, "user": frappe.session.user} , ["user", "view_attachments"], as_dict= True)
-	if frappe.session.user != 'Administrator' and (not project_user or frappe.session.user == 'Guest'):
+	project_user = frappe.db.get_value(
+		"Project User",
+		{"parent": frappe.form_dict.project, "user": frappe.session.user},
+		["user", "view_attachments"],
+		as_dict=True,
+	)
+	if frappe.session.user != "Administrator" and (
+		not project_user or frappe.session.user == "Guest"
+	):
 		raise frappe.PermissionError
 
 	context.no_cache = 1
 	context.show_sidebar = True
-	project = frappe.get_doc('Project', frappe.form_dict.project)
+	project = frappe.get_doc("Project", frappe.form_dict.project)
 
-	project.has_permission('read')
+	project.has_permission("read")
 
-	project.tasks = get_tasks(project.name, start=0, item_status='open',
-		search=frappe.form_dict.get("search"))
+	project.tasks = get_tasks(
+		project.name, start=0, item_status="open", search=frappe.form_dict.get("search")
+	)
 
-	project.timesheets = get_timesheets(project.name, start=0,
-		search=frappe.form_dict.get("search"))
+	project.timesheets = get_timesheets(project.name, start=0, search=frappe.form_dict.get("search"))
 
 	if project_user and project_user.view_attachments:
 		project.attachments = get_attachments(project.name)
@@ -32,9 +39,22 @@
 	filters = {"project": project}
 	if search:
 		filters["subject"] = ("like", "%{0}%".format(search))
-	tasks = frappe.get_all("Task", filters=filters,
-		fields=["name", "subject", "status", "modified", "_assign", "exp_end_date", "is_group", "parent_task"],
-		limit_start=start, limit_page_length=10)
+	tasks = frappe.get_all(
+		"Task",
+		filters=filters,
+		fields=[
+			"name",
+			"subject",
+			"status",
+			"modified",
+			"_assign",
+			"exp_end_date",
+			"is_group",
+			"parent_task",
+		],
+		limit_start=start,
+		limit_page_length=10,
+	)
 	task_nest = []
 	for task in tasks:
 		if task.is_group:
@@ -44,36 +64,59 @@
 		task_nest.append(task)
 	return list(filter(lambda x: not x.parent_task, tasks))
 
+
 @frappe.whitelist()
 def get_task_html(project, start=0, item_status=None):
-	return frappe.render_template("erpnext/templates/includes/projects/project_tasks.html",
-		{"doc": {
-			"name": project,
-			"project_name": project,
-			"tasks": get_tasks(project, start, item_status=item_status)}
-		}, is_path=True)
+	return frappe.render_template(
+		"erpnext/templates/includes/projects/project_tasks.html",
+		{
+			"doc": {
+				"name": project,
+				"project_name": project,
+				"tasks": get_tasks(project, start, item_status=item_status),
+			}
+		},
+		is_path=True,
+	)
+
 
 def get_timesheets(project, start=0, search=None):
 	filters = {"project": project}
 	if search:
 		filters["activity_type"] = ("like", "%{0}%".format(search))
 
-	timesheets = frappe.get_all('Timesheet Detail', filters=filters,
-	fields=['project','activity_type','from_time','to_time','parent'],
-	limit_start=start, limit_page_length=10)
+	timesheets = frappe.get_all(
+		"Timesheet Detail",
+		filters=filters,
+		fields=["project", "activity_type", "from_time", "to_time", "parent"],
+		limit_start=start,
+		limit_page_length=10,
+	)
 	for timesheet in timesheets:
-		info = frappe.get_all('Timesheet', filters={"name": timesheet.parent},
-			fields=['name','status','modified','modified_by'],
-			limit_start=start, limit_page_length=10)
+		info = frappe.get_all(
+			"Timesheet",
+			filters={"name": timesheet.parent},
+			fields=["name", "status", "modified", "modified_by"],
+			limit_start=start,
+			limit_page_length=10,
+		)
 		if len(info):
 			timesheet.update(info[0])
 	return timesheets
 
+
 @frappe.whitelist()
 def get_timesheet_html(project, start=0):
-	return frappe.render_template("erpnext/templates/includes/projects/project_timesheets.html",
-		{"doc": {"timesheets": get_timesheets(project, start)}}, is_path=True)
+	return frappe.render_template(
+		"erpnext/templates/includes/projects/project_timesheets.html",
+		{"doc": {"timesheets": get_timesheets(project, start)}},
+		is_path=True,
+	)
+
 
 def get_attachments(project):
-	return frappe.get_all('File', filters= {"attached_to_name": project, "attached_to_doctype": 'Project', "is_private":0},
-		fields=['file_name','file_url', 'file_size'])
+	return frappe.get_all(
+		"File",
+		filters={"attached_to_name": project, "attached_to_doctype": "Project", "is_private": 0},
+		fields=["file_name", "file_url", "file_size"],
+	)
diff --git a/erpnext/templates/pages/regional/india/update_gstin.py b/erpnext/templates/pages/regional/india/update_gstin.py
index 95b8f72..6939fe4 100644
--- a/erpnext/templates/pages/regional/india/update_gstin.py
+++ b/erpnext/templates/pages/regional/india/update_gstin.py
@@ -11,12 +11,12 @@
 	except frappe.ValidationError:
 		context.invalid_gstin = 1
 
-	party_type = 'Customer'
-	party_name = frappe.db.get_value('Customer', party)
+	party_type = "Customer"
+	party_name = frappe.db.get_value("Customer", party)
 
 	if not party_name:
-		party_type = 'Supplier'
-		party_name = frappe.db.get_value('Supplier', party)
+		party_type = "Supplier"
+		party_name = frappe.db.get_value("Supplier", party)
 
 	if not party_name:
 		context.not_found = 1
@@ -29,10 +29,10 @@
 def update_gstin(context):
 	dirty = False
 	for key, value in frappe.form_dict.items():
-		if key != 'party':
-			address_name = frappe.get_value('Address', key)
+		if key != "party":
+			address_name = frappe.get_value("Address", key)
 			if address_name:
-				address = frappe.get_doc('Address', address_name)
+				address = frappe.get_doc("Address", address_name)
 				address.gstin = value.upper()
 				address.save(ignore_permissions=True)
 				dirty = True
diff --git a/erpnext/templates/pages/rfq.py b/erpnext/templates/pages/rfq.py
index 0afd46c..4b83642 100644
--- a/erpnext/templates/pages/rfq.py
+++ b/erpnext/templates/pages/rfq.py
@@ -20,40 +20,59 @@
 	update_supplier_details(context)
 	context["title"] = frappe.form_dict.name
 
+
 def get_supplier():
 	doctype = frappe.form_dict.doctype
-	parties_doctype = 'Request for Quotation Supplier' if doctype == 'Request for Quotation' else doctype
+	parties_doctype = (
+		"Request for Quotation Supplier" if doctype == "Request for Quotation" else doctype
+	)
 	customers, suppliers = get_customers_suppliers(parties_doctype, frappe.session.user)
 
-	return suppliers[0] if suppliers else ''
+	return suppliers[0] if suppliers else ""
+
 
 def check_supplier_has_docname_access(supplier):
 	status = True
-	if frappe.form_dict.name not in frappe.db.sql_list("""select parent from `tabRequest for Quotation Supplier`
-		where supplier = %s""", (supplier,)):
+	if frappe.form_dict.name not in frappe.db.sql_list(
+		"""select parent from `tabRequest for Quotation Supplier`
+		where supplier = %s""",
+		(supplier,),
+	):
 		status = False
 	return status
 
+
 def unauthorized_user(supplier):
 	status = check_supplier_has_docname_access(supplier) or False
 	if status == False:
 		frappe.throw(_("Not Permitted"), frappe.PermissionError)
 
+
 def update_supplier_details(context):
 	supplier_doc = frappe.get_doc("Supplier", context.doc.supplier)
-	context.doc.currency = supplier_doc.default_currency or frappe.get_cached_value('Company',  context.doc.company,  "default_currency")
-	context.doc.currency_symbol = frappe.db.get_value("Currency", context.doc.currency, "symbol", cache=True)
-	context.doc.number_format = frappe.db.get_value("Currency", context.doc.currency, "number_format", cache=True)
-	context.doc.buying_price_list = supplier_doc.default_price_list or ''
+	context.doc.currency = supplier_doc.default_currency or frappe.get_cached_value(
+		"Company", context.doc.company, "default_currency"
+	)
+	context.doc.currency_symbol = frappe.db.get_value(
+		"Currency", context.doc.currency, "symbol", cache=True
+	)
+	context.doc.number_format = frappe.db.get_value(
+		"Currency", context.doc.currency, "number_format", cache=True
+	)
+	context.doc.buying_price_list = supplier_doc.default_price_list or ""
+
 
 def get_link_quotation(supplier, rfq):
-	quotation = frappe.db.sql(""" select distinct `tabSupplier Quotation Item`.parent as name,
+	quotation = frappe.db.sql(
+		""" select distinct `tabSupplier Quotation Item`.parent as name,
 		`tabSupplier Quotation`.status, `tabSupplier Quotation`.transaction_date from
 		`tabSupplier Quotation Item`, `tabSupplier Quotation` where `tabSupplier Quotation`.docstatus < 2 and
 		`tabSupplier Quotation Item`.request_for_quotation =%(name)s and
 		`tabSupplier Quotation Item`.parent = `tabSupplier Quotation`.name and
 		`tabSupplier Quotation`.supplier = %(supplier)s order by `tabSupplier Quotation`.creation desc""",
-		{'name': rfq, 'supplier': supplier}, as_dict=1)
+		{"name": rfq, "supplier": supplier},
+		as_dict=1,
+	)
 
 	for data in quotation:
 		data.transaction_date = formatdate(data.transaction_date)
diff --git a/erpnext/templates/pages/search_help.py b/erpnext/templates/pages/search_help.py
index 1ef3942..a6877ce 100644
--- a/erpnext/templates/pages/search_help.py
+++ b/erpnext/templates/pages/search_help.py
@@ -11,17 +11,18 @@
 	context.no_cache = 1
 	if frappe.form_dict.q:
 		query = str(utils.escape(sanitize_html(frappe.form_dict.q)))
-		context.title = _('Help Results for')
+		context.title = _("Help Results for")
 		context.query = query
 
-		context.route = '/search_help'
+		context.route = "/search_help"
 		d = frappe._dict()
 		d.results_sections = get_help_results_sections(query)
 		context.update(d)
 	else:
-		context.title = _('Docs Search')
+		context.title = _("Docs Search")
 
-@frappe.whitelist(allow_guest = True)
+
+@frappe.whitelist(allow_guest=True)
 def get_help_results_sections(text):
 	out = []
 	settings = frappe.get_doc("Support Settings", "Support Settings")
@@ -40,63 +41,72 @@
 
 		if results:
 			# Add section
-			out.append({
-				"title": api.source_name,
-				"results": results
-			})
+			out.append({"title": api.source_name, "results": results})
 
 	return out
 
+
 def get_response(api, text):
-	response = requests.get(api.base_url + '/' + api.query_route, data={
-		api.search_term_param_name: text
-	})
+	response = requests.get(
+		api.base_url + "/" + api.query_route, data={api.search_term_param_name: text}
+	)
 
 	response.raise_for_status()
 	return response.json()
 
+
 def get_topics_data(api, response_json):
 	if not response_json:
 		response_json = {}
-	topics_data = {} # it will actually be an array
-	key_list = api.response_result_key_path.split(',')
+	topics_data = {}  # it will actually be an array
+	key_list = api.response_result_key_path.split(",")
 
 	for key in key_list:
 		topics_data = response_json.get(key) if not topics_data else topics_data.get(key)
 
 	return topics_data or []
 
+
 def prepare_api_results(api, topics_data):
 	if not topics_data:
 		topics_data = []
 
 	results = []
 	for topic in topics_data:
-		route = api.base_url + '/' + (api.post_route  + '/' if api.post_route else "")
-		for key in api.post_route_key_list.split(','):
+		route = api.base_url + "/" + (api.post_route + "/" if api.post_route else "")
+		for key in api.post_route_key_list.split(","):
 			route += str(topic[key])
 
-		results.append(frappe._dict({
-			'title': topic[api.post_title_key],
-			'preview': html2text(topic[api.post_description_key]),
-			'route': route
-		}))
+		results.append(
+			frappe._dict(
+				{
+					"title": topic[api.post_title_key],
+					"preview": html2text(topic[api.post_description_key]),
+					"route": route,
+				}
+			)
+		)
 	return results[:5]
 
+
 def prepare_doctype_results(api, raw):
 	results = []
 	for r in raw:
 		prepared_result = {}
-		parts = r["content"].split(' ||| ')
+		parts = r["content"].split(" ||| ")
 
 		for part in parts:
-			pair = part.split(' : ', 1)
+			pair = part.split(" : ", 1)
 			prepared_result[pair[0]] = pair[1]
 
-		results.append(frappe._dict({
-			'title': prepared_result[api.result_title_field],
-			'preview': prepared_result[api.result_preview_field],
-			'route': prepared_result[api.result_route_field]
-		}))
+		results.append(
+			frappe._dict(
+				{
+					"title": prepared_result[api.result_title_field],
+					"preview": prepared_result[api.result_preview_field],
+					"route": prepared_result[api.result_route_field],
+				}
+			)
+		)
 
 	return results
diff --git a/erpnext/templates/pages/task_info.py b/erpnext/templates/pages/task_info.py
index d1a70e1..66b775a 100644
--- a/erpnext/templates/pages/task_info.py
+++ b/erpnext/templates/pages/task_info.py
@@ -4,9 +4,12 @@
 def get_context(context):
 	context.no_cache = 1
 
-	task = frappe.get_doc('Task', frappe.form_dict.task)
+	task = frappe.get_doc("Task", frappe.form_dict.task)
 
-	context.comments = frappe.get_all('Communication', filters={'reference_name': task.name, 'comment_type': 'comment'},
-	fields=['subject', 'sender_full_name', 'communication_date'])
+	context.comments = frappe.get_all(
+		"Communication",
+		filters={"reference_name": task.name, "comment_type": "comment"},
+		fields=["subject", "sender_full_name", "communication_date"],
+	)
 
 	context.doc = task
diff --git a/erpnext/templates/pages/timelog_info.py b/erpnext/templates/pages/timelog_info.py
index db61e7e..3f0ec37 100644
--- a/erpnext/templates/pages/timelog_info.py
+++ b/erpnext/templates/pages/timelog_info.py
@@ -4,6 +4,6 @@
 def get_context(context):
 	context.no_cache = 1
 
-	timelog = frappe.get_doc('Time Log', frappe.form_dict.timelog)
+	timelog = frappe.get_doc("Time Log", frappe.form_dict.timelog)
 
 	context.doc = timelog
diff --git a/erpnext/templates/pages/wishlist.py b/erpnext/templates/pages/wishlist.py
index 72ee34e..d70f27c 100644
--- a/erpnext/templates/pages/wishlist.py
+++ b/erpnext/templates/pages/wishlist.py
@@ -23,31 +23,33 @@
 	context.settings = settings
 	context.no_cache = 1
 
+
 def get_stock_availability(item_code, warehouse):
 	stock_qty = frappe.utils.flt(
-		frappe.db.get_value("Bin",
-			{
-				"item_code": item_code,
-				"warehouse": warehouse
-			},
-			"actual_qty")
+		frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty")
 	)
 	return bool(stock_qty)
 
+
 def get_wishlist_items():
 	if not frappe.db.exists("Wishlist", frappe.session.user):
 		return []
 
 	return frappe.db.get_all(
 		"Wishlist Item",
-		filters={
-			"parent": frappe.session.user
-		},
+		filters={"parent": frappe.session.user},
 		fields=[
-			"web_item_name", "item_code", "item_name",
-			"website_item", "warehouse",
-			"image", "item_group", "route"
-		])
+			"web_item_name",
+			"item_code",
+			"item_name",
+			"website_item",
+			"warehouse",
+			"image",
+			"item_group",
+			"route",
+		],
+	)
+
 
 def set_stock_price_details(items, settings, selling_price_list):
 	for item in items:
@@ -55,17 +57,15 @@
 			item.available = get_stock_availability(item.item_code, item.get("warehouse"))
 
 		price_details = get_price(
-			item.item_code,
-			selling_price_list,
-			settings.default_customer_group,
-			settings.company
+			item.item_code, selling_price_list, settings.default_customer_group, settings.company
 		)
 
 		if price_details:
-			item.formatted_price = price_details.get('formatted_price')
-			item.formatted_mrp = price_details.get('formatted_mrp')
+			item.formatted_price = price_details.get("formatted_price")
+			item.formatted_mrp = price_details.get("formatted_mrp")
 			if item.formatted_mrp:
-				item.discount = price_details.get('formatted_discount_percent') or \
-					price_details.get('formatted_discount_rate')
+				item.discount = price_details.get("formatted_discount_percent") or price_details.get(
+					"formatted_discount_rate"
+				)
 
-	return items
\ No newline at end of file
+	return items
diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py
index 9f46e6a..4295188 100644
--- a/erpnext/templates/utils.py
+++ b/erpnext/templates/utils.py
@@ -8,31 +8,35 @@
 @frappe.whitelist(allow_guest=True)
 def send_message(subject="Website Query", message="", sender="", status="Open"):
 	from frappe.www.contact import send_message as website_send_message
+
 	lead = customer = None
 
 	website_send_message(subject, message, sender)
 
-	customer = frappe.db.sql("""select distinct dl.link_name from `tabDynamic Link` dl
+	customer = frappe.db.sql(
+		"""select distinct dl.link_name from `tabDynamic Link` dl
 		left join `tabContact` c on dl.parent=c.name where dl.link_doctype='Customer'
-		and c.email_id = %s""", sender)
+		and c.email_id = %s""",
+		sender,
+	)
 
 	if not customer:
-		lead = frappe.db.get_value('Lead', dict(email_id=sender))
+		lead = frappe.db.get_value("Lead", dict(email_id=sender))
 		if not lead:
-			new_lead = frappe.get_doc(dict(
-				doctype='Lead',
-				email_id = sender,
-				lead_name = sender.split('@')[0].title()
-			)).insert(ignore_permissions=True)
+			new_lead = frappe.get_doc(
+				dict(doctype="Lead", email_id=sender, lead_name=sender.split("@")[0].title())
+			).insert(ignore_permissions=True)
 
-	opportunity = frappe.get_doc(dict(
-		doctype ='Opportunity',
-		opportunity_from = 'Customer' if customer else 'Lead',
-		status = 'Open',
-		title = subject,
-		contact_email = sender,
-		to_discuss = message
-	))
+	opportunity = frappe.get_doc(
+		dict(
+			doctype="Opportunity",
+			opportunity_from="Customer" if customer else "Lead",
+			status="Open",
+			title=subject,
+			contact_email=sender,
+			to_discuss=message,
+		)
+	)
 
 	if customer:
 		opportunity.party_name = customer[0][0]
@@ -43,15 +47,17 @@
 
 	opportunity.insert(ignore_permissions=True)
 
-	comm = frappe.get_doc({
-		"doctype":"Communication",
-		"subject": subject,
-		"content": message,
-		"sender": sender,
-		"sent_or_received": "Received",
-		'reference_doctype': 'Opportunity',
-		'reference_name': opportunity.name
-	})
+	comm = frappe.get_doc(
+		{
+			"doctype": "Communication",
+			"subject": subject,
+			"content": message,
+			"sender": sender,
+			"sent_or_received": "Received",
+			"reference_doctype": "Opportunity",
+			"reference_name": opportunity.name,
+		}
+	)
 	comm.insert(ignore_permissions=True)
 
 	return "okay"
diff --git a/erpnext/tests/__init__.py b/erpnext/tests/__init__.py
index a504340..dc37472 100644
--- a/erpnext/tests/__init__.py
+++ b/erpnext/tests/__init__.py
@@ -1 +1 @@
-global_test_dependencies = ['User', 'Company', 'Item']
+global_test_dependencies = ["User", "Company", "Item"]
diff --git a/erpnext/tests/test_init.py b/erpnext/tests/test_init.py
index 6184972..6fbfbf4 100644
--- a/erpnext/tests/test_init.py
+++ b/erpnext/tests/test_init.py
@@ -4,7 +4,8 @@
 
 from erpnext import encode_company_abbr
 
-test_records = frappe.get_test_records('Company')
+test_records = frappe.get_test_records("Company")
+
 
 class TestInit(unittest.TestCase):
 	def test_encode_company_abbr(self):
@@ -12,23 +13,30 @@
 		abbr = "NFECT"
 
 		names = [
-			"Warehouse Name", "ERPNext Foundation India", "Gold - Member - {a}".format(a=abbr),
-			" - {a}".format(a=abbr), "ERPNext - Foundation - India",
+			"Warehouse Name",
+			"ERPNext Foundation India",
+			"Gold - Member - {a}".format(a=abbr),
+			" - {a}".format(a=abbr),
+			"ERPNext - Foundation - India",
 			"ERPNext Foundation India - {a}".format(a=abbr),
-			"No-Space-{a}".format(a=abbr), "- Warehouse"
+			"No-Space-{a}".format(a=abbr),
+			"- Warehouse",
 		]
 
 		expected_names = [
-			"Warehouse Name - {a}".format(a=abbr), "ERPNext Foundation India - {a}".format(a=abbr),
-			"Gold - Member - {a}".format(a=abbr), " - {a}".format(a=abbr),
+			"Warehouse Name - {a}".format(a=abbr),
+			"ERPNext Foundation India - {a}".format(a=abbr),
+			"Gold - Member - {a}".format(a=abbr),
+			" - {a}".format(a=abbr),
 			"ERPNext - Foundation - India - {a}".format(a=abbr),
-			"ERPNext Foundation India - {a}".format(a=abbr), "No-Space-{a} - {a}".format(a=abbr),
-			"- Warehouse - {a}".format(a=abbr)
+			"ERPNext Foundation India - {a}".format(a=abbr),
+			"No-Space-{a} - {a}".format(a=abbr),
+			"- Warehouse - {a}".format(a=abbr),
 		]
 
 		for i in range(len(names)):
 			enc_name = encode_company_abbr(names[i], abbr=abbr)
 			self.assertTrue(
 				enc_name == expected_names[i],
-				"{enc} is not same as {exp}".format(enc=enc_name, exp=expected_names[i])
+				"{enc} is not same as {exp}".format(enc=enc_name, exp=expected_names[i]),
 			)
diff --git a/erpnext/tests/test_notifications.py b/erpnext/tests/test_notifications.py
index 669bf6f..0f39195 100644
--- a/erpnext/tests/test_notifications.py
+++ b/erpnext/tests/test_notifications.py
@@ -10,9 +10,9 @@
 
 class TestNotifications(unittest.TestCase):
 	def test_get_notifications_for_targets(self):
-		'''
-			Test notification config entries for targets as percentages
-		'''
+		"""
+		Test notification config entries for targets as percentages
+		"""
 
 		company = frappe.get_all("Company")[0]
 		frappe.db.set_value("Company", company.name, "monthly_sales_target", 10000)
@@ -21,7 +21,7 @@
 		config = notifications.get_notification_config()
 		doc_target_percents = notifications.get_notifications_for_targets(config, {})
 
-		self.assertEqual(doc_target_percents['Company'][company.name], 10)
+		self.assertEqual(doc_target_percents["Company"][company.name], 10)
 
 		frappe.db.set_value("Company", company.name, "monthly_sales_target", 2000)
 		frappe.db.set_value("Company", company.name, "total_monthly_sales", 0)
@@ -29,4 +29,4 @@
 		config = notifications.get_notification_config()
 		doc_target_percents = notifications.get_notifications_for_targets(config, {})
 
-		self.assertEqual(doc_target_percents['Company'][company.name], 0)
+		self.assertEqual(doc_target_percents["Company"][company.name], 0)
diff --git a/erpnext/tests/test_point_of_sale.py b/erpnext/tests/test_point_of_sale.py
index 38f2c16..7267d4a 100644
--- a/erpnext/tests/test_point_of_sale.py
+++ b/erpnext/tests/test_point_of_sale.py
@@ -14,11 +14,11 @@
 class TestPointOfSale(unittest.TestCase):
 	@classmethod
 	def setUpClass(cls) -> None:
-		frappe.db.savepoint('before_test_point_of_sale')
+		frappe.db.savepoint("before_test_point_of_sale")
 
 	@classmethod
 	def tearDownClass(cls) -> None:
-		frappe.db.rollback(save_point='before_test_point_of_sale')
+		frappe.db.rollback(save_point="before_test_point_of_sale")
 
 	def test_item_search(self):
 		"""
diff --git a/erpnext/tests/test_regional.py b/erpnext/tests/test_regional.py
index 10d62ce..abeecee 100644
--- a/erpnext/tests/test_regional.py
+++ b/erpnext/tests/test_regional.py
@@ -7,15 +7,16 @@
 
 @erpnext.allow_regional
 def test_method():
-	return 'original'
+	return "original"
+
 
 class TestInit(unittest.TestCase):
 	def test_regional_overrides(self):
-		frappe.flags.country = 'India'
-		self.assertEqual(test_method(), 'overridden')
+		frappe.flags.country = "India"
+		self.assertEqual(test_method(), "overridden")
 
-		frappe.flags.country = 'Maldives'
-		self.assertEqual(test_method(), 'original')
+		frappe.flags.country = "Maldives"
+		self.assertEqual(test_method(), "original")
 
-		frappe.flags.country = 'France'
-		self.assertEqual(test_method(), 'overridden')
+		frappe.flags.country = "France"
+		self.assertEqual(test_method(), "overridden")
diff --git a/erpnext/tests/test_search.py b/erpnext/tests/test_search.py
index c169458..ffe9a5a 100644
--- a/erpnext/tests/test_search.py
+++ b/erpnext/tests/test_search.py
@@ -8,12 +8,11 @@
 	# Search for the word "cond", part of the word "conduire" (Lead) in french.
 	def test_contact_search_in_foreign_language(self):
 		try:
-			frappe.local.lang = 'fr'
-			output = filter_dynamic_link_doctypes("DocType", "cond", "name", 0, 20, {
-				'fieldtype': 'HTML',
-				'fieldname': 'contact_html'
-			})
-			result = [['found' for x in y if x=="Lead"] for y in output]
-			self.assertTrue(['found'] in result)
+			frappe.local.lang = "fr"
+			output = filter_dynamic_link_doctypes(
+				"DocType", "cond", "name", 0, 20, {"fieldtype": "HTML", "fieldname": "contact_html"}
+			)
+			result = [["found" for x in y if x == "Lead"] for y in output]
+			self.assertTrue(["found"] in result)
 		finally:
-			frappe.local.lang = 'en'
+			frappe.local.lang = "en"
diff --git a/erpnext/tests/test_subcontracting.py b/erpnext/tests/test_subcontracting.py
index fccfd0d..07291e8 100644
--- a/erpnext/tests/test_subcontracting.py
+++ b/erpnext/tests/test_subcontracting.py
@@ -25,35 +25,43 @@
 		make_bom_for_subcontracted_items()
 
 	def test_po_with_bom(self):
-		'''
-			- Set backflush based on BOM
-			- Create subcontracted PO for the item Subcontracted Item SA1 and add same item two times.
-			- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
-			- Create purchase receipt against the PO and check serial nos and batch no.
-		'''
+		"""
+		- Set backflush based on BOM
+		- Create subcontracted PO for the item Subcontracted Item SA1 and add same item two times.
+		- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
+		- Create purchase receipt against the PO and check serial nos and batch no.
+		"""
 
-		set_backflush_based_on('BOM')
-		item_code = 'Subcontracted Item SA1'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 5, 'rate': 100},
-			{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 6, 'rate': 100}]
+		set_backflush_based_on("BOM")
+		item_code = "Subcontracted Item SA1"
+		items = [
+			{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 5, "rate": 100},
+			{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 6, "rate": 100},
+		]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 1', 'qty': 5},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 5},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 5},
-			{'item_code': 'Subcontracted SRM Item 1', 'qty': 6},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 6},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 6}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 1", "qty": 5},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 5},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 5},
+			{"item_code": "Subcontracted SRM Item 1", "qty": 6},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 6},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 6},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name if d.get('qty') == 5 else po.items[1].name
+			d["po_detail"] = po.items[0].name if d.get("qty") == 5 else po.items[1].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.submit()
@@ -61,43 +69,58 @@
 		for key, value in get_supplied_items(pr1).items():
 			transferred_detais = itemwise_details.get(key)
 
-			for field in ['qty', 'serial_no', 'batch_no']:
+			for field in ["qty", "serial_no", "batch_no"]:
 				if value.get(field):
 					transfer, consumed = (transferred_detais.get(field), value.get(field))
-					if field == 'serial_no':
+					if field == "serial_no":
 						transfer, consumed = (sorted(transfer), sorted(consumed))
 
 					self.assertEqual(transfer, consumed)
 
 	def test_po_with_material_transfer(self):
-		'''
-			- Set backflush based on Material Transfer
-			- Create subcontracted PO for the item Subcontracted Item SA1 and Subcontracted Item SA5.
-			- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
-			- Transfer extra item Subcontracted SRM Item 4 for the subcontract item Subcontracted Item SA5.
-			- Create partial purchase receipt against the PO and check serial nos and batch no.
-		'''
+		"""
+		- Set backflush based on Material Transfer
+		- Create subcontracted PO for the item Subcontracted Item SA1 and Subcontracted Item SA5.
+		- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
+		- Transfer extra item Subcontracted SRM Item 4 for the subcontract item Subcontracted Item SA5.
+		- Create partial purchase receipt against the PO and check serial nos and batch no.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': 'Subcontracted Item SA1', 'qty': 5, 'rate': 100},
-			{'warehouse': '_Test Warehouse - _TC', 'item_code': 'Subcontracted Item SA5', 'qty': 6, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		items = [
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"item_code": "Subcontracted Item SA1",
+				"qty": 5,
+				"rate": 100,
+			},
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"item_code": "Subcontracted Item SA5",
+				"qty": 6,
+				"rate": 100,
+			},
+		]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 1', 'qty': 5, 'main_item_code': 'Subcontracted Item SA1'},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 5, 'main_item_code': 'Subcontracted Item SA1'},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 5, 'main_item_code': 'Subcontracted Item SA1'},
-			{'item_code': 'Subcontracted SRM Item 5', 'qty': 6, 'main_item_code': 'Subcontracted Item SA5'},
-			{'item_code': 'Subcontracted SRM Item 4', 'qty': 6, 'main_item_code': 'Subcontracted Item SA5'}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 1", "qty": 5, "main_item_code": "Subcontracted Item SA1"},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 5, "main_item_code": "Subcontracted Item SA1"},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 5, "main_item_code": "Subcontracted Item SA1"},
+			{"item_code": "Subcontracted SRM Item 5", "qty": 6, "main_item_code": "Subcontracted Item SA5"},
+			{"item_code": "Subcontracted SRM Item 4", "qty": 6, "main_item_code": "Subcontracted Item SA5"},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name if d.get('qty') == 5 else po.items[1].name
+			d["po_detail"] = po.items[0].name if d.get("qty") == 5 else po.items[1].name
 
-		make_stock_transfer_entry(po_no = po.name,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name, rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details)
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.remove(pr1.items[1])
@@ -106,7 +129,7 @@
 		for key, value in get_supplied_items(pr1).items():
 			transferred_detais = itemwise_details.get(key)
 
-			for field in ['qty', 'serial_no', 'batch_no']:
+			for field in ["qty", "serial_no", "batch_no"]:
 				if value.get(field):
 					self.assertEqual(value.get(field), transferred_detais.get(field))
 
@@ -116,36 +139,51 @@
 		for key, value in get_supplied_items(pr2).items():
 			transferred_detais = itemwise_details.get(key)
 
-			for field in ['qty', 'serial_no', 'batch_no']:
+			for field in ["qty", "serial_no", "batch_no"]:
 				if value.get(field):
 					self.assertEqual(value.get(field), transferred_detais.get(field))
 
 	def test_subcontract_with_same_components_different_fg(self):
-		'''
-			- Set backflush based on Material Transfer
-			- Create subcontracted PO for the item Subcontracted Item SA2 and Subcontracted Item SA3.
-			- Transfer the components from Stores to Supplier warehouse with serial nos.
-			- Transfer extra qty of components for the item Subcontracted Item SA2.
-			- Create partial purchase receipt against the PO and check serial nos and batch no.
-		'''
+		"""
+		- Set backflush based on Material Transfer
+		- Create subcontracted PO for the item Subcontracted Item SA2 and Subcontracted Item SA3.
+		- Transfer the components from Stores to Supplier warehouse with serial nos.
+		- Transfer extra qty of components for the item Subcontracted Item SA2.
+		- Create partial purchase receipt against the PO and check serial nos and batch no.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': 'Subcontracted Item SA2', 'qty': 5, 'rate': 100},
-			{'warehouse': '_Test Warehouse - _TC', 'item_code': 'Subcontracted Item SA3', 'qty': 6, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		items = [
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"item_code": "Subcontracted Item SA2",
+				"qty": 5,
+				"rate": 100,
+			},
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"item_code": "Subcontracted Item SA3",
+				"qty": 6,
+				"rate": 100,
+			},
+		]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 2', 'qty': 6, 'main_item_code': 'Subcontracted Item SA2'},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 6, 'main_item_code': 'Subcontracted Item SA3'}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 2", "qty": 6, "main_item_code": "Subcontracted Item SA2"},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 6, "main_item_code": "Subcontracted Item SA3"},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name if d.get('qty') == 5 else po.items[1].name
+			d["po_detail"] = po.items[0].name if d.get("qty") == 5 else po.items[1].name
 
-		make_stock_transfer_entry(po_no = po.name,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name, rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details)
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.items[0].qty = 3
@@ -155,7 +193,7 @@
 		for key, value in get_supplied_items(pr1).items():
 			transferred_detais = itemwise_details.get(key)
 			self.assertEqual(value.qty, 4)
-			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get('serial_no')[0:4]))
+			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[0:4]))
 
 		pr2 = make_purchase_receipt(po.name)
 		pr2.items[0].qty = 2
@@ -166,7 +204,7 @@
 			transferred_detais = itemwise_details.get(key)
 
 			self.assertEqual(value.qty, 2)
-			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get('serial_no')[4:6]))
+			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[4:6]))
 
 		pr3 = make_purchase_receipt(po.name)
 		pr3.submit()
@@ -174,85 +212,104 @@
 			transferred_detais = itemwise_details.get(key)
 
 			self.assertEqual(value.qty, 6)
-			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get('serial_no')[6:12]))
+			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[6:12]))
 
 	def test_return_non_consumed_materials(self):
-		'''
-			- Set backflush based on Material Transfer
-			- Create subcontracted PO for the item Subcontracted Item SA2.
-			- Transfer the components from Stores to Supplier warehouse with serial nos.
-			- Transfer extra qty of component for the subcontracted item Subcontracted Item SA2.
-			- Create purchase receipt for full qty against the PO and change the qty of raw material.
-			- After that return the non consumed material back to the store from supplier's warehouse.
-		'''
+		"""
+		- Set backflush based on Material Transfer
+		- Create subcontracted PO for the item Subcontracted Item SA2.
+		- Transfer the components from Stores to Supplier warehouse with serial nos.
+		- Transfer extra qty of component for the subcontracted item Subcontracted Item SA2.
+		- Create purchase receipt for full qty against the PO and change the qty of raw material.
+		- After that return the non consumed material back to the store from supplier's warehouse.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': 'Subcontracted Item SA2', 'qty': 5, 'rate': 100}]
-		rm_items = [{'item_code': 'Subcontracted SRM Item 2', 'qty': 6, 'main_item_code': 'Subcontracted Item SA2'}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		items = [
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"item_code": "Subcontracted Item SA2",
+				"qty": 5,
+				"rate": 100,
+			}
+		]
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 2", "qty": 6, "main_item_code": "Subcontracted Item SA2"}
+		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name, rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details)
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.save()
 		pr1.supplied_items[0].consumed_qty = 5
-		pr1.supplied_items[0].serial_no = '\n'.join(sorted(
-			itemwise_details.get('Subcontracted SRM Item 2').get('serial_no')[0:5]
-		))
+		pr1.supplied_items[0].serial_no = "\n".join(
+			sorted(itemwise_details.get("Subcontracted SRM Item 2").get("serial_no")[0:5])
+		)
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
 			transferred_detais = itemwise_details.get(key)
 			self.assertEqual(value.qty, 5)
-			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get('serial_no')[0:5]))
+			self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[0:5]))
 
 		po.load_from_db()
 		self.assertEqual(po.supplied_items[0].consumed_qty, 5)
 		doc = get_materials_from_supplier(po.name, [d.name for d in po.supplied_items])
 		self.assertEqual(doc.items[0].qty, 1)
-		self.assertEqual(doc.items[0].s_warehouse, '_Test Warehouse 1 - _TC')
-		self.assertEqual(doc.items[0].t_warehouse, '_Test Warehouse - _TC')
-		self.assertEqual(get_serial_nos(doc.items[0].serial_no),
-			itemwise_details.get(doc.items[0].item_code)['serial_no'][5:6])
+		self.assertEqual(doc.items[0].s_warehouse, "_Test Warehouse 1 - _TC")
+		self.assertEqual(doc.items[0].t_warehouse, "_Test Warehouse - _TC")
+		self.assertEqual(
+			get_serial_nos(doc.items[0].serial_no),
+			itemwise_details.get(doc.items[0].item_code)["serial_no"][5:6],
+		)
 
 	def test_item_with_batch_based_on_bom(self):
-		'''
-			- Set backflush based on BOM
-			- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
-			- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
-			- Transfer the components in multiple batches.
-			- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
-			- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
-		'''
+		"""
+		- Set backflush based on BOM
+		- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
+		- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
+		- Transfer the components in multiple batches.
+		- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
+		- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
+		"""
 
-		set_backflush_based_on('BOM')
-		item_code = 'Subcontracted Item SA4'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("BOM")
+		item_code = "Subcontracted Item SA4"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 1', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 1}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 1", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 1},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.items[0].qty = 2
@@ -281,37 +338,43 @@
 			self.assertEqual(value.qty, 2)
 
 	def test_item_with_batch_based_on_material_transfer(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
-			- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
-			- Transfer the components in multiple batches with extra 2 qty for the batched item.
-			- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
-			- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
-			- In the first purchase receipt the batched raw materials will be consumed 2 extra qty.
-		'''
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
+		- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
+		- Transfer the components in multiple batches with extra 2 qty for the batched item.
+		- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
+		- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
+		- In the first purchase receipt the batched raw materials will be consumed 2 extra qty.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA4'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA4"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 1', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 1", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.items[0].qty = 2
@@ -320,7 +383,7 @@
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
-			qty = 4 if key != 'Subcontracted SRM Item 3' else 6
+			qty = 4 if key != "Subcontracted SRM Item 3" else 6
 			self.assertEqual(value.qty, qty)
 
 		pr1 = make_purchase_receipt(po.name)
@@ -341,30 +404,35 @@
 			self.assertEqual(value.qty, 2)
 
 	def test_partial_transfer_serial_no_components_based_on_material_transfer(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA2.
-			- Transfer the partial components from Stores to Supplier warehouse with serial nos.
-			- Create partial purchase receipt against the PO and change the qty manually.
-			- Transfer the remaining components from Stores to Supplier warehouse with serial nos.
-			- Create purchase receipt for remaining qty against the PO and change the qty manually.
-		'''
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA2.
+		- Transfer the partial components from Stores to Supplier warehouse with serial nos.
+		- Create partial purchase receipt against the PO and change the qty manually.
+		- Transfer the remaining components from Stores to Supplier warehouse with serial nos.
+		- Create purchase receipt for remaining qty against the PO and change the qty manually.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA2'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA2"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 2', 'qty': 5}]
+		rm_items = [{"item_code": "Subcontracted SRM Item 2", "qty": 5}]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.items[0].qty = 5
@@ -377,7 +445,9 @@
 
 		pr1.load_from_db()
 		pr1.supplied_items[0].consumed_qty = 5
-		pr1.supplied_items[0].serial_no = '\n'.join(itemwise_details[pr1.supplied_items[0].rm_item_code]['serial_no'])
+		pr1.supplied_items[0].serial_no = "\n".join(
+			itemwise_details[pr1.supplied_items[0].rm_item_code]["serial_no"]
+		)
 		pr1.save()
 		pr1.submit()
 
@@ -388,10 +458,14 @@
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.submit()
@@ -402,67 +476,77 @@
 			self.assertEqual(sorted(value.serial_no), sorted(details.serial_no))
 
 	def test_incorrect_serial_no_components_based_on_material_transfer(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA2.
-			- Transfer the serialized componenets to the supplier.
-			- Create purchase receipt and change the serial no which is not transferred.
-			- System should throw the error and not allowed to save the purchase receipt.
-		'''
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA2.
+		- Transfer the serialized componenets to the supplier.
+		- Create purchase receipt and change the serial no which is not transferred.
+		- System should throw the error and not allowed to save the purchase receipt.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA2'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA2"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 2', 'qty': 10}]
+		rm_items = [{"item_code": "Subcontracted SRM Item 2", "qty": 10}]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.save()
-		pr1.supplied_items[0].serial_no = 'ABCD'
+		pr1.supplied_items[0].serial_no = "ABCD"
 		self.assertRaises(frappe.ValidationError, pr1.save)
 		pr1.delete()
 
 	def test_partial_transfer_batch_based_on_material_transfer(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA6.
-			- Transfer the partial components from Stores to Supplier warehouse with batch.
-			- Create partial purchase receipt against the PO and change the qty manually.
-			- Transfer the remaining components from Stores to Supplier warehouse with batch.
-			- Create purchase receipt for remaining qty against the PO and change the qty manually.
-		'''
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA6.
+		- Transfer the partial components from Stores to Supplier warehouse with batch.
+		- Create partial purchase receipt against the PO and change the qty manually.
+		- Transfer the remaining components from Stores to Supplier warehouse with batch.
+		- Create purchase receipt for remaining qty against the PO and change the qty manually.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA6'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA6"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 3', 'qty': 5}]
+		rm_items = [{"item_code": "Subcontracted SRM Item 3", "qty": 5}]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.items[0].qty = 5
 		pr1.save()
 
-		transferred_batch_no = ''
+		transferred_batch_no = ""
 		for key, value in get_supplied_items(pr1).items():
 			details = itemwise_details.get(key)
 			self.assertEqual(value.qty, 3)
@@ -482,10 +566,14 @@
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_receipt(po.name)
 		pr1.submit()
@@ -495,55 +583,60 @@
 			self.assertEqual(value.qty, details.qty)
 			self.assertEqual(value.batch_no, details.batch_no)
 
-
 	def test_item_with_batch_based_on_material_transfer_for_purchase_invoice(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
-			- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
-			- Transfer the components in multiple batches with extra 2 qty for the batched item.
-			- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
-			- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
-			- In the first purchase receipt the batched raw materials will be consumed 2 extra qty.
-		'''
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
+		- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
+		- Transfer the components in multiple batches with extra 2 qty for the batched item.
+		- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
+		- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
+		- In the first purchase receipt the batched raw materials will be consumed 2 extra qty.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA4'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA4"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 1', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 1", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 2
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		add_second_row_in_pr(pr1)
 		pr1.save()
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
-			qty = 4 if key != 'Subcontracted SRM Item 3' else 6
+			qty = 4 if key != "Subcontracted SRM Item 3" else 6
 			self.assertEqual(value.qty, qty)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.items[0].qty = 2
 		add_second_row_in_pr(pr1)
 		pr1.save()
@@ -555,43 +648,50 @@
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 2
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.save()
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
 			self.assertEqual(value.qty, 2)
 
-	def test_partial_transfer_serial_no_components_based_on_material_transfer_for_purchase_invoice(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA2.
-			- Transfer the partial components from Stores to Supplier warehouse with serial nos.
-			- Create partial purchase receipt against the PO and change the qty manually.
-			- Transfer the remaining components from Stores to Supplier warehouse with serial nos.
-			- Create purchase receipt for remaining qty against the PO and change the qty manually.
-		'''
+	def test_partial_transfer_serial_no_components_based_on_material_transfer_for_purchase_invoice(
+		self,
+	):
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA2.
+		- Transfer the partial components from Stores to Supplier warehouse with serial nos.
+		- Create partial purchase receipt against the PO and change the qty manually.
+		- Transfer the remaining components from Stores to Supplier warehouse with serial nos.
+		- Create purchase receipt for remaining qty against the PO and change the qty manually.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA2'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA2"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 2', 'qty': 5}]
+		rm_items = [{"item_code": "Subcontracted SRM Item 2", "qty": 5}]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 5
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.save()
 
 		for key, value in get_supplied_items(pr1).items():
@@ -601,7 +701,9 @@
 
 		pr1.load_from_db()
 		pr1.supplied_items[0].consumed_qty = 5
-		pr1.supplied_items[0].serial_no = '\n'.join(itemwise_details[pr1.supplied_items[0].rm_item_code]['serial_no'])
+		pr1.supplied_items[0].serial_no = "\n".join(
+			itemwise_details[pr1.supplied_items[0].rm_item_code]["serial_no"]
+		)
 		pr1.save()
 		pr1.submit()
 
@@ -612,14 +714,18 @@
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
@@ -628,38 +734,43 @@
 			self.assertEqual(sorted(value.serial_no), sorted(details.serial_no))
 
 	def test_partial_transfer_batch_based_on_material_transfer_for_purchase_invoice(self):
-		'''
-			- Set backflush based on Material Transferred for Subcontract
-			- Create subcontracted PO for the item Subcontracted Item SA6.
-			- Transfer the partial components from Stores to Supplier warehouse with batch.
-			- Create partial purchase receipt against the PO and change the qty manually.
-			- Transfer the remaining components from Stores to Supplier warehouse with batch.
-			- Create purchase receipt for remaining qty against the PO and change the qty manually.
-		'''
+		"""
+		- Set backflush based on Material Transferred for Subcontract
+		- Create subcontracted PO for the item Subcontracted Item SA6.
+		- Transfer the partial components from Stores to Supplier warehouse with batch.
+		- Create partial purchase receipt against the PO and change the qty manually.
+		- Transfer the remaining components from Stores to Supplier warehouse with batch.
+		- Create purchase receipt for remaining qty against the PO and change the qty manually.
+		"""
 
-		set_backflush_based_on('Material Transferred for Subcontract')
-		item_code = 'Subcontracted Item SA6'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("Material Transferred for Subcontract")
+		item_code = "Subcontracted Item SA6"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 3', 'qty': 5}]
+		rm_items = [{"item_code": "Subcontracted SRM Item 3", "qty": 5}]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 5
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.save()
 
-		transferred_batch_no = ''
+		transferred_batch_no = ""
 		for key, value in get_supplied_items(pr1).items():
 			details = itemwise_details.get(key)
 			self.assertEqual(value.qty, 3)
@@ -679,14 +790,18 @@
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
@@ -695,41 +810,47 @@
 			self.assertEqual(value.batch_no, details.batch_no)
 
 	def test_item_with_batch_based_on_bom_for_purchase_invoice(self):
-		'''
-			- Set backflush based on BOM
-			- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
-			- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
-			- Transfer the components in multiple batches.
-			- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
-			- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
-		'''
+		"""
+		- Set backflush based on BOM
+		- Create subcontracted PO for the item Subcontracted Item SA4 (has batch no).
+		- Transfer the components from Stores to Supplier warehouse with batch no and serial nos.
+		- Transfer the components in multiple batches.
+		- Create the 3 purchase receipt against the PO and split Subcontracted Items into two batches.
+		- Keep the qty as 2 for Subcontracted Item in the purchase receipt.
+		"""
 
-		set_backflush_based_on('BOM')
-		item_code = 'Subcontracted Item SA4'
-		items = [{'warehouse': '_Test Warehouse - _TC', 'item_code': item_code, 'qty': 10, 'rate': 100}]
+		set_backflush_based_on("BOM")
+		item_code = "Subcontracted Item SA4"
+		items = [{"warehouse": "_Test Warehouse - _TC", "item_code": item_code, "qty": 10, "rate": 100}]
 
-		rm_items = [{'item_code': 'Subcontracted SRM Item 1', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 2', 'qty': 10},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 3},
-			{'item_code': 'Subcontracted SRM Item 3', 'qty': 1}
+		rm_items = [
+			{"item_code": "Subcontracted SRM Item 1", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 2", "qty": 10},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 3},
+			{"item_code": "Subcontracted SRM Item 3", "qty": 1},
 		]
 
 		itemwise_details = make_stock_in_entry(rm_items=rm_items)
-		po = create_purchase_order(rm_items = items, is_subcontracted="Yes",
-			supplier_warehouse="_Test Warehouse 1 - _TC")
+		po = create_purchase_order(
+			rm_items=items, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
+		)
 
 		for d in rm_items:
-			d['po_detail'] = po.items[0].name
+			d["po_detail"] = po.items[0].name
 
-		make_stock_transfer_entry(po_no = po.name, main_item_code=item_code,
-			rm_items=rm_items, itemwise_details=copy.deepcopy(itemwise_details))
+		make_stock_transfer_entry(
+			po_no=po.name,
+			main_item_code=item_code,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
 
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 2
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		add_second_row_in_pr(pr1)
 		pr1.save()
 		pr1.submit()
@@ -740,7 +861,7 @@
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 2
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		add_second_row_in_pr(pr1)
 		pr1.save()
 		pr1.submit()
@@ -751,34 +872,50 @@
 		pr1 = make_purchase_invoice(po.name)
 		pr1.update_stock = 1
 		pr1.items[0].qty = 2
-		pr1.items[0].expense_account = 'Stock Adjustment - _TC'
+		pr1.items[0].expense_account = "Stock Adjustment - _TC"
 		pr1.save()
 		pr1.submit()
 
 		for key, value in get_supplied_items(pr1).items():
 			self.assertEqual(value.qty, 2)
 
+
 def add_second_row_in_pr(pr):
 	item_dict = {}
-	for column in ['item_code', 'item_name', 'qty', 'uom', 'warehouse', 'stock_uom',
-		'purchase_order', 'purchase_order_item', 'conversion_factor', 'rate', 'expense_account', 'po_detail']:
+	for column in [
+		"item_code",
+		"item_name",
+		"qty",
+		"uom",
+		"warehouse",
+		"stock_uom",
+		"purchase_order",
+		"purchase_order_item",
+		"conversion_factor",
+		"rate",
+		"expense_account",
+		"po_detail",
+	]:
 		item_dict[column] = pr.items[0].get(column)
 
-	pr.append('items', item_dict)
+	pr.append("items", item_dict)
 	pr.set_missing_values()
 
+
 def get_supplied_items(pr_doc):
 	supplied_items = {}
-	for row in pr_doc.get('supplied_items'):
+	for row in pr_doc.get("supplied_items"):
 		if row.rm_item_code not in supplied_items:
-			supplied_items.setdefault(row.rm_item_code,
-				frappe._dict({'qty': 0, 'serial_no': [], 'batch_no': defaultdict(float)}))
+			supplied_items.setdefault(
+				row.rm_item_code, frappe._dict({"qty": 0, "serial_no": [], "batch_no": defaultdict(float)})
+			)
 
 		details = supplied_items[row.rm_item_code]
 		update_item_details(row, details)
 
 	return supplied_items
 
+
 def make_stock_in_entry(**args):
 	args = frappe._dict(args)
 
@@ -786,11 +923,17 @@
 	for row in args.rm_items:
 		row = frappe._dict(row)
 
-		doc = make_stock_entry(target=row.warehouse or '_Test Warehouse - _TC',
-			item_code=row.item_code, qty=row.qty or 1, basic_rate=row.rate or 100)
+		doc = make_stock_entry(
+			target=row.warehouse or "_Test Warehouse - _TC",
+			item_code=row.item_code,
+			qty=row.qty or 1,
+			basic_rate=row.rate or 100,
+		)
 
 		if row.item_code not in items:
-			items.setdefault(row.item_code, frappe._dict({'qty': 0, 'serial_no': [], 'batch_no': defaultdict(float)}))
+			items.setdefault(
+				row.item_code, frappe._dict({"qty": 0, "serial_no": [], "batch_no": defaultdict(float)})
+			)
 
 		child_row = doc.items[0]
 		details = items[child_row.item_code]
@@ -798,15 +941,20 @@
 
 	return items
 
+
 def update_item_details(child_row, details):
-	details.qty += (child_row.get('qty') if child_row.doctype == 'Stock Entry Detail'
-		else child_row.get('consumed_qty'))
+	details.qty += (
+		child_row.get("qty")
+		if child_row.doctype == "Stock Entry Detail"
+		else child_row.get("consumed_qty")
+	)
 
 	if child_row.serial_no:
 		details.serial_no.extend(get_serial_nos(child_row.serial_no))
 
 	if child_row.batch_no:
-		details.batch_no[child_row.batch_no] += (child_row.get('qty') or child_row.get('consumed_qty'))
+		details.batch_no[child_row.batch_no] += child_row.get("qty") or child_row.get("consumed_qty")
+
 
 def make_stock_transfer_entry(**args):
 	args = frappe._dict(args)
@@ -815,21 +963,27 @@
 	for row in args.rm_items:
 		row = frappe._dict(row)
 
-		item = {'item_code': row.main_item_code or args.main_item_code, 'rm_item_code': row.item_code,
-			'qty': row.qty or 1, 'item_name': row.item_code, 'rate': row.rate or 100,
-			'stock_uom': row.stock_uom or 'Nos', 'warehouse': row.warehuose or '_Test Warehouse - _TC'}
+		item = {
+			"item_code": row.main_item_code or args.main_item_code,
+			"rm_item_code": row.item_code,
+			"qty": row.qty or 1,
+			"item_name": row.item_code,
+			"rate": row.rate or 100,
+			"stock_uom": row.stock_uom or "Nos",
+			"warehouse": row.warehuose or "_Test Warehouse - _TC",
+		}
 
 		item_details = args.itemwise_details.get(row.item_code)
 
 		if item_details and item_details.serial_no:
-			serial_nos = item_details.serial_no[0:cint(row.qty)]
-			item['serial_no'] = '\n'.join(serial_nos)
+			serial_nos = item_details.serial_no[0 : cint(row.qty)]
+			item["serial_no"] = "\n".join(serial_nos)
 			item_details.serial_no = list(set(item_details.serial_no) - set(serial_nos))
 
 		if item_details and item_details.batch_no:
 			for batch_no, batch_qty in item_details.batch_no.items():
 				if batch_qty >= row.qty:
-					item['batch_no'] = batch_no
+					item["batch_no"] = batch_no
 					item_details.batch_no[batch_no] -= row.qty
 					break
 
@@ -842,42 +996,70 @@
 
 	return doc
 
+
 def make_subcontract_items():
-	sub_contracted_items = {'Subcontracted Item SA1': {}, 'Subcontracted Item SA2': {}, 'Subcontracted Item SA3': {},
-		'Subcontracted Item SA4': {'has_batch_no': 1, 'create_new_batch': 1, 'batch_number_series': 'SBAT.####'},
-		'Subcontracted Item SA5': {}, 'Subcontracted Item SA6': {}}
+	sub_contracted_items = {
+		"Subcontracted Item SA1": {},
+		"Subcontracted Item SA2": {},
+		"Subcontracted Item SA3": {},
+		"Subcontracted Item SA4": {
+			"has_batch_no": 1,
+			"create_new_batch": 1,
+			"batch_number_series": "SBAT.####",
+		},
+		"Subcontracted Item SA5": {},
+		"Subcontracted Item SA6": {},
+	}
 
 	for item, properties in sub_contracted_items.items():
-		if not frappe.db.exists('Item', item):
-			properties.update({'is_stock_item': 1, 'is_sub_contracted_item': 1})
+		if not frappe.db.exists("Item", item):
+			properties.update({"is_stock_item": 1, "is_sub_contracted_item": 1})
 			make_item(item, properties)
 
+
 def make_raw_materials():
-	raw_materials = {'Subcontracted SRM Item 1': {},
-		'Subcontracted SRM Item 2': {'has_serial_no': 1, 'serial_no_series': 'SRI.####'},
-		'Subcontracted SRM Item 3': {'has_batch_no': 1, 'create_new_batch': 1, 'batch_number_series': 'BAT.####'},
-		'Subcontracted SRM Item 4': {'has_serial_no': 1, 'serial_no_series': 'SRII.####'},
-		'Subcontracted SRM Item 5': {'has_serial_no': 1, 'serial_no_series': 'SRII.####'}}
+	raw_materials = {
+		"Subcontracted SRM Item 1": {},
+		"Subcontracted SRM Item 2": {"has_serial_no": 1, "serial_no_series": "SRI.####"},
+		"Subcontracted SRM Item 3": {
+			"has_batch_no": 1,
+			"create_new_batch": 1,
+			"batch_number_series": "BAT.####",
+		},
+		"Subcontracted SRM Item 4": {"has_serial_no": 1, "serial_no_series": "SRII.####"},
+		"Subcontracted SRM Item 5": {"has_serial_no": 1, "serial_no_series": "SRII.####"},
+	}
 
 	for item, properties in raw_materials.items():
-		if not frappe.db.exists('Item', item):
-			properties.update({'is_stock_item': 1})
+		if not frappe.db.exists("Item", item):
+			properties.update({"is_stock_item": 1})
 			make_item(item, properties)
 
+
 def make_bom_for_subcontracted_items():
 	boms = {
-		'Subcontracted Item SA1': ['Subcontracted SRM Item 1', 'Subcontracted SRM Item 2', 'Subcontracted SRM Item 3'],
-		'Subcontracted Item SA2': ['Subcontracted SRM Item 2'],
-		'Subcontracted Item SA3': ['Subcontracted SRM Item 2'],
-		'Subcontracted Item SA4': ['Subcontracted SRM Item 1', 'Subcontracted SRM Item 2', 'Subcontracted SRM Item 3'],
-		'Subcontracted Item SA5': ['Subcontracted SRM Item 5'],
-		'Subcontracted Item SA6': ['Subcontracted SRM Item 3']
+		"Subcontracted Item SA1": [
+			"Subcontracted SRM Item 1",
+			"Subcontracted SRM Item 2",
+			"Subcontracted SRM Item 3",
+		],
+		"Subcontracted Item SA2": ["Subcontracted SRM Item 2"],
+		"Subcontracted Item SA3": ["Subcontracted SRM Item 2"],
+		"Subcontracted Item SA4": [
+			"Subcontracted SRM Item 1",
+			"Subcontracted SRM Item 2",
+			"Subcontracted SRM Item 3",
+		],
+		"Subcontracted Item SA5": ["Subcontracted SRM Item 5"],
+		"Subcontracted Item SA6": ["Subcontracted SRM Item 3"],
 	}
 
 	for item_code, raw_materials in boms.items():
-		if not frappe.db.exists('BOM', {'item': item_code}):
+		if not frappe.db.exists("BOM", {"item": item_code}):
 			make_bom(item=item_code, raw_materials=raw_materials, rate=100)
 
+
 def set_backflush_based_on(based_on):
-	frappe.db.set_value('Buying Settings', None,
-		'backflush_raw_materials_of_subcontract_based_on', based_on)
+	frappe.db.set_value(
+		"Buying Settings", None, "backflush_raw_materials_of_subcontract_based_on", based_on
+	)
diff --git a/erpnext/tests/test_webform.py b/erpnext/tests/test_webform.py
index 19255db..202467b 100644
--- a/erpnext/tests/test_webform.py
+++ b/erpnext/tests/test_webform.py
@@ -7,132 +7,143 @@
 
 class TestWebsite(unittest.TestCase):
 	def test_permission_for_custom_doctype(self):
-		create_user('Supplier 1', 'supplier1@gmail.com')
-		create_user('Supplier 2', 'supplier2@gmail.com')
-		create_supplier_with_contact('Supplier1', 'All Supplier Groups', 'Supplier 1', 'supplier1@gmail.com')
-		create_supplier_with_contact('Supplier2', 'All Supplier Groups', 'Supplier 2', 'supplier2@gmail.com')
-		po1 = create_purchase_order(supplier='Supplier1')
-		po2 = create_purchase_order(supplier='Supplier2')
+		create_user("Supplier 1", "supplier1@gmail.com")
+		create_user("Supplier 2", "supplier2@gmail.com")
+		create_supplier_with_contact(
+			"Supplier1", "All Supplier Groups", "Supplier 1", "supplier1@gmail.com"
+		)
+		create_supplier_with_contact(
+			"Supplier2", "All Supplier Groups", "Supplier 2", "supplier2@gmail.com"
+		)
+		po1 = create_purchase_order(supplier="Supplier1")
+		po2 = create_purchase_order(supplier="Supplier2")
 
 		create_custom_doctype()
 		create_webform()
-		create_order_assignment(supplier='Supplier1', po = po1.name)
-		create_order_assignment(supplier='Supplier2', po = po2.name)
+		create_order_assignment(supplier="Supplier1", po=po1.name)
+		create_order_assignment(supplier="Supplier2", po=po2.name)
 
 		frappe.set_user("Administrator")
 		# checking if data consist of all order assignment of Supplier1 and Supplier2
-		self.assertTrue('Supplier1' and 'Supplier2' in [data.supplier for data in get_data()])
+		self.assertTrue("Supplier1" and "Supplier2" in [data.supplier for data in get_data()])
 
 		frappe.set_user("supplier1@gmail.com")
 		# checking if data only consist of order assignment of Supplier1
-		self.assertTrue('Supplier1' in [data.supplier for data in get_data()])
-		self.assertFalse([data.supplier for data in get_data() if data.supplier != 'Supplier1'])
+		self.assertTrue("Supplier1" in [data.supplier for data in get_data()])
+		self.assertFalse([data.supplier for data in get_data() if data.supplier != "Supplier1"])
 
 		frappe.set_user("supplier2@gmail.com")
 		# checking if data only consist of order assignment of Supplier2
-		self.assertTrue('Supplier2' in [data.supplier for data in get_data()])
-		self.assertFalse([data.supplier for data in get_data() if data.supplier != 'Supplier2'])
+		self.assertTrue("Supplier2" in [data.supplier for data in get_data()])
+		self.assertFalse([data.supplier for data in get_data() if data.supplier != "Supplier2"])
 
 		frappe.set_user("Administrator")
 
+
 def get_data():
-	webform_list_contexts = frappe.get_hooks('webform_list_context')
+	webform_list_contexts = frappe.get_hooks("webform_list_context")
 	if webform_list_contexts:
-		context = frappe._dict(frappe.get_attr(webform_list_contexts[0])('Buying') or {})
-	kwargs = dict(doctype='Order Assignment', order_by = 'modified desc')
+		context = frappe._dict(frappe.get_attr(webform_list_contexts[0])("Buying") or {})
+	kwargs = dict(doctype="Order Assignment", order_by="modified desc")
 	return context.get_list(**kwargs)
 
+
 def create_user(name, email):
-	frappe.get_doc({
-		'doctype': 'User',
-		'send_welcome_email': 0,
-		'user_type': 'Website User',
-		'first_name': name,
-		'email': email,
-		'roles': [{"doctype": "Has Role", "role": "Supplier"}]
-	}).insert(ignore_if_duplicate = True)
+	frappe.get_doc(
+		{
+			"doctype": "User",
+			"send_welcome_email": 0,
+			"user_type": "Website User",
+			"first_name": name,
+			"email": email,
+			"roles": [{"doctype": "Has Role", "role": "Supplier"}],
+		}
+	).insert(ignore_if_duplicate=True)
+
 
 def create_supplier_with_contact(name, group, contact_name, contact_email):
-	supplier = frappe.get_doc({
-		'doctype': 'Supplier',
-		'supplier_name': name,
-		'supplier_group': group
-	}).insert(ignore_if_duplicate = True)
+	supplier = frappe.get_doc(
+		{"doctype": "Supplier", "supplier_name": name, "supplier_group": group}
+	).insert(ignore_if_duplicate=True)
 
-	if not frappe.db.exists('Contact', contact_name+'-1-'+name):
+	if not frappe.db.exists("Contact", contact_name + "-1-" + name):
 		new_contact = frappe.new_doc("Contact")
 		new_contact.first_name = contact_name
-		new_contact.is_primary_contact = True,
-		new_contact.append('links', {
-			"link_doctype": "Supplier",
-			"link_name": supplier.name
-		})
-		new_contact.append('email_ids', {
-			"email_id": contact_email,
-			"is_primary": 1
-		})
+		new_contact.is_primary_contact = (True,)
+		new_contact.append("links", {"link_doctype": "Supplier", "link_name": supplier.name})
+		new_contact.append("email_ids", {"email_id": contact_email, "is_primary": 1})
 
 		new_contact.insert(ignore_mandatory=True)
 
+
 def create_custom_doctype():
-	frappe.get_doc({
-		'doctype': 'DocType',
-		'name': 'Order Assignment',
-		'module': 'Buying',
-		'custom': 1,
-		'autoname': 'field:po',
-		'fields': [
-			{'label': 'PO', 'fieldname': 'po', 'fieldtype': 'Link', 'options': 'Purchase Order'},
-			{'label': 'Supplier', 'fieldname': 'supplier', 'fieldtype': 'Data', "fetch_from": "po.supplier"}
-		],
-		'permissions': [
-			{
-				"create": 1,
-				"delete": 1,
-				"email": 1,
-				"export": 1,
-				"print": 1,
-				"read": 1,
-				"report": 1,
-				"role": "System Manager",
-				"share": 1,
-				"write": 1
-			},
-			{
-				"read": 1,
-				"role": "Supplier"
-			}
-		]
-	}).insert(ignore_if_duplicate = True)
+	frappe.get_doc(
+		{
+			"doctype": "DocType",
+			"name": "Order Assignment",
+			"module": "Buying",
+			"custom": 1,
+			"autoname": "field:po",
+			"fields": [
+				{"label": "PO", "fieldname": "po", "fieldtype": "Link", "options": "Purchase Order"},
+				{
+					"label": "Supplier",
+					"fieldname": "supplier",
+					"fieldtype": "Data",
+					"fetch_from": "po.supplier",
+				},
+			],
+			"permissions": [
+				{
+					"create": 1,
+					"delete": 1,
+					"email": 1,
+					"export": 1,
+					"print": 1,
+					"read": 1,
+					"report": 1,
+					"role": "System Manager",
+					"share": 1,
+					"write": 1,
+				},
+				{"read": 1, "role": "Supplier"},
+			],
+		}
+	).insert(ignore_if_duplicate=True)
+
 
 def create_webform():
-	frappe.get_doc({
-		'doctype': 'Web Form',
-		'module': 'Buying',
-		'title': 'SO Schedule',
-		'route': 'so-schedule',
-		'doc_type': 'Order Assignment',
-		'web_form_fields': [
-			{
-				'doctype': 'Web Form Field',
-				'fieldname': 'po',
-				'fieldtype': 'Link',
-				'options': 'Purchase Order',
-				'label': 'PO'
-			},
-			{
-				'doctype': 'Web Form Field',
-				'fieldname': 'supplier',
-				'fieldtype': 'Data',
-				'label': 'Supplier'
-			}
-		]
+	frappe.get_doc(
+		{
+			"doctype": "Web Form",
+			"module": "Buying",
+			"title": "SO Schedule",
+			"route": "so-schedule",
+			"doc_type": "Order Assignment",
+			"web_form_fields": [
+				{
+					"doctype": "Web Form Field",
+					"fieldname": "po",
+					"fieldtype": "Link",
+					"options": "Purchase Order",
+					"label": "PO",
+				},
+				{
+					"doctype": "Web Form Field",
+					"fieldname": "supplier",
+					"fieldtype": "Data",
+					"label": "Supplier",
+				},
+			],
+		}
+	).insert(ignore_if_duplicate=True)
 
-	}).insert(ignore_if_duplicate = True)
 
 def create_order_assignment(supplier, po):
-	frappe.get_doc({
-		'doctype': 'Order Assignment',
-		'po': po,
-		'supplier': supplier,
-	}).insert(ignore_if_duplicate = True)
\ No newline at end of file
+	frappe.get_doc(
+		{
+			"doctype": "Order Assignment",
+			"po": po,
+			"supplier": supplier,
+		}
+	).insert(ignore_if_duplicate=True)
diff --git a/erpnext/tests/test_woocommerce.py b/erpnext/tests/test_woocommerce.py
index 4a451ab..663464b 100644
--- a/erpnext/tests/test_woocommerce.py
+++ b/erpnext/tests/test_woocommerce.py
@@ -25,32 +25,126 @@
 			woo_settings.save(ignore_permissions=True)
 
 	def test_sales_order_for_woocommerce(self):
-		frappe.flags.woocomm_test_order_data = {"id":75,"parent_id":0,"number":"74","order_key":"wc_order_5aa1281c2dacb","created_via":"checkout","version":"3.3.3","status":"processing","currency":"INR","date_created":"2018-03-08T12:10:04","date_created_gmt":"2018-03-08T12:10:04","date_modified":"2018-03-08T12:10:04","date_modified_gmt":"2018-03-08T12:10:04","discount_total":"0.00","discount_tax":"0.00","shipping_total":"150.00","shipping_tax":"0.00","cart_tax":"0.00","total":"649.00","total_tax":"0.00","prices_include_tax":False,"customer_id":12,"customer_ip_address":"103.54.99.5","customer_user_agent":"mozilla\\/5.0 (x11; linux x86_64) applewebkit\\/537.36 (khtml, like gecko) chrome\\/64.0.3282.186 safari\\/537.36","customer_note":"","billing":{"first_name":"Tony","last_name":"Stark","company":"_Test Company","address_1":"Mumbai","address_2":"","city":"Dadar","state":"MH","postcode":"123","country":"IN","email":"tony@gmail.com","phone":"123457890"},"shipping":{"first_name":"Tony","last_name":"Stark","company":"","address_1":"Mumbai","address_2":"","city":"Dadar","state":"MH","postcode":"123","country":"IN"},"payment_method":"cod","payment_method_title":"Cash on delivery","transaction_id":"","date_paid":"","date_paid_gmt":"","date_completed":"","date_completed_gmt":"","cart_hash":"8e76b020d5790066496f244860c4703f","meta_data":[],"line_items":[{"id":80,"name":"Marvel","product_id":56,"variation_id":0,"quantity":1,"tax_class":"","subtotal":"499.00","subtotal_tax":"0.00","total":"499.00","total_tax":"0.00","taxes":[],"meta_data":[],"sku":"","price":499}],"tax_lines":[],"shipping_lines":[{"id":81,"method_title":"Flat rate","method_id":"flat_rate:1","total":"150.00","total_tax":"0.00","taxes":[],"meta_data":[{"id":623,"key":"Items","value":"Marvel &times; 1"}]}],"fee_lines":[],"coupon_lines":[],"refunds":[]}
+		frappe.flags.woocomm_test_order_data = {
+			"id": 75,
+			"parent_id": 0,
+			"number": "74",
+			"order_key": "wc_order_5aa1281c2dacb",
+			"created_via": "checkout",
+			"version": "3.3.3",
+			"status": "processing",
+			"currency": "INR",
+			"date_created": "2018-03-08T12:10:04",
+			"date_created_gmt": "2018-03-08T12:10:04",
+			"date_modified": "2018-03-08T12:10:04",
+			"date_modified_gmt": "2018-03-08T12:10:04",
+			"discount_total": "0.00",
+			"discount_tax": "0.00",
+			"shipping_total": "150.00",
+			"shipping_tax": "0.00",
+			"cart_tax": "0.00",
+			"total": "649.00",
+			"total_tax": "0.00",
+			"prices_include_tax": False,
+			"customer_id": 12,
+			"customer_ip_address": "103.54.99.5",
+			"customer_user_agent": "mozilla\\/5.0 (x11; linux x86_64) applewebkit\\/537.36 (khtml, like gecko) chrome\\/64.0.3282.186 safari\\/537.36",
+			"customer_note": "",
+			"billing": {
+				"first_name": "Tony",
+				"last_name": "Stark",
+				"company": "_Test Company",
+				"address_1": "Mumbai",
+				"address_2": "",
+				"city": "Dadar",
+				"state": "MH",
+				"postcode": "123",
+				"country": "IN",
+				"email": "tony@gmail.com",
+				"phone": "123457890",
+			},
+			"shipping": {
+				"first_name": "Tony",
+				"last_name": "Stark",
+				"company": "",
+				"address_1": "Mumbai",
+				"address_2": "",
+				"city": "Dadar",
+				"state": "MH",
+				"postcode": "123",
+				"country": "IN",
+			},
+			"payment_method": "cod",
+			"payment_method_title": "Cash on delivery",
+			"transaction_id": "",
+			"date_paid": "",
+			"date_paid_gmt": "",
+			"date_completed": "",
+			"date_completed_gmt": "",
+			"cart_hash": "8e76b020d5790066496f244860c4703f",
+			"meta_data": [],
+			"line_items": [
+				{
+					"id": 80,
+					"name": "Marvel",
+					"product_id": 56,
+					"variation_id": 0,
+					"quantity": 1,
+					"tax_class": "",
+					"subtotal": "499.00",
+					"subtotal_tax": "0.00",
+					"total": "499.00",
+					"total_tax": "0.00",
+					"taxes": [],
+					"meta_data": [],
+					"sku": "",
+					"price": 499,
+				}
+			],
+			"tax_lines": [],
+			"shipping_lines": [
+				{
+					"id": 81,
+					"method_title": "Flat rate",
+					"method_id": "flat_rate:1",
+					"total": "150.00",
+					"total_tax": "0.00",
+					"taxes": [],
+					"meta_data": [{"id": 623, "key": "Items", "value": "Marvel &times; 1"}],
+				}
+			],
+			"fee_lines": [],
+			"coupon_lines": [],
+			"refunds": [],
+		}
 		order()
 
-		self.assertTrue(frappe.get_value("Customer",{"woocommerce_email":"tony@gmail.com"}))
-		self.assertTrue(frappe.get_value("Item",{"woocommerce_id": 56}))
-		self.assertTrue(frappe.get_value("Sales Order",{"woocommerce_id":75}))
+		self.assertTrue(frappe.get_value("Customer", {"woocommerce_email": "tony@gmail.com"}))
+		self.assertTrue(frappe.get_value("Item", {"woocommerce_id": 56}))
+		self.assertTrue(frappe.get_value("Sales Order", {"woocommerce_id": 75}))
 		frappe.flags.woocomm_test_order_data = {}
 
+
 def emulate_request():
 	# Emulate Woocommerce Request
 	headers = {
-		"X-Wc-Webhook-Event":"created",
-		"X-Wc-Webhook-Signature":"h1SjzQMPwd68MF5bficeFq20/RkQeRLsb9AVCUz/rLs="
+		"X-Wc-Webhook-Event": "created",
+		"X-Wc-Webhook-Signature": "h1SjzQMPwd68MF5bficeFq20/RkQeRLsb9AVCUz/rLs=",
 	}
 	# Emulate Request Data
 	data = """{"id":74,"parent_id":0,"number":"74","order_key":"wc_order_5aa1281c2dacb","created_via":"checkout","version":"3.3.3","status":"processing","currency":"INR","date_created":"2018-03-08T12:10:04","date_created_gmt":"2018-03-08T12:10:04","date_modified":"2018-03-08T12:10:04","date_modified_gmt":"2018-03-08T12:10:04","discount_total":"0.00","discount_tax":"0.00","shipping_total":"150.00","shipping_tax":"0.00","cart_tax":"0.00","total":"649.00","total_tax":"0.00","prices_include_tax":false,"customer_id":12,"customer_ip_address":"103.54.99.5","customer_user_agent":"mozilla\\/5.0 (x11; linux x86_64) applewebkit\\/537.36 (khtml, like gecko) chrome\\/64.0.3282.186 safari\\/537.36","customer_note":"","billing":{"first_name":"Tony","last_name":"Stark","company":"Woocommerce","address_1":"Mumbai","address_2":"","city":"Dadar","state":"MH","postcode":"123","country":"IN","email":"tony@gmail.com","phone":"123457890"},"shipping":{"first_name":"Tony","last_name":"Stark","company":"","address_1":"Mumbai","address_2":"","city":"Dadar","state":"MH","postcode":"123","country":"IN"},"payment_method":"cod","payment_method_title":"Cash on delivery","transaction_id":"","date_paid":null,"date_paid_gmt":null,"date_completed":null,"date_completed_gmt":null,"cart_hash":"8e76b020d5790066496f244860c4703f","meta_data":[],"line_items":[{"id":80,"name":"Marvel","product_id":56,"variation_id":0,"quantity":1,"tax_class":"","subtotal":"499.00","subtotal_tax":"0.00","total":"499.00","total_tax":"0.00","taxes":[],"meta_data":[],"sku":"","price":499}],"tax_lines":[],"shipping_lines":[{"id":81,"method_title":"Flat rate","method_id":"flat_rate:1","total":"150.00","total_tax":"0.00","taxes":[],"meta_data":[{"id":623,"key":"Items","value":"Marvel &times; 1"}]}],"fee_lines":[],"coupon_lines":[],"refunds":[]}"""
 
 	# Build URL
-	port = frappe.get_site_config().webserver_port or '8000'
+	port = frappe.get_site_config().webserver_port or "8000"
 
-	if os.environ.get('CI'):
-		host = 'localhost'
+	if os.environ.get("CI"):
+		host = "localhost"
 	else:
 		host = frappe.local.site
 
-	url = "http://{site}:{port}/api/method/erpnext.erpnext_integrations.connectors.woocommerce_connection.order".format(site=host, port=port)
+	url = "http://{site}:{port}/api/method/erpnext.erpnext_integrations.connectors.woocommerce_connection.order".format(
+		site=host, port=port
+	)
 
 	r = requests.post(url=url, headers=headers, data=data)
 
diff --git a/erpnext/tests/test_zform_loads.py b/erpnext/tests/test_zform_loads.py
index 5b82c7b..26e60c0 100644
--- a/erpnext/tests/test_zform_loads.py
+++ b/erpnext/tests/test_zform_loads.py
@@ -7,11 +7,14 @@
 
 
 class TestFormLoads(FrappeTestCase):
-
 	@change_settings("Print Settings", {"allow_print_for_cancelled": 1})
 	def test_load(self):
 		erpnext_modules = frappe.get_all("Module Def", filters={"app_name": "erpnext"}, pluck="name")
-		doctypes = frappe.get_all("DocType", {"istable": 0, "issingle": 0, "is_virtual": 0, "module": ("in", erpnext_modules)}, pluck="name")
+		doctypes = frappe.get_all(
+			"DocType",
+			{"istable": 0, "issingle": 0, "is_virtual": 0, "module": ("in", erpnext_modules)},
+			pluck="name",
+		)
 
 		for doctype in doctypes:
 			last_doc = frappe.db.get_value(doctype, {}, "name", order_by="modified desc")
@@ -23,7 +26,7 @@
 
 	def assertFormLoad(self, doctype, docname):
 		# reset previous response
-		frappe.response = frappe._dict({"docs":[]})
+		frappe.response = frappe._dict({"docs": []})
 		frappe.response.docinfo = None
 
 		try:
@@ -31,8 +34,12 @@
 		except Exception as e:
 			self.fail(f"Failed to load {doctype}-{docname}: {e}")
 
-		self.assertTrue(frappe.response.docs, msg=f"expected document in reponse, found: {frappe.response.docs}")
-		self.assertTrue(frappe.response.docinfo, msg=f"expected docinfo in reponse, found: {frappe.response.docinfo}")
+		self.assertTrue(
+			frappe.response.docs, msg=f"expected document in reponse, found: {frappe.response.docs}"
+		)
+		self.assertTrue(
+			frappe.response.docinfo, msg=f"expected docinfo in reponse, found: {frappe.response.docinfo}"
+		)
 
 	def assertDocPrint(self, doctype, docname):
 		doc = frappe.get_doc(doctype, docname)
@@ -44,9 +51,8 @@
 		messages_after = frappe.get_message_log()
 
 		if len(messages_after) > len(messages_before):
-			new_messages = messages_after[len(messages_before):]
-			self.fail("Print view showing error/warnings: \n"
-					+ "\n".join(str(msg) for msg in new_messages))
+			new_messages = messages_after[len(messages_before) :]
+			self.fail("Print view showing error/warnings: \n" + "\n".join(str(msg) for msg in new_messages))
 
 		# html should exist
 		self.assertTrue(bool(ret["html"]))
diff --git a/erpnext/tests/ui_test_bulk_transaction_processing.py b/erpnext/tests/ui_test_bulk_transaction_processing.py
index d78689e..a0dc76d 100644
--- a/erpnext/tests/ui_test_bulk_transaction_processing.py
+++ b/erpnext/tests/ui_test_bulk_transaction_processing.py
@@ -18,4 +18,4 @@
 	gd.set("default_company", "Test Bulk")
 	gd.save()
 	frappe.clear_cache()
-	create_so()
\ No newline at end of file
+	create_so()
diff --git a/erpnext/tests/ui_test_helpers.py b/erpnext/tests/ui_test_helpers.py
index 9c8c371..44834c8 100644
--- a/erpnext/tests/ui_test_helpers.py
+++ b/erpnext/tests/ui_test_helpers.py
@@ -9,54 +9,67 @@
 
 	frappe.db.sql("DELETE FROM tabEmployee WHERE company='Test Org Chart'")
 
-	emp1 = create_employee('Test Employee 1', 'CEO')
-	emp2 = create_employee('Test Employee 2', 'CTO')
-	emp3 = create_employee('Test Employee 3', 'Head of Marketing and Sales', emp1)
-	emp4 = create_employee('Test Employee 4', 'Project Manager', emp2)
-	emp5 = create_employee('Test Employee 5', 'Engineer', emp2)
-	emp6 = create_employee('Test Employee 6', 'Analyst', emp3)
-	emp7 = create_employee('Test Employee 7', 'Software Developer', emp4)
+	emp1 = create_employee("Test Employee 1", "CEO")
+	emp2 = create_employee("Test Employee 2", "CTO")
+	emp3 = create_employee("Test Employee 3", "Head of Marketing and Sales", emp1)
+	emp4 = create_employee("Test Employee 4", "Project Manager", emp2)
+	emp5 = create_employee("Test Employee 5", "Engineer", emp2)
+	emp6 = create_employee("Test Employee 6", "Analyst", emp3)
+	emp7 = create_employee("Test Employee 7", "Software Developer", emp4)
 
 	employees = [emp1, emp2, emp3, emp4, emp5, emp6, emp7]
 	return employees
 
+
 @frappe.whitelist()
 def get_employee_records():
-	return frappe.db.get_list('Employee', filters={
-		'company': 'Test Org Chart'
-	}, pluck='name', order_by='name')
+	return frappe.db.get_list(
+		"Employee", filters={"company": "Test Org Chart"}, pluck="name", order_by="name"
+	)
+
 
 def create_company():
-	company = frappe.db.exists('Company', 'Test Org Chart')
+	company = frappe.db.exists("Company", "Test Org Chart")
 	if not company:
-		company = frappe.get_doc({
-			'doctype': 'Company',
-			'company_name': 'Test Org Chart',
-			'country': 'India',
-			'default_currency': 'INR'
-		}).insert().name
+		company = (
+			frappe.get_doc(
+				{
+					"doctype": "Company",
+					"company_name": "Test Org Chart",
+					"country": "India",
+					"default_currency": "INR",
+				}
+			)
+			.insert()
+			.name
+		)
 
 	return company
 
+
 def create_employee(first_name, designation, reports_to=None):
-	employee = frappe.db.exists('Employee', {'first_name': first_name, 'designation': designation})
+	employee = frappe.db.exists("Employee", {"first_name": first_name, "designation": designation})
 	if not employee:
-		employee = frappe.get_doc({
-			'doctype': 'Employee',
-			'first_name': first_name,
-			'company': 'Test Org Chart',
-			'gender': 'Female',
-			'date_of_birth': getdate('08-12-1998'),
-			'date_of_joining': getdate('01-01-2021'),
-			'designation': designation,
-			'reports_to': reports_to
-		}).insert().name
+		employee = (
+			frappe.get_doc(
+				{
+					"doctype": "Employee",
+					"first_name": first_name,
+					"company": "Test Org Chart",
+					"gender": "Female",
+					"date_of_birth": getdate("08-12-1998"),
+					"date_of_joining": getdate("01-01-2021"),
+					"designation": designation,
+					"reports_to": reports_to,
+				}
+			)
+			.insert()
+			.name
+		)
 
 	return employee
 
+
 def create_missing_designation():
-	if not frappe.db.exists('Designation', 'CTO'):
-		frappe.get_doc({
-			'doctype': 'Designation',
-			'designation_name': 'CTO'
-		}).insert()
+	if not frappe.db.exists("Designation", "CTO"):
+		frappe.get_doc({"doctype": "Designation", "designation_name": "CTO"}).insert()
diff --git a/erpnext/tests/utils.py b/erpnext/tests/utils.py
index d795253..159ce70 100644
--- a/erpnext/tests/utils.py
+++ b/erpnext/tests/utils.py
@@ -9,83 +9,77 @@
 ReportFilters = Dict[str, Any]
 ReportName = NewType("ReportName", str)
 
+
 def create_test_contact_and_address():
-	frappe.db.sql('delete from tabContact')
-	frappe.db.sql('delete from `tabContact Email`')
-	frappe.db.sql('delete from `tabContact Phone`')
-	frappe.db.sql('delete from tabAddress')
-	frappe.db.sql('delete from `tabDynamic Link`')
+	frappe.db.sql("delete from tabContact")
+	frappe.db.sql("delete from `tabContact Email`")
+	frappe.db.sql("delete from `tabContact Phone`")
+	frappe.db.sql("delete from tabAddress")
+	frappe.db.sql("delete from `tabDynamic Link`")
 
-	frappe.get_doc({
-		"doctype": "Address",
-		"address_title": "_Test Address for Customer",
-		"address_type": "Office",
-		"address_line1": "Station Road",
-		"city": "_Test City",
-		"state": "Test State",
-		"country": "India",
-		"links": [
-			{
-				"link_doctype": "Customer",
-				"link_name": "_Test Customer"
-			}
-		]
-	}).insert()
+	frappe.get_doc(
+		{
+			"doctype": "Address",
+			"address_title": "_Test Address for Customer",
+			"address_type": "Office",
+			"address_line1": "Station Road",
+			"city": "_Test City",
+			"state": "Test State",
+			"country": "India",
+			"links": [{"link_doctype": "Customer", "link_name": "_Test Customer"}],
+		}
+	).insert()
 
-	contact = frappe.get_doc({
-		"doctype": 'Contact',
-		"first_name": "_Test Contact for _Test Customer",
-		"links": [
-			{
-				"link_doctype": "Customer",
-				"link_name": "_Test Customer"
-			}
-		]
-	})
+	contact = frappe.get_doc(
+		{
+			"doctype": "Contact",
+			"first_name": "_Test Contact for _Test Customer",
+			"links": [{"link_doctype": "Customer", "link_name": "_Test Customer"}],
+		}
+	)
 	contact.add_email("test_contact_customer@example.com", is_primary=True)
 	contact.add_phone("+91 0000000000", is_primary_phone=True)
 	contact.insert()
 
-	contact_two = frappe.get_doc({
-		"doctype": 'Contact',
-		"first_name": "_Test Contact 2 for _Test Customer",
-		"links": [
-			{
-				"link_doctype": "Customer",
-				"link_name": "_Test Customer"
-			}
-		]
-	})
+	contact_two = frappe.get_doc(
+		{
+			"doctype": "Contact",
+			"first_name": "_Test Contact 2 for _Test Customer",
+			"links": [{"link_doctype": "Customer", "link_name": "_Test Customer"}],
+		}
+	)
 	contact_two.add_email("test_contact_two_customer@example.com", is_primary=True)
 	contact_two.add_phone("+92 0000000000", is_primary_phone=True)
 	contact_two.insert()
 
 
 def execute_script_report(
-		report_name: ReportName,
-		module: str,
-		filters: ReportFilters,
-		default_filters: Optional[ReportFilters] = None,
-		optional_filters: Optional[ReportFilters] = None
-	):
+	report_name: ReportName,
+	module: str,
+	filters: ReportFilters,
+	default_filters: Optional[ReportFilters] = None,
+	optional_filters: Optional[ReportFilters] = None,
+):
 	"""Util for testing execution of a report with specified filters.
 
 	Tests the execution of report with default_filters + filters.
 	Tests the execution using optional_filters one at a time.
 
 	Args:
-		report_name: Human readable name of report (unscrubbed)
-		module: module to which report belongs to
-		filters: specific values for filters
-		default_filters: default values for filters such as company name.
-		optional_filters: filters which should be tested one at a time in addition to default filters.
+	        report_name: Human readable name of report (unscrubbed)
+	        module: module to which report belongs to
+	        filters: specific values for filters
+	        default_filters: default values for filters such as company name.
+	        optional_filters: filters which should be tested one at a time in addition to default filters.
 	"""
 
 	if default_filters is None:
 		default_filters = {}
 
 	test_filters = []
-	report_execute_fn = frappe.get_attr(get_report_module_dotted_path(module, report_name) + ".execute")
+	report_execute_fn = frappe.get_attr(
+		get_report_module_dotted_path(module, report_name) + ".execute"
+	)
 	report_filters = frappe._dict(default_filters).copy().update(filters)
 
 	test_filters.append(report_filters)
diff --git a/erpnext/utilities/__init__.py b/erpnext/utilities/__init__.py
index 3749cde..c2b4229 100644
--- a/erpnext/utilities/__init__.py
+++ b/erpnext/utilities/__init__.py
@@ -7,9 +7,12 @@
 
 
 def update_doctypes():
-	for d in frappe.db.sql("""select df.parent, df.fieldname
+	for d in frappe.db.sql(
+		"""select df.parent, df.fieldname
 		from tabDocField df, tabDocType dt where df.fieldname
-		like "%description%" and df.parent = dt.name and dt.istable = 1""", as_dict=1):
+		like "%description%" and df.parent = dt.name and dt.istable = 1""",
+		as_dict=1,
+	):
 		dt = frappe.get_doc("DocType", d.parent)
 
 		for f in dt.fields:
@@ -18,20 +21,17 @@
 				dt.save()
 				break
 
+
 def get_site_info(site_info):
 	# called via hook
-	company = frappe.db.get_single_value('Global Defaults', 'default_company')
+	company = frappe.db.get_single_value("Global Defaults", "default_company")
 	domain = None
 
 	if not company:
-		company = frappe.db.sql('select name from `tabCompany` order by creation asc')
+		company = frappe.db.sql("select name from `tabCompany` order by creation asc")
 		company = company[0][0] if company else None
 
 	if company:
-		domain = frappe.get_cached_value('Company',  cstr(company),  'domain')
+		domain = frappe.get_cached_value("Company", cstr(company), "domain")
 
-	return {
-		'company': company,
-		'domain': domain,
-		'activation': get_level()
-	}
+	return {"company": company, "domain": domain, "activation": get_level()}
diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py
index faf3fd4..43af0dc 100644
--- a/erpnext/utilities/activation.py
+++ b/erpnext/utilities/activation.py
@@ -41,7 +41,7 @@
 		"Supplier": 5,
 		"Task": 5,
 		"User": 5,
-		"Work Order": 5
+		"Work Order": 5,
 	}
 
 	for doctype, min_count in doctypes.items():
@@ -50,111 +50,118 @@
 			activation_level += 1
 		sales_data.append({doctype: count})
 
-	if frappe.db.get_single_value('System Settings', 'setup_complete'):
+	if frappe.db.get_single_value("System Settings", "setup_complete"):
 		activation_level += 1
 
-	communication_number = frappe.db.count('Communication', dict(communication_medium='Email'))
+	communication_number = frappe.db.count("Communication", dict(communication_medium="Email"))
 	if communication_number > 10:
 		activation_level += 1
 	sales_data.append({"Communication": communication_number})
 
 	# recent login
-	if frappe.db.sql('select name from tabUser where last_login > date_sub(now(), interval 2 day) limit 1'):
+	if frappe.db.sql(
+		"select name from tabUser where last_login > date_sub(now(), interval 2 day) limit 1"
+	):
 		activation_level += 1
 
 	level = {"activation_level": activation_level, "sales_data": sales_data}
 
 	return level
 
+
 def get_help_messages():
-	'''Returns help messages to be shown on Desktop'''
+	"""Returns help messages to be shown on Desktop"""
 	if get_level() > 6:
 		return []
 
-	domain = frappe.get_cached_value('Company',  erpnext.get_default_company(),  'domain')
+	domain = frappe.get_cached_value("Company", erpnext.get_default_company(), "domain")
 	messages = []
 
 	message_settings = [
 		frappe._dict(
-			doctype='Lead',
-			title=_('Create Leads'),
-			description=_('Leads help you get business, add all your contacts and more as your leads'),
-			action=_('Create Lead'),
-			route='List/Lead',
-			domain=('Manufacturing', 'Retail', 'Services', 'Distribution'),
-			target=3
+			doctype="Lead",
+			title=_("Create Leads"),
+			description=_("Leads help you get business, add all your contacts and more as your leads"),
+			action=_("Create Lead"),
+			route="List/Lead",
+			domain=("Manufacturing", "Retail", "Services", "Distribution"),
+			target=3,
 		),
 		frappe._dict(
-			doctype='Quotation',
-			title=_('Create customer quotes'),
-			description=_('Quotations are proposals, bids you have sent to your customers'),
-			action=_('Create Quotation'),
-			route='List/Quotation',
-			domain=('Manufacturing', 'Retail', 'Services', 'Distribution'),
-			target=3
+			doctype="Quotation",
+			title=_("Create customer quotes"),
+			description=_("Quotations are proposals, bids you have sent to your customers"),
+			action=_("Create Quotation"),
+			route="List/Quotation",
+			domain=("Manufacturing", "Retail", "Services", "Distribution"),
+			target=3,
 		),
 		frappe._dict(
-			doctype='Sales Order',
-			title=_('Manage your orders'),
-			description=_('Create Sales Orders to help you plan your work and deliver on-time'),
-			action=_('Create Sales Order'),
-			route='List/Sales Order',
-			domain=('Manufacturing', 'Retail', 'Services', 'Distribution'),
-			target=3
+			doctype="Sales Order",
+			title=_("Manage your orders"),
+			description=_("Create Sales Orders to help you plan your work and deliver on-time"),
+			action=_("Create Sales Order"),
+			route="List/Sales Order",
+			domain=("Manufacturing", "Retail", "Services", "Distribution"),
+			target=3,
 		),
 		frappe._dict(
-			doctype='Purchase Order',
-			title=_('Create Purchase Orders'),
-			description=_('Purchase orders help you plan and follow up on your purchases'),
-			action=_('Create Purchase Order'),
-			route='List/Purchase Order',
-			domain=('Manufacturing', 'Retail', 'Services', 'Distribution'),
-			target=3
+			doctype="Purchase Order",
+			title=_("Create Purchase Orders"),
+			description=_("Purchase orders help you plan and follow up on your purchases"),
+			action=_("Create Purchase Order"),
+			route="List/Purchase Order",
+			domain=("Manufacturing", "Retail", "Services", "Distribution"),
+			target=3,
 		),
 		frappe._dict(
-			doctype='User',
-			title=_('Create Users'),
-			description=_('Add the rest of your organization as your users. You can also add invite Customers to your portal by adding them from Contacts'),
-			action=_('Create User'),
-			route='List/User',
-			domain=('Manufacturing', 'Retail', 'Services', 'Distribution'),
-			target=3
+			doctype="User",
+			title=_("Create Users"),
+			description=_(
+				"Add the rest of your organization as your users. You can also add invite Customers to your portal by adding them from Contacts"
+			),
+			action=_("Create User"),
+			route="List/User",
+			domain=("Manufacturing", "Retail", "Services", "Distribution"),
+			target=3,
 		),
 		frappe._dict(
-			doctype='Timesheet',
-			title=_('Add Timesheets'),
-			description=_('Timesheets help keep track of time, cost and billing for activites done by your team'),
-			action=_('Create Timesheet'),
-			route='List/Timesheet',
-			domain=('Services',),
-			target=5
+			doctype="Timesheet",
+			title=_("Add Timesheets"),
+			description=_(
+				"Timesheets help keep track of time, cost and billing for activites done by your team"
+			),
+			action=_("Create Timesheet"),
+			route="List/Timesheet",
+			domain=("Services",),
+			target=5,
 		),
 		frappe._dict(
-			doctype='Student',
-			title=_('Add Students'),
-			description=_('Students are at the heart of the system, add all your students'),
-			action=_('Create Student'),
-			route='List/Student',
-			domain=('Education',),
-			target=5
+			doctype="Student",
+			title=_("Add Students"),
+			description=_("Students are at the heart of the system, add all your students"),
+			action=_("Create Student"),
+			route="List/Student",
+			domain=("Education",),
+			target=5,
 		),
 		frappe._dict(
-			doctype='Student Batch',
-			title=_('Group your students in batches'),
-			description=_('Student Batches help you track attendance, assessments and fees for students'),
-			action=_('Create Student Batch'),
-			route='List/Student Batch',
-			domain=('Education',),
-			target=3
+			doctype="Student Batch",
+			title=_("Group your students in batches"),
+			description=_("Student Batches help you track attendance, assessments and fees for students"),
+			action=_("Create Student Batch"),
+			route="List/Student Batch",
+			domain=("Education",),
+			target=3,
 		),
 		frappe._dict(
-			doctype='Employee',
-			title=_('Create Employee Records'),
-			description=_('Create Employee records to manage leaves, expense claims and payroll'),
-			action=_('Create Employee'),
-			route='List/Employee',
-			target=3
-		)
+			doctype="Employee",
+			title=_("Create Employee Records"),
+			description=_("Create Employee records to manage leaves, expense claims and payroll"),
+			action=_("Create Employee"),
+			route="List/Employee",
+			target=3,
+		),
 	]
 
 	for m in message_settings:
diff --git a/erpnext/utilities/bot.py b/erpnext/utilities/bot.py
index 87a3508..5c2e576 100644
--- a/erpnext/utilities/bot.py
+++ b/erpnext/utilities/bot.py
@@ -9,13 +9,16 @@
 
 class FindItemBot(BotParser):
 	def get_reply(self):
-		if self.startswith('where is', 'find item', 'locate'):
-			if not frappe.has_permission('Warehouse'):
+		if self.startswith("where is", "find item", "locate"):
+			if not frappe.has_permission("Warehouse"):
 				raise frappe.PermissionError
 
-			item = '%{0}%'.format(self.strip_words(self.query, 'where is', 'find item', 'locate'))
-			items = frappe.db.sql('''select name from `tabItem` where item_code like %(txt)s
-				or item_name like %(txt)s or description like %(txt)s''', dict(txt=item))
+			item = "%{0}%".format(self.strip_words(self.query, "where is", "find item", "locate"))
+			items = frappe.db.sql(
+				"""select name from `tabItem` where item_code like %(txt)s
+				or item_name like %(txt)s or description like %(txt)s""",
+				dict(txt=item),
+			)
 
 			if items:
 				out = []
@@ -23,14 +26,19 @@
 				for item in items:
 					found = False
 					for warehouse in warehouses:
-						qty = frappe.db.get_value("Bin", {'item_code': item[0], 'warehouse': warehouse.name}, 'actual_qty')
+						qty = frappe.db.get_value(
+							"Bin", {"item_code": item[0], "warehouse": warehouse.name}, "actual_qty"
+						)
 						if qty:
-							out.append(_('{0} units of [{1}](/app/Form/Item/{1}) found in [{2}](/app/Form/Warehouse/{2})').format(qty,
-								item[0], warehouse.name))
+							out.append(
+								_("{0} units of [{1}](/app/Form/Item/{1}) found in [{2}](/app/Form/Warehouse/{2})").format(
+									qty, item[0], warehouse.name
+								)
+							)
 							found = True
 
 					if not found:
-						out.append(_('[{0}](/app/Form/Item/{0}) is out of stock').format(item[0]))
+						out.append(_("[{0}](/app/Form/Item/{0}) is out of stock").format(item[0]))
 
 				return "\n\n".join(out)
 
diff --git a/erpnext/utilities/bulk_transaction.py b/erpnext/utilities/bulk_transaction.py
index 64e2ff4..bfcba07 100644
--- a/erpnext/utilities/bulk_transaction.py
+++ b/erpnext/utilities/bulk_transaction.py
@@ -45,9 +45,13 @@
 			frappe.db.rollback(save_point="before_creation_state")
 			failed_history.append(e)
 			failed.append(e)
-			update_logger(doc_name, e, from_doctype, to_doctype, status="Failed", log_date=str(date.today()))
+			update_logger(
+				doc_name, e, from_doctype, to_doctype, status="Failed", log_date=str(date.today())
+			)
 		if not failed:
-			update_logger(doc_name, None, from_doctype, to_doctype, status="Success", log_date=str(date.today()))
+			update_logger(
+				doc_name, None, from_doctype, to_doctype, status="Success", log_date=str(date.today())
+			)
 
 	show_job_status(failed_history, deserialized_data, to_doctype)
 
@@ -96,7 +100,7 @@
 		},
 		"Purchase Receipt": {"Purchase Invoice": purchase_receipt.make_purchase_invoice},
 	}
-	if to_doctype in ['Advance Payment', 'Payment']:
+	if to_doctype in ["Advance Payment", "Payment"]:
 		obj = mapper[from_doctype][to_doctype](from_doctype, doc_name)
 	else:
 		obj = mapper[from_doctype][to_doctype](doc_name)
@@ -142,9 +146,7 @@
 	else:
 		log_doc = get_logger_doc(log_date)
 		if record_exists(log_doc, doc_name, status):
-			append_data_to_logger(
-				log_doc, doc_name, e, from_doctype, to_doctype, status, restarted
-			)
+			append_data_to_logger(log_doc, doc_name, e, from_doctype, to_doctype, status, restarted)
 			log_doc.save()
 
 
@@ -158,20 +160,20 @@
 
 	if len(failed_history) != 0 and len(failed_history) < len(deserialized_data):
 		frappe.msgprint(
-			_("""Creation of {0} partially successful.
-				Check <b><a href="/app/bulk-transaction-log">Bulk Transaction Log</a></b>""").format(
-				to_doctype
-			),
+			_(
+				"""Creation of {0} partially successful.
+				Check <b><a href="/app/bulk-transaction-log">Bulk Transaction Log</a></b>"""
+			).format(to_doctype),
 			title="Partially successful",
 			indicator="orange",
 		)
 
 	if len(failed_history) == len(deserialized_data):
 		frappe.msgprint(
-			_("""Creation of {0} failed.
-				Check <b><a href="/app/bulk-transaction-log">Bulk Transaction Log</a></b>""").format(
-				to_doctype
-			),
+			_(
+				"""Creation of {0} failed.
+				Check <b><a href="/app/bulk-transaction-log">Bulk Transaction Log</a></b>"""
+			).format(to_doctype),
 			title="Failed",
 			indicator="red",
 		)
@@ -198,4 +200,4 @@
 
 	log_doc.save()
 
-	return record
\ No newline at end of file
+	return record
diff --git a/erpnext/utilities/doctype/rename_tool/rename_tool.py b/erpnext/utilities/doctype/rename_tool/rename_tool.py
index 74de54a..b31574c 100644
--- a/erpnext/utilities/doctype/rename_tool/rename_tool.py
+++ b/erpnext/utilities/doctype/rename_tool/rename_tool.py
@@ -12,14 +12,19 @@
 class RenameTool(Document):
 	pass
 
+
 @frappe.whitelist()
 def get_doctypes():
-	return frappe.db.sql_list("""select name from tabDocType
-		where allow_rename=1 and module!='Core' order by name""")
+	return frappe.db.sql_list(
+		"""select name from tabDocType
+		where allow_rename=1 and module!='Core' order by name"""
+	)
+
 
 @frappe.whitelist()
 def upload(select_doctype=None, rows=None):
 	from frappe.utils.csvutils import read_csv_content_from_attached_file
+
 	if not select_doctype:
 		select_doctype = frappe.form_dict.select_doctype
 
diff --git a/erpnext/utilities/doctype/sms_log/test_sms_log.py b/erpnext/utilities/doctype/sms_log/test_sms_log.py
index 5f7abdc..3ff0202 100644
--- a/erpnext/utilities/doctype/sms_log/test_sms_log.py
+++ b/erpnext/utilities/doctype/sms_log/test_sms_log.py
@@ -5,5 +5,6 @@
 
 # test_records = frappe.get_test_records('SMS Log')
 
+
 class TestSMSLog(unittest.TestCase):
 	pass
diff --git a/erpnext/utilities/doctype/video/video.py b/erpnext/utilities/doctype/video/video.py
index ae13952..330812d 100644
--- a/erpnext/utilities/doctype/video/video.py
+++ b/erpnext/utilities/doctype/video/video.py
@@ -28,16 +28,17 @@
 
 		try:
 			video = api.get_video_by_id(video_id=self.youtube_video_id)
-			video_stats = video.items[0].to_dict().get('statistics')
+			video_stats = video.items[0].to_dict().get("statistics")
 
-			self.like_count = video_stats.get('likeCount')
-			self.view_count = video_stats.get('viewCount')
-			self.dislike_count = video_stats.get('dislikeCount')
-			self.comment_count = video_stats.get('commentCount')
+			self.like_count = video_stats.get("likeCount")
+			self.view_count = video_stats.get("viewCount")
+			self.dislike_count = video_stats.get("dislikeCount")
+			self.comment_count = video_stats.get("commentCount")
 
 		except Exception:
 			title = "Failed to Update YouTube Statistics for Video: {0}".format(self.name)
-			frappe.log_error(title + "\n\n" +  frappe.get_traceback(), title=title)
+			frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
+
 
 def is_tracking_enabled():
 	return frappe.db.get_single_value("Video Settings", "enable_youtube_tracking")
@@ -54,7 +55,9 @@
 
 def update_youtube_data():
 	# Called every 30 minutes via hooks
-	enable_youtube_tracking, frequency = frappe.db.get_value("Video Settings", "Video Settings", ["enable_youtube_tracking", "frequency"])
+	enable_youtube_tracking, frequency = frappe.db.get_value(
+		"Video Settings", "Video Settings", ["enable_youtube_tracking", "frequency"]
+	)
 
 	if not enable_youtube_tracking:
 		return
@@ -77,19 +80,21 @@
 	for video in video_list:
 		ids.append(video.youtube_video_id)
 
-	return ','.join(ids)
+	return ",".join(ids)
 
 
 @frappe.whitelist()
 def get_id_from_url(url):
 	"""
-		Returns video id from url
-		:param youtube url: String URL
+	Returns video id from url
+	:param youtube url: String URL
 	"""
 	if not isinstance(url, str):
 		frappe.throw(_("URL can only be a string"), title=_("Invalid URL"))
 
-	pattern = re.compile(r'[a-z\:\//\.]+(youtube|youtu)\.(com|be)/(watch\?v=|embed/|.+\?v=)?([^"&?\s]{11})?')
+	pattern = re.compile(
+		r'[a-z\:\//\.]+(youtube|youtu)\.(com|be)/(watch\?v=|embed/|.+\?v=)?([^"&?\s]{11})?'
+	)
 	id = pattern.match(url)
 	return id.groups()[-1]
 
@@ -105,7 +110,7 @@
 			return video_stats
 		except Exception:
 			title = "Failed to Update YouTube Statistics"
-			frappe.log_error(title + "\n\n" +  frappe.get_traceback(), title=title)
+			frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
 
 	def prepare_and_set_data(video_list):
 		video_ids = get_formatted_ids(video_list)
@@ -114,24 +119,27 @@
 
 	def set_youtube_data(entries):
 		for entry in entries:
-			video_stats = entry.to_dict().get('statistics')
-			video_id = entry.to_dict().get('id')
+			video_stats = entry.to_dict().get("statistics")
+			video_id = entry.to_dict().get("id")
 			stats = {
-				'like_count' : video_stats.get('likeCount'),
-				'view_count' : video_stats.get('viewCount'),
-				'dislike_count' : video_stats.get('dislikeCount'),
-				'comment_count' : video_stats.get('commentCount'),
-				'video_id': video_id
+				"like_count": video_stats.get("likeCount"),
+				"view_count": video_stats.get("viewCount"),
+				"dislike_count": video_stats.get("dislikeCount"),
+				"comment_count": video_stats.get("commentCount"),
+				"video_id": video_id,
 			}
 
-			frappe.db.sql("""
+			frappe.db.sql(
+				"""
 				UPDATE `tabVideo`
 				SET
 					like_count  = %(like_count)s,
 					view_count = %(view_count)s,
 					dislike_count = %(dislike_count)s,
 					comment_count = %(comment_count)s
-				WHERE youtube_video_id = %(video_id)s""", stats)
+				WHERE youtube_video_id = %(video_id)s""",
+				stats,
+			)
 
 	video_list = frappe.get_all("Video", fields=["youtube_video_id"])
 	if len(video_list) > 50:
diff --git a/erpnext/utilities/doctype/video_settings/video_settings.py b/erpnext/utilities/doctype/video_settings/video_settings.py
index 6f1e2bb..97fbc41 100644
--- a/erpnext/utilities/doctype/video_settings/video_settings.py
+++ b/erpnext/utilities/doctype/video_settings/video_settings.py
@@ -18,5 +18,5 @@
 				build("youtube", "v3", developerKey=self.api_key)
 			except Exception:
 				title = _("Failed to Authenticate the API key.")
-				frappe.log_error(title + "\n\n" +  frappe.get_traceback(), title=title)
+				frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
 				frappe.throw(title + " Please check the error logs.", title=_("Invalid Credentials"))
diff --git a/erpnext/utilities/hierarchy_chart.py b/erpnext/utilities/hierarchy_chart.py
index c18ce10..4bf4353 100644
--- a/erpnext/utilities/hierarchy_chart.py
+++ b/erpnext/utilities/hierarchy_chart.py
@@ -8,11 +8,11 @@
 
 @frappe.whitelist()
 def get_all_nodes(method, company):
-	'''Recursively gets all data from nodes'''
+	"""Recursively gets all data from nodes"""
 	method = frappe.get_attr(method)
 
 	if method not in frappe.whitelisted:
-		frappe.throw(_('Not Permitted'), frappe.PermissionError)
+		frappe.throw(_("Not Permitted"), frappe.PermissionError)
 
 	root_nodes = method(company=company)
 	result = []
@@ -21,14 +21,16 @@
 	for root in root_nodes:
 		data = method(root.id, company)
 		result.append(dict(parent=root.id, parent_name=root.name, data=data))
-		nodes_to_expand.extend([{'id': d.get('id'), 'name': d.get('name')} for d in data if d.get('expandable')])
+		nodes_to_expand.extend(
+			[{"id": d.get("id"), "name": d.get("name")} for d in data if d.get("expandable")]
+		)
 
 	while nodes_to_expand:
 		parent = nodes_to_expand.pop(0)
-		data = method(parent.get('id'), company)
-		result.append(dict(parent=parent.get('id'), parent_name=parent.get('name'), data=data))
+		data = method(parent.get("id"), company)
+		result.append(dict(parent=parent.get("id"), parent_name=parent.get("name"), data=data))
 		for d in data:
-			if d.get('expandable'):
-				nodes_to_expand.append({'id': d.get('id'), 'name': d.get('name')})
+			if d.get("expandable"):
+				nodes_to_expand.append({"id": d.get("id"), "name": d.get("name")})
 
 	return result
diff --git a/erpnext/utilities/product.py b/erpnext/utilities/product.py
index 0a45002..04ee0b3 100644
--- a/erpnext/utilities/product.py
+++ b/erpnext/utilities/product.py
@@ -9,32 +9,41 @@
 
 
 def get_web_item_qty_in_stock(item_code, item_warehouse_field, warehouse=None):
-	in_stock, stock_qty = 0, ''
-	template_item_code, is_stock_item = frappe.db.get_value("Item", item_code, ["variant_of", "is_stock_item"])
+	in_stock, stock_qty = 0, ""
+	template_item_code, is_stock_item = frappe.db.get_value(
+		"Item", item_code, ["variant_of", "is_stock_item"]
+	)
 
 	if not warehouse:
 		warehouse = frappe.db.get_value("Website Item", {"item_code": item_code}, item_warehouse_field)
 
 	if not warehouse and template_item_code and template_item_code != item_code:
-		warehouse = frappe.db.get_value("Website Item", {"item_code": template_item_code}, item_warehouse_field)
+		warehouse = frappe.db.get_value(
+			"Website Item", {"item_code": template_item_code}, item_warehouse_field
+		)
 
 	if warehouse:
-		stock_qty = frappe.db.sql("""
+		stock_qty = frappe.db.sql(
+			"""
 			select GREATEST(S.actual_qty - S.reserved_qty - S.reserved_qty_for_production - S.reserved_qty_for_sub_contract, 0) / IFNULL(C.conversion_factor, 1)
 			from tabBin S
 			inner join `tabItem` I on S.item_code = I.Item_code
 			left join `tabUOM Conversion Detail` C on I.sales_uom = C.uom and C.parent = I.Item_code
-			where S.item_code=%s and S.warehouse=%s""", (item_code, warehouse))
+			where S.item_code=%s and S.warehouse=%s""",
+			(item_code, warehouse),
+		)
 
 		if stock_qty:
 			stock_qty = adjust_qty_for_expired_items(item_code, stock_qty, warehouse)
 			in_stock = stock_qty[0][0] > 0 and 1 or 0
 
-	return frappe._dict({"in_stock": in_stock, "stock_qty": stock_qty, "is_stock_item": is_stock_item})
+	return frappe._dict(
+		{"in_stock": in_stock, "stock_qty": stock_qty, "is_stock_item": is_stock_item}
+	)
 
 
 def adjust_qty_for_expired_items(item_code, stock_qty, warehouse):
-	batches = frappe.get_all('Batch', filters=[{'item': item_code}], fields=['expiry_date', 'name'])
+	batches = frappe.get_all("Batch", filters=[{"item": item_code}], fields=["expiry_date", "name"])
 	expired_batches = get_expired_batches(batches)
 	stock_qty = [list(item) for item in stock_qty]
 
@@ -67,33 +76,42 @@
 
 	return qty
 
+
 def get_price(item_code, price_list, customer_group, company, qty=1):
 	from erpnext.e_commerce.shopping_cart.cart import get_party
 
 	template_item_code = frappe.db.get_value("Item", item_code, "variant_of")
 
 	if price_list:
-		price = frappe.get_all("Item Price", fields=["price_list_rate", "currency"],
-			filters={"price_list": price_list, "item_code": item_code})
+		price = frappe.get_all(
+			"Item Price",
+			fields=["price_list_rate", "currency"],
+			filters={"price_list": price_list, "item_code": item_code},
+		)
 
 		if template_item_code and not price:
-			price = frappe.get_all("Item Price", fields=["price_list_rate", "currency"],
-				filters={"price_list": price_list, "item_code": template_item_code})
+			price = frappe.get_all(
+				"Item Price",
+				fields=["price_list_rate", "currency"],
+				filters={"price_list": price_list, "item_code": template_item_code},
+			)
 
 		if price:
 			party = get_party()
-			pricing_rule_dict = frappe._dict({
-				"item_code": item_code,
-				"qty": qty,
-				"stock_qty": qty,
-				"transaction_type": "selling",
-				"price_list": price_list,
-				"customer_group": customer_group,
-				"company": company,
-				"conversion_rate": 1,
-				"for_shopping_cart": True,
-				"currency": frappe.db.get_value("Price List", price_list, "currency")
-			})
+			pricing_rule_dict = frappe._dict(
+				{
+					"item_code": item_code,
+					"qty": qty,
+					"stock_qty": qty,
+					"transaction_type": "selling",
+					"price_list": price_list,
+					"customer_group": customer_group,
+					"company": company,
+					"conversion_rate": 1,
+					"for_shopping_cart": True,
+					"currency": frappe.db.get_value("Price List", price_list, "currency"),
+				}
+			)
 
 			if party and party.doctype == "Customer":
 				pricing_rule_dict.update({"customer": party.name})
@@ -108,7 +126,9 @@
 				if pricing_rule.pricing_rule_for == "Discount Percentage":
 					price_obj.discount_percent = pricing_rule.discount_percentage
 					price_obj.formatted_discount_percent = str(flt(pricing_rule.discount_percentage, 0)) + "%"
-					price_obj.price_list_rate = flt(price_obj.price_list_rate * (1.0 - (flt(pricing_rule.discount_percentage) / 100.0)))
+					price_obj.price_list_rate = flt(
+						price_obj.price_list_rate * (1.0 - (flt(pricing_rule.discount_percentage) / 100.0))
+					)
 
 				if pricing_rule.pricing_rule_for == "Rate":
 					rate_discount = flt(mrp) - flt(pricing_rule.price_list_rate)
@@ -117,21 +137,33 @@
 					price_obj.price_list_rate = pricing_rule.price_list_rate or 0
 
 			if price_obj:
-				price_obj["formatted_price"] = fmt_money(price_obj["price_list_rate"], currency=price_obj["currency"])
+				price_obj["formatted_price"] = fmt_money(
+					price_obj["price_list_rate"], currency=price_obj["currency"]
+				)
 				if mrp != price_obj["price_list_rate"]:
 					price_obj["formatted_mrp"] = fmt_money(mrp, currency=price_obj["currency"])
 
-				price_obj["currency_symbol"] = not cint(frappe.db.get_default("hide_currency_symbol")) \
-					and (frappe.db.get_value("Currency", price_obj.currency, "symbol", cache=True) or price_obj.currency) \
+				price_obj["currency_symbol"] = (
+					not cint(frappe.db.get_default("hide_currency_symbol"))
+					and (
+						frappe.db.get_value("Currency", price_obj.currency, "symbol", cache=True)
+						or price_obj.currency
+					)
 					or ""
+				)
 
-				uom_conversion_factor = frappe.db.sql("""select	C.conversion_factor
+				uom_conversion_factor = frappe.db.sql(
+					"""select	C.conversion_factor
 					from `tabUOM Conversion Detail` C
 					inner join `tabItem` I on C.parent = I.name and C.uom = I.sales_uom
-					where I.name = %s""", item_code)
+					where I.name = %s""",
+					item_code,
+				)
 
 				uom_conversion_factor = uom_conversion_factor[0][0] if uom_conversion_factor else 1
-				price_obj["formatted_price_sales_uom"] = fmt_money(price_obj["price_list_rate"] * uom_conversion_factor, currency=price_obj["currency"])
+				price_obj["formatted_price_sales_uom"] = fmt_money(
+					price_obj["price_list_rate"] * uom_conversion_factor, currency=price_obj["currency"]
+				)
 
 				if not price_obj["price_list_rate"]:
 					price_obj["price_list_rate"] = 0
@@ -144,11 +176,17 @@
 
 			return price_obj
 
+
 def get_non_stock_item_status(item_code, item_warehouse_field):
 	# if item is a product bundle, check if its bundle items are in stock
 	if frappe.db.exists("Product Bundle", item_code):
 		items = frappe.get_doc("Product Bundle", item_code).get_all_children()
-		bundle_warehouse = frappe.db.get_value("Website Item", {"item_code": item_code}, item_warehouse_field)
-		return all(get_web_item_qty_in_stock(d.item_code, item_warehouse_field, bundle_warehouse).in_stock for d in items)
+		bundle_warehouse = frappe.db.get_value(
+			"Website Item", {"item_code": item_code}, item_warehouse_field
+		)
+		return all(
+			get_web_item_qty_in_stock(d.item_code, item_warehouse_field, bundle_warehouse).in_stock
+			for d in items
+		)
 	else:
 		return 1
diff --git a/erpnext/utilities/report/youtube_interactions/youtube_interactions.py b/erpnext/utilities/report/youtube_interactions/youtube_interactions.py
index a185a70..a65a75f 100644
--- a/erpnext/utilities/report/youtube_interactions/youtube_interactions.py
+++ b/erpnext/utilities/report/youtube_interactions/youtube_interactions.py
@@ -16,91 +16,51 @@
 	chart_data, summary = get_chart_summary_data(data)
 	return columns, data, None, chart_data, summary
 
+
 def get_columns():
 	return [
-		{
-			"label": _("Published Date"),
-			"fieldname": "publish_date",
-			"fieldtype": "Date",
-			"width": 100
-		},
-		{
-			"label": _("Title"),
-			"fieldname": "title",
-			"fieldtype": "Data",
-			"width": 200
-		},
-		{
-			"label": _("Duration"),
-			"fieldname": "duration",
-			"fieldtype": "Duration",
-			"width": 100
-		},
-		{
-			"label": _("Views"),
-			"fieldname": "view_count",
-			"fieldtype": "Float",
-			"width": 200
-		},
-		{
-			"label": _("Likes"),
-			"fieldname": "like_count",
-			"fieldtype": "Float",
-			"width": 200
-		},
-		{
-			"label": _("Dislikes"),
-			"fieldname": "dislike_count",
-			"fieldtype": "Float",
-			"width": 100
-		},
-		{
-			"label": _("Comments"),
-			"fieldname": "comment_count",
-			"fieldtype": "Float",
-			"width": 100
-		}
+		{"label": _("Published Date"), "fieldname": "publish_date", "fieldtype": "Date", "width": 100},
+		{"label": _("Title"), "fieldname": "title", "fieldtype": "Data", "width": 200},
+		{"label": _("Duration"), "fieldname": "duration", "fieldtype": "Duration", "width": 100},
+		{"label": _("Views"), "fieldname": "view_count", "fieldtype": "Float", "width": 200},
+		{"label": _("Likes"), "fieldname": "like_count", "fieldtype": "Float", "width": 200},
+		{"label": _("Dislikes"), "fieldname": "dislike_count", "fieldtype": "Float", "width": 100},
+		{"label": _("Comments"), "fieldname": "comment_count", "fieldtype": "Float", "width": 100},
 	]
 
+
 def get_data(filters):
-	return frappe.db.sql("""
+	return frappe.db.sql(
+		"""
 		SELECT
 			publish_date, title, provider, duration,
 			view_count, like_count, dislike_count, comment_count
 		FROM `tabVideo`
 		WHERE view_count is not null
 			and publish_date between %(from_date)s and %(to_date)s
-		ORDER BY view_count desc""", filters, as_dict=1)
+		ORDER BY view_count desc""",
+		filters,
+		as_dict=1,
+	)
+
 
 def get_chart_summary_data(data):
 	labels, likes, views = [], [], []
 	total_views = 0
 
 	for row in data:
-		labels.append(row.get('title'))
-		likes.append(row.get('like_count'))
-		views.append(row.get('view_count'))
-		total_views += flt(row.get('view_count'))
-
+		labels.append(row.get("title"))
+		likes.append(row.get("like_count"))
+		views.append(row.get("view_count"))
+		total_views += flt(row.get("view_count"))
 
 	chart_data = {
-		"data" : {
-			"labels" : labels,
-			"datasets" : [
-				{
-					"name" : "Likes",
-					"values" : likes
-				},
-				{
-					"name" : "Views",
-					"values" : views
-				}
-			]
+		"data": {
+			"labels": labels,
+			"datasets": [{"name": "Likes", "values": likes}, {"name": "Views", "values": views}],
 		},
 		"type": "bar",
-		"barOptions": {
-			"stacked": 1
-		},
+		"barOptions": {"stacked": 1},
 	}
 
 	summary = [
diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py
index feea228..73cbcd4 100644
--- a/erpnext/utilities/transaction_base.py
+++ b/erpnext/utilities/transaction_base.py
@@ -10,7 +10,9 @@
 from erpnext.controllers.status_updater import StatusUpdater
 
 
-class UOMMustBeIntegerError(frappe.ValidationError): pass
+class UOMMustBeIntegerError(frappe.ValidationError):
+	pass
+
 
 class TransactionBase(StatusUpdater):
 	def validate_posting_time(self):
@@ -18,69 +20,79 @@
 		if frappe.flags.in_import and self.posting_date:
 			self.set_posting_time = 1
 
-		if not getattr(self, 'set_posting_time', None):
+		if not getattr(self, "set_posting_time", None):
 			now = now_datetime()
-			self.posting_date = now.strftime('%Y-%m-%d')
-			self.posting_time = now.strftime('%H:%M:%S.%f')
+			self.posting_date = now.strftime("%Y-%m-%d")
+			self.posting_time = now.strftime("%H:%M:%S.%f")
 		elif self.posting_time:
 			try:
 				get_time(self.posting_time)
 			except ValueError:
-				frappe.throw(_('Invalid Posting Time'))
+				frappe.throw(_("Invalid Posting Time"))
 
 	def add_calendar_event(self, opts, force=False):
-		if cstr(self.contact_by) != cstr(self._prev.contact_by) or \
-				cstr(self.contact_date) != cstr(self._prev.contact_date) or force or \
-				(hasattr(self, "ends_on") and cstr(self.ends_on) != cstr(self._prev.ends_on)):
+		if (
+			cstr(self.contact_by) != cstr(self._prev.contact_by)
+			or cstr(self.contact_date) != cstr(self._prev.contact_date)
+			or force
+			or (hasattr(self, "ends_on") and cstr(self.ends_on) != cstr(self._prev.ends_on))
+		):
 
 			self.delete_events()
 			self._add_calendar_event(opts)
 
 	def delete_events(self):
-		participations = frappe.get_all("Event Participants", filters={"reference_doctype": self.doctype, "reference_docname": self.name,
-			"parenttype": "Event"}, fields=["name", "parent"])
+		participations = frappe.get_all(
+			"Event Participants",
+			filters={
+				"reference_doctype": self.doctype,
+				"reference_docname": self.name,
+				"parenttype": "Event",
+			},
+			fields=["name", "parent"],
+		)
 
 		if participations:
 			for participation in participations:
-				total_participants = frappe.get_all("Event Participants", filters={"parenttype": "Event", "parent": participation.parent})
+				total_participants = frappe.get_all(
+					"Event Participants", filters={"parenttype": "Event", "parent": participation.parent}
+				)
 
 				if len(total_participants) <= 1:
 					frappe.db.sql("delete from `tabEvent` where name='%s'" % participation.parent)
 
 				frappe.db.sql("delete from `tabEvent Participants` where name='%s'" % participation.name)
 
-
 	def _add_calendar_event(self, opts):
 		opts = frappe._dict(opts)
 
 		if self.contact_date:
-			event = frappe.get_doc({
-				"doctype": "Event",
-				"owner": opts.owner or self.owner,
-				"subject": opts.subject,
-				"description": opts.description,
-				"starts_on":  self.contact_date,
-				"ends_on": opts.ends_on,
-				"event_type": "Private"
-			})
-
-			event.append('event_participants', {
-				"reference_doctype": self.doctype,
-				"reference_docname": self.name
+			event = frappe.get_doc(
+				{
+					"doctype": "Event",
+					"owner": opts.owner or self.owner,
+					"subject": opts.subject,
+					"description": opts.description,
+					"starts_on": self.contact_date,
+					"ends_on": opts.ends_on,
+					"event_type": "Private",
 				}
 			)
 
+			event.append(
+				"event_participants", {"reference_doctype": self.doctype, "reference_docname": self.name}
+			)
+
 			event.insert(ignore_permissions=True)
 
 			if frappe.db.exists("User", self.contact_by):
-				frappe.share.add("Event", event.name, self.contact_by,
-					flags={"ignore_share_permission": True})
+				frappe.share.add("Event", event.name, self.contact_by, flags={"ignore_share_permission": True})
 
 	def validate_uom_is_integer(self, uom_field, qty_fields):
 		validate_uom_is_integer(self, uom_field, qty_fields)
 
 	def validate_with_previous_doc(self, ref):
-		self.exclude_fields = ["conversion_factor", "uom"] if self.get('is_return') else []
+		self.exclude_fields = ["conversion_factor", "uom"] if self.get("is_return") else []
 
 		for key, val in ref.items():
 			is_child = val.get("is_child_table")
@@ -105,8 +117,9 @@
 	def compare_values(self, ref_doc, fields, doc=None):
 		for reference_doctype, ref_dn_list in ref_doc.items():
 			for reference_name in ref_dn_list:
-				prevdoc_values = frappe.db.get_value(reference_doctype, reference_name,
-					[d[0] for d in fields], as_dict=1)
+				prevdoc_values = frappe.db.get_value(
+					reference_doctype, reference_name, [d[0] for d in fields], as_dict=1
+				)
 
 				if not prevdoc_values:
 					frappe.throw(_("Invalid reference {0} {1}").format(reference_doctype, reference_name))
@@ -115,7 +128,6 @@
 					if prevdoc_values[field] is not None and field not in self.exclude_fields:
 						self.validate_value(field, condition, prevdoc_values[field], doc)
 
-
 	def validate_rate_with_reference_doc(self, ref_details):
 		buying_doctypes = ["Purchase Order", "Purchase Invoice", "Purchase Receipt"]
 
@@ -131,17 +143,26 @@
 				if d.get(ref_link_field):
 					ref_rate = frappe.db.get_value(ref_dt + " Item", d.get(ref_link_field), "rate")
 
-					if abs(flt(d.rate - ref_rate, d.precision("rate"))) >= .01:
+					if abs(flt(d.rate - ref_rate, d.precision("rate"))) >= 0.01:
 						if action == "Stop":
-							role_allowed_to_override = frappe.db.get_single_value(settings_doc, 'role_to_override_stop_action')
+							role_allowed_to_override = frappe.db.get_single_value(
+								settings_doc, "role_to_override_stop_action"
+							)
 
 							if role_allowed_to_override not in frappe.get_roles():
-								frappe.throw(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
-									d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate))
+								frappe.throw(
+									_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
+										d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate
+									)
+								)
 						else:
-							frappe.msgprint(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
-								d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate), title=_("Warning"), indicator="orange")
-
+							frappe.msgprint(
+								_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
+									d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate
+								),
+								title=_("Warning"),
+								indicator="orange",
+							)
 
 	def get_link_filters(self, for_doctype):
 		if hasattr(self, "prev_link_mapper") and self.prev_link_mapper.get(for_doctype):
@@ -150,11 +171,7 @@
 			values = filter(None, tuple(item.as_dict()[fieldname] for item in self.items))
 
 			if values:
-				ret = {
-					for_doctype : {
-						"filters": [[for_doctype, "name", "in", values]]
-					}
-				}
+				ret = {for_doctype: {"filters": [[for_doctype, "name", "in", values]]}}
 			else:
 				ret = None
 		else:
@@ -163,17 +180,17 @@
 		return ret
 
 	def reset_default_field_value(self, default_field: str, child_table: str, child_table_field: str):
-		""" Reset "Set default X" fields on forms to avoid confusion.
+		"""Reset "Set default X" fields on forms to avoid confusion.
 
-			example:
-				doc = {
-					"set_from_warehouse": "Warehouse A",
-					"items": [{"from_warehouse": "warehouse B"}, {"from_warehouse": "warehouse A"}],
-				}
-				Since this has dissimilar values in child table, the default field will be erased.
+		example:
+		        doc = {
+		                "set_from_warehouse": "Warehouse A",
+		                "items": [{"from_warehouse": "warehouse B"}, {"from_warehouse": "warehouse A"}],
+		        }
+		        Since this has dissimilar values in child table, the default field will be erased.
 
-				doc.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
-			"""
+		        doc.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
+		"""
 		child_table_values = set()
 
 		for row in self.get(child_table):
@@ -182,8 +199,11 @@
 		if len(child_table_values) > 1:
 			self.set(default_field, None)
 
+
 def delete_events(ref_type, ref_name):
-	events = frappe.db.sql_list(""" SELECT
+	events = (
+		frappe.db.sql_list(
+			""" SELECT
 			distinct `tabEvent`.name
 		from
 			`tabEvent`, `tabEvent Participants`
@@ -191,18 +211,27 @@
 			`tabEvent`.name = `tabEvent Participants`.parent
 			and `tabEvent Participants`.reference_doctype = %s
 			and `tabEvent Participants`.reference_docname = %s
-		""", (ref_type, ref_name)) or []
+		""",
+			(ref_type, ref_name),
+		)
+		or []
+	)
 
 	if events:
 		frappe.delete_doc("Event", events, for_reload=True)
 
+
 def validate_uom_is_integer(doc, uom_field, qty_fields, child_dt=None):
 	if isinstance(qty_fields, str):
 		qty_fields = [qty_fields]
 
 	distinct_uoms = list(set(d.get(uom_field) for d in doc.get_all_children()))
-	integer_uoms = list(filter(lambda uom: frappe.db.get_value("UOM", uom,
-		"must_be_whole_number", cache=True) or None, distinct_uoms))
+	integer_uoms = list(
+		filter(
+			lambda uom: frappe.db.get_value("UOM", uom, "must_be_whole_number", cache=True) or None,
+			distinct_uoms,
+		)
+	)
 
 	if not integer_uoms:
 		return
@@ -213,6 +242,11 @@
 				qty = d.get(f)
 				if qty:
 					if abs(cint(qty) - flt(qty)) > 0.0000001:
-						frappe.throw(_("Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}.") \
-							.format(qty, d.idx, frappe.bold(_("Must be Whole Number")), frappe.bold(d.get(uom_field))),
-								UOMMustBeIntegerError)
+						frappe.throw(
+							_(
+								"Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}."
+							).format(
+								qty, d.idx, frappe.bold(_("Must be Whole Number")), frappe.bold(d.get(uom_field))
+							),
+							UOMMustBeIntegerError,
+						)
diff --git a/erpnext/www/all-products/index.py b/erpnext/www/all-products/index.py
index ffaead6..fbf0dce 100644
--- a/erpnext/www/all-products/index.py
+++ b/erpnext/www/all-products/index.py
@@ -5,15 +5,18 @@
 
 sitemap = 1
 
+
 def get_context(context):
 	# Add homepage as parent
 	context.body_class = "product-page"
-	context.parents = [{"name": frappe._("Home"), "route":"/"}]
+	context.parents = [{"name": frappe._("Home"), "route": "/"}]
 
 	filter_engine = ProductFiltersBuilder()
 	context.field_filters = filter_engine.get_field_filters()
 	context.attribute_filters = filter_engine.get_attribute_filters()
 
-	context.page_length = cint(frappe.db.get_single_value('E Commerce Settings', 'products_per_page'))or 20
+	context.page_length = (
+		cint(frappe.db.get_single_value("E Commerce Settings", "products_per_page")) or 20
+	)
 
-	context.no_cache = 1
\ No newline at end of file
+	context.no_cache = 1
diff --git a/erpnext/www/book_appointment/index.py b/erpnext/www/book_appointment/index.py
index 8cda3c1..06e99da 100644
--- a/erpnext/www/book_appointment/index.py
+++ b/erpnext/www/book_appointment/index.py
@@ -11,38 +11,46 @@
 
 
 def get_context(context):
-	is_enabled = frappe.db.get_single_value('Appointment Booking Settings', 'enable_scheduling')
+	is_enabled = frappe.db.get_single_value("Appointment Booking Settings", "enable_scheduling")
 	if is_enabled:
 		return context
 	else:
-		frappe.redirect_to_message(_("Appointment Scheduling Disabled"), _("Appointment Scheduling has been disabled for this site"),
-			http_status_code=302, indicator_color="red")
+		frappe.redirect_to_message(
+			_("Appointment Scheduling Disabled"),
+			_("Appointment Scheduling has been disabled for this site"),
+			http_status_code=302,
+			indicator_color="red",
+		)
 		raise frappe.Redirect
 
+
 @frappe.whitelist(allow_guest=True)
 def get_appointment_settings():
-	settings = frappe.get_doc('Appointment Booking Settings')
-	settings.holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+	settings = frappe.get_doc("Appointment Booking Settings")
+	settings.holiday_list = frappe.get_doc("Holiday List", settings.holiday_list)
 	return settings
 
+
 @frappe.whitelist(allow_guest=True)
 def get_timezones():
 	import pytz
+
 	return pytz.all_timezones
 
+
 @frappe.whitelist(allow_guest=True)
 def get_appointment_slots(date, timezone):
 	# Convert query to local timezones
-	format_string = '%Y-%m-%d %H:%M:%S'
-	query_start_time = datetime.datetime.strptime(date + ' 00:00:00', format_string)
-	query_end_time = datetime.datetime.strptime(date + ' 23:59:59', format_string)
+	format_string = "%Y-%m-%d %H:%M:%S"
+	query_start_time = datetime.datetime.strptime(date + " 00:00:00", format_string)
+	query_end_time = datetime.datetime.strptime(date + " 23:59:59", format_string)
 	query_start_time = convert_to_system_timezone(timezone, query_start_time)
 	query_end_time = convert_to_system_timezone(timezone, query_end_time)
 	now = convert_to_guest_timezone(timezone, datetime.datetime.now())
 
 	# Database queries
-	settings = frappe.get_doc('Appointment Booking Settings')
-	holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+	settings = frappe.get_doc("Appointment Booking Settings")
+	holiday_list = frappe.get_doc("Holiday List", settings.holiday_list)
 	timeslots = get_available_slots_between(query_start_time, query_end_time, settings)
 
 	# Filter and convert timeslots
@@ -58,15 +66,15 @@
 			converted_timeslots.append(dict(time=converted_timeslot, availability=True))
 		else:
 			converted_timeslots.append(dict(time=converted_timeslot, availability=False))
-	date_required = datetime.datetime.strptime(date + ' 00:00:00', format_string).date()
+	date_required = datetime.datetime.strptime(date + " 00:00:00", format_string).date()
 	converted_timeslots = filter_timeslots(date_required, converted_timeslots)
 	return converted_timeslots
 
+
 def get_available_slots_between(query_start_time, query_end_time, settings):
 	records = _get_records(query_start_time, query_end_time, settings)
 	timeslots = []
-	appointment_duration = datetime.timedelta(
-		minutes=settings.appointment_duration)
+	appointment_duration = datetime.timedelta(minutes=settings.appointment_duration)
 	for record in records:
 		if record.day_of_week == WEEKDAYS[query_start_time.weekday()]:
 			current_time = _deltatime_to_datetime(query_start_time, record.from_time)
@@ -82,33 +90,35 @@
 
 @frappe.whitelist(allow_guest=True)
 def create_appointment(date, time, tz, contact):
-	format_string = '%Y-%m-%d %H:%M:%S'
+	format_string = "%Y-%m-%d %H:%M:%S"
 	scheduled_time = datetime.datetime.strptime(date + " " + time, format_string)
 	# Strip tzinfo from datetime objects since it's handled by the doctype
-	scheduled_time = scheduled_time.replace(tzinfo = None)
+	scheduled_time = scheduled_time.replace(tzinfo=None)
 	scheduled_time = convert_to_system_timezone(tz, scheduled_time)
-	scheduled_time = scheduled_time.replace(tzinfo = None)
+	scheduled_time = scheduled_time.replace(tzinfo=None)
 	# Create a appointment document from form
-	appointment = frappe.new_doc('Appointment')
+	appointment = frappe.new_doc("Appointment")
 	appointment.scheduled_time = scheduled_time
 	contact = json.loads(contact)
-	appointment.customer_name = contact.get('name', None)
-	appointment.customer_phone_number = contact.get('number', None)
-	appointment.customer_skype = contact.get('skype', None)
-	appointment.customer_details = contact.get('notes', None)
-	appointment.customer_email = contact.get('email', None)
-	appointment.status = 'Open'
+	appointment.customer_name = contact.get("name", None)
+	appointment.customer_phone_number = contact.get("number", None)
+	appointment.customer_skype = contact.get("skype", None)
+	appointment.customer_details = contact.get("notes", None)
+	appointment.customer_email = contact.get("email", None)
+	appointment.status = "Open"
 	appointment.insert()
 	return appointment
 
+
 # Helper Functions
 def filter_timeslots(date, timeslots):
 	filtered_timeslots = []
 	for timeslot in timeslots:
-		if(timeslot['time'].date() == date):
+		if timeslot["time"].date() == date:
 			filtered_timeslots.append(timeslot)
 	return filtered_timeslots
 
+
 def convert_to_guest_timezone(guest_tz, datetimeobject):
 	guest_tz = pytz.timezone(guest_tz)
 	local_timezone = pytz.timezone(frappe.utils.get_time_zone())
@@ -116,15 +126,18 @@
 	datetimeobject = datetimeobject.astimezone(guest_tz)
 	return datetimeobject
 
-def convert_to_system_timezone(guest_tz,datetimeobject):
+
+def convert_to_system_timezone(guest_tz, datetimeobject):
 	guest_tz = pytz.timezone(guest_tz)
 	datetimeobject = guest_tz.localize(datetimeobject)
 	system_tz = pytz.timezone(frappe.utils.get_time_zone())
 	datetimeobject = datetimeobject.astimezone(system_tz)
 	return datetimeobject
 
+
 def check_availabilty(timeslot, settings):
-	return frappe.db.count('Appointment', {'scheduled_time': timeslot}) < settings.number_of_agents
+	return frappe.db.count("Appointment", {"scheduled_time": timeslot}) < settings.number_of_agents
+
 
 def _is_holiday(date, holiday_list):
 	for holiday in holiday_list.holidays:
@@ -136,7 +149,10 @@
 def _get_records(start_time, end_time, settings):
 	records = []
 	for record in settings.availability_of_slots:
-		if record.day_of_week == WEEKDAYS[start_time.weekday()] or record.day_of_week == WEEKDAYS[end_time.weekday()]:
+		if (
+			record.day_of_week == WEEKDAYS[start_time.weekday()]
+			or record.day_of_week == WEEKDAYS[end_time.weekday()]
+		):
 			records.append(record)
 	return records
 
@@ -148,4 +164,4 @@
 
 def _datetime_to_deltatime(date_time):
 	midnight = datetime.datetime.combine(date_time.date(), datetime.time.min)
-	return (date_time-midnight)
+	return date_time - midnight
diff --git a/erpnext/www/book_appointment/verify/index.py b/erpnext/www/book_appointment/verify/index.py
index dc36f4f..1a5ba9d 100644
--- a/erpnext/www/book_appointment/verify/index.py
+++ b/erpnext/www/book_appointment/verify/index.py
@@ -8,11 +8,11 @@
 		context.success = False
 		return context
 
-	email = frappe.form_dict['email']
-	appointment_name = frappe.form_dict['appointment']
+	email = frappe.form_dict["email"]
+	appointment_name = frappe.form_dict["appointment"]
 
 	if email and appointment_name:
-		appointment = frappe.get_doc('Appointment',appointment_name)
+		appointment = frappe.get_doc("Appointment", appointment_name)
 		appointment.set_verified(email)
 		context.success = True
 		return context
diff --git a/erpnext/www/lms/content.py b/erpnext/www/lms/content.py
index b187a78..99462ce 100644
--- a/erpnext/www/lms/content.py
+++ b/erpnext/www/lms/content.py
@@ -4,28 +4,27 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	# Load Query Parameters
 	try:
-		program = frappe.form_dict['program']
-		content = frappe.form_dict['content']
-		content_type = frappe.form_dict['type']
-		course = frappe.form_dict['course']
-		topic = frappe.form_dict['topic']
+		program = frappe.form_dict["program"]
+		content = frappe.form_dict["content"]
+		content_type = frappe.form_dict["type"]
+		course = frappe.form_dict["course"]
+		topic = frappe.form_dict["topic"]
 	except KeyError:
-		frappe.local.flags.redirect_location = '/lms'
+		frappe.local.flags.redirect_location = "/lms"
 		raise frappe.Redirect
 
-
 	# Check if user has access to the content
 	has_program_access = utils.allowed_program_access(program)
 	has_content_access = allowed_content_access(program, content, content_type)
 
 	if frappe.session.user == "Guest" or not has_program_access or not has_content_access:
-		frappe.local.flags.redirect_location = '/lms'
+		frappe.local.flags.redirect_location = "/lms"
 		raise frappe.Redirect
 
-
 	# Set context for content to be displayer
 	context.content = frappe.get_doc(content_type, content).as_dict()
 	context.content_type = content_type
@@ -34,35 +33,43 @@
 	context.topic = topic
 
 	topic = frappe.get_doc("Topic", topic)
-	content_list = [{'content_type':item.content_type, 'content':item.content} for item in topic.topic_content]
+	content_list = [
+		{"content_type": item.content_type, "content": item.content} for item in topic.topic_content
+	]
 
 	# Set context for progress numbers
-	context.position = content_list.index({'content': content, 'content_type': content_type})
+	context.position = content_list.index({"content": content, "content_type": content_type})
 	context.length = len(content_list)
 
 	# Set context for navigation
 	context.previous = get_previous_content(content_list, context.position)
 	context.next = get_next_content(content_list, context.position)
 
+
 def get_next_content(content_list, current_index):
 	try:
 		return content_list[current_index + 1]
 	except IndexError:
 		return None
 
+
 def get_previous_content(content_list, current_index):
 	if current_index == 0:
 		return None
 	else:
 		return content_list[current_index - 1]
 
+
 def allowed_content_access(program, content, content_type):
-	contents_of_program = frappe.db.sql("""select `tabTopic Content`.content, `tabTopic Content`.content_type
+	contents_of_program = frappe.db.sql(
+		"""select `tabTopic Content`.content, `tabTopic Content`.content_type
 	from `tabCourse Topic`,
 		 `tabProgram Course`,
 		 `tabTopic Content`
 	where `tabCourse Topic`.parent = `tabProgram Course`.course
 			and `tabTopic Content`.parent = `tabCourse Topic`.topic
-			and `tabProgram Course`.parent = %(program)s""", {'program': program})
+			and `tabProgram Course`.parent = %(program)s""",
+		{"program": program},
+	)
 
 	return (content, content_type) in contents_of_program
diff --git a/erpnext/www/lms/course.py b/erpnext/www/lms/course.py
index 012e25c..840beee 100644
--- a/erpnext/www/lms/course.py
+++ b/erpnext/www/lms/course.py
@@ -4,23 +4,25 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	try:
-		program = frappe.form_dict['program']
-		course_name = frappe.form_dict['name']
+		program = frappe.form_dict["program"]
+		course_name = frappe.form_dict["name"]
 	except KeyError:
-		frappe.local.flags.redirect_location = '/lms'
+		frappe.local.flags.redirect_location = "/lms"
 		raise frappe.Redirect
 
 	context.education_settings = frappe.get_single("Education Settings")
-	course = frappe.get_doc('Course', course_name)
+	course = frappe.get_doc("Course", course_name)
 	context.program = program
 	context.course = course
 
 	context.topics = course.get_topics()
-	context.has_access =  utils.allowed_program_access(context.program)
+	context.has_access = utils.allowed_program_access(context.program)
 	context.progress = get_topic_progress(context.topics, course, context.program)
 
+
 def get_topic_progress(topics, course, program):
 	progress = {topic.name: utils.get_topic_progress(topic, course.name, program) for topic in topics}
 	return progress
diff --git a/erpnext/www/lms/index.py b/erpnext/www/lms/index.py
index 035f7d9..782ac48 100644
--- a/erpnext/www/lms/index.py
+++ b/erpnext/www/lms/index.py
@@ -4,10 +4,11 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	context.education_settings = frappe.get_single("Education Settings")
 	if not context.education_settings.enable_lms:
-		frappe.local.flags.redirect_location = '/'
+		frappe.local.flags.redirect_location = "/"
 		raise frappe.Redirect
 	context.featured_programs = get_featured_programs()
 
diff --git a/erpnext/www/lms/profile.py b/erpnext/www/lms/profile.py
index 8cd2f24..c4c1cd7 100644
--- a/erpnext/www/lms/profile.py
+++ b/erpnext/www/lms/profile.py
@@ -4,23 +4,34 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	if frappe.session.user == "Guest":
-		frappe.local.flags.redirect_location = '/lms'
+		frappe.local.flags.redirect_location = "/lms"
 		raise frappe.Redirect
 
 	context.student = utils.get_current_student()
 	if not context.student:
-		context.student = frappe.get_doc('User', frappe.session.user)
+		context.student = frappe.get_doc("User", frappe.session.user)
 	context.progress = get_program_progress(context.student.name)
 
+
 def get_program_progress(student):
-	enrolled_programs = frappe.get_all("Program Enrollment", filters={'student':student}, fields=['program'])
+	enrolled_programs = frappe.get_all(
+		"Program Enrollment", filters={"student": student}, fields=["program"]
+	)
 	student_progress = []
 	for list_item in enrolled_programs:
 		program = frappe.get_doc("Program", list_item.program)
 		progress = utils.get_program_progress(program)
 		completion = utils.get_program_completion(program)
-		student_progress.append({'program': program.program_name, 'name': program.name, 'progress':progress, 'completion': completion})
+		student_progress.append(
+			{
+				"program": program.program_name,
+				"name": program.name,
+				"progress": progress,
+				"completion": completion,
+			}
+		)
 
 	return student_progress
diff --git a/erpnext/www/lms/program.py b/erpnext/www/lms/program.py
index db2653a..1df2aa5 100644
--- a/erpnext/www/lms/program.py
+++ b/erpnext/www/lms/program.py
@@ -5,11 +5,12 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	try:
-		program = frappe.form_dict['program']
+		program = frappe.form_dict["program"]
 	except KeyError:
-		frappe.local.flags.redirect_location = '/lms'
+		frappe.local.flags.redirect_location = "/lms"
 		raise frappe.Redirect
 
 	context.education_settings = frappe.get_single("Education Settings")
@@ -18,12 +19,14 @@
 	context.has_access = utils.allowed_program_access(program)
 	context.progress = get_course_progress(context.courses, context.program)
 
+
 def get_program(program_name):
 	try:
-		return frappe.get_doc('Program', program_name)
+		return frappe.get_doc("Program", program_name)
 	except frappe.DoesNotExistError:
 		frappe.throw(_("Program {0} does not exist.").format(program_name))
 
+
 def get_course_progress(courses, program):
 	progress = {course.name: utils.get_course_progress(course, program) for course in courses}
 	return progress or {}
diff --git a/erpnext/www/lms/topic.py b/erpnext/www/lms/topic.py
index 17fc8f7..7783211 100644
--- a/erpnext/www/lms/topic.py
+++ b/erpnext/www/lms/topic.py
@@ -4,20 +4,22 @@
 
 no_cache = 1
 
+
 def get_context(context):
 	try:
-		course = frappe.form_dict['course']
-		program = frappe.form_dict['program']
-		topic = frappe.form_dict['topic']
+		course = frappe.form_dict["course"]
+		program = frappe.form_dict["program"]
+		topic = frappe.form_dict["topic"]
 	except KeyError:
-		frappe.local.flags.redirect_location = '/lms'
+		frappe.local.flags.redirect_location = "/lms"
 		raise frappe.Redirect
 
 	context.program = program
 	context.course = course
 	context.topic = frappe.get_doc("Topic", topic)
 	context.contents = get_contents(context.topic, course, program)
-	context.has_access =  utils.allowed_program_access(program)
+	context.has_access = utils.allowed_program_access(program)
+
 
 def get_contents(topic, course, program):
 	student = utils.get_current_student()
@@ -27,19 +29,29 @@
 	progress = []
 	if contents:
 		for content in contents:
-			if content.doctype in ('Article', 'Video'):
+			if content.doctype in ("Article", "Video"):
 				if student:
 					status = utils.check_content_completion(content.name, content.doctype, course_enrollment.name)
 				else:
 					status = True
-				progress.append({'content': content, 'content_type': content.doctype, 'completed': status})
-			elif content.doctype == 'Quiz':
+				progress.append({"content": content, "content_type": content.doctype, "completed": status})
+			elif content.doctype == "Quiz":
 				if student:
-					status, score, result, time_taken = utils.check_quiz_completion(content, course_enrollment.name)
+					status, score, result, time_taken = utils.check_quiz_completion(
+						content, course_enrollment.name
+					)
 				else:
 					status = False
 					score = None
 					result = None
-				progress.append({'content': content, 'content_type': content.doctype, 'completed': status, 'score': score, 'result': result})
+				progress.append(
+					{
+						"content": content,
+						"content_type": content.doctype,
+						"completed": status,
+						"score": score,
+						"result": result,
+					}
+				)
 
 	return progress
diff --git a/erpnext/www/payment_setup_certification.py b/erpnext/www/payment_setup_certification.py
index c65cddb..5d62d60 100644
--- a/erpnext/www/payment_setup_certification.py
+++ b/erpnext/www/payment_setup_certification.py
@@ -2,18 +2,23 @@
 
 no_cache = 1
 
+
 def get_context(context):
-	if frappe.session.user != 'Guest':
+	if frappe.session.user != "Guest":
 		context.all_certifications = get_all_certifications_of_a_member()
 		context.show_sidebar = True
 
 
 def get_all_certifications_of_a_member():
-	'''Returns all certifications'''
+	"""Returns all certifications"""
 	all_certifications = []
-	all_certifications = frappe.db.sql(""" select cc.name,cc.from_date,cc.to_date,ca.amount,ca.currency
+	all_certifications = frappe.db.sql(
+		""" select cc.name,cc.from_date,cc.to_date,ca.amount,ca.currency
 		from `tabCertified Consultant` cc
 		inner join `tabCertification Application` ca
 		on cc.certification_application = ca.name
-		where paid = 1 and email = %(user)s order by cc.to_date desc""" ,{'user': frappe.session.user},as_dict=True)
+		where paid = 1 and email = %(user)s order by cc.to_date desc""",
+		{"user": frappe.session.user},
+		as_dict=True,
+	)
 	return all_certifications
diff --git a/erpnext/www/shop-by-category/index.py b/erpnext/www/shop-by-category/index.py
index 09f97ba..8a92418 100644
--- a/erpnext/www/shop-by-category/index.py
+++ b/erpnext/www/shop-by-category/index.py
@@ -3,6 +3,7 @@
 
 sitemap = 1
 
+
 def get_context(context):
 	context.body_class = "product-page"
 
@@ -18,13 +19,9 @@
 
 	context.no_cache = 1
 
+
 def get_slideshow(slideshow):
-	values = {
-		'show_indicators': 1,
-		'show_controls': 1,
-		'rounded': 1,
-		'slider_name': "Categories"
-	}
+	values = {"show_indicators": 1, "show_controls": 1, "rounded": 1, "slider_name": "Categories"}
 	slideshow = frappe.get_cached_doc("Website Slideshow", slideshow)
 	slides = slideshow.get({"doctype": "Website Slideshow Item"})
 	for index, slide in enumerate(slides, start=1):
@@ -37,9 +34,10 @@
 
 	return values
 
+
 def get_tabs(categories):
 	tab_values = {
-		'title': _("Shop by Category"),
+		"title": _("Shop by Category"),
 	}
 
 	categorical_data = get_category_records(categories)
@@ -48,21 +46,19 @@
 		# pre-render cards for each tab
 		tab_values[f"tab_{index + 1}_content"] = frappe.render_template(
 			"erpnext/www/shop-by-category/category_card_section.html",
-			{"data": categorical_data[tab], "type": tab}
+			{"data": categorical_data[tab], "type": tab},
 		)
 	return tab_values
 
+
 def get_category_records(categories):
 	categorical_data = {}
 	for category in categories:
 		if category == "item_group":
 			categorical_data["item_group"] = frappe.db.get_all(
 				"Item Group",
-				filters={
-					"parent_item_group": "All Item Groups",
-					"show_in_website": 1
-				},
-				fields=["name", "parent_item_group", "is_group", "image", "route"]
+				filters={"parent_item_group": "All Item Groups", "show_in_website": 1},
+				fields=["name", "parent_item_group", "is_group", "image", "route"],
 			)
 		else:
 			doctype = frappe.unscrub(category)
@@ -73,4 +69,3 @@
 			categorical_data[category] = frappe.db.get_all(doctype, fields=fields)
 
 	return categorical_data
-
diff --git a/erpnext/www/support/index.py b/erpnext/www/support/index.py
index 408ddf4..aa00e92 100644
--- a/erpnext/www/support/index.py
+++ b/erpnext/www/support/index.py
@@ -3,7 +3,7 @@
 
 def get_context(context):
 	context.no_cache = 1
-	context.align_greeting = ''
+	context.align_greeting = ""
 	setting = frappe.get_doc("Support Settings")
 
 	context.greeting_title = setting.greeting_title
@@ -16,18 +16,22 @@
 		if favorite_articles:
 			for article in favorite_articles:
 				name_list.append(article.name)
-		for record in (frappe.get_all("Help Article",
+		for record in frappe.get_all(
+			"Help Article",
 			fields=["title", "content", "route", "category"],
-			filters={"name": ['not in', tuple(name_list)], "published": 1},
-			order_by="creation desc", limit=(6-len(favorite_articles)))):
+			filters={"name": ["not in", tuple(name_list)], "published": 1},
+			order_by="creation desc",
+			limit=(6 - len(favorite_articles)),
+		):
 			favorite_articles.append(record)
 
 	context.favorite_article_list = get_favorite_articles(favorite_articles)
 	context.help_article_list = get_help_article_list()
 
+
 def get_favorite_articles_by_page_view():
 	return frappe.db.sql(
-			"""
+		"""
 			SELECT
 				t1.name as name,
 				t1.title as title,
@@ -43,32 +47,42 @@
 			GROUP BY route
 			ORDER BY count DESC
 			LIMIT 6;
-			""", as_dict=True)
+			""",
+		as_dict=True,
+	)
+
 
 def get_favorite_articles(favorite_articles):
-	favorite_article_list=[]
+	favorite_article_list = []
 	for article in favorite_articles:
 		description = frappe.utils.strip_html(article.content)
 		if len(description) > 120:
-			description = description[:120] + '...'
+			description = description[:120] + "..."
 		favorite_article_dict = {
-			'title': article.title,
-			'description': description,
-			'route': article.route,
-			'category': article.category,
+			"title": article.title,
+			"description": description,
+			"route": article.route,
+			"category": article.category,
 		}
 		favorite_article_list.append(favorite_article_dict)
 	return favorite_article_list
 
+
 def get_help_article_list():
-	help_article_list=[]
+	help_article_list = []
 	category_list = frappe.get_all("Help Category", fields="name")
 	for category in category_list:
-		help_articles = frappe.get_all("Help Article", fields="*", filters={"category": category.name, "published": 1}, order_by="modified desc", limit=5)
+		help_articles = frappe.get_all(
+			"Help Article",
+			fields="*",
+			filters={"category": category.name, "published": 1},
+			order_by="modified desc",
+			limit=5,
+		)
 		if help_articles:
 			help_aricles_per_caetgory = {
-				'category': category,
-				'articles': help_articles,
+				"category": category,
+				"articles": help_articles,
 			}
 			help_article_list.append(help_aricles_per_caetgory)
 	return help_article_list
diff --git a/setup.py b/setup.py
index 8140700..1faff04 100644
--- a/setup.py
+++ b/setup.py
@@ -2,23 +2,22 @@
 import re, ast
 
 # get version from __version__ variable in erpnext/__init__.py
-_version_re = re.compile(r'__version__\s+=\s+(.*)')
+_version_re = re.compile(r"__version__\s+=\s+(.*)")
 
-with open('requirements.txt') as f:
-	install_requires = f.read().strip().split('\n')
+with open("requirements.txt") as f:
+	install_requires = f.read().strip().split("\n")
 
-with open('erpnext/__init__.py', 'rb') as f:
-	version = str(ast.literal_eval(_version_re.search(
-		f.read().decode('utf-8')).group(1)))
+with open("erpnext/__init__.py", "rb") as f:
+	version = str(ast.literal_eval(_version_re.search(f.read().decode("utf-8")).group(1)))
 
 setup(
-	name='erpnext',
+	name="erpnext",
 	version=version,
-	description='Open Source ERP',
-	author='Frappe Technologies',
-	author_email='info@erpnext.com',
+	description="Open Source ERP",
+	author="Frappe Technologies",
+	author_email="info@erpnext.com",
 	packages=find_packages(),
 	zip_safe=False,
 	include_package_data=True,
-	install_requires=install_requires
+	install_requires=install_requires,
 )
